linear-grab 0.27.0 → 0.27.1
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.
- package/bin/linear-grab-bridge.mjs +1 -1
- package/bin/render-scan.global.js +2 -2
- package/bin/slop-scan.global.js +3 -3
- package/dist/index.global.js +16 -16
- package/dist/linear-grab.js +599 -583
- package/dist/render-scan.global.js +2 -2
- package/dist/slop-scan.global.js +3 -3
- package/package.json +1 -1
package/dist/index.global.js
CHANGED
|
@@ -225,7 +225,7 @@ of the other sections.`,gD="- FIRST, self-orient in the repo checkout (skip any
|
|
|
225
225
|
`).slice(-n).join(`
|
|
226
226
|
`).trim();return i.length>nk&&(i=`…\n${i.slice(i.length-nk)}`),i||null}finally{clearTimeout(i)}}var ak=50,ok=[],sk=!1;function ck(e){if(e instanceof Error)return e.stack??`${e.name}: ${e.message}`;if(typeof e==`object`&&e)try{return JSON.stringify(e).slice(0,400)}catch{return String(e)}return String(e)}function lk(e,t){let n=t.map(ck).join(` `).slice(0,600);n.trim()&&(ok.push({at:Date.now(),level:e,text:n}),ok.length>ak&&ok.shift())}function uk(){if(sk||typeof window>`u`)return;sk=!0;let e=console.error.bind(console);console.error=(...t)=>{lk(`error`,t),e(...t)};let t=console.warn.bind(console);console.warn=(...e)=>{lk(`warn`,e),t(...e)},window.addEventListener(`error`,e=>{lk(`error`,[`${e.message}${e.filename?` (${e.filename}:${e.lineno})`:``}`])}),window.addEventListener(`unhandledrejection`,e=>{let t=e.reason;lk(`unhandled`,[t?.stack??String(e.reason??`unhandled rejection`)])})}function dk(e=30){return ok.slice(-e)}function fk(e=30){let t=dk(e);if(!t.length)return null;let n=t.map(e=>`[${new Date(e.at).toTimeString().slice(0,8)}] ${e.level.toUpperCase()}: ${e.text}`).join(`
|
|
227
227
|
`);return n.length>8e3&&(n=`…\n${n.slice(n.length-8e3)}`),n}function pk(e,t){if(e.match(/^[a-z]+:\/\//i))return e;if(e.match(/^\/\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i))return e;let n=document.implementation.createHTMLDocument(),r=n.createElement(`base`),i=n.createElement(`a`);return n.head.appendChild(r),n.body.appendChild(i),t&&(r.href=t),i.href=e,i.href}var mk=(()=>{let e=0,t=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(e+=1,`u${t()}${e}`)})();function hk(e){let t=[];for(let n=0,r=e.length;n<r;n++)t.push(e[n]);return t}var gk=null;function _k(e={}){return gk||(e.includeStyleProperties?(gk=e.includeStyleProperties,gk):(gk=hk(window.getComputedStyle(document.documentElement)),gk))}function vk(e,t){let n=(e.ownerDocument.defaultView||window).getComputedStyle(e).getPropertyValue(t);return n?parseFloat(n.replace(`px`,``)):0}function yk(e){let t=vk(e,`border-left-width`),n=vk(e,`border-right-width`);return e.clientWidth+t+n}function bk(e){let t=vk(e,`border-top-width`),n=vk(e,`border-bottom-width`);return e.clientHeight+t+n}function xk(e,t={}){return{width:t.width||yk(e),height:t.height||bk(e)}}function Sk(){let e,t;try{t=process}catch{}let n=t&&t.env?t.env.devicePixelRatio:null;return n&&(e=parseInt(n,10),Number.isNaN(e)&&(e=1)),e||window.devicePixelRatio||1}var Ck=16384;function wk(e){(e.width>Ck||e.height>Ck)&&(e.width>Ck&&e.height>Ck?e.width>e.height?(e.height*=Ck/e.width,e.width=Ck):(e.width*=Ck/e.height,e.height=Ck):e.width>Ck?(e.height*=Ck/e.width,e.width=Ck):(e.width*=Ck/e.height,e.height=Ck))}function Tk(e){return new Promise((t,n)=>{let r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>t(r))})},r.onerror=n,r.crossOrigin=`anonymous`,r.decoding=`async`,r.src=e})}async function Ek(e){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(e)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function Dk(e,t,n){let r=`http://www.w3.org/2000/svg`,i=document.createElementNS(r,`svg`),a=document.createElementNS(r,`foreignObject`);return i.setAttribute(`width`,`${t}`),i.setAttribute(`height`,`${n}`),i.setAttribute(`viewBox`,`0 0 ${t} ${n}`),a.setAttribute(`width`,`100%`),a.setAttribute(`height`,`100%`),a.setAttribute(`x`,`0`),a.setAttribute(`y`,`0`),a.setAttribute(`externalResourcesRequired`,`true`),i.appendChild(a),a.appendChild(e),Ek(i)}var Ok=(e,t)=>{if(e instanceof t)return!0;let n=Object.getPrototypeOf(e);return n===null?!1:n.constructor.name===t.name||Ok(n,t)};function kk(e){let t=e.getPropertyValue(`content`);return`${e.cssText} content: '${t.replace(/'|"/g,``)}';`}function Ak(e,t){return _k(t).map(t=>`${t}: ${e.getPropertyValue(t)}${e.getPropertyPriority(t)?` !important`:``};`).join(` `)}function jk(e,t,n,r){let i=`.${e}:${t}`,a=n.cssText?kk(n):Ak(n,r);return document.createTextNode(`${i}{${a}}`)}function Mk(e,t,n,r){let i=window.getComputedStyle(e,n),a=i.getPropertyValue(`content`);if(a===``||a===`none`)return;let o=mk();try{t.className=`${t.className} ${o}`}catch{return}let s=document.createElement(`style`);s.appendChild(jk(o,n,i,r)),t.appendChild(s)}function Nk(e,t,n){Mk(e,t,`:before`,n),Mk(e,t,`:after`,n)}var Pk=`application/font-woff`,Fk=`image/jpeg`,Ik={woff:Pk,woff2:Pk,ttf:`application/font-truetype`,eot:`application/vnd.ms-fontobject`,png:`image/png`,jpg:Fk,jpeg:Fk,gif:`image/gif`,tiff:`image/tiff`,svg:`image/svg+xml`,webp:`image/webp`};function Lk(e){let t=/\.([^./]*?)$/g.exec(e);return t?t[1]:``}function Rk(e){return Ik[Lk(e).toLowerCase()]||``}function zk(e){return e.split(/,/)[1]}function Bk(e){return e.search(/^(data:)/)!==-1}function Vk(e,t){return`data:${t};base64,${e}`}async function Hk(e,t,n){let r=await fetch(e,t);if(r.status===404)throw Error(`Resource "${r.url}" not found`);let i=await r.blob();return new Promise((e,t)=>{let a=new FileReader;a.onerror=t,a.onloadend=()=>{try{e(n({res:r,result:a.result}))}catch(e){t(e)}},a.readAsDataURL(i)})}var Uk={};function Wk(e,t,n){let r=e.replace(/\?.*/,``);return n&&(r=e),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,``)),t?`[${t}]${r}`:r}async function Gk(e,t,n){let r=Wk(e,t,n.includeQueryParams);if(Uk[r]!=null)return Uk[r];n.cacheBust&&(e+=(/\?/.test(e)?`&`:`?`)+new Date().getTime());let i;try{i=Vk(await Hk(e,n.fetchRequestInit,({res:e,result:n})=>(t||=e.headers.get(`Content-Type`)||``,zk(n))),t)}catch(t){i=n.imagePlaceholder||``;let r=`Failed to fetch resource: ${e}`;t&&(r=typeof t==`string`?t:t.message),r&&console.warn(r)}return Uk[r]=i,i}async function Kk(e){let t=e.toDataURL();return t===`data:,`?e.cloneNode(!1):Tk(t)}async function qk(e,t){if(e.currentSrc){let t=document.createElement(`canvas`),n=t.getContext(`2d`);return t.width=e.clientWidth,t.height=e.clientHeight,n?.drawImage(e,0,0,t.width,t.height),Tk(t.toDataURL())}let n=e.poster;return Tk(await Gk(n,Rk(n),t))}async function Jk(e,t){try{if(e?.contentDocument?.body)return await iA(e.contentDocument.body,t,!0)}catch{}return e.cloneNode(!1)}async function Yk(e,t){return Ok(e,HTMLCanvasElement)?Kk(e):Ok(e,HTMLVideoElement)?qk(e,t):Ok(e,HTMLIFrameElement)?Jk(e,t):e.cloneNode(Zk(e))}var Xk=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SLOT`,Zk=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SVG`;async function Qk(e,t,n){if(Zk(t))return t;let r=[];return r=Xk(e)&&e.assignedNodes?hk(e.assignedNodes()):Ok(e,HTMLIFrameElement)&&e.contentDocument?.body?hk(e.contentDocument.body.childNodes):hk((e.shadowRoot??e).childNodes),r.length===0||Ok(e,HTMLVideoElement)||await r.reduce((e,r)=>e.then(()=>iA(r,n)).then(e=>{e&&t.appendChild(e)}),Promise.resolve()),t}function $k(e,t,n){let r=t.style;if(!r)return;let i=window.getComputedStyle(e);i.cssText?(r.cssText=i.cssText,r.transformOrigin=i.transformOrigin):_k(n).forEach(n=>{let a=i.getPropertyValue(n);n===`font-size`&&a.endsWith(`px`)&&(a=`${Math.floor(parseFloat(a.substring(0,a.length-2)))-.1}px`),Ok(e,HTMLIFrameElement)&&n===`display`&&a===`inline`&&(a=`block`),n===`d`&&t.getAttribute(`d`)&&(a=`path(${t.getAttribute(`d`)})`),r.setProperty(n,a,i.getPropertyPriority(n))})}function eA(e,t){Ok(e,HTMLTextAreaElement)&&(t.innerHTML=e.value),Ok(e,HTMLInputElement)&&t.setAttribute(`value`,e.value)}function tA(e,t){if(Ok(e,HTMLSelectElement)){let n=t,r=Array.from(n.children).find(t=>e.value===t.getAttribute(`value`));r&&r.setAttribute(`selected`,``)}}function nA(e,t,n){return Ok(t,Element)&&($k(e,t,n),Nk(e,t,n),eA(e,t),tA(e,t)),t}async function rA(e,t){let n=e.querySelectorAll?e.querySelectorAll(`use`):[];if(n.length===0)return e;let r={};for(let i=0;i<n.length;i++){let a=n[i].getAttribute(`xlink:href`);if(a){let n=e.querySelector(a),i=document.querySelector(a);!n&&i&&!r[a]&&(r[a]=await iA(i,t,!0))}}let i=Object.values(r);if(i.length){let t=`http://www.w3.org/1999/xhtml`,n=document.createElementNS(t,`svg`);n.setAttribute(`xmlns`,t),n.style.position=`absolute`,n.style.width=`0`,n.style.height=`0`,n.style.overflow=`hidden`,n.style.display=`none`;let r=document.createElementNS(t,`defs`);n.appendChild(r);for(let e=0;e<i.length;e++)r.appendChild(i[e]);e.appendChild(n)}return e}async function iA(e,t,n){return!n&&t.filter&&!t.filter(e)?null:Promise.resolve(e).then(e=>Yk(e,t)).then(n=>Qk(e,n,t)).then(n=>nA(e,n,t)).then(e=>rA(e,t))}var aA=/url\((['"]?)([^'"]+?)\1\)/g,oA=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,sA=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function cA(e){let t=e.replace(/([.*+?^${}()|\[\]\/\\])/g,`\\$1`);return RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,`g`)}function lA(e){let t=[];return e.replace(aA,(e,n,r)=>(t.push(r),e)),t.filter(e=>!Bk(e))}async function uA(e,t,n,r,i){try{let a=n?pk(t,n):t,o=Rk(t),s;return s=i?Vk(await i(a),o):await Gk(a,o,r),e.replace(cA(t),`$1${s}$3`)}catch{}return e}function dA(e,{preferredFontFormat:t}){return t?e.replace(sA,e=>{for(;;){let[n,,r]=oA.exec(e)||[];if(!r)return``;if(r===t)return`src: ${n};`}}):e}function fA(e){return e.search(aA)!==-1}async function pA(e,t,n){if(!fA(e))return e;let r=dA(e,n);return lA(r).reduce((e,r)=>e.then(e=>uA(e,r,t,n)),Promise.resolve(r))}async function mA(e,t,n){let r=t.style?.getPropertyValue(e);if(r){let i=await pA(r,null,n);return t.style.setProperty(e,i,t.style.getPropertyPriority(e)),!0}return!1}async function hA(e,t){await mA(`background`,e,t)||await mA(`background-image`,e,t),await mA(`mask`,e,t)||await mA(`-webkit-mask`,e,t)||await mA(`mask-image`,e,t)||await mA(`-webkit-mask-image`,e,t)}async function gA(e,t){let n=Ok(e,HTMLImageElement);if(!(n&&!Bk(e.src))&&!(Ok(e,SVGImageElement)&&!Bk(e.href.baseVal)))return;let r=n?e.src:e.href.baseVal,i=await Gk(r,Rk(r),t);await new Promise((r,a)=>{e.onload=r,e.onerror=t.onImageErrorHandler?(...e)=>{try{r(t.onImageErrorHandler(...e))}catch(e){a(e)}}:a;let o=e;o.decode&&=r,o.loading===`lazy`&&(o.loading=`eager`),n?(e.srcset=``,e.src=i):e.href.baseVal=i})}async function _A(e,t){let n=hk(e.childNodes).map(e=>vA(e,t));await Promise.all(n).then(()=>e)}async function vA(e,t){Ok(e,Element)&&(await hA(e,t),await gA(e,t),await _A(e,t))}function yA(e,t){let{style:n}=e;t.backgroundColor&&(n.backgroundColor=t.backgroundColor),t.width&&(n.width=`${t.width}px`),t.height&&(n.height=`${t.height}px`);let r=t.style;return r!=null&&Object.keys(r).forEach(e=>{n[e]=r[e]}),e}var bA={};async function xA(e){let t=bA[e];return t??(t={url:e,cssText:await(await fetch(e)).text()},bA[e]=t,t)}async function SA(e,t){let n=e.cssText,r=/url\(["']?([^"')]+)["']?\)/g,i=(n.match(/url\([^)]+\)/g)||[]).map(async i=>{let a=i.replace(r,`$1`);return a.startsWith(`https://`)||(a=new URL(a,e.url).href),Hk(a,t.fetchRequestInit,({result:e})=>(n=n.replace(i,`url(${e})`),[i,e]))});return Promise.all(i).then(()=>n)}function CA(e){if(e==null)return[];let t=[],n=e.replace(/(\/\*[\s\S]*?\*\/)/gi,``),r=RegExp(`((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})`,`gi`);for(;;){let e=r.exec(n);if(e===null)break;t.push(e[0])}n=n.replace(r,``);let i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,a=RegExp(`((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})`,`gi`);for(;;){let e=i.exec(n);if(e===null){if(e=a.exec(n),e===null)break;i.lastIndex=a.lastIndex}else a.lastIndex=i.lastIndex;t.push(e[0])}return t}async function wA(e,t){let n=[],r=[];return e.forEach(n=>{if(`cssRules`in n)try{hk(n.cssRules||[]).forEach((e,i)=>{if(e.type===CSSRule.IMPORT_RULE){let a=i+1,o=e.href,s=xA(o).then(e=>SA(e,t)).then(e=>CA(e).forEach(e=>{try{n.insertRule(e,e.startsWith(`@import`)?a+=1:n.cssRules.length)}catch(t){console.error(`Error inserting rule from remote css`,{rule:e,error:t})}})).catch(e=>{console.error(`Error loading remote css`,e.toString())});r.push(s)}})}catch(i){let a=e.find(e=>e.href==null)||document.styleSheets[0];n.href!=null&&r.push(xA(n.href).then(e=>SA(e,t)).then(e=>CA(e).forEach(e=>{a.insertRule(e,a.cssRules.length)})).catch(e=>{console.error(`Error loading remote stylesheet`,e)})),console.error(`Error inlining remote css file`,i)}}),Promise.all(r).then(()=>(e.forEach(e=>{if(`cssRules`in e)try{hk(e.cssRules||[]).forEach(e=>{n.push(e)})}catch(t){console.error(`Error while reading CSS rules from ${e.href}`,t)}}),n))}function TA(e){return e.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>fA(e.style.getPropertyValue(`src`)))}async function EA(e,t){if(e.ownerDocument==null)throw Error(`Provided element is not within a Document`);return TA(await wA(hk(e.ownerDocument.styleSheets),t))}function DA(e){return e.trim().replace(/["']/g,``)}function OA(e){let t=new Set;function n(e){(e.style.fontFamily||getComputedStyle(e).fontFamily).split(`,`).forEach(e=>{t.add(DA(e))}),Array.from(e.children).forEach(e=>{e instanceof HTMLElement&&n(e)})}return n(e),t}async function kA(e,t){let n=await EA(e,t),r=OA(e);return(await Promise.all(n.filter(e=>r.has(DA(e.style.fontFamily))).map(e=>{let n=e.parentStyleSheet?e.parentStyleSheet.href:null;return pA(e.cssText,n,t)}))).join(`
|
|
228
|
-
`)}async function AA(e,t){let n=t.fontEmbedCSS==null?t.skipFonts?null:await kA(e,t):t.fontEmbedCSS;if(n){let t=document.createElement(`style`),r=document.createTextNode(n);t.appendChild(r),e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}}async function jA(e,t={}){let{width:n,height:r}=xk(e,t),i=await iA(e,t,!0);return await AA(i,t),await vA(i,t),yA(i,t),await Dk(i,n,r)}async function MA(e,t={}){let{width:n,height:r}=xk(e,t),i=await Tk(await jA(e,t)),a=document.createElement(`canvas`),o=a.getContext(`2d`),s=t.pixelRatio||Sk(),c=t.canvasWidth||n,l=t.canvasHeight||r;return a.width=c*s,a.height=l*s,t.skipAutoScale||wk(a),a.style.width=`${c}`,a.style.height=`${l}`,t.backgroundColor&&(o.fillStyle=t.backgroundColor,o.fillRect(0,0,a.width,a.height)),o.drawImage(i,0,0,a.width,a.height),a}async function NA(e,t={}){return kA(e,t)}var PA=6,FA=class{last=performance.now();async tick(){performance.now()-this.last<=PA||(await new Promise(e=>{`requestIdleCallback`in window?requestIdleCallback(()=>e(),{timeout:100}):setTimeout(e,0)}),this.last=performance.now())}},IA=null,LA=new Map;function RA(e){let t=LA.get(e);if(t)return t;if(!IA){let e=document.createElement(`iframe`);if(e.style.cssText=`position:absolute;width:0;height:0;border:0;visibility:hidden`,document.body.appendChild(e),IA=e.contentDocument,!IA)return{}}let n=IA.createElement(e);IA.body.appendChild(n);let r=IA.defaultView.getComputedStyle(n),i={};for(let e=0;e<r.length;e++){let t=r[e];i[t]=r.getPropertyValue(t)}return n.remove(),LA.set(e,i),i}function zA(){try{for(let e of[`div`,`span`,`p`,`a`,`button`,`img`,`ul`,`li`,`svg`])RA(e)}catch{}}function BA(e){if(e.id===`linear-grab-root`)return!0;let t=e.tagName?.toLowerCase()??``;return t===`overlay-canvas`||t.startsWith(`react-grab`)||t===`script`||t===`iframe`}function VA(e,t){try{let n=document.createElement(`canvas`);n.width=e.naturalWidth||e.width||1,n.height=e.naturalHeight||e.height||1,n.getContext(`2d`).drawImage(e,0,0),t.src=n.toDataURL(`image/png`)}catch{t.removeAttribute(`src`),t.setAttribute(`style`,`${t.getAttribute(`style`)??``}background:#8b8e9822;`)}}async function HA(e,t){if(BA(e))return null;if(e instanceof SVGSVGElement)return e.cloneNode(!0);let n=e.cloneNode(!1),r=getComputedStyle(e),i=RA(e.tagName.toLowerCase()),a=``;for(let e=0;e<r.length;e++){let t=r[e],n=r.getPropertyValue(t);n&&n!==i[t]&&(a+=`${t}:${n};`)}if(n.setAttribute(`style`,a),n.removeAttribute(`class`),e instanceof HTMLImageElement&&(VA(e,n),n.removeAttribute(`srcset`),n.removeAttribute(`sizes`)),(e instanceof HTMLVideoElement||e instanceof HTMLAudioElement)&&(n.removeAttribute(`src`),n.removeAttribute(`poster`)),e.tagName===`SOURCE`)return null;if(e instanceof HTMLCanvasElement)try{let t=document.createElement(`img`);return t.setAttribute(`style`,a),t.src=e.toDataURL(),t}catch{}e instanceof HTMLInputElement&&n.setAttribute(`value`,e.value),e instanceof HTMLTextAreaElement&&(n.textContent=e.value),await t.tick();for(let r of Array.from(e.childNodes))if(r.nodeType===Node.TEXT_NODE)n.appendChild(r.cloneNode());else if(r.nodeType===Node.ELEMENT_NODE){let e=await HA(r,t);e&&n.appendChild(e)}return n}async function UA(e,t){let n=e.getBoundingClientRect(),r=Math.max(1,Math.ceil(n.width)),i=Math.max(1,Math.ceil(n.height)),a=await HA(e,new FA);if(!a)throw Error(`Capture root was filtered`);a.style.margin=`0`;let o=`<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${i}"><style>${t}</style><foreignObject width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml">${new XMLSerializer().serializeToString(a)}</div></foreignObject></svg>`,s=URL.createObjectURL(new Blob([o],{type:`image/svg+xml;charset=utf-8`})),c=new Image;c.decoding=`async`,c.src=s;try{await c.decode().catch(()=>{if(!c.complete||!c.naturalWidth)throw Error(`SVG rasterize failed — a subresource in the region could not load`)})}finally{URL.revokeObjectURL(s)}let l=8192,u=Math.min(window.devicePixelRatio||1,1.5,l/r,l/i),d=document.createElement(`canvas`);d.width=Math.max(1,Math.round(r*u)),d.height=Math.max(1,Math.round(i*u));let f=d.getContext(`2d`);if(!f)throw Error(`Canvas 2d unavailable`);return f.drawImage(c,0,0,d.width,d.height),d}var WA=null;function GA(e){return WA??=NA(e).catch(()=>``),WA}function KA(){`requestIdleCallback`in window?requestIdleCallback(()=>{zA(),GA(document.body)},{timeout:3e3}):setTimeout(()=>{zA(),GA(document.body)},1500)}var qA=4e3,JA=1e3;async function YA(e){try{if(await new Promise(e=>{requestAnimationFrame(()=>`requestIdleCallback`in window?requestIdleCallback(()=>e(void 0),{timeout:500}):setTimeout(e,80))}),!e.isConnected)return null;let t=$A(e),n=t.querySelectorAll(`*`).length;n>qA&&(t=e);let r;try{r=await UA(t,await GA(t))}catch{t!==e&&n>JA&&(t=e),r=await MA(t,{pixelRatio:Math.min(window.devicePixelRatio||1,1.5),fontEmbedCSS:await GA(t),filter:e=>{if(!(e instanceof Element))return!0;if(e.id===`linear-grab-root`)return!1;let t=e.tagName?.toLowerCase()??``;return!(t===`overlay-canvas`||t.startsWith(`react-grab`))}})}return t!==e&&ej(r,t,e),await QA(r)}catch{return null}}async function XA(e){return Promise.race([ZA(e),new Promise(e=>setTimeout(()=>{console.warn(`[linear-grab] region capture timed out after 15s`),e(null)},15e3))])}async function ZA(e){try{let t=e.x+e.w/2,n=e.y+e.h/2,r=document.elementFromPoint(t,n)??document.body,i=t=>{let n=t.getBoundingClientRect();return n.left<=e.x&&n.top<=e.y&&n.right>=e.x+e.w&&n.bottom>=e.y+e.h};for(;r!==document.body&&(!i(r)||r.querySelectorAll(`*`).length<1);)r=r.parentElement??document.body;let a=await UA(r,await GA(r)),o=r.getBoundingClientRect(),s=a.width/o.width,c=a.height/o.height,l=document.createElement(`canvas`);l.width=Math.max(1,Math.round(e.w*s)),l.height=Math.max(1,Math.round(e.h*c));let u=l.getContext(`2d`);return u?(u.drawImage(a,(e.x-o.left+r.scrollLeft)*s,(e.y-o.top+r.scrollTop)*c,e.w*s,e.h*c,0,0,l.width,l.height),await QA(l)):null}catch(e){return console.warn(`[linear-grab] region capture failed:`,e),null}}async function QA(e){try{if(typeof createImageBitmap==`function`&&typeof OffscreenCanvas<`u`){let t=await createImageBitmap(e);return(await PD({type:`encode-png`,bitmap:t},[t])).dataUrl}}catch{}return tj(e)}function $A(e){let t=window.innerWidth,n=window.innerHeight,r=t*n*1.7,i=e,a=e;for(;a&&a!==document.body&&a!==document.documentElement;){let o=a.getBoundingClientRect();if(o.width*o.height>r||a!==e&&(a.scrollTop>0||a.scrollLeft>0)||(i=a,o.width>=t*.55&&o.height>=n*.35))break;a=a.parentElement}return i}function ej(e,t,n){let r=e.getContext(`2d`);if(!r)return;let i=t.getBoundingClientRect(),a=n.getBoundingClientRect();if(!i.width||!i.height)return;let o=e.width/i.width,s=e.height/i.height,c=(a.left-i.left+t.scrollLeft)*o,l=(a.top-i.top+t.scrollTop)*s,u=a.width*o,d=a.height*s,f=Math.min(6*o,u/2,d/2);r.strokeStyle=`rgba(94, 106, 210, 0.35)`,r.lineWidth=8*o,r.beginPath(),r.roundRect(c,l,u,d,f),r.stroke(),r.strokeStyle=`#5e6ad2`,r.lineWidth=3*o,r.beginPath(),r.roundRect(c,l,u,d,f),r.stroke()}function tj(e){let t=e.toDataURL(`image/png`);return t.length<=25e5?t:e.toDataURL(`image/jpeg`,.85)}function nj(e){let[t,n]=e.split(`,`),r=t.match(/data:([^;]+)/)?.[1]??`image/png`,i=atob(n),a=new Uint8Array(i.length);for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);return new Blob([a],{type:r})}var[rj,ij]=T(null),[aj,oj]=T(null);function sj(e,t){ij(e),oj(t??null)}function cj(){ij(null),oj(null)}var[lj,uj]=T(`capture`);function dj(e){uj(e)}var fj=N(`<span class="absolute inset-0 grid place-items-center">`),pj=N(`<button><span>`),mj=N(`<span role=status aria-label=Loading class="text-text-dim relative inline-block shrink-0">`),hj=N(`<span class="absolute top-0 left-1/2 rounded-full bg-current"style="animation:geist-spinner-fade 1.2s linear infinite;will-change:opacity">`),gj=N(`<input>`),_j=N(`<textarea>`),vj=N(`<select>`),yj=N(`<svg viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden class=shrink-0><path d="M4.5 12.5a3 3 0 0 1-.4-5.97 4 4 0 0 1 7.8-.9A3.2 3.2 0 0 1 11.5 12.5h-7Z">`),bj=N(`<svg viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden class=shrink-0><rect x=1.5 y=2.5 width=13 height=9 rx=1.5></rect><path d="M5.5 14h5M8 11.5V14">`),xj=N(`<a target=_blank rel="noopener noreferrer"><span class="min-w-0 truncate"></span><svg width=11 height=11 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden class=shrink-0><path d="M4.5 11.5 11.5 4.5M5.5 4.5h6v6">`),Sj=N(`<span class="text-text-faint text-[10.5px] leading-snug">`),Cj=N(`<label class="flex flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">`),wj=N(`<section class="flex flex-col gap-2.5"><h2 class="text-text-dim text-[11px] font-semibold tracking-wide uppercase">`),Tj=N(`<span>`),Ej=N(`<span aria-hidden class="inline-block size-2 shrink-0 rounded-full">`),Dj=N(`<div class="flex flex-col items-center gap-1.5 px-4 py-10 text-center"><p class="text-text-dim text-[12px] font-medium"></p><div class="text-text-faint text-[11.5px] leading-relaxed">`),Oj=N(`<p class="bg-danger-soft text-danger rounded-md px-2.5 py-1.5 text-[11.5px] leading-snug break-words">`),kj={primary:`bg-accent hover:bg-accent-hover text-white border-transparent disabled:bg-surface-3 disabled:text-text-faint`,ghost:`bg-surface-2 hover:bg-surface-3 text-text border-border disabled:text-text-faint disabled:hover:bg-surface-2`,danger:`bg-danger-soft hover:bg-danger/30 text-danger border-transparent`};function q(e){let[t,n]=He(e,[`variant`,`loading`,`children`,`class`,`disabled`,`title`]);return(()=>{var e=pj(),r=e.firstChild;return ft(e,Ve(n,{get"data-tip"(){return t.title||void 0},get"aria-label"(){return n[`aria-label`]??t.title},get disabled(){return t.disabled||t.loading},get class(){return`relative inline-flex h-7 cursor-pointer items-center justify-center gap-1.5 rounded-md border px-3 text-[12px] font-medium transition-colors disabled:cursor-not-allowed ${kj[t.variant??`ghost`]} ${t.class??``}`}}),!1,!0),P(r,()=>t.children),P(e,j(M,{get when(){return t.loading},get children(){var e=fj();return P(e,j(Aj,{})),e}}),null),D(()=>st(r,`inline-flex items-center gap-1.5 ${t.loading?`invisible`:``}`)),e})()}function Aj(e){let t=()=>e.size??14,n=()=>Math.max(1,Math.round(t()*.09)),r=()=>Math.round(t()*.26);return(()=>{var e=mj();return P(e,j(We,{get each(){return Array.from({length:12},(e,t)=>t)},children:e=>(()=>{var i=hj();return dt(i,`transform`,`rotate(${e*30}deg)`),dt(i,`animation-delay`,`${(e-12)*.1}s`),D(e=>{var a=`${n()}px`,o=`${r()}px`,s=`-${n()/2}px`,c=`center ${t()/2}px`;return a!==e.e&&dt(i,`width`,e.e=a),o!==e.t&&dt(i,`height`,e.t=o),s!==e.a&&dt(i,`margin-left`,e.a=s),c!==e.o&&dt(i,`transform-origin`,e.o=c),e},{e:void 0,t:void 0,a:void 0,o:void 0}),i})()})),D(n=>{var r=`${t()}px`,i=`${t()}px`;return r!==n.e&&dt(e,`width`,n.e=r),i!==n.t&&dt(e,`height`,n.t=i),n},{e:void 0,t:void 0}),e})()}function jj(e){let[t,n]=He(e,[`class`]);return(()=>{var e=gj();return ft(e,Ve(n,{get class(){return`bg-surface-2 border-border focus:border-accent placeholder:text-text-faint h-7 w-full rounded-md border px-2 text-[12px] outline-none transition-colors ${t.class??``}`}}),!1,!1),e})()}function Mj(e){let[t,n]=He(e,[`class`]);return(()=>{var e=_j();return ft(e,Ve(n,{get class(){return`bg-surface-2 border-border focus:border-accent placeholder:text-text-faint w-full resize-y rounded-md border px-2 py-1.5 text-[12px] leading-relaxed outline-none transition-colors ${t.class??``}`}}),!1,!1),e})()}function Nj(e){let[t,n]=He(e,[`class`,`children`]);return(()=>{var e=vj();return ft(e,Ve(n,{get class(){return`bg-surface-2 border-border focus:border-accent h-7 w-full cursor-pointer rounded-md border px-1.5 text-[12px] outline-none ${t.class??``}`}}),!1,!0),P(e,()=>t.children),e})()}function Pj(e){let t=e.size??11;return(()=>{var e=yj();return it(e,`width`,t),it(e,`height`,t),e})()}function Fj(e){let t=e.size??11;return(()=>{var e=bj();return it(e,`width`,t),it(e,`height`,t),e})()}function Ij(e){return(()=>{var t=xj(),n=t.firstChild;return P(n,()=>e.children),D(n=>{var r=e.href,i=e.title||void 0,a=`text-accent inline-flex min-w-0 items-center gap-1 text-[11px] underline-offset-2 hover:underline ${e.class??``}`;return r!==n.e&&it(t,`href`,n.e=r),i!==n.t&&it(t,`data-tip`,n.t=i),a!==n.a&&st(t,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()}function Lj(e){return(()=>{var t=Cj(),n=t.firstChild;return P(n,()=>e.label),P(t,()=>e.children,null),P(t,j(M,{get when(){return e.hint},get children(){var t=Sj();return P(t,()=>e.hint),t}}),null),t})()}function Rj(e){return(()=>{var t=wj(),n=t.firstChild;return P(n,()=>e.title),P(t,()=>e.children,null),t})()}function zj(e){return(()=>{var t=Tj();return P(t,()=>e.children),D(n=>{var r=`bg-surface-3 text-text-dim inline-flex h-[18px] items-center gap-1 rounded-full px-2 text-[10.5px] font-medium whitespace-nowrap ${e.class??``}`,i=e.color?{color:e.color}:void 0,a=e.title||void 0;return r!==n.e&&st(t,n.e=r),n.t=ut(t,i,n.t),a!==n.a&&it(t,`data-tip`,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()}function Bj(e){return(()=>{var t=Ej();return D(n=>dt(t,`background`,e.color)),t})()}function Vj(e){return(()=>{var t=Dj(),n=t.firstChild,r=n.nextSibling;return P(n,()=>e.title),P(r,()=>e.children),t})()}function Hj(e){return(()=>{var t=Oj();return P(t,()=>e.message),t})()}var Uj={0:`No priority`,1:`Urgent`,2:`High`,3:`Medium`,4:`Low`};function Wj(e){let t=typeof e==`number`?e:Date.parse(e),n=Math.max(0,Math.floor((Date.now()-t)/1e3));if(n<60)return`just now`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let i=Math.floor(r/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}Br(),Ix(),_D();var Gj=N(`<span class="truncate font-mono">`),Kj=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M5.5 3.5 6.6 2h2.8l1.1 1.5H13A1.5 1.5 0 0 1 14.5 5v7A1.5 1.5 0 0 1 13 13.5H3A1.5 1.5 0 0 1 1.5 12V5A1.5 1.5 0 0 1 3 3.5h2.5Z"></path><circle cx=8 cy=8.2 r=2.4>`),qj=N(`<div class="flex flex-wrap gap-1.5"><span class="text-text-faint self-end text-[10.5px]">attached on create`),Jj=N(`<div class="flex items-center justify-between gap-1.5"><span class="text-text-faint text-[11px]">Model:</span><div class="flex rounded-md border border-border overflow-hidden">`),Yj=N(`<span class="inline-block min-w-[12ch] text-center">`),Xj=N(`<div class="flex justify-end">`),Zj=N(`<div class="flex flex-col gap-1.5">`),Qj=N(`<p class="text-text-faint text-[11px] leading-snug">Primary provider failed — drafted with <span class=text-text-dim></span> (<!>).`),$j=N(`<div class="border-warn/40 bg-surface rounded-md border px-2.5 py-2"><p class="text-warn mb-1 text-[10.5px] font-semibold tracking-wide uppercase">Possibly related — check before creating`),eM=N(`<div class="flex flex-col gap-1">`),tM=N(`<option value>Select a team…`),nM=N(`<option value=cursor> — cloud agent`),rM=N(`<option value=local>Local Claude Code (bridge)`),iM=N(`<option value=none>No one — just create the issue`),aM=N(`<option value>Claude Code default`),oM=N(`<option value=fable>Fable 5`),sM=N(`<option value=opus>Opus`),cM=N(`<option value=sonnet>Sonnet`),lM=N(`<option value=haiku>Haiku`),uM=N(`<label class="flex cursor-pointer items-center gap-2 select-none"><input type=checkbox class="accent-accent rounded"><span class="text-text text-[12px]">Isolated worktree <span class=text-text-dim>— own branch, run agents in parallel safely`),dM=N(`<label class="flex items-center gap-2 cursor-pointer select-none"><input type=checkbox class="rounded accent-accent"><span class="text-[12px] text-text">Attach console errors <span class="text-text-dim tabular-nums">(<!> captured)`),fM=N(`<label class="flex items-center gap-2 cursor-pointer select-none"><input type=checkbox class="rounded accent-accent"><span class="text-[12px] text-text">Attach dev server logs <span class="text-text-dim tabular-nums">(last <!> lines)`),pM=N(`<p class="text-warn text-[11px] leading-snug">`),mM=N(`<span class="text-success text-[11px]">✓`),hM=N(`<div class="flex h-full flex-col gap-4 overflow-y-auto pt-3 pb-4 pl-3 pr-4"><div class="bg-surface border-border flex items-center gap-2 rounded-lg border px-2.5 py-2"><div class="flex min-w-0 flex-1 flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">Attached context</span><div class="flex min-w-0 flex-wrap items-center gap-1.5"></div></div></div><div class="bg-bg border-border sticky bottom-0 z-10 -mb-4 flex flex-col gap-2 border-t pt-2.5 pb-3"><div class="flex items-center gap-2">`),gM=N(`<div class="border-border relative overflow-hidden rounded-md border"><img alt="Pasted attachment"class="block h-16 w-16 object-cover"><button class="bg-bg/80 text-text-dim hover:text-danger absolute top-0.5 right-0.5 grid size-4 cursor-pointer place-items-center rounded text-[10px] leading-none"title=Remove aria-label="Remove pasted image">×`),_M=N(`<button>`),vM=N(`<div class="flex min-w-0 items-center gap-1.5 py-0.5"><span class="font-mono text-text-dim shrink-0 text-[10.5px]"></span><a target=_blank rel=noreferrer class="text-accent min-w-0 truncate text-[11px] hover:underline">`),yM=N(`<div class="flex items-center gap-1"><span class="text-text-faint text-[11px] tabular-nums w-4 shrink-0 text-right">.</span><button class="text-text-faint hover:text-danger shrink-0 w-5 h-5 flex items-center justify-center rounded transition-colors cursor-pointer text-[12px] leading-none"aria-label="Remove step">×`),bM=N(`<option>`),xM=N(`<option>Loading teams…`),SM=N(`<div class="bg-surface border-border rounded-lg border p-2.5 flex items-center justify-between gap-2"><a target=_blank rel="noopener noreferrer"class="text-accent font-mono text-[12px] hover:underline">`),CM=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=8 height=8 rx=1.5></rect><path d="M10.5 5.5v-2a1.5 1.5 0 0 0-1.5-1.5H3.5A1.5 1.5 0 0 0 2 3.5V9a1.5 1.5 0 0 0 1.5 1.5h2">`);function wM(e){sr();let t=_r(()=>({queryKey:[`grab`],queryFn:Dr})),n=_r(()=>({queryKey:[`settings`],queryFn:Tr})),r=k(()=>n.data??{}),i=k(()=>t.data?.[0]??null),a=k(()=>!!(r().linearApiKey||r().linearAccessToken)),o=k(()=>jx(r())),[s,c]=br(`draft:title`,``),[l,u]=br(`draft:description`,``),[d,f]=br(`draft:steps`,[]),[p,m]=br(`draft:expected`,``),[h,g]=br(`draft:actual`,``),[_,v]=br(`draft:impact`,``),[y,b]=br(`draft:analysis`,``),[x,S]=br(`draft:next-steps`,``),[C,w]=br(`draft:priority`,0),[E,ee]=T(r().defaultTeamId??``),[te,A]=T(r().defaultRepo??``),[ne,re]=br(`draft:target`,`none`),[ie,oe]=br(`draft:local-model`,``),[se,ce]=br(`draft:cloud-model`,``),[le,ue]=br(`draft:worktree`,!1),[de,fe]=T(!0),[pe,me]=T(dk().length);O(()=>{let e=setInterval(()=>me(dk().length),3e3);ae(()=>clearInterval(e))});let[he,ge]=T(``);O(()=>{let e=s().trim(),t=setTimeout(()=>ge(e.length>=8?e:``),600);ae(()=>clearTimeout(t))});let _e=_r(()=>({queryKey:[`dup-search`,he()],queryFn:()=>vO(he()),enabled:!!he()&&a(),staleTime:3e4})),[ve,ye]=br(`draft:note`,``),[be,xe]=T([]),Se=e=>{for(let t of Array.from(e.clipboardData?.items??[])){if(!t.type.startsWith(`image/`))continue;let e=t.getAsFile();if(!e||e.size>8e6)continue;let n=new FileReader;n.onload=()=>xe(e=>[...e,{id:Date.now()+Math.random(),dataUrl:n.result}].slice(-6)),n.readAsDataURL(e)}},[Ce,we]=T(`fast`),[Te,Ee]=T(!0),De=!1;O(()=>{let e=n.data;De||!e||(De=!0,ee(e.defaultTeamId??``),A(e.defaultRepo??``),re(e.cursorAgentId?`cursor`:`none`))});let Oe=_r(()=>({queryKey:[`teams`],queryFn:dO,enabled:a()})),ke=k(()=>(Oe.data??[]).find(e=>e.id===E())?.name),[Ae,je]=T(!1),Me=async()=>{let e=mD({description:l(),reproSteps:d(),expected:p(),actual:h(),impact:_(),analysisNotes:y(),suggestedNextSteps:x(),grabs:t.data??[]}),n=`Fix this issue in the current repo. Test the change hands-on before calling it done.\n\n# ${s().trim()||`Issue`}\n\n${e}`;try{await navigator.clipboard.writeText(n),je(!0),setTimeout(()=>je(!1),1800)}catch{}},[Ne,Pe]=T(!1),[Fe,Ie]=T(null),[Le,Re]=T(null),ze=null,Be=()=>{ze?.(),ze=null};ae(Be);let Ve=e=>{e.title!==void 0&&c(e.title),e.description!==void 0&&u(e.description),e.reproSteps!==void 0&&f(e.reproSteps),e.expected!==void 0&&m(e.expected),e.actual!==void 0&&g(e.actual),e.impact!==void 0&&v(e.impact),e.analysisNotes!==void 0&&b(e.analysisNotes),e.suggestedNextSteps!==void 0&&S(e.suggestedNextSteps),e.priority!==void 0&&w(e.priority)},He=async()=>{if(!o())return;Pe(!0),Ie(null),Re(null),Be();let e=r().logUrl&&Te()?await ik({logUrl:r().logUrl,logLines:40}).catch(()=>void 0):void 0,n=de()?fk(15):null,a=[e?`--- dev server ---\n${e}`:null,n?`--- browser console ---\n${n}`:null].filter(Boolean).join(`
|
|
228
|
+
`)}async function AA(e,t){let n=t.fontEmbedCSS==null?t.skipFonts?null:await kA(e,t):t.fontEmbedCSS;if(n){let t=document.createElement(`style`),r=document.createTextNode(n);t.appendChild(r),e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}}async function jA(e,t={}){let{width:n,height:r}=xk(e,t),i=await iA(e,t,!0);return await AA(i,t),await vA(i,t),yA(i,t),await Dk(i,n,r)}async function MA(e,t={}){let{width:n,height:r}=xk(e,t),i=await Tk(await jA(e,t)),a=document.createElement(`canvas`),o=a.getContext(`2d`),s=t.pixelRatio||Sk(),c=t.canvasWidth||n,l=t.canvasHeight||r;return a.width=c*s,a.height=l*s,t.skipAutoScale||wk(a),a.style.width=`${c}`,a.style.height=`${l}`,t.backgroundColor&&(o.fillStyle=t.backgroundColor,o.fillRect(0,0,a.width,a.height)),o.drawImage(i,0,0,a.width,a.height),a}async function NA(e,t={}){return kA(e,t)}var PA=6,FA=class{last=performance.now();async tick(){performance.now()-this.last<=PA||(await new Promise(e=>{`requestIdleCallback`in window?requestIdleCallback(()=>e(),{timeout:100}):setTimeout(e,0)}),this.last=performance.now())}},IA=null,LA=new Map;function RA(e){let t=LA.get(e);if(t)return t;if(!IA){let e=document.createElement(`iframe`);if(e.setAttribute(`data-linear-grab`,`true`),e.style.cssText=`position:absolute;width:0;height:0;border:0;visibility:hidden`,document.body.appendChild(e),IA=e.contentDocument,!IA)return{}}let n=IA.createElement(e);IA.body.appendChild(n);let r=IA.defaultView.getComputedStyle(n),i={};for(let e=0;e<r.length;e++){let t=r[e];i[t]=r.getPropertyValue(t)}return n.remove(),LA.set(e,i),i}function zA(){try{for(let e of[`div`,`span`,`p`,`a`,`button`,`img`,`ul`,`li`,`svg`])RA(e)}catch{}}function BA(e){if(e.id===`linear-grab-root`)return!0;let t=e.tagName?.toLowerCase()??``;return t===`overlay-canvas`||t.startsWith(`react-grab`)||t===`script`||t===`iframe`}function VA(e,t){try{let n=document.createElement(`canvas`);n.width=e.naturalWidth||e.width||1,n.height=e.naturalHeight||e.height||1,n.getContext(`2d`).drawImage(e,0,0),t.src=n.toDataURL(`image/png`)}catch{t.removeAttribute(`src`),t.setAttribute(`style`,`${t.getAttribute(`style`)??``}background:#8b8e9822;`)}}async function HA(e,t){if(BA(e))return null;if(e instanceof SVGSVGElement)return e.cloneNode(!0);let n=e.cloneNode(!1),r=getComputedStyle(e),i=RA(e.tagName.toLowerCase()),a=``;for(let e=0;e<r.length;e++){let t=r[e],n=r.getPropertyValue(t);n&&n!==i[t]&&(a+=`${t}:${n};`)}if(n.setAttribute(`style`,a),n.removeAttribute(`class`),e instanceof HTMLImageElement&&(VA(e,n),n.removeAttribute(`srcset`),n.removeAttribute(`sizes`)),(e instanceof HTMLVideoElement||e instanceof HTMLAudioElement)&&(n.removeAttribute(`src`),n.removeAttribute(`poster`)),e.tagName===`SOURCE`)return null;if(e instanceof HTMLCanvasElement)try{let t=document.createElement(`img`);return t.setAttribute(`style`,a),t.src=e.toDataURL(),t}catch{}e instanceof HTMLInputElement&&n.setAttribute(`value`,e.value),e instanceof HTMLTextAreaElement&&(n.textContent=e.value),await t.tick();for(let r of Array.from(e.childNodes))if(r.nodeType===Node.TEXT_NODE)n.appendChild(r.cloneNode());else if(r.nodeType===Node.ELEMENT_NODE){let e=await HA(r,t);e&&n.appendChild(e)}return n}async function UA(e,t){let n=e.getBoundingClientRect(),r=Math.max(1,Math.ceil(n.width)),i=Math.max(1,Math.ceil(n.height)),a=await HA(e,new FA);if(!a)throw Error(`Capture root was filtered`);a.style.margin=`0`;let o=`<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${i}"><style>${t}</style><foreignObject width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml">${new XMLSerializer().serializeToString(a)}</div></foreignObject></svg>`,s=URL.createObjectURL(new Blob([o],{type:`image/svg+xml;charset=utf-8`})),c=new Image;c.decoding=`async`,c.src=s;try{await c.decode().catch(()=>{if(!c.complete||!c.naturalWidth)throw Error(`SVG rasterize failed — a subresource in the region could not load`)})}finally{URL.revokeObjectURL(s)}let l=8192,u=Math.min(window.devicePixelRatio||1,1.5,l/r,l/i),d=document.createElement(`canvas`);d.width=Math.max(1,Math.round(r*u)),d.height=Math.max(1,Math.round(i*u));let f=d.getContext(`2d`);if(!f)throw Error(`Canvas 2d unavailable`);return f.drawImage(c,0,0,d.width,d.height),d}var WA=null;function GA(e){return WA??=NA(e).catch(()=>``),WA}function KA(){`requestIdleCallback`in window?requestIdleCallback(()=>{zA(),GA(document.body)},{timeout:3e3}):setTimeout(()=>{zA(),GA(document.body)},1500)}var qA=4e3,JA=1e3;async function YA(e){try{if(await new Promise(e=>{requestAnimationFrame(()=>`requestIdleCallback`in window?requestIdleCallback(()=>e(void 0),{timeout:500}):setTimeout(e,80))}),!e.isConnected)return null;let t=$A(e),n=t.querySelectorAll(`*`).length;n>qA&&(t=e);let r;try{r=await UA(t,await GA(t))}catch{t!==e&&n>JA&&(t=e),r=await MA(t,{pixelRatio:Math.min(window.devicePixelRatio||1,1.5),fontEmbedCSS:await GA(t),filter:e=>{if(!(e instanceof Element))return!0;if(e.id===`linear-grab-root`)return!1;let t=e.tagName?.toLowerCase()??``;return!(t===`overlay-canvas`||t.startsWith(`react-grab`))}})}return t!==e&&ej(r,t,e),await QA(r)}catch{return null}}async function XA(e){return Promise.race([ZA(e),new Promise(e=>setTimeout(()=>{console.warn(`[linear-grab] region capture timed out after 15s`),e(null)},15e3))])}async function ZA(e){try{let t=e.x+e.w/2,n=e.y+e.h/2,r=document.elementFromPoint(t,n)??document.body,i=t=>{let n=t.getBoundingClientRect();return n.left<=e.x&&n.top<=e.y&&n.right>=e.x+e.w&&n.bottom>=e.y+e.h};for(;r!==document.body&&(!i(r)||r.querySelectorAll(`*`).length<1);)r=r.parentElement??document.body;let a=await UA(r,await GA(r)),o=r.getBoundingClientRect(),s=a.width/o.width,c=a.height/o.height,l=document.createElement(`canvas`);l.width=Math.max(1,Math.round(e.w*s)),l.height=Math.max(1,Math.round(e.h*c));let u=l.getContext(`2d`);return u?(u.drawImage(a,(e.x-o.left+r.scrollLeft)*s,(e.y-o.top+r.scrollTop)*c,e.w*s,e.h*c,0,0,l.width,l.height),await QA(l)):null}catch(e){return console.warn(`[linear-grab] region capture failed:`,e),null}}async function QA(e){try{if(typeof createImageBitmap==`function`&&typeof OffscreenCanvas<`u`){let t=await createImageBitmap(e);return(await PD({type:`encode-png`,bitmap:t},[t])).dataUrl}}catch{}return tj(e)}function $A(e){let t=window.innerWidth,n=window.innerHeight,r=t*n*1.7,i=e,a=e;for(;a&&a!==document.body&&a!==document.documentElement;){let o=a.getBoundingClientRect();if(o.width*o.height>r||a!==e&&(a.scrollTop>0||a.scrollLeft>0)||(i=a,o.width>=t*.55&&o.height>=n*.35))break;a=a.parentElement}return i}function ej(e,t,n){let r=e.getContext(`2d`);if(!r)return;let i=t.getBoundingClientRect(),a=n.getBoundingClientRect();if(!i.width||!i.height)return;let o=e.width/i.width,s=e.height/i.height,c=(a.left-i.left+t.scrollLeft)*o,l=(a.top-i.top+t.scrollTop)*s,u=a.width*o,d=a.height*s,f=Math.min(6*o,u/2,d/2);r.strokeStyle=`rgba(94, 106, 210, 0.35)`,r.lineWidth=8*o,r.beginPath(),r.roundRect(c,l,u,d,f),r.stroke(),r.strokeStyle=`#5e6ad2`,r.lineWidth=3*o,r.beginPath(),r.roundRect(c,l,u,d,f),r.stroke()}function tj(e){let t=e.toDataURL(`image/png`);return t.length<=25e5?t:e.toDataURL(`image/jpeg`,.85)}function nj(e){let[t,n]=e.split(`,`),r=t.match(/data:([^;]+)/)?.[1]??`image/png`,i=atob(n),a=new Uint8Array(i.length);for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);return new Blob([a],{type:r})}var[rj,ij]=T(null),[aj,oj]=T(null);function sj(e,t){ij(e),oj(t??null)}function cj(){ij(null),oj(null)}var[lj,uj]=T(`capture`);function dj(e){uj(e)}var fj=N(`<span class="absolute inset-0 grid place-items-center">`),pj=N(`<button><span>`),mj=N(`<span role=status aria-label=Loading class="text-text-dim relative inline-block shrink-0">`),hj=N(`<span class="absolute top-0 left-1/2 rounded-full bg-current"style="animation:geist-spinner-fade 1.2s linear infinite;will-change:opacity">`),gj=N(`<input>`),_j=N(`<textarea>`),vj=N(`<select>`),yj=N(`<svg viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden class=shrink-0><path d="M4.5 12.5a3 3 0 0 1-.4-5.97 4 4 0 0 1 7.8-.9A3.2 3.2 0 0 1 11.5 12.5h-7Z">`),bj=N(`<svg viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden class=shrink-0><rect x=1.5 y=2.5 width=13 height=9 rx=1.5></rect><path d="M5.5 14h5M8 11.5V14">`),xj=N(`<a target=_blank rel="noopener noreferrer"><span class="min-w-0 truncate"></span><svg width=11 height=11 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden class=shrink-0><path d="M4.5 11.5 11.5 4.5M5.5 4.5h6v6">`),Sj=N(`<span class="text-text-faint text-[10.5px] leading-snug">`),Cj=N(`<label class="flex flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">`),wj=N(`<section class="flex flex-col gap-2.5"><h2 class="text-text-dim text-[11px] font-semibold tracking-wide uppercase">`),Tj=N(`<span>`),Ej=N(`<span aria-hidden class="inline-block size-2 shrink-0 rounded-full">`),Dj=N(`<div class="flex flex-col items-center gap-1.5 px-4 py-10 text-center"><p class="text-text-dim text-[12px] font-medium"></p><div class="text-text-faint text-[11.5px] leading-relaxed">`),Oj=N(`<p class="bg-danger-soft text-danger rounded-md px-2.5 py-1.5 text-[11.5px] leading-snug break-words">`),kj={primary:`bg-accent hover:bg-accent-hover text-white border-transparent disabled:bg-surface-3 disabled:text-text-faint`,ghost:`bg-surface-2 hover:bg-surface-3 text-text border-border disabled:text-text-faint disabled:hover:bg-surface-2`,danger:`bg-danger-soft hover:bg-danger/30 text-danger border-transparent`};function q(e){let[t,n]=He(e,[`variant`,`loading`,`children`,`class`,`disabled`,`title`]);return(()=>{var e=pj(),r=e.firstChild;return ft(e,Ve(n,{get"data-tip"(){return t.title||void 0},get"aria-label"(){return n[`aria-label`]??t.title},get disabled(){return t.disabled||t.loading},get class(){return`relative inline-flex h-7 cursor-pointer items-center justify-center gap-1.5 rounded-md border px-3 text-[12px] font-medium transition-colors disabled:cursor-not-allowed ${kj[t.variant??`ghost`]} ${t.class??``}`}}),!1,!0),P(r,()=>t.children),P(e,j(M,{get when(){return t.loading},get children(){var e=fj();return P(e,j(Aj,{})),e}}),null),D(()=>st(r,`inline-flex items-center gap-1.5 ${t.loading?`invisible`:``}`)),e})()}function Aj(e){let t=()=>e.size??14,n=()=>Math.max(1,Math.round(t()*.09)),r=()=>Math.round(t()*.26);return(()=>{var e=mj();return P(e,j(We,{get each(){return Array.from({length:12},(e,t)=>t)},children:e=>(()=>{var i=hj();return dt(i,`transform`,`rotate(${e*30}deg)`),dt(i,`animation-delay`,`${(e-12)*.1}s`),D(e=>{var a=`${n()}px`,o=`${r()}px`,s=`-${n()/2}px`,c=`center ${t()/2}px`;return a!==e.e&&dt(i,`width`,e.e=a),o!==e.t&&dt(i,`height`,e.t=o),s!==e.a&&dt(i,`margin-left`,e.a=s),c!==e.o&&dt(i,`transform-origin`,e.o=c),e},{e:void 0,t:void 0,a:void 0,o:void 0}),i})()})),D(n=>{var r=`${t()}px`,i=`${t()}px`;return r!==n.e&&dt(e,`width`,n.e=r),i!==n.t&&dt(e,`height`,n.t=i),n},{e:void 0,t:void 0}),e})()}function jj(e){let[t,n]=He(e,[`class`]);return(()=>{var e=gj();return ft(e,Ve(n,{get class(){return`bg-surface-2 border-border focus:border-accent placeholder:text-text-faint h-7 w-full rounded-md border px-2 text-[12px] outline-none transition-colors ${t.class??``}`}}),!1,!1),e})()}function Mj(e){let[t,n]=He(e,[`class`]);return(()=>{var e=_j();return ft(e,Ve(n,{get class(){return`bg-surface-2 border-border focus:border-accent placeholder:text-text-faint w-full resize-y rounded-md border px-2 py-1.5 text-[12px] leading-relaxed outline-none transition-colors ${t.class??``}`}}),!1,!1),e})()}function Nj(e){let[t,n]=He(e,[`class`,`children`]);return(()=>{var e=vj();return ft(e,Ve(n,{get class(){return`bg-surface-2 border-border focus:border-accent h-7 w-full cursor-pointer rounded-md border px-1.5 text-[12px] outline-none ${t.class??``}`}}),!1,!0),P(e,()=>t.children),e})()}function Pj(e){let t=e.size??11;return(()=>{var e=yj();return it(e,`width`,t),it(e,`height`,t),e})()}function Fj(e){let t=e.size??11;return(()=>{var e=bj();return it(e,`width`,t),it(e,`height`,t),e})()}function Ij(e){return(()=>{var t=xj(),n=t.firstChild;return P(n,()=>e.children),D(n=>{var r=e.href,i=e.title||void 0,a=`text-accent inline-flex min-w-0 items-center gap-1 text-[11px] underline-offset-2 hover:underline ${e.class??``}`;return r!==n.e&&it(t,`href`,n.e=r),i!==n.t&&it(t,`data-tip`,n.t=i),a!==n.a&&st(t,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()}function Lj(e){return(()=>{var t=Cj(),n=t.firstChild;return P(n,()=>e.label),P(t,()=>e.children,null),P(t,j(M,{get when(){return e.hint},get children(){var t=Sj();return P(t,()=>e.hint),t}}),null),t})()}function Rj(e){return(()=>{var t=wj(),n=t.firstChild;return P(n,()=>e.title),P(t,()=>e.children,null),t})()}function zj(e){return(()=>{var t=Tj();return P(t,()=>e.children),D(n=>{var r=`bg-surface-3 text-text-dim inline-flex h-[18px] items-center gap-1 rounded-full px-2 text-[10.5px] font-medium whitespace-nowrap ${e.class??``}`,i=e.color?{color:e.color}:void 0,a=e.title||void 0;return r!==n.e&&st(t,n.e=r),n.t=ut(t,i,n.t),a!==n.a&&it(t,`data-tip`,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()}function Bj(e){return(()=>{var t=Ej();return D(n=>dt(t,`background`,e.color)),t})()}function Vj(e){return(()=>{var t=Dj(),n=t.firstChild,r=n.nextSibling;return P(n,()=>e.title),P(r,()=>e.children),t})()}function Hj(e){return(()=>{var t=Oj();return P(t,()=>e.message),t})()}var Uj={0:`No priority`,1:`Urgent`,2:`High`,3:`Medium`,4:`Low`};function Wj(e){let t=typeof e==`number`?e:Date.parse(e),n=Math.max(0,Math.floor((Date.now()-t)/1e3));if(n<60)return`just now`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let i=Math.floor(r/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}Br(),Ix(),_D();var Gj=N(`<span class="truncate font-mono">`),Kj=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M5.5 3.5 6.6 2h2.8l1.1 1.5H13A1.5 1.5 0 0 1 14.5 5v7A1.5 1.5 0 0 1 13 13.5H3A1.5 1.5 0 0 1 1.5 12V5A1.5 1.5 0 0 1 3 3.5h2.5Z"></path><circle cx=8 cy=8.2 r=2.4>`),qj=N(`<div class="flex flex-wrap gap-1.5"><span class="text-text-faint self-end text-[10.5px]">attached on create`),Jj=N(`<div class="flex items-center justify-between gap-1.5"><span class="text-text-faint text-[11px]">Model:</span><div class="flex rounded-md border border-border overflow-hidden">`),Yj=N(`<span class="inline-block min-w-[12ch] text-center">`),Xj=N(`<div class="flex justify-end">`),Zj=N(`<div class="flex flex-col gap-1.5">`),Qj=N(`<p class="text-text-faint text-[11px] leading-snug">Primary provider failed — drafted with <span class=text-text-dim></span> (<!>).`),$j=N(`<div class="border-warn/40 bg-surface rounded-md border px-2.5 py-2"><p class="text-warn mb-1 text-[10.5px] font-semibold tracking-wide uppercase">Possibly related — check before creating`),eM=N(`<div class="flex flex-col gap-1">`),tM=N(`<option value>Select a team…`),nM=N(`<option value=cursor> — cloud agent`),rM=N(`<option value=local>Local Claude Code (bridge)`),iM=N(`<option value=none>No one — just create the issue`),aM=N(`<option value>Claude Code default`),oM=N(`<option value=fable>Fable 5`),sM=N(`<option value=opus>Opus`),cM=N(`<option value=sonnet>Sonnet`),lM=N(`<option value=haiku>Haiku`),uM=N(`<label class="flex cursor-pointer items-center gap-2 select-none"><input type=checkbox class="accent-accent rounded"><span class="text-text text-[12px]">Isolated worktree <span class=text-text-dim>— own branch, run agents in parallel safely`),dM=N(`<label class="flex items-center gap-2 cursor-pointer select-none"><input type=checkbox class="rounded accent-accent"><span class="text-[12px] text-text">Attach console errors <span class="text-text-dim tabular-nums">(<!> captured)`),fM=N(`<label class="flex items-center gap-2 cursor-pointer select-none"><input type=checkbox class="rounded accent-accent"><span class="text-[12px] text-text">Attach dev server logs <span class="text-text-dim tabular-nums">(last <!> lines)`),pM=N(`<p class="text-warn text-[11px] leading-snug">`),mM=N(`<span class="text-success text-[11px]">✓`),hM=N(`<div class="flex h-full flex-col gap-4 overflow-y-auto pt-3 pb-4 pl-3 pr-4"><div class="bg-surface border-border flex items-center gap-2 rounded-lg border px-2.5 py-2"><div class="flex min-w-0 flex-1 flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">Attached context</span><div class="flex min-w-0 flex-wrap items-center gap-1.5"></div></div></div><div class="bg-bg border-border sticky bottom-0 z-10 -mb-4 flex flex-col gap-2 border-t pt-2.5 pb-3"><div class="flex items-center gap-2">`),gM=N(`<div class="border-border relative overflow-hidden rounded-md border"><img alt="Pasted attachment"class="block h-16 w-16 object-cover"><button class="bg-bg/80 text-text-dim hover:text-danger absolute top-0.5 right-0.5 grid size-4 cursor-pointer place-items-center rounded text-[10px] leading-none"title=Remove aria-label="Remove pasted image">×`),_M=N(`<button>`),vM=N(`<div class="flex min-w-0 items-center gap-1.5 py-0.5"><span class="font-mono text-text-dim shrink-0 text-[10.5px]"></span><a target=_blank rel=noreferrer class="text-accent min-w-0 truncate text-[11px] hover:underline">`),yM=N(`<div class="flex items-center gap-1"><span class="text-text-faint text-[11px] tabular-nums w-4 shrink-0 text-right">.</span><button class="text-text-faint hover:text-danger shrink-0 w-5 h-5 flex items-center justify-center rounded transition-colors cursor-pointer text-[12px] leading-none"aria-label="Remove step">×`),bM=N(`<option>`),xM=N(`<option>Loading teams…`),SM=N(`<div class="bg-surface border-border rounded-lg border p-2.5 flex items-center justify-between gap-2"><a target=_blank rel="noopener noreferrer"class="text-accent font-mono text-[12px] hover:underline">`),CM=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=8 height=8 rx=1.5></rect><path d="M10.5 5.5v-2a1.5 1.5 0 0 0-1.5-1.5H3.5A1.5 1.5 0 0 0 2 3.5V9a1.5 1.5 0 0 0 1.5 1.5h2">`);function wM(e){sr();let t=_r(()=>({queryKey:[`grab`],queryFn:Dr})),n=_r(()=>({queryKey:[`settings`],queryFn:Tr})),r=k(()=>n.data??{}),i=k(()=>t.data?.[0]??null),a=k(()=>!!(r().linearApiKey||r().linearAccessToken)),o=k(()=>jx(r())),[s,c]=br(`draft:title`,``),[l,u]=br(`draft:description`,``),[d,f]=br(`draft:steps`,[]),[p,m]=br(`draft:expected`,``),[h,g]=br(`draft:actual`,``),[_,v]=br(`draft:impact`,``),[y,b]=br(`draft:analysis`,``),[x,S]=br(`draft:next-steps`,``),[C,w]=br(`draft:priority`,0),[E,ee]=T(r().defaultTeamId??``),[te,A]=T(r().defaultRepo??``),[ne,re]=br(`draft:target`,`none`),[ie,oe]=br(`draft:local-model`,``),[se,ce]=br(`draft:cloud-model`,``),[le,ue]=br(`draft:worktree`,!1),[de,fe]=T(!0),[pe,me]=T(dk().length);O(()=>{let e=setInterval(()=>me(dk().length),3e3);ae(()=>clearInterval(e))});let[he,ge]=T(``);O(()=>{let e=s().trim(),t=setTimeout(()=>ge(e.length>=8?e:``),600);ae(()=>clearTimeout(t))});let _e=_r(()=>({queryKey:[`dup-search`,he()],queryFn:()=>vO(he()),enabled:!!he()&&a(),staleTime:3e4})),[ve,ye]=br(`draft:note`,``),[be,xe]=T([]),Se=e=>{for(let t of Array.from(e.clipboardData?.items??[])){if(!t.type.startsWith(`image/`))continue;let e=t.getAsFile();if(!e||e.size>8e6)continue;let n=new FileReader;n.onload=()=>xe(e=>[...e,{id:Date.now()+Math.random(),dataUrl:n.result}].slice(-6)),n.readAsDataURL(e)}},[Ce,we]=T(`fast`),[Te,Ee]=T(!0),De=!1;O(()=>{let e=n.data;De||!e||(De=!0,ee(e.defaultTeamId??``),A(e.defaultRepo??``),re(e.cursorAgentId?`cursor`:`none`))});let Oe=_r(()=>({queryKey:[`teams`],queryFn:dO,enabled:a()})),ke=k(()=>(Oe.data??[]).find(e=>e.id===E())?.name),[Ae,je]=T(!1),Me=async()=>{let e=mD({description:l(),reproSteps:d(),expected:p(),actual:h(),impact:_(),analysisNotes:y(),suggestedNextSteps:x(),grabs:t.data??[]}),n=`Fix this issue in the current repo. Test the change hands-on before calling it done.\n\n# ${s().trim()||`Issue`}\n\n${e}`;try{await navigator.clipboard.writeText(n),je(!0),setTimeout(()=>je(!1),1800)}catch{}},[Ne,Pe]=T(!1),[Fe,Ie]=T(null),[Le,Re]=T(null),ze=null,Be=()=>{ze?.(),ze=null};ae(Be);let Ve=e=>{e.title!==void 0&&c(e.title),e.description!==void 0&&u(e.description),e.reproSteps!==void 0&&f(e.reproSteps),e.expected!==void 0&&m(e.expected),e.actual!==void 0&&g(e.actual),e.impact!==void 0&&v(e.impact),e.analysisNotes!==void 0&&b(e.analysisNotes),e.suggestedNextSteps!==void 0&&S(e.suggestedNextSteps),e.priority!==void 0&&w(e.priority)},He=async()=>{if(!o())return;Pe(!0),Ie(null),Re(null),Be();let e=r().logUrl&&Te()?await ik({logUrl:r().logUrl,logLines:40}).catch(()=>void 0):void 0,n=de()?fk(15):null,a=[e?`--- dev server ---\n${e}`:null,n?`--- browser console ---\n${n}`:null].filter(Boolean).join(`
|
|
229
229
|
|
|
230
230
|
`)||void 0;ze=CD({note:be().length?`${ve()}\n\n(${be().length} pasted screenshot(s) will be attached to the issue.)`:ve(),grabbed:i()??null,grabbedList:t.data??void 0,teamName:ke(),tier:Ce(),template:uD(r()),logs:a},{onPartial:Ve,onDone:e=>{Ve(e.draft),e.fellBack&&Re({provider:e.provider,modelId:e.modelId}),Pe(!1),ze=null},onError:(e,t)=>{Ie(t===`no-provider`?`No AI provider configured — add an OpenAI or Anthropic key in Settings.`:e),Pe(!1),ze=null}})},[Ue,Ke]=T(UD());ae(WD(Ke));let qe=async()=>{let e=UD().result;if(!e)throw Error(`No recording available.`);if(e.assetUrl)return e.assetUrl;let t=await OO(e.blob,`recording-${Date.now()}.gif`);return iO(t),t},[Je,Ye]=T(null),[Xe,Ze]=T(null),[Qe,et]=T(null),tt=vr(()=>({mutationFn:async()=>{let e=mD({description:l(),reproSteps:d(),expected:p(),actual:h(),impact:_(),analysisNotes:y(),suggestedNextSteps:x(),grabs:t.data??[],repo:te(),model:se().trim()||r().cursorModel,agentInstructions:uD(r())});Ze(null);let n=[],i=UD();if(i.result&&i.attachOnCreate)try{let t=await qe();e+=`\n\n### Recording\n`}catch{n.push(`recording`)}let a=(t.data??[]).filter(e=>e.screenshotDataUrl).slice(0,3);for(let[t,r]of a.entries())try{let n=await OO(nj(r.screenshotDataUrl),`element-${Date.now()}-${t}.png`),i=r.componentName?`<${r.componentName}>`:r.tagName??`element`;e+=`\n\n### Element location${a.length>1?` — ${i}`:``}\n`}catch{n.push(`screenshot${a.length>1?` ${t+1}`:``}`)}let o=be();for(let[t,r]of o.entries())try{let n=await OO(nj(r.dataUrl),`pasted-${Date.now()}-${t}.png`);e+=`${t===0?`
|
|
231
231
|
|
|
@@ -260,29 +260,29 @@ of the other sections.`,gD="- FIRST, self-orient in the repo checkout (skip any
|
|
|
260
260
|
`),entries:i}:null},PY=(e,t,n)=>{if(e?.entries)return t===e.content?e.entries:e.entries.length===1?[{...e.entries[0],content:t,commentText:n}]:e.entries.map(e=>({...e,commentText:n}))},FY=async(e,t,n,r)=>{await t.onBeforeCopy(n);let i=!1,a=``;try{let o=e.getContent?{content:await e.getContent(n)}:await NY(n,e.maxContextLines),s=o?.content;if(s?.trim()){let c=await t.transformCopyContent(s,n);a=r?`${r}\n${c}`:c,i=rW(a,{componentName:e.componentName,entries:PY(o,a,r)})}}catch(e){t.onCopyError(AY(e))}return i&&t.onCopySuccess(n,a),t.onAfterCopy(n,i),i},IY=(e,t)=>{let n=Math.max(e.left,t.left),r=Math.max(e.top,t.top),i=Math.min(e.right,t.right),a=Math.min(e.bottom,t.bottom);return Math.max(0,i-n)*Math.max(0,a-r)},LY=(e,t)=>e.left<t.right&&e.right>t.left&&e.top<t.bottom&&e.bottom>t.top,RY=e=>e.sort((e,t)=>{if(e===t)return 0;let n=e.compareDocumentPosition(t);return n&Node.DOCUMENT_POSITION_FOLLOWING?-1:n&Node.DOCUMENT_POSITION_PRECEDING?1:0}),zY=e=>{if(e.width<=0||e.height<=0)return[];let t=window.innerWidth,n=window.innerHeight,r=e.x,i=e.y,a=e.x+e.width,o=e.y+e.height,s=r+e.width/2,c=i+e.height/2,l=MB(Math.ceil(e.width/32),3,20),u=MB(Math.ceil(e.height/32),3,20),d=l*u,f=d>100?Math.sqrt(100/d):1,p=MB(Math.floor(l*f),3,20),m=MB(Math.floor(u*f),3,20),h=new Set,g=[],_=(e,r)=>{let i=MB(Math.round(e),0,t-1),a=MB(Math.round(r),0,n-1),o=`${i}:${a}`;h.has(o)||(h.add(o),g.push({x:i,y:a}))};_(r+1,i+1),_(a-1,i+1),_(r+1,o-1),_(a-1,o-1),_(s,i+1),_(s,o-1),_(r+1,c),_(a-1,c),_(s,c);for(let t=0;t<p;t+=1){let n=r+(t+.5)/p*e.width;for(let t=0;t<m;t+=1)_(n,i+(t+.5)/m*e.height)}return g},BY=(e,t,n)=>{let r={left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height},i=new Set,a=zY(e);CI();try{for(let e of a){let t=document.elementsFromPoint(e.x,e.y);for(let e of t)i.add(e)}}finally{wI()}let o=[];for(let e of i)!n&&oI(e)||RM(e)&&t(e)&&o.push(e);let s=new Map;for(let e of o)s.set(e,e.getBoundingClientRect());let c=[];for(let e of o){let t=s.get(e);if(t.width<=0||t.height<=0)continue;let i={left:t.left,top:t.top,right:t.left+t.width,bottom:t.top+t.height};if(n){let n=IY(r,i),a=t.width*t.height;a>0&&n/a>=.75&&c.push(e)}else LY(i,r)&&c.push(e)}return RY(c)},VY=e=>{let t=new Set(e);return e.filter(e=>{for(let n=e.parentElement;n;n=n.parentElement)if(t.has(n))return!1;return!0})},HY=(e,t,n=!0)=>VY(BY(e,t,n)),UY=(e,t)=>e.width<=0?0:MB((t.x-e.x)/e.width,0,1),WY=()=>{QJ(),PI(),hI()},GY=e=>({borderRadius:`0px`,height:e.height,width:e.width,x:e.pageX-window.scrollX,y:e.pageY-window.scrollY}),KY=e=>({pageX:e.x+window.scrollX,pageY:e.y+window.scrollY,width:e.width,height:e.height}),qY=e=>({borderRadius:`0px`,height:e.height,width:e.width,x:e.x,y:e.y}),JY=(e,t,n)=>{let r=(e,t,n,r)=>{let i=[],a=e,o=0;for(;a&&i.length<n&&o<100;)r(a)&&i.push(a),a=t(a),o+=1;return i},i=r(e.parentElement,e=>e.parentElement,6,t);i.reverse();let a=i.map((e,t)=>({element:e,depth:t,isLast:!0})),o=i.length,s=r(e.previousElementSibling,e=>e.previousElementSibling,7,n),c=r(e.nextElementSibling,e=>e.nextElementSibling,7,n),l=Math.min(s.length,Math.max(3,7-c.length)),u=Math.min(c.length,7-l),d=[...s.slice(0,l).reverse(),e,...c.slice(0,u)],f=r(e.firstElementChild,e=>e.nextElementSibling,6,t),p=d.length-1,m=f.length-1;return d.forEach((t,n)=>{a.push({element:t,depth:o,isLast:n===p}),t===e&&f.forEach((e,t)=>{a.push({element:e,depth:o+1,isLast:t===m})})}),a},YY=e=>e instanceof SVGElement&&!(e instanceof SVGSVGElement),XY=e=>{let t=e.getBoundingClientRect();return t.width>=16||t.height>=16},ZY=(e,t)=>t(e)&&!YY(e)&&XY(e),QY=new Set([`c`,`C`,`с`,`С`,`ȼ`,`Ȼ`,`ↄ`,`Ↄ`,`ᴄ`,`ᶜ`,`ⱼ`,`ⅽ`,`Ⅽ`,`ç`,`Ç`,`ć`,`Ć`,`č`,`Č`,`ĉ`,`Ĉ`,`ċ`,`Ċ`]),$Y=(e,t)=>t===`KeyC`?!0:!e||e.length!==1?!1:QY.has(e),eX=(e,t)=>{if(!e||!t)return!1;let n=e.toLowerCase();return t===`Space`?n===`space`||n===` `:t.startsWith(`Key`)?t.slice(3).toLowerCase()===n:t.startsWith(`Digit`)?t.slice(5)===n:!1},tX={meta:`metaKey`,cmd:`metaKey`,command:`metaKey`,win:`metaKey`,windows:`metaKey`,ctrl:`ctrlKey`,control:`ctrlKey`,shift:`shiftKey`,alt:`altKey`,option:`altKey`,opt:`altKey`},nX=e=>{let t=e.split(`+`).map(e=>e.trim().toLowerCase()),n={metaKey:!1,ctrlKey:!1,shiftKey:!1,altKey:!1,key:null};for(let e of t){let t=tX[e];t?n[t]=!0:n.key=e}return n},rX=e=>{if(typeof e==`function`)return e;let t=nX(e),n=t.key;return e=>{if(n===null){let n=!t.metaKey||e.metaKey||e.key===`Meta`,r=!t.ctrlKey||e.ctrlKey||e.key===`Control`,i=!t.shiftKey||e.shiftKey||e.key===`Shift`,a=!t.altKey||e.altKey||e.key===`Alt`,o=n&&r&&i&&a,s=[t.metaKey,t.ctrlKey,t.shiftKey,t.altKey].filter(Boolean).length,c=[e.metaKey||e.key===`Meta`,e.ctrlKey||e.key===`Control`,e.shiftKey||e.key===`Shift`,e.altKey||e.key===`Alt`].filter(Boolean).length;return o&&c>=s}let r=e.key?.toLowerCase()===n||eX(n,e.code),i=t.metaKey||t.ctrlKey||t.shiftKey||t.altKey?(!t.metaKey||e.metaKey)&&(!t.ctrlKey||e.ctrlKey)&&(!t.shiftKey||e.shiftKey)&&(!t.altKey||e.altKey):!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey;return r&&i}},iX=e=>!e||typeof e==`function`?{metaKey:FB(),ctrlKey:!FB(),shiftKey:!1,altKey:!1,key:null}:nX(e),aX=(e,t)=>{if(t.activationKey)return rX(t.activationKey)(e);let n=(FB()?e.metaKey:e.ctrlKey)&&!e.shiftKey&&!e.altKey;return!!(e.key&&n&&$Y(e.key,e.code))},oX=e=>{if(e.length===0)return{x:0,y:0,width:0,height:0};if(e.length===1)return e[0];let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x),n=Math.min(n,a.y),r=Math.max(r,a.x+a.width),i=Math.max(i,a.y+a.height);return{x:t,y:n,width:r-t,height:i-n}},sX=e=>{let t=getComputedStyle(e),n={};for(let e of LB)n[e]=t.getPropertyValue(e);return n},cX=e=>{let t={};for(let n of rV)t[n]=e.getPropertyValue(n);return t},lX=e=>{try{let t=e.parentElement;if(!t)return null;let n=e.namespaceURI,r=e.tagName.toLowerCase(),i=n&&n!==`http://www.w3.org/1999/xhtml`?e.ownerDocument.createElementNS(n,r):e.ownerDocument.createElement(r),a=`style`in i?i.style:null;a instanceof CSSStyleDeclaration&&a.setProperty(`display`,`none`,`important`),t.appendChild(i);try{return cX(getComputedStyle(i))}finally{i.remove()}}catch{return null}},uX=new Set([`display`,`width`,`height`]),dX=(e,t,n)=>e.kind===`color`?!1:e.cssProperties.some(e=>uX.has(e))?fX(e):e.cssProperties.every(e=>{let r=t[e],i=n[e];return r===void 0||i===void 0?!1:r===i}),fX=e=>{if(e.kind===`color`)return!1;if(e.kind===`enum`)return e.key===`font-weight`?e.original===`400`:e.options[0]?.value===e.original;let{key:t,original:n}=e;return t.startsWith(`padding`)||t.startsWith(`margin`)||t.includes(`gap`)||t===`border-width`||t.endsWith(`-radius`)||t===`border-radius`?n===0:t===`opacity`?n===100:t===`letter-spacing`||t===`z-index`?n===0:!YB.has(t)&&!!(t===`width`||t===`height`||t===`width,height`||t.startsWith(`max-`)||t.startsWith(`min-`)||t===`line-height`)},pX=e=>{let t=e.trim();if(!t||t===`auto`||t===`normal`||t===`none`)return null;let n=Number.parseFloat(t);return Number.isFinite(n)?t.endsWith(`%`)?{value:n,unit:`%`}:t.endsWith(`rem`)||t.endsWith(`em`)?{value:n*16,unit:`px`}:t.endsWith(`px`)?{value:n,unit:`px`}:{value:n,unit:``}:null},mX=(e,t)=>{let n=pX(e[t]);if(n)return n;if(t===`line-height`){let t=pX(e[`font-size`]);return t?{value:sV(t.value*IN),unit:t.unit||`px`}:null}return HB.has(t)?{value:0,unit:`px`}:null},hX=(e,t)=>{let n=mX(e,t[0]);if(!n)return null;for(let r=1;r<t.length;r++){let i=mX(e,t[r]);if(!i||i.unit!==n.unit||Math.abs(i.value-n.value)>=.5)return null}return n},gX=(e,t)=>e===`opacity`?{value:Math.round(t.value*100),unit:`%`}:UB.has(e)?{value:sV(t.value),unit:``}:{value:sV(t.value),unit:t.unit||`px`},_X=e=>e!==null,vX=(e,t)=>{let n=t.map(t=>{let n=t.longhands.length===1?mX(e,t.longhands[0]):hX(e,t.longhands);return n?{definition:t,value:n}:null}).filter(_X),r=new Map;for(let e of n)for(let t of e.definition.longhands){let n=r.get(t);(!n||e.definition.longhands.length>n.definition.longhands.length)&&r.set(t,e)}let i=new Set(r.values());return n.map(e=>({...e,isCanonical:i.has(e)}))},yX=(e,t,n)=>e===`opacity`?{min:0,max:100}:e===`z-index`?{min:BB,max:VB}:e===`letter-spacing`?{min:-10,max:20}:e===`font-size`?{min:8,max:96}:e===`line-height`?{min:0,max:120}:e.includes(`radius`)?{min:0,max:96}:e===`width`||e===`height`||e===`width,height`||e.startsWith(`min-`)||e.startsWith(`max-`)?{min:0,max:Math.max(512,Math.ceil(t*2))}:YB.has(e)?{min:zB,max:512}:n===`%`?{min:0,max:100}:{min:e.startsWith(`margin`)?RB:0,max:384},bX=(e,t,n)=>{let r=gX(e.key,t),i=r.unit===`px`&&Math.abs(r.value)>1e7,a=yX(e.key,i?0:r.value,r.unit),o=r.value<0?a.min:a.max,s=i?o:r.value;return{kind:`numeric`,key:e.key,label:e.label,cssProperties:e.longhands,min:a.min,max:a.max,value:s,original:s,unit:r.unit,tailwindAliases:FV(e.key),isPrioritized:!1,isDefault:!1,isCanonical:n}},xX=(e,t,n,r=!1)=>{let i=jB(n),a=i?gB(i):null,o=a!==null&&a.alpha!==0;if(!o&&!r)return null;let s=o&&i?i:EN;return{kind:`color`,key:e,label:t,cssProperties:[e],value:s,original:s,tailwindAliases:FV(e),isPrioritized:r,isDefault:!1,isCanonical:!0}},SX=(e,t,n)=>{let r=t.trim(),i=n??e.options;return!i||!i.some(e=>e.value===r)?null:{kind:`enum`,key:e.key,label:e.label,cssProperties:[e.key],value:r,original:r,options:i,tailwindAliases:FV(e.key),isPrioritized:!1,isDefault:!1,isCanonical:!0}},CX=new Map(`background-color.color.padding.padding-left,padding-right.padding-top,padding-bottom.padding-top.padding-right.padding-bottom.padding-left.margin.margin-left,margin-right.margin-top,margin-bottom.margin-top.margin-right.margin-bottom.margin-left.font-family.font-size.font-weight.font-style.line-height.letter-spacing.text-transform.text-align.text-decoration-line.white-space.word-break.overflow-wrap.font-variant-numeric.border-radius.border-top-left-radius,border-top-right-radius.border-bottom-left-radius,border-bottom-right-radius.border-top-left-radius,border-bottom-left-radius.border-top-right-radius,border-bottom-right-radius.border-top-left-radius.border-top-right-radius.border-bottom-left-radius.border-bottom-right-radius.width,height.width.height.max-width.max-height.min-width.min-height.opacity.gap.row-gap.column-gap.border-width.border-top-width.border-right-width.border-bottom-width.border-left-width.border-color.align-items.justify-content.top,right,bottom,left.left,right.top,bottom.top.right.bottom.left.z-index`.split(`.`).map((e,t)=>[e,t])),wX=e=>CX.get(e.key)??1/0,TX=e=>e.map((e,t)=>({property:e,index:t})).sort((e,t)=>{let n=wX(e.property)-wX(t.property);return n===0?e.index-t.index:n}).map(e=>e.property),EX=e=>{let t=sX(e),n=getComputedStyle(e),r=cX(n),i=lX(e),a=[],o=new Set,s=e=>{o.has(e.key)||(a.push(e),o.add(e.key))};for(let e of XB)for(let n of vX(t,e))s(bX(n.definition,n.value,n.isCanonical));for(let e of ZB){let n=mX(t,e.key);n&&s(bX({key:e.key,label:e.label,longhands:[e.key]},n,!0))}for(let{key:e,label:t,alwaysShow:r}of QB){let i=n.getPropertyValue(e);if(!r&&(!i||vB(i)))continue;let a=xX(e,t,i,r);a&&s(a)}let c=n.getPropertyValue(tV.key);if(c){let e=SX(tV,c,eV(c));e&&s(e)}for(let e of nV){let t=n.getPropertyValue(e.key);if(!t)continue;let r=SX(e,t);r&&s(r)}return DX(a,PV(e),r,i)},DX=(e,t,n,r)=>{let i=[],a=[];for(let o of e)if(o.isPrioritized||t.has(o.key))i.push({...o,isPrioritized:!0,isDefault:!1});else{let e=r?dX(o,n,r):fX(o);a.push({...o,isDefault:e})}return[...TX(i),...TX(a)]},OX=[{keyword:`letter`,family:`letter-spacing`},{keyword:`tracking`,family:`letter-spacing`},{keyword:`leading`,family:`line-height`},{keyword:`line-height`,family:`line-height`},{keyword:`lineheight`,family:`line-height`},{keyword:`radius`,family:`radius`},{keyword:`rounded`,family:`radius`},{keyword:`corner`,family:`radius`},{keyword:`font-size`,family:`font-size`},{keyword:`fontsize`,family:`font-size`},{keyword:`text`,family:`font-size`},{keyword:`stroke`,family:`border-width`},{keyword:`border-width`,family:`border-width`},{keyword:`borderwidth`,family:`border-width`},{keyword:`space`,family:`spacing`},{keyword:`gap`,family:`spacing`},{keyword:`gutter`,family:`spacing`},{keyword:`inset`,family:`spacing`},{keyword:`padding`,family:`spacing`},{keyword:`margin`,family:`spacing`},{keyword:`size`,family:`size`},{keyword:`width`,family:`size`},{keyword:`height`,family:`size`}],kX=e=>{let t=e.toLowerCase();for(let{keyword:e,family:n}of OX)if(t.includes(e))return n;return null},AX=e=>e.includes(`radius`)?`radius`:e.endsWith(`-width`)&&e.includes(`border`)?`border-width`:e===`font-size`?`font-size`:e===`line-height`?`line-height`:e===`letter-spacing`?`letter-spacing`:e.startsWith(`padding`)||e.startsWith(`margin`)||e.endsWith(`gap`)||e===`top`||e===`right`||e===`bottom`||e===`left`||e.startsWith(`inset`)?`spacing`:e===`width`||e===`height`||e.startsWith(`min-`)||e.startsWith(`max-`)?`size`:null,jX=e=>{let t=pX(e);return!t||t.unit!==`px`?null:sV(t.value)},MX=(e,t)=>t===null?!0:e.length===t.length?e<t:e.length<t.length,NX=(e,t,n)=>{if(n===1){for(let n of e)if(n>t)return n;return null}for(let n=e.length-1;n>=0;n--)if(e[n]<t)return e[n];return null},PX=(e,t,n)=>{let r=(t===1?Math.floor(e/n)+1:Math.ceil(e/n)-1)*n;return r<0?null:r},FX=null,IX=(e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n]),LX=()=>{let e=Array.from(document.adoptedStyleSheets??[]),t=document.styleSheets.length;if(FX&&FX.documentSheetCount===t&&IX(FX.adoptedSheets,e))return FX.names;let n=new Set;for(let t of[...document.styleSheets,...e]){let e;try{e=t.cssRules}catch{continue}RX(e,n)}return FX={documentSheetCount:t,adoptedSheets:e,names:n},n},RX=(e,t)=>{for(let n of Array.from(e))if(n instanceof CSSStyleRule){let e=n.style;for(let n=0;n<e.length;n++){let r=e.item(n);r.startsWith(`--`)&&t.add(r)}}else n instanceof CSSGroupingRule&&RX(n.cssRules,t)},zX={hasTokens:!1,matchColor:()=>null,matchLength:()=>null,stepLength:()=>null},BX=e=>{if(typeof document>`u`)return zX;let t=LX();if(t.size===0)return zX;let n=getComputedStyle(e),r=new Map,i=new Map,a=new Map,o=null;for(let e of t){let t=n.getPropertyValue(e).trim();if(!t)continue;let s=jX(t);if(s!==null){e===`--spacing`&&s>0&&(o=s);let t=kX(e);if(t!==null){let n=i.get(s);n?n.push({name:e,family:t}):i.set(s,[{name:e,family:t}]);let r=a.get(t);r?r.add(s):a.set(t,new Set([s]))}continue}let c=jB(t);if(c){let t=c.toLowerCase();MX(e,r.get(t)??null)&&r.set(t,e)}}if(r.size===0&&i.size===0)return zX;let s=new Map;for(let[e,t]of a)s.set(e,Array.from(t).sort((e,t)=>e-t));return{hasTokens:!0,matchColor:e=>{let t=jB(e)?.toLowerCase();return t?r.get(t)??null:null},matchLength:(e,t)=>{let n=AX(t);if(n===null)return null;let r=i.get(Math.round(e));if(!r)return null;let a=null;for(let e of r)e.family===n&&MX(e.name,a)&&(a=e.name);return a},stepLength:(e,t,n)=>{let r=AX(n);if(r===null)return null;let i=Math.round(e),a=s.get(r);return a&&a.length>=2?NX(a,i,t):(r===`spacing`||r===`size`)&&o?PX(i,t,o):a?NX(a,i,t):null}}},VX=e=>e.kind===`color`||e.kind===`enum`?e.value:e.key===`opacity`&&e.unit===`%`?oV(e.value/100):`${oV(e.value)}${e.unit}`,HX=(e,t,n)=>{if(!n?.hasTokens)return null;let{edit:r}=t;return r.kind===`color`?n.matchColor(r.value):r.kind===`numeric`&&r.unit===`px`?n.matchLength(r.value,e):null},UX=e=>{let t=new Map;for(let n of e.edits){let e=VX(n);for(let r of n.cssProperties)t.set(r,{edit:n,cssValue:e})}let n=!1;return{lines:Array.from(t,([t,r])=>{let i=HX(t,r,e.designTokens);i&&(n=!0);let a=i?` /* var(${i}) */`:``;return`${t}: ${r.cssValue};${a}`}),usesToken:n}},WX=e=>e.filePath?`${e.filePath}:${e.lineNumber}`:``,GX=e=>["```css",...e,"```"].join(`
|
|
261
261
|
`),KX=e=>{if(e.length===0)return``;let t=e.map(e=>{let{lines:t,usesToken:n}=UX(e);return{header:WX(e),cssLines:t,usesToken:n}}),n=[`Apply these style changes canonically (CSS = visual intent; choose the source change that best expresses the underlying layout intent):`];if(t.some(e=>e.usesToken)&&n.push("Prefer the design token shown in each `/* var(--token) */` comment over the raw value when it matches the project's intent."),t.length===1){let[e]=t;return e.header&&n.push(`\n${e.header}`),n.push(GX(e.cssLines)),n.join(`
|
|
262
262
|
`)}for(let e of t)n.push(e.header?`\n${e.header}`:``),n.push(GX(e.cssLines));return n.join(`
|
|
263
|
-
`)},qX=e=>`style`in e&&e.style instanceof CSSStyleDeclaration,JX=e=>{let t=new Map,n=qX(e)?e:null;return{apply:(e,r)=>{if(n)for(let i of e)t.has(i)||t.set(i,{value:n.style.getPropertyValue(i),priority:n.style.getPropertyPriority(i)}),n.style.setProperty(i,r)},restore:()=>{if(!n){t.clear();return}for(let[e,{value:r,priority:i}]of t)r?n.style.setProperty(e,r,i):n.style.removeProperty(e);t.clear()},hasAppliedStyles:()=>t.size>0}},YX=(e,t)=>{for(let n of t){let t=e.edits.findIndex(e=>e.key===n.key);t>=0?e.edits[t]=n:e.edits.push(n)}},XX=(e,t)=>({element:e.element,preview:e.preview,filePath:e.filePath??``,lineNumber:e.lineNumber??0,edits:t,designTokens:e.designTokens}),ZX=e=>{let[t,n]=J(null),[r,i]=J(!1),a=[],o=[],s=e=>{o=e},c=()=>{let r=t()!==null;n(null),i(!1),a=[],o=[],r&&e.onClose?.()},l=()=>{t()?.preview.restore();for(let e=a.length-1;e>=0;e--)a[e].preview.restore();c()},u=e=>{NU(e).then(t=>{t&&n(n=>!n||n.element!==e||n.componentName?n:{...n,componentName:t})})},d=(r,i,a={})=>{if(t()!==null)return!1;let o=EX(r);if(o.length===0)return!1;let s=a.filePath??e.store.selectionFilePath??void 0,c=a.lineNumber??e.store.selectionLineNumber??void 0;return n({element:r,position:i,selectionBounds:eY(r),properties:o,preview:JX(r),filePath:s,lineNumber:c,componentName:a.componentName,tagName:a.tagName??RN(r),initialSearchQuery:a.initialSearchQuery,designTokens:BX(r)}),u(r),e.isActivated()||e.activateRenderer(),e.actions.setPointer(i),e.actions.setFrozenElement(r),e.actions.freeze(),e.onOpen?.(),!0},f=(r,i)=>{let s=t();if(!s||s.element===r)return!1;let c=EX(r);return c.length===0?!1:((o.length>0||s.preview.hasAppliedStyles())&&a.push(XX(s,o)),o=[],n({element:r,position:i,selectionBounds:eY(r),properties:c,preview:JX(r),tagName:RN(r),hasSessionEdits:a.some(e=>e.edits.length>0),designTokens:BX(r)}),BU(r).then(e=>{if(e){for(let t of a)t.element===r&&!t.filePath&&(t.filePath=e.filePath,t.lineNumber=e.lineNumber??0);n(t=>!t||t.element!==r||t.filePath?t:{...t,filePath:e.filePath,lineNumber:e.lineNumber??void 0})}}).catch(()=>void 0),u(r),e.actions.setPointer(i),e.actions.setFrozenElement(r),!0)},p=(e,t)=>[...a,XX(e,t)],m=e=>{let t=new Map;for(let n of e){if(n.edits.length===0)continue;let e=t.get(n.element);if(e){!e.filePath&&n.filePath&&(e.filePath=n.filePath,e.lineNumber=n.lineNumber),YX(e,n.edits);continue}t.set(n.element,{filePath:n.filePath,lineNumber:n.lineNumber,edits:[...n.edits],designTokens:n.designTokens})}return Array.from(t.values())},h=e=>{let t=new Set;for(let n of e)n.edits.length>0&&t.add(n.element);for(let n=e.length-1;n>=0;n--){let r=e[n];r.edits.length===0&&!t.has(r.element)&&r.preview.restore()}};return{state:t,trigger:d,switchToElement:f,setPendingEdits:s,dismiss:()=>{t()!==null&&(l(),e.store.wasActivatedByToggle?e.deactivateRenderer():e.actions.unfreeze())},closePreservingRenderer:()=>{t()!==null&&(l(),e.actions.unfreeze())},submit:n=>{let r=t();if(!r)return;let i=r.element,a=p(r,n),o=KX(m(a));h(a),c(),e.store.wasActivatedByToggle||e.actions.unfreeze(),e.performCopyWithLabel({element:i,cursorX:r.position.x,extraPrompt:o||void 0,shouldDeactivateAfter:e.store.wasActivatedByToggle})},resetWithDiscard:l,isOpen:()=>t()!==null,isInteracting:r,setInteracting:i}},QX={enabled:!0,hue:0,selectionBox:{enabled:!0},dragBox:{enabled:!0},grabbedBoxes:{enabled:!0},elementLabel:{enabled:!0},toolbar:{enabled:!0}},$X=(e,t)=>({enabled:t.enabled??e.enabled,hue:t.hue??e.hue,selectionBox:{enabled:t.selectionBox?.enabled??e.selectionBox.enabled},dragBox:{enabled:t.dragBox?.enabled??e.dragBox.enabled},grabbedBoxes:{enabled:t.grabbedBoxes?.enabled??e.grabbedBoxes.enabled},elementLabel:{enabled:t.elementLabel?.enabled??e.elementLabel.enabled},toolbar:{enabled:t.toolbar?.enabled??e.toolbar.enabled}}),eZ={activationMode:`toggle`,keyHoldDuration:100,allowActivationInsideInput:!0,activationKey:void 0,getContent:void 0,maxContextLines:3,freezeReactUpdates:!0},tZ=(e={})=>{let t=new Map,n={},[r,i]=BJ({theme:QX,options:{...eZ,...e},actions:[]}),a=()=>{let r=QX,a={...eZ,...e},o=[];for(let{config:e}of t.values())if(e.theme&&(r=$X(r,e.theme)),e.options&&(a={...a,...e.options}),e.actions)for(let t of e.actions)o.push(t);a={...a,...n},i(`theme`,r),i(`options`,a),i(`actions`,o)},o=(e,t)=>{n[e]=t,i(`options`,e,t)},s=[`activationMode`,`keyHoldDuration`,`allowActivationInsideInput`,`activationKey`,`getContent`,`maxContextLines`,`freezeReactUpdates`],c=e=>{for(let t of s)e[t]!==void 0&&o(t,e[t])},l=(e,n)=>{t.has(e.name)&&u(e.name);let r=e.setup?.(n,_)??{};e.theme&&(r.theme=r.theme?$X($X(QX,e.theme),r.theme):e.theme),e.actions&&(r.actions=[...e.actions,...r.actions??[]]),e.hooks&&(r.hooks=r.hooks?{...e.hooks,...r.hooks}:e.hooks),e.options&&(r.options=r.options?{...e.options,...r.options}:e.options),t.set(e.name,{plugin:e,config:r}),a()},u=e=>{let n=t.get(e);n&&(n.config.cleanup&&n.config.cleanup(),t.delete(e),a())},d=()=>Array.from(t.keys()),f=(e,...n)=>{for(let{config:r}of t.values()){let t=r.hooks?.[e];t&&t(...n)}},p=(e,...n)=>{let r=!1;for(let{config:i}of t.values()){let t=i.hooks?.[e];t&&t(...n)===!0&&(r=!0)}return r},m=async(e,...n)=>{for(let{config:r}of t.values()){let t=r.hooks?.[e];t&&await t(...n)}},h=async(e,n,...r)=>{let i=n;for(let{config:n}of t.values()){let t=n.hooks?.[e];t&&(i=await t(i,...r))}return i},g=(e,n,...r)=>{let i=n;for(let{config:n}of t.values()){let t=n.hooks?.[e];t&&(i=t(i,...r))}return i},_={onActivate:()=>f(`onActivate`),onDeactivate:()=>f(`onDeactivate`),onElementHover:e=>f(`onElementHover`,e),onElementSelect:e=>{let n=!1,r;for(let{config:i}of t.values()){let t=i.hooks?.onElementSelect;if(t){let i=t(e);i===!0?n=!0:i instanceof Promise&&(n=!0,r=i)}}return{wasIntercepted:n,pendingResult:r}},onDragStart:(e,t)=>f(`onDragStart`,e,t),onDragEnd:(e,t)=>f(`onDragEnd`,e,t),onBeforeCopy:async e=>m(`onBeforeCopy`,e),transformCopyContent:async(e,t)=>h(`transformCopyContent`,e,t),onAfterCopy:(e,t)=>f(`onAfterCopy`,e,t),onCopySuccess:(e,t)=>f(`onCopySuccess`,e,t),onCopyError:e=>f(`onCopyError`,e),onStateChange:e=>f(`onStateChange`,e),onPromptModeChange:(e,t)=>f(`onPromptModeChange`,e,t),onSelectionBox:(e,t,n)=>f(`onSelectionBox`,e,t,n),onDragBox:(e,t)=>f(`onDragBox`,e,t),onGrabbedBox:(e,t)=>f(`onGrabbedBox`,e,t),onElementLabel:(e,t,n)=>f(`onElementLabel`,e,t,n),onContextMenu:(e,t)=>f(`onContextMenu`,e,t),onOpenFile:(e,t)=>p(`onOpenFile`,e,t),transformHtmlContent:async(e,t)=>h(`transformHtmlContent`,e,t),transformAgentContext:async(e,t)=>h(`transformAgentContext`,e,t),transformActionContext:e=>g(`transformActionContext`,e),transformOpenFileUrl:(e,t,n)=>g(`transformOpenFileUrl`,e,t,n)};return{register:l,unregister:u,getPluginNames:d,setOptions:c,store:r,hooks:_}},nZ=e=>`${e}-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,rZ=e=>{let t=e.bounds.x+e.bounds.width/2,n=e.bounds.width/2,r=e.mouseX===void 0?void 0:e.mouseX-t;return{id:nZ(`label`),bounds:e.bounds,boundsMultiple:e.boundsMultiple,tagName:e.tagName,componentName:e.componentName,status:e.status,createdAt:Date.now(),element:e.element,elements:e.elements,mouseX:e.mouseX,mouseXOffsetFromCenter:r,mouseXOffsetRatio:r!==void 0&&n>0?r/n:void 0,hideArrow:e.hideArrow}},iZ=(e,t)=>{let n=new Map,r=e=>{let t=n.get(e);t!==void 0&&(window.clearTimeout(t),n.delete(e))},i=()=>{for(let e of n.values())window.clearTimeout(e);n.clear()},a=()=>{i(),e.clearLabelInstances()},o=t=>{r(t);let i=window.setTimeout(()=>{e.updateLabelInstance(t,`fading`);let r=window.setTimeout(()=>{n.delete(t),e.removeLabelInstance(t)},125);n.set(t,r)},GM);n.set(t,i)};return{createInstance:(t,n,r,i,o)=>{a();let s=rZ({bounds:t,tagName:n,componentName:r,status:i,element:o?.element,mouseX:o?.mouseX,elements:o?.elements,boundsMultiple:o?.boundsMultiple,hideArrow:o?.hideArrow});return e.addLabelInstance(s),s.id},createPerElementInstances:(t,n)=>{a();let r=[];for(let i of t){let t=rZ({bounds:eY(i.element),tagName:i.tagName,componentName:i.componentName,status:n,element:i.element,mouseX:i.mouseX});e.addLabelInstance(t),r.push(t.id)}return r},updateAfterCopy:(t,n,r)=>{n?e.updateLabelInstance(t,`copied`):e.updateLabelInstance(t,`error`,r||`Unknown error`),o(t)},cancelAllFades:i,clearAll:a,handleHoverChange:(e,n)=>{if(n){r(e);return}let i=t().find(t=>t.id===e);i&&(i.status===`copied`||i.status===`error`||i.status===`fading`)&&o(e)}}},aZ=e=>{let t=window.innerWidth,n=window.innerHeight,r=Math.max(0,e.x),i=Math.min(t,e.x+e.width),a=Math.max(0,e.y),o=Math.min(n,e.y+e.height);return{x:(r+i)/2,y:(a+o)/2}},oZ=(e,t,n)=>{let r=[],i=(t,r)=>{let i=aZ(n(t)),a=MI(i.x,i.y).filter(e),o=a.indexOf(t);return o===-1?null:a[o+r]??null},a=e=>{let t=i(e,1);return t&&(r.push(e),r.length>50&&(r=r.slice(-50))),t},o=e=>{if(r.length>0){let e=r.pop();if(sB(e))return e}return i(e,-1)},s=(e,n)=>{let i=e=>n?e.nextElementSibling:e.previousElementSibling,a=i(e);for(;a;){if(t(a))return r=[],a;a=i(a)}return null};return{findNext:(e,t)=>{switch(e){case`ArrowUp`:return a(t);case`ArrowDown`:return o(t);case`ArrowRight`:return s(t,!0);case`ArrowLeft`:return s(t,!1);default:return null}},clearHistory:()=>{r=[]}}},sZ=e=>{let{metaKey:t,ctrlKey:n,shiftKey:r,altKey:i}=iX(e.activationKey);return{metaKey:t,ctrlKey:n,shiftKey:r,altKey:i}},cZ=()=>{let e=new WeakSet,t=Object.getOwnPropertyDescriptor(KeyboardEvent.prototype,`key`),n=!1;if(t?.get&&!t.get.__reactGrabPatched){n=!0;let r=t.get,i=function(){return e.has(this)?``:r.call(this)};i.__reactGrabPatched=!0,Object.defineProperty(KeyboardEvent.prototype,"key",{get:i,configurable:!0})}return{claimedEvents:e,originalKeyDescriptor:t,restore:()=>{n&&t&&Object.defineProperty(KeyboardEvent.prototype,"key",t)}}},lZ=(e,t)=>({top:t<25,bottom:t>window.innerHeight-25,left:e<25,right:e>window.innerWidth-25}),uZ=(e,t,n)=>{let r=null,i=()=>{if(!t()){a();return}let o=e(),s=lZ(o.x,o.y),c=0,l=0;if(s.top&&(l-=10),s.bottom&&(l+=10),s.left&&(c-=10),s.right&&(c+=10),c!==0||l!==0){let e=window.scrollX,t=window.scrollY;window.scrollBy(c,l);let r=window.scrollX-e,i=window.scrollY-t;(r!==0||i!==0)&&n?.({x:r,y:i})}r=s.top||s.bottom||s.left||s.right?nI(i):null},a=()=>{r!==null&&(rI(r),r=null)};return{start:i,stop:a,isActive:()=>r!==null}},dZ=()=>{let e=globalThis;return!!(e.chrome?.runtime?.id||e.browser?.runtime?.id)},fZ=e=>{try{let t=`0.1.48`,n=`data:image/svg+xml;base64,${btoa(`<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 294 294"><path fill="#ff40e0" d="M145 47c25-20 50-27 67-17 16 9 23 30 20 60 0 2-1 5-1 7l-2 13h-1l-12-4c-8-3-17-5-25-6l-17-3c-10-1-20-1-29-1-10 0-20 0-29 1-6 8-11 16-16 24-5 9-9 17-13 26 4 9 8 18 13 26s10 16 16 24l11 14c5 7 11 13 18 19l10 8s-1 0 0 0l-11 9c-17 14-35 22-49 22-6 0-13-2-18-5-16-9-23-30-20-59 1-3 1-5 1-8-30-12-48-29-48-50 0-18 14-35 41-47 2-1 5-2 7-3 0-2 0-5-1-7-3-30 4-51 20-60 18-10 42-3 68 17M71 201c-1 2-1 4-1 5-2 24 3 41 13 47h1c11 7 30 1 51-15-10-9-18-18-26-29-13-1-26-4-38-8m9-38c-3 9-5 17-7 26 8 2 17 4 25 6-3-5-6-10-9-16-3-5-6-10-9-16m-19-53c-2 1-3 1-5 2-21 10-34 23-34 35 0 13 14 27 39 37 3-12 7-25 12-37-5-12-9-24-12-37m37-10c-8 1-17 3-25 6 2 8 4 16 7 25 3-5 6-11 9-16zm-3-61c-4-1-8 0-12 2-10 7-15 24-13 47 0 2 0 3 1 5 12-4 25-6 38-8 8-10 16-20 26-29-15-11-29-17-40-17m111 2c-4-2-8-3-12-2-11 0-25 5-40 17 10 9 19 19 26 29 13 2 26 4 39 8v-5c3-23-2-40-13-47m-61 23c-7 6-13 13-19 19h37c-6-6-12-13-18-19"/><mask id="a"><path fill="#fff" d="m235 85-133 27 28 133 133-27Z"/></mask><path fill="#ff40e0" d="m137 130 76 11c8 1 9 11 3 15l-28 16-4 32c-1 8-10 10-14 4l-41-66c-3-6 1-13 8-12" mask="url(#a)"/></svg>`)}`;console.log(`%cReact Grab${` v${t}`}%c\nhttps://react-grab.com`,`background: #330039; color: #ffffff; border: 1px solid #d75fcb; padding: 4px 4px 4px 24px; border-radius: 4px; background-image: url("${n}"); background-size: 16px 16px; background-repeat: no-repeat; background-position: 4px center; display: inline-block; margin-bottom: 4px;`,``),e&&navigator.onLine&&!dZ()&&fetch(`https://www.react-grab.com/api/version?source=browser&v=${t}&t=${Date.now()}`,{referrerPolicy:`origin`,keepalive:!0,priority:`low`,cache:`no-store`}).then(e=>e.text()).then(e=>{e&&e!==t&&console.warn(`[React Grab] v${t} is outdated (latest: v${e}). Run \`npx grab@latest upgrade\` to upgrade.`)}).catch(()=>null)}catch{}},pZ=e=>typeof e==`object`&&!!e,mZ=e=>{if(!pZ(e))return null;let t={};return typeof e.enabled==`boolean`&&(t.enabled=e.enabled),(e.activationMode===`toggle`||e.activationMode===`hold`)&&(t.activationMode=e.activationMode),typeof e.keyHoldDuration==`number`&&Number.isFinite(e.keyHoldDuration)&&(t.keyHoldDuration=e.keyHoldDuration),typeof e.allowActivationInsideInput==`boolean`&&(t.allowActivationInsideInput=e.allowActivationInsideInput),typeof e.activationKey==`string`&&(t.activationKey=e.activationKey),typeof e.maxContextLines==`number`&&Number.isFinite(e.maxContextLines)&&(t.maxContextLines=e.maxContextLines),typeof e.freezeReactUpdates==`boolean`&&(t.freezeReactUpdates=e.freezeReactUpdates),typeof e.telemetry==`boolean`&&(t.telemetry=e.telemetry),Object.keys(t).length===0?null:t},hZ=()=>{if(typeof window>`u`)return null;try{let e=(document.currentScript instanceof HTMLScriptElement?document.currentScript:null)?.getAttribute(`data-options`);return e?mZ(JSON.parse(e)):null}catch{return null}},gZ=e=>e===`Enter`||e===`NumpadEnter`,_Z=(e,t)=>e.x>=t.x&&e.x<=t.x+t.width&&e.y>=t.y&&e.y<=t.y+t.height,vZ=(e=>({name:e.name,setup:(t,n)=>({actions:[typeof e.contextMenuAction==`function`?e.contextMenuAction(t,n):e.contextMenuAction],cleanup:e.cleanup})}))({name:`copy`,contextMenuAction:{id:`copy`,label:`Copy`,shortcut:`C`,showInToolbarMenu:!0,onAction:e=>{e.copy?.()}}}),yZ={name:`comment`,setup:()=>({actions:[{id:`comment`,label:`Comment`,shortcut:`Enter`,shortcutModifier:!1,showInToolbarMenu:!0,onAction:e=>{e.enterPromptMode?.()}}]})},bZ={name:`edit`,setup:()=>({actions:[{id:`edit`,label:`Style`,shortcut:`S`,shortcutModifier:!1,showInToolbarMenu:!0,onAction:e=>{e.enterEditMode?.()}}]})},xZ={name:`open`,actions:[{id:`open`,label:`Open`,shortcut:`O`,enabled:e=>!!e.filePath,onAction:e=>{e.filePath&&(e.hooks.onOpenFile(e.filePath,e.lineNumber)||II(e.filePath,e.lineNumber,e.hooks.transformOpenFileUrl),e.hideContextMenu(),e.cleanup())}}]},SZ=e=>{let t=e.left+e.width/2,n=e.top+e.height/2,r=n,i=window.innerHeight-n,a=t,o=window.innerWidth-t,s=Math.min(r,i,a,o);return s===r?`top`:s===a?`left`:s===o?`right`:`bottom`},CZ=()=>{let[e,t]=J(!1),[n,r]=J(null),i=GV(),a=()=>{let e=n();return sB(e)?e:null},o=()=>{r(null),i.clear(),t(!1)};return{selectedElement:a,isPendingDismiss:e,select:(e,n)=>{r(e),t(!1),n?.shouldPromptBeforeMouseHandoff?i.arm():i.clear()},clear:o,consumeMouseHandoff:()=>i.consume()&&a()!==null,showDismissPrompt:()=>a()?e()?!1:(t(!0),!0):(o(),!1),takeSelection:e=>{let t=a()??(sB(e)?e:null);return o(),t}}},wZ=async(e,t={})=>(await Promise.allSettled(e.map(e=>tW(e,t)))).map(e=>e.status===`fulfilled`?e.value:``),TZ=[vZ,bZ,yZ,xZ],EZ=!1,DZ=new Set,OZ=e=>{if(typeof window>`u`)return DY();let t={enabled:!0,activationMode:`toggle`,keyHoldDuration:100,allowActivationInsideInput:!0,...hZ(),...e};if(t.enabled===!1||EZ)return DY();EZ=!0,IM(t.container??null),fZ(t.telemetry!==!1);let{enabled:n,telemetry:r,container:i,...a}=t;return gR(e=>{let t=!1,n,r=tZ(a),{store:i,actions:o,pointer:s,viewportVersion:c,current:l}=rY({keyHoldDuration:r.store.options.keyHoldDuration??100}),u=Y(()=>l().state===`holding`),d=Y(()=>l().state===`active`),f=Y(()=>{let e=l();return e.state===`active`&&e.phase===`frozen`}),p=Y(()=>{let e=l();return e.state===`active`&&(e.phase===`dragging-select`||e.phase===`dragging-reposition`)}),m=Y(()=>{if(!p())return!1;let e=Math.abs(s().x+window.scrollX-i.dragStart.x),t=Math.abs(s().y+window.scrollY-i.dragStart.y);return e>2||t>2}),h=Y(()=>{let e=l();return e.state===`active`&&e.phase===`dragging-reposition`}),g=Y(()=>{let e=l();return e.state===`active`&&e.phase===`justDragged`}),_=Y(()=>l().state===`copying`),v=Y(()=>i.selectionInteractionLockDepth>0),y=Y(()=>l().state===`justCopied`),b=Y(()=>{let e=l();return e.state===`active`&&!!e.isPromptMode}),x=Y(()=>i.pendingCommentMode||b()),S=Y(()=>{let e=l();return e.state===`active`&&!!e.isPromptMode&&!!e.isPendingDismiss}),C=(e,t)=>{document.body.style[e]=t};yR(wR(d,(e,t)=>{e&&!t?(FL(s().x,s().y),C(`touchAction`,`none`)):!e&&t&&(IL(),C(`touchAction`,``))}));let w=zV(),[T,E]=J(!w||!w.collapsed),[D,O]=J(0),[k,ee]=J(0),[te,A]=J(w),[ne,re]=J(!1),ie=VV(e=>e.shiftKey),[ae,oe]=J(null),[se,ce]=J(null),[le,ue]=J(null),de=ZX({store:i,actions:o,isActivated:d,activateRenderer:()=>Gt(),deactivateRenderer:()=>Kt(),performCopyWithLabel:e=>dt(e),onOpen:()=>{kr(),ge?.(),ge=Or(Dr,ce)},onClose:()=>{ge?.(),ge=null,ce(null)}}),fe=Y(()=>i.contextMenuPosition!==null||de.isOpen()),pe=Y(()=>fe()||ae()!==null),me,he=null,ge=null,_e=!1,ve=new WeakMap,ye=CZ(),be=()=>!T()||b()||v()||fe()||ye.isPendingDismiss(),xe=()=>{ve=new WeakMap},Se=()=>{Le(!1),xe()},Ce=e=>{let t=te()??zV(),n={edge:t?.edge??`bottom`,ratio:t?.ratio??.5,collapsed:t?.collapsed??!1,enabled:t?.enabled??!0,defaultAction:t?.defaultAction??`copy`,...e};BV(n),A(n);for(let e of DZ)e(n)},we=()=>{Fe.timerId!==null&&(clearTimeout(Fe.timerId),Fe.timerId=null)},Te=()=>{Fe.copyWaiting=!1,Fe.holdTimerFired=!1,Fe.startTimestamp=null};yR(()=>{if(l().state!==`holding`){we();return}Fe.startTimestamp=Date.now(),Fe.timerId=window.setTimeout(()=>{if(Fe.timerId=null,Fe.copyWaiting){Fe.holdTimerFired=!0;return}o.activate()},i.keyHoldDuration),ER(we)}),yR(()=>{let e=l();if(e.state!==`active`||e.phase!==`justDragged`)return;let t=setTimeout(()=>{o.finishJustDragged()},GM);ER(()=>clearTimeout(t))}),yR(()=>{if(l().state!==`justCopied`)return;let e=setTimeout(()=>{o.finishJustCopied()},GM);ER(()=>clearTimeout(e))}),yR(wR(u,(e,t=!1)=>{!t||e||!d()||(r.store.options.activationMode!==`hold`&&o.setWasActivatedByToggle(!0),r.hooks.onActivate())}));let Ee=(e,t,n)=>{Oe(e,t,n),o.clearInputText()},De=()=>{let e=i.frozenElement||pt();e&&o.enterPromptMode({x:s().x,y:s().y},e)},Oe=(e,t,n)=>{o.setCopyStart({x:t,y:n},e)},ke={lastDetectionTimestamp:0,pendingDetectionScheduledAt:0,latestPointerX:0,latestPointerY:0},Ae=null,[je,Me]=J(null),Ne=(e,t)=>{Ae!==null&&clearTimeout(Ae),Me(null),Ae=window.setTimeout(()=>{Me({x:e,y:t}),Ae=null},32)},Pe=null,Fe={timerId:null,startTimestamp:null,copyWaiting:!1,holdTimerFired:!1},Ie=null,[j,Le]=J(!1),Re=0,ze=!1,Be=null,Ve=()=>{ze=!0,Be!==null&&window.clearTimeout(Be),Be=window.setTimeout(()=>{ze=!1,Be=null},GM)},He=()=>{Be!==null&&(window.clearTimeout(Be),Be=null),ze=!1},Ue=0,We=null,Ge=null,[M,Ke]=J(!1),[qe,Je]=J(null),[Ye,Xe]=J(null),[Ze,Qe]=sY(Ye),$e=Y(()=>de.isOpen()?yN:x()?vN:M()?qe():d()?_N:null),et=e=>ZY(e,gI),tt=oZ(gI,et,eY),nt=uZ(s,()=>p(),e=>{if(h()){if(o.shiftDragStart(e),Ie){Ie={x:Ie.x+e.x,y:Ie.y+e.y};return}let{pageX:t,pageY:n}=Et(s().x,s().y);Ie={x:t,y:n}}}),N=Y(()=>d()&&!_()),rt=new Map,it=(e,t)=>{let n=nZ(`grabbed`),i={id:n,bounds:e,createdAt:Date.now(),element:t};o.addGrabbedBox(i),r.hooks.onGrabbedBox(e,t);let a=window.setTimeout(()=>{rt.delete(n),o.removeGrabbedBox(n)},GM+125);rt.set(n,a)},at=async e=>{let t=await Promise.all(e.map(async e=>{let t=await BU(e),n=t?.componentName??null,r=t?.filePath,i=t?.lineNumber??void 0,a=t?.columnNumber??void 0;n||=VU(e);let o=e instanceof HTMLElement?e.innerText?.slice(0,100):void 0;return{tagName:RN(e),id:e.id||void 0,className:e.getAttribute(`class`)||void 0,textContent:o,componentName:n??void 0,filePath:r,lineNumber:i,columnNumber:a}}));window.dispatchEvent(new CustomEvent(`react-grab:element-selected`,{detail:{elements:t}}))},ot=iZ(o,()=>i.labelInstances),st=async(e,t,n)=>{He(),l().state!==`copying`&&o.startCopy();let r=!1,i;try{r=await e(),r||(i=`Failed to copy`)}catch(e){i=kY(e,`Action failed`)}if(t)for(let e of t)ot.updateAfterCopy(e,r,i);l().state===`copying`&&(r&&o.completeCopy(),n?Kt():r?(o.activate(),Ve()):o.unfreeze())},ct=(e,t,n)=>{let i=e[0],a=n??(i?VU(i):null),o=i?RN(i):null,s=a??o??void 0;return FY({getContent:r.store.options.getContent,componentName:s,maxContextLines:r.store.options.maxContextLines},r.hooks,e,t)},lt=async(e,t,n)=>{if(e.length===0)return!1;let i=[],a=[];for(let t of e){let{wasIntercepted:e,pendingResult:n}=r.hooks.onElementSelect(t);e||i.push(t),n&&a.push(n),r.store.theme.grabbedBoxes.enabled&&it(eY(t),t)}await iI();let o=!0;if(i.length>0&&(o=await ct(i,t,n)),a.length>0&&!(await Promise.all(a)).every(Boolean))throw new ZV;return at(e),o},ut=e=>{NU(e.primaryElement).then(async t=>{await st(()=>lt(e.targetElements,e.extraPrompt,t??void 0),e.labelInstanceIds.length>0?e.labelInstanceIds:null,e.shouldDeactivateAfter),e.onComplete?.()}).catch(t=>{let n=kY(t,`Action failed`);for(let t of e.labelInstanceIds)ot.updateAfterCopy(t,!1,n);l().state===`copying`&&o.unfreeze()})},dt=e=>{let{element:t,cursorX:n,selectedElements:r,extraPrompt:a,shouldDeactivateAfter:s,onComplete:c,dragRect:l}=e,u=r??[t],d=l??i.frozenDragRect,f=u.length>1,p=!f&&t===yt()?Tt():void 0,m=d&&f?GY(d):p??eY(t),h=f?m.x+m.width/2:n,g=RN(t);He(),o.startCopy();let _=g?ot.createInstance(m,g,void 0,`copying`,{element:t,mouseX:h,elements:r}):null;ut({primaryElement:t,targetElements:u,labelInstanceIds:_?[_]:[],extraPrompt:a,shouldDeactivateAfter:s,onComplete:c})},ft=e=>{let{elements:t,labelEntries:n,shouldDeactivateAfter:r,onComplete:i}=e,a=t[0];He(),o.startCopy(),ut({primaryElement:a,targetElements:t,labelInstanceIds:ot.createPerElementInstances(n,`copying`),shouldDeactivateAfter:r,onComplete:i})},pt=Y(()=>{if(c(),!N()||m()||v()||ye.isPendingDismiss())return null;let e=i.detectedElement;return sB(e)?e:null}),P=Y(()=>i.frozenElement||(f()?null:pt())),mt=Y(()=>!d()||b()||j()||_()||pe()||ye.isPendingDismiss()?null:ie()?f()?P():pt()??i.frozenElement:ye.selectedElement()),ht=Y(()=>{let e=mt();return e?JY(e,gI,et):[]}),gt=Y(()=>{let e=mt();return e?Math.max(0,ht().findIndex(t=>t.element===e)):0}),_t=Y(()=>mt()!==null);yR(()=>{let e=i.detectedElement;if(!e)return;let t=setInterval(()=>{sB(e)||o.setDetectedElement(null)},100);ER(()=>clearInterval(t))}),yR(wR(P,e=>{if(We!==null&&(clearTimeout(We),We=null),!e){Xe(null);return}We=window.setTimeout(()=>{We=null,Xe(e)},100)})),ER(()=>{We!==null&&(clearTimeout(We),We=null)}),yR(()=>{let e=i.frozenElements;ER(mL(e))}),yR(wR(d,e=>{e&&r.store.options.freezeReactUpdates&&ER(fR())}));let vt=()=>{if(i.isTouchMode&&p()){let e=i.detectedElement;return!e||oI(e)?void 0:e}let e=P();if(!(!e||oI(e)))return e},yt=Y(()=>vt()),bt=()=>yt()?i.isTouchMode&&p()?N():N()&&!m():!1,xt=ZR(()=>i.frozenElements,e=>Y(()=>(c(),eY(e)))),St=Y(()=>{let e=i.frozenElements;if(e.length===0)return[];let t=i.frozenDragRect;return t&&e.length>1?[GY(t)]:xt().map(e=>e())}),Ct=Y(()=>{if(!j()||i.pendingCommentMode||M())return null;let e=i.detectedElement;return!sB(e)||oI(e)||i.frozenElements.includes(e)?null:e}),wt=Y(()=>{c();let e=Ct();if(e)return eY(e)}),Tt=Y(()=>{c();let e=i.frozenElements;if(e.length>0){let t=St();if(e.length===1){let e=t[0];if(e)return e}let n=i.frozenDragRect;return n?t[0]??GY(n):qY(oX(t))}let t=yt();if(t)return eY(t)}),Et=(e,t)=>({pageX:e+window.scrollX,pageY:t+window.scrollY}),Dt=(e,t)=>{let{pageX:n,pageY:r}=Et(e,t);return{x:Math.abs(n-i.dragStart.x),y:Math.abs(r-i.dragStart.y)}},Ot=Y(()=>{if(!p())return!1;let e=Dt(s().x,s().y);return e.x>2||e.y>2}),kt=(e,t)=>{let{pageX:n,pageY:r}=Et(e,t),a=Math.min(i.dragStart.x,n),o=Math.min(i.dragStart.y,r),s=Math.abs(n-i.dragStart.x),c=Math.abs(r-i.dragStart.y);return{x:a-window.scrollX,y:o-window.scrollY,width:s,height:c}},At=e=>e.code===`Space`||e.key===` `,jt=()=>{if(!p())return;o.startDragReposition();let{pageX:e,pageY:t}=Et(s().x,s().y);Ie={x:e,y:t}},Mt=()=>{o.stopDragReposition(),Ie=null},Nt=Y(()=>{if(c(),Ot())return qY(kt(s().x,s().y))}),Pt=Y(()=>{if(c(),!Ot())return[];let e=je();if(!e)return[];let t=kt(e.x,e.y),n=HY(t,gI);return(n.length>0?n:HY(t,gI,!1)).map(e=>eY(e))}),Ft=Y(()=>{let e=Pt();if(e.length>0)return e;let t=wt();return t?[...St(),t]:St()}),It=ZR(()=>i.frozenElements,e=>{let t=RN(e)||`element`,n=VU(e)??void 0;return Y(()=>{if(c(),!sB(e))return null;let r=eY(e),i=ve.get(e);return{tagName:t,componentName:n,bounds:r,mouseX:i===void 0?void 0:r.x+r.width*i}})}),Lt=Y(()=>{if(b()||i.frozenElements.length<2)return[];let e=[];for(let t of It()){let n=t();n!==null&&e.push(n)}return e}),Rt=Y(()=>{if(b())return null;let e=Ct();return e?(c(),{tagName:RN(e)||`element`,componentName:VU(e)??void 0,bounds:eY(e),mouseX:s().x}):null}),zt=Y(()=>{if(_()||b()){c();let e=i.frozenElement||pt();return e?{x:tY(eY(e)).x+i.copyOffsetFromCenterX,y:i.copyStart.y}:{x:i.copyStart.x,y:i.copyStart.y}}return{x:s().x,y:s().y}}),Bt=Y(()=>{if(!j()||i.frozenElements.length!==1)return;c();let e=i.frozenElements[0];if(!sB(e))return;let t=ve.get(e);if(t===void 0)return;let n=eY(e);return n.x+n.width*t});yR(wR(()=>[pt(),i.lastGrabbedElement],([e,t])=>{t&&e&&t!==e&&o.setLastGrabbed(null),e&&r.hooks.onElementHover(e)})),yR(wR(()=>pt(),e=>{let t=++Ue,n=()=>{Ue===t&&o.setSelectionSource(null,null)};if(!e){n();return}BU(e).then(e=>{if(Ue===t){if(!e){n();return}o.setSelectionSource(e.filePath,e.lineNumber)}}).catch(()=>{Ue===t&&o.setSelectionSource(null,null)})}));let Vt=Y(()=>i.grabbedBoxes.map(e=>({id:e.id,bounds:e.bounds,createdAt:e.createdAt}))),Ht=Y(()=>i.labelInstances.map(e=>({id:e.id,status:e.status,tagName:e.tagName,componentName:e.componentName,createdAt:e.createdAt})));yR(wR(Y(()=>{let e=d(),t=p(),n=_(),a=b(),o=pt(),s=Nt(),c=r.store.theme.enabled,l=r.store.theme.selectionBox.enabled,u=r.store.theme.dragBox.enabled,f=Ot(),m=P(),h=y();return{isActive:e,isDragging:t,isCopying:n,isPromptMode:a,isSelectionBoxVisible:!!(c&&l&&e&&!n&&!h&&!t&&m!=null),isDragBoxVisible:!!(c&&u&&e&&!n&&f),targetElement:o,dragBounds:s?{x:s.x,y:s.y,width:s.width,height:s.height}:null,grabbedBoxes:[...Vt()],labelInstances:[...Ht()],selectionFilePath:i.selectionFilePath,toolbarState:te()}}),e=>{r.hooks.onStateChange(e)})),yR(wR(()=>{let e=b();return{inputMode:e,position:e?s():CR(s),target:e?pt():CR(pt)}},({inputMode:e,position:t,target:n})=>{r.hooks.onPromptModeChange(e,{x:t.x,y:t.y,targetElement:n})})),yR(wR(()=>[ar(),Tt(),pt()],([e,t,n])=>{r.hooks.onSelectionBox(!!e,t??null,n)})),yR(wR(()=>[fr(),Nt()],([e,t])=>{r.hooks.onDragBox(!!e,t??null)})),yR(wR(()=>{let e=mr();return[e,pr(),e?zt():CR(zt),e?pt():CR(pt),i.selectionFilePath,i.selectionLineNumber]},([e,t,n,i,a,o])=>{r.hooks.onElementLabel(e,t,{x:n.x,y:n.y,content:``,element:i??void 0,tagName:i&&RN(i)||void 0,filePath:a??void 0,lineNumber:o??void 0})}));let Ut=null,Wt=e=>{if(e){if(!Ut){Ut=document.createElement(`style`),Ut.setAttribute(`data-react-grab-cursor`,``);let e=BN();e&&(Ut.nonce=e),HN(Ut),document.head.appendChild(Ut)}Ut.textContent=`* { cursor: ${e} !important; }`}else Ut&&=(Ut.remove(),null)};yR(wR(()=>[d(),_(),b()],([e,t,n])=>{Wt(t?`progress`:e&&!n?`crosshair`:null)}));let Gt=()=>{let e=u();o.activate(),e||r.hooks.onActivate()},Kt=()=>{let e=p(),t=i.previouslyFocusedElement;Mt(),o.deactivate(),de.resetWithDiscard(),kr(),Se(),wn(),ye.clear(),Ke(!1),Je(null),e&&C(`userSelect`,``),Pe&&window.clearTimeout(Pe),nt.stop(),t instanceof HTMLElement&&t!==document.body&&t!==document.activeElement&&sB(t)&&t.focus({preventScroll:!0}),r.hooks.onDeactivate()},qt=()=>{u()&&o.releaseHold(),d()&&Kt(),He()},Jt=()=>{o.setWasActivatedByToggle(!0),Gt()},Yt=()=>{let e=[...i.frozenElements],t=i.frozenElement||pt(),n=b()?i.inputText.trim():``;if(!t){Kt();return}let r=e.length>0?e:[t],a=r.map(e=>eY(e))[0],{x:s,y:c}=tY(a),l=s+i.copyOffsetFromCenterX;o.setPointer({x:s,y:c}),o.exitPromptMode(),o.clearInputText(),dt({element:t,cursorX:l,selectedElements:r,extraPrompt:n||void 0,shouldDeactivateAfter:!0})},Xt=()=>{if(b()){if(S()){o.clearInputText(),Kt();return}o.setPendingDismiss(!0),ee(e=>e+1)}},Zt=()=>{if(ye.isPendingDismiss()){Dn();return}o.clearInputText(),Kt()},Qt=()=>{o.setPendingDismiss(!1)},$t=()=>{if(de.isOpen()){de.dismiss();return}let e=i.frozenElement||pt();e&&en(e,{x:s().x,y:s().y})},en=(e,t,n={})=>de.trigger(e,t,n),tn=(e,t)=>{if(!de.isOpen()||i.contextMenuPosition!==null)return!1;let n=MI(e,t).find(gI);if(!n)return!1;let r=de.switchToElement(n,{x:e,y:t});return r&&fL([n]),r},nn=e=>({filePath:i.selectionFilePath??void 0,lineNumber:i.selectionLineNumber??void 0,componentName:Ze(),tagName:RN(e)||void 0}),rn=()=>{Ge=null,Ke(!1),o.setPendingCommentMode(!1),Je(null)},an=e=>{let t=i.frozenElement||pt();if(!t)return!1;let n={x:s().x,y:s().y},a=r.store.actions.find(t=>t.id===e);return a?e===`edit`?en(t,n,nn(t))?(o.clearInputText(),o.exitPromptMode(),rn(),!0):!0:(o.clearInputText(),o.exitPromptMode(),rn(),a.onAction(Nn(t,n)),!0):(o.clearInputText(),o.exitPromptMode(),rn(),Mr(_N),ln(t,n),!0)},on=e=>{if(d()){if($e()!==e&&b()&&an(e))return;if($e()!==e&&i.pendingCommentMode){o.setPendingCommentMode(!1),Ge=e,Je(e),Ke(!0);return}if($e()!==e&&M()){Ge=e,Je(e);return}Kt();return}T()&&(Ge=e,Je(e),Ke(!0),Jt())},sn=()=>{on(te()?.defaultAction??`copy`)},cn=(e,t,n)=>{rn(),o.clearInputText(),o.enterPromptMode({x:t,y:n},e)},ln=(e,t)=>{Se(),Ar(),o.showContextMenu(t,e),wn(),r.hooks.onContextMenu(e,t)},un=(e,t)=>{let n=Ge;if(Ge=null,Je(null),!n)return;if(n===`edit`){en(e,t,nn(e));return}let i=r.store.actions.find(e=>e.id===n);if(!i){Mr(_N),ln(e,t);return}i.onAction(Nn(e,t))},dn=()=>{if(T()){if(d()&&x()){Kt();return}o.setPendingCommentMode(!0),d()||Jt()}},fn=(e,t,n)=>{let r=n&&j()&&!p()&&!i.pendingCommentMode&&!M();if(be()||f()&&!r)return;if(o.setPointer({x:e,y:t}),ke.latestPointerX=e,ke.latestPointerY=t,r){let n=NI(e,t);n!==i.detectedElement&&o.setDetectedElement(n);return}let a=performance.now(),s=ke.pendingDetectionScheduledAt>0&&a-ke.pendingDetectionScheduledAt<200;if(a-ke.lastDetectionTimestamp>=32&&!s&&(ke.lastDetectionTimestamp=a,ke.pendingDetectionScheduledAt=a,setTimeout(()=>{if(be()){ke.pendingDetectionScheduledAt=0;return}let e=NI(ke.latestPointerX,ke.latestPointerY);e!==i.detectedElement&&o.setDetectedElement(e),ke.pendingDetectionScheduledAt=0})),p()){if(h()){let{pageX:n,pageY:r}=Et(e,t);Ie&&o.shiftDragStart({x:n-Ie.x,y:r-Ie.y}),Ie={x:n,y:r}}Ne(e,t);let n=lZ(e,t),r=n.top||n.bottom||n.left||n.right;r&&!nt.isActive()?nt.start():!r&&nt.isActive()&&nt.stop()}},pn=(e,t,n)=>{if(!N()||v())return!1;!n&&j()&&Se();let i=ye.selectedElement()!==null;return o.startDrag({x:e,y:t},n||i),o.setPointer({x:e,y:t}),C(`userSelect`,`none`),Ne(e,t),r.hooks.onDragStart(e+window.scrollX,t+window.scrollY),!0},mn=(e,t)=>{let n=i.frozenElements.includes(e),r=i.frozenElements.length===0;if(!n){let n=UY(eY(e),t);ve.set(e,n),r&&Qe(VU(e)??void 0)}o.toggleFrozenElement(e),PI();let a=i.frozenElements.includes(e);if(a||ve.delete(e),i.frozenElements.length===0){Se(),o.unfreeze();return}fL(i.frozenElements),Le(!0),o.setPointer(t),o.setLastGrabbed(a?e:i.frozenElements[i.frozenElements.length-1]),o.freeze(),wn()},hn=()=>{let e=i.frozenElements.filter(sB),t=e.map(e=>{let t=RN(e)||`element`,n=VU(e)??void 0,r=ve.get(e),i=eY(e);return{element:e,tagName:t,componentName:n,mouseX:r===void 0?i.x+i.width/2:i.x+i.width*r}});if(Se(),e.length===0){o.unfreeze();return}if(e.length===1){dt({element:e[0],cursorX:t[0].mouseX,selectedElements:e,shouldDeactivateAfter:i.wasActivatedByToggle});return}ft({elements:e,labelEntries:t,shouldDeactivateAfter:i.wasActivatedByToggle})},gn=(e,t,n)=>{let a=HY(e,gI),s=a.length>0?a:HY(e,gI,!1);if(s.length===0)return;let c=n&&!i.pendingCommentMode&&!M();if(c&&o.addFrozenElements(s),fL(c?i.frozenElements:s),r.hooks.onDragEnd(s,e),c){let e=s[s.length-1];Le(!0),PI(),o.setPointer(tY(eY(e))),o.setLastGrabbed(e),o.freeze(),wn();return}let l=s[0],u=tY(eY(l));o.setPointer(u),o.setFrozenElements(s);let d=KY(e);if(o.setFrozenDragRect(d),o.freeze(),o.setLastGrabbed(l),i.pendingCommentMode){cn(l,u.x,u.y);return}if(M()){Ke(!1),Ge?un(l,u):ln(l,u);return}let f=i.wasActivatedByToggle&&!t;dt({element:l,cursorX:u.x,selectedElements:s,shouldDeactivateAfter:f,dragRect:d})},_n=e=>{for(let t of i.frozenElements)if(sB(t)&&_Z(e,eY(t)))return t;return null},vn=(e,t,n,a)=>{let c=sB(i.frozenElement)?i.frozenElement:null,l=ye.selectedElement(),u=()=>MI(e,t).find(gI)??null;if(a&&!i.pendingCommentMode&&!M()){let n=u();n!==null&&mn(n,{x:e,y:t});return}let d=u()??(sB(i.detectedElement)?i.detectedElement:null),f=l??d??c;if(!f)return;let p,m,h=d===null&&c===f,g=l===f;if(h)p=s().x,m=s().y;else if(g){let e=tY(eY(f));p=e.x,m=e.y}else p=e,m=t;if(i.pendingCommentMode){cn(f,p,m),ye.clear();return}if(M()){Ke(!1);let{wasIntercepted:e}=r.hooks.onElementSelect(f);if(e)return;ye.clear(),fL([f]),o.setFrozenElement(f);let t={x:p,y:m};o.setPointer(t),o.freeze(),Ge?un(f,t):ln(f,t);return}let _=i.wasActivatedByToggle&&!n;o.setLastGrabbed(f),dt({element:f,cursorX:p,shouldDeactivateAfter:_}),ye.clear()},yn=()=>{p()&&(Mt(),o.cancelDrag(),nt.stop(),C(`userSelect`,``))},bn=(e,t,n,r)=>{if(!p())return;Ae!==null&&(clearTimeout(Ae),Ae=null),Me(null);let i=Dt(e,t),a=i.x>2||i.y>2,s=a?kt(e,t):null;a?o.endDrag():o.cancelDrag(),Mt(),nt.stop(),C(`userSelect`,``),s?gn(s,n,r):vn(e,t,n,r)},xn=OY(),Sn=cZ(),Cn=e=>{let t;try{t=Sn.originalKeyDescriptor?.get?Sn.originalKeyDescriptor.get.call(e):e.key}catch{return!1}let n=t===`Enter`||gZ(e.code),r=d()||u();return n&&r&&!b()&&!ye.isPendingDismiss()&&!i.wasActivatedByToggle?IB(e,`data-react-grab-input`)?!1:(Sn.claimedEvents.add(e),e.preventDefault(),e.stopImmediatePropagation(),!0):!1};xn.addDocumentListener(`keydown`,zM(Cn),{capture:!0}),xn.addDocumentListener(`keyup`,zM(Cn),{capture:!0}),xn.addDocumentListener(`keypress`,zM(Cn),{capture:!0});let wn=()=>{tt.clearHistory(),ye.clear()},Tn=(e,t=!1)=>{o.setFrozenElement(e),o.freeze(),ye.select(e,{shouldPromptBeforeMouseHandoff:t});let n=tY(eY(e));o.setPointer(n),i.contextMenuPosition!==null&&o.showContextMenu(n,e)},En=()=>{ye.showDismissPrompt()&&ee(e=>e+1)},Dn=()=>{ye.clear(),o.unfreeze(),wn()},On=()=>{let e=ye.takeSelection(i.frozenElement);if(!e){Dn();return}let t=tY(eY(e));wn(),o.setLastGrabbed(e),dt({element:e,cursorX:t.x,shouldDeactivateAfter:i.wasActivatedByToggle})},kn=e=>fN.has(e.key)?e.key:e.key===`Tab`?e.shiftKey?`ArrowLeft`:`ArrowRight`:null,An=(e,t={})=>{if(!d()||b()||j()||ye.isPendingDismiss()&&!t.allowPendingKeyboardSelection)return!1;let n=kn(e);if(!n||pe())return!1;let r=P(),i=!r;if(!r){let e=LM()?.getBoundingClientRect();r=e?NI(e.left+e.width/2,e.top+e.height/2):NI(window.innerWidth/2,window.innerHeight/2)}if(!r)return!1;let a=n===`ArrowUp`||n===`ArrowDown`,o=tt.findNext(n,r);if(!o&&!a&&!i)return!1;let s=o??r;return e.preventDefault(),e.stopPropagation(),Tn(s,!0),!0},jn=e=>e.metaKey||e.ctrlKey||e.altKey||e.repeat||uB(e)||!d()||_()||v()||pe()?null:i.frozenElement||pt(),Mn=e=>{let t=jn(e);if(!t)return null;let n=WV(r.store.actions,e);return n?{element:t,action:n}:null},Nn=(e,t)=>{let n=eY(e);return Cr({element:e,filePath:i.selectionFilePath??void 0,lineNumber:i.selectionLineNumber??void 0,tagName:RN(e)||void 0,componentName:Ze(),position:t,shouldDeferHideContextMenu:!1,performWithFeedbackOptions:{fallbackBounds:n,fallbackSelectionBounds:[n],position:t}})},Pn=/^[a-zA-Z0-9-]$/,Fn=e=>{if(!e.key||e.key.length!==1||!Pn.test(e.key))return!1;let t=jn(e);return!t||!de.trigger(t,{x:s().x,y:s().y},{initialSearchQuery:e.key})?!1:(rn(),e.preventDefault(),e.stopImmediatePropagation(),!0)},In=e=>{let t=Mn(e);if(!t)return!1;let{element:n,action:r}=t;if(b())return an(r.id)?(e.preventDefault(),e.stopImmediatePropagation(),!0):!1;let i={x:s().x,y:s().y};return r.onAction(Nn(n,i)),e.preventDefault(),e.stopImmediatePropagation(),!0},Ln=e=>{if(e.key?.toLowerCase()!==`o`||!d()||!(e.metaKey||e.ctrlKey))return!1;let t=i.selectionFilePath,n=i.selectionLineNumber;return t?(e.preventDefault(),e.stopPropagation(),r.hooks.onOpenFile(t,n??void 0)||II(t,n??void 0,r.hooks.transformOpenFileUrl),!0):!1},Rn=e=>{if(!d()||_()||i.contextMenuPosition!==null||de.isOpen())return!1;let t=e.key===`F10`&&e.shiftKey,n=e.key===`ContextMenu`;if(!t&&!n)return!1;let r=i.frozenElements,a=r.length>1,s=(a?r[0]:null)||i.frozenElement||pt();if(!s)return!1;e.preventDefault(),e.stopPropagation();let c=tY(eY(s));return a?fL(r):(fL([s]),o.setFrozenElement(s)),o.setPointer(c),o.freeze(),ln(s,c),!0},zn=Y(()=>ht().map(e=>({tagName:RN(e.element)||`element`,componentName:VU(e.element)??void 0,depth:e.depth,isLast:e.isLast}))),Bn=Y(()=>({items:zn(),activeIndex:gt()})),Vn=e=>{if(!(!r.store.options.allowActivationInsideInput&&uB(e))&&!(!aX(e,r.store.options)&&((e.metaKey||e.ctrlKey)&&!dN.includes(e.key)&&!gZ(e.code)&&(d()&&!i.wasActivatedByToggle?Kt():u()&&(we(),Te(),o.releaseHold())),!gZ(e.code)||!u()))){if((d()||u())&&!b()&&(e.preventDefault(),gZ(e.code)&&e.stopImmediatePropagation()),d()){if(i.wasActivatedByToggle&&r.store.options.activationMode!==`hold`||e.repeat)return;Pe!==null&&window.clearTimeout(Pe),Pe=window.setTimeout(()=>{Kt()},200);return}if(u()&&e.repeat){if(Fe.copyWaiting){let e=Fe.holdTimerFired;Te(),e&&o.activate()}return}if(!(_()||y())&&!u()){let t=r.store.options.keyHoldDuration??100;uB(e)?dB(e)?t+=600:t+=400:fB()&&(t+=600),Te(),o.startHold(t)}}},Hn=e=>{if(!ye.isPendingDismiss())return!1;if(gZ(e.code))return!0;let t=fN.has(e.key),n=Mn(e)!==null;return!t&&!n?!1:t?An(e,{allowPendingKeyboardSelection:!0}):In(e)?(wn(),!0):!1};xn.addWindowListener(`keydown`,zM(e=>{if(kn(e)&&uB(e)||Hn(e))return;if(Cn(e),!T()){aX(e,r.store.options)&&!e.repeat&&O(e=>e+1);return}let t=gZ(e.code)&&u()&&!b(),n=IB(e,hN);if(b()&&aX(e,r.store.options)&&!e.repeat&&!n){e.preventDefault(),e.stopPropagation(),Xt();return}if(e.key===`Escape`&&pe()){ae()!==null&&kr();return}let a=IB(e,`data-react-grab-ignore-events`)&&!t;if(b()||a)return b()&&!n&&In(e)||(e.key===`Escape`&&(b()?Xt():i.wasActivatedByToggle&&Kt()),a&&fN.has(e.key)&&An(e)),void 0;if(p()&&At(e)){e.repeat||jt(),e.preventDefault(),e.stopPropagation();return}if(e.key===`Escape`&&(u()||i.wasActivatedByToggle)){Kt();return}d()&&!dN.includes(e.key)&&e.preventDefault();let o=Date.now()-Re<200;An(e)||Ln(e)||Rn(e)||In(e)||Fn(e)||o||Vn(e)}),{capture:!0}),xn.addWindowListener(`keyup`,zM(e=>{if(Cn(e))return;if(At(e)&&h()&&(Mt(),e.preventDefault(),e.stopPropagation()),e.key===`Shift`&&j()){p()&&yn(),hn();return}if(IB(e,`data-react-grab-ignore-events`))return;let t=sZ(r.store.options),n=t.metaKey||t.ctrlKey?FB()?!e.metaKey:!e.ctrlKey:t.shiftKey&&!e.shiftKey||t.altKey&&!e.altKey,a=r.store.options.activationKey?typeof r.store.options.activationKey==`function`?r.store.options.activationKey(e):rX(r.store.options.activationKey)(e):$Y(e.key,e.code);if(y()||ze){(a||n)&&(He(),Kt());return}if(!u()&&!d()||b())return;let s=!!r.store.options.activationKey,c=r.store.options.activationMode===`hold`,l=p();if(d()){let e=fe();if(n){if(i.wasActivatedByToggle&&r.store.options.activationMode!==`hold`||e)return;Kt()}else if(c&&a){if(Pe!==null&&(window.clearTimeout(Pe),Pe=null),e||l)return;Kt()}else!s&&a&&Pe!==null&&(window.clearTimeout(Pe),Pe=null);return}if(a||n){if(i.wasActivatedByToggle&&r.store.options.activationMode!==`hold`)return;if(u()||Fe.holdTimerFired&&n){we();let t=(Fe.startTimestamp?Date.now()-Fe.startTimestamp:0)>=200,n=Fe.holdTimerFired&&t&&(r.store.options.allowActivationInsideInput||!uB(e));Te(),n?o.activate():o.releaseHold()}else Kt()}}),{capture:!0}),xn.addDocumentListener(`copy`,()=>{u()&&(Fe.copyWaiting=!0)}),xn.addWindowListener(`keypress`,zM(Cn),{capture:!0}),xn.addWindowListener(`pointermove`,zM(e=>{if(!e.isPrimary)return;let t=e.pointerType===`touch`;if(o.setTouchMode(t),!IB(e,`data-react-grab-ignore-events`)&&!be()&&!(t&&!u()&&!d())){if((t?u():d())&&!b()&&f()&&!e.shiftKey&&!j()){if(ye.consumeMouseHandoff()){En();return}o.unfreeze(),wn()}fn(e.clientX,e.clientY,e.shiftKey)}}),{passive:!0}),xn.addWindowListener(`pointerdown`,zM(e=>{if(e.button===0&&e.isPrimary&&(o.setTouchMode(e.pointerType===`touch`),_e=!1,!IB(e,`data-react-grab-ignore-events`))){if(fe()){tn(e.clientX,e.clientY)&&(_e=!0,e.preventDefault(),e.stopImmediatePropagation());return}if(b()){let t=Tt();t&&e.clientX>=t.x&&e.clientX<=t.x+t.width&&e.clientY>=t.y&&e.clientY<=t.y+t.height?Yt():Xt();return}if(ye.isPendingDismiss()){e.preventDefault(),e.stopImmediatePropagation();return}if(v()){e.preventDefault(),e.stopImmediatePropagation();return}pn(e.clientX,e.clientY,e.shiftKey)&&(e.pointerId!==void 0&&document.documentElement.setPointerCapture(e.pointerId),e.preventDefault(),e.stopImmediatePropagation())}}),{capture:!0}),xn.addWindowListener(`pointerup`,zM(e=>{if(e.button!==0||!e.isPrimary||IB(e,`data-react-grab-ignore-events`)||fe())return;let t=N()||v()||p(),n=e.metaKey||e.ctrlKey;bn(e.clientX,e.clientY,n,e.shiftKey),t&&(e.preventDefault(),e.stopImmediatePropagation())}),{capture:!0}),xn.addWindowListener(`contextmenu`,zM(e=>{if(!N()||_()||b()||de.isOpen())return;let t=IB(e,`data-react-grab-ignore-events`),n={x:e.clientX,y:e.clientY},r=t&&i.frozenElements.length>1?_n(n):null,a=ye.isPendingDismiss();if(t&&!r&&!a&&!_t())return;if(fe()){e.preventDefault();return}e.preventDefault(),e.stopPropagation();let s=r??NI(e.clientX,e.clientY);if(!s)return;let c=i.frozenElements;c.length>1&&c.includes(s)?fL(c):(fL([s]),o.setFrozenElement(s)),o.setPointer(n),o.freeze(),ln(s,n)}),{capture:!0}),xn.addWindowListener(`pointercancel`,zM(e=>{e.isPrimary&&yn()})),xn.addWindowListener(`click`,zM(e=>{if(!IB(e,`data-react-grab-ignore-events`)){if(_e){_e=!1,e.preventDefault(),e.stopImmediatePropagation();return}fe()||(N()||g())&&(e.preventDefault(),e.stopImmediatePropagation(),i.wasActivatedByToggle&&!b()&&!e.shiftKey&&(u()?o.setWasActivatedByToggle(!1):Kt()))}}),{capture:!0}),xn.addDocumentListener(`visibilitychange`,()=>{if(document.hidden){o.clearGrabbedBoxes();let e=i.activationTimestamp;d()&&!b()&&e!==null&&Date.now()-e>500&&Kt()}}),xn.addWindowListener(`blur`,()=>{yn(),u()&&(we(),o.releaseHold(),Te()),Se()}),xn.addWindowListener(`focus`,()=>{Re=Date.now()}),xn.addWindowListener(`focusin`,e=>{IB(e,BM)&&e.stopPropagation()},{capture:!0});let Un=()=>{if(!(i.isTouchMode&&!u()&&!d())&&!be()&&!f()&&!p()&&i.frozenElements.length===0){let e=NI(s().x,s().y);o.setDetectedElement(e)}},Wn=null,Gn=null,Kn=()=>{WY(),Un(),o.incrementViewportVersion(),o.updateContextMenuPosition()};xn.addWindowListener(`scroll`,Kn,{capture:!0});let qn=window.innerWidth,Jn=window.innerHeight;xn.addWindowListener(`resize`,()=>{let e=window.innerWidth,t=window.innerHeight;if(qn>0&&Jn>0){let n=e/qn,r=t/Jn,i=Math.abs(n-r)<xN,a=Math.abs(n-1)>xN;i&&a&&o.setPointer({x:s().x*n,y:s().y*r})}qn=e,Jn=t,Kn()});let Yn=window.visualViewport;if(Yn){let{signal:e}=xn;Yn.addEventListener(`resize`,Kn,{signal:e}),Yn.addEventListener(`scroll`,Kn,{signal:e})}let Xn=()=>{Gn===null&&(Gn=nI(()=>{Gn=null,o.incrementViewportVersion()}))};yR(()=>{if(r.store.theme.enabled&&(d()||_()||i.labelInstances.length>0||i.grabbedBoxes.length>0)){if(Wn!==null)return;Wn=window.setInterval(()=>{Xn()},100);return}Wn!==null&&(window.clearInterval(Wn),Wn=null),Gn!==null&&(rI(Gn),Gn=null)}),ER(()=>{Wn!==null&&window.clearInterval(Wn),Gn!==null&&rI(Gn)}),xn.addDocumentListener(`copy`,zM(e=>{b()||IB(e,`data-react-grab-ignore-events`)||N()&&e.preventDefault()}),{capture:!0}),ER(()=>{xn.abort(),Ae!==null&&window.clearTimeout(Ae),Pe&&window.clearTimeout(Pe),He(),he?.(),he=null,ge?.(),ge=null,rt.forEach(e=>window.clearTimeout(e)),rt.clear(),ot.cancelAllFades(),nt.stop(),C(`userSelect`,``),C(`touchAction`,``),Wt(null),Sn.restore(),IM(null)});let{root:Zn,host:Qn}=oY(HJ);ER(TY(Qn).cleanup);let $n=Y(()=>r.store.theme.enabled),er=Y(()=>r.store.theme.selectionBox.enabled),tr=Y(()=>r.store.theme.elementLabel.enabled),nr=Y(()=>r.store.theme.dragBox.enabled),rr=Y(()=>y()||ne()&&!f()||de.isInteracting()),ir=Y(()=>Pt().length>0),ar=Y(()=>!$n()||!er()||rr()?!1:ir()?!0:bt()),or=Y(()=>{let e=yt();if(e)return RN(e)||void 0}),sr=Y(()=>!$n()||fe()||!tr()||rr()?!1:bt()),cr=new Map,lr=e=>{let t=e.elements?.filter(sB)??[],n=e.element,r=null;t.length>0?r=t.map(eY):n&&sB(n)&&(r=[eY(n)]);let i=e.bounds,a=e.boundsMultiple;r&&(i=r.length>1?qY(oX(r)):r[0],e.boundsMultiple!==void 0&&(a=e.boundsMultiple.length>1&&e.boundsMultiple.length===e.elements?.length?r:[i]));let o=cr.get(e.id),s=o?.boundsMultiple,c=s===a||s!==void 0&&a!==void 0&&s.length===a.length&&s.every((e,t)=>e.x===a[t].x&&e.y===a[t].y&&e.width===a[t].width&&e.height===a[t].height);if(o&&o.status===e.status&&o.errorMessage===e.errorMessage&&o.bounds.x===i.x&&o.bounds.y===i.y&&o.bounds.width===i.width&&o.bounds.height===i.height&&c)return o;let l=i.x+i.width/2,u=i.width/2,d;d=e.mouseXOffsetRatio!==void 0&&u>0?l+e.mouseXOffsetRatio*u:e.mouseXOffsetFromCenter===void 0?e.mouseX??l:l+e.mouseXOffsetFromCenter;let f={...e,bounds:i,boundsMultiple:a,mouseX:d};return cr.set(e.id,f),f},ur=Y(()=>{if(!$n()||!r.store.theme.grabbedBoxes.enabled)return[];c();let e=new Set(i.labelInstances.map(e=>e.id));for(let t of cr.keys())e.has(t)||cr.delete(t);return i.labelInstances.map(lr)}),dr=Y(()=>!$n()||!r.store.theme.grabbedBoxes.enabled?[]:(c(),i.grabbedBoxes.map(e=>!e.element||!document.body.contains(e.element)?e:{...e,bounds:eY(e.element)}))),fr=Y(()=>$n()&&nr()&&N()&&Ot()),pr=Y(()=>_()?`processing`:`hover`),mr=Y(()=>{if(!$n())return!1;let e=tr(),t=b(),n=_(),r=N(),i=p(),a=!!P(),o=ne(),s=f();return!e||t||o&&!s?!1:n?!0:r&&!i&&a}),hr=Y(()=>{c();let e=i.contextMenuElement;return e?eY(e):null}),gr=Y(()=>(c(),i.contextMenuPosition)),_r=Y(()=>{let e=i.contextMenuElement;if(!e)return;let t=i.frozenElements.length;return t>1?`${t} elements`:RN(e)||void 0}),[vr]=sY(()=>i.frozenElements.length>1?null:i.contextMenuElement),[yr]=xR(()=>i.contextMenuElement,async e=>e?BU(e):null),br=async e=>{o.incrementSelectionInteractionLockDepth();try{return await e()}finally{o.decrementSelectionInteractionLockDepth()}},xr=(e,t,n,r,a)=>async c=>{await br(async()=>{let l=a?.fallbackBounds??null,u=a?.fallbackSelectionBounds??[],d=a?.position??i.contextMenuPosition??s(),f=St(),p=hr()??l,m=t.length>1,h=m?qY(oX(f)):p,g=i.wasActivatedByToggle,_;if(_=m?f:p?[p]:u,o.hideContextMenu(),h){let i=m?h.x+h.width/2:d.x,a=ot.createInstance(h,n||`element`,r,`copying`,{element:e,mouseX:i,elements:m?t:void 0,boundsMultiple:_}),o=!1,s;try{o=await c(),o||(s=`Failed to copy`)}catch(e){s=kY(e,`Action failed`)}ot.updateAfterCopy(a,o,s)}else try{await c()}catch{}g?Kt():o.unfreeze()})},Sr=()=>{setTimeout(()=>{o.hideContextMenu()},0)},Cr=e=>{let{element:t,filePath:n,lineNumber:a,tagName:s,componentName:c,position:l,performWithFeedbackOptions:u,shouldDeferHideContextMenu:f,onBeforeCopy:p,onBeforePrompt:m,customEnterPromptMode:h}=e,g=i.frozenElements.length>0?i.frozenElements:[t],_=f?Sr:o.hideContextMenu,v={element:t,elements:g,filePath:n,lineNumber:a,componentName:c,tagName:s,enterPromptMode:h??(()=>{ot.clearAll(),rn(),m?.(),Ee(t,l.x,l.y),o.setPointer({x:l.x,y:l.y}),o.setFrozenElement(t),De(),d()||Gt(),_()}),enterEditMode:()=>{en(t,l,{filePath:n,lineNumber:a,componentName:c,tagName:s})&&rn(),_()},copy:()=>{rn(),p?.(),dt({element:t,cursorX:l.x,selectedElements:g.length>1?g:void 0,shouldDeactivateAfter:i.wasActivatedByToggle}),_()},hooks:{transformHtmlContent:r.hooks.transformHtmlContent,onOpenFile:r.hooks.onOpenFile,transformOpenFileUrl:r.hooks.transformOpenFileUrl},performWithFeedback:xr(t,g,s,c,u),hideContextMenu:_,cleanup:()=>{i.wasActivatedByToggle?Kt():o.unfreeze()}},y=r.hooks.transformActionContext(v);return{...v,...y}},wr=Y(()=>{let e=i.contextMenuElement;if(!e)return;let t=yr(),n=i.contextMenuPosition??s();return Cr({element:e,filePath:t?.filePath,lineNumber:t?.lineNumber??void 0,tagName:_r(),componentName:vr(),position:n,shouldDeferHideContextMenu:!0,onBeforeCopy:()=>{ye.clear()},customEnterPromptMode:()=>{ot.clearAll(),rn(),o.clearInputText(),o.enterPromptMode(n,e),Sr()}})}),Tr=()=>{setTimeout(()=>{o.hideContextMenu(),Kt()},0)},Er=()=>{if(!me)return null;let e=me.getBoundingClientRect(),t=SZ(e);return t===`left`||t===`right`?{x:t===`left`?e.right:e.left,y:e.top+e.height/2,edge:t}:{x:e.left+e.width/2,y:t===`top`?e.bottom:e.top,edge:t}},Dr=()=>{let e=Er();if(e)return e;let t=de.state();return t?{x:t.position.x,y:t.position.y,edge:`bottom`}:null},Or=(e,t)=>{let n=null,r=()=>{let i=e();i&&t(i),n=nI(r)};return r(),()=>{n!==null&&(rI(n),n=null)}};yR(()=>{if(!_t())return;let e=Or(Er,ue);ER(()=>{e(),ue(null)})});let kr=()=>{he?.(),he=null,oe(null)},Ar=()=>{o.hideContextMenu(),kr(),de.dismiss()},jr=()=>{ae()===null?(o.hideContextMenu(),de.isOpen()&&de.closePreservingRenderer(),he?.(),he=Or(Er,oe)):kr()},Mr=e=>{Ce({defaultAction:e})},Nr=e=>{let t=i.labelInstances.find(t=>t.id===e);if(!t?.element||!sB(t.element))return;let n=t.element,r=tY(eY(n)),a={x:t.mouseX??r.x,y:r.y},s=t.elements&&t.elements.length>0?t.elements.filter(e=>sB(e)):[n];setTimeout(()=>{kr(),de.isOpen()&&de.closePreservingRenderer(),d()||(o.setWasActivatedByToggle(!0),Gt()),o.setPointer(a),o.setFrozenElements(s),s.length>1&&t.bounds&&o.setFrozenDragRect(KY(t.bounds)),o.freeze(),o.showContextMenu(a,n)},0)};yR(()=>{let e=r.store.theme.hue;e===0?Zn.style.filter=``:Zn.style.filter=`hue-rotate(${e}deg)`}),r.store.theme.enabled&&Promise.resolve().then(()=>(DJ(),aW)).then(({ReactGrabRenderer:e})=>{t||(n=dz(()=>X(e,{get selectionVisible(){return ar()},get selectionBounds(){return Tt()},get selectionBoundsMultiple(){return Ft()},get selectionShouldSnap(){return i.frozenElements.length>0||Pt().length>0},get selectionElementsCount(){return i.frozenElements.length},get frozenLabelEntries(){return Lt()},get pendingShiftPreviewEntry(){return Rt()??void 0},get selectionFilePath(){return i.selectionFilePath??void 0},get selectionLineNumber(){return i.selectionLineNumber??void 0},get selectionTagName(){return or()},get selectionComponentName(){return Ze()},get selectionLabelVisible(){return sr()},selectionLabelStatus:`idle`,get hierarchyState(){return Bn()},get hierarchyMenuPosition(){return le()},get labelInstances(){return ur()},get dragVisible(){return fr()},get dragBounds(){return Nt()},get grabbedBoxes(){return dr()},get mouseX(){return aB(()=>i.frozenElements.length>1)()?void 0:Bt()??zt().x},get isFrozen(){return f()||d()||ne()},get inputValue(){return i.inputText},get isPromptMode(){return b()},onShowContextMenuInstance:Nr,get onLabelInstanceHoverChange(){return ot.handleHoverChange},get onInputChange(){return o.setInputText},onInputSubmit:()=>void Yt(),onToggleExpand:$t,get selectionLabelShakeCount(){return k()},onConfirmDismiss:Zt,get discardPrompt(){return aB(()=>!!ye.isPendingDismiss())()?{isKeyboardSelection:!0,onConfirm:Zt,onCopy:On}:S()?{onConfirm:Zt,onCancel:Qt}:void 0},get toolbarVisible(){return r.store.theme.toolbar.enabled},get isActive(){return d()},onToggleActive:sn,onActivateAction:on,get activeActionId(){return $e()},get enabled(){return T()},get shakeCount(){return D()},onToolbarStateChange:e=>{A(e),e.enabled!==T()&&(E(e.enabled),e.enabled||(qt(),Ar())),DZ.forEach(t=>t(e))},onSubscribeToToolbarStateChanges:e=>(DZ.add(e),()=>{DZ.delete(e)}),onToolbarSelectHoverChange:re,onToolbarRef:e=>{me=e},get contextMenuPosition(){return gr()},get contextMenuBounds(){return hr()},get contextMenuTagName(){return _r()},get contextMenuComponentName(){return vr()},get contextMenuHasFilePath(){return!!yr()?.filePath},get actions(){return r.store.actions},get actionContext(){return wr()},onContextMenuDismiss:Tr,onContextMenuHide:Sr,get toolbarMenuPosition(){return ae()},get toolbarMenuActions(){return r.store.actions.filter(e=>e.showInToolbarMenu===!0)},get defaultActionId(){return te()?.defaultAction??`copy`},onSetDefaultAction:Mr,onToggleToolbarMenu:jr,onToolbarMenuDismiss:kr,get editPanelState(){return de.state()},get editPanelPosition(){return se()},get onEditPanelDismiss(){return de.dismiss},get onEditPanelSubmit(){return de.submit},get onEditPanelPendingEditsChange(){return de.setPendingEdits},get onEditPanelInteractingChange(){return de.setInteracting}}),Zn))}).catch(e=>{console.warn(`[react-grab] Failed to load renderer:`,e)});let Pr={activate:()=>{o.setPendingCommentMode(!1),!d()&&T()&&Jt()},deactivate:()=>{(d()||_())&&Kt()},toggle:()=>{d()?Kt():T()&&Jt()},comment:dn,isActive:()=>d(),isEnabled:()=>T(),setEnabled:e=>{e!==T()&&(E(e),Ce({enabled:e,collapsed:!e}),e||(qt(),Ar()))},getToolbarState:()=>te()??zV(),setToolbarState:e=>{let t=te()??zV(),n=e.collapsed??t?.collapsed??!1,r={edge:e.edge??t?.edge??`bottom`,ratio:e.ratio??t?.ratio??.5,collapsed:n,enabled:e.enabled??!n,defaultAction:e.defaultAction??t?.defaultAction??`copy`};BV(r),A(r),r.enabled!==T()&&(E(r.enabled),r.enabled||(qt(),Ar())),DZ.forEach(e=>e(r))},onToolbarStateChange:e=>(DZ.add(e),()=>{DZ.delete(e)}),reset:()=>{qt(),Ar(),o.clearGrabbedBoxes(),o.clearLabelInstances(),o.setSelectionSource(null,null)},dispose:()=>{t=!0,EZ=!1,n?.(),he?.(),he=null,ge?.(),ge=null,DZ.clear(),e()},copyElement:async e=>{let t=Array.isArray(e)?e:[e];return t.length!==0&&await ct(t)},getSource:async e=>{let t=await BU(e);return t?{filePath:t.filePath,lineNumber:t.lineNumber,componentName:t.componentName}:null},getStackContext:e=>QU(e,{maxLines:r.store.options.maxContextLines}),getState:()=>({isActive:d(),isDragging:p(),isCopying:_(),isPromptMode:b(),isSelectionBoxVisible:!!ar(),isDragBoxVisible:!!fr(),targetElement:pt(),dragBounds:Nt()??null,grabbedBoxes:[...Vt()],labelInstances:[...Ht()],selectionFilePath:i.selectionFilePath,toolbarState:te()}),setOptions:e=>{r.setOptions(e)},registerPlugin:e=>{r.register(e,Pr)},unregisterPlugin:e=>{r.unregister(e)},getPlugins:()=>r.getPluginNames(),getDisplayName:VU};for(let e of TZ)r.register(e,Pr);return setTimeout(()=>{XF(!0)},TN),Pr})}})),AZ=r({DEFAULT_THEME:()=>QX,commentPlugin:()=>yZ,formatElementInfo:()=>tW,generateSnippet:()=>wZ,getGlobalApi:()=>MZ,getStack:()=>MU,init:()=>OZ,isInstrumentationActive:()=>dP,openPlugin:()=>xZ,registerPlugin:()=>IZ,setGlobalApi:()=>NZ,unregisterPlugin:()=>LZ}),jZ,MZ,NZ,PZ,FZ,IZ,LZ,RZ=t((()=>{kZ(),pR(),iW(),jZ=null,MZ=()=>typeof window>`u`?jZ:window.__REACT_GRAB__??jZ??null,NZ=e=>{jZ=e,typeof window<`u`&&(e?window.__REACT_GRAB__=e:delete window.__REACT_GRAB__)},PZ=[],FZ=e=>{for(;PZ.length>0;){let t=PZ.shift();t&&e.registerPlugin(t)}},IZ=e=>{let t=MZ();if(t){t.registerPlugin(e);return}PZ.push(e)},LZ=e=>{let t=MZ();if(t){t.unregisterPlugin(e);return}let n=PZ.findIndex(t=>t.name===e);n!==-1&&PZ.splice(n,1)},typeof window<`u`&&!window.__REACT_GRAB_DISABLED__&&(window.__REACT_GRAB__?jZ=window.__REACT_GRAB__:(jZ=OZ(),window.__REACT_GRAB__=jZ),FZ(jZ),window.dispatchEvent(new CustomEvent(`react-grab:init`,{detail:jZ})))}));Sr(),Br(),_D();var zZ=`linear-grab:context-copied`,BZ=`linear-grab:picker-activated`,VZ=`linear-grab:picker-finished`,HZ=0,UZ=null;function WZ(e){!e||e.grabbedAt===HZ||Tr().then(t=>{if(t.workflowMode!==`local`||e.grabbedAt===HZ)return;let n=()=>{HZ=e.grabbedAt,navigator.clipboard.writeText(pD(e,t)).then(()=>window.dispatchEvent(new CustomEvent(zZ))).catch(()=>{HZ=0})};e.source?.filePath?(UZ&&clearTimeout(UZ),UZ=null,n()):(UZ&&clearTimeout(UZ),UZ=setTimeout(n,900))})}function GZ(e,t=Date.now()){return{tagName:e.tagName||void 0,componentName:e.componentName||void 0,content:e.textContent?e.textContent.slice(0,500):``,source:e.filePath?{filePath:e.filePath,lineNumber:e.lineNumber??null,columnNumber:e.columnNumber??null,componentName:e.componentName??null}:null,stackContext:void 0,pageUrl:location.href,grabbedAt:t}}function KZ(e,t){let n=null,r=0;return{plugin:{name:`linear-grab`,hooks:{onElementSelect:i=>{r=Date.now(),n=Tr().then(e=>e.captureShots?YA(i):null);let a=t?.(),o={tagName:i.tagName?.toLowerCase()||void 0,componentName:a?.getDisplayName?.(i)||void 0,content:(i.textContent??``).slice(0,500),source:null,stackContext:void 0,pageUrl:location.href,grabbedAt:r};e([o]);try{a?.getSource?.(i)?.then(t=>{t?.filePath&&e([{...o,source:{filePath:t.filePath,lineNumber:t.lineNumber??null,columnNumber:t.columnNumber??null,componentName:t.componentName??o.componentName??null}}])})}catch{}}}},handleSelection(t){let i=r&&Date.now()-r<4e3?r:Date.now(),a=t.map((e,t)=>GZ(e,i+t));if(!a.length)return;e(a);let o=n;n=null,o&&o.then(t=>{t&&e([{...a[0],screenshotDataUrl:t},...a.slice(1)])})}}}var qZ=!1;async function JZ(){if(xr||qZ)return;qZ=!0;let e=await Promise.resolve().then(()=>(RZ(),AZ));try{e.init()}catch{qZ=!1;return}let t=KZ(e=>{kr(e),WZ(e[0])},()=>e.getGlobalApi());e.registerPlugin(t.plugin),KA(),window.addEventListener(`react-grab:element-selected`,e=>{t.handleSelection(e.detail.elements??[])})}async function YZ(){if(xr){let e=await chrome.runtime.sendMessage({type:`grab/activate`});if(e&&e.ok===!1)throw Error(e.error??`Cannot activate the picker on this page.`);return}await JZ();let e=await Promise.resolve().then(()=>(RZ(),AZ));window.dispatchEvent(new CustomEvent(BZ));let t=e.getGlobalApi();if(t?.activate?.(),typeof t?.isActive==`function`){let e=!1,n=0,r=setInterval(()=>{n+=1;let i=!1;try{i=t.isActive()}catch{}if(i){e=!0;return}(e||n>=8)&&(clearInterval(r),window.dispatchEvent(new CustomEvent(VZ)))},250);setTimeout(()=>clearInterval(r),3e5)}}function XZ(e){if(!xr)return()=>{};let t=t=>{t?.type===`grab/updated`&&e()};return chrome.runtime.onMessage.addListener(t),()=>chrome.runtime.onMessage.removeListener(t)}var ZZ=2500;function QZ(e){let t=e.x+e.w/2,n=e.y+e.h/2,r=document.elementFromPoint(t,n)??document.body,i=t=>{let n=t.getBoundingClientRect();return n.left<=e.x&&n.top<=e.y&&n.right>=e.x+e.w&&n.bottom>=e.y+e.h};for(;r!==document.body&&!i(r);)r=r.parentElement??document.body;return r}async function $Z(e){let t=null,n=document.createElement(`video`);try{t=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:`browser`},audio:!1,preferCurrentTab:!0,selfBrowserSurface:`include`}),n.srcObject=t,n.muted=!0,n.playsInline=!0,await n.play(),await new Promise(e=>setTimeout(e,250));let r=n.videoWidth/window.innerWidth,i=n.videoHeight/window.innerHeight;if(!n.videoWidth||r<=0||i<=0)return null;let a=document.createElement(`canvas`);a.width=Math.max(1,Math.round(e.w*r)),a.height=Math.max(1,Math.round(e.h*i));let o=a.getContext(`2d`);return o?(o.drawImage(n,e.x*r,e.y*i,e.w*r,e.h*i,0,0,a.width,a.height),a.toDataURL(`image/png`)):null}catch(e){return console.warn(`[linear-grab] tab-frame region capture failed:`,e),null}finally{n.srcObject=null,t?.getTracks().forEach(e=>e.stop())}}function eQ(){return new Promise(e=>{let t=document.createElement(`div`);t.style.cssText=`position:fixed;inset:0;z-index:2147483647;cursor:crosshair;user-select:none;`;let n=document.createElement(`div`);n.style.cssText=`position:fixed;display:none;border:2px solid #5e6ad2;border-radius:4px;box-shadow:0 0 0 100000px rgba(0,0,0,0.35);pointer-events:none;`,t.appendChild(n),document.body.appendChild(t);let r=0,i=0,a=!1,o=e=>({x:Math.min(r,e.clientX),y:Math.min(i,e.clientY),w:Math.abs(e.clientX-r),h:Math.abs(e.clientY-i)}),s=()=>{t.remove(),window.removeEventListener(`keydown`,l,!0)},c=()=>{s(),e(null)},l=e=>{e.key===`Escape`&&(e.stopPropagation(),c())};window.addEventListener(`keydown`,l,!0),t.addEventListener(`pointerdown`,e=>{a=!0,r=e.clientX,i=e.clientY,t.setPointerCapture(e.pointerId)}),t.addEventListener(`pointermove`,e=>{if(!a)return;let t=o(e);n.style.display=`block`,n.style.left=`${t.x}px`,n.style.top=`${t.y}px`,n.style.width=`${t.w}px`,n.style.height=`${t.h}px`}),t.addEventListener(`pointerup`,t=>{let n=o(t);if(s(),n.w<8||n.h<8)return e(null);(QZ(n).querySelectorAll(`*`).length>ZZ?$Z(n):Promise.race([XA(n),new Promise(e=>setTimeout(()=>{console.warn(`[linear-grab] region capture timed out after 4s — trying a tab frame`),e(null)},4e3))]).then(e=>e??$Z(n))).then(t=>{if(!t)return e(null);e({tagName:`region`,componentName:void 0,content:`Region capture ${Math.round(n.w)}×${Math.round(n.h)}`,source:null,stackContext:void 0,screenshotDataUrl:t,pageUrl:location.href,grabbedAt:Date.now()})})})})}Br(),Sr(),_D();var tQ=N(`<span class="text-text-faint ml-auto text-[10.5px] font-normal normal-case tabular-nums">`),nQ=N(`<details open class=group><summary class="text-text-dim hover:text-text flex cursor-pointer items-center gap-1.5 text-[11px] font-semibold tracking-wide uppercase select-none"><span aria-hidden class="text-text-faint inline-block w-3 text-center transition-transform group-open:rotate-90">›</span></summary><div class="flex flex-col gap-2 pt-2 pl-4">`),rQ=N(`<p class="text-warn text-[10.5px] leading-snug">Several captures resolve to the same source — this page region likely renders inside an iframe/canvas the picker can't see into. Use <b>Capture region</b> for visual pointers there.`),iQ=N(`<span class="inline-block min-w-[8ch] text-center">`),aQ=N(`<div class="flex flex-col gap-1.5"><div class="flex flex-col gap-1.5"><span class="text-text-faint text-[10.5px] leading-snug">All elements post into ONE issue. Shift+click / drag selects several at once.</span><div class="flex items-center justify-end gap-1.5">`),oQ=N(`<div class="flex flex-col gap-1.5"><div class="flex gap-1.5">`),sQ=N(`<span class=text-danger>●`),cQ=N(`<div class="flex flex-col gap-1.5"><span class="text-text-faint text-[10.5px] leading-snug">Captures your screen as a looping GIF (max 30s) the coding agent can watch. Pick this tab in the share dialog, then reproduce the issue.`),lQ=N(`<span class="inline-block min-w-[4ch] text-center">Stop`),uQ=N(`<div class="bg-surface border-border flex items-center gap-2 rounded-lg border p-2.5"><span aria-hidden class="bg-danger size-2 shrink-0 animate-pulse rounded-full"></span><span class="text-text min-w-[5ch] text-[12px] tabular-nums"></span><span class="text-text-faint text-[10.5px]">max 0:30`),dQ=N(`<div class="bg-surface border-border flex items-center gap-2 rounded-lg border p-2.5"><span class="text-text-dim text-[12px]">Encoding GIF…`),fQ=N(`<div class="flex h-full flex-col gap-4 overflow-y-auto pt-3 pb-4 pl-3 pr-4">`),pQ=N(`<span class="text-success text-[12px] leading-none">✓`),mQ=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M4 4l8 8M12 4l-8 8">`),hQ=N(`<span class="font-mono text-text-dim break-all text-[11px] leading-snug">`),gQ=N(`<img alt="Element location screenshot"class="border-border bg-bg max-h-32 w-full rounded-md border object-contain">`),_Q=N(`<div class="bg-surface border-border flex flex-col gap-1.5 rounded-lg border p-2.5"><div class="flex items-center justify-between gap-2"><span class="font-mono text-accent min-w-0 truncate text-[12px]"></span><div class="flex shrink-0 items-center gap-1">`),vQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=9 height=9 rx=1.5></rect><path d="M10.5 5.5v-2a2 2 0 0 0-2-2h-5a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h2">`),yQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><rect x=2 y=2.5 width=12 height=11 rx=1.5></rect><path d="m2 10.5 3.5-3 3 2.5 3-2 2.5 2"></path><circle cx=6 cy=6 r=1 fill=currentColor stroke=none>`),bQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M8 2.5v8M4.5 7.5 8 11l3.5-3.5M2.5 13.5h11">`),xQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M2.5 4h11M6.5 4V2.5h3V4M4 4l.7 9a1.5 1.5 0 0 0 1.5 1.4h3.6A1.5 1.5 0 0 0 11.3 13l.7-9M6.5 7v4.5M9.5 7v4.5">`),SQ=N(`<div class="bg-surface border-border flex flex-col gap-2 rounded-lg border p-2.5"><img alt="Screen recording preview"class="border-border bg-bg max-h-44 w-full rounded-md border object-contain"><span class="text-text-faint text-[10.5px] tabular-nums"> KB · <!>s · <!>×</span><label class="flex cursor-pointer items-center gap-2 select-none"><input type=checkbox class="accent-accent rounded"><span class="text-text text-[12px]">Attach to issue on create</span></label><div class="flex items-center gap-1">`),CQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M6.5 9.5 9.5 6.5M7.5 4.5 9 3a2.5 2.5 0 0 1 3.5 3.5L11 8M8.5 11.5 7 13a2.5 2.5 0 0 1-3.5-3.5L5 8">`);function wQ(e){return(()=>{var t=nQ(),n=t.firstChild;n.firstChild;var r=n.nextSibling;return P(n,()=>e.title,null),P(n,j(M,{get when(){return e.badge},get children(){var t=tQ();return P(t,()=>e.badge),t}}),null),P(r,()=>e.children),t})()}function TQ(){let e=sr(),t=_r(()=>({queryKey:[`grab`],queryFn:Dr})),n=_r(()=>({queryKey:[`settings`],queryFn:Tr})),r=()=>t.data??[],i=()=>!!(n.data?.linearApiKey||n.data?.linearAccessToken),[a,o]=T(null),s=()=>{o(null),YZ().catch(e=>{o(e instanceof Error&&e.message?e.message:`Cannot activate the picker — open your dev app in the active tab first.`)})},c=async()=>{await jr(),e.invalidateQueries({queryKey:[`grab`]})},[l,u]=T(!1),d=async()=>{let e=(r()??[]).map(e=>`- <${e.componentName??e.tagName??`element`}>${e.source?.filePath?` — ${e.source.filePath}${e.source.lineNumber==null?``:`:${e.source.lineNumber}`}`:``}${e.screenshotDataUrl?` (screenshot captured — use Copy PNG to paste it)`:``}`),t=`Captured on ${r()?.[0]?.pageUrl??location.href}:\n${e.join(`
|
|
263
|
+
`)},qX=e=>`style`in e&&e.style instanceof CSSStyleDeclaration,JX=e=>{let t=new Map,n=qX(e)?e:null;return{apply:(e,r)=>{if(n)for(let i of e)t.has(i)||t.set(i,{value:n.style.getPropertyValue(i),priority:n.style.getPropertyPriority(i)}),n.style.setProperty(i,r)},restore:()=>{if(!n){t.clear();return}for(let[e,{value:r,priority:i}]of t)r?n.style.setProperty(e,r,i):n.style.removeProperty(e);t.clear()},hasAppliedStyles:()=>t.size>0}},YX=(e,t)=>{for(let n of t){let t=e.edits.findIndex(e=>e.key===n.key);t>=0?e.edits[t]=n:e.edits.push(n)}},XX=(e,t)=>({element:e.element,preview:e.preview,filePath:e.filePath??``,lineNumber:e.lineNumber??0,edits:t,designTokens:e.designTokens}),ZX=e=>{let[t,n]=J(null),[r,i]=J(!1),a=[],o=[],s=e=>{o=e},c=()=>{let r=t()!==null;n(null),i(!1),a=[],o=[],r&&e.onClose?.()},l=()=>{t()?.preview.restore();for(let e=a.length-1;e>=0;e--)a[e].preview.restore();c()},u=e=>{NU(e).then(t=>{t&&n(n=>!n||n.element!==e||n.componentName?n:{...n,componentName:t})})},d=(r,i,a={})=>{if(t()!==null)return!1;let o=EX(r);if(o.length===0)return!1;let s=a.filePath??e.store.selectionFilePath??void 0,c=a.lineNumber??e.store.selectionLineNumber??void 0;return n({element:r,position:i,selectionBounds:eY(r),properties:o,preview:JX(r),filePath:s,lineNumber:c,componentName:a.componentName,tagName:a.tagName??RN(r),initialSearchQuery:a.initialSearchQuery,designTokens:BX(r)}),u(r),e.isActivated()||e.activateRenderer(),e.actions.setPointer(i),e.actions.setFrozenElement(r),e.actions.freeze(),e.onOpen?.(),!0},f=(r,i)=>{let s=t();if(!s||s.element===r)return!1;let c=EX(r);return c.length===0?!1:((o.length>0||s.preview.hasAppliedStyles())&&a.push(XX(s,o)),o=[],n({element:r,position:i,selectionBounds:eY(r),properties:c,preview:JX(r),tagName:RN(r),hasSessionEdits:a.some(e=>e.edits.length>0),designTokens:BX(r)}),BU(r).then(e=>{if(e){for(let t of a)t.element===r&&!t.filePath&&(t.filePath=e.filePath,t.lineNumber=e.lineNumber??0);n(t=>!t||t.element!==r||t.filePath?t:{...t,filePath:e.filePath,lineNumber:e.lineNumber??void 0})}}).catch(()=>void 0),u(r),e.actions.setPointer(i),e.actions.setFrozenElement(r),!0)},p=(e,t)=>[...a,XX(e,t)],m=e=>{let t=new Map;for(let n of e){if(n.edits.length===0)continue;let e=t.get(n.element);if(e){!e.filePath&&n.filePath&&(e.filePath=n.filePath,e.lineNumber=n.lineNumber),YX(e,n.edits);continue}t.set(n.element,{filePath:n.filePath,lineNumber:n.lineNumber,edits:[...n.edits],designTokens:n.designTokens})}return Array.from(t.values())},h=e=>{let t=new Set;for(let n of e)n.edits.length>0&&t.add(n.element);for(let n=e.length-1;n>=0;n--){let r=e[n];r.edits.length===0&&!t.has(r.element)&&r.preview.restore()}};return{state:t,trigger:d,switchToElement:f,setPendingEdits:s,dismiss:()=>{t()!==null&&(l(),e.store.wasActivatedByToggle?e.deactivateRenderer():e.actions.unfreeze())},closePreservingRenderer:()=>{t()!==null&&(l(),e.actions.unfreeze())},submit:n=>{let r=t();if(!r)return;let i=r.element,a=p(r,n),o=KX(m(a));h(a),c(),e.store.wasActivatedByToggle||e.actions.unfreeze(),e.performCopyWithLabel({element:i,cursorX:r.position.x,extraPrompt:o||void 0,shouldDeactivateAfter:e.store.wasActivatedByToggle})},resetWithDiscard:l,isOpen:()=>t()!==null,isInteracting:r,setInteracting:i}},QX={enabled:!0,hue:0,selectionBox:{enabled:!0},dragBox:{enabled:!0},grabbedBoxes:{enabled:!0},elementLabel:{enabled:!0},toolbar:{enabled:!0}},$X=(e,t)=>({enabled:t.enabled??e.enabled,hue:t.hue??e.hue,selectionBox:{enabled:t.selectionBox?.enabled??e.selectionBox.enabled},dragBox:{enabled:t.dragBox?.enabled??e.dragBox.enabled},grabbedBoxes:{enabled:t.grabbedBoxes?.enabled??e.grabbedBoxes.enabled},elementLabel:{enabled:t.elementLabel?.enabled??e.elementLabel.enabled},toolbar:{enabled:t.toolbar?.enabled??e.toolbar.enabled}}),eZ={activationMode:`toggle`,keyHoldDuration:100,allowActivationInsideInput:!0,activationKey:void 0,getContent:void 0,maxContextLines:3,freezeReactUpdates:!0},tZ=(e={})=>{let t=new Map,n={},[r,i]=BJ({theme:QX,options:{...eZ,...e},actions:[]}),a=()=>{let r=QX,a={...eZ,...e},o=[];for(let{config:e}of t.values())if(e.theme&&(r=$X(r,e.theme)),e.options&&(a={...a,...e.options}),e.actions)for(let t of e.actions)o.push(t);a={...a,...n},i(`theme`,r),i(`options`,a),i(`actions`,o)},o=(e,t)=>{n[e]=t,i(`options`,e,t)},s=[`activationMode`,`keyHoldDuration`,`allowActivationInsideInput`,`activationKey`,`getContent`,`maxContextLines`,`freezeReactUpdates`],c=e=>{for(let t of s)e[t]!==void 0&&o(t,e[t])},l=(e,n)=>{t.has(e.name)&&u(e.name);let r=e.setup?.(n,_)??{};e.theme&&(r.theme=r.theme?$X($X(QX,e.theme),r.theme):e.theme),e.actions&&(r.actions=[...e.actions,...r.actions??[]]),e.hooks&&(r.hooks=r.hooks?{...e.hooks,...r.hooks}:e.hooks),e.options&&(r.options=r.options?{...e.options,...r.options}:e.options),t.set(e.name,{plugin:e,config:r}),a()},u=e=>{let n=t.get(e);n&&(n.config.cleanup&&n.config.cleanup(),t.delete(e),a())},d=()=>Array.from(t.keys()),f=(e,...n)=>{for(let{config:r}of t.values()){let t=r.hooks?.[e];t&&t(...n)}},p=(e,...n)=>{let r=!1;for(let{config:i}of t.values()){let t=i.hooks?.[e];t&&t(...n)===!0&&(r=!0)}return r},m=async(e,...n)=>{for(let{config:r}of t.values()){let t=r.hooks?.[e];t&&await t(...n)}},h=async(e,n,...r)=>{let i=n;for(let{config:n}of t.values()){let t=n.hooks?.[e];t&&(i=await t(i,...r))}return i},g=(e,n,...r)=>{let i=n;for(let{config:n}of t.values()){let t=n.hooks?.[e];t&&(i=t(i,...r))}return i},_={onActivate:()=>f(`onActivate`),onDeactivate:()=>f(`onDeactivate`),onElementHover:e=>f(`onElementHover`,e),onElementSelect:e=>{let n=!1,r;for(let{config:i}of t.values()){let t=i.hooks?.onElementSelect;if(t){let i=t(e);i===!0?n=!0:i instanceof Promise&&(n=!0,r=i)}}return{wasIntercepted:n,pendingResult:r}},onDragStart:(e,t)=>f(`onDragStart`,e,t),onDragEnd:(e,t)=>f(`onDragEnd`,e,t),onBeforeCopy:async e=>m(`onBeforeCopy`,e),transformCopyContent:async(e,t)=>h(`transformCopyContent`,e,t),onAfterCopy:(e,t)=>f(`onAfterCopy`,e,t),onCopySuccess:(e,t)=>f(`onCopySuccess`,e,t),onCopyError:e=>f(`onCopyError`,e),onStateChange:e=>f(`onStateChange`,e),onPromptModeChange:(e,t)=>f(`onPromptModeChange`,e,t),onSelectionBox:(e,t,n)=>f(`onSelectionBox`,e,t,n),onDragBox:(e,t)=>f(`onDragBox`,e,t),onGrabbedBox:(e,t)=>f(`onGrabbedBox`,e,t),onElementLabel:(e,t,n)=>f(`onElementLabel`,e,t,n),onContextMenu:(e,t)=>f(`onContextMenu`,e,t),onOpenFile:(e,t)=>p(`onOpenFile`,e,t),transformHtmlContent:async(e,t)=>h(`transformHtmlContent`,e,t),transformAgentContext:async(e,t)=>h(`transformAgentContext`,e,t),transformActionContext:e=>g(`transformActionContext`,e),transformOpenFileUrl:(e,t,n)=>g(`transformOpenFileUrl`,e,t,n)};return{register:l,unregister:u,getPluginNames:d,setOptions:c,store:r,hooks:_}},nZ=e=>`${e}-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,rZ=e=>{let t=e.bounds.x+e.bounds.width/2,n=e.bounds.width/2,r=e.mouseX===void 0?void 0:e.mouseX-t;return{id:nZ(`label`),bounds:e.bounds,boundsMultiple:e.boundsMultiple,tagName:e.tagName,componentName:e.componentName,status:e.status,createdAt:Date.now(),element:e.element,elements:e.elements,mouseX:e.mouseX,mouseXOffsetFromCenter:r,mouseXOffsetRatio:r!==void 0&&n>0?r/n:void 0,hideArrow:e.hideArrow}},iZ=(e,t)=>{let n=new Map,r=e=>{let t=n.get(e);t!==void 0&&(window.clearTimeout(t),n.delete(e))},i=()=>{for(let e of n.values())window.clearTimeout(e);n.clear()},a=()=>{i(),e.clearLabelInstances()},o=t=>{r(t);let i=window.setTimeout(()=>{e.updateLabelInstance(t,`fading`);let r=window.setTimeout(()=>{n.delete(t),e.removeLabelInstance(t)},125);n.set(t,r)},GM);n.set(t,i)};return{createInstance:(t,n,r,i,o)=>{a();let s=rZ({bounds:t,tagName:n,componentName:r,status:i,element:o?.element,mouseX:o?.mouseX,elements:o?.elements,boundsMultiple:o?.boundsMultiple,hideArrow:o?.hideArrow});return e.addLabelInstance(s),s.id},createPerElementInstances:(t,n)=>{a();let r=[];for(let i of t){let t=rZ({bounds:eY(i.element),tagName:i.tagName,componentName:i.componentName,status:n,element:i.element,mouseX:i.mouseX});e.addLabelInstance(t),r.push(t.id)}return r},updateAfterCopy:(t,n,r)=>{n?e.updateLabelInstance(t,`copied`):e.updateLabelInstance(t,`error`,r||`Unknown error`),o(t)},cancelAllFades:i,clearAll:a,handleHoverChange:(e,n)=>{if(n){r(e);return}let i=t().find(t=>t.id===e);i&&(i.status===`copied`||i.status===`error`||i.status===`fading`)&&o(e)}}},aZ=e=>{let t=window.innerWidth,n=window.innerHeight,r=Math.max(0,e.x),i=Math.min(t,e.x+e.width),a=Math.max(0,e.y),o=Math.min(n,e.y+e.height);return{x:(r+i)/2,y:(a+o)/2}},oZ=(e,t,n)=>{let r=[],i=(t,r)=>{let i=aZ(n(t)),a=MI(i.x,i.y).filter(e),o=a.indexOf(t);return o===-1?null:a[o+r]??null},a=e=>{let t=i(e,1);return t&&(r.push(e),r.length>50&&(r=r.slice(-50))),t},o=e=>{if(r.length>0){let e=r.pop();if(sB(e))return e}return i(e,-1)},s=(e,n)=>{let i=e=>n?e.nextElementSibling:e.previousElementSibling,a=i(e);for(;a;){if(t(a))return r=[],a;a=i(a)}return null};return{findNext:(e,t)=>{switch(e){case`ArrowUp`:return a(t);case`ArrowDown`:return o(t);case`ArrowRight`:return s(t,!0);case`ArrowLeft`:return s(t,!1);default:return null}},clearHistory:()=>{r=[]}}},sZ=e=>{let{metaKey:t,ctrlKey:n,shiftKey:r,altKey:i}=iX(e.activationKey);return{metaKey:t,ctrlKey:n,shiftKey:r,altKey:i}},cZ=()=>{let e=new WeakSet,t=Object.getOwnPropertyDescriptor(KeyboardEvent.prototype,`key`),n=!1;if(t?.get&&!t.get.__reactGrabPatched){n=!0;let r=t.get,i=function(){return e.has(this)?``:r.call(this)};i.__reactGrabPatched=!0,Object.defineProperty(KeyboardEvent.prototype,"key",{get:i,configurable:!0})}return{claimedEvents:e,originalKeyDescriptor:t,restore:()=>{n&&t&&Object.defineProperty(KeyboardEvent.prototype,"key",t)}}},lZ=(e,t)=>({top:t<25,bottom:t>window.innerHeight-25,left:e<25,right:e>window.innerWidth-25}),uZ=(e,t,n)=>{let r=null,i=()=>{if(!t()){a();return}let o=e(),s=lZ(o.x,o.y),c=0,l=0;if(s.top&&(l-=10),s.bottom&&(l+=10),s.left&&(c-=10),s.right&&(c+=10),c!==0||l!==0){let e=window.scrollX,t=window.scrollY;window.scrollBy(c,l);let r=window.scrollX-e,i=window.scrollY-t;(r!==0||i!==0)&&n?.({x:r,y:i})}r=s.top||s.bottom||s.left||s.right?nI(i):null},a=()=>{r!==null&&(rI(r),r=null)};return{start:i,stop:a,isActive:()=>r!==null}},dZ=()=>{let e=globalThis;return!!(e.chrome?.runtime?.id||e.browser?.runtime?.id)},fZ=e=>{try{let t=`0.1.48`,n=`data:image/svg+xml;base64,${btoa(`<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 294 294"><path fill="#ff40e0" d="M145 47c25-20 50-27 67-17 16 9 23 30 20 60 0 2-1 5-1 7l-2 13h-1l-12-4c-8-3-17-5-25-6l-17-3c-10-1-20-1-29-1-10 0-20 0-29 1-6 8-11 16-16 24-5 9-9 17-13 26 4 9 8 18 13 26s10 16 16 24l11 14c5 7 11 13 18 19l10 8s-1 0 0 0l-11 9c-17 14-35 22-49 22-6 0-13-2-18-5-16-9-23-30-20-59 1-3 1-5 1-8-30-12-48-29-48-50 0-18 14-35 41-47 2-1 5-2 7-3 0-2 0-5-1-7-3-30 4-51 20-60 18-10 42-3 68 17M71 201c-1 2-1 4-1 5-2 24 3 41 13 47h1c11 7 30 1 51-15-10-9-18-18-26-29-13-1-26-4-38-8m9-38c-3 9-5 17-7 26 8 2 17 4 25 6-3-5-6-10-9-16-3-5-6-10-9-16m-19-53c-2 1-3 1-5 2-21 10-34 23-34 35 0 13 14 27 39 37 3-12 7-25 12-37-5-12-9-24-12-37m37-10c-8 1-17 3-25 6 2 8 4 16 7 25 3-5 6-11 9-16zm-3-61c-4-1-8 0-12 2-10 7-15 24-13 47 0 2 0 3 1 5 12-4 25-6 38-8 8-10 16-20 26-29-15-11-29-17-40-17m111 2c-4-2-8-3-12-2-11 0-25 5-40 17 10 9 19 19 26 29 13 2 26 4 39 8v-5c3-23-2-40-13-47m-61 23c-7 6-13 13-19 19h37c-6-6-12-13-18-19"/><mask id="a"><path fill="#fff" d="m235 85-133 27 28 133 133-27Z"/></mask><path fill="#ff40e0" d="m137 130 76 11c8 1 9 11 3 15l-28 16-4 32c-1 8-10 10-14 4l-41-66c-3-6 1-13 8-12" mask="url(#a)"/></svg>`)}`;console.log(`%cReact Grab${` v${t}`}%c\nhttps://react-grab.com`,`background: #330039; color: #ffffff; border: 1px solid #d75fcb; padding: 4px 4px 4px 24px; border-radius: 4px; background-image: url("${n}"); background-size: 16px 16px; background-repeat: no-repeat; background-position: 4px center; display: inline-block; margin-bottom: 4px;`,``),e&&navigator.onLine&&!dZ()&&fetch(`https://www.react-grab.com/api/version?source=browser&v=${t}&t=${Date.now()}`,{referrerPolicy:`origin`,keepalive:!0,priority:`low`,cache:`no-store`}).then(e=>e.text()).then(e=>{e&&e!==t&&console.warn(`[React Grab] v${t} is outdated (latest: v${e}). Run \`npx grab@latest upgrade\` to upgrade.`)}).catch(()=>null)}catch{}},pZ=e=>typeof e==`object`&&!!e,mZ=e=>{if(!pZ(e))return null;let t={};return typeof e.enabled==`boolean`&&(t.enabled=e.enabled),(e.activationMode===`toggle`||e.activationMode===`hold`)&&(t.activationMode=e.activationMode),typeof e.keyHoldDuration==`number`&&Number.isFinite(e.keyHoldDuration)&&(t.keyHoldDuration=e.keyHoldDuration),typeof e.allowActivationInsideInput==`boolean`&&(t.allowActivationInsideInput=e.allowActivationInsideInput),typeof e.activationKey==`string`&&(t.activationKey=e.activationKey),typeof e.maxContextLines==`number`&&Number.isFinite(e.maxContextLines)&&(t.maxContextLines=e.maxContextLines),typeof e.freezeReactUpdates==`boolean`&&(t.freezeReactUpdates=e.freezeReactUpdates),typeof e.telemetry==`boolean`&&(t.telemetry=e.telemetry),Object.keys(t).length===0?null:t},hZ=()=>{if(typeof window>`u`)return null;try{let e=(document.currentScript instanceof HTMLScriptElement?document.currentScript:null)?.getAttribute(`data-options`);return e?mZ(JSON.parse(e)):null}catch{return null}},gZ=e=>e===`Enter`||e===`NumpadEnter`,_Z=(e,t)=>e.x>=t.x&&e.x<=t.x+t.width&&e.y>=t.y&&e.y<=t.y+t.height,vZ=(e=>({name:e.name,setup:(t,n)=>({actions:[typeof e.contextMenuAction==`function`?e.contextMenuAction(t,n):e.contextMenuAction],cleanup:e.cleanup})}))({name:`copy`,contextMenuAction:{id:`copy`,label:`Copy`,shortcut:`C`,showInToolbarMenu:!0,onAction:e=>{e.copy?.()}}}),yZ={name:`comment`,setup:()=>({actions:[{id:`comment`,label:`Comment`,shortcut:`Enter`,shortcutModifier:!1,showInToolbarMenu:!0,onAction:e=>{e.enterPromptMode?.()}}]})},bZ={name:`edit`,setup:()=>({actions:[{id:`edit`,label:`Style`,shortcut:`S`,shortcutModifier:!1,showInToolbarMenu:!0,onAction:e=>{e.enterEditMode?.()}}]})},xZ={name:`open`,actions:[{id:`open`,label:`Open`,shortcut:`O`,enabled:e=>!!e.filePath,onAction:e=>{e.filePath&&(e.hooks.onOpenFile(e.filePath,e.lineNumber)||II(e.filePath,e.lineNumber,e.hooks.transformOpenFileUrl),e.hideContextMenu(),e.cleanup())}}]},SZ=e=>{let t=e.left+e.width/2,n=e.top+e.height/2,r=n,i=window.innerHeight-n,a=t,o=window.innerWidth-t,s=Math.min(r,i,a,o);return s===r?`top`:s===a?`left`:s===o?`right`:`bottom`},CZ=()=>{let[e,t]=J(!1),[n,r]=J(null),i=GV(),a=()=>{let e=n();return sB(e)?e:null},o=()=>{r(null),i.clear(),t(!1)};return{selectedElement:a,isPendingDismiss:e,select:(e,n)=>{r(e),t(!1),n?.shouldPromptBeforeMouseHandoff?i.arm():i.clear()},clear:o,consumeMouseHandoff:()=>i.consume()&&a()!==null,showDismissPrompt:()=>a()?e()?!1:(t(!0),!0):(o(),!1),takeSelection:e=>{let t=a()??(sB(e)?e:null);return o(),t}}},wZ=async(e,t={})=>(await Promise.allSettled(e.map(e=>tW(e,t)))).map(e=>e.status===`fulfilled`?e.value:``),TZ=[vZ,bZ,yZ,xZ],EZ=!1,DZ=new Set,OZ=e=>{if(typeof window>`u`)return DY();let t={enabled:!0,activationMode:`toggle`,keyHoldDuration:100,allowActivationInsideInput:!0,...hZ(),...e};if(t.enabled===!1||EZ)return DY();EZ=!0,IM(t.container??null),fZ(t.telemetry!==!1);let{enabled:n,telemetry:r,container:i,...a}=t;return gR(e=>{let t=!1,n,r=tZ(a),{store:i,actions:o,pointer:s,viewportVersion:c,current:l}=rY({keyHoldDuration:r.store.options.keyHoldDuration??100}),u=Y(()=>l().state===`holding`),d=Y(()=>l().state===`active`),f=Y(()=>{let e=l();return e.state===`active`&&e.phase===`frozen`}),p=Y(()=>{let e=l();return e.state===`active`&&(e.phase===`dragging-select`||e.phase===`dragging-reposition`)}),m=Y(()=>{if(!p())return!1;let e=Math.abs(s().x+window.scrollX-i.dragStart.x),t=Math.abs(s().y+window.scrollY-i.dragStart.y);return e>2||t>2}),h=Y(()=>{let e=l();return e.state===`active`&&e.phase===`dragging-reposition`}),g=Y(()=>{let e=l();return e.state===`active`&&e.phase===`justDragged`}),_=Y(()=>l().state===`copying`),v=Y(()=>i.selectionInteractionLockDepth>0),y=Y(()=>l().state===`justCopied`),b=Y(()=>{let e=l();return e.state===`active`&&!!e.isPromptMode}),x=Y(()=>i.pendingCommentMode||b()),S=Y(()=>{let e=l();return e.state===`active`&&!!e.isPromptMode&&!!e.isPendingDismiss}),C=(e,t)=>{document.body.style[e]=t};yR(wR(d,(e,t)=>{e&&!t?(FL(s().x,s().y),C(`touchAction`,`none`)):!e&&t&&(IL(),C(`touchAction`,``))}));let w=zV(),[T,E]=J(!w||!w.collapsed),[D,O]=J(0),[k,ee]=J(0),[te,A]=J(w),[ne,re]=J(!1),ie=VV(e=>e.shiftKey),[ae,oe]=J(null),[se,ce]=J(null),[le,ue]=J(null),de=ZX({store:i,actions:o,isActivated:d,activateRenderer:()=>Gt(),deactivateRenderer:()=>Kt(),performCopyWithLabel:e=>dt(e),onOpen:()=>{kr(),ge?.(),ge=Or(Dr,ce)},onClose:()=>{ge?.(),ge=null,ce(null)}}),fe=Y(()=>i.contextMenuPosition!==null||de.isOpen()),pe=Y(()=>fe()||ae()!==null),me,he=null,ge=null,_e=!1,ve=new WeakMap,ye=CZ(),be=()=>!T()||b()||v()||fe()||ye.isPendingDismiss(),xe=()=>{ve=new WeakMap},Se=()=>{Le(!1),xe()},Ce=e=>{let t=te()??zV(),n={edge:t?.edge??`bottom`,ratio:t?.ratio??.5,collapsed:t?.collapsed??!1,enabled:t?.enabled??!0,defaultAction:t?.defaultAction??`copy`,...e};BV(n),A(n);for(let e of DZ)e(n)},we=()=>{Fe.timerId!==null&&(clearTimeout(Fe.timerId),Fe.timerId=null)},Te=()=>{Fe.copyWaiting=!1,Fe.holdTimerFired=!1,Fe.startTimestamp=null};yR(()=>{if(l().state!==`holding`){we();return}Fe.startTimestamp=Date.now(),Fe.timerId=window.setTimeout(()=>{if(Fe.timerId=null,Fe.copyWaiting){Fe.holdTimerFired=!0;return}o.activate()},i.keyHoldDuration),ER(we)}),yR(()=>{let e=l();if(e.state!==`active`||e.phase!==`justDragged`)return;let t=setTimeout(()=>{o.finishJustDragged()},GM);ER(()=>clearTimeout(t))}),yR(()=>{if(l().state!==`justCopied`)return;let e=setTimeout(()=>{o.finishJustCopied()},GM);ER(()=>clearTimeout(e))}),yR(wR(u,(e,t=!1)=>{!t||e||!d()||(r.store.options.activationMode!==`hold`&&o.setWasActivatedByToggle(!0),r.hooks.onActivate())}));let Ee=(e,t,n)=>{Oe(e,t,n),o.clearInputText()},De=()=>{let e=i.frozenElement||pt();e&&o.enterPromptMode({x:s().x,y:s().y},e)},Oe=(e,t,n)=>{o.setCopyStart({x:t,y:n},e)},ke={lastDetectionTimestamp:0,pendingDetectionScheduledAt:0,latestPointerX:0,latestPointerY:0},Ae=null,[je,Me]=J(null),Ne=(e,t)=>{Ae!==null&&clearTimeout(Ae),Me(null),Ae=window.setTimeout(()=>{Me({x:e,y:t}),Ae=null},32)},Pe=null,Fe={timerId:null,startTimestamp:null,copyWaiting:!1,holdTimerFired:!1},Ie=null,[j,Le]=J(!1),Re=0,ze=!1,Be=null,Ve=()=>{ze=!0,Be!==null&&window.clearTimeout(Be),Be=window.setTimeout(()=>{ze=!1,Be=null},GM)},He=()=>{Be!==null&&(window.clearTimeout(Be),Be=null),ze=!1},Ue=0,We=null,Ge=null,[M,Ke]=J(!1),[qe,Je]=J(null),[Ye,Xe]=J(null),[Ze,Qe]=sY(Ye),$e=Y(()=>de.isOpen()?yN:x()?vN:M()?qe():d()?_N:null),et=e=>ZY(e,gI),tt=oZ(gI,et,eY),nt=uZ(s,()=>p(),e=>{if(h()){if(o.shiftDragStart(e),Ie){Ie={x:Ie.x+e.x,y:Ie.y+e.y};return}let{pageX:t,pageY:n}=Et(s().x,s().y);Ie={x:t,y:n}}}),N=Y(()=>d()&&!_()),rt=new Map,it=(e,t)=>{let n=nZ(`grabbed`),i={id:n,bounds:e,createdAt:Date.now(),element:t};o.addGrabbedBox(i),r.hooks.onGrabbedBox(e,t);let a=window.setTimeout(()=>{rt.delete(n),o.removeGrabbedBox(n)},GM+125);rt.set(n,a)},at=async e=>{let t=await Promise.all(e.map(async e=>{let t=await BU(e),n=t?.componentName??null,r=t?.filePath,i=t?.lineNumber??void 0,a=t?.columnNumber??void 0;n||=VU(e);let o=e instanceof HTMLElement?e.innerText?.slice(0,100):void 0;return{tagName:RN(e),id:e.id||void 0,className:e.getAttribute(`class`)||void 0,textContent:o,componentName:n??void 0,filePath:r,lineNumber:i,columnNumber:a}}));window.dispatchEvent(new CustomEvent(`react-grab:element-selected`,{detail:{elements:t}}))},ot=iZ(o,()=>i.labelInstances),st=async(e,t,n)=>{He(),l().state!==`copying`&&o.startCopy();let r=!1,i;try{r=await e(),r||(i=`Failed to copy`)}catch(e){i=kY(e,`Action failed`)}if(t)for(let e of t)ot.updateAfterCopy(e,r,i);l().state===`copying`&&(r&&o.completeCopy(),n?Kt():r?(o.activate(),Ve()):o.unfreeze())},ct=(e,t,n)=>{let i=e[0],a=n??(i?VU(i):null),o=i?RN(i):null,s=a??o??void 0;return FY({getContent:r.store.options.getContent,componentName:s,maxContextLines:r.store.options.maxContextLines},r.hooks,e,t)},lt=async(e,t,n)=>{if(e.length===0)return!1;let i=[],a=[];for(let t of e){let{wasIntercepted:e,pendingResult:n}=r.hooks.onElementSelect(t);e||i.push(t),n&&a.push(n),r.store.theme.grabbedBoxes.enabled&&it(eY(t),t)}await iI();let o=!0;if(i.length>0&&(o=await ct(i,t,n)),a.length>0&&!(await Promise.all(a)).every(Boolean))throw new ZV;return at(e),o},ut=e=>{NU(e.primaryElement).then(async t=>{await st(()=>lt(e.targetElements,e.extraPrompt,t??void 0),e.labelInstanceIds.length>0?e.labelInstanceIds:null,e.shouldDeactivateAfter),e.onComplete?.()}).catch(t=>{let n=kY(t,`Action failed`);for(let t of e.labelInstanceIds)ot.updateAfterCopy(t,!1,n);l().state===`copying`&&o.unfreeze()})},dt=e=>{let{element:t,cursorX:n,selectedElements:r,extraPrompt:a,shouldDeactivateAfter:s,onComplete:c,dragRect:l}=e,u=r??[t],d=l??i.frozenDragRect,f=u.length>1,p=!f&&t===yt()?Tt():void 0,m=d&&f?GY(d):p??eY(t),h=f?m.x+m.width/2:n,g=RN(t);He(),o.startCopy();let _=g?ot.createInstance(m,g,void 0,`copying`,{element:t,mouseX:h,elements:r}):null;ut({primaryElement:t,targetElements:u,labelInstanceIds:_?[_]:[],extraPrompt:a,shouldDeactivateAfter:s,onComplete:c})},ft=e=>{let{elements:t,labelEntries:n,shouldDeactivateAfter:r,onComplete:i}=e,a=t[0];He(),o.startCopy(),ut({primaryElement:a,targetElements:t,labelInstanceIds:ot.createPerElementInstances(n,`copying`),shouldDeactivateAfter:r,onComplete:i})},pt=Y(()=>{if(c(),!N()||m()||v()||ye.isPendingDismiss())return null;let e=i.detectedElement;return sB(e)?e:null}),P=Y(()=>i.frozenElement||(f()?null:pt())),mt=Y(()=>!d()||b()||j()||_()||pe()||ye.isPendingDismiss()?null:ie()?f()?P():pt()??i.frozenElement:ye.selectedElement()),ht=Y(()=>{let e=mt();return e?JY(e,gI,et):[]}),gt=Y(()=>{let e=mt();return e?Math.max(0,ht().findIndex(t=>t.element===e)):0}),_t=Y(()=>mt()!==null);yR(()=>{let e=i.detectedElement;if(!e)return;let t=setInterval(()=>{sB(e)||o.setDetectedElement(null)},100);ER(()=>clearInterval(t))}),yR(wR(P,e=>{if(We!==null&&(clearTimeout(We),We=null),!e){Xe(null);return}We=window.setTimeout(()=>{We=null,Xe(e)},100)})),ER(()=>{We!==null&&(clearTimeout(We),We=null)}),yR(()=>{let e=i.frozenElements;ER(mL(e))}),yR(wR(d,e=>{e&&r.store.options.freezeReactUpdates&&ER(fR())}));let vt=()=>{if(i.isTouchMode&&p()){let e=i.detectedElement;return!e||oI(e)?void 0:e}let e=P();if(!(!e||oI(e)))return e},yt=Y(()=>vt()),bt=()=>yt()?i.isTouchMode&&p()?N():N()&&!m():!1,xt=ZR(()=>i.frozenElements,e=>Y(()=>(c(),eY(e)))),St=Y(()=>{let e=i.frozenElements;if(e.length===0)return[];let t=i.frozenDragRect;return t&&e.length>1?[GY(t)]:xt().map(e=>e())}),Ct=Y(()=>{if(!j()||i.pendingCommentMode||M())return null;let e=i.detectedElement;return!sB(e)||oI(e)||i.frozenElements.includes(e)?null:e}),wt=Y(()=>{c();let e=Ct();if(e)return eY(e)}),Tt=Y(()=>{c();let e=i.frozenElements;if(e.length>0){let t=St();if(e.length===1){let e=t[0];if(e)return e}let n=i.frozenDragRect;return n?t[0]??GY(n):qY(oX(t))}let t=yt();if(t)return eY(t)}),Et=(e,t)=>({pageX:e+window.scrollX,pageY:t+window.scrollY}),Dt=(e,t)=>{let{pageX:n,pageY:r}=Et(e,t);return{x:Math.abs(n-i.dragStart.x),y:Math.abs(r-i.dragStart.y)}},Ot=Y(()=>{if(!p())return!1;let e=Dt(s().x,s().y);return e.x>2||e.y>2}),kt=(e,t)=>{let{pageX:n,pageY:r}=Et(e,t),a=Math.min(i.dragStart.x,n),o=Math.min(i.dragStart.y,r),s=Math.abs(n-i.dragStart.x),c=Math.abs(r-i.dragStart.y);return{x:a-window.scrollX,y:o-window.scrollY,width:s,height:c}},At=e=>e.code===`Space`||e.key===` `,jt=()=>{if(!p())return;o.startDragReposition();let{pageX:e,pageY:t}=Et(s().x,s().y);Ie={x:e,y:t}},Mt=()=>{o.stopDragReposition(),Ie=null},Nt=Y(()=>{if(c(),Ot())return qY(kt(s().x,s().y))}),Pt=Y(()=>{if(c(),!Ot())return[];let e=je();if(!e)return[];let t=kt(e.x,e.y),n=HY(t,gI);return(n.length>0?n:HY(t,gI,!1)).map(e=>eY(e))}),Ft=Y(()=>{let e=Pt();if(e.length>0)return e;let t=wt();return t?[...St(),t]:St()}),It=ZR(()=>i.frozenElements,e=>{let t=RN(e)||`element`,n=VU(e)??void 0;return Y(()=>{if(c(),!sB(e))return null;let r=eY(e),i=ve.get(e);return{tagName:t,componentName:n,bounds:r,mouseX:i===void 0?void 0:r.x+r.width*i}})}),Lt=Y(()=>{if(b()||i.frozenElements.length<2)return[];let e=[];for(let t of It()){let n=t();n!==null&&e.push(n)}return e}),Rt=Y(()=>{if(b())return null;let e=Ct();return e?(c(),{tagName:RN(e)||`element`,componentName:VU(e)??void 0,bounds:eY(e),mouseX:s().x}):null}),zt=Y(()=>{if(_()||b()){c();let e=i.frozenElement||pt();return e?{x:tY(eY(e)).x+i.copyOffsetFromCenterX,y:i.copyStart.y}:{x:i.copyStart.x,y:i.copyStart.y}}return{x:s().x,y:s().y}}),Bt=Y(()=>{if(!j()||i.frozenElements.length!==1)return;c();let e=i.frozenElements[0];if(!sB(e))return;let t=ve.get(e);if(t===void 0)return;let n=eY(e);return n.x+n.width*t});yR(wR(()=>[pt(),i.lastGrabbedElement],([e,t])=>{t&&e&&t!==e&&o.setLastGrabbed(null),e&&r.hooks.onElementHover(e)})),yR(wR(()=>pt(),e=>{let t=++Ue,n=()=>{Ue===t&&o.setSelectionSource(null,null)};if(!e){n();return}BU(e).then(e=>{if(Ue===t){if(!e){n();return}o.setSelectionSource(e.filePath,e.lineNumber)}}).catch(()=>{Ue===t&&o.setSelectionSource(null,null)})}));let Vt=Y(()=>i.grabbedBoxes.map(e=>({id:e.id,bounds:e.bounds,createdAt:e.createdAt}))),Ht=Y(()=>i.labelInstances.map(e=>({id:e.id,status:e.status,tagName:e.tagName,componentName:e.componentName,createdAt:e.createdAt})));yR(wR(Y(()=>{let e=d(),t=p(),n=_(),a=b(),o=pt(),s=Nt(),c=r.store.theme.enabled,l=r.store.theme.selectionBox.enabled,u=r.store.theme.dragBox.enabled,f=Ot(),m=P(),h=y();return{isActive:e,isDragging:t,isCopying:n,isPromptMode:a,isSelectionBoxVisible:!!(c&&l&&e&&!n&&!h&&!t&&m!=null),isDragBoxVisible:!!(c&&u&&e&&!n&&f),targetElement:o,dragBounds:s?{x:s.x,y:s.y,width:s.width,height:s.height}:null,grabbedBoxes:[...Vt()],labelInstances:[...Ht()],selectionFilePath:i.selectionFilePath,toolbarState:te()}}),e=>{r.hooks.onStateChange(e)})),yR(wR(()=>{let e=b();return{inputMode:e,position:e?s():CR(s),target:e?pt():CR(pt)}},({inputMode:e,position:t,target:n})=>{r.hooks.onPromptModeChange(e,{x:t.x,y:t.y,targetElement:n})})),yR(wR(()=>[ar(),Tt(),pt()],([e,t,n])=>{r.hooks.onSelectionBox(!!e,t??null,n)})),yR(wR(()=>[fr(),Nt()],([e,t])=>{r.hooks.onDragBox(!!e,t??null)})),yR(wR(()=>{let e=mr();return[e,pr(),e?zt():CR(zt),e?pt():CR(pt),i.selectionFilePath,i.selectionLineNumber]},([e,t,n,i,a,o])=>{r.hooks.onElementLabel(e,t,{x:n.x,y:n.y,content:``,element:i??void 0,tagName:i&&RN(i)||void 0,filePath:a??void 0,lineNumber:o??void 0})}));let Ut=null,Wt=e=>{if(e){if(!Ut){Ut=document.createElement(`style`),Ut.setAttribute(`data-react-grab-cursor`,``);let e=BN();e&&(Ut.nonce=e),HN(Ut),document.head.appendChild(Ut)}Ut.textContent=`* { cursor: ${e} !important; }`}else Ut&&=(Ut.remove(),null)};yR(wR(()=>[d(),_(),b()],([e,t,n])=>{Wt(t?`progress`:e&&!n?`crosshair`:null)}));let Gt=()=>{let e=u();o.activate(),e||r.hooks.onActivate()},Kt=()=>{let e=p(),t=i.previouslyFocusedElement;Mt(),o.deactivate(),de.resetWithDiscard(),kr(),Se(),wn(),ye.clear(),Ke(!1),Je(null),e&&C(`userSelect`,``),Pe&&window.clearTimeout(Pe),nt.stop(),t instanceof HTMLElement&&t!==document.body&&t!==document.activeElement&&sB(t)&&t.focus({preventScroll:!0}),r.hooks.onDeactivate()},qt=()=>{u()&&o.releaseHold(),d()&&Kt(),He()},Jt=()=>{o.setWasActivatedByToggle(!0),Gt()},Yt=()=>{let e=[...i.frozenElements],t=i.frozenElement||pt(),n=b()?i.inputText.trim():``;if(!t){Kt();return}let r=e.length>0?e:[t],a=r.map(e=>eY(e))[0],{x:s,y:c}=tY(a),l=s+i.copyOffsetFromCenterX;o.setPointer({x:s,y:c}),o.exitPromptMode(),o.clearInputText(),dt({element:t,cursorX:l,selectedElements:r,extraPrompt:n||void 0,shouldDeactivateAfter:!0})},Xt=()=>{if(b()){if(S()){o.clearInputText(),Kt();return}o.setPendingDismiss(!0),ee(e=>e+1)}},Zt=()=>{if(ye.isPendingDismiss()){Dn();return}o.clearInputText(),Kt()},Qt=()=>{o.setPendingDismiss(!1)},$t=()=>{if(de.isOpen()){de.dismiss();return}let e=i.frozenElement||pt();e&&en(e,{x:s().x,y:s().y})},en=(e,t,n={})=>de.trigger(e,t,n),tn=(e,t)=>{if(!de.isOpen()||i.contextMenuPosition!==null)return!1;let n=MI(e,t).find(gI);if(!n)return!1;let r=de.switchToElement(n,{x:e,y:t});return r&&fL([n]),r},nn=e=>({filePath:i.selectionFilePath??void 0,lineNumber:i.selectionLineNumber??void 0,componentName:Ze(),tagName:RN(e)||void 0}),rn=()=>{Ge=null,Ke(!1),o.setPendingCommentMode(!1),Je(null)},an=e=>{let t=i.frozenElement||pt();if(!t)return!1;let n={x:s().x,y:s().y},a=r.store.actions.find(t=>t.id===e);return a?e===`edit`?en(t,n,nn(t))?(o.clearInputText(),o.exitPromptMode(),rn(),!0):!0:(o.clearInputText(),o.exitPromptMode(),rn(),a.onAction(Nn(t,n)),!0):(o.clearInputText(),o.exitPromptMode(),rn(),Mr(_N),ln(t,n),!0)},on=e=>{if(d()){if($e()!==e&&b()&&an(e))return;if($e()!==e&&i.pendingCommentMode){o.setPendingCommentMode(!1),Ge=e,Je(e),Ke(!0);return}if($e()!==e&&M()){Ge=e,Je(e);return}Kt();return}T()&&(Ge=e,Je(e),Ke(!0),Jt())},sn=()=>{on(te()?.defaultAction??`copy`)},cn=(e,t,n)=>{rn(),o.clearInputText(),o.enterPromptMode({x:t,y:n},e)},ln=(e,t)=>{Se(),Ar(),o.showContextMenu(t,e),wn(),r.hooks.onContextMenu(e,t)},un=(e,t)=>{let n=Ge;if(Ge=null,Je(null),!n)return;if(n===`edit`){en(e,t,nn(e));return}let i=r.store.actions.find(e=>e.id===n);if(!i){Mr(_N),ln(e,t);return}i.onAction(Nn(e,t))},dn=()=>{if(T()){if(d()&&x()){Kt();return}o.setPendingCommentMode(!0),d()||Jt()}},fn=(e,t,n)=>{let r=n&&j()&&!p()&&!i.pendingCommentMode&&!M();if(be()||f()&&!r)return;if(o.setPointer({x:e,y:t}),ke.latestPointerX=e,ke.latestPointerY=t,r){let n=NI(e,t);n!==i.detectedElement&&o.setDetectedElement(n);return}let a=performance.now(),s=ke.pendingDetectionScheduledAt>0&&a-ke.pendingDetectionScheduledAt<200;if(a-ke.lastDetectionTimestamp>=32&&!s&&(ke.lastDetectionTimestamp=a,ke.pendingDetectionScheduledAt=a,setTimeout(()=>{if(be()){ke.pendingDetectionScheduledAt=0;return}let e=NI(ke.latestPointerX,ke.latestPointerY);e!==i.detectedElement&&o.setDetectedElement(e),ke.pendingDetectionScheduledAt=0})),p()){if(h()){let{pageX:n,pageY:r}=Et(e,t);Ie&&o.shiftDragStart({x:n-Ie.x,y:r-Ie.y}),Ie={x:n,y:r}}Ne(e,t);let n=lZ(e,t),r=n.top||n.bottom||n.left||n.right;r&&!nt.isActive()?nt.start():!r&&nt.isActive()&&nt.stop()}},pn=(e,t,n)=>{if(!N()||v())return!1;!n&&j()&&Se();let i=ye.selectedElement()!==null;return o.startDrag({x:e,y:t},n||i),o.setPointer({x:e,y:t}),C(`userSelect`,`none`),Ne(e,t),r.hooks.onDragStart(e+window.scrollX,t+window.scrollY),!0},mn=(e,t)=>{let n=i.frozenElements.includes(e),r=i.frozenElements.length===0;if(!n){let n=UY(eY(e),t);ve.set(e,n),r&&Qe(VU(e)??void 0)}o.toggleFrozenElement(e),PI();let a=i.frozenElements.includes(e);if(a||ve.delete(e),i.frozenElements.length===0){Se(),o.unfreeze();return}fL(i.frozenElements),Le(!0),o.setPointer(t),o.setLastGrabbed(a?e:i.frozenElements[i.frozenElements.length-1]),o.freeze(),wn()},hn=()=>{let e=i.frozenElements.filter(sB),t=e.map(e=>{let t=RN(e)||`element`,n=VU(e)??void 0,r=ve.get(e),i=eY(e);return{element:e,tagName:t,componentName:n,mouseX:r===void 0?i.x+i.width/2:i.x+i.width*r}});if(Se(),e.length===0){o.unfreeze();return}if(e.length===1){dt({element:e[0],cursorX:t[0].mouseX,selectedElements:e,shouldDeactivateAfter:i.wasActivatedByToggle});return}ft({elements:e,labelEntries:t,shouldDeactivateAfter:i.wasActivatedByToggle})},gn=(e,t,n)=>{let a=HY(e,gI),s=a.length>0?a:HY(e,gI,!1);if(s.length===0)return;let c=n&&!i.pendingCommentMode&&!M();if(c&&o.addFrozenElements(s),fL(c?i.frozenElements:s),r.hooks.onDragEnd(s,e),c){let e=s[s.length-1];Le(!0),PI(),o.setPointer(tY(eY(e))),o.setLastGrabbed(e),o.freeze(),wn();return}let l=s[0],u=tY(eY(l));o.setPointer(u),o.setFrozenElements(s);let d=KY(e);if(o.setFrozenDragRect(d),o.freeze(),o.setLastGrabbed(l),i.pendingCommentMode){cn(l,u.x,u.y);return}if(M()){Ke(!1),Ge?un(l,u):ln(l,u);return}let f=i.wasActivatedByToggle&&!t;dt({element:l,cursorX:u.x,selectedElements:s,shouldDeactivateAfter:f,dragRect:d})},_n=e=>{for(let t of i.frozenElements)if(sB(t)&&_Z(e,eY(t)))return t;return null},vn=(e,t,n,a)=>{let c=sB(i.frozenElement)?i.frozenElement:null,l=ye.selectedElement(),u=()=>MI(e,t).find(gI)??null;if(a&&!i.pendingCommentMode&&!M()){let n=u();n!==null&&mn(n,{x:e,y:t});return}let d=u()??(sB(i.detectedElement)?i.detectedElement:null),f=l??d??c;if(!f)return;let p,m,h=d===null&&c===f,g=l===f;if(h)p=s().x,m=s().y;else if(g){let e=tY(eY(f));p=e.x,m=e.y}else p=e,m=t;if(i.pendingCommentMode){cn(f,p,m),ye.clear();return}if(M()){Ke(!1);let{wasIntercepted:e}=r.hooks.onElementSelect(f);if(e)return;ye.clear(),fL([f]),o.setFrozenElement(f);let t={x:p,y:m};o.setPointer(t),o.freeze(),Ge?un(f,t):ln(f,t);return}let _=i.wasActivatedByToggle&&!n;o.setLastGrabbed(f),dt({element:f,cursorX:p,shouldDeactivateAfter:_}),ye.clear()},yn=()=>{p()&&(Mt(),o.cancelDrag(),nt.stop(),C(`userSelect`,``))},bn=(e,t,n,r)=>{if(!p())return;Ae!==null&&(clearTimeout(Ae),Ae=null),Me(null);let i=Dt(e,t),a=i.x>2||i.y>2,s=a?kt(e,t):null;a?o.endDrag():o.cancelDrag(),Mt(),nt.stop(),C(`userSelect`,``),s?gn(s,n,r):vn(e,t,n,r)},xn=OY(),Sn=cZ(),Cn=e=>{let t;try{t=Sn.originalKeyDescriptor?.get?Sn.originalKeyDescriptor.get.call(e):e.key}catch{return!1}let n=t===`Enter`||gZ(e.code),r=d()||u();return n&&r&&!b()&&!ye.isPendingDismiss()&&!i.wasActivatedByToggle?IB(e,`data-react-grab-input`)?!1:(Sn.claimedEvents.add(e),e.preventDefault(),e.stopImmediatePropagation(),!0):!1};xn.addDocumentListener(`keydown`,zM(Cn),{capture:!0}),xn.addDocumentListener(`keyup`,zM(Cn),{capture:!0}),xn.addDocumentListener(`keypress`,zM(Cn),{capture:!0});let wn=()=>{tt.clearHistory(),ye.clear()},Tn=(e,t=!1)=>{o.setFrozenElement(e),o.freeze(),ye.select(e,{shouldPromptBeforeMouseHandoff:t});let n=tY(eY(e));o.setPointer(n),i.contextMenuPosition!==null&&o.showContextMenu(n,e)},En=()=>{ye.showDismissPrompt()&&ee(e=>e+1)},Dn=()=>{ye.clear(),o.unfreeze(),wn()},On=()=>{let e=ye.takeSelection(i.frozenElement);if(!e){Dn();return}let t=tY(eY(e));wn(),o.setLastGrabbed(e),dt({element:e,cursorX:t.x,shouldDeactivateAfter:i.wasActivatedByToggle})},kn=e=>fN.has(e.key)?e.key:e.key===`Tab`?e.shiftKey?`ArrowLeft`:`ArrowRight`:null,An=(e,t={})=>{if(!d()||b()||j()||ye.isPendingDismiss()&&!t.allowPendingKeyboardSelection)return!1;let n=kn(e);if(!n||pe())return!1;let r=P(),i=!r;if(!r){let e=LM()?.getBoundingClientRect();r=e?NI(e.left+e.width/2,e.top+e.height/2):NI(window.innerWidth/2,window.innerHeight/2)}if(!r)return!1;let a=n===`ArrowUp`||n===`ArrowDown`,o=tt.findNext(n,r);if(!o&&!a&&!i)return!1;let s=o??r;return e.preventDefault(),e.stopPropagation(),Tn(s,!0),!0},jn=e=>e.metaKey||e.ctrlKey||e.altKey||e.repeat||uB(e)||!d()||_()||v()||pe()?null:i.frozenElement||pt(),Mn=e=>{let t=jn(e);if(!t)return null;let n=WV(r.store.actions,e);return n?{element:t,action:n}:null},Nn=(e,t)=>{let n=eY(e);return Cr({element:e,filePath:i.selectionFilePath??void 0,lineNumber:i.selectionLineNumber??void 0,tagName:RN(e)||void 0,componentName:Ze(),position:t,shouldDeferHideContextMenu:!1,performWithFeedbackOptions:{fallbackBounds:n,fallbackSelectionBounds:[n],position:t}})},Pn=/^[a-zA-Z0-9-]$/,Fn=e=>{if(!e.key||e.key.length!==1||!Pn.test(e.key))return!1;let t=jn(e);return!t||!de.trigger(t,{x:s().x,y:s().y},{initialSearchQuery:e.key})?!1:(rn(),e.preventDefault(),e.stopImmediatePropagation(),!0)},In=e=>{let t=Mn(e);if(!t)return!1;let{element:n,action:r}=t;if(b())return an(r.id)?(e.preventDefault(),e.stopImmediatePropagation(),!0):!1;let i={x:s().x,y:s().y};return r.onAction(Nn(n,i)),e.preventDefault(),e.stopImmediatePropagation(),!0},Ln=e=>{if(e.key?.toLowerCase()!==`o`||!d()||!(e.metaKey||e.ctrlKey))return!1;let t=i.selectionFilePath,n=i.selectionLineNumber;return t?(e.preventDefault(),e.stopPropagation(),r.hooks.onOpenFile(t,n??void 0)||II(t,n??void 0,r.hooks.transformOpenFileUrl),!0):!1},Rn=e=>{if(!d()||_()||i.contextMenuPosition!==null||de.isOpen())return!1;let t=e.key===`F10`&&e.shiftKey,n=e.key===`ContextMenu`;if(!t&&!n)return!1;let r=i.frozenElements,a=r.length>1,s=(a?r[0]:null)||i.frozenElement||pt();if(!s)return!1;e.preventDefault(),e.stopPropagation();let c=tY(eY(s));return a?fL(r):(fL([s]),o.setFrozenElement(s)),o.setPointer(c),o.freeze(),ln(s,c),!0},zn=Y(()=>ht().map(e=>({tagName:RN(e.element)||`element`,componentName:VU(e.element)??void 0,depth:e.depth,isLast:e.isLast}))),Bn=Y(()=>({items:zn(),activeIndex:gt()})),Vn=e=>{if(!(!r.store.options.allowActivationInsideInput&&uB(e))&&!(!aX(e,r.store.options)&&((e.metaKey||e.ctrlKey)&&!dN.includes(e.key)&&!gZ(e.code)&&(d()&&!i.wasActivatedByToggle?Kt():u()&&(we(),Te(),o.releaseHold())),!gZ(e.code)||!u()))){if((d()||u())&&!b()&&(e.preventDefault(),gZ(e.code)&&e.stopImmediatePropagation()),d()){if(i.wasActivatedByToggle&&r.store.options.activationMode!==`hold`||e.repeat)return;Pe!==null&&window.clearTimeout(Pe),Pe=window.setTimeout(()=>{Kt()},200);return}if(u()&&e.repeat){if(Fe.copyWaiting){let e=Fe.holdTimerFired;Te(),e&&o.activate()}return}if(!(_()||y())&&!u()){let t=r.store.options.keyHoldDuration??100;uB(e)?dB(e)?t+=600:t+=400:fB()&&(t+=600),Te(),o.startHold(t)}}},Hn=e=>{if(!ye.isPendingDismiss())return!1;if(gZ(e.code))return!0;let t=fN.has(e.key),n=Mn(e)!==null;return!t&&!n?!1:t?An(e,{allowPendingKeyboardSelection:!0}):In(e)?(wn(),!0):!1};xn.addWindowListener(`keydown`,zM(e=>{if(kn(e)&&uB(e)||Hn(e))return;if(Cn(e),!T()){aX(e,r.store.options)&&!e.repeat&&O(e=>e+1);return}let t=gZ(e.code)&&u()&&!b(),n=IB(e,hN);if(b()&&aX(e,r.store.options)&&!e.repeat&&!n){e.preventDefault(),e.stopPropagation(),Xt();return}if(e.key===`Escape`&&pe()){ae()!==null&&kr();return}let a=IB(e,`data-react-grab-ignore-events`)&&!t;if(b()||a)return b()&&!n&&In(e)||(e.key===`Escape`&&(b()?Xt():i.wasActivatedByToggle&&Kt()),a&&fN.has(e.key)&&An(e)),void 0;if(p()&&At(e)){e.repeat||jt(),e.preventDefault(),e.stopPropagation();return}if(e.key===`Escape`&&(u()||i.wasActivatedByToggle)){Kt();return}d()&&!dN.includes(e.key)&&e.preventDefault();let o=Date.now()-Re<200;An(e)||Ln(e)||Rn(e)||In(e)||Fn(e)||o||Vn(e)}),{capture:!0}),xn.addWindowListener(`keyup`,zM(e=>{if(Cn(e))return;if(At(e)&&h()&&(Mt(),e.preventDefault(),e.stopPropagation()),e.key===`Shift`&&j()){p()&&yn(),hn();return}if(IB(e,`data-react-grab-ignore-events`))return;let t=sZ(r.store.options),n=t.metaKey||t.ctrlKey?FB()?!e.metaKey:!e.ctrlKey:t.shiftKey&&!e.shiftKey||t.altKey&&!e.altKey,a=r.store.options.activationKey?typeof r.store.options.activationKey==`function`?r.store.options.activationKey(e):rX(r.store.options.activationKey)(e):$Y(e.key,e.code);if(y()||ze){(a||n)&&(He(),Kt());return}if(!u()&&!d()||b())return;let s=!!r.store.options.activationKey,c=r.store.options.activationMode===`hold`,l=p();if(d()){let e=fe();if(n){if(i.wasActivatedByToggle&&r.store.options.activationMode!==`hold`||e)return;Kt()}else if(c&&a){if(Pe!==null&&(window.clearTimeout(Pe),Pe=null),e||l)return;Kt()}else!s&&a&&Pe!==null&&(window.clearTimeout(Pe),Pe=null);return}if(a||n){if(i.wasActivatedByToggle&&r.store.options.activationMode!==`hold`)return;if(u()||Fe.holdTimerFired&&n){we();let t=(Fe.startTimestamp?Date.now()-Fe.startTimestamp:0)>=200,n=Fe.holdTimerFired&&t&&(r.store.options.allowActivationInsideInput||!uB(e));Te(),n?o.activate():o.releaseHold()}else Kt()}}),{capture:!0}),xn.addDocumentListener(`copy`,()=>{u()&&(Fe.copyWaiting=!0)}),xn.addWindowListener(`keypress`,zM(Cn),{capture:!0}),xn.addWindowListener(`pointermove`,zM(e=>{if(!e.isPrimary)return;let t=e.pointerType===`touch`;if(o.setTouchMode(t),!IB(e,`data-react-grab-ignore-events`)&&!be()&&!(t&&!u()&&!d())){if((t?u():d())&&!b()&&f()&&!e.shiftKey&&!j()){if(ye.consumeMouseHandoff()){En();return}o.unfreeze(),wn()}fn(e.clientX,e.clientY,e.shiftKey)}}),{passive:!0}),xn.addWindowListener(`pointerdown`,zM(e=>{if(e.button===0&&e.isPrimary&&(o.setTouchMode(e.pointerType===`touch`),_e=!1,!IB(e,`data-react-grab-ignore-events`))){if(fe()){tn(e.clientX,e.clientY)&&(_e=!0,e.preventDefault(),e.stopImmediatePropagation());return}if(b()){let t=Tt();t&&e.clientX>=t.x&&e.clientX<=t.x+t.width&&e.clientY>=t.y&&e.clientY<=t.y+t.height?Yt():Xt();return}if(ye.isPendingDismiss()){e.preventDefault(),e.stopImmediatePropagation();return}if(v()){e.preventDefault(),e.stopImmediatePropagation();return}pn(e.clientX,e.clientY,e.shiftKey)&&(e.pointerId!==void 0&&document.documentElement.setPointerCapture(e.pointerId),e.preventDefault(),e.stopImmediatePropagation())}}),{capture:!0}),xn.addWindowListener(`pointerup`,zM(e=>{if(e.button!==0||!e.isPrimary||IB(e,`data-react-grab-ignore-events`)||fe())return;let t=N()||v()||p(),n=e.metaKey||e.ctrlKey;bn(e.clientX,e.clientY,n,e.shiftKey),t&&(e.preventDefault(),e.stopImmediatePropagation())}),{capture:!0}),xn.addWindowListener(`contextmenu`,zM(e=>{if(!N()||_()||b()||de.isOpen())return;let t=IB(e,`data-react-grab-ignore-events`),n={x:e.clientX,y:e.clientY},r=t&&i.frozenElements.length>1?_n(n):null,a=ye.isPendingDismiss();if(t&&!r&&!a&&!_t())return;if(fe()){e.preventDefault();return}e.preventDefault(),e.stopPropagation();let s=r??NI(e.clientX,e.clientY);if(!s)return;let c=i.frozenElements;c.length>1&&c.includes(s)?fL(c):(fL([s]),o.setFrozenElement(s)),o.setPointer(n),o.freeze(),ln(s,n)}),{capture:!0}),xn.addWindowListener(`pointercancel`,zM(e=>{e.isPrimary&&yn()})),xn.addWindowListener(`click`,zM(e=>{if(!IB(e,`data-react-grab-ignore-events`)){if(_e){_e=!1,e.preventDefault(),e.stopImmediatePropagation();return}fe()||(N()||g())&&(e.preventDefault(),e.stopImmediatePropagation(),i.wasActivatedByToggle&&!b()&&!e.shiftKey&&(u()?o.setWasActivatedByToggle(!1):Kt()))}}),{capture:!0}),xn.addDocumentListener(`visibilitychange`,()=>{if(document.hidden){o.clearGrabbedBoxes();let e=i.activationTimestamp;d()&&!b()&&e!==null&&Date.now()-e>500&&Kt()}}),xn.addWindowListener(`blur`,()=>{yn(),u()&&(we(),o.releaseHold(),Te()),Se()}),xn.addWindowListener(`focus`,()=>{Re=Date.now()}),xn.addWindowListener(`focusin`,e=>{IB(e,BM)&&e.stopPropagation()},{capture:!0});let Un=()=>{if(!(i.isTouchMode&&!u()&&!d())&&!be()&&!f()&&!p()&&i.frozenElements.length===0){let e=NI(s().x,s().y);o.setDetectedElement(e)}},Wn=null,Gn=null,Kn=()=>{WY(),Un(),o.incrementViewportVersion(),o.updateContextMenuPosition()};xn.addWindowListener(`scroll`,Kn,{capture:!0});let qn=window.innerWidth,Jn=window.innerHeight;xn.addWindowListener(`resize`,()=>{let e=window.innerWidth,t=window.innerHeight;if(qn>0&&Jn>0){let n=e/qn,r=t/Jn,i=Math.abs(n-r)<xN,a=Math.abs(n-1)>xN;i&&a&&o.setPointer({x:s().x*n,y:s().y*r})}qn=e,Jn=t,Kn()});let Yn=window.visualViewport;if(Yn){let{signal:e}=xn;Yn.addEventListener(`resize`,Kn,{signal:e}),Yn.addEventListener(`scroll`,Kn,{signal:e})}let Xn=()=>{Gn===null&&(Gn=nI(()=>{Gn=null,o.incrementViewportVersion()}))};yR(()=>{if(r.store.theme.enabled&&(d()||_()||i.labelInstances.length>0||i.grabbedBoxes.length>0)){if(Wn!==null)return;Wn=window.setInterval(()=>{Xn()},100);return}Wn!==null&&(window.clearInterval(Wn),Wn=null),Gn!==null&&(rI(Gn),Gn=null)}),ER(()=>{Wn!==null&&window.clearInterval(Wn),Gn!==null&&rI(Gn)}),xn.addDocumentListener(`copy`,zM(e=>{b()||IB(e,`data-react-grab-ignore-events`)||N()&&e.preventDefault()}),{capture:!0}),ER(()=>{xn.abort(),Ae!==null&&window.clearTimeout(Ae),Pe&&window.clearTimeout(Pe),He(),he?.(),he=null,ge?.(),ge=null,rt.forEach(e=>window.clearTimeout(e)),rt.clear(),ot.cancelAllFades(),nt.stop(),C(`userSelect`,``),C(`touchAction`,``),Wt(null),Sn.restore(),IM(null)});let{root:Zn,host:Qn}=oY(HJ);ER(TY(Qn).cleanup);let $n=Y(()=>r.store.theme.enabled),er=Y(()=>r.store.theme.selectionBox.enabled),tr=Y(()=>r.store.theme.elementLabel.enabled),nr=Y(()=>r.store.theme.dragBox.enabled),rr=Y(()=>y()||ne()&&!f()||de.isInteracting()),ir=Y(()=>Pt().length>0),ar=Y(()=>!$n()||!er()||rr()?!1:ir()?!0:bt()),or=Y(()=>{let e=yt();if(e)return RN(e)||void 0}),sr=Y(()=>!$n()||fe()||!tr()||rr()?!1:bt()),cr=new Map,lr=e=>{let t=e.elements?.filter(sB)??[],n=e.element,r=null;t.length>0?r=t.map(eY):n&&sB(n)&&(r=[eY(n)]);let i=e.bounds,a=e.boundsMultiple;r&&(i=r.length>1?qY(oX(r)):r[0],e.boundsMultiple!==void 0&&(a=e.boundsMultiple.length>1&&e.boundsMultiple.length===e.elements?.length?r:[i]));let o=cr.get(e.id),s=o?.boundsMultiple,c=s===a||s!==void 0&&a!==void 0&&s.length===a.length&&s.every((e,t)=>e.x===a[t].x&&e.y===a[t].y&&e.width===a[t].width&&e.height===a[t].height);if(o&&o.status===e.status&&o.errorMessage===e.errorMessage&&o.bounds.x===i.x&&o.bounds.y===i.y&&o.bounds.width===i.width&&o.bounds.height===i.height&&c)return o;let l=i.x+i.width/2,u=i.width/2,d;d=e.mouseXOffsetRatio!==void 0&&u>0?l+e.mouseXOffsetRatio*u:e.mouseXOffsetFromCenter===void 0?e.mouseX??l:l+e.mouseXOffsetFromCenter;let f={...e,bounds:i,boundsMultiple:a,mouseX:d};return cr.set(e.id,f),f},ur=Y(()=>{if(!$n()||!r.store.theme.grabbedBoxes.enabled)return[];c();let e=new Set(i.labelInstances.map(e=>e.id));for(let t of cr.keys())e.has(t)||cr.delete(t);return i.labelInstances.map(lr)}),dr=Y(()=>!$n()||!r.store.theme.grabbedBoxes.enabled?[]:(c(),i.grabbedBoxes.map(e=>!e.element||!document.body.contains(e.element)?e:{...e,bounds:eY(e.element)}))),fr=Y(()=>$n()&&nr()&&N()&&Ot()),pr=Y(()=>_()?`processing`:`hover`),mr=Y(()=>{if(!$n())return!1;let e=tr(),t=b(),n=_(),r=N(),i=p(),a=!!P(),o=ne(),s=f();return!e||t||o&&!s?!1:n?!0:r&&!i&&a}),hr=Y(()=>{c();let e=i.contextMenuElement;return e?eY(e):null}),gr=Y(()=>(c(),i.contextMenuPosition)),_r=Y(()=>{let e=i.contextMenuElement;if(!e)return;let t=i.frozenElements.length;return t>1?`${t} elements`:RN(e)||void 0}),[vr]=sY(()=>i.frozenElements.length>1?null:i.contextMenuElement),[yr]=xR(()=>i.contextMenuElement,async e=>e?BU(e):null),br=async e=>{o.incrementSelectionInteractionLockDepth();try{return await e()}finally{o.decrementSelectionInteractionLockDepth()}},xr=(e,t,n,r,a)=>async c=>{await br(async()=>{let l=a?.fallbackBounds??null,u=a?.fallbackSelectionBounds??[],d=a?.position??i.contextMenuPosition??s(),f=St(),p=hr()??l,m=t.length>1,h=m?qY(oX(f)):p,g=i.wasActivatedByToggle,_;if(_=m?f:p?[p]:u,o.hideContextMenu(),h){let i=m?h.x+h.width/2:d.x,a=ot.createInstance(h,n||`element`,r,`copying`,{element:e,mouseX:i,elements:m?t:void 0,boundsMultiple:_}),o=!1,s;try{o=await c(),o||(s=`Failed to copy`)}catch(e){s=kY(e,`Action failed`)}ot.updateAfterCopy(a,o,s)}else try{await c()}catch{}g?Kt():o.unfreeze()})},Sr=()=>{setTimeout(()=>{o.hideContextMenu()},0)},Cr=e=>{let{element:t,filePath:n,lineNumber:a,tagName:s,componentName:c,position:l,performWithFeedbackOptions:u,shouldDeferHideContextMenu:f,onBeforeCopy:p,onBeforePrompt:m,customEnterPromptMode:h}=e,g=i.frozenElements.length>0?i.frozenElements:[t],_=f?Sr:o.hideContextMenu,v={element:t,elements:g,filePath:n,lineNumber:a,componentName:c,tagName:s,enterPromptMode:h??(()=>{ot.clearAll(),rn(),m?.(),Ee(t,l.x,l.y),o.setPointer({x:l.x,y:l.y}),o.setFrozenElement(t),De(),d()||Gt(),_()}),enterEditMode:()=>{en(t,l,{filePath:n,lineNumber:a,componentName:c,tagName:s})&&rn(),_()},copy:()=>{rn(),p?.(),dt({element:t,cursorX:l.x,selectedElements:g.length>1?g:void 0,shouldDeactivateAfter:i.wasActivatedByToggle}),_()},hooks:{transformHtmlContent:r.hooks.transformHtmlContent,onOpenFile:r.hooks.onOpenFile,transformOpenFileUrl:r.hooks.transformOpenFileUrl},performWithFeedback:xr(t,g,s,c,u),hideContextMenu:_,cleanup:()=>{i.wasActivatedByToggle?Kt():o.unfreeze()}},y=r.hooks.transformActionContext(v);return{...v,...y}},wr=Y(()=>{let e=i.contextMenuElement;if(!e)return;let t=yr(),n=i.contextMenuPosition??s();return Cr({element:e,filePath:t?.filePath,lineNumber:t?.lineNumber??void 0,tagName:_r(),componentName:vr(),position:n,shouldDeferHideContextMenu:!0,onBeforeCopy:()=>{ye.clear()},customEnterPromptMode:()=>{ot.clearAll(),rn(),o.clearInputText(),o.enterPromptMode(n,e),Sr()}})}),Tr=()=>{setTimeout(()=>{o.hideContextMenu(),Kt()},0)},Er=()=>{if(!me)return null;let e=me.getBoundingClientRect(),t=SZ(e);return t===`left`||t===`right`?{x:t===`left`?e.right:e.left,y:e.top+e.height/2,edge:t}:{x:e.left+e.width/2,y:t===`top`?e.bottom:e.top,edge:t}},Dr=()=>{let e=Er();if(e)return e;let t=de.state();return t?{x:t.position.x,y:t.position.y,edge:`bottom`}:null},Or=(e,t)=>{let n=null,r=()=>{let i=e();i&&t(i),n=nI(r)};return r(),()=>{n!==null&&(rI(n),n=null)}};yR(()=>{if(!_t())return;let e=Or(Er,ue);ER(()=>{e(),ue(null)})});let kr=()=>{he?.(),he=null,oe(null)},Ar=()=>{o.hideContextMenu(),kr(),de.dismiss()},jr=()=>{ae()===null?(o.hideContextMenu(),de.isOpen()&&de.closePreservingRenderer(),he?.(),he=Or(Er,oe)):kr()},Mr=e=>{Ce({defaultAction:e})},Nr=e=>{let t=i.labelInstances.find(t=>t.id===e);if(!t?.element||!sB(t.element))return;let n=t.element,r=tY(eY(n)),a={x:t.mouseX??r.x,y:r.y},s=t.elements&&t.elements.length>0?t.elements.filter(e=>sB(e)):[n];setTimeout(()=>{kr(),de.isOpen()&&de.closePreservingRenderer(),d()||(o.setWasActivatedByToggle(!0),Gt()),o.setPointer(a),o.setFrozenElements(s),s.length>1&&t.bounds&&o.setFrozenDragRect(KY(t.bounds)),o.freeze(),o.showContextMenu(a,n)},0)};yR(()=>{let e=r.store.theme.hue;e===0?Zn.style.filter=``:Zn.style.filter=`hue-rotate(${e}deg)`}),r.store.theme.enabled&&Promise.resolve().then(()=>(DJ(),aW)).then(({ReactGrabRenderer:e})=>{t||(n=dz(()=>X(e,{get selectionVisible(){return ar()},get selectionBounds(){return Tt()},get selectionBoundsMultiple(){return Ft()},get selectionShouldSnap(){return i.frozenElements.length>0||Pt().length>0},get selectionElementsCount(){return i.frozenElements.length},get frozenLabelEntries(){return Lt()},get pendingShiftPreviewEntry(){return Rt()??void 0},get selectionFilePath(){return i.selectionFilePath??void 0},get selectionLineNumber(){return i.selectionLineNumber??void 0},get selectionTagName(){return or()},get selectionComponentName(){return Ze()},get selectionLabelVisible(){return sr()},selectionLabelStatus:`idle`,get hierarchyState(){return Bn()},get hierarchyMenuPosition(){return le()},get labelInstances(){return ur()},get dragVisible(){return fr()},get dragBounds(){return Nt()},get grabbedBoxes(){return dr()},get mouseX(){return aB(()=>i.frozenElements.length>1)()?void 0:Bt()??zt().x},get isFrozen(){return f()||d()||ne()},get inputValue(){return i.inputText},get isPromptMode(){return b()},onShowContextMenuInstance:Nr,get onLabelInstanceHoverChange(){return ot.handleHoverChange},get onInputChange(){return o.setInputText},onInputSubmit:()=>void Yt(),onToggleExpand:$t,get selectionLabelShakeCount(){return k()},onConfirmDismiss:Zt,get discardPrompt(){return aB(()=>!!ye.isPendingDismiss())()?{isKeyboardSelection:!0,onConfirm:Zt,onCopy:On}:S()?{onConfirm:Zt,onCancel:Qt}:void 0},get toolbarVisible(){return r.store.theme.toolbar.enabled},get isActive(){return d()},onToggleActive:sn,onActivateAction:on,get activeActionId(){return $e()},get enabled(){return T()},get shakeCount(){return D()},onToolbarStateChange:e=>{A(e),e.enabled!==T()&&(E(e.enabled),e.enabled||(qt(),Ar())),DZ.forEach(t=>t(e))},onSubscribeToToolbarStateChanges:e=>(DZ.add(e),()=>{DZ.delete(e)}),onToolbarSelectHoverChange:re,onToolbarRef:e=>{me=e},get contextMenuPosition(){return gr()},get contextMenuBounds(){return hr()},get contextMenuTagName(){return _r()},get contextMenuComponentName(){return vr()},get contextMenuHasFilePath(){return!!yr()?.filePath},get actions(){return r.store.actions},get actionContext(){return wr()},onContextMenuDismiss:Tr,onContextMenuHide:Sr,get toolbarMenuPosition(){return ae()},get toolbarMenuActions(){return r.store.actions.filter(e=>e.showInToolbarMenu===!0)},get defaultActionId(){return te()?.defaultAction??`copy`},onSetDefaultAction:Mr,onToggleToolbarMenu:jr,onToolbarMenuDismiss:kr,get editPanelState(){return de.state()},get editPanelPosition(){return se()},get onEditPanelDismiss(){return de.dismiss},get onEditPanelSubmit(){return de.submit},get onEditPanelPendingEditsChange(){return de.setPendingEdits},get onEditPanelInteractingChange(){return de.setInteracting}}),Zn))}).catch(e=>{console.warn(`[react-grab] Failed to load renderer:`,e)});let Pr={activate:()=>{o.setPendingCommentMode(!1),!d()&&T()&&Jt()},deactivate:()=>{(d()||_())&&Kt()},toggle:()=>{d()?Kt():T()&&Jt()},comment:dn,isActive:()=>d(),isEnabled:()=>T(),setEnabled:e=>{e!==T()&&(E(e),Ce({enabled:e,collapsed:!e}),e||(qt(),Ar()))},getToolbarState:()=>te()??zV(),setToolbarState:e=>{let t=te()??zV(),n=e.collapsed??t?.collapsed??!1,r={edge:e.edge??t?.edge??`bottom`,ratio:e.ratio??t?.ratio??.5,collapsed:n,enabled:e.enabled??!n,defaultAction:e.defaultAction??t?.defaultAction??`copy`};BV(r),A(r),r.enabled!==T()&&(E(r.enabled),r.enabled||(qt(),Ar())),DZ.forEach(e=>e(r))},onToolbarStateChange:e=>(DZ.add(e),()=>{DZ.delete(e)}),reset:()=>{qt(),Ar(),o.clearGrabbedBoxes(),o.clearLabelInstances(),o.setSelectionSource(null,null)},dispose:()=>{t=!0,EZ=!1,n?.(),he?.(),he=null,ge?.(),ge=null,DZ.clear(),e()},copyElement:async e=>{let t=Array.isArray(e)?e:[e];return t.length!==0&&await ct(t)},getSource:async e=>{let t=await BU(e);return t?{filePath:t.filePath,lineNumber:t.lineNumber,componentName:t.componentName}:null},getStackContext:e=>QU(e,{maxLines:r.store.options.maxContextLines}),getState:()=>({isActive:d(),isDragging:p(),isCopying:_(),isPromptMode:b(),isSelectionBoxVisible:!!ar(),isDragBoxVisible:!!fr(),targetElement:pt(),dragBounds:Nt()??null,grabbedBoxes:[...Vt()],labelInstances:[...Ht()],selectionFilePath:i.selectionFilePath,toolbarState:te()}),setOptions:e=>{r.setOptions(e)},registerPlugin:e=>{r.register(e,Pr)},unregisterPlugin:e=>{r.unregister(e)},getPlugins:()=>r.getPluginNames(),getDisplayName:VU};for(let e of TZ)r.register(e,Pr);return setTimeout(()=>{XF(!0)},TN),Pr})}})),AZ=r({DEFAULT_THEME:()=>QX,commentPlugin:()=>yZ,formatElementInfo:()=>tW,generateSnippet:()=>wZ,getGlobalApi:()=>MZ,getStack:()=>MU,init:()=>OZ,isInstrumentationActive:()=>dP,openPlugin:()=>xZ,registerPlugin:()=>IZ,setGlobalApi:()=>NZ,unregisterPlugin:()=>LZ}),jZ,MZ,NZ,PZ,FZ,IZ,LZ,RZ=t((()=>{kZ(),pR(),iW(),jZ=null,MZ=()=>typeof window>`u`?jZ:window.__REACT_GRAB__??jZ??null,NZ=e=>{jZ=e,typeof window<`u`&&(e?window.__REACT_GRAB__=e:delete window.__REACT_GRAB__)},PZ=[],FZ=e=>{for(;PZ.length>0;){let t=PZ.shift();t&&e.registerPlugin(t)}},IZ=e=>{let t=MZ();if(t){t.registerPlugin(e);return}PZ.push(e)},LZ=e=>{let t=MZ();if(t){t.unregisterPlugin(e);return}let n=PZ.findIndex(t=>t.name===e);n!==-1&&PZ.splice(n,1)},typeof window<`u`&&!window.__REACT_GRAB_DISABLED__&&(window.__REACT_GRAB__?jZ=window.__REACT_GRAB__:(jZ=OZ(),window.__REACT_GRAB__=jZ),FZ(jZ),window.dispatchEvent(new CustomEvent(`react-grab:init`,{detail:jZ})))}));Sr(),Br(),_D();var zZ=`linear-grab:context-copied`,BZ=`linear-grab:picker-activated`,VZ=`linear-grab:picker-finished`,HZ=0,UZ=null;function WZ(e){!e||e.grabbedAt===HZ||Tr().then(t=>{if(t.workflowMode!==`local`||e.grabbedAt===HZ)return;let n=()=>{HZ=e.grabbedAt,navigator.clipboard.writeText(pD(e,t)).then(()=>window.dispatchEvent(new CustomEvent(zZ))).catch(()=>{HZ=0})};e.source?.filePath?(UZ&&clearTimeout(UZ),UZ=null,n()):(UZ&&clearTimeout(UZ),UZ=setTimeout(n,900))})}function GZ(e,t=Date.now()){return{tagName:e.tagName||void 0,componentName:e.componentName||void 0,content:e.textContent?e.textContent.slice(0,500):``,source:e.filePath?{filePath:e.filePath,lineNumber:e.lineNumber??null,columnNumber:e.columnNumber??null,componentName:e.componentName??null}:null,stackContext:void 0,pageUrl:location.href,grabbedAt:t}}function KZ(e,t){let n=null,r=0;return{plugin:{name:`linear-grab`,hooks:{onElementSelect:i=>{r=Date.now(),n=Tr().then(e=>e.captureShots?YA(i):null);let a=t?.(),o={tagName:i.tagName?.toLowerCase()||void 0,componentName:a?.getDisplayName?.(i)||void 0,content:(i.textContent??``).slice(0,500),source:null,stackContext:void 0,pageUrl:location.href,grabbedAt:r};e([o]);try{a?.getSource?.(i)?.then(t=>{t?.filePath&&e([{...o,source:{filePath:t.filePath,lineNumber:t.lineNumber??null,columnNumber:t.columnNumber??null,componentName:t.componentName??o.componentName??null}}])})}catch{}}}},handleSelection(t){let i=r&&Date.now()-r<4e3?r:Date.now(),a=t.map((e,t)=>GZ(e,i+t));if(!a.length)return;e(a);let o=n;n=null,o&&o.then(t=>{t&&e([{...a[0],screenshotDataUrl:t},...a.slice(1)])})}}}var qZ=!1;async function JZ(){if(xr||qZ)return;qZ=!0;let e=await Promise.resolve().then(()=>(RZ(),AZ));try{e.init()}catch{qZ=!1;return}let t=KZ(e=>{kr(e),WZ(e[0])},()=>e.getGlobalApi());e.registerPlugin(t.plugin),KA(),window.addEventListener(`react-grab:element-selected`,e=>{t.handleSelection(e.detail.elements??[])})}async function YZ(){if(xr){let e=await chrome.runtime.sendMessage({type:`grab/activate`});if(e&&e.ok===!1)throw Error(e.error??`Cannot activate the picker on this page.`);return}await JZ();let e=await Promise.resolve().then(()=>(RZ(),AZ));window.dispatchEvent(new CustomEvent(BZ));let t=e.getGlobalApi();if(t?.activate?.(),typeof t?.isActive==`function`){let e=!1,n=0,r=setInterval(()=>{n+=1;let i=!1;try{i=t.isActive()}catch{}if(i){e=!0;return}(e||n>=8)&&(clearInterval(r),window.dispatchEvent(new CustomEvent(VZ)))},250);setTimeout(()=>clearInterval(r),3e5)}}function XZ(e){if(!xr)return()=>{};let t=t=>{t?.type===`grab/updated`&&e()};return chrome.runtime.onMessage.addListener(t),()=>chrome.runtime.onMessage.removeListener(t)}var ZZ=2500;function QZ(e){let t=e.x+e.w/2,n=e.y+e.h/2,r=document.elementFromPoint(t,n)??document.body,i=t=>{let n=t.getBoundingClientRect();return n.left<=e.x&&n.top<=e.y&&n.right>=e.x+e.w&&n.bottom>=e.y+e.h};for(;r!==document.body&&!i(r);)r=r.parentElement??document.body;return r}async function $Z(e){let t=null,n=document.createElement(`video`);try{t=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:`browser`},audio:!1,preferCurrentTab:!0,selfBrowserSurface:`include`}),n.srcObject=t,n.muted=!0,n.playsInline=!0,await n.play(),await new Promise(e=>setTimeout(e,250));let r=n.videoWidth/window.innerWidth,i=n.videoHeight/window.innerHeight;if(!n.videoWidth||r<=0||i<=0)return null;let a=document.createElement(`canvas`);a.width=Math.max(1,Math.round(e.w*r)),a.height=Math.max(1,Math.round(e.h*i));let o=a.getContext(`2d`);return o?(o.drawImage(n,e.x*r,e.y*i,e.w*r,e.h*i,0,0,a.width,a.height),a.toDataURL(`image/png`)):null}catch(e){return console.warn(`[linear-grab] tab-frame region capture failed:`,e),null}finally{n.srcObject=null,t?.getTracks().forEach(e=>e.stop())}}function eQ(){return new Promise(e=>{let t=document.createElement(`div`);t.setAttribute(`data-linear-grab`,`true`),t.style.cssText=`position:fixed;inset:0;z-index:2147483647;cursor:crosshair;user-select:none;`;let n=document.createElement(`div`);n.style.cssText=`position:fixed;display:none;border:2px solid #5e6ad2;border-radius:4px;box-shadow:0 0 0 100000px rgba(0,0,0,0.35);pointer-events:none;`,t.appendChild(n),document.body.appendChild(t);let r=0,i=0,a=!1,o=e=>({x:Math.min(r,e.clientX),y:Math.min(i,e.clientY),w:Math.abs(e.clientX-r),h:Math.abs(e.clientY-i)}),s=()=>{t.remove(),window.removeEventListener(`keydown`,l,!0)},c=()=>{s(),e(null)},l=e=>{e.key===`Escape`&&(e.stopPropagation(),c())};window.addEventListener(`keydown`,l,!0),t.addEventListener(`pointerdown`,e=>{a=!0,r=e.clientX,i=e.clientY,t.setPointerCapture(e.pointerId)}),t.addEventListener(`pointermove`,e=>{if(!a)return;let t=o(e);n.style.display=`block`,n.style.left=`${t.x}px`,n.style.top=`${t.y}px`,n.style.width=`${t.w}px`,n.style.height=`${t.h}px`}),t.addEventListener(`pointerup`,t=>{let n=o(t);if(s(),n.w<8||n.h<8)return e(null);(QZ(n).querySelectorAll(`*`).length>ZZ?$Z(n):Promise.race([XA(n),new Promise(e=>setTimeout(()=>{console.warn(`[linear-grab] region capture timed out after 4s — trying a tab frame`),e(null)},4e3))]).then(e=>e??$Z(n))).then(t=>{if(!t)return e(null);e({tagName:`region`,componentName:void 0,content:`Region capture ${Math.round(n.w)}×${Math.round(n.h)}`,source:null,stackContext:void 0,screenshotDataUrl:t,pageUrl:location.href,grabbedAt:Date.now()})})})})}Br(),Sr(),_D();var tQ=N(`<span class="text-text-faint ml-auto text-[10.5px] font-normal normal-case tabular-nums">`),nQ=N(`<details open class=group><summary class="text-text-dim hover:text-text flex cursor-pointer items-center gap-1.5 text-[11px] font-semibold tracking-wide uppercase select-none"><span aria-hidden class="text-text-faint inline-block w-3 text-center transition-transform group-open:rotate-90">›</span></summary><div class="flex flex-col gap-2 pt-2 pl-4">`),rQ=N(`<p class="text-warn text-[10.5px] leading-snug">Several captures resolve to the same source — this page region likely renders inside an iframe/canvas the picker can't see into. Use <b>Capture region</b> for visual pointers there.`),iQ=N(`<span class="inline-block min-w-[8ch] text-center">`),aQ=N(`<div class="flex flex-col gap-1.5"><div class="flex flex-col gap-1.5"><span class="text-text-faint text-[10.5px] leading-snug">All elements post into ONE issue. Shift+click / drag selects several at once.</span><div class="flex items-center justify-end gap-1.5">`),oQ=N(`<div class="flex flex-col gap-1.5"><div class="flex gap-1.5">`),sQ=N(`<span class=text-danger>●`),cQ=N(`<div class="flex flex-col gap-1.5"><span class="text-text-faint text-[10.5px] leading-snug">Captures your screen as a looping GIF (max 30s) the coding agent can watch. Pick this tab in the share dialog, then reproduce the issue.`),lQ=N(`<span class="inline-block min-w-[4ch] text-center">Stop`),uQ=N(`<div class="bg-surface border-border flex items-center gap-2 rounded-lg border p-2.5"><span aria-hidden class="bg-danger size-2 shrink-0 animate-pulse rounded-full"></span><span class="text-text min-w-[5ch] text-[12px] tabular-nums"></span><span class="text-text-faint text-[10.5px]">max 0:30`),dQ=N(`<div class="bg-surface border-border flex items-center gap-2 rounded-lg border p-2.5"><span class="text-text-dim text-[12px]">Encoding GIF…`),fQ=N(`<div class="flex h-full flex-col gap-4 overflow-y-auto pt-3 pb-4 pl-3 pr-4">`),pQ=N(`<span class="text-success text-[12px] leading-none">✓`),mQ=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M4 4l8 8M12 4l-8 8">`),hQ=N(`<span class="font-mono text-text-dim break-all text-[11px] leading-snug">`),gQ=N(`<img alt="Element location screenshot"class="border-border bg-bg max-h-32 w-full rounded-md border object-contain">`),_Q=N(`<div class="bg-surface border-border flex flex-col gap-1.5 rounded-lg border p-2.5"><div class="flex items-center justify-between gap-2"><span class="font-mono text-accent min-w-0 truncate text-[12px]"></span><div class="flex shrink-0 items-center gap-1">`),vQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=9 height=9 rx=1.5></rect><path d="M10.5 5.5v-2a2 2 0 0 0-2-2h-5a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h2">`),yQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><rect x=2 y=2.5 width=12 height=11 rx=1.5></rect><path d="m2 10.5 3.5-3 3 2.5 3-2 2.5 2"></path><circle cx=6 cy=6 r=1 fill=currentColor stroke=none>`),bQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M8 2.5v8M4.5 7.5 8 11l3.5-3.5M2.5 13.5h11">`),xQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M2.5 4h11M6.5 4V2.5h3V4M4 4l.7 9a1.5 1.5 0 0 0 1.5 1.4h3.6A1.5 1.5 0 0 0 11.3 13l.7-9M6.5 7v4.5M9.5 7v4.5">`),SQ=N(`<div class="bg-surface border-border flex flex-col gap-2 rounded-lg border p-2.5"><img alt="Screen recording preview"class="border-border bg-bg max-h-44 w-full rounded-md border object-contain"><span class="text-text-faint text-[10.5px] tabular-nums"> KB · <!>s · <!>×</span><label class="flex cursor-pointer items-center gap-2 select-none"><input type=checkbox class="accent-accent rounded"><span class="text-text text-[12px]">Attach to issue on create</span></label><div class="flex items-center gap-1">`),CQ=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M6.5 9.5 9.5 6.5M7.5 4.5 9 3a2.5 2.5 0 0 1 3.5 3.5L11 8M8.5 11.5 7 13a2.5 2.5 0 0 1-3.5-3.5L5 8">`);function wQ(e){return(()=>{var t=nQ(),n=t.firstChild;n.firstChild;var r=n.nextSibling;return P(n,()=>e.title,null),P(n,j(M,{get when(){return e.badge},get children(){var t=tQ();return P(t,()=>e.badge),t}}),null),P(r,()=>e.children),t})()}function TQ(){let e=sr(),t=_r(()=>({queryKey:[`grab`],queryFn:Dr})),n=_r(()=>({queryKey:[`settings`],queryFn:Tr})),r=()=>t.data??[],i=()=>!!(n.data?.linearApiKey||n.data?.linearAccessToken),[a,o]=T(null),s=()=>{o(null),YZ().catch(e=>{o(e instanceof Error&&e.message?e.message:`Cannot activate the picker — open your dev app in the active tab first.`)})},c=async()=>{await jr(),e.invalidateQueries({queryKey:[`grab`]})},[l,u]=T(!1),d=async()=>{let e=(r()??[]).map(e=>`- <${e.componentName??e.tagName??`element`}>${e.source?.filePath?` — ${e.source.filePath}${e.source.lineNumber==null?``:`:${e.source.lineNumber}`}`:``}${e.screenshotDataUrl?` (screenshot captured — use Copy PNG to paste it)`:``}`),t=`Captured on ${r()?.[0]?.pageUrl??location.href}:\n${e.join(`
|
|
264
264
|
`)}`;try{await navigator.clipboard.writeText(t),u(!0),setTimeout(()=>u(!1),1800)}catch{}},[f,p]=T(null),m=async(e,t)=>{try{await navigator.clipboard.write([new ClipboardItem({"image/png":nj(t)})]),p(e),setTimeout(()=>p(null),1800)}catch{}},[h,g]=T(null),_=async e=>{try{await navigator.clipboard.writeText(pD(e,n.data??{})),g(e.grabbedAt),setTimeout(()=>g(null),1800)}catch{o(`Clipboard was blocked — click the button again.`)}},v=async t=>{await Ar(t),e.invalidateQueries({queryKey:[`grab`]})},[y,b]=T(!1),x=async()=>{o(null),b(!0),window.dispatchEvent(new CustomEvent(BZ));try{let e=await eQ();e?await kr([e]):o(`Region capture failed or was cancelled. On heavy pages a "share this tab" prompt appears — pick THIS tab to capture. Details in the console ([linear-grab]).`)}finally{b(!1),window.dispatchEvent(new CustomEvent(`linear-grab:picker-finished`))}},[S,C]=T(UD());ae(WD(C));let[w,E]=T(0);O(()=>{if(S().phase!==`recording`)return;let e=setInterval(()=>E(Date.now()-(UD().startedAt??Date.now())),250);ae(()=>clearInterval(e))});let k=e=>{let t=Math.floor(e/1e3);return`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`},[ee,te]=T(`idle`),[A,ne]=T(null),re=async()=>{let e=UD().result;if(!e)throw Error(`No recording available.`);if(e.assetUrl)return e.assetUrl;let t=await Promise.race([OO(e.blob,`recording-${Date.now()}.gif`),new Promise((e,t)=>setTimeout(()=>t(Error(`upload timed out`)),6e4))]);return iO(t),t},ie=async()=>{ne(null),te(`busy`);try{let e=re().then(e=>new Blob([``],{type:`text/plain`}));try{await navigator.clipboard.write([new ClipboardItem({"text/plain":e})])}catch{let t=await e;await navigator.clipboard.writeText(await t.text())}te(`copied`),setTimeout(()=>te(`idle`),2e3)}catch{te(`idle`),await le(),ne(`Direct upload is blocked in this browser — copied the GIF instead. Paste it into a Linear comment and Linear uploads it.`)}},oe=()=>{let e=S().result;if(!e)return;let t=document.createElement(`a`);t.href=e.url,t.download=`linear-grab-recording.gif`,t.click()},[se,ce]=T(`idle`),le=async()=>{let e=S().result;if(e){ne(null),ce(`busy`);try{try{await navigator.clipboard.write([new ClipboardItem({"image/gif":e.blob})])}catch{let t=await createImageBitmap(e.blob),n=document.createElement(`canvas`);n.width=t.width,n.height=t.height,n.getContext(`2d`).drawImage(t,0,0);let r=await new Promise((e,t)=>n.toBlob(n=>n?e(n):t(Error(`PNG encode failed`)),`image/png`));await navigator.clipboard.write([new ClipboardItem({"image/png":r})]),ne(`Browser blocks GIF clipboard — copied the first frame as PNG. Use Download for the animation.`)}ce(`copied`),setTimeout(()=>ce(`idle`),2e3)}catch(e){ce(`idle`),ne(e instanceof Error?e.message:`Copy failed.`)}}};return(()=>{var e=fQ();return P(e,j(wQ,{title:`Captured elements`,get badge(){return $e(()=>!!r().length)()?`${r().length}/8`:void 0},get children(){return[j(M,{get when(){return r().length>0},get fallback(){return j(Vj,{title:`No elements captured`,children:`Click "Pick element" below, then use the react-grab overlay on your dev app. Every pick ADDS to this list — Shift+click or drag in the overlay selects several at once. Source info needs a dev build.`})},get children(){var e=aQ(),t=e.firstChild,n=t.firstChild.nextSibling;return P(e,j(We,{get each(){return r()},children:e=>(()=>{var t=_Q(),n=t.firstChild.firstChild,r=n.nextSibling;return P(n,(()=>{var t=$e(()=>!!e.componentName);return()=>t()?`<${e.componentName}>`:$e(()=>!!e.tagName)()?`<${e.tagName}>`:`Element`})()),P(r,j(q,{class:`size-7 px-0`,variant:`ghost`,title:`Copy context for a local agent (Claude Code / Cursor) — includes skills & memory paths`,"aria-label":`Copy context`,onClick:()=>void _(e),get children(){return j(M,{get when(){return h()===e.grabbedAt},get fallback(){return vQ()},get children(){return pQ()}})}}),null),P(r,j(M,{get when(){return e.screenshotDataUrl},get children(){return j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return f()===e.grabbedAt?`Copied!`:`Copy PNG — paste into Claude Code, Linear, Slack…`},"aria-label":`Copy capture as PNG`,onClick:()=>void m(e.grabbedAt,e.screenshotDataUrl),get children(){return j(M,{get when(){return f()===e.grabbedAt},get fallback(){return yQ()},get children(){return pQ()}})}})}}),null),P(r,j(q,{class:`size-7 px-0`,variant:`ghost`,title:`Remove this element`,"aria-label":`Remove element`,onClick:()=>void v(e.grabbedAt),get children(){return mQ()}}),null),P(t,j(M,{get when(){return e.source?.filePath},get children(){var t=hQ();return P(t,()=>e.source.filePath,null),P(t,(()=>{var t=$e(()=>e.source?.lineNumber!=null);return()=>t()?`:${e.source.lineNumber}`:``})(),null),t}}),null),P(t,j(M,{get when(){return e.screenshotDataUrl},get children(){var t=gQ();return D(()=>it(t,`src`,e.screenshotDataUrl)),t}}),null),t})()}),t),P(e,j(M,{get when(){return new Set(r().filter(e=>e.source?.filePath).map(e=>`${e.source.filePath}:${e.source.lineNumber??``}`)).size<r().filter(e=>e.source?.filePath).length},get children(){return rQ()}}),t),P(n,j(q,{class:`h-6 shrink-0 px-2 text-[11px]`,variant:`ghost`,title:`Copy all captures as plain text — paste into a Claude Code session`,onClick:()=>void d(),get children(){var e=iQ();return P(e,()=>l()?`Copied ✓`:`Copy all`),e}}),null),P(n,j(q,{class:`h-6 shrink-0 px-2 text-[11px]`,variant:`ghost`,onClick:c,children:`Clear all`}),null),e}}),(()=>{var e=oQ(),t=e.firstChild;return P(t,j(q,{variant:`primary`,class:`min-w-0 flex-1`,onClick:s,children:`Pick element`}),null),P(t,j(M,{when:!xr,get children(){return j(q,{variant:`ghost`,class:`min-w-0 flex-1`,get loading(){return y()},title:`Drag a rectangle over any part of the page — the shot attaches to the issue`,onClick:()=>void x(),children:`Capture region`})}}),null),P(e,j(M,{get when(){return a()},get children(){return j(Hj,{get message(){return a()}})}}),null),e})()]}}),null),P(e,j(wQ,{title:`Recording`,get badge(){return $e(()=>!!S().result)()?`${(S().result.durationMs/1e3).toFixed(1)}s`:void 0},get children(){return[j(M,{get when(){return S().phase===`idle`||S().phase===`error`},get children(){var e=cQ(),t=e.firstChild;return P(e,j(q,{variant:`ghost`,onClick:()=>void eO(),get children(){return[sQ(),` Record interaction`]}}),t),P(e,j(M,{get when(){return $e(()=>S().phase===`error`)()&&S().error},get children(){return j(Hj,{get message(){return S().error}})}}),null),e}}),j(M,{get when(){return S().phase===`recording`},get children(){var e=uQ(),t=e.firstChild.nextSibling;return t.nextSibling,P(t,()=>k(w())),P(e,j(q,{variant:`primary`,class:`ml-auto`,onClick:()=>void tO(),get children(){return lQ()}}),null),e}}),j(M,{get when(){return S().phase===`processing`},get children(){var e=dQ(),t=e.firstChild;return P(e,j(Aj,{}),t),e}}),j(M,{get when(){return $e(()=>S().phase===`ready`)()&&S().result},children:e=>(()=>{var t=SQ(),n=t.firstChild,r=n.nextSibling,a=r.firstChild,o=a.nextSibling,s=o.nextSibling.nextSibling;s.nextSibling;var c=r.nextSibling,l=c.firstChild,u=c.nextSibling;return P(r,()=>(e().blob.size/1024).toFixed(0),a),P(r,()=>(e().durationMs/1e3).toFixed(1),o),P(r,()=>e().width,s),P(r,()=>e().height,null),l.addEventListener(`change`,e=>rO(e.currentTarget.checked)),P(u,j(q,{variant:`ghost`,class:`size-7 px-0`,get loading(){return ee()===`busy`},get disabled(){return!i()},get title(){return i()?`Copy markdown — uploads to Linear, copies embeddable link`:`Connect Linear in Settings first`},"aria-label":`Copy markdown`,onClick:()=>void ie(),get children(){return j(M,{get when(){return ee()===`copied`},get fallback(){return CQ()},get children(){return pQ()}})}}),null),P(u,j(q,{variant:`ghost`,class:`size-7 px-0`,get loading(){return se()===`busy`},title:`Copy GIF — paste into a Linear comment and Linear uploads it`,"aria-label":`Copy GIF`,onClick:()=>void le(),get children(){return j(M,{get when(){return se()===`copied`},get fallback(){return vQ()},get children(){return pQ()}})}}),null),P(u,j(q,{variant:`ghost`,class:`size-7 px-0`,title:`Download GIF`,"aria-label":`Download GIF`,onClick:oe,get children(){return bQ()}}),null),P(u,j(q,{variant:`danger`,class:`ml-auto size-7 px-0`,title:`Discard recording`,"aria-label":`Discard recording`,onClick:nO,get children(){return xQ()}}),null),P(t,j(M,{get when(){return A()},get children(){return j(Hj,{get message(){return A()}})}}),null),D(()=>it(n,`src`,e().url)),D(()=>l.checked=S().attachOnCreate),t})()})]}}),null),e})()}function EQ(e,t,n){let r=Array(e);return new Proxy(r,{get(r,i,a){if(typeof i==`string`){let a=i.charCodeAt(0);if(a>=48&&a<=57){let a=+i;if(Number.isInteger(a)&&a>=0&&a<e){let e=r[a];if(!e){let i=t[a*2];e=r[a]={index:a,key:n(a),start:i,size:t[a*2+1],end:i+t[a*2+1],lane:0}}return e}}if(i===`length`)return e}return Reflect.get(r,i,a)}})}function DQ(e,t,n){let r=n.initialDeps??[],i,a=!0;function o(){let o=e();return o.length!==r.length||o.some((e,t)=>r[t]!==e)?(r=o,i=t(...o),n?.onChange&&!(a&&n.skipInitialOnChange)&&n.onChange(i),a=!1,i):i}return o.updateDeps=e=>{r=e},o}function OQ(e,t){if(e===void 0)throw Error(`Unexpected undefined${t?`: ${t}`:``}`);return e}var kQ=(e,t)=>Math.abs(e-t)<1.01,AQ=(e,t,n)=>{let r;return function(...i){e.clearTimeout(r),r=e.setTimeout(()=>t.apply(this,i),n)}},jQ,MQ=()=>{if(jQ!==void 0)return jQ;if(typeof navigator>`u`)return jQ=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return jQ=!0;let e=navigator.maxTouchPoints;return jQ=navigator.platform===`MacIntel`&&e!==void 0&&e>0},NQ=e=>{let{offsetWidth:t,offsetHeight:n}=e;return{width:t,height:n}},PQ=e=>e,FQ=e=>{let t=Math.max(e.startIndex-e.overscan,0),n=Math.min(e.endIndex+e.overscan,e.count-1)-t+1,r=Array(n);for(let e=0;e<n;e++)r[e]=t+e;return r},IQ=(e,t)=>{let n=e.scrollElement;if(!n)return;let r=e.targetWindow;if(!r)return;let i=e=>{let{width:n,height:r}=e;t({width:Math.round(n),height:Math.round(r)})};if(i(NQ(n)),!r.ResizeObserver)return()=>{};let a=new r.ResizeObserver(t=>{let r=()=>{let e=t[0];if(e?.borderBoxSize){let t=e.borderBoxSize[0];if(t){i({width:t.inlineSize,height:t.blockSize});return}}i(NQ(n))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(r):r()});return a.observe(n,{box:`border-box`}),()=>{a.unobserve(n)}},LQ={passive:!0},RQ=typeof window>`u`||`onscrollend`in window,zQ=(e,t,n)=>{let r=e.scrollElement;if(!r)return;let i=e.targetWindow;if(!i)return;let a=e.options.useScrollendEvent&&RQ,o=0,s=a?null:AQ(i,()=>t(o,!1),e.options.isScrollingResetDelay),c=e=>()=>{o=n(r),s?.(),t(o,e)},l=c(!0),u=c(!1);return r.addEventListener(`scroll`,l,LQ),a&&r.addEventListener(`scrollend`,u,LQ),()=>{r.removeEventListener(`scroll`,l),a&&r.removeEventListener(`scrollend`,u)}},BQ=(e,t)=>zQ(e,t,t=>{let{horizontal:n,isRtl:r}=e.options;return n?t.scrollLeft*(r&&-1||1):t.scrollTop}),VQ=(e,t,n)=>{if(n.options.useCachedMeasurements){let t=n.indexFromElement(e),r=n.options.getItemKey(t);return n.itemSizeCache.get(r)??n.options.estimateSize(t)}if(t?.borderBoxSize){let e=t.borderBoxSize[0];if(e)return Math.round(e[n.options.horizontal?`inlineSize`:`blockSize`])}if(!t){let t=n.indexFromElement(e),r=n.options.getItemKey(t),i=n.itemSizeCache.get(r);if(i!==void 0)return i}return e[n.options.horizontal?`offsetWidth`:`offsetHeight`]},HQ=(e,{adjustments:t=0,behavior:n},r)=>{var i,a;(a=(i=r.scrollElement)?.scrollTo)==null||a.call(i,{[r.options.horizontal?`left`:`top`]:e+t,behavior:n})},UQ=class{constructor(e){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._flatMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.pendingScrollAnchor=null,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this.elementsCache=new Map,this.now=()=>{var e;return((e=this.targetWindow?.performance)?.now)?.call(e)??Date.now()},this.observer=(()=>{let e=null,t=()=>e||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:e=new this.targetWindow.ResizeObserver(e=>{e.forEach(e=>{let t=()=>{let t=e.target,n=this.indexFromElement(t);if(!t.isConnected){this.observer.unobserve(t);for(let[e,n]of this.elementsCache)if(n===t){this.elementsCache.delete(e);break}return}this.shouldMeasureDuringScroll(n)&&this.resizeItem(n,this.options.measureElement(t,e,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(t):t()})}));return{disconnect:()=>{var n;(n=t())==null||n.disconnect(),e=null},observe:e=>t()?.observe(e,{box:`border-box`}),unobserve:e=>t()?.unobserve(e)}})(),this.range=null,this.setOptions=e=>{let t={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:PQ,rangeExtractor:FQ,onChange:()=>{},measureElement:VQ,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:`data-index`,initialMeasurementsCache:[],lanes:1,anchorTo:`start`,followOnAppend:!1,scrollEndThreshold:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:`estimate`,useCachedMeasurements:!1};for(let n in e){let r=e[n];r!==void 0&&(t[n]=r)}let n=this.options,r=null,i=null,a=!1;if(n!==void 0&&n.enabled&&t.enabled&&t.anchorTo===`end`&&this.scrollElement!==null){let e=n.count,o=t.count,s=this.getMeasurements(),c=e>0?s[0]?.key??n.getItemKey(0):null,l=e>0?s[e-1]?.key??n.getItemKey(e-1):null;if(o!==e||e>0&&o>0&&(t.getItemKey(0)!==c||t.getItemKey(o-1)!==l)){a=!0;let c=e>0?this.getVirtualItemForOffset(this.getScrollOffset())??s[0]:null;c&&(r=[c.key,this.getScrollOffset()-c.start]);let u=t.followOnAppend===!0?`auto`:t.followOnAppend||null;u&&o>e&&this.isAtEnd(n.scrollEndThreshold)&&(e===0||t.getItemKey(o-1)!==l)&&(i=u)}}this.options=t,a&&(this.pendingMin=0,this.itemSizeCacheVersion++);let o=!1,s=0;if(r&&this.scrollOffset!==null){let[e,t]=r,n=this.getMeasurements(),{count:i,getItemKey:a}=this.options,c=0;for(;c<i&&a(c)!==e;)c++;if(c<i){let e=n[c];if(e){let n=e.start+t;n!==this.scrollOffset&&(s=n-this.scrollOffset,this.scrollOffset=n,o=!0)}}}(o||i)&&(this.pendingScrollAnchor=[o?r[0]:null,o?r[1]:0,i,s])},this.notify=e=>{var t,n;(n=(t=this.options).onChange)==null||n.call(t,this,e)},this.maybeNotify=DQ(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{let e=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==e){if(this.cleanup(),!e){this.maybeNotify();return}if(this.scrollElement=e,this.scrollElement&&`ownerDocument`in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=this.scrollElement?.window??null,this.elementsCache.forEach(e=>{this.observer.observe(e)}),this.unsubs.push(this.options.observeElementRect(this,e=>{this.scrollRect=e,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(e,t)=>{if(t&&this._intendedScrollOffset===null&&e===this.scrollOffset)return;this._intendedScrollOffset!==null&&Math.abs(e-this._intendedScrollOffset)<1.5&&(e=this._intendedScrollOffset),this._intendedScrollOffset=null,this.scrollAdjustments=0;let n=this.getScrollOffset();this.scrollDirection=t?n===e?this.scrollDirection:n<e?`forward`:`backward`:null,this.scrollOffset=e,this.isScrolling=t,this._flushIosDeferredIfReady(),this.scrollState&&this.scheduleScrollReconcile(),this.maybeNotify()})),`addEventListener`in this.scrollElement){let e=this.scrollElement,t=()=>{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},n=()=>{this._iosTouching=!1,!(!MQ()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};e.addEventListener(`touchstart`,t,LQ),e.addEventListener(`touchend`,n,LQ),this.unsubs.push(()=>{e.removeEventListener(`touchstart`,t),e.removeEventListener(`touchend`,n),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}let t=this.pendingScrollAnchor;if(this.pendingScrollAnchor=null,t&&this.scrollElement&&this.options.enabled){let[e,n,r,i]=t;e!==null&&!r&&(MQ()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?i!==0&&(this._iosDeferredAdjustment+=i):this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})),r&&this.scrollToEnd({behavior:r})}},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;let e=this.getScrollOffset(),t=this.getMaxScrollOffset();if(e<0||e>t)return;let n=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(e,{adjustments:this.scrollAdjustments+=n,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?`width`:`height`]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset==`function`?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getMeasurementOptions=DQ(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode,this.options.gap],(e,t,n,r,i,a,o,s)=>(this.prevLanes!==void 0&&this.prevLanes!==a&&(this.lanesChangedFlag=!0),this.prevLanes=a,this.pendingMin=null,{count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i,lanes:a,laneAssignmentMode:o,gap:s}),{key:!1}),this.getMeasurements=DQ(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i,lanes:a,laneAssignmentMode:o,gap:s},c)=>{let l=this.itemSizeCache;if(!i)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>e)for(let t of this.laneAssignments.keys())t>=e&&this.laneAssignments.delete(t);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(e=>{this.itemSizeCache.set(e.key,e.size)}));let u=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===e&&(this.lanesSettling=!1),a===1){let i=e*2,a=this._flatMeasurements;if(!a||a.length<i){let e=new Float64Array(i);a&&u>0&&e.set(a.subarray(0,u*2)),a=e,this._flatMeasurements=a}let o;if(u===0)o=t+n;else{let e=u-1;o=a[e*2]+a[e*2+1]+s}for(let t=u;t<e;t++){let e=r(t),n=l.get(e),i=typeof n==`number`?n:this.options.estimateSize(t);a[t*2]=o,a[t*2+1]=i,o+=i+s}let c=EQ(e,a,r);return this.measurementsCache=c,c}let d=this.measurementsCache.slice(0,u),f=Array(a).fill(void 0),p=new Float64Array(a),m=0;for(let e=0;e<u;e++){let t=d[e];t&&(f[t.lane]===void 0&&m++,f[t.lane]=e,p[t.lane]=t.end)}for(let i=u;i<e;i++){let e=r(i),c=this.laneAssignments.get(i),u,h,g=o===`estimate`||l.has(e);if(c!==void 0&&this.options.lanes>1){u=c;let e=f[u],r=e===void 0?void 0:d[e];h=r?r.end+s:t+n}else if(m===a){let e=0,t=p[0],n=f[0];for(let r=1;r<a;r++){let i=p[r];(i<t||i===t&&f[r]<n)&&(e=r,t=i,n=f[r])}u=e,h=t+s,g&&this.laneAssignments.set(i,u)}else u=i%this.options.lanes,h=t+n,g&&this.laneAssignments.set(i,u);let _=l.get(e),v=typeof _==`number`?_:this.options.estimateSize(i),y=h+v;d[i]={index:i,start:h,size:v,end:y,key:e,lane:u},f[u]===void 0&&m++,f[u]=i,p[u]=y}return this.measurementsCache=d,d},{key:!1,debug:()=>this.options.debug}),this.calculateRange=DQ(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,t,n,r)=>e.length===0||t===0?(this.range=null,null):(this.range=KQ(e,t,n,r,r===1&&this._flatMeasurements!=null?this._flatMeasurements:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=DQ(()=>{let e=null,t=null,n=this.calculateRange();return n&&(e=n.startIndex,t=n.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,t]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,t]},(e,t,n,r,i)=>r===null||i===null?[]:e({startIndex:r,endIndex:i,overscan:t,count:n}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{let t=this.options.indexAttribute,n=e.getAttribute(t);return n?parseInt(n,10):(console.warn(`Missing attribute name '${t}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=e=>{if(!this.scrollState||this.scrollState.behavior!==`smooth`)return!0;let t=this.scrollState.index??this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)?.index;if(t!==void 0&&this.range){let n=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),r=Math.max(0,t-n),i=Math.min(this.options.count-1,t+n);return e>=r&&e<=i}return!0},this.measureElement=e=>{if(!e){this.elementsCache.forEach((e,t)=>{e.isConnected||(this.observer.unobserve(e),this.elementsCache.delete(t))});return}let t=this.indexFromElement(e),n=this.options.getItemKey(t),r=this.elementsCache.get(n);r!==e&&(r&&this.observer.unobserve(r),this.observer.observe(e),this.elementsCache.set(n,e)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(t)&&this.resizeItem(t,this.options.measureElement(e,void 0,this))},this.resizeItem=(e,t)=>{if(e<0||e>=this.options.count)return;let n,r,i,a=this._flatMeasurements;if(this.options.lanes===1&&a!==null)i=this.options.getItemKey(e),r=a[e*2],n=a[e*2+1];else{let t=this.measurementsCache[e];if(!t)return;i=t.key,r=t.start,n=t.size}let o=t-(this.itemSizeCache.get(i)??n);if(o!==0){let a=this.options.anchorTo===`end`&&this.scrollState?.behavior!==`smooth`&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,s=a?this.getTotalSize():0,c=this.scrollState?.behavior!==`smooth`&&(this.shouldAdjustScrollPositionOnItemSizeChange===void 0?r<this.getScrollOffset()+this.scrollAdjustments&&(!this.itemSizeCache.has(i)||this.scrollDirection!==`backward`):this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[e]??{index:e,key:i,start:r,size:n,end:r+n,lane:0},o,this));(this.pendingMin===null||e<this.pendingMin)&&(this.pendingMin=e),this.itemSizeCache.set(i,t),this.itemSizeCacheVersion++,a?this.applyScrollAdjustment(this.getTotalSize()-s):c&&this.applyScrollAdjustment(o),this.notify(!1)}},this.getVirtualItems=DQ(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,t)=>{let n=[];for(let r=0,i=e.length;r<i;r++){let i=t[e[r]];n.push(i)}return n},{key:!1,debug:()=>this.options.debug}),this.getVirtualItemForOffset=e=>{let t=this.getMeasurements();if(t.length===0)return;let n=this._flatMeasurements,r=this.options.lanes===1&&n!=null;return OQ(t[WQ(0,t.length-1,r?e=>n[e*2]:e=>OQ(t[e]).start,e)])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if(`scrollHeight`in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{let e=this.scrollElement.document.documentElement;return this.options.horizontal?e.scrollWidth-this.scrollElement.innerWidth:e.scrollHeight-this.scrollElement.innerHeight}},this.getVirtualDistanceFromEnd=()=>Math.max(this.getTotalSize()-this.getSize()-this.getScrollOffset(),0),this.getDistanceFromEnd=()=>Math.max(this.getMaxScrollOffset()-this.getScrollOffset(),0),this.isAtEnd=(e=this.options.scrollEndThreshold)=>this.getDistanceFromEnd()<=e,this.getOffsetForAlignment=(e,t,n=0)=>{if(!this.scrollElement)return 0;let r=this.getSize(),i=this.getScrollOffset();t===`auto`&&(t=e>=i+r?`end`:`start`),t===`center`?e+=(n-r)/2:t===`end`&&(e-=r);let a=this.getMaxScrollOffset();return Math.max(Math.min(a,e),0)},this.getOffsetForIndex=(e,t=`auto`)=>{e=Math.max(0,Math.min(e,this.options.count-1));let n=this.getSize(),r=this.getScrollOffset(),i=this.measurementsCache[e];if(!i)return;if(t===`auto`)if(i.end>=r+n-this.options.scrollPaddingEnd)t=`end`;else if(i.start<=r+this.options.scrollPaddingStart)t=`start`;else return[r,t];if(t===`end`&&e===this.options.count-1)return[this.getMaxScrollOffset(),t];let a=t===`end`?i.end+this.options.scrollPaddingEnd:i.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(a,t,i.size),t]},this.scrollToOffset=(e,{align:t=`start`,behavior:n=`auto`}={})=>{let r=this.getOffsetForAlignment(e,t),i=this.now();this.scrollState={index:null,align:t,behavior:n,startedAt:i,lastTargetOffset:r,stableFrames:0},this._scrollToOffset(r,{adjustments:void 0,behavior:n}),this.scheduleScrollReconcile()},this.scrollToIndex=(e,{align:t=`auto`,behavior:n=`auto`}={})=>{e=Math.max(0,Math.min(e,this.options.count-1));let r=this.getOffsetForIndex(e,t);if(!r)return;let[i,a]=r,o=this.now();this.scrollState={index:e,align:a,behavior:n,startedAt:o,lastTargetOffset:i,stableFrames:0},this._scrollToOffset(i,{adjustments:void 0,behavior:n}),this.scheduleScrollReconcile()},this.scrollBy=(e,{behavior:t=`auto`}={})=>{let n=this.getScrollOffset()+e,r=this.now();this.scrollState={index:null,align:`start`,behavior:t,startedAt:r,lastTargetOffset:n,stableFrames:0},this._scrollToOffset(n,{adjustments:void 0,behavior:t}),this.scheduleScrollReconcile()},this.scrollToEnd=({behavior:e=`auto`}={})=>{if(this.options.count>0){this.scrollToIndex(this.options.count-1,{align:`end`,behavior:e});return}this.scrollToOffset(Math.max(this.getTotalSize()-this.getSize(),0),{behavior:e})},this.getTotalSize=()=>{let e=this.getMeasurements(),t;if(e.length===0)t=this.options.paddingStart;else if(this.options.lanes===1){let n=e.length-1,r=this._flatMeasurements;t=r==null?e[n]?.end??0:r[n*2]+r[n*2+1]}else{let n=Array(this.options.lanes).fill(null),r=e.length-1;for(;r>=0&&n.some(e=>e===null);){let t=e[r];n[t.lane]===null&&(n[t.lane]=t.end),r--}t=Math.max(...n.filter(e=>e!==null))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{let e=[];if(this.itemSizeCache.size===0)return e;let t=this.getMeasurements();for(let n of t)n&&this.itemSizeCache.has(n.key)&&e.push({index:n.index,key:n.key,start:n.start,size:n.size,end:n.end,lane:n.lane});return e},this._scrollToOffset=(e,{adjustments:t,behavior:n})=>{this._intendedScrollOffset=e+(t??0),this.options.scrollToFn(e,{behavior:n,adjustments:t},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(e)}applyScrollAdjustment(e,t){e!==0&&(MQ()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?this._iosDeferredAdjustment+=e:(this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=e,behavior:t}),this.scrollOffset!==null&&(this.scrollOffset+=this.scrollAdjustments,this.scrollAdjustments=0)))}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId??=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()})}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}let e=this.scrollState.index==null?void 0:this.getOffsetForIndex(this.scrollState.index,this.scrollState.align),t=e?e[0]:this.scrollState.lastTargetOffset,n=t!==this.scrollState.lastTargetOffset;if(!n&&kQ(t,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=1){this.getScrollOffset()!==t&&this._scrollToOffset(t,{adjustments:void 0,behavior:`auto`}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,n){let e=this.getSize()||600,n=Math.abs(t-this.getScrollOffset()),r=this.scrollState.behavior===`smooth`&&n>e;this.scrollState.lastTargetOffset=t,r||(this.scrollState.behavior=`auto`),this._scrollToOffset(t,{adjustments:void 0,behavior:r?`smooth`:`auto`})}this.scheduleScrollReconcile()}},WQ=(e,t,n,r)=>{for(;e<=t;){let i=(e+t)/2|0,a=n(i);if(a<r)e=i+1;else if(a>r)t=i-1;else return i}return e>0?e-1:0};function GQ(e,t,n){let r=0;for(;r<=t;){let i=(r+t)/2|0,a=e[i*2];if(a<n)r=i+1;else if(a>n)t=i-1;else return i}return r>0?r-1:0}function KQ(e,t,n,r,i){let a=e.length-1;if(e.length<=r)return{startIndex:0,endIndex:a};if(r===1&&i!==null){let e=GQ(i,a,n),r=e,o=n+t;for(;r<a&&i[r*2]+i[r*2+1]<o;)r++;return{startIndex:e,endIndex:r}}let o=WQ(0,a,t=>e[t].start,n),s=o;if(r===1)for(;s<a&&e[s].end<n+t;)s++;else if(r>1){let i=Array(r).fill(0);for(;s<a&&i.some(e=>e<n+t);){let t=e[s];i[t.lane]=t.end,s++}let c=Array(r).fill(n+t);for(;o>=0&&c.some(e=>e>=n);){let t=e[o];c[t.lane]=t.start,o--}o=Math.max(0,o-o%r),s=Math.min(a,s+(r-1-s%r))}return{startIndex:o,endIndex:s}}function qQ(e){let t=Ve(e),n=new UQ(t),[r,i]=tr(n.getVirtualItems()),[a,o]=T(n.getTotalSize()),s=new Proxy(n,{get(e,t){switch(t){case`getVirtualItems`:return()=>r;case`getTotalSize`:return()=>a();default:return Reflect.get(e,t)}}});return s.setOptions(t),ie(()=>{let e=s._didMount();s._willUpdate(),ae(e)}),E(()=>{s.setOptions(Ve(t,e,{onChange:(t,n)=>{var r;t._willUpdate(),i(ar(t.getVirtualItems(),{key:`index`})),o(t.getTotalSize()),(r=e.onChange)==null||r.call(e,t,n)}})),s._willUpdate(),i(ar(n.getVirtualItems(),{key:`index`})),o(n.getTotalSize())}),s}function JQ(e){return qQ(Ve({observeElementRect:IQ,observeElementOffset:BQ,scrollToFn:HQ},e))}Br();var YQ=3e4,XQ=/github\.com\/[^/]+\/[^/]+\/pull\/\d+/i,ZQ={running:[],review:[]},QQ=null,$Q=new Set;function e$(e){return $Q.add(e),QQ||(QQ=setInterval(()=>void r$(),YQ),r$()),()=>{$Q.delete(e),!$Q.size&&QQ&&(clearInterval(QQ),QQ=null)}}function t$(){r$()}function n$(e){return{id:e.id,identifier:e.identifier,title:e.title,stateName:e.state.name,stateColor:e.state.color,delegateName:e.delegate?.displayName??`Agent`,updatedAt:e.updatedAt,prUrl:e.attachments?.find(e=>XQ.test(e.url))?.url}}async function r$(){try{let e=await Tr();if(!e.linearApiKey&&!e.linearAccessToken)return;let t=(await pO()).filter(e=>!!e.delegate&&e.state.type===`started`).map(n$);ZQ={running:t.filter(e=>!e.prUrl),review:t.filter(e=>!!e.prUrl)};for(let e of $Q)e(ZQ)}catch{}}var i$=N(`<svg width=11 height=11 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M2.5 8a5.5 5.5 0 1 1 1.6 3.9"></path><path d="M2.5 12.5V8.9h3.6">`),a$=N(`<svg width=11 height=11 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="m2.5 4 3.5 4-3.5 4M8 12.5h5.5">`),o$=N(`<pre class="font-mono max-h-56 overflow-auto px-2.5 py-2 pr-3 text-[10px] leading-relaxed whitespace-pre-wrap"style=background:#0b0c0e;color:#8b8e98>`),s$=N(`<div class="border-border overflow-clip rounded-lg border"><div class="bg-surface-2 flex h-8 items-center gap-2 pl-2.5 pr-1.5"><span class="text-[11px] font-medium"></span><span class="text-text-faint font-mono text-[10px]"></span><span class=ml-auto>`),c$=N(`<span aria-hidden class="size-2 shrink-0 rounded-full">`),l$=N(`<p class="text-text-faint px-2.5 py-2 text-[10.5px]">No deployment URL yet — logs appear once Vercel picks up the branch.`);function u$(e){let t=sr(),n=_r(()=>({queryKey:[`stage-status`,e.url,e.base],queryFn:()=>GO(e.url,e.base),refetchInterval:e=>e.state.data?.state===`success`||e.state.data?.state===`failure`||e.state.data?.state===`error`?!1:8e3,retry:0})),r=()=>![`success`,`failure`,`error`].includes(n.data?.state??`pending`),[i,a]=T(!1),o=_r(()=>({queryKey:[`deploy-logs`,n.data?.url??e.url],queryFn:()=>KO(n.data.url),enabled:i()&&!!n.data?.url,refetchInterval:()=>r()?1e4:!1,retry:0})),s,c=!0;O(()=>{o.data?.logs,!(!s||!c)&&requestAnimationFrame(()=>{s&&(s.scrollTop=s.scrollHeight)})});let l=vr(()=>({mutationFn:()=>qO(e.url,e.base),onSuccess:()=>void t.invalidateQueries({queryKey:[`stage-status`,e.url,e.base]})})),u=()=>{let e=n.data?.state;return e===`success`?{label:`Ready`,color:`var(--color-success)`}:e===`failure`||e===`error`?{label:`Failed`,color:`var(--color-danger)`}:e===`none`||e===`unknown`?{label:`Waiting for deploy…`,color:`var(--color-text-dim)`}:{label:`Building…`,color:`var(--color-accent)`}};return(()=>{var t=s$(),d=t.firstChild,f=d.firstChild,p=f.nextSibling;return p.nextSibling,P(d,j(M,{get when(){return r()},get fallback(){return(()=>{var e=c$();return D(t=>dt(e,`background`,u().color)),e})()},get children(){return j(Aj,{size:11})}}),f),P(f,()=>u().label),P(p,()=>e.base,null),P(p,(()=>{var e=$e(()=>!!n.data?.sha);return()=>e()?` @ ${n.data.sha}`:``})(),null),P(d,j(M,{get when(){return $e(()=>n.data?.state===`success`)()&&n.data?.url},get children(){return j(Ij,{get href(){return n.data.url},class:`shrink-0`,title:`Open the staging deployment`,children:`Open`})}}),null),P(d,j(q,{variant:`ghost`,class:`size-6 shrink-0 px-0`,get loading(){return l.isPending},get title(){return`Reset ${e.base} — delete + recreate from the default branch (drifted or conflicted staging)`},"aria-label":`Reset staging branch`,onClick:()=>l.mutate(),get children(){return i$()}}),null),P(d,j(q,{variant:`ghost`,class:`size-6 shrink-0 px-0`,get title(){return i()?`Hide build logs`:`Show build logs (vercel inspect --logs via the bridge)`},get"aria-label"(){return i()?`Hide build logs`:`Show build logs`},onClick:()=>a(e=>!e),get children(){return a$()}}),null),P(t,j(M,{get when(){return i()},get children(){return j(M,{get when(){return n.data?.url},get fallback(){return l$()},get children(){var e=o$();e.addEventListener(`scroll`,()=>{s&&(c=s.scrollTop+s.clientHeight>=s.scrollHeight-40)});var t=s;return typeof t==`function`?pt(t,e):s=e,P(e,j(M,{get when(){return o.data},get fallback(){return j(Aj,{size:12})},get children(){return o.data.logs||`No log output.`}})),e}})}}),null),D(e=>dt(f,`color`,u().color)),t})()}Br();function d$(e,t=6e3){return Promise.race([e,new Promise((e,n)=>setTimeout(()=>n(Error(`upload timeout`)),t))])}async function f$(){let e=[],t=[];for(let n of await Dr()??[]){let r=n.source?.filePath?` — \`${n.source.filePath}${n.source.lineNumber==null?``:`:${n.source.lineNumber}`}\``:``;if(e.push(`- \`<${n.componentName??n.tagName??`element`}>\`${r}`),n.screenshotDataUrl)try{let t=await d$(OO(nj(n.screenshotDataUrl),`capture-${n.grabbedAt}.png`),15e3);e.push(` `)}catch{t.push(`element screenshot upload failed — the ref line still landed`)}}let n=UD();if(n.result)try{let t=n.result.assetUrl??await d$(OO(n.result.blob,`recording-${Date.now()}.gif`),6e4);iO(t),e.push(``)}catch(e){t.push(`recording upload failed (${e instanceof Error?e.message:`error`}) — Copy GIF from the Capture tab and paste it instead`)}return{block:e.length?`Captured context:\n${e.join(`
|
|
265
265
|
`)}`:null,failed:t}}function p$(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}var m$=/^(https?:\/\/|mailto:)/i,h$=/\.(mp4|mov|webm|m4v)(\?|#|$)/i,g$=/\.(png|jpe?g|gif|webp|avif|svg)(\?|#|$)/i,_$=class extends HTMLElement{objectUrl=null;connectedCallback(){let e=this.getAttribute(`src`)??``,t=this.getAttribute(`alt`)??``;(async()=>{try{let n=await fetch(e);if(!n.ok)throw Error(String(n.status));let r=await n.blob();if(this.objectUrl=URL.createObjectURL(r),this.textContent=``,r.type.startsWith(`video/`)){let e=document.createElement(`video`);e.controls=!0,e.preload=`metadata`,e.src=this.objectUrl,this.appendChild(e)}else{let e=document.createElement(`img`);e.src=this.objectUrl,e.alt=t,this.appendChild(e)}}catch{this.textContent=``;let e=document.createElement(`span`);e.textContent=`🖼 ${t||`media`} — start the bridge (npx linear-grab-bridge) to view Linear-hosted media here`,e.style.cssText=`font-size:10.5px;color:var(--color-text-faint);`,this.appendChild(e)}})()}disconnectedCallback(){this.objectUrl&&URL.revokeObjectURL(this.objectUrl)}};typeof customElements<`u`&&!customElements.get(`lg-media`)&&customElements.define(`lg-media`,_$);var v$=null;function y$(e){v$=e?e.replace(/\/$/,``):null}function b$(e){try{if(v$&&new URL(e).hostname.endsWith(`uploads.linear.app`))return`${v$}/fetch?url=${encodeURIComponent(e)}`}catch{}return e}function x$(e){let t=e;return t=t.replace(/`([^`]+)`/g,(e,t)=>`<code>${t}</code>`),t=t.replace(/!\[([^\]]*)\]\((?:<)?([^()\s]+?)(?:>)?\)/g,(e,t,n)=>{if(!m$.test(n))return t;let r=b$(n);return h$.test(n)?`<video controls preload="metadata" src="${r}"></video>`:r!==n&&!g$.test(n)?`<lg-media src="${r}" alt="${t}"></lg-media>`:`<img src="${r}" alt="${t}" loading="lazy" />`}),t=t.replace(/\[([^\]]+)\]\((?:<)?([^()\s]+?)(?:>)?\)/g,(e,t,n)=>m$.test(n)?`<a href="${n}" target="_blank" rel="noopener noreferrer">${t}</a>`:t),t=t.replace(/<(https?:\/\/[^\s&]+)>/g,`<a href="$1" target="_blank" rel="noopener noreferrer">$1</a>`),t=t.replace(/(^|[\s(])((?:https?:\/\/)[^\s<>()"']+)/g,(e,t,n)=>`${t}<a href="${n}" target="_blank" rel="noopener noreferrer">${n}</a>`),t=t.replace(/\*\*([^*]+)\*\*/g,`<strong>$1</strong>`),t=t.replace(/(^|\W)\*([^*\n]+)\*(?=\W|$)/g,`$1<em>$2</em>`),t}function S$(e){let t=p$(e.trim()).split(`
|
|
266
266
|
`),n=[],r=0;for(;r<t.length;){let e=t[r];if(!e.trim()){r++;continue}if(e.startsWith("```")){let e=[];for(r++;r<t.length&&!t[r].startsWith("```");)e.push(t[r++]);r++,n.push(`<pre><code>${e.join(`
|
|
267
267
|
`)}</code></pre>`);continue}let i=e.match(/^(#{1,6})\s+(.*)$/);if(i){n.push(`<h4>${x$(i[2])}</h4>`),r++;continue}if(/^\s*[-*]\s+/.test(e)){let e=[];for(;r<t.length&&/^\s*[-*]\s+/.test(t[r]);)e.push(`<li>${x$(t[r].replace(/^\s*[-*]\s+/,``))}</li>`),r++;n.push(`<ul>${e.join(``)}</ul>`);continue}if(/^\s*\d+[.)]\s+/.test(e)){let e=[];for(;r<t.length&&/^\s*\d+[.)]\s+/.test(t[r]);)e.push(`<li>${x$(t[r].replace(/^\s*\d+[.)]\s+/,``))}</li>`),r++;n.push(`<ol>${e.join(``)}</ol>`);continue}let a=[];for(;r<t.length&&t[r].trim()&&!/^(#{1,6}\s|```|\s*[-*]\s+|\s*\d+[.)]\s+)/.test(t[r]);)a.push(t[r]),r++;n.push(`<p>${x$(a.join(`<br />`))}</p>`)}return n.join(``)}Br();var C$=N(`<div class="lg-md text-text text-[12px] leading-relaxed break-words">`),w$=N(`<div class="flex h-full flex-col">`),T$=N(`<span class="tabular-nums text-[10.5px] text-text-faint">live · updated `),E$=N(`<svg aria-hidden width=11 height=11 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M1 4.5A7 7 0 0 1 13.5 3"></path><path d="M15 11.5A7 7 0 0 1 2.5 13"></path><polyline points="1 1 1 5 5 5"></polyline><polyline points="15 11 15 15 11 15">`),D$=N(`<div class="flex-1 overflow-y-auto">`),O$=N(`<div class="min-h-0 flex-1 overflow-y-auto pl-2 pr-3"><div style=position:relative>`),k$=N(`<div class="flex h-full flex-col"><div class="border-border flex shrink-0 items-center justify-between border-b px-3 py-2"><span class="text-text text-[12px] font-semibold">My issues</span><div class="flex items-center gap-2"></div></div><div class="border-border flex shrink-0 items-center gap-1 border-b px-3 py-1.5">`),A$=N(`<button>`),j$=N(`<div style=position:absolute;top:0;left:0;width:100%>`),M$=N(`<button class="w-full cursor-pointer rounded-md px-2 py-1.5 text-left hover:bg-surface-2 transition-colors"><div class="flex items-center gap-1.5 min-w-0"><span class="font-mono text-[11px] text-text-dim shrink-0"></span><span class="truncate text-[12.5px] text-text"></span></div><div class="mt-0.5 flex items-center gap-1.5"><span class="ml-auto tabular-nums text-[10.5px] text-text-faint">`),N$=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M10.5 3.5 6 8l4.5 4.5">`),P$=N(`<span class="font-mono text-[11px] text-text-dim shrink-0">`),F$=N(`<span class="truncate text-[12px] font-medium text-text">`),I$=N(`<span class="text-[11.5px] text-text-faint">Loading…`),L$=N(`<div class="flex items-center gap-2"><span class="text-[11px] text-text-dim">`),R$=N(`<div class="flex flex-col gap-2">`),z$=N(`<div class="flex flex-col gap-1"><span class="text-[10.5px] font-semibold uppercase tracking-wide text-text-dim">Attachments</span><div class="flex flex-col gap-1">`),B$=N(`<div class="flex flex-col gap-2.5"><span class="text-[10.5px] font-semibold uppercase tracking-wide text-text-dim">Comments`),V$=N(`<option value=local>Message local Claude Code session`),H$=N(`<option value=new>Start NEW agent (@<!>)`),U$=N(`<option value=comment>Comment only`),W$=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><circle cx=8 cy=8 r=2.2></circle><path d="M8 1v3M8 12v3M1 8h3M12 8h3">`),G$=N(`<svg width=11 height=11 viewBox="0 0 16 16"fill=currentColor aria-hidden><rect x=3 y=3 width=10 height=10 rx=1.5>`),K$=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M13 7.5 8.2 12.3a3.2 3.2 0 0 1-4.5-4.5L8.9 2.6a2.1 2.1 0 0 1 3 3L7.1 10.4a1 1 0 0 1-1.5-1.5l4.3-4.3">`),q$=N(`<span class="inline-block min-w-[4ch] text-left">Send`),J$=N(`<div class="flex h-full flex-col"><div class="border-border flex shrink-0 flex-col gap-1 border-b px-3 py-2"><div class="flex items-center gap-2"></div></div><div class="min-h-0 flex-1 overflow-y-auto pl-3 pr-4 py-3 flex flex-col gap-3"></div><div class="border-border shrink-0 border-t p-2.5 flex flex-col gap-1.5"><div class="flex items-center gap-2">`),Y$=N(`<option selected>`),X$=N(`<svg width=10 height=10 viewBox="0 0 16 16"fill=currentColor aria-hidden><rect x=3 y=3 width=10 height=10 rx=1.5>`),Z$=N(`<svg width=11 height=11 viewBox="0 0 16 16"fill=currentColor aria-hidden><path d="M4.5 2.8a.8.8 0 0 1 1.22-.68l8 5.2a.8.8 0 0 1 0 1.36l-8 5.2a.8.8 0 0 1-1.22-.68V2.8Z">`),Q$=N(`<svg width=11 height=11 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="m2.5 4 3.5 4-3.5 4M8 12.5h5.5">`),$$=N(`<div class="bg-surface border-border overflow-clip rounded-lg border"><div class="border-border flex h-9 min-w-0 items-center justify-between gap-2 border-b px-3"><div class="flex min-w-0 items-center gap-1.5 text-[11.5px] font-medium"><span aria-hidden class="text-text-dim inline-flex"></span><span class="text-text shrink-0">Local Claude Code</span><span class="text-text-dim shrink-0">started by you</span><span class="text-text-faint shrink-0 tabular-nums">· </span></div></div><div class="flex h-9 items-center gap-1 pr-2"><button class="hover:bg-surface-2 flex h-full min-w-0 flex-1 cursor-pointer items-center gap-2 rounded-md px-3 text-left transition-colors"title="Open the live thread in the Local tab"><span></span><span class="text-text-faint min-w-0 flex-1 truncate text-[11.5px]"></span><svg width=14 height=14 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden class="text-text-dim shrink-0"><path d="m6 3.5 4.5 4.5L6 12.5">`),e1=N(`<option>`),t1=N(`<div class="flex flex-col gap-1.5">`),n1=N(`<span class="text-success text-[11px]">✓`),r1=N(`<span class="inline-block min-w-[6ch] text-center">Merge`),i1=N(`<div class="flex min-w-0 items-center gap-1.5"><a target=_blank rel=noreferrer class="text-accent min-w-0 truncate text-[11.5px] hover:underline">`),a1=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M8 2 14 5.5 8 9 2 5.5 8 2Z"></path><path d="M2 10.5 8 14l6-3.5">`),o1=N(`<div class="flex flex-col gap-0.5"><div class="flex items-center gap-1.5"><span class="text-[11px] font-medium text-text-dim"></span><span class="ml-auto tabular-nums text-[10.5px] text-text-faint">`),s1=N(`<option>Steer running agent<!> · `),c1=N(`<span class="bg-danger inline-block size-2.5 rounded-full"aria-hidden>`),l1=N(`<span class="text-[11px] text-text-dim">`),u1=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden class=transition-transform><path d="m3.5 6.5 4.5 4 4.5-4">`),d1=N(`<p class="text-[12px] text-text leading-relaxed whitespace-pre-wrap break-words">`),f1=N(`<div class="border-border mt-0.5 flex flex-col gap-1 overflow-y-auto border-t pt-1.5 pl-0.5 pr-3">`),p1=N(`<div class="bg-surface border-border rounded-lg border p-2.5 flex flex-col gap-1.5"><div class="flex items-center gap-1.5 flex-wrap"><span class="ml-auto tabular-nums text-[10.5px] text-text-faint">`),m1=N(`<p class="font-mono text-text-faint text-[10.5px] leading-relaxed break-words">→ <!> `),h1=N(`<div>`);function g1(e){let t=k(()=>S$(e.text));return(()=>{var e=C$();return D(()=>e.innerHTML=t()),e})()}function _1(){let[e,t]=T(null);return O(()=>{let e=aj();e&&(t(e),cj())}),(()=>{var n=w$();return P(n,j(M,{get when(){return e()===null},get fallback(){return j(b1,{get issueId(){return e()},onBack:()=>t(null)})},get children(){return j(v1,{onSelect:e=>t(e)})}})),n})()}function v1(e){let t,n=_r(()=>({queryKey:[`my-issues`],queryFn:pO,refetchInterval:12e3})),r=_r(()=>({queryKey:[`bridge-tasks`],queryFn:PO,refetchInterval:1e4,retry:0})),i=e=>(r.data??[]).some(t=>t.title.startsWith(e.identifier)),a=e=>e.state.type===`started`&&e.attachments?.some(e=>/github\.com\/[^/]+\/[^/]+\/pull\/\d+/i.test(e.url)),o=[{id:`all`,label:`All`},{id:`active`,label:`In Progress`},{id:`review`,label:`Review`},{id:`done`,label:`Done`},{id:`cloud`,label:`Cloud`},{id:`local`,label:`Local`}],[s,c]=br(`issues:filter`,`all`),[l,u]=br(`issues:search`,``),d=k(()=>{let e=l().trim().toLowerCase();return(n.data??[]).filter(t=>{if(e&&!`${t.identifier} ${t.title}`.toLowerCase().includes(e))return!1;switch(s()){case`active`:return t.state.type===`started`;case`review`:return!!a(t);case`done`:return t.state.type===`completed`;case`cloud`:return!!t.delegate;case`local`:return i(t);default:return!0}})}),f=JQ({get count(){return d().length},getScrollElement:()=>t,estimateSize:()=>56,overscan:5});return(()=>{var r=k$(),a=r.firstChild,p=a.firstChild.nextSibling,m=a.nextSibling;return P(p,j(M,{get when(){return n.dataUpdatedAt>0},get children(){var e=T$();return e.firstChild,P(e,()=>Wj(n.dataUpdatedAt),null),e}}),null),P(p,j(q,{class:`size-7 px-0`,get loading(){return n.isFetching},onClick:()=>void n.refetch(),title:`Refresh`,"aria-label":`Refresh issues`,get children(){return E$()}}),null),P(m,j(We,{each:o,children:e=>(()=>{var t=A$();return t.$$click=()=>c(e.id),P(t,()=>e.label),D(()=>st(t,`h-6 shrink-0 cursor-pointer rounded-md px-2 text-[11px] font-medium transition-colors ${s()===e.id?`bg-accent-soft text-accent`:`text-text-dim hover:bg-surface-2`}`)),t})()}),null),P(m,j(jj,{class:`ml-auto h-6 w-28 text-[11px]`,placeholder:`Search…`,get value(){return l()},onInput:e=>u(e.currentTarget.value)}),null),P(r,j(M,{get when(){return n.isError},get children(){var e=D$();return P(e,j(Vj,{title:`Connect Linear in Settings`,get children(){return n.error?.message??`Unable to load issues.`}})),e}}),null),P(r,j(M,{get when(){return $e(()=>!n.isError&&!n.isPending)()&&d().length===0},get children(){var e=D$();return P(e,j(Vj,{title:`No issues found`,children:`Issues you create will appear here.`})),e}}),null),P(r,j(M,{get when(){return $e(()=>!n.isError)()&&d().length>0},get children(){var n=O$(),r=n.firstChild,a=t;return typeof a==`function`?pt(a,n):t=n,P(r,j(We,{get each(){return f.getVirtualItems()},children:t=>{let n=k(()=>d()[t.index]);return j(M,{get when(){return n()},get children(){var r=j$();return P(r,j(y1,{get issue(){return n()},get local(){return i(n())},get onSelect(){return e.onSelect}})),D(e=>dt(r,`transform`,`translateY(${t.start}px)`)),r}})}})),D(e=>dt(r,`height`,`${f.getTotalSize()}px`)),n}}),null),r})()}function y1(e){return(()=>{var t=M$(),n=t.firstChild,r=n.firstChild,i=r.nextSibling,a=n.nextSibling,o=a.firstChild;return t.$$click=()=>e.onSelect(e.issue.id),P(n,j(Bj,{get color(){return e.issue.state.color}}),r),P(r,()=>e.issue.identifier),P(i,()=>e.issue.title),P(a,j(zj,{get children(){return e.issue.state.name}}),o),P(a,j(M,{get when(){return e.issue.delegate},get children(){return j(zj,{class:`text-accent`,get children(){return[j(Pj,{}),` `,$e(()=>e.issue.delegate.displayName)]}})}}),o),P(a,j(M,{get when(){return e.local},get children(){return j(zj,{class:`text-accent`,get children(){return[j(Fj,{}),` local`]}})}}),o),P(a,j(M,{get when(){return $e(()=>!!(e.issue.state.type===`started`&&e.issue.delegate))()&&e.issue.attachments?.some(e=>/github\.com\/[^/]+\/[^/]+\/pull\/\d+/i.test(e.url))},get children(){return j(zj,{color:`var(--color-warn)`,children:`needs review`})}}),o),P(o,()=>Wj(e.issue.updatedAt)),t})()}function b1(e){let t=sr(),n=_r(()=>({queryKey:[`issue`,e.issueId],queryFn:()=>mO(e.issueId),refetchInterval:8e3,enabled:!!e.issueId})),r=_r(()=>({queryKey:[`sessions`,e.issueId],queryFn:()=>gO(e.issueId),refetchInterval:8e3,enabled:!!e.issueId})),i=_r(()=>({queryKey:[`settings`],queryFn:Tr})),a=_r(()=>({queryKey:[`bridge-tasks`],queryFn:PO,refetchInterval:5e3,retry:0})),o=[{id:``,label:`Default model`},{id:`fable`,label:`Fable 5`},{id:`opus`,label:`Opus`},{id:`sonnet`,label:`Sonnet`},{id:`haiku`,label:`Haiku`}],s=vr(()=>({mutationFn:async t=>{let r=n.data?.attachments.find(e=>/github\.com\/[^/]+\/[^/]+\/pull\/\d+/i.test(e.url)),i=r?se.data?.previews[r.url]:void 0,a=[...t.activities].reverse().find(e=>e.content.__typename===`AgentActivityResponseContent`)?.content.body,o=[`✅ **Closeout** (posted from the panel — one-click acceptance)`,``,`**Fix:** ${(t.summary??a??`Fix complete — see the PR.`).slice(0,600)}`,``,...r?[`**PR:** ${r.url}`]:[],...i?[`**Deploy preview:** ${i}`]:[],``,`**DEFINITION OF DONE — acceptance checklist**`,`- [x] PR opened and linked${r?` — ${r.url}`:``}`,i?`- [x] Deploy-preview URL included (above)`:`- [ ] Deploy-preview URL — none found on the PR`,`- [x] Issue moved to review state (this action)`,`- [ ] Demo media on the issue — attach from the PR/agent artifacts if recorded`];await wO(e.issueId,o.join(`
|
|
268
268
|
`),t.comment?.id??void 0);let s=n.data?.team?.id;if(s){let t=await yO(s),n=t.find(e=>e.type===`started`&&/review/i.test(e.name))??t.filter(e=>e.type===`completed`).sort((e,t)=>e.position-t.position)[0];n&&await bO(e.issueId,n.id)}},onSuccess:()=>{t.invalidateQueries({queryKey:[`issue`,e.issueId]}),t.invalidateQueries({queryKey:[`sessions`,e.issueId]})}})),c=vr(()=>({mutationFn:e=>RO(e.id,e.model),onSuccess:e=>{t.setQueryData([`bridge-tasks`],t=>t?.map(t=>t.id===e.id?e:t))}})),l=vr(()=>({mutationFn:e=>LO(e,`Continue where you left off. If the work is already complete, finish any remaining closeout steps (PR, Linear update, announcement).`),onSuccess:()=>void t.invalidateQueries({queryKey:[`bridge-tasks`]})})),u=vr(()=>({mutationFn:e=>zO(e),onSuccess:()=>void t.invalidateQueries({queryKey:[`bridge-tasks`]})})),[d,f]=T(!1),p=async e=>{try{await navigator.clipboard.writeText(XO(e)),f(!0),setTimeout(()=>f(!1),1800)}catch{}},m=k(()=>{let e=n.data?.identifier;return e?a.data?.find(t=>t.title.startsWith(e)):void 0}),h=e=>e.status===`running`?{word:`Working…`,cls:`text-accent`}:e.status===`done`?{word:`Finished`,cls:`text-success`}:e.status===`stopped`?{word:`Stopped`,cls:`text-warn`}:{word:`Error`,cls:`text-danger`},[g,_]=br(`activity-reply:${e.issueId}`,``),[v,y]=T(null),[b,x]=T(0),S=_r(()=>({queryKey:[`grab`],queryFn:Dr,enabled:lj()===`composer`})),[C,w]=T(!1),E=async()=>{w(!0),y(null);try{let{block:e,failed:t}=await f$();e?_(t=>`${t?`${t}\n`:``}${e}\n`):t.length||y(`Nothing captured yet — pick an element, capture a region, or record first.`),t.length&&y(t.join(` · `))}catch(e){y(e instanceof Error?e.message:`Attach failed.`)}finally{w(!1)}},ee=()=>{if(lj()===`composer`){dj(`capture`);return}x(Date.now()),dj(`composer`),YZ().catch(()=>dj(`capture`))};O(()=>{if(lj()!==`composer`)return;let e=(S.data??[]).filter(e=>e.grabbedAt>b());if(!e.length)return;let t=e.map(e=>{let t=e.source?.filePath?` — \`${e.source.filePath}${e.source.lineNumber==null?``:`:${e.source.lineNumber}`}\``:``;return`- \`<${e.componentName??e.tagName??`element`}>\`${t}`}).join(`
|
|
269
269
|
`);_(e=>`${e?`${e}\n`:``}${t}\n`),x(Math.max(...e.map(e=>e.grabbedAt)))});let[te,A]=T(UD());ae(WD(A));let ne=!1;O(()=>{te().phase===`ready`&&ne&&(ne=!1,E())});let re=()=>{te().phase===`recording`?tO():(ne=!0,eO())},ie=/github\.com\/[^/]+\/[^/]+\/pull\/\d+/i,oe=k(()=>(n.data?.attachments??[]).map(e=>e.url).filter(e=>ie.test(e))),se=_r(()=>({queryKey:[`pr-status`,oe().sort().join(`|`)],queryFn:()=>UO(oe()),refetchInterval:3e4,retry:0,enabled:oe().length>0})),ce=e=>_e().has(e)?`MERGED`:se.data?.statuses[e],[le,ue]=T(null),de=()=>i.data?.stagingBranch?.trim()||`staging`,[fe,pe]=T(null),[me,he]=T(new Set),ge=async e=>{pe(e);try{await WO(e,de()),he(t=>new Set(t).add(e))}catch{}finally{pe(null)}},[_e,ve]=T(new Set),[ye,be]=T(null),xe=async n=>{be(null),ue(n);try{await JO(n),ve(e=>new Set(e).add(n)),t.invalidateQueries({queryKey:[`issue`,e.issueId]}),t.invalidateQueries({queryKey:[`my-issues`]}),t$()}catch(e){be(e instanceof Error?`${e.message} (bridge must be running; gh needs merge rights)`:`Merge failed.`)}finally{ue(null)}},Se=k(()=>{let e=n.data?EO(n.data.comments):[],t=new Set(e.map(e=>e.id));return[...(r.data??[]).filter(e=>e.comment?.id&&!t.has(e.comment.id)).map(e=>({id:e.comment.id,createdAt:e.updatedAt,body:``,user:{displayName:e.appUser?.displayName??`agent`,app:!0},parent:null})),...e]}),[Ce,we]=T(`comment`),Te=!1,Ee=!1;O(()=>{if(Ee||!n.data||!i.data)return;Ee=!0;let e=Se();e.length?we(`thread:${e[0].id}`):n.data.delegate&&i.data.cursorAgentId&&we(`new`)}),O(()=>{Te||m()&&(Ce()===`comment`||Ce()===`new`)&&we(`local`)}),O(()=>{if(Te)return;let e=Se();e.length&&(Ce()===`comment`||Ce()===`new`)&&we(`thread:${e[0].id}`)});let De=vr(()=>({mutationFn:async()=>{let t=g().trim();if(!t)throw Error(`Message is empty`);let n=i.data??{},r=Ce();if(r===`local`){let n=m();if(!n)throw Error(`Local session not found — is the bridge running?`);await LO(n.id,t),await wO(e.issueId,`🖥️ **→ local agent:** ${t}`).catch(()=>{})}else r.startsWith(`thread:`)?await wO(e.issueId,t,r.slice(7)):r===`new`&&n.cursorAgentId?await TO(e.issueId,t,{name:n.cursorAgentName,displayName:n.cursorAgentName??`Cursor`,url:n.cursorAgentUrl}):await wO(e.issueId,t)},onSuccess:()=>{_(``),y(null),dj(`capture`),t.invalidateQueries({queryKey:[`issue`,e.issueId]}),t$()},onError:e=>{y(e.message??`Failed to send`)}})),Oe=k(()=>n.data),ke=k(()=>r.data??[]);return(()=>{var t=J$(),r=t.firstChild,a=r.firstChild,f=r.nextSibling,y=f.nextSibling,b=y.firstChild;return P(a,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,title:`Back to issues`,"aria-label":`Back to issues`,"data-tip-pos":`right bottom`,get onClick(){return e.onBack},get children(){return N$()}}),null),P(a,j(M,{get when(){return Oe()},get children(){return[(()=>{var e=P$();return P(e,()=>Oe().identifier),e})(),(()=>{var e=F$();return P(e,()=>Oe().title),e})()]}}),null),P(a,j(M,{get when(){return $e(()=>!!n.isPending)()&&!Oe()},get children(){return I$()}}),null),P(r,j(M,{get when(){return Oe()},get children(){var e=L$(),t=e.firstChild;return P(e,j(Bj,{get color(){return Oe().state.color}}),t),P(t,()=>Oe().state.name),P(e,j(Ij,{get href(){return Oe().url},class:`ml-auto shrink-0`,children:`Open in Linear`}),null),e}}),null),P(f,j(M,{get when(){return m()},children:e=>{let t=()=>h(e());return(()=>{var n=$$(),r=n.firstChild,i=r.firstChild.firstChild,a=i.nextSibling.nextSibling.nextSibling;a.firstChild;var s=r.nextSibling,f=s.firstChild,m=f.firstChild,h=m.nextSibling;return P(i,j(Fj,{size:12})),P(a,()=>Wj(e().startedAt),null),P(r,j(Nj,{class:`h-6 w-auto max-w-[110px] shrink-0 text-[10.5px]`,get value(){return e().pendingModel??e().model??``},onChange:t=>c.mutate({id:e().id,model:t.currentTarget.value}),title:`Model — applies from the next message`,get children(){return[j(We,{each:o,children:t=>(()=>{var n=e1();return P(n,()=>t.label),D(()=>n.selected=(e().pendingModel??e().model??``)===t.id),D(()=>n.value=t.id),n})()}),j(M,{get when(){return!o.some(t=>t.id===(e().pendingModel??e().model??``))},get children(){var t=Y$();return P(t,()=>e().pendingModel??e().model),D(()=>t.value=e().pendingModel??e().model??``),t}})]}}),null),f.$$click=()=>sj(`local`),P(f,j(M,{get when(){return e().status===`running`},get children(){return j(Aj,{size:12})}}),m),P(m,()=>t().word),P(h,(()=>{var t=$e(()=>e().status===`done`);return()=>t()?e().result??e().lastText:e().lastText})()),P(s,j(M,{get when(){return e().status===`running`},get children(){return j(q,{variant:`danger`,class:`size-6 shrink-0 px-0`,get loading(){return u.isPending},title:`Stop the session — resumable afterwards`,"aria-label":`Stop session`,onClick:()=>u.mutate(e().id),get children(){return X$()}})}}),null),P(s,j(M,{get when(){return $e(()=>e().status!==`running`)()&&e().sessionId},get children(){return j(q,{variant:`ghost`,class:`size-6 shrink-0 px-0`,get loading(){return l.isPending},get title(){return`Run again — resumes this session${e().pendingModel?` on ${e().pendingModel}`:``}`},"aria-label":`Resume session`,onClick:()=>l.mutate(e().id),get children(){return Z$()}})}}),null),P(s,j(M,{get when(){return e().sessionId},get children(){return j(q,{variant:`ghost`,class:`size-6 shrink-0 px-0`,get title(){return d()?`Copied!`:`Copy terminal resume command (claude --resume …)`},"aria-label":`Copy resume command`,onClick:()=>void p(e()),get children(){return Q$()}})}}),null),D(()=>st(m,`shrink-0 text-[11.5px] font-medium ${t().cls}`)),n})()}}),null),P(f,j(M,{get when(){return ke().length>0},get children(){var e=R$();return P(e,j(We,{get each(){return ke()},children:e=>(()=>{var t=t1();return P(t,j(x1,{session:e}),null),P(t,j(M,{get when(){return $e(()=>!!(/complete/i.test(e.status)&&n.data?.state.type===`started`))()&&!/review/i.test(n.data?.state.name??``)},get children(){return j(q,{variant:`primary`,class:`self-start`,get loading(){return s.isPending},title:`Post the acceptance comment (fix summary, PR, preview, checklist) in the agent thread and move the issue to review`,onClick:()=>s.mutate(e),children:`Post closeout to Linear`})}}),null),t})()})),e}}),null),P(f,j(M,{get when(){return $e(()=>!!Oe())()&&Oe().attachments.length>0},get children(){var e=z$(),t=e.firstChild.nextSibling;return P(t,j(We,{get each(){return Oe().attachments},children:e=>{let t=/github\.com\/[^/]+\/[^/]+\/pull\/\d+/i.test(e.url);return[(()=>{var n=i1(),r=n.firstChild;return P(r,()=>e.title),P(n,j(M,{get when(){return t&&se.data?.previews[e.url]},get children(){return j(Ij,{get href(){return se.data.previews[e.url]},class:`shrink-0`,title:`Vercel deploy preview of this PR's branch`,children:`Preview`})}}),null),P(n,j(M,{get when(){return $e(()=>!!(t&&ce(e.url)))()&&ce(e.url)!==`OPEN`},get children(){return j(zj,{get class(){return`ml-auto shrink-0 ${ce(e.url)===`MERGED`?`text-success`:`text-text-faint`}`},get children(){return ce(e.url)===`MERGED`?`✓ merged`:`closed`}})}}),null),P(n,j(M,{get when(){return t&&(!ce(e.url)||ce(e.url)===`OPEN`)},get children(){return[j(q,{variant:`ghost`,class:`ml-auto size-6 shrink-0 px-0`,get loading(){return fe()===e.url},get disabled(){return me().has(e.url)},get title(){return $e(()=>!!me().has(e.url))()?`On ${de()} — staging preview deploying`:`Merge into ${de()} — deploys the staging preview domain`},"aria-label":`Merge to staging`,onClick:()=>void ge(e.url),get children(){return j(M,{get when(){return me().has(e.url)},get fallback(){return a1()},get children(){return n1()}})}}),j(q,{variant:`primary`,class:`h-6 shrink-0 px-2 text-[11px]`,get loading(){return le()===e.url},get title(){return se.isError?`PR state unknown — restart the bridge (npx linear-grab-bridge) for live merge status`:`Squash-merge this PR via the bridge gh — reviewed the demo? Ship it.`},onClick:()=>void xe(e.url),get children(){return r1()}})]}}),null),D(t=>{var n=e.url,i=e.title;return n!==t.e&&it(r,`href`,t.e=n),i!==t.t&&it(r,`title`,t.t=i),t},{e:void 0,t:void 0}),n})(),j(M,{get when(){return me().has(e.url)},get children(){return j(u$,{get url(){return e.url},get base(){return de()}})}})]}}),null),P(t,j(M,{get when(){return ye()},get children(){return j(Hj,{get message(){return ye()}})}}),null),e}}),null),P(f,j(M,{get when(){return $e(()=>!!Oe())()&&Oe().comments.length>0},get children(){var e=B$();return e.firstChild,P(e,j(Ge,{get each(){return Oe().comments},children:e=>{let t=e();return(()=>{var e=o1(),n=e.firstChild,r=n.firstChild,i=r.nextSibling;return P(r,()=>t.user?.displayName??t.user?.name??`Unknown`),P(n,j(M,{get when(){return t.user?.app},get children(){return j(zj,{children:`agent`})}}),i),P(i,()=>Wj(t.createdAt)),P(e,j(g1,{get text(){return t.body}}),null),e})()}}),null),e}}),null),P(f,j(M,{get when(){return $e(()=>!!(Oe()&&Oe().comments.length===0))()&&ke().length===0},get children(){return j(Vj,{title:`No activity yet`,children:`Comments and agent sessions will appear here.`})}}),null),P(f,j(M,{get when(){return $e(()=>!!n.isError)()&&!Oe()},get children(){return j(Vj,{title:`Failed to load issue`,get children(){return n.error?.message??`Unknown error`}})}}),null),P(y,j(M,{get when(){return v()},get children(){return j(Hj,{get message(){return v()}})}}),b),P(y,j(Mj,{rows:2,placeholder:`Reply — steer the agent or add context…`,get value(){return g()},onInput:e=>_(e.target.value),get disabled(){return De.isPending}}),b),P(b,j(Nj,{class:`min-w-0 flex-1`,get value(){return Ce()},onChange:e=>{Te=!0,we(e.currentTarget.value)},get children(){return[j(M,{get when(){return m()},get children(){var e=V$();return D(()=>e.selected=Ce()===`local`),e}}),j(We,{get each(){return Se()},children:(e,t)=>(()=>{var n=s1(),r=n.firstChild.nextSibling;return r.nextSibling,P(n,(()=>{var e=$e(()=>Se().length>1);return()=>e()?` #${t()+1}`:``})(),r),P(n,()=>Wj(e.createdAt),null),D(()=>n.selected=Ce()===`thread:${e.id}`),D(()=>n.value=`thread:${e.id}`),n})()}),j(M,{get when(){return i.data?.cursorAgentId},get children(){var e=H$(),t=e.firstChild.nextSibling;return t.nextSibling,P(e,()=>i.data?.cursorAgentName??`Cursor`,t),D(()=>e.selected=Ce()===`new`),e}}),(()=>{var e=U$();return D(()=>e.selected=Ce()===`comment`),e})()]}}),null),P(b,j(q,{variant:`ghost`,get class(){return`size-7 shrink-0 px-0 ${lj()===`composer`?`text-accent`:``}`},get title(){return lj()===`composer`?`Pick mode ON — every pick appends here. Click to stop.`:`Pick elements — refs append to this reply (stays on until toggled off or sent)`},"aria-label":`Pick element for reply`,onClick:ee,get children(){return W$()}}),null),P(b,j(q,{variant:`ghost`,get class(){return`size-7 shrink-0 px-0 ${te().phase===`recording`?`text-danger`:``}`},get title(){return te().phase===`recording`?`Stop recording — the GIF auto-attaches to this reply`:`Record a GIF from this thread (auto-attaches when done)`},"aria-label":`Record GIF`,onClick:re,get children(){return j(M,{get when(){return te().phase===`recording`},get fallback(){return c1()},get children(){return G$()}})}}),null),P(b,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,get loading(){return C()},title:`Attach captures — element refs, screenshots, region shots, recording GIF`,"aria-label":`Attach captures`,onClick:()=>void E(),get children(){return K$()}}),null),P(b,j(q,{class:`min-w-[52px] shrink-0`,variant:`primary`,get loading(){return De.isPending},get disabled(){return g().trim().length===0},onClick:()=>De.mutate(),get children(){return q$()}}),null),t})()}function x1(e){let t=k(()=>{let t=e.session.status;return/complete|done/i.test(t)?`var(--color-success)`:/await|pending|elicit/i.test(t)?`var(--color-warn)`:`var(--color-accent)`}),n=k(()=>{let t=e.session.status;return/active/i.test(t)?`Working…`:/awaitingInput|elicit/i.test(t)?`Needs input`:/complete/i.test(t)?`Complete`:/error/i.test(t)?`Error`:/pending/i.test(t)?`Queued`:t}),r=k(()=>e.session.activities.filter(e=>e.content?.body||e.content?.action).slice(-15)),[i,a]=T(!1),o,s=!0,c=()=>{o&&(s=o.scrollTop+o.clientHeight>=o.scrollHeight-40)};return O(()=>{let e=r().length;!o||!e||!s||requestAnimationFrame(()=>{o&&(o.scrollTop=o.scrollHeight)})}),(()=>{var s=p1(),l=s.firstChild,u=l.firstChild;return P(l,j(M,{get when(){return/active|pending/i.test(e.session.status)},get children(){return j(Aj,{size:12})}}),u),P(l,j(zj,{get color(){return t()},get children(){return n()}}),u),P(l,j(M,{get when(){return e.session.appUser?.displayName},get children(){var t=l1();return P(t,()=>e.session.appUser.displayName),t}}),u),P(u,()=>Wj(e.session.updatedAt)),P(l,j(M,{get when(){return e.session.externalLinks?.[0]},children:e=>j(Ij,{get href(){return e().url},class:`shrink-0`,title:`Open this run on the agent's site`,get children(){return e().label||`Cursor`}})}),null),P(l,j(q,{variant:`ghost`,class:`size-6 shrink-0 px-0`,get title(){return i()?`Collapse to a window`:`Expand — show the whole session feed`},get"aria-label"(){return i()?`Collapse feed`:`Expand feed`},onClick:()=>a(e=>!e),get children(){var e=u1();return D(t=>dt(e,`transform`,i()?`rotate(180deg)`:`none`)),e}}),null),P(s,j(M,{get when(){return e.session.summary},get children(){var t=d1();return P(t,()=>e.session.summary),t}}),null),P(s,j(M,{get when(){return r().length>0},get children(){var e=f1();e.addEventListener(`scroll`,c);var t=o;return typeof t==`function`?pt(t,e):o=e,P(e,j(Ge,{get each(){return r()},children:e=>j(M,{get when(){return e().content.action},get fallback(){return(()=>{var t=h1();return P(t,j(g1,{get text(){return e().content.body??``}})),D(()=>st(t,`lg-md text-[11.5px] leading-relaxed break-words ${e().content.__typename===`AgentActivityErrorContent`?`text-danger`:`text-text`}`)),t})()},get children(){var t=m1(),n=t.firstChild.nextSibling;return n.nextSibling,P(t,()=>e().content.action,n),P(t,()=>e().content.parameter,null),t}})})),D(()=>e.classList.toggle(`max-h-64`,!i())),e}}),null),s})()}rt([`click`]);var S1=N(`<svg aria-hidden width=11 height=11 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M1 4.5A7 7 0 0 1 13.5 3"></path><path d="M15 11.5A7 7 0 0 1 2.5 13"></path><polyline points="1 1 1 5 5 5"></polyline><polyline points="15 11 15 15 11 15">`),C1=N(`<div class="flex flex-col gap-1.5">`),w1=N(`<div class="flex h-full flex-col"><div class="border-border flex shrink-0 items-center justify-between border-b px-3 py-2"><span class="text-text inline-flex items-center gap-1.5 text-[12px] font-semibold"> Cloud agents</span><span class="text-text-faint text-[10.5px] tabular-nums"> working · updated </span></div><div class="border-border flex shrink-0 items-center gap-1 border-b px-3 py-1.5"></div><div class="min-h-0 flex-1 overflow-y-auto pt-2 pb-3 pl-2 pr-3">`),T1=N(`<button>`),E1=N(`<div class="grid place-items-center py-10">`),D1=N(`<button class="flex min-w-0 flex-1 cursor-pointer items-center gap-1.5 text-left"title="View the thread here"><span class="font-mono text-text-dim shrink-0 text-[11px]"></span><span class="text-text hover:text-accent min-w-0 truncate text-[12.5px] font-medium transition-colors">`),O1=N(`<p class="text-text-dim line-clamp-2 cursor-pointer text-[11.5px] leading-snug break-words">`),k1=N(`<span class="text-text-dim text-[11px]">`),A1=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 aria-hidden><circle cx=8 cy=8 r=6></circle><circle cx=8 cy=8 r=1.6 fill=currentColor stroke=none>`),j1=N(`<div class="bg-surface border-border flex flex-col gap-1.5 rounded-lg border p-2.5"><div class="flex min-w-0 items-center gap-1.5"><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums"></span></div><div class="flex min-w-0 items-center gap-1.5"><span class=ml-auto>`),M1=N(`<span aria-hidden class="size-2 shrink-0 rounded-full">`),N1=N(`<span class="text-text-dim text-[12.5px]">Conversation session`);function P1(){let e=_r(()=>({queryKey:[`cloud-sessions`],queryFn:_O,refetchInterval:12e3})),t=[{id:`all`,label:`All`},{id:`working`,label:`Working`},{id:`input`,label:`Needs input`},{id:`done`,label:`Done`}],[n,r]=br(`cloud:filter`,`all`),i=k(()=>(e.data??[]).filter(e=>{switch(n()){case`working`:return/active|pending/i.test(e.status);case`input`:return/awaitingInput|elicit/i.test(e.status);case`done`:return/complete/i.test(e.status);default:return!0}})),a=e=>/active/i.test(e)?{word:`Working…`,color:`var(--color-accent)`}:/awaitingInput|elicit/i.test(e)?{word:`Needs input`,color:`var(--color-warn)`}:/complete/i.test(e)?{word:`Complete`,color:`var(--color-success)`}:/error/i.test(e)?{word:`Error`,color:`var(--color-danger)`}:{word:e,color:`var(--color-text-dim)`},o=e=>{let t=[...e.activities].reverse().find(e=>e.content?.body||e.content?.action);return t?t.content.action?`→ ${t.content.action} ${t.content.parameter??``}`:t.content.body??``:e.summary??``},s=k(()=>(e.data??[]).filter(e=>/active|pending/i.test(e.status)).length),[c,l]=T(null);return j(M,{get when(){return!c()},get fallback(){return j(b1,{get issueId(){return c()},onBack:()=>l(null)})},get children(){var c=w1(),u=c.firstChild,d=u.firstChild,f=d.firstChild,p=d.nextSibling,m=p.firstChild,h=u.nextSibling,g=h.nextSibling;return P(d,j(Pj,{size:13}),f),P(p,s,m),P(p,()=>Wj(e.dataUpdatedAt||Date.now()),null),P(h,j(We,{each:t,children:e=>(()=>{var t=T1();return t.$$click=()=>r(e.id),P(t,()=>e.label),D(()=>st(t,`h-6 shrink-0 cursor-pointer rounded-md px-2 text-[11px] font-medium transition-colors ${n()===e.id?`bg-accent-soft text-accent`:`text-text-dim hover:bg-surface-2`}`)),t})()}),null),P(h,j(q,{class:`ml-auto size-6 px-0`,get loading(){return e.isFetching},title:`Refresh`,"aria-label":`Refresh sessions`,onClick:()=>void e.refetch(),get children(){return S1()}}),null),P(g,j(M,{get when(){return i().length>0},get fallback(){return j(M,{get when(){return!e.isPending},get fallback(){return(()=>{var e=E1();return P(e,j(Aj,{})),e})()},get children(){return j(Vj,{title:`No cloud agent sessions`,children:`Delegate an issue to Cursor from the Draft tab and its live session appears here.`})}})},get children(){var e=C1();return P(e,j(Ge,{get each(){return i()},children:e=>(()=>{var t=j1(),n=t.firstChild,r=n.firstChild,i=n.nextSibling,s=i.firstChild;return P(n,j(M,{get when(){return/active|pending/i.test(e().status)},get fallback(){return(()=>{var t=M1();return D(n=>dt(t,`background`,a(e().status).color)),t})()},get children(){return j(Aj,{})}}),r),P(n,j(M,{get when(){return e().issue},get fallback(){return N1()},get children(){var t=D1(),n=t.firstChild,r=n.nextSibling;return t.$$click=()=>l(e().issue.id),P(n,()=>e().issue.identifier),P(r,()=>e().issue.title),t}}),r),P(r,()=>Wj(e().updatedAt)),P(t,j(M,{get when(){return o(e())},get children(){var t=O1();return t.$$click=()=>e().issue&&l(e().issue.id),P(t,()=>o(e())),t}}),i),P(i,j(zj,{get color(){return a(e().status).color},get children(){return a(e().status).word}}),s),P(i,j(M,{get when(){return e().issue},get children(){return[j(Bj,{get color(){return e().issue.state.color}}),(()=>{var t=k1();return P(t,()=>e().issue.state.name),t})()]}}),s),P(i,j(M,{get when(){return e().issue},get children(){return[j(q,{variant:`ghost`,class:`size-6 shrink-0 px-0`,title:`Open the thread — steer this agent`,"aria-label":`Open thread`,onClick:()=>l(e().issue.id),get children(){return A1()}}),j(Ij,{get href(){return e().issue.url},class:`shrink-0`,children:`Linear`})]}}),null),t})()})),e}})),c}})}rt([`click`]);var F1=N(`<div class="flex flex-col gap-1.5">`),I1=N(`<div class="flex h-full flex-col"><div class="border-border flex shrink-0 items-center justify-between border-b px-3 py-2"><span class="text-text text-[12px] font-semibold">Running now</span><span class="text-text-faint text-[10.5px] tabular-nums"> agent<!> active</span></div><div class="min-h-0 flex-1 overflow-y-auto pt-2 pb-3 pl-2 pr-3">`),L1=N(`<span class="font-mono text-text-dim shrink-0 text-[11px]">`),R1=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 aria-hidden><circle cx=8 cy=8 r=6></circle><circle cx=8 cy=8 r=1.6 fill=currentColor stroke=none>`),z1=N(`<div class="bg-surface border-border flex flex-col gap-1.5 rounded-lg border p-2.5"><div class="flex min-w-0 items-center gap-1.5"><button class="flex min-w-0 flex-1 cursor-pointer items-center gap-1.5 text-left"><span class="text-text hover:text-accent min-w-0 truncate text-[12.5px] font-medium transition-colors"></span></button><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums"></span></div><p class="text-text-dim line-clamp-2 text-[11.5px] leading-snug break-words"></p><div class="flex min-w-0 items-center gap-1.5"><span class=ml-auto>`);function B1(){let e=_r(()=>({queryKey:[`cloud-sessions`],queryFn:_O,refetchInterval:12e3})),t=_r(()=>({queryKey:[`bridge-tasks`],queryFn:PO,refetchInterval:5e3,retry:0})),n=_r(()=>({queryKey:[`my-issues`],queryFn:pO,refetchInterval:3e4})),r=k(()=>{let r=(e.data??[]).filter(e=>/active|pending|awaitingInput|elicit/i.test(e.status)).map(e=>({kind:`cloud`,at:Date.parse(e.updatedAt),session:e})),i=(t.data??[]).filter(e=>e.status===`running`).map(e=>({kind:`local`,at:e.startedAt,task:e,issueId:(n.data??[]).find(t=>e.title.startsWith(t.identifier))?.id}));return[...r,...i].sort((e,t)=>t.at-e.at)}),[i,a]=T(null),o=e=>/awaitingInput|elicit/i.test(e)?{word:`Needs input`,color:`var(--color-warn)`}:{word:`Working…`,color:`var(--color-accent)`},s=e=>{let t=[...e.activities].reverse().find(e=>e.content?.body||e.content?.action);return t?t.content.action?`→ ${t.content.action} ${t.content.parameter??``}`:t.content.body??``:e.summary??``};return j(M,{get when(){return!i()},get fallback(){return j(b1,{get issueId(){return i()},onBack:()=>a(null)})},get children(){var e=I1(),t=e.firstChild,n=t.firstChild.nextSibling,i=n.firstChild,c=i.nextSibling;c.nextSibling;var l=t.nextSibling;return P(n,()=>r().length,i),P(n,()=>r().length===1?``:`s`,c),P(l,j(M,{get when(){return r().length>0},get fallback(){return j(Vj,{title:`Nothing running`,children:`Delegate an issue from the Draft tab — cloud (Cursor) and local (Claude Code) agents working right now appear here together.`})},get children(){var e=F1();return P(e,j(Ge,{get each(){return r()},children:e=>(()=>{var t=z1(),n=t.firstChild,r=n.firstChild,i=r.firstChild,c=r.nextSibling,l=n.nextSibling,u=l.nextSibling,d=u.firstChild;return P(n,j(Aj,{size:12}),r),P(n,j(zj,{get title(){return e().kind===`cloud`?`Cursor cloud agent`:`Local Claude Code`},get children(){return[$e(()=>$e(()=>e().kind===`cloud`)()?j(Pj,{}):j(Fj,{})),$e(()=>e().kind===`cloud`?`cloud`:`local`)]}}),r),r.$$click=()=>{let t=e();t.kind===`cloud`&&t.session.issue?a(t.session.issue.id):t.kind===`local`&&sj(`local`)},P(r,j(M,{get when(){return e().kind===`cloud`},get children(){var t=L1();return P(t,()=>e().session.issue?.identifier),t}}),i),P(i,(()=>{var t=$e(()=>e().kind===`cloud`);return()=>t()?e().session.issue?.title??`Conversation session`:e().task.title})()),P(c,()=>Wj(e().at)),P(l,(()=>{var t=$e(()=>e().kind===`cloud`);return()=>t()?s(e().session):e().task.lastText})()),P(u,j(M,{get when(){return e().kind===`cloud`},get fallback(){return j(zj,{color:`var(--color-accent)`,children:`Working…`})},get children(){return j(zj,{get color(){return o(e().session.status).color},get children(){return o(e().session.status).word}})}}),d),P(u,j(q,{variant:`ghost`,class:`size-6 shrink-0 px-0`,get title(){return e().kind===`cloud`?`Open the thread — steer this agent`:`Open the live session in the Local tab`},"aria-label":`Open thread`,onClick:()=>{let t=e();t.kind===`cloud`&&t.session.issue?a(t.session.issue.id):t.kind===`local`&&sj(`local`)},get children(){return R1()}}),null),D(()=>it(r,`title`,e().kind===`cloud`?`View the thread here`:`Open the Local tab`)),t})()})),e}})),e}})}rt([`click`]),Br();var V1=N(`<div class="border-accent/40 bg-accent-soft self-end rounded-lg border px-2.5 py-1.5"><p class="text-accent mb-0.5 text-[9.5px] font-semibold tracking-wide uppercase">You</p><div class="lg-md text-text text-[11.5px] leading-relaxed break-words">`),H1=N(`<div><p></p><div class="lg-md text-text text-[11.5px] leading-relaxed break-words">`),U1=N(`<p>`),W1=N(`<span class="text-text-faint max-w-[55%] truncate text-[10.5px] tabular-nums"> running<!> · `),G1=N(`<div class="flex flex-col gap-1.5">`),K1=N(`<div class="flex h-full flex-col"><div class="border-border flex shrink-0 items-center justify-between border-b px-3 py-2"><span class="text-text text-[12px] font-semibold">Local Claude Code</span></div><div class="min-h-0 flex-1 overflow-y-auto pt-2 pb-3 pl-2 pr-3">`),q1=N(`<span class="bg-surface-2 border-border font-mono mt-2 block rounded-md border px-2 py-1.5 text-[11px] select-all">npx linear-grab-bridge`),J1=N(`<span class="text-text-faint text-[10.5px] tabular-nums">ctx <!> · out `),Y1=N(`<div class="flex min-w-0 items-center gap-1.5"><span class="font-mono text-text-faint min-w-0 truncate text-[10.5px]">`),X1=N(`<option selected>`),Z1=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=currentColor aria-hidden><path d="M4.5 2.8a.8.8 0 0 1 1.22-.68l8 5.2a.8.8 0 0 1 0 1.36l-8 5.2a.8.8 0 0 1-1.22-.68V2.8Z">`),Q1=N(`<span class="text-success text-[12px] leading-none">✓`),$1=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linejoin=round aria-hidden><path d="M14 10a2 2 0 0 1-2 2H6l-3.5 2.5V4a2 2 0 0 1 2-2H12a2 2 0 0 1 2 2v6Z">`),e0=N(`<svg width=11 height=11 viewBox="0 0 16 16"fill=currentColor aria-hidden><rect x=3 y=3 width=10 height=10 rx=1.5>`),t0=N(`<span class="font-mono text-text-faint min-w-0 truncate text-[10.5px]">`),n0=N(`<div class="border-border bg-bg flex flex-col gap-1 rounded-md border p-2"><div class="flex min-w-0 items-center gap-1.5"><span class="text-text-dim text-[10.5px] font-semibold tracking-wide uppercase">Changes</span><span class="ml-auto shrink-0 text-[10.5px] tabular-nums"><span class=text-success>+</span> <span class=text-danger>−`),r0=N(`<div class="border-border bg-bg flex max-h-80 flex-col gap-1.5 overflow-y-auto rounded-md border py-2 pl-2 pr-3">`),i0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><circle cx=8 cy=8 r=2.2></circle><path d="M8 1v3M8 12v3M1 8h3M12 8h3">`),a0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M13 7.5 8.2 12.3a3.2 3.2 0 0 1-4.5-4.5L8.9 2.6a2.1 2.1 0 0 1 3 3L7.1 10.4a1 1 0 0 1-1.5-1.5l4.3-4.3">`),o0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M8 2v4M8 10v4M2 8h4M10 8h4M4.5 4.5 6 6M11.5 11.5 10 10M11.5 4.5 10 6M4.5 11.5 6 10">`),s0=N(`<span class="inline-block min-w-[4ch] text-center">Send`),c0=N(`<div class="flex flex-col gap-1.5"><div class="flex items-center gap-1"><span class="text-text-faint min-w-0 flex-1 truncate text-[10.5px]">`),l0=N(`<div class="bg-surface border-border flex flex-col gap-1.5 rounded-lg border p-2.5"><div class="flex min-w-0 items-center gap-1.5"><span class="text-text min-w-0 truncate text-[12.5px] font-medium"></span><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums"></span></div><p class="text-text-dim text-[11.5px] leading-snug break-words"></p><div class="flex flex-wrap items-center gap-1.5"></div><div class="flex items-center gap-1">`),u0=N(`<span aria-hidden class="size-2 shrink-0 rounded-full">`),d0=N(`<div class="flex min-w-0 items-center gap-1.5">`),f0=N(`<option>`),p0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 aria-hidden><circle cx=8 cy=8 r=6></circle><circle cx=8 cy=8 r=1.6 fill=currentColor stroke=none>`),m0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M2.5 3.5 6 7 2.5 10.5M7.5 12.5h6">`),h0=N(`<span class=text-success>+`),g0=N(`<span class=text-danger>−`),_0=N(`<div class="flex min-w-0 items-center gap-1.5"><span class="font-mono text-text-dim min-w-0 flex-1 truncate text-[10.5px]"></span><span class="shrink-0 text-[10px] tabular-nums">`),v0=N(`<span class=text-text-faint>bin`),y0=N(`<div class="flex min-w-0 items-center gap-1.5"><span class="font-mono text-text-dim min-w-0 flex-1 truncate text-[10.5px]"></span><span class="text-success shrink-0 text-[10px]">new`),b0=N(`<div class="flex min-w-0 items-center gap-1.5 pt-0.5"><a target=_blank rel=noreferrer class="text-accent min-w-0 truncate text-[11px] hover:underline">`),x0=N(`<p class="text-text-faint text-[11px]">Waiting for output…`),S0=[{id:``,label:`Default model`},{id:`fable`,label:`Fable 5`},{id:`opus`,label:`Opus`},{id:`sonnet`,label:`Sonnet`},{id:`haiku`,label:`Haiku`}];function C0(e,t){let n=e.split(`.`).map(Number),r=t.split(`.`).map(Number);for(let e=0;e<3;e++)if((n[e]??0)!==(r[e]??0))return(n[e]??0)<(r[e]??0);return!1}var w0=e=>e==null?`–`:e>=1e3?`${(e/1e3).toFixed(e>=1e5?0:1)}k`:String(e);function T0(){let e=sr(),t=_r(()=>({queryKey:[`bridge-health`],queryFn:NO,refetchInterval:5e3,retry:0})),n=_r(()=>({queryKey:[`bridge-tasks`],queryFn:PO,refetchInterval:3e3,enabled:!!t.data?.ok})),[r,i]=T(null),a=_r(()=>({queryKey:[`my-issues`],queryFn:pO,staleTime:15e3})),o=e=>{let t=e.title.match(/^([A-Z][A-Z0-9]*-\d+)/)?.[1];return t?a.data?.find(e=>e.identifier===t):void 0},s=_r(()=>({queryKey:[`bridge-task`,r()],queryFn:()=>FO(r()),refetchInterval:1500,enabled:!!r()&&!!t.data?.ok})),c=_r(()=>({queryKey:[`bridge-diff`,r()],queryFn:()=>VO(r()),refetchInterval:6e3,enabled:!!r()&&!!t.data?.ok})),l=()=>{e.invalidateQueries({queryKey:[`bridge-tasks`]}),e.invalidateQueries({queryKey:[`bridge-task`,r()]})},u=vr(()=>({mutationFn:e=>zO(e),onSuccess:l})),[d,f]=br(`local:message`,``),[p,m]=T(!1),[h,g]=T(0),_=_r(()=>({queryKey:[`grab`],queryFn:Dr,enabled:lj()===`local`})),v=()=>{g(Date.now()),dj(`local`),YZ().catch(()=>dj(`capture`))};O(()=>{if(lj()!==`local`)return;let e=(_.data??[]).filter(e=>e.grabbedAt>=h());if(!e.length)return;let t=e.map(e=>{let t=e.source?.filePath?` — \`${e.source.filePath}${e.source.lineNumber==null?``:`:${e.source.lineNumber}`}\``:``;return`- \`<${e.componentName??e.tagName??`element`}>\`${t}`}).join(`
|
|
270
|
-
`);f(e=>`${e?`${e}\n`:``}${t}\n`),dj(`capture`)});let y=async()=>{m(!0);try{let{block:e,failed:t}=await f$();e&&f(t=>`${t?`${t}\n`:``}${e}\n`),t.length&&f(e=>`${e}\n<!-- upload issues: ${t.join(` · `)} -->\n`)}finally{m(!1)}},b=vr(()=>({mutationFn:e=>LO(e.id,e.text),onSuccess:()=>{f(``),l()}})),x=vr(()=>({mutationFn:e=>RO(e.id,e.model),onSuccess:t=>{e.setQueryData([`bridge-tasks`],e=>e?.map(e=>e.id===t.id?t:e)),l()}})),S=vr(()=>({mutationFn:e=>BO(e),onSuccess:l})),C,w=!0,E=()=>{C&&(w=C.scrollTop+C.clientHeight>=C.scrollHeight-48)};O(()=>{let e=s.data?.tail?.length??0;r(),!(!C||!e||!w)&&requestAnimationFrame(()=>{C&&(C.scrollTop=C.scrollHeight)})});let[ee,te]=T(null),A=async e=>{try{await navigator.clipboard.writeText(XO(e)),te(e.id),setTimeout(()=>te(null),1800)}catch{}},ne=e=>e===`running`?`var(--color-accent)`:e===`done`?`var(--color-success)`:e===`stopped`?`var(--color-warn)`:`var(--color-danger)`,re=e=>{let t=e.line.kind,n=k(()=>S$(e.line.text));return t===`user`?(()=>{var e=V1(),t=e.firstChild.nextSibling;return D(()=>t.innerHTML=n()),e})():t===`assistant`||t===`result`?(()=>{var e=H1(),r=e.firstChild,i=r.nextSibling;return st(e,`bg-surface rounded-lg border px-2.5 py-1.5 ${t===`result`?`border-success/40`:`border-border`}`),st(r,`mb-0.5 text-[9.5px] font-semibold tracking-wide uppercase ${t===`result`?`text-success`:`text-text-faint`}`),P(r,t===`result`?`Result`:`Claude`),D(()=>i.innerHTML=n()),e})():(()=>{var n=U1();return st(n,`font-mono px-1 text-[10px] leading-relaxed break-words ${t===`subagent`?`text-warn`:t===`stderr`?`text-danger`:`text-text-faint`}`),P(n,()=>e.line.text),n})()};return(()=>{var e=K1(),a=e.firstChild;a.firstChild;var l=a.nextSibling;return P(a,j(M,{get when(){return t.data?.ok},get fallback(){return j(zj,{class:`text-danger`,children:`bridge offline`})},get children(){return[j(M,{get when(){return C0(t.data.version,`0.15.1`)},get children(){return j(zj,{class:`text-warn`,title:`Ctrl+C the old process, then: npx linear-grab-bridge`,get children(){return[`v`,$e(()=>t.data.version),` outdated — restart`]}})}}),(()=>{var e=W1(),r=e.firstChild,i=r.nextSibling;return i.nextSibling,P(e,()=>t.data.active,r),P(e,()=>{let e=(n.data??[]).reduce((e,t)=>e+(t.usage?.costUsd??0),0);return e>0?` · Σ $${e.toFixed(2)}`:``},i),P(e,()=>t.data.cwd.split(`/`).slice(-2).join(`/`),null),D(()=>it(e,`title`,t.data?.cwd)),e})()]}}),null),P(l,j(M,{get when(){return t.data?.ok},get fallback(){return j(Vj,{title:`Bridge not running`,get children(){return[`Start it in your repo's terminal:`,q1(),`Then delegate from the Draft tab ("Local Claude Code") or watch tasks here. Sessions stay interactive — send follow-ups, switch models, interrupt, resume in your terminal. History persists across restarts.`]}})},get children(){return j(M,{get when(){return(n.data??[]).length>0},get fallback(){return j(Vj,{title:`No local tasks yet`,children:`Create an issue in Draft with "Delegate to → Local Claude Code", and it appears here with live status and a conversation view.`})},get children(){var e=G1();return P(e,j(Ge,{get each(){return n.data},children:e=>(()=>{var t=l0(),n=t.firstChild,a=n.firstChild,l=a.nextSibling,m=n.nextSibling,h=m.nextSibling,g=h.nextSibling;return P(n,j(M,{get when(){return e().status===`running`},get fallback(){return(()=>{var t=u0();return D(n=>dt(t,`background`,ne(e().status))),t})()},get children(){return j(Aj,{})}}),a),P(a,()=>e().title),P(l,()=>Wj(e().startedAt)),P(m,()=>e().lastText),P(h,j(zj,{get color(){return ne(e().status)},get children(){return e().status}}),null),P(h,j(zj,{get children(){return e().model??`default model`}}),null),P(h,j(M,{get when(){return e().pendingModel},get children(){return j(zj,{class:`text-warn`,get children(){return[`→ `,$e(()=>e().pendingModel),` next msg`]}})}}),null),P(h,j(M,{get when(){return e().subagents>0},get children(){return j(zj,{class:`text-warn`,get children(){return[`⛓ `,$e(()=>e().subagents),` subagents`]}})}}),null),P(h,j(M,{get when(){return e().usage},get children(){var t=J1(),n=t.firstChild.nextSibling;return n.nextSibling,P(t,()=>w0(e().usage.contextTokens),n),P(t,()=>w0(e().usage.outputTokens),null),P(t,(()=>{var t=$e(()=>!!e().usage.costUsd);return()=>t()?` · $${e().usage.costUsd.toFixed(2)}`:``})(),null),t}}),null),P(t,j(M,{get when(){return o(e())},children:e=>(()=>{var t=d0();return P(t,j(zj,{get children(){return e().state.name}}),null),P(t,j(Ij,{get href(){return e().url},children:`Open in Linear`}),null),t})()}),g),P(t,j(M,{get when(){return $e(()=>!!e().worktree)()&&!e().worktree.removed},get children(){var t=Y1(),n=t.firstChild;return P(t,j(zj,{class:`text-warn`,children:`⎇ worktree`}),n),P(n,()=>e().worktree.branch),P(t,j(M,{get when(){return e().status!==`running`},get children(){return j(q,{variant:`ghost`,class:`ml-auto h-6 shrink-0 px-2 text-[11px]`,get loading(){return S.isPending},get title(){return`Remove the worktree at ${e().worktree.path} — the branch (and PR) survive`},onClick:()=>S.mutate(e().id),children:`Remove`})}}),null),D(()=>it(n,`title`,e().worktree.path)),t}}),g),P(g,j(Nj,{class:`h-7 w-auto min-w-0 flex-1 text-[11px]`,get value(){return e().pendingModel??e().model??``},onChange:t=>x.mutate({id:e().id,model:t.currentTarget.value}),title:`Model — applies from the next message`,get children(){return[j(We,{each:S0,children:t=>(()=>{var n=f0();return P(n,()=>t.label),D(()=>n.selected=(e().pendingModel??e().model??``)===t.id),D(()=>n.value=t.id),n})()}),j(M,{get when(){return!S0.some(t=>t.id===(e().pendingModel??e().model??``))},get children(){var t=X1();return P(t,()=>e().pendingModel??e().model),D(()=>t.value=e().pendingModel??e().model??``),t}})]}}),null),P(g,j(M,{get when(){return $e(()=>e().status!==`running`)()&&e().sessionId},get children(){return j(q,{variant:`ghost`,class:`size-7 px-0`,get loading(){return b.isPending},get title(){return`Resume — continues this session${e().pendingModel?` on ${e().pendingModel}`:``}`},"aria-label":`Resume session`,onClick:()=>b.mutate({id:e().id,text:`Continue where you left off. If the work is already complete, finish any remaining closeout steps (PR, Linear update, announcement).`}),get children(){return Z1()}})}}),null),P(g,j(M,{get when(){return o(e())},children:e=>j(q,{variant:`ghost`,class:`size-7 px-0`,title:`Open the issue's Activity thread`,onClick:()=>sj(`activity`,e().id),get children(){return p0()}})}),null),P(g,j(q,{variant:`ghost`,class:`size-7 px-0`,get disabled(){return!e().sessionId},get title(){return $e(()=>!!e().sessionId)()?`Copy resume command · session ${e().sessionId.slice(0,8)}…`:`No session yet`},onClick:()=>void A(e()),get children(){return j(M,{get when(){return ee()===e().id},get fallback(){return m0()},get children(){return Q1()}})}}),null),P(g,j(q,{variant:`ghost`,class:`size-7 px-0`,get title(){return r()===e().id?`Hide thread`:`Open thread — chat & changes`},onClick:()=>i(r()===e().id?null:e().id),get children(){return $1()}}),null),P(g,j(M,{get when(){return e().status===`running`},get children(){return j(q,{variant:`danger`,class:`size-7 px-0`,get loading(){return u.isPending},title:`Interrupt — the session stays resumable`,onClick:()=>u.mutate(e().id),get children(){return e0()}})}}),null),P(t,j(M,{get when(){return r()===e().id},get children(){return[j(M,{get when(){return $e(()=>!!c.data)()&&(c.data.files.length||c.data.untracked.length||c.data.prs.length)},get children(){var e=n0(),t=e.firstChild,n=t.firstChild.nextSibling,r=n.firstChild;r.firstChild;var i=r.nextSibling.nextSibling;return i.firstChild,P(t,j(M,{get when(){return c.data.branch},get children(){var e=t0();return P(e,()=>c.data.branch),e}}),n),P(r,()=>c.data.totalAdded,null),P(i,()=>c.data.totalDeleted,null),P(e,j(We,{get each(){return c.data.files},children:e=>(()=>{var t=_0(),n=t.firstChild,r=n.nextSibling;return P(n,()=>e.path),P(r,j(M,{get when(){return!e.binary},get fallback(){return v0()},get children(){return[(()=>{var t=h0();return t.firstChild,P(t,()=>e.added,null),t})(),` `,(()=>{var t=g0();return t.firstChild,P(t,()=>e.deleted,null),t})()]}})),D(()=>it(n,`title`,e.path)),t})()}),null),P(e,j(We,{get each(){return c.data.untracked},children:e=>(()=>{var t=y0(),n=t.firstChild;return it(n,`title`,e),P(n,e),t})()}),null),P(e,j(We,{get each(){return c.data.prs},children:e=>(()=>{var t=b0(),n=t.firstChild;return P(t,j(zj,{class:`text-accent`,get children(){return[`PR · `,$e(()=>e.state.toLowerCase())]}}),n),P(n,()=>e.title),D(t=>{var r=e.url,i=e.title;return r!==t.e&&it(n,`href`,t.e=r),i!==t.t&&it(n,`title`,t.t=i),t},{e:void 0,t:void 0}),t})()}),null),e}}),(()=>{var e=r0();return e.addEventListener(`scroll`,E),pt(e=>{C=e,w=!0},e),P(e,j(M,{get when(){return(s.data?.tail??[]).length>0},get fallback(){return x0()},get children(){return j(Ge,{get each(){return s.data?.tail??[]},children:e=>j(re,{get line(){return e()}})})}})),e})(),(()=>{var t=c0(),n=t.firstChild,r=n.firstChild;return P(t,j(Mj,{rows:2,get placeholder(){return e().status===`running`?`Message the working agent — it queues into the live session…`:`Follow-up — resumes the session…`},get value(){return d()},onInput:e=>f(e.currentTarget.value)}),n),P(r,(()=>{var t=$e(()=>!!e().alive);return()=>t()?`live session`:e().sessionId?`resumes on send`:`no session`})()),P(n,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,title:`Pick elements on the page — refs drop into this message`,"aria-label":`Pick element`,onClick:v,get children(){return i0()}}),null),P(n,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,get loading(){return p()},title:`Attach captures — element refs, screenshots, region shots, recording GIF`,"aria-label":`Attach captures`,onClick:()=>void y(),get children(){return a0()}}),null),P(n,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,get disabled(){return $e(()=>!e().alive)()&&!e().sessionId},title:`Compact the session — frees context (sends /compact)`,"aria-label":`Compact session`,onClick:()=>b.mutate({id:e().id,text:`/compact`}),get children(){return o0()}}),null),P(n,j(q,{variant:`primary`,class:`shrink-0`,get loading(){return b.isPending},get disabled(){return!d().trim()||!e().alive&&!e().sessionId},onClick:()=>b.mutate({id:e().id,text:d().trim()}),get children(){return s0()}}),null),t})()]}}),null),t})()})),e}})}})),e})()}Br();var E0=N(`<span class="text-text-faint text-[10.5px] tabular-nums">/<!> from your issues`),D0=N(`<div class="flex flex-col gap-1.5">`),O0=N(`<div class="flex h-full flex-col"><div class="border-border flex shrink-0 items-center justify-between border-b px-3 py-2"><span class="text-text text-[12px] font-semibold">Pull requests</span></div><div class="border-border flex shrink-0 items-center gap-1.5 border-b px-3 py-1.5"><div class="bg-surface-2 border-border flex shrink-0 rounded-md border p-0.5"></div></div><div class="min-h-0 flex-1 overflow-y-auto pt-2 pb-3 pl-2 pr-3">`),k0=N(`<span class="text-warn text-[10.5px]"title="Merge states come from gh via the bridge">states unknown — restart the bridge`),A0=N(`<button>`),j0=N(`<span class="text-success text-[11px]">✓`),M0=N(`<span class="text-[12px] leading-none">✓`),N0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><circle cx=8 cy=8 r=6></circle><circle cx=8 cy=8 r=1.6 fill=currentColor stroke=none>`),P0=N(`<span class="text-success text-[12px] leading-none">✓`),F0=N(`<div class="bg-surface border-border flex flex-col gap-1.5 rounded-lg border p-2.5"><a target=_blank rel=noreferrer class="text-accent truncate text-[12.5px] font-medium hover:underline"></a><div class="flex min-w-0 items-center gap-1.5"><span class="font-mono text-text-dim shrink-0 text-[11px]"></span><span class="text-text-dim truncate text-[11.5px]"></span><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums"></span></div><div class="flex min-w-0 flex-wrap items-center gap-1.5"><div class="ml-auto flex shrink-0 items-center gap-1">`),I0=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M8 2 14 5.5 8 9 2 5.5 8 2Z"></path><path d="M2 10.5 8 14l6-3.5">`),L0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><circle cx=4 cy=3.5 r=1.5></circle><circle cx=4 cy=12.5 r=1.5></circle><circle cx=12 cy=8 r=1.5></circle><path d="M4 5v6M4 6.5c0 2 2 3 4.5 3h2">`),R0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=9 height=9 rx=1.5></rect><path d="M10.5 5.5v-2a2 2 0 0 0-2-2h-5a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h2">`),z0=/github\.com\/[^/]+\/[^/]+\/pull\/\d+/i;function B0(e){let t=_r(()=>({queryKey:[`my-issues`],queryFn:pO,refetchInterval:15e3})),n=k(()=>(t.data??[]).flatMap(e=>(e.attachments??[]).filter(e=>z0.test(e.url)).map(t=>({issue:e,attachment:t})))),r=_r(()=>({queryKey:[`bridge-tasks`],queryFn:PO,refetchInterval:1e4,retry:0})),i=_r(()=>({queryKey:[`pr-status`,n().map(e=>e.attachment.url).sort().join(`|`)],queryFn:()=>UO(n().map(e=>e.attachment.url)),refetchInterval:3e4,retry:0,enabled:n().length>0})),[a,o]=T(new Set),s=e=>a().has(e.attachment.url)?`MERGED`:i.data?.statuses[e.attachment.url],c=e=>!!r.data?.some(t=>t.title.startsWith(e.issue.identifier)),[l,u]=T(`all`),[d,f]=T(``),p=k(()=>{let e=d().trim().toLowerCase();return n().filter(t=>{let n=t.issue.state.type,r=s(t);return!(l()===`review`&&(n!==`started`||r===`MERGED`||r===`CLOSED`)||l()===`open`&&(r===`MERGED`||r===`CLOSED`||!(n===`started`||n===`unstarted`||n===`backlog`))||l()===`done`&&!(n===`completed`||r===`MERGED`||r===`CLOSED`)||e&&![t.attachment.title,t.issue.title,t.issue.identifier].join(` `).toLowerCase().includes(e))})}),m=_r(()=>({queryKey:[`settings`],queryFn:Tr})),h=()=>m.data?.stagingBranch?.trim()||`staging`,[g,_]=T(null),[v,y]=T(new Set),[b,x]=T(null),S=async e=>{_(e),x(null);try{await WO(e,h()),y(t=>new Set(t).add(e))}catch(e){x(e instanceof Error?e.message:String(e))}finally{_(null)}},[C,w]=T(null),[E,O]=T(null),ee=async e=>{O(e);try{await JO(e),o(t=>new Set(t).add(e))}catch{}finally{O(null)}},te=async e=>{try{await navigator.clipboard.writeText(e.attachment.url),w(e.attachment.id),setTimeout(()=>w(null),1500)}catch{}};return(()=>{var r=O0(),o=r.firstChild;o.firstChild;var m=o.nextSibling,_=m.firstChild,y=m.nextSibling;return P(o,j(M,{get when(){return!i.isError},get fallback(){return k0()},get children(){var e=E0(),t=e.firstChild,r=t.nextSibling;return r.nextSibling,P(e,()=>p().length,t),P(e,()=>n().length,r),e}}),null),P(_,j(We,{each:[{id:`all`,label:`All`},{id:`review`,label:`Review`},{id:`open`,label:`Open`},{id:`done`,label:`Done`}],children:e=>(()=>{var t=A0();return t.$$click=()=>u(e.id),P(t,()=>e.label),D(()=>st(t,`rounded-[5px] px-2 py-0.5 text-[11px] font-medium transition-colors ${l()===e.id?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`)),t})()})),P(m,j(jj,{class:`h-6 min-w-0 flex-1 text-[11px]`,placeholder:`Search PRs…`,get value(){return d()},onInput:e=>f(e.currentTarget.value)}),null),P(y,j(M,{get when(){return p().length>0},get fallback(){return j(Vj,{title:`No PRs yet`,get children(){return $e(()=>!!t.isError)()?`Connect Linear in Settings.`:n().length>0?`No PRs match the current filter.`:`PRs opened by delegated agents appear here as soon as they link back to your issues.`}})},get children(){var t=D0();return P(t,j(We,{get each(){return p()},children:t=>(()=>{var n=F0(),r=n.firstChild,o=r.nextSibling,l=o.firstChild,u=l.nextSibling,d=u.nextSibling,f=o.nextSibling,p=f.firstChild;return P(r,()=>t.attachment.title||t.attachment.url),P(n,j(M,{get when(){return i.data?.previews[t.attachment.url]},get children(){return j(Ij,{get href(){return i.data.previews[t.attachment.url]},class:`shrink-0 self-start`,title:`Vercel deploy preview of this PR's branch`,children:`Preview`})}}),o),P(o,j(Bj,{get color(){return t.issue.state.color}}),l),P(l,()=>t.issue.identifier),P(u,()=>t.issue.title),P(d,()=>Wj(t.issue.updatedAt)),P(f,j(zj,{get children(){return t.issue.state.name}}),p),P(f,j(M,{get when(){return t.issue.delegate},get children(){return j(zj,{class:`text-accent`,get children(){return[j(Pj,{}),` `,$e(()=>t.issue.delegate.displayName)]}})}}),p),P(f,j(M,{get when(){return c(t)},get children(){return j(zj,{class:`text-warn`,get children(){return[j(Fj,{}),` local`]}})}}),p),P(f,j(Ij,{get href(){return t.issue.url},class:`shrink-0`,title:`Open the issue in Linear`,children:`Linear`}),p),P(p,j(M,{get when(){return $e(()=>!!s(t))()&&s(t)!==`OPEN`},get children(){return j(zj,{get class(){return s(t)===`MERGED`?`text-success`:`text-text-faint`},get children(){return s(t)===`MERGED`?`✓ merged`:`closed`}})}}),null),P(p,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,get loading(){return g()===t.attachment.url},get disabled(){return v().has(t.attachment.url)},get title(){return $e(()=>!!v().has(t.attachment.url))()?`On ${h()} — staging preview deploying`:`Merge into ${h()} — deploys the staging preview domain`},"aria-label":`Merge to staging`,onClick:()=>void S(t.attachment.url),get children(){return j(M,{get when(){return v().has(t.attachment.url)},get fallback(){return I0()},get children(){return j0()}})}}),null),P(p,j(q,{variant:`primary`,class:`size-7 px-0`,get classList(){return{hidden:!!s(t)&&s(t)!==`OPEN`}},get loading(){return E()===t.attachment.url},get disabled(){return a().has(t.attachment.url)},get title(){return a().has(t.attachment.url)?`Merged`:`Squash-merge this PR (bridge gh)`},"aria-label":`Merge PR`,onClick:()=>void ee(t.attachment.url),get children(){return j(M,{get when(){return a().has(t.attachment.url)},get fallback(){return L0()},get children(){return M0()}})}}),null),P(p,j(q,{variant:`ghost`,class:`size-7 px-0`,title:`Open the issue's Activity thread`,"aria-label":`Open issue activity`,onClick:()=>{sj(`activity`,t.issue.id),e.onOpenIssue()},get children(){return N0()}}),null),P(p,j(q,{variant:`ghost`,class:`size-7 px-0`,title:`Copy PR URL`,"aria-label":`Copy PR URL`,onClick:()=>void te(t),get children(){return j(M,{get when(){return C()===t.attachment.id},get fallback(){return R0()},get children(){return P0()}})}}),null),P(f,j(M,{get when(){return v().has(t.attachment.url)},get children(){return j(u$,{get url(){return t.attachment.url},get base(){return h()}})}}),null),D(e=>{var n=t.attachment.url,i=t.attachment.title;return n!==e.e&&it(r,`href`,e.e=n),i!==e.t&&it(r,`title`,e.t=i),e},{e:void 0,t:void 0}),n})()})),t}})),r})()}rt([`click`]);var V0=[`display`,`align-items`,`justify-content`,`gap`,`padding`,`margin`,`width`,`height`,`font-size`,`font-weight`,`line-height`,`letter-spacing`,`color`,`background-color`,`border-radius`,`border-width`,`border-color`,`box-shadow`,`opacity`,`transform`,`transition-property`,`transition-duration`],H0=new Set([`color`,`background-color`,`border-color`]),U0={margin:new Set([`0px`]),padding:new Set([`0px`]),gap:new Set([`normal`,`0px`]),"box-shadow":new Set([`none`]),transform:new Set([`none`]),"border-width":new Set([`0px`]),"border-radius":new Set([`0px`]),"letter-spacing":new Set([`normal`]),opacity:new Set([`1`]),"transition-property":new Set([`all`,`none`]),"transition-duration":new Set([`0s`]),width:new Set([`auto`]),height:new Set([`auto`])},W0=null;function G0(e){try{return W0||(W0=document.createElement(`span`),W0.style.display=`none`,document.body.appendChild(W0)),W0.style.color=``,W0.style.color=e,W0.style.color?getComputedStyle(W0).color:null}catch{return null}}var K0=null;function q0(){if(K0)return K0;let e=new Map,t=getComputedStyle(document.documentElement),n=new Set;for(let r of Array.from(document.styleSheets)){let i;try{i=r.cssRules}catch{continue}for(let r of Array.from(i)){let i=r.style;if(i)for(let r=0;r<i.length;r++){let a=i.item(r);if(!a.startsWith(`--`)||n.has(a))continue;n.add(a);let o=t.getPropertyValue(a).trim()||i.getPropertyValue(a).trim();if(!o||o.length>80)continue;let s=G0(o);s&&!e.has(s)&&e.set(s,a)}}}return K0=e,e}function J0(e){let t=e.getBoundingClientRect();if(t.width<2&&t.height<2)return!1;let n=getComputedStyle(e);return n.display!==`none`&&n.visibility!==`hidden`}function Y0(e){let t=[],n=e.getAttribute(`role`);n&&t.push(n);for(let n of[`data-state`,`data-highlighted`,`aria-expanded`,`aria-selected`,`data-active`]){let r=e.getAttribute(n);r!=null&&t.push(`${n.replace(/^(data|aria)-/,``)}=${r||`true`}`)}return t.join(` `)}async function X0(){try{return(await Promise.resolve().then(()=>(RZ(),AZ))).getGlobalApi()?.getDisplayName??null}catch{return null}}function Z0(e,t){let n=null;try{n=t?.(e)??null}catch{}let r=Y0(e),i=n||e.tagName.toLowerCase();return r?`${i} [${r}]`:i}function Q0(e,t){let n=getComputedStyle(e),r={},i={};for(let e of V0){let a=n.getPropertyValue(e).trim();if(!(!a||U0[e]?.has(a)))if(H0.has(e)){let n=G0(a);if(n===`rgba(0, 0, 0, 0)`)continue;let o=n?t.get(n):void 0;o&&(i[e]=o),r[e]=a}else r[e]=a}return{styles:r,tok:i}}var $0=40;async function e2(e){let t=q0(),n=await X0(),r=[],i=new Map,a=e=>{if(r.length>=$0||!J0(e))return;let o=typeof e.className==`string`?e.className:``,s=`${e.tagName}|${o}`,c=i.get(s);if(c)c.count+=1;else{let{styles:a,tok:c}=Q0(e,t),l={label:Z0(e,n),count:1,classes:o,styles:a,tokens:c};i.set(s,l),r.push(l)}for(let t of Array.from(e.children))a(t)};return a(e),{title:r[0]?.label??e.tagName.toLowerCase(),pageUrl:location.href,extractedAt:Date.now(),nodes:r,states:[]}}var t2={active:!1,msLeft:0,total:0,byTrigger:{}},n2=new Set;function r2(e){t2={...t2,...e};for(let e of n2)e(t2)}function i2(e){return n2.add(e),e(t2),()=>void n2.delete(e)}var a2=null;function o2(){a2?.()}function s2(e){return e===`hover`||e===`focus`?e:`open`}async function c2(e,t,n){let r=q0(),i=await X0(),a=[],o=new Set,s=new Map,c=e=>Q0(e,r).styles,l=e=>{if(!(s.size>=120)){s.set(e,c(e));for(let t of Array.from(e.children))l(t)}};l(e);let u=(e,t)=>{let n=s.get(e);if(!n)return;let r=c(e),l={};for(let e of new Set([...Object.keys(n),...Object.keys(r)])){let t=n[e]??`(unset)`,i=r[e]??`(unset)`;t!==i&&(l[e]={from:t,to:i})}if(Object.keys(l).length===0)return;let u=Z0(e,i),d=`${t}|${u}|${Object.keys(l).join(`,`)}`;if(o.has(d))return;o.add(d),a.push({trigger:t,label:u,changed:l});let f=s2(t);r2({total:t2.total+1,byTrigger:{...t2.byTrigger,[f]:(t2.byTrigger[f]??0)+1}})},d=e=>{let t=e.target;t instanceof Element&&s.has(t)&&setTimeout(()=>u(t,`hover`),50)},f=e=>{let t=e.target;t instanceof Element&&s.has(t)&&setTimeout(()=>u(t,`focus`),50)};e.addEventListener(`pointerover`,d,!0),e.addEventListener(`focusin`,f,!0);let p=new MutationObserver(e=>{for(let t of e){if(t.type!==`attributes`||!(t.target instanceof Element))continue;let e=t.target,n=t.attributeName??``,r=e.getAttribute(n)??``;setTimeout(()=>u(e,`attr:${n}=${r||`true`}`),50)}});p.observe(e,{subtree:!0,attributes:!0,attributeFilter:[`class`,`data-state`,`data-highlighted`,`aria-expanded`,`aria-selected`,`open`]});let m=new MutationObserver(t=>{for(let n of t)for(let t of Array.from(n.addedNodes))!(t instanceof Element)||e.contains(t)||t.id===`linear-grab-root`||t.closest?.(`#linear-grab-root`)||setTimeout(()=>{if(!t.isConnected||!J0(t))return;let{styles:e}=Q0(t,r);if(Object.keys(e).length===0)return;let n=Z0(t,i),s=`appeared|${n}`;if(o.has(s))return;o.add(s);let c={};for(let[t,n]of Object.entries(e))c[t]={from:`(absent)`,to:n};a.push({trigger:`appeared (portal/open)`,label:n,changed:c}),r2({total:t2.total+1,byTrigger:{...t2.byTrigger,open:(t2.byTrigger.open??0)+1}})},50)});m.observe(document.body,{childList:!0,subtree:!1}),r2({active:!0,msLeft:t,total:0,byTrigger:{}});let h=setInterval(()=>{let e=t-(Date.now()-g);n?.(Math.max(0,e)),r2({msLeft:Math.max(0,e)})},250),g=Date.now();return await new Promise(e=>{let n=setTimeout(e,t);a2=()=>{clearTimeout(n),e()}}),a2=null,r2({active:!1,msLeft:0}),clearInterval(h),e.removeEventListener(`pointerover`,d,!0),e.removeEventListener(`focusin`,f,!0),p.disconnect(),m.disconnect(),a}function l2(e){let t=[`# Design genome: ${e.title}`,`Extracted from ${e.pageUrl}`,``,`## Structure`];for(let n of e.nodes){t.push(`### ${n.label}${n.count>1?` ×${n.count}`:``}`),n.classes&&t.push(`classes: \`${n.classes}\``);let e=Object.entries(n.styles).map(([e,t])=>{let r=n.tokens[e];return`${e}: ${t}${r?` ← var(${r})`:``}`});e.length&&t.push("```",...e,"```")}if(e.states.length){t.push(``,`## Interaction states`);for(let n of e.states)t.push(`### ${n.label} — ${n.trigger}`),t.push("```",...Object.entries(n.changed).map(([e,t])=>`${e}: ${t.from} → ${t.to}`),"```")}return t.join(`
|
|
271
|
-
`)}function u2(){return new Promise(e=>{let t=document.createElement(`div`);t.style.cssText=`position:fixed;z-index:2147483647;pointer-events:none;border:1.5px solid #5e6ad2;border-radius:4px;background:rgba(94,106,210,0.08);display:none;`,document.body.appendChild(t);let n=null,r=e=>{let t=document.elementFromPoint(e.clientX,e.clientY);return!t||t.closest(`#linear-grab-root`)?null:t},i=e=>{let i=r(e);if(n=i,!i){t.style.display=`none`;return}let a=i.getBoundingClientRect();t.style.display=`block`,t.style.left=`${a.left-2}px`,t.style.top=`${a.top-2}px`,t.style.width=`${a.width+4}px`,t.style.height=`${a.height+4}px`},a=n=>{t.remove(),window.removeEventListener(`mousemove`,i,!0),window.removeEventListener(`click`,o,!0),window.removeEventListener(`keydown`,s,!0),e(n)},o=e=>{e.preventDefault(),e.stopPropagation(),a(n)},s=e=>{e.key===`Escape`&&(e.stopPropagation(),a(null))};window.addEventListener(`mousemove`,i,!0),window.addEventListener(`click`,o,!0),window.addEventListener(`keydown`,s,!0)})}function d2(e){return e.split(`,`).map(e=>{let t=e.trim();return t.endsWith(`ms`)?parseFloat(t)||0:t.endsWith(`s`)?(parseFloat(t)||0)*1e3:0})}var f2=new Set(`width.height.min-width.min-height.max-width.max-height.top.left.right.bottom.inset.margin.margin-top.margin-right.margin-bottom.margin-left.padding.padding-top.padding-right.padding-bottom.padding-left.font-size.line-height.letter-spacing.box-shadow.filter.background-position.grid-template-columns.grid-template-rows.flex-basis.gap`.split(`.`));function p2(e){return e.includes(`all`)?[`all (includes layout/paint props)`]:e.filter(e=>f2.has(e))}function m2(e){let t=h2(e);if(t===`ease-in`||t===`ease-in-out`)return t;let n=t.match(/cubic-bezier\(\s*([\d.]+)\s*,\s*(-?[\d.]+)/);if(n){let e=parseFloat(n[1]),r=parseFloat(n[2]);if(e>=.4&&r<e/2)return t}return null}function h2(e){let t=0;for(let n=0;n<e.length;n++){let r=e[n];if(r===`(`)t++;else if(r===`)`)t--;else if(r===`,`&&t===0)return e.slice(0,n).trim()}return e.trim()}var g2=`[data-slot*="content"], [role="menu"], [role="dialog"], [role="listbox"]`,_2=new Set([`width`,`height`,`flex-basis`,`grid-template-columns`,`grid-template-rows`,`grid-template-areas`]);function v2(e,t){if(e instanceof SVGElement)return!0;try{if(e.closest(`svg`))return!0}catch{}try{if(e.closest(g2))return!0}catch{}try{if(e.closest(`[data-panel]`))return!t||t.length===0||t.every(e=>_2.has(e))}catch{}return!1}function y2(e){let t=e.id?`#${e.id}`:``,n=typeof e.className==`string`&&e.className?`.${e.className.split(/\s+/).filter(Boolean).slice(0,2).join(`.`)}`:``;return`${e.tagName.toLowerCase()}${t}${n}`}var b2=200;function x2(e){if(typeof e.className!=`string`)return;let t=e.className.split(/\s+/).filter(e=>/^(transition|duration-|delay-|ease-)/.test(e));return t.length?t.join(` `):void 0}function S2(e,t,n,r,i,a){let o=[];return n>0&&o.push(`remove the ${Math.round(n)}ms transition-delay`),(r?.includes(`transition-all`)||e.includes(`all`))&&o.push(`scope 'transition-all' to the intended properties (e.g. transition-colors)`),a?.length&&o.push(`JANK: transitions LAYOUT/PAINT props (${a.join(`, `)}) — reflow/repaint every frame; animate transform/opacity instead (box-shadow → animate a pseudo-element's opacity)`),i&&o.push(`easing '${i}' starts slow — §42 bans ease-in/ease-in-out on UI, use ease-out`),t>500?o.push(`${Math.round(t)}ms is over the 500ms HARD CAP for UI feedback`):t>300?o.push(`${Math.round(t)}ms is over the 300ms UI cap`):t>100&&o.push(`shorten ${Math.round(t)}ms → ≤100ms`),o.push(`make PRESS feedback instant: 'active:transition-none' (and data-[state=…]:transition-none for toggles) — animate only hover in/out`),o.join(`; `)}async function C2(){try{return(await Promise.resolve().then(()=>(RZ(),AZ))).getGlobalApi()??null}catch{return null}}async function w2(e){let t=await C2(),n=null,r=null;try{n=t?.getDisplayName?.(e)??null}catch{}try{let n=await t?.getSource?.(e);n?.filePath&&(r=`${n.filePath}${n.lineNumber==null?``:`:${n.lineNumber}`}`)}catch{}return{component:n,source:r}}var T2=[],E2=null;function D2(e){T2.push(e),E2??=setTimeout(()=>{E2=null;let e=T2.slice(0,50).map(e=>({kind:`css-slowdown`,...e}));T2=[],YO().then(t=>fetch(`${t}/scan/events`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({events:e}),keepalive:!0})).catch(()=>{})},1500)}var O2=[],k2=new Set;function A2(e){let t=e.mode===`live`?O2.find(t=>t.mode===`live`&&t.element===e.element&&(t.classHint??``)===(e.classHint??``)&&t.properties.join()===e.properties.join()):void 0;t?(t.count+=1,t.at=e.at,t.sinceInputMs=e.sinceInputMs,O2=[...O2]):O2=[e,...O2].slice(0,100);for(let e of k2)e(O2);D2(e)}function j2(e){return k2.add(e),e(O2),()=>void k2.delete(e)}function M2(){O2=[];for(let e of k2)e(O2)}var N2=!0;try{N2=localStorage.getItem(`linear-grab:css-watch`)!==`0`}catch{}var P2=new Set;function F2(){return N2}function I2(e){N2=e;try{localStorage.setItem(`linear-grab:css-watch`,e?`1`:`0`)}catch{}for(let t of P2)t(e)}function L2(e){return P2.add(e),e(N2),()=>void P2.delete(e)}var R2=!1;function z2(){if(R2||typeof window>`u`)return;R2=!0;let e=0,t=()=>{e=performance.now()};for(let e of[`pointerdown`,`pointerup`,`keydown`])window.addEventListener(e,t,{capture:!0,passive:!0});let n=new Map,r=new Map;window.addEventListener(`transitionrun`,t=>{if(!N2)return;let i=performance.now()-e;if(i>b2)return;let a=t.target;if(!(a instanceof Element)||a.closest(`#linear-grab-root`)||a===document.documentElement||a===document.body||t.propertyName.startsWith(`--`))return;let o=getComputedStyle(a),s=o.transitionProperty.split(`,`).map(e=>e.trim());if(v2(a,s))return;let c=d2(o.transitionDuration),l=d2(o.transitionDelay),u=Math.max(0,s.indexOf(t.propertyName)),d=c[u%c.length]??c[0]??0,f=l[u%l.length]??l[0]??0;if(d+f<=100)return;let p=r.get(a);if(p){p.props.add(t.propertyName),p.duration=Math.max(p.duration,d),p.delay=Math.max(p.delay,f);return}let m={props:new Set([t.propertyName]),duration:d,delay:f,since:i,timer:setTimeout(()=>{r.delete(a);let e=y2(a),t=Date.now();if(t-(n.get(e)??0)<5e3)return;n.set(e,t);let i=x2(a),o=[...m.props],s=a.isConnected?m2(getComputedStyle(a).transitionTimingFunction):null,c=p2(o);w2(a).then(({component:n,source:r})=>{A2({mode:`live`,page:location.pathname,element:e,component:n,source:r,properties:o,durationMs:Math.round(m.duration),delayMs:Math.round(m.delay),sinceInputMs:Math.round(m.since),count:1,classHint:i,easing:s??void 0,jankProps:c.length?c:void 0,suggestion:S2(o,m.duration,m.delay,i,s,c),at:t})})},300)};r.set(a,m)},{capture:!0,passive:!0})}var B2=`button, a, input, select, textarea, [role], [tabindex], [data-state], [aria-expanded]`;async function V2(){let e=new Map,t=Array.from(document.querySelectorAll(B2)).slice(0,3e3);for(let n of t){if(n.closest(`#linear-grab-root`))continue;let t=n.getBoundingClientRect();if(t.width<2&&t.height<2)continue;let r=getComputedStyle(n);if(r.cursor!==`pointer`&&!n.matches(`button, a, input, select, textarea`))continue;let i=r.transitionProperty.split(`,`).map(e=>e.trim());if(v2(n,i))continue;let a=d2(r.transitionDuration),o=d2(r.transitionDelay),s=Math.max(...a,0)+Math.max(...o,0);if(s<=100)continue;let c=x2(n),l=`${n.tagName}|${c??i.join()}|${Math.round(s)}`,u=e.get(l);if(u){u.finding.count+=1;continue}let d=m2(r.transitionTimingFunction),f=p2(i);e.set(l,{example:n,finding:{mode:`audit`,page:location.pathname,element:y2(n),component:null,source:null,properties:i,durationMs:Math.round(Math.max(...a,0)),delayMs:Math.round(Math.max(...o,0)),count:1,classHint:c,easing:d??void 0,jankProps:f.length?f:void 0,suggestion:S2(i,Math.max(...a,0),Math.max(...o,0),c,d,f),at:Date.now()}})}let n=[];for(let{finding:t,example:r}of e.values()){let{component:e,source:i}=await w2(r);t.component=e,t.source=i,n.push(t)}n.sort((e,t)=>t.durationMs+t.delayMs-(e.durationMs+e.delayMs)||t.count-e.count),O2=[...n,...O2.filter(e=>e.mode===`live`)].slice(0,100);for(let e of k2)e(O2);for(let e of n)D2(e);return n}function H2(e){return[`Below is a CSS-slowdown report from my running app (live-captured on real input + full-page audit).`,`Goal: ALL interaction feedback must be instant. Rules:`,``,`1. Most of these come from SHARED design-system variants — fix the VARIANT`,` DEFINITIONS, not the call sites. Grep for the exact class recipes in the`," findings' `classes:` lines (e.g. `transition-all`, `transition-colors duration-150`).","2. Press/toggle state changes get NO transition: add `active:transition-none`"," and `data-[state=on]:transition-none` / `data-[state=open]:transition-none`.",` Hover in/out may keep a transition but shorten it: duration-150 → duration-100`,` (duration-75 for small controls like tabs and icon buttons).`,"3. Replace every `transition-all` with the scoped variant (transition-colors /",` transition-transform / transition-opacity — per what actually changes).`,`3b. Findings marked ⚠ layout/paint: NEVER transition width/height/top/left/`,` margin/padding/box-shadow — they reflow or repaint every frame. Use`,` transform: translate/scale, and animate a pseudo-element's opacity for shadows.`,`3c. Findings marked ⚠ easing: never ease-in OR ease-in-out on UI (§42 bans`,` both) — replace with ease-out (house curve: cubic-bezier(.2,0,.1,1), the`,` theme default).`,`3d. Press must be instant GLOBALLY: keep the unlayered §42 rule in globals.css`," — `button:active, a:active, [role=button/tab/menuitem/option]:active"," { transition-duration: 0s }` — so pointer-down feedback snaps and only the",` release animates back. If a control still animates on press, that global`,` rule is missing or overridden.`,`4. Where a finding's source looks like a generic fallback (one file:line repeated`," for many components), locate the code by the `classes:` line instead.",`5. Do NOT touch entry/exit animations of popovers/menus or icon micro-motion`,` (chevron rotate etc.) — that is intentional; only input FEEDBACK must be instant.`,`6. PROOF REQUIRED: after the change I will re-run the audit — it must show zero`,` interactive elements ≥100ms and clicking must produce no live findings.`,` Do not claim done without stating what you changed per variant.`,``,`---`,``,U2(e)].join(`
|
|
270
|
+
`);f(e=>`${e?`${e}\n`:``}${t}\n`),dj(`capture`)});let y=async()=>{m(!0);try{let{block:e,failed:t}=await f$();e&&f(t=>`${t?`${t}\n`:``}${e}\n`),t.length&&f(e=>`${e}\n<!-- upload issues: ${t.join(` · `)} -->\n`)}finally{m(!1)}},b=vr(()=>({mutationFn:e=>LO(e.id,e.text),onSuccess:()=>{f(``),l()}})),x=vr(()=>({mutationFn:e=>RO(e.id,e.model),onSuccess:t=>{e.setQueryData([`bridge-tasks`],e=>e?.map(e=>e.id===t.id?t:e)),l()}})),S=vr(()=>({mutationFn:e=>BO(e),onSuccess:l})),C,w=!0,E=()=>{C&&(w=C.scrollTop+C.clientHeight>=C.scrollHeight-48)};O(()=>{let e=s.data?.tail?.length??0;r(),!(!C||!e||!w)&&requestAnimationFrame(()=>{C&&(C.scrollTop=C.scrollHeight)})});let[ee,te]=T(null),A=async e=>{try{await navigator.clipboard.writeText(XO(e)),te(e.id),setTimeout(()=>te(null),1800)}catch{}},ne=e=>e===`running`?`var(--color-accent)`:e===`done`?`var(--color-success)`:e===`stopped`?`var(--color-warn)`:`var(--color-danger)`,re=e=>{let t=e.line.kind,n=k(()=>S$(e.line.text));return t===`user`?(()=>{var e=V1(),t=e.firstChild.nextSibling;return D(()=>t.innerHTML=n()),e})():t===`assistant`||t===`result`?(()=>{var e=H1(),r=e.firstChild,i=r.nextSibling;return st(e,`bg-surface rounded-lg border px-2.5 py-1.5 ${t===`result`?`border-success/40`:`border-border`}`),st(r,`mb-0.5 text-[9.5px] font-semibold tracking-wide uppercase ${t===`result`?`text-success`:`text-text-faint`}`),P(r,t===`result`?`Result`:`Claude`),D(()=>i.innerHTML=n()),e})():(()=>{var n=U1();return st(n,`font-mono px-1 text-[10px] leading-relaxed break-words ${t===`subagent`?`text-warn`:t===`stderr`?`text-danger`:`text-text-faint`}`),P(n,()=>e.line.text),n})()};return(()=>{var e=K1(),a=e.firstChild;a.firstChild;var l=a.nextSibling;return P(a,j(M,{get when(){return t.data?.ok},get fallback(){return j(zj,{class:`text-danger`,children:`bridge offline`})},get children(){return[j(M,{get when(){return C0(t.data.version,`0.15.1`)},get children(){return j(zj,{class:`text-warn`,title:`Ctrl+C the old process, then: npx linear-grab-bridge`,get children(){return[`v`,$e(()=>t.data.version),` outdated — restart`]}})}}),(()=>{var e=W1(),r=e.firstChild,i=r.nextSibling;return i.nextSibling,P(e,()=>t.data.active,r),P(e,()=>{let e=(n.data??[]).reduce((e,t)=>e+(t.usage?.costUsd??0),0);return e>0?` · Σ $${e.toFixed(2)}`:``},i),P(e,()=>t.data.cwd.split(`/`).slice(-2).join(`/`),null),D(()=>it(e,`title`,t.data?.cwd)),e})()]}}),null),P(l,j(M,{get when(){return t.data?.ok},get fallback(){return j(Vj,{title:`Bridge not running`,get children(){return[`Start it in your repo's terminal:`,q1(),`Then delegate from the Draft tab ("Local Claude Code") or watch tasks here. Sessions stay interactive — send follow-ups, switch models, interrupt, resume in your terminal. History persists across restarts.`]}})},get children(){return j(M,{get when(){return(n.data??[]).length>0},get fallback(){return j(Vj,{title:`No local tasks yet`,children:`Create an issue in Draft with "Delegate to → Local Claude Code", and it appears here with live status and a conversation view.`})},get children(){var e=G1();return P(e,j(Ge,{get each(){return n.data},children:e=>(()=>{var t=l0(),n=t.firstChild,a=n.firstChild,l=a.nextSibling,m=n.nextSibling,h=m.nextSibling,g=h.nextSibling;return P(n,j(M,{get when(){return e().status===`running`},get fallback(){return(()=>{var t=u0();return D(n=>dt(t,`background`,ne(e().status))),t})()},get children(){return j(Aj,{})}}),a),P(a,()=>e().title),P(l,()=>Wj(e().startedAt)),P(m,()=>e().lastText),P(h,j(zj,{get color(){return ne(e().status)},get children(){return e().status}}),null),P(h,j(zj,{get children(){return e().model??`default model`}}),null),P(h,j(M,{get when(){return e().pendingModel},get children(){return j(zj,{class:`text-warn`,get children(){return[`→ `,$e(()=>e().pendingModel),` next msg`]}})}}),null),P(h,j(M,{get when(){return e().subagents>0},get children(){return j(zj,{class:`text-warn`,get children(){return[`⛓ `,$e(()=>e().subagents),` subagents`]}})}}),null),P(h,j(M,{get when(){return e().usage},get children(){var t=J1(),n=t.firstChild.nextSibling;return n.nextSibling,P(t,()=>w0(e().usage.contextTokens),n),P(t,()=>w0(e().usage.outputTokens),null),P(t,(()=>{var t=$e(()=>!!e().usage.costUsd);return()=>t()?` · $${e().usage.costUsd.toFixed(2)}`:``})(),null),t}}),null),P(t,j(M,{get when(){return o(e())},children:e=>(()=>{var t=d0();return P(t,j(zj,{get children(){return e().state.name}}),null),P(t,j(Ij,{get href(){return e().url},children:`Open in Linear`}),null),t})()}),g),P(t,j(M,{get when(){return $e(()=>!!e().worktree)()&&!e().worktree.removed},get children(){var t=Y1(),n=t.firstChild;return P(t,j(zj,{class:`text-warn`,children:`⎇ worktree`}),n),P(n,()=>e().worktree.branch),P(t,j(M,{get when(){return e().status!==`running`},get children(){return j(q,{variant:`ghost`,class:`ml-auto h-6 shrink-0 px-2 text-[11px]`,get loading(){return S.isPending},get title(){return`Remove the worktree at ${e().worktree.path} — the branch (and PR) survive`},onClick:()=>S.mutate(e().id),children:`Remove`})}}),null),D(()=>it(n,`title`,e().worktree.path)),t}}),g),P(g,j(Nj,{class:`h-7 w-auto min-w-0 flex-1 text-[11px]`,get value(){return e().pendingModel??e().model??``},onChange:t=>x.mutate({id:e().id,model:t.currentTarget.value}),title:`Model — applies from the next message`,get children(){return[j(We,{each:S0,children:t=>(()=>{var n=f0();return P(n,()=>t.label),D(()=>n.selected=(e().pendingModel??e().model??``)===t.id),D(()=>n.value=t.id),n})()}),j(M,{get when(){return!S0.some(t=>t.id===(e().pendingModel??e().model??``))},get children(){var t=X1();return P(t,()=>e().pendingModel??e().model),D(()=>t.value=e().pendingModel??e().model??``),t}})]}}),null),P(g,j(M,{get when(){return $e(()=>e().status!==`running`)()&&e().sessionId},get children(){return j(q,{variant:`ghost`,class:`size-7 px-0`,get loading(){return b.isPending},get title(){return`Resume — continues this session${e().pendingModel?` on ${e().pendingModel}`:``}`},"aria-label":`Resume session`,onClick:()=>b.mutate({id:e().id,text:`Continue where you left off. If the work is already complete, finish any remaining closeout steps (PR, Linear update, announcement).`}),get children(){return Z1()}})}}),null),P(g,j(M,{get when(){return o(e())},children:e=>j(q,{variant:`ghost`,class:`size-7 px-0`,title:`Open the issue's Activity thread`,onClick:()=>sj(`activity`,e().id),get children(){return p0()}})}),null),P(g,j(q,{variant:`ghost`,class:`size-7 px-0`,get disabled(){return!e().sessionId},get title(){return $e(()=>!!e().sessionId)()?`Copy resume command · session ${e().sessionId.slice(0,8)}…`:`No session yet`},onClick:()=>void A(e()),get children(){return j(M,{get when(){return ee()===e().id},get fallback(){return m0()},get children(){return Q1()}})}}),null),P(g,j(q,{variant:`ghost`,class:`size-7 px-0`,get title(){return r()===e().id?`Hide thread`:`Open thread — chat & changes`},onClick:()=>i(r()===e().id?null:e().id),get children(){return $1()}}),null),P(g,j(M,{get when(){return e().status===`running`},get children(){return j(q,{variant:`danger`,class:`size-7 px-0`,get loading(){return u.isPending},title:`Interrupt — the session stays resumable`,onClick:()=>u.mutate(e().id),get children(){return e0()}})}}),null),P(t,j(M,{get when(){return r()===e().id},get children(){return[j(M,{get when(){return $e(()=>!!c.data)()&&(c.data.files.length||c.data.untracked.length||c.data.prs.length)},get children(){var e=n0(),t=e.firstChild,n=t.firstChild.nextSibling,r=n.firstChild;r.firstChild;var i=r.nextSibling.nextSibling;return i.firstChild,P(t,j(M,{get when(){return c.data.branch},get children(){var e=t0();return P(e,()=>c.data.branch),e}}),n),P(r,()=>c.data.totalAdded,null),P(i,()=>c.data.totalDeleted,null),P(e,j(We,{get each(){return c.data.files},children:e=>(()=>{var t=_0(),n=t.firstChild,r=n.nextSibling;return P(n,()=>e.path),P(r,j(M,{get when(){return!e.binary},get fallback(){return v0()},get children(){return[(()=>{var t=h0();return t.firstChild,P(t,()=>e.added,null),t})(),` `,(()=>{var t=g0();return t.firstChild,P(t,()=>e.deleted,null),t})()]}})),D(()=>it(n,`title`,e.path)),t})()}),null),P(e,j(We,{get each(){return c.data.untracked},children:e=>(()=>{var t=y0(),n=t.firstChild;return it(n,`title`,e),P(n,e),t})()}),null),P(e,j(We,{get each(){return c.data.prs},children:e=>(()=>{var t=b0(),n=t.firstChild;return P(t,j(zj,{class:`text-accent`,get children(){return[`PR · `,$e(()=>e.state.toLowerCase())]}}),n),P(n,()=>e.title),D(t=>{var r=e.url,i=e.title;return r!==t.e&&it(n,`href`,t.e=r),i!==t.t&&it(n,`title`,t.t=i),t},{e:void 0,t:void 0}),t})()}),null),e}}),(()=>{var e=r0();return e.addEventListener(`scroll`,E),pt(e=>{C=e,w=!0},e),P(e,j(M,{get when(){return(s.data?.tail??[]).length>0},get fallback(){return x0()},get children(){return j(Ge,{get each(){return s.data?.tail??[]},children:e=>j(re,{get line(){return e()}})})}})),e})(),(()=>{var t=c0(),n=t.firstChild,r=n.firstChild;return P(t,j(Mj,{rows:2,get placeholder(){return e().status===`running`?`Message the working agent — it queues into the live session…`:`Follow-up — resumes the session…`},get value(){return d()},onInput:e=>f(e.currentTarget.value)}),n),P(r,(()=>{var t=$e(()=>!!e().alive);return()=>t()?`live session`:e().sessionId?`resumes on send`:`no session`})()),P(n,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,title:`Pick elements on the page — refs drop into this message`,"aria-label":`Pick element`,onClick:v,get children(){return i0()}}),null),P(n,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,get loading(){return p()},title:`Attach captures — element refs, screenshots, region shots, recording GIF`,"aria-label":`Attach captures`,onClick:()=>void y(),get children(){return a0()}}),null),P(n,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,get disabled(){return $e(()=>!e().alive)()&&!e().sessionId},title:`Compact the session — frees context (sends /compact)`,"aria-label":`Compact session`,onClick:()=>b.mutate({id:e().id,text:`/compact`}),get children(){return o0()}}),null),P(n,j(q,{variant:`primary`,class:`shrink-0`,get loading(){return b.isPending},get disabled(){return!d().trim()||!e().alive&&!e().sessionId},onClick:()=>b.mutate({id:e().id,text:d().trim()}),get children(){return s0()}}),null),t})()]}}),null),t})()})),e}})}})),e})()}Br();var E0=N(`<span class="text-text-faint text-[10.5px] tabular-nums">/<!> from your issues`),D0=N(`<div class="flex flex-col gap-1.5">`),O0=N(`<div class="flex h-full flex-col"><div class="border-border flex shrink-0 items-center justify-between border-b px-3 py-2"><span class="text-text text-[12px] font-semibold">Pull requests</span></div><div class="border-border flex shrink-0 items-center gap-1.5 border-b px-3 py-1.5"><div class="bg-surface-2 border-border flex shrink-0 rounded-md border p-0.5"></div></div><div class="min-h-0 flex-1 overflow-y-auto pt-2 pb-3 pl-2 pr-3">`),k0=N(`<span class="text-warn text-[10.5px]"title="Merge states come from gh via the bridge">states unknown — restart the bridge`),A0=N(`<button>`),j0=N(`<span class="text-success text-[11px]">✓`),M0=N(`<span class="text-[12px] leading-none">✓`),N0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><circle cx=8 cy=8 r=6></circle><circle cx=8 cy=8 r=1.6 fill=currentColor stroke=none>`),P0=N(`<span class="text-success text-[12px] leading-none">✓`),F0=N(`<div class="bg-surface border-border flex flex-col gap-1.5 rounded-lg border p-2.5"><a target=_blank rel=noreferrer class="text-accent truncate text-[12.5px] font-medium hover:underline"></a><div class="flex min-w-0 items-center gap-1.5"><span class="font-mono text-text-dim shrink-0 text-[11px]"></span><span class="text-text-dim truncate text-[11.5px]"></span><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums"></span></div><div class="flex min-w-0 flex-wrap items-center gap-1.5"><div class="ml-auto flex shrink-0 items-center gap-1">`),I0=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M8 2 14 5.5 8 9 2 5.5 8 2Z"></path><path d="M2 10.5 8 14l6-3.5">`),L0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><circle cx=4 cy=3.5 r=1.5></circle><circle cx=4 cy=12.5 r=1.5></circle><circle cx=12 cy=8 r=1.5></circle><path d="M4 5v6M4 6.5c0 2 2 3 4.5 3h2">`),R0=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=9 height=9 rx=1.5></rect><path d="M10.5 5.5v-2a2 2 0 0 0-2-2h-5a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h2">`),z0=/github\.com\/[^/]+\/[^/]+\/pull\/\d+/i;function B0(e){let t=_r(()=>({queryKey:[`my-issues`],queryFn:pO,refetchInterval:15e3})),n=k(()=>(t.data??[]).flatMap(e=>(e.attachments??[]).filter(e=>z0.test(e.url)).map(t=>({issue:e,attachment:t})))),r=_r(()=>({queryKey:[`bridge-tasks`],queryFn:PO,refetchInterval:1e4,retry:0})),i=_r(()=>({queryKey:[`pr-status`,n().map(e=>e.attachment.url).sort().join(`|`)],queryFn:()=>UO(n().map(e=>e.attachment.url)),refetchInterval:3e4,retry:0,enabled:n().length>0})),[a,o]=T(new Set),s=e=>a().has(e.attachment.url)?`MERGED`:i.data?.statuses[e.attachment.url],c=e=>!!r.data?.some(t=>t.title.startsWith(e.issue.identifier)),[l,u]=T(`all`),[d,f]=T(``),p=k(()=>{let e=d().trim().toLowerCase();return n().filter(t=>{let n=t.issue.state.type,r=s(t);return!(l()===`review`&&(n!==`started`||r===`MERGED`||r===`CLOSED`)||l()===`open`&&(r===`MERGED`||r===`CLOSED`||!(n===`started`||n===`unstarted`||n===`backlog`))||l()===`done`&&!(n===`completed`||r===`MERGED`||r===`CLOSED`)||e&&![t.attachment.title,t.issue.title,t.issue.identifier].join(` `).toLowerCase().includes(e))})}),m=_r(()=>({queryKey:[`settings`],queryFn:Tr})),h=()=>m.data?.stagingBranch?.trim()||`staging`,[g,_]=T(null),[v,y]=T(new Set),[b,x]=T(null),S=async e=>{_(e),x(null);try{await WO(e,h()),y(t=>new Set(t).add(e))}catch(e){x(e instanceof Error?e.message:String(e))}finally{_(null)}},[C,w]=T(null),[E,O]=T(null),ee=async e=>{O(e);try{await JO(e),o(t=>new Set(t).add(e))}catch{}finally{O(null)}},te=async e=>{try{await navigator.clipboard.writeText(e.attachment.url),w(e.attachment.id),setTimeout(()=>w(null),1500)}catch{}};return(()=>{var r=O0(),o=r.firstChild;o.firstChild;var m=o.nextSibling,_=m.firstChild,y=m.nextSibling;return P(o,j(M,{get when(){return!i.isError},get fallback(){return k0()},get children(){var e=E0(),t=e.firstChild,r=t.nextSibling;return r.nextSibling,P(e,()=>p().length,t),P(e,()=>n().length,r),e}}),null),P(_,j(We,{each:[{id:`all`,label:`All`},{id:`review`,label:`Review`},{id:`open`,label:`Open`},{id:`done`,label:`Done`}],children:e=>(()=>{var t=A0();return t.$$click=()=>u(e.id),P(t,()=>e.label),D(()=>st(t,`rounded-[5px] px-2 py-0.5 text-[11px] font-medium transition-colors ${l()===e.id?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`)),t})()})),P(m,j(jj,{class:`h-6 min-w-0 flex-1 text-[11px]`,placeholder:`Search PRs…`,get value(){return d()},onInput:e=>f(e.currentTarget.value)}),null),P(y,j(M,{get when(){return p().length>0},get fallback(){return j(Vj,{title:`No PRs yet`,get children(){return $e(()=>!!t.isError)()?`Connect Linear in Settings.`:n().length>0?`No PRs match the current filter.`:`PRs opened by delegated agents appear here as soon as they link back to your issues.`}})},get children(){var t=D0();return P(t,j(We,{get each(){return p()},children:t=>(()=>{var n=F0(),r=n.firstChild,o=r.nextSibling,l=o.firstChild,u=l.nextSibling,d=u.nextSibling,f=o.nextSibling,p=f.firstChild;return P(r,()=>t.attachment.title||t.attachment.url),P(n,j(M,{get when(){return i.data?.previews[t.attachment.url]},get children(){return j(Ij,{get href(){return i.data.previews[t.attachment.url]},class:`shrink-0 self-start`,title:`Vercel deploy preview of this PR's branch`,children:`Preview`})}}),o),P(o,j(Bj,{get color(){return t.issue.state.color}}),l),P(l,()=>t.issue.identifier),P(u,()=>t.issue.title),P(d,()=>Wj(t.issue.updatedAt)),P(f,j(zj,{get children(){return t.issue.state.name}}),p),P(f,j(M,{get when(){return t.issue.delegate},get children(){return j(zj,{class:`text-accent`,get children(){return[j(Pj,{}),` `,$e(()=>t.issue.delegate.displayName)]}})}}),p),P(f,j(M,{get when(){return c(t)},get children(){return j(zj,{class:`text-warn`,get children(){return[j(Fj,{}),` local`]}})}}),p),P(f,j(Ij,{get href(){return t.issue.url},class:`shrink-0`,title:`Open the issue in Linear`,children:`Linear`}),p),P(p,j(M,{get when(){return $e(()=>!!s(t))()&&s(t)!==`OPEN`},get children(){return j(zj,{get class(){return s(t)===`MERGED`?`text-success`:`text-text-faint`},get children(){return s(t)===`MERGED`?`✓ merged`:`closed`}})}}),null),P(p,j(q,{variant:`ghost`,class:`size-7 shrink-0 px-0`,get loading(){return g()===t.attachment.url},get disabled(){return v().has(t.attachment.url)},get title(){return $e(()=>!!v().has(t.attachment.url))()?`On ${h()} — staging preview deploying`:`Merge into ${h()} — deploys the staging preview domain`},"aria-label":`Merge to staging`,onClick:()=>void S(t.attachment.url),get children(){return j(M,{get when(){return v().has(t.attachment.url)},get fallback(){return I0()},get children(){return j0()}})}}),null),P(p,j(q,{variant:`primary`,class:`size-7 px-0`,get classList(){return{hidden:!!s(t)&&s(t)!==`OPEN`}},get loading(){return E()===t.attachment.url},get disabled(){return a().has(t.attachment.url)},get title(){return a().has(t.attachment.url)?`Merged`:`Squash-merge this PR (bridge gh)`},"aria-label":`Merge PR`,onClick:()=>void ee(t.attachment.url),get children(){return j(M,{get when(){return a().has(t.attachment.url)},get fallback(){return L0()},get children(){return M0()}})}}),null),P(p,j(q,{variant:`ghost`,class:`size-7 px-0`,title:`Open the issue's Activity thread`,"aria-label":`Open issue activity`,onClick:()=>{sj(`activity`,t.issue.id),e.onOpenIssue()},get children(){return N0()}}),null),P(p,j(q,{variant:`ghost`,class:`size-7 px-0`,title:`Copy PR URL`,"aria-label":`Copy PR URL`,onClick:()=>void te(t),get children(){return j(M,{get when(){return C()===t.attachment.id},get fallback(){return R0()},get children(){return P0()}})}}),null),P(f,j(M,{get when(){return v().has(t.attachment.url)},get children(){return j(u$,{get url(){return t.attachment.url},get base(){return h()}})}}),null),D(e=>{var n=t.attachment.url,i=t.attachment.title;return n!==e.e&&it(r,`href`,e.e=n),i!==e.t&&it(r,`title`,e.t=i),e},{e:void 0,t:void 0}),n})()})),t}})),r})()}rt([`click`]);var V0=[`display`,`align-items`,`justify-content`,`gap`,`padding`,`margin`,`width`,`height`,`font-size`,`font-weight`,`line-height`,`letter-spacing`,`color`,`background-color`,`border-radius`,`border-width`,`border-color`,`box-shadow`,`opacity`,`transform`,`transition-property`,`transition-duration`],H0=new Set([`color`,`background-color`,`border-color`]),U0={margin:new Set([`0px`]),padding:new Set([`0px`]),gap:new Set([`normal`,`0px`]),"box-shadow":new Set([`none`]),transform:new Set([`none`]),"border-width":new Set([`0px`]),"border-radius":new Set([`0px`]),"letter-spacing":new Set([`normal`]),opacity:new Set([`1`]),"transition-property":new Set([`all`,`none`]),"transition-duration":new Set([`0s`]),width:new Set([`auto`]),height:new Set([`auto`])},W0=null;function G0(e){try{return W0||(W0=document.createElement(`span`),W0.setAttribute(`data-linear-grab`,`true`),W0.style.display=`none`,document.body.appendChild(W0)),W0.style.color=``,W0.style.color=e,W0.style.color?getComputedStyle(W0).color:null}catch{return null}}var K0=null;function q0(){if(K0)return K0;let e=new Map,t=getComputedStyle(document.documentElement),n=new Set;for(let r of Array.from(document.styleSheets)){let i;try{i=r.cssRules}catch{continue}for(let r of Array.from(i)){let i=r.style;if(i)for(let r=0;r<i.length;r++){let a=i.item(r);if(!a.startsWith(`--`)||n.has(a))continue;n.add(a);let o=t.getPropertyValue(a).trim()||i.getPropertyValue(a).trim();if(!o||o.length>80)continue;let s=G0(o);s&&!e.has(s)&&e.set(s,a)}}}return K0=e,e}function J0(e){let t=e.getBoundingClientRect();if(t.width<2&&t.height<2)return!1;let n=getComputedStyle(e);return n.display!==`none`&&n.visibility!==`hidden`}function Y0(e){let t=[],n=e.getAttribute(`role`);n&&t.push(n);for(let n of[`data-state`,`data-highlighted`,`aria-expanded`,`aria-selected`,`data-active`]){let r=e.getAttribute(n);r!=null&&t.push(`${n.replace(/^(data|aria)-/,``)}=${r||`true`}`)}return t.join(` `)}async function X0(){try{return(await Promise.resolve().then(()=>(RZ(),AZ))).getGlobalApi()?.getDisplayName??null}catch{return null}}function Z0(e,t){let n=null;try{n=t?.(e)??null}catch{}let r=Y0(e),i=n||e.tagName.toLowerCase();return r?`${i} [${r}]`:i}function Q0(e,t){let n=getComputedStyle(e),r={},i={};for(let e of V0){let a=n.getPropertyValue(e).trim();if(!(!a||U0[e]?.has(a)))if(H0.has(e)){let n=G0(a);if(n===`rgba(0, 0, 0, 0)`)continue;let o=n?t.get(n):void 0;o&&(i[e]=o),r[e]=a}else r[e]=a}return{styles:r,tok:i}}var $0=40;async function e2(e){let t=q0(),n=await X0(),r=[],i=new Map,a=e=>{if(r.length>=$0||!J0(e))return;let o=typeof e.className==`string`?e.className:``,s=`${e.tagName}|${o}`,c=i.get(s);if(c)c.count+=1;else{let{styles:a,tok:c}=Q0(e,t),l={label:Z0(e,n),count:1,classes:o,styles:a,tokens:c};i.set(s,l),r.push(l)}for(let t of Array.from(e.children))a(t)};return a(e),{title:r[0]?.label??e.tagName.toLowerCase(),pageUrl:location.href,extractedAt:Date.now(),nodes:r,states:[]}}var t2={active:!1,msLeft:0,total:0,byTrigger:{}},n2=new Set;function r2(e){t2={...t2,...e};for(let e of n2)e(t2)}function i2(e){return n2.add(e),e(t2),()=>void n2.delete(e)}var a2=null;function o2(){a2?.()}function s2(e){return e===`hover`||e===`focus`?e:`open`}async function c2(e,t,n){let r=q0(),i=await X0(),a=[],o=new Set,s=new Map,c=e=>Q0(e,r).styles,l=e=>{if(!(s.size>=120)){s.set(e,c(e));for(let t of Array.from(e.children))l(t)}};l(e);let u=(e,t)=>{let n=s.get(e);if(!n)return;let r=c(e),l={};for(let e of new Set([...Object.keys(n),...Object.keys(r)])){let t=n[e]??`(unset)`,i=r[e]??`(unset)`;t!==i&&(l[e]={from:t,to:i})}if(Object.keys(l).length===0)return;let u=Z0(e,i),d=`${t}|${u}|${Object.keys(l).join(`,`)}`;if(o.has(d))return;o.add(d),a.push({trigger:t,label:u,changed:l});let f=s2(t);r2({total:t2.total+1,byTrigger:{...t2.byTrigger,[f]:(t2.byTrigger[f]??0)+1}})},d=e=>{let t=e.target;t instanceof Element&&s.has(t)&&setTimeout(()=>u(t,`hover`),50)},f=e=>{let t=e.target;t instanceof Element&&s.has(t)&&setTimeout(()=>u(t,`focus`),50)};e.addEventListener(`pointerover`,d,!0),e.addEventListener(`focusin`,f,!0);let p=new MutationObserver(e=>{for(let t of e){if(t.type!==`attributes`||!(t.target instanceof Element))continue;let e=t.target,n=t.attributeName??``,r=e.getAttribute(n)??``;setTimeout(()=>u(e,`attr:${n}=${r||`true`}`),50)}});p.observe(e,{subtree:!0,attributes:!0,attributeFilter:[`class`,`data-state`,`data-highlighted`,`aria-expanded`,`aria-selected`,`open`]});let m=new MutationObserver(t=>{for(let n of t)for(let t of Array.from(n.addedNodes))!(t instanceof Element)||e.contains(t)||t.id===`linear-grab-root`||t.closest?.(`#linear-grab-root`)||setTimeout(()=>{if(!t.isConnected||!J0(t))return;let{styles:e}=Q0(t,r);if(Object.keys(e).length===0)return;let n=Z0(t,i),s=`appeared|${n}`;if(o.has(s))return;o.add(s);let c={};for(let[t,n]of Object.entries(e))c[t]={from:`(absent)`,to:n};a.push({trigger:`appeared (portal/open)`,label:n,changed:c}),r2({total:t2.total+1,byTrigger:{...t2.byTrigger,open:(t2.byTrigger.open??0)+1}})},50)});m.observe(document.body,{childList:!0,subtree:!1}),r2({active:!0,msLeft:t,total:0,byTrigger:{}});let h=setInterval(()=>{let e=t-(Date.now()-g);n?.(Math.max(0,e)),r2({msLeft:Math.max(0,e)})},250),g=Date.now();return await new Promise(e=>{let n=setTimeout(e,t);a2=()=>{clearTimeout(n),e()}}),a2=null,r2({active:!1,msLeft:0}),clearInterval(h),e.removeEventListener(`pointerover`,d,!0),e.removeEventListener(`focusin`,f,!0),p.disconnect(),m.disconnect(),a}function l2(e){let t=[`# Design genome: ${e.title}`,`Extracted from ${e.pageUrl}`,``,`## Structure`];for(let n of e.nodes){t.push(`### ${n.label}${n.count>1?` ×${n.count}`:``}`),n.classes&&t.push(`classes: \`${n.classes}\``);let e=Object.entries(n.styles).map(([e,t])=>{let r=n.tokens[e];return`${e}: ${t}${r?` ← var(${r})`:``}`});e.length&&t.push("```",...e,"```")}if(e.states.length){t.push(``,`## Interaction states`);for(let n of e.states)t.push(`### ${n.label} — ${n.trigger}`),t.push("```",...Object.entries(n.changed).map(([e,t])=>`${e}: ${t.from} → ${t.to}`),"```")}return t.join(`
|
|
271
|
+
`)}function u2(){return new Promise(e=>{let t=document.createElement(`div`);t.setAttribute(`data-linear-grab`,`true`),t.style.cssText=`position:fixed;z-index:2147483647;pointer-events:none;border:1.5px solid #5e6ad2;border-radius:4px;background:rgba(94,106,210,0.08);display:none;`,document.body.appendChild(t);let n=null,r=e=>{let t=document.elementFromPoint(e.clientX,e.clientY);return!t||t.closest(`#linear-grab-root`)?null:t},i=e=>{let i=r(e);if(n=i,!i){t.style.display=`none`;return}let a=i.getBoundingClientRect();t.style.display=`block`,t.style.left=`${a.left-2}px`,t.style.top=`${a.top-2}px`,t.style.width=`${a.width+4}px`,t.style.height=`${a.height+4}px`},a=n=>{t.remove(),window.removeEventListener(`mousemove`,i,!0),window.removeEventListener(`click`,o,!0),window.removeEventListener(`keydown`,s,!0),e(n)},o=e=>{e.preventDefault(),e.stopPropagation(),a(n)},s=e=>{e.key===`Escape`&&(e.stopPropagation(),a(null))};window.addEventListener(`mousemove`,i,!0),window.addEventListener(`click`,o,!0),window.addEventListener(`keydown`,s,!0)})}function d2(e){return e.split(`,`).map(e=>{let t=e.trim();return t.endsWith(`ms`)?parseFloat(t)||0:t.endsWith(`s`)?(parseFloat(t)||0)*1e3:0})}var f2=new Set(`width.height.min-width.min-height.max-width.max-height.top.left.right.bottom.inset.margin.margin-top.margin-right.margin-bottom.margin-left.padding.padding-top.padding-right.padding-bottom.padding-left.font-size.line-height.letter-spacing.box-shadow.filter.background-position.grid-template-columns.grid-template-rows.flex-basis.gap`.split(`.`));function p2(e){return e.includes(`all`)?[`all (includes layout/paint props)`]:e.filter(e=>f2.has(e))}function m2(e){let t=h2(e);if(t===`ease-in`||t===`ease-in-out`)return t;let n=t.match(/cubic-bezier\(\s*([\d.]+)\s*,\s*(-?[\d.]+)/);if(n){let e=parseFloat(n[1]),r=parseFloat(n[2]);if(e>=.4&&r<e/2)return t}return null}function h2(e){let t=0;for(let n=0;n<e.length;n++){let r=e[n];if(r===`(`)t++;else if(r===`)`)t--;else if(r===`,`&&t===0)return e.slice(0,n).trim()}return e.trim()}var g2=`[data-slot*="content"], [role="menu"], [role="dialog"], [role="listbox"]`,_2=new Set([`width`,`height`,`flex-basis`,`grid-template-columns`,`grid-template-rows`,`grid-template-areas`]);function v2(e,t){if(e instanceof SVGElement)return!0;try{if(e.closest(`svg`))return!0}catch{}try{if(e.closest(g2))return!0}catch{}try{if(e.closest(`[data-panel]`))return!t||t.length===0||t.every(e=>_2.has(e))}catch{}return!1}function y2(e){let t=e.id?`#${e.id}`:``,n=typeof e.className==`string`&&e.className?`.${e.className.split(/\s+/).filter(Boolean).slice(0,2).join(`.`)}`:``;return`${e.tagName.toLowerCase()}${t}${n}`}var b2=200;function x2(e){if(typeof e.className!=`string`)return;let t=e.className.split(/\s+/).filter(e=>/^(transition|duration-|delay-|ease-)/.test(e));return t.length?t.join(` `):void 0}function S2(e,t,n,r,i,a){let o=[];return n>0&&o.push(`remove the ${Math.round(n)}ms transition-delay`),(r?.includes(`transition-all`)||e.includes(`all`))&&o.push(`scope 'transition-all' to the intended properties (e.g. transition-colors)`),a?.length&&o.push(`JANK: transitions LAYOUT/PAINT props (${a.join(`, `)}) — reflow/repaint every frame; animate transform/opacity instead (box-shadow → animate a pseudo-element's opacity)`),i&&o.push(`easing '${i}' starts slow — §42 bans ease-in/ease-in-out on UI, use ease-out`),t>500?o.push(`${Math.round(t)}ms is over the 500ms HARD CAP for UI feedback`):t>300?o.push(`${Math.round(t)}ms is over the 300ms UI cap`):t>100&&o.push(`shorten ${Math.round(t)}ms → ≤100ms`),o.push(`make PRESS feedback instant: 'active:transition-none' (and data-[state=…]:transition-none for toggles) — animate only hover in/out`),o.join(`; `)}async function C2(){try{return(await Promise.resolve().then(()=>(RZ(),AZ))).getGlobalApi()??null}catch{return null}}async function w2(e){let t=await C2(),n=null,r=null;try{n=t?.getDisplayName?.(e)??null}catch{}try{let n=await t?.getSource?.(e);n?.filePath&&(r=`${n.filePath}${n.lineNumber==null?``:`:${n.lineNumber}`}`)}catch{}return{component:n,source:r}}var T2=[],E2=null;function D2(e){T2.push(e),E2??=setTimeout(()=>{E2=null;let e=T2.slice(0,50).map(e=>({kind:`css-slowdown`,...e}));T2=[],YO().then(t=>fetch(`${t}/scan/events`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({events:e}),keepalive:!0})).catch(()=>{})},1500)}var O2=[],k2=new Set;function A2(e){let t=e.mode===`live`?O2.find(t=>t.mode===`live`&&t.element===e.element&&(t.classHint??``)===(e.classHint??``)&&t.properties.join()===e.properties.join()):void 0;t?(t.count+=1,t.at=e.at,t.sinceInputMs=e.sinceInputMs,O2=[...O2]):O2=[e,...O2].slice(0,100);for(let e of k2)e(O2);D2(e)}function j2(e){return k2.add(e),e(O2),()=>void k2.delete(e)}function M2(){O2=[];for(let e of k2)e(O2)}var N2=!0;try{N2=localStorage.getItem(`linear-grab:css-watch`)!==`0`}catch{}var P2=new Set;function F2(){return N2}function I2(e){N2=e;try{localStorage.setItem(`linear-grab:css-watch`,e?`1`:`0`)}catch{}for(let t of P2)t(e)}function L2(e){return P2.add(e),e(N2),()=>void P2.delete(e)}var R2=!1;function z2(){if(R2||typeof window>`u`)return;R2=!0;let e=0,t=()=>{e=performance.now()};for(let e of[`pointerdown`,`pointerup`,`keydown`])window.addEventListener(e,t,{capture:!0,passive:!0});let n=new Map,r=new Map;window.addEventListener(`transitionrun`,t=>{if(!N2)return;let i=performance.now()-e;if(i>b2)return;let a=t.target;if(!(a instanceof Element)||a.closest(`#linear-grab-root`)||a===document.documentElement||a===document.body||t.propertyName.startsWith(`--`))return;let o=getComputedStyle(a),s=o.transitionProperty.split(`,`).map(e=>e.trim());if(v2(a,s))return;let c=d2(o.transitionDuration),l=d2(o.transitionDelay),u=Math.max(0,s.indexOf(t.propertyName)),d=c[u%c.length]??c[0]??0,f=l[u%l.length]??l[0]??0;if(d+f<=100)return;let p=r.get(a);if(p){p.props.add(t.propertyName),p.duration=Math.max(p.duration,d),p.delay=Math.max(p.delay,f);return}let m={props:new Set([t.propertyName]),duration:d,delay:f,since:i,timer:setTimeout(()=>{r.delete(a);let e=y2(a),t=Date.now();if(t-(n.get(e)??0)<5e3)return;n.set(e,t);let i=x2(a),o=[...m.props],s=a.isConnected?m2(getComputedStyle(a).transitionTimingFunction):null,c=p2(o);w2(a).then(({component:n,source:r})=>{A2({mode:`live`,page:location.pathname,element:e,component:n,source:r,properties:o,durationMs:Math.round(m.duration),delayMs:Math.round(m.delay),sinceInputMs:Math.round(m.since),count:1,classHint:i,easing:s??void 0,jankProps:c.length?c:void 0,suggestion:S2(o,m.duration,m.delay,i,s,c),at:t})})},300)};r.set(a,m)},{capture:!0,passive:!0})}var B2=`button, a, input, select, textarea, [role], [tabindex], [data-state], [aria-expanded]`;async function V2(){let e=new Map,t=Array.from(document.querySelectorAll(B2)).slice(0,3e3);for(let n of t){if(n.closest(`#linear-grab-root`))continue;let t=n.getBoundingClientRect();if(t.width<2&&t.height<2)continue;let r=getComputedStyle(n);if(r.cursor!==`pointer`&&!n.matches(`button, a, input, select, textarea`))continue;let i=r.transitionProperty.split(`,`).map(e=>e.trim());if(v2(n,i))continue;let a=d2(r.transitionDuration),o=d2(r.transitionDelay),s=Math.max(...a,0)+Math.max(...o,0);if(s<=100)continue;let c=x2(n),l=`${n.tagName}|${c??i.join()}|${Math.round(s)}`,u=e.get(l);if(u){u.finding.count+=1;continue}let d=m2(r.transitionTimingFunction),f=p2(i);e.set(l,{example:n,finding:{mode:`audit`,page:location.pathname,element:y2(n),component:null,source:null,properties:i,durationMs:Math.round(Math.max(...a,0)),delayMs:Math.round(Math.max(...o,0)),count:1,classHint:c,easing:d??void 0,jankProps:f.length?f:void 0,suggestion:S2(i,Math.max(...a,0),Math.max(...o,0),c,d,f),at:Date.now()}})}let n=[];for(let{finding:t,example:r}of e.values()){let{component:e,source:i}=await w2(r);t.component=e,t.source=i,n.push(t)}n.sort((e,t)=>t.durationMs+t.delayMs-(e.durationMs+e.delayMs)||t.count-e.count),O2=[...n,...O2.filter(e=>e.mode===`live`)].slice(0,100);for(let e of k2)e(O2);for(let e of n)D2(e);return n}function H2(e){return[`Below is a CSS-slowdown report from my running app (live-captured on real input + full-page audit).`,`Goal: ALL interaction feedback must be instant. Rules:`,``,`1. Most of these come from SHARED design-system variants — fix the VARIANT`,` DEFINITIONS, not the call sites. Grep for the exact class recipes in the`," findings' `classes:` lines (e.g. `transition-all`, `transition-colors duration-150`).","2. Press/toggle state changes get NO transition: add `active:transition-none`"," and `data-[state=on]:transition-none` / `data-[state=open]:transition-none`.",` Hover in/out may keep a transition but shorten it: duration-150 → duration-100`,` (duration-75 for small controls like tabs and icon buttons).`,"3. Replace every `transition-all` with the scoped variant (transition-colors /",` transition-transform / transition-opacity — per what actually changes).`,`3b. Findings marked ⚠ layout/paint: NEVER transition width/height/top/left/`,` margin/padding/box-shadow — they reflow or repaint every frame. Use`,` transform: translate/scale, and animate a pseudo-element's opacity for shadows.`,`3c. Findings marked ⚠ easing: never ease-in OR ease-in-out on UI (§42 bans`,` both) — replace with ease-out (house curve: cubic-bezier(.2,0,.1,1), the`,` theme default).`,`3d. Press must be instant GLOBALLY: keep the unlayered §42 rule in globals.css`," — `button:active, a:active, [role=button/tab/menuitem/option]:active"," { transition-duration: 0s }` — so pointer-down feedback snaps and only the",` release animates back. If a control still animates on press, that global`,` rule is missing or overridden.`,`4. Where a finding's source looks like a generic fallback (one file:line repeated`," for many components), locate the code by the `classes:` line instead.",`5. Do NOT touch entry/exit animations of popovers/menus or icon micro-motion`,` (chevron rotate etc.) — that is intentional; only input FEEDBACK must be instant.`,`6. PROOF REQUIRED: after the change I will re-run the audit — it must show zero`,` interactive elements ≥100ms and clicking must produce no live findings.`,` Do not claim done without stating what you changed per variant.`,``,`---`,``,U2(e)].join(`
|
|
272
272
|
`)}function U2(e){let t=[`# CSS slowdowns on ${location.host}${location.pathname}`,`Threshold: 100ms (interaction feedback should be instant).`,``];for(let n of e)t.push(`## ${n.component??n.element}${n.count>1?` ×${n.count}`:``} — ${n.durationMs}ms${n.delayMs?` +${n.delayMs}ms delay`:``}`),n.source&&t.push(`- source: ${n.source}`),t.push(`- transitions: ${n.properties.join(`, `)}`),n.classHint&&t.push(`- classes: \`${n.classHint}\``),n.jankProps?.length&&t.push(`- ⚠ layout/paint transition (reflows every frame): ${n.jankProps.join(`, `)}`),n.easing&&t.push(`- ⚠ easing: ${n.easing} (§42 bans ease-in/ease-in-out — use ease-out)`),n.sinceInputMs!=null&&t.push(`- fired ${n.sinceInputMs}ms after user input (live capture)`),t.push(`- fix: ${n.suggestion}`,``);return t.join(`
|
|
273
|
-
`)}function W2(e,t,n){return{ruleId:e.id,part:e.part,severity:e.severity,description:e.description,selector:y2(t),evidence:n,el:typeof WeakRef<`u`?new WeakRef(t):void 0}}function G2(e){return e.getBoundingClientRect()}function K2(e){return e.split(`/`)[0].trim().split(/\s+/).filter(Boolean).map(e=>e.endsWith(`px`)?parseFloat(e):NaN)}function q2(e){let t=e.match(/rgba?\(([^)]+)\)/);return t?t[1].split(`,`).map(e=>e.trim()).join(`,`):null}function J2(e,t){let n=t,r=n.maskImage||n.webkitMaskImage||``;if(r&&r!==`none`)return r;let i=(e.getAttribute(`style`)??``).match(/(?:^|;|\s)(?:-webkit-)?mask-image\s*:\s*([^;]+)/i);return i&&i[1].trim()&&i[1].trim()!==`none`?i[1].trim():``}var Y2=new Set([0,8,12,16]),X2={light:q2(`rgb(240, 240, 241)`),dark:q2(`rgb(35, 35, 37)`)},Z2=new Set([`#50e3c2`,`#ee0000`,`#f5a623`]),Q2=`button, a, [role="button"], [role="tab"], [role="menuitem"], [role="option"], input, textarea, select`;function $2(e){let t=[],n=e=>{for(let r of Array.from(e)){let e=r;if(e.cssRules&&e.cssRules.length){n(e.cssRules);continue}let i=r.selectorText;i&&i.includes(`:hover`)&&t.push(i.replace(/:hover/g,``))}};for(let t of Array.from(e.styleSheets))try{n(t.cssRules)}catch{}return t}function e4(e,t){for(let n of t)if(n.trim())try{if(e.matches(n))return!0}catch{}return!1}function t4(e){return!e.matches(`button, [role="button"]`)||e.querySelectorAll(`svg`).length===0?!1:(e.textContent??``).trim().length===0}function n4(e){let t=e.parentElement;for(;t;){try{let e=r4(t).overflowY;if(e===`auto`||e===`scroll`)return t}catch{}t=t.parentElement}return null}var r4=e=>getComputedStyle(e),i4={id:`radius-vocabulary`,part:`§40`,severity:`error`,description:`§40: radius vocabulary is {8, 12, 16, full} — never rounded-md/[4px]/[6px]/[10px]. Off-vocabulary radius.`,check(e){let t=[];for(let n of e.els){let r=e.css(n).borderRadius;if(!r||r===`0px`)continue;let i=K2(r);if(i.some(e=>Number.isNaN(e)))continue;let a=Math.max(...i);if(a===0)continue;let o=G2(n),s=Math.min(o.width||0,o.height||0);s>0&&a>=s/2-.5||i.every(e=>Y2.has(e))||t.push(W2(this,n,`border-radius: ${r}`))}return t}},a4={id:`row-radius-token`,part:`§40`,severity:`error`,description:`§40: list rows consume --row-radius (8px) or 0 — no bespoke per-surface row radius.`,check(e){let t=[];for(let n of e.els){let r=G2(n).height;if(r<26||r>50||!n4(n))continue;let i=n.parentElement;if(!i||Array.from(i.children).filter(e=>{let t=G2(e);return Math.abs(t.height-r)<2}).length<3)continue;let a=K2(e.css(n).borderRadius);if(a.some(e=>Number.isNaN(e)))continue;let o=Math.max(0,...a);o===0||o===8||t.push(W2(this,n,`row radius ${e.css(n).borderRadius} (want 0 or var(--row-radius)=8px)`))}return t}},o4={id:`active-fill-token`,part:`§11`,severity:`error`,description:`§11: active/selected fill must be var(--selected) (theme-safe) — never bg-secondary (#F0F0F1 / #232325).`,check(e){let t=[],n=null;try{let t=e.root.documentElement??document.documentElement;t&&(n=q2(e.css(t).getPropertyValue(`--selected`).trim()))}catch{}let r=[X2.light,X2.dark].filter(Boolean);if(n&&r.includes(n)){let t=e.root.documentElement??document.documentElement;return[W2({id:this.id,part:this.part,severity:`warn`,description:`§11: active-fill-token unverifiable — --selected resolves EQUAL to bg-secondary this theme; cannot distinguish the token from the anti-pattern.`},t??e.els[0],`--selected == bg-secondary (${n})`)]}for(let n of e.els){if(!(n.matches(`[role="tab"], [role="button"], [aria-selected], [role="option"]`)||n.closest(`[role="tablist"], [role="menu"], [data-rail], nav`)))continue;let i=q2(e.css(n).backgroundColor);i&&r.includes(i)&&t.push(W2(this,n,`background bg-secondary (${e.css(n).backgroundColor}) — use var(--selected)`))}return t}},s4={id:`inline-style-state`,part:`§40`,severity:`error`,description:`§40: the shared row-action class owns ALL visual states; inline styles carry LAYOUT ONLY — an inline background/color kills the class state.`,check(e){let t=[];for(let n of e.els){let e=typeof n.className==`string`?n.className:``;if(!/pb-row-action|row-action/.test(e))continue;let r=n.getAttribute(`style`)??``;/(^|;|\s)(background|color)\s*:/.test(r)&&t.push(W2(this,n,`inline style="${r}" on a row-action element`))}return t}},c4={id:`icon-button-no-hover`,part:`§40`,severity:`warn`,description:`§40/Part 10: every interactive control changes color on hover — icon-only button with no :hover rule and no .pb-row-action.`,check(e){let t=[],n=$2(e.root.styleSheets?e.root:document);for(let r of e.els){if(!t4(r))continue;let i=typeof r.className==`string`?r.className:``;/pb-row-action|row-action/.test(i)||r.hasAttribute(`data-framer-appear-id`)||Array.from(r.attributes).some(e=>e.name.startsWith(`data-framer`))||e.css(r).willChange.includes(`transform`)||e4(r,n)||t.push(W2(this,r,`icon-only ${r.tagName.toLowerCase()} with no hover rule / .pb-row-action`))}return t}},l4={id:`icon-button-no-tooltip`,part:`§7`,severity:`warn`,description:`§7: every icon-only button gets the shared Tooltip — needs aria-describedby / data-slot="tooltip-trigger" (menu-row title exempt).`,check(e){let t=[];for(let n of e.els)t4(n)&&(n.hasAttribute(`aria-describedby`)||n.getAttribute(`data-slot`)===`tooltip-trigger`||n.closest(`[data-slot="tooltip-trigger"]`)||n.closest(`[role="menuitem"]`)&&n.hasAttribute(`title`)||t.push(W2(this,n,`icon-only ${n.tagName.toLowerCase()} with no tooltip trigger / aria-describedby`)));return t}},u4={id:`unvirtualized-scroller`,part:`§0`,severity:`error`,description:`§0: every dynamic-length scrolling list virtualizes — a tall scroller with 60+ direct children is unvirtualized.`,check(e){let t=[];for(let n of e.els){let r=e.css(n);if(![r.overflowY,r.overflowX,r.overflow].some(e=>e===`auto`||e===`scroll`)||n.scrollHeight<=2*n.clientHeight)continue;let i=n.children.length;i<=60||t.push(W2(this,n,`${i} direct children, scrollHeight ${n.scrollHeight} > 2×clientHeight ${n.clientHeight}`))}return t}},d4={id:`scroll-no-fade`,part:`§1`,severity:`warn`,description:`§1: a horizontal scroller needs a truthful scroll fade — no scroll-fade-x/scroll-fade-x-js class and no mask-image.`,check(e){let t=[];for(let n of e.els){let r=e.css(n).overflowX;if(r!==`auto`&&r!==`scroll`||n.clientWidth<24||n.scrollWidth<=n.clientWidth+8)continue;let i=typeof n.className==`string`?n.className:``;/scroll-fade-x(-js)?/.test(i)||J2(n,e.css(n))||t.push(W2(this,n,`horizontal scroller (scrollWidth ${n.scrollWidth} > clientWidth ${n.clientWidth}) with no fade`))}return t}},f4={id:`phantom-fade`,part:`§1`,severity:`warn`,description:`§1: a fade must NEVER paint when nothing is hidden — mask-image present but scrollWidth ≤ clientWidth (the fade lies).`,check(e){let t=[];for(let n of e.els)J2(n,e.css(n))&&(n.scrollWidth>n.clientWidth||t.push(W2(this,n,`mask-image fade but scrollWidth ${n.scrollWidth} ≤ clientWidth ${n.clientWidth}`)));return t}},p4={id:`scrollbar-flush`,part:`Part 5`,severity:`warn`,description:`Part 5: scrollables carry asymmetric right padding so content clears the scrollbar — padding-right < 8px while overflowing vertically with content reaching the right edge.`,check(e){let t=[];for(let n of e.els){let r=e.css(n);if(![r.overflowY,r.overflow].some(e=>e===`auto`||e===`scroll`)||n.scrollHeight<=n.clientHeight)continue;let i=parseFloat(r.paddingRight)||0;if(i>=8)continue;let a=G2(n);Array.from(n.children).some(e=>{let t=G2(e);return a.right-t.right<=4})&&t.push(W2(this,n,`padding-right ${i}px (<8px) with content flush to the scrollbar`))}return t}},m4=/^("?(Geist|Geist Mono)"?|ui-monospace|ui-sans-serif|-apple-system|system-ui)/i,h4={id:`font-family`,part:`Part 5`,severity:`warn`,description:`Part 5: Geist / Geist Mono ONLY — computed font-family does not start with the Geist / ui-monospace fallback chain.`,check(e){let t=[];for(let n of e.els){if(!O4(n))continue;let r=e.css(n).fontFamily;r&&(m4.test(r.trim())||t.push(W2(this,n,`font-family: ${r}`)))}return t}},g4={id:`uppercase-label`,part:`§25`,severity:`error`,description:`§25: group/section labels are sentence-case — never uppercase (text-transform: uppercase on small <13px text).`,check(e){let t=[];for(let n of e.els){if(!O4(n))continue;let r=e.css(n);r.textTransform===`uppercase`&&((parseFloat(r.fontSize)||0)>=13||t.push(W2(this,n,`text-transform: uppercase at ${r.fontSize}`)))}return t}},_4={id:`hardcoded-status-hex`,part:`Part 5`,severity:`warn`,description:`Part 5: raw hex only for the status trio (#50E3C2/#EE0000/#F5A623) — a saturated non-token color on small UI text.`,check(e){let t=[],n=new Set;for(let e of Z2){let t=q2(`rgb(${parseInt(e.slice(1,3),16)}, ${parseInt(e.slice(3,5),16)}, ${parseInt(e.slice(5,7),16)})`);t&&n.add(t)}try{let t=e.root,r=t.documentElement;if(r&&t.body){let i=e.css(r),a=t.createElement(`span`);a.style.display=`none`,t.body.appendChild(a);for(let e=0;e<i.length;e++){let t=i[e];if(!t.startsWith(`--`))continue;let r=i.getPropertyValue(t).trim();if(!r||r.length>40||(a.style.color=``,a.style.color=r,!a.style.color))continue;let o=q2(getComputedStyle(a).color);o&&n.add(o)}a.remove()}}catch{}for(let r of e.els){if(!O4(r))continue;let i=(r.getAttribute(`style`)??``).match(/#[0-9a-fA-F]{6}/g)??[],a=e.css(r);if((parseFloat(a.fontSize)||0)>=16)continue;for(let e of i)Z2.has(e.toLowerCase())||t.push(W2(this,r,`hardcoded ${e} (not the brand status trio)`));let o=q2(a.color);if(o&&i.length===0&&!n.has(o)){let[e,n,i]=o.split(`,`).map(e=>parseFloat(e));Number.isFinite(e)&&k4(e,n,i)&&t.push(W2(this,r,`saturated non-token color ${a.color} on small UI text`))}}return t}},v4={id:`editor-shadow`,part:`Part 5`,severity:`error`,description:`Part 5: editor surfaces are FLAT — box-shadow that is not a 0.5px hairline ring / approved popover/card/input token shadow.`,check(e){let t=[];if(!(e.root.querySelector?.(`[data-editor-surface]`)||typeof location<`u`&&/\/editor\//.test(location.pathname)))return t;for(let n of e.els){if(!n.closest(`[data-editor-surface]`)&&!/\/editor\//.test(typeof location<`u`?location.pathname:``))continue;let r=e.css(n).boxShadow;!r||r===`none`||A4(r)||t.push(W2(this,n,`box-shadow: ${r}`))}return t}},y4={id:`focusring-clip`,part:`§24`,severity:`warn`,description:`§24/Part 5: focus rings never clip — a focusable element whose nearest overflow-hidden ancestor sits <4px from its border box.`,check(e){let t=[];for(let n of e.els){if(!n.matches(Q2)&&n.getAttribute(`tabindex`)==null)continue;let r=n.parentElement;for(;r;){let t=e.css(r);if([t.overflow,t.overflowX,t.overflowY].some(e=>e===`hidden`))break;r=r.parentElement}if(!r)continue;let i=G2(n),a=G2(r);if(i.width===0&&i.height===0)continue;let o=Math.min(i.left-a.left,a.right-i.right,i.top-a.top,a.bottom-i.bottom);o>=4||t.push(W2(this,n,`overflow-hidden ancestor ${o.toFixed(1)}px from border box — focus ring will clip`))}return t}},b4={id:`fixed-width-in-pane`,part:`§24`,severity:`warn`,description:`§24: no fixed field widths in resizable panes — w-[Npx] (N ≥ 200) inside a [data-panel] / flex-basis sibling clips at the pane edge.`,check(e){let t=[];for(let n of e.els){if(!n.closest(`[data-panel]`))continue;let e=typeof n.className==`string`?n.className:``,r=n.getAttribute(`style`)??``,i=e.match(/w-\[(\d+)px\]/)??r.match(/(?:^|;|\s)width\s*:\s*(\d+)px/);if(!i)continue;let a=parseFloat(i[1]);a<200||t.push(W2(this,n,`fixed width ${a}px inside a resizable pane — use w-full max-w-[${a}px]`))}return t}},x4={id:`menu-icons-all-or-none`,part:`§21`,severity:`error`,description:`§21: within one menu ALL items carry a leading icon or NONE do — a mixed set reads broken.`,check(e){let t=[],n=Array.from(e.root.querySelectorAll(`[role="menu"]`));for(let e of n){let n=Array.from(e.querySelectorAll(`[role="menuitem"]`));if(n.length<2)continue;let r=n.filter(e=>e.querySelector(`svg`)).length;r===0||r===n.length||t.push(W2(this,e,`${r}/${n.length} menu items have a leading icon`))}return t}},S4={id:`menu-icon-mixed-weight`,part:`§21`,severity:`warn`,description:`§21: menu icons are ONE stroke family — some filled (fill=currentColor) and some stroke-based, or rendered sizes differing >2px, mixes two design systems.`,check(e){let t=[],n=Array.from(e.root.querySelectorAll(`[role="menu"]`));for(let e of n){let n=Array.from(e.querySelectorAll(`[role="menuitem"] svg`));if(n.length<2)continue;let r=0,i=0,a=[];for(let e of n){Array.from(e.querySelectorAll(`path, circle, rect, polygon`)).some(e=>{let t=(e.getAttribute(`fill`)??``).toLowerCase();return t===`currentcolor`||t&&t!==`none`})?r++:i++;let t=G2(e);a.push(Math.max(t.width,t.height))}let o=Math.max(...a),s=Math.min(...a),c=r>0&&i>0,l=o>0&&o-s>2;!c&&!l||t.push(W2(this,e,c?`${r} filled + ${i} stroke-based icons in one menu`:`icon sizes differ by ${(o-s).toFixed(1)}px`))}return t}},C4={id:`chrome-selectable`,part:`Part 5`,severity:`warn`,description:`Part 5: chrome (rails/pills/tabs) is select-none — a rail/pill/tab without user-select:none.`,check(e){let t=[];for(let n of e.els){if(!(n.matches(`[role="tab"]`)||n.closest(`[role="tablist"], [data-rail], nav`)||/\bpill\b/.test(typeof n.className==`string`?n.className:``)))continue;let r=e.css(n).userSelect||e.css(n).webkitUserSelect;r!==`none`&&t.push(W2(this,n,`chrome element without user-select:none (user-select: ${r||`auto`})`))}return t}},w4={id:`cursor-mismatch`,part:`Part 5`,severity:`warn`,description:`Part 5: cursor semantics — buttons get pointer, static text gets default. A button with cursor:text, or static text with cursor:pointer and no interactive ancestor.`,check(e){let t=[];for(let n of e.els){let r=e.css(n).cursor;if(n.matches(`button, [role="button"]`)&&r===`text`){t.push(W2(this,n,`interactive control with cursor:text`));continue}if(r===`pointer`&&n.matches(`p, h1, h2, h3, h4, h5, h6, span`)){if(n.closest(`button, a, [role="button"], [onclick], label`)||n.matches(`button, a, [role="button"]`))continue;t.push(W2(this,n,`static ${n.tagName.toLowerCase()} with cursor:pointer and no interactive ancestor`))}}return t}};function T4(e){let t=e.transitionProperty.split(`,`).map(e=>e.trim()).filter(Boolean);return t.length===1&&t[0]===`none`?[]:t}var E4=[i4,a4,o4,s4,c4,l4,u4,d4,f4,p4,h4,g4,_4,v4,y4,b4,x4,S4,C4,w4,{id:`transition-all`,part:`§42`,severity:`error`,description:`§42: never transition-all — scope to what changes (transition-colors / transition-[transform,...]).`,check(e){let t=[];for(let n of e.els){if(!n.matches(Q2))continue;let r=T4(e.css(n));r.includes(`all`)&&(v2(n,r)||t.push(W2(this,n,`transition-property: all`)))}return t}},{id:`transition-paint-prop`,part:`§42`,severity:`error`,description:`§42: never transition layout/paint props (box-shadow, width, height, top/left, margin, padding) — they reflow/repaint every frame; focus rings SNAP, shadows animate a pseudo-element opacity.`,check(e){let t=[];for(let n of e.els){let r=T4(e.css(n)),i=p2(r).filter(e=>e!==`all (includes layout/paint props)`);i.length!==0&&(v2(n,r)||t.push(W2(this,n,`transitions layout/paint props: ${i.join(`, `)}`)))}return t}},{id:`transition-too-slow`,part:`§42`,severity:`error`,description:`§42: interaction feedback is ≤100ms (duration-75 for small controls) — the 100ms theme default is fine; an explicit duration-150+ crept in.`,check(e){let t=[];for(let n of e.els){if(!n.matches(Q2))continue;let r=e.css(n),i=T4(r);if(i.length===0||v2(n,i))continue;let a=d2(r.transitionDuration),o=Math.max(0,...a);o<=100||t.push(W2(this,n,`transition-duration ${o}ms (>100ms) on [${i.join(`, `)}]`))}return t}},{id:`ease-in-feedback`,part:`§42`,severity:`warn`,description:`§42: house curve is cubic-bezier(.2,0,.1,1) ease-out — never ease-in / ease-in-out (or an ease-in-shaped bezier) on feedback.`,check(e){let t=[];for(let n of e.els){if(!n.matches(Q2))continue;let r=e.css(n),i=T4(r);if(i.length===0||v2(n,i))continue;let a=m2(r.transitionTimingFunction);a&&t.push(W2(this,n,`transition-timing-function: ${a}`))}return t}},{id:`press-instant-rule-missing`,part:`§42`,severity:`error`,description:"§42: the global press-instant rule (globals.css) must exist — `button:active{transition-duration:0s}` (or transition:none). Absent = press feedback animates instead of snapping.",check(e){let t=e.root.styleSheets?e.root:document,n=!1,r=e=>{for(let t of Array.from(e)){if(n)return;let e=t;if(e.cssRules&&e.cssRules.length){r(e.cssRules);continue}let i=t,a=i.selectorText;if(a&&/:active\b/.test(a)&&/(^|[\s,])(button|a|\[role=("|')?(button|tab|menuitem|option)("|')?\])/i.test(a))try{let e=i.style.transitionDuration,t=i.style.transition;if(e===`0s`||/(^|\s)none(\s|$)/.test(t)||/\b0s\b/.test(t)){n=!0;return}}catch{}}};try{for(let e of Array.from(t.styleSheets)){if(n)break;try{r(e.cssRules)}catch{}}}catch{}if(n)return[];let i=e.root.documentElement??e.els[0]??document.documentElement;return[W2(this,i,"no `button:active { transition-duration: 0s }` rule on this page")]}}],D4=[];function O4(e){for(let t of Array.from(e.childNodes))if(t.nodeType===3&&(t.textContent??``).trim().length>0)return!0;return!1}function k4(e,t,n){let r=Math.max(e,t,n);return r<40?!1:r-Math.min(e,t,n)>60}function A4(e){return!!(/\b0px\s+0px\s+0px\s+0?\.?5px\b/.test(e)||/\b0px?\s+0px?\s+0px?\s+0?\.?5px\b/.test(e))}function j4(e=typeof document<`u`?document:{}){let t=new Map,n=e=>{let n=t.get(e);return n||(n=getComputedStyle(e),t.set(e,n)),n};r4=n;let r=Array.from(e.querySelectorAll(`*`)),i=[],a=e.documentElement??null,o=e.body??null,s=(a?.getBoundingClientRect().width??0)>0;for(let e of r){if(e===a||e===o||e.closest(`#linear-grab-root, #claude-agent-glow-border, [id^="react-scan"]`))continue;let t=G2(e);if(s){if(t.width<2||t.height<2)continue}else if(t.width===0&&t.height===0&&e.children.length===0)continue;i.push(e)}let c={root:e,els:i,css:n},l=[];for(let e of[...E4,...D4])try{l.push(...e.check(c))}catch{}r4=e=>getComputedStyle(e);let u=new Map;for(let e of l){let t=`${e.ruleId}|${e.selector}|${e.evidence}`,n=u.get(t);n?n.count=(n.count??1)+1:u.set(t,e)}return[...u.values()]}function M4(e){let t=new Map;for(let n of e){let e=t.get(n.ruleId);e?e.push(n):t.set(n.ruleId,[n])}let n=Array.from(t.entries()).sort((e,t)=>{let n=e[1][0].severity===`error`?0:1,r=t[1][0].severity===`error`?0:1;return n===r?t[1].length===e[1].length?e[0].localeCompare(t[0]):t[1].length-e[1].length:n-r}),r=e.length,i=e.filter(e=>e.severity===`error`).length,a=new Set(e.map(e=>e.page).filter(Boolean)).size>1,o=[`# Slop scan — ${i} error${i===1?``:`s`}, ${r-i} warn (${r} total)`,``];for(let[e,t]of n){let n=t[0],r=t.reduce((e,t)=>e+(t.count??1),0);o.push(`## ${e} — ${n.severity} ×${r} [${n.part}]`),o.push(n.description);for(let e of t){let t=e.component||e.source?` — ${[e.component,e.source].filter(Boolean).join(` @ `)}`:``,n=(e.count??1)>1?` ×${e.count}`:``;o.push(`- ${a&&e.page?`\`${e.page}\` `:``}\`${e.selector}\`${n} — ${e.evidence}${t}`)}o.push(``)}return o.join(`
|
|
274
|
-
`)}function
|
|
275
|
-
`)}var P4=[],F4=new Set;function I4(e){return F4.add(e),e(P4),()=>void F4.delete(e)}function L4(){P4=[];for(let e of F4)e(P4)}function R4(){let e=location.pathname,t=j4(document).map(t=>({...t,page:e}));P4=[...t,...P4.filter(t=>t.page!==e)];for(let e of F4)e(P4);return z4(t).then(()=>{P4=[...P4];for(let e of F4)e(P4);B4(t)}),t}async function z4(e){let t=null;try{t=(await Promise.resolve().then(()=>(RZ(),AZ))).getGlobalApi()??null}catch{return}if(!t)return;let n=new Map;for(let t of e){let e=t.el?.deref();if(!e)continue;let r=n.get(e);r?r.push(t):n.set(e,[t])}let r=300;for(let[e,i]of n){if(r--<=0)break;let n=null,a=null;try{n=t.getDisplayName?.(e)??null}catch{}try{let n=await t.getSource?.(e);n?.filePath&&(a=`${n.filePath}${n.lineNumber==null?``:`:${n.lineNumber}`}`)}catch{}if(!(!n&&!a))for(let e of i)e.component=n,e.source=a}}function B4(e){if(e.length===0)return;let t=Date.now(),n=e.slice(0,200).map(({el:e,...n})=>({kind:`slop-scan`,at:t,...n}));YO().then(e=>fetch(`${e}/scan/events`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({events:n}),keepalive:!0})).catch(()=>{})}var V4=!1;try{V4=localStorage.getItem(`linear-grab:slop-live`)===`1`}catch{}var H4=new Set;function U4(){return V4}function W4(e){V4=e;try{localStorage.setItem(`linear-grab:slop-live`,e?`1`:`0`)}catch{}for(let t of H4)t(e);e&&q4(300)}function G4(e){return H4.add(e),e(V4),()=>void H4.delete(e)}var K4=null;function q4(e){K4&&clearTimeout(K4),K4=setTimeout(()=>{if(K4=null,V4)try{R4()}catch{}},e)}var J4=!1;function Y4(){if(J4||typeof window>`u`)return;J4=!0;let e=location.pathname;setInterval(()=>{location.pathname!==e&&(e=location.pathname,V4&&q4(1e3))},500)}var X4=N(`<span class="inline-block min-w-[7ch] text-center">Extract`),Z4=N(`<div class="relative flex flex-col gap-2 pl-4"><div class="bg-border absolute top-1 bottom-1 left-[5px] w-px"aria-hidden>`),Q4=N(`<span class="text-success text-[12px] leading-none">✓`),$4=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M4 4l8 8M12 4l-8 8">`),e3=N(`<div class="flex items-center justify-end gap-1 px-1">`),t3=N(`<span class="relative inline-flex items-center justify-center"><svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor aria-hidden><rect x=3.5 y=3 width=3.2 height=10 rx=1></rect><rect x=9.3 y=3 width=3.2 height=10 rx=1></rect></svg><span class="bg-success absolute -top-0.5 -right-0.5 size-1.5 animate-pulse rounded-full"aria-hidden>`),n3=N(`<span class="inline-block min-w-[5ch] text-center">Audit`),r3=N(`<div class="flex max-h-72 flex-col gap-1.5 overflow-y-auto pr-2">`),i3=N(`<span class="text-[12px] leading-none">✓`),a3=N(`<div class="flex items-center gap-1 px-1">`),o3=N(`<span class="text-text-faint font-normal tabular-nums"> · <!> pages`),s3=N(`<span class="inline-block min-w-[4ch] text-center">Scan`),c3=N(`<div class="flex items-center gap-1 px-1"><button class="border-border cursor-pointer rounded-full border px-2 py-0.5 text-[10px] font-medium tabular-nums"> errors</button><button class="border-border cursor-pointer rounded-full border px-2 py-0.5 text-[10px] font-medium tabular-nums"> warns`),l3=N(`<div class="flex h-full flex-col gap-3 overflow-y-auto pt-3 pb-4 pr-3 pl-2"><div class="flex items-center justify-between gap-2 px-1"><div class=min-w-0><p class="text-text text-[12.5px] font-semibold">Design genomes</p><p class="text-text-faint text-[10.5px] leading-snug">Point at a component → get its structure, tokens and interaction states as a spec you can hand to an agent.</p></div></div><div class="border-border mt-1 flex flex-col gap-2 border-t pt-3"><div class="flex items-center justify-between gap-2 px-1"><div class=min-w-0><p class="text-text text-[12.5px] font-semibold">CSS slowdowns</p><p class="text-text-faint text-[10.5px] leading-snug">Transitions/delays over the 100ms house cap (§42) on interactive elements — feedback that animates instead of being instant. Live hits appear as you use the app; Audit sweeps the whole page.</p></div><div class="flex shrink-0 items-center gap-1"></div></div></div><div class="border-border mt-1 flex flex-col gap-2 border-t pt-3"><div class="flex items-center justify-between gap-2 px-1"><div class=min-w-0><p class="text-text text-[12.5px] font-semibold">Slop scan</p><p class="text-text-faint text-[10.5px] leading-snug">Design-contract drift — Linear-primitives rules checked against the live DOM. Results accumulate per page as you navigate; re-scanning a page overwrites only that page's findings.</p></div><div class="flex shrink-0 items-center gap-1">`),u3=N(`<p class="text-text mt-1 text-[11px] font-semibold">Interaction states`),d3=N(`<svg width=12 height=12 viewBox="0 0 16 16"aria-hidden><rect x=3.5 y=3.5 width=9 height=9 rx=1.5 fill=currentColor>`),f3=N(`<span class="text-warn text-[10.5px] font-medium tabular-nums">s · <!> states`),p3=N(`<div class="border-border flex flex-col gap-2 border-t px-2.5 py-2"><p class="text-text-faint truncate text-[10px]"></p><div class="flex max-h-64 flex-col gap-2 overflow-y-auto pr-2"></div><div class="flex items-center gap-1">`),m3=N(`<div class=relative><span class="border-border bg-surface absolute top-3 -left-[13.5px] size-[9px] rounded-full border"aria-hidden></span><div class="bg-surface border-border flex flex-col rounded-lg border"><button class="flex w-full cursor-pointer items-center gap-2 px-2.5 py-2 text-left"><span class="text-accent min-w-0 truncate font-mono text-[12px]"></span><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums"> roles<!> · </span><svg width=10 height=10 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 class="text-text-faint shrink-0 transition-transform"aria-hidden><path d="m4 6 4 4 4-4">`),h3=N(`<span class=text-text-faint> ×`),g3=N(`<div class="flex flex-col gap-0.5"><p class="text-text text-[11px] font-medium">`),_3=N(`<span class=text-accent> ← var(<!>)`),v3=N(`<p class="text-text-dim font-mono text-[10px] leading-snug break-all">: `),y3=N(`<div class="flex flex-col gap-0.5"><p class="text-warn text-[10.5px] font-medium"> — `),b3=N(`<p class="text-text-dim font-mono text-[10px] leading-snug break-all">: <!> → `),x3=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><circle cx=8 cy=8 r=6></circle><circle cx=8 cy=8 r=2 fill=currentColor stroke=none>`),S3=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=9 height=9 rx=1.5></rect><path d="M10.5 5.5v-2a2 2 0 0 0-2-2h-5a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h2">`),C3=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor aria-hidden><path d="M4.5 2.5v11l9-5.5z">`),w3=N(`<p class="text-text-faint px-1 text-[10.5px]">Nothing caught yet — interact with the app, or run Audit.`),T3=N(`<span class="text-text-dim font-mono text-[10px] break-all">`),E3=N(`<span class="text-danger text-[10px] leading-snug">⚠ layout/paint transition: `),D3=N(`<span class="text-danger text-[10px] leading-snug">⚠ ease-in easing: `),O3=N(`<div class="bg-surface border-border flex flex-col gap-0.5 rounded-lg border p-2"><div class="flex items-center gap-2"><span class="text-warn shrink-0 text-[10px] font-semibold tracking-wide uppercase"></span><span class="text-accent min-w-0 truncate font-mono text-[11.5px]"></span><span class="text-text ml-auto shrink-0 text-[11px] font-medium tabular-nums">ms</span></div><span class="text-text-dim text-[10px] leading-snug"></span><span class="text-text-faint text-[10px] leading-snug">`),k3=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M8 1.5 9.6 6l4.4 1.6L9.6 9.2 8 13.7 6.4 9.2 2 7.6 6.4 6Z"></path><path d="M13 11.5l.6 1.7 1.7.6-1.7.6-.6 1.7-.6-1.7-1.7-.6 1.7-.6Z">`),A3=N(`<p class="text-text-faint px-1 text-[10.5px]">No scan yet — click Scan to audit this page against the contract.`),j3=N(`<div class="border-border flex flex-col gap-1 border-t px-2 py-1.5"><p class="text-text-dim text-[10px] leading-snug">`),M3=N(`<div class="bg-surface border-border flex flex-col rounded-lg border"><button class="flex w-full cursor-pointer items-center gap-2 px-2 py-1.5 text-left"><span class="size-1.5 shrink-0 rounded-full"aria-hidden></span><span class="text-accent min-w-0 truncate font-mono text-[11.5px]"></span><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums">×</span><svg width=10 height=10 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 class="text-text-faint shrink-0 transition-transform"aria-hidden><path d="m4 6 4 4 4-4">`),N3=N(`<span class=text-accent> `),P3=N(`<span class="text-text-faint tabular-nums"> ×`),F3=N(`<button class="hover:bg-surface-2 flex w-full cursor-pointer flex-col gap-0.5 rounded px-1 py-0.5 text-left"title="Reveal on the page"><span class="text-text min-w-0 truncate font-mono text-[10.5px]"></span><span class="text-text-faint font-mono text-[10px] leading-snug break-all">`),I3=`linear-grab:genomes:v1`,L3=30;function R3(){try{return JSON.parse(localStorage.getItem(I3)??`[]`)}catch{return[]}}function z3(e){try{localStorage.setItem(I3,JSON.stringify(e.slice(0,L3)))}catch{}}var B3=new Map;function V3(e){let t=e.el?.deref();if(!(t instanceof HTMLElement)||!t.isConnected)return!1;t.scrollIntoView({block:`center`,behavior:`smooth`});let n=t.style.outline,r=t.style.outlineOffset;return t.style.outline=`2px solid #e5a13a`,t.style.outlineOffset=`2px`,setTimeout(()=>{t.style.outline=n,t.style.outlineOffset=r},1400),!0}function H3(){let[e,t]=T(R3()),[n,r]=T(null),[i,a]=T(null),[o,s]=T(null),[c,l]=T(null),[u,d]=T(null),[f,p]=T({active:!1,msLeft:0,total:0,byTrigger:{}});ae(i2(p));let[m,h]=T([]);ae(j2(h));let[g,_]=T(F2());ae(L2(_));let[v,y]=T(!1),[b,x]=T(!1),S=async()=>{y(!0);try{await V2()}finally{y(!1)}},C=async()=>{try{await navigator.clipboard.writeText(U2(m())),x(!0),setTimeout(()=>x(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},[w,E]=T(!1),O=async()=>{try{await navigator.clipboard.writeText(H2(m())),E(!0),setTimeout(()=>E(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},[k,ee]=T([]);ae(I4(ee));let[te,A]=T(U4());ae(G4(A));let[ne,re]=T(!1),[ie,oe]=T(null),[se,ce]=T(!0),[le,ue]=T(!0),[de,fe]=T(!1),[pe,me]=T(!1),he=()=>{l(null),re(!0);try{R4(),oe(null)}catch(e){l(e instanceof Error?e.message:String(e))}finally{re(!1)}},ge=()=>{L4(),oe(null)},_e=()=>new Set(k().map(e=>e.page)).size,ve=()=>k().filter(e=>e.severity===`error`?se():le()),ye=()=>{let e=new Map;for(let t of ve()){let n=e.get(t.ruleId);n?n.push(t):e.set(t.ruleId,[t])}return[...e.values()].sort((e,t)=>Number(t[0].severity===`error`)-Number(e[0].severity===`error`)||t.length-e.length)},be=()=>k().filter(e=>e.severity===`error`).length,xe=()=>k().length-be(),Se=async()=>{try{await navigator.clipboard.writeText(M4(ve())),fe(!0),setTimeout(()=>fe(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},Ce=async()=>{try{await navigator.clipboard.writeText(N4(ve())),me(!0),setTimeout(()=>me(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},we=e=>{t(e),z3(e)},Te=async()=>{l(null),a(`extract`),window.dispatchEvent(new CustomEvent(BZ));try{let t=await u2();if(!t)return;let n=await e2(t),i=Date.now();B3.set(i,new WeakRef(t)),we([{id:i,genome:n},...e()]),r(i)}catch(e){l(e instanceof Error?e.message:String(e))}finally{a(null),sj(`design`),window.dispatchEvent(new CustomEvent(VZ))}},Ee=async t=>{l(null),a(t.id),window.dispatchEvent(new CustomEvent(BZ));try{let n=B3.get(t.id)?.deref()??null;if(!n||!n.isConnected){if(n=await u2(),!n)return;B3.set(t.id,new WeakRef(n))}let r=await c2(n,8e3,e=>s(Math.ceil(e/1e3)));r.length===0&&l(`No state changes captured — hover/open the component while the 8s window runs.`),we(e().map(e=>e.id===t.id?{...e,genome:{...e.genome,states:[...e.genome.states,...r]}}:e))}catch(e){l(e instanceof Error?e.message:String(e))}finally{a(null),s(null),sj(`design`),window.dispatchEvent(new CustomEvent(VZ))}},De=async e=>{try{await navigator.clipboard.writeText(l2(e.genome)),d(e.id),setTimeout(()=>d(null),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},Oe=t=>{B3.delete(t),we(e().filter(e=>e.id!==t))},[ke,Ae]=T(!1),je=async()=>{try{let t=e().map(e=>l2(e.genome)).join(`
|
|
273
|
+
`)}function W2(e,t,n){return{ruleId:e.id,part:e.part,severity:e.severity,description:e.description,selector:y2(t),evidence:n,el:typeof WeakRef<`u`?new WeakRef(t):void 0}}function G2(e){return e.getBoundingClientRect()}function K2(e){return e.split(`/`)[0].trim().split(/\s+/).filter(Boolean).map(e=>e.endsWith(`px`)?parseFloat(e):NaN)}function q2(e){let t=e.match(/rgba?\(([^)]+)\)/);return t?t[1].split(`,`).map(e=>e.trim()).join(`,`):null}function J2(e,t){let n=t,r=n.maskImage||n.webkitMaskImage||``;if(r&&r!==`none`)return r;let i=(e.getAttribute(`style`)??``).match(/(?:^|;|\s)(?:-webkit-)?mask-image\s*:\s*([^;]+)/i);return i&&i[1].trim()&&i[1].trim()!==`none`?i[1].trim():``}var Y2=new Set([0,8,12,16]),X2={light:q2(`rgb(240, 240, 241)`),dark:q2(`rgb(35, 35, 37)`)},Z2=new Set([`#50e3c2`,`#ee0000`,`#f5a623`]),Q2=`button, a, [role="button"], [role="tab"], [role="menuitem"], [role="option"], input, textarea, select`;function $2(e){let t=[],n=e=>{for(let r of Array.from(e)){let e=r;if(e.cssRules&&e.cssRules.length){n(e.cssRules);continue}let i=r.selectorText;i&&i.includes(`:hover`)&&t.push(i.replace(/:hover/g,``))}};for(let t of Array.from(e.styleSheets))try{n(t.cssRules)}catch{}return t}function e4(e,t){for(let n of t)if(n.trim())try{if(e.matches(n))return!0}catch{}return!1}function t4(e){return!e.matches(`button, [role="button"]`)||e.querySelectorAll(`svg`).length===0?!1:(e.textContent??``).trim().length===0}function n4(e){let t=e.parentElement;for(;t;){try{let e=r4(t).overflowY;if(e===`auto`||e===`scroll`)return t}catch{}t=t.parentElement}return null}var r4=e=>getComputedStyle(e),i4={id:`radius-vocabulary`,part:`§40`,severity:`error`,description:`§40: radius vocabulary is {8, 12, 16, full} — never rounded-md/[4px]/[6px]/[10px]. Off-vocabulary radius.`,check(e){let t=[];for(let n of e.els){let r=e.css(n).borderRadius;if(!r||r===`0px`)continue;let i=K2(r);if(i.some(e=>Number.isNaN(e)))continue;let a=Math.max(...i);if(a===0)continue;let o=G2(n),s=Math.min(o.width||0,o.height||0);s>0&&a>=s/2-.5||i.every(e=>Y2.has(e))||t.push(W2(this,n,`border-radius: ${r}`))}return t}},a4={id:`row-radius-token`,part:`§40`,severity:`error`,description:`§40: list rows consume --row-radius (8px) or 0 — no bespoke per-surface row radius.`,check(e){let t=[];for(let n of e.els){let r=G2(n).height;if(r<26||r>50||!n4(n))continue;let i=n.parentElement;if(!i||Array.from(i.children).filter(e=>{let t=G2(e);return Math.abs(t.height-r)<2}).length<3)continue;let a=K2(e.css(n).borderRadius);if(a.some(e=>Number.isNaN(e)))continue;let o=Math.max(0,...a);o===0||o===8||t.push(W2(this,n,`row radius ${e.css(n).borderRadius} (want 0 or var(--row-radius)=8px)`))}return t}},o4={id:`active-fill-token`,part:`§11`,severity:`error`,description:`§11: active/selected fill must be var(--selected) (theme-safe) — never bg-secondary (#F0F0F1 / #232325).`,check(e){let t=[],n=null;try{let t=e.root.documentElement??document.documentElement;t&&(n=q2(e.css(t).getPropertyValue(`--selected`).trim()))}catch{}let r=[X2.light,X2.dark].filter(Boolean);if(n&&r.includes(n)){let t=e.root.documentElement??document.documentElement;return[W2({id:this.id,part:this.part,severity:`warn`,description:`§11: active-fill-token unverifiable — --selected resolves EQUAL to bg-secondary this theme; cannot distinguish the token from the anti-pattern.`},t??e.els[0],`--selected == bg-secondary (${n})`)]}for(let n of e.els){if(!(n.matches(`[role="tab"], [role="button"], [aria-selected], [role="option"]`)||n.closest(`[role="tablist"], [role="menu"], [data-rail], nav`)))continue;let i=q2(e.css(n).backgroundColor);i&&r.includes(i)&&t.push(W2(this,n,`background bg-secondary (${e.css(n).backgroundColor}) — use var(--selected)`))}return t}},s4={id:`inline-style-state`,part:`§40`,severity:`error`,description:`§40: the shared row-action class owns ALL visual states; inline styles carry LAYOUT ONLY — an inline background/color kills the class state.`,check(e){let t=[];for(let n of e.els){let e=typeof n.className==`string`?n.className:``;if(!/pb-row-action|row-action/.test(e))continue;let r=n.getAttribute(`style`)??``;/(^|;|\s)(background|color)\s*:/.test(r)&&t.push(W2(this,n,`inline style="${r}" on a row-action element`))}return t}},c4={id:`icon-button-no-hover`,part:`§40`,severity:`warn`,description:`§40/Part 10: every interactive control changes color on hover — icon-only button with no :hover rule and no .pb-row-action.`,check(e){let t=[],n=$2(e.root.styleSheets?e.root:document);for(let r of e.els){if(!t4(r))continue;let i=typeof r.className==`string`?r.className:``;/pb-row-action|row-action/.test(i)||r.hasAttribute(`data-framer-appear-id`)||Array.from(r.attributes).some(e=>e.name.startsWith(`data-framer`))||e.css(r).willChange.includes(`transform`)||e4(r,n)||t.push(W2(this,r,`icon-only ${r.tagName.toLowerCase()} with no hover rule / .pb-row-action`))}return t}},l4={id:`icon-button-no-tooltip`,part:`§7`,severity:`warn`,description:`§7: every icon-only button gets the shared Tooltip — needs aria-describedby / data-slot="tooltip-trigger" (menu-row title exempt).`,check(e){let t=[];for(let n of e.els)t4(n)&&(n.hasAttribute(`aria-describedby`)||n.getAttribute(`data-slot`)===`tooltip-trigger`||n.closest(`[data-slot="tooltip-trigger"]`)||n.closest(`[role="menuitem"]`)&&n.hasAttribute(`title`)||t.push(W2(this,n,`icon-only ${n.tagName.toLowerCase()} with no tooltip trigger / aria-describedby`)));return t}},u4={id:`unvirtualized-scroller`,part:`§0`,severity:`error`,description:`§0: every dynamic-length scrolling list virtualizes — a tall scroller with 60+ direct children is unvirtualized.`,check(e){let t=[];for(let n of e.els){let r=e.css(n);if(![r.overflowY,r.overflowX,r.overflow].some(e=>e===`auto`||e===`scroll`)||n.scrollHeight<=2*n.clientHeight)continue;let i=n.children.length;i<=60||t.push(W2(this,n,`${i} direct children, scrollHeight ${n.scrollHeight} > 2×clientHeight ${n.clientHeight}`))}return t}},d4={id:`scroll-no-fade`,part:`§1`,severity:`warn`,description:`§1: a horizontal scroller needs a truthful scroll fade — no scroll-fade-x/scroll-fade-x-js class and no mask-image.`,check(e){let t=[];for(let n of e.els){let r=e.css(n).overflowX;if(r!==`auto`&&r!==`scroll`||n.clientWidth<24||n.scrollWidth<=n.clientWidth+8)continue;let i=typeof n.className==`string`?n.className:``;/scroll-fade-x(-js)?/.test(i)||J2(n,e.css(n))||t.push(W2(this,n,`horizontal scroller (scrollWidth ${n.scrollWidth} > clientWidth ${n.clientWidth}) with no fade`))}return t}},f4={id:`phantom-fade`,part:`§1`,severity:`warn`,description:`§1: a fade must NEVER paint when nothing is hidden — mask-image present but scrollWidth ≤ clientWidth (the fade lies).`,check(e){let t=[];for(let n of e.els)J2(n,e.css(n))&&(n.scrollWidth>n.clientWidth||t.push(W2(this,n,`mask-image fade but scrollWidth ${n.scrollWidth} ≤ clientWidth ${n.clientWidth}`)));return t}},p4={id:`scrollbar-flush`,part:`Part 5`,severity:`warn`,description:`Part 5: scrollables carry asymmetric right padding so content clears the scrollbar — padding-right < 8px while overflowing vertically with content reaching the right edge.`,check(e){let t=[];for(let n of e.els){let r=e.css(n);if(![r.overflowY,r.overflow].some(e=>e===`auto`||e===`scroll`)||n.scrollHeight<=n.clientHeight)continue;let i=parseFloat(r.paddingRight)||0;if(i>=8)continue;let a=G2(n);Array.from(n.children).some(e=>{let t=G2(e);return a.right-t.right<=4})&&t.push(W2(this,n,`padding-right ${i}px (<8px) with content flush to the scrollbar`))}return t}},m4=/^("?(Geist|Geist Mono)"?|ui-monospace|ui-sans-serif|-apple-system|system-ui)/i,h4={id:`font-family`,part:`Part 5`,severity:`warn`,description:`Part 5: Geist / Geist Mono ONLY — computed font-family does not start with the Geist / ui-monospace fallback chain.`,check(e){let t=[];for(let n of e.els){if(!O4(n))continue;let r=e.css(n).fontFamily;r&&(m4.test(r.trim())||t.push(W2(this,n,`font-family: ${r}`)))}return t}},g4={id:`uppercase-label`,part:`§25`,severity:`error`,description:`§25: group/section labels are sentence-case — never uppercase (text-transform: uppercase on small <13px text).`,check(e){let t=[];for(let n of e.els){if(!O4(n))continue;let r=e.css(n);r.textTransform===`uppercase`&&((parseFloat(r.fontSize)||0)>=13||t.push(W2(this,n,`text-transform: uppercase at ${r.fontSize}`)))}return t}},_4={id:`hardcoded-status-hex`,part:`Part 5`,severity:`warn`,description:`Part 5: raw hex only for the status trio (#50E3C2/#EE0000/#F5A623) — a saturated non-token color on small UI text.`,check(e){let t=[],n=new Set;for(let e of Z2){let t=q2(`rgb(${parseInt(e.slice(1,3),16)}, ${parseInt(e.slice(3,5),16)}, ${parseInt(e.slice(5,7),16)})`);t&&n.add(t)}try{let t=e.root,r=t.documentElement;if(r&&t.body){let i=e.css(r),a=t.createElement(`span`);a.setAttribute(`data-linear-grab`,`true`),a.style.display=`none`,t.body.appendChild(a);for(let e=0;e<i.length;e++){let t=i[e];if(!t.startsWith(`--`))continue;let r=i.getPropertyValue(t).trim();if(!r||r.length>40||(a.style.color=``,a.style.color=r,!a.style.color))continue;let o=q2(getComputedStyle(a).color);o&&n.add(o)}a.remove()}}catch{}for(let r of e.els){if(!O4(r))continue;let i=(r.getAttribute(`style`)??``).match(/#[0-9a-fA-F]{6}/g)??[],a=e.css(r);if((parseFloat(a.fontSize)||0)>=16)continue;for(let e of i)Z2.has(e.toLowerCase())||t.push(W2(this,r,`hardcoded ${e} (not the brand status trio)`));let o=q2(a.color);if(o&&i.length===0&&!n.has(o)){let[e,n,i]=o.split(`,`).map(e=>parseFloat(e));Number.isFinite(e)&&k4(e,n,i)&&t.push(W2(this,r,`saturated non-token color ${a.color} on small UI text`))}}return t}},v4={id:`editor-shadow`,part:`Part 5`,severity:`error`,description:`Part 5: editor surfaces are FLAT — box-shadow that is not a 0.5px hairline ring / approved popover/card/input token shadow.`,check(e){let t=[];if(!(e.root.querySelector?.(`[data-editor-surface]`)||typeof location<`u`&&/\/editor\//.test(location.pathname)))return t;for(let n of e.els){if(!n.closest(`[data-editor-surface]`)&&!/\/editor\//.test(typeof location<`u`?location.pathname:``))continue;let r=e.css(n).boxShadow;!r||r===`none`||j4(r)||M4(r)||t.push(W2(this,n,`box-shadow: ${r}`))}return t}},y4={id:`focusring-clip`,part:`§24`,severity:`warn`,description:`§24/Part 5: focus rings never clip — a focusable element whose nearest overflow-hidden ancestor sits <4px from its border box.`,check(e){let t=[];for(let n of e.els){if(!n.matches(Q2)&&n.getAttribute(`tabindex`)==null)continue;let r=n.parentElement;for(;r;){let t=e.css(r);if([t.overflow,t.overflowX,t.overflowY].some(e=>e===`hidden`))break;r=r.parentElement}if(!r)continue;let i=G2(n),a=G2(r);if(i.width===0&&i.height===0)continue;let o=Math.min(i.left-a.left,a.right-i.right,i.top-a.top,a.bottom-i.bottom);o>=4||t.push(W2(this,n,`overflow-hidden ancestor ${o.toFixed(1)}px from border box — focus ring will clip`))}return t}},b4={id:`fixed-width-in-pane`,part:`§24`,severity:`warn`,description:`§24: no fixed field widths in resizable panes — w-[Npx] (N ≥ 200) inside a [data-panel] / flex-basis sibling clips at the pane edge.`,check(e){let t=[];for(let n of e.els){if(!n.closest(`[data-panel]`))continue;let e=typeof n.className==`string`?n.className:``,r=n.getAttribute(`style`)??``,i=e.match(/w-\[(\d+)px\]/)??r.match(/(?:^|;|\s)width\s*:\s*(\d+)px/);if(!i)continue;let a=parseFloat(i[1]);a<200||t.push(W2(this,n,`fixed width ${a}px inside a resizable pane — use w-full max-w-[${a}px]`))}return t}},x4={id:`menu-icons-all-or-none`,part:`§21`,severity:`error`,description:`§21: within one menu ALL items carry a leading icon or NONE do — a mixed set reads broken.`,check(e){let t=[],n=Array.from(e.root.querySelectorAll(`[role="menu"]`));for(let e of n){let n=Array.from(e.querySelectorAll(`[role="menuitem"]`));if(n.length<2)continue;let r=n.filter(e=>e.querySelector(`svg`)).length;r===0||r===n.length||t.push(W2(this,e,`${r}/${n.length} menu items have a leading icon`))}return t}},S4={id:`menu-icon-mixed-weight`,part:`§21`,severity:`warn`,description:`§21: menu icons are ONE stroke family — some filled (fill=currentColor) and some stroke-based, or rendered sizes differing >2px, mixes two design systems.`,check(e){let t=[],n=Array.from(e.root.querySelectorAll(`[role="menu"]`));for(let e of n){let n=Array.from(e.querySelectorAll(`[role="menuitem"] svg`));if(n.length<2)continue;let r=0,i=0,a=[];for(let e of n){Array.from(e.querySelectorAll(`path, circle, rect, polygon`)).some(e=>{let t=(e.getAttribute(`fill`)??``).toLowerCase();return t===`currentcolor`||t&&t!==`none`})?r++:i++;let t=G2(e);a.push(Math.max(t.width,t.height))}let o=Math.max(...a),s=Math.min(...a),c=r>0&&i>0,l=o>0&&o-s>2;!c&&!l||t.push(W2(this,e,c?`${r} filled + ${i} stroke-based icons in one menu`:`icon sizes differ by ${(o-s).toFixed(1)}px`))}return t}},C4={id:`chrome-selectable`,part:`Part 5`,severity:`warn`,description:`Part 5: chrome (rails/pills/tabs) is select-none — a rail/pill/tab without user-select:none.`,check(e){let t=[];for(let n of e.els){if(!(n.matches(`[role="tab"]`)||n.closest(`[role="tablist"], [data-rail], nav`)||/\bpill\b/.test(typeof n.className==`string`?n.className:``)))continue;let r=e.css(n).userSelect||e.css(n).webkitUserSelect;r!==`none`&&t.push(W2(this,n,`chrome element without user-select:none (user-select: ${r||`auto`})`))}return t}},w4={id:`cursor-mismatch`,part:`Part 5`,severity:`warn`,description:`Part 5: cursor semantics — buttons get pointer, static text gets default. A button with cursor:text, or static text with cursor:pointer and no interactive ancestor.`,check(e){let t=[];for(let n of e.els){let r=e.css(n).cursor;if(n.matches(`button, [role="button"]`)&&r===`text`){t.push(W2(this,n,`interactive control with cursor:text`));continue}if(r===`pointer`&&n.matches(`p, h1, h2, h3, h4, h5, h6, span`)){if(n.closest(`button, a, [role="button"], [onclick], label`)||n.matches(`button, a, [role="button"]`))continue;t.push(W2(this,n,`static ${n.tagName.toLowerCase()} with cursor:pointer and no interactive ancestor`))}}return t}};function T4(e){let t=e.transitionProperty.split(`,`).map(e=>e.trim()).filter(Boolean);return t.length===1&&t[0]===`none`?[]:t}var E4=[i4,a4,o4,s4,c4,l4,u4,d4,f4,p4,h4,g4,_4,v4,y4,b4,x4,S4,C4,w4,{id:`transition-all`,part:`§42`,severity:`error`,description:`§42: never transition-all — scope to what changes (transition-colors / transition-[transform,...]).`,check(e){let t=[];for(let n of e.els){if(!n.matches(Q2))continue;let r=T4(e.css(n));r.includes(`all`)&&(v2(n,r)||t.push(W2(this,n,`transition-property: all`)))}return t}},{id:`transition-paint-prop`,part:`§42`,severity:`error`,description:`§42: never transition layout/paint props (box-shadow, width, height, top/left, margin, padding) — they reflow/repaint every frame; focus rings SNAP, shadows animate a pseudo-element opacity.`,check(e){let t=[];for(let n of e.els){let r=T4(e.css(n)),i=p2(r).filter(e=>e!==`all (includes layout/paint props)`);i.length!==0&&(v2(n,r)||t.push(W2(this,n,`transitions layout/paint props: ${i.join(`, `)}`)))}return t}},{id:`transition-too-slow`,part:`§42`,severity:`error`,description:`§42: interaction feedback is ≤100ms (duration-75 for small controls) — the 100ms theme default is fine; an explicit duration-150+ crept in.`,check(e){let t=[];for(let n of e.els){if(!n.matches(Q2))continue;let r=e.css(n),i=T4(r);if(i.length===0||v2(n,i))continue;let a=d2(r.transitionDuration),o=Math.max(0,...a);o<=100||t.push(W2(this,n,`transition-duration ${o}ms (>100ms) on [${i.join(`, `)}]`))}return t}},{id:`ease-in-feedback`,part:`§42`,severity:`warn`,description:`§42: house curve is cubic-bezier(.2,0,.1,1) ease-out — never ease-in / ease-in-out (or an ease-in-shaped bezier) on feedback.`,check(e){let t=[];for(let n of e.els){if(!n.matches(Q2))continue;let r=e.css(n),i=T4(r);if(i.length===0||v2(n,i))continue;let a=m2(r.transitionTimingFunction);a&&t.push(W2(this,n,`transition-timing-function: ${a}`))}return t}},{id:`press-instant-rule-missing`,part:`§42`,severity:`error`,description:"§42: the global press-instant rule (globals.css) must exist — `button:active{transition-duration:0s}` (or transition:none). Absent = press feedback animates instead of snapping.",check(e){let t=e.root.styleSheets?e.root:document,n=!1,r=e=>{for(let t of Array.from(e)){if(n)return;let e=t;if(e.cssRules&&e.cssRules.length){r(e.cssRules);continue}let i=t,a=i.selectorText;if(a&&/:active\b/.test(a)&&/(^|[\s,])(button|a|\[role=("|')?(button|tab|menuitem|option)("|')?\])/i.test(a))try{let e=i.style.transitionDuration,t=i.style.transition;if(e===`0s`||/(^|\s)none(\s|$)/.test(t)||/\b0s\b/.test(t)){n=!0;return}}catch{}}};try{for(let e of Array.from(t.styleSheets)){if(n)break;try{r(e.cssRules)}catch{}}}catch{}if(n)return[];let i=e.root.documentElement??e.els[0]??document.documentElement;return[W2(this,i,"no `button:active { transition-duration: 0s }` rule on this page")]}}],D4=[];function O4(e){for(let t of Array.from(e.childNodes))if(t.nodeType===3&&(t.textContent??``).trim().length>0)return!0;return!1}function k4(e,t,n){let r=Math.max(e,t,n);return r<40?!1:r-Math.min(e,t,n)>60}function A4(e){let t=[],n=0,r=0;for(let i=0;i<e.length;i++){let a=e[i];a===`(`?n++:a===`)`?n--:a===`,`&&n===0&&(t.push(e.slice(r,i).trim()),r=i+1)}return t.push(e.slice(r).trim()),t.filter(Boolean)}function j4(e){return A4(e).every(e=>{if(/\btransparent\b/.test(e)||/(?:rgba?|hsla?|oklch|oklab|lab|lch|color)\([^)]*[/,]\s*0(?:\.0+)?\s*\)/.test(e))return!0;let t=e.match(/-?\d*\.?\d+(?:px|em|rem)/g)??[];return t.length>0&&t.every(e=>parseFloat(e)===0)})}function M4(e){return!!(/\b0px\s+0px\s+0px\s+0?\.?5px\b/.test(e)||/\b0px?\s+0px?\s+0px?\s+0?\.?5px\b/.test(e))}var N4=`#linear-grab-root, [data-linear-grab], [data-react-grab], #claude-agent-glow-border, [id^="react-scan"]`;function P4(e=typeof document<`u`?document:{}){let t=new Map,n=e=>{let n=t.get(e);return n||(n=getComputedStyle(e),t.set(e,n)),n};r4=n;let r=Array.from(e.querySelectorAll(`*`)),i=[],a=e.documentElement??null,o=e.body??null,s=(a?.getBoundingClientRect().width??0)>0;for(let e of r){if(e===a||e===o||e.closest(N4))continue;let t=G2(e);if(s){if(t.width<2||t.height<2)continue}else if(t.width===0&&t.height===0&&e.children.length===0)continue;i.push(e)}let c={root:e,els:i,css:n},l=[];for(let e of[...E4,...D4])try{l.push(...e.check(c))}catch{}r4=e=>getComputedStyle(e);let u=new Map;for(let e of l){let t=`${e.ruleId}|${e.selector}|${e.evidence}`,n=u.get(t);n?n.count=(n.count??1)+1:u.set(t,e)}return[...u.values()]}function F4(e){let t=new Map;for(let n of e){let e=t.get(n.ruleId);e?e.push(n):t.set(n.ruleId,[n])}let n=Array.from(t.entries()).sort((e,t)=>{let n=e[1][0].severity===`error`?0:1,r=t[1][0].severity===`error`?0:1;return n===r?t[1].length===e[1].length?e[0].localeCompare(t[0]):t[1].length-e[1].length:n-r}),r=e.length,i=e.filter(e=>e.severity===`error`).length,a=new Set(e.map(e=>e.page).filter(Boolean)).size>1,o=[`# Slop scan — ${i} error${i===1?``:`s`}, ${r-i} warn (${r} total)`,``];for(let[e,t]of n){let n=t[0],r=t.reduce((e,t)=>e+(t.count??1),0);o.push(`## ${e} — ${n.severity} ×${r} [${n.part}]`),o.push(n.description);for(let e of t){let t=e.component||e.source?` — ${[e.component,e.source].filter(Boolean).join(` @ `)}`:``,n=(e.count??1)>1?` ×${e.count}`:``;o.push(`- ${a&&e.page?`\`${e.page}\` `:``}\`${e.selector}\`${n} — ${e.evidence}${t}`)}o.push(``)}return o.join(`
|
|
274
|
+
`)}function I4(e){return[`Below is a design-system SLOP report from my running app — each finding is a`,"live-DOM violation of the Linear/Protocolbase primitives contract (`Linear","-primitives.md`). Every rule cites its §id. Goal: zero errors. Rules:",``,`1. Fix at the TOKEN / VARIANT level, not the call sites. Most of these come`,` from shared row/button/menu variants — change --row-radius, --selected,`,` .pb-row-action, the Button/Input variant, or the globals.css §42 rules —`,` not one component at a time.`,`2. Cite the primitives §id in your fix (each finding carries it). Radius →`,` §40 vocabulary {8,12,16,full}; active fill → §11 var(--selected); menus →`,` §21 all-or-none icons + one stroke family; uppercase labels → §25;`,` editor flatness → Part 5; scrollers → §0–1 virtualize + truthful fade.`,`3. §42 group (transition-all / paint-prop / too-slow / ease-in / press-`,` instant): scope transitions to what changes, drop box-shadow/width/height`,` from transition lists, keep feedback ≤100ms (duration-75 small controls),`,` use ease-out (cubic-bezier(.2,0,.1,1)), and keep the global`," `button:active{transition-duration:0s}` press-instant rule.",`4. Do NOT touch EXEMPT intentional motion — popover/menu/dialog entry-exit,`,` svg icon micro-motion, and panel width/height transitions are §42-blessed.`,` The scan already excludes them; do not "fix" them.`,`5. 'unverifiable' warnings mean the token collapsed to the anti-pattern this`,` theme — verify the intent in BOTH themes, do not just silence it.`,"6. Findings carry `Component @ file:line` when the fiber source resolved.",` When one file:line repeats across many components it is the nearest-`,` debug-fiber fallback — locate the real code by the selector classes.`,`7. PROOF REQUIRED: after the change I will re-run the scan — it must show 0`,` errors. State what you changed per token/variant; do not claim done blind.`,``,`---`,``,F4(e)].join(`
|
|
275
|
+
`)}var L4=[],R4=new Set;function z4(e){return R4.add(e),e(L4),()=>void R4.delete(e)}function B4(){L4=[];for(let e of R4)e(L4)}function V4(){let e=location.pathname,t=P4(document).map(t=>({...t,page:e}));L4=[...t,...L4.filter(t=>t.page!==e)];for(let e of R4)e(L4);return H4(t).then(()=>{L4=[...L4];for(let e of R4)e(L4);U4(t)}),t}async function H4(e){let t=null;try{t=(await Promise.resolve().then(()=>(RZ(),AZ))).getGlobalApi()??null}catch{return}if(!t)return;let n=new Map;for(let t of e){let e=t.el?.deref();if(!e)continue;let r=n.get(e);r?r.push(t):n.set(e,[t])}let r=300;for(let[e,i]of n){if(r--<=0)break;let n=null,a=null;try{n=t.getDisplayName?.(e)??null}catch{}try{let n=await t.getSource?.(e);n?.filePath&&(a=`${n.filePath}${n.lineNumber==null?``:`:${n.lineNumber}`}`)}catch{}if(!(!n&&!a))for(let e of i)e.component=n,e.source=a}}function U4(e){if(e.length===0)return;let t=Date.now(),n=e.slice(0,200).map(({el:e,...n})=>({kind:`slop-scan`,at:t,...n}));YO().then(e=>fetch(`${e}/scan/events`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({events:n}),keepalive:!0})).catch(()=>{})}var W4=!1;try{W4=localStorage.getItem(`linear-grab:slop-live`)===`1`}catch{}var G4=new Set;function K4(){return W4}function q4(e){W4=e;try{localStorage.setItem(`linear-grab:slop-live`,e?`1`:`0`)}catch{}for(let t of G4)t(e);e&&X4(300)}function J4(e){return G4.add(e),e(W4),()=>void G4.delete(e)}var Y4=null;function X4(e){Y4&&clearTimeout(Y4),Y4=setTimeout(()=>{if(Y4=null,W4)try{V4()}catch{}},e)}var Z4=!1;function Q4(){if(Z4||typeof window>`u`)return;Z4=!0;let e=location.pathname;setInterval(()=>{location.pathname!==e&&(e=location.pathname,W4&&X4(1e3))},500)}var $4=N(`<span class="inline-block min-w-[7ch] text-center">Extract`),e3=N(`<div class="relative flex flex-col gap-2 pl-4"><div class="bg-border absolute top-1 bottom-1 left-[5px] w-px"aria-hidden>`),t3=N(`<span class="text-success text-[12px] leading-none">✓`),n3=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M4 4l8 8M12 4l-8 8">`),r3=N(`<div class="flex items-center justify-end gap-1 px-1">`),i3=N(`<span class="relative inline-flex items-center justify-center"><svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor aria-hidden><rect x=3.5 y=3 width=3.2 height=10 rx=1></rect><rect x=9.3 y=3 width=3.2 height=10 rx=1></rect></svg><span class="bg-success absolute -top-0.5 -right-0.5 size-1.5 animate-pulse rounded-full"aria-hidden>`),a3=N(`<span class="inline-block min-w-[5ch] text-center">Audit`),o3=N(`<div class="flex max-h-72 flex-col gap-1.5 overflow-y-auto pr-2">`),s3=N(`<span class="text-[12px] leading-none">✓`),c3=N(`<div class="flex items-center gap-1 px-1">`),l3=N(`<span class="text-text-faint font-normal tabular-nums"> · <!> pages`),u3=N(`<span class="inline-block min-w-[4ch] text-center">Scan`),d3=N(`<div class="flex items-center gap-1 px-1"><button class="border-border cursor-pointer rounded-full border px-2 py-0.5 text-[10px] font-medium tabular-nums"> errors</button><button class="border-border cursor-pointer rounded-full border px-2 py-0.5 text-[10px] font-medium tabular-nums"> warns`),f3=N(`<div class="flex h-full flex-col gap-3 overflow-y-auto pt-3 pb-4 pr-3 pl-2"><div class="flex items-center justify-between gap-2 px-1"><div class=min-w-0><p class="text-text text-[12.5px] font-semibold">Design genomes</p><p class="text-text-faint text-[10.5px] leading-snug">Point at a component → get its structure, tokens and interaction states as a spec you can hand to an agent.</p></div></div><div class="border-border mt-1 flex flex-col gap-2 border-t pt-3"><div class="flex items-center justify-between gap-2 px-1"><div class=min-w-0><p class="text-text text-[12.5px] font-semibold">CSS slowdowns</p><p class="text-text-faint text-[10.5px] leading-snug">Transitions/delays over the 100ms house cap (§42) on interactive elements — feedback that animates instead of being instant. Live hits appear as you use the app; Audit sweeps the whole page.</p></div><div class="flex shrink-0 items-center gap-1"></div></div></div><div class="border-border mt-1 flex flex-col gap-2 border-t pt-3"><div class="flex items-center justify-between gap-2 px-1"><div class=min-w-0><p class="text-text text-[12.5px] font-semibold">Slop scan</p><p class="text-text-faint text-[10.5px] leading-snug">Design-contract drift — Linear-primitives rules checked against the live DOM. Results accumulate per page as you navigate; re-scanning a page overwrites only that page's findings.</p></div><div class="flex shrink-0 items-center gap-1">`),p3=N(`<p class="text-text mt-1 text-[11px] font-semibold">Interaction states`),m3=N(`<svg width=12 height=12 viewBox="0 0 16 16"aria-hidden><rect x=3.5 y=3.5 width=9 height=9 rx=1.5 fill=currentColor>`),h3=N(`<span class="text-warn text-[10.5px] font-medium tabular-nums">s · <!> states`),g3=N(`<div class="border-border flex flex-col gap-2 border-t px-2.5 py-2"><p class="text-text-faint truncate text-[10px]"></p><div class="flex max-h-64 flex-col gap-2 overflow-y-auto pr-2"></div><div class="flex items-center gap-1">`),_3=N(`<div class=relative><span class="border-border bg-surface absolute top-3 -left-[13.5px] size-[9px] rounded-full border"aria-hidden></span><div class="bg-surface border-border flex flex-col rounded-lg border"><button class="flex w-full cursor-pointer items-center gap-2 px-2.5 py-2 text-left"><span class="text-accent min-w-0 truncate font-mono text-[12px]"></span><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums"> roles<!> · </span><svg width=10 height=10 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 class="text-text-faint shrink-0 transition-transform"aria-hidden><path d="m4 6 4 4 4-4">`),v3=N(`<span class=text-text-faint> ×`),y3=N(`<div class="flex flex-col gap-0.5"><p class="text-text text-[11px] font-medium">`),b3=N(`<span class=text-accent> ← var(<!>)`),x3=N(`<p class="text-text-dim font-mono text-[10px] leading-snug break-all">: `),S3=N(`<div class="flex flex-col gap-0.5"><p class="text-warn text-[10.5px] font-medium"> — `),C3=N(`<p class="text-text-dim font-mono text-[10px] leading-snug break-all">: <!> → `),w3=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><circle cx=8 cy=8 r=6></circle><circle cx=8 cy=8 r=2 fill=currentColor stroke=none>`),T3=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=9 height=9 rx=1.5></rect><path d="M10.5 5.5v-2a2 2 0 0 0-2-2h-5a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h2">`),E3=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor aria-hidden><path d="M4.5 2.5v11l9-5.5z">`),D3=N(`<p class="text-text-faint px-1 text-[10.5px]">Nothing caught yet — interact with the app, or run Audit.`),O3=N(`<span class="text-text-dim font-mono text-[10px] break-all">`),k3=N(`<span class="text-danger text-[10px] leading-snug">⚠ layout/paint transition: `),A3=N(`<span class="text-danger text-[10px] leading-snug">⚠ ease-in easing: `),j3=N(`<div class="bg-surface border-border flex flex-col gap-0.5 rounded-lg border p-2"><div class="flex items-center gap-2"><span class="text-warn shrink-0 text-[10px] font-semibold tracking-wide uppercase"></span><span class="text-accent min-w-0 truncate font-mono text-[11.5px]"></span><span class="text-text ml-auto shrink-0 text-[11px] font-medium tabular-nums">ms</span></div><span class="text-text-dim text-[10px] leading-snug"></span><span class="text-text-faint text-[10px] leading-snug">`),M3=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M8 1.5 9.6 6l4.4 1.6L9.6 9.2 8 13.7 6.4 9.2 2 7.6 6.4 6Z"></path><path d="M13 11.5l.6 1.7 1.7.6-1.7.6-.6 1.7-.6-1.7-1.7-.6 1.7-.6Z">`),N3=N(`<p class="text-text-faint px-1 text-[10.5px]">No scan yet — click Scan to audit this page against the contract.`),P3=N(`<div class="border-border flex flex-col gap-1 border-t px-2 py-1.5"><p class="text-text-dim text-[10px] leading-snug">`),F3=N(`<div class="bg-surface border-border flex flex-col rounded-lg border"><button class="flex w-full cursor-pointer items-center gap-2 px-2 py-1.5 text-left"><span class="size-1.5 shrink-0 rounded-full"aria-hidden></span><span class="text-accent min-w-0 truncate font-mono text-[11.5px]"></span><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums">×</span><svg width=10 height=10 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 class="text-text-faint shrink-0 transition-transform"aria-hidden><path d="m4 6 4 4 4-4">`),I3=N(`<span class=text-accent> `),L3=N(`<span class="text-text-faint tabular-nums"> ×`),R3=N(`<button class="hover:bg-surface-2 flex w-full cursor-pointer flex-col gap-0.5 rounded px-1 py-0.5 text-left"title="Reveal on the page"><span class="text-text min-w-0 truncate font-mono text-[10.5px]"></span><span class="text-text-faint font-mono text-[10px] leading-snug break-all">`),z3=`linear-grab:genomes:v1`,B3=30;function V3(){try{return JSON.parse(localStorage.getItem(z3)??`[]`)}catch{return[]}}function H3(e){try{localStorage.setItem(z3,JSON.stringify(e.slice(0,B3)))}catch{}}var U3=new Map;function W3(e){let t=e.el?.deref();if(!(t instanceof HTMLElement)||!t.isConnected)return!1;t.scrollIntoView({block:`center`,behavior:`smooth`});let n=t.style.outline,r=t.style.outlineOffset;return t.style.outline=`2px solid #e5a13a`,t.style.outlineOffset=`2px`,setTimeout(()=>{t.style.outline=n,t.style.outlineOffset=r},1400),!0}function G3(){let[e,t]=T(V3()),[n,r]=T(null),[i,a]=T(null),[o,s]=T(null),[c,l]=T(null),[u,d]=T(null),[f,p]=T({active:!1,msLeft:0,total:0,byTrigger:{}});ae(i2(p));let[m,h]=T([]);ae(j2(h));let[g,_]=T(F2());ae(L2(_));let[v,y]=T(!1),[b,x]=T(!1),S=async()=>{y(!0);try{await V2()}finally{y(!1)}},C=async()=>{try{await navigator.clipboard.writeText(U2(m())),x(!0),setTimeout(()=>x(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},[w,E]=T(!1),O=async()=>{try{await navigator.clipboard.writeText(H2(m())),E(!0),setTimeout(()=>E(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},[k,ee]=T([]);ae(z4(ee));let[te,A]=T(K4());ae(J4(A));let[ne,re]=T(!1),[ie,oe]=T(null),[se,ce]=T(!0),[le,ue]=T(!0),[de,fe]=T(!1),[pe,me]=T(!1),he=()=>{l(null),re(!0);try{V4(),oe(null)}catch(e){l(e instanceof Error?e.message:String(e))}finally{re(!1)}},ge=()=>{B4(),oe(null)},_e=()=>new Set(k().map(e=>e.page)).size,ve=()=>k().filter(e=>e.severity===`error`?se():le()),ye=()=>{let e=new Map;for(let t of ve()){let n=e.get(t.ruleId);n?n.push(t):e.set(t.ruleId,[t])}return[...e.values()].sort((e,t)=>Number(t[0].severity===`error`)-Number(e[0].severity===`error`)||t.length-e.length)},be=()=>k().filter(e=>e.severity===`error`).length,xe=()=>k().length-be(),Se=async()=>{try{await navigator.clipboard.writeText(F4(ve())),fe(!0),setTimeout(()=>fe(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},Ce=async()=>{try{await navigator.clipboard.writeText(I4(ve())),me(!0),setTimeout(()=>me(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},we=e=>{t(e),H3(e)},Te=async()=>{l(null),a(`extract`),window.dispatchEvent(new CustomEvent(BZ));try{let t=await u2();if(!t)return;let n=await e2(t),i=Date.now();U3.set(i,new WeakRef(t)),we([{id:i,genome:n},...e()]),r(i)}catch(e){l(e instanceof Error?e.message:String(e))}finally{a(null),sj(`design`),window.dispatchEvent(new CustomEvent(VZ))}},Ee=async t=>{l(null),a(t.id),window.dispatchEvent(new CustomEvent(BZ));try{let n=U3.get(t.id)?.deref()??null;if(!n||!n.isConnected){if(n=await u2(),!n)return;U3.set(t.id,new WeakRef(n))}let r=await c2(n,8e3,e=>s(Math.ceil(e/1e3)));r.length===0&&l(`No state changes captured — hover/open the component while the 8s window runs.`),we(e().map(e=>e.id===t.id?{...e,genome:{...e.genome,states:[...e.genome.states,...r]}}:e))}catch(e){l(e instanceof Error?e.message:String(e))}finally{a(null),s(null),sj(`design`),window.dispatchEvent(new CustomEvent(VZ))}},De=async e=>{try{await navigator.clipboard.writeText(l2(e.genome)),d(e.id),setTimeout(()=>d(null),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},Oe=t=>{U3.delete(t),we(e().filter(e=>e.id!==t))},[ke,Ae]=T(!1),je=async()=>{try{let t=e().map(e=>l2(e.genome)).join(`
|
|
276
276
|
|
|
277
277
|
---
|
|
278
278
|
|
|
279
|
-
`);await navigator.clipboard.writeText(t),Ae(!0),setTimeout(()=>Ae(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},Me=()=>{B3.clear(),we([]),r(null)};return(()=>{var t=l3(),a=t.firstChild;a.firstChild;var o=a.nextSibling,s=o.firstChild.firstChild.nextSibling,d=o.nextSibling,p=d.firstChild.firstChild,h=p.firstChild;h.firstChild;var _=p.nextSibling;return P(a,j(q,{variant:`primary`,class:`h-7 shrink-0 px-2.5 text-[11.5px]`,get loading(){return i()===`extract`},onClick:()=>void Te(),get children(){return X4()}}),null),P(t,j(M,{get when(){return c()},get children(){return j(Hj,{get message(){return c()}})}}),o),P(t,j(M,{get when(){return e().length>0},get fallback(){return j(Vj,{title:`No genomes yet`,children:`Click Extract and pick any component on the page — a dropdown, a card, a sidebar row. Then "Capture states" while you hover/open it to record the styles that only exist during interaction.`})},get children(){return[(()=>{var t=Z4();return t.firstChild,P(t,j(We,{get each(){return e()},children:e=>{let t=()=>n()===e.id;return(()=>{var n=m3(),a=n.firstChild,o=a.nextSibling,s=o.firstChild,c=s.firstChild,l=c.nextSibling,d=l.firstChild,p=d.nextSibling;p.nextSibling;var m=l.nextSibling;return s.$$click=()=>r(t()?null:e.id),P(c,()=>e.genome.title),P(l,()=>e.genome.nodes.length,d),P(l,(()=>{var t=$e(()=>!!e.genome.states.length);return()=>t()?` · ${e.genome.states.length} states`:``})(),p),P(l,()=>Wj(e.genome.extractedAt),null),P(o,j(M,{get when(){return t()},get children(){var t=p3(),n=t.firstChild,r=n.nextSibling,a=r.nextSibling;return P(n,()=>e.genome.pageUrl),P(r,j(We,{get each(){return e.genome.nodes},children:e=>(()=>{var t=g3(),n=t.firstChild;return P(n,()=>e.label,null),P(n,j(M,{get when(){return e.count>1},get children(){var t=h3();return t.firstChild,P(t,()=>e.count,null),t}}),null),P(t,j(We,{get each(){return Object.entries(e.styles)},children:([t,n])=>(()=>{var r=v3(),i=r.firstChild;return P(r,t,i),P(r,n,null),P(r,j(M,{get when(){return e.tokens[t]},get children(){var n=_3(),r=n.firstChild.nextSibling;return r.nextSibling,P(n,()=>e.tokens[t],r),n}}),null),r})()}),null),t})()}),null),P(r,j(M,{get when(){return e.genome.states.length>0},get children(){return[u3(),j(We,{get each(){return e.genome.states},children:e=>(()=>{var t=y3(),n=t.firstChild,r=n.firstChild;return P(n,()=>e.label,r),P(n,()=>e.trigger,null),P(t,j(We,{get each(){return Object.entries(e.changed)},children:([e,t])=>(()=>{var n=b3(),r=n.firstChild,i=r.nextSibling;return i.nextSibling,P(n,e,r),P(n,()=>t.from,i),P(n,()=>t.to,null),n})()}),null),t})()})]}}),null),P(a,j(M,{get when(){return $e(()=>i()===e.id)()&&f().active},get fallback(){return j(q,{class:`size-7 px-0`,variant:`ghost`,get loading(){return i()===e.id},title:`Capture states — records hover/focus/open styles for 8s while you interact; the pill shows the timer and Stop`,"aria-label":`Capture interaction states`,onClick:()=>void Ee(e),get children(){return x3()}})},get children(){return[j(q,{class:`text-danger size-7 px-0`,variant:`ghost`,get title(){return`Stop recording — ${Math.ceil(f().msLeft/1e3)}s left · ${f().total} captured`},"aria-label":`Stop recording states`,onClick:()=>o2(),get children(){return d3()}}),(()=>{var e=f3(),t=e.firstChild,n=t.nextSibling;return n.nextSibling,P(e,()=>Math.ceil(f().msLeft/1e3),t),P(e,()=>f().total,n),e})()]}}),null),P(a,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return u()===e.id?`Copied!`:`Copy spec — markdown for an agent or issue`},"aria-label":`Copy genome spec`,onClick:()=>void De(e),get children(){return j(M,{get when(){return u()===e.id},get fallback(){return S3()},get children(){return Q4()}})}}),null),P(a,j(q,{class:`text-danger ml-auto size-7 px-0`,variant:`ghost`,title:`Delete this genome`,"aria-label":`Delete genome`,onClick:()=>Oe(e.id),get children(){return $4()}}),null),t}}),null),D(e=>{var n={"bg-accent border-accent":t()},r=!!t();return e.e=lt(a,n,e.e),r!==e.t&&m.classList.toggle(`rotate-180`,e.t=r),e},{e:void 0,t:void 0}),n})()}}),null),t})(),(()=>{var e=e3();return P(e,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return ke()?`Copied!`:`Copy all genomes as one markdown document`},"aria-label":`Copy all genomes`,onClick:()=>void je(),get children(){return j(M,{get when(){return ke()},get fallback(){return S3()},get children(){return Q4()}})}}),null),P(e,j(q,{class:`text-danger size-7 px-0`,variant:`ghost`,title:`Delete all saved genomes`,"aria-label":`Delete all genomes`,onClick:Me,get children(){return $4()}}),null),e})()]}}),o),P(s,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return g()?`Live capture ON — recording transitions fired by your input. Click to pause.`:`Live capture PAUSED — click to resume recording input-triggered transitions.`},get"aria-label"(){return g()?`Pause live capture`:`Start live capture`},onClick:()=>I2(!g()),get children(){return j(M,{get when(){return g()},get fallback(){return C3()},get children(){return t3()}})}}),null),P(s,j(q,{variant:`ghost`,class:`h-7 px-2.5 text-[11.5px]`,get loading(){return v()},onClick:()=>void S(),get children(){return n3()}}),null),P(o,j(M,{get when(){return m().length>0},get fallback(){return w3()},get children(){return[(()=>{var e=r3();return P(e,j(We,{get each(){return m()},children:e=>(()=>{var t=O3(),n=t.firstChild,r=n.firstChild,i=r.nextSibling,a=i.nextSibling,o=a.firstChild,s=n.nextSibling,c=s.nextSibling;return P(r,()=>e.mode===`live`?`live`:`audit`),P(i,()=>e.component??e.element,null),P(i,j(M,{get when(){return e.count>1},get children(){return[` ×`,$e(()=>e.count)]}}),null),P(a,()=>e.durationMs,o),P(a,(()=>{var t=$e(()=>!!e.delayMs);return()=>t()?` +${e.delayMs}`:``})(),null),P(t,j(M,{get when(){return e.source},get children(){var t=T3();return P(t,()=>e.source),t}}),s),P(s,()=>e.properties.join(`, `),null),P(s,j(M,{get when(){return e.sinceInputMs!=null},get children(){return[` — fired `,$e(()=>e.sinceInputMs),`ms after input`]}}),null),P(t,j(M,{get when(){return e.jankProps?.length},get children(){var t=E3();return t.firstChild,P(t,()=>e.jankProps.join(`, `),null),t}}),c),P(t,j(M,{get when(){return e.easing},get children(){var t=D3();return t.firstChild,P(t,()=>e.easing,null),t}}),c),P(c,()=>e.suggestion),t})()})),e})(),(()=>{var e=a3();return P(e,j(q,{class:`size-7 px-0`,variant:`primary`,get title(){return w()?`Copied!`:`Copy AI prompt — report + fix rules, ready to paste into a Claude Code session`},"aria-label":`Copy AI fix prompt`,onClick:()=>void O(),get children(){return j(M,{get when(){return w()},get fallback(){return k3()},get children(){return i3()}})}}),null),P(e,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return b()?`Copied!`:`Copy report — plain markdown findings`},"aria-label":`Copy report`,onClick:()=>void C(),get children(){return j(M,{get when(){return b()},get fallback(){return S3()},get children(){return Q4()}})}}),null),P(e,j(q,{class:`text-danger ml-auto size-7 px-0`,variant:`ghost`,title:`Clear all findings (live + audit)`,"aria-label":`Clear all findings`,onClick:M2,get children(){return $4()}}),null),e})()]}}),null),P(h,j(M,{get when(){return _e()>1},get children(){var e=o3(),t=e.firstChild.nextSibling;return t.nextSibling,P(e,_e,t),e}}),null),P(_,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return te()?`Live scan ON — re-scans automatically ~1s after each route change. Click to pause.`:`Live scan PAUSED — click to auto-scan every page you navigate to.`},get"aria-label"(){return te()?`Pause live scan`:`Start live scan`},onClick:()=>W4(!te()),get children(){return j(M,{get when(){return te()},get fallback(){return C3()},get children(){return t3()}})}}),null),P(_,j(q,{variant:`ghost`,class:`h-7 px-2.5 text-[11.5px]`,get loading(){return ne()},title:`Scan this page — cumulative: keeps other pages' findings, replaces this page's`,onClick:he,get children(){return s3()}}),null),P(d,j(M,{get when(){return k().length>0},get fallback(){return A3()},get children(){return[(()=>{var e=c3(),t=e.firstChild,n=t.firstChild,r=t.nextSibling,i=r.firstChild;return t.$$click=()=>ce(!se()),P(t,be,n),r.$$click=()=>ue(!le()),P(r,xe,i),D(e=>{var n={"text-danger bg-danger/10 border-danger/40":se(),"text-text-faint":!se()},i=se(),a={"text-warn bg-warn/10 border-warn/40":le(),"text-text-faint":!le()},o=le();return e.e=lt(t,n,e.e),i!==e.t&&it(t,`aria-pressed`,e.t=i),e.a=lt(r,a,e.a),o!==e.o&&it(r,`aria-pressed`,e.o=o),e},{e:void 0,t:void 0,a:void 0,o:void 0}),e})(),(()=>{var e=r3();return P(e,j(We,{get each(){return ye()},children:e=>{let t=e[0],n=()=>ie()===t.ruleId;return(()=>{var r=M3(),i=r.firstChild,a=i.firstChild,o=a.nextSibling,s=o.nextSibling;s.firstChild;var c=s.nextSibling;return i.$$click=()=>oe(n()?null:t.ruleId),P(o,()=>t.ruleId),P(s,()=>e.reduce((e,t)=>e+(t.count??1),0),null),P(r,j(M,{get when(){return n()},get children(){var n=j3(),r=n.firstChild;return P(r,()=>t.description),P(n,j(We,{each:e,children:e=>(()=>{var t=F3(),n=t.firstChild,r=n.nextSibling;return t.$$click=()=>{V3(e)||l(e.page===location.pathname?`Element is gone — run Scan again.`:`This finding is on ${e.page} — navigate there to reveal it.`)},P(n,j(M,{get when(){return _e()>1},get children(){var t=N3(),n=t.firstChild;return P(t,()=>e.page,n),t}}),null),P(n,j(M,{get when(){return e.component},get children(){var t=N3(),n=t.firstChild;return P(t,()=>e.component,n),t}}),null),P(n,()=>e.selector,null),P(n,j(M,{get when(){return(e.count??1)>1},get children(){var t=P3();return t.firstChild,P(t,()=>e.count,null),t}}),null),P(t,j(M,{get when(){return e.source},get children(){var t=T3();return P(t,()=>e.source),t}}),r),P(r,()=>e.evidence),t})()}),null),n}}),null),D(e=>{var r=t.severity===`error`,i=t.severity===`warn`,o=!!n();return r!==e.e&&a.classList.toggle(`bg-danger`,e.e=r),i!==e.t&&a.classList.toggle(`bg-warn`,e.t=i),o!==e.a&&c.classList.toggle(`rotate-180`,e.a=o),e},{e:void 0,t:void 0,a:void 0}),r})()}})),e})(),(()=>{var e=a3();return P(e,j(q,{class:`size-7 px-0`,variant:`primary`,get title(){return pe()?`Copied!`:`Copy AI prompt — findings + contract fix rules, ready for a Claude Code session`},"aria-label":`Copy AI fix prompt`,onClick:()=>void Ce(),get children(){return j(M,{get when(){return pe()},get fallback(){return k3()},get children(){return i3()}})}}),null),P(e,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return de()?`Copied!`:`Copy report — findings grouped by rule, markdown`},"aria-label":`Copy slop report`,onClick:()=>void Se(),get children(){return j(M,{get when(){return de()},get fallback(){return S3()},get children(){return Q4()}})}}),null),P(e,j(q,{class:`text-danger ml-auto size-7 px-0`,variant:`ghost`,title:`Clear scan results`,"aria-label":`Clear scan results`,onClick:ge,get children(){return $4()}}),null),e})()]}}),null),t})()}rt([`click`]);function U3(e){return Math.round(e*10)/10}function W3(e,t,n){return e.rules[t]?.severity??n}var G3=/^(HotReload|Head|AppRouterAnnouncer|HistoryUpdater|AppRouter|Router|ServerRoot|SegmentViewNode|SegmentViewStateNode|SegmentStateProvider|InnerLayoutRouter|OuterLayoutRouter|TemplateContext|RenderFromTemplateContext|ScrollAndFocusHandler|RedirectBoundary|RedirectErrorBoundary|LoadingBoundary|ErrorBoundary|ErrorBoundaryHandler|HTTPAccessFallbackBoundary|HTTPAccessFallbackErrorBoundary|DevRootHTTPAccessFallbackBoundary|__next_root_layout_boundary__|Preloads|NonIndex|ReplaySsrOnlyErrors|AppDevOverlay\w*|DevOverlay\w*|PseudoHtml\w*)$/;function K3(e){return e?.length?e.map(e=>{try{let t=new RegExp(e);return e=>t.test(e)}catch{return t=>t===e}}):[]}function q3(e,t){if(e.length<=2||G3.test(e))return!0;for(let n of t)if(n(e))return!0;return!1}function J3(e){let t=new Map;for(let n of e)for(let e of n.entries){let n=t.get(e.name);n||(n={name:e.name,updates:[],selfTime:0,el:e.el??void 0},t.set(e.name,n)),n.selfTime+=e.selfTime,e.el&&!n.el&&(n.el=e.el),e.phase===`update`&&n.updates.push(e.changes)}return t}function Y3(e,t,n){let r=[],i=K3(n?.ignore),a=e.map(e=>({...e,entries:e.entries.filter(e=>!q3(e.name,i)),mounts:Object.fromEntries(Object.entries(e.mounts).filter(([e])=>!q3(e,i)))})),o=J3(a),s=t.budgets;return i6(r,()=>{let e=[];for(let n of o.values()){if(n.updates.length<5||!n.updates.every(e=>e.length===0))continue;let r=n.updates.length;e.push({ruleId:`R9`,shape:`B`,severity:W3(t,`R9`,`error`),suspected:!0,description:`suspected R9 — ${n.name} re-rendered ${r}× with zero prop changes (dead memo or subscription-in-body)`,component:n.name,source:null,renders:r,selfTime:U3(n.selfTime),changes:[],evidence:`${r} renders · ${U3(n.selfTime)}ms self · all props identity-equal`,el:n.el})}return e}),i6(r,()=>{let e=[];for(let n of o.values()){if(n.updates.length<5||!n.updates.every(e=>e.length>0&&e.every(e=>/\((?:fn|ref)\)$/.test(e))))continue;let r=Array.from(new Set(n.updates.flat())),i=n.updates.length,a=r.join(`, `);e.push({ruleId:`R5`,shape:`B`,severity:W3(t,`R5`,`error`),suspected:!0,description:`suspected R5 — ${i} renders of ${n.name} with fresh ${a} identity per parent render (memo defeated)`,component:n.name,source:null,renders:i,selfTime:U3(n.selfTime),changes:r,evidence:`${i} renders · ${U3(n.selfTime)}ms self · churning ${a}`,el:n.el})}return e}),i6(r,()=>{let e=[],n=/Tooltip|Menu|Popover|Context|Dialog|Dropdown/i;for(let r of a)for(let i of Object.keys(r.mounts)){let a=r.mounts[i];if(a<(n.test(i)?10:15))continue;let o=r.entries.find(e=>e.name===i&&e.el);e.push({ruleId:`R4`,shape:`A`,severity:W3(t,`R4`,`error`),suspected:!0,description:`suspected R4 — ${a} ${i} instances mounted in one commit (per-row overlays should mount on intent)`,component:i,source:null,renders:a,selfTime:0,changes:[],evidence:`${i} ×${a} mounted in one commit`,el:o?.el??void 0})}return e}),i6(r,()=>{let e=[];for(let t of a){if(t.duration<=s.commitMs)continue;let n=[...t.entries].sort((e,t)=>t.selfTime-e.selfTime).slice(0,3).map(e=>`${e.name} ${U3(e.selfTime)}ms`).join(`, `),r=U3(t.duration),i=t.duration>16?` · ~${Math.round(1e3/t.duration)} FPS`:``;e.push({ruleId:null,shape:null,severity:`error`,suspected:!1,description:`commit exceeded budget: ${r}ms of React work (> ${s.commitMs}ms) — top: ${n}`,component:null,source:null,renders:t.entries.length,selfTime:r,changes:[],evidence:`${r}ms commit · ${t.entries.length} components${i}`})}return e}),i6(r,()=>{let e=[],t=new Map;for(let e of a){let n=new Map,r=new Map;for(let t of e.entries)n.set(t.name,(n.get(t.name)??0)+t.selfTime),t.el&&!r.has(t.name)&&r.set(t.name,t.el);for(let[e,i]of n){if(i<=s.selfMs)continue;let n=t.get(e)??{hits:0,worst:0,total:0,el:r.get(e)};n.hits+=1,n.worst=Math.max(n.worst,i),n.total+=i,n.el||=r.get(e),t.set(e,n)}}for(let[n,r]of t)r.hits<3||e.push({ruleId:null,shape:null,severity:`warn`,suspected:!1,description:`${n} is a hot component: ${r.hits} commits over the ${s.selfMs}ms self budget`,component:n,source:null,renders:r.hits,selfTime:U3(r.total),changes:[],evidence:`${r.hits} commits over ${s.selfMs}ms self (worst ${U3(r.worst)}ms)`,el:r.el});return e}),i6(r,()=>{let n=[],r=n6(e.filter(e=>e.nearInput).map(e=>e.at).sort((e,t)=>e-t),1e3);return r>=5&&n.push({ruleId:`R10`,shape:`B`,severity:W3(t,`R10`,`error`),suspected:!0,description:`suspected R10 — ${r} React commits during scroll/pointer movement (frame-rate state updates)`,component:null,source:null,renders:r,selfTime:0,changes:[],evidence:`${r} commits within a 1s scroll/pointer window`}),n}),i6(r,()=>{let n=[],{count:r,span:i}=r6(e.filter(e=>!e.nearInput).map(e=>e.at).sort((e,t)=>e-t),300);return r>=8&&n.push({ruleId:`R24`,shape:`B`,severity:W3(t,`R24`,`warn`),suspected:!0,description:`suspected R24 — ${r} commits in ${Math.round(i)}ms burst (multi-row writes / un-coalesced pokes?)`,component:null,source:null,renders:r,selfTime:0,changes:[],evidence:`${r} commits in a ${Math.round(i)}ms burst (no input)`}),n}),i6(r,()=>{let e=[];if(!e6())return e;for(let n of o.values()){if(n.updates.length<3)continue;let r=n.el?.deref();if(!r)continue;let i=!1;try{let e=r.getBoundingClientRect();i=!r.isConnected||e.width===0&&e.height===0}catch{continue}if(!i)continue;let a=n.updates.length;e.push({ruleId:`R3`,shape:`C`,severity:W3(t,`R3`,`error`),suspected:!0,description:`suspected R3 — ${n.name} re-rendered ${a}× while its DOM is hidden/detached (closed host without everOpened gate?) [R3/R7/R23 family]`,component:n.name,source:null,renders:a,selfTime:U3(n.selfTime),changes:[],evidence:`${a} renders while hidden/detached · ${U3(n.selfTime)}ms self`,el:n.el})}return e}),a6(r)}var X3=`#linear-grab-root, #claude-agent-glow-border, [id^="react-scan"]`;function Z3(e=typeof document<`u`?document:{}){let t=[];return i6(t,()=>{let t=[],n=Array.from(e.querySelectorAll(`[role="slider"], [role="progressbar"], [role="switch"]`)),r=t6(e);for(let e of n){if(e.closest(X3))continue;if(r)try{let t=e.getBoundingClientRect();if(t.width<2||t.height<2)continue}catch{}if(!Q3(e))continue;let n=e.getAttribute(`role`)??`widget`;t.push({ruleId:`R8`,shape:`D`,severity:`warn`,suspected:!0,description:`suspected R8 — interactive ${n} widget used as a static picture (mount a CSS mock instead)`,component:null,source:null,renders:0,selfTime:0,changes:[],evidence:$3(e),el:typeof WeakRef<`u`?new WeakRef(e):void 0})}return t}),a6(t)}function Q3(e){if(e.hasAttribute(`disabled`)||e.getAttribute(`aria-disabled`)===`true`)return!0;let t=e;for(let e=0;t&&e<=3;e++){try{if(getComputedStyle(t).pointerEvents===`none`)return!0}catch{}t=t.parentElement}return!1}function $3(e){let t=typeof e.className==`string`&&e.className?`.`+e.className.split(/\s+/).filter(Boolean).slice(0,2).join(`.`):``;return`${e.tagName.toLowerCase()}${t}`}function e6(){return typeof document>`u`?!1:(document.documentElement?.getBoundingClientRect().width??0)>0}function t6(e){return((e.documentElement??(typeof document<`u`?document.documentElement:null))?.getBoundingClientRect().width??0)>0}function n6(e,t){let n=0,r=0;for(let i=0;i<e.length;i++){for(;e[i]-e[r]>t;)r++;n=Math.max(n,i-r+1)}return n}function r6(e,t){let n=0,r=0,i=0;for(let a=0;a<e.length;a++){for(;e[a]-e[i]>t;)i++;let o=a-i+1;o>n&&(n=o,r=e[a]-e[i])}return{count:n,span:r}}function i6(e,t){try{e.push(...t())}catch{}}function a6(e){let t=new Map;for(let n of e){let e=`${n.ruleId}|${n.component}|${n.changes.join()}|${n.description}`,r=t.get(e);r?r.count=(r.count??1)+1:t.set(e,n)}return[...t.values()]}function o6(e){let t=new Map;for(let n of e){let e=n.ruleId??`budget`,r=t.get(e);r?r.push(n):t.set(e,[n])}let n=Array.from(t.entries()).sort((e,t)=>{let n=e[1][0].severity===`error`?0:1,r=t[1][0].severity===`error`?0:1;return n===r?t[1].length===e[1].length?e[0].localeCompare(t[0]):t[1].length-e[1].length:n-r}),r=e.reduce((e,t)=>e+(t.count??1),0),i=e.filter(e=>e.severity===`error`).reduce((e,t)=>e+(t.count??1),0),a=[`# Render scan — ${i} error${i===1?``:`s`}, ${r-i} warn (${r} total)`,``,`Diagnoses are SUSPECTED (heuristic). The numbers (renders, self ms) are measured.`,``];for(let[e,t]of n){let n=t[0],r=t.reduce((e,t)=>e+(t.count??1),0);a.push(`## ${e} — ${n.severity} ×${r}`);for(let e of t){let t=e.component||e.source?` — ${[e.component,e.source].filter(Boolean).join(` @ `)}`:``,n=(e.count??1)>1?` ×${e.count}`:``;a.push(`- ${e.description}${n}${t}`),a.push(` ${e.evidence}`)}a.push(``)}return a.join(`
|
|
280
|
-
`)}function
|
|
281
|
-
`)}var
|
|
282
|
-
`),r=RegExp(`^\\s*\\*\\*${t.source}[^*]*:\\*\\*\\s*(.*)$`,`i`),i=/^\s*\*\*[^*]+:\*\*/,a=0;for(;a<n.length&&!r.test(n[a]);a++);if(a>=n.length)return``;let o=n[a].replace(r,`$1`),s=[];for(o.trim()&&s.push(o.trim()),a+=1;a<n.length;a++){let e=n[a];if(i.test(e)||/^###\s/.test(e)||/^##\s/.test(e)||/^---\s*$/.test(e))break;if(e.trim())s.push(e.trim());else if(s.length){let e=a+1;for(;e<n.length&&!n[e].trim();)e++;if(e>=n.length||i.test(n[e])||/^###\s|^##\s|^---\s*$/.test(n[e]))break}}return
|
|
283
|
-
`),i=0;for(;i<r.length;){let e=r[i];if(!
|
|
284
|
-
`);n[t]={id:t,slug:r,severity:i===`warn`?`warn`:`error`,ruleText:g8(o,/Rule/),fixText:g8(o,/Fix/),detectText:g8(o,/Detect/)}}}catch{}i=o}return{budgets:t,rules:n}}Br();var b8=[],x8=new Set;function S8(e){return x8.add(e),e(b8),()=>void x8.delete(e)}function C8(){b8=[];for(let e of x8)e(b8)}function w8(e,t){b8=[...e,...b8.filter(e=>e.page!==t)];for(let e of x8)e(b8);return X8(e).then(()=>{b8=[...b8];for(let e of x8)e(b8);Z8(e)}),e}var T8=new Set,E8=!1,D8=null;function O8(e){return T8.add(e),e(E8,D8),()=>void T8.delete(e)}function k8(){if(!(j8||E8)){u8(),E8=!0,D8=Date.now();for(let e of T8)e(!0,D8)}}async function A8(){if(!E8)return[];let e=d8();E8=!1,D8=null;for(let e of T8)e(!1,null);let t=await K8(),n=location.pathname;return w8(Y3(e,t,{ignore:await J8()}).map(e=>({...e,page:n})),n)}var j8=!1;try{j8=localStorage.getItem(`linear-grab:render-live`)===`1`}catch{}var M8=new Set;function N8(e){return M8.add(e),e(j8),()=>void M8.delete(e)}var P8=3e3,F8=4e3,I8=null,L8=[],R8=``;function z8(e){if(e!==j8&&!(e&&E8)){j8=e;try{localStorage.setItem(`linear-grab:render-live`,e?`1`:`0`)}catch{}for(let t of M8)t(e);e?(u8(),L8=[],R8=location.pathname,I8=setInterval(()=>void B8(!1),P8)):(I8&&clearInterval(I8),I8=null,B8(!0).finally(()=>{d8(),L8=[]}))}}async function B8(e){try{let t=location.pathname;if(t!==R8){let e=b8.filter(e=>e.page===R8);X8(e).then(()=>{b8=[...b8];for(let e of x8)e(b8);Z8(e)}),L8=[],R8=t}L8.push(...f8()),L8.length>F8&&L8.splice(0,L8.length-F8);let n=await K8(),r=Y3(L8,n,{ignore:await J8()}).map(e=>({...e,page:t}));b8=[...r,...b8.filter(e=>e.page!==t)];for(let e of x8)e(b8);if(e){await X8(r),b8=[...b8];for(let e of x8)e(b8);Z8(r)}}catch{}}function V8(){typeof window>`u`||!j8||I8||(u8(),L8=[],R8=location.pathname,I8=setInterval(()=>void B8(!1),P8))}function H8(){let e=location.pathname;return w8(Z3(document).map(t=>({...t,page:e})),e)}var U8=5*6e4,W8=null,G8=0;async function K8(){if(W8&&Date.now()-G8<U8)return W8;let e=p8;try{let t=await YO(),n=await(await fetch(`${t}/scan/rulebook`)).json();n.ok&&n.text&&(e=y8(n.text))}catch{}return e=await Y8(e),W8=e,G8=Date.now(),e}function q8(){return W8}async function J8(){try{let e=await Tr();return Array.isArray(e.renderIgnore)?e.renderIgnore:void 0}catch{return}}async function Y8(e){try{let t=(await Tr()).renderBudgets;if(t&&(t.selfMs!=null||t.commitMs!=null))return{...e,budgets:{selfMs:t.selfMs??e.budgets.selfMs,commitMs:t.commitMs??e.budgets.commitMs}}}catch{}return e}async function X8(e){let t=null;try{t=(await Promise.resolve().then(()=>(RZ(),AZ))).getGlobalApi()??null}catch{return}if(!t)return;let n=new Map;for(let t of e){let e=t.el?.deref();if(!e)continue;let r=n.get(e);r?r.push(t):n.set(e,[t])}let r=300;for(let[e,i]of n){if(r--<=0)break;let n=null,a=null;try{n=t.getDisplayName?.(e)??null}catch{}try{let n=await t.getSource?.(e);n?.filePath&&(a=`${n.filePath}${n.lineNumber==null?``:`:${n.lineNumber}`}`)}catch{}if(!(!n&&!a))for(let e of i)!e.component&&n&&(e.component=n),a&&(e.source=a)}}function Z8(e){if(e.length===0)return;let t=Date.now(),n=e.slice(0,200).map(({el:e,...n})=>({kind:`render-scan`,at:t,...n}));YO().then(e=>fetch(`${e}/scan/events`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({events:n}),keepalive:!0})).catch(()=>{})}var Q8=N(`<span class="text-text-faint font-normal tabular-nums"> · <!> pages`),$8=N(`<span class="bg-danger size-1.5 shrink-0 animate-pulse rounded-full"aria-hidden>`),e5=N(`<span class="text-danger inline-block min-w-[4ch] text-right text-[10.5px] font-medium tabular-nums">`),t5=N(`<svg width=13 height=13 viewBox="0 0 16 16"aria-hidden><rect x=3.5 y=3.5 width=9 height=9 rx=1.5 fill=currentColor>`),n5=N(`<svg width=13 height=13 viewBox="0 0 16 16"aria-hidden><rect x=4 y=3.5 width=3 height=9 rx=1 fill=currentColor></rect><rect x=9 y=3.5 width=3 height=9 rx=1 fill=currentColor>`),r5=N(`<span class="bg-success absolute -top-0.5 -right-0.5 size-1.5 animate-pulse rounded-full"aria-hidden>`),i5=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M5.5 3 6.5 1.5h3L10.5 3h2A1.5 1.5 0 0 1 14 4.5v7A1.5 1.5 0 0 1 12.5 13h-9A1.5 1.5 0 0 1 2 11.5v-7A1.5 1.5 0 0 1 3.5 3h2Z"></path><circle cx=8 cy=7.75 r=2.25>`),a5=N(`<span class="text-success text-[12px] leading-none">✓`),o5=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M4 4l8 8M12 4l-8 8">`),s5=N(`<p class="text-text-faint px-1 text-[10.5px] leading-snug">Recording commits… interact with the page.`),c5=N(`<p class="text-text-faint px-1 text-[10.5px] leading-snug">Live render scan — findings update as you interact and navigate.`),l5=N(`<div class="flex items-center gap-1 px-1"><button class="border-border cursor-pointer rounded-full border px-2 py-0.5 text-[10px] font-medium tabular-nums"> errors</button><button class="border-border cursor-pointer rounded-full border px-2 py-0.5 text-[10px] font-medium tabular-nums"> warns`),u5=N(`<div class="flex max-h-[28rem] flex-col gap-1.5 overflow-y-auto pr-3 pl-2">`),d5=N(`<div class="flex h-full flex-col gap-3 overflow-y-auto pt-3 pb-4 pr-3 pl-2"><div class="flex flex-col gap-1 px-1"><div class="flex items-center justify-between gap-2"><p class="text-text min-w-0 truncate text-[12.5px] font-semibold">Renders</p><div class="flex shrink-0 items-center gap-1"></div></div><p class="text-text-faint text-[10.5px] leading-snug">Commits graded against React-rerender-primitives.md — record then interact, go live, or snapshot the DOM. Accumulates per page.`),f5=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 aria-hidden><circle cx=8 cy=8 r=6></circle><circle cx=8 cy=8 r=2.25 fill=currentColor stroke=none>`),p5=N(`<svg width=13 height=13 viewBox="0 0 16 16"aria-hidden><path d="M5 3.3v9.4a.5.5 0 0 0 .77.42l7.1-4.7a.5.5 0 0 0 0-.84l-7.1-4.7A.5.5 0 0 0 5 3.3Z"fill=currentColor>`),m5=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M8 1.5 9.6 6l4.4 1.6L9.6 9.2 8 13.7 6.4 9.2 2 7.6 6.4 6Z"></path><path d="M13 11.5l.6 1.7 1.7.6-1.7.6-.6 1.7-.6-1.7-1.7-.6 1.7-.6Z">`),h5=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=9 height=9 rx=1.5></rect><path d="M10.5 5.5v-2a2 2 0 0 0-2-2h-5a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h2">`),g5=N(`<div class="border-border flex flex-col gap-1 border-t px-2 py-1.5">`),_5=N(`<div class="bg-surface border-border flex flex-col rounded-lg border"><button class="flex w-full cursor-pointer items-center gap-2 px-2 py-1.5 text-left"><span class="size-1.5 shrink-0 rounded-full"aria-hidden></span><span class="text-accent min-w-0 truncate font-mono text-[11.5px]"></span><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums">×</span><svg width=10 height=10 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 class="text-text-faint shrink-0 transition-transform"aria-hidden><path d="m4 6 4 4 4-4">`),v5=N(`<span class="text-accent font-mono"> `),y5=N(`<span class="text-text-faint tabular-nums"> ×`),b5=N(`<span class="flex flex-wrap gap-1">`),x5=N(`<span class="text-text-dim font-mono"> · `),S5=N(`<div class="flex flex-col gap-0.5 rounded px-1 py-0.5 text-left"><span class="text-text-dim text-[10.5px] leading-snug"></span><span class="text-text-faint text-[10px] leading-snug tabular-nums">`),C5=N(`<span class="bg-surface-2 text-text-dim rounded px-1 font-mono text-[9.5px] leading-relaxed">`);function w5(e){let t=e.el?.deref();if(!(t instanceof HTMLElement)||!t.isConnected)return!1;t.scrollIntoView({block:`center`,behavior:`smooth`});let n=t.style.outline,r=t.style.outlineOffset;return t.style.outline=`2px solid #e5a13a`,t.style.outlineOffset=`2px`,setTimeout(()=>{t.style.outline=n,t.style.outlineOffset=r},1400),!0}function T5(e){let t=Math.max(0,Math.floor(e/1e3));return`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`}function E5(e){return e.replace(/^prop:/,``)}function D5(){let[e,t]=T([]);ae(S8(t));let[n,r]=T(!1),[i,a]=T(null),[o,s]=T(Date.now()),c=null,l=()=>{c&&clearInterval(c),c=null};ae(l),ae(O8((e,t)=>{r(e),a(t),e?(s(Date.now()),c||=setInterval(()=>s(Date.now()),500)):l()}));let[u,d]=T(!1);ae(N8(d));let[f,p]=T(q8());K8().then(p);let[m,h]=T(null),[g,_]=T(null),[v,y]=T(!0),[b,x]=T(!0),[S,C]=T(!1),[w,E]=T(!1),[O,k]=T(!1),ee=async()=>{if(h(null),n())try{let e=await A8();p(q8()),_(null),e.length===0&&h(`No re-render anti-patterns caught — interact more (scroll, open menus, type) between record and stop.`)}catch(e){h(e instanceof Error?e.message:String(e))}else k8()},te=()=>{h(null),C(!0);try{H8(),_(null)}catch(e){h(e instanceof Error?e.message:String(e))}finally{C(!1)}},A=()=>{C8(),_(null)},ne=()=>new Set(e().map(e=>e.page)).size,re=()=>e().filter(e=>e.severity===`error`?v():b()),ie=()=>e().filter(e=>e.severity===`error`).reduce((e,t)=>e+(t.count??1),0),oe=()=>e().reduce((e,t)=>e+(t.count??1),0)-ie(),se=()=>{let e=new Map;for(let t of re()){let n=t.ruleId??`budget`,r=e.get(n);r?r.push(t):e.set(n,[t])}return[...e.entries()].sort((e,t)=>Number(t[1][0].severity===`error`)-Number(e[1][0].severity===`error`)||t[1].length-e[1].length)},ce=e=>{let t=e===`budget`?null:f()?.rules[e]?.slug??null;return t?`${e} · ${t}`:e},le=async()=>{try{await navigator.clipboard.writeText(o6(re())),E(!0),setTimeout(()=>E(!1),1600)}catch{h(`Clipboard was blocked — click Copy again.`)}},ue=async()=>{try{await navigator.clipboard.writeText(s6(re(),await K8())),k(!0),setTimeout(()=>k(!1),1600)}catch{h(`Clipboard was blocked — click Copy again.`)}};return(()=>{var t=d5(),r=t.firstChild.firstChild.firstChild;r.firstChild;var a=r.nextSibling;return P(r,j(M,{get when(){return ne()>1},get children(){var e=Q8(),t=e.firstChild.nextSibling;return t.nextSibling,P(e,ne,t),e}}),null),P(a,j(M,{get when(){return n()},get children(){return[$8(),(()=>{var e=e5();return P(e,()=>T5(o()-(i()??o()))),e})()]}}),null),P(a,j(q,{class:`size-7 px-0`,get variant(){return n()?`danger`:`ghost`},"data-tip-pos":`bottom left`,get disabled(){return u()},get title(){return $e(()=>!!u())()?`Live scan owns the recorder — pause it first`:n()?`Stop & analyze`:`Record renders`},get"aria-label"(){return n()?`Stop and analyze`:`Record renders`},onClick:()=>void ee(),get children(){return j(M,{get when(){return n()},get fallback(){return f5()},get children(){return t5()}})}}),null),P(a,j(q,{class:`relative size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,get disabled(){return n()},get title(){return u()?`Pause live render scan`:`Live render scan — findings update as you browse`},"aria-label":`Toggle live render scan`,onClick:()=>z8(!u()),get children(){return[j(M,{get when(){return u()},get fallback(){return p5()},get children(){return n5()}}),j(M,{get when(){return u()},get children(){return r5()}})]}}),null),P(a,j(q,{class:`size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,get loading(){return S()},title:`Snapshot scan (passive DOM pass)`,"aria-label":`Snapshot scan`,onClick:te,get children(){return i5()}}),null),P(a,j(q,{class:`size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,get title(){return O()?`Copied!`:`Copy AI fix prompt`},"aria-label":`Copy AI fix prompt`,onClick:()=>void ue(),get children(){return j(M,{get when(){return O()},get fallback(){return m5()},get children(){return a5()}})}}),null),P(a,j(q,{class:`size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,get title(){return w()?`Copied!`:`Copy report`},"aria-label":`Copy report`,onClick:()=>void le(),get children(){return j(M,{get when(){return w()},get fallback(){return h5()},get children(){return a5()}})}}),null),P(a,j(q,{class:`text-danger size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,title:`Clear findings`,"aria-label":`Clear findings`,onClick:A,get children(){return o5()}}),null),P(t,j(M,{get when(){return m()},get children(){return j(Hj,{get message(){return m()}})}}),null),P(t,j(M,{get when(){return n()},get children(){return s5()}}),null),P(t,j(M,{get when(){return $e(()=>!!u())()&&!n()},get children(){return c5()}}),null),P(t,j(M,{get when(){return e().length>0},get fallback(){return j(M,{get when(){return $e(()=>!n())()&&!u()},get children(){return j(Vj,{title:`No renders scanned yet`,children:`Press record, then interact — scroll, open menus, navigate, type — and stop to analyze. Or go live and watch findings stream in as you browse. Snapshot grades the current DOM without recording.`})}})},get children(){return[(()=>{var e=l5(),t=e.firstChild,n=t.firstChild,r=t.nextSibling,i=r.firstChild;return t.$$click=()=>y(!v()),P(t,ie,n),r.$$click=()=>x(!b()),P(r,oe,i),D(e=>{var n={"text-danger bg-danger/10 border-danger/40":v(),"text-text-faint":!v()},i=v(),a={"text-warn bg-warn/10 border-warn/40":b(),"text-text-faint":!b()},o=b();return e.e=lt(t,n,e.e),i!==e.t&&it(t,`aria-pressed`,e.t=i),e.a=lt(r,a,e.a),o!==e.o&&it(r,`aria-pressed`,e.o=o),e},{e:void 0,t:void 0,a:void 0,o:void 0}),e})(),(()=>{var e=u5();return P(e,j(We,{get each(){return se()},children:([e,t])=>{let n=t[0],r=()=>g()===e;return(()=>{var i=_5(),a=i.firstChild,o=a.firstChild,s=o.nextSibling,c=s.nextSibling;c.firstChild;var l=c.nextSibling;return a.$$click=()=>_(r()?null:e),P(s,()=>ce(e)),P(c,()=>t.reduce((e,t)=>e+(t.count??1),0),null),P(i,j(M,{get when(){return r()},get children(){var e=g5();return P(e,j(We,{each:t,children:e=>{let t=()=>e.el?.deref()!=null;return(()=>{var n=S5(),r=n.firstChild,i=r.nextSibling;return n.$$click=()=>{t()&&(w5(e)||h(e.page===location.pathname?`Element is gone — record or snapshot again.`:`This finding is on ${e.page} — navigate there to reveal it.`))},P(r,j(M,{get when(){return ne()>1},get children(){var t=v5(),n=t.firstChild;return P(t,()=>e.page,n),t}}),null),P(r,()=>e.description,null),P(r,j(M,{get when(){return(e.count??1)>1},get children(){var t=y5();return t.firstChild,P(t,()=>e.count,null),t}}),null),P(n,j(M,{get when(){return e.changes.length>0},get children(){var t=b5();return P(t,j(We,{get each(){return e.changes},children:e=>(()=>{var t=C5();return P(t,()=>E5(e)),t})()})),t}}),i),P(i,()=>e.evidence,null),P(i,j(M,{get when(){return e.component||e.source},get children(){var t=x5();return t.firstChild,P(t,()=>[e.component,e.source].filter(Boolean).join(` @ `),null),t}}),null),D(e=>{var r={"hover:bg-surface-2 cursor-pointer":t()},i=t()?`Reveal on the page`:void 0;return e.e=lt(n,r,e.e),i!==e.t&&it(n,`title`,e.t=i),e},{e:void 0,t:void 0}),n})()}})),e}}),null),D(e=>{var t=n.severity===`error`,i=n.severity===`warn`,a=!!r();return t!==e.e&&o.classList.toggle(`bg-danger`,e.e=t),i!==e.t&&o.classList.toggle(`bg-warn`,e.t=i),a!==e.a&&l.classList.toggle(`rotate-180`,e.a=a),e},{e:void 0,t:void 0,a:void 0}),i})()}})),e})()]}}),null),t})()}rt([`click`]);var O5=[`defaultTeamId`,`defaultProjectId`,`defaultLabelIds`,`defaultRepo`,`workflowMode`,`cursorModel`,`stagingBranch`,`githubAssetsRepo`,`skillPaths`,`logUrl`,`logLines`,`issueTemplate`,`testUsername`,`renderBudgets`,`renderIgnore`];function k5(e){let t={};for(let n of O5){let r=e[n];r!==void 0&&r!==``&&!(Array.isArray(r)&&r.length===0)&&(t[n]=r)}return t}function A5(e,t){let n={};for(let r of O5)e[r]===void 0&&t[r]!==void 0&&(n[r]=t[r]);return Object.keys(n).length?n:null}Br();function j5(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}async function M5(e){let t=j5(crypto.getRandomValues(new Uint8Array(32))),n=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(t)),r=j5(new Uint8Array(n)),i=j5(crypto.getRandomValues(new Uint8Array(16))),a=chrome.identity.getRedirectURL(),o=new URL(`https://linear.app/oauth/authorize`);o.searchParams.set(`client_id`,e),o.searchParams.set(`redirect_uri`,a),o.searchParams.set(`response_type`,`code`),o.searchParams.set(`scope`,`read,write`),o.searchParams.set(`state`,i),o.searchParams.set(`code_challenge`,r),o.searchParams.set(`code_challenge_method`,`S256`);let s=await chrome.identity.launchWebAuthFlow({url:o.toString(),interactive:!0});if(!s)throw Error(`OAuth flow was cancelled`);let c=new URL(s).searchParams;if(c.get(`state`)!==i)throw Error(`OAuth state mismatch`);let l=c.get(`code`);if(!l)throw Error(c.get(`error_description`)??`No authorization code returned`);let u=await fetch(`https://api.linear.app/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({grant_type:`authorization_code`,code:l,redirect_uri:a,client_id:e,code_verifier:t})}),d=await u.json().catch(()=>null);if(!u.ok||!d?.access_token)throw Error(`Token exchange failed — check the OAuth app callback URL and client id`);await Er({linearAccessToken:d.access_token,linearOauthClientId:e})}async function N5(){await Er({linearAccessToken:void 0,linearApiKey:void 0})}Br(),Sr(),Ix(),_D();var P5=N(`<div class="bg-surface-2 border-border flex rounded-md border p-0.5">`),F5=N(`<span class="text-text-faint text-[10.5px] leading-snug">Cloud: picking an element opens the panel to draft & delegate to the Cursor agent. Local (react-grab style): picking auto-copies the element's context — source, stack, and your skills/memory paths — straight to the clipboard for a local Claude Code or Cursor session; the panel stays out of the way. Both share the same picker; switch anytime.`),I5=N(`<label class="flex cursor-pointer items-center gap-2 select-none"><input type=checkbox class="accent-accent rounded"><span class="text-text text-[12px]">Element screenshots`),L5=N(`<span class="text-text-faint text-[10.5px] leading-snug">Captures a highlighted screenshot of each picked element and attaches it to the issue. Costs a beat on huge pages — with this off, picking is instant (pure react-grab speed).`),R5=N(`<span class=text-text>Connected as <span class=font-medium></span> · <span class=text-text-dim>`),z5=N(`<div class="bg-surface border-border flex items-center justify-between rounded-lg border p-2.5"><span class="text-text text-[12px]">`),B5=N(`<option value>Select a team…`),V5=N(`<option value>No project`),H5=N(`<div class="flex flex-wrap gap-1">`),U5=N(`<label class="flex items-start gap-2"><input type=checkbox class="accent-accent mt-0.5"><span class="flex flex-col gap-0.5"><span class=text-[12px]>Let agents close out Linear themselves</span><span class="text-text-faint text-[10.5px] leading-snug">Embeds your Linear API key + raw GraphQL closeout recipes in every issue's Agent instructions — cloud agent VMs have no authenticated Linear MCP, so without this they can't comment, attach media, or move the issue. The key is visible to anyone who can read the issue.`),W5=N(`<p class="text-text-dim text-[11px]">No agents found — install the Cursor integration in Linear first.`),G5=N(`<span class="text-text-faint text-[10.5px] leading-snug">Empty = the default above (computer-use testing, video demo, PR + review babysitting).`),K5=N(`<div class="flex flex-col gap-1.5">`),q5=N(`<div class="flex flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">Mode</span><div class="bg-surface-2 border-border flex rounded-md border p-0.5"></div><span class="text-text-faint text-[10.5px] leading-snug">Beside page squeezes the app next to the panel, DevTools-style — nothing gets covered. Also toggleable from the dock icon in the panel header.`),J5=N(`<div class="flex flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">Dock side</span><div class="bg-surface-2 border-border flex rounded-md border p-0.5"></div><span class="text-text-faint text-[10.5px] leading-snug">The launcher pill is draggable — park it anywhere it doesn't cover your app.`),Y5=N(`<p class="text-text-faint text-[10.5px] leading-snug">A committed <code>.lineargrab.json</code> at the repo root (where the bridge runs) shares team/project/labels, skills, staging branch, and workflow defaults with every machine and teammate — it seeds any setting you haven't set locally. Secrets never belong in it.`),X5=N(`<span class="inline-block min-w-[10ch] text-center">`),Z5=N(`<div class="flex items-center gap-2">`),Q5=N(`<option value>Select a channel…`),$5=N(`<label class="flex cursor-pointer items-center gap-2 select-none"><input type=checkbox class="accent-accent rounded"><span class="text-text text-[12px]">Announce new issues on create`),e7=N(`<span class="text-text-faint text-[10.5px] leading-snug">⚠️ Tokens are embedded in issue Agent-instructions so agents can post the finished demo — everyone who can read the issue can read them. Use single-channel-scoped bots.`),t7=N(`<div class="flex flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">Provider preference</span><div class="bg-surface-2 border-border flex rounded-md border p-0.5"><button>Auto</button><button>OpenAI</button><button>Anthropic`),n7=N(`<p class="text-text-dim text-[11px]">`),r7=N(`<div class=min-h-[2lh]>`),i7=N(`<ol class="text-text-faint flex list-decimal flex-col gap-1 pl-4 text-[11px] leading-relaxed"><li>Pick an element on your running dev app.</li><li>Draft the issue (AI optional).</li><li>Create + delegate — Cursor's cloud agent fixes it and opens a PR.</li><li>Track and steer it from Activity.`),a7=N(`<div class="flex h-full flex-col gap-5 overflow-y-auto pt-3 pb-6 pl-3 pr-4">`),o7=N(`<button>`),s7=N(`<div class="flex gap-1.5">`),c7=N(`<p class="text-text-faint text-center text-[10.5px]">or`),l7=N(`<span class="text-text-faint text-[10.5px] leading-snug">Register this callback URL in your Linear OAuth app config:<br><span class="font-mono text-[10.5px] break-all">`),u7=N(`<div class="flex flex-col gap-3">`),d7=N(`<span class=text-text-dim>Connected — verifying…`),f7=N(`<option> (<!>)`),p7=N(`<option>`),m7=N(`<button type=button><span class="mr-1 inline-block size-2 rounded-full align-middle">`),h7=N(`<option value>Select the agent…`),g7=N(`<option>#`),_7=N(`<p class="text-text-dim text-[11px]">No key set — AI drafting disabled, manual drafting still works.`);function v7(){let e=sr(),t=_r(()=>({queryKey:[`settings`],queryFn:Tr,staleTime:0})),n=k(()=>t.data??{});async function r(t,n=!1){await Er(t),await e.invalidateQueries({queryKey:[`settings`]}),n&&(await e.invalidateQueries({queryKey:[`viewer`]}),await e.invalidateQueries({queryKey:[`teams`]}),await e.invalidateQueries({queryKey:[`agents`]}),await e.invalidateQueries({queryKey:[`my-issues`]}))}let i=k(()=>!!(n().linearApiKey||n().linearAccessToken)),a=_r(()=>({queryKey:[`viewer`],queryFn:uO,enabled:i(),retry:0})),o=_r(()=>({queryKey:[`teams`],queryFn:dO,enabled:i()})),s=_r(()=>({queryKey:[`linear-projects`],queryFn:xO,enabled:i()})),c=_r(()=>({queryKey:[`bridge-health`],queryFn:NO,retry:0})),[l,u]=T(!1),d=async()=>{try{await navigator.clipboard.writeText(JSON.stringify(k5(n()),null,2)+`
|
|
285
|
-
`),u(!0),setTimeout(()=>u(!1),1800)}catch{}},f=()=>{let e=c.data?.projectConfig;if(!e)return;let t={};for(let n of
|
|
279
|
+
`);await navigator.clipboard.writeText(t),Ae(!0),setTimeout(()=>Ae(!1),1600)}catch{l(`Clipboard was blocked — click Copy again.`)}},Me=()=>{U3.clear(),we([]),r(null)};return(()=>{var t=f3(),a=t.firstChild;a.firstChild;var o=a.nextSibling,s=o.firstChild.firstChild.nextSibling,d=o.nextSibling,p=d.firstChild.firstChild,h=p.firstChild;h.firstChild;var _=p.nextSibling;return P(a,j(q,{variant:`primary`,class:`h-7 shrink-0 px-2.5 text-[11.5px]`,get loading(){return i()===`extract`},onClick:()=>void Te(),get children(){return $4()}}),null),P(t,j(M,{get when(){return c()},get children(){return j(Hj,{get message(){return c()}})}}),o),P(t,j(M,{get when(){return e().length>0},get fallback(){return j(Vj,{title:`No genomes yet`,children:`Click Extract and pick any component on the page — a dropdown, a card, a sidebar row. Then "Capture states" while you hover/open it to record the styles that only exist during interaction.`})},get children(){return[(()=>{var t=e3();return t.firstChild,P(t,j(We,{get each(){return e()},children:e=>{let t=()=>n()===e.id;return(()=>{var n=_3(),a=n.firstChild,o=a.nextSibling,s=o.firstChild,c=s.firstChild,l=c.nextSibling,d=l.firstChild,p=d.nextSibling;p.nextSibling;var m=l.nextSibling;return s.$$click=()=>r(t()?null:e.id),P(c,()=>e.genome.title),P(l,()=>e.genome.nodes.length,d),P(l,(()=>{var t=$e(()=>!!e.genome.states.length);return()=>t()?` · ${e.genome.states.length} states`:``})(),p),P(l,()=>Wj(e.genome.extractedAt),null),P(o,j(M,{get when(){return t()},get children(){var t=g3(),n=t.firstChild,r=n.nextSibling,a=r.nextSibling;return P(n,()=>e.genome.pageUrl),P(r,j(We,{get each(){return e.genome.nodes},children:e=>(()=>{var t=y3(),n=t.firstChild;return P(n,()=>e.label,null),P(n,j(M,{get when(){return e.count>1},get children(){var t=v3();return t.firstChild,P(t,()=>e.count,null),t}}),null),P(t,j(We,{get each(){return Object.entries(e.styles)},children:([t,n])=>(()=>{var r=x3(),i=r.firstChild;return P(r,t,i),P(r,n,null),P(r,j(M,{get when(){return e.tokens[t]},get children(){var n=b3(),r=n.firstChild.nextSibling;return r.nextSibling,P(n,()=>e.tokens[t],r),n}}),null),r})()}),null),t})()}),null),P(r,j(M,{get when(){return e.genome.states.length>0},get children(){return[p3(),j(We,{get each(){return e.genome.states},children:e=>(()=>{var t=S3(),n=t.firstChild,r=n.firstChild;return P(n,()=>e.label,r),P(n,()=>e.trigger,null),P(t,j(We,{get each(){return Object.entries(e.changed)},children:([e,t])=>(()=>{var n=C3(),r=n.firstChild,i=r.nextSibling;return i.nextSibling,P(n,e,r),P(n,()=>t.from,i),P(n,()=>t.to,null),n})()}),null),t})()})]}}),null),P(a,j(M,{get when(){return $e(()=>i()===e.id)()&&f().active},get fallback(){return j(q,{class:`size-7 px-0`,variant:`ghost`,get loading(){return i()===e.id},title:`Capture states — records hover/focus/open styles for 8s while you interact; the pill shows the timer and Stop`,"aria-label":`Capture interaction states`,onClick:()=>void Ee(e),get children(){return w3()}})},get children(){return[j(q,{class:`text-danger size-7 px-0`,variant:`ghost`,get title(){return`Stop recording — ${Math.ceil(f().msLeft/1e3)}s left · ${f().total} captured`},"aria-label":`Stop recording states`,onClick:()=>o2(),get children(){return m3()}}),(()=>{var e=h3(),t=e.firstChild,n=t.nextSibling;return n.nextSibling,P(e,()=>Math.ceil(f().msLeft/1e3),t),P(e,()=>f().total,n),e})()]}}),null),P(a,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return u()===e.id?`Copied!`:`Copy spec — markdown for an agent or issue`},"aria-label":`Copy genome spec`,onClick:()=>void De(e),get children(){return j(M,{get when(){return u()===e.id},get fallback(){return T3()},get children(){return t3()}})}}),null),P(a,j(q,{class:`text-danger ml-auto size-7 px-0`,variant:`ghost`,title:`Delete this genome`,"aria-label":`Delete genome`,onClick:()=>Oe(e.id),get children(){return n3()}}),null),t}}),null),D(e=>{var n={"bg-accent border-accent":t()},r=!!t();return e.e=lt(a,n,e.e),r!==e.t&&m.classList.toggle(`rotate-180`,e.t=r),e},{e:void 0,t:void 0}),n})()}}),null),t})(),(()=>{var e=r3();return P(e,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return ke()?`Copied!`:`Copy all genomes as one markdown document`},"aria-label":`Copy all genomes`,onClick:()=>void je(),get children(){return j(M,{get when(){return ke()},get fallback(){return T3()},get children(){return t3()}})}}),null),P(e,j(q,{class:`text-danger size-7 px-0`,variant:`ghost`,title:`Delete all saved genomes`,"aria-label":`Delete all genomes`,onClick:Me,get children(){return n3()}}),null),e})()]}}),o),P(s,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return g()?`Live capture ON — recording transitions fired by your input. Click to pause.`:`Live capture PAUSED — click to resume recording input-triggered transitions.`},get"aria-label"(){return g()?`Pause live capture`:`Start live capture`},onClick:()=>I2(!g()),get children(){return j(M,{get when(){return g()},get fallback(){return E3()},get children(){return i3()}})}}),null),P(s,j(q,{variant:`ghost`,class:`h-7 px-2.5 text-[11.5px]`,get loading(){return v()},onClick:()=>void S(),get children(){return a3()}}),null),P(o,j(M,{get when(){return m().length>0},get fallback(){return D3()},get children(){return[(()=>{var e=o3();return P(e,j(We,{get each(){return m()},children:e=>(()=>{var t=j3(),n=t.firstChild,r=n.firstChild,i=r.nextSibling,a=i.nextSibling,o=a.firstChild,s=n.nextSibling,c=s.nextSibling;return P(r,()=>e.mode===`live`?`live`:`audit`),P(i,()=>e.component??e.element,null),P(i,j(M,{get when(){return e.count>1},get children(){return[` ×`,$e(()=>e.count)]}}),null),P(a,()=>e.durationMs,o),P(a,(()=>{var t=$e(()=>!!e.delayMs);return()=>t()?` +${e.delayMs}`:``})(),null),P(t,j(M,{get when(){return e.source},get children(){var t=O3();return P(t,()=>e.source),t}}),s),P(s,()=>e.properties.join(`, `),null),P(s,j(M,{get when(){return e.sinceInputMs!=null},get children(){return[` — fired `,$e(()=>e.sinceInputMs),`ms after input`]}}),null),P(t,j(M,{get when(){return e.jankProps?.length},get children(){var t=k3();return t.firstChild,P(t,()=>e.jankProps.join(`, `),null),t}}),c),P(t,j(M,{get when(){return e.easing},get children(){var t=A3();return t.firstChild,P(t,()=>e.easing,null),t}}),c),P(c,()=>e.suggestion),t})()})),e})(),(()=>{var e=c3();return P(e,j(q,{class:`size-7 px-0`,variant:`primary`,get title(){return w()?`Copied!`:`Copy AI prompt — report + fix rules, ready to paste into a Claude Code session`},"aria-label":`Copy AI fix prompt`,onClick:()=>void O(),get children(){return j(M,{get when(){return w()},get fallback(){return M3()},get children(){return s3()}})}}),null),P(e,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return b()?`Copied!`:`Copy report — plain markdown findings`},"aria-label":`Copy report`,onClick:()=>void C(),get children(){return j(M,{get when(){return b()},get fallback(){return T3()},get children(){return t3()}})}}),null),P(e,j(q,{class:`text-danger ml-auto size-7 px-0`,variant:`ghost`,title:`Clear all findings (live + audit)`,"aria-label":`Clear all findings`,onClick:M2,get children(){return n3()}}),null),e})()]}}),null),P(h,j(M,{get when(){return _e()>1},get children(){var e=l3(),t=e.firstChild.nextSibling;return t.nextSibling,P(e,_e,t),e}}),null),P(_,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return te()?`Live scan ON — re-scans automatically ~1s after each route change. Click to pause.`:`Live scan PAUSED — click to auto-scan every page you navigate to.`},get"aria-label"(){return te()?`Pause live scan`:`Start live scan`},onClick:()=>q4(!te()),get children(){return j(M,{get when(){return te()},get fallback(){return E3()},get children(){return i3()}})}}),null),P(_,j(q,{variant:`ghost`,class:`h-7 px-2.5 text-[11.5px]`,get loading(){return ne()},title:`Scan this page — cumulative: keeps other pages' findings, replaces this page's`,onClick:he,get children(){return u3()}}),null),P(d,j(M,{get when(){return k().length>0},get fallback(){return N3()},get children(){return[(()=>{var e=d3(),t=e.firstChild,n=t.firstChild,r=t.nextSibling,i=r.firstChild;return t.$$click=()=>ce(!se()),P(t,be,n),r.$$click=()=>ue(!le()),P(r,xe,i),D(e=>{var n={"text-danger bg-danger/10 border-danger/40":se(),"text-text-faint":!se()},i=se(),a={"text-warn bg-warn/10 border-warn/40":le(),"text-text-faint":!le()},o=le();return e.e=lt(t,n,e.e),i!==e.t&&it(t,`aria-pressed`,e.t=i),e.a=lt(r,a,e.a),o!==e.o&&it(r,`aria-pressed`,e.o=o),e},{e:void 0,t:void 0,a:void 0,o:void 0}),e})(),(()=>{var e=o3();return P(e,j(We,{get each(){return ye()},children:e=>{let t=e[0],n=()=>ie()===t.ruleId;return(()=>{var r=F3(),i=r.firstChild,a=i.firstChild,o=a.nextSibling,s=o.nextSibling;s.firstChild;var c=s.nextSibling;return i.$$click=()=>oe(n()?null:t.ruleId),P(o,()=>t.ruleId),P(s,()=>e.reduce((e,t)=>e+(t.count??1),0),null),P(r,j(M,{get when(){return n()},get children(){var n=P3(),r=n.firstChild;return P(r,()=>t.description),P(n,j(We,{each:e,children:e=>(()=>{var t=R3(),n=t.firstChild,r=n.nextSibling;return t.$$click=()=>{W3(e)||l(e.page===location.pathname?`Element is gone — run Scan again.`:`This finding is on ${e.page} — navigate there to reveal it.`)},P(n,j(M,{get when(){return _e()>1},get children(){var t=I3(),n=t.firstChild;return P(t,()=>e.page,n),t}}),null),P(n,j(M,{get when(){return e.component},get children(){var t=I3(),n=t.firstChild;return P(t,()=>e.component,n),t}}),null),P(n,()=>e.selector,null),P(n,j(M,{get when(){return(e.count??1)>1},get children(){var t=L3();return t.firstChild,P(t,()=>e.count,null),t}}),null),P(t,j(M,{get when(){return e.source},get children(){var t=O3();return P(t,()=>e.source),t}}),r),P(r,()=>e.evidence),t})()}),null),n}}),null),D(e=>{var r=t.severity===`error`,i=t.severity===`warn`,o=!!n();return r!==e.e&&a.classList.toggle(`bg-danger`,e.e=r),i!==e.t&&a.classList.toggle(`bg-warn`,e.t=i),o!==e.a&&c.classList.toggle(`rotate-180`,e.a=o),e},{e:void 0,t:void 0,a:void 0}),r})()}})),e})(),(()=>{var e=c3();return P(e,j(q,{class:`size-7 px-0`,variant:`primary`,get title(){return pe()?`Copied!`:`Copy AI prompt — findings + contract fix rules, ready for a Claude Code session`},"aria-label":`Copy AI fix prompt`,onClick:()=>void Ce(),get children(){return j(M,{get when(){return pe()},get fallback(){return M3()},get children(){return s3()}})}}),null),P(e,j(q,{class:`size-7 px-0`,variant:`ghost`,get title(){return de()?`Copied!`:`Copy report — findings grouped by rule, markdown`},"aria-label":`Copy slop report`,onClick:()=>void Se(),get children(){return j(M,{get when(){return de()},get fallback(){return T3()},get children(){return t3()}})}}),null),P(e,j(q,{class:`text-danger ml-auto size-7 px-0`,variant:`ghost`,title:`Clear scan results`,"aria-label":`Clear scan results`,onClick:ge,get children(){return n3()}}),null),e})()]}}),null),t})()}rt([`click`]);function K3(e){return Math.round(e*10)/10}function q3(e,t,n){return e.rules[t]?.severity??n}var J3=/^(HotReload|Head|AppRouterAnnouncer|HistoryUpdater|AppRouter|Router|ServerRoot|SegmentViewNode|SegmentViewStateNode|SegmentStateProvider|InnerLayoutRouter|OuterLayoutRouter|TemplateContext|RenderFromTemplateContext|ScrollAndFocusHandler|RedirectBoundary|RedirectErrorBoundary|LoadingBoundary|ErrorBoundary|ErrorBoundaryHandler|HTTPAccessFallbackBoundary|HTTPAccessFallbackErrorBoundary|DevRootHTTPAccessFallbackBoundary|__next_root_layout_boundary__|Preloads|NonIndex|ReplaySsrOnlyErrors|AppDevOverlay\w*|DevOverlay\w*|PseudoHtml\w*)$/;function Y3(e){return e?.length?e.map(e=>{try{let t=new RegExp(e);return e=>t.test(e)}catch{return t=>t===e}}):[]}function X3(e,t){if(e.length<=2||J3.test(e))return!0;for(let n of t)if(n(e))return!0;return!1}function Z3(e){let t=new Map;for(let n of e)for(let e of n.entries){let n=t.get(e.name);n||(n={name:e.name,updates:[],selfTime:0,el:e.el??void 0},t.set(e.name,n)),n.selfTime+=e.selfTime,e.el&&!n.el&&(n.el=e.el),e.phase===`update`&&n.updates.push(e.changes)}return t}function Q3(e,t,n){let r=[],i=Y3(n?.ignore),a=e.map(e=>({...e,entries:e.entries.filter(e=>!X3(e.name,i)),mounts:Object.fromEntries(Object.entries(e.mounts).filter(([e])=>!X3(e,i)))})),o=Z3(a),s=t.budgets;return s6(r,()=>{let e=[];for(let n of o.values()){if(n.updates.length<5||!n.updates.every(e=>e.length===0))continue;let r=n.updates.length;e.push({ruleId:`R9`,shape:`B`,severity:q3(t,`R9`,`error`),suspected:!0,description:`suspected R9 — ${n.name} re-rendered ${r}× with zero prop changes (dead memo or subscription-in-body)`,component:n.name,source:null,renders:r,selfTime:K3(n.selfTime),changes:[],evidence:`${r} renders · ${K3(n.selfTime)}ms self · all props identity-equal`,el:n.el})}return e}),s6(r,()=>{let e=[];for(let n of o.values()){if(n.updates.length<5||!n.updates.every(e=>e.length>0&&e.every(e=>/\((?:fn|ref)\)$/.test(e))))continue;let r=Array.from(new Set(n.updates.flat())),i=n.updates.length,a=r.join(`, `);e.push({ruleId:`R5`,shape:`B`,severity:q3(t,`R5`,`error`),suspected:!0,description:`suspected R5 — ${i} renders of ${n.name} with fresh ${a} identity per parent render (memo defeated)`,component:n.name,source:null,renders:i,selfTime:K3(n.selfTime),changes:r,evidence:`${i} renders · ${K3(n.selfTime)}ms self · churning ${a}`,el:n.el})}return e}),s6(r,()=>{let e=[],n=/Tooltip|Menu|Popover|Context|Dialog|Dropdown/i;for(let r of a)for(let i of Object.keys(r.mounts)){let a=r.mounts[i];if(a<(n.test(i)?10:15))continue;let o=r.entries.find(e=>e.name===i&&e.el);e.push({ruleId:`R4`,shape:`A`,severity:q3(t,`R4`,`error`),suspected:!0,description:`suspected R4 — ${a} ${i} instances mounted in one commit (per-row overlays should mount on intent)`,component:i,source:null,renders:a,selfTime:0,changes:[],evidence:`${i} ×${a} mounted in one commit`,el:o?.el??void 0})}return e}),s6(r,()=>{let e=[];for(let t of a){if(t.duration<=s.commitMs)continue;let n=[...t.entries].sort((e,t)=>t.selfTime-e.selfTime).slice(0,3).map(e=>`${e.name} ${K3(e.selfTime)}ms`).join(`, `),r=K3(t.duration),i=t.duration>16?` · ~${Math.round(1e3/t.duration)} FPS`:``;e.push({ruleId:null,shape:null,severity:`error`,suspected:!1,description:`commit exceeded budget: ${r}ms of React work (> ${s.commitMs}ms) — top: ${n}`,component:null,source:null,renders:t.entries.length,selfTime:r,changes:[],evidence:`${r}ms commit · ${t.entries.length} components${i}`})}return e}),s6(r,()=>{let e=[],t=new Map;for(let e of a){let n=new Map,r=new Map;for(let t of e.entries)n.set(t.name,(n.get(t.name)??0)+t.selfTime),t.el&&!r.has(t.name)&&r.set(t.name,t.el);for(let[e,i]of n){if(i<=s.selfMs)continue;let n=t.get(e)??{hits:0,worst:0,total:0,el:r.get(e)};n.hits+=1,n.worst=Math.max(n.worst,i),n.total+=i,n.el||=r.get(e),t.set(e,n)}}for(let[n,r]of t)r.hits<3||e.push({ruleId:null,shape:null,severity:`warn`,suspected:!1,description:`${n} is a hot component: ${r.hits} commits over the ${s.selfMs}ms self budget`,component:n,source:null,renders:r.hits,selfTime:K3(r.total),changes:[],evidence:`${r.hits} commits over ${s.selfMs}ms self (worst ${K3(r.worst)}ms)`,el:r.el});return e}),s6(r,()=>{let n=[],r=a6(e.filter(e=>e.nearInput).map(e=>e.at).sort((e,t)=>e-t),1e3);return r>=5&&n.push({ruleId:`R10`,shape:`B`,severity:q3(t,`R10`,`error`),suspected:!0,description:`suspected R10 — ${r} React commits during scroll/pointer movement (frame-rate state updates)`,component:null,source:null,renders:r,selfTime:0,changes:[],evidence:`${r} commits within a 1s scroll/pointer window`}),n}),s6(r,()=>{let n=[],{count:r,span:i}=o6(e.filter(e=>!e.nearInput).map(e=>e.at).sort((e,t)=>e-t),300);return r>=8&&n.push({ruleId:`R24`,shape:`B`,severity:q3(t,`R24`,`warn`),suspected:!0,description:`suspected R24 — ${r} commits in ${Math.round(i)}ms burst (multi-row writes / un-coalesced pokes?)`,component:null,source:null,renders:r,selfTime:0,changes:[],evidence:`${r} commits in a ${Math.round(i)}ms burst (no input)`}),n}),s6(r,()=>{let e=[];if(!r6())return e;for(let n of o.values()){if(n.updates.length<3)continue;let r=n.el?.deref();if(!r)continue;let i=!1;try{let e=r.getBoundingClientRect();i=!r.isConnected||e.width===0&&e.height===0}catch{continue}if(!i)continue;let a=n.updates.length;e.push({ruleId:`R3`,shape:`C`,severity:q3(t,`R3`,`error`),suspected:!0,description:`suspected R3 — ${n.name} re-rendered ${a}× while its DOM is hidden/detached (closed host without everOpened gate?) [R3/R7/R23 family]`,component:n.name,source:null,renders:a,selfTime:K3(n.selfTime),changes:[],evidence:`${a} renders while hidden/detached · ${K3(n.selfTime)}ms self`,el:n.el})}return e}),c6(r)}var $3=`#linear-grab-root, [data-linear-grab], [data-react-grab], #claude-agent-glow-border, [id^="react-scan"]`;function e6(e=typeof document<`u`?document:{}){let t=[];return s6(t,()=>{let t=[],n=Array.from(e.querySelectorAll(`[role="slider"], [role="progressbar"], [role="switch"]`)),r=i6(e);for(let e of n){if(e.closest($3))continue;if(r)try{let t=e.getBoundingClientRect();if(t.width<2||t.height<2)continue}catch{}if(!t6(e))continue;let n=e.getAttribute(`role`)??`widget`;t.push({ruleId:`R8`,shape:`D`,severity:`warn`,suspected:!0,description:`suspected R8 — interactive ${n} widget used as a static picture (mount a CSS mock instead)`,component:null,source:null,renders:0,selfTime:0,changes:[],evidence:n6(e),el:typeof WeakRef<`u`?new WeakRef(e):void 0})}return t}),c6(t)}function t6(e){if(e.hasAttribute(`disabled`)||e.getAttribute(`aria-disabled`)===`true`)return!0;let t=e;for(let e=0;t&&e<=3;e++){try{if(getComputedStyle(t).pointerEvents===`none`)return!0}catch{}t=t.parentElement}return!1}function n6(e){let t=typeof e.className==`string`&&e.className?`.`+e.className.split(/\s+/).filter(Boolean).slice(0,2).join(`.`):``;return`${e.tagName.toLowerCase()}${t}`}function r6(){return typeof document>`u`?!1:(document.documentElement?.getBoundingClientRect().width??0)>0}function i6(e){return((e.documentElement??(typeof document<`u`?document.documentElement:null))?.getBoundingClientRect().width??0)>0}function a6(e,t){let n=0,r=0;for(let i=0;i<e.length;i++){for(;e[i]-e[r]>t;)r++;n=Math.max(n,i-r+1)}return n}function o6(e,t){let n=0,r=0,i=0;for(let a=0;a<e.length;a++){for(;e[a]-e[i]>t;)i++;let o=a-i+1;o>n&&(n=o,r=e[a]-e[i])}return{count:n,span:r}}function s6(e,t){try{e.push(...t())}catch{}}function c6(e){let t=new Map;for(let n of e){let e=`${n.ruleId}|${n.component}|${n.changes.join()}|${n.description}`,r=t.get(e);r?r.count=(r.count??1)+1:t.set(e,n)}return[...t.values()]}function l6(e){let t=new Map;for(let n of e){let e=n.ruleId??`budget`,r=t.get(e);r?r.push(n):t.set(e,[n])}let n=Array.from(t.entries()).sort((e,t)=>{let n=e[1][0].severity===`error`?0:1,r=t[1][0].severity===`error`?0:1;return n===r?t[1].length===e[1].length?e[0].localeCompare(t[0]):t[1].length-e[1].length:n-r}),r=e.reduce((e,t)=>e+(t.count??1),0),i=e.filter(e=>e.severity===`error`).reduce((e,t)=>e+(t.count??1),0),a=[`# Render scan — ${i} error${i===1?``:`s`}, ${r-i} warn (${r} total)`,``,`Diagnoses are SUSPECTED (heuristic). The numbers (renders, self ms) are measured.`,``];for(let[e,t]of n){let n=t[0],r=t.reduce((e,t)=>e+(t.count??1),0);a.push(`## ${e} — ${n.severity} ×${r}`);for(let e of t){let t=e.component||e.source?` — ${[e.component,e.source].filter(Boolean).join(` @ `)}`:``,n=(e.count??1)>1?` ×${e.count}`:``;a.push(`- ${e.description}${n}${t}`),a.push(` ${e.evidence}`)}a.push(``)}return a.join(`
|
|
280
|
+
`)}function u6(e,t){let n=Array.from(new Set(e.map(e=>e.ruleId).filter(e=>!!e))).sort(),r=[];for(let e of n){let n=t.rules[e];n&&n.fixText?r.push(`- ${e} (${n.slug}): ${n.fixText}`):r.push(`- ${e}: see React-rerender-primitives.md ${e}`)}return[`Below is a RENDER-SCAN report from my running app — each finding is a measured`,`React re-render pattern graded against the re-render contract`,"(`React-rerender-primitives.md`). Rules are R-numbered.",``,`READ THIS FIRST: the DIAGNOSES are SUSPECTED — they are heuristic guesses at the`,`cause. The NUMBERS (render counts, self ms, FPS) are EXACT measurements. Trust the`,`numbers; verify each diagnosis against the code before you "fix" it.`,``,`How to fix:`,`1. Fix at the source of the identity churn / wasted render, not the symptom —`,` stabilize props (useCallback/useMemo, hoist constants), gate work behind an`,` everOpened/visible check, mount per-row overlays on intent.`,`2. Each distinct rule and its canonical fix:`,...r.map(e=>` ${e}`),`3. PROOF REQUIRED: after the change I will re-record and re-scan — the flagged`,` components must show the render counts drop. State what you changed per`,` component; do not claim done blind.`,``,`---`,``,l6(e)].join(`
|
|
281
|
+
`)}var d6=`bippy-0.5.43`,f6=Object.defineProperty,p6=Object.prototype.hasOwnProperty,m6=()=>{},h6=e=>{try{Function.prototype.toString.call(e).indexOf(`^_^`)>-1&&setTimeout(()=>{throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build`)})}catch{}},g6=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>!!(e&&`getFiberRoots`in e),_6=!1,v6,y6=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>_6?!0:(e&&typeof e.inject==`function`&&(v6=e.inject.toString()),!!v6?.includes(`(injected)`)),b6=new Set,x6=new Set,S6=e=>{let t=new Map,n=0,r={_instrumentationIsActive:!1,_instrumentationSource:d6,checkDCE:h6,hasUnsupportedRendererAttached:!1,inject(e){let i=++n;return t.set(i,e),x6.add(e),r._instrumentationIsActive||(r._instrumentationIsActive=!0,b6.forEach(e=>e())),i},on:m6,onCommitFiberRoot:m6,onCommitFiberUnmount:m6,onPostCommitFiberRoot:m6,renderers:t,supportsFiber:!0,supportsFlight:!0};try{f6(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`,{configurable:!0,enumerable:!0,get(){return r},set(t){if(t&&typeof t==`object`){let n=r.renderers;r=t,n.size>0&&(n.forEach((e,n)=>{x6.add(e),t.renderers.set(n,e)}),C6(e))}}});let t=window.hasOwnProperty,n=!1;f6(window,`hasOwnProperty`,{configurable:!0,value:function(...e){try{if(!n&&e[0]===`__REACT_DEVTOOLS_GLOBAL_HOOK__`)return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=void 0,n=!0,-0}catch{}return t.apply(this,e)},writable:!0})}catch{C6(e)}return r},C6=e=>{e&&b6.add(e);try{let t=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!t)return;if(!t._instrumentationSource){t.checkDCE=h6,t.supportsFiber=!0,t.supportsFlight=!0,t.hasUnsupportedRendererAttached=!1,t._instrumentationSource=d6,t._instrumentationIsActive=!1;let e=g6(t);if(e||(t.on=m6),t.renderers.size){t._instrumentationIsActive=!0,b6.forEach(e=>e());return}let n=t.inject,r=y6(t);r&&!e&&(_6=!0,t.inject({scheduleRefresh(){}})&&(t._instrumentationIsActive=!0)),t.inject=e=>{let i=n(e);return x6.add(e),r&&t.renderers.set(i,e),t._instrumentationIsActive=!0,b6.forEach(e=>e()),i}}(t.renderers.size||t._instrumentationIsActive||y6())&&e?.()}catch{}},w6=()=>p6.call(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`),T6=e=>w6()?(C6(e),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__):S6(e),E6=()=>!!(typeof window<`u`&&(window.document?.createElement||window.navigator?.product===`ReactNative`));(()=>{try{E6()&&T6()}catch{}})();var D6=60111,O6=`Symbol(react.concurrent_mode)`,k6=`Symbol(react.async_mode)`,A6=e=>{switch(e.tag){case 5:case 26:case 27:return!0;default:return typeof e.type==`string`}},j6=e=>{switch(e.tag){case 1:case 11:case 0:case 14:case 15:return!0;default:return!1}},M6=e=>{let t=e.memoizedProps,n=e.alternate?.memoizedProps||{},r=e.flags??e.effectTag??0;switch(e.tag){case 1:case 9:case 11:case 0:case 14:case 15:return(r&1)==1;default:return!e.alternate||n!==t||e.alternate.memoizedState!==e.memoizedState||e.alternate.ref!==e.ref}},N6=e=>{switch(e.tag){case 18:return!0;case 7:case 6:case 23:case 22:return!0;case 3:return!1;default:{let t=typeof e.type==`object`&&e.type!==null?e.type.$$typeof:e.type;switch(typeof t==`symbol`?t.toString():t){case D6:case O6:case k6:return!0;default:return!1}}}},P6=(e,t=!1)=>{let n=F6(e,A6,t);return n||=F6(e,A6,!t),n};function F6(e,t,n=!1){if(!e)return null;let r=t(e);if(r instanceof Promise)return(async()=>{if(await r===!0)return e;let i=n?e.return:e.child;for(;i;){let e=await L6(i,t,n);if(e)return e;i=n?null:i.sibling}return null})();if(r===!0)return e;let i=n?e.return:e.child;for(;i;){let e=I6(i,t,n);if(e)return e;i=n?null:i.sibling}return null}var I6=(e,t,n=!1)=>{if(!e)return null;if(t(e)===!0)return e;let r=n?e.return:e.child;for(;r;){let e=I6(r,t,n);if(e)return e;r=n?null:r.sibling}return null},L6=async(e,t,n=!1)=>{if(!e)return null;if(await t(e)===!0)return e;let r=n?e.return:e.child;for(;r;){let e=await L6(r,t,n);if(e)return e;r=n?null:r.sibling}return null},R6=e=>{let t=e?.actualDuration??0,n=t,r=e?.child??null;for(;t>0&&r!=null;)n-=r.actualDuration??0,r=r.sibling;return{selfTime:n,totalTime:t}},z6=e=>{let t=e;return typeof t==`function`?t:typeof t==`object`&&t?z6(t.type||t.render):null},B6=e=>{let t=e;if(typeof t==`string`)return t;if(typeof t!=`function`&&!(typeof t==`object`&&t))return null;let n=t.displayName||t.name||null;if(n)return n;let r=z6(t);return r&&(r.displayName||r.name)||null},V6=0,H6=new WeakMap,U6=(e,t=V6++)=>{H6.set(e,t)},W6=e=>{let t=H6.get(e);return!t&&e.alternate&&(t=H6.get(e.alternate)),t||(t=V6++,U6(e,t)),t},G6=(e,t,n)=>{let r=t;for(;r!=null;){if(H6.has(r)||W6(r),!N6(r)&&M6(r)&&e(r,`mount`),r.tag===13)if(r.memoizedState!==null){let t=r.child,n=t?t.sibling:null;if(n){let t=n.child;t!==null&&G6(e,t,!1)}}else{let t=null;r.child!==null&&(t=r.child.child),t!==null&&G6(e,t,!1)}else r.child!=null&&G6(e,r.child,!0);r=n?r.sibling:null}},K6=(e,t,n,r)=>{if(H6.has(t)||W6(t),!n)return;H6.has(n)||W6(n);let i=t.tag===13,a=!N6(t);a&&M6(t)&&e(t,`update`);let o=i&&n.memoizedState!==null,s=i&&t.memoizedState!==null;if(o&&s){let r=t.child?.sibling??null,i=n.child?.sibling??null;r!==null&&i!==null&&K6(e,r,i,t)}else if(o&&!s){let n=t.child;n!==null&&G6(e,n,!0)}else if(!o&&s){J6(e,n);let r=t.child?.sibling??null;r!==null&&G6(e,r,!0)}else if(t.child!==n.child){let n=t.child;for(;n;){if(n.alternate){let i=n.alternate;K6(e,n,i,a?t:r)}else G6(e,n,!1);n=n.sibling}}},q6=(e,t)=>{(t.tag===3||!N6(t))&&e(t,`unmount`)},J6=(e,t)=>{let n=t.tag===13&&t.memoizedState!==null,r=t.child;for(n&&(r=(t.child?.sibling??null)?.child??null);r!==null;)r.return!==null&&(q6(e,r),J6(e,r)),r=r.sibling},Y6=0,X6=new WeakMap,Z6=(e,t)=>{let n=`current`in e?e.current:e,r=X6.get(e);r||(r={id:Y6++,prevFiber:null},X6.set(e,r));let{prevFiber:i}=r;if(!n)q6(t,n);else if(i!==null){let e=i&&i.memoizedState!=null&&i.memoizedState.element!=null&&i.memoizedState.isDehydrated!==!0,r=n.memoizedState!=null&&n.memoizedState.element!=null&&n.memoizedState.isDehydrated!==!0;!e&&r?G6(t,n,!1):e&&r?K6(t,n,n.alternate,null):e&&!r&&q6(t,n)}else G6(t,n,!0);r.prevFiber=n},Q6=e=>{let t=T6(e.onActive);t._instrumentationSource=e.name??d6;let n=t.onCommitFiberRoot;if(e.onCommitFiberRoot){let r=(t,i,a)=>{n!==r&&(n?.(t,i,a),e.onCommitFiberRoot?.(t,i,a))};t.onCommitFiberRoot=r}let r=t.onCommitFiberUnmount;if(e.onCommitFiberUnmount){let n=(i,a)=>{t.onCommitFiberUnmount===n&&(r?.(i,a),e.onCommitFiberUnmount?.(i,a))};t.onCommitFiberUnmount=n}let i=t.onPostCommitFiberRoot;if(e.onPostCommitFiberRoot){let n=(r,a)=>{t.onPostCommitFiberRoot===n&&(i?.(r,a),e.onPostCommitFiberRoot?.(r,a))};t.onPostCommitFiberRoot=n}return t},$6=!1,e8=!1,t8=[],n8=-1/0,r8=200,i8=4e3,a8=100;function o8(){n8=c8()}var s8=[`scroll`,`wheel`,`pointermove`];function c8(){return typeof performance<`u`?performance.now():Date.now()}function l8(e,t){let n=e&&typeof e==`object`?e:{},r=t&&typeof t==`object`?t:{},i=new Set([...Object.keys(n),...Object.keys(r)]),a=[];for(let e of i){if(e===`children`)continue;let t=n[e],i=r[e];Object.is(t,i)||(typeof t==`function`&&typeof i==`function`?a.push(`prop:${e}(fn)`):t&&i&&typeof t==`object`&&typeof i==`object`&&u8(t,i)?a.push(`prop:${e}(ref)`):a.push(`prop:${e}`))}return a}function u8(e,t){let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n)if(!Object.is(e[r],t[r]))return!1;return!0}function d8(e){let t=[],n={};Z6(e,(e,r)=>{if(r===`unmount`||!j6(e))return;let i=B6(e.type)??`Anonymous`;r===`mount`&&(n[i]=(n[i]??0)+1);let a=0;try{a=R6(e).selfTime||0}catch{}let o=[];if(r===`update`&&e.alternate)try{o=l8(e.alternate.memoizedProps,e.memoizedProps)}catch{o=[`prop:(unknown)`]}let s=null;try{let t=P6(e)?.stateNode;t&&typeof WeakRef<`u`&&t instanceof Element&&(s=new WeakRef(t))}catch{}t.push({name:i,selfTime:a,phase:r===`mount`?`mount`:`update`,changes:o,el:s})}),t.sort((e,t)=>t.selfTime-e.selfTime);let r=t.slice(0,r8),i=Math.max(0,t.length-r8),a=0;for(let e of t)a+=e.selfTime;let o=c8(),s=o-n8<=a8;t8.push({at:o,duration:a,entries:r,droppedEntries:i,mounts:n,nearInput:s})}function f8(){if(!$6&&!(typeof window>`u`)){$6=!0;try{Q6({onCommitFiberRoot:(e,t)=>{if(e8&&!(t8.length>=i8))try{d8(t)}catch{}}})}catch{}}}function p8(){if(!(typeof window>`u`)&&!e8){t8=[],n8=-1/0,f8();try{for(let e of s8)window.addEventListener(e,o8,{capture:!0,passive:!0})}catch{}e8=!0}}function m8(){e8=!1;try{for(let e of s8)window.removeEventListener(e,o8,{capture:!0})}catch{}let e=t8;return t8=[],n8=-1/0,e}function h8(){let e=t8;return t8=[],e}var g8={budgets:{selfMs:2,commitMs:8},rules:{}},_8=/^###\s+(R\d+)\s*[·.\-–—:]?\s*`([^`]+)`.*?\((error|warn)\)\s*$/;function v8(e){return _8.test(e.trim())}function y8(e,t){let n=e.split(`
|
|
282
|
+
`),r=RegExp(`^\\s*\\*\\*${t.source}[^*]*:\\*\\*\\s*(.*)$`,`i`),i=/^\s*\*\*[^*]+:\*\*/,a=0;for(;a<n.length&&!r.test(n[a]);a++);if(a>=n.length)return``;let o=n[a].replace(r,`$1`),s=[];for(o.trim()&&s.push(o.trim()),a+=1;a<n.length;a++){let e=n[a];if(i.test(e)||/^###\s/.test(e)||/^##\s/.test(e)||/^---\s*$/.test(e))break;if(e.trim())s.push(e.trim());else if(s.length){let e=a+1;for(;e<n.length&&!n[e].trim();)e++;if(e>=n.length||i.test(n[e])||/^###\s|^##\s|^---\s*$/.test(n[e]))break}}return b8(s.join(` `)).trim()}function b8(e){return e.replace(/\*\*([^*]+)\*\*/g,`$1`).replace(/__([^_]+)__/g,`$1`).replace(/(^|[\s(])[*_]([^*_\s][^*_]*?)[*_]([\s.,;:)]|$)/g,`$1$2$3`).replace(/\s{2,}/g,` `)}function x8(e){let t=e.match(/≤(\d+(?:\.\d+)?)ms self/),n=e.match(/commit >(\d+(?:\.\d+)?)ms/)??e.match(/>(\d+(?:\.\d+)?)ms of React work/);return{selfMs:t?parseFloat(t[1]):g8.budgets.selfMs,commitMs:n?parseFloat(n[1]):g8.budgets.commitMs}}function S8(e){let t=x8(e),n={},r=e.split(`
|
|
283
|
+
`),i=0;for(;i<r.length;){let e=r[i];if(!v8(e)){i++;continue}let t=e.trim(),a=[],o=i+1;for(;o<r.length;o++){let e=r[o];if(v8(e)||/^##\s/.test(e.trim())||/^---\s*$/.test(e.trim()))break;a.push(e)}try{let e=t.match(_8);if(e){let[,t,r,i]=e,o=a.join(`
|
|
284
|
+
`);n[t]={id:t,slug:r,severity:i===`warn`?`warn`:`error`,ruleText:y8(o,/Rule/),fixText:y8(o,/Fix/),detectText:y8(o,/Detect/)}}}catch{}i=o}return{budgets:t,rules:n}}Br();var C8=[],w8=new Set;function T8(e){return w8.add(e),e(C8),()=>void w8.delete(e)}function E8(){C8=[];for(let e of w8)e(C8)}function D8(e,t){C8=[...e,...C8.filter(e=>e.page!==t)];for(let e of w8)e(C8);return $8(e).then(()=>{C8=[...C8];for(let e of w8)e(C8);e5(e)}),e}var O8=new Set,k8=!1,A8=null;function j8(e){return O8.add(e),e(k8,A8),()=>void O8.delete(e)}function M8(){if(!(P8||k8)){p8(),k8=!0,A8=Date.now();for(let e of O8)e(!0,A8)}}async function N8(){if(!k8)return[];let e=m8();k8=!1,A8=null;for(let e of O8)e(!1,null);let t=await Y8(),n=location.pathname;return D8(Q3(e,t,{ignore:await Z8()}).map(e=>({...e,page:n})),n)}var P8=!1;try{P8=localStorage.getItem(`linear-grab:render-live`)===`1`}catch{}var F8=new Set;function I8(e){return F8.add(e),e(P8),()=>void F8.delete(e)}var L8=3e3,R8=4e3,z8=null,B8=[],V8=``;function H8(e){if(e!==P8&&!(e&&k8)){P8=e;try{localStorage.setItem(`linear-grab:render-live`,e?`1`:`0`)}catch{}for(let t of F8)t(e);e?(p8(),B8=[],V8=location.pathname,z8=setInterval(()=>void U8(!1),L8)):(z8&&clearInterval(z8),z8=null,U8(!0).finally(()=>{m8(),B8=[]}))}}async function U8(e){try{let t=location.pathname;if(t!==V8){let e=C8.filter(e=>e.page===V8);$8(e).then(()=>{C8=[...C8];for(let e of w8)e(C8);e5(e)}),B8=[],V8=t}B8.push(...h8()),B8.length>R8&&B8.splice(0,B8.length-R8);let n=await Y8(),r=Q3(B8,n,{ignore:await Z8()}).map(e=>({...e,page:t}));C8=[...r,...C8.filter(e=>e.page!==t)];for(let e of w8)e(C8);if(e){await $8(r),C8=[...C8];for(let e of w8)e(C8);e5(r)}}catch{}}function W8(){typeof window>`u`||!P8||z8||(p8(),B8=[],V8=location.pathname,z8=setInterval(()=>void U8(!1),L8))}function G8(){let e=location.pathname;return D8(e6(document).map(t=>({...t,page:e})),e)}var K8=5*6e4,q8=null,J8=0;async function Y8(){if(q8&&Date.now()-J8<K8)return q8;let e=g8;try{let t=await YO(),n=await(await fetch(`${t}/scan/rulebook`)).json();n.ok&&n.text&&(e=S8(n.text))}catch{}return e=await Q8(e),q8=e,J8=Date.now(),e}function X8(){return q8}async function Z8(){try{let e=await Tr();return Array.isArray(e.renderIgnore)?e.renderIgnore:void 0}catch{return}}async function Q8(e){try{let t=(await Tr()).renderBudgets;if(t&&(t.selfMs!=null||t.commitMs!=null))return{...e,budgets:{selfMs:t.selfMs??e.budgets.selfMs,commitMs:t.commitMs??e.budgets.commitMs}}}catch{}return e}async function $8(e){let t=null;try{t=(await Promise.resolve().then(()=>(RZ(),AZ))).getGlobalApi()??null}catch{return}if(!t)return;let n=new Map;for(let t of e){let e=t.el?.deref();if(!e)continue;let r=n.get(e);r?r.push(t):n.set(e,[t])}let r=300;for(let[e,i]of n){if(r--<=0)break;let n=null,a=null;try{n=t.getDisplayName?.(e)??null}catch{}try{let n=await t.getSource?.(e);n?.filePath&&(a=`${n.filePath}${n.lineNumber==null?``:`:${n.lineNumber}`}`)}catch{}if(!(!n&&!a))for(let e of i)!e.component&&n&&(e.component=n),a&&(e.source=a)}}function e5(e){if(e.length===0)return;let t=Date.now(),n=e.slice(0,200).map(({el:e,...n})=>({kind:`render-scan`,at:t,...n}));YO().then(e=>fetch(`${e}/scan/events`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({events:n}),keepalive:!0})).catch(()=>{})}var t5=N(`<span class="text-text-faint font-normal tabular-nums"> · <!> pages`),n5=N(`<span class="bg-danger size-1.5 shrink-0 animate-pulse rounded-full"aria-hidden>`),r5=N(`<span class="text-danger inline-block min-w-[4ch] text-right text-[10.5px] font-medium tabular-nums">`),i5=N(`<svg width=13 height=13 viewBox="0 0 16 16"aria-hidden><rect x=3.5 y=3.5 width=9 height=9 rx=1.5 fill=currentColor>`),a5=N(`<svg width=13 height=13 viewBox="0 0 16 16"aria-hidden><rect x=4 y=3.5 width=3 height=9 rx=1 fill=currentColor></rect><rect x=9 y=3.5 width=3 height=9 rx=1 fill=currentColor>`),o5=N(`<span class="bg-success absolute -top-0.5 -right-0.5 size-1.5 animate-pulse rounded-full"aria-hidden>`),s5=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M5.5 3 6.5 1.5h3L10.5 3h2A1.5 1.5 0 0 1 14 4.5v7A1.5 1.5 0 0 1 12.5 13h-9A1.5 1.5 0 0 1 2 11.5v-7A1.5 1.5 0 0 1 3.5 3h2Z"></path><circle cx=8 cy=7.75 r=2.25>`),c5=N(`<span class="text-success text-[12px] leading-none">✓`),l5=N(`<svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round aria-hidden><path d="M4 4l8 8M12 4l-8 8">`),u5=N(`<p class="text-text-faint px-1 text-[10.5px] leading-snug">Recording commits… interact with the page.`),d5=N(`<p class="text-text-faint px-1 text-[10.5px] leading-snug">Live render scan — findings update as you interact and navigate.`),f5=N(`<div class="flex items-center gap-1 px-1"><button class="border-border cursor-pointer rounded-full border px-2 py-0.5 text-[10px] font-medium tabular-nums"> errors</button><button class="border-border cursor-pointer rounded-full border px-2 py-0.5 text-[10px] font-medium tabular-nums"> warns`),p5=N(`<div class="flex max-h-[28rem] flex-col gap-1.5 overflow-y-auto pr-3 pl-2">`),m5=N(`<div class="flex h-full flex-col gap-3 overflow-y-auto pt-3 pb-4 pr-3 pl-2"><div class="flex flex-col gap-1 px-1"><div class="flex items-center justify-between gap-2"><p class="text-text min-w-0 truncate text-[12.5px] font-semibold">Renders</p><div class="flex shrink-0 items-center gap-1"></div></div><p class="text-text-faint text-[10.5px] leading-snug">Commits graded against React-rerender-primitives.md — record then interact, go live, or snapshot the DOM. Accumulates per page.`),h5=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 aria-hidden><circle cx=8 cy=8 r=6></circle><circle cx=8 cy=8 r=2.25 fill=currentColor stroke=none>`),g5=N(`<svg width=13 height=13 viewBox="0 0 16 16"aria-hidden><path d="M5 3.3v9.4a.5.5 0 0 0 .77.42l7.1-4.7a.5.5 0 0 0 0-.84l-7.1-4.7A.5.5 0 0 0 5 3.3Z"fill=currentColor>`),_5=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round aria-hidden><path d="M8 1.5 9.6 6l4.4 1.6L9.6 9.2 8 13.7 6.4 9.2 2 7.6 6.4 6Z"></path><path d="M13 11.5l.6 1.7 1.7.6-1.7.6-.6 1.7-.6-1.7-1.7-.6 1.7-.6Z">`),v5=N(`<svg width=13 height=13 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 stroke-linejoin=round aria-hidden><rect x=5.5 y=5.5 width=9 height=9 rx=1.5></rect><path d="M10.5 5.5v-2a2 2 0 0 0-2-2h-5a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h2">`),y5=N(`<div class="border-border flex flex-col gap-1 border-t px-2 py-1.5">`),b5=N(`<div class="bg-surface border-border flex flex-col rounded-lg border"><button class="flex w-full cursor-pointer items-center gap-2 px-2 py-1.5 text-left"><span class="size-1.5 shrink-0 rounded-full"aria-hidden></span><span class="text-accent min-w-0 truncate font-mono text-[11.5px]"></span><span class="text-text-faint ml-auto shrink-0 text-[10.5px] tabular-nums">×</span><svg width=10 height=10 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 class="text-text-faint shrink-0 transition-transform"aria-hidden><path d="m4 6 4 4 4-4">`),x5=N(`<span class="text-accent font-mono"> `),S5=N(`<span class="text-text-faint tabular-nums"> ×`),C5=N(`<span class="flex flex-wrap gap-1">`),w5=N(`<span class="text-text-dim font-mono"> · `),T5=N(`<div class="flex flex-col gap-0.5 rounded px-1 py-0.5 text-left"><span class="text-text-dim text-[10.5px] leading-snug"></span><span class="text-text-faint text-[10px] leading-snug tabular-nums">`),E5=N(`<span class="bg-surface-2 text-text-dim rounded px-1 font-mono text-[9.5px] leading-relaxed">`);function D5(e){let t=e.el?.deref();if(!(t instanceof HTMLElement)||!t.isConnected)return!1;t.scrollIntoView({block:`center`,behavior:`smooth`});let n=t.style.outline,r=t.style.outlineOffset;return t.style.outline=`2px solid #e5a13a`,t.style.outlineOffset=`2px`,setTimeout(()=>{t.style.outline=n,t.style.outlineOffset=r},1400),!0}function O5(e){let t=Math.max(0,Math.floor(e/1e3));return`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`}function k5(e){return e.replace(/^prop:/,``)}function A5(){let[e,t]=T([]);ae(T8(t));let[n,r]=T(!1),[i,a]=T(null),[o,s]=T(Date.now()),c=null,l=()=>{c&&clearInterval(c),c=null};ae(l),ae(j8((e,t)=>{r(e),a(t),e?(s(Date.now()),c||=setInterval(()=>s(Date.now()),500)):l()}));let[u,d]=T(!1);ae(I8(d));let[f,p]=T(X8());Y8().then(p);let[m,h]=T(null),[g,_]=T(null),[v,y]=T(!0),[b,x]=T(!0),[S,C]=T(!1),[w,E]=T(!1),[O,k]=T(!1),ee=async()=>{if(h(null),n())try{let e=await N8();p(X8()),_(null),e.length===0&&h(`No re-render anti-patterns caught — interact more (scroll, open menus, type) between record and stop.`)}catch(e){h(e instanceof Error?e.message:String(e))}else M8()},te=()=>{h(null),C(!0);try{G8(),_(null)}catch(e){h(e instanceof Error?e.message:String(e))}finally{C(!1)}},A=()=>{E8(),_(null)},ne=()=>new Set(e().map(e=>e.page)).size,re=()=>e().filter(e=>e.severity===`error`?v():b()),ie=()=>e().filter(e=>e.severity===`error`).reduce((e,t)=>e+(t.count??1),0),oe=()=>e().reduce((e,t)=>e+(t.count??1),0)-ie(),se=()=>{let e=new Map;for(let t of re()){let n=t.ruleId??`budget`,r=e.get(n);r?r.push(t):e.set(n,[t])}return[...e.entries()].sort((e,t)=>Number(t[1][0].severity===`error`)-Number(e[1][0].severity===`error`)||t[1].length-e[1].length)},ce=e=>{let t=e===`budget`?null:f()?.rules[e]?.slug??null;return t?`${e} · ${t}`:e},le=async()=>{try{await navigator.clipboard.writeText(l6(re())),E(!0),setTimeout(()=>E(!1),1600)}catch{h(`Clipboard was blocked — click Copy again.`)}},ue=async()=>{try{await navigator.clipboard.writeText(u6(re(),await Y8())),k(!0),setTimeout(()=>k(!1),1600)}catch{h(`Clipboard was blocked — click Copy again.`)}};return(()=>{var t=m5(),r=t.firstChild.firstChild.firstChild;r.firstChild;var a=r.nextSibling;return P(r,j(M,{get when(){return ne()>1},get children(){var e=t5(),t=e.firstChild.nextSibling;return t.nextSibling,P(e,ne,t),e}}),null),P(a,j(M,{get when(){return n()},get children(){return[n5(),(()=>{var e=r5();return P(e,()=>O5(o()-(i()??o()))),e})()]}}),null),P(a,j(q,{class:`size-7 px-0`,get variant(){return n()?`danger`:`ghost`},"data-tip-pos":`bottom left`,get disabled(){return u()},get title(){return $e(()=>!!u())()?`Live scan owns the recorder — pause it first`:n()?`Stop & analyze`:`Record renders`},get"aria-label"(){return n()?`Stop and analyze`:`Record renders`},onClick:()=>void ee(),get children(){return j(M,{get when(){return n()},get fallback(){return h5()},get children(){return i5()}})}}),null),P(a,j(q,{class:`relative size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,get disabled(){return n()},get title(){return u()?`Pause live render scan`:`Live render scan — findings update as you browse`},"aria-label":`Toggle live render scan`,onClick:()=>H8(!u()),get children(){return[j(M,{get when(){return u()},get fallback(){return g5()},get children(){return a5()}}),j(M,{get when(){return u()},get children(){return o5()}})]}}),null),P(a,j(q,{class:`size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,get loading(){return S()},title:`Snapshot scan (passive DOM pass)`,"aria-label":`Snapshot scan`,onClick:te,get children(){return s5()}}),null),P(a,j(q,{class:`size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,get title(){return O()?`Copied!`:`Copy AI fix prompt`},"aria-label":`Copy AI fix prompt`,onClick:()=>void ue(),get children(){return j(M,{get when(){return O()},get fallback(){return _5()},get children(){return c5()}})}}),null),P(a,j(q,{class:`size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,get title(){return w()?`Copied!`:`Copy report`},"aria-label":`Copy report`,onClick:()=>void le(),get children(){return j(M,{get when(){return w()},get fallback(){return v5()},get children(){return c5()}})}}),null),P(a,j(q,{class:`text-danger size-7 px-0`,variant:`ghost`,"data-tip-pos":`bottom left`,title:`Clear findings`,"aria-label":`Clear findings`,onClick:A,get children(){return l5()}}),null),P(t,j(M,{get when(){return m()},get children(){return j(Hj,{get message(){return m()}})}}),null),P(t,j(M,{get when(){return n()},get children(){return u5()}}),null),P(t,j(M,{get when(){return $e(()=>!!u())()&&!n()},get children(){return d5()}}),null),P(t,j(M,{get when(){return e().length>0},get fallback(){return j(M,{get when(){return $e(()=>!n())()&&!u()},get children(){return j(Vj,{title:`No renders scanned yet`,children:`Press record, then interact — scroll, open menus, navigate, type — and stop to analyze. Or go live and watch findings stream in as you browse. Snapshot grades the current DOM without recording.`})}})},get children(){return[(()=>{var e=f5(),t=e.firstChild,n=t.firstChild,r=t.nextSibling,i=r.firstChild;return t.$$click=()=>y(!v()),P(t,ie,n),r.$$click=()=>x(!b()),P(r,oe,i),D(e=>{var n={"text-danger bg-danger/10 border-danger/40":v(),"text-text-faint":!v()},i=v(),a={"text-warn bg-warn/10 border-warn/40":b(),"text-text-faint":!b()},o=b();return e.e=lt(t,n,e.e),i!==e.t&&it(t,`aria-pressed`,e.t=i),e.a=lt(r,a,e.a),o!==e.o&&it(r,`aria-pressed`,e.o=o),e},{e:void 0,t:void 0,a:void 0,o:void 0}),e})(),(()=>{var e=p5();return P(e,j(We,{get each(){return se()},children:([e,t])=>{let n=t[0],r=()=>g()===e;return(()=>{var i=b5(),a=i.firstChild,o=a.firstChild,s=o.nextSibling,c=s.nextSibling;c.firstChild;var l=c.nextSibling;return a.$$click=()=>_(r()?null:e),P(s,()=>ce(e)),P(c,()=>t.reduce((e,t)=>e+(t.count??1),0),null),P(i,j(M,{get when(){return r()},get children(){var e=y5();return P(e,j(We,{each:t,children:e=>{let t=()=>e.el?.deref()!=null;return(()=>{var n=T5(),r=n.firstChild,i=r.nextSibling;return n.$$click=()=>{t()&&(D5(e)||h(e.page===location.pathname?`Element is gone — record or snapshot again.`:`This finding is on ${e.page} — navigate there to reveal it.`))},P(r,j(M,{get when(){return ne()>1},get children(){var t=x5(),n=t.firstChild;return P(t,()=>e.page,n),t}}),null),P(r,()=>e.description,null),P(r,j(M,{get when(){return(e.count??1)>1},get children(){var t=S5();return t.firstChild,P(t,()=>e.count,null),t}}),null),P(n,j(M,{get when(){return e.changes.length>0},get children(){var t=C5();return P(t,j(We,{get each(){return e.changes},children:e=>(()=>{var t=E5();return P(t,()=>k5(e)),t})()})),t}}),i),P(i,()=>e.evidence,null),P(i,j(M,{get when(){return e.component||e.source},get children(){var t=w5();return t.firstChild,P(t,()=>[e.component,e.source].filter(Boolean).join(` @ `),null),t}}),null),D(e=>{var r={"hover:bg-surface-2 cursor-pointer":t()},i=t()?`Reveal on the page`:void 0;return e.e=lt(n,r,e.e),i!==e.t&&it(n,`title`,e.t=i),e},{e:void 0,t:void 0}),n})()}})),e}}),null),D(e=>{var t=n.severity===`error`,i=n.severity===`warn`,a=!!r();return t!==e.e&&o.classList.toggle(`bg-danger`,e.e=t),i!==e.t&&o.classList.toggle(`bg-warn`,e.t=i),a!==e.a&&l.classList.toggle(`rotate-180`,e.a=a),e},{e:void 0,t:void 0,a:void 0}),i})()}})),e})()]}}),null),t})()}rt([`click`]);var j5=[`defaultTeamId`,`defaultProjectId`,`defaultLabelIds`,`defaultRepo`,`workflowMode`,`cursorModel`,`stagingBranch`,`githubAssetsRepo`,`skillPaths`,`logUrl`,`logLines`,`issueTemplate`,`testUsername`,`renderBudgets`,`renderIgnore`];function M5(e){let t={};for(let n of j5){let r=e[n];r!==void 0&&r!==``&&!(Array.isArray(r)&&r.length===0)&&(t[n]=r)}return t}function N5(e,t){let n={};for(let r of j5)e[r]===void 0&&t[r]!==void 0&&(n[r]=t[r]);return Object.keys(n).length?n:null}Br();function P5(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}async function F5(e){let t=P5(crypto.getRandomValues(new Uint8Array(32))),n=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(t)),r=P5(new Uint8Array(n)),i=P5(crypto.getRandomValues(new Uint8Array(16))),a=chrome.identity.getRedirectURL(),o=new URL(`https://linear.app/oauth/authorize`);o.searchParams.set(`client_id`,e),o.searchParams.set(`redirect_uri`,a),o.searchParams.set(`response_type`,`code`),o.searchParams.set(`scope`,`read,write`),o.searchParams.set(`state`,i),o.searchParams.set(`code_challenge`,r),o.searchParams.set(`code_challenge_method`,`S256`);let s=await chrome.identity.launchWebAuthFlow({url:o.toString(),interactive:!0});if(!s)throw Error(`OAuth flow was cancelled`);let c=new URL(s).searchParams;if(c.get(`state`)!==i)throw Error(`OAuth state mismatch`);let l=c.get(`code`);if(!l)throw Error(c.get(`error_description`)??`No authorization code returned`);let u=await fetch(`https://api.linear.app/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({grant_type:`authorization_code`,code:l,redirect_uri:a,client_id:e,code_verifier:t})}),d=await u.json().catch(()=>null);if(!u.ok||!d?.access_token)throw Error(`Token exchange failed — check the OAuth app callback URL and client id`);await Er({linearAccessToken:d.access_token,linearOauthClientId:e})}async function I5(){await Er({linearAccessToken:void 0,linearApiKey:void 0})}Br(),Sr(),Ix(),_D();var L5=N(`<div class="bg-surface-2 border-border flex rounded-md border p-0.5">`),R5=N(`<span class="text-text-faint text-[10.5px] leading-snug">Cloud: picking an element opens the panel to draft & delegate to the Cursor agent. Local (react-grab style): picking auto-copies the element's context — source, stack, and your skills/memory paths — straight to the clipboard for a local Claude Code or Cursor session; the panel stays out of the way. Both share the same picker; switch anytime.`),z5=N(`<label class="flex cursor-pointer items-center gap-2 select-none"><input type=checkbox class="accent-accent rounded"><span class="text-text text-[12px]">Element screenshots`),B5=N(`<span class="text-text-faint text-[10.5px] leading-snug">Captures a highlighted screenshot of each picked element and attaches it to the issue. Costs a beat on huge pages — with this off, picking is instant (pure react-grab speed).`),V5=N(`<span class=text-text>Connected as <span class=font-medium></span> · <span class=text-text-dim>`),H5=N(`<div class="bg-surface border-border flex items-center justify-between rounded-lg border p-2.5"><span class="text-text text-[12px]">`),U5=N(`<option value>Select a team…`),W5=N(`<option value>No project`),G5=N(`<div class="flex flex-wrap gap-1">`),K5=N(`<label class="flex items-start gap-2"><input type=checkbox class="accent-accent mt-0.5"><span class="flex flex-col gap-0.5"><span class=text-[12px]>Let agents close out Linear themselves</span><span class="text-text-faint text-[10.5px] leading-snug">Embeds your Linear API key + raw GraphQL closeout recipes in every issue's Agent instructions — cloud agent VMs have no authenticated Linear MCP, so without this they can't comment, attach media, or move the issue. The key is visible to anyone who can read the issue.`),q5=N(`<p class="text-text-dim text-[11px]">No agents found — install the Cursor integration in Linear first.`),J5=N(`<span class="text-text-faint text-[10.5px] leading-snug">Empty = the default above (computer-use testing, video demo, PR + review babysitting).`),Y5=N(`<div class="flex flex-col gap-1.5">`),X5=N(`<div class="flex flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">Mode</span><div class="bg-surface-2 border-border flex rounded-md border p-0.5"></div><span class="text-text-faint text-[10.5px] leading-snug">Beside page squeezes the app next to the panel, DevTools-style — nothing gets covered. Also toggleable from the dock icon in the panel header.`),Z5=N(`<div class="flex flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">Dock side</span><div class="bg-surface-2 border-border flex rounded-md border p-0.5"></div><span class="text-text-faint text-[10.5px] leading-snug">The launcher pill is draggable — park it anywhere it doesn't cover your app.`),Q5=N(`<p class="text-text-faint text-[10.5px] leading-snug">A committed <code>.lineargrab.json</code> at the repo root (where the bridge runs) shares team/project/labels, skills, staging branch, and workflow defaults with every machine and teammate — it seeds any setting you haven't set locally. Secrets never belong in it.`),$5=N(`<span class="inline-block min-w-[10ch] text-center">`),e7=N(`<div class="flex items-center gap-2">`),t7=N(`<option value>Select a channel…`),n7=N(`<label class="flex cursor-pointer items-center gap-2 select-none"><input type=checkbox class="accent-accent rounded"><span class="text-text text-[12px]">Announce new issues on create`),r7=N(`<span class="text-text-faint text-[10.5px] leading-snug">⚠️ Tokens are embedded in issue Agent-instructions so agents can post the finished demo — everyone who can read the issue can read them. Use single-channel-scoped bots.`),i7=N(`<div class="flex flex-col gap-1"><span class="text-text-dim text-[11px] font-medium">Provider preference</span><div class="bg-surface-2 border-border flex rounded-md border p-0.5"><button>Auto</button><button>OpenAI</button><button>Anthropic`),a7=N(`<p class="text-text-dim text-[11px]">`),o7=N(`<div class=min-h-[2lh]>`),s7=N(`<ol class="text-text-faint flex list-decimal flex-col gap-1 pl-4 text-[11px] leading-relaxed"><li>Pick an element on your running dev app.</li><li>Draft the issue (AI optional).</li><li>Create + delegate — Cursor's cloud agent fixes it and opens a PR.</li><li>Track and steer it from Activity.`),c7=N(`<div class="flex h-full flex-col gap-5 overflow-y-auto pt-3 pb-6 pl-3 pr-4">`),l7=N(`<button>`),u7=N(`<div class="flex gap-1.5">`),d7=N(`<p class="text-text-faint text-center text-[10.5px]">or`),f7=N(`<span class="text-text-faint text-[10.5px] leading-snug">Register this callback URL in your Linear OAuth app config:<br><span class="font-mono text-[10.5px] break-all">`),p7=N(`<div class="flex flex-col gap-3">`),m7=N(`<span class=text-text-dim>Connected — verifying…`),h7=N(`<option> (<!>)`),g7=N(`<option>`),_7=N(`<button type=button><span class="mr-1 inline-block size-2 rounded-full align-middle">`),v7=N(`<option value>Select the agent…`),y7=N(`<option>#`),b7=N(`<p class="text-text-dim text-[11px]">No key set — AI drafting disabled, manual drafting still works.`);function x7(){let e=sr(),t=_r(()=>({queryKey:[`settings`],queryFn:Tr,staleTime:0})),n=k(()=>t.data??{});async function r(t,n=!1){await Er(t),await e.invalidateQueries({queryKey:[`settings`]}),n&&(await e.invalidateQueries({queryKey:[`viewer`]}),await e.invalidateQueries({queryKey:[`teams`]}),await e.invalidateQueries({queryKey:[`agents`]}),await e.invalidateQueries({queryKey:[`my-issues`]}))}let i=k(()=>!!(n().linearApiKey||n().linearAccessToken)),a=_r(()=>({queryKey:[`viewer`],queryFn:uO,enabled:i(),retry:0})),o=_r(()=>({queryKey:[`teams`],queryFn:dO,enabled:i()})),s=_r(()=>({queryKey:[`linear-projects`],queryFn:xO,enabled:i()})),c=_r(()=>({queryKey:[`bridge-health`],queryFn:NO,retry:0})),[l,u]=T(!1),d=async()=>{try{await navigator.clipboard.writeText(JSON.stringify(M5(n()),null,2)+`
|
|
285
|
+
`),u(!0),setTimeout(()=>u(!1),1800)}catch{}},f=()=>{let e=c.data?.projectConfig;if(!e)return;let t={};for(let n of j5)e[n]!==void 0&&(t[n]=e[n]);r(t)},p=_r(()=>({queryKey:[`linear-labels`],queryFn:SO,enabled:i()})),m=_r(()=>({queryKey:[`agents`],queryFn:fO,enabled:i()})),[h,g]=T(``),[_,v]=T(!1),[y,b]=T(``);async function x(){let e=h().trim();if(e){v(!0),b(``);try{await r({linearApiKey:e},!0),await uO(),g(``)}catch{b(`Key rejected — could not verify. Check the key and try again.`),await r({linearApiKey:void 0},!0)}finally{v(!1)}}}let[S,C]=T(``),[w,E]=T(!1),[O,ee]=T(``);async function te(){let t=(S()||n().linearOauthClientId||``).trim();if(!t){ee(`Enter an OAuth client ID first.`);return}E(!0),ee(``);try{await F5(t),await e.invalidateQueries({queryKey:[`settings`]}),await e.invalidateQueries({queryKey:[`viewer`]}),await e.invalidateQueries({queryKey:[`teams`]}),await e.invalidateQueries({queryKey:[`agents`]}),await e.invalidateQueries({queryKey:[`my-issues`]})}catch(e){ee(e instanceof Error?e.message:`OAuth flow failed.`)}finally{E(!1)}}let[A,ne]=T(!1);async function re(){ne(!0);try{await I5(),await e.invalidateQueries({queryKey:[`settings`]}),await e.invalidateQueries({queryKey:[`viewer`]}),await e.invalidateQueries({queryKey:[`teams`]}),await e.invalidateQueries({queryKey:[`agents`]}),await e.invalidateQueries({queryKey:[`my-issues`]})}finally{ne(!1)}}let ie=xr?chrome.identity.getRedirectURL():null,ae=_r(()=>({queryKey:[`slack-channels`,n().slackToken],queryFn:()=>tk(n().slackToken),enabled:!!n().slackToken,retry:0,staleTime:6e4})),oe=k(()=>jx(n())),se=k(()=>{let e=oe();return e?`Drafting with ${e} — ${Px[e].fast} (fast) / ${Px[e].best} (best)`:null});return(()=>{var e=c7();return P(e,j(Rj,{title:`Workflow`,get children(){return[(()=>{var e=L5();return P(e,j(We,{each:[{id:`cloud`,label:`Cloud · Linear + Cursor`},{id:`local`,label:`Local · clipboard`}],children:e=>(()=>{var t=l7();return t.$$click=()=>void r({workflowMode:e.id}),P(t,()=>e.label),D(()=>st(t,`flex-1 rounded-[5px] px-2 py-1 text-[11.5px] font-medium transition-colors ${(n().workflowMode??`cloud`)===e.id?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`)),t})()})),e})(),R5()]}}),null),P(e,j(Rj,{title:`Capture`,get children(){return[(()=>{var e=z5(),t=e.firstChild;return t.addEventListener(`change`,e=>void r({captureShots:e.currentTarget.checked||void 0})),D(()=>t.checked=!!n().captureShots),e})(),B5()]}}),null),P(e,j(Rj,{title:`Linear`,get children(){return j(M,{get when(){return i()},get fallback(){return(()=>{var e=p7();return P(e,j(Lj,{label:`Personal API key`,hint:`Create one at linear.app → Settings → API — fastest path.`,get children(){return[(()=>{var e=u7();return P(e,j(jj,{type:`password`,placeholder:`lin_api_…`,get value(){return h()},onInput:e=>g(e.currentTarget.value),"on:keydown":e=>{e.key===`Enter`&&x()}}),null),P(e,j(q,{variant:`primary`,get loading(){return _()},get disabled(){return!h().trim()},onClick:()=>void x(),class:`shrink-0`,children:`Connect`}),null),e})(),j(M,{get when(){return y()},get children(){return j(Hj,{get message(){return y()}})}})]}}),null),P(e,j(M,{when:xr,get children(){return[d7(),j(Lj,{label:`OAuth client ID`,get children(){return[(()=>{var e=u7();return P(e,j(jj,{placeholder:`your-client-id`,get value(){return S()||n().linearOauthClientId||``},onInput:e=>C(e.currentTarget.value)}),null),P(e,j(q,{variant:`ghost`,get loading(){return w()},onClick:()=>void te(),class:`shrink-0 whitespace-nowrap`,children:`Connect with OAuth`}),null),e})(),j(M,{get when(){return O()},get children(){return j(Hj,{get message(){return O()}})}}),(()=>{var e=f7(),t=e.firstChild.nextSibling.nextSibling;return P(t,ie),e})()]}})]}}),null),e})()},get children(){var e=H5(),t=e.firstChild;return P(t,j(M,{get when(){return!a.isLoading},get fallback(){return m7()},get children(){return j(M,{get when(){return a.data},get fallback(){return j(M,{get when(){return a.isError},get fallback(){return m7()},get children(){return j(Hj,{message:`Key rejected — reconnect`})}})},get children(){var e=V5(),t=e.firstChild.nextSibling,n=t.nextSibling.nextSibling;return P(t,()=>a.data.name),P(n,()=>a.data.email),e}})}})),P(e,j(q,{variant:`ghost`,get loading(){return A()},onClick:()=>void re(),class:`ml-2 shrink-0`,children:`Disconnect`}),null),e}})}}),null),P(e,j(M,{get when(){return i()},get children(){return j(Rj,{title:`Workspace`,get children(){return[j(Lj,{label:`Default team`,get children(){return j(Nj,{get value(){return n().defaultTeamId??``},onChange:e=>{let t=e.currentTarget.value;r({defaultTeamId:t||void 0})},get disabled(){return o.isLoading},get children(){return[U5(),j(M,{get when(){return o.data},get children(){return j(We,{get each(){return o.data},children:e=>(()=>{var t=h7(),r=t.firstChild,i=r.nextSibling;return i.nextSibling,P(t,()=>e.name,r),P(t,()=>e.key,i),D(()=>t.selected=e.id===n().defaultTeamId),D(()=>t.value=e.id),t})()})}})]}})}}),j(Lj,{label:`Default project`,hint:`Every issue created from the panel is filed into this project.`,get children(){return j(Nj,{get value(){return n().defaultProjectId??``},onChange:e=>void r({defaultProjectId:e.currentTarget.value||void 0}),get disabled(){return s.isLoading},get children(){return[(()=>{var e=W5();return D(()=>e.selected=!n().defaultProjectId),e})(),j(We,{get each(){return s.data??[]},children:e=>(()=>{var t=g7();return P(t,()=>e.name),D(()=>t.selected=e.id===n().defaultProjectId),D(()=>t.value=e.id),t})()})]}})}}),j(Lj,{label:`Default labels`,hint:`Applied to every issue created from the panel.`,get children(){var e=G5();return P(e,j(We,{get each(){return p.data??[]},children:e=>{let t=()=>(n().defaultLabelIds??[]).includes(e.id);return(()=>{var i=_7(),a=i.firstChild;return i.$$click=()=>{let i=n().defaultLabelIds??[];r({defaultLabelIds:t()?i.filter(t=>t!==e.id):[...i,e.id]})},P(i,()=>e.name,null),D(n=>{var r=`h-6 cursor-pointer rounded-full border px-2.5 text-[11px] font-medium transition-colors ${t()?`bg-accent-soft text-accent border-accent/40`:`bg-surface-2 text-text-dim border-border hover:bg-surface-3`}`,o=e.color;return r!==n.e&&st(i,n.e=r),o!==n.t&&dt(a,`background`,n.t=o),n},{e:void 0,t:void 0}),i})()}})),e}}),(()=>{var e=K5(),t=e.firstChild;return t.addEventListener(`change`,e=>void r({shareLinearKey:e.currentTarget.checked})),D(()=>t.checked=!!n().shareLinearKey),e})(),j(Lj,{label:`Staging branch`,hint:`Stage buttons on PRs merge the PR branch here — point your staging domain (e.g. preview.ahmedbanihani.com) at this branch in Vercel.`,get children(){return j(jj,{get value(){return n().stagingBranch??``},placeholder:`staging`,onChange:e=>void r({stagingBranch:e.currentTarget.value.trim()||void 0})})}}),j(Lj,{label:`Cursor agent`,hint:`App users in your workspace. Pick Cursor — requires the Cursor integration installed in Linear (workspace admin) with usage-based pricing enabled in Cursor.`,get children(){return j(M,{get when(){return $e(()=>!!m.data)()&&m.data.length===0},get fallback(){return j(Nj,{get value(){return n().cursorAgentId??``},onChange:e=>{let t=e.currentTarget.value;if(!t){r({cursorAgentId:void 0,cursorAgentName:void 0,cursorAgentUrl:void 0});return}let n=m.data?.find(e=>e.id===t);n&&r({cursorAgentId:n.id,cursorAgentName:n.displayName,cursorAgentUrl:n.url??void 0})},get disabled(){return m.isLoading},get children(){return[v7(),j(M,{get when(){return m.data},get children(){return j(We,{get each(){return m.data},children:e=>(()=>{var t=g7();return P(t,()=>e.displayName),D(()=>t.selected=e.id===n().cursorAgentId),D(()=>t.value=e.id),t})()})}})]}})},get children(){return q5()}})}}),j(Lj,{label:`Default repository`,hint:`Appended to delegated issues as [repo=…] so Cursor picks the right repo.`,get children(){return j(jj,{placeholder:`owner/repository`,get value(){return n().defaultRepo??``},onBlur:e=>{r({defaultRepo:e.currentTarget.value.trim()||void 0})}})}}),j(Lj,{label:`Cursor cloud model`,hint:`Appended as [model=…] — e.g. claude-opus-4-8, gpt-5.2, composer. Empty = Cursor's default.`,get children(){return j(jj,{placeholder:`Cursor's default`,get value(){return n().cursorModel??``},onBlur:e=>{r({cursorModel:e.currentTarget.value.trim()||void 0})}})}}),j(Lj,{label:`Agent instructions`,hint:`Appended to every issue as '### Agent instructions' and given to the AI draft. Add demo credentials (username/password) so the agent can log in, test, and record its video. Careful: credentials become visible to everyone who can read the issue.`,get children(){return[j(Mj,{rows:5,placeholder:gD,get value(){return n().issueTemplate??``},onBlur:e=>{r({issueTemplate:e.currentTarget.value.trim()||void 0})}}),J5()]}}),j(Lj,{label:`Dev server log URL`,hint:`Tail of your dev-server log attached to issues (and fed to AI drafts). Serve the log over HTTP: "dev:http": "next dev 2>&1 | tee public/dev-server.log" (gitignore it), then use /dev-server.log here. Empty = disabled.`,get children(){return j(jj,{placeholder:`/dev-server.log`,get value(){return n().logUrl??``},onBlur:e=>{r({logUrl:e.currentTarget.value.trim()||void 0})}})}}),j(Lj,{label:`Log lines to attach`,hint:`Trailing lines included in the issue (10–500).`,get children(){return j(jj,{type:`number`,min:`10`,max:`500`,placeholder:`100`,get value(){return n().logLines??``},onBlur:e=>{let t=Number(e.currentTarget.value);r({logLines:Number.isFinite(t)&&t>0?Math.min(500,Math.max(10,Math.round(t))):void 0})}})}}),j(Lj,{label:`Skills & memory paths`,hint:`One path per line. The cloud agent works in a full repo checkout, so committed paths (e.g. .claude/skills/apple-hig-design-principles) are readable directly — every issue gets a MANDATORY-reading section pointing at them. Repo-relative for cloud agents; absolute paths also work when you paste the issue into a local Claude Code session. Per project: these settings live per dev origin.`,get children(){return j(Mj,{rows:4,placeholder:`.claude/skills/apple-hig-design-principles
|
|
286
286
|
.claude/CLAUDE.md
|
|
287
|
-
docs/design-tokens.md`,get value(){return n().skillPaths??``},onBlur:e=>{r({skillPaths:e.currentTarget.value.trim()||void 0})}})}}),j(Lj,{label:`Test account`,hint:`The cloud agent logs into the app with this while testing and recording its demo. Added to every issue's Agent instructions. Use a throwaway account — it's visible to everyone who can read the issue.`,get children(){var e=K5();return P(e,j(jj,{placeholder:`Username or email (e.g. demo@yourapp.com)`,get value(){return n().testUsername??``},onBlur:e=>{r({testUsername:e.currentTarget.value.trim()||void 0})}}),null),P(e,j(jj,{type:`password`,placeholder:`Password`,get value(){return n().testPassword??``},onBlur:e=>{r({testPassword:e.currentTarget.value.trim()||void 0})}}),null),e}})]}})}}),null),P(e,j(M,{when:!xr,get children(){return j(Rj,{title:`Panel`,get children(){return[(()=>{var e=q5(),t=e.firstChild.nextSibling;return P(t,j(We,{each:[{id:`overlay`,label:`Overlay`},{id:`pinned`,label:`Beside page`}],children:e=>(()=>{var t=o7();return t.$$click=()=>void r({panelMode:e.id,panelPos:void 0}),P(t,()=>e.label),D(()=>st(t,`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors ${(n().panelMode??`overlay`)===e.id?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`)),t})()})),e})(),(()=>{var e=J5(),t=e.firstChild.nextSibling;return P(t,j(We,{each:[`left`,`right`],children:e=>(()=>{var t=o7();return t.$$click=()=>void r({panelSide:e}),P(t,e===`left`?`Left`:`Right`),D(()=>st(t,`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors ${(n().panelSide??`right`)===e?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`)),t})()})),e})()]}})}}),null),P(e,j(Rj,{title:`Local Claude Code`,get children(){return j(Lj,{label:`Bridge URL`,hint:'Run `npx linear-grab-bridge` in your repo\'s terminal (binds localhost only). Enables "Delegate to → Local Claude Code" in Draft, the Local tab, and relays blocked uploads to Linear storage.',get children(){return j(jj,{placeholder:`http://localhost:4577`,get value(){return n().bridgeUrl??``},onBlur:e=>{r({bridgeUrl:e.currentTarget.value.trim()||void 0})}})}})}}),null),P(e,j(Rj,{title:`Project config (.lineargrab.json)`,get children(){return[Y5(),(()=>{var e=Z5();return P(e,j(M,{get when(){return c.data?.projectConfig},get fallback(){return j(zj,{title:`No .lineargrab.json found at the bridge's cwd (or bridge offline / outdated)`,children:`not detected`})},get children(){return[j(zj,{class:`text-success`,children:`detected`}),j(q,{variant:`ghost`,class:`h-7 px-2 text-[11px]`,title:`Overwrite your local settings with every value from the repo's config`,onClick:f,children:`Apply all`})]}}),null),P(e,j(q,{variant:`ghost`,class:`h-7 px-2 text-[11px]`,get title(){return l()?`Copied!`:`Copy your current shareable settings as .lineargrab.json — commit it to the repo root`},onClick:()=>void d(),get children(){var e=X5();return P(e,()=>l()?`Copied ✓`:`Copy config`),e}}),null),e})()]}}),null),P(e,j(Rj,{title:`Asset uploads`,get children(){return[j(Lj,{label:`GitHub token`,hint:`Linear's storage blocks browser uploads in some browsers (Safari). With this set, GIFs/screenshots upload to your GitHub repo instead and embed automatically. Fine-grained PAT with Contents read/write on the assets repo.`,get children(){return j(jj,{type:`password`,placeholder:`github_pat_…`,get value(){return n().githubToken??``},onBlur:e=>{r({githubToken:e.currentTarget.value.trim()||void 0})}})}}),j(Lj,{label:`Assets repository`,hint:`owner/repo — must be PUBLIC so Linear (and agents) can render the images. Files land under linear-grab/.`,get children(){return j(jj,{placeholder:`ahmedbanihanibh/linear-grab-assets`,get value(){return n().githubAssetsRepo??``},onBlur:e=>{r({githubAssetsRepo:e.currentTarget.value.trim()||void 0})}})}})]}}),null),P(e,j(Rj,{title:`Notifications`,get children(){return[j(Lj,{label:`Slack bot token`,hint:`Bot token (xoxb-…) with chat:write + channels:read + files:write. New issues get announced with links + demo, and the AGENT receives the token to post its finished demo video itself.`,get children(){return j(jj,{type:`password`,placeholder:`xoxb-…`,get value(){return n().slackToken??``},onBlur:e=>{r({slackToken:e.currentTarget.value.trim()||void 0})}})}}),j(M,{get when(){return n().slackToken},get children(){return j(Lj,{label:`Slack channel`,get children(){return j(M,{get when(){return!ae.isError},get fallback(){return j(Hj,{message:`Couldn't list channels — check the token scopes (channels:read).`})},get children(){return j(Nj,{get value(){return n().slackChannelId??``},get disabled(){return ae.isLoading},onChange:e=>{let t=e.currentTarget.value,n=ae.data?.find(e=>e.id===t);r({slackChannelId:t||void 0,slackChannelName:n?.name})},get children(){return[Q5(),j(We,{get each(){return ae.data??[]},children:e=>(()=>{var t=g7();return t.firstChild,P(t,()=>e.name,null),D(()=>t.selected=e.id===n().slackChannelId),D(()=>t.value=e.id),t})()})]}})}})}})}}),j(Lj,{label:`Telegram bot token`,hint:`From @BotFather. The agent also receives it to send the demo video (sendVideo).`,get children(){return j(jj,{type:`password`,placeholder:`123456:ABC-…`,get value(){return n().telegramToken??``},onBlur:e=>{r({telegramToken:e.currentTarget.value.trim()||void 0})}})}}),j(M,{get when(){return n().telegramToken},get children(){return j(Lj,{label:`Telegram chat ID`,hint:`Add the bot to your group/channel, send a message, then read the chat id from api.telegram.org/bot<token>/getUpdates.`,get children(){return j(jj,{placeholder:`-1001234567890`,get value(){return n().telegramChatId??``},onBlur:e=>{r({telegramChatId:e.currentTarget.value.trim()||void 0})}})}})}}),(()=>{var e=$5(),t=e.firstChild;return t.addEventListener(`change`,e=>void r({notifyOnCreate:e.currentTarget.checked?void 0:!1})),D(()=>t.checked=n().notifyOnCreate!==!1),e})(),e7()]}}),null),P(e,j(Rj,{title:`AI providers`,get children(){return[j(Lj,{label:`OpenAI API key`,get children(){return j(jj,{type:`password`,placeholder:`sk-…`,get value(){return n().openaiKey??``},onBlur:e=>{r({openaiKey:e.currentTarget.value.trim()||void 0})}})}}),j(Lj,{label:`Anthropic API key`,get children(){return j(jj,{type:`password`,placeholder:`sk-ant-…`,get value(){return n().anthropicKey??``},onBlur:e=>{r({anthropicKey:e.currentTarget.value.trim()||void 0})}})}}),(()=>{var e=t7(),t=e.firstChild.nextSibling.firstChild,i=t.nextSibling,a=i.nextSibling;return t.$$click=()=>void r({preferredProvider:void 0}),i.$$click=()=>void r({preferredProvider:`openai`}),a.$$click=()=>void r({preferredProvider:`anthropic`}),D(e=>{var r=`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors ${n().preferredProvider===void 0?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`,o=`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors disabled:cursor-not-allowed ${n().preferredProvider===`openai`?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer disabled:text-text-faint`}`,s=!n().openaiKey,c=`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors disabled:cursor-not-allowed ${n().preferredProvider===`anthropic`?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer disabled:text-text-faint`}`,l=!n().anthropicKey;return r!==e.e&&st(t,e.e=r),o!==e.t&&st(i,e.t=o),s!==e.a&&(i.disabled=e.a=s),c!==e.o&&st(a,e.o=c),l!==e.i&&(a.disabled=e.i=l),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),e})(),(()=>{var e=r7();return P(e,j(M,{get when(){return se()},get fallback(){return _7()},get children(){var e=n7();return P(e,se),e}})),e})()]}}),null),P(e,j(Rj,{title:`How it works`,get children(){return i7()}}),null),e})()}rt([`click`]);var y7=`linear-grab`,b7=`queries`,x7=[`my-issues`,`issue`,`sessions`,`teams`,`agents`];function S7(){return new Promise(e=>{try{let t=indexedDB.open(y7,1);t.onupgradeneeded=()=>t.result.createObjectStore(b7),t.onsuccess=()=>e(t.result),t.onerror=()=>e(null)}catch{e(null)}})}function C7(e){return typeof e[0]==`string`&&x7.includes(e[0])}async function w7(e){let t=await S7();if(!t)return()=>{};await new Promise(n=>{try{let r=t.transaction(b7,`readonly`).objectStore(b7).openCursor();r.onsuccess=()=>{let t=r.result;if(!t)return n();try{let{queryKey:n,data:r}=t.value;C7(n)&&e.getQueryData(n)===void 0&&e.setQueryData(n,r,{updatedAt:0})}catch{}t.continue()},r.onerror=()=>n()}catch{n()}});let n=new Map,r=e.getQueryCache().subscribe(r=>{if(r.type!==`updated`||r.action.type!==`success`)return;let{queryKey:i,queryHash:a}=r.query;if(!C7(i))return;let o=n.get(a);o&&clearTimeout(o),n.set(a,setTimeout(()=>{n.delete(a);try{let n=e.getQueryData(i);if(n===void 0)return;t.transaction(b7,`readwrite`).objectStore(b7).put({queryKey:i,data:n},a)}catch{}},400))});return()=>{r();for(let e of n.values())clearTimeout(e);t.close()}}Br();var T7=N(`<svg viewBox="0 0 100 100"fill=currentColor aria-hidden><path d="M1.22541 61.5228c-.2225-.9485.90748-1.5459 1.59638-.857L39.3342 97.1782c.6889.6889.0915 1.8189-.857 1.5964C20.0515 94.4522 5.54779 79.9485 1.22541 61.5228ZM.00189135 46.8891c-.01764375.2833.08887215.5599.28957165.7606L52.3503 99.7085c.2007.2007.4773.3075.7606.2896 2.3692-.1476 4.6938-.46 6.9624-.9259.7645-.157 1.0301-1.0963.4782-1.6481L2.57595 39.4485c-.55186-.5519-1.49117-.2863-1.648174.4782-.465915 2.2686-.77832 4.5932-.92588465 6.9624ZM4.21093 29.7054c-.16649.3738-.08169.8106.20765 1.1l64.77602 64.776c.2894.2894.7262.3742 1.1.2077 1.7861-.7956 3.5171-1.6927 5.1855-2.684.5521-.328.6373-1.0867.1832-1.5407L8.43566 24.3367c-.45409-.4541-1.21271-.3689-1.54074.1832-.99132 1.6684-1.88843 3.3994-2.68399 5.1855ZM12.6587 18.074c-.3701-.3701-.393-.9637-.0443-1.3541C21.7795 6.45931 35.1114 0 49.9519 0 77.5927 0 100 22.4073 100 50.0481c0 14.8405-6.4593 28.1724-16.7199 37.3375-.3903.3487-.984.3258-1.3541-.0443L12.6587 18.074Z">`),E7=N(`<button><svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 aria-hidden><rect x=1.5 y=2.5 width=13 height=11 rx=1.5></rect><path d="M10 2.5v11">`),D7=N(`<button aria-label="Minimize to launcher"title="Minimize to launcher"class="text-text-dim hover:text-text hover:bg-surface-3 grid size-6 shrink-0 cursor-pointer place-items-center rounded-md text-[15px] leading-none transition-colors">–`),O7=N(`<div class="bg-bg text-text flex h-full flex-col"><header><span class="text-accent mr-0.5 inline-flex shrink-0"title="Linear Grab"></span><div class="no-scrollbar flex min-w-0 flex-1 items-center gap-1 overflow-x-auto"></div></header><main class="min-h-0 flex-1"><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full>`),k7=N(`<button>`),A7=[{id:`draft`,label:`Draft`},{id:`capture`,label:`Capture`},{id:`activity`,label:`Activity`},{id:`running`,label:`Running`},{id:`cloud`,label:`Cloud`},{id:`local`,label:`Local`},{id:`prs`,label:`PRs`},{id:`design`,label:`Design`},{id:`renders`,label:`Renders`},{id:`settings`,label:`Settings`}],j7=new Set;function M7(e,t,n){if(j7.has(e)||typeof Notification>`u`)return;j7.add(e);let r=()=>new Notification(t,{body:n});Notification.permission===`granted`?r():Notification.permission==="default"&&Notification.requestPermission().then(e=>e===`granted`&&r())}function N7(){setInterval(()=>{PO().then(e=>{for(let t of e){if(t.status!==`running`)continue;let e=t.lastEventAt??t.startedAt;Date.now()-e>10*6e4&&M7(`local-stuck:${t.id}:${e}`,`Local agent may be stuck`,`${t.title.slice(0,80)} — no output for ${Math.round((Date.now()-e)/6e4)}m. Nudge or interrupt it in the Local tab.`)}}).catch(()=>{}),_O().then(e=>{for(let t of e)/awaitingInput|elicit/i.test(t.status)&&M7(`cloud-input:${t.id}`,`Cloud agent needs input`,`${t.issue?.identifier??`Session`} — ${t.issue?.title?.slice(0,80)??`a Cursor agent`} is waiting for you.`)}).catch(()=>{})},6e4)}N7();var P7=new gr({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});function F7(e){return(()=>{var t=T7();return D(n=>{var r=e.size??14,i=e.size??14;return r!==n.e&&it(t,`width`,n.e=r),i!==n.t&&it(t,`height`,n.t=i),n},{e:void 0,t:void 0}),t})()}function I7(e){let[t,n]=T(`draft`),r=()=>{P7.invalidateQueries({queryKey:[`grab`]}),lj()===`capture`&&n(`capture`),e.onGrab?.()};return O(()=>{let e=rj();e&&n(e)}),ie(()=>{let e=w7(P7),t=XZ(r),n=()=>{YO().then(y$),HO(),NO().then(async e=>{if(!e.projectConfig)return;let t=A5(await Tr(),e.projectConfig);t&&await Er(t)}).catch(()=>{})};n();let i=Mr(e=>{e===`settings`&&(P7.invalidateQueries({queryKey:[`settings`]}),n()),e===`grab`&&r()});ae(()=>{t(),i(),e.then(e=>e())})}),j(cr,{client:P7,get children(){var r=O7(),i=r.firstChild,a=i.firstChild,o=a.nextSibling,s=i.nextSibling.firstChild,c=s.nextSibling,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling,f=d.nextSibling,p=f.nextSibling,m=p.nextSibling,h=m.nextSibling,g=h.nextSibling;return i.$$pointerdown=t=>e.onHeaderPointerDown?.(t),P(a,j(F7,{size:14})),P(o,j(We,{each:A7,children:e=>(()=>{var r=k7();return r.$$click=()=>n(e.id),P(r,()=>e.label),D(()=>st(r,`h-6 shrink-0 rounded-md px-2 text-[12px] font-medium whitespace-nowrap transition-colors ${t()===e.id?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`)),r})()})),P(i,j(M,{get when(){return e.onTogglePin},get children(){var t=E7();return t.$$click=()=>e.onTogglePin?.(),D(n=>{var r=e.pinned?`Switch to overlay`:`Dock beside page`,i=e.pinned?`Overlay the page`:`Dock beside page (squeezes the app, DevTools-style)`,a=`hover:bg-surface-3 grid size-6 shrink-0 cursor-pointer place-items-center rounded-md transition-colors ${e.pinned?`text-accent`:`text-text-dim hover:text-text`}`;return r!==n.e&&it(t,`aria-label`,n.e=r),i!==n.t&&it(t,`title`,n.t=i),a!==n.a&&st(t,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t}}),null),P(i,j(M,{get when(){return e.onClose},get children(){var t=D7();return t.$$click=()=>e.onClose?.(),t}}),null),P(s,j(wM,{onCreated:()=>n(`activity`)})),P(c,j(TQ,{})),P(l,j(_1,{})),P(u,j(B1,{})),P(d,j(P1,{})),P(f,j(T0,{})),P(p,j(B0,{onOpenIssue:()=>n(`activity`)})),P(m,j(H3,{})),P(h,j(D5,{})),P(g,j(v7,{})),D(n=>{var r=`border-border bg-surface flex shrink-0 items-center gap-1 border-b px-2 py-1.5 select-none ${e.onHeaderPointerDown?`cursor-grab active:cursor-grabbing`:``}`,a=t()!==`draft`,o=t()!==`capture`,_=t()!==`activity`,v=t()!==`running`,y=t()!==`cloud`,b=t()!==`local`,x=t()!==`prs`,S=t()!==`design`,C=t()!==`renders`,w=t()!==`settings`;return r!==n.e&&st(i,n.e=r),a!==n.t&&s.classList.toggle(`hidden`,n.t=a),o!==n.a&&c.classList.toggle(`hidden`,n.a=o),_!==n.o&&l.classList.toggle(`hidden`,n.o=_),v!==n.i&&u.classList.toggle(`hidden`,n.i=v),y!==n.n&&d.classList.toggle(`hidden`,n.n=y),b!==n.s&&f.classList.toggle(`hidden`,n.s=b),x!==n.h&&p.classList.toggle(`hidden`,n.h=x),S!==n.r&&m.classList.toggle(`hidden`,n.r=S),C!==n.d&&h.classList.toggle(`hidden`,n.d=C),w!==n.l&&g.classList.toggle(`hidden`,n.l=w),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0}),r}})}rt([`pointerdown`,`click`]);var L7=`/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */
|
|
288
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-contain-size:initial;--tw-contain-layout:initial;--tw-contain-paint:initial;--tw-contain-style:initial}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, "SF Mono", Menlo, monospace;--color-red-500:oklch(63.7% .237 25.331);--color-white:#fff;--spacing:.25rem;--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-wide:.025em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--radius-xl:.75rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:#0b0c0e;--color-surface:#141517;--color-surface-2:#1c1d21;--color-surface-3:#24262b;--color-border:#26282d;--color-border-strong:#34363d;--color-text:#e8e9eb;--color-text-dim:#8b8e98;--color-text-faint:#5c5f6a;--color-accent:#5e6ad2;--color-accent-hover:#6e79e0;--color-accent-soft:#5e6ad226;--color-success:#4cb782;--color-warn:#f2c94c;--color-danger:#eb5757;--color-danger-soft:#eb575726}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{inset-block:0}.-top-0{top:0}.-top-0\\.5{top:calc(var(--spacing) * -.5)}.top-0{top:0}.top-0\\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-1\\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-\\[2px\\]{top:2px}.top-full{top:100%}.-right-0{right:0}.-right-0\\.5{right:calc(var(--spacing) * -.5)}.right-0{right:0}.right-0\\.5{right:calc(var(--spacing) * .5)}.right-4{right:calc(var(--spacing) * 4)}.right-full{right:100%}.bottom-0{bottom:0}.bottom-1{bottom:var(--spacing)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-\\[2px\\]{bottom:2px}.bottom-full{bottom:100%}.-left-\\[13\\.5px\\]{left:-13.5px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\\/2{left:50%}.left-\\[5px\\]{left:5px}.left-full{left:100%}.z-1{z-index:1}.z-10{z-index:10}.z-\\[2147483645\\]{z-index:2147483645}.z-\\[2147483646\\]{z-index:2147483646}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.-m-0{margin:0}.-m-0\\.5{margin:calc(var(--spacing) * -.5)}.-m-4{margin:calc(var(--spacing) * -4)}.m-0{margin:0}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.-my-1{margin-block:calc(var(--spacing) * -1)}.-my-1\\.5{margin-block:calc(var(--spacing) * -1.5)}.mt-0{margin-top:0}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-px{margin-top:1px}.mr-0{margin-right:0}.mr-0\\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-2\\.5{margin-right:calc(var(--spacing) * 2.5)}.-mb-4{margin-bottom:calc(var(--spacing) * -4)}.mb-0{margin-bottom:0}.mb-0\\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\\.5{margin-bottom:calc(var(--spacing) * 2.5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-2\\.5{margin-left:calc(var(--spacing) * 2.5)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.ml-px{margin-left:1px}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-5{-webkit-line-clamp:5;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.size-0{width:0;height:0}.size-1{width:var(--spacing);height:var(--spacing)}.size-1\\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-\\[9px\\]{width:9px;height:9px}.size-\\[12px\\]{width:12px;height:12px}.size-\\[16px\\]{width:16px;height:16px}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-16{height:calc(var(--spacing) * 16)}.h-\\[8px\\]{height:8px}.h-\\[17px\\]{height:17px}.h-\\[18px\\]{height:18px}.h-\\[20px\\]{height:20px}.h-\\[24px\\]{height:24px}.h-fit{height:fit-content}.h-full{height:100%}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-44{max-height:calc(var(--spacing) * 44)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\\[28rem\\]{max-height:28rem}.max-h-\\[var\\(--rg-edit-list-max-h\\)\\]{max-height:var(--rg-edit-list-max-h)}.min-h-0{min-height:0}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-\\[2lh\\]{min-height:2lh}.min-h-\\[28px\\]{min-height:28px}.w-1{width:var(--spacing)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-16{width:calc(var(--spacing) * 16)}.w-28{width:calc(var(--spacing) * 28)}.w-72{width:calc(var(--spacing) * 72)}.w-\\[2px\\]{width:2px}.w-\\[Npx\\]{width:Npx}.w-\\[calc\\(100\\%\\+16px\\)\\]{width:calc(100% + 16px)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\\[55\\%\\]{max-width:55%}.max-w-\\[100vw\\]{max-width:100vw}.max-w-\\[110px\\]{max-width:110px}.max-w-\\[280px\\]{max-width:280px}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-\\[3\\.5ch\\]{min-width:3.5ch}.min-w-\\[3ch\\]{min-width:3ch}.min-w-\\[4ch\\]{min-width:4ch}.min-w-\\[5ch\\]{min-width:5ch}.min-w-\\[6ch\\]{min-width:6ch}.min-w-\\[7ch\\]{min-width:7ch}.min-w-\\[8ch\\]{min-width:8ch}.min-w-\\[10ch\\]{min-width:10ch}.min-w-\\[12ch\\]{min-width:12ch}.min-w-\\[36px\\]{min-width:36px}.min-w-\\[52px\\]{min-width:52px}.min-w-\\[100px\\]{min-width:100px}.min-w-\\[150px\\]{min-width:150px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-rotate-90{rotate:-90deg}.rotate-0{rotate:0deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-decimal{list-style-type:decimal}.grid-cols-\\[0fr\\]{grid-template-columns:0fr}.grid-cols-\\[1fr\\]{grid-template-columns:1fr}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:0}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-\\[5px\\]{gap:5px}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\\[1px\\]{border-radius:1px}.rounded-\\[3px\\]{border-radius:3px}.rounded-\\[4px\\]{border-radius:4px}.rounded-\\[5px\\]{border-radius:5px}.rounded-\\[6px\\]{border-radius:6px}.rounded-\\[13px\\]{border-radius:13px}.rounded-\\[14px\\]{border-radius:14px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-\\[10px\\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-\\[10px\\]{border-top-left-radius:10px;border-bottom-left-radius:10px}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-\\[10px\\]{border-top-right-radius:10px;border-bottom-right-radius:10px}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-\\[6px\\]{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.rounded-b-\\[10px\\]{border-bottom-right-radius:10px;border-bottom-left-radius:10px}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.\\[border-width\\:0\\.5px\\]{border-width:.5px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-4{border-top-style:var(--tw-border-style);border-top-width:4px}.\\[border-top-width\\:0\\.5px\\]{border-top-width:.5px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-\\[var\\(--rg-border-button\\)\\]{border-color:var(--rg-border-button)}.border-accent{border-color:var(--color-accent)}.border-accent\\/40{border-color:#5e6ad266}@supports (color:color-mix(in lab, red, red)){.border-accent\\/40{border-color:color-mix(in oklab, var(--color-accent) 40%, transparent)}}.border-border{border-color:var(--color-border)}.border-danger{border-color:var(--color-danger)}.border-danger\\/40{border-color:#eb575766}@supports (color:color-mix(in lab, red, red)){.border-danger\\/40{border-color:color-mix(in oklab, var(--color-danger) 40%, transparent)}}.border-success{border-color:var(--color-success)}.border-success\\/40{border-color:#4cb78266}@supports (color:color-mix(in lab, red, red)){.border-success\\/40{border-color:color-mix(in oklab, var(--color-success) 40%, transparent)}}.border-text-dim{border-color:var(--color-text-dim)}.border-transparent{border-color:#0000}.border-warn{border-color:var(--color-warn)}.border-warn\\/40{border-color:#f2c94c66}@supports (color:color-mix(in lab, red, red)){.border-warn\\/40{border-color:color-mix(in oklab, var(--color-warn) 40%, transparent)}}.border-t-\\[var\\(--rg-border-subtle\\)\\]{border-top-color:var(--rg-border-subtle)}.border-t-transparent{border-top-color:#0000}.bg-\\[var\\(--rg-error-bg\\)\\]{background-color:var(--rg-error-bg)}.bg-\\[var\\(--rg-panel-bg\\)\\]{background-color:var(--rg-panel-bg)}.bg-\\[var\\(--rg-submit-bg\\)\\]{background-color:var(--rg-submit-bg)}.bg-\\[var\\(--rg-surface-active\\)\\]{background-color:var(--rg-surface-active)}.bg-\\[var\\(--rg-surface-hover\\)\\]{background-color:var(--rg-surface-hover)}.bg-\\[var\\(--rg-text-primary\\)\\]{background-color:var(--rg-text-primary)}.bg-\\[var\\(--rg-text-secondary\\)\\]{background-color:var(--rg-text-secondary)}.bg-accent{background-color:var(--color-accent)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-bg{background-color:var(--color-bg)}.bg-bg\\/80{background-color:#0b0c0ecc}@supports (color:color-mix(in lab, red, red)){.bg-bg\\/80{background-color:color-mix(in oklab, var(--color-bg) 80%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-current{background-color:currentColor}.bg-danger{background-color:var(--color-danger)}.bg-danger-soft{background-color:var(--color-danger-soft)}.bg-danger\\/10{background-color:#eb57571a}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/10{background-color:color-mix(in oklab, var(--color-danger) 10%, transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-success{background-color:var(--color-success)}.bg-surface{background-color:var(--color-surface)}.bg-surface-2{background-color:var(--color-surface-2)}.bg-surface-3{background-color:var(--color-surface-3)}.bg-text-faint{background-color:var(--color-text-faint)}.bg-transparent{background-color:#0000}.bg-warn{background-color:var(--color-warn)}.bg-warn\\/10{background-color:#f2c94c1a}@supports (color:color-mix(in lab, red, red)){.bg-warn\\/10{background-color:color-mix(in oklab, var(--color-warn) 10%, transparent)}}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\.5{padding:calc(var(--spacing) * 2.5)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:0}.px-0\\.25{padding-inline:calc(var(--spacing) * .25)}.px-1{padding-inline:var(--spacing)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-\\[3px\\]{padding-inline:3px}.py-0{padding-block:0}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-0\\.25{padding-block:calc(var(--spacing) * .25)}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-px{padding-block:1px}.pt-0{padding-top:0}.pt-0\\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-1\\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1{padding-right:var(--spacing)}.pr-1\\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-1{padding-bottom:var(--spacing)}.pb-1\\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-0{padding-left:0}.pl-0\\.5{padding-left:calc(var(--spacing) * .5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-end{text-align:end}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-\\[9\\.5px\\]{font-size:9.5px}.text-\\[9px\\]{font-size:9px}.text-\\[10\\.5px\\]{font-size:10.5px}.text-\\[10px\\]{font-size:10px}.text-\\[11\\.5px\\]{font-size:11.5px}.text-\\[11px\\]{font-size:11px}.text-\\[12\\.5px\\]{font-size:12.5px}.text-\\[12px\\]{font-size:12px}.text-\\[13px\\]{font-size:13px}.text-\\[15px\\]{font-size:15px}.leading-3{--tw-leading:calc(var(--spacing) * 3);line-height:calc(var(--spacing) * 3)}.leading-3\\.5{--tw-leading:calc(var(--spacing) * 3.5);line-height:calc(var(--spacing) * 3.5)}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-normal{overflow-wrap:normal;word-break:normal}.break-words,.wrap-break-word{overflow-wrap:break-word}.break-all{word-break:break-all}.break-keep{word-break:keep-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-break-spaces{white-space:break-spaces}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-\\[var\\(--rg-error-text\\)\\]{color:var(--rg-error-text)}.text-\\[var\\(--rg-submit-fg\\)\\]{color:var(--rg-submit-fg)}.text-\\[var\\(--rg-text-primary\\)\\]{color:var(--rg-text-primary)}.text-\\[var\\(--rg-text-primary-85\\)\\]{color:var(--rg-text-primary-85)}.text-\\[var\\(--rg-text-secondary\\)\\]{color:var(--rg-text-secondary)}.text-accent{color:var(--color-accent)}.text-danger{color:var(--color-danger)}.text-success{color:var(--color-success)}.text-text{color:var(--color-text)}.text-text-dim{color:var(--color-text-dim)}.text-text-faint{color:var(--color-text-faint)}.text-warn{color:var(--color-warn)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-accent{accent-color:var(--color-accent)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.\\[box-shadow\\:var\\(--rg-shadow\\)\\]{box-shadow:var(--rg-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.\\[filter\\:var\\(--rg-drop-shadow\\)\\]{filter:var(--rg-drop-shadow)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[grid-template-columns\\]{transition-property:grid-template-columns;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[padding\\,border-radius\\,transform\\]{transition-property:padding,border-radius,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[top\\,left\\,width\\,height\\,opacity\\,border-radius\\]{transition-property:top,left,width,height,opacity,border-radius;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[transform\\,color\\]{transition-property:transform,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[transform\\,opacity\\]{transition-property:transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.delay-\\[80ms\\]{transition-delay:80ms}.duration-60{--tw-duration:60ms;transition-duration:60ms}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-120{--tw-duration:.12s;transition-duration:.12s}.duration-140{--tw-duration:.14s;transition-duration:.14s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-180{--tw-duration:.18s;transition-duration:.18s}.duration-220{--tw-duration:.22s;transition-duration:.22s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-400{--tw-duration:.4s;transition-duration:.4s}.ease-\\[cubic-bezier\\(0\\,0\\,0\\.2\\,1\\)\\]{--tw-ease:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-\\[opacity\\,transform\\]{will-change:opacity,transform}.will-change-transform{will-change:transform}.contain-layout{--tw-contain-layout:layout;contain:var(--tw-contain-size,) var(--tw-contain-layout,) var(--tw-contain-paint,) var(--tw-contain-style,)}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.\\[corner-shape\\:superellipse\\(1\\.25\\)\\]{corner-shape:superellipse(1.25)}.\\[font-synthesis\\:none\\]{font-synthesis:none}.group-open\\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}@media (hover:hover){.group-hover\\:text-\\[var\\(--rg-text-primary\\)\\]:is(:where(.group):hover *){color:var(--rg-text-primary)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\\:text-text-faint::placeholder{color:var(--color-text-faint)}@media (hover:hover){.hover\\:bg-\\[var\\(--rg-error-bg-hover\\)\\]:hover{background-color:var(--rg-error-bg-hover)}.hover\\:bg-\\[var\\(--rg-surface-active\\)\\]:hover{background-color:var(--rg-surface-active)}.hover\\:bg-\\[var\\(--rg-surface-hover\\)\\]:hover{background-color:var(--rg-surface-hover)}.hover\\:bg-accent-hover:hover{background-color:var(--color-accent-hover)}.hover\\:bg-accent\\/50:hover{background-color:#5e6ad280}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/50:hover{background-color:color-mix(in oklab, var(--color-accent) 50%, transparent)}}.hover\\:bg-danger\\/30:hover{background-color:#eb57574d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/30:hover{background-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.hover\\:bg-surface-2:hover{background-color:var(--color-surface-2)}.hover\\:bg-surface-3:hover{background-color:var(--color-surface-3)}.hover\\:text-\\[var\\(--rg-text-primary\\)\\]:hover{color:var(--rg-text-primary)}.hover\\:text-accent:hover{color:var(--color-accent)}.hover\\:text-danger:hover{color:var(--color-danger)}.hover\\:text-text:hover{color:var(--color-text)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-80:hover{opacity:.8}}.focus\\:border-accent:focus{border-color:var(--color-accent)}.active\\:cursor-grabbing:active{cursor:grabbing}.active\\:bg-accent:active{background-color:var(--color-accent)}.active\\:transition-none:active{transition-property:none}.disabled\\:cursor-default:disabled{cursor:default}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:bg-surface-3:disabled{background-color:var(--color-surface-3)}.disabled\\:text-text-faint:disabled{color:var(--color-text-faint)}.disabled\\:opacity-40:disabled{opacity:.4}@media (hover:hover){.disabled\\:hover\\:bg-surface-2:disabled:hover{background-color:var(--color-surface-2)}}.data-\\[state\\=on\\]\\:transition-none[data-state=on],.data-\\[state\\=open\\]\\:transition-none[data-state=open],.data-\\[state\\=…\\]\\:transition-none[data-state=…]{transition-property:none}}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}[data-theme=light],:host([data-theme=light]){--color-bg:#fbfbfc;--color-surface:#fff;--color-surface-2:#f4f4f6;--color-surface-3:#e9e9ee;--color-border:#e2e2e8;--color-border-strong:#cfcfd8;--color-text:#1b1c20;--color-text-dim:#5c5f6a;--color-text-faint:#9a9da8;--color-accent-soft:#5e6ad21f;--color-danger-soft:#eb57571a;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:light){:root:not([data-theme=dark]){--color-bg:#fbfbfc;--color-surface:#fff;--color-surface-2:#f4f4f6;--color-surface-3:#e9e9ee;--color-border:#e2e2e8;--color-border-strong:#cfcfd8;--color-text:#1b1c20;--color-text-dim:#5c5f6a;--color-text-faint:#9a9da8;--color-accent-soft:#5e6ad21f;--color-danger-soft:#eb57571a;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}}body{background-color:var(--color-bg);font-family:var(--font-sans);color:var(--color-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;min-width:320px;margin:0;font-size:13px}@keyframes geist-spinner-fade{0%{opacity:1}to{opacity:.15}}[data-tip]{position:relative}[data-tip]:hover:after{content:attr(data-tip);color:#fff;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;z-index:60;background:#1b1c20;border-radius:6px;max-width:260px;padding:3px 8px;font-size:10.5px;font-weight:500;line-height:1.35;position:absolute;bottom:calc(100% + 6px);left:50%;overflow:hidden;transform:translate(-50%);box-shadow:0 4px 12px #0000004d}[data-tip][data-tip-pos~=right]:hover:after{left:0;transform:none}[data-tip][data-tip-pos~=left]:hover:after{left:auto;right:0;transform:none}[data-tip][data-tip-pos~=bottom]:hover:after{top:calc(100% + 6px);bottom:auto}.no-scrollbar{scrollbar-width:none}.no-scrollbar::-webkit-scrollbar{display:none}.lg-md p{margin:0 0 6px}.lg-md p:last-child{margin-bottom:0}.lg-md a{color:var(--color-accent);word-break:break-all;text-decoration:none}.lg-md a:hover{text-decoration:underline}.lg-md code{background:var(--color-surface-2);border:1px solid var(--color-border);font-family:var(--font-mono);border-radius:4px;padding:0 4px;font-size:11px}.lg-md pre{background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:6px;margin:6px 0;padding:8px;overflow-x:auto}.lg-md pre code{white-space:pre;background:0 0;border:none;padding:0;font-size:11px}.lg-md ul,.lg-md ol{flex-direction:column;gap:2px;margin:4px 0 6px;padding-left:18px;display:flex}.lg-md ul{list-style:outside}.lg-md ol{list-style:decimal}.lg-md h4{margin:8px 0 4px;font-size:12px;font-weight:600}.lg-md lg-media{display:block}.lg-md lg-media img,.lg-md lg-media video{border:1px solid var(--color-border);border-radius:6px;max-width:100%;margin:4px 0}.lg-md video{border:1px solid var(--color-border);background:#000;border-radius:6px;max-width:100%;margin:4px 0}.lg-md img{border:1px solid var(--color-border);border-radius:6px;max-width:100%;margin:4px 0}.lg-md strong{font-weight:600}*{scrollbar-width:thin;scrollbar-color:var(--color-border-strong) transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:var(--color-border-strong);border-radius:4px}::-webkit-scrollbar-track{background:0 0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-contain-size{syntax:"*";inherits:false}@property --tw-contain-layout{syntax:"*";inherits:false}@property --tw-contain-paint{syntax:"*";inherits:false}@property --tw-contain-style{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}`;Br();var R7=N(`<span aria-hidden class="bg-danger size-2 shrink-0 animate-pulse rounded-full">`),z7=N(`<span class="text-text min-w-[5ch] text-[11px] font-medium tabular-nums">`),B7=N(`<button class="bg-accent hover:bg-accent-hover h-7 cursor-pointer rounded-full px-2.5 text-[11px] font-medium text-white transition-colors"><span class="inline-block min-w-[4ch] text-center">Stop`),V7=N(`<p class="text-warn px-1.5 pt-1 pb-1.5 text-[10.5px] font-semibold tracking-wide uppercase">Needs review`),H7=N(`<div><p class="text-text-dim px-1.5 pt-1 pb-1.5 text-[10.5px] font-semibold tracking-wide uppercase">Running agents`),U7=N(`<div class="fixed z-[2147483646] select-none"><div class="bg-surface border-border text-text flex h-9 cursor-grab items-center gap-1 rounded-full border py-1 pr-1 pl-2.5 font-sans shadow-lg active:cursor-grabbing">`),W7=N(`<div><div title="Drag to resize">`),G7=N(`<button title="Open Linear Grab"aria-label="Open Linear Grab"class="text-accent hover:opacity-80 inline-flex cursor-pointer items-center gap-1.5">`),K7=N(`<span class="bg-border h-4 w-px"aria-hidden>`),q7=N(`<span aria-hidden class="bg-warn size-2 rounded-full">`),J7=N(`<span class="text-warn min-w-[3.5ch] text-left text-[11px] font-medium tabular-nums"> rev`),Y7=N(`<button title="Running agents"aria-label="Running agents"class="hover:bg-surface-2 flex h-7 cursor-pointer items-center gap-1.5 rounded-full px-2 transition-colors"><span aria-hidden></span><span>`),X7=N(`<span aria-hidden class="bg-accent size-2 shrink-0 animate-pulse rounded-full">`),Z7=N(`<span class="text-text min-w-[3ch] text-[11px] font-medium tabular-nums">s`),Q7=N(`<span class="text-text-dim min-w-[7ch] text-[11px] tabular-nums"> states`),$7=N(`<p class="text-text-faint px-1.5 pb-1.5 text-[11.5px]">No agents running right now.`),e9=N(`<button class="hover:bg-surface-2 flex w-full cursor-pointer flex-col gap-0.5 rounded-md px-1.5 py-1.5 text-left transition-colors"><span class="flex min-w-0 items-center gap-1.5"><span aria-hidden class="size-1.5 shrink-0 rounded-full"></span><span class="font-mono text-text-dim shrink-0 text-[10.5px]"></span><span class="text-text truncate text-[11.5px]"></span></span><span class="text-text-faint pl-3 text-[10.5px] tabular-nums"> · <!> · `);function t9(e={}){if(typeof window>`u`||window.__LINEAR_GRAB_PAGE__)return;window.__LINEAR_GRAB_PAGE__=!0;let t=()=>{uk(),z2(),Y4(),V8(),JZ();let t=document.createElement(`div`);t.id=`linear-grab-root`,document.body.appendChild(t);let n=e=>{let n=e.composedPath();if(!n.includes(t))return;e.stopImmediatePropagation();let r=n[0];e instanceof KeyboardEvent&&r&&r!==t&&r.dispatchEvent(new KeyboardEvent(e.type,{key:e.key,code:e.code,location:e.location,repeat:e.repeat,isComposing:e.isComposing,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,bubbles:!1,cancelable:!1}))};for(let e of[`keydown`,`keyup`,`keypress`])window.addEventListener(e,n,{capture:!0});let r=t.attachShadow({mode:`open`}),i=document.createElement(`style`);i.textContent=L7,r.appendChild(i);let a=document.createElement(`div`);r.appendChild(a);let o=()=>a.setAttribute(`data-theme`,n9());o(),matchMedia(`(prefers-color-scheme: light)`).addEventListener(`change`,o),nt(()=>j(c9,{get defaultOpen(){return e.defaultOpen??!1}}),a)};document.body?t():document.addEventListener(`DOMContentLoaded`,t,{once:!0})}function n9(){try{let e=[document.body,document.documentElement];for(let t of e){let e=getComputedStyle(t).backgroundColor.match(/rgba?\(([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)(?:[,\s/]+([\d.]+))?/);if(!(!e||e[4]!==void 0&&Number(e[4])===0))return .2126*e[1]+.7152*e[2]+.0722*e[3]>140?`light`:`dark`}}catch{}return matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`}var r9=130,i9=36,a9=380,o9=280,s9=720;function c9(e){let[t,n]=T(e.defaultOpen),[r,i]=T(`right`),[a,o]=T({x:Math.max(8,window.innerWidth-r9-24),y:Math.max(8,window.innerHeight-i9-20)}),[s,c]=T({running:[],review:[]}),l=()=>s().running,u=()=>s().review,[d,f]=T(!1),[p,m]=T(UD().phase),[h,g]=T({active:!1,msLeft:0,total:0,byTrigger:{}}),[_,v]=T(0);ie(()=>{let e=setInterval(()=>{p()===`recording`&&v(Date.now()-(UD().startedAt??Date.now()))},250);ae(()=>clearInterval(e))});let y=e=>{let t=Math.floor(e/1e3);return`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`},[b,x]=T(null),S=e=>({x:Math.min(Math.max(8,e.x),window.innerWidth-r9-8),y:Math.min(Math.max(8,e.y),window.innerHeight-i9-8)}),C=e=>({x:Math.min(Math.max(8-(ne()-80),e.x),window.innerWidth-80),y:Math.min(Math.max(0,e.y),window.innerHeight-80)}),[w,E]=T(!1),[k,ee]=T(`cloud`),[te,A]=T(!1),[ne,re]=T(a9),oe=e=>Math.min(s9,Math.max(o9,Math.min(e,window.innerWidth-60)));O(()=>{let e=document.documentElement,n=t()&&w();e.style.marginRight=n&&r()===`right`?`${ne()}px`:``,e.style.marginLeft=n&&r()===`left`?`${ne()}px`:``}),ae(()=>{document.documentElement.style.marginRight=``,document.documentElement.style.marginLeft=``});let se=()=>{let e=!w();E(e),e&&x(null),Er({panelMode:e?`pinned`:`overlay`,panelPos:void 0})};ie(()=>{Tr().then(e=>{e.panelSide&&i(e.panelSide),e.launcherPos&&o(S(e.launcherPos)),e.panelPos&&x(C(e.panelPos)),e.panelWidth&&re(oe(e.panelWidth)),E(e.panelMode===`pinned`),ee(e.workflowMode??`cloud`)});let e=Mr(e=>{e===`settings`&&Tr().then(e=>{i(e.panelSide??`right`),E(e.panelMode===`pinned`),ee(e.workflowMode??`cloud`)}),e===`grab`&&k()!==`local`&&n(!0)}),t=()=>{A(!0),setTimeout(()=>A(!1),1600)};window.addEventListener(zZ,t);let r=()=>{f(!1),w()||n(!1)};window.addEventListener(BZ,r);let s=()=>n(!0);window.addEventListener(`linear-grab:picker-finished`,s),ae(()=>{window.removeEventListener(zZ,t),window.removeEventListener(BZ,r),window.removeEventListener(`linear-grab:picker-finished`,s)});let l=e$(c);ae(i2(g));let u=UD().phase,d=WD(e=>{m(e.phase),e.phase===`recording`&&u!==`recording`&&!w()&&n(!1),e.phase===`ready`&&u!==`ready`&&(sj(`capture`),n(!0)),u=e.phase}),p=()=>{o(S(a()));let e=b();e&&x(C(e))};window.addEventListener(`resize`,p),ae(()=>{e(),l(),d(),window.removeEventListener(`resize`,p)})});let ce=!1,le=e=>{if(e.button!==0)return;let t={x:e.clientX,y:e.clientY},n=a();ce=!1;let r=e=>{let r=e.clientX-t.x,i=e.clientY-t.y;Math.abs(r)+Math.abs(i)>4&&(ce=!0),ce&&o(S({x:n.x+r,y:n.y+i}))},i=()=>{window.removeEventListener(`pointermove`,r),window.removeEventListener(`pointerup`,i),ce&&Er({launcherPos:a()}),setTimeout(()=>{ce=!1},0)};window.addEventListener(`pointermove`,r),window.addEventListener(`pointerup`,i)},ue=()=>a().y>260,de=e=>{f(!1),sj(`activity`,e),n(!0)},fe=e=>{if(e.button!==0)return;e.preventDefault(),e.stopPropagation();let t=e.clientX,n=ne(),i=b(),a=e=>{let a=e.clientX-t,o=r()===`right`?-a:a,s=oe(n+o);re(s),i&&r()===`right`&&x(C({x:i.x+(n-s),y:i.y}))},o=()=>{window.removeEventListener(`pointermove`,a),window.removeEventListener(`pointerup`,o),Er({panelWidth:ne(),...b()?{panelPos:b()}:{}})};window.addEventListener(`pointermove`,a),window.addEventListener(`pointerup`,o)},pe=e=>{if(e.button!==0)return;if(e.detail===2){x(null),Er({panelPos:void 0});return}let t={x:e.clientX,y:e.clientY},n=b()??{x:r()===`right`?window.innerWidth-ne():0,y:0},i=!1,a=e=>{let r=e.clientX-t.x,a=e.clientY-t.y;Math.abs(r)+Math.abs(a)>4&&(i=!0),i&&x(C({x:n.x+r,y:n.y+a}))},o=()=>{window.removeEventListener(`pointermove`,a),window.removeEventListener(`pointerup`,o);let e=b();i&&e&&Er({panelPos:e})};window.addEventListener(`pointermove`,a),window.addEventListener(`pointerup`,o)};return[j(M,{get when(){return!t()},get children(){var e=U7(),t=e.firstChild;return t.$$click=()=>{ce||p()===`recording`||h().active||(f(!1),n(!0))},t.$$pointerdown=le,P(t,j(M,{get when(){return p()===`recording`||h().active},get fallback(){return[(()=>{var e=G7();return e.$$click=()=>{ce||(f(!1),n(!0))},P(e,j(F7,{size:13})),e})(),K7(),(()=>{var e=Y7(),t=e.firstChild,n=t.nextSibling;return e.$$click=e=>{e.stopPropagation(),!ce&&f(e=>!e)},P(n,(()=>{var e=$e(()=>!!te());return()=>e()?`Copied ✓`:`${l().length} run`})()),P(e,j(M,{get when(){return $e(()=>!te())()&&u().length>0},get children(){return[q7(),(()=>{var e=J7(),t=e.firstChild;return P(e,()=>u().length,t),e})()]}}),null),D(e=>{var r=`size-2 rounded-full ${te()?`bg-success`:l().length?`bg-success animate-pulse`:`bg-text-faint`}`,i=`min-w-[3.5ch] text-left text-[11px] font-medium tabular-nums ${te()?`text-success`:`text-text-dim`}`;return r!==e.e&&st(t,e.e=r),i!==e.t&&st(n,e.t=i),e},{e:void 0,t:void 0}),e})()]},get children(){return j(M,{get when(){return p()===`recording`},get fallback(){return[X7(),(()=>{var e=Z7(),t=e.firstChild;return P(e,()=>Math.ceil(h().msLeft/1e3),t),e})(),(()=>{var e=Q7(),t=e.firstChild;return P(e,()=>h().total,t),D(()=>it(e,`title`,Object.entries(h().byTrigger).map(([e,t])=>`${t} ${e}`).join(` · `)||`hover / open the component to record its states`)),e})(),(()=>{var e=B7();return e.$$click=e=>{e.stopPropagation(),!ce&&o2()},e})()]},get children(){return[R7(),(()=>{var e=z7();return P(e,()=>y(_())),e})(),(()=>{var e=B7();return e.$$click=()=>{ce||tO()},e})()]}})}})),P(e,j(M,{get when(){return d()},get children(){var e=H7(),t=e.firstChild;return P(e,j(M,{get when(){return u().length>0},get children(){return[V7(),j(We,{get each(){return u()},children:e=>j(l9,{agent:e,review:!0,onOpen:de})})]}}),t),P(e,j(M,{get when(){return l().length>0},get fallback(){return $7()},get children(){return j(We,{get each(){return l()},children:e=>j(l9,{agent:e,onOpen:de})})}}),null),D(()=>st(e,`bg-surface border-border absolute w-72 rounded-lg border p-1.5 font-sans shadow-2xl ${ue()?`bottom-full mb-2`:`top-full mt-2`} ${a().x>window.innerWidth-300?`right-0`:`left-0`}`)),e}}),null),D(t=>{var n=`${a().x}px`,r=`${a().y}px`;return n!==t.e&&dt(e,`left`,t.e=n),r!==t.t&&dt(e,`top`,t.t=r),t},{e:void 0,t:void 0}),e}}),j(M,{get when(){return t()},get children(){var e=W7(),t=e.firstChild;return t.$$pointerdown=fe,P(e,j(I7,{onGrab:()=>n(!0),onClose:()=>n(!1),get onHeaderPointerDown(){return w()?void 0:pe},get pinned(){return w()},onTogglePin:se}),null),D(n=>{var i=`bg-bg text-text border-border fixed z-[2147483645] flex max-w-[100vw] flex-col overflow-hidden font-sans text-[13px] antialiased ${w()?``:`shadow-2xl`} ${!w()&&b()?`rounded-xl border`:r()===`right`?`top-0 right-0 h-screen border-l`:`top-0 left-0 h-screen border-r`}`,a={width:`${ne()}px`,...!w()&&b()?{left:`${b().x}px`,top:`${b().y}px`,height:`${Math.min(680,window.innerHeight-16)}px`}:{}},o=`hover:bg-accent/50 active:bg-accent absolute top-0 z-10 h-full w-1 cursor-col-resize transition-colors ${r()===`right`?`left-0`:`right-0`}`;return i!==n.e&&st(e,n.e=i),n.t=ut(e,a,n.t),o!==n.a&&st(t,n.a=o),n},{e:void 0,t:void 0,a:void 0}),e}})]}function l9(e){return(()=>{var t=e9(),n=t.firstChild,r=n.firstChild,i=r.nextSibling,a=i.nextSibling,o=n.nextSibling,s=o.firstChild,c=s.nextSibling;return c.nextSibling,t.$$click=()=>e.onOpen(e.agent.id),P(i,()=>e.agent.identifier),P(a,()=>e.agent.title),P(o,(()=>{var t=$e(()=>!!e.review);return()=>t()?`PR ready · needs review`:e.agent.stateName})(),s),P(o,()=>e.agent.delegateName,c),P(o,()=>u9(e.agent.updatedAt),null),D(t=>dt(r,`background`,e.review?`var(--color-warn)`:e.agent.stateColor)),t})()}function u9(e){let t=Math.max(0,Math.floor((Date.now()-Date.parse(e))/1e3));return t<60?`now`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}rt([`pointerdown`,`click`]),t9()})();
|
|
287
|
+
docs/design-tokens.md`,get value(){return n().skillPaths??``},onBlur:e=>{r({skillPaths:e.currentTarget.value.trim()||void 0})}})}}),j(Lj,{label:`Test account`,hint:`The cloud agent logs into the app with this while testing and recording its demo. Added to every issue's Agent instructions. Use a throwaway account — it's visible to everyone who can read the issue.`,get children(){var e=Y5();return P(e,j(jj,{placeholder:`Username or email (e.g. demo@yourapp.com)`,get value(){return n().testUsername??``},onBlur:e=>{r({testUsername:e.currentTarget.value.trim()||void 0})}}),null),P(e,j(jj,{type:`password`,placeholder:`Password`,get value(){return n().testPassword??``},onBlur:e=>{r({testPassword:e.currentTarget.value.trim()||void 0})}}),null),e}})]}})}}),null),P(e,j(M,{when:!xr,get children(){return j(Rj,{title:`Panel`,get children(){return[(()=>{var e=X5(),t=e.firstChild.nextSibling;return P(t,j(We,{each:[{id:`overlay`,label:`Overlay`},{id:`pinned`,label:`Beside page`}],children:e=>(()=>{var t=l7();return t.$$click=()=>void r({panelMode:e.id,panelPos:void 0}),P(t,()=>e.label),D(()=>st(t,`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors ${(n().panelMode??`overlay`)===e.id?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`)),t})()})),e})(),(()=>{var e=Z5(),t=e.firstChild.nextSibling;return P(t,j(We,{each:[`left`,`right`],children:e=>(()=>{var t=l7();return t.$$click=()=>void r({panelSide:e}),P(t,e===`left`?`Left`:`Right`),D(()=>st(t,`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors ${(n().panelSide??`right`)===e?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`)),t})()})),e})()]}})}}),null),P(e,j(Rj,{title:`Local Claude Code`,get children(){return j(Lj,{label:`Bridge URL`,hint:'Run `npx linear-grab-bridge` in your repo\'s terminal (binds localhost only). Enables "Delegate to → Local Claude Code" in Draft, the Local tab, and relays blocked uploads to Linear storage.',get children(){return j(jj,{placeholder:`http://localhost:4577`,get value(){return n().bridgeUrl??``},onBlur:e=>{r({bridgeUrl:e.currentTarget.value.trim()||void 0})}})}})}}),null),P(e,j(Rj,{title:`Project config (.lineargrab.json)`,get children(){return[Q5(),(()=>{var e=e7();return P(e,j(M,{get when(){return c.data?.projectConfig},get fallback(){return j(zj,{title:`No .lineargrab.json found at the bridge's cwd (or bridge offline / outdated)`,children:`not detected`})},get children(){return[j(zj,{class:`text-success`,children:`detected`}),j(q,{variant:`ghost`,class:`h-7 px-2 text-[11px]`,title:`Overwrite your local settings with every value from the repo's config`,onClick:f,children:`Apply all`})]}}),null),P(e,j(q,{variant:`ghost`,class:`h-7 px-2 text-[11px]`,get title(){return l()?`Copied!`:`Copy your current shareable settings as .lineargrab.json — commit it to the repo root`},onClick:()=>void d(),get children(){var e=$5();return P(e,()=>l()?`Copied ✓`:`Copy config`),e}}),null),e})()]}}),null),P(e,j(Rj,{title:`Asset uploads`,get children(){return[j(Lj,{label:`GitHub token`,hint:`Linear's storage blocks browser uploads in some browsers (Safari). With this set, GIFs/screenshots upload to your GitHub repo instead and embed automatically. Fine-grained PAT with Contents read/write on the assets repo.`,get children(){return j(jj,{type:`password`,placeholder:`github_pat_…`,get value(){return n().githubToken??``},onBlur:e=>{r({githubToken:e.currentTarget.value.trim()||void 0})}})}}),j(Lj,{label:`Assets repository`,hint:`owner/repo — must be PUBLIC so Linear (and agents) can render the images. Files land under linear-grab/.`,get children(){return j(jj,{placeholder:`ahmedbanihanibh/linear-grab-assets`,get value(){return n().githubAssetsRepo??``},onBlur:e=>{r({githubAssetsRepo:e.currentTarget.value.trim()||void 0})}})}})]}}),null),P(e,j(Rj,{title:`Notifications`,get children(){return[j(Lj,{label:`Slack bot token`,hint:`Bot token (xoxb-…) with chat:write + channels:read + files:write. New issues get announced with links + demo, and the AGENT receives the token to post its finished demo video itself.`,get children(){return j(jj,{type:`password`,placeholder:`xoxb-…`,get value(){return n().slackToken??``},onBlur:e=>{r({slackToken:e.currentTarget.value.trim()||void 0})}})}}),j(M,{get when(){return n().slackToken},get children(){return j(Lj,{label:`Slack channel`,get children(){return j(M,{get when(){return!ae.isError},get fallback(){return j(Hj,{message:`Couldn't list channels — check the token scopes (channels:read).`})},get children(){return j(Nj,{get value(){return n().slackChannelId??``},get disabled(){return ae.isLoading},onChange:e=>{let t=e.currentTarget.value,n=ae.data?.find(e=>e.id===t);r({slackChannelId:t||void 0,slackChannelName:n?.name})},get children(){return[t7(),j(We,{get each(){return ae.data??[]},children:e=>(()=>{var t=y7();return t.firstChild,P(t,()=>e.name,null),D(()=>t.selected=e.id===n().slackChannelId),D(()=>t.value=e.id),t})()})]}})}})}})}}),j(Lj,{label:`Telegram bot token`,hint:`From @BotFather. The agent also receives it to send the demo video (sendVideo).`,get children(){return j(jj,{type:`password`,placeholder:`123456:ABC-…`,get value(){return n().telegramToken??``},onBlur:e=>{r({telegramToken:e.currentTarget.value.trim()||void 0})}})}}),j(M,{get when(){return n().telegramToken},get children(){return j(Lj,{label:`Telegram chat ID`,hint:`Add the bot to your group/channel, send a message, then read the chat id from api.telegram.org/bot<token>/getUpdates.`,get children(){return j(jj,{placeholder:`-1001234567890`,get value(){return n().telegramChatId??``},onBlur:e=>{r({telegramChatId:e.currentTarget.value.trim()||void 0})}})}})}}),(()=>{var e=n7(),t=e.firstChild;return t.addEventListener(`change`,e=>void r({notifyOnCreate:e.currentTarget.checked?void 0:!1})),D(()=>t.checked=n().notifyOnCreate!==!1),e})(),r7()]}}),null),P(e,j(Rj,{title:`AI providers`,get children(){return[j(Lj,{label:`OpenAI API key`,get children(){return j(jj,{type:`password`,placeholder:`sk-…`,get value(){return n().openaiKey??``},onBlur:e=>{r({openaiKey:e.currentTarget.value.trim()||void 0})}})}}),j(Lj,{label:`Anthropic API key`,get children(){return j(jj,{type:`password`,placeholder:`sk-ant-…`,get value(){return n().anthropicKey??``},onBlur:e=>{r({anthropicKey:e.currentTarget.value.trim()||void 0})}})}}),(()=>{var e=i7(),t=e.firstChild.nextSibling.firstChild,i=t.nextSibling,a=i.nextSibling;return t.$$click=()=>void r({preferredProvider:void 0}),i.$$click=()=>void r({preferredProvider:`openai`}),a.$$click=()=>void r({preferredProvider:`anthropic`}),D(e=>{var r=`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors ${n().preferredProvider===void 0?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`,o=`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors disabled:cursor-not-allowed ${n().preferredProvider===`openai`?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer disabled:text-text-faint`}`,s=!n().openaiKey,c=`flex-1 rounded-[5px] px-2 py-0.5 text-[11.5px] font-medium transition-colors disabled:cursor-not-allowed ${n().preferredProvider===`anthropic`?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer disabled:text-text-faint`}`,l=!n().anthropicKey;return r!==e.e&&st(t,e.e=r),o!==e.t&&st(i,e.t=o),s!==e.a&&(i.disabled=e.a=s),c!==e.o&&st(a,e.o=c),l!==e.i&&(a.disabled=e.i=l),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),e})(),(()=>{var e=o7();return P(e,j(M,{get when(){return se()},get fallback(){return b7()},get children(){var e=a7();return P(e,se),e}})),e})()]}}),null),P(e,j(Rj,{title:`How it works`,get children(){return s7()}}),null),e})()}rt([`click`]);var S7=`linear-grab`,C7=`queries`,w7=[`my-issues`,`issue`,`sessions`,`teams`,`agents`];function T7(){return new Promise(e=>{try{let t=indexedDB.open(S7,1);t.onupgradeneeded=()=>t.result.createObjectStore(C7),t.onsuccess=()=>e(t.result),t.onerror=()=>e(null)}catch{e(null)}})}function E7(e){return typeof e[0]==`string`&&w7.includes(e[0])}async function D7(e){let t=await T7();if(!t)return()=>{};await new Promise(n=>{try{let r=t.transaction(C7,`readonly`).objectStore(C7).openCursor();r.onsuccess=()=>{let t=r.result;if(!t)return n();try{let{queryKey:n,data:r}=t.value;E7(n)&&e.getQueryData(n)===void 0&&e.setQueryData(n,r,{updatedAt:0})}catch{}t.continue()},r.onerror=()=>n()}catch{n()}});let n=new Map,r=e.getQueryCache().subscribe(r=>{if(r.type!==`updated`||r.action.type!==`success`)return;let{queryKey:i,queryHash:a}=r.query;if(!E7(i))return;let o=n.get(a);o&&clearTimeout(o),n.set(a,setTimeout(()=>{n.delete(a);try{let n=e.getQueryData(i);if(n===void 0)return;t.transaction(C7,`readwrite`).objectStore(C7).put({queryKey:i,data:n},a)}catch{}},400))});return()=>{r();for(let e of n.values())clearTimeout(e);t.close()}}Br();var O7=N(`<svg viewBox="0 0 100 100"fill=currentColor aria-hidden><path d="M1.22541 61.5228c-.2225-.9485.90748-1.5459 1.59638-.857L39.3342 97.1782c.6889.6889.0915 1.8189-.857 1.5964C20.0515 94.4522 5.54779 79.9485 1.22541 61.5228ZM.00189135 46.8891c-.01764375.2833.08887215.5599.28957165.7606L52.3503 99.7085c.2007.2007.4773.3075.7606.2896 2.3692-.1476 4.6938-.46 6.9624-.9259.7645-.157 1.0301-1.0963.4782-1.6481L2.57595 39.4485c-.55186-.5519-1.49117-.2863-1.648174.4782-.465915 2.2686-.77832 4.5932-.92588465 6.9624ZM4.21093 29.7054c-.16649.3738-.08169.8106.20765 1.1l64.77602 64.776c.2894.2894.7262.3742 1.1.2077 1.7861-.7956 3.5171-1.6927 5.1855-2.684.5521-.328.6373-1.0867.1832-1.5407L8.43566 24.3367c-.45409-.4541-1.21271-.3689-1.54074.1832-.99132 1.6684-1.88843 3.3994-2.68399 5.1855ZM12.6587 18.074c-.3701-.3701-.393-.9637-.0443-1.3541C21.7795 6.45931 35.1114 0 49.9519 0 77.5927 0 100 22.4073 100 50.0481c0 14.8405-6.4593 28.1724-16.7199 37.3375-.3903.3487-.984.3258-1.3541-.0443L12.6587 18.074Z">`),k7=N(`<button><svg width=12 height=12 viewBox="0 0 16 16"fill=none stroke=currentColor stroke-width=1.5 aria-hidden><rect x=1.5 y=2.5 width=13 height=11 rx=1.5></rect><path d="M10 2.5v11">`),A7=N(`<button aria-label="Minimize to launcher"title="Minimize to launcher"class="text-text-dim hover:text-text hover:bg-surface-3 grid size-6 shrink-0 cursor-pointer place-items-center rounded-md text-[15px] leading-none transition-colors">–`),j7=N(`<div class="bg-bg text-text flex h-full flex-col"><header><span class="text-accent mr-0.5 inline-flex shrink-0"title="Linear Grab"></span><div class="no-scrollbar flex min-w-0 flex-1 items-center gap-1 overflow-x-auto"></div></header><main class="min-h-0 flex-1"><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full></div><div class=h-full>`),M7=N(`<button>`),N7=[{id:`draft`,label:`Draft`},{id:`capture`,label:`Capture`},{id:`activity`,label:`Activity`},{id:`running`,label:`Running`},{id:`cloud`,label:`Cloud`},{id:`local`,label:`Local`},{id:`prs`,label:`PRs`},{id:`design`,label:`Design`},{id:`renders`,label:`Renders`},{id:`settings`,label:`Settings`}],P7=new Set;function F7(e,t,n){if(P7.has(e)||typeof Notification>`u`)return;P7.add(e);let r=()=>new Notification(t,{body:n});Notification.permission===`granted`?r():Notification.permission==="default"&&Notification.requestPermission().then(e=>e===`granted`&&r())}function I7(){setInterval(()=>{PO().then(e=>{for(let t of e){if(t.status!==`running`)continue;let e=t.lastEventAt??t.startedAt;Date.now()-e>10*6e4&&F7(`local-stuck:${t.id}:${e}`,`Local agent may be stuck`,`${t.title.slice(0,80)} — no output for ${Math.round((Date.now()-e)/6e4)}m. Nudge or interrupt it in the Local tab.`)}}).catch(()=>{}),_O().then(e=>{for(let t of e)/awaitingInput|elicit/i.test(t.status)&&F7(`cloud-input:${t.id}`,`Cloud agent needs input`,`${t.issue?.identifier??`Session`} — ${t.issue?.title?.slice(0,80)??`a Cursor agent`} is waiting for you.`)}).catch(()=>{})},6e4)}I7();var L7=new gr({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});function R7(e){return(()=>{var t=O7();return D(n=>{var r=e.size??14,i=e.size??14;return r!==n.e&&it(t,`width`,n.e=r),i!==n.t&&it(t,`height`,n.t=i),n},{e:void 0,t:void 0}),t})()}function z7(e){let[t,n]=T(`draft`),r=()=>{L7.invalidateQueries({queryKey:[`grab`]}),lj()===`capture`&&n(`capture`),e.onGrab?.()};return O(()=>{let e=rj();e&&n(e)}),ie(()=>{let e=D7(L7),t=XZ(r),n=()=>{YO().then(y$),HO(),NO().then(async e=>{if(!e.projectConfig)return;let t=N5(await Tr(),e.projectConfig);t&&await Er(t)}).catch(()=>{})};n();let i=Mr(e=>{e===`settings`&&(L7.invalidateQueries({queryKey:[`settings`]}),n()),e===`grab`&&r()});ae(()=>{t(),i(),e.then(e=>e())})}),j(cr,{client:L7,get children(){var r=j7(),i=r.firstChild,a=i.firstChild,o=a.nextSibling,s=i.nextSibling.firstChild,c=s.nextSibling,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling,f=d.nextSibling,p=f.nextSibling,m=p.nextSibling,h=m.nextSibling,g=h.nextSibling;return i.$$pointerdown=t=>e.onHeaderPointerDown?.(t),P(a,j(R7,{size:14})),P(o,j(We,{each:N7,children:e=>(()=>{var r=M7();return r.$$click=()=>n(e.id),P(r,()=>e.label),D(()=>st(r,`h-6 shrink-0 rounded-md px-2 text-[12px] font-medium whitespace-nowrap transition-colors ${t()===e.id?`bg-surface-3 text-text`:`text-text-dim hover:text-text cursor-pointer`}`)),r})()})),P(i,j(M,{get when(){return e.onTogglePin},get children(){var t=k7();return t.$$click=()=>e.onTogglePin?.(),D(n=>{var r=e.pinned?`Switch to overlay`:`Dock beside page`,i=e.pinned?`Overlay the page`:`Dock beside page (squeezes the app, DevTools-style)`,a=`hover:bg-surface-3 grid size-6 shrink-0 cursor-pointer place-items-center rounded-md transition-colors ${e.pinned?`text-accent`:`text-text-dim hover:text-text`}`;return r!==n.e&&it(t,`aria-label`,n.e=r),i!==n.t&&it(t,`title`,n.t=i),a!==n.a&&st(t,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t}}),null),P(i,j(M,{get when(){return e.onClose},get children(){var t=A7();return t.$$click=()=>e.onClose?.(),t}}),null),P(s,j(wM,{onCreated:()=>n(`activity`)})),P(c,j(TQ,{})),P(l,j(_1,{})),P(u,j(B1,{})),P(d,j(P1,{})),P(f,j(T0,{})),P(p,j(B0,{onOpenIssue:()=>n(`activity`)})),P(m,j(G3,{})),P(h,j(A5,{})),P(g,j(x7,{})),D(n=>{var r=`border-border bg-surface flex shrink-0 items-center gap-1 border-b px-2 py-1.5 select-none ${e.onHeaderPointerDown?`cursor-grab active:cursor-grabbing`:``}`,a=t()!==`draft`,o=t()!==`capture`,_=t()!==`activity`,v=t()!==`running`,y=t()!==`cloud`,b=t()!==`local`,x=t()!==`prs`,S=t()!==`design`,C=t()!==`renders`,w=t()!==`settings`;return r!==n.e&&st(i,n.e=r),a!==n.t&&s.classList.toggle(`hidden`,n.t=a),o!==n.a&&c.classList.toggle(`hidden`,n.a=o),_!==n.o&&l.classList.toggle(`hidden`,n.o=_),v!==n.i&&u.classList.toggle(`hidden`,n.i=v),y!==n.n&&d.classList.toggle(`hidden`,n.n=y),b!==n.s&&f.classList.toggle(`hidden`,n.s=b),x!==n.h&&p.classList.toggle(`hidden`,n.h=x),S!==n.r&&m.classList.toggle(`hidden`,n.r=S),C!==n.d&&h.classList.toggle(`hidden`,n.d=C),w!==n.l&&g.classList.toggle(`hidden`,n.l=w),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0}),r}})}rt([`pointerdown`,`click`]);var B7=`/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */
|
|
288
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-contain-size:initial;--tw-contain-layout:initial;--tw-contain-paint:initial;--tw-contain-style:initial}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, "SF Mono", Menlo, monospace;--color-red-500:oklch(63.7% .237 25.331);--color-white:#fff;--spacing:.25rem;--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-wide:.025em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--radius-xl:.75rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:#0b0c0e;--color-surface:#141517;--color-surface-2:#1c1d21;--color-surface-3:#24262b;--color-border:#26282d;--color-border-strong:#34363d;--color-text:#e8e9eb;--color-text-dim:#8b8e98;--color-text-faint:#5c5f6a;--color-accent:#5e6ad2;--color-accent-hover:#6e79e0;--color-accent-soft:#5e6ad226;--color-success:#4cb782;--color-warn:#f2c94c;--color-danger:#eb5757;--color-danger-soft:#eb575726}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{inset-block:0}.-top-0{top:0}.-top-0\\.5{top:calc(var(--spacing) * -.5)}.top-0{top:0}.top-0\\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-1\\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-\\[2px\\]{top:2px}.top-full{top:100%}.-right-0{right:0}.-right-0\\.5{right:calc(var(--spacing) * -.5)}.right-0{right:0}.right-0\\.5{right:calc(var(--spacing) * .5)}.right-4{right:calc(var(--spacing) * 4)}.right-full{right:100%}.bottom-0{bottom:0}.bottom-1{bottom:var(--spacing)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-\\[2px\\]{bottom:2px}.bottom-full{bottom:100%}.-left-\\[13\\.5px\\]{left:-13.5px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\\/2{left:50%}.left-\\[5px\\]{left:5px}.left-full{left:100%}.z-1{z-index:1}.z-10{z-index:10}.z-\\[2147483645\\]{z-index:2147483645}.z-\\[2147483646\\]{z-index:2147483646}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.-m-0{margin:0}.-m-0\\.5{margin:calc(var(--spacing) * -.5)}.-m-4{margin:calc(var(--spacing) * -4)}.m-0{margin:0}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.-my-1{margin-block:calc(var(--spacing) * -1)}.-my-1\\.5{margin-block:calc(var(--spacing) * -1.5)}.mt-0{margin-top:0}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-px{margin-top:1px}.mr-0{margin-right:0}.mr-0\\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-2\\.5{margin-right:calc(var(--spacing) * 2.5)}.-mb-4{margin-bottom:calc(var(--spacing) * -4)}.mb-0{margin-bottom:0}.mb-0\\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\\.5{margin-bottom:calc(var(--spacing) * 2.5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-2\\.5{margin-left:calc(var(--spacing) * 2.5)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.ml-px{margin-left:1px}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-5{-webkit-line-clamp:5;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.size-0{width:0;height:0}.size-1{width:var(--spacing);height:var(--spacing)}.size-1\\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-\\[9px\\]{width:9px;height:9px}.size-\\[12px\\]{width:12px;height:12px}.size-\\[16px\\]{width:16px;height:16px}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-16{height:calc(var(--spacing) * 16)}.h-\\[8px\\]{height:8px}.h-\\[17px\\]{height:17px}.h-\\[18px\\]{height:18px}.h-\\[20px\\]{height:20px}.h-\\[24px\\]{height:24px}.h-fit{height:fit-content}.h-full{height:100%}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-44{max-height:calc(var(--spacing) * 44)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\\[28rem\\]{max-height:28rem}.max-h-\\[var\\(--rg-edit-list-max-h\\)\\]{max-height:var(--rg-edit-list-max-h)}.min-h-0{min-height:0}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-\\[2lh\\]{min-height:2lh}.min-h-\\[28px\\]{min-height:28px}.w-1{width:var(--spacing)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-16{width:calc(var(--spacing) * 16)}.w-28{width:calc(var(--spacing) * 28)}.w-72{width:calc(var(--spacing) * 72)}.w-\\[2px\\]{width:2px}.w-\\[Npx\\]{width:Npx}.w-\\[calc\\(100\\%\\+16px\\)\\]{width:calc(100% + 16px)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\\[55\\%\\]{max-width:55%}.max-w-\\[100vw\\]{max-width:100vw}.max-w-\\[110px\\]{max-width:110px}.max-w-\\[280px\\]{max-width:280px}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-\\[3\\.5ch\\]{min-width:3.5ch}.min-w-\\[3ch\\]{min-width:3ch}.min-w-\\[4ch\\]{min-width:4ch}.min-w-\\[5ch\\]{min-width:5ch}.min-w-\\[6ch\\]{min-width:6ch}.min-w-\\[7ch\\]{min-width:7ch}.min-w-\\[8ch\\]{min-width:8ch}.min-w-\\[10ch\\]{min-width:10ch}.min-w-\\[12ch\\]{min-width:12ch}.min-w-\\[36px\\]{min-width:36px}.min-w-\\[52px\\]{min-width:52px}.min-w-\\[100px\\]{min-width:100px}.min-w-\\[150px\\]{min-width:150px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-rotate-90{rotate:-90deg}.rotate-0{rotate:0deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-decimal{list-style-type:decimal}.grid-cols-\\[0fr\\]{grid-template-columns:0fr}.grid-cols-\\[1fr\\]{grid-template-columns:1fr}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:0}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-\\[5px\\]{gap:5px}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\\[1px\\]{border-radius:1px}.rounded-\\[3px\\]{border-radius:3px}.rounded-\\[4px\\]{border-radius:4px}.rounded-\\[5px\\]{border-radius:5px}.rounded-\\[6px\\]{border-radius:6px}.rounded-\\[13px\\]{border-radius:13px}.rounded-\\[14px\\]{border-radius:14px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-\\[10px\\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-\\[10px\\]{border-top-left-radius:10px;border-bottom-left-radius:10px}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-\\[10px\\]{border-top-right-radius:10px;border-bottom-right-radius:10px}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-\\[6px\\]{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.rounded-b-\\[10px\\]{border-bottom-right-radius:10px;border-bottom-left-radius:10px}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.\\[border-width\\:0\\.5px\\]{border-width:.5px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-4{border-top-style:var(--tw-border-style);border-top-width:4px}.\\[border-top-width\\:0\\.5px\\]{border-top-width:.5px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-\\[var\\(--rg-border-button\\)\\]{border-color:var(--rg-border-button)}.border-accent{border-color:var(--color-accent)}.border-accent\\/40{border-color:#5e6ad266}@supports (color:color-mix(in lab, red, red)){.border-accent\\/40{border-color:color-mix(in oklab, var(--color-accent) 40%, transparent)}}.border-border{border-color:var(--color-border)}.border-danger{border-color:var(--color-danger)}.border-danger\\/40{border-color:#eb575766}@supports (color:color-mix(in lab, red, red)){.border-danger\\/40{border-color:color-mix(in oklab, var(--color-danger) 40%, transparent)}}.border-success{border-color:var(--color-success)}.border-success\\/40{border-color:#4cb78266}@supports (color:color-mix(in lab, red, red)){.border-success\\/40{border-color:color-mix(in oklab, var(--color-success) 40%, transparent)}}.border-text-dim{border-color:var(--color-text-dim)}.border-transparent{border-color:#0000}.border-warn{border-color:var(--color-warn)}.border-warn\\/40{border-color:#f2c94c66}@supports (color:color-mix(in lab, red, red)){.border-warn\\/40{border-color:color-mix(in oklab, var(--color-warn) 40%, transparent)}}.border-t-\\[var\\(--rg-border-subtle\\)\\]{border-top-color:var(--rg-border-subtle)}.border-t-transparent{border-top-color:#0000}.bg-\\[var\\(--rg-error-bg\\)\\]{background-color:var(--rg-error-bg)}.bg-\\[var\\(--rg-panel-bg\\)\\]{background-color:var(--rg-panel-bg)}.bg-\\[var\\(--rg-submit-bg\\)\\]{background-color:var(--rg-submit-bg)}.bg-\\[var\\(--rg-surface-active\\)\\]{background-color:var(--rg-surface-active)}.bg-\\[var\\(--rg-surface-hover\\)\\]{background-color:var(--rg-surface-hover)}.bg-\\[var\\(--rg-text-primary\\)\\]{background-color:var(--rg-text-primary)}.bg-\\[var\\(--rg-text-secondary\\)\\]{background-color:var(--rg-text-secondary)}.bg-accent{background-color:var(--color-accent)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-bg{background-color:var(--color-bg)}.bg-bg\\/80{background-color:#0b0c0ecc}@supports (color:color-mix(in lab, red, red)){.bg-bg\\/80{background-color:color-mix(in oklab, var(--color-bg) 80%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-current{background-color:currentColor}.bg-danger{background-color:var(--color-danger)}.bg-danger-soft{background-color:var(--color-danger-soft)}.bg-danger\\/10{background-color:#eb57571a}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/10{background-color:color-mix(in oklab, var(--color-danger) 10%, transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-success{background-color:var(--color-success)}.bg-surface{background-color:var(--color-surface)}.bg-surface-2{background-color:var(--color-surface-2)}.bg-surface-3{background-color:var(--color-surface-3)}.bg-text-faint{background-color:var(--color-text-faint)}.bg-transparent{background-color:#0000}.bg-warn{background-color:var(--color-warn)}.bg-warn\\/10{background-color:#f2c94c1a}@supports (color:color-mix(in lab, red, red)){.bg-warn\\/10{background-color:color-mix(in oklab, var(--color-warn) 10%, transparent)}}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\.5{padding:calc(var(--spacing) * 2.5)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:0}.px-0\\.25{padding-inline:calc(var(--spacing) * .25)}.px-1{padding-inline:var(--spacing)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-\\[3px\\]{padding-inline:3px}.py-0{padding-block:0}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-0\\.25{padding-block:calc(var(--spacing) * .25)}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-px{padding-block:1px}.pt-0{padding-top:0}.pt-0\\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-1\\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1{padding-right:var(--spacing)}.pr-1\\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-1{padding-bottom:var(--spacing)}.pb-1\\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-0{padding-left:0}.pl-0\\.5{padding-left:calc(var(--spacing) * .5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-end{text-align:end}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-\\[9\\.5px\\]{font-size:9.5px}.text-\\[9px\\]{font-size:9px}.text-\\[10\\.5px\\]{font-size:10.5px}.text-\\[10px\\]{font-size:10px}.text-\\[11\\.5px\\]{font-size:11.5px}.text-\\[11px\\]{font-size:11px}.text-\\[12\\.5px\\]{font-size:12.5px}.text-\\[12px\\]{font-size:12px}.text-\\[13px\\]{font-size:13px}.text-\\[15px\\]{font-size:15px}.leading-3{--tw-leading:calc(var(--spacing) * 3);line-height:calc(var(--spacing) * 3)}.leading-3\\.5{--tw-leading:calc(var(--spacing) * 3.5);line-height:calc(var(--spacing) * 3.5)}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-normal{overflow-wrap:normal;word-break:normal}.break-words,.wrap-break-word{overflow-wrap:break-word}.break-all{word-break:break-all}.break-keep{word-break:keep-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-break-spaces{white-space:break-spaces}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-\\[var\\(--rg-error-text\\)\\]{color:var(--rg-error-text)}.text-\\[var\\(--rg-submit-fg\\)\\]{color:var(--rg-submit-fg)}.text-\\[var\\(--rg-text-primary\\)\\]{color:var(--rg-text-primary)}.text-\\[var\\(--rg-text-primary-85\\)\\]{color:var(--rg-text-primary-85)}.text-\\[var\\(--rg-text-secondary\\)\\]{color:var(--rg-text-secondary)}.text-accent{color:var(--color-accent)}.text-danger{color:var(--color-danger)}.text-success{color:var(--color-success)}.text-text{color:var(--color-text)}.text-text-dim{color:var(--color-text-dim)}.text-text-faint{color:var(--color-text-faint)}.text-warn{color:var(--color-warn)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-accent{accent-color:var(--color-accent)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.\\[box-shadow\\:var\\(--rg-shadow\\)\\]{box-shadow:var(--rg-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.\\[filter\\:var\\(--rg-drop-shadow\\)\\]{filter:var(--rg-drop-shadow)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[grid-template-columns\\]{transition-property:grid-template-columns;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[padding\\,border-radius\\,transform\\]{transition-property:padding,border-radius,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[top\\,left\\,width\\,height\\,opacity\\,border-radius\\]{transition-property:top,left,width,height,opacity,border-radius;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[transform\\,color\\]{transition-property:transform,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[transform\\,opacity\\]{transition-property:transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.delay-\\[80ms\\]{transition-delay:80ms}.duration-60{--tw-duration:60ms;transition-duration:60ms}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-120{--tw-duration:.12s;transition-duration:.12s}.duration-140{--tw-duration:.14s;transition-duration:.14s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-180{--tw-duration:.18s;transition-duration:.18s}.duration-220{--tw-duration:.22s;transition-duration:.22s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-400{--tw-duration:.4s;transition-duration:.4s}.ease-\\[cubic-bezier\\(0\\,0\\,0\\.2\\,1\\)\\]{--tw-ease:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-\\[opacity\\,transform\\]{will-change:opacity,transform}.will-change-transform{will-change:transform}.contain-layout{--tw-contain-layout:layout;contain:var(--tw-contain-size,) var(--tw-contain-layout,) var(--tw-contain-paint,) var(--tw-contain-style,)}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.\\[corner-shape\\:superellipse\\(1\\.25\\)\\]{corner-shape:superellipse(1.25)}.\\[font-synthesis\\:none\\]{font-synthesis:none}.group-open\\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}@media (hover:hover){.group-hover\\:text-\\[var\\(--rg-text-primary\\)\\]:is(:where(.group):hover *){color:var(--rg-text-primary)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\\:text-text-faint::placeholder{color:var(--color-text-faint)}@media (hover:hover){.hover\\:bg-\\[var\\(--rg-error-bg-hover\\)\\]:hover{background-color:var(--rg-error-bg-hover)}.hover\\:bg-\\[var\\(--rg-surface-active\\)\\]:hover{background-color:var(--rg-surface-active)}.hover\\:bg-\\[var\\(--rg-surface-hover\\)\\]:hover{background-color:var(--rg-surface-hover)}.hover\\:bg-accent-hover:hover{background-color:var(--color-accent-hover)}.hover\\:bg-accent\\/50:hover{background-color:#5e6ad280}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/50:hover{background-color:color-mix(in oklab, var(--color-accent) 50%, transparent)}}.hover\\:bg-danger\\/30:hover{background-color:#eb57574d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/30:hover{background-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.hover\\:bg-surface-2:hover{background-color:var(--color-surface-2)}.hover\\:bg-surface-3:hover{background-color:var(--color-surface-3)}.hover\\:text-\\[var\\(--rg-text-primary\\)\\]:hover{color:var(--rg-text-primary)}.hover\\:text-accent:hover{color:var(--color-accent)}.hover\\:text-danger:hover{color:var(--color-danger)}.hover\\:text-text:hover{color:var(--color-text)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-80:hover{opacity:.8}}.focus\\:border-accent:focus{border-color:var(--color-accent)}.active\\:cursor-grabbing:active{cursor:grabbing}.active\\:bg-accent:active{background-color:var(--color-accent)}.active\\:transition-none:active{transition-property:none}.disabled\\:cursor-default:disabled{cursor:default}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:bg-surface-3:disabled{background-color:var(--color-surface-3)}.disabled\\:text-text-faint:disabled{color:var(--color-text-faint)}.disabled\\:opacity-40:disabled{opacity:.4}@media (hover:hover){.disabled\\:hover\\:bg-surface-2:disabled:hover{background-color:var(--color-surface-2)}}.data-\\[state\\=on\\]\\:transition-none[data-state=on],.data-\\[state\\=open\\]\\:transition-none[data-state=open],.data-\\[state\\=…\\]\\:transition-none[data-state=…]{transition-property:none}}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}[data-theme=light],:host([data-theme=light]){--color-bg:#fbfbfc;--color-surface:#fff;--color-surface-2:#f4f4f6;--color-surface-3:#e9e9ee;--color-border:#e2e2e8;--color-border-strong:#cfcfd8;--color-text:#1b1c20;--color-text-dim:#5c5f6a;--color-text-faint:#9a9da8;--color-accent-soft:#5e6ad21f;--color-danger-soft:#eb57571a;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:light){:root:not([data-theme=dark]){--color-bg:#fbfbfc;--color-surface:#fff;--color-surface-2:#f4f4f6;--color-surface-3:#e9e9ee;--color-border:#e2e2e8;--color-border-strong:#cfcfd8;--color-text:#1b1c20;--color-text-dim:#5c5f6a;--color-text-faint:#9a9da8;--color-accent-soft:#5e6ad21f;--color-danger-soft:#eb57571a;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}}body{background-color:var(--color-bg);font-family:var(--font-sans);color:var(--color-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;min-width:320px;margin:0;font-size:13px}@keyframes geist-spinner-fade{0%{opacity:1}to{opacity:.15}}[data-tip]{position:relative}[data-tip]:hover:after{content:attr(data-tip);color:#fff;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;z-index:60;background:#1b1c20;border-radius:6px;max-width:260px;padding:3px 8px;font-size:10.5px;font-weight:500;line-height:1.35;position:absolute;bottom:calc(100% + 6px);left:50%;overflow:hidden;transform:translate(-50%);box-shadow:0 4px 12px #0000004d}[data-tip][data-tip-pos~=right]:hover:after{left:0;transform:none}[data-tip][data-tip-pos~=left]:hover:after{left:auto;right:0;transform:none}[data-tip][data-tip-pos~=bottom]:hover:after{top:calc(100% + 6px);bottom:auto}.no-scrollbar{scrollbar-width:none}.no-scrollbar::-webkit-scrollbar{display:none}.lg-md p{margin:0 0 6px}.lg-md p:last-child{margin-bottom:0}.lg-md a{color:var(--color-accent);word-break:break-all;text-decoration:none}.lg-md a:hover{text-decoration:underline}.lg-md code{background:var(--color-surface-2);border:1px solid var(--color-border);font-family:var(--font-mono);border-radius:4px;padding:0 4px;font-size:11px}.lg-md pre{background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:6px;margin:6px 0;padding:8px;overflow-x:auto}.lg-md pre code{white-space:pre;background:0 0;border:none;padding:0;font-size:11px}.lg-md ul,.lg-md ol{flex-direction:column;gap:2px;margin:4px 0 6px;padding-left:18px;display:flex}.lg-md ul{list-style:outside}.lg-md ol{list-style:decimal}.lg-md h4{margin:8px 0 4px;font-size:12px;font-weight:600}.lg-md lg-media{display:block}.lg-md lg-media img,.lg-md lg-media video{border:1px solid var(--color-border);border-radius:6px;max-width:100%;margin:4px 0}.lg-md video{border:1px solid var(--color-border);background:#000;border-radius:6px;max-width:100%;margin:4px 0}.lg-md img{border:1px solid var(--color-border);border-radius:6px;max-width:100%;margin:4px 0}.lg-md strong{font-weight:600}*{scrollbar-width:thin;scrollbar-color:var(--color-border-strong) transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:var(--color-border-strong);border-radius:4px}::-webkit-scrollbar-track{background:0 0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-contain-size{syntax:"*";inherits:false}@property --tw-contain-layout{syntax:"*";inherits:false}@property --tw-contain-paint{syntax:"*";inherits:false}@property --tw-contain-style{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}`;Br();var V7=N(`<span aria-hidden class="bg-danger size-2 shrink-0 animate-pulse rounded-full">`),H7=N(`<span class="text-text min-w-[5ch] text-[11px] font-medium tabular-nums">`),U7=N(`<button class="bg-accent hover:bg-accent-hover h-7 cursor-pointer rounded-full px-2.5 text-[11px] font-medium text-white transition-colors"><span class="inline-block min-w-[4ch] text-center">Stop`),W7=N(`<p class="text-warn px-1.5 pt-1 pb-1.5 text-[10.5px] font-semibold tracking-wide uppercase">Needs review`),G7=N(`<div><p class="text-text-dim px-1.5 pt-1 pb-1.5 text-[10.5px] font-semibold tracking-wide uppercase">Running agents`),K7=N(`<div class="fixed z-[2147483646] select-none"><div class="bg-surface border-border text-text flex h-9 cursor-grab items-center gap-1 rounded-full border py-1 pr-1 pl-2.5 font-sans shadow-lg active:cursor-grabbing">`),q7=N(`<div><div title="Drag to resize">`),J7=N(`<button title="Open Linear Grab"aria-label="Open Linear Grab"class="text-accent hover:opacity-80 inline-flex cursor-pointer items-center gap-1.5">`),Y7=N(`<span class="bg-border h-4 w-px"aria-hidden>`),X7=N(`<span aria-hidden class="bg-warn size-2 rounded-full">`),Z7=N(`<span class="text-warn min-w-[3.5ch] text-left text-[11px] font-medium tabular-nums"> rev`),Q7=N(`<button title="Running agents"aria-label="Running agents"class="hover:bg-surface-2 flex h-7 cursor-pointer items-center gap-1.5 rounded-full px-2 transition-colors"><span aria-hidden></span><span>`),$7=N(`<span aria-hidden class="bg-accent size-2 shrink-0 animate-pulse rounded-full">`),e9=N(`<span class="text-text min-w-[3ch] text-[11px] font-medium tabular-nums">s`),t9=N(`<span class="text-text-dim min-w-[7ch] text-[11px] tabular-nums"> states`),n9=N(`<p class="text-text-faint px-1.5 pb-1.5 text-[11.5px]">No agents running right now.`),r9=N(`<button class="hover:bg-surface-2 flex w-full cursor-pointer flex-col gap-0.5 rounded-md px-1.5 py-1.5 text-left transition-colors"><span class="flex min-w-0 items-center gap-1.5"><span aria-hidden class="size-1.5 shrink-0 rounded-full"></span><span class="font-mono text-text-dim shrink-0 text-[10.5px]"></span><span class="text-text truncate text-[11.5px]"></span></span><span class="text-text-faint pl-3 text-[10.5px] tabular-nums"> · <!> · `);function i9(e={}){if(typeof window>`u`||window.__LINEAR_GRAB_PAGE__)return;window.__LINEAR_GRAB_PAGE__=!0;let t=()=>{uk(),z2(),Q4(),W8(),JZ();let t=document.createElement(`div`);t.id=`linear-grab-root`,document.body.appendChild(t);let n=e=>{let n=e.composedPath();if(!n.includes(t))return;e.stopImmediatePropagation();let r=n[0];e instanceof KeyboardEvent&&r&&r!==t&&r.dispatchEvent(new KeyboardEvent(e.type,{key:e.key,code:e.code,location:e.location,repeat:e.repeat,isComposing:e.isComposing,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,bubbles:!1,cancelable:!1}))};for(let e of[`keydown`,`keyup`,`keypress`])window.addEventListener(e,n,{capture:!0});let r=t.attachShadow({mode:`open`}),i=document.createElement(`style`);i.textContent=B7,r.appendChild(i);let a=document.createElement(`div`);r.appendChild(a);let o=()=>a.setAttribute(`data-theme`,a9());o(),matchMedia(`(prefers-color-scheme: light)`).addEventListener(`change`,o),nt(()=>j(d9,{get defaultOpen(){return e.defaultOpen??!1}}),a)};document.body?t():document.addEventListener(`DOMContentLoaded`,t,{once:!0})}function a9(){try{let e=[document.body,document.documentElement];for(let t of e){let e=getComputedStyle(t).backgroundColor.match(/rgba?\(([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)(?:[,\s/]+([\d.]+))?/);if(!(!e||e[4]!==void 0&&Number(e[4])===0))return .2126*e[1]+.7152*e[2]+.0722*e[3]>140?`light`:`dark`}}catch{}return matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`}var o9=130,s9=36,c9=380,l9=280,u9=720;function d9(e){let[t,n]=T(e.defaultOpen),[r,i]=T(`right`),[a,o]=T({x:Math.max(8,window.innerWidth-o9-24),y:Math.max(8,window.innerHeight-s9-20)}),[s,c]=T({running:[],review:[]}),l=()=>s().running,u=()=>s().review,[d,f]=T(!1),[p,m]=T(UD().phase),[h,g]=T({active:!1,msLeft:0,total:0,byTrigger:{}}),[_,v]=T(0);ie(()=>{let e=setInterval(()=>{p()===`recording`&&v(Date.now()-(UD().startedAt??Date.now()))},250);ae(()=>clearInterval(e))});let y=e=>{let t=Math.floor(e/1e3);return`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`},[b,x]=T(null),S=e=>({x:Math.min(Math.max(8,e.x),window.innerWidth-o9-8),y:Math.min(Math.max(8,e.y),window.innerHeight-s9-8)}),C=e=>({x:Math.min(Math.max(8-(ne()-80),e.x),window.innerWidth-80),y:Math.min(Math.max(0,e.y),window.innerHeight-80)}),[w,E]=T(!1),[k,ee]=T(`cloud`),[te,A]=T(!1),[ne,re]=T(c9),oe=e=>Math.min(u9,Math.max(l9,Math.min(e,window.innerWidth-60)));O(()=>{let e=document.documentElement,n=t()&&w();e.style.marginRight=n&&r()===`right`?`${ne()}px`:``,e.style.marginLeft=n&&r()===`left`?`${ne()}px`:``}),ae(()=>{document.documentElement.style.marginRight=``,document.documentElement.style.marginLeft=``});let se=()=>{let e=!w();E(e),e&&x(null),Er({panelMode:e?`pinned`:`overlay`,panelPos:void 0})};ie(()=>{Tr().then(e=>{e.panelSide&&i(e.panelSide),e.launcherPos&&o(S(e.launcherPos)),e.panelPos&&x(C(e.panelPos)),e.panelWidth&&re(oe(e.panelWidth)),E(e.panelMode===`pinned`),ee(e.workflowMode??`cloud`)});let e=Mr(e=>{e===`settings`&&Tr().then(e=>{i(e.panelSide??`right`),E(e.panelMode===`pinned`),ee(e.workflowMode??`cloud`)}),e===`grab`&&k()!==`local`&&n(!0)}),t=()=>{A(!0),setTimeout(()=>A(!1),1600)};window.addEventListener(zZ,t);let r=()=>{f(!1),w()||n(!1)};window.addEventListener(BZ,r);let s=()=>n(!0);window.addEventListener(`linear-grab:picker-finished`,s),ae(()=>{window.removeEventListener(zZ,t),window.removeEventListener(BZ,r),window.removeEventListener(`linear-grab:picker-finished`,s)});let l=e$(c);ae(i2(g));let u=UD().phase,d=WD(e=>{m(e.phase),e.phase===`recording`&&u!==`recording`&&!w()&&n(!1),e.phase===`ready`&&u!==`ready`&&(sj(`capture`),n(!0)),u=e.phase}),p=()=>{o(S(a()));let e=b();e&&x(C(e))};window.addEventListener(`resize`,p),ae(()=>{e(),l(),d(),window.removeEventListener(`resize`,p)})});let ce=!1,le=e=>{if(e.button!==0)return;let t={x:e.clientX,y:e.clientY},n=a();ce=!1;let r=e=>{let r=e.clientX-t.x,i=e.clientY-t.y;Math.abs(r)+Math.abs(i)>4&&(ce=!0),ce&&o(S({x:n.x+r,y:n.y+i}))},i=()=>{window.removeEventListener(`pointermove`,r),window.removeEventListener(`pointerup`,i),ce&&Er({launcherPos:a()}),setTimeout(()=>{ce=!1},0)};window.addEventListener(`pointermove`,r),window.addEventListener(`pointerup`,i)},ue=()=>a().y>260,de=e=>{f(!1),sj(`activity`,e),n(!0)},fe=e=>{if(e.button!==0)return;e.preventDefault(),e.stopPropagation();let t=e.clientX,n=ne(),i=b(),a=e=>{let a=e.clientX-t,o=r()===`right`?-a:a,s=oe(n+o);re(s),i&&r()===`right`&&x(C({x:i.x+(n-s),y:i.y}))},o=()=>{window.removeEventListener(`pointermove`,a),window.removeEventListener(`pointerup`,o),Er({panelWidth:ne(),...b()?{panelPos:b()}:{}})};window.addEventListener(`pointermove`,a),window.addEventListener(`pointerup`,o)},pe=e=>{if(e.button!==0)return;if(e.detail===2){x(null),Er({panelPos:void 0});return}let t={x:e.clientX,y:e.clientY},n=b()??{x:r()===`right`?window.innerWidth-ne():0,y:0},i=!1,a=e=>{let r=e.clientX-t.x,a=e.clientY-t.y;Math.abs(r)+Math.abs(a)>4&&(i=!0),i&&x(C({x:n.x+r,y:n.y+a}))},o=()=>{window.removeEventListener(`pointermove`,a),window.removeEventListener(`pointerup`,o);let e=b();i&&e&&Er({panelPos:e})};window.addEventListener(`pointermove`,a),window.addEventListener(`pointerup`,o)};return[j(M,{get when(){return!t()},get children(){var e=K7(),t=e.firstChild;return t.$$click=()=>{ce||p()===`recording`||h().active||(f(!1),n(!0))},t.$$pointerdown=le,P(t,j(M,{get when(){return p()===`recording`||h().active},get fallback(){return[(()=>{var e=J7();return e.$$click=()=>{ce||(f(!1),n(!0))},P(e,j(R7,{size:13})),e})(),Y7(),(()=>{var e=Q7(),t=e.firstChild,n=t.nextSibling;return e.$$click=e=>{e.stopPropagation(),!ce&&f(e=>!e)},P(n,(()=>{var e=$e(()=>!!te());return()=>e()?`Copied ✓`:`${l().length} run`})()),P(e,j(M,{get when(){return $e(()=>!te())()&&u().length>0},get children(){return[X7(),(()=>{var e=Z7(),t=e.firstChild;return P(e,()=>u().length,t),e})()]}}),null),D(e=>{var r=`size-2 rounded-full ${te()?`bg-success`:l().length?`bg-success animate-pulse`:`bg-text-faint`}`,i=`min-w-[3.5ch] text-left text-[11px] font-medium tabular-nums ${te()?`text-success`:`text-text-dim`}`;return r!==e.e&&st(t,e.e=r),i!==e.t&&st(n,e.t=i),e},{e:void 0,t:void 0}),e})()]},get children(){return j(M,{get when(){return p()===`recording`},get fallback(){return[$7(),(()=>{var e=e9(),t=e.firstChild;return P(e,()=>Math.ceil(h().msLeft/1e3),t),e})(),(()=>{var e=t9(),t=e.firstChild;return P(e,()=>h().total,t),D(()=>it(e,`title`,Object.entries(h().byTrigger).map(([e,t])=>`${t} ${e}`).join(` · `)||`hover / open the component to record its states`)),e})(),(()=>{var e=U7();return e.$$click=e=>{e.stopPropagation(),!ce&&o2()},e})()]},get children(){return[V7(),(()=>{var e=H7();return P(e,()=>y(_())),e})(),(()=>{var e=U7();return e.$$click=()=>{ce||tO()},e})()]}})}})),P(e,j(M,{get when(){return d()},get children(){var e=G7(),t=e.firstChild;return P(e,j(M,{get when(){return u().length>0},get children(){return[W7(),j(We,{get each(){return u()},children:e=>j(f9,{agent:e,review:!0,onOpen:de})})]}}),t),P(e,j(M,{get when(){return l().length>0},get fallback(){return n9()},get children(){return j(We,{get each(){return l()},children:e=>j(f9,{agent:e,onOpen:de})})}}),null),D(()=>st(e,`bg-surface border-border absolute w-72 rounded-lg border p-1.5 font-sans shadow-2xl ${ue()?`bottom-full mb-2`:`top-full mt-2`} ${a().x>window.innerWidth-300?`right-0`:`left-0`}`)),e}}),null),D(t=>{var n=`${a().x}px`,r=`${a().y}px`;return n!==t.e&&dt(e,`left`,t.e=n),r!==t.t&&dt(e,`top`,t.t=r),t},{e:void 0,t:void 0}),e}}),j(M,{get when(){return t()},get children(){var e=q7(),t=e.firstChild;return t.$$pointerdown=fe,P(e,j(z7,{onGrab:()=>n(!0),onClose:()=>n(!1),get onHeaderPointerDown(){return w()?void 0:pe},get pinned(){return w()},onTogglePin:se}),null),D(n=>{var i=`bg-bg text-text border-border fixed z-[2147483645] flex max-w-[100vw] flex-col overflow-hidden font-sans text-[13px] antialiased ${w()?``:`shadow-2xl`} ${!w()&&b()?`rounded-xl border`:r()===`right`?`top-0 right-0 h-screen border-l`:`top-0 left-0 h-screen border-r`}`,a={width:`${ne()}px`,...!w()&&b()?{left:`${b().x}px`,top:`${b().y}px`,height:`${Math.min(680,window.innerHeight-16)}px`}:{}},o=`hover:bg-accent/50 active:bg-accent absolute top-0 z-10 h-full w-1 cursor-col-resize transition-colors ${r()===`right`?`left-0`:`right-0`}`;return i!==n.e&&st(e,n.e=i),n.t=ut(e,a,n.t),o!==n.a&&st(t,n.a=o),n},{e:void 0,t:void 0,a:void 0}),e}})]}function f9(e){return(()=>{var t=r9(),n=t.firstChild,r=n.firstChild,i=r.nextSibling,a=i.nextSibling,o=n.nextSibling,s=o.firstChild,c=s.nextSibling;return c.nextSibling,t.$$click=()=>e.onOpen(e.agent.id),P(i,()=>e.agent.identifier),P(a,()=>e.agent.title),P(o,(()=>{var t=$e(()=>!!e.review);return()=>t()?`PR ready · needs review`:e.agent.stateName})(),s),P(o,()=>e.agent.delegateName,c),P(o,()=>p9(e.agent.updatedAt),null),D(t=>dt(r,`background`,e.review?`var(--color-warn)`:e.agent.stateColor)),t})()}function p9(e){let t=Math.max(0,Math.floor((Date.now()-Date.parse(e))/1e3));return t<60?`now`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}rt([`pointerdown`,`click`]),i9()})();
|