@01.works/visual-review 0.9.5 → 0.9.6

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/README.md CHANGED
@@ -228,8 +228,10 @@ DOM·runtime import·network 전에 제거됩니다. 위젯의 **피드백 목
228
228
  project에 연결된 exact Origin 목록과 현재 pathname을 읽기 전용 activation gate로
229
229
  확인합니다. bootstrap 응답은 provider의 public endpoint와 invitation expiry만 반환하며
230
230
  reviewer session이나 이메일을 포함하지 않습니다. Fragment는 주소창에서 즉시 제거되고,
231
- reviewer가 **리뷰 시작**을 누를 때 server가 1회용 token을 지정된 origin/path에서 교환해
232
- provider session과 invitation claim을 함께 만듭니다. 인증된 `/v1/pages/resolve`가 아직 등록되지 않은
231
+ reviewer가 **리뷰 시작**을 누를 때 server가 token을 지정된 origin/path에서 교환해
232
+ provider session과 invitation claim을 함께 만듭니다. token은 15분 retry grace
233
+ 소진되며 새 탭이나 기기에서는 같은 링크가 이메일 복구 코드 flow를 시작합니다.
234
+ 인증된 `/v1/pages/resolve`가 아직 등록되지 않은
233
235
  pathname을 자동 등록합니다. Server는
234
236
  provider의 user-scoped mutation으로 claim을 실행하며 완료된 뒤에만 client가
235
237
  정확한 page를 선택해 subscription과 overlay를 mount합니다. `revokedAt`,
@@ -1,6 +1,6 @@
1
- const e=`visual-review:v1:`,t=4096;function n(t,n){return`${e}${encodeURIComponent(JSON.stringify({roots:t,target:n}))}`}function r(t){return t.startsWith(e)}function i(e=document){let t=[],n=[e],r=new Set;for(;n.length>0;){let e=n.shift();if(r.has(e))continue;r.add(e),t.push(e);let i=[];try{i=Array.from(e.querySelectorAll(`*`))}catch{continue}for(let e of i){let t=m(e);t&&!r.has(t)&&n.push(t);let i=h(e);i&&!r.has(i)&&n.push(i)}}return t}function a(e,t=document){if(!e)return[];let n=s(e);if(r(e))return n?o(n,t):[];let a=[];for(let n of i(t))try{a.push(...n.querySelectorAll(e))}catch{return[]}return a}function o(e,t){let n=[t];for(let t of e.roots){let e=[];for(let r of n){let n;try{n=r.querySelectorAll(t.selector)}catch{return[]}for(let r of n){let n=t.kind===`shadow`?m(r):h(r);n&&e.push(n)}}if(e.length===0)return[];n=e}let r=[];for(let t of n)try{r.push(...t.querySelectorAll(e.target))}catch{return[]}return r}function s(e){if(!r(e)||e.length>t)return null;try{let t=JSON.parse(decodeURIComponent(e.slice(17)));return!Array.isArray(t.roots)||t.roots.length===0||t.roots.length>16||!c(t.target)||!t.roots.every(e=>e&&(e.kind===`shadow`||e.kind===`frame`)&&c(e.selector))?null:{roots:t.roots,target:t.target}}catch{return null}}function c(e){return typeof e==`string`&&e.length>0&&e.length<=t}function l(e){let t=e.getBoundingClientRect(),n=t.left,r=t.top,i=t.width,a=t.height,o=e.ownerDocument.defaultView;for(;o&&typeof window<`u`&&o!==window;){let e=g(o);if(!e)break;let t=e.getBoundingClientRect(),s=u(e);n=t.left+(e.clientLeft+n)*s.x,r=t.top+(e.clientTop+r)*s.y,i*=s.x,a*=s.y,o=e.ownerDocument.defaultView}return new DOMRect(n,r,i,a)}function u(e){let t=e.getBoundingClientRect();return{x:e.offsetWidth>0?t.width/e.offsetWidth:1,y:e.offsetHeight>0?t.height/e.offsetHeight:1}}function d(e){return e.nodeType===11&&`host`in e}function f(e){return e.nodeType===9}function p(e){let t=e;for(;t;){if(t.closest(`[data-agency-review-root], [data-react-grab-ignore]`))return!0;let e=t.getRootNode();t=d(e)?e.host:null}return!1}function m(e){try{return e.shadowRoot}catch{return null}}function h(e){if(e.tagName.toLowerCase()!==`iframe`)return null;try{return e.contentDocument}catch{return null}}function g(e){try{let t=e.frameElement;return t&&`clientLeft`in t?t:null}catch{return null}}function _(e){return typeof CSS<`u`&&CSS.escape?CSS.escape(e):e.replace(/([^\w-])/g,`\\$1`)}function v(e){let t=S(e),r=y(e,t);if(t===document)return r;let i=[];for(;t!==document;){if(d(t)){let e=t.host,n=S(e);i.unshift({kind:`shadow`,selector:y(e,n)}),t=n;continue}let e=C(t);if(!e)return r;let n=S(e);i.unshift({kind:`frame`,selector:y(e,n)}),t=n}let a=n(i,r);return a.length<=4096?a:r}function y(e,t){let n=[],r=e,i=e.ownerDocument;for(;r&&r!==i.documentElement;){if(r===i.body){n.unshift(`body`);break}let e=x(r,t);if(e){n.unshift(e);break}let a=r.tagName.toLowerCase(),o=r.parentElement,s=o??b(r);if(s){let e=Array.from(s.children).filter(e=>e.tagName===r?.tagName);e.length>1&&(a+=`:nth-of-type(${e.indexOf(r)+1})`)}n.unshift(a),r=o}return n.join(` > `)}function b(e){let t=e.parentNode;return t&&`children`in t?t:null}function x(e,t){return[e.id?`#${_(e.id)}`:null,w(e,`data-review-id`),w(e,`data-testid`),w(e,`data-id`)].find(e=>{if(!e)return!1;try{return t.querySelectorAll(e).length===1}catch{return!1}})??null}function S(e){let t=e.getRootNode();return f(t)||d(t)?t:e.ownerDocument}function C(e){try{return e.defaultView?.frameElement??null}catch{return null}}function w(e,t){let n=e.getAttribute(t);return n?`[${t}="${_(n)}"]`:null}function T(e){if(!E(e))return!1;let t=D(e);for(;t;){if(!E(t))return!1;t=D(t)}let n=l(e);return n.width>0&&n.height>0&&e.getClientRects().length>0}function E(e){let t=e.ownerDocument.defaultView,n=t?.HTMLElement;if(n&&e instanceof n&&e.hidden)return!1;let r=t?.getComputedStyle(e);return!r||r.display===`none`||r.visibility===`hidden`||r.visibility===`collapse`?!1:r.opacity!==`0`&&r.contentVisibility!==`hidden`}function D(e){if(e.assignedSlot)return e.assignedSlot;if(e.parentElement)return e.parentElement;let t=e.getRootNode();if(d(t))return t.host;if(t.nodeType===9&&t!==document)try{return t.defaultView?.frameElement??null}catch{return null}return null}function O(e){if(!e.selector)return[];if(r(e.selector))return a(e.selector).filter(e=>!p(e));try{let t=Array.from(document.querySelectorAll(e.selector)).filter(e=>!p(e));if(t.length>0)return t}catch{return[]}return a(e.selector).filter(e=>!p(e))}function k(e,t,n){let r=l(e),i=Math.max(r.width,1),a=Math.max(r.height,1);return{selector:v(e),offsetX:M((t-(r.left+window.scrollX))/i),offsetY:M((n-(r.top+window.scrollY))/a),viewportX:M((t-window.scrollX)/Math.max(window.innerWidth,1)),viewportY:M((n-window.scrollY)/Math.max(window.innerHeight,1))}}function A(e,t){return{selector:``,offsetX:M(e),offsetY:M(t),viewportX:M(e),viewportY:M(t)}}function j(e){let t=O(e),n=t.find(T)??t[0]??null;if(n){let t=l(n);return{x:t.left+window.scrollX+t.width*e.offsetX,y:t.top+window.scrollY+t.height*e.offsetY,anchored:!0,visible:T(n),element:n}}return{x:window.scrollX+window.innerWidth*e.viewportX,y:window.scrollY+window.innerHeight*e.viewportY,anchored:!1,visible:!0,element:null}}function M(e){return Math.min(1,Math.max(0,Number.isFinite(e)?e:0))}let N=null,P=null;function ee(e){I(e).catch(()=>void 0)}function F(){return N}function I(e){if(N)return Promise.resolve(N);if(P)return P;let t=te(e);return P=t,t.catch(()=>{P===t&&(P=null)}),t}async function te(e){let t=ne(e);try{let e=await import(`./primitives-lxsPH8SN.js`);return N=e,e}finally{t()}}function ne(e){if(!e||typeof document>`u`)return()=>void 0;let t=[];for(let n of i()){if(!f(n)||!n.head||n.querySelector(`script[nonce], style[nonce]`)?.nonce===e)continue;let r=n.createElement(`style`);r.dataset.agencyReviewNonceMarker=``,r.nonce=e,n.head.prepend(r),t.push(r)}return()=>t.forEach(e=>e.remove())}function re(e){ee(e)}function ie(e,t){let n=F();if(!n)return oe(e,t);try{let r=n.getElementAtPoint(e,t,{filter:e=>n.isElementGrabbable(e)&&!p(e)});return r?se(r,e,t):null}catch{return oe(e,t)}}function L(e){if(e.ownerDocument!==document)return l(e);let t=F();if(!t)return e.getBoundingClientRect();try{let n=t.getElementBounds(e);return new DOMRect(n.x,n.y,n.width,n.height)}catch{return e.getBoundingClientRect()}}function ae(e){ee(e);let t=F();if(!t)return()=>void 0;let n=!1;try{if(!t.isFreezeActive()){let r=ne(e);try{t.freeze(),n=!0}finally{r()}}}catch{return()=>void 0}let r=!1;return()=>{if(!(r||!n)){r=!0;try{t.unfreeze()}catch{}}}}function oe(e,t){let n=(typeof document.elementsFromPoint==`function`?document.elementsFromPoint(e,t):typeof document.elementFromPoint==`function`?[document.elementFromPoint(e,t)].filter(e=>!!e):[]).find(e=>!p(e))??null;return n?se(n,e,t):null}function se(e,t,n){let r=e,i=t,a=n,o=new Set;for(;!o.has(r);){o.add(r);let e=ce(r,i,a);if(e&&e!==r&&!p(e)){r=e;continue}let t=le(r,i,a);if(!t)break;r=t.element,i=t.clientX,a=t.clientY}return r}function ce(e,t,n){try{return e.shadowRoot?.elementFromPoint(t,n)??null}catch{return null}}function le(e,t,n){if(e.tagName.toLowerCase()!==`iframe`)return null;try{let r=e,i=r.contentDocument;if(!i)return null;let a=e.getBoundingClientRect(),o=u(r),s=(t-a.left)/o.x-r.clientLeft,c=(n-a.top)/o.y-r.clientTop,l=i.elementFromPoint(s,c);return l&&!p(l)?{element:l,clientX:s,clientY:c}:null}catch{return null}}const ue=Symbol(`source-resolution-stopped`);function de(e,t){let n=L(e),r=k(e,t.clientX+window.scrollX,t.clientY+window.scrollY),i=Me(n);return Ce(r,`element`,i,[Ae(e,i)])}function fe(e){let t=ie(e.clientX,e.clientY);return t?de(t,e):Ce(A(e.clientX/Math.max(window.innerWidth,1),e.clientY/Math.max(window.innerHeight,1)),`viewport`,{pageX:e.clientX+window.scrollX,pageY:e.clientY+window.scrollY,width:0,height:0,viewportX:e.clientX,viewportY:e.clientY,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight},[])}function pe(e,t){let n=Math.min(e.clientX,t.clientX),r=Math.min(e.clientY,t.clientY),i=Math.abs(t.clientX-e.clientX),a=Math.abs(t.clientY-e.clientY),o=new DOMRect(n,r,i,a),s=_e(me(o),ge(o)).slice(0,8),c={clientX:n+i/2,clientY:r+a/2},u=s[0];return Ce(u?k(u,c.clientX+window.scrollX,c.clientY+window.scrollY):A(c.clientX/Math.max(window.innerWidth,1),c.clientY/Math.max(window.innerHeight,1)),`region`,Me(o),s.map(e=>Ae(e,Me(l(e)))))}function me(e){let t=a(`*`).filter(t=>t===t.ownerDocument.body||t===t.ownerDocument.documentElement||p(t)||!T(t)?!1:Ne(e,l(t))),n=new Set(t),r=new Set;return t.forEach(e=>{let t=he(e);for(;t;)n.has(t)&&r.add(t),t=he(t)}),t.filter(e=>!r.has(e))}function he(e){if(e.assignedSlot)return e.assignedSlot;if(e.parentElement)return e.parentElement;let t=e.getRootNode();if(d(t))return t.host;if(f(t)&&t!==document)try{return t.defaultView?.frameElement??null}catch{return null}return null}function ge(e){return{clientX:e.left+e.width/2,clientY:e.top+e.height/2}}function _e(e,t){let n=e.findIndex(e=>{let n=l(e);return t.clientX>=n.left&&t.clientX<=n.right&&t.clientY>=n.top&&t.clientY<=n.bottom});return n<=0?e:[e[n],...e.slice(0,n),...e.slice(n+1)]}async function ve(e,t,n={}){if(n.signal?.aborted)return be(e,t);let r=ye(n),i=e.elements.map(async e=>{let n=Pe(e.selector);if(!n)return{context:e,provenance:void 0};let i=await t.resolve(n,{signal:r.signal});return{context:{...e,source:i.source,componentStack:i.componentStack},provenance:i.provenance}});try{let n=await Promise.allSettled(i.map(e=>Promise.race([e,r.stopped]))),a=n.map((t,n)=>t.status===`fulfilled`&&t.value!==ue?t.value.context:e.elements[n]),o=Se(n.flatMap(e=>e.status===`fulfilled`&&e.value!==ue&&e.value.provenance?[{located:e.value.context.source!==null,provenance:e.value.provenance}]:[]))??e.sourceProvenance??xe(t);return{...e,elements:a,...o?{sourceProvenance:o}:{}}}finally{r.dispose()}}function ye(e){let t=new AbortController,n=e.signal,r=()=>t.abort(n?.reason);n?.aborted?r():n?.addEventListener(`abort`,r,{once:!0});let i=e.deadlineMs??400,a=setTimeout(()=>t.abort(`source-resolution-deadline`),Number.isFinite(i)?Math.max(0,i):400),o=new Promise(e=>{if(t.signal.aborted){e(ue);return}t.signal.addEventListener(`abort`,()=>e(ue),{once:!0})});return{signal:t.signal,stopped:o,dispose(){clearTimeout(a),n?.removeEventListener(`abort`,r)}}}function be(e,t){let n=e.sourceProvenance??xe(t);return{...e,...n?{sourceProvenance:n}:{}}}function xe(e){try{return e.unavailableProvenance?.()}catch{return}}function Se(e){return(e.find(e=>e.located)??e[0])?.provenance}function Ce(e,t,n,r){return{kind:t,anchor:e,region:n,elements:r,pageUrl:`${window.location.origin}${window.location.pathname}`,pageTitle:document.title,capturedAt:Date.now(),environment:we()}}function we(){let e=navigator.userAgent,t=Math.max(1,window.innerWidth),n=navigator.maxTouchPoints,r=ke(window.screen?.width,t),i=ke(window.screen?.height,Math.max(1,window.innerHeight));return{browser:Te(e),operatingSystem:Ee(e,navigator.platform,n),deviceType:De(e,navigator.platform,t,n),screenWidth:r,screenHeight:i,devicePixelRatio:ke(window.devicePixelRatio,1)}}function Te(e){let t=(e.match(/(?:Edg|Edge)\/([\d.]+)/)??e.match(/OPR\/([\d.]+)/)??e.match(/(?:Chrome|CriOS)\/([\d.]+)/)??e.match(/(?:Firefox|FxiOS)\/([\d.]+)/)??e.match(/Version\/([\d.]+).*Safari\//))?.[1]?.split(`.`)[0],n=/(?:Edg|Edge)\//.test(e)?`Edge`:/OPR\//.test(e)?`Opera`:/(?:Chrome|CriOS)\//.test(e)?`Chrome`:/(?:Firefox|FxiOS)\//.test(e)?`Firefox`:/Safari\//.test(e)?`Safari`:`알 수 없는 브라우저`;return t?`${n} ${t}`:n}function Ee(e,t,n){return Oe(e,t,n)?`iPadOS`:/iPhone|iPod/.test(e)?`iOS`:/Android/.test(e)?`Android`:/CrOS/.test(e)?`ChromeOS`:/Windows/.test(e)?`Windows`:/Mac OS X|Macintosh/.test(e)||/Mac/.test(t)?`macOS`:/Linux/.test(e)||/Linux/.test(t)?`Linux`:`알 수 없는 OS`}function De(e,t,n,r){return Oe(e,t,r)?`tablet`:/Mobi|iPhone|iPod|Android.*Mobile/.test(e)?`mobile`:/iPad|Tablet|Android/.test(e)||r>1&&n<=1024?`tablet`:`desktop`}function Oe(e,t,n){return/iPad/.test(e)||t===`MacIntel`&&n>1}function ke(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}function Ae(e,t){return{selector:v(e),tagName:e.tagName.toLowerCase(),textPreview:je(e),rect:t,source:null,componentStack:[]}}function je(e){let t=(e instanceof HTMLElement?e.innerText:null)||e.textContent;return([e.getAttribute(`aria-label`),t,e.getAttribute(`alt`),e.getAttribute(`title`)].map(e=>(e??``).replace(/\s+/g,` `).trim()).find(Boolean)??``).slice(0,240)}function Me(e){return{pageX:e.left+window.scrollX,pageY:e.top+window.scrollY,width:e.width,height:e.height,viewportX:e.left,viewportY:e.top,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight}}function Ne(e,t){return e.left<t.right&&e.right>t.left&&e.top<t.bottom&&e.bottom>t.top}function Pe(e){return e?O({selector:e,offsetX:0,offsetY:0,viewportX:0,viewportY:0})[0]??null:null}function Fe(e){let t,n=!1,r={pageId:e.pageId,peers:[],messages:[]},i,a,o=!1,s=``,c=``,l,u=e.cursors||e.chat,d={x:Math.max(24,window.innerWidth-180),y:Math.max(24,window.innerHeight-96)},f=R(`rg-collaboration-cursors`);f.setAttribute(`aria-hidden`,`true`);let p=R(`rg-cursor-chat-announcements`);p.setAttribute(`role`,`log`),p.setAttribute(`aria-live`,`polite`),p.setAttribute(`aria-relevant`,`additions`);let m=new Map,h=R(`rg-collaboration-participants`);h.setAttribute(`role`,`status`);let g=R(`rg-cursor-chat-composer`);g.hidden=!0,g.setAttribute(`role`,`dialog`),g.setAttribute(`aria-label`,`커서 채팅`),g.style.setProperty(`--rg-local-color`,ze(e.session.reviewerId));let _=R(`rg-cursor-chat-header`),v=document.createElement(`strong`);v.textContent=e.session.displayName;let y=document.createElement(`span`);y.textContent=`Enter 전송 · 바깥 클릭 닫기`,_.append(v,y);let b=R(`rg-cursor-chat-preview`);b.hidden=!0;let x=document.createElement(`input`);x.className=`rg-cursor-chat-input`,x.type=`text`,x.maxLength=280,x.placeholder=`메시지 입력…`,x.setAttribute(`aria-label`,`커서 채팅 메시지`),g.append(_,b,x);let S=document.createElement(`button`);S.className=`rg-cursor-chat-mobile-trigger`,S.type=`button`,S.setAttribute(`aria-label`,`커서 채팅 시작`),S.title=`커서 채팅`,S.textContent=`채팅`;let C=()=>{Le(h,r.peers,e.session.displayName),u&&Re(f,r.peers),e.chat&&Ie(p,m,r.peers)},w=()=>(s.trim()||c).slice(0,280),T=()=>{b.textContent=c,b.hidden=!c,g.dataset.hasMessage=String(!!c);let e=Math.min(260,Math.max(180,window.innerWidth-24)),t=d.x>window.innerWidth/2,n=d.y>window.innerHeight/2,r=Ve(t?d.x-e-14:d.x+14,12,Math.max(12,window.innerWidth-e-12)),i=c?118:84,a=Ve(n?d.y-i-14:d.y+18,12,Math.max(12,window.innerHeight-i-12));g.dataset.horizontal=t?`left`:`right`,g.dataset.vertical=n?`above`:`below`,g.style.left=`${r}px`,g.style.top=`${a}px`},E=()=>{l!==void 0&&window.clearTimeout(l),l=window.setTimeout(()=>{l=void 0,!s.trim()&&(c=``,T(),O(k()))},5e3)},D=e=>{o=e,g.hidden=!e,e?(T(),O(k()),queueMicrotask(()=>x.focus())):(l!==void 0&&(window.clearTimeout(l),l=void 0),s=``,c=``,x.value=``,O(k()),x.blur())};x.addEventListener(`input`,()=>{s=x.value,s.trim()&&(c=``),T(),O(k())}),x.addEventListener(`keydown`,e=>{if(e.key===`Escape`){e.preventDefault(),D(!1);return}if(e.key!==`Enter`||e.isComposing)return;e.preventDefault();let t=s.trim();t&&(c=t,s=``,x.value=``,T(),O(k()),E(),x.focus())});let O=t=>{!u||n||e.repository.publishPresence(e.pageId,e.roomId,{...t,cursorChat:w()})},k=()=>({reviewerId:e.session.reviewerId,displayName:e.session.displayName,color:ze(e.session.reviewerId),active:!0,pathname:e.pathname,cursorX:d.x,cursorY:d.y,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight}),A=()=>({reviewerId:e.session.reviewerId,displayName:e.session.displayName,color:ze(e.session.reviewerId),active:!1,pathname:e.pathname}),j=t=>{t.pointerType===`touch`||t.composedPath().includes(e.root.host)||(d.x=t.clientX,d.y=t.clientY,o&&T(),a=t,i===void 0&&(i=window.requestAnimationFrame(()=>{i=void 0;let e=a;a=void 0,e&&O({...k(),cursorX:e.clientX,cursorY:e.clientY})})))},M=()=>{document.visibilityState!==`visible`&&(o&&D(!1),O(A()))},N=()=>O(A()),P=e=>{!o||e.composedPath().includes(g)||D(!1)},ee=()=>{o&&queueMicrotask(()=>{!o||g.contains(e.root.activeElement)||D(!1)})},F=t=>{t.key!==`/`||t.defaultPrevented||t.repeat||t.isComposing||t.metaKey||t.ctrlKey||t.altKey||o||Be(t)||e.canOpenChat?.()===!1||(t.preventDefault(),D(!0))},I=e=>{e instanceof KeyboardEvent&&F(e)};return{start(){if(n)return;let i=e.root.querySelector(`.rg-toolbar-actions`);u&&i?.append(h),e.chat&&(i?.append(S),e.root.append(g,p),S.addEventListener(`click`,()=>D(!0)),e.root.addEventListener(`keydown`,I,!0),document.addEventListener(`keydown`,F),document.addEventListener(`pointerdown`,P,!0),g.addEventListener(`focusout`,ee)),u&&(e.root.prepend(f),document.addEventListener(`pointermove`,j,{passive:!0}),document.addEventListener(`pointerleave`,N),document.addEventListener(`visibilitychange`,M)),t=e.repository.subscribe(e.pageId,{roomId:e.roomId,cursors:u,chat:!1},e=>{r=e,C()},e.onFailure),O(A()),C()},stop(){n||(n=!0,i!==void 0&&window.cancelAnimationFrame(i),l!==void 0&&window.clearTimeout(l),document.removeEventListener(`pointermove`,j),document.removeEventListener(`pointerleave`,N),document.removeEventListener(`visibilitychange`,M),e.root.removeEventListener(`keydown`,I,!0),document.removeEventListener(`keydown`,F),document.removeEventListener(`pointerdown`,P,!0),g.removeEventListener(`focusout`,ee),t?.(),f.remove(),h.remove(),S.remove(),g.remove(),p.remove())}}}function Ie(e,t,n){let r=new Set(n.map(({peerId:e})=>e));for(let e of t.keys())r.has(e)||t.delete(e);for(let r of n){let n=r.cursorChat?.trim()??``,i=t.get(r.peerId)??``;if(!n||n===i){t.set(r.peerId,n);continue}t.set(r.peerId,n);let a=R(`rg-cursor-chat-announcement`);for(a.textContent=`${r.displayName}, ${r.pathname||`/`}: ${n}`,e.append(a);e.childElementCount>20;)e.firstElementChild?.remove()}}function Le(e,t,n){let r=[n,...t.map(({displayName:e})=>e)];e.hidden=r.length<2,e.textContent=r.length<2?``:`${r.length}명`,e.title=r.join(`, `)}function Re(e,t){e.replaceChildren();for(let n of t){if(!n.active||n.cursorX===void 0||n.cursorY===void 0||!n.viewportWidth||!n.viewportHeight)continue;let t=R(`rg-collaboration-cursor`);t.style.setProperty(`--rg-peer-color`,n.color);let r=n.cursorX/n.viewportWidth*window.innerWidth,i=n.cursorY/n.viewportHeight*window.innerHeight;t.style.left=`${Ve(r,0,window.innerWidth)}px`,t.style.top=`${Ve(i,0,window.innerHeight)}px`,t.dataset.horizontal=r>window.innerWidth/2?`left`:`right`,t.dataset.vertical=i>window.innerHeight/2?`above`:`below`;let a=R(`rg-collaboration-cursor-pointer`),o=R(`rg-collaboration-cursor-label`);if(o.textContent=n.displayName,t.append(a,o),n.cursorChat){let e=R(`rg-collaboration-cursor-chat`),r=R(`rg-collaboration-cursor-chat-page`);r.textContent=n.pathname||`/`;let i=R(`rg-collaboration-cursor-chat-body`);i.textContent=n.cursorChat,e.append(r,i),t.append(e)}e.append(t)}}function ze(e){let t=[`#7c3aed`,`#2563eb`,`#0891b2`,`#059669`,`#ca8a04`,`#ea580c`,`#dc2626`],n=0;for(let t of e)n=(n<<5)-n+t.charCodeAt(0)|0;return t[Math.abs(n)%t.length]}function Be(e){let t=e.composedPath()[0];return t instanceof Element&&t.closest(`input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`)!==null}function R(e){let t=document.createElement(`div`);return t.className=e,t}function Ve(e,t,n){return Math.min(n,Math.max(t,e))}function He(e={}){let t=document.createElement(`div`);t.className=`rg-toolbar`,t.setAttribute(`role`,`toolbar`),t.setAttribute(`aria-label`,`Visual Review`);let n=B(`rg-toolbar-actions-shell`),r=B(`rg-toolbar-actions`);e.developerGrab&&r.append(Ue());let i=B(`rg-action-wrap`),a=Qe(`rg-action rg-feedback-tool`,`피드백 위치 선택`);a.setAttribute(`aria-pressed`,`false`),a.append(qe());let o=document.createElement(`span`);o.className=`rg-tooltip`,o.setAttribute(`aria-hidden`,`true`),o.textContent=`피드백`,i.append(a,o),r.append(i),n.append(r);let s=Qe(`rg-collapse`,`Visual Review 접기`);if(s.setAttribute(`aria-expanded`,`true`),s.append(Ye()),t.append(n,s),e.developerGrab){let e=B(`rg-developer-status`);e.dataset.visible=`false`,e.dataset.tone=`neutral`,e.setAttribute(`aria-hidden`,`true`),t.append(e)}return t}function Ue(){let e=B(`rg-action-wrap`),t=Qe(`rg-action rg-developer-grab-tool`,`React Grab 코드 선택`);t.setAttribute(`aria-keyshortcuts`,`Meta+C Control+C`),t.setAttribute(`aria-pressed`,`false`),t.append(Je());let n=document.createElement(`span`);return n.className=`rg-tooltip`,n.setAttribute(`aria-hidden`,`true`),n.textContent=`코드 선택 · ⌘/Ctrl+C 길게`,e.append(t,n),e}function We(e,t,n=t){let r=document.createElement(`div`);r.className=`rg-selection-label`,r.setAttribute(`role`,`dialog`),r.setAttribute(`aria-label`,`새 피드백 작성`),r.style.opacity=`0`,r.style.left=`-1000px`,r.style.top=`-1000px`;let i=Ze(`0 0 16 8`,[z(`M0 8 L7.293 0.707 A1 1 0 0 1 8.707 0.707 L16 8 Z`)]);i.classList.add(`rg-label-arrow`);let a=B(`rg-surface`),o=B(`rg-tag-row`),s=document.createElement(`span`);s.className=`rg-tag`,s.textContent=e,o.append(s);let c=B(`rg-bottom-section`),l=document.createElement(`textarea`);l.setAttribute(`aria-keyshortcuts`,`Meta+Enter Control+Enter Escape`),l.maxLength=4e3,l.rows=1,l.placeholder=t,l.setAttribute(`aria-label`,n);let u=Qe(`rg-submit`,`피드백 저장`);return u.title=`저장 (⌘/Ctrl+Enter)`,u.append(Xe()),c.append(l,u),a.append(o,c),r.append(i,a),r}function Ge(){return Ze(`0 0 12 12`,[z(`M2.47 1.76a.5.5 0 0 0-.71.71L5.29 6 1.76 9.53a.5.5 0 0 0 .71.71L6 6.71l3.53 3.53a.5.5 0 0 0 .71-.71L6.71 6l3.53-3.53a.5.5 0 0 0-.71-.71L6 5.29 2.47 1.76Z`)])}function Ke(e,t){queueMicrotask(()=>{let n=e.getBoundingClientRect();if(n.width<=0||n.height<=0)return;let r=window.visualViewport,i=r?.offsetLeft??0,a=r?.offsetTop??0,o=r?.width??window.innerWidth,s=r?.height??window.innerHeight,c=t.anchorX??t.x+t.width/2,l=$e(c,i+8+n.width/2,i+o-8-n.width/2),u=a+s-(t.y+t.height)>=n.height+12+8,d=u?t.y+t.height+12:Math.max(a+8,t.y-12-n.height);e.dataset.side=u?`below`:`above`,e.style.left=`${l}px`,e.style.top=`${d}px`,e.style.opacity=`1`;let f=$e(c-(l-n.width/2),16,n.width-16);e.style.setProperty(`--rg-arrow-left`,`${f}px`)})}function qe(){return Ze(`0 0 12 12`,[z(`M1 6C1 3.239 3.239 1 6 1C8.761 1 11 3.239 11 6C11 8.761 8.761 11 6 11C5.103 11 4.261 10.764 3.532 10.35C2.959 10.759 2.257 11 1.5 11C1.376 11 1.253 10.993 1.132 10.981C0.923 10.959 0.75 10.809 0.699 10.605C0.648 10.402 0.729 10.188 0.903 10.07C1.347 9.768 1.688 9.328 1.865 8.812C1.319 8.011 1 7.042 1 6Z`,{"fill-rule":`evenodd`,"clip-rule":`evenodd`})])}function Je(){return Ze(`0 0 12 12`,[z(`M4.25 2 1.5 6l2.75 4M7.75 2l2.75 4-2.75 4`,{fill:`none`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`})])}function Ye(){return Ze(`0 0 24 24`,[z(`M9.29289 16.7071C8.90237 16.3166 8.90237 15.6834 9.29289 15.2929L12.5858 12L9.29289 8.70711C8.90237 8.31658 8.90237 7.68342 9.29289 7.29289C9.68342 6.90237 10.3166 6.90237 10.7071 7.29289L14.7071 11.2929C14.8946 11.4804 15 11.7348 15 12C15 12.2652 14.8946 12.5196 14.7071 12.7071L10.7071 16.7071C10.3166 17.0976 9.68342 17.0976 9.29289 16.7071Z`,{"fill-rule":`evenodd`,"clip-rule":`evenodd`})])}function Xe(){return Ze(`0 0 24 24`,[z(`M19.2929 12.7071C19.6834 13.0976 20.3166 13.0976 20.7071 12.7071C21.0976 12.3166 21.0976 11.6834 20.7071 11.2929L12.7071 3.29289C12.5196 3.10536 12.2652 3 12 3C11.7348 3 11.4804 3.10536 11.2929 3.29289L3.29289 11.2929C2.90237 11.6834 2.90237 12.3166 3.29289 12.7071C3.68342 13.0976 4.31658 13.0976 4.70711 12.7071L11 6.41421L11 20C11 20.5523 11.4477 21 12 21C12.5523 21 13 20.5523 13 20L13 6.41422L19.2929 12.7071Z`,{"fill-rule":`evenodd`,"clip-rule":`evenodd`})])}function Ze(e,t){let n=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);return n.setAttribute(`viewBox`,e),n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`focusable`,`false`),n.append(...t),n}function z(e,t={}){let n=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);n.setAttribute(`d`,e);for(let[e,r]of Object.entries(t))n.setAttribute(e,r);return n}function B(e){let t=document.createElement(`div`);return t.className=e,t}function Qe(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=e,n.setAttribute(`aria-label`,t),n}function $e(e,t,n){return Math.min(n,Math.max(t,e))}const et={width:106,height:30};function tt(e,t){return`agency-review:toolbar:v1:${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function nt(e){switch(e){case`top-left`:return{edge:`top`,ratio:0};case`top`:return{edge:`top`,ratio:.5};case`top-right`:return{edge:`top`,ratio:1};case`right`:return{edge:`right`,ratio:.5};case`bottom`:return{edge:`bottom`,ratio:.5};case`bottom-left`:return{edge:`bottom`,ratio:0};case`left`:return{edge:`left`,ratio:.5};default:return{edge:`bottom`,ratio:1}}}function rt(e,t,n,r,i,a=16){let o=i.offsetLeft+a,s=Math.max(o,i.offsetLeft+i.width-n-a),c=i.offsetTop+a,l=Math.max(c,i.offsetTop+i.height-r-a),u=U(t,0,1);return e===`top`||e===`bottom`?{x:o+(s-o)*u,y:e===`top`?c:l}:{x:e===`left`?o:s,y:c+(l-c)*u}}function it(e,t,n,r,i){if(e===`top`||e===`bottom`){let e=i.width-n-32;return e<=0?.5:U((t.x-i.offsetLeft-16)/e,0,1)}let a=i.height-r-32;return a<=0?.5:U((t.y-i.offsetTop-16)/a,0,1)}function at(e,t,n,r,i){let a=e.x+r.x*150,o=e.y+r.y*150,s={top:o-i.offsetTop+n/2,bottom:i.offsetTop+i.height-o-n/2,left:a-i.offsetLeft+t/2,right:i.offsetLeft+i.width-a-t/2},c=Object.entries(s).reduce((e,t)=>t[1]<e[1]?t:e)[0],l=i.offsetLeft+16,u=Math.max(l,i.offsetLeft+i.width-t-16),d=i.offsetTop+16,f=Math.max(d,i.offsetTop+i.height-n-16);return{edge:c,x:c===`left`?l:c===`right`?u:U(a,l,u),y:c===`top`?d:c===`bottom`?f:U(o,d,f)}}function ot(e,t,n,r,i){if(e===`top`||e===`bottom`){let a=t.x+(n.width-r.width)/2,o=i.offsetLeft;return{x:U(a,o,Math.max(o,i.offsetLeft+i.width-r.width)),y:e===`top`?i.offsetTop:i.offsetTop+i.height-r.height}}let a=t.y+(n.height-r.height)/2,o=i.offsetTop,s=Math.max(o,i.offsetTop+i.height-r.height);return{x:e===`left`?i.offsetLeft:i.offsetLeft+i.width-r.width,y:U(a,o,s)}}function st(e,t,n,r,i){if(e===`top`||e===`bottom`){let a=t.x-(n.width-r.width)/2,o=i.offsetLeft+16;return{x:U(a,o,Math.max(o,i.offsetLeft+i.width-n.width-16)),y:e===`top`?i.offsetTop+16:i.offsetTop+i.height-n.height-16}}let a=t.y-(n.height-r.height)/2,o=i.offsetTop+16,s=Math.max(o,i.offsetTop+i.height-n.height-16);return{x:e===`left`?i.offsetLeft+16:i.offsetLeft+i.width-n.width-16,y:U(a,o,s)}}function ct(e,t){let n=e.dataset.collapsed!==String(t),r=n?e.getBoundingClientRect():null,i=e.dataset.collapseAnimating===`true`;e.style.setProperty(`--rg-collapse-duration`,`${t?140:220}ms`),e.dataset.collapsed=String(t);let a=e.querySelector(`.rg-toolbar-actions-shell`);a&&(a.inert=t,a.setAttribute(`aria-hidden`,String(t)));let o=e.querySelector(`.rg-collapse`);o?.setAttribute(`aria-expanded`,String(!t)),o?.setAttribute(`aria-label`,t?`Visual Review 펼치기`:`Visual Review 접기`),n&&e.dispatchEvent(new CustomEvent(`review-dock-collapse`,{detail:{collapsed:t,previousRect:r,wasAnimating:i}}))}function lt(e){let{toolbar:t,offset:n,storageKey:r,signal:i}=e,a=nt(e.position),o=mt(r),s=o?.edge??a.edge,c=o?.ratio??a.ratio,l=o!==null,u=!1,d=!1,f=!1,p={x:0,y:0},m={x:0,y:0},h={x:0,y:0},g={x:0,y:0,time:0},_=!1,v=null,y=null,b=null,x=null,S=!1;t.dataset.dockManaged=`true`,t.dataset.dockEdge=s,l&&(t.dataset.position=s),ct(t,o?.collapsed??!1);let C=t.getBoundingClientRect(),w=t.dataset.collapsed===`false`&&H(C)?V(C):pt(t,s),T=t.dataset.collapsed===`true`&&H(C)?V(C):ft(s),E=e=>{let t=rt(s,c,w.width,w.height,e);return{x:t.x+(l?0:n.x),y:t.y+(l?0:n.y)}},D=()=>{let e=t.getBoundingClientRect();H(e)&&(t.dataset.collapsed===`true`?T=V(e):w=V(e));let n=ut(),r=E(n),i=t.dataset.collapsed===`true`;dt(t,i?ot(s,r,w,T,n):r)},O=()=>{_||(_=!0,queueMicrotask(()=>{_=!1,S||D()}))},k=()=>{ht(r,{version:1,edge:s,ratio:c,collapsed:t.dataset.collapsed===`true`})},A=()=>{x?.abort(),x=null},j=n=>{if(!d){if(Math.hypot(n.clientX-m.x,n.clientY-m.y)<=5)return;d=!0,t.dataset.dragging=`true`,e.onDragStart?.()}n.preventDefault();let r=performance.now(),i=r-g.time;i>0&&(h={x:(n.clientX-g.x)/i,y:(n.clientY-g.y)/i}),g={x:n.clientX,y:n.clientY,time:r},dt(t,{x:n.clientX-p.x,y:n.clientY-p.y})},M=()=>{if(A(),u=!1,delete t.dataset.dragging,!d)return;f=!0;let e=t.getBoundingClientRect(),n=ut(),r=at({x:e.left,y:e.top},e.width,e.height,h,n);s=r.edge,c=it(s,r,e.width,e.height,n),l=!0,t.dataset.dockEdge=s,t.dataset.position=s,t.dataset.snapping=`true`,v!==null&&window.cancelAnimationFrame(v),v=window.requestAnimationFrame(()=>{v=window.requestAnimationFrame(()=>{v=null;let e=t.getBoundingClientRect();H(e)&&(w=V(e)),D(),k(),y!==null&&window.clearTimeout(y),y=window.setTimeout(()=>{y=null,delete t.dataset.snapping},300)})})},N=e=>{if(e.button!==0||t.dataset.collapsed===`true`||u)return;let n=t.getBoundingClientRect();u=!0,d=!1,h={x:0,y:0},m={x:e.clientX,y:e.clientY},p={x:e.clientX-n.left,y:e.clientY-n.top},g={x:e.clientX,y:e.clientY,time:performance.now()},A(),x=new AbortController;let r=x.signal;window.addEventListener(`pointermove`,j,{capture:!0,signal:r}),window.addEventListener(`pointerup`,M,{capture:!0,signal:r}),window.addEventListener(`pointercancel`,M,{capture:!0,signal:r})},P=e=>{f&&(f=!1,e.preventDefault(),e.stopImmediatePropagation())},ee=e=>{let n=e.detail,r=n?.collapsed??t.dataset.collapsed===`true`,i=n?.previousRect,a=!n?.wasAnimating,o=ut();if(a&&i&&H(i)&&(r?w=V(i):T=V(i)),t.dataset.collapseAnimating=`true`,r){let e=a&&i&&H(i)?{x:i.left,y:i.top}:E(o);dt(t,ot(s,e,w,T,o))}else{let e=a&&i&&H(i)?{x:i.left,y:i.top}:ot(s,E(o),w,T,o);dt(t,st(s,e,w,T,o))}k(),b!==null&&window.clearTimeout(b),b=window.setTimeout(()=>{b=null,delete t.dataset.collapseAnimating;let e=t.getBoundingClientRect();H(e)&&(r?T=V(e):w=V(e))},r?140:220)},F=()=>O();t.addEventListener(`pointerdown`,N,{signal:i}),t.addEventListener(`click`,P,{capture:!0,signal:i}),t.addEventListener(`review-dock-collapse`,ee,{signal:i}),window.addEventListener(`resize`,F,{passive:!0,signal:i}),window.visualViewport?.addEventListener(`resize`,F,{passive:!0,signal:i}),window.visualViewport?.addEventListener(`scroll`,F,{passive:!0,signal:i}),O();let I=()=>{S=!0,A(),v!==null&&window.cancelAnimationFrame(v),y!==null&&window.clearTimeout(y),b!==null&&window.clearTimeout(b),v=null,y=null,b=null};return i.addEventListener(`abort`,I,{once:!0}),I}function ut(){let e=window.visualViewport;return{offsetLeft:e?.offsetLeft??0,offsetTop:e?.offsetTop??0,width:e?.width??window.innerWidth,height:e?.height??window.innerHeight}}function dt(e,t){e.style.top=`${t.y}px`,e.style.right=`auto`,e.style.bottom=`auto`,e.style.left=`${t.x}px`,e.style.translate=`none`}function ft(e){return e===`top`||e===`bottom`?{width:32,height:28}:{width:28,height:32}}function V(e){return{width:e.width,height:e.height}}function H(e){return e.width>0&&e.height>0}function pt(e,t){let n=e.parentElement,r=t===`left`||t===`right`?{width:et.height,height:et.width}:et;if(!n)return r;let i=e.cloneNode(!0);i.dataset.collapsed=`false`,i.dataset.dockEdge=t,delete i.dataset.collapseAnimating,delete i.dataset.snapping,i.style.setProperty(`visibility`,`hidden`),i.style.setProperty(`pointer-events`,`none`),i.style.setProperty(`transition`,`none`,`important`),i.style.setProperty(`top`,`-10000px`),i.style.setProperty(`right`,`auto`),i.style.setProperty(`bottom`,`auto`),i.style.setProperty(`left`,`-10000px`),i.style.setProperty(`translate`,`none`);for(let e of i.querySelectorAll(`*`))e.style.setProperty(`transition`,`none`,`important`);n.append(i);let a=i.getBoundingClientRect();return i.remove(),H(a)?V(a):r}function mt(e){try{let t=window.localStorage.getItem(e);if(!t)return null;let n=JSON.parse(t);return n.version!==1||!gt(n.edge)||typeof n.ratio!=`number`||!Number.isFinite(n.ratio)||typeof n.collapsed!=`boolean`?null:{version:1,edge:n.edge,ratio:U(n.ratio,0,1),collapsed:n.collapsed}}catch{return null}}function ht(e,t){try{window.localStorage.setItem(e,JSON.stringify(t))}catch{}}function gt(e){return e===`top`||e===`right`||e===`bottom`||e===`left`}function U(e,t,n){return Math.min(n,Math.max(t,e))}async function _t(e){let t=window.__REACT_GRAB__;if(yt(t))return vt(t);let n=await I(e);return{async copyElement(e){let t=Array.isArray(e)?e:[e],r=(await Promise.allSettled(t.map(e=>n.getElementContext(e)))).flatMap(e=>e.status===`fulfilled`&&e.value.snippet.trim().length>0?[e.value.snippet.trim()]:[]);return r.length!==0&&n.copyContent(r.join(`
1
+ const e=`visual-review:v1:`,t=4096;function n(t,n){return`${e}${encodeURIComponent(JSON.stringify({roots:t,target:n}))}`}function r(t){return t.startsWith(e)}function i(e=document){let t=[],n=[e],r=new Set;for(;n.length>0;){let e=n.shift();if(r.has(e))continue;r.add(e),t.push(e);let i=[];try{i=Array.from(e.querySelectorAll(`*`))}catch{continue}for(let e of i){let t=m(e);t&&!r.has(t)&&n.push(t);let i=h(e);i&&!r.has(i)&&n.push(i)}}return t}function a(e,t=document){if(!e)return[];let n=s(e);if(r(e))return n?o(n,t):[];let a=[];for(let n of i(t))try{a.push(...n.querySelectorAll(e))}catch{return[]}return a}function o(e,t){let n=[t];for(let t of e.roots){let e=[];for(let r of n){let n;try{n=r.querySelectorAll(t.selector)}catch{return[]}for(let r of n){let n=t.kind===`shadow`?m(r):h(r);n&&e.push(n)}}if(e.length===0)return[];n=e}let r=[];for(let t of n)try{r.push(...t.querySelectorAll(e.target))}catch{return[]}return r}function s(e){if(!r(e)||e.length>t)return null;try{let t=JSON.parse(decodeURIComponent(e.slice(17)));return!Array.isArray(t.roots)||t.roots.length===0||t.roots.length>16||!c(t.target)||!t.roots.every(e=>e&&(e.kind===`shadow`||e.kind===`frame`)&&c(e.selector))?null:{roots:t.roots,target:t.target}}catch{return null}}function c(e){return typeof e==`string`&&e.length>0&&e.length<=t}function l(e){let t=e.getBoundingClientRect(),n=t.left,r=t.top,i=t.width,a=t.height,o=e.ownerDocument.defaultView;for(;o&&typeof window<`u`&&o!==window;){let e=g(o);if(!e)break;let t=e.getBoundingClientRect(),s=u(e);n=t.left+(e.clientLeft+n)*s.x,r=t.top+(e.clientTop+r)*s.y,i*=s.x,a*=s.y,o=e.ownerDocument.defaultView}return new DOMRect(n,r,i,a)}function u(e){let t=e.getBoundingClientRect();return{x:e.offsetWidth>0?t.width/e.offsetWidth:1,y:e.offsetHeight>0?t.height/e.offsetHeight:1}}function d(e){return e.nodeType===11&&`host`in e}function f(e){return e.nodeType===9}function p(e){let t=e;for(;t;){if(t.closest(`[data-agency-review-root], [data-react-grab-ignore]`))return!0;let e=t.getRootNode();t=d(e)?e.host:null}return!1}function m(e){try{return e.shadowRoot}catch{return null}}function h(e){if(e.tagName.toLowerCase()!==`iframe`)return null;try{return e.contentDocument}catch{return null}}function g(e){try{let t=e.frameElement;return t&&`clientLeft`in t?t:null}catch{return null}}function _(e){return typeof CSS<`u`&&CSS.escape?CSS.escape(e):e.replace(/([^\w-])/g,`\\$1`)}function v(e){let t=S(e),r=y(e,t);if(t===document)return r;let i=[];for(;t!==document;){if(d(t)){let e=t.host,n=S(e);i.unshift({kind:`shadow`,selector:y(e,n)}),t=n;continue}let e=C(t);if(!e)return r;let n=S(e);i.unshift({kind:`frame`,selector:y(e,n)}),t=n}let a=n(i,r);return a.length<=4096?a:r}function y(e,t){let n=[],r=e,i=e.ownerDocument;for(;r&&r!==i.documentElement;){if(r===i.body){n.unshift(`body`);break}let e=x(r,t);if(e){n.unshift(e);break}let a=r.tagName.toLowerCase(),o=r.parentElement,s=o??b(r);if(s){let e=Array.from(s.children).filter(e=>e.tagName===r?.tagName);e.length>1&&(a+=`:nth-of-type(${e.indexOf(r)+1})`)}n.unshift(a),r=o}return n.join(` > `)}function b(e){let t=e.parentNode;return t&&`children`in t?t:null}function x(e,t){return[e.id?`#${_(e.id)}`:null,w(e,`data-review-id`),w(e,`data-testid`),w(e,`data-id`)].find(e=>{if(!e)return!1;try{return t.querySelectorAll(e).length===1}catch{return!1}})??null}function S(e){let t=e.getRootNode();return f(t)||d(t)?t:e.ownerDocument}function C(e){try{return e.defaultView?.frameElement??null}catch{return null}}function w(e,t){let n=e.getAttribute(t);return n?`[${t}="${_(n)}"]`:null}function T(e){if(!E(e))return!1;let t=D(e);for(;t;){if(!E(t))return!1;t=D(t)}let n=l(e);return n.width>0&&n.height>0&&e.getClientRects().length>0}function E(e){let t=e.ownerDocument.defaultView,n=t?.HTMLElement;if(n&&e instanceof n&&e.hidden)return!1;let r=t?.getComputedStyle(e);return!r||r.display===`none`||r.visibility===`hidden`||r.visibility===`collapse`?!1:r.opacity!==`0`&&r.contentVisibility!==`hidden`}function D(e){if(e.assignedSlot)return e.assignedSlot;if(e.parentElement)return e.parentElement;let t=e.getRootNode();if(d(t))return t.host;if(t.nodeType===9&&t!==document)try{return t.defaultView?.frameElement??null}catch{return null}return null}function O(e){if(!e.selector)return[];if(r(e.selector))return a(e.selector).filter(e=>!p(e));try{let t=Array.from(document.querySelectorAll(e.selector)).filter(e=>!p(e));if(t.length>0)return t}catch{return[]}return a(e.selector).filter(e=>!p(e))}function k(e,t,n){let r=l(e),i=Math.max(r.width,1),a=Math.max(r.height,1);return{selector:v(e),offsetX:M((t-(r.left+window.scrollX))/i),offsetY:M((n-(r.top+window.scrollY))/a),viewportX:M((t-window.scrollX)/Math.max(window.innerWidth,1)),viewportY:M((n-window.scrollY)/Math.max(window.innerHeight,1))}}function A(e,t){return{selector:``,offsetX:M(e),offsetY:M(t),viewportX:M(e),viewportY:M(t)}}function j(e){let t=O(e),n=t.find(T)??t[0]??null;if(n){let t=l(n);return{x:t.left+window.scrollX+t.width*e.offsetX,y:t.top+window.scrollY+t.height*e.offsetY,anchored:!0,visible:T(n),element:n}}return{x:window.scrollX+window.innerWidth*e.viewportX,y:window.scrollY+window.innerHeight*e.viewportY,anchored:!1,visible:!0,element:null}}function M(e){return Math.min(1,Math.max(0,Number.isFinite(e)?e:0))}let N=null,P=null;function ee(e){te(e).catch(()=>void 0)}function F(){return N}function te(e){if(N)return Promise.resolve(N);if(P)return P;let t=ne(e);return P=t,t.catch(()=>{P===t&&(P=null)}),t}async function ne(e){let t=re(e);try{let e=await import(`./primitives-lxsPH8SN.js`);return N=e,e}finally{t()}}function re(e){if(!e||typeof document>`u`)return()=>void 0;let t=[];for(let n of i()){if(!f(n)||!n.head||n.querySelector(`script[nonce], style[nonce]`)?.nonce===e)continue;let r=n.createElement(`style`);r.dataset.agencyReviewNonceMarker=``,r.nonce=e,n.head.prepend(r),t.push(r)}return()=>t.forEach(e=>e.remove())}function ie(e){ee(e)}function ae(e,t){let n=F();if(!n)return se(e,t);try{let r=n.getElementAtPoint(e,t,{filter:e=>n.isElementGrabbable(e)&&!p(e)});return r?ce(r,e,t):null}catch{return se(e,t)}}function I(e){if(e.ownerDocument!==document)return l(e);let t=F();if(!t)return e.getBoundingClientRect();try{let n=t.getElementBounds(e);return new DOMRect(n.x,n.y,n.width,n.height)}catch{return e.getBoundingClientRect()}}function oe(e){ee(e);let t=F();if(!t)return()=>void 0;let n=!1;try{if(!t.isFreezeActive()){let r=re(e);try{t.freeze(),n=!0}finally{r()}}}catch{return()=>void 0}let r=!1;return()=>{if(!(r||!n)){r=!0;try{t.unfreeze()}catch{}}}}function se(e,t){let n=(typeof document.elementsFromPoint==`function`?document.elementsFromPoint(e,t):typeof document.elementFromPoint==`function`?[document.elementFromPoint(e,t)].filter(e=>!!e):[]).find(e=>!p(e))??null;return n?ce(n,e,t):null}function ce(e,t,n){let r=e,i=t,a=n,o=new Set;for(;!o.has(r);){o.add(r);let e=le(r,i,a);if(e&&e!==r&&!p(e)){r=e;continue}let t=ue(r,i,a);if(!t)break;r=t.element,i=t.clientX,a=t.clientY}return r}function le(e,t,n){try{return e.shadowRoot?.elementFromPoint(t,n)??null}catch{return null}}function ue(e,t,n){if(e.tagName.toLowerCase()!==`iframe`)return null;try{let r=e,i=r.contentDocument;if(!i)return null;let a=e.getBoundingClientRect(),o=u(r),s=(t-a.left)/o.x-r.clientLeft,c=(n-a.top)/o.y-r.clientTop,l=i.elementFromPoint(s,c);return l&&!p(l)?{element:l,clientX:s,clientY:c}:null}catch{return null}}const de=Symbol(`source-resolution-stopped`);function fe(e,t){let n=I(e),r=k(e,t.clientX+window.scrollX,t.clientY+window.scrollY),i=Ne(n);return we(r,`element`,i,[je(e,i)])}function pe(e){let t=ae(e.clientX,e.clientY);return t?fe(t,e):we(A(e.clientX/Math.max(window.innerWidth,1),e.clientY/Math.max(window.innerHeight,1)),`viewport`,{pageX:e.clientX+window.scrollX,pageY:e.clientY+window.scrollY,width:0,height:0,viewportX:e.clientX,viewportY:e.clientY,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight},[])}function me(e,t){let n=Math.min(e.clientX,t.clientX),r=Math.min(e.clientY,t.clientY),i=Math.abs(t.clientX-e.clientX),a=Math.abs(t.clientY-e.clientY),o=new DOMRect(n,r,i,a),s=ve(he(o),_e(o)).slice(0,8),c={clientX:n+i/2,clientY:r+a/2},u=s[0];return we(u?k(u,c.clientX+window.scrollX,c.clientY+window.scrollY):A(c.clientX/Math.max(window.innerWidth,1),c.clientY/Math.max(window.innerHeight,1)),`region`,Ne(o),s.map(e=>je(e,Ne(l(e)))))}function he(e){let t=a(`*`).filter(t=>t===t.ownerDocument.body||t===t.ownerDocument.documentElement||p(t)||!T(t)?!1:Pe(e,l(t))),n=new Set(t),r=new Set;return t.forEach(e=>{let t=ge(e);for(;t;)n.has(t)&&r.add(t),t=ge(t)}),t.filter(e=>!r.has(e))}function ge(e){if(e.assignedSlot)return e.assignedSlot;if(e.parentElement)return e.parentElement;let t=e.getRootNode();if(d(t))return t.host;if(f(t)&&t!==document)try{return t.defaultView?.frameElement??null}catch{return null}return null}function _e(e){return{clientX:e.left+e.width/2,clientY:e.top+e.height/2}}function ve(e,t){let n=e.findIndex(e=>{let n=l(e);return t.clientX>=n.left&&t.clientX<=n.right&&t.clientY>=n.top&&t.clientY<=n.bottom});return n<=0?e:[e[n],...e.slice(0,n),...e.slice(n+1)]}async function ye(e,t,n={}){if(n.signal?.aborted)return xe(e,t);let r=be(n),i=e.elements.map(async e=>{let n=Fe(e.selector);if(!n)return{context:e,provenance:void 0};let i=await t.resolve(n,{signal:r.signal});return{context:{...e,source:i.source,componentStack:i.componentStack},provenance:i.provenance}});try{let n=await Promise.allSettled(i.map(e=>Promise.race([e,r.stopped]))),a=n.map((t,n)=>t.status===`fulfilled`&&t.value!==de?t.value.context:e.elements[n]),o=Ce(n.flatMap(e=>e.status===`fulfilled`&&e.value!==de&&e.value.provenance?[{located:e.value.context.source!==null,provenance:e.value.provenance}]:[]))??e.sourceProvenance??Se(t);return{...e,elements:a,...o?{sourceProvenance:o}:{}}}finally{r.dispose()}}function be(e){let t=new AbortController,n=e.signal,r=()=>t.abort(n?.reason);n?.aborted?r():n?.addEventListener(`abort`,r,{once:!0});let i=e.deadlineMs??400,a=setTimeout(()=>t.abort(`source-resolution-deadline`),Number.isFinite(i)?Math.max(0,i):400),o=new Promise(e=>{if(t.signal.aborted){e(de);return}t.signal.addEventListener(`abort`,()=>e(de),{once:!0})});return{signal:t.signal,stopped:o,dispose(){clearTimeout(a),n?.removeEventListener(`abort`,r)}}}function xe(e,t){let n=e.sourceProvenance??Se(t);return{...e,...n?{sourceProvenance:n}:{}}}function Se(e){try{return e.unavailableProvenance?.()}catch{return}}function Ce(e){return(e.find(e=>e.located)??e[0])?.provenance}function we(e,t,n,r){return{kind:t,anchor:e,region:n,elements:r,pageUrl:`${window.location.origin}${window.location.pathname}`,pageTitle:document.title,capturedAt:Date.now(),environment:Te()}}function Te(){let e=navigator.userAgent,t=Math.max(1,window.innerWidth),n=navigator.maxTouchPoints,r=Ae(window.screen?.width,t),i=Ae(window.screen?.height,Math.max(1,window.innerHeight));return{browser:Ee(e),operatingSystem:De(e,navigator.platform,n),deviceType:Oe(e,navigator.platform,t,n),screenWidth:r,screenHeight:i,devicePixelRatio:Ae(window.devicePixelRatio,1)}}function Ee(e){let t=(e.match(/(?:Edg|Edge)\/([\d.]+)/)??e.match(/OPR\/([\d.]+)/)??e.match(/(?:Chrome|CriOS)\/([\d.]+)/)??e.match(/(?:Firefox|FxiOS)\/([\d.]+)/)??e.match(/Version\/([\d.]+).*Safari\//))?.[1]?.split(`.`)[0],n=/(?:Edg|Edge)\//.test(e)?`Edge`:/OPR\//.test(e)?`Opera`:/(?:Chrome|CriOS)\//.test(e)?`Chrome`:/(?:Firefox|FxiOS)\//.test(e)?`Firefox`:/Safari\//.test(e)?`Safari`:`알 수 없는 브라우저`;return t?`${n} ${t}`:n}function De(e,t,n){return ke(e,t,n)?`iPadOS`:/iPhone|iPod/.test(e)?`iOS`:/Android/.test(e)?`Android`:/CrOS/.test(e)?`ChromeOS`:/Windows/.test(e)?`Windows`:/Mac OS X|Macintosh/.test(e)||/Mac/.test(t)?`macOS`:/Linux/.test(e)||/Linux/.test(t)?`Linux`:`알 수 없는 OS`}function Oe(e,t,n,r){return ke(e,t,r)?`tablet`:/Mobi|iPhone|iPod|Android.*Mobile/.test(e)?`mobile`:/iPad|Tablet|Android/.test(e)||r>1&&n<=1024?`tablet`:`desktop`}function ke(e,t,n){return/iPad/.test(e)||t===`MacIntel`&&n>1}function Ae(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}function je(e,t){return{selector:v(e),tagName:e.tagName.toLowerCase(),textPreview:Me(e),rect:t,source:null,componentStack:[]}}function Me(e){let t=(e instanceof HTMLElement?e.innerText:null)||e.textContent;return([e.getAttribute(`aria-label`),t,e.getAttribute(`alt`),e.getAttribute(`title`)].map(e=>(e??``).replace(/\s+/g,` `).trim()).find(Boolean)??``).slice(0,240)}function Ne(e){return{pageX:e.left+window.scrollX,pageY:e.top+window.scrollY,width:e.width,height:e.height,viewportX:e.left,viewportY:e.top,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight}}function Pe(e,t){return e.left<t.right&&e.right>t.left&&e.top<t.bottom&&e.bottom>t.top}function Fe(e){return e?O({selector:e,offsetX:0,offsetY:0,viewportX:0,viewportY:0})[0]??null:null}function Ie(e){let t,n=!1,r={pageId:e.pageId,peers:[],messages:[]},i,a,o=!1,s=``,c=``,l,u=e.cursors||e.chat,d={x:Math.max(24,window.innerWidth-180),y:Math.max(24,window.innerHeight-96)},f=L(`rg-collaboration-cursors`);f.setAttribute(`aria-hidden`,`true`);let p=L(`rg-cursor-chat-announcements`);p.setAttribute(`role`,`log`),p.setAttribute(`aria-live`,`polite`),p.setAttribute(`aria-relevant`,`additions`);let m=new Map,h=L(`rg-collaboration-participants`);h.setAttribute(`role`,`status`);let g=L(`rg-cursor-chat-composer`);g.hidden=!0,g.setAttribute(`role`,`dialog`),g.setAttribute(`aria-label`,`커서 채팅`),g.style.setProperty(`--rg-local-color`,Be(e.session.reviewerId));let _=L(`rg-cursor-chat-header`),v=document.createElement(`strong`);v.textContent=e.session.displayName;let y=document.createElement(`span`);y.textContent=`Enter 전송 · 바깥 클릭 닫기`,_.append(v,y);let b=L(`rg-cursor-chat-preview`);b.hidden=!0;let x=document.createElement(`input`);x.className=`rg-cursor-chat-input`,x.type=`text`,x.maxLength=280,x.placeholder=`메시지 입력…`,x.setAttribute(`aria-label`,`커서 채팅 메시지`),g.append(_,b,x);let S=document.createElement(`button`);S.className=`rg-cursor-chat-mobile-trigger`,S.type=`button`,S.setAttribute(`aria-label`,`커서 채팅 시작`),S.title=`커서 채팅`,S.textContent=`채팅`;let C=()=>{Re(h,r.peers,e.session.displayName),u&&ze(f,r.peers),e.chat&&Le(p,m,r.peers)},w=()=>(s.trim()||c).slice(0,280),T=()=>{b.textContent=c,b.hidden=!c,g.dataset.hasMessage=String(!!c);let e=Math.min(260,Math.max(180,window.innerWidth-24)),t=d.x>window.innerWidth/2,n=d.y>window.innerHeight/2,r=He(t?d.x-e-14:d.x+14,12,Math.max(12,window.innerWidth-e-12)),i=c?118:84,a=He(n?d.y-i-14:d.y+18,12,Math.max(12,window.innerHeight-i-12));g.dataset.horizontal=t?`left`:`right`,g.dataset.vertical=n?`above`:`below`,g.style.left=`${r}px`,g.style.top=`${a}px`},E=()=>{l!==void 0&&window.clearTimeout(l),l=window.setTimeout(()=>{l=void 0,!s.trim()&&(c=``,T(),O(k()))},5e3)},D=e=>{o=e,g.hidden=!e,e?(T(),O(k()),queueMicrotask(()=>x.focus())):(l!==void 0&&(window.clearTimeout(l),l=void 0),s=``,c=``,x.value=``,O(k()),x.blur())};x.addEventListener(`input`,()=>{s=x.value,s.trim()&&(c=``),T(),O(k())}),x.addEventListener(`keydown`,e=>{if(e.key===`Escape`){e.preventDefault(),D(!1);return}if(e.key!==`Enter`||e.isComposing)return;e.preventDefault();let t=s.trim();t&&(c=t,s=``,x.value=``,T(),O(k()),E(),x.focus())});let O=t=>{!u||n||e.repository.publishPresence(e.pageId,e.roomId,{...t,cursorChat:w()})},k=()=>({reviewerId:e.session.reviewerId,displayName:e.session.displayName,color:Be(e.session.reviewerId),active:!0,pathname:e.pathname,cursorX:d.x,cursorY:d.y,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight}),A=()=>({reviewerId:e.session.reviewerId,displayName:e.session.displayName,color:Be(e.session.reviewerId),active:!1,pathname:e.pathname}),j=t=>{t.pointerType===`touch`||t.composedPath().includes(e.root.host)||(d.x=t.clientX,d.y=t.clientY,o&&T(),a=t,i===void 0&&(i=window.requestAnimationFrame(()=>{i=void 0;let e=a;a=void 0,e&&O({...k(),cursorX:e.clientX,cursorY:e.clientY})})))},M=()=>{document.visibilityState!==`visible`&&(o&&D(!1),O(A()))},N=()=>O(A()),P=e=>{!o||e.composedPath().includes(g)||D(!1)},ee=()=>{o&&queueMicrotask(()=>{!o||g.contains(e.root.activeElement)||D(!1)})},F=t=>{t.key!==`/`||t.defaultPrevented||t.repeat||t.isComposing||t.metaKey||t.ctrlKey||t.altKey||o||Ve(t)||e.canOpenChat?.()===!1||(t.preventDefault(),D(!0))},te=e=>{e instanceof KeyboardEvent&&F(e)};return{start(){if(n)return;let i=e.root.querySelector(`.rg-toolbar-actions`);u&&i?.append(h),e.chat&&(i?.append(S),e.root.append(g,p),S.addEventListener(`click`,()=>D(!0)),e.root.addEventListener(`keydown`,te,!0),document.addEventListener(`keydown`,F),document.addEventListener(`pointerdown`,P,!0),g.addEventListener(`focusout`,ee)),u&&(e.root.prepend(f),document.addEventListener(`pointermove`,j,{passive:!0}),document.addEventListener(`pointerleave`,N),document.addEventListener(`visibilitychange`,M)),t=e.repository.subscribe(e.pageId,{roomId:e.roomId,cursors:u,chat:!1},e=>{r=e,C()},e.onFailure),O(A()),C()},stop(){n||(n=!0,i!==void 0&&window.cancelAnimationFrame(i),l!==void 0&&window.clearTimeout(l),document.removeEventListener(`pointermove`,j),document.removeEventListener(`pointerleave`,N),document.removeEventListener(`visibilitychange`,M),e.root.removeEventListener(`keydown`,te,!0),document.removeEventListener(`keydown`,F),document.removeEventListener(`pointerdown`,P,!0),g.removeEventListener(`focusout`,ee),t?.(),f.remove(),h.remove(),S.remove(),g.remove(),p.remove())}}}function Le(e,t,n){let r=new Set(n.map(({peerId:e})=>e));for(let e of t.keys())r.has(e)||t.delete(e);for(let r of n){let n=r.cursorChat?.trim()??``,i=t.get(r.peerId)??``;if(!n||n===i){t.set(r.peerId,n);continue}t.set(r.peerId,n);let a=L(`rg-cursor-chat-announcement`);for(a.textContent=`${r.displayName}, ${r.pathname||`/`}: ${n}`,e.append(a);e.childElementCount>20;)e.firstElementChild?.remove()}}function Re(e,t,n){let r=[n,...t.map(({displayName:e})=>e)];e.hidden=r.length<2,e.textContent=r.length<2?``:`${r.length}명`,e.title=r.join(`, `)}function ze(e,t){e.replaceChildren();for(let n of t){if(!n.active||n.cursorX===void 0||n.cursorY===void 0||!n.viewportWidth||!n.viewportHeight)continue;let t=L(`rg-collaboration-cursor`);t.style.setProperty(`--rg-peer-color`,n.color);let r=n.cursorX/n.viewportWidth*window.innerWidth,i=n.cursorY/n.viewportHeight*window.innerHeight;t.style.left=`${He(r,0,window.innerWidth)}px`,t.style.top=`${He(i,0,window.innerHeight)}px`,t.dataset.horizontal=r>window.innerWidth/2?`left`:`right`,t.dataset.vertical=i>window.innerHeight/2?`above`:`below`;let a=L(`rg-collaboration-cursor-pointer`),o=L(`rg-collaboration-cursor-label`);if(o.textContent=n.displayName,t.append(a,o),n.cursorChat){let e=L(`rg-collaboration-cursor-chat`),r=L(`rg-collaboration-cursor-chat-page`);r.textContent=n.pathname||`/`;let i=L(`rg-collaboration-cursor-chat-body`);i.textContent=n.cursorChat,e.append(r,i),t.append(e)}e.append(t)}}function Be(e){let t=[`#7c3aed`,`#2563eb`,`#0891b2`,`#059669`,`#ca8a04`,`#ea580c`,`#dc2626`],n=0;for(let t of e)n=(n<<5)-n+t.charCodeAt(0)|0;return t[Math.abs(n)%t.length]}function Ve(e){let t=e.composedPath()[0];return t instanceof Element&&t.closest(`input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`)!==null}function L(e){let t=document.createElement(`div`);return t.className=e,t}function He(e,t,n){return Math.min(n,Math.max(t,e))}function Ue(e={}){let t=document.createElement(`div`);t.className=`rg-toolbar`,t.setAttribute(`role`,`toolbar`),t.setAttribute(`aria-label`,`Visual Review`);let n=z(`rg-toolbar-actions-shell`),r=z(`rg-toolbar-actions`);e.developerGrab&&r.append(We());let i=z(`rg-action-wrap`),a=$e(`rg-action rg-feedback-tool`,`피드백 위치 선택`);a.setAttribute(`aria-pressed`,`false`),a.append(Je());let o=document.createElement(`span`);o.className=`rg-tooltip`,o.setAttribute(`aria-hidden`,`true`),o.textContent=`피드백`,i.append(a,o),r.append(i),n.append(r);let s=$e(`rg-collapse`,`Visual Review 접기`);if(s.setAttribute(`aria-expanded`,`true`),s.append(Xe()),t.append(n,s),e.developerGrab){let e=z(`rg-developer-status`);e.dataset.visible=`false`,e.dataset.tone=`neutral`,e.setAttribute(`aria-hidden`,`true`),t.append(e)}return t}function We(){let e=z(`rg-action-wrap`),t=$e(`rg-action rg-developer-grab-tool`,`React Grab 코드 선택`);t.setAttribute(`aria-keyshortcuts`,`Meta+C Control+C`),t.setAttribute(`aria-pressed`,`false`),t.append(Ye());let n=document.createElement(`span`);return n.className=`rg-tooltip`,n.setAttribute(`aria-hidden`,`true`),n.textContent=`코드 선택 · ⌘/Ctrl+C 길게`,e.append(t,n),e}function Ge(e,t,n=t){let r=document.createElement(`div`);r.className=`rg-selection-label`,r.setAttribute(`role`,`dialog`),r.setAttribute(`aria-label`,`새 피드백 작성`),r.style.opacity=`0`,r.style.left=`-1000px`,r.style.top=`-1000px`;let i=Qe(`0 0 16 8`,[R(`M0 8 L7.293 0.707 A1 1 0 0 1 8.707 0.707 L16 8 Z`)]);i.classList.add(`rg-label-arrow`);let a=z(`rg-surface`),o=z(`rg-tag-row`),s=document.createElement(`span`);s.className=`rg-tag`,s.textContent=e,o.append(s);let c=z(`rg-bottom-section`),l=document.createElement(`textarea`);l.setAttribute(`aria-keyshortcuts`,`Meta+Enter Control+Enter Escape`),l.maxLength=4e3,l.rows=1,l.placeholder=t,l.setAttribute(`aria-label`,n);let u=$e(`rg-submit`,`피드백 저장`);return u.title=`저장 (⌘/Ctrl+Enter)`,u.append(Ze()),c.append(l,u),a.append(o,c),r.append(i,a),r}function Ke(){return Qe(`0 0 12 12`,[R(`M2.47 1.76a.5.5 0 0 0-.71.71L5.29 6 1.76 9.53a.5.5 0 0 0 .71.71L6 6.71l3.53 3.53a.5.5 0 0 0 .71-.71L6.71 6l3.53-3.53a.5.5 0 0 0-.71-.71L6 5.29 2.47 1.76Z`)])}function qe(e,t){queueMicrotask(()=>{let n=e.getBoundingClientRect();if(n.width<=0||n.height<=0)return;let r=window.visualViewport,i=r?.offsetLeft??0,a=r?.offsetTop??0,o=r?.width??window.innerWidth,s=r?.height??window.innerHeight,c=t.anchorX??t.x+t.width/2,l=et(c,i+8+n.width/2,i+o-8-n.width/2),u=a+s-(t.y+t.height)>=n.height+12+8,d=u?t.y+t.height+12:Math.max(a+8,t.y-12-n.height);e.dataset.side=u?`below`:`above`,e.style.left=`${l}px`,e.style.top=`${d}px`,e.style.opacity=`1`;let f=et(c-(l-n.width/2),16,n.width-16);e.style.setProperty(`--rg-arrow-left`,`${f}px`)})}function Je(){return Qe(`0 0 12 12`,[R(`M1 6C1 3.239 3.239 1 6 1C8.761 1 11 3.239 11 6C11 8.761 8.761 11 6 11C5.103 11 4.261 10.764 3.532 10.35C2.959 10.759 2.257 11 1.5 11C1.376 11 1.253 10.993 1.132 10.981C0.923 10.959 0.75 10.809 0.699 10.605C0.648 10.402 0.729 10.188 0.903 10.07C1.347 9.768 1.688 9.328 1.865 8.812C1.319 8.011 1 7.042 1 6Z`,{"fill-rule":`evenodd`,"clip-rule":`evenodd`})])}function Ye(){return Qe(`0 0 12 12`,[R(`M4.25 2 1.5 6l2.75 4M7.75 2l2.75 4-2.75 4`,{fill:`none`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`})])}function Xe(){return Qe(`0 0 24 24`,[R(`M9.29289 16.7071C8.90237 16.3166 8.90237 15.6834 9.29289 15.2929L12.5858 12L9.29289 8.70711C8.90237 8.31658 8.90237 7.68342 9.29289 7.29289C9.68342 6.90237 10.3166 6.90237 10.7071 7.29289L14.7071 11.2929C14.8946 11.4804 15 11.7348 15 12C15 12.2652 14.8946 12.5196 14.7071 12.7071L10.7071 16.7071C10.3166 17.0976 9.68342 17.0976 9.29289 16.7071Z`,{"fill-rule":`evenodd`,"clip-rule":`evenodd`})])}function Ze(){return Qe(`0 0 24 24`,[R(`M19.2929 12.7071C19.6834 13.0976 20.3166 13.0976 20.7071 12.7071C21.0976 12.3166 21.0976 11.6834 20.7071 11.2929L12.7071 3.29289C12.5196 3.10536 12.2652 3 12 3C11.7348 3 11.4804 3.10536 11.2929 3.29289L3.29289 11.2929C2.90237 11.6834 2.90237 12.3166 3.29289 12.7071C3.68342 13.0976 4.31658 13.0976 4.70711 12.7071L11 6.41421L11 20C11 20.5523 11.4477 21 12 21C12.5523 21 13 20.5523 13 20L13 6.41422L19.2929 12.7071Z`,{"fill-rule":`evenodd`,"clip-rule":`evenodd`})])}function Qe(e,t){let n=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);return n.setAttribute(`viewBox`,e),n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`focusable`,`false`),n.append(...t),n}function R(e,t={}){let n=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);n.setAttribute(`d`,e);for(let[e,r]of Object.entries(t))n.setAttribute(e,r);return n}function z(e){let t=document.createElement(`div`);return t.className=e,t}function $e(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=e,n.setAttribute(`aria-label`,t),n}function et(e,t,n){return Math.min(n,Math.max(t,e))}const tt={width:106,height:30};function nt(e,t){return`agency-review:toolbar:v1:${encodeURIComponent(e)}:${encodeURIComponent(t)}`}function rt(e){switch(e){case`top-left`:return{edge:`top`,ratio:0};case`top`:return{edge:`top`,ratio:.5};case`top-right`:return{edge:`top`,ratio:1};case`right`:return{edge:`right`,ratio:.5};case`bottom`:return{edge:`bottom`,ratio:.5};case`bottom-left`:return{edge:`bottom`,ratio:0};case`left`:return{edge:`left`,ratio:.5};default:return{edge:`bottom`,ratio:1}}}function it(e,t,n,r,i,a=16){let o=i.offsetLeft+a,s=Math.max(o,i.offsetLeft+i.width-n-a),c=i.offsetTop+a,l=Math.max(c,i.offsetTop+i.height-r-a),u=H(t,0,1);return e===`top`||e===`bottom`?{x:o+(s-o)*u,y:e===`top`?c:l}:{x:e===`left`?o:s,y:c+(l-c)*u}}function at(e,t,n,r,i){if(e===`top`||e===`bottom`){let e=i.width-n-32;return e<=0?.5:H((t.x-i.offsetLeft-16)/e,0,1)}let a=i.height-r-32;return a<=0?.5:H((t.y-i.offsetTop-16)/a,0,1)}function ot(e,t,n,r,i){let a=e.x+r.x*150,o=e.y+r.y*150,s={top:o-i.offsetTop+n/2,bottom:i.offsetTop+i.height-o-n/2,left:a-i.offsetLeft+t/2,right:i.offsetLeft+i.width-a-t/2},c=Object.entries(s).reduce((e,t)=>t[1]<e[1]?t:e)[0],l=i.offsetLeft+16,u=Math.max(l,i.offsetLeft+i.width-t-16),d=i.offsetTop+16,f=Math.max(d,i.offsetTop+i.height-n-16);return{edge:c,x:c===`left`?l:c===`right`?u:H(a,l,u),y:c===`top`?d:c===`bottom`?f:H(o,d,f)}}function st(e,t,n,r,i){if(e===`top`||e===`bottom`){let a=t.x+(n.width-r.width)/2,o=i.offsetLeft;return{x:H(a,o,Math.max(o,i.offsetLeft+i.width-r.width)),y:e===`top`?i.offsetTop:i.offsetTop+i.height-r.height}}let a=t.y+(n.height-r.height)/2,o=i.offsetTop,s=Math.max(o,i.offsetTop+i.height-r.height);return{x:e===`left`?i.offsetLeft:i.offsetLeft+i.width-r.width,y:H(a,o,s)}}function ct(e,t,n,r,i){if(e===`top`||e===`bottom`){let a=t.x-(n.width-r.width)/2,o=i.offsetLeft+16;return{x:H(a,o,Math.max(o,i.offsetLeft+i.width-n.width-16)),y:e===`top`?i.offsetTop+16:i.offsetTop+i.height-n.height-16}}let a=t.y-(n.height-r.height)/2,o=i.offsetTop+16,s=Math.max(o,i.offsetTop+i.height-n.height-16);return{x:e===`left`?i.offsetLeft+16:i.offsetLeft+i.width-n.width-16,y:H(a,o,s)}}function lt(e,t){let n=e.dataset.collapsed!==String(t),r=n?e.getBoundingClientRect():null,i=e.dataset.collapseAnimating===`true`;e.style.setProperty(`--rg-collapse-duration`,`${t?140:220}ms`),e.dataset.collapsed=String(t);let a=e.querySelector(`.rg-toolbar-actions-shell`);a&&(a.inert=t,a.setAttribute(`aria-hidden`,String(t)));let o=e.querySelector(`.rg-collapse`);o?.setAttribute(`aria-expanded`,String(!t)),o?.setAttribute(`aria-label`,t?`Visual Review 펼치기`:`Visual Review 접기`),n&&e.dispatchEvent(new CustomEvent(`review-dock-collapse`,{detail:{collapsed:t,previousRect:r,wasAnimating:i}}))}function ut(e){let{toolbar:t,offset:n,storageKey:r,signal:i}=e,a=rt(e.position),o=ht(r),s=o?.edge??a.edge,c=o?.ratio??a.ratio,l=o!==null,u=!1,d=!1,f=!1,p={x:0,y:0},m={x:0,y:0},h={x:0,y:0},g={x:0,y:0,time:0},_=!1,v=null,y=null,b=null,x=null,S=!1;t.dataset.dockManaged=`true`,t.dataset.dockEdge=s,l&&(t.dataset.position=s),lt(t,o?.collapsed??!1);let C=t.getBoundingClientRect(),w=t.dataset.collapsed===`false`&&V(C)?B(C):mt(t,s),T=t.dataset.collapsed===`true`&&V(C)?B(C):pt(s),E=e=>{let t=it(s,c,w.width,w.height,e);return{x:t.x+(l?0:n.x),y:t.y+(l?0:n.y)}},D=()=>{let e=t.getBoundingClientRect();V(e)&&(t.dataset.collapsed===`true`?T=B(e):w=B(e));let n=dt(),r=E(n),i=t.dataset.collapsed===`true`;ft(t,i?st(s,r,w,T,n):r)},O=()=>{_||(_=!0,queueMicrotask(()=>{_=!1,S||D()}))},k=()=>{gt(r,{version:1,edge:s,ratio:c,collapsed:t.dataset.collapsed===`true`})},A=()=>{x?.abort(),x=null},j=n=>{if(!d){if(Math.hypot(n.clientX-m.x,n.clientY-m.y)<=5)return;d=!0,t.dataset.dragging=`true`,e.onDragStart?.()}n.preventDefault();let r=performance.now(),i=r-g.time;i>0&&(h={x:(n.clientX-g.x)/i,y:(n.clientY-g.y)/i}),g={x:n.clientX,y:n.clientY,time:r},ft(t,{x:n.clientX-p.x,y:n.clientY-p.y})},M=()=>{if(A(),u=!1,delete t.dataset.dragging,!d)return;f=!0;let e=t.getBoundingClientRect(),n=dt(),r=ot({x:e.left,y:e.top},e.width,e.height,h,n);s=r.edge,c=at(s,r,e.width,e.height,n),l=!0,t.dataset.dockEdge=s,t.dataset.position=s,t.dataset.snapping=`true`,v!==null&&window.cancelAnimationFrame(v),v=window.requestAnimationFrame(()=>{v=window.requestAnimationFrame(()=>{v=null;let e=t.getBoundingClientRect();V(e)&&(w=B(e)),D(),k(),y!==null&&window.clearTimeout(y),y=window.setTimeout(()=>{y=null,delete t.dataset.snapping},300)})})},N=e=>{if(e.button!==0||t.dataset.collapsed===`true`||u)return;let n=t.getBoundingClientRect();u=!0,d=!1,h={x:0,y:0},m={x:e.clientX,y:e.clientY},p={x:e.clientX-n.left,y:e.clientY-n.top},g={x:e.clientX,y:e.clientY,time:performance.now()},A(),x=new AbortController;let r=x.signal;window.addEventListener(`pointermove`,j,{capture:!0,signal:r}),window.addEventListener(`pointerup`,M,{capture:!0,signal:r}),window.addEventListener(`pointercancel`,M,{capture:!0,signal:r})},P=e=>{f&&(f=!1,e.preventDefault(),e.stopImmediatePropagation())},ee=e=>{let n=e.detail,r=n?.collapsed??t.dataset.collapsed===`true`,i=n?.previousRect,a=!n?.wasAnimating,o=dt();if(a&&i&&V(i)&&(r?w=B(i):T=B(i)),t.dataset.collapseAnimating=`true`,r){let e=a&&i&&V(i)?{x:i.left,y:i.top}:E(o);ft(t,st(s,e,w,T,o))}else{let e=a&&i&&V(i)?{x:i.left,y:i.top}:st(s,E(o),w,T,o);ft(t,ct(s,e,w,T,o))}k(),b!==null&&window.clearTimeout(b),b=window.setTimeout(()=>{b=null,delete t.dataset.collapseAnimating;let e=t.getBoundingClientRect();V(e)&&(r?T=B(e):w=B(e))},r?140:220)},F=()=>O();t.addEventListener(`pointerdown`,N,{signal:i}),t.addEventListener(`click`,P,{capture:!0,signal:i}),t.addEventListener(`review-dock-collapse`,ee,{signal:i}),window.addEventListener(`resize`,F,{passive:!0,signal:i}),window.visualViewport?.addEventListener(`resize`,F,{passive:!0,signal:i}),window.visualViewport?.addEventListener(`scroll`,F,{passive:!0,signal:i}),O();let te=()=>{S=!0,A(),v!==null&&window.cancelAnimationFrame(v),y!==null&&window.clearTimeout(y),b!==null&&window.clearTimeout(b),v=null,y=null,b=null};return i.addEventListener(`abort`,te,{once:!0}),te}function dt(){let e=window.visualViewport;return{offsetLeft:e?.offsetLeft??0,offsetTop:e?.offsetTop??0,width:e?.width??window.innerWidth,height:e?.height??window.innerHeight}}function ft(e,t){e.style.top=`${t.y}px`,e.style.right=`auto`,e.style.bottom=`auto`,e.style.left=`${t.x}px`,e.style.translate=`none`}function pt(e){return e===`top`||e===`bottom`?{width:32,height:28}:{width:28,height:32}}function B(e){return{width:e.width,height:e.height}}function V(e){return e.width>0&&e.height>0}function mt(e,t){let n=e.parentElement,r=t===`left`||t===`right`?{width:tt.height,height:tt.width}:tt;if(!n)return r;let i=e.cloneNode(!0);i.dataset.collapsed=`false`,i.dataset.dockEdge=t,delete i.dataset.collapseAnimating,delete i.dataset.snapping,i.style.setProperty(`visibility`,`hidden`),i.style.setProperty(`pointer-events`,`none`),i.style.setProperty(`transition`,`none`,`important`),i.style.setProperty(`top`,`-10000px`),i.style.setProperty(`right`,`auto`),i.style.setProperty(`bottom`,`auto`),i.style.setProperty(`left`,`-10000px`),i.style.setProperty(`translate`,`none`);for(let e of i.querySelectorAll(`*`))e.style.setProperty(`transition`,`none`,`important`);n.append(i);let a=i.getBoundingClientRect();return i.remove(),V(a)?B(a):r}function ht(e){try{let t=window.localStorage.getItem(e);if(!t)return null;let n=JSON.parse(t);return n.version!==1||!_t(n.edge)||typeof n.ratio!=`number`||!Number.isFinite(n.ratio)||typeof n.collapsed!=`boolean`?null:{version:1,edge:n.edge,ratio:H(n.ratio,0,1),collapsed:n.collapsed}}catch{return null}}function gt(e,t){try{window.localStorage.setItem(e,JSON.stringify(t))}catch{}}function _t(e){return e===`top`||e===`right`||e===`bottom`||e===`left`}function H(e,t,n){return Math.min(n,Math.max(t,e))}async function vt(e){let t=window.__REACT_GRAB__;if(bt(t))return yt(t);let n=await te(e);return{async copyElement(e){let t=Array.isArray(e)?e:[e],r=(await Promise.allSettled(t.map(e=>n.getElementContext(e)))).flatMap(e=>e.status===`fulfilled`&&e.value.snippet.trim().length>0?[e.value.snippet.trim()]:[]);return r.length!==0&&n.copyContent(r.join(`
2
2
 
3
- `))},dispose(){}}}function vt(e){return{copyElement:t=>e.copyElement(t),dispose(){}}}function yt(e){return typeof e==`object`&&!!e&&`copyElement`in e&&typeof e.copyElement==`function`}function bt(e,t=`all`){let n=[...e.comments].sort(St),r=new Map;for(let e of n){if(!xt(e.pageNumber))continue;let t=r.get(e.pageId);t||(t=new Set,r.set(e.pageId,t)),t.add(e.pageNumber)}let i=new Map,a=new Map;for(let e of n){let t=i.get(e.pageId);t||(t=new Set,i.set(e.pageId,t));let n=xt(e.pageNumber)&&!t.has(e.pageNumber)?e.pageNumber:void 0,o=n??1,s=r.get(e.pageId);for(;t.has(o)||n===void 0&&s?.has(o);)o+=1;t.add(o),a.set(e.id,o)}let o=new Map;for(let t of e.replies){if(!a.has(t.commentId))continue;let e=o.get(t.commentId);e?(e.replyCount+=1,e.lastReplyAt=Math.max(e.lastReplyAt,t.updatedAt)):o.set(t.commentId,{replyCount:1,lastReplyAt:t.updatedAt})}let s=n.map(e=>{let t=o.get(e.id);return{comment:e,pinNumber:a.get(e.id),replyCount:t?.replyCount??0,lastActivityAt:Math.max(e.updatedAt,t?.lastReplyAt??e.updatedAt)}}),c={all:s.length,open:s.filter(({comment:e})=>e.status===`open`).length,resolved:s.filter(({comment:e})=>e.status===`resolved`).length};return{rows:s.filter(({comment:e})=>t===`all`||e.status===t).sort(Ct),counts:c,pinNumberByCommentId:a}}function xt(e){return Number.isSafeInteger(e)&&(e??0)>=1}function St(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function Ct(e,t){return t.lastActivityAt-e.lastActivityAt||t.comment.createdAt-e.comment.createdAt||e.comment.id.localeCompare(t.comment.id)}const wt=`visual-review-feedback-navigator`,Tt=[`current`,`all`],Et={current:`현재 페이지`,all:`전체 페이지`},Dt=[`all`,`open`,`resolved`],Ot={all:`전체`,open:`진행 중`,resolved:`완료`};function kt(e,t={}){let n=t.controlsId??wt,r=G(`rg-action-wrap`),i=document.createElement(`button`);i.type=`button`,i.className=`rg-action rg-feedback-list-tool`,i.dataset.feedbackNavigatorAction=`toggle`,i.setAttribute(`aria-controls`,n),i.setAttribute(`aria-expanded`,String(t.expanded??!1)),t.presentation===`sheet`&&i.setAttribute(`aria-haspopup`,`dialog`),i.setAttribute(`aria-label`,`피드백 목록, 총 ${K(e)}개`),i.append(Rt(),Lt(e));let a=document.createElement(`span`);return a.className=`rg-tooltip`,a.setAttribute(`aria-hidden`,`true`),a.textContent=`피드백 ${K(e)}개`,r.append(i,a),r}function At(e,t={}){let n=t.id??wt,r=`${n}-title`,i=t.presentation??`tray`,a=document.createElement(`section`);a.id=n,a.className=`rg-feedback-navigator`,a.dataset.presentation=i,a.dataset.loadState=e.loadState??`ready`,a.dataset.filter=e.filter,a.dataset.scope=e.scope,a.setAttribute(`aria-labelledby`,r),a.setAttribute(`aria-busy`,String(e.loadState===`loading`)),i===`sheet`?(a.setAttribute(`role`,`dialog`),a.setAttribute(`aria-modal`,`true`)):a.setAttribute(`role`,`region`);let o=G(`rg-feedback-navigator-header`),s=G(`rg-feedback-navigator-heading`),c=document.createElement(`h2`);c.id=r,c.className=`rg-feedback-navigator-title`,c.textContent=t.title??`피드백`;let l=document.createElement(`span`);l.className=`rg-feedback-navigator-total`,l.setAttribute(`aria-hidden`,`true`),l.textContent=String(K(e.counts.all)),s.append(c,l);let u=document.createElement(`button`);u.type=`button`,u.className=`rg-feedback-navigator-close`,u.dataset.feedbackNavigatorAction=`close`,u.setAttribute(`aria-label`,`피드백 목록 닫기`),u.append(zt()),o.append(s,u);let d=G(`rg-feedback-navigator-content`);if(Ut(d,e),e.loadState!==`loading`&&e.loadState!==`error`&&(e.rows.length===0?d.append(Wt(e.scopeCounts.all===0,e.scope===`current`&&e.scopeCounts.current===0&&e.scopeCounts.all>0)):Pt(d,e)),a.append(o),e.scopeCounts.all>e.scopeCounts.current&&e.loadState!==`loading`&&e.loadState!==`error`){let t=G(`rg-feedback-scopes`);t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,`피드백 페이지 범위`);for(let n of Tt)t.append(Mt(n,e.scopeCounts[n],e.scope===n));a.append(t)}if(e.counts.all>0&&e.loadState!==`loading`&&e.loadState!==`error`){let t=G(`rg-feedback-filters`);t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,`피드백 상태 필터`);for(let n of Dt)t.append(Nt(n,e.counts[n],e.filter===n));let n=document.createElement(`span`);n.className=`rg-feedback-sort-label`,n.textContent=`최근 활동순`,n.setAttribute(`aria-hidden`,`true`),t.append(n),a.append(t)}return a.append(d),t.exitReviewState&&a.append(jt(t.exitReviewState)),a}function jt(e){let t=G(`rg-feedback-navigator-footer`);if(t.dataset.exitState=e,e===`idle`){let e=document.createElement(`button`);return e.type=`button`,e.className=`rg-feedback-navigator-exit-link`,e.dataset.feedbackNavigatorAction=`exit-review`,e.setAttribute(`aria-label`,`이 브라우저에서 이 사이트의 리뷰 종료`),e.textContent=`리뷰 종료`,t.append(e),t}let n=G(`rg-feedback-navigator-exit-copy`),r=document.createElement(`strong`),i=document.createElement(`span`);if(e===`saving`)return r.textContent=`저장 중입니다`,i.textContent=`저장이 끝난 뒤 다시 시도해 주세요.`,n.append(r,i),t.append(n),t;r.textContent=e===`draft-warning`?`작성 중인 내용이 있습니다`:`리뷰를 종료할까요?`,i.textContent=e===`draft-warning`?`저장하지 않은 내용은 사라집니다.`:`저장된 피드백은 그대로 유지됩니다.`,n.append(r,i);let a=G(`rg-feedback-navigator-exit-actions`),o=document.createElement(`button`);o.type=`button`,o.className=`rg-feedback-navigator-exit-cancel`,o.dataset.feedbackNavigatorAction=`cancel-exit-review`,o.textContent=`취소`;let s=document.createElement(`button`);return s.type=`button`,s.className=`rg-feedback-navigator-exit-confirm`,s.dataset.feedbackNavigatorAction=`confirm-exit-review`,s.textContent=e===`draft-warning`?`그래도 종료`:`종료`,a.append(o,s),t.append(n,a),t}function Mt(e,t,n){let r=document.createElement(`button`);r.type=`button`,r.className=`rg-feedback-scope`,r.dataset.feedbackScope=e,r.dataset.feedbackNavigatorAction=`scope`,r.setAttribute(`aria-pressed`,String(n)),r.setAttribute(`aria-label`,`${Et[e]} 피드백 ${K(t)}개`);let i=document.createElement(`span`);i.textContent=Et[e];let a=document.createElement(`span`);return a.className=`rg-feedback-scope-count`,a.setAttribute(`aria-hidden`,`true`),a.textContent=String(K(t)),r.append(i,a),r}function Nt(e,t,n){let r=document.createElement(`button`);r.type=`button`,r.className=`rg-feedback-filter`,r.dataset.feedbackFilter=e,r.dataset.feedbackNavigatorAction=`filter`,r.setAttribute(`aria-pressed`,String(n)),r.setAttribute(`aria-label`,`${Ot[e]} 피드백 ${K(t)}개`);let i=document.createElement(`span`);i.className=`rg-feedback-filter-label`,i.textContent=Ot[e];let a=document.createElement(`span`);return a.className=`rg-feedback-filter-count`,a.setAttribute(`aria-hidden`,`true`),a.textContent=String(K(t)),r.append(i,a),r}function Pt(e,t){if(t.scope!==`all`){e.append(Ft(t.rows,t.activeCommentId,!1));return}let n=new Map;for(let e of t.rows){let t=n.get(e.pageId);t?t.push(e):n.set(e.pageId,[e])}let r=[...n.values()].sort((e,t)=>Number(!!t[0]?.currentPage)-Number(!!e[0]?.currentPage));for(let n of r){let r=document.createElement(`section`);r.className=`rg-feedback-page-group`,r.setAttribute(`role`,`group`),n[0]?.currentPage&&(r.dataset.currentPage=`true`);let i=G(`rg-feedback-page-heading`),a=document.createElement(`span`);a.className=`rg-feedback-page-label`,a.textContent=n[0]?.pageLabel?.trim()||`알 수 없는 페이지`;let o=document.createElement(`span`);o.className=`rg-feedback-page-count`,o.textContent=String(n.length),o.setAttribute(`aria-hidden`,`true`),i.append(a,o),r.setAttribute(`aria-label`,`${a.textContent} 피드백 ${n.length}개`),r.append(i,Ft(n,t.activeCommentId,!0)),e.append(r)}}function Ft(e,t,n){let r=document.createElement(`ul`);r.className=`rg-feedback-list`,r.setAttribute(`aria-label`,n?`페이지 피드백 목록`:`피드백 목록`);for(let i of e)r.append(It(i,t,{showPageLabel:!n}));return r}function It(e,t,n={}){let r=document.createElement(`li`);r.className=`rg-feedback-item`,r.dataset.commentId=e.id;let i=document.createElement(`button`);i.type=`button`,i.className=`rg-feedback-row`,i.dataset.commentId=e.id,i.dataset.feedbackNavigatorAction=`open-comment`,i.dataset.status=e.status,i.dataset.currentPage=String(e.currentPage===!0),i.dataset.locationAvailable=String(e.locationAvailable!==!1),e.id===t&&i.setAttribute(`aria-current`,`true`),i.setAttribute(`aria-label`,Gt(e));let a=document.createElement(`span`);a.className=`rg-feedback-row-pin`,a.setAttribute(`aria-hidden`,`true`),a.textContent=`#${Math.max(1,Math.trunc(e.pinNumber))}`;let o=G(`rg-feedback-row-copy`),s=document.createElement(`span`);s.className=`rg-feedback-row-body`,s.textContent=e.body;let c=n.showPageLabel!==!1;if(c&&e.pageLabel?.trim()||e.targetLabel?.trim()){let t=document.createElement(`span`);t.className=`rg-feedback-row-context`,e.pageUrl?.trim()&&(t.dataset.pageUrl=e.pageUrl.trim(),t.title=e.pageUrl.trim()),e.currentPage&&(t.dataset.currentPage=`true`);let n=c?e.pageLabel?.trim():void 0;if(n&&t.append(document.createTextNode(n)),n&&e.targetLabel?.trim()&&t.append(document.createTextNode(` · `)),e.targetLabel?.trim()){let n=document.createElement(`span`);n.className=`rg-feedback-row-target`,n.textContent=e.targetLabel.trim(),t.append(n)}o.append(t)}let l=G(`rg-feedback-row-detail`),u=document.createElement(`span`);u.className=`rg-feedback-row-meta`,u.textContent=`${e.authorName} · ${e.timeLabel}`;let d=G(`rg-feedback-row-trailing`);if(!e.currentPage){let e=document.createElement(`span`);e.className=`rg-feedback-row-move`,e.setAttribute(`aria-hidden`,`true`),e.title=`이 페이지로 이동`;let t=document.createElement(`span`);t.textContent=`이동`,e.append(t,Ht()),d.append(e)}if(e.locationAvailable===!1){let e=document.createElement(`span`);e.className=`rg-feedback-row-location-missing`,e.setAttribute(`aria-hidden`,`true`),e.title=`현재 화면에서 위치를 찾을 수 없음`,e.append(Bt()),d.append(e)}if(e.replyCount>0){let t=document.createElement(`span`);t.className=`rg-feedback-row-replies`,t.setAttribute(`aria-hidden`,`true`),t.textContent=`답글 ${K(e.replyCount)}`,d.append(t)}if(e.status===`resolved`){let e=document.createElement(`span`);e.className=`rg-feedback-row-status`,e.setAttribute(`aria-hidden`,`true`),e.title=`완료`,e.append(Vt());let t=document.createElement(`span`);t.className=`rg-visually-hidden`,t.textContent=`완료`,e.append(t),d.append(e)}return l.append(u,d),o.append(s,l),i.append(a,o),r.append(i),r}function Lt(e){let t=document.createElement(`span`);return t.className=`rg-feedback-list-count`,t.dataset.feedbackCount=``,t.setAttribute(`aria-hidden`,`true`),t.hidden=K(e)===0,t.textContent=String(K(e)),t}function Rt(){return Kt(`0 0 14 14`,[W(`M4.75 3.25h6.5M4.75 7h6.5M4.75 10.75h6.5`),W(`M2.25 3.25h.01M2.25 7h.01M2.25 10.75h.01`,{"stroke-linecap":`round`,"stroke-width":`1.5`})])}function zt(){return Kt(`0 0 12 12`,[W(`M2.47 1.76a.5.5 0 0 0-.71.71L5.29 6 1.76 9.53a.5.5 0 0 0 .71.71L6 6.71l3.53 3.53a.5.5 0 0 0 .71-.71L6.71 6l3.53-3.53a.5.5 0 0 0-.71-.71L6 5.29 2.47 1.76Z`,{fill:`currentColor`,stroke:`none`})])}function Bt(){return Kt(`0 0 14 14`,[W(`M7 12.25s4-3.27 4-6.5a4 4 0 1 0-8 0c0 3.23 4 6.5 4 6.5Z`),W(`m4.75 3.5 4.5 4.5`)])}function Vt(){return Kt(`0 0 12 12`,[W(`m2.25 6.25 2.25 2.25 5.25-5.25`)])}function Ht(){return Kt(`0 0 12 12`,[W(`M2.25 6h7.5M6.75 3l3 3-3 3`)])}function Ut(e,t){let n=t.loadState??`ready`;if(n===`ready`)return;let r=G(`rg-feedback-navigator-state`);if(r.dataset.state=n,n===`error`){r.setAttribute(`role`,`alert`);let e=document.createElement(`span`);if(e.textContent=t.errorMessage?.trim()||`불러오지 못함`,r.append(e),t.errorRecovery!==`reauthenticate`){let e=document.createElement(`button`);e.type=`button`,e.className=`rg-feedback-navigator-retry`,e.dataset.feedbackNavigatorAction=`retry`,e.textContent=`재시도`,r.append(e)}}else r.setAttribute(`role`,`status`),r.setAttribute(`aria-live`,`polite`),r.textContent=n===`loading`?`불러오는 중`:`연결 확인 중`;e.append(r)}function Wt(e,t=!1){let n=G(`rg-feedback-navigator-empty`);return n.setAttribute(`role`,`status`),n.textContent=e?`피드백 없음`:t?`현재 페이지 피드백 없음`:`해당 피드백 없음`,n}function Gt(e){let t=[`피드백 #${Math.max(1,Math.trunc(e.pinNumber))}`,...e.pageLabel?.trim()?[`페이지 ${e.pageLabel.trim()}`]:[],...e.targetLabel?.trim()?[`대상 ${e.targetLabel.trim()}`]:[],e.body,e.authorName,`최근 활동 ${e.timeLabel}`];return e.replyCount>0&&t.push(`답글 ${K(e.replyCount)}개`),t.push(e.status===`resolved`?`완료`:`진행 중`),e.locationAvailable===!1&&t.push(`현재 화면에서 위치를 찾을 수 없음`),e.currentPage||t.push(`다른 페이지로 이동`),t.join(`, `)}function Kt(e,t){let n=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);n.setAttribute(`viewBox`,e),n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`focusable`,`false`);for(let e of t)n.append(e);return n}function W(e,t={}){let n=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);n.setAttribute(`d`,e),n.setAttribute(`fill`,`none`),n.setAttribute(`stroke`,`currentColor`),n.setAttribute(`stroke-width`,`1.25`),n.setAttribute(`stroke-linecap`,`round`),n.setAttribute(`stroke-linejoin`,`round`);for(let[e,r]of Object.entries(t))n.setAttribute(e,r);return n}function G(e){let t=document.createElement(`div`);return t.className=e,t}function K(e){return Math.max(0,Math.trunc(Number.isFinite(e)?e:0))}function qt(e){let t=e.elements.map(({textPreview:e})=>e.replace(/\s+/g,` `).trim()).find(Boolean);return t?t.length>48?`${t.slice(0,47).trimEnd()}…`:t:e.kind===`region`?`선택 영역`:e.kind===`viewport`?`화면 위치`:`선택 요소`}function Jt(e){let t=j(e.anchor),n=t.x-window.scrollX;if(e.kind===`element`&&t.element){let e=L(t.element);return{x:e.left,y:e.top,width:e.width,height:e.height,anchorX:n}}if(e.kind===`viewport`){let t=en(e);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}let r=Zt(e);return{x:r.left,y:r.top,width:r.width,height:r.height,anchorX:e.kind===`region`?r.left+r.width/2:n}}function Yt(e){if(e.target.kind===`element`){if(q(e).available)return Jt(e.target);let t=window.visualViewport,n=t?.offsetLeft??0,r=t?.offsetTop??0,i=t?.width??window.innerWidth;return{x:n+i/2,y:r+16,width:0,height:0,anchorX:n+i/2}}if(e.target.kind===`viewport`){let t=en(e.target);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}let t=Zt(e.target);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}function q(e){if(e.target.kind===`element`){let t=j(e.anchor);return t.anchored&&t.visible&&t.element?{available:!0,pageX:t.x,pageY:t.y}:{available:!1,pageX:null,pageY:null}}if(e.target.kind===`region`){let t=Qt(e.target);return Number.isFinite(t.pageX)&&Number.isFinite(t.pageY)?{available:!0,pageX:t.pageX,pageY:t.pageY}:{available:!1,pageX:null,pageY:null}}let t=nn(e.target);return Number.isFinite(t.pageX)&&Number.isFinite(t.pageY)?{available:!0,pageX:t.pageX,pageY:t.pageY}:{available:!1,pageX:null,pageY:null}}function Xt(e){return`visual-review-thread-${e.replace(/[^a-zA-Z0-9_-]/g,`-`)}`}function Zt(e){let t=rn(e),n=Qt(e,t),r=Y(e.region.width)*t.x,i=Y(e.region.height)*t.y;return an(new DOMRect(n.pageX-window.scrollX-r/2,n.pageY-window.scrollY-i/2,r,i))}function Qt(e,t=rn(e)){return $t(e,t)??tn(e,t)}function $t(e,t){if(e.kind!==`region`||!e.anchor.selector)return null;let n=j(e.anchor);if(!n.anchored||!n.visible||!n.element)return null;let r=e.elements.find(({selector:t})=>t===e.anchor.selector);if(!r)return{pageX:n.x,pageY:n.y};let i=r.rect.pageX+r.rect.width*e.anchor.offsetX,a=r.rect.pageY+r.rect.height*e.anchor.offsetY,o=e.region.pageX+e.region.width/2,s=e.region.pageY+e.region.height/2;return{pageX:n.x+(o-i)*t.x,pageY:n.y+(s-a)*t.y}}function en(e){let t=nn(e);return on(new DOMRect(t.pageX-window.scrollX-7,t.pageY-window.scrollY-7,14,14))}function tn(e,t=rn(e)){let n=nn(e,t);return{pageX:n.pageX+n.width/2,pageY:n.pageY+n.height/2}}function nn(e,t=rn(e)){let n=e.region,r=X(n.viewportX,n.pageX),i=X(n.viewportY,n.pageY),a=X(n.pageX,window.scrollX+r),o=X(n.pageY,window.scrollY+i),s=a-r,c=o-i;return{pageX:s+r*t.x,pageY:c+i*t.y,width:Y(n.width)*t.x,height:Y(n.height)*t.y}}function rn(e){let t=J(window.innerWidth,1),n=J(window.innerHeight,1),r=J(e.region.viewportWidth,t),i=J(e.region.viewportHeight,n);return{x:t/r,y:n/i}}function an(e){let t=sn(),n=cn(X(e.left,t.left),t.left,t.right),r=cn(X(e.top,t.top),t.top,t.bottom),i=cn(X(e.right,n),t.left,t.right),a=cn(X(e.bottom,r),t.top,t.bottom);return new DOMRect(n,r,Math.max(0,i-n),Math.max(0,a-r))}function on(e){let t=sn(),n=Math.min(Y(e.width),t.width),r=Math.min(Y(e.height),t.height);return new DOMRect(cn(X(e.left,t.left),t.left,t.right-n),cn(X(e.top,t.top),t.top,t.bottom-r),n,r)}function sn(){let e=window.visualViewport;return new DOMRect(X(e?.offsetLeft,0),X(e?.offsetTop,0),J(e?.width,window.innerWidth),J(e?.height,window.innerHeight))}function J(e,t){return Number.isFinite(e)&&(e??0)>0?e:Math.max(Number.isFinite(t)?t:1,1)}function Y(e){return Number.isFinite(e)?Math.max(0,e):0}function X(e,t){return Number.isFinite(e)?e:Number.isFinite(t)?t:0}function cn(e,t,n){return Math.min(n,Math.max(t,e))}const ln=1e6;async function un(e){if(!document.body||typeof HTMLCanvasElement>`u`)return null;let t=fn(e);document.body.append(t);try{let{toCanvas:t}=await import(`./es-BeyOi4lh.js`),n=dn(e,window.innerWidth,window.innerHeight),r=await t(document.body,{width:n.outputWidth,height:n.outputHeight,pixelRatio:1,cacheBust:!0,skipAutoScale:!0,backgroundColor:mn(),filter:e=>!pn(e),style:{margin:`0`,transform:`translate(${-(window.scrollX+n.left)*n.scale}px, ${-(window.scrollY+n.top)*n.scale}px) scale(${n.scale})`,transformOrigin:`top left`}}),i=await gn(r);return!i||i.size>ln?null:{bytes:new Uint8Array(await i.arrayBuffer()),contentType:i.type===`image/png`?`image/png`:`image/webp`,width:r.width,height:r.height}}catch{return null}finally{t.remove()}}function dn(e,t,n){let r=_n(t),i=_n(n),a=e.region,o=vn(a.viewportX,a.pageX-window.scrollX),s=vn(a.viewportY,a.pageY-window.scrollY),c=Math.max(18,vn(a.width,0)),l=Math.max(18,vn(a.height,0)),u=yn(o+c/2,0,r),d=yn(s+l/2,0,i),f=Math.min(r,Math.max(Math.min(640,r),c+192)),p=Math.min(i,Math.max(Math.min(420,i),l+160)),m=yn(u-f/2,0,r-f),h=yn(d-p/2,0,i-p),g=Math.min(1,960/f,640/p);return{left:m,top:h,width:f,height:p,scale:g,outputWidth:Math.max(1,Math.round(f*g)),outputHeight:Math.max(1,Math.round(p*g))}}function fn(e){let t=e.region,n=document.createElement(`div`);return n.dataset.reviewCaptureMarker=`true`,Object.assign(n.style,{position:`absolute`,zIndex:`2147483646`,pointerEvents:`none`,boxSizing:`border-box`,left:`${Math.max(0,t.pageX)}px`,top:`${Math.max(0,t.pageY)}px`,width:`${Math.max(18,t.width)}px`,height:`${Math.max(18,t.height)}px`,border:`3px solid #ff4d67`,borderRadius:`6px`,background:`rgba(255, 77, 103, .12)`,boxShadow:`0 0 0 3px rgba(255,255,255,.92), 0 4px 18px rgba(0,0,0,.24)`}),n}function pn(e){return e instanceof HTMLElement?e.tagName===`AGENCY-REVIEW-WIDGET`||e.dataset.reviewCaptureExclude===`true`||e.id===`__next-build-watcher`||!!e.closest?.(`nextjs-portal`):!1}function mn(){let e=getComputedStyle(document.body).backgroundColor;if(e&&e!==`rgba(0, 0, 0, 0)`)return e;let t=getComputedStyle(document.documentElement).backgroundColor;return t&&t!==`rgba(0, 0, 0, 0)`?t:`#ffffff`}function hn(e,t,n){return new Promise(r=>e.toBlob(r,t,n))}async function gn(e){for(let t of[.78,.64,.5]){let n=await hn(e,`image/webp`,t);if(n&&n.size<=ln)return n}let t=await hn(e,`image/png`);return t&&t.size<=ln?t:null}function _n(e){return Number.isFinite(e)&&e>0?e:1}function vn(e,t){return Number.isFinite(e)?e:Number.isFinite(t)?t:0}function yn(e,t,n){return Math.min(n,Math.max(t,e))}const bn=[`top-left`,`top`,`top-right`,`right`,`bottom-right`,`bottom`,`bottom-left`,`left`],xn=`agency-review-widget`,Sn=1e4,Cn=`visual-review-feedback-navigator`,wn=`${Cn}-surface`,Tn=new Set([`combobox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`radio`,`searchbox`,`slider`,`spinbutton`,`textbox`]);var En=class extends HTMLElement{#e=this.attachShadow({mode:`open`});#t=null;#n=null;#r=null;#i=null;#a=null;#o=null;#s=!1;#c=null;#l=null;#u=null;#d=null;#f=``;#p=``;#m=null;#h=null;#g=null;#_=null;#v=null;#y=null;#b=!1;#x=0;#S=`current`;#C=`all`;#w=`idle`;#T=`loading`;#E=``;#D=`retry`;#O=!1;#k=0;#A=0;#j=!navigator.onLine;#M=null;#N=null;#P=null;#F=null;#I=null;#L=null;#R=null;#z=!1;#B=!1;#V=null;#H=null;#U=!1;#W=null;#G=null;#K=!1;#q=null;#J=new Set;#Y=new Map;#X=new Map;#Z=new Map;#Q=new Map;#$=new Map;#ee=new Map;configure(e){if(this.#t)throw Error(`Review widget is already configured`);if(!On(window.location,e.allowedStagingHosts))throw Error(`Review widget refused to activate on non-staging host: ${window.location.host}`);if(!e.session.invitationId||e.session.projectId.length===0)throw Error(`An accepted review invitation session is required`);this.#t=e,this.isConnected&&this.#te()}setPage(e,t){let n=this.#t;if(!n)throw Error(`Review widget is not configured`);let r=n.collaboration&&e.collaboration?{...n.collaboration,roomId:e.collaboration.roomId,scopeId:e.collaboration.scopeId}:n.collaboration;(t?.reload===!0||n.pageId!==e.pageId||r?.roomId!==n.collaboration?.roomId||r?.scopeId!==n.collaboration?.scopeId)&&(this.#t={...n,pageId:e.pageId,collaboration:r},this.#M&&(this.#ue(),this.#i?.stop(),this.#i=null,this.#pe(),this.#he(),this.#ne()))}connectedCallback(){this.dataset.agencyReviewRoot=``,this.dataset.reactGrabIgnore=``,this.dataset.rgTheme=or(),this.#t&&this.#te()}disconnectedCallback(){this.#de()}async#te(){!this.#t||this.#M||(this.#M=new AbortController,this.#j=!navigator.onLine,this.#fe(),this.#pe(),this.#he(),this.#mt(),document.addEventListener(`keydown`,this.#rt,{capture:!0,signal:this.#M.signal}),document.addEventListener(`keyup`,this.#it,{capture:!0,signal:this.#M.signal}),document.addEventListener(`pointerdown`,this.#st,{capture:!0,signal:this.#M.signal}),document.addEventListener(`click`,this.#ct,{capture:!0,signal:this.#M.signal}),document.addEventListener(`focusin`,this.#tt,{capture:!0,signal:this.#M.signal}),document.addEventListener(`scroll`,this.#dt,{capture:!0,passive:!0,signal:this.#M.signal}),window.addEventListener(`scroll`,this.#dt,{passive:!0,signal:this.#M.signal}),window.addEventListener(`resize`,this.#dt,{passive:!0,signal:this.#M.signal}),window.visualViewport?.addEventListener(`scroll`,this.#dt,{passive:!0,signal:this.#M.signal}),window.visualViewport?.addEventListener(`resize`,this.#dt,{passive:!0,signal:this.#M.signal}),window.addEventListener(`online`,this.#le,{signal:this.#M.signal}),window.addEventListener(`offline`,this.#le,{signal:this.#M.signal}),await this.#ne())}async#ne(){if(!this.#t||!this.#M)return;let e=null,t=null,n=this.#T===`error`,r=++this.#k,i=this.#M.signal,{pageId:a,repository:o,session:s}=this.#t,c=o,l=!!(c.getProjectSnapshot&&c.subscribeProject);this.#T=`loading`,this.#E=``,this.#_e(),this.#we();try{let n,o=null;if(l?[n,o]=await Promise.all([c.getSnapshot(a),c.getProjectSnapshot(s.projectId)]):n=await c.getSnapshot(a),i.aborted||r!==this.#k)return;let u=this.#n,d=this.#r;this.#n=null,this.#r=null,$(u,d);let f=!1,p=!1,m=n,h=o,g=e=>{i.aborted||r!==this.#k||!this.#M||(f=!0,this.#se(e))};if(e=c.subscribe(a,e=>{if(!(i.aborted||r!==this.#k||!this.#M)){if(!p){m=e;return}this.#ae(e)}},g),t=o&&c.subscribeProject?c.subscribeProject(s.projectId,e=>{if(!(i.aborted||r!==this.#k||!this.#M)){if(!p){h=e;return}this.#oe(e)}},g):null,f){$(e,t);return}if(i.aborted||r!==this.#k||!this.#M){$(e,t);return}this.#n=e,this.#r=t,e=null,t=null,p=!0,this.#ae(m),h&&this.#oe(h)}catch(a){if($(e,t),i.aborted||r!==this.#k)return;let o=Hn(a)?a:{type:`error`,code:`unknown`,recovery:`retry`,clearSnapshot:!0};this.#se(o,o.type===`access-lost`),n&&this.#b&&queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-navigator-retry`)?.focus({preventScroll:!0}))}}#re=new Map;#ie=new Map;#ae=e=>{for(let[t,n]of[...this.#re])e.comments.some(({id:e})=>e===t)&&(this.#re.delete(t),n(!0));for(let[t,{commentId:n,settle:r}]of[...this.#ie])e.replies.some(e=>e.id===t&&e.commentId===n)&&(this.#ie.delete(t),r());this.#T=`ready`,this.#D=`retry`,this.#O=!1,this.#a=e,this.#ce(e);let t=!1;if(this.#_&&!e.comments.some(({id:e})=>e===this.#_)){let e=this.#_;t=!0,this.#Z.delete(e),this.#Q.delete(e),this.#$.delete(e),this.#ee.delete(e),this.#_=null,this.#v=null,this.#He(`열려 있던 피드백이 삭제되었습니다.`)}this.#he();let n=this.#y;n&&e.comments.some(({id:e})=>e===n)&&(this.#y=null,queueMicrotask(()=>void this.#ze(n,{origin:`pin`,navigate:!1,announceOpened:!0})));let r=t&&this.#b&&this.#De()===`sheet`&&this.#g?this.#xe(!1,{restoreFocus:!1,cancelNavigation:!1}):t&&!this.#b?this.#Ce():!1;t&&queueMicrotask(()=>{r||(this.#b?this.#Ae():this.#je()?.focus())})};#oe=e=>{e.projectId===this.#t?.session.projectId&&(this.#o=e,this.#Ot(),this.#we(),this.#Ee())};#se(e,t=!0){let n=e.type===`access-lost`;this.#k+=1,this.#A+=1;let r=this.#n,i=this.#r;if(this.#n=null,this.#r=null,e.clearSnapshot&&(this.#a=null,this.#o=null),!n&&this.#d){let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);this.#g={target:this.#d,body:e?.value??this.#f},this.#d=null,this.#f=``}if(!n&&this.#h?.comment){let{target:e,body:t,comment:n}=this.#h;this.#m??={target:e,body:t,comment:n},this.#p||=`저장하지 못했습니다. 다시 시도하세요.`}if(n||this.#Q.forEach(({body:e,reply:t},n)=>{this.#Z.set(n,e),this.#ee.has(n)||this.#ee.set(n,{body:e,reply:t}),this.#$.has(n)||this.#$.set(n,`답글을 저장하지 못했습니다. 다시 시도하세요.`)}),this.#h=null,this.#Q.clear(),n&&(this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#g=null,this.#_=null,this.#v=null,this.#Z.clear(),this.#$.clear(),this.#ee.clear()),this.#s?this.#ge(!1):this.#Tt(),this.#T=`error`,this.#D=e.recovery,this.#O=e.type===`access-lost`,this.#E=e.type===`access-lost`?Un(e.code):`다시 시도하세요.`,t&&(this.#b=!0),$(r,i),this.#_e(),this.#he(),this.#He(this.#E),e.type===`access-lost`){try{this.#t?.onReauthenticationRequired?.(e)}catch{}this.dispatchEvent(new CustomEvent(`visual-review:reauthenticate-required`,{bubbles:!0,composed:!0,detail:{code:e.code}}))}}#ce(e){let t=new Set(e.comments.map(({id:e})=>e)),n=this.#h,r=this.#m,i=!!(n?.comment&&t.has(n.comment.id)),a=!!(r&&t.has(r.comment.id)),o=[...i&&n?[n.target]:[],...a&&r?[r.target]:[]];if(o.length>0){let e=this.#d!==null&&o.includes(this.#d);this.#d&&o.includes(this.#d)&&(this.#d=null,this.#f=``),this.#g&&o.includes(this.#g.target)&&(this.#g=null),i&&(this.#h=null),a&&(this.#m=null),this.#p=``,this.#He(`피드백을 저장했습니다.`),e&&queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}))}new Set([...this.#Z.keys(),...this.#Q.keys(),...this.#$.keys(),...this.#ee.keys()]).forEach(n=>{if(!t.has(n)){this.#Z.delete(n),this.#Q.delete(n),this.#$.delete(n),this.#ee.delete(n);return}let r=this.#Q.get(n),i=this.#ee.get(n),a=!!(r&&e.replies.some(e=>e.id===r.reply.id&&e.commentId===n)),o=!!(i&&e.replies.some(e=>e.id===i.reply.id&&e.commentId===n));!a&&!o||(a&&this.#Q.delete(n),o&&this.#ee.delete(n),this.#$.delete(n),this.#Z.delete(n),this.#He(`답글을 저장했습니다.`))})}#le=()=>{this.#j=!navigator.onLine,this.#we()};#ue(){this.#k+=1,this.#A+=1;let e=this.#n,t=this.#r;this.#n=null,this.#r=null;for(let[e,t]of[...this.#re])this.#re.delete(e),t(!1);for(let[e,{settle:t}]of[...this.#ie])this.#ie.delete(e),t();this.#s?this.#ge(!1):this.#Tt(),this.#a=null,this.#o=null,this.#T=`loading`,this.#E=``,this.#D=`retry`,this.#O=!1,this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#h=null,this.#g=null,this.#_=null,this.#v=null,this.#Z.clear(),this.#Q.clear(),this.#$.clear(),this.#ee.clear(),$(e,t)}#de(){this.#k+=1,this.#A+=1,this.#at(),this.#We(),this.#ut(),this.#$e(),this.#yt(),this.#s&&this.#ge(!1),this.#P?.(),this.#P=null,this.#N?.(),this.#N=null;let e=this.#n,t=this.#r;this.#n=null,this.#r=null,this.#i?.stop(),this.#i=null,this.#M?.abort(),this.#M=null,this.#a=null,this.#o=null,this.#T=`loading`,this.#E=``,this.#D=`retry`,this.#O=!1,this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#h=null,this.#g=null,this.#_=null,this.#v=null,this.#b=!1,this.#S=`current`,this.#C=`all`,this.#B=!1,this.#Z.clear(),this.#Q.clear(),this.#$.clear(),this.#ee.clear(),this.#e.replaceChildren(),$(e,t)}#fe(){this.#e.replaceChildren();let e=e=>e.stopPropagation();[`change`,`click`,`contextmenu`,`dblclick`,`input`,`keydown`,`keyup`,`pointercancel`,`pointerdown`,`pointermove`,`pointerup`,`submit`].forEach(t=>{this.#e.addEventListener(t,e,{signal:this.#M?.signal})});let t=document.createElement(`style`);this.#t?.styleNonce&&(t.nonce=this.#t.styleNonce),t.textContent=`
3
+ `))},dispose(){}}}function yt(e){return{copyElement:t=>e.copyElement(t),dispose(){}}}function bt(e){return typeof e==`object`&&!!e&&`copyElement`in e&&typeof e.copyElement==`function`}function xt(e,t=`all`){let n=[...e.comments].sort(Ct),r=new Map;for(let e of n){if(!St(e.pageNumber))continue;let t=r.get(e.pageId);t||(t=new Set,r.set(e.pageId,t)),t.add(e.pageNumber)}let i=new Map,a=new Map;for(let e of n){let t=i.get(e.pageId);t||(t=new Set,i.set(e.pageId,t));let n=St(e.pageNumber)&&!t.has(e.pageNumber)?e.pageNumber:void 0,o=n??1,s=r.get(e.pageId);for(;t.has(o)||n===void 0&&s?.has(o);)o+=1;t.add(o),a.set(e.id,o)}let o=new Map;for(let t of e.replies){if(!a.has(t.commentId))continue;let e=o.get(t.commentId);e?(e.replyCount+=1,e.lastReplyAt=Math.max(e.lastReplyAt,t.updatedAt)):o.set(t.commentId,{replyCount:1,lastReplyAt:t.updatedAt})}let s=n.map(e=>{let t=o.get(e.id);return{comment:e,pinNumber:a.get(e.id),replyCount:t?.replyCount??0,lastActivityAt:Math.max(e.updatedAt,t?.lastReplyAt??e.updatedAt)}}),c={all:s.length,open:s.filter(({comment:e})=>e.status===`open`).length,resolved:s.filter(({comment:e})=>e.status===`resolved`).length};return{rows:s.filter(({comment:e})=>t===`all`||e.status===t).sort(wt),counts:c,pinNumberByCommentId:a}}function St(e){return Number.isSafeInteger(e)&&(e??0)>=1}function Ct(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function wt(e,t){return t.lastActivityAt-e.lastActivityAt||t.comment.createdAt-e.comment.createdAt||e.comment.id.localeCompare(t.comment.id)}const Tt=`visual-review-feedback-navigator`,Et=[`current`,`all`],Dt={current:`현재 페이지`,all:`전체 페이지`},Ot=[`all`,`open`,`resolved`],kt={all:`전체`,open:`진행 중`,resolved:`완료`};function At(e,t={}){let n=t.controlsId??Tt,r=W(`rg-action-wrap`),i=document.createElement(`button`);i.type=`button`,i.className=`rg-action rg-feedback-list-tool`,i.dataset.feedbackNavigatorAction=`toggle`,i.setAttribute(`aria-controls`,n),i.setAttribute(`aria-expanded`,String(t.expanded??!1)),t.presentation===`sheet`&&i.setAttribute(`aria-haspopup`,`dialog`),i.setAttribute(`aria-label`,`피드백 목록, 총 ${G(e)}개`),i.append(zt(),Rt(e));let a=document.createElement(`span`);return a.className=`rg-tooltip`,a.setAttribute(`aria-hidden`,`true`),a.textContent=`피드백 ${G(e)}개`,r.append(i,a),r}function jt(e,t={}){let n=t.id??Tt,r=`${n}-title`,i=t.presentation??`tray`,a=document.createElement(`section`);a.id=n,a.className=`rg-feedback-navigator`,a.dataset.presentation=i,a.dataset.loadState=e.loadState??`ready`,a.dataset.filter=e.filter,a.dataset.scope=e.scope,a.setAttribute(`aria-labelledby`,r),a.setAttribute(`aria-busy`,String(e.loadState===`loading`)),i===`sheet`?(a.setAttribute(`role`,`dialog`),a.setAttribute(`aria-modal`,`true`)):a.setAttribute(`role`,`region`);let o=W(`rg-feedback-navigator-header`),s=W(`rg-feedback-navigator-heading`),c=document.createElement(`h2`);c.id=r,c.className=`rg-feedback-navigator-title`,c.textContent=t.title??`피드백`;let l=document.createElement(`span`);l.className=`rg-feedback-navigator-total`,l.setAttribute(`aria-hidden`,`true`),l.textContent=String(G(e.counts.all)),s.append(c,l);let u=document.createElement(`button`);u.type=`button`,u.className=`rg-feedback-navigator-close`,u.dataset.feedbackNavigatorAction=`close`,u.setAttribute(`aria-label`,`피드백 목록 닫기`),u.append(Bt()),o.append(s,u);let d=W(`rg-feedback-navigator-content`);if(Wt(d,e),e.loadState!==`loading`&&e.loadState!==`error`&&(e.rows.length===0?d.append(Gt(e.scopeCounts.all===0,e.scope===`current`&&e.scopeCounts.current===0&&e.scopeCounts.all>0)):Ft(d,e)),a.append(o),e.scopeCounts.all>e.scopeCounts.current&&e.loadState!==`loading`&&e.loadState!==`error`){let t=W(`rg-feedback-scopes`);t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,`피드백 페이지 범위`);for(let n of Et)t.append(Nt(n,e.scopeCounts[n],e.scope===n));a.append(t)}if(e.counts.all>0&&e.loadState!==`loading`&&e.loadState!==`error`){let t=W(`rg-feedback-filters`);t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,`피드백 상태 필터`);for(let n of Ot)t.append(Pt(n,e.counts[n],e.filter===n));let n=document.createElement(`span`);n.className=`rg-feedback-sort-label`,n.textContent=`최근 활동순`,n.setAttribute(`aria-hidden`,`true`),t.append(n),a.append(t)}return a.append(d),t.exitReviewState&&a.append(Mt(t.exitReviewState)),a}function Mt(e){let t=W(`rg-feedback-navigator-footer`);if(t.dataset.exitState=e,e===`idle`){let e=document.createElement(`button`);return e.type=`button`,e.className=`rg-feedback-navigator-exit-link`,e.dataset.feedbackNavigatorAction=`exit-review`,e.setAttribute(`aria-label`,`이 브라우저에서 이 사이트의 리뷰 종료`),e.textContent=`리뷰 종료`,t.append(e),t}let n=W(`rg-feedback-navigator-exit-copy`),r=document.createElement(`strong`),i=document.createElement(`span`);if(e===`saving`)return r.textContent=`저장 중입니다`,i.textContent=`저장이 끝난 뒤 다시 시도해 주세요.`,n.append(r,i),t.append(n),t;r.textContent=e===`draft-warning`?`작성 중인 내용이 있습니다`:`리뷰를 종료할까요?`,i.textContent=e===`draft-warning`?`저장하지 않은 내용은 사라집니다.`:`저장된 피드백은 그대로 유지됩니다.`,n.append(r,i);let a=W(`rg-feedback-navigator-exit-actions`),o=document.createElement(`button`);o.type=`button`,o.className=`rg-feedback-navigator-exit-cancel`,o.dataset.feedbackNavigatorAction=`cancel-exit-review`,o.textContent=`취소`;let s=document.createElement(`button`);return s.type=`button`,s.className=`rg-feedback-navigator-exit-confirm`,s.dataset.feedbackNavigatorAction=`confirm-exit-review`,s.textContent=e===`draft-warning`?`그래도 종료`:`종료`,a.append(o,s),t.append(n,a),t}function Nt(e,t,n){let r=document.createElement(`button`);r.type=`button`,r.className=`rg-feedback-scope`,r.dataset.feedbackScope=e,r.dataset.feedbackNavigatorAction=`scope`,r.setAttribute(`aria-pressed`,String(n)),r.setAttribute(`aria-label`,`${Dt[e]} 피드백 ${G(t)}개`);let i=document.createElement(`span`);i.textContent=Dt[e];let a=document.createElement(`span`);return a.className=`rg-feedback-scope-count`,a.setAttribute(`aria-hidden`,`true`),a.textContent=String(G(t)),r.append(i,a),r}function Pt(e,t,n){let r=document.createElement(`button`);r.type=`button`,r.className=`rg-feedback-filter`,r.dataset.feedbackFilter=e,r.dataset.feedbackNavigatorAction=`filter`,r.setAttribute(`aria-pressed`,String(n)),r.setAttribute(`aria-label`,`${kt[e]} 피드백 ${G(t)}개`);let i=document.createElement(`span`);i.className=`rg-feedback-filter-label`,i.textContent=kt[e];let a=document.createElement(`span`);return a.className=`rg-feedback-filter-count`,a.setAttribute(`aria-hidden`,`true`),a.textContent=String(G(t)),r.append(i,a),r}function Ft(e,t){if(t.scope!==`all`){e.append(It(t.rows,t.activeCommentId,!1));return}let n=new Map;for(let e of t.rows){let t=n.get(e.pageId);t?t.push(e):n.set(e.pageId,[e])}let r=[...n.values()].sort((e,t)=>Number(!!t[0]?.currentPage)-Number(!!e[0]?.currentPage));for(let n of r){let r=document.createElement(`section`);r.className=`rg-feedback-page-group`,r.setAttribute(`role`,`group`),n[0]?.currentPage&&(r.dataset.currentPage=`true`);let i=W(`rg-feedback-page-heading`),a=document.createElement(`span`);a.className=`rg-feedback-page-label`,a.textContent=n[0]?.pageLabel?.trim()||`알 수 없는 페이지`;let o=document.createElement(`span`);o.className=`rg-feedback-page-count`,o.textContent=String(n.length),o.setAttribute(`aria-hidden`,`true`),i.append(a,o),r.setAttribute(`aria-label`,`${a.textContent} 피드백 ${n.length}개`),r.append(i,It(n,t.activeCommentId,!0)),e.append(r)}}function It(e,t,n){let r=document.createElement(`ul`);r.className=`rg-feedback-list`,r.setAttribute(`aria-label`,n?`페이지 피드백 목록`:`피드백 목록`);for(let i of e)r.append(Lt(i,t,{showPageLabel:!n}));return r}function Lt(e,t,n={}){let r=document.createElement(`li`);r.className=`rg-feedback-item`,r.dataset.commentId=e.id;let i=document.createElement(`button`);i.type=`button`,i.className=`rg-feedback-row`,i.dataset.commentId=e.id,i.dataset.feedbackNavigatorAction=`open-comment`,i.dataset.status=e.status,i.dataset.currentPage=String(e.currentPage===!0),i.dataset.locationAvailable=String(e.locationAvailable!==!1),e.id===t&&i.setAttribute(`aria-current`,`true`),i.setAttribute(`aria-label`,Kt(e));let a=document.createElement(`span`);a.className=`rg-feedback-row-pin`,a.setAttribute(`aria-hidden`,`true`),a.textContent=`#${Math.max(1,Math.trunc(e.pinNumber))}`;let o=W(`rg-feedback-row-copy`),s=document.createElement(`span`);s.className=`rg-feedback-row-body`,s.textContent=e.body;let c=n.showPageLabel!==!1;if(c&&e.pageLabel?.trim()||e.targetLabel?.trim()){let t=document.createElement(`span`);t.className=`rg-feedback-row-context`,e.pageUrl?.trim()&&(t.dataset.pageUrl=e.pageUrl.trim(),t.title=e.pageUrl.trim()),e.currentPage&&(t.dataset.currentPage=`true`);let n=c?e.pageLabel?.trim():void 0;if(n&&t.append(document.createTextNode(n)),n&&e.targetLabel?.trim()&&t.append(document.createTextNode(` · `)),e.targetLabel?.trim()){let n=document.createElement(`span`);n.className=`rg-feedback-row-target`,n.textContent=e.targetLabel.trim(),t.append(n)}o.append(t)}let l=W(`rg-feedback-row-detail`),u=document.createElement(`span`);u.className=`rg-feedback-row-meta`,u.textContent=`${e.authorName} · ${e.timeLabel}`;let d=W(`rg-feedback-row-trailing`);if(!e.currentPage){let e=document.createElement(`span`);e.className=`rg-feedback-row-move`,e.setAttribute(`aria-hidden`,`true`),e.title=`이 페이지로 이동`;let t=document.createElement(`span`);t.textContent=`이동`,e.append(t,Ut()),d.append(e)}if(e.locationAvailable===!1){let e=document.createElement(`span`);e.className=`rg-feedback-row-location-missing`,e.setAttribute(`aria-hidden`,`true`),e.title=`현재 화면에서 위치를 찾을 수 없음`,e.append(Vt()),d.append(e)}if(e.replyCount>0){let t=document.createElement(`span`);t.className=`rg-feedback-row-replies`,t.setAttribute(`aria-hidden`,`true`),t.textContent=`답글 ${G(e.replyCount)}`,d.append(t)}if(e.status===`resolved`){let e=document.createElement(`span`);e.className=`rg-feedback-row-status`,e.setAttribute(`aria-hidden`,`true`),e.title=`완료`,e.append(Ht());let t=document.createElement(`span`);t.className=`rg-visually-hidden`,t.textContent=`완료`,e.append(t),d.append(e)}return l.append(u,d),o.append(s,l),i.append(a,o),r.append(i),r}function Rt(e){let t=document.createElement(`span`);return t.className=`rg-feedback-list-count`,t.dataset.feedbackCount=``,t.setAttribute(`aria-hidden`,`true`),t.hidden=G(e)===0,t.textContent=String(G(e)),t}function zt(){return qt(`0 0 14 14`,[U(`M4.75 3.25h6.5M4.75 7h6.5M4.75 10.75h6.5`),U(`M2.25 3.25h.01M2.25 7h.01M2.25 10.75h.01`,{"stroke-linecap":`round`,"stroke-width":`1.5`})])}function Bt(){return qt(`0 0 12 12`,[U(`M2.47 1.76a.5.5 0 0 0-.71.71L5.29 6 1.76 9.53a.5.5 0 0 0 .71.71L6 6.71l3.53 3.53a.5.5 0 0 0 .71-.71L6.71 6l3.53-3.53a.5.5 0 0 0-.71-.71L6 5.29 2.47 1.76Z`,{fill:`currentColor`,stroke:`none`})])}function Vt(){return qt(`0 0 14 14`,[U(`M7 12.25s4-3.27 4-6.5a4 4 0 1 0-8 0c0 3.23 4 6.5 4 6.5Z`),U(`m4.75 3.5 4.5 4.5`)])}function Ht(){return qt(`0 0 12 12`,[U(`m2.25 6.25 2.25 2.25 5.25-5.25`)])}function Ut(){return qt(`0 0 12 12`,[U(`M2.25 6h7.5M6.75 3l3 3-3 3`)])}function Wt(e,t){let n=t.loadState??`ready`;if(n===`ready`)return;let r=W(`rg-feedback-navigator-state`);if(r.dataset.state=n,n===`error`){r.setAttribute(`role`,`alert`);let e=document.createElement(`span`);if(e.textContent=t.errorMessage?.trim()||`불러오지 못함`,r.append(e),t.errorRecovery!==`reauthenticate`){let e=document.createElement(`button`);e.type=`button`,e.className=`rg-feedback-navigator-retry`,e.dataset.feedbackNavigatorAction=`retry`,e.textContent=`재시도`,r.append(e)}}else r.setAttribute(`role`,`status`),r.setAttribute(`aria-live`,`polite`),r.textContent=n===`loading`?`불러오는 중`:`연결 확인 중`;e.append(r)}function Gt(e,t=!1){let n=W(`rg-feedback-navigator-empty`);return n.setAttribute(`role`,`status`),n.textContent=e?`피드백 없음`:t?`현재 페이지 피드백 없음`:`해당 피드백 없음`,n}function Kt(e){let t=[`피드백 #${Math.max(1,Math.trunc(e.pinNumber))}`,...e.pageLabel?.trim()?[`페이지 ${e.pageLabel.trim()}`]:[],...e.targetLabel?.trim()?[`대상 ${e.targetLabel.trim()}`]:[],e.body,e.authorName,`최근 활동 ${e.timeLabel}`];return e.replyCount>0&&t.push(`답글 ${G(e.replyCount)}개`),t.push(e.status===`resolved`?`완료`:`진행 중`),e.locationAvailable===!1&&t.push(`현재 화면에서 위치를 찾을 수 없음`),e.currentPage||t.push(`다른 페이지로 이동`),t.join(`, `)}function qt(e,t){let n=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);n.setAttribute(`viewBox`,e),n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`focusable`,`false`);for(let e of t)n.append(e);return n}function U(e,t={}){let n=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);n.setAttribute(`d`,e),n.setAttribute(`fill`,`none`),n.setAttribute(`stroke`,`currentColor`),n.setAttribute(`stroke-width`,`1.25`),n.setAttribute(`stroke-linecap`,`round`),n.setAttribute(`stroke-linejoin`,`round`);for(let[e,r]of Object.entries(t))n.setAttribute(e,r);return n}function W(e){let t=document.createElement(`div`);return t.className=e,t}function G(e){return Math.max(0,Math.trunc(Number.isFinite(e)?e:0))}function Jt(e){let t=e.elements.map(({textPreview:e})=>e.replace(/\s+/g,` `).trim()).find(Boolean);return t?t.length>48?`${t.slice(0,47).trimEnd()}…`:t:e.kind===`region`?`선택 영역`:e.kind===`viewport`?`화면 위치`:`선택 요소`}function Yt(e){let t=j(e.anchor),n=t.x-window.scrollX;if(e.kind===`element`&&t.element){let e=I(t.element);return{x:e.left,y:e.top,width:e.width,height:e.height,anchorX:n}}if(e.kind===`viewport`){let t=tn(e);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}let r=Qt(e);return{x:r.left,y:r.top,width:r.width,height:r.height,anchorX:e.kind===`region`?r.left+r.width/2:n}}function Xt(e){if(e.target.kind===`element`){if(K(e).available)return Yt(e.target);let t=window.visualViewport,n=t?.offsetLeft??0,r=t?.offsetTop??0,i=t?.width??window.innerWidth;return{x:n+i/2,y:r+16,width:0,height:0,anchorX:n+i/2}}if(e.target.kind===`viewport`){let t=tn(e.target);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}let t=Qt(e.target);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}function K(e){if(e.target.kind===`element`){let t=j(e.anchor);return t.anchored&&t.visible&&t.element?{available:!0,pageX:t.x,pageY:t.y}:{available:!1,pageX:null,pageY:null}}if(e.target.kind===`region`){let t=$t(e.target);return Number.isFinite(t.pageX)&&Number.isFinite(t.pageY)?{available:!0,pageX:t.pageX,pageY:t.pageY}:{available:!1,pageX:null,pageY:null}}let t=rn(e.target);return Number.isFinite(t.pageX)&&Number.isFinite(t.pageY)?{available:!0,pageX:t.pageX,pageY:t.pageY}:{available:!1,pageX:null,pageY:null}}function Zt(e){return`visual-review-thread-${e.replace(/[^a-zA-Z0-9_-]/g,`-`)}`}function Qt(e){let t=an(e),n=$t(e,t),r=J(e.region.width)*t.x,i=J(e.region.height)*t.y;return on(new DOMRect(n.pageX-window.scrollX-r/2,n.pageY-window.scrollY-i/2,r,i))}function $t(e,t=an(e)){return en(e,t)??nn(e,t)}function en(e,t){if(e.kind!==`region`||!e.anchor.selector)return null;let n=j(e.anchor);if(!n.anchored||!n.visible||!n.element)return null;let r=e.elements.find(({selector:t})=>t===e.anchor.selector);if(!r)return{pageX:n.x,pageY:n.y};let i=r.rect.pageX+r.rect.width*e.anchor.offsetX,a=r.rect.pageY+r.rect.height*e.anchor.offsetY,o=e.region.pageX+e.region.width/2,s=e.region.pageY+e.region.height/2;return{pageX:n.x+(o-i)*t.x,pageY:n.y+(s-a)*t.y}}function tn(e){let t=rn(e);return sn(new DOMRect(t.pageX-window.scrollX-7,t.pageY-window.scrollY-7,14,14))}function nn(e,t=an(e)){let n=rn(e,t);return{pageX:n.pageX+n.width/2,pageY:n.pageY+n.height/2}}function rn(e,t=an(e)){let n=e.region,r=Y(n.viewportX,n.pageX),i=Y(n.viewportY,n.pageY),a=Y(n.pageX,window.scrollX+r),o=Y(n.pageY,window.scrollY+i),s=a-r,c=o-i;return{pageX:s+r*t.x,pageY:c+i*t.y,width:J(n.width)*t.x,height:J(n.height)*t.y}}function an(e){let t=q(window.innerWidth,1),n=q(window.innerHeight,1),r=q(e.region.viewportWidth,t),i=q(e.region.viewportHeight,n);return{x:t/r,y:n/i}}function on(e){let t=cn(),n=X(Y(e.left,t.left),t.left,t.right),r=X(Y(e.top,t.top),t.top,t.bottom),i=X(Y(e.right,n),t.left,t.right),a=X(Y(e.bottom,r),t.top,t.bottom);return new DOMRect(n,r,Math.max(0,i-n),Math.max(0,a-r))}function sn(e){let t=cn(),n=Math.min(J(e.width),t.width),r=Math.min(J(e.height),t.height);return new DOMRect(X(Y(e.left,t.left),t.left,t.right-n),X(Y(e.top,t.top),t.top,t.bottom-r),n,r)}function cn(){let e=window.visualViewport;return new DOMRect(Y(e?.offsetLeft,0),Y(e?.offsetTop,0),q(e?.width,window.innerWidth),q(e?.height,window.innerHeight))}function q(e,t){return Number.isFinite(e)&&(e??0)>0?e:Math.max(Number.isFinite(t)?t:1,1)}function J(e){return Number.isFinite(e)?Math.max(0,e):0}function Y(e,t){return Number.isFinite(e)?e:Number.isFinite(t)?t:0}function X(e,t,n){return Math.min(n,Math.max(t,e))}const ln=1e6;async function un(e){if(!document.body||typeof HTMLCanvasElement>`u`)return null;let t=pn(e);document.body.append(t);try{let{toCanvas:t}=await import(`./es-BeyOi4lh.js`),n=fn(e,window.innerWidth,window.innerHeight),r=dn(await t(document.body,{width:Math.max(1,Math.round(window.innerWidth)),height:Math.max(1,Math.round(window.innerHeight)),pixelRatio:1,cacheBust:!0,skipAutoScale:!0,backgroundColor:hn(),filter:e=>!mn(e),style:{margin:`0`,transform:`translate(${-window.scrollX}px, ${-window.scrollY}px)`,transformOrigin:`top left`}}),n),i=await _n(r);return!i||i.size>ln?null:{bytes:new Uint8Array(await i.arrayBuffer()),contentType:i.type===`image/png`?`image/png`:`image/webp`,width:r.width,height:r.height}}catch{return null}finally{t.remove()}}function dn(e,t){let n=document.createElement(`canvas`);n.width=t.outputWidth,n.height=t.outputHeight;let r=n.getContext(`2d`);if(!r)throw Error(`A 2D canvas context is required to crop review screenshots`);return r.drawImage(e,t.left,t.top,t.width,t.height,0,0,t.outputWidth,t.outputHeight),n}function fn(e,t,n){let r=vn(t),i=vn(n),a=e.region,o=yn(a.viewportX,a.pageX-window.scrollX),s=yn(a.viewportY,a.pageY-window.scrollY),c=Math.max(18,yn(a.width,0)),l=Math.max(18,yn(a.height,0)),u=bn(o+c/2,0,r),d=bn(s+l/2,0,i),f=Math.min(r,Math.max(Math.min(640,r),c+192)),p=Math.min(i,Math.max(Math.min(420,i),l+160)),m=bn(u-f/2,0,r-f),h=bn(d-p/2,0,i-p),g=Math.min(1,960/f,640/p);return{left:m,top:h,width:f,height:p,scale:g,outputWidth:Math.max(1,Math.round(f*g)),outputHeight:Math.max(1,Math.round(p*g))}}function pn(e){let t=e.region,n=document.createElement(`div`);return n.dataset.reviewCaptureMarker=`true`,Object.assign(n.style,{position:`absolute`,zIndex:`2147483646`,pointerEvents:`none`,boxSizing:`border-box`,left:`${Math.max(0,t.pageX)}px`,top:`${Math.max(0,t.pageY)}px`,width:`${Math.max(18,t.width)}px`,height:`${Math.max(18,t.height)}px`,border:`3px solid #ff4d67`,borderRadius:`6px`,background:`rgba(255, 77, 103, .12)`,boxShadow:`0 0 0 3px rgba(255,255,255,.92), 0 4px 18px rgba(0,0,0,.24)`}),n}function mn(e){return e instanceof HTMLElement?e.tagName===`AGENCY-REVIEW-WIDGET`||e.dataset.reviewCaptureExclude===`true`||e.id===`__next-build-watcher`||!!e.closest?.(`nextjs-portal`):!1}function hn(){let e=getComputedStyle(document.body).backgroundColor;if(e&&e!==`rgba(0, 0, 0, 0)`)return e;let t=getComputedStyle(document.documentElement).backgroundColor;return t&&t!==`rgba(0, 0, 0, 0)`?t:`#ffffff`}function gn(e,t,n){return new Promise(r=>e.toBlob(r,t,n))}async function _n(e){for(let t of[.78,.64,.5]){let n=await gn(e,`image/webp`,t);if(n&&n.size<=ln)return n}let t=await gn(e,`image/png`);return t&&t.size<=ln?t:null}function vn(e){return Number.isFinite(e)&&e>0?e:1}function yn(e,t){return Number.isFinite(e)?e:Number.isFinite(t)?t:0}function bn(e,t,n){return Math.min(n,Math.max(t,e))}const xn=[`top-left`,`top`,`top-right`,`right`,`bottom-right`,`bottom`,`bottom-left`,`left`],Sn=`agency-review-widget`,Cn=1e4,wn=`visual-review-feedback-navigator`,Tn=`${wn}-surface`,En=new Set([`combobox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`radio`,`searchbox`,`slider`,`spinbutton`,`textbox`]);var Dn=class extends HTMLElement{#e=this.attachShadow({mode:`open`});#t=null;#n=null;#r=null;#i=null;#a=null;#o=null;#s=!1;#c=null;#l=null;#u=null;#d=null;#f=``;#p=``;#m=null;#h=null;#g=null;#_=null;#v=null;#y=null;#b=!1;#x=0;#S=`current`;#C=`all`;#w=`idle`;#T=`loading`;#E=``;#D=`retry`;#O=!1;#k=0;#A=0;#j=!navigator.onLine;#M=null;#N=null;#P=null;#F=null;#I=null;#L=null;#R=null;#z=!1;#B=!1;#V=null;#H=null;#U=!1;#W=null;#G=null;#K=!1;#q=null;#J=new Set;#Y=new Map;#X=new Map;#Z=new Map;#Q=new Map;#$=new Map;#ee=new Map;configure(e){if(this.#t)throw Error(`Review widget is already configured`);if(!kn(window.location,e.allowedStagingHosts))throw Error(`Review widget refused to activate on non-staging host: ${window.location.host}`);if(!e.session.invitationId||e.session.projectId.length===0)throw Error(`An accepted review invitation session is required`);this.#t=e,this.isConnected&&this.#te()}setPage(e,t){let n=this.#t;if(!n)throw Error(`Review widget is not configured`);let r=n.collaboration&&e.collaboration?{...n.collaboration,roomId:e.collaboration.roomId,scopeId:e.collaboration.scopeId}:n.collaboration;(t?.reload===!0||n.pageId!==e.pageId||r?.roomId!==n.collaboration?.roomId||r?.scopeId!==n.collaboration?.scopeId)&&(this.#t={...n,pageId:e.pageId,collaboration:r},this.#M&&(this.#ue(),this.#i?.stop(),this.#i=null,this.#pe(),this.#he(),this.#ne()))}connectedCallback(){this.dataset.agencyReviewRoot=``,this.dataset.reactGrabIgnore=``,this.dataset.rgTheme=sr(),this.#t&&this.#te()}disconnectedCallback(){this.#de()}async#te(){!this.#t||this.#M||(this.#M=new AbortController,this.#j=!navigator.onLine,this.#fe(),this.#pe(),this.#he(),this.#mt(),document.addEventListener(`keydown`,this.#rt,{capture:!0,signal:this.#M.signal}),document.addEventListener(`keyup`,this.#it,{capture:!0,signal:this.#M.signal}),document.addEventListener(`pointerdown`,this.#st,{capture:!0,signal:this.#M.signal}),document.addEventListener(`click`,this.#ct,{capture:!0,signal:this.#M.signal}),document.addEventListener(`focusin`,this.#tt,{capture:!0,signal:this.#M.signal}),document.addEventListener(`scroll`,this.#dt,{capture:!0,passive:!0,signal:this.#M.signal}),window.addEventListener(`scroll`,this.#dt,{passive:!0,signal:this.#M.signal}),window.addEventListener(`resize`,this.#dt,{passive:!0,signal:this.#M.signal}),window.visualViewport?.addEventListener(`scroll`,this.#dt,{passive:!0,signal:this.#M.signal}),window.visualViewport?.addEventListener(`resize`,this.#dt,{passive:!0,signal:this.#M.signal}),window.addEventListener(`online`,this.#le,{signal:this.#M.signal}),window.addEventListener(`offline`,this.#le,{signal:this.#M.signal}),await this.#ne())}async#ne(){if(!this.#t||!this.#M)return;let e=null,t=null,n=this.#T===`error`,r=++this.#k,i=this.#M.signal,{pageId:a,repository:o,session:s}=this.#t,c=o,l=!!(c.getProjectSnapshot&&c.subscribeProject);this.#T=`loading`,this.#E=``,this.#_e(),this.#we();try{let n,o=null;if(l?[n,o]=await Promise.all([c.getSnapshot(a),c.getProjectSnapshot(s.projectId)]):n=await c.getSnapshot(a),i.aborted||r!==this.#k)return;let u=this.#n,d=this.#r;this.#n=null,this.#r=null,$(u,d);let f=!1,p=!1,m=n,h=o,g=e=>{i.aborted||r!==this.#k||!this.#M||(f=!0,this.#se(e))};if(e=c.subscribe(a,e=>{if(!(i.aborted||r!==this.#k||!this.#M)){if(!p){m=e;return}this.#ae(e)}},g),t=o&&c.subscribeProject?c.subscribeProject(s.projectId,e=>{if(!(i.aborted||r!==this.#k||!this.#M)){if(!p){h=e;return}this.#oe(e)}},g):null,f){$(e,t);return}if(i.aborted||r!==this.#k||!this.#M){$(e,t);return}this.#n=e,this.#r=t,e=null,t=null,p=!0,this.#ae(m),h&&this.#oe(h)}catch(a){if($(e,t),i.aborted||r!==this.#k)return;let o=Un(a)?a:{type:`error`,code:`unknown`,recovery:`retry`,clearSnapshot:!0};this.#se(o,o.type===`access-lost`),n&&this.#b&&queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-navigator-retry`)?.focus({preventScroll:!0}))}}#re=new Map;#ie=new Map;#ae=e=>{for(let[t,n]of[...this.#re])e.comments.some(({id:e})=>e===t)&&(this.#re.delete(t),n(!0));for(let[t,{commentId:n,settle:r}]of[...this.#ie])e.replies.some(e=>e.id===t&&e.commentId===n)&&(this.#ie.delete(t),r());this.#T=`ready`,this.#D=`retry`,this.#O=!1,this.#a=e,this.#ce(e);let t=!1;if(this.#_&&!e.comments.some(({id:e})=>e===this.#_)){let e=this.#_;t=!0,this.#Z.delete(e),this.#Q.delete(e),this.#$.delete(e),this.#ee.delete(e),this.#_=null,this.#v=null,this.#He(`열려 있던 피드백이 삭제되었습니다.`)}this.#he();let n=this.#y;n&&e.comments.some(({id:e})=>e===n)&&(this.#y=null,queueMicrotask(()=>void this.#ze(n,{origin:`pin`,navigate:!1,announceOpened:!0})));let r=t&&this.#b&&this.#De()===`sheet`&&this.#g?this.#xe(!1,{restoreFocus:!1,cancelNavigation:!1}):t&&!this.#b?this.#Ce():!1;t&&queueMicrotask(()=>{r||(this.#b?this.#Ae():this.#je()?.focus())})};#oe=e=>{e.projectId===this.#t?.session.projectId&&(this.#o=e,this.#Ot(),this.#we(),this.#Ee())};#se(e,t=!0){let n=e.type===`access-lost`;this.#k+=1,this.#A+=1;let r=this.#n,i=this.#r;if(this.#n=null,this.#r=null,e.clearSnapshot&&(this.#a=null,this.#o=null),!n&&this.#d){let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);this.#g={target:this.#d,body:e?.value??this.#f},this.#d=null,this.#f=``}if(!n&&this.#h?.comment){let{target:e,body:t,comment:n}=this.#h;this.#m??={target:e,body:t,comment:n},this.#p||=`저장하지 못했습니다. 다시 시도하세요.`}if(n||this.#Q.forEach(({body:e,reply:t},n)=>{this.#Z.set(n,e),this.#ee.has(n)||this.#ee.set(n,{body:e,reply:t}),this.#$.has(n)||this.#$.set(n,`답글을 저장하지 못했습니다. 다시 시도하세요.`)}),this.#h=null,this.#Q.clear(),n&&(this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#g=null,this.#_=null,this.#v=null,this.#Z.clear(),this.#$.clear(),this.#ee.clear()),this.#s?this.#ge(!1):this.#Tt(),this.#T=`error`,this.#D=e.recovery,this.#O=e.type===`access-lost`,this.#E=e.type===`access-lost`?Wn(e.code):`다시 시도하세요.`,t&&(this.#b=!0),$(r,i),this.#_e(),this.#he(),this.#He(this.#E),e.type===`access-lost`){try{this.#t?.onReauthenticationRequired?.(e)}catch{}this.dispatchEvent(new CustomEvent(`visual-review:reauthenticate-required`,{bubbles:!0,composed:!0,detail:{code:e.code}}))}}#ce(e){let t=new Set(e.comments.map(({id:e})=>e)),n=this.#h,r=this.#m,i=!!(n?.comment&&t.has(n.comment.id)),a=!!(r&&t.has(r.comment.id)),o=[...i&&n?[n.target]:[],...a&&r?[r.target]:[]];if(o.length>0){let e=this.#d!==null&&o.includes(this.#d);this.#d&&o.includes(this.#d)&&(this.#d=null,this.#f=``),this.#g&&o.includes(this.#g.target)&&(this.#g=null),i&&(this.#h=null),a&&(this.#m=null),this.#p=``,this.#He(`피드백을 저장했습니다.`),e&&queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}))}new Set([...this.#Z.keys(),...this.#Q.keys(),...this.#$.keys(),...this.#ee.keys()]).forEach(n=>{if(!t.has(n)){this.#Z.delete(n),this.#Q.delete(n),this.#$.delete(n),this.#ee.delete(n);return}let r=this.#Q.get(n),i=this.#ee.get(n),a=!!(r&&e.replies.some(e=>e.id===r.reply.id&&e.commentId===n)),o=!!(i&&e.replies.some(e=>e.id===i.reply.id&&e.commentId===n));!a&&!o||(a&&this.#Q.delete(n),o&&this.#ee.delete(n),this.#$.delete(n),this.#Z.delete(n),this.#He(`답글을 저장했습니다.`))})}#le=()=>{this.#j=!navigator.onLine,this.#we()};#ue(){this.#k+=1,this.#A+=1;let e=this.#n,t=this.#r;this.#n=null,this.#r=null;for(let[e,t]of[...this.#re])this.#re.delete(e),t(!1);for(let[e,{settle:t}]of[...this.#ie])this.#ie.delete(e),t();this.#s?this.#ge(!1):this.#Tt(),this.#a=null,this.#o=null,this.#T=`loading`,this.#E=``,this.#D=`retry`,this.#O=!1,this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#h=null,this.#g=null,this.#_=null,this.#v=null,this.#Z.clear(),this.#Q.clear(),this.#$.clear(),this.#ee.clear(),$(e,t)}#de(){this.#k+=1,this.#A+=1,this.#at(),this.#We(),this.#ut(),this.#$e(),this.#yt(),this.#s&&this.#ge(!1),this.#P?.(),this.#P=null,this.#N?.(),this.#N=null;let e=this.#n,t=this.#r;this.#n=null,this.#r=null,this.#i?.stop(),this.#i=null,this.#M?.abort(),this.#M=null,this.#a=null,this.#o=null,this.#T=`loading`,this.#E=``,this.#D=`retry`,this.#O=!1,this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#h=null,this.#g=null,this.#_=null,this.#v=null,this.#b=!1,this.#S=`current`,this.#C=`all`,this.#B=!1,this.#Z.clear(),this.#Q.clear(),this.#$.clear(),this.#ee.clear(),this.#e.replaceChildren(),$(e,t)}#fe(){this.#e.replaceChildren();let e=e=>e.stopPropagation();[`change`,`click`,`contextmenu`,`dblclick`,`input`,`keydown`,`keyup`,`pointercancel`,`pointerdown`,`pointermove`,`pointerup`,`submit`].forEach(t=>{this.#e.addEventListener(t,e,{signal:this.#M?.signal})});let t=document.createElement(`style`);this.#t?.styleNonce&&(t.nonce=this.#t.styleNonce),t.textContent=`
4
4
  :host {
5
5
  all: initial;
6
6
  /* The reviewer sees this pin on the staging page and the owner sees the
@@ -1502,4 +1502,4 @@ const e=`visual-review:v1:`,t=4096;function n(t,n){return`${e}${encodeURICompone
1502
1502
  }
1503
1503
  .rg-cursor-chat-composer::before { right: auto; left: -6px; }
1504
1504
  }
1505
- `;let n=Z(`highlight`);n.dataset.slot=`highlight`;let r=Z(`region`);r.dataset.slot=`region`;let i=Z(`pins`);i.dataset.slot=`pins`;let a=Z(`panels`);a.dataset.slot=`panels`;let o=Z(`navigator-slot`);o.dataset.slot=`navigator`,o.id=Cn,o.addEventListener(`click`,this.#Le),o.addEventListener(`keydown`,this.#Re);let s=Z(`rg-visually-hidden`);s.dataset.slot=`announcer`,s.setAttribute(`aria-live`,`polite`),s.setAttribute(`aria-atomic`,`true`);let c=He({developerGrab:this.#t?.developerTools?.codeContextCopy===!0}),l=Yn(this.#t?.position);c.dataset.position=l,c.dataset.mobilePosition=Xn(l),c.style.setProperty(`--rg-toolbar-offset-x`,`${Qn(this.#t?.offset?.x)}px`),c.style.setProperty(`--rg-toolbar-offset-y`,`${Qn(this.#t?.offset?.y)}px`),c.querySelector(`.rg-toolbar-actions`)?.append(kt(0,{controlsId:Cn,presentation:this.#De()})),c.querySelector(`.rg-feedback-tool`)?.addEventListener(`click`,()=>{if(!this.#ve()){this.#b||this.#xe(!0),this.#He(this.#ye());return}if(this.#b&&this.#xe(!1,{restoreFocus:!1,restoreComposer:!0}))return;if(this.#h){this.#He(`피드백을 저장하는 중입니다.`);return}if(this.#s&&this.#c===`react-grab`&&this.#g){this.#ge(!1);return}let e=this.#s&&this.#c===`feedback`;this.#ge(!e,`feedback`)}),c.querySelector(`.rg-developer-grab-tool`)?.addEventListener(`click`,()=>{if(this.#B){this.#He(`코드 컨텍스트를 복사하는 중입니다.`);return}if(this.#h){this.#He(`피드백을 저장하는 중입니다.`);return}this.#b&&this.#xe(!1,{restoreFocus:!1});let e=this.#s&&this.#c===`react-grab`;e||this.#Se(),this.#ge(!e,`react-grab`)}),c.querySelector(`.rg-feedback-list-tool`)?.addEventListener(`click`,()=>{this.#xe(!this.#b)}),c.querySelector(`.rg-collapse`)?.addEventListener(`click`,()=>{let e=c.dataset.collapsed===`true`;!e&&this.#s&&this.#ge(!1),!e&&this.#b&&this.#xe(!1,{restoreFocus:!1}),ct(c,!e)}),this.#e.append(t,n,r,i,a,o,s,c),this.#t&&this.#M&&lt({toolbar:c,position:l,offset:{x:Qn(this.#t.offset?.x),y:Qn(this.#t.offset?.y)},storageKey:tt(this.#t.session.projectId,this.#t.session.reviewerId),signal:this.#M.signal,onDragStart:()=>{this.#s&&this.#ge(!1),this.#b&&this.#xe(!1,{restoreFocus:!1})}})}#pe(){let e=this.#t?.collaboration,t=e?.repository;if(!this.#t||!t||!e.cursors&&!e.chat)return;let n=e.roomId??e.scopeId;this.#i=Fe({root:this.#e,pageId:this.#t.pageId,pathname:$n(window.location.pathname),roomId:n,session:this.#t.session,repository:t,cursors:e.cursors,chat:e.chat,canOpenChat:()=>this.#me(),onFailure:e=>{e.type===`access-lost`?(this.#i?.stop(),this.#i=null,this.#se(e)):this.#He(`실시간 협업 연결이 불안정합니다. 다시 연결하는 중입니다.`)}}),this.#i.start()}#me(){return this.#h||this.#B?!1:(this.#s&&this.#ge(!1),this.#b&&this.#xe(!1,{restoreFocus:!1,restoreComposer:!1}),this.#d&&(this.#Se(),this.#jt()),this.#_&&this.#xt(!1,!1),!this.#s&&!this.#b&&!this.#d&&!this.#_)}#he(){this.#Ot(),this.#jt(),this.#we(),this.#Ee(),this.#_e(),this.#vt(),this.#bt()}#ge(e,t=`feedback`){let n=this.#c;if(e&&(this.#A+=1),e&&t===`feedback`&&!this.#ve()){this.#b||this.#xe(!0),this.#He(this.#ye());return}if(e&&t===`feedback`&&this.#h){this.#He(`피드백을 저장하는 중입니다.`);return}if(e&&t===`feedback`&&this.#g){this.#_?this.#xt(!1):this.#Ce(),this.#He(`작성 중인 피드백을 복원했습니다.`);return}if(e&&this.#s){this.#c=t,this.#l=null,this.#u=null,this.#Tt(),this.#_e();return}this.#s=e,this.#c=e?t:null,this.#_e(),e?(this.#_=null,this.#v=null,this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#Tt(),document.addEventListener(`pointermove`,this.#Ge,!0),document.addEventListener(`pointerdown`,this.#Ke,!0),document.addEventListener(`pointerup`,this.#qe,!0),document.addEventListener(`pointercancel`,this.#Je,!0),document.addEventListener(`keydown`,this.#Ye,!0),this.#F={value:document.body.style.getPropertyValue(`cursor`),priority:document.body.style.getPropertyPriority(`cursor`)},document.body.style.setProperty(`cursor`,`crosshair`),this.#N=ae(this.#t?.styleNonce),queueMicrotask(()=>this.#nt())):(document.removeEventListener(`pointermove`,this.#Ge,!0),document.removeEventListener(`pointerdown`,this.#Ke,!0),document.removeEventListener(`pointerup`,this.#qe,!0),document.removeEventListener(`pointercancel`,this.#Je,!0),document.removeEventListener(`keydown`,this.#Ye,!0),this.#F&&=(ar(document.body,`cursor`,this.#F),null),this.#N?.(),this.#N=null,this.#l=null,this.#u=null,this.#Tt()),this.#jt(),!e&&n===`react-grab`&&this.#Ce()}#_e(){let e=this.#e.querySelector(`.rg-toolbar`),t=this.#e.querySelector(`[data-slot="pins"]`),n=this.#e.querySelector(`.rg-feedback-tool`),r=this.#e.querySelector(`.rg-developer-grab-tool`),i=this.#s&&this.#c===`feedback`,a=this.#s&&this.#c===`react-grab`;e&&(e.dataset.selecting=String(this.#s)),t&&(t.dataset.selectionSuppressed=String(this.#s),t.toggleAttribute(`inert`,this.#s),t.setAttribute(`aria-hidden`,String(this.#s))),n&&(n.setAttribute(`aria-pressed`,String(i)),n.setAttribute(`aria-label`,i?`선택 취소`:`피드백 위치 선택`),n.setAttribute(`aria-disabled`,String(!this.#ve()))),r&&(r.setAttribute(`aria-pressed`,String(a)),r.setAttribute(`aria-label`,a?`코드 선택 취소`:`React Grab 코드 선택`),r.setAttribute(`aria-disabled`,String(this.#B)))}#ve(){return!this.#O&&this.#T===`ready`&&this.#a!==null}#ye(){return this.#O?`다시 인증하세요.`:this.#T===`loading`?`불러오는 중입니다.`:`다시 시도하세요.`}#be(){return this.#f.trim().length>0||!!this.#g?.body.trim().length||[...this.#Z.values()].some(e=>e.trim().length>0)||this.#m!==null||this.#ee.size>0}#xe(e,t={}){let n=t.restoreFocus??!0,r=t.restoreComposer??!0;if(e===this.#b)return!1;if(e)return this.#A+=1,this.#s&&this.#ge(!1),this.#Se(),this.#w=`idle`,this.#b=!0,this.#jt(),this.#we(),this.#Ee(),queueMicrotask(()=>this.#Ae()),!1;(t.cancelNavigation??!0)&&(this.#A+=1),this.#b=!1,this.#w=`idle`,this.#P?.(),this.#P=null,this.#jt(),this.#we(),this.#Ee(),queueMicrotask(()=>this.#St());let i=r&&this.#Ce();return n&&!i&&queueMicrotask(()=>this.#je()?.focus()),i}#Se(){if(!this.#d)return!1;let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);return this.#g={target:this.#d,body:e?.value??this.#f},this.#d=null,this.#f=``,!0}#Ce(){if(!this.#g||this.#b||this.#_)return!1;let e=this.#g;return this.#g=null,this.#d=e.target,this.#f=e.body,this.#jt(),queueMicrotask(()=>{let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);e?.focus(),e?.setSelectionRange(e.value.length,e.value.length)}),!0}#we(){let e=this.#e.querySelector(`[data-slot="navigator"]`);if(!e)return;this.#w===`saving`&&!this.#h&&this.#Q.size===0&&(this.#w=this.#be()?`draft-warning`:`confirm`);let t=e.querySelector(`.rg-feedback-navigator`),n=t?.querySelector(`.rg-feedback-navigator-content`),r=t?.dataset.presentation,i=t?`refresh`:`enter`,a=t?.dataset.presentation===`sheet`&&t.dataset.detailOpen===`true`,o=this.#b&&!!this.#_&&this.#De()===`sheet`,s=n&&!a&&!o?n.scrollTop:this.#x;this.#x=s;let c=this.#e.activeElement instanceof HTMLElement?this.#e.activeElement:null,l=c?.closest(`.rg-feedback-row[data-comment-id]`)?.dataset.commentId,u=c?.closest(`[data-feedback-filter]`)?.dataset.feedbackFilter,d=c?.closest(`[data-feedback-scope]`)?.dataset.feedbackScope,f=!!c?.closest(`.rg-feedback-navigator-close`),p=!!c?.closest(`.rg-feedback-navigator-retry`),m=c instanceof HTMLTextAreaElement&&c.closest(`.rg-feedback-navigator-detail`)!==null?c:null,h=m?{start:m.selectionStart,end:m.selectionEnd,direction:m.selectionDirection}:null,g=t?.querySelector(`.rg-feedback-navigator-detail .rg-thread-messages`)?.scrollTop??0;if(e.replaceChildren(),!this.#b){this.#x=0;return}let _=this.#De(),v=Z(`rg-feedback-navigator-scrim`);v.dataset.motion=i,v.dataset.feedbackNavigatorAction=`close`,v.setAttribute(`aria-hidden`,`true`);let y=At(this.#Te(),{id:wn,presentation:_,exitReviewState:this.#t?.onExitReview?this.#w:void 0});y.dataset.motion=i;let b=_===`sheet`&&this.#_?this.#a?.comments.find(({id:e})=>e===this.#_):null;if(y.dataset.detailOpen=String(!!this.#_),b){y.removeAttribute(`aria-labelledby`),y.setAttribute(`aria-label`,`피드백 상세`),[...y.children].forEach(e=>{e instanceof HTMLElement&&(e.inert=!0)});let e=Z(`rg-feedback-navigator-detail`),t=this.#Ft(b);t.classList.add(`rg-feedback-navigator-thread`);let n=t.querySelector(`.rg-thread-close`);n&&(n.classList.add(`rg-feedback-navigator-back`),n.setAttribute(`aria-label`,`피드백 목록으로 돌아가기`),n.replaceChildren(qn()),n.closest(`.rg-tag-row`)?.prepend(n)),e.append(t),y.append(e)}e.append(v,y),this.#ke(_),queueMicrotask(()=>this.#Oe()),queueMicrotask(()=>{if(!this.#b)return;let t=e.querySelector(`.rg-feedback-navigator-content`);if(t&&(t.scrollTop=s),b){let e=y.querySelector(`.rg-feedback-navigator-detail .rg-thread-messages`);if(e&&(e.scrollTop=g),m&&h){let e=y.querySelector(`.rg-feedback-navigator-detail textarea`);e?.focus({preventScroll:!0}),e?.setSelectionRange(h.start,h.end,h.direction);return}}if(l){let e=this.#Me(l);e?e.focus({preventScroll:!0}):this.#Ae()}else if(u&&Wn(u))e.querySelector(`[data-feedback-filter="${u}"]`)?.focus({preventScroll:!0});else if(d&&Gn(d))e.querySelector(`[data-feedback-scope="${d}"]`)?.focus({preventScroll:!0});else if(f)e.querySelector(`.rg-feedback-navigator-close`)?.focus({preventScroll:!0});else if(p){let t=e.querySelector(`.rg-feedback-navigator-retry`);t?t.focus({preventScroll:!0}):this.#Ae()}else _===`sheet`&&r!==`sheet`&&this.#Ae()})}#Te(){let e=this.#Ne(),t=e.comments.filter(e=>this.#Pe(e)),n=this.#S===`current`?t:e.comments,r=new Set(n.map(({id:e})=>e)),i=bt({pageId:e.pageId,comments:n,replies:e.replies.filter(({commentId:e})=>r.has(e))},this.#C),a=this.#t?.now?.()??Date.now(),o=this.#j&&this.#T===`ready`?`reconnecting`:this.#T;return{scope:this.#S,scopeCounts:{current:t.length,all:e.comments.length},filter:this.#C,counts:i.counts,rows:i.rows.map(({comment:e,pinNumber:t,replyCount:n,lastActivityAt:r})=>({id:e.id,pageId:e.pageId,pinNumber:t,pageLabel:this.#Ie(e),pageUrl:tr(e)?.href,currentPage:this.#Pe(e),targetLabel:this.#Fe(e),authorName:e.authorName,body:e.body,timeLabel:nr(r,a),replyCount:n,status:e.status,locationAvailable:!this.#Pe(e)||q(e).available})),activeCommentId:this.#_,loadState:o,errorMessage:this.#E,errorRecovery:this.#D}}#Ee(){let e=this.#je();if(!e)return;let t=this.#Ne().comments.length;e.setAttribute(`aria-label`,`피드백 목록, 총 ${t}개`);let n=e.querySelector(`[data-feedback-count]`);n&&(n.textContent=String(t),n.hidden=t===0);let r=e.closest(`.rg-action-wrap`)?.querySelector(`.rg-tooltip`);r&&(r.textContent=`피드백 ${t}개`),e.setAttribute(`aria-expanded`,String(this.#b)),e.setAttribute(`aria-controls`,Cn),this.#De()===`sheet`?e.setAttribute(`aria-haspopup`,`dialog`):e.removeAttribute(`aria-haspopup`),e.removeAttribute(`aria-pressed`)}#De(){return window.matchMedia?.(`(max-width: 640px)`).matches||window.innerWidth<=640?`sheet`:`tray`}#Oe(){let e=this.#e.querySelector(`.rg-feedback-navigator`),t=this.#je(),n=this.#e.querySelector(`.rg-toolbar`);if(!e||!t||!n||e.dataset.presentation!==`tray`)return;let r=t.getBoundingClientRect(),i=n.getBoundingClientRect(),a=e.offsetWidth;if(r.width<=0||r.height<=0||a<=0)return;let o=Zn(Yn(n.dataset.position)),s=r.left+r.width/2,c=r.top+r.height/2;if(o===`top`||o===`bottom`){let t=Jn(s-a/2,8,Math.max(8,window.innerWidth-a-8));e.style.left=`${t}px`,e.style.right=`auto`,o===`top`?(e.style.top=`${Math.max(8,i.bottom+8)}px`,e.style.bottom=`auto`):(e.style.top=`auto`,e.style.bottom=`${Math.max(8,window.innerHeight-i.top+8)}px`);let n=`${Jn(s-t,16,a-16)}px`;e.style.setProperty(`--rg-navigator-origin`,o===`top`?`${n} -8px`:`${n} calc(100% + 8px)`)}else{let t=e.offsetHeight;if(t<=0)return;let n=Jn(c-t/2,8,Math.max(8,window.innerHeight-t-8)),r=o===`left`?Math.min(window.innerWidth-a-8,i.right+8):Math.max(8,i.left-a-8);e.style.top=`${n}px`,e.style.right=`auto`,e.style.bottom=`auto`,e.style.left=`${Math.max(8,r)}px`,e.style.setProperty(`--rg-navigator-origin`,o===`left`?`-8px 50%`:`calc(100% + 8px) 50%`)}}#ke(e){if(e!==`sheet`){this.#P?.(),this.#P=null;return}if(this.#P)return;let t=[...[...document.body.children].filter(e=>e!==this),...this.#e.querySelectorAll(`[data-slot="pins"], [data-slot="panels"], .rg-toolbar`)].filter(e=>e instanceof HTMLElement),n=t.map(e=>({element:e,inert:e.inert}));t.forEach(e=>{e.inert=!0});let r=this.#e.querySelector(`[data-slot="panels"]`),i=r?ir(r,`visibility`):null;r&&r.style.setProperty(`visibility`,`hidden`);let a=ir(document.body,`overflow`),o=ir(document.documentElement,`overflow`),s=e=>{let t=this.#e.querySelector(`.rg-feedback-navigator`);!t||e.composedPath().includes(t)||queueMicrotask(()=>this.#Ae())};document.addEventListener(`focusin`,s,!0),document.body.style.setProperty(`overflow`,`hidden`),document.documentElement.style.setProperty(`overflow`,`hidden`),this.#P=()=>{n.forEach(({element:e,inert:t})=>{e.inert=t}),r&&i&&ar(r,`visibility`,i),document.removeEventListener(`focusin`,s,!0),ar(document.body,`overflow`,a),ar(document.documentElement,`overflow`,o)}}#Ae(){if(!this.#b)return;let e=this.#e.querySelector(`.rg-feedback-navigator-detail .rg-thread-label`);if(e){e.focus({preventScroll:!0});return}let t=this.#_?this.#Me(this.#_):null,n=this.#e.querySelector(`.rg-feedback-row`),r=this.#e.querySelector(`.rg-feedback-navigator-retry`),i=this.#e.querySelector(`.rg-feedback-navigator-close`);(t??n??r??i)?.focus({preventScroll:!0})}#je(){return this.#e.querySelector(`.rg-feedback-list-tool`)}#Me(e){return[...this.#e.querySelectorAll(`.rg-feedback-row[data-comment-id]`)].find(({dataset:t})=>t.commentId===e)}#Ne(){let e=this.#a??{pageId:this.#t?.pageId??``,comments:[],replies:[]},t=this.#o;if(!t)return e;let n=this.#t?.pageId??e.pageId,r=t.comments.filter(({pageId:e})=>e!==n),i=new Set(r.map(({id:e})=>e)),a=new Set(e.comments.map(({id:e})=>e));return{pageId:n,comments:[...r.filter(({id:e})=>!a.has(e)),...e.comments],replies:[...t.replies.filter(({commentId:e})=>i.has(e)),...e.replies]}}#Pe(e){return e.pageId===this.#t?.pageId}#Fe(e){return qt(e.target)}#Ie(e){let t=tr(e);if(t)return er(t);let n=this.#o?.pages?.find(({id:t})=>t===e.pageId);return n?.name.trim()?n.name.trim():e.target.pageTitle.trim()||`알 수 없는 페이지`}#Le=e=>{e.stopPropagation();let t=e.target instanceof Element?e.target.closest(`[data-feedback-navigator-action]`):null,n=t?.dataset.feedbackNavigatorAction;if(n){if(n===`close`||n===`toggle`){this.#xe(!1);return}if(n===`retry`){this.#ne();return}if(n===`exit-review`){this.#w=this.#h||this.#Q.size>0?`saving`:this.#be()?`draft-warning`:`confirm`,this.#we(),queueMicrotask(()=>{this.#e.querySelector(this.#w===`saving`?`.rg-feedback-navigator-close`:`.rg-feedback-navigator-exit-cancel`)?.focus({preventScroll:!0})});return}if(n===`cancel-exit-review`){this.#w=`idle`,this.#we(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-navigator-exit-link`)?.focus({preventScroll:!0}));return}if(n===`confirm-exit-review`){if(this.#h||this.#Q.size>0){this.#w=`saving`,this.#we();return}this.#t?.onExitReview?.();return}if(n===`filter`){let e=t.dataset.feedbackFilter;if(!Wn(e)||e===this.#C)return;this.#C=e,this.#we();return}if(n===`scope`){let e=t.dataset.feedbackScope;if(!Gn(e)||e===this.#S)return;this.#S=e,this.#C=`all`,this.#we();return}n===`open-comment`&&t.dataset.commentId&&this.#ze(t.dataset.commentId,{origin:`navigator`,navigate:!0})}};#Re=e=>{if(e.stopPropagation(),e.isComposing)return;let t=[...this.#e.querySelectorAll(`.rg-feedback-row`)],n=e.target instanceof Element?e.target.closest(`.rg-feedback-row`):null;if(n&&[`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key)){e.preventDefault();let r=t.indexOf(n);t[e.key===`Home`?0:e.key===`End`?t.length-1:e.key===`ArrowDown`?Math.min(t.length-1,r+1):Math.max(0,r-1)]?.focus();return}if(e.key!==`Tab`||this.#De()!==`sheet`)return;let r=this.#e.querySelector(`.rg-feedback-navigator`),i=r?[...r.querySelectorAll(`button:not(:disabled), [tabindex]:not([tabindex="-1"])`)].filter(e=>!e.closest(`[inert]`)):[];if(i.length===0)return;let a=i[0],o=i.at(-1);e.shiftKey&&this.#e.activeElement===a?(e.preventDefault(),o.focus()):!e.shiftKey&&this.#e.activeElement===o&&(e.preventDefault(),a.focus())};async#ze(e,t){let n=this.#Ne().comments.find(({id:t})=>t===e);if(!n)return;if(t.origin===`navigator`){let e=this.#e.querySelector(`.rg-feedback-navigator-content`);e&&(this.#x=e.scrollTop)}this.#s&&this.#ge(!1);let r=++this.#A,i=t.navigate&&!this.#Pe(n),a=i?tr(n):null,o=!!(a&&a.origin===window.location.origin);if(t.origin===`navigator`&&this.#b&&i&&o&&(this.#xe(!1,{restoreFocus:!1,restoreComposer:!1,cancelNavigation:!1}),await rr()),r!==this.#A||!this.#M)return;if(!this.#Ne().comments.some(({id:t})=>t===e)){this.#Be();return}let s=t.origin===`navigator`&&this.#b&&this.#De()===`sheet`;s&&(this.#P?.(),this.#P=null);let c=!0;try{t.navigate&&(c=await this.#Ve(n))}finally{s&&this.#b&&this.#ke(`sheet`)}if(c&&r===this.#A){if(!this.#Ne().comments.some(({id:t})=>t===e)){this.#Be();return}if(this.#d=null,this.#_=e,this.#v=t.origin,this.#he(),!q(n).available)this.#He(`현재 화면에서 피드백 위치를 찾을 수 없습니다.`);else if(t.announceOpened){let e=bt(this.#Ne()).pinNumberByCommentId.get(n.id)??1;this.#He(`피드백 #${e} 대화를 열었습니다.`)}queueMicrotask(()=>this.#e.querySelector(`.rg-thread-label`)?.focus({preventScroll:!0}))}}#Be(){if(this.#g&&this.#b&&this.#De()===`sheet`){this.#xe(!1,{restoreFocus:!1,cancelNavigation:!1});return}!this.#b&&this.#Ce()||queueMicrotask(()=>{this.#b?this.#Ae():this.#je()?.focus({preventScroll:!0})})}async#Ve(e){if(!this.#Pe(e)){let t=tr(e);if(!t||t.origin!==window.location.origin)return this.#He(`이 피드백의 페이지로 이동할 수 없습니다.`),!1;this.#He(`${$n(t.pathname)} 페이지로 이동합니다.`),this.#y=e.id;try{this.#t?.onNavigateToFeedback?await this.#t.onNavigateToFeedback(t.href,e):window.location.assign(t.href)}catch{this.#y=null,this.#He(`피드백 페이지로 이동하지 못했습니다.`)}return!1}let t=q(e);if(!t.available||t.pageY===null)return!0;let n=window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`;if(e.target.kind!==`viewport`){let t=j(e.anchor).element;if(t&&typeof t.scrollIntoView==`function`)try{return t.scrollIntoView({block:`center`,inline:`center`,behavior:n}),await rr(),await rr(),!0}catch{}}let r=window.visualViewport?.height??window.innerHeight,i=window.visualViewport?.width??window.innerWidth,a=Math.max(0,t.pageY-r/3),o=Math.max(0,(t.pageX??window.scrollX)-i/2);try{window.scrollTo({left:o,top:a,behavior:n})}catch{}return await rr(),await rr(),!0}#He(e){let t=this.#e.querySelector(`[data-slot="announcer"]`);t&&(t.textContent=``,queueMicrotask(()=>{t.textContent=e}))}#Ue(e,t=`neutral`){let n=this.#e.querySelector(`.rg-developer-status`);n&&(this.#We(),n.textContent=e,n.dataset.tone=t,n.dataset.visible=`true`,this.#L=window.setTimeout(()=>{this.#L=null,n.isConnected&&(n.dataset.visible=`false`)},1800))}#We(){this.#L!==null&&(window.clearTimeout(this.#L),this.#L=null)}#Ge=e=>{if(!this.#s||this.#Bt(e)||this.#l&&e.pointerId!==this.#u)return;let t=Rn(e);if(this.#l&&kn(this.#l,t)>=6){this.#wt(this.#l,t);return}this.#Ct(t)};#Ke=e=>{!this.#s||this.#Bt(e)||e.button!==0||this.#l||(e.preventDefault(),e.stopImmediatePropagation(),this.#l=Rn(e),this.#u=e.pointerId)};#qe=e=>{if(!this.#s||!this.#l||e.pointerId!==this.#u)return;if(this.#Bt(e)){this.#l=null,this.#u=null,this.#Tt();return}e.preventDefault(),e.stopImmediatePropagation();let t=this.#l,n=this.#c,r=Rn(e),i=kn(t,r)>=6;n===`feedback`&&(this.#d=i?pe(t,r):fe(r));let a=n===`react-grab`?this.#Xe(t,r,i):[];this.#lt(),this.#ge(!1),n===`react-grab`?this.#Ze(a):queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label textarea`)?.focus())};#Je=e=>{!this.#s||!this.#l||e.pointerId!==this.#u||(e.preventDefault(),e.stopImmediatePropagation(),this.#l=null,this.#u=null,this.#Tt())};#Ye=e=>{if(!this.#s)return;if(e.key===`Escape`){e.preventDefault(),e.stopImmediatePropagation(),this.#ge(!1);return}if(e.key!==`Enter`||e.isComposing||this.#Bt(e)||Mn(e))return;let t=Pn(e);if(!t)return;let n=L(t);if(n.width<=0||n.height<=0)return;e.preventDefault(),e.stopImmediatePropagation();let r=this.#c;r===`feedback`&&(this.#d=de(t,{clientX:n.left+n.width/2,clientY:n.top+n.height/2})),this.#ge(!1),r===`react-grab`?this.#Ze([t]):queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label textarea`)?.focus())};#Xe(e,t,n){if(!n){let e=ie(t.clientX,t.clientY);return e?[e]:[]}return me(new DOMRect(Math.min(e.clientX,t.clientX),Math.min(e.clientY,t.clientY),Math.abs(t.clientX-e.clientX),Math.abs(t.clientY-e.clientY))).slice(0,8)}async#Ze(e){if(e.length===0){this.#He(`선택할 요소를 찾지 못했습니다.`),this.#Ue(`선택할 요소가 없습니다`,`error`),this.#et();return}if(!this.#M||this.#B)return;let t=this.#M.signal;this.#B=!0,this.#_e(),this.#He(`코드 컨텍스트를 복사하는 중입니다.`),this.#Ue(`코드 컨텍스트 복사 중…`);try{let n=this.#Qe(),r=await n;if(t.aborted||n!==this.#V)return;let i=await r.copyElement(e.length===1?e[0]:e);if(t.aborted)return;this.#He(i?`코드 컨텍스트를 복사했습니다.`:`코드 컨텍스트를 복사하지 못했습니다. 다시 시도하세요.`),this.#Ue(i?`코드 컨텍스트 복사됨`:`복사 실패 · 다시 시도`,i?`neutral`:`error`)}catch{t.aborted||(this.#He(`코드 컨텍스트를 복사하지 못했습니다. 다시 시도하세요.`),this.#Ue(`복사 실패 · 다시 시도`,`error`))}finally{t.aborted||(this.#B=!1,this.#_e(),this.#et())}}#Qe(){if(this.#V)return this.#V;let e=(this.#t?.developerTools?.loadReactGrab??(()=>_t(this.#t?.styleNonce)))();return this.#V=e,e.catch(()=>{this.#V===e&&(this.#V=null)}),e}#$e(){let e=this.#V;this.#V=null,e&&e.then(e=>e.dispose()).catch(()=>void 0)}#et(){this.#d||queueMicrotask(()=>this.#e.querySelector(`.rg-developer-grab-tool`)?.focus({preventScroll:!0}))}#tt=e=>{if(!this.#s)return;if(this.#Bt(e)||Mn(e)){this.#Tt();return}let t=Pn(e);if(!t){this.#Tt();return}let n=L(t);if(n.width<=0||n.height<=0){this.#Tt();return}let r=this.#e.querySelector(`[data-slot="region"]`);r&&(r.style.display=`none`);let i=this.#e.querySelector(`[data-slot="highlight"]`);i&&Q(i,n)};#nt(){if(!this.#s)return;let e=Fn(document);if(!e||p(e)||Nn(e))return;let t=L(e);if(t.width<=0||t.height<=0)return;let n=this.#e.querySelector(`[data-slot="highlight"]`);n&&Q(n,t)}#rt=e=>{if(e.key===`Escape`&&!e.isComposing){let t=!!this.#e.activeElement?.closest(`.rg-thread-label`);if(this.#_&&t){e.preventDefault(),e.stopImmediatePropagation(),this.#xt(!0);return}if(this.#b){e.preventDefault(),e.stopImmediatePropagation(),this.#xe(!1);return}if(this.#_){e.preventDefault(),e.stopImmediatePropagation(),this.#xt(!0);return}if(this.#d){if(e.preventDefault(),e.stopImmediatePropagation(),this.#h?.target===this.#d){this.#He(`피드백을 저장하는 중입니다.`);return}this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#jt(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}));return}}!((e.metaKey||e.ctrlKey)&&!e.shiftKey&&!e.altKey&&(e.code===`KeyC`||e.key.toLowerCase()===`c`))||this.#t?.developerTools?.codeContextCopy!==!0||e.repeat||this.#s||this.#d||this.#_||this.#b||this.#B||this.#I!==null||Mn(e)||Ln(e)||(this.#I=window.setTimeout(()=>{this.#I=null,!(this.#s||this.#d||this.#_||this.#b||this.#h||this.#B)&&this.#ot()},100))};#it=e=>{let t=e.code===`KeyC`||e.key.toLowerCase()===`c`,n=e.key===`Meta`||e.key===`Control`;(t||n)&&this.#at()};#at(){this.#I!==null&&(window.clearTimeout(this.#I),this.#I=null)}#ot(){if(this.#t?.developerTools?.codeContextCopy!==!0)return;let e=this.#e.querySelector(`.rg-toolbar`);e?.dataset.collapsed===`true`&&ct(e,!1),this.#ge(!0,`react-grab`)}#st=e=>{!this.#_||this.#Bt(e)||this.#xt(!1)};#ct=e=>{!this.#z||this.#Bt(e)||(e.preventDefault(),e.stopImmediatePropagation(),this.#ut())};#lt(){this.#ut(),this.#z=!0,this.#R=window.setTimeout(()=>{this.#R=null,this.#z=!1},0)}#ut(){this.#R!==null&&(window.clearTimeout(this.#R),this.#R=null),this.#z=!1}#dt=()=>{this.#ft()};#ft(){if(!(!this.#M||this.#H!==null)){if(typeof window.requestAnimationFrame==`function`){this.#U=!0,this.#H=-1;let e=window.requestAnimationFrame(()=>{this.#H=null,this.#pt()});this.#H!==null&&(this.#H=e);return}this.#U=!1,this.#H=window.setTimeout(()=>{this.#H=null,this.#pt()},16)}}#pt(){if(!this.#M)return;this.#K&&(this.#K=!1,this.#ht()),this.#vt(),this.#At(),this.#Et(),this.#St();let e=this.#e.querySelector(`.rg-feedback-navigator`);e&&e.dataset.presentation!==this.#De()?(this.#jt(),this.#we(),this.#Ee()):this.#Oe(),this.#bt()}#mt(){typeof window.ResizeObserver==`function`&&(this.#W=new window.ResizeObserver(this.#dt)),typeof window.MutationObserver==`function`&&(this.#G=new window.MutationObserver(e=>{e.some(({type:e})=>e===`childList`)&&(this.#K=!0),this.#dt()}),this.#ht()),this.#vt()}#ht(){let e=this.#G;if(!e)return;e.disconnect();let t=i();this.#gt(t),this.#_t();for(let n of t){if(n===this.#e)continue;let t=f(n)?n.documentElement:n;if(t)try{e.observe(t,{attributes:!0,characterData:!0,childList:!0,subtree:!0,attributeFilter:[`class`,`style`,`hidden`,`open`,`aria-hidden`,`id`,`data-review-id`,`data-testid`,`data-id`,`slot`]})}catch{}}}#gt(e){let t=new Set(e.filter(e=>f(e)&&e!==document));for(let[e,n]of this.#Y)t.has(e)||(n(),this.#Y.delete(e));for(let e of t){if(this.#Y.has(e))continue;let t=[],n=(n,r,i=!0)=>{e.addEventListener(n,r,{capture:i,passive:n===`scroll`}),t.push({type:n,listener:r,capture:i})};n(`keydown`,this.#rt),n(`keyup`,this.#it),n(`keydown`,this.#Ye),n(`pointermove`,this.#Ge),n(`pointerdown`,this.#st),n(`pointerdown`,this.#Ke),n(`pointerup`,this.#qe),n(`pointercancel`,this.#Je),n(`click`,this.#ct),n(`focusin`,this.#tt),n(`scroll`,this.#dt);let r=e.defaultView;r?.addEventListener(`resize`,this.#dt,{passive:!0}),r?.visualViewport?.addEventListener(`scroll`,this.#dt,{passive:!0}),r?.visualViewport?.addEventListener(`resize`,this.#dt,{passive:!0}),this.#Y.set(e,()=>{t.forEach(({type:t,listener:n,capture:r})=>{e.removeEventListener(t,n,r)}),r?.removeEventListener(`resize`,this.#dt),r?.visualViewport?.removeEventListener(`scroll`,this.#dt),r?.visualViewport?.removeEventListener(`resize`,this.#dt)})}}#_t(){let e=new Set(a(`iframe`));for(let[t,n]of this.#X)e.has(t)||(n(),this.#X.delete(t));for(let t of e){if(this.#X.has(t))continue;let e=()=>{this.#K=!0,this.#ft()};t.addEventListener(`load`,e),this.#X.set(t,()=>{t.removeEventListener(`load`,e)})}}#vt(){let e=this.#W;if(!e)return;let t=new Set,n=new Set;for(let e of this.#a?.comments??[]){let n=j(e.anchor).element;n&&In(n,t)}if(this.#d){let e=j(this.#d.anchor).element;e&&In(e,t)}for(let r of this.#J){if(t.has(r)){n.add(r);continue}try{e.unobserve(r)}catch{}}for(let r of t)if(!n.has(r))try{e.observe(r),n.add(r)}catch{}this.#J.clear(),n.forEach(e=>this.#J.add(e))}#yt(){this.#H!==null&&(this.#U&&typeof window.cancelAnimationFrame==`function`?window.cancelAnimationFrame(this.#H):window.clearTimeout(this.#H),this.#H=null),this.#q!==null&&(window.clearTimeout(this.#q),this.#q=null),this.#W?.disconnect(),this.#W=null,this.#G?.disconnect(),this.#G=null,this.#K=!1,this.#J.clear(),this.#Y.forEach(e=>e()),this.#Y.clear(),this.#X.forEach(e=>e()),this.#X.clear()}#bt(){let e=(this.#a?.comments??[]).some(e=>e.target.kind===`element`&&r(e.anchor.selector)&&!q(e).available);if(!this.#M||!e){this.#q!==null&&(window.clearTimeout(this.#q),this.#q=null);return}this.#q===null&&(this.#q=window.setTimeout(()=>{this.#q=null,this.#K=!0,this.#ft()},750))}#xt(e,t=!0){let n=this.#_;if(!n)return;let r=this.#v;this.#A+=1,this.#_=null,this.#v=null,this.#Ot(),this.#jt(),this.#we(),!(t&&!this.#b&&this.#Ce())&&e&&queueMicrotask(()=>{if(r===`navigator`&&this.#b){let e=this.#Me(n);e?e.focus({preventScroll:!0}):this.#Ae();return}if(r===`navigator`){this.#je()?.focus({preventScroll:!0});return}let e=[...this.#e.querySelectorAll(`.pin[data-comment-id]`)].find(({dataset:e})=>e.commentId===n);e?e.focus():this.#je()?.focus({preventScroll:!0})})}#St(){let e=this.#e.querySelector(`.rg-selection-label`);if(!e)return;if(this.#d){Ke(e,Jt(this.#d));return}if(!this.#_)return;let t=this.#a?.comments.find(({id:e})=>e===this.#_);t&&(e.removeAttribute(`data-layout`),Ke(e,Yt(t)))}#Ct(e){let t=ie(e.clientX,e.clientY),n=this.#e.querySelector(`[data-slot="highlight"]`),r=this.#e.querySelector(`[data-slot="region"]`);if(r&&(r.style.display=`none`),!n||!t){n&&(n.style.display=`none`);return}Q(n,L(t))}#wt(e,t){let n=this.#e.querySelector(`[data-slot="highlight"]`),r=this.#e.querySelector(`[data-slot="region"]`);n&&(n.style.display=`none`),r&&(r.removeAttribute(`data-point`),r.removeAttribute(`data-context-target`),Q(r,new DOMRect(Math.min(e.clientX,t.clientX),Math.min(e.clientY,t.clientY),Math.abs(t.clientX-e.clientX),Math.abs(t.clientY-e.clientY))))}#Tt(){this.#e.querySelectorAll(`.highlight, .region`).forEach(e=>{e.style.display=`none`,e.removeAttribute(`data-context-target`),e.removeAttribute(`data-point`)})}#Et(){if(this.#s)return;if(this.#d){this.#Dt(this.#d);return}let e=this.#a?.comments.find(({id:e})=>e===this.#_);if(e){this.#Dt(e.target);return}this.#Tt()}#Dt(e){let t=this.#e.querySelector(`[data-slot="highlight"]`),n=this.#e.querySelector(`[data-slot="region"]`);if(!(!t||!n)){if(t.style.display=`none`,n.style.display=`none`,t.removeAttribute(`data-context-target`),n.removeAttribute(`data-context-target`),n.removeAttribute(`data-point`),e.kind===`element`){let n=j(e.anchor);if(!n.anchored||!n.visible||!n.element)return;let r=L(n.element);t.dataset.contextTarget=`true`,Q(t,r);return}if(n.dataset.contextTarget=`true`,e.kind===`viewport`){n.dataset.point=`true`,Q(n,en(e));return}Q(n,Zt(e))}}#Ot(){let e=this.#e.querySelector(`[data-slot="pins"]`);if(!e)return;let t=this.#e.activeElement instanceof HTMLElement&&this.#e.activeElement.matches(`.pin[data-comment-id]`)?this.#e.activeElement.dataset.commentId:void 0;e.replaceChildren();let n=this.#a;if(!n)return;let r=bt(this.#Ne()).pinNumberByCommentId,i=this.#kt(n.comments);n.comments.forEach(t=>{if(!this.#Pe(t))return;let n=q(t);if(!n.available||n.pageX===null||n.pageY===null)return;let a=r.get(t.id)??1,o=i.get(t.id)??{x:0,y:0},s=document.createElement(`button`);s.type=`button`,s.className=`pin`,s.dataset.commentId=t.id,s.dataset.resolved=String(t.status===`resolved`),s.dataset.active=String(t.id===this.#_),s.dataset.collided=String(i.has(t.id)),s.style.display=`grid`,s.style.left=`${n.pageX+o.x-window.scrollX}px`,s.style.top=`${n.pageY+o.y-window.scrollY}px`,s.textContent=String(a),s.setAttribute(`aria-label`,`피드백 #${a}: ${t.body.slice(0,80)}`),s.setAttribute(`aria-expanded`,String(t.id===this.#_)),s.setAttribute(`aria-controls`,Xt(t.id)),s.addEventListener(`click`,()=>{if(!this.#s){if(this.#_===t.id){this.#xt(!0);return}this.#ze(t.id,{origin:`pin`,navigate:!1})}}),e.append(s)}),t&&queueMicrotask(()=>{[...e.querySelectorAll(`.pin[data-comment-id]`)].find(({dataset:e})=>e.commentId===t)?.focus({preventScroll:!0})})}#kt(e){if(!(window.innerWidth<=640||window.matchMedia?.(`(pointer: coarse)`).matches===!0))return new Map;let t=e.flatMap(e=>{if(!this.#Pe(e))return[];let t=q(e);return!t.available||t.pageX===null||t.pageY===null?[]:[{comment:e,x:t.pageX,y:t.pageY}]}),n=new Set(t.map((e,t)=>t)),r=new Map;for(;n.size>0;){let e=n.values().next().value;n.delete(e);let i=[e];for(let e=0;e<i.length;e+=1){let r=t[i[e]];for(let e of[...n]){let a=t[e];Math.hypot(a.x-r.x,a.y-r.y)>40||(n.delete(e),i.push(e))}}if(i.length<2)continue;i.sort((e,n)=>Kn(t[e].comment,t[n].comment));let a=i.reduce((e,n)=>({x:e.x+t[n].x/i.length,y:e.y+t[n].y/i.length}),{x:0,y:0}),o=Math.ceil(Math.sqrt(i.length)),s=Math.ceil(i.length/o),c=(o-1)*50/2,l=(s-1)*50/2,u=window.scrollX,d=window.scrollY;if(a.x>=u&&a.x<=u+window.innerWidth&&a.y>=d&&a.y<=d+window.innerHeight){let e=u+17+c,t=u+window.innerWidth-27-c,n=d+30+l,r=d+window.innerHeight-14-l;e<=t&&(a.x=Jn(a.x,e,t)),n<=r&&(a.y=Jn(a.y,n,r))}i.forEach((e,n)=>{let c=Math.floor(n/o),l=n%o,u=Math.min(o,i.length-c*o),d=t[e];r.set(d.comment.id,{x:Math.round(a.x+(l-(u-1)/2)*50-d.x),y:Math.round(a.y+(c-(s-1)/2)*50-d.y)})})}return r}#At(){let e=new Map(this.#a?.comments.map(e=>[e.id,e])??[]),t=this.#kt([...e.values()]),n=[...this.#e.querySelectorAll(`.pin[data-comment-id]`)],r=new Set(n.map(({dataset:e})=>e.commentId??``));if([...e.values()].some(e=>{if(!this.#Pe(e)||r.has(e.id))return!1;let t=q(e);return t.available&&t.pageX!==null&&t.pageY!==null})){this.#Ot();return}n.forEach(n=>{let r=e.get(n.dataset.commentId??``);if(!r)return;if(!this.#Pe(r)){n.style.display=`none`;return}let i=q(r);if(!i.available||i.pageX===null||i.pageY===null){n.style.display=`none`;return}let a=t.get(r.id)??{x:0,y:0};n.dataset.collided=String(t.has(r.id)),n.style.display=`grid`,n.style.left=`${i.pageX+a.x-window.scrollX}px`,n.style.top=`${i.pageY+a.y-window.scrollY}px`})}#jt(){let e=this.#e.querySelector(`[data-slot="panels"]`);if(!e)return;let t=this.#e.activeElement,n=t instanceof HTMLTextAreaElement&&t.closest(`.rg-thread-label`)!==null,r=t instanceof HTMLTextAreaElement&&t.closest(`.rg-selection-label:not(.rg-thread-label)`)!==null,i=n||r?{start:t.selectionStart,end:t.selectionEnd,direction:t.selectionDirection}:null,a=e.querySelector(`.rg-thread-messages`)?.scrollTop??0;if(e.replaceChildren(),this.#d){this.#Dt(this.#d),e.append(this.#Mt(this.#d)),r&&i&&queueMicrotask(()=>{let t=e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);t?.focus({preventScroll:!0}),t?.setSelectionRange(i.start,i.end,i.direction)});return}let o=this.#a?.comments.find(({id:e})=>e===this.#_);if(o){if(this.#Dt(o.target),this.#b&&this.#De()===`sheet`)return;e.append(this.#Ft(o)),queueMicrotask(()=>{let t=e.querySelector(`.rg-thread-messages`);if(t&&(t.scrollTop=a),!n||!i)return;let r=e.querySelector(`.rg-thread-label textarea`);r?.focus({preventScroll:!0}),r?.setSelectionRange(i.start,i.end,i.direction)});return}this.#s||this.#Tt()}#Mt(e){let t=We(`피드백`,`변경할 점`,`변경할 점 입력`);Ke(t,Jt(e));let n=t.querySelector(`textarea`),r=t.querySelector(`.rg-submit`);n.value=this.#f;let i=this.#h?.target===e&&this.#h.body===n.value.trim();n.disabled=i,r.disabled=i||!this.#ve();let a=()=>{n.style.height=`auto`,n.style.height=`${Math.min(n.scrollHeight,95)}px`};return n.addEventListener(`input`,()=>{this.#f=n.value,r.disabled=!this.#ve()||!n.value.trim(),this.#m?.body!==n.value.trim()&&(this.#m=null,this.#p=``,t.querySelector(`.rg-inline-error`)?.remove()),a()}),n.addEventListener(`keydown`,t=>{if(t.key===`Escape`){if(t.preventDefault(),this.#h?.target===e){this.#He(`피드백을 저장하는 중입니다.`);return}this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#jt(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}))}t.key===`Enter`&&(t.metaKey||t.ctrlKey)&&!t.shiftKey&&!t.altKey&&!t.isComposing&&(t.preventDefault(),r.click())}),r.addEventListener(`click`,()=>void this.#Nt(t,e)),this.#p&&jn(t,this.#p),t}async#Nt(e,t){if(!this.#t||this.#h||!this.#ve())return;let n=this.#t,r=n.pageId,i=n.repository,a=this.#M?.signal;if(!a)return;let o=e.querySelector(`textarea`),s=e.querySelector(`.rg-submit`),c=o?.value.trim()??``;if(!c||!o||!s)return;s.disabled=!0,o.disabled=!0;let l={target:t,body:c,comment:null};this.#h=l;let u=i.attachScreenshot?un(t):Promise.resolve(null),d=this.#m?.target===t&&this.#m.body===c?this.#m.comment:null;if(!d){let e=t;if(n.sourceContextResolver)try{e=await ve(t,n.sourceContextResolver,{signal:a})}catch{}if(a.aborted||this.#h!==l)return;let i=n.now?.()??Date.now();d={id:n.id?.()??crypto.randomUUID(),pageId:r,authorId:n.session.reviewerId,authorName:n.session.displayName,body:c,anchor:e.anchor,target:e,status:`open`,createdAt:i,updatedAt:i}}l.comment=d;let f=!1;try{await i.mutate(r,{type:`comment.upsert`,comment:d}),f=await this.#Pt(d.id,a)}catch{if(a.aborted||this.#h!==l)return;this.#h=null,this.#m={target:t,body:c,comment:d},this.#p=`저장하지 못했습니다. 다시 시도하세요.`,!this.#b&&this.#d===t&&(this.#jt(),queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`)?.focus({preventScroll:!0})));return}if(a.aborted||!f)return;this.#h===l&&(this.#h=null),this.#m=null,this.#p=``,this.#g?.target===t&&(this.#g=null),this.#d===t&&(this.#d=null,this.#f=``,this.#jt(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0})));let p=await u;if(p&&i.attachScreenshot)try{await i.attachScreenshot(r,d.id,p),this.#He(`피드백과 위치 캡처를 저장했습니다.`);return}catch{this.#He(`피드백은 저장했지만 위치 캡처는 저장하지 못했습니다.`);return}this.#He(`피드백을 저장했습니다.`)}async#Pt(e,t){return this.#a?.comments.some(({id:t})=>t===e)?!0:await new Promise((n,r)=>{let i=()=>{clearTimeout(o),t.removeEventListener(`abort`,a),this.#re.delete(e)},a=()=>{i(),n(!1)},o=setTimeout(()=>{i(),r(Error(`Comment was not confirmed by the review service`))},Sn);this.#re.set(e,e=>{i(),n(e)}),t.addEventListener(`abort`,a,{once:!0})})}#Ft(e){let t=this.#a?bt(this.#a).pinNumberByCommentId.get(e.id)??1:1,n=!q(e).available,r=We(`피드백 #${t}${e.status===`resolved`?` · 완료`:``}${n?` · 위치 없음`:``}`,`답글`,`답글 입력`);r.classList.add(`rg-thread-label`),r.id=Xt(e.id),r.tabIndex=-1,r.dataset.commentId=e.id,r.setAttribute(`aria-label`,`피드백 대화`),Ke(r,Yt(e));let i=r.querySelector(`.rg-tag-row`),a=document.createElement(`button`);a.type=`button`,a.className=`rg-thread-close`,a.setAttribute(`aria-label`,`피드백 닫기`),a.append(Ge()),i.append(a);let o=Z(`rg-thread-messages`);o.append(An(e.authorName,e.body,e.createdAt)),(this.#a?.replies.filter(({commentId:t})=>t===e.id)??[]).forEach(e=>o.append(An(e.authorName,e.body,e.createdAt))),r.querySelector(`.rg-surface`)?.insertBefore(o,r.querySelector(`.rg-bottom-section`));let s=r.querySelector(`textarea`),c=r.querySelector(`.rg-submit`);s.value=this.#Z.get(e.id)??``;let l=this.#Q.has(e.id);s.disabled=l,c.disabled=l,c.setAttribute(`aria-label`,`답글 저장`);let u=()=>{s.style.height=`auto`,s.style.height=`${Math.min(s.scrollHeight,95)}px`};s.addEventListener(`input`,()=>{this.#Z.set(e.id,s.value),this.#ee.get(e.id)?.body!==s.value.trim()&&(this.#ee.delete(e.id),this.#$.delete(e.id),r.querySelector(`.rg-inline-error`)?.remove()),u()}),s.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!e.shiftKey&&!e.altKey&&!e.isComposing&&(e.preventDefault(),c.click())}),a.addEventListener(`click`,()=>this.#xt(!0)),c.addEventListener(`click`,()=>void this.#It(r,e));let d=this.#$.get(e.id);return d&&jn(r,d),queueMicrotask(u),r}async#It(e,t){if(!this.#t||!this.#ve())return;let n=this.#M?.signal;if(!n||this.#Q.has(t.id))return;let r=e.querySelector(`textarea`),i=e.querySelector(`.rg-submit`),a=r?.value.trim()??``;if(!a||!r||!i)return;let o=this.#ee.get(t.id),s=this.#t.now?.()??Date.now(),c=o?.body===a?o.reply:{id:this.#t.id?.()??crypto.randomUUID(),commentId:t.id,authorId:this.#t.session.reviewerId,authorName:this.#t.session.displayName,body:a,createdAt:s,updatedAt:s},l=Symbol(t.id);this.#Q.set(t.id,{request:l,body:a,reply:c}),this.#Rt(t.id,!0);try{await this.#t.repository.mutate(this.#t.pageId,{type:`reply.upsert`,reply:c}),await this.#Lt(c,n)}catch{if(n.aborted||this.#Q.get(t.id)?.request!==l)return;this.#Q.delete(t.id),this.#ee.set(t.id,{body:a,reply:c}),this.#$.set(t.id,`답글을 저장하지 못했습니다. 다시 시도하세요.`),i.disabled=!1,r.disabled=!1,this.#_===t.id&&(this.#b&&this.#De()===`sheet`?this.#we():this.#jt(),queueMicrotask(()=>this.#zt(t.id)?.querySelector(`textarea`)?.focus({preventScroll:!0})));return}if(n.aborted||this.#Q.get(t.id)?.request!==l)return;this.#Q.delete(t.id),this.#ee.delete(t.id),this.#$.delete(t.id),this.#Z.delete(t.id);let u=this.#zt(t.id)?.querySelector(`textarea`);u&&(u.value=``,u.style.height=`auto`),this.#Rt(t.id,!1),this.#He(`답글을 저장했습니다.`)}async#Lt(e,t){this.#a?.replies.some(({id:t,commentId:n})=>t===e.id&&n===e.commentId)||await new Promise((n,r)=>{let i=()=>{clearTimeout(o),t.removeEventListener(`abort`,a),this.#ie.delete(e.id)},a=()=>{i(),n()},o=setTimeout(()=>{i(),r(Error(`Reply was not confirmed by the review service`))},Sn);this.#ie.set(e.id,{commentId:e.commentId,settle:()=>{i(),n()}}),t.addEventListener(`abort`,a,{once:!0})})}#Rt(e,t){let n=this.#zt(e),r=n?.querySelector(`textarea`),i=n?.querySelector(`.rg-submit`);r&&(r.disabled=t),i&&(i.disabled=t)}#zt(e){return[...this.#e.querySelectorAll(`.rg-thread-label`)].find(({dataset:t})=>t.commentId===e)}#Bt(e){return e.composedPath().includes(this)}};function Dn(e){re(e.styleNonce),customElements.get(`agency-review-widget`)||customElements.define(xn,En);let t=document.createElement(xn);return t.configure(e),document.body.append(t),t}function On(e,t){let n=e.hostname.toLowerCase();return t.some(e=>e.toLowerCase()===n)||n===`localhost`||n===`127.0.0.1`||n.endsWith(`.test`)||n.endsWith(`.local`)}function Z(e){let t=document.createElement(`div`);return t.className=e,t}function Q(e,t){e.style.display=`block`,e.style.left=`${t.left}px`,e.style.top=`${t.top}px`,e.style.width=`${t.width}px`,e.style.height=`${t.height}px`}function kn(e,t){return Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)}function An(e,t,n){let r=document.createElement(`article`);r.className=`rg-message`;let i=Z(`rg-message-meta`);i.textContent=`${e} · ${new Date(n).toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}`;let a=document.createElement(`p`);return a.className=`rg-message-body`,a.textContent=t,r.append(i,a),r}function jn(e,t){let n=e.querySelector(`.rg-inline-error`);if(!n){n=Z(`rg-inline-error`),n.setAttribute(`role`,`alert`);let t=e.querySelector(`.rg-surface`);t?.insertBefore(n,t.querySelector(`.rg-bottom-section`))}n.textContent=t}function Mn(e){return zn(e).designMode===`on`||e.composedPath().some(e=>{let t=Bn(e);return t?Nn(t):!1})}function Nn(e){let t=e.tagName.toLowerCase();return t===`input`||t===`textarea`||t===`select`||`isContentEditable`in e&&!!e.isContentEditable||Tn.has(e.getAttribute(`role`)??``)}function Pn(e){let t=e.composedPath().map(Bn).find(Boolean)??null;return!t||t===t.ownerDocument.documentElement||t===t.ownerDocument.body||p(t)?null:t}function Fn(e){let t=e.activeElement,n=new Set;for(;t&&!n.has(t);){n.add(t);let e=t.shadowRoot?.activeElement;if(e){t=e;continue}if(t.tagName.toLowerCase()===`iframe`)try{let e=t.contentDocument?.activeElement;if(e){t=e;continue}}catch{}break}return t}function In(e,t){let n=e,r=new Set;for(;n&&!r.has(n);){r.add(n),t.add(n);let e=n.getRootNode();if(d(e)){n=e.host;continue}if(f(e)&&e!==document){try{n=e.defaultView?.frameElement??null}catch{n=null}continue}n=null}}function Ln(e){let t=zn(e).defaultView?.getSelection();return!!(t&&!t.isCollapsed&&t.toString().length>0)}function Rn(e){let t=e.clientX,n=e.clientY,r=zn(e);for(;r!==document;){let e=null;try{e=r.defaultView?.frameElement??null}catch{break}if(!e)break;let i=e.getBoundingClientRect(),a=e,o=u(a);t=i.left+(a.clientLeft+t)*o.x,n=i.top+(a.clientTop+n)*o.y,r=e.ownerDocument}return{clientX:t,clientY:n}}function zn(e){for(let t of e.composedPath()){if(Vn(t))return t;let e=Bn(t);if(e)return e.ownerDocument}return document}function Bn(e){return e&&`nodeType`in e&&e.nodeType===1?e:null}function Vn(e){return`nodeType`in e&&e.nodeType===9}function Hn(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.clearSnapshot===!0?t.type===`access-lost`?t.recovery===`reauthenticate`&&[`permission-denied`,`session-expired`,`membership-revoked`].includes(t.code??``):t.type===`error`&&t.recovery===`retry`&&[`transport`,`data-integrity`,`unknown`].includes(t.code??``):!1}function Un(e){return e===`membership-revoked`?`리뷰 권한이 취소되었습니다. 작성 중인 내용은 저장되지 않았습니다.`:e===`session-expired`?`세션이 만료되었습니다. 다시 인증하세요.`:`이 리뷰에 접근할 수 없습니다. 다시 인증하세요.`}function Wn(e){return e===`all`||e===`open`||e===`resolved`}function Gn(e){return e===`current`||e===`all`}function Kn(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function qn(){let e=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);e.setAttribute(`viewBox`,`0 0 16 16`),e.setAttribute(`aria-hidden`,`true`);let t=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);return t.setAttribute(`d`,`M9.78 3.47a.75.75 0 0 1 0 1.06L6.31 8l3.47 3.47a.75.75 0 1 1-1.06 1.06l-4-4a.75.75 0 0 1 0-1.06l4-4a.75.75 0 0 1 1.06 0Z`),e.append(t),e}function Jn(e,t,n){return Math.min(n,Math.max(t,e))}function Yn(e){return bn.includes(e)?e:`bottom-right`}function Xn(e){return e===`top-left`||e===`left`||e===`bottom-left`?`bottom-left`:`bottom-right`}function Zn(e){return e===`top-left`||e===`top`||e===`top-right`?`top`:e===`bottom-left`||e===`bottom`||e===`bottom-right`?`bottom`:e}function Qn(e){return Number.isFinite(e)?e:0}function $n(e){return e.replace(/\/+$/,``)||`/`}function er(e){let t=`${$n(e.pathname)}${e.search}${e.hash}`,n=`${e.host}${t}`;try{return decodeURI(n)}catch{return n}}function tr(e){try{return new URL(e.target.pageUrl,window.location.href)}catch{return null}}function $(...e){e.forEach(e=>{try{e?.()}catch{}})}function nr(e,t){let n=Math.max(0,Math.floor((t-e)/1e3));if(n<60)return`방금`;let r=Math.floor(n/60);if(r<60)return`${r}분 전`;let i=Math.floor(r/60);if(i<24)return`${i}시간 전`;let a=Math.floor(i/24);return a<7?`${a}일 전`:new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`})}function rr(){return new Promise(e=>{if(typeof window.requestAnimationFrame==`function`){window.requestAnimationFrame(()=>e());return}queueMicrotask(e)})}function ir(e,t){return{value:e.style.getPropertyValue(t),priority:e.style.getPropertyPriority(t)}}function ar(e,t,n){n.value?e.style.setProperty(t,n.value,n.priority):e.style.removeProperty(t)}function or(){for(let e of[document.body,document.documentElement]){let t=getComputedStyle(e).backgroundColor.match(/[\d.]+/g)?.map(Number);if(!t||t.length<3)continue;let[n=0,r=0,i=0,a=1]=t;if(!(a<.5))return(n*.2126+r*.7152+i*.0722)/255<.45?`light`:`dark`}return window.matchMedia?.(`(prefers-color-scheme: dark)`).matches??!1?`light`:`dark`}function sr(e){let t,n=!1,r=(r,i)=>{if(n||t?.invitationId!==r)return;let a=t;if(t=void 0,i)try{e.storage?.setItem(a.exitKey,r)}catch{}try{a.clearLocalSession?.()}catch{}e.onExit(r)},i=()=>{let n=t;if(n)try{e.storage?.getItem(n.exitKey)===n.invitationId&&r(n.invitationId,!1)}catch{}},a=e=>{let n=t;n&&e.key===n.exitKey&&e.newValue===n.invitationId&&r(n.invitationId,!1)},o=()=>{e.document.visibilityState===`visible`&&i()},s=n=>{if(!t?.widget||n.target!==t.widget)return;let r=n instanceof CustomEvent&&n.detail&&typeof n.detail==`object`&&`code`in n.detail?n.detail.code:void 0;e.onReauthenticationRequired(r)};return e.window.addEventListener(`storage`,a),e.window.addEventListener(`pageshow`,i),e.window.addEventListener(`visual-review:reauthenticate-required`,s),e.document.addEventListener(`visibilitychange`,o),{bindSession(e,n,a){return t={invitationId:e,exitKey:n,clearLocalSession:a},i(),()=>r(e,!0)},attachWidget(e){t&&(t.widget=e)},suspendSession(){t=void 0},dispose(){n||(n=!0,t=void 0,e.window.removeEventListener(`storage`,a),e.window.removeEventListener(`pageshow`,i),e.window.removeEventListener(`visual-review:reauthenticate-required`,s),e.document.removeEventListener(`visibilitychange`,o))}}}function cr(e,t){return async n=>{let r=new URL(n,e.location.href);if(r.origin!==e.location.origin)throw Error(`Visual Review route navigation must stay on the staging origin`);if(t){await t(r.href);return}e.location.assign(r.href)}}export{sr as createActiveReviewSessionLifecycle,cr as createReviewNavigationHandler,Dn as mountReviewWidget};
1505
+ `;let n=Z(`highlight`);n.dataset.slot=`highlight`;let r=Z(`region`);r.dataset.slot=`region`;let i=Z(`pins`);i.dataset.slot=`pins`;let a=Z(`panels`);a.dataset.slot=`panels`;let o=Z(`navigator-slot`);o.dataset.slot=`navigator`,o.id=wn,o.addEventListener(`click`,this.#Le),o.addEventListener(`keydown`,this.#Re);let s=Z(`rg-visually-hidden`);s.dataset.slot=`announcer`,s.setAttribute(`aria-live`,`polite`),s.setAttribute(`aria-atomic`,`true`);let c=Ue({developerGrab:this.#t?.developerTools?.codeContextCopy===!0}),l=Xn(this.#t?.position);c.dataset.position=l,c.dataset.mobilePosition=Zn(l),c.style.setProperty(`--rg-toolbar-offset-x`,`${$n(this.#t?.offset?.x)}px`),c.style.setProperty(`--rg-toolbar-offset-y`,`${$n(this.#t?.offset?.y)}px`),c.querySelector(`.rg-toolbar-actions`)?.append(At(0,{controlsId:wn,presentation:this.#De()})),c.querySelector(`.rg-feedback-tool`)?.addEventListener(`click`,()=>{if(!this.#ve()){this.#b||this.#xe(!0),this.#He(this.#ye());return}if(this.#b&&this.#xe(!1,{restoreFocus:!1,restoreComposer:!0}))return;if(this.#h){this.#He(`피드백을 저장하는 중입니다.`);return}if(this.#s&&this.#c===`react-grab`&&this.#g){this.#ge(!1);return}let e=this.#s&&this.#c===`feedback`;this.#ge(!e,`feedback`)}),c.querySelector(`.rg-developer-grab-tool`)?.addEventListener(`click`,()=>{if(this.#B){this.#He(`코드 컨텍스트를 복사하는 중입니다.`);return}if(this.#h){this.#He(`피드백을 저장하는 중입니다.`);return}this.#b&&this.#xe(!1,{restoreFocus:!1});let e=this.#s&&this.#c===`react-grab`;e||this.#Se(),this.#ge(!e,`react-grab`)}),c.querySelector(`.rg-feedback-list-tool`)?.addEventListener(`click`,()=>{this.#xe(!this.#b)}),c.querySelector(`.rg-collapse`)?.addEventListener(`click`,()=>{let e=c.dataset.collapsed===`true`;!e&&this.#s&&this.#ge(!1),!e&&this.#b&&this.#xe(!1,{restoreFocus:!1}),lt(c,!e)}),this.#e.append(t,n,r,i,a,o,s,c),this.#t&&this.#M&&ut({toolbar:c,position:l,offset:{x:$n(this.#t.offset?.x),y:$n(this.#t.offset?.y)},storageKey:nt(this.#t.session.projectId,this.#t.session.reviewerId),signal:this.#M.signal,onDragStart:()=>{this.#s&&this.#ge(!1),this.#b&&this.#xe(!1,{restoreFocus:!1})}})}#pe(){let e=this.#t?.collaboration,t=e?.repository;if(!this.#t||!t||!e.cursors&&!e.chat)return;let n=e.roomId??e.scopeId;this.#i=Ie({root:this.#e,pageId:this.#t.pageId,pathname:er(window.location.pathname),roomId:n,session:this.#t.session,repository:t,cursors:e.cursors,chat:e.chat,canOpenChat:()=>this.#me(),onFailure:e=>{e.type===`access-lost`?(this.#i?.stop(),this.#i=null,this.#se(e)):this.#He(`실시간 협업 연결이 불안정합니다. 다시 연결하는 중입니다.`)}}),this.#i.start()}#me(){return this.#h||this.#B?!1:(this.#s&&this.#ge(!1),this.#b&&this.#xe(!1,{restoreFocus:!1,restoreComposer:!1}),this.#d&&(this.#Se(),this.#jt()),this.#_&&this.#xt(!1,!1),!this.#s&&!this.#b&&!this.#d&&!this.#_)}#he(){this.#Ot(),this.#jt(),this.#we(),this.#Ee(),this.#_e(),this.#vt(),this.#bt()}#ge(e,t=`feedback`){let n=this.#c;if(e&&(this.#A+=1),e&&t===`feedback`&&!this.#ve()){this.#b||this.#xe(!0),this.#He(this.#ye());return}if(e&&t===`feedback`&&this.#h){this.#He(`피드백을 저장하는 중입니다.`);return}if(e&&t===`feedback`&&this.#g){this.#_?this.#xt(!1):this.#Ce(),this.#He(`작성 중인 피드백을 복원했습니다.`);return}if(e&&this.#s){this.#c=t,this.#l=null,this.#u=null,this.#Tt(),this.#_e();return}this.#s=e,this.#c=e?t:null,this.#_e(),e?(this.#_=null,this.#v=null,this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#Tt(),document.addEventListener(`pointermove`,this.#Ge,!0),document.addEventListener(`pointerdown`,this.#Ke,!0),document.addEventListener(`pointerup`,this.#qe,!0),document.addEventListener(`pointercancel`,this.#Je,!0),document.addEventListener(`keydown`,this.#Ye,!0),this.#F={value:document.body.style.getPropertyValue(`cursor`),priority:document.body.style.getPropertyPriority(`cursor`)},document.body.style.setProperty(`cursor`,`crosshair`),this.#N=oe(this.#t?.styleNonce),queueMicrotask(()=>this.#nt())):(document.removeEventListener(`pointermove`,this.#Ge,!0),document.removeEventListener(`pointerdown`,this.#Ke,!0),document.removeEventListener(`pointerup`,this.#qe,!0),document.removeEventListener(`pointercancel`,this.#Je,!0),document.removeEventListener(`keydown`,this.#Ye,!0),this.#F&&=(or(document.body,`cursor`,this.#F),null),this.#N?.(),this.#N=null,this.#l=null,this.#u=null,this.#Tt()),this.#jt(),!e&&n===`react-grab`&&this.#Ce()}#_e(){let e=this.#e.querySelector(`.rg-toolbar`),t=this.#e.querySelector(`[data-slot="pins"]`),n=this.#e.querySelector(`.rg-feedback-tool`),r=this.#e.querySelector(`.rg-developer-grab-tool`),i=this.#s&&this.#c===`feedback`,a=this.#s&&this.#c===`react-grab`;e&&(e.dataset.selecting=String(this.#s)),t&&(t.dataset.selectionSuppressed=String(this.#s),t.toggleAttribute(`inert`,this.#s),t.setAttribute(`aria-hidden`,String(this.#s))),n&&(n.setAttribute(`aria-pressed`,String(i)),n.setAttribute(`aria-label`,i?`선택 취소`:`피드백 위치 선택`),n.setAttribute(`aria-disabled`,String(!this.#ve()))),r&&(r.setAttribute(`aria-pressed`,String(a)),r.setAttribute(`aria-label`,a?`코드 선택 취소`:`React Grab 코드 선택`),r.setAttribute(`aria-disabled`,String(this.#B)))}#ve(){return!this.#O&&this.#T===`ready`&&this.#a!==null}#ye(){return this.#O?`다시 인증하세요.`:this.#T===`loading`?`불러오는 중입니다.`:`다시 시도하세요.`}#be(){return this.#f.trim().length>0||!!this.#g?.body.trim().length||[...this.#Z.values()].some(e=>e.trim().length>0)||this.#m!==null||this.#ee.size>0}#xe(e,t={}){let n=t.restoreFocus??!0,r=t.restoreComposer??!0;if(e===this.#b)return!1;if(e)return this.#A+=1,this.#s&&this.#ge(!1),this.#Se(),this.#w=`idle`,this.#b=!0,this.#jt(),this.#we(),this.#Ee(),queueMicrotask(()=>this.#Ae()),!1;(t.cancelNavigation??!0)&&(this.#A+=1),this.#b=!1,this.#w=`idle`,this.#P?.(),this.#P=null,this.#jt(),this.#we(),this.#Ee(),queueMicrotask(()=>this.#St());let i=r&&this.#Ce();return n&&!i&&queueMicrotask(()=>this.#je()?.focus()),i}#Se(){if(!this.#d)return!1;let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);return this.#g={target:this.#d,body:e?.value??this.#f},this.#d=null,this.#f=``,!0}#Ce(){if(!this.#g||this.#b||this.#_)return!1;let e=this.#g;return this.#g=null,this.#d=e.target,this.#f=e.body,this.#jt(),queueMicrotask(()=>{let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);e?.focus(),e?.setSelectionRange(e.value.length,e.value.length)}),!0}#we(){let e=this.#e.querySelector(`[data-slot="navigator"]`);if(!e)return;this.#w===`saving`&&!this.#h&&this.#Q.size===0&&(this.#w=this.#be()?`draft-warning`:`confirm`);let t=e.querySelector(`.rg-feedback-navigator`),n=t?.querySelector(`.rg-feedback-navigator-content`),r=t?.dataset.presentation,i=t?`refresh`:`enter`,a=t?.dataset.presentation===`sheet`&&t.dataset.detailOpen===`true`,o=this.#b&&!!this.#_&&this.#De()===`sheet`,s=n&&!a&&!o?n.scrollTop:this.#x;this.#x=s;let c=this.#e.activeElement instanceof HTMLElement?this.#e.activeElement:null,l=c?.closest(`.rg-feedback-row[data-comment-id]`)?.dataset.commentId,u=c?.closest(`[data-feedback-filter]`)?.dataset.feedbackFilter,d=c?.closest(`[data-feedback-scope]`)?.dataset.feedbackScope,f=!!c?.closest(`.rg-feedback-navigator-close`),p=!!c?.closest(`.rg-feedback-navigator-retry`),m=c instanceof HTMLTextAreaElement&&c.closest(`.rg-feedback-navigator-detail`)!==null?c:null,h=m?{start:m.selectionStart,end:m.selectionEnd,direction:m.selectionDirection}:null,g=t?.querySelector(`.rg-feedback-navigator-detail .rg-thread-messages`)?.scrollTop??0;if(e.replaceChildren(),!this.#b){this.#x=0;return}let _=this.#De(),v=Z(`rg-feedback-navigator-scrim`);v.dataset.motion=i,v.dataset.feedbackNavigatorAction=`close`,v.setAttribute(`aria-hidden`,`true`);let y=jt(this.#Te(),{id:Tn,presentation:_,exitReviewState:this.#t?.onExitReview?this.#w:void 0});y.dataset.motion=i;let b=_===`sheet`&&this.#_?this.#a?.comments.find(({id:e})=>e===this.#_):null;if(y.dataset.detailOpen=String(!!this.#_),b){y.removeAttribute(`aria-labelledby`),y.setAttribute(`aria-label`,`피드백 상세`),[...y.children].forEach(e=>{e instanceof HTMLElement&&(e.inert=!0)});let e=Z(`rg-feedback-navigator-detail`),t=this.#Ft(b);t.classList.add(`rg-feedback-navigator-thread`);let n=t.querySelector(`.rg-thread-close`);n&&(n.classList.add(`rg-feedback-navigator-back`),n.setAttribute(`aria-label`,`피드백 목록으로 돌아가기`),n.replaceChildren(Jn()),n.closest(`.rg-tag-row`)?.prepend(n)),e.append(t),y.append(e)}e.append(v,y),this.#ke(_),queueMicrotask(()=>this.#Oe()),queueMicrotask(()=>{if(!this.#b)return;let t=e.querySelector(`.rg-feedback-navigator-content`);if(t&&(t.scrollTop=s),b){let e=y.querySelector(`.rg-feedback-navigator-detail .rg-thread-messages`);if(e&&(e.scrollTop=g),m&&h){let e=y.querySelector(`.rg-feedback-navigator-detail textarea`);e?.focus({preventScroll:!0}),e?.setSelectionRange(h.start,h.end,h.direction);return}}if(l){let e=this.#Me(l);e?e.focus({preventScroll:!0}):this.#Ae()}else if(u&&Gn(u))e.querySelector(`[data-feedback-filter="${u}"]`)?.focus({preventScroll:!0});else if(d&&Kn(d))e.querySelector(`[data-feedback-scope="${d}"]`)?.focus({preventScroll:!0});else if(f)e.querySelector(`.rg-feedback-navigator-close`)?.focus({preventScroll:!0});else if(p){let t=e.querySelector(`.rg-feedback-navigator-retry`);t?t.focus({preventScroll:!0}):this.#Ae()}else _===`sheet`&&r!==`sheet`&&this.#Ae()})}#Te(){let e=this.#Ne(),t=e.comments.filter(e=>this.#Pe(e)),n=this.#S===`current`?t:e.comments,r=new Set(n.map(({id:e})=>e)),i=xt({pageId:e.pageId,comments:n,replies:e.replies.filter(({commentId:e})=>r.has(e))},this.#C),a=this.#t?.now?.()??Date.now(),o=this.#j&&this.#T===`ready`?`reconnecting`:this.#T;return{scope:this.#S,scopeCounts:{current:t.length,all:e.comments.length},filter:this.#C,counts:i.counts,rows:i.rows.map(({comment:e,pinNumber:t,replyCount:n,lastActivityAt:r})=>({id:e.id,pageId:e.pageId,pinNumber:t,pageLabel:this.#Ie(e),pageUrl:nr(e)?.href,currentPage:this.#Pe(e),targetLabel:this.#Fe(e),authorName:e.authorName,body:e.body,timeLabel:rr(r,a),replyCount:n,status:e.status,locationAvailable:!this.#Pe(e)||K(e).available})),activeCommentId:this.#_,loadState:o,errorMessage:this.#E,errorRecovery:this.#D}}#Ee(){let e=this.#je();if(!e)return;let t=this.#Ne().comments.length;e.setAttribute(`aria-label`,`피드백 목록, 총 ${t}개`);let n=e.querySelector(`[data-feedback-count]`);n&&(n.textContent=String(t),n.hidden=t===0);let r=e.closest(`.rg-action-wrap`)?.querySelector(`.rg-tooltip`);r&&(r.textContent=`피드백 ${t}개`),e.setAttribute(`aria-expanded`,String(this.#b)),e.setAttribute(`aria-controls`,wn),this.#De()===`sheet`?e.setAttribute(`aria-haspopup`,`dialog`):e.removeAttribute(`aria-haspopup`),e.removeAttribute(`aria-pressed`)}#De(){return window.matchMedia?.(`(max-width: 640px)`).matches||window.innerWidth<=640?`sheet`:`tray`}#Oe(){let e=this.#e.querySelector(`.rg-feedback-navigator`),t=this.#je(),n=this.#e.querySelector(`.rg-toolbar`);if(!e||!t||!n||e.dataset.presentation!==`tray`)return;let r=t.getBoundingClientRect(),i=n.getBoundingClientRect(),a=e.offsetWidth;if(r.width<=0||r.height<=0||a<=0)return;let o=Qn(Xn(n.dataset.position)),s=r.left+r.width/2,c=r.top+r.height/2;if(o===`top`||o===`bottom`){let t=Yn(s-a/2,8,Math.max(8,window.innerWidth-a-8));e.style.left=`${t}px`,e.style.right=`auto`,o===`top`?(e.style.top=`${Math.max(8,i.bottom+8)}px`,e.style.bottom=`auto`):(e.style.top=`auto`,e.style.bottom=`${Math.max(8,window.innerHeight-i.top+8)}px`);let n=`${Yn(s-t,16,a-16)}px`;e.style.setProperty(`--rg-navigator-origin`,o===`top`?`${n} -8px`:`${n} calc(100% + 8px)`)}else{let t=e.offsetHeight;if(t<=0)return;let n=Yn(c-t/2,8,Math.max(8,window.innerHeight-t-8)),r=o===`left`?Math.min(window.innerWidth-a-8,i.right+8):Math.max(8,i.left-a-8);e.style.top=`${n}px`,e.style.right=`auto`,e.style.bottom=`auto`,e.style.left=`${Math.max(8,r)}px`,e.style.setProperty(`--rg-navigator-origin`,o===`left`?`-8px 50%`:`calc(100% + 8px) 50%`)}}#ke(e){if(e!==`sheet`){this.#P?.(),this.#P=null;return}if(this.#P)return;let t=[...[...document.body.children].filter(e=>e!==this),...this.#e.querySelectorAll(`[data-slot="pins"], [data-slot="panels"], .rg-toolbar`)].filter(e=>e instanceof HTMLElement),n=t.map(e=>({element:e,inert:e.inert}));t.forEach(e=>{e.inert=!0});let r=this.#e.querySelector(`[data-slot="panels"]`),i=r?ar(r,`visibility`):null;r&&r.style.setProperty(`visibility`,`hidden`);let a=ar(document.body,`overflow`),o=ar(document.documentElement,`overflow`),s=e=>{let t=this.#e.querySelector(`.rg-feedback-navigator`);!t||e.composedPath().includes(t)||queueMicrotask(()=>this.#Ae())};document.addEventListener(`focusin`,s,!0),document.body.style.setProperty(`overflow`,`hidden`),document.documentElement.style.setProperty(`overflow`,`hidden`),this.#P=()=>{n.forEach(({element:e,inert:t})=>{e.inert=t}),r&&i&&or(r,`visibility`,i),document.removeEventListener(`focusin`,s,!0),or(document.body,`overflow`,a),or(document.documentElement,`overflow`,o)}}#Ae(){if(!this.#b)return;let e=this.#e.querySelector(`.rg-feedback-navigator-detail .rg-thread-label`);if(e){e.focus({preventScroll:!0});return}let t=this.#_?this.#Me(this.#_):null,n=this.#e.querySelector(`.rg-feedback-row`),r=this.#e.querySelector(`.rg-feedback-navigator-retry`),i=this.#e.querySelector(`.rg-feedback-navigator-close`);(t??n??r??i)?.focus({preventScroll:!0})}#je(){return this.#e.querySelector(`.rg-feedback-list-tool`)}#Me(e){return[...this.#e.querySelectorAll(`.rg-feedback-row[data-comment-id]`)].find(({dataset:t})=>t.commentId===e)}#Ne(){let e=this.#a??{pageId:this.#t?.pageId??``,comments:[],replies:[]},t=this.#o;if(!t)return e;let n=this.#t?.pageId??e.pageId,r=t.comments.filter(({pageId:e})=>e!==n),i=new Set(r.map(({id:e})=>e)),a=new Set(e.comments.map(({id:e})=>e));return{pageId:n,comments:[...r.filter(({id:e})=>!a.has(e)),...e.comments],replies:[...t.replies.filter(({commentId:e})=>i.has(e)),...e.replies]}}#Pe(e){return e.pageId===this.#t?.pageId}#Fe(e){return Jt(e.target)}#Ie(e){let t=nr(e);if(t)return tr(t);let n=this.#o?.pages?.find(({id:t})=>t===e.pageId);return n?.name.trim()?n.name.trim():e.target.pageTitle.trim()||`알 수 없는 페이지`}#Le=e=>{e.stopPropagation();let t=e.target instanceof Element?e.target.closest(`[data-feedback-navigator-action]`):null,n=t?.dataset.feedbackNavigatorAction;if(n){if(n===`close`||n===`toggle`){this.#xe(!1);return}if(n===`retry`){this.#ne();return}if(n===`exit-review`){this.#w=this.#h||this.#Q.size>0?`saving`:this.#be()?`draft-warning`:`confirm`,this.#we(),queueMicrotask(()=>{this.#e.querySelector(this.#w===`saving`?`.rg-feedback-navigator-close`:`.rg-feedback-navigator-exit-cancel`)?.focus({preventScroll:!0})});return}if(n===`cancel-exit-review`){this.#w=`idle`,this.#we(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-navigator-exit-link`)?.focus({preventScroll:!0}));return}if(n===`confirm-exit-review`){if(this.#h||this.#Q.size>0){this.#w=`saving`,this.#we();return}this.#t?.onExitReview?.();return}if(n===`filter`){let e=t.dataset.feedbackFilter;if(!Gn(e)||e===this.#C)return;this.#C=e,this.#we();return}if(n===`scope`){let e=t.dataset.feedbackScope;if(!Kn(e)||e===this.#S)return;this.#S=e,this.#C=`all`,this.#we();return}n===`open-comment`&&t.dataset.commentId&&this.#ze(t.dataset.commentId,{origin:`navigator`,navigate:!0})}};#Re=e=>{if(e.stopPropagation(),e.isComposing)return;let t=[...this.#e.querySelectorAll(`.rg-feedback-row`)],n=e.target instanceof Element?e.target.closest(`.rg-feedback-row`):null;if(n&&[`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key)){e.preventDefault();let r=t.indexOf(n);t[e.key===`Home`?0:e.key===`End`?t.length-1:e.key===`ArrowDown`?Math.min(t.length-1,r+1):Math.max(0,r-1)]?.focus();return}if(e.key!==`Tab`||this.#De()!==`sheet`)return;let r=this.#e.querySelector(`.rg-feedback-navigator`),i=r?[...r.querySelectorAll(`button:not(:disabled), [tabindex]:not([tabindex="-1"])`)].filter(e=>!e.closest(`[inert]`)):[];if(i.length===0)return;let a=i[0],o=i.at(-1);e.shiftKey&&this.#e.activeElement===a?(e.preventDefault(),o.focus()):!e.shiftKey&&this.#e.activeElement===o&&(e.preventDefault(),a.focus())};async#ze(e,t){let n=this.#Ne().comments.find(({id:t})=>t===e);if(!n)return;if(t.origin===`navigator`){let e=this.#e.querySelector(`.rg-feedback-navigator-content`);e&&(this.#x=e.scrollTop)}this.#s&&this.#ge(!1);let r=++this.#A,i=t.navigate&&!this.#Pe(n),a=i?nr(n):null,o=!!(a&&a.origin===window.location.origin);if(t.origin===`navigator`&&this.#b&&i&&o&&(this.#xe(!1,{restoreFocus:!1,restoreComposer:!1,cancelNavigation:!1}),await ir()),r!==this.#A||!this.#M)return;if(!this.#Ne().comments.some(({id:t})=>t===e)){this.#Be();return}let s=t.origin===`navigator`&&this.#b&&this.#De()===`sheet`;s&&(this.#P?.(),this.#P=null);let c=!0;try{t.navigate&&(c=await this.#Ve(n))}finally{s&&this.#b&&this.#ke(`sheet`)}if(c&&r===this.#A){if(!this.#Ne().comments.some(({id:t})=>t===e)){this.#Be();return}if(this.#d=null,this.#_=e,this.#v=t.origin,this.#he(),!K(n).available)this.#He(`현재 화면에서 피드백 위치를 찾을 수 없습니다.`);else if(t.announceOpened){let e=xt(this.#Ne()).pinNumberByCommentId.get(n.id)??1;this.#He(`피드백 #${e} 대화를 열었습니다.`)}queueMicrotask(()=>this.#e.querySelector(`.rg-thread-label`)?.focus({preventScroll:!0}))}}#Be(){if(this.#g&&this.#b&&this.#De()===`sheet`){this.#xe(!1,{restoreFocus:!1,cancelNavigation:!1});return}!this.#b&&this.#Ce()||queueMicrotask(()=>{this.#b?this.#Ae():this.#je()?.focus({preventScroll:!0})})}async#Ve(e){if(!this.#Pe(e)){let t=nr(e);if(!t||t.origin!==window.location.origin)return this.#He(`이 피드백의 페이지로 이동할 수 없습니다.`),!1;this.#He(`${er(t.pathname)} 페이지로 이동합니다.`),this.#y=e.id;try{this.#t?.onNavigateToFeedback?await this.#t.onNavigateToFeedback(t.href,e):window.location.assign(t.href)}catch{this.#y=null,this.#He(`피드백 페이지로 이동하지 못했습니다.`)}return!1}let t=K(e);if(!t.available||t.pageY===null)return!0;let n=window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`;if(e.target.kind!==`viewport`){let t=j(e.anchor).element;if(t&&typeof t.scrollIntoView==`function`)try{return t.scrollIntoView({block:`center`,inline:`center`,behavior:n}),await ir(),await ir(),!0}catch{}}let r=window.visualViewport?.height??window.innerHeight,i=window.visualViewport?.width??window.innerWidth,a=Math.max(0,t.pageY-r/3),o=Math.max(0,(t.pageX??window.scrollX)-i/2);try{window.scrollTo({left:o,top:a,behavior:n})}catch{}return await ir(),await ir(),!0}#He(e){let t=this.#e.querySelector(`[data-slot="announcer"]`);t&&(t.textContent=``,queueMicrotask(()=>{t.textContent=e}))}#Ue(e,t=`neutral`){let n=this.#e.querySelector(`.rg-developer-status`);n&&(this.#We(),n.textContent=e,n.dataset.tone=t,n.dataset.visible=`true`,this.#L=window.setTimeout(()=>{this.#L=null,n.isConnected&&(n.dataset.visible=`false`)},1800))}#We(){this.#L!==null&&(window.clearTimeout(this.#L),this.#L=null)}#Ge=e=>{if(!this.#s||this.#Bt(e)||this.#l&&e.pointerId!==this.#u)return;let t=zn(e);if(this.#l&&An(this.#l,t)>=6){this.#wt(this.#l,t);return}this.#Ct(t)};#Ke=e=>{!this.#s||this.#Bt(e)||e.button!==0||this.#l||(e.preventDefault(),e.stopImmediatePropagation(),this.#l=zn(e),this.#u=e.pointerId)};#qe=e=>{if(!this.#s||!this.#l||e.pointerId!==this.#u)return;if(this.#Bt(e)){this.#l=null,this.#u=null,this.#Tt();return}e.preventDefault(),e.stopImmediatePropagation();let t=this.#l,n=this.#c,r=zn(e),i=An(t,r)>=6;n===`feedback`&&(this.#d=i?me(t,r):pe(r));let a=n===`react-grab`?this.#Xe(t,r,i):[];this.#lt(),this.#ge(!1),n===`react-grab`?this.#Ze(a):queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label textarea`)?.focus())};#Je=e=>{!this.#s||!this.#l||e.pointerId!==this.#u||(e.preventDefault(),e.stopImmediatePropagation(),this.#l=null,this.#u=null,this.#Tt())};#Ye=e=>{if(!this.#s)return;if(e.key===`Escape`){e.preventDefault(),e.stopImmediatePropagation(),this.#ge(!1);return}if(e.key!==`Enter`||e.isComposing||this.#Bt(e)||Nn(e))return;let t=Fn(e);if(!t)return;let n=I(t);if(n.width<=0||n.height<=0)return;e.preventDefault(),e.stopImmediatePropagation();let r=this.#c;r===`feedback`&&(this.#d=fe(t,{clientX:n.left+n.width/2,clientY:n.top+n.height/2})),this.#ge(!1),r===`react-grab`?this.#Ze([t]):queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label textarea`)?.focus())};#Xe(e,t,n){if(!n){let e=ae(t.clientX,t.clientY);return e?[e]:[]}return he(new DOMRect(Math.min(e.clientX,t.clientX),Math.min(e.clientY,t.clientY),Math.abs(t.clientX-e.clientX),Math.abs(t.clientY-e.clientY))).slice(0,8)}async#Ze(e){if(e.length===0){this.#He(`선택할 요소를 찾지 못했습니다.`),this.#Ue(`선택할 요소가 없습니다`,`error`),this.#et();return}if(!this.#M||this.#B)return;let t=this.#M.signal;this.#B=!0,this.#_e(),this.#He(`코드 컨텍스트를 복사하는 중입니다.`),this.#Ue(`코드 컨텍스트 복사 중…`);try{let n=this.#Qe(),r=await n;if(t.aborted||n!==this.#V)return;let i=await r.copyElement(e.length===1?e[0]:e);if(t.aborted)return;this.#He(i?`코드 컨텍스트를 복사했습니다.`:`코드 컨텍스트를 복사하지 못했습니다. 다시 시도하세요.`),this.#Ue(i?`코드 컨텍스트 복사됨`:`복사 실패 · 다시 시도`,i?`neutral`:`error`)}catch{t.aborted||(this.#He(`코드 컨텍스트를 복사하지 못했습니다. 다시 시도하세요.`),this.#Ue(`복사 실패 · 다시 시도`,`error`))}finally{t.aborted||(this.#B=!1,this.#_e(),this.#et())}}#Qe(){if(this.#V)return this.#V;let e=(this.#t?.developerTools?.loadReactGrab??(()=>vt(this.#t?.styleNonce)))();return this.#V=e,e.catch(()=>{this.#V===e&&(this.#V=null)}),e}#$e(){let e=this.#V;this.#V=null,e&&e.then(e=>e.dispose()).catch(()=>void 0)}#et(){this.#d||queueMicrotask(()=>this.#e.querySelector(`.rg-developer-grab-tool`)?.focus({preventScroll:!0}))}#tt=e=>{if(!this.#s)return;if(this.#Bt(e)||Nn(e)){this.#Tt();return}let t=Fn(e);if(!t){this.#Tt();return}let n=I(t);if(n.width<=0||n.height<=0){this.#Tt();return}let r=this.#e.querySelector(`[data-slot="region"]`);r&&(r.style.display=`none`);let i=this.#e.querySelector(`[data-slot="highlight"]`);i&&Q(i,n)};#nt(){if(!this.#s)return;let e=In(document);if(!e||p(e)||Pn(e))return;let t=I(e);if(t.width<=0||t.height<=0)return;let n=this.#e.querySelector(`[data-slot="highlight"]`);n&&Q(n,t)}#rt=e=>{if(e.key===`Escape`&&!e.isComposing){let t=!!this.#e.activeElement?.closest(`.rg-thread-label`);if(this.#_&&t){e.preventDefault(),e.stopImmediatePropagation(),this.#xt(!0);return}if(this.#b){e.preventDefault(),e.stopImmediatePropagation(),this.#xe(!1);return}if(this.#_){e.preventDefault(),e.stopImmediatePropagation(),this.#xt(!0);return}if(this.#d){if(e.preventDefault(),e.stopImmediatePropagation(),this.#h?.target===this.#d){this.#He(`피드백을 저장하는 중입니다.`);return}this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#jt(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}));return}}!((e.metaKey||e.ctrlKey)&&!e.shiftKey&&!e.altKey&&(e.code===`KeyC`||e.key.toLowerCase()===`c`))||this.#t?.developerTools?.codeContextCopy!==!0||e.repeat||this.#s||this.#d||this.#_||this.#b||this.#B||this.#I!==null||Nn(e)||Rn(e)||(this.#I=window.setTimeout(()=>{this.#I=null,!(this.#s||this.#d||this.#_||this.#b||this.#h||this.#B)&&this.#ot()},100))};#it=e=>{let t=e.code===`KeyC`||e.key.toLowerCase()===`c`,n=e.key===`Meta`||e.key===`Control`;(t||n)&&this.#at()};#at(){this.#I!==null&&(window.clearTimeout(this.#I),this.#I=null)}#ot(){if(this.#t?.developerTools?.codeContextCopy!==!0)return;let e=this.#e.querySelector(`.rg-toolbar`);e?.dataset.collapsed===`true`&&lt(e,!1),this.#ge(!0,`react-grab`)}#st=e=>{!this.#_||this.#Bt(e)||this.#xt(!1)};#ct=e=>{!this.#z||this.#Bt(e)||(e.preventDefault(),e.stopImmediatePropagation(),this.#ut())};#lt(){this.#ut(),this.#z=!0,this.#R=window.setTimeout(()=>{this.#R=null,this.#z=!1},0)}#ut(){this.#R!==null&&(window.clearTimeout(this.#R),this.#R=null),this.#z=!1}#dt=()=>{this.#ft()};#ft(){if(!(!this.#M||this.#H!==null)){if(typeof window.requestAnimationFrame==`function`){this.#U=!0,this.#H=-1;let e=window.requestAnimationFrame(()=>{this.#H=null,this.#pt()});this.#H!==null&&(this.#H=e);return}this.#U=!1,this.#H=window.setTimeout(()=>{this.#H=null,this.#pt()},16)}}#pt(){if(!this.#M)return;this.#K&&(this.#K=!1,this.#ht()),this.#vt(),this.#At(),this.#Et(),this.#St();let e=this.#e.querySelector(`.rg-feedback-navigator`);e&&e.dataset.presentation!==this.#De()?(this.#jt(),this.#we(),this.#Ee()):this.#Oe(),this.#bt()}#mt(){typeof window.ResizeObserver==`function`&&(this.#W=new window.ResizeObserver(this.#dt)),typeof window.MutationObserver==`function`&&(this.#G=new window.MutationObserver(e=>{e.some(({type:e})=>e===`childList`)&&(this.#K=!0),this.#dt()}),this.#ht()),this.#vt()}#ht(){let e=this.#G;if(!e)return;e.disconnect();let t=i();this.#gt(t),this.#_t();for(let n of t){if(n===this.#e)continue;let t=f(n)?n.documentElement:n;if(t)try{e.observe(t,{attributes:!0,characterData:!0,childList:!0,subtree:!0,attributeFilter:[`class`,`style`,`hidden`,`open`,`aria-hidden`,`id`,`data-review-id`,`data-testid`,`data-id`,`slot`]})}catch{}}}#gt(e){let t=new Set(e.filter(e=>f(e)&&e!==document));for(let[e,n]of this.#Y)t.has(e)||(n(),this.#Y.delete(e));for(let e of t){if(this.#Y.has(e))continue;let t=[],n=(n,r,i=!0)=>{e.addEventListener(n,r,{capture:i,passive:n===`scroll`}),t.push({type:n,listener:r,capture:i})};n(`keydown`,this.#rt),n(`keyup`,this.#it),n(`keydown`,this.#Ye),n(`pointermove`,this.#Ge),n(`pointerdown`,this.#st),n(`pointerdown`,this.#Ke),n(`pointerup`,this.#qe),n(`pointercancel`,this.#Je),n(`click`,this.#ct),n(`focusin`,this.#tt),n(`scroll`,this.#dt);let r=e.defaultView;r?.addEventListener(`resize`,this.#dt,{passive:!0}),r?.visualViewport?.addEventListener(`scroll`,this.#dt,{passive:!0}),r?.visualViewport?.addEventListener(`resize`,this.#dt,{passive:!0}),this.#Y.set(e,()=>{t.forEach(({type:t,listener:n,capture:r})=>{e.removeEventListener(t,n,r)}),r?.removeEventListener(`resize`,this.#dt),r?.visualViewport?.removeEventListener(`scroll`,this.#dt),r?.visualViewport?.removeEventListener(`resize`,this.#dt)})}}#_t(){let e=new Set(a(`iframe`));for(let[t,n]of this.#X)e.has(t)||(n(),this.#X.delete(t));for(let t of e){if(this.#X.has(t))continue;let e=()=>{this.#K=!0,this.#ft()};t.addEventListener(`load`,e),this.#X.set(t,()=>{t.removeEventListener(`load`,e)})}}#vt(){let e=this.#W;if(!e)return;let t=new Set,n=new Set;for(let e of this.#a?.comments??[]){let n=j(e.anchor).element;n&&Ln(n,t)}if(this.#d){let e=j(this.#d.anchor).element;e&&Ln(e,t)}for(let r of this.#J){if(t.has(r)){n.add(r);continue}try{e.unobserve(r)}catch{}}for(let r of t)if(!n.has(r))try{e.observe(r),n.add(r)}catch{}this.#J.clear(),n.forEach(e=>this.#J.add(e))}#yt(){this.#H!==null&&(this.#U&&typeof window.cancelAnimationFrame==`function`?window.cancelAnimationFrame(this.#H):window.clearTimeout(this.#H),this.#H=null),this.#q!==null&&(window.clearTimeout(this.#q),this.#q=null),this.#W?.disconnect(),this.#W=null,this.#G?.disconnect(),this.#G=null,this.#K=!1,this.#J.clear(),this.#Y.forEach(e=>e()),this.#Y.clear(),this.#X.forEach(e=>e()),this.#X.clear()}#bt(){let e=(this.#a?.comments??[]).some(e=>e.target.kind===`element`&&r(e.anchor.selector)&&!K(e).available);if(!this.#M||!e){this.#q!==null&&(window.clearTimeout(this.#q),this.#q=null);return}this.#q===null&&(this.#q=window.setTimeout(()=>{this.#q=null,this.#K=!0,this.#ft()},750))}#xt(e,t=!0){let n=this.#_;if(!n)return;let r=this.#v;this.#A+=1,this.#_=null,this.#v=null,this.#Ot(),this.#jt(),this.#we(),!(t&&!this.#b&&this.#Ce())&&e&&queueMicrotask(()=>{if(r===`navigator`&&this.#b){let e=this.#Me(n);e?e.focus({preventScroll:!0}):this.#Ae();return}if(r===`navigator`){this.#je()?.focus({preventScroll:!0});return}let e=[...this.#e.querySelectorAll(`.pin[data-comment-id]`)].find(({dataset:e})=>e.commentId===n);e?e.focus():this.#je()?.focus({preventScroll:!0})})}#St(){let e=this.#e.querySelector(`.rg-selection-label`);if(!e)return;if(this.#d){qe(e,Yt(this.#d));return}if(!this.#_)return;let t=this.#a?.comments.find(({id:e})=>e===this.#_);t&&(e.removeAttribute(`data-layout`),qe(e,Xt(t)))}#Ct(e){let t=ae(e.clientX,e.clientY),n=this.#e.querySelector(`[data-slot="highlight"]`),r=this.#e.querySelector(`[data-slot="region"]`);if(r&&(r.style.display=`none`),!n||!t){n&&(n.style.display=`none`);return}Q(n,I(t))}#wt(e,t){let n=this.#e.querySelector(`[data-slot="highlight"]`),r=this.#e.querySelector(`[data-slot="region"]`);n&&(n.style.display=`none`),r&&(r.removeAttribute(`data-point`),r.removeAttribute(`data-context-target`),Q(r,new DOMRect(Math.min(e.clientX,t.clientX),Math.min(e.clientY,t.clientY),Math.abs(t.clientX-e.clientX),Math.abs(t.clientY-e.clientY))))}#Tt(){this.#e.querySelectorAll(`.highlight, .region`).forEach(e=>{e.style.display=`none`,e.removeAttribute(`data-context-target`),e.removeAttribute(`data-point`)})}#Et(){if(this.#s)return;if(this.#d){this.#Dt(this.#d);return}let e=this.#a?.comments.find(({id:e})=>e===this.#_);if(e){this.#Dt(e.target);return}this.#Tt()}#Dt(e){let t=this.#e.querySelector(`[data-slot="highlight"]`),n=this.#e.querySelector(`[data-slot="region"]`);if(!(!t||!n)){if(t.style.display=`none`,n.style.display=`none`,t.removeAttribute(`data-context-target`),n.removeAttribute(`data-context-target`),n.removeAttribute(`data-point`),e.kind===`element`){let n=j(e.anchor);if(!n.anchored||!n.visible||!n.element)return;let r=I(n.element);t.dataset.contextTarget=`true`,Q(t,r);return}if(n.dataset.contextTarget=`true`,e.kind===`viewport`){n.dataset.point=`true`,Q(n,tn(e));return}Q(n,Qt(e))}}#Ot(){let e=this.#e.querySelector(`[data-slot="pins"]`);if(!e)return;let t=this.#e.activeElement instanceof HTMLElement&&this.#e.activeElement.matches(`.pin[data-comment-id]`)?this.#e.activeElement.dataset.commentId:void 0;e.replaceChildren();let n=this.#a;if(!n)return;let r=xt(this.#Ne()).pinNumberByCommentId,i=this.#kt(n.comments);n.comments.forEach(t=>{if(!this.#Pe(t))return;let n=K(t);if(!n.available||n.pageX===null||n.pageY===null)return;let a=r.get(t.id)??1,o=i.get(t.id)??{x:0,y:0},s=document.createElement(`button`);s.type=`button`,s.className=`pin`,s.dataset.commentId=t.id,s.dataset.resolved=String(t.status===`resolved`),s.dataset.active=String(t.id===this.#_),s.dataset.collided=String(i.has(t.id)),s.style.display=`grid`,s.style.left=`${n.pageX+o.x-window.scrollX}px`,s.style.top=`${n.pageY+o.y-window.scrollY}px`,s.textContent=String(a),s.setAttribute(`aria-label`,`피드백 #${a}: ${t.body.slice(0,80)}`),s.setAttribute(`aria-expanded`,String(t.id===this.#_)),s.setAttribute(`aria-controls`,Zt(t.id)),s.addEventListener(`click`,()=>{if(!this.#s){if(this.#_===t.id){this.#xt(!0);return}this.#ze(t.id,{origin:`pin`,navigate:!1})}}),e.append(s)}),t&&queueMicrotask(()=>{[...e.querySelectorAll(`.pin[data-comment-id]`)].find(({dataset:e})=>e.commentId===t)?.focus({preventScroll:!0})})}#kt(e){if(!(window.innerWidth<=640||window.matchMedia?.(`(pointer: coarse)`).matches===!0))return new Map;let t=e.flatMap(e=>{if(!this.#Pe(e))return[];let t=K(e);return!t.available||t.pageX===null||t.pageY===null?[]:[{comment:e,x:t.pageX,y:t.pageY}]}),n=new Set(t.map((e,t)=>t)),r=new Map;for(;n.size>0;){let e=n.values().next().value;n.delete(e);let i=[e];for(let e=0;e<i.length;e+=1){let r=t[i[e]];for(let e of[...n]){let a=t[e];Math.hypot(a.x-r.x,a.y-r.y)>40||(n.delete(e),i.push(e))}}if(i.length<2)continue;i.sort((e,n)=>qn(t[e].comment,t[n].comment));let a=i.reduce((e,n)=>({x:e.x+t[n].x/i.length,y:e.y+t[n].y/i.length}),{x:0,y:0}),o=Math.ceil(Math.sqrt(i.length)),s=Math.ceil(i.length/o),c=(o-1)*50/2,l=(s-1)*50/2,u=window.scrollX,d=window.scrollY;if(a.x>=u&&a.x<=u+window.innerWidth&&a.y>=d&&a.y<=d+window.innerHeight){let e=u+17+c,t=u+window.innerWidth-27-c,n=d+30+l,r=d+window.innerHeight-14-l;e<=t&&(a.x=Yn(a.x,e,t)),n<=r&&(a.y=Yn(a.y,n,r))}i.forEach((e,n)=>{let c=Math.floor(n/o),l=n%o,u=Math.min(o,i.length-c*o),d=t[e];r.set(d.comment.id,{x:Math.round(a.x+(l-(u-1)/2)*50-d.x),y:Math.round(a.y+(c-(s-1)/2)*50-d.y)})})}return r}#At(){let e=new Map(this.#a?.comments.map(e=>[e.id,e])??[]),t=this.#kt([...e.values()]),n=[...this.#e.querySelectorAll(`.pin[data-comment-id]`)],r=new Set(n.map(({dataset:e})=>e.commentId??``));if([...e.values()].some(e=>{if(!this.#Pe(e)||r.has(e.id))return!1;let t=K(e);return t.available&&t.pageX!==null&&t.pageY!==null})){this.#Ot();return}n.forEach(n=>{let r=e.get(n.dataset.commentId??``);if(!r)return;if(!this.#Pe(r)){n.style.display=`none`;return}let i=K(r);if(!i.available||i.pageX===null||i.pageY===null){n.style.display=`none`;return}let a=t.get(r.id)??{x:0,y:0};n.dataset.collided=String(t.has(r.id)),n.style.display=`grid`,n.style.left=`${i.pageX+a.x-window.scrollX}px`,n.style.top=`${i.pageY+a.y-window.scrollY}px`})}#jt(){let e=this.#e.querySelector(`[data-slot="panels"]`);if(!e)return;let t=this.#e.activeElement,n=t instanceof HTMLTextAreaElement&&t.closest(`.rg-thread-label`)!==null,r=t instanceof HTMLTextAreaElement&&t.closest(`.rg-selection-label:not(.rg-thread-label)`)!==null,i=n||r?{start:t.selectionStart,end:t.selectionEnd,direction:t.selectionDirection}:null,a=e.querySelector(`.rg-thread-messages`)?.scrollTop??0;if(e.replaceChildren(),this.#d){this.#Dt(this.#d),e.append(this.#Mt(this.#d)),r&&i&&queueMicrotask(()=>{let t=e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);t?.focus({preventScroll:!0}),t?.setSelectionRange(i.start,i.end,i.direction)});return}let o=this.#a?.comments.find(({id:e})=>e===this.#_);if(o){if(this.#Dt(o.target),this.#b&&this.#De()===`sheet`)return;e.append(this.#Ft(o)),queueMicrotask(()=>{let t=e.querySelector(`.rg-thread-messages`);if(t&&(t.scrollTop=a),!n||!i)return;let r=e.querySelector(`.rg-thread-label textarea`);r?.focus({preventScroll:!0}),r?.setSelectionRange(i.start,i.end,i.direction)});return}this.#s||this.#Tt()}#Mt(e){let t=Ge(`피드백`,`변경할 점`,`변경할 점 입력`);qe(t,Yt(e));let n=t.querySelector(`textarea`),r=t.querySelector(`.rg-submit`);n.value=this.#f;let i=this.#h?.target===e&&this.#h.body===n.value.trim();n.disabled=i,r.disabled=i||!this.#ve();let a=()=>{n.style.height=`auto`,n.style.height=`${Math.min(n.scrollHeight,95)}px`};return n.addEventListener(`input`,()=>{this.#f=n.value,r.disabled=!this.#ve()||!n.value.trim(),this.#m?.body!==n.value.trim()&&(this.#m=null,this.#p=``,t.querySelector(`.rg-inline-error`)?.remove()),a()}),n.addEventListener(`keydown`,t=>{if(t.key===`Escape`){if(t.preventDefault(),this.#h?.target===e){this.#He(`피드백을 저장하는 중입니다.`);return}this.#d=null,this.#f=``,this.#p=``,this.#m=null,this.#jt(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}))}t.key===`Enter`&&(t.metaKey||t.ctrlKey)&&!t.shiftKey&&!t.altKey&&!t.isComposing&&(t.preventDefault(),r.click())}),r.addEventListener(`click`,()=>void this.#Nt(t,e)),this.#p&&Mn(t,this.#p),t}async#Nt(e,t){if(!this.#t||this.#h||!this.#ve())return;let n=this.#t,r=n.pageId,i=n.repository,a=this.#M?.signal;if(!a)return;let o=e.querySelector(`textarea`),s=e.querySelector(`.rg-submit`),c=o?.value.trim()??``;if(!c||!o||!s)return;s.disabled=!0,o.disabled=!0;let l={target:t,body:c,comment:null};this.#h=l;let u=i.attachScreenshot?un(t):Promise.resolve(null),d=this.#m?.target===t&&this.#m.body===c?this.#m.comment:null;if(!d){let e=t;if(n.sourceContextResolver)try{e=await ye(t,n.sourceContextResolver,{signal:a})}catch{}if(a.aborted||this.#h!==l)return;let i=n.now?.()??Date.now();d={id:n.id?.()??crypto.randomUUID(),pageId:r,authorId:n.session.reviewerId,authorName:n.session.displayName,body:c,anchor:e.anchor,target:e,status:`open`,createdAt:i,updatedAt:i}}l.comment=d;let f=!1;try{await i.mutate(r,{type:`comment.upsert`,comment:d}),f=await this.#Pt(d.id,a)}catch{if(a.aborted||this.#h!==l)return;this.#h=null,this.#m={target:t,body:c,comment:d},this.#p=`저장하지 못했습니다. 다시 시도하세요.`,!this.#b&&this.#d===t&&(this.#jt(),queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`)?.focus({preventScroll:!0})));return}if(a.aborted||!f)return;this.#h===l&&(this.#h=null),this.#m=null,this.#p=``,this.#g?.target===t&&(this.#g=null),this.#d===t&&(this.#d=null,this.#f=``,this.#jt(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0})));let p=await u;if(p&&i.attachScreenshot)try{await i.attachScreenshot(r,d.id,p),this.#He(`피드백과 위치 캡처를 저장했습니다.`);return}catch{this.#He(`피드백은 저장했지만 위치 캡처는 저장하지 못했습니다.`);return}this.#He(`피드백을 저장했습니다.`)}async#Pt(e,t){return this.#a?.comments.some(({id:t})=>t===e)?!0:await new Promise((n,r)=>{let i=()=>{clearTimeout(o),t.removeEventListener(`abort`,a),this.#re.delete(e)},a=()=>{i(),n(!1)},o=setTimeout(()=>{i(),r(Error(`Comment was not confirmed by the review service`))},Cn);this.#re.set(e,e=>{i(),n(e)}),t.addEventListener(`abort`,a,{once:!0})})}#Ft(e){let t=this.#a?xt(this.#a).pinNumberByCommentId.get(e.id)??1:1,n=!K(e).available,r=Ge(`피드백 #${t}${e.status===`resolved`?` · 완료`:``}${n?` · 위치 없음`:``}`,`답글`,`답글 입력`);r.classList.add(`rg-thread-label`),r.id=Zt(e.id),r.tabIndex=-1,r.dataset.commentId=e.id,r.setAttribute(`aria-label`,`피드백 대화`),qe(r,Xt(e));let i=r.querySelector(`.rg-tag-row`),a=document.createElement(`button`);a.type=`button`,a.className=`rg-thread-close`,a.setAttribute(`aria-label`,`피드백 닫기`),a.append(Ke()),i.append(a);let o=Z(`rg-thread-messages`);o.append(jn(e.authorName,e.body,e.createdAt)),(this.#a?.replies.filter(({commentId:t})=>t===e.id)??[]).forEach(e=>o.append(jn(e.authorName,e.body,e.createdAt))),r.querySelector(`.rg-surface`)?.insertBefore(o,r.querySelector(`.rg-bottom-section`));let s=r.querySelector(`textarea`),c=r.querySelector(`.rg-submit`);s.value=this.#Z.get(e.id)??``;let l=this.#Q.has(e.id);s.disabled=l,c.disabled=l,c.setAttribute(`aria-label`,`답글 저장`);let u=()=>{s.style.height=`auto`,s.style.height=`${Math.min(s.scrollHeight,95)}px`};s.addEventListener(`input`,()=>{this.#Z.set(e.id,s.value),this.#ee.get(e.id)?.body!==s.value.trim()&&(this.#ee.delete(e.id),this.#$.delete(e.id),r.querySelector(`.rg-inline-error`)?.remove()),u()}),s.addEventListener(`keydown`,e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!e.shiftKey&&!e.altKey&&!e.isComposing&&(e.preventDefault(),c.click())}),a.addEventListener(`click`,()=>this.#xt(!0)),c.addEventListener(`click`,()=>void this.#It(r,e));let d=this.#$.get(e.id);return d&&Mn(r,d),queueMicrotask(u),r}async#It(e,t){if(!this.#t||!this.#ve())return;let n=this.#M?.signal;if(!n||this.#Q.has(t.id))return;let r=e.querySelector(`textarea`),i=e.querySelector(`.rg-submit`),a=r?.value.trim()??``;if(!a||!r||!i)return;let o=this.#ee.get(t.id),s=this.#t.now?.()??Date.now(),c=o?.body===a?o.reply:{id:this.#t.id?.()??crypto.randomUUID(),commentId:t.id,authorId:this.#t.session.reviewerId,authorName:this.#t.session.displayName,body:a,createdAt:s,updatedAt:s},l=Symbol(t.id);this.#Q.set(t.id,{request:l,body:a,reply:c}),this.#Rt(t.id,!0);try{await this.#t.repository.mutate(this.#t.pageId,{type:`reply.upsert`,reply:c}),await this.#Lt(c,n)}catch{if(n.aborted||this.#Q.get(t.id)?.request!==l)return;this.#Q.delete(t.id),this.#ee.set(t.id,{body:a,reply:c}),this.#$.set(t.id,`답글을 저장하지 못했습니다. 다시 시도하세요.`),i.disabled=!1,r.disabled=!1,this.#_===t.id&&(this.#b&&this.#De()===`sheet`?this.#we():this.#jt(),queueMicrotask(()=>this.#zt(t.id)?.querySelector(`textarea`)?.focus({preventScroll:!0})));return}if(n.aborted||this.#Q.get(t.id)?.request!==l)return;this.#Q.delete(t.id),this.#ee.delete(t.id),this.#$.delete(t.id),this.#Z.delete(t.id);let u=this.#zt(t.id)?.querySelector(`textarea`);u&&(u.value=``,u.style.height=`auto`),this.#Rt(t.id,!1),this.#He(`답글을 저장했습니다.`)}async#Lt(e,t){this.#a?.replies.some(({id:t,commentId:n})=>t===e.id&&n===e.commentId)||await new Promise((n,r)=>{let i=()=>{clearTimeout(o),t.removeEventListener(`abort`,a),this.#ie.delete(e.id)},a=()=>{i(),n()},o=setTimeout(()=>{i(),r(Error(`Reply was not confirmed by the review service`))},Cn);this.#ie.set(e.id,{commentId:e.commentId,settle:()=>{i(),n()}}),t.addEventListener(`abort`,a,{once:!0})})}#Rt(e,t){let n=this.#zt(e),r=n?.querySelector(`textarea`),i=n?.querySelector(`.rg-submit`);r&&(r.disabled=t),i&&(i.disabled=t)}#zt(e){return[...this.#e.querySelectorAll(`.rg-thread-label`)].find(({dataset:t})=>t.commentId===e)}#Bt(e){return e.composedPath().includes(this)}};function On(e){ie(e.styleNonce),customElements.get(`agency-review-widget`)||customElements.define(Sn,Dn);let t=document.createElement(Sn);return t.configure(e),document.body.append(t),t}function kn(e,t){let n=e.hostname.toLowerCase();return t.some(e=>e.toLowerCase()===n)||n===`localhost`||n===`127.0.0.1`||n.endsWith(`.test`)||n.endsWith(`.local`)}function Z(e){let t=document.createElement(`div`);return t.className=e,t}function Q(e,t){e.style.display=`block`,e.style.left=`${t.left}px`,e.style.top=`${t.top}px`,e.style.width=`${t.width}px`,e.style.height=`${t.height}px`}function An(e,t){return Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)}function jn(e,t,n){let r=document.createElement(`article`);r.className=`rg-message`;let i=Z(`rg-message-meta`);i.textContent=`${e} · ${new Date(n).toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}`;let a=document.createElement(`p`);return a.className=`rg-message-body`,a.textContent=t,r.append(i,a),r}function Mn(e,t){let n=e.querySelector(`.rg-inline-error`);if(!n){n=Z(`rg-inline-error`),n.setAttribute(`role`,`alert`);let t=e.querySelector(`.rg-surface`);t?.insertBefore(n,t.querySelector(`.rg-bottom-section`))}n.textContent=t}function Nn(e){return Bn(e).designMode===`on`||e.composedPath().some(e=>{let t=Vn(e);return t?Pn(t):!1})}function Pn(e){let t=e.tagName.toLowerCase();return t===`input`||t===`textarea`||t===`select`||`isContentEditable`in e&&!!e.isContentEditable||En.has(e.getAttribute(`role`)??``)}function Fn(e){let t=e.composedPath().map(Vn).find(Boolean)??null;return!t||t===t.ownerDocument.documentElement||t===t.ownerDocument.body||p(t)?null:t}function In(e){let t=e.activeElement,n=new Set;for(;t&&!n.has(t);){n.add(t);let e=t.shadowRoot?.activeElement;if(e){t=e;continue}if(t.tagName.toLowerCase()===`iframe`)try{let e=t.contentDocument?.activeElement;if(e){t=e;continue}}catch{}break}return t}function Ln(e,t){let n=e,r=new Set;for(;n&&!r.has(n);){r.add(n),t.add(n);let e=n.getRootNode();if(d(e)){n=e.host;continue}if(f(e)&&e!==document){try{n=e.defaultView?.frameElement??null}catch{n=null}continue}n=null}}function Rn(e){let t=Bn(e).defaultView?.getSelection();return!!(t&&!t.isCollapsed&&t.toString().length>0)}function zn(e){let t=e.clientX,n=e.clientY,r=Bn(e);for(;r!==document;){let e=null;try{e=r.defaultView?.frameElement??null}catch{break}if(!e)break;let i=e.getBoundingClientRect(),a=e,o=u(a);t=i.left+(a.clientLeft+t)*o.x,n=i.top+(a.clientTop+n)*o.y,r=e.ownerDocument}return{clientX:t,clientY:n}}function Bn(e){for(let t of e.composedPath()){if(Hn(t))return t;let e=Vn(t);if(e)return e.ownerDocument}return document}function Vn(e){return e&&`nodeType`in e&&e.nodeType===1?e:null}function Hn(e){return`nodeType`in e&&e.nodeType===9}function Un(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.clearSnapshot===!0?t.type===`access-lost`?t.recovery===`reauthenticate`&&[`permission-denied`,`session-expired`,`membership-revoked`].includes(t.code??``):t.type===`error`&&t.recovery===`retry`&&[`transport`,`data-integrity`,`unknown`].includes(t.code??``):!1}function Wn(e){return e===`membership-revoked`?`리뷰 권한이 취소되었습니다. 작성 중인 내용은 저장되지 않았습니다.`:e===`session-expired`?`세션이 만료되었습니다. 다시 인증하세요.`:`이 리뷰에 접근할 수 없습니다. 다시 인증하세요.`}function Gn(e){return e===`all`||e===`open`||e===`resolved`}function Kn(e){return e===`current`||e===`all`}function qn(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function Jn(){let e=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);e.setAttribute(`viewBox`,`0 0 16 16`),e.setAttribute(`aria-hidden`,`true`);let t=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);return t.setAttribute(`d`,`M9.78 3.47a.75.75 0 0 1 0 1.06L6.31 8l3.47 3.47a.75.75 0 1 1-1.06 1.06l-4-4a.75.75 0 0 1 0-1.06l4-4a.75.75 0 0 1 1.06 0Z`),e.append(t),e}function Yn(e,t,n){return Math.min(n,Math.max(t,e))}function Xn(e){return xn.includes(e)?e:`bottom-right`}function Zn(e){return e===`top-left`||e===`left`||e===`bottom-left`?`bottom-left`:`bottom-right`}function Qn(e){return e===`top-left`||e===`top`||e===`top-right`?`top`:e===`bottom-left`||e===`bottom`||e===`bottom-right`?`bottom`:e}function $n(e){return Number.isFinite(e)?e:0}function er(e){return e.replace(/\/+$/,``)||`/`}function tr(e){let t=`${er(e.pathname)}${e.search}${e.hash}`,n=`${e.host}${t}`;try{return decodeURI(n)}catch{return n}}function nr(e){try{return new URL(e.target.pageUrl,window.location.href)}catch{return null}}function $(...e){e.forEach(e=>{try{e?.()}catch{}})}function rr(e,t){let n=Math.max(0,Math.floor((t-e)/1e3));if(n<60)return`방금`;let r=Math.floor(n/60);if(r<60)return`${r}분 전`;let i=Math.floor(r/60);if(i<24)return`${i}시간 전`;let a=Math.floor(i/24);return a<7?`${a}일 전`:new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`})}function ir(){return new Promise(e=>{if(typeof window.requestAnimationFrame==`function`){window.requestAnimationFrame(()=>e());return}queueMicrotask(e)})}function ar(e,t){return{value:e.style.getPropertyValue(t),priority:e.style.getPropertyPriority(t)}}function or(e,t,n){n.value?e.style.setProperty(t,n.value,n.priority):e.style.removeProperty(t)}function sr(){for(let e of[document.body,document.documentElement]){let t=getComputedStyle(e).backgroundColor.match(/[\d.]+/g)?.map(Number);if(!t||t.length<3)continue;let[n=0,r=0,i=0,a=1]=t;if(!(a<.5))return(n*.2126+r*.7152+i*.0722)/255<.45?`light`:`dark`}return window.matchMedia?.(`(prefers-color-scheme: dark)`).matches??!1?`light`:`dark`}function cr(e){let t,n=!1,r=(r,i)=>{if(n||t?.invitationId!==r)return;let a=t;if(t=void 0,i)try{e.storage?.setItem(a.exitKey,r)}catch{}try{a.clearLocalSession?.()}catch{}e.onExit(r)},i=()=>{let n=t;if(n)try{e.storage?.getItem(n.exitKey)===n.invitationId&&r(n.invitationId,!1)}catch{}},a=e=>{let n=t;n&&e.key===n.exitKey&&e.newValue===n.invitationId&&r(n.invitationId,!1)},o=()=>{e.document.visibilityState===`visible`&&i()},s=n=>{if(!t?.widget||n.target!==t.widget)return;let r=n instanceof CustomEvent&&n.detail&&typeof n.detail==`object`&&`code`in n.detail?n.detail.code:void 0;e.onReauthenticationRequired(r)};return e.window.addEventListener(`storage`,a),e.window.addEventListener(`pageshow`,i),e.window.addEventListener(`visual-review:reauthenticate-required`,s),e.document.addEventListener(`visibilitychange`,o),{bindSession(e,n,a){return t={invitationId:e,exitKey:n,clearLocalSession:a},i(),()=>r(e,!0)},attachWidget(e){t&&(t.widget=e)},suspendSession(){t=void 0},dispose(){n||(n=!0,t=void 0,e.window.removeEventListener(`storage`,a),e.window.removeEventListener(`pageshow`,i),e.window.removeEventListener(`visual-review:reauthenticate-required`,s),e.document.removeEventListener(`visibilitychange`,o))}}}function lr(e,t){return async n=>{let r=new URL(n,e.location.href);if(r.origin!==e.location.origin)throw Error(`Visual Review route navigation must stay on the staging origin`);if(t){await t(r.href);return}e.location.assign(r.href)}}export{cr as createActiveReviewSessionLifecycle,lr as createReviewNavigationHandler,On as mountReviewWidget};
@@ -1,4 +1,4 @@
1
- import{r as e}from"./install-BVH5H7gL.js";import{t}from"./embedded-source-DSDHbbeU.js";import{i as n,init as r}from"@instantdb/core";import{makeFunctionReference as i}from"convex/server";import{ConvexClient as a}from"convex/browser";const o=131072,s=32768,c=4096,l=1e3;var u=class extends Error{constructor(e,t){super(e,t),this.name=`InstantCaptureIntegrityError`}};function d(e){let t=re(e,`comment target`,!0),n={kind:t.kind,anchor:fe(t.anchor),region:he(t.region),elements:t.elements.map(e=>({selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,rect:he(e.rect),source:null,componentStack:[]})),pageUrl:t.pageUrl,pageTitle:t.pageTitle,capturedAt:t.capturedAt,...t.environment?{environment:oe(t.environment)}:{}},r={elements:t.elements.map(e=>({selector:e.selector,source:e.source?ge(e.source):null,componentStack:e.componentStack.map(ge)})),...t.sourceProvenance?{sourceProvenance:_e(t.sourceProvenance)}:{}};T(n,o,`Public target`);let i=Ce(r,65536,`Source context`);return{publicTarget:n,commentFields:m(n),targetElements:n.elements.map(h),sourceContextJson:i}}function f(e,t,n){let r=y(e,n),i={selector:b(r.anchorSelector,`${n} anchor selector`,c),offsetX:C(r.anchorOffsetX,`${n} anchor offsetX`),offsetY:C(r.anchorOffsetY,`${n} anchor offsetY`),viewportX:C(r.anchorViewportX,`${n} anchor viewportX`),viewportY:C(r.anchorViewportY,`${n} anchor viewportY`)},a=te({kind:r.targetKind,anchor:i,region:{pageX:r.targetPageX,pageY:r.targetPageY,width:r.targetWidth,height:r.targetHeight,viewportX:r.targetViewportX,viewportY:r.targetViewportY,viewportWidth:r.targetViewportWidth,viewportHeight:r.targetViewportHeight},elements:[],pageUrl:me({origin:x(r.targetPageOrigin,`${n} page origin`,1024),pathname:x(r.targetPagePathname,`${n} page pathname`,4096),search:b(r.targetPageSearch,`${n} page search`,1024),hash:b(r.targetPageHash,`${n} page hash`,1024)}),pageTitle:r.targetPageTitle,capturedAt:r.targetCapturedAt,...ae(r,n)},n),o=ee(t,`${n} elements`),s=a;for(let e of o)try{s=te({...a,elements:[...s.elements,e]},n)}catch{}return s}function p(e){if(!Array.isArray(e)||e.length===0)return;let t=[...e].map(e=>{try{let t=y(e,`Comment scope entry`);return{row:t,ordinal:be(t.ordinal,`Comment scope entry ordinal`,0,19),id:typeof t.id==`string`?t.id:``}}catch{return null}}).filter(e=>e!==null).sort((e,t)=>e.ordinal-t.ordinal||e.id.localeCompare(t.id)),n={},r=new Set;for(let{row:e,ordinal:i}of t)if(!r.has(i)){r.add(i);try{let t=x(e.key,`Comment scope key`,256);if(Object.hasOwn(n,t))continue;switch(e.valueType){case`string`:n[t]=b(e.stringValue,`Comment scope ${t}`,l);break;case`number`:n[t]=S(e.numberValue,`Comment scope ${t}`);break;case`boolean`:if(typeof e.booleanValue!=`boolean`)throw E(`Comment scope ${t} is invalid`);n[t]=e.booleanValue;break;case`null`:n[t]=null;break;default:throw E(`Comment scope ${t} is invalid`)}}catch{}}if(Object.keys(n).length!==0)try{return T(n,s,`Comment scope`),n}catch{return}}function m(e){let t=new URL(e.pageUrl);return{anchorSelector:e.anchor.selector,anchorOffsetX:e.anchor.offsetX,anchorOffsetY:e.anchor.offsetY,anchorViewportX:e.anchor.viewportX,anchorViewportY:e.anchor.viewportY,targetKind:e.kind,targetPageX:e.region.pageX,targetPageY:e.region.pageY,targetWidth:e.region.width,targetHeight:e.region.height,targetViewportX:e.region.viewportX,targetViewportY:e.region.viewportY,targetViewportWidth:e.region.viewportWidth,targetViewportHeight:e.region.viewportHeight,targetPageOrigin:t.origin,targetPagePathname:pe(t.pathname),targetPageSearch:t.search.slice(1),targetPageHash:t.hash.slice(1),targetPageTitle:e.pageTitle,targetCapturedAt:e.capturedAt,...e.environment?{environmentBrowser:e.environment.browser,environmentOperatingSystem:e.environment.operatingSystem,environmentDeviceType:e.environment.deviceType,environmentScreenWidth:e.environment.screenWidth,environmentScreenHeight:e.environment.screenHeight,environmentDevicePixelRatio:e.environment.devicePixelRatio}:{}}}function h(e,t){return{ordinal:t,selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,pageX:e.rect.pageX,pageY:e.rect.pageY,width:e.rect.width,height:e.rect.height,viewportX:e.rect.viewportX,viewportY:e.rect.viewportY,viewportWidth:e.rect.viewportWidth,viewportHeight:e.rect.viewportHeight}}function ee(e,t){if(!Array.isArray(e)||e.length===0)return[];let n=[...e].map(e=>{try{let n=y(e,t);return{row:n,ordinal:be(n.ordinal,`${t} ordinal`,0,7),id:typeof n.id==`string`?n.id:``}}catch{return null}}).filter(e=>e!==null).sort((e,t)=>e.ordinal-t.ordinal||e.id.localeCompare(t.id)),r=[],i=new Set;for(let{row:e,ordinal:a}of n)if(!i.has(a)){i.add(a);try{r.push(se({selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,rect:{pageX:e.pageX,pageY:e.pageY,width:e.width,height:e.height,viewportX:e.viewportX,viewportY:e.viewportY,viewportWidth:e.viewportWidth,viewportHeight:e.viewportHeight},source:null,componentStack:[]},`${t}[${a}]`,!1))}catch{}}return r}function te(e,t){return re(e,t,!1)}function g(e,t=`Comment body`){return x(e,t,2e4)}function ne(e){if(e==null)return;let t=y(e,`Comment scope`);if(Object.keys(t).length>20)throw E(`Comment scope has too many fields`);let n={};for(let[e,r]of Object.entries(t)){if(!e.trim()||e.length>256)throw E(`Comment scope has an invalid key`);if(typeof r==`string`){if(r.length>l)throw E(`Comment scope ${e} is too long`);n[e]=r}else if(typeof r==`number`)n[e]=S(r,`Comment scope ${e}`);else if(typeof r==`boolean`||r===null)n[e]=r;else throw E(`Comment scope ${e} is invalid`)}return T(n,s,`Comment scope`),n}function re(e,t,n){let r=v(e,t,[`kind`,`anchor`,`region`,`elements`,`pageUrl`,`pageTitle`,`capturedAt`,`environment`,`sourceProvenance`],[`environment`,`sourceProvenance`]),i=r.kind;if(i!==`element`&&i!==`region`&&i!==`viewport`)throw E(`${t} kind is invalid`);let a=ve(r.elements,`${t} elements`);if(a.length>8)throw E(`${t} contains too many elements`);if(!n&&r.sourceProvenance!=null)throw E(`${t} exposes source provenance`);let s=x(r.pageUrl,`${t} pageUrl`,8192);Se(s,`${t} pageUrl`);let c={kind:i,anchor:ce(r.anchor,`${t} anchor`),region:le(r.region,`${t} region`),elements:a.map((e,r)=>se(e,`${t} elements[${r}]`,n)),pageUrl:s,pageTitle:b(r.pageTitle,`${t} pageTitle`,l),capturedAt:w(r.capturedAt,`${t} capturedAt`),...r.environment==null?{}:{environment:ie(r.environment,`${t} environment`)},...n&&r.sourceProvenance!=null?{sourceProvenance:de(r.sourceProvenance,`${t} provenance`)}:{}};return T(c,n?196608:o,t),c}function ie(e,t){let n=v(e,t,[`browser`,`operatingSystem`,`deviceType`,`screenWidth`,`screenHeight`,`devicePixelRatio`]),r=n.deviceType;if(r!==`desktop`&&r!==`tablet`&&r!==`mobile`&&r!==`unknown`)throw E(`${t} deviceType is invalid`);return{browser:x(n.browser,`${t} browser`,120),operatingSystem:x(n.operatingSystem,`${t} operatingSystem`,120),deviceType:r,screenWidth:_(n.screenWidth,`${t} screenWidth`,1e5),screenHeight:_(n.screenHeight,`${t} screenHeight`,1e5),devicePixelRatio:_(n.devicePixelRatio,`${t} devicePixelRatio`,100)}}function ae(e,t){if([e.environmentBrowser,e.environmentOperatingSystem,e.environmentDeviceType,e.environmentScreenWidth,e.environmentScreenHeight,e.environmentDevicePixelRatio].every(e=>e==null))return{};try{return{environment:ie({browser:e.environmentBrowser,operatingSystem:e.environmentOperatingSystem,deviceType:e.environmentDeviceType,screenWidth:e.environmentScreenWidth,screenHeight:e.environmentScreenHeight,devicePixelRatio:e.environmentDevicePixelRatio},`${t} environment`)}}catch{return{}}}function oe(e){return{...e}}function _(e,t,n){let r=S(e,t);if(r<=0||r>n)throw E(`${t} is invalid`);return r}function se(e,t,n){let r=v(e,t,[`selector`,`tagName`,`textPreview`,`rect`,`source`,`componentStack`]),i=ve(r.componentStack,`${t} componentStack`);if(i.length>32)throw E(`${t} componentStack is too large`);if(!n&&(r.source!=null||i.length>0))throw E(`${t} exposes source metadata`);return{selector:x(r.selector,`${t} selector`,c),tagName:x(r.tagName,`${t} tagName`,128),textPreview:b(r.textPreview,`${t} textPreview`,l),rect:le(r.rect,`${t} rect`),source:n&&r.source!=null?ue(r.source,`${t} source`):null,componentStack:n?i.map((e,n)=>ue(e,`${t} stack[${n}]`)):[]}}function ce(e,t){let n=v(e,t,[`selector`,`offsetX`,`offsetY`,`viewportX`,`viewportY`]);return{selector:b(n.selector,`${t} selector`,c),offsetX:C(n.offsetX,`${t} offsetX`),offsetY:C(n.offsetY,`${t} offsetY`),viewportX:C(n.viewportX,`${t} viewportX`),viewportY:C(n.viewportY,`${t} viewportY`)}}function le(e,t){let n=v(e,t,[`pageX`,`pageY`,`width`,`height`,`viewportX`,`viewportY`,`viewportWidth`,`viewportHeight`]),r={pageX:S(n.pageX,`${t} pageX`),pageY:S(n.pageY,`${t} pageY`),width:S(n.width,`${t} width`),height:S(n.height,`${t} height`),viewportX:S(n.viewportX,`${t} viewportX`),viewportY:S(n.viewportY,`${t} viewportY`),viewportWidth:S(n.viewportWidth,`${t} viewportWidth`),viewportHeight:S(n.viewportHeight,`${t} viewportHeight`)};if(r.width<0||r.height<0||r.viewportWidth<0||r.viewportHeight<0)throw E(`${t} has a negative dimension`);return r}function ue(e,n){let r=v(e,n,[`filePath`,`lineNumber`,`columnNumber`,`componentName`,`origin`,`generated`],[`generated`]),i=r.origin;if(i!==`app`&&i!==`shared-ui`&&i!==`dependency`&&i!==`generated`&&i!==`unknown`)throw E(`${n} origin is invalid`);let a=x(r.filePath,`${n} filePath`,c);return{filePath:a,lineNumber:xe(r.lineNumber,`${n} lineNumber`),columnNumber:xe(r.columnNumber,`${n} columnNumber`),componentName:r.componentName==null?null:x(r.componentName,`${n} componentName`,512),origin:t(a)}}function de(e,t){let n=v(e,t,[`provider`,`build`,`resolvedAt`]),r=n.provider;if(r!==`react-grab`&&r!==`embedded`&&r!==`custom`)throw E(`${t} provider is invalid`);let i=v(n.build,`${t} build`,[`buildId`,`gitCommit`,`generatedAt`,`mode`],[`generatedAt`]),a=i.mode;if(a!==`development`&&a!==`preview`&&a!==`production`)throw E(`${t} build mode is invalid`);return{provider:r,build:{buildId:x(i.buildId,`${t} buildId`,512),gitCommit:i.gitCommit==null?null:x(i.gitCommit,`${t} gitCommit`,256),...i.generatedAt==null?{}:{generatedAt:w(i.generatedAt,`${t} generatedAt`)},mode:a},resolvedAt:w(n.resolvedAt,`${t} resolvedAt`)}}function fe(e){return{...e}}function pe(e){return e.replace(/\/+$/,``)||`/`}function me(e){return`${e.origin}${e.pathname}${e.search?`?${e.search}`:``}${e.hash?`#${e.hash}`:``}`}function he(e){return{...e}}function ge(e){return{...e}}function _e(e){return{...e,build:{...e.build}}}function v(e,t,n,r=[]){let i=y(e,t);if(Object.keys(i).some(e=>!n.includes(e)))throw E(`${t} contains unknown fields`);for(let e of n)if(!r.includes(e)&&!Object.hasOwn(i,e))throw E(`${t} is missing ${e}`);return i}function y(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw E(`${t} is missing or invalid`);return e}function ve(e,t){if(!Array.isArray(e))throw E(`${t} is missing or invalid`);return e}function b(e,t,n){if(typeof e!=`string`||ye(e,n)>n)throw E(`${t} is invalid or too long`);return e}function ye(e,t){let n=0;for(let r of e)if(n+=1,n>t)return n;return n}function x(e,t,n){let r=b(e,t,n);if(!r.trim())throw E(`${t} is empty`);return r}function S(e,t){if(typeof e!=`number`||!Number.isFinite(e))throw E(`${t} is invalid`);return e}function be(e,t,n,r){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<n||e>r)throw E(`${t} is invalid`);return e}function C(e,t){let n=S(e,t);if(n<0||n>1)throw E(`${t} is outside 0..1`);return n}function w(e,t){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw E(`${t} is invalid`);return e}function xe(e,t){if(e===null)return null;if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0)throw E(`${t} is invalid`);return e}function Se(e,t){let n;try{n=new URL(e)}catch(e){throw E(`${t} is invalid`,e)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw E(`${t} must use HTTP or HTTPS`)}function T(e,t,n){Ce(e,t,n)}function Ce(e,t,n){let r;try{r=JSON.stringify(e)}catch(e){throw E(`${n} cannot be serialized`,e)}if(r.length>t)throw E(`${n} is too large`);return r}function E(e,t){return new u(e,{cause:t instanceof Error?t:void 0})}new Uint8Array([107,167,184,17,157,173,17,209,128,180,0,192,79,212,48,200]);const we=n.schema({entities:{$files:n.entity({path:n.string().unique().indexed(),url:n.string()}),$users:n.entity({email:n.string().unique().indexed()}),projects:n.entity({name:n.string(),slug:n.string().unique().indexed(),allowedOrigin:n.string().optional(),originDisconnectedAt:n.number().optional(),originModelVersion:n.number().optional(),createdAt:n.number().indexed(),updatedAt:n.number()}),projectOrigins:n.entity({projectId:n.string().indexed(),originKey:n.string().unique().indexed(),origin:n.string().indexed(),label:n.string().optional(),createdAt:n.number().indexed(),updatedAt:n.number()}),reviewPages:n.entity({projectId:n.string().indexed(),autoRegistrationSlot:n.string().unique().indexed().optional(),name:n.string(),pathname:n.string(),stagingOrigin:n.string(),createdAt:n.number().indexed(),updatedAt:n.number()}),reviewPageBuilds:n.entity({projectId:n.string().indexed(),pageId:n.string().unique().indexed(),buildId:n.string(),gitCommit:n.string().optional(),generatedAt:n.number().optional(),mode:n.string(),updatedAt:n.number().indexed()}),reviewers:n.entity({authUserId:n.string().indexed(),projectId:n.string().indexed(),email:n.string().indexed(),displayName:n.string(),role:n.string(),createdAt:n.number()}),reviewerIdentityClaims:n.entity({reviewerId:n.string().unique().indexed(),projectId:n.string().indexed(),authUserId:n.string().indexed(),email:n.string(),displayName:n.string(),role:n.string(),createdAt:n.number()}),invitations:n.entity({projectId:n.string().indexed(),reviewerId:n.string().indexed().optional(),email:n.string().indexed(),status:n.string().indexed(),claimRevision:n.number(),claimedByAuthUserId:n.string().indexed().optional(),expiresAt:n.number().indexed(),createdAt:n.number(),acceptedAt:n.number().optional(),revokedAt:n.number().optional(),emailTokenHash:n.string().optional(),emailSentAt:n.number().optional(),reviewUrl:n.string().optional()}),comments:n.entity({pageId:n.string().indexed(),pageNumber:n.number().optional(),authorId:n.string().indexed(),authorAuthUserId:n.string().indexed(),authorName:n.string(),body:n.string(),bodyContentMarker:n.string().optional(),anchorSelector:n.string().optional(),anchorOffsetX:n.number().optional(),anchorOffsetY:n.number().optional(),anchorViewportX:n.number().optional(),anchorViewportY:n.number().optional(),targetKind:n.string().optional(),targetPageX:n.number().optional(),targetPageY:n.number().optional(),targetWidth:n.number().optional(),targetHeight:n.number().optional(),targetViewportX:n.number().optional(),targetViewportY:n.number().optional(),targetViewportWidth:n.number().optional(),targetViewportHeight:n.number().optional(),targetPageOrigin:n.string().optional(),targetPagePathname:n.string().optional(),targetPageSearch:n.string().optional(),targetPageHash:n.string().optional(),targetPageTitle:n.string().optional(),targetCapturedAt:n.number().optional(),environmentBrowser:n.string().optional(),environmentOperatingSystem:n.string().optional(),environmentDeviceType:n.string().optional(),environmentScreenWidth:n.number().optional(),environmentScreenHeight:n.number().optional(),environmentDevicePixelRatio:n.number().optional(),status:n.string().indexed(),workflowRevision:n.number(),createdAt:n.number().indexed(),updatedAt:n.number().indexed(),resolvedAt:n.number().optional(),resolvedById:n.string().optional(),deletingAt:n.number().optional()}),commentWorkflowClaims:n.entity({claimKey:n.string().unique().indexed(),commentId:n.string().indexed(),expectedWorkflowRevision:n.number(),createdAt:n.number().indexed()}),commentPageNumberClaims:n.entity({claimKey:n.string().unique().indexed(),pageId:n.string().indexed(),pageNumber:n.number(),commentId:n.string().indexed(),createdAt:n.number().indexed()}),commentTargetElements:n.entity({commentId:n.string().indexed(),slotKey:n.string().unique().indexed().optional(),ordinal:n.number(),selector:n.string(),tagName:n.string(),textPreview:n.string(),pageX:n.number(),pageY:n.number(),width:n.number(),height:n.number(),viewportX:n.number(),viewportY:n.number(),viewportWidth:n.number(),viewportHeight:n.number(),authorAuthUserId:n.string().indexed()}),commentScopeEntries:n.entity({commentId:n.string().indexed(),slotKey:n.string().unique().indexed().optional(),ordinal:n.number(),key:n.string(),valueType:n.string(),stringValue:n.string().optional(),numberValue:n.number().optional(),booleanValue:n.boolean().optional(),authorAuthUserId:n.string().indexed()}),commentSourceContexts:n.entity({commentId:n.string().unique().indexed(),pageId:n.string().indexed(),authorAuthUserId:n.string().indexed(),contextJson:n.string(),createdAt:n.number().indexed()}),replies:n.entity({pageId:n.string().indexed(),commentId:n.string().indexed(),authorId:n.string().indexed(),authorAuthUserId:n.string().indexed(),authorName:n.string(),body:n.string(),bodyContentMarker:n.string().optional(),createdAt:n.number().indexed(),updatedAt:n.number().indexed()}),reviewMessages:n.entity({pageId:n.string().indexed(),pathname:n.string().indexed(),authorId:n.string().indexed(),authorAuthUserId:n.string().indexed(),authorName:n.string(),body:n.string(),bodyContentMarker:n.string(),createdAt:n.number().indexed(),updatedAt:n.number().indexed()})},links:{projectOwners:{forward:{on:`projects`,has:`many`,label:`owners`},reverse:{on:`$users`,has:`many`,label:`ownedProjects`}},projectPages:{forward:{on:`projects`,has:`many`,label:`pages`},reverse:{on:`reviewPages`,has:`one`,label:`project`}},projectOriginProject:{forward:{on:`projects`,has:`many`,label:`origins`},reverse:{on:`projectOrigins`,has:`one`,label:`project`}},pageCurrentBuild:{forward:{on:`reviewPageBuilds`,has:`one`,label:`page`,required:!0,onDelete:`cascade`},reverse:{on:`reviewPages`,has:`one`,label:`currentBuild`}},projectReviewers:{forward:{on:`projects`,has:`many`,label:`reviewers`},reverse:{on:`reviewers`,has:`one`,label:`project`}},reviewerUser:{forward:{on:`reviewers`,has:`one`,label:`$user`},reverse:{on:`$users`,has:`many`,label:`reviewerMemberships`}},projectInvitations:{forward:{on:`projects`,has:`many`,label:`invitations`},reverse:{on:`invitations`,has:`one`,label:`project`}},invitationReviewer:{forward:{on:`invitations`,has:`one`,label:`reviewer`},reverse:{on:`reviewers`,has:`many`,label:`acceptedInvitations`}},invitationActiveUser:{forward:{on:`invitations`,has:`one`,label:`activeUser`},reverse:{on:`$users`,has:`many`,label:`activeReviewInvitations`}},pageComments:{forward:{on:`reviewPages`,has:`many`,label:`comments`},reverse:{on:`comments`,has:`one`,label:`page`}},pageReviewMessages:{forward:{on:`reviewPages`,has:`many`,label:`reviewMessages`},reverse:{on:`reviewMessages`,has:`one`,label:`page`}},commentReplies:{forward:{on:`comments`,has:`many`,label:`replies`},reverse:{on:`replies`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`}},commentTargetElements:{forward:{on:`commentTargetElements`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`},reverse:{on:`comments`,has:`many`,label:`targetElements`}},commentScopeEntries:{forward:{on:`commentScopeEntries`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`},reverse:{on:`comments`,has:`many`,label:`scopeEntries`}},commentSourceContext:{forward:{on:`commentSourceContexts`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`},reverse:{on:`comments`,has:`one`,label:`sourceContext`}},pageSourceContexts:{forward:{on:`commentSourceContexts`,has:`one`,label:`page`,required:!0},reverse:{on:`reviewPages`,has:`many`,label:`sourceContexts`}},sourceContextAuthor:{forward:{on:`commentSourceContexts`,has:`one`,label:`author`,required:!0},reverse:{on:`reviewers`,has:`many`,label:`sourceContexts`}},commentAuthor:{forward:{on:`comments`,has:`one`,label:`author`},reverse:{on:`reviewers`,has:`many`,label:`comments`}},replyAuthor:{forward:{on:`replies`,has:`one`,label:`author`},reverse:{on:`reviewers`,has:`many`,label:`replies`}},reviewMessageAuthor:{forward:{on:`reviewMessages`,has:`one`,label:`author`},reverse:{on:`reviewers`,has:`many`,label:`reviewMessages`}}},rooms:{visualReview:{presence:n.entity({reviewerId:n.string(),displayName:n.string(),color:n.string(),active:n.boolean(),pathname:n.string().optional(),cursorX:n.number().optional(),cursorY:n.number().optional(),viewportWidth:n.number().optional(),viewportHeight:n.number().optional(),cursorChat:n.string().optional()})}}}),D={$default:`false`},O={$default:`false`},k=`$user.activeReviewInvitations`,A=`${k}.project.id`;function j(e){return[`auth.id != null`,`size(auth.ref('${k}.id')) > 0`,`size(auth.ref('${A}')) == size(auth.ref('${k}.id'))`,`size(auth.ref('${k}.status')) == size(auth.ref('${k}.id'))`,`size(auth.ref('${k}.expiresAt')) == size(auth.ref('${k}.id'))`,`size(auth.ref('${k}.revokedAt')) == 0`,`auth.ref('${k}.status').all(status, status == 'accepted')`,`auth.ref('${k}.expiresAt').all(expiresAt, request.time < timestamp(expiresAt))`,e].join(` && `)}function M(...e){return e.map(e=>`(${e})`).join(` && `)}function N(...e){return e.map(e=>`(${e})`).join(` || `)}function P(e){let t=`data.ref('${e}project.origins.origin')`,n=`data.ref('${e}project.allowedOrigin')`,r=`data.ref('${e}project.originModelVersion')`;return N(`request.origin in ${t}`,M(`size(${r}) == 0`,`request.origin in ${n}`))}j(`data.ref('project.id')[0] in auth.ref('${A}')`),N(`request.origin in data.ref('project.origins.origin')`,M(`size(data.ref('project.originModelVersion')) == 0`,`request.origin in data.ref('project.allowedOrigin')`)),N(`request.origin in data.ref('origins.origin')`,M(`size(data.ref('originModelVersion')) == 0`,`request.origin in data.ref('allowedOrigin')`)),j(`data.ref('page.project.id')[0] in auth.ref('${A}')`),P(`page.`),N(`auth.id != null && auth.id in data.ref('comment.page.project.owners.id')`,M(j(`data.ref('comment.page.project.id')[0] in auth.ref('${A}')`),P(`comment.page.`))),j(`data.ref('comment.page.project.id')[0] in auth.ref('${A}')`),P(`comment.page.`),j(`data.ref('page.project.id')[0] in auth.ref('${A}')`),P(`page.`),P(``);const Te=M(`data.reviewerId != null`,`data.projectId in data.ref('project.id')`,`data.reviewerId in data.ref('reviewer.id')`,`data.projectId in data.ref('reviewer.project.id')`,`auth.id in data.ref('reviewer.$user.id')`,`auth.email in data.ref('reviewer.email')`);M(`auth.id != null`,`data.revokedAt == null`,`data.status in ['pending', 'accepted']`,`data.status == 'pending' || data.claimedByAuthUserId == auth.id`,`request.time < timestamp(data.expiresAt)`,`request.modifiedFields.all(field, field in ['status', 'claimedByAuthUserId', 'acceptedAt', 'claimRevision', 'activeUser'])`,`'status' in request.modifiedFields`,`'claimedByAuthUserId' in request.modifiedFields`,`'acceptedAt' in request.modifiedFields`,`'claimRevision' in request.modifiedFields`,`'activeUser' in request.modifiedFields`,`newData.status == 'accepted'`,`newData.claimedByAuthUserId == auth.id`,`newData.claimRevision == data.claimRevision + 1`,`math.abs((request.time - timestamp(newData.acceptedAt)).getMinutes()) <= 1`,Te),M(`actions.data == 'update'`,`actions.linkedData == 'update'`,`auth.id != null`,`auth.email != null`,`linkedData.id == auth.id`,`linkedData.email == auth.email`,`data.email == auth.email`,`data.revokedAt == null`,`data.status in ['pending', 'accepted']`,`data.status == 'pending' || data.claimedByAuthUserId == auth.id`,`request.time < timestamp(data.expiresAt)`,`newData.status == 'accepted'`,`newData.claimedByAuthUserId == auth.id`,`newData.claimRevision == data.claimRevision + 1`,`math.abs((request.time - timestamp(newData.acceptedAt)).getMinutes()) <= 1`,Te),M(`actions.data == 'update'`,`actions.linkedData == 'update'`,`auth.id != null`,`auth.email != null`,`data.id == auth.id`,`data.email == auth.email`,`linkedData.email == auth.email`,`linkedData.revokedAt == null`,`linkedData.status == 'accepted'`,`linkedData.claimedByAuthUserId == auth.id`,`request.time < timestamp(linkedData.expiresAt)`,`math.abs((request.time - timestamp(linkedData.acceptedAt)).getMinutes()) <= 1`,`linkedData.projectId in linkedData.ref('project.id')`,`linkedData.reviewerId in linkedData.ref('reviewer.id')`,`linkedData.projectId in linkedData.ref('reviewer.project.id')`,`auth.id in linkedData.ref('reviewer.$user.id')`,`auth.email in linkedData.ref('reviewer.email')`),M(`auth.id != null`,`auth.email != null`,`linkedData.id == auth.id`,`linkedData.email == auth.email`,`data.email == auth.email`,`data.claimedByAuthUserId == auth.id`,`auth.id in data.ref('activeUser.id')`),M(`auth.id != null`,`auth.email != null`,`data.id == auth.id`,`data.email == auth.email`,`linkedData.email == auth.email`,`linkedData.claimedByAuthUserId == auth.id`,`auth.id in linkedData.ref('activeUser.id')`),{...D},{...D},{...O},{...O},j(`data.id in auth.ref('${A}')`),{...D},{...O},{...D},{...D},{...O},{...D},{...O},j(`data.ref('project.id')[0] in auth.ref('${A}')`),{...D},{...O},{...D},{...D},{...O},{...O},{...D},{...O},{...D},{...D},{...D},{...D},{...D},{...D},{...D};function Ee(e){if(!e.trim())throw Error(`InstantDB app ID is required`);return r({appId:e,schema:we,devtool:!1})}var De=class{db;session;#e;attachScreenshot;constructor(e,t,n={}){this.db=e,this.session=t,this.#e=n.commentTransport,this.#e&&(this.attachScreenshot=(e,t,n)=>this.#e.uploadScreenshot({pageId:e,commentId:t,screenshot:n}))}async getSnapshot(e){let{data:t}=await this.db.queryOnce(Oe(e,this.session.authUserId));return Ae(e,t.comments,t.replies)}async getProjectSnapshot(e){this.#t(e);let{data:t}=await this.db.queryOnce(ke(e,this.session.authUserId));return je(e,t.comments,t.replies)}subscribe(e,t,n){return this.db.subscribeQuery(Oe(e,this.session.authUserId),r=>{if(r.error){n?.(Re(r.error));return}if(r.data)try{t(Ae(e,r.data.comments,r.data.replies))}catch{n?.({type:`error`,code:`data-integrity`,recovery:`retry`,clearSnapshot:!0})}})}subscribeProject(e,t,n){return this.#t(e),this.db.subscribeQuery(ke(e,this.session.authUserId),r=>{if(r.error){n?.(Re(r.error));return}if(r.data)try{t(je(e,r.data.comments,r.data.replies))}catch{n?.({type:`error`,code:`data-integrity`,recovery:`retry`,clearSnapshot:!0})}})}async mutate(e,t){switch(t.type){case`comment.upsert`:{if(t.comment.pageId!==e)throw Error(`Comment page mismatch`);let n=t.comment;if(n.authorId!==this.session.reviewerId)throw Error(`Comment author mismatch`);let r=g(n.body).trim(),i=z(n.createdAt,`Comment createdAt`);if(z(n.updatedAt,`Comment updatedAt`)<i)throw new u(`Comment updatedAt precedes createdAt`);if(n.createdAt!==n.updatedAt)throw new u(`Comment edits must go through the review service`);if(n.status!==`open`||n.resolvedAt!==void 0||n.resolvedById!==void 0)throw new u(`New comments must start open`);let a=d(n.target);if(!Ie(n.anchor,a.publicTarget.anchor))throw new u(`Comment anchor does not match its target`);if(!this.#e)throw new u(`Comment creation requires the review service transport`);await this.#e.createComment({pageId:e,commentId:n.id,body:r,target:n.target,...n.scope===void 0?{}:{scope:n.scope}});return}case`comment.delete`:throw new u(`Comment deletion must go through the review service`);case`reply.upsert`:{let e=t.reply;if(e.authorId!==this.session.reviewerId)throw Error(`Reply author mismatch`);let n=g(e.body,`Reply body`).trim(),r=z(e.createdAt,`Reply createdAt`);if(z(e.updatedAt,`Reply updatedAt`)<r)throw new u(`Reply updatedAt precedes createdAt`);if(e.createdAt!==e.updatedAt)throw new u(`Reply edits must go through the review service`);if(!this.#e)throw new u(`Reply creation requires the review service transport`);await this.#e.createReply({commentId:e.commentId,replyId:e.id,body:n});return}case`reply.delete`:throw new u(`Reply deletion must go through the review service`)}}#t(e){if(!e.trim()||e!==this.session.projectId)throw Error(`Project does not belong to the reviewer session`)}};function Oe(e,t){return{comments:{$:{where:{pageId:e},order:{createdAt:`asc`}},targetElements:{},scopeEntries:{}},replies:{$:{where:{pageId:e},order:{createdAt:`asc`}}},$users:{$:{where:{id:t}},activeReviewInvitations:{project:{}}}}}function ke(e,t){return{comments:{$:{where:{"page.project.id":e},order:{createdAt:`asc`}},page:{project:{}},targetElements:{},scopeEntries:{}},replies:{$:{where:{"comment.page.project.id":e},order:{createdAt:`asc`}},comment:{page:{project:{}}}},$users:{$:{where:{id:t}},activeReviewInvitations:{project:{}}}}}function Ae(e,t,n){let r=t.map(t=>Ne(t,e));F(r,`comment`);let i=new Set(r.map(({id:e})=>e)),a=n.map(t=>Pe(t,e));F(a,`reply`);for(let e of a)if(!i.has(e.commentId))throw new u(`Reply ${e.id} references a comment outside the page snapshot`);return{pageId:e,comments:r,replies:a}}function je(e,t,n){let r=new Map,i=t.map(t=>{let n=L(t.pageId,`comment pageId`);Me(t.page,n,e,`comment ${String(t.id)}`);let i=I(t.page,`comment ${String(t.id)} page`),a=Ne(t,n),o=`/`;try{o=new URL(a.target.pageUrl).pathname||`/`}catch{}return r.set(n,{id:n,name:typeof i.name==`string`&&i.name.trim()?i.name.trim():a.target.pageTitle.trim()||o,pathname:typeof i.pathname==`string`&&i.pathname.trim()?i.pathname.trim():o}),a});F(i,`comment`);let a=new Map(i.map(e=>[e.id,e])),o=n.map(t=>{let n=L(t.pageId,`reply pageId`),r=I(t.comment,`reply ${String(t.id)} comment`),i=L(t.commentId,`reply ${String(t.id)} commentId`);if(L(r.id,`reply ${String(t.id)} comment relation id`)!==i)throw new u(`Reply ${String(t.id)} has an inconsistent comment relation`);Me(r.page,n,e,`reply ${String(t.id)}`);let o=Pe(t,n),s=a.get(o.commentId);if(!s||s.pageId!==n)throw new u(`Reply ${o.id} references a comment outside the project snapshot`);return o});return F(o,`reply`),{projectId:e,pages:[...r.values()].sort((e,t)=>e.pathname.localeCompare(t.pathname)||e.id.localeCompare(t.id)),comments:i,replies:o}}function Me(e,t,n,r){let i=I(e,`${r} page`);if(L(i.id,`${r} page id`)!==t)throw new u(`${r} escaped its page relation`);if(L(I(i.project,`${r} project`).id,`${r} project id`)!==n)throw new u(`${r} escaped its project scope`)}function Ne(e,t){let n=I(e,`comment`),r=L(n.id,`comment id`);if(L(n.pageId,`comment ${r} pageId`)!==t)throw new u(`Comment ${r} escaped its page scope`);L(n.authorAuthUserId,`comment ${r} authorAuthUserId`);let i=!(Object.hasOwn(n,`anchor`)&&Object.hasOwn(n,`target`)),a=i?f(n,n.targetElements,`comment ${r} target`):te(n.target,`comment ${r} target`),o=i?{...a.anchor}:Fe(n.anchor,`comment ${r} anchor`);if(!Ie(o,a.anchor))throw new u(`Comment ${r} has inconsistent anchors`);let s=n.status;if(s!==`open`&&s!==`resolved`)throw new u(`Comment ${r} has an invalid status`);let c=z(n.createdAt,`comment ${r} createdAt`),l=z(n.updatedAt,`comment ${r} updatedAt`);if(l<c)throw new u(`Comment ${r} updatedAt precedes createdAt`);let d=He(n.resolvedAt,`comment ${r} resolvedAt`),m=Ue(n.resolvedById,`comment ${r} resolvedById`);if(s===`open`&&(d!==void 0||m!==void 0))throw new u(`Open comment ${r} contains resolution metadata`);if(s===`resolved`&&(d===void 0||m===void 0||d!==l))throw new u(`Resolved comment ${r} has invalid workflow metadata`);return{id:r,pageId:t,...We(n.pageNumber,`comment ${r} pageNumber`),authorId:L(n.authorId,`comment ${r} authorId`),authorName:L(n.authorName,`comment ${r} authorName`),body:g(n.body,`comment ${r} body`),anchor:o,target:a,...i?Le(p(n.scopeEntries)):n.scope==null?{}:{scope:ne(n.scope)},status:s,workflowRevision:Ve(n.workflowRevision,`comment ${r} workflowRevision`),createdAt:c,updatedAt:l,...d===void 0?{}:{resolvedAt:d},...m===void 0?{}:{resolvedById:m}}}function Pe(e,t){let n=I(e,`reply`),r=L(n.id,`reply id`);if(L(n.pageId,`reply ${r} pageId`)!==t)throw new u(`Reply ${r} escaped its page scope`);L(n.authorAuthUserId,`reply ${r} authorAuthUserId`);let i=z(n.createdAt,`reply ${r} createdAt`),a=z(n.updatedAt,`reply ${r} updatedAt`);if(a<i)throw new u(`Reply ${r} updatedAt precedes createdAt`);return{id:r,commentId:L(n.commentId,`reply ${r} commentId`),authorId:L(n.authorId,`reply ${r} authorId`),authorName:L(n.authorName,`reply ${r} authorName`),body:g(n.body,`reply ${r} body`),createdAt:i,updatedAt:a}}function Fe(e,t){let n=I(e,t);if(Object.keys(n).length!==5||!Object.hasOwn(n,`selector`)||!Object.hasOwn(n,`offsetX`)||!Object.hasOwn(n,`offsetY`)||!Object.hasOwn(n,`viewportX`)||!Object.hasOwn(n,`viewportY`))throw new u(`${t} has invalid fields`);return{selector:Be(n.selector,`${t} selector`),offsetX:R(n.offsetX,`${t} offsetX`),offsetY:R(n.offsetY,`${t} offsetY`),viewportX:R(n.viewportX,`${t} viewportX`),viewportY:R(n.viewportY,`${t} viewportY`)}}function Ie(e,t){return e.selector===t.selector&&e.offsetX===t.offsetX&&e.offsetY===t.offsetY&&e.viewportX===t.viewportX&&e.viewportY===t.viewportY}function Le(e){return e===void 0?{}:{scope:e}}function F(e,t){let n=new Set;for(let r of e){if(n.has(r.id))throw new u(`Duplicate ${t} ${r.id}`);n.add(r.id)}}function Re(e){let t=ze(e).toLowerCase();return t.includes(`expired`)||t.includes(`token`)?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:t.includes(`permission`)||t.includes(`forbidden`)||t.includes(`unauthorized`)?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:`transport`,recovery:`retry`,clearSnapshot:!0}}function ze(e){return e instanceof Error?e.message:e&&typeof e==`object`&&`message`in e?String(e.message):``}function I(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new u(`${t} is missing or invalid`);return e}function Be(e,t){if(typeof e!=`string`)throw new u(`${t} is invalid`);return e}function L(e,t){let n=Be(e,t);if(!n.trim())throw new u(`${t} is empty`);return n}function R(e,t){if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw new u(`${t} is invalid`);return e}function z(e,t){if(!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw new u(`${t} is invalid`);return e}function Ve(e,t){if(!Number.isSafeInteger(e)||e<0)throw new u(`${t} is invalid`);return e}function He(e,t){return e==null?void 0:z(e,t)}function Ue(e,t){return e==null?void 0:L(e,t)}function We(e,t){if(e==null)return{};let n=Ve(e,t);if(n<1)throw new u(`${t} is invalid`);return{pageNumber:n}}Object.freeze({field:`createdAt`,direction:`desc`,tieBreaker:`id`,tieDirection:`desc`}),Object.freeze({comments:200,replies:1e3,sourceContexts:200});var Ge=class{db;session;roomCredential;#e=new Map;constructor(e,t,n){this.db=e,this.session=t,this.roomCredential=n}subscribe(e,t,n,r){let i=[],a=[],o=!1,s=[],c=()=>{o||n({pageId:e,peers:structuredClone(i),messages:structuredClone(a)})};if(t.cursors){let n=rt(e,t.roomId),a,l,u=this.roomCredential?.id===t.roomId?this.roomCredential:void 0,d=u??{id:t.roomId,expiresAt:2**53-1,refresh:async()=>void 0},f=t=>{let o=this.db.joinRoom(`visualReview`,t),s=o.subscribePresence({},e=>{if(e.error){r?.(at(e.error));return}i=Object.values(e.peers).map(e=>qe(e)).filter(e=>e!==null).sort((e,t)=>e.displayName.localeCompare(t.displayName)||e.peerId.localeCompare(t.peerId)),c()}),l=a;a=()=>{s(),o.leaveRoom()},this.#e.set(n,{pageId:e,roomId:t,publishPresence:e=>o.publishPresence(e)}),l?.()},p=()=>{if(!u||o)return;let e=Math.max(1e3,d.expiresAt-Date.now()+250);l=setTimeout(()=>{m()},e)},m=async()=>{try{let e=await d.refresh();if(o||!e)return;d={...e,refresh:d.refresh},u&&(u.id=e.id,u.expiresAt=e.expiresAt),f(e.id),p()}catch(e){if(o)return;r?.(at(e)),o||(l=setTimeout(()=>{m()},5e3))}};f(d.id),p(),s.push(()=>{l&&clearTimeout(l),this.#e.delete(n),a?.()})}return t.chat&&s.push(this.db.subscribeQuery(Ke(e,this.session.authUserId),t=>{if(t.error){r?.(at(t.error));return}if(t.data)try{a=t.data.reviewMessages.map(t=>Xe(t,e)).sort(it),c()}catch{r?.({type:`error`,code:`data-integrity`,recovery:`retry`,clearSnapshot:!0})}})),queueMicrotask(c),()=>{if(!o){o=!0;for(let e of s.reverse())try{e()}catch{}}}}publishPresence(e,t,n){let r=this.#e.get(rt(e,t));r&&r.publishPresence({reviewerId:this.session.reviewerId,displayName:this.session.displayName,color:n.color,active:n.active,pathname:Ye(n.pathname),...n.cursorX===void 0?{}:{cursorX:n.cursorX},...n.cursorY===void 0?{}:{cursorY:n.cursorY},...n.viewportWidth===void 0?{}:{viewportWidth:n.viewportWidth},...n.viewportHeight===void 0?{}:{viewportHeight:n.viewportHeight},cursorChat:Je(n.cursorChat)})}async sendMessage(e,t){throw Error(`Persisted review messages are no longer supported`)}};function Ke(e,t){return{reviewMessages:{$:{where:{pageId:e},order:{createdAt:`desc`},limit:200}},$users:{$:{where:{id:t}},activeReviewInvitations:{project:{}}}}}function qe(e){let t=$e(e.reviewerId,128),n=$e(e.displayName,512),r=typeof e.color==`string`&&/^#[0-9a-f]{6}$/iu.test(e.color)?e.color:null;if(!t||!n||!r||typeof e.active!=`boolean`)return null;let i=et(e.cursorX),a=et(e.cursorY),o=tt(e.viewportWidth),s=tt(e.viewportHeight),c=Je(e.cursorChat),l=Ye(e.pathname);return{peerId:e.peerId,reviewerId:t,displayName:n,color:r,active:e.active,pathname:l,...i===void 0?{}:{cursorX:i},...a===void 0?{}:{cursorY:a},...o===void 0?{}:{viewportWidth:o},...s===void 0?{}:{viewportHeight:s},...c?{cursorChat:c}:{}}}function Je(e){return typeof e==`string`?e.trim().slice(0,280):``}function Ye(e){if(typeof e!=`string`)return`/`;let t=e.trim();return t.startsWith(`/`)?t.slice(0,2e3):`/`}function Xe(e,t){let n=B(e.id,`Review message id`,128);if(B(e.pageId,`Review message pageId`,128)!==t)throw Error(`Review message page mismatch`);return{id:n,pageId:t,pathname:Qe(e.pathname),authorId:B(e.authorId,`Review message authorId`,128),authorName:B(e.authorName,`Review message authorName`,512),body:Ze(e.body),createdAt:nt(e.createdAt,`Review message createdAt`),updatedAt:nt(e.updatedAt,`Review message updatedAt`)}}function Ze(e){return B(e,`Review message body`,4e3)}function Qe(e){let t=B(e,`Review message pathname`,2e3);if(!t.startsWith(`/`))throw Error(`Review message pathname is invalid`);return t}function B(e,t,n){if(typeof e!=`string`)throw Error(`${t} is invalid`);let r=e.trim();if(!r||r.length>n)throw Error(`${t} is invalid`);return r}function $e(e,t){if(typeof e!=`string`)return null;let n=e.trim();return n&&n.length<=t?n:null}function et(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function tt(e){let t=et(e);return t!==void 0&&t>0?t:void 0}function nt(e,t){if(!Number.isSafeInteger(e)||e<0)throw Error(`${t} is invalid`);return e}function rt(e,t){return JSON.stringify([e,t])}function it(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function at(e){let t=e&&typeof e==`object`&&`code`in e?String(e.code):``;if(/^INVITATION_(?:EXPIRED|NOT_FOUND|REQUIRED|REVOKED)$/u.test(t))return{type:`access-lost`,code:t===`INVITATION_EXPIRED`?`session-expired`:`membership-revoked`,recovery:`reauthenticate`,clearSnapshot:!0};let n=String(e instanceof Error||e&&typeof e==`object`&&`message`in e?e.message:e).toLowerCase();return n.includes(`expired`)||n.includes(`token`)?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:n.includes(`permission`)||n.includes(`forbidden`)||n.includes(`unauthorized`)?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:`transport`,recovery:`retry`,clearSnapshot:!0}}Object.freeze({field:`createdAt`,direction:`desc`,tieBreaker:`id`,tieDirection:`desc`});var V=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ReviewerCommentSaveError`}};function ot(e,t){let n=e.replace(/\/+$/,``),r=async(e,r)=>{let i=await t();if(!i)throw new V(`AUTH_REQUIRED`,`로그인 세션이 만료되었습니다. 새로고침 후 다시 시도해 주세요.`);let a;try{a=await fetch(`${n}${e}`,{method:`POST`,headers:{authorization:`Bearer ${i}`,"content-type":`application/json`},body:JSON.stringify(r)})}catch{throw new V(`NETWORK`,`리뷰 서버에 연결하지 못했습니다. 연결을 확인하고 다시 시도해 주세요.`)}if(!a.ok)throw new V(...await ct(a))};return{createComment:({target:e,...t})=>{let{environment:n,...i}=e;return r(`/v1/comments`,{...t,target:i,...n?{environment:n}:{}})},createReply:e=>r(`/v1/replies`,e),uploadScreenshot:async({pageId:e,commentId:r,screenshot:i})=>{let a=await t();if(!a)throw new V(`AUTH_REQUIRED`,`로그인 세션이 만료되어 위치 캡처를 저장하지 못했습니다.`);let o;try{o=await fetch(`${n}/v1/comments/${encodeURIComponent(r)}/screenshot`,{method:`PUT`,headers:{authorization:`Bearer ${a}`,"content-type":i.contentType,"x-review-page-id":e,"x-review-image-width":String(i.width),"x-review-image-height":String(i.height)},body:st(i.bytes)})}catch{throw new V(`NETWORK`,`리뷰 서버에 연결하지 못해 위치 캡처를 저장하지 못했습니다.`)}if(!o.ok)throw new V(...await ct(o))}}}function st(e){let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}async function ct(e){let t=e.status>=500?`리뷰 서버가 코멘트를 저장하지 못했습니다. 잠시 후 다시 시도해 주세요.`:`코멘트를 저장하지 못했습니다.`;try{let n=await e.json();if(!n||typeof n!=`object`)return[`UNKNOWN`,t];let r=n;return[typeof r.error==`string`?r.error:`UNKNOWN`,typeof r.message==`string`&&r.message.trim()?r.message:t]}catch{return[`UNKNOWN`,t]}}var H=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ReviewBootstrapError`}};function lt(e,t={}){let n=e.trim();if(!n)throw Error(`InstantDB app ID is required`);return{async resolve(e){let{db:r,user:i}=await ut(n,e,t);t.resolveReviewPage&&await t.resolveReviewPage({refreshToken:i.refresh_token,invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname,signal:e.signal});let{data:a}=await r.queryOnce({reviewers:{$:{where:{authUserId:i.id}}},reviewPages:{},invitations:{}}),o=ft(a.invitations,a.reviewers,a.reviewPages,{invitationId:e.invitationId,authUserId:i.id,email:i.email??``,location:e.location,now:Date.now()});if(!o.ok)throw new H(o.code,Dt(o.code));let s={authUserId:i.id,reviewerId:o.reviewer.id,projectId:o.reviewer.projectId,invitationId:e.invitationId,email:o.reviewer.email||i.email||``,displayName:o.reviewer.displayName||i.email||`Reviewer`,role:o.reviewer.role===`agency`?`agency`:`reviewer`},c=o.page.id,l=e.collaboration?.scopeId,u=(e.collaboration?.cursors===!0||e.collaboration?.chat===!0)&&t.resolveCollaborationRoom?await t.resolveCollaborationRoom({refreshToken:i.refresh_token,invitationId:e.invitationId,pageId:o.page.id,scopeId:e.collaboration.scopeId,signal:e.signal}):void 0,d=u&&t.resolveCollaborationRoom?{...u,refresh:async()=>{let n=await r.getAuth();if(!(!n?.refresh_token||l===void 0))return t.resolveCollaborationRoom?.({refreshToken:n.refresh_token,invitationId:e.invitationId,pageId:c,scopeId:l,signal:new AbortController().signal})}}:void 0,f=0;return{pageId:o.page.id,resolvePage:async n=>{let i=++f,a=()=>i!==f||n.signal.aborted,o=(e,t,n)=>({pageId:e,...n&&d?{collaborationRoomId:n.id}:{},commit:()=>{a()||(c=e,t!==void 0&&(l=t),!(!n||!d)&&(d.id=n.id,d.expiresAt=n.expiresAt))}});if(n.location.origin!==e.location.origin)throw new H(`PAGE_NOT_FOUND`,Dt(`PAGE_NOT_FOUND`));let{data:u}=await r.queryOnce({reviewPages:{$:{where:{projectId:s.projectId}}}});if(a())throw G();let p=Tt(n.location.pathname),m=pt(u.reviewPages,s.projectId,n.location.origin,p);if(!m&&t.resolveReviewPage){let i=await r.getAuth();if(a())throw G();if(!i?.refresh_token)throw Error(`리뷰 세션이 만료되어 페이지를 등록할 수 없습니다.`);if(await t.resolveReviewPage({refreshToken:i.refresh_token,invitationId:e.invitationId,origin:n.location.origin,pathname:p,signal:n.signal}),a()||({data:u}=await r.queryOnce({reviewPages:{$:{where:{projectId:s.projectId}}}}),a()))throw G();m=pt(u.reviewPages,s.projectId,n.location.origin,p)}if(!m)throw new H(`PAGE_NOT_FOUND`,Dt(`PAGE_NOT_FOUND`));if(n.collaboration?.cursors!==!0&&n.collaboration?.chat!==!0||d===void 0||t.resolveCollaborationRoom===void 0||!n.collaboration)return o(m.id,n.collaboration?.scopeId);let h=await r.getAuth();if(a())throw G();if(!h?.refresh_token)throw Error(`리뷰 세션이 만료되어 실시간 협업 연결을 갱신할 수 없습니다.`);let ee=await t.resolveCollaborationRoom({refreshToken:h.refresh_token,invitationId:e.invitationId,pageId:m.id,scopeId:n.collaboration.scopeId,signal:n.signal});if(a())throw G();return o(m.id,n.collaboration.scopeId,ee)},session:s,repository:new De(r,s,{...t.serviceUrl===void 0?{}:{commentTransport:ot(t.serviceUrl,async()=>(await r.getAuth())?.refresh_token??null)}}),...e.collaboration?.cursors===!0||e.collaboration?.chat===!0?{collaborationRepository:new Ge(r,s,d)}:{},...(e.collaboration?.cursors===!0||e.collaboration?.chat===!0)&&d?{collaborationRoomId:d.id}:{},allowedStagingHosts:[e.location.hostname],sessionScope:`browser`}}}}async function ut(e,t,n){let r=(n.databaseFactory??Ee)(e),i=!!t.emailToken,a;if(t.emailToken){if(!n.redeemEmailInvitation)throw new H(`INVITATION_EMAIL_REQUIRED`,`이 리뷰는 이메일 초대 링크에서만 시작할 수 있습니다.`);await _t(t.authHost,t.signal,t.styleNonce);let e=await n.redeemEmailInvitation({invitationId:t.invitationId,emailToken:t.emailToken,origin:t.location.origin,pathname:t.location.pathname,signal:t.signal});await U(t.signal,()=>r.getAuth())&&await U(t.signal,async()=>r.auth.signOut()),await U(t.signal,async()=>r.auth.signInWithToken(e));let i=await U(t.signal,()=>r.getAuth());if(!i)throw Error(`인증 세션을 확인할 수 없습니다.`);a=i}else a=await mt(r,t.signal);if(!i)try{await dt(n.acceptInvitation,{refreshToken:a.refresh_token,invitationId:t.invitationId,suggestedDisplayName:St(a.email),authHost:t.authHost,signal:t.signal,styleNonce:t.styleNonce})}catch(e){throw Ct(e,`INVITATION_EMAIL_MISMATCH`)?new H(`INVITATION_EMAIL_REQUIRED`,`초대받은 이메일의 링크를 다시 열어 주세요.`):e}return{db:r,user:a}}async function dt(e,t){if(!e)return;let n={refreshToken:t.refreshToken,invitationId:t.invitationId,signal:t.signal};try{await e(n);return}catch(e){if(!Ct(e,`DISPLAY_NAME_REQUIRED`))throw e}let r=await gt(t.authHost,t.signal,t.suggestedDisplayName,t.styleNonce);await e({...n,displayName:r})}function ft(e,t,n,r){let i=e.find(({id:e})=>e===r.invitationId);if(!i||Et(i.email)!==Et(r.email))return{ok:!1,code:`INVITATION_REQUIRED`};if(i.status===`revoked`)return{ok:!1,code:`INVITATION_REVOKED`};if(i.status===`expired`||i.expiresAt<=r.now)return{ok:!1,code:`INVITATION_EXPIRED`};if(i.status!==`accepted`)return{ok:!1,code:`INVITATION_NOT_ACCEPTED`};let a=t.find(e=>e.authUserId===r.authUserId&&e.projectId===i.projectId);if(!a)return{ok:!1,code:`MEMBERSHIP_REQUIRED`};let o=Tt(r.location.pathname),s=pt(n,i.projectId,r.location.origin,o);return s?{ok:!0,invitation:i,reviewer:a,page:s}:{ok:!1,code:`PAGE_NOT_FOUND`}}function pt(e,t,n,r){let i=e.filter(e=>e.projectId===t&&Tt(e.pathname)===r),a=i.filter(({stagingOrigin:e})=>e===n);return(a.length>0?a:i).sort((e,t)=>(e.createdAt??2**53-1)-(t.createdAt??2**53-1)||e.id.localeCompare(t.id))[0]}async function mt(e,t){let n=await U(t,()=>e.getAuth());if(n)return n;throw new H(`INVITATION_EMAIL_REQUIRED`,`초대받은 이메일의 링크를 열어 주세요.`)}async function U(e,t){ht(e);let n=await t();return ht(e),n}function ht(e){if(e.aborted)throw K()}function gt(e,t,n=``,r){if(t.aborted)return Promise.reject(K());let i=vt(e);i.replaceChildren(yt(i,r),bt(i));let a=i.querySelector(`form`),o=a.elements.namedItem(`displayName`),s=i.querySelector(`button`),c=i.querySelector(`.error`);return o.value=n.trim().slice(0,120),o.focus(),o.select(),new Promise((e,n)=>{let r=!1,l=e=>{r||(r=!0,t.removeEventListener(`abort`,u),i.removeEventListener(`keydown`,p),a.removeEventListener(`submit`,f),e())},u=()=>l(()=>n(K())),d=()=>{let t=o.value.trim();if(!t){c.textContent=`이름을 입력해 주세요.`,o.focus();return}if(t.length>120){c.textContent=`이름은 120자 이하여야 합니다.`,o.focus();return}c.textContent=``,s.disabled=!0,a.setAttribute(`aria-busy`,`true`),l(()=>e(t))},f=e=>{e.preventDefault(),d()},p=e=>{let t=e;if(t.key===`Escape`){t.preventDefault(),u();return}if(t.key===`Tab`){wt(i,t);return}t.key===`Enter`&&!t.isComposing&&t.target===o&&(t.preventDefault(),d())};t.addEventListener(`abort`,u,{once:!0}),i.addEventListener(`keydown`,p),a.addEventListener(`submit`,f)})}function _t(e,t,n){if(t.aborted)return Promise.reject(K());let r=vt(e);r.replaceChildren(yt(r,n),xt(r));let i=r.querySelector(`form`),a=r.querySelector(`button`);return a.focus(),new Promise((e,n)=>{let o=!1,s=e=>{o||(o=!0,t.removeEventListener(`abort`,c),r.removeEventListener(`keydown`,u),i.removeEventListener(`submit`,l),e())},c=()=>s(()=>n(K())),l=t=>{t.preventDefault(),a.disabled=!0,i.setAttribute(`aria-busy`,`true`),s(e)},u=e=>{let t=e;t.key===`Escape`?(t.preventDefault(),c()):t.key===`Tab`&&wt(r,t)};t.addEventListener(`abort`,c,{once:!0}),r.addEventListener(`keydown`,u),i.addEventListener(`submit`,l)})}function vt(e){return e.shadowRoot??e.attachShadow({mode:`open`})}function yt(e,t){let n=e.ownerDocument.createElement(`style`);return t&&(n.nonce=t),n.textContent=Ot,n}function bt(e){let t=e.ownerDocument,n=t.createElement(`form`);n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-labelledby`,`visual-review-name-title`),n.setAttribute(`aria-describedby`,`visual-review-name-description`);let r=W(t,`p`,`01.works`,`eyebrow`),i=W(t,`h2`,`표시 이름`);i.id=`visual-review-name-title`;let a=W(t,`p`,`피드백에 이 이름이 표시됩니다.`,`description`);a.id=`visual-review-name-description`;let o=W(t,`label`,`이름`);o.htmlFor=`visual-review-display-name`;let s=t.createElement(`input`);s.id=`visual-review-display-name`,s.name=`displayName`,s.autocomplete=`name`,s.maxLength=120,s.required=!0;let c=W(t,`p`,``,`error`);c.setAttribute(`role`,`alert`);let l=W(t,`button`,`리뷰 시작`);return l.type=`submit`,n.append(r,i,a,o,s,c,l),n}function xt(e){let t=e.ownerDocument,n=t.createElement(`form`);n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-labelledby`,`visual-review-invitation-title`),n.setAttribute(`aria-describedby`,`visual-review-invitation-description`);let r=W(t,`p`,`01.works`,`eyebrow`),i=W(t,`h2`,`리뷰 초대`);i.id=`visual-review-invitation-title`;let a=W(t,`p`,`초대받은 프로젝트를 열고 화면에 피드백을 남길 수 있습니다.`,`description`);a.id=`visual-review-invitation-description`;let o=W(t,`button`,`리뷰 시작`);return o.type=`submit`,n.append(r,i,a,o),n}function W(e,t,n,r){let i=e.createElement(t);return i.textContent=n,r&&(i.className=r),i}function St(e){return e?.split(`@`)[0]?.trim().slice(0,120)??``}function Ct(e,t){return!!(e&&typeof e==`object`&&`code`in e&&e.code===t)}function G(){return new DOMException(`Aborted`,`AbortError`)}function K(){return new H(`AUTH_CANCELLED`,`리뷰 로그인이 취소되었습니다.`)}function wt(e,t){let n=Array.from(e.querySelectorAll(`input:not([disabled]),button:not([disabled])`)).filter(e=>!e.closest(`[hidden]`));if(n.length===0)return;let r=n[0],i=n.at(-1);t.shiftKey&&e.activeElement===r?(t.preventDefault(),i.focus()):!t.shiftKey&&e.activeElement===i&&(t.preventDefault(),r.focus())}function Tt(e){return e.replace(/\/+$/,``)||`/`}function Et(e){return e.trim().toLowerCase()}function Dt(e){switch(e){case`INVITATION_REQUIRED`:return`현재 계정과 일치하는 리뷰 초대를 찾을 수 없습니다.`;case`INVITATION_NOT_ACCEPTED`:return`아직 수락되지 않은 리뷰 초대입니다.`;case`INVITATION_REVOKED`:return`취소된 리뷰 초대입니다. 계속 검토하려면 담당자에게 다시 요청하세요.`;case`INVITATION_EXPIRED`:return`만료된 리뷰 초대입니다. 담당자에게 새 링크를 요청하세요.`;case`MEMBERSHIP_REQUIRED`:return`이 프로젝트의 reviewer membership이 없습니다.`;case`PAGE_NOT_FOUND`:return`이 페이지는 아직 리뷰 대상이 아닙니다. 담당자에게 문의하세요.`}}const Ot=`
1
+ import{r as e}from"./install-Dh6WT91E.js";import{t}from"./embedded-source-DSDHbbeU.js";import{i as n,init as r}from"@instantdb/core";import{makeFunctionReference as i}from"convex/server";import{ConvexClient as a}from"convex/browser";const o=131072,s=32768,c=4096,l=1e3;var u=class extends Error{constructor(e,t){super(e,t),this.name=`InstantCaptureIntegrityError`}};function d(e){let t=re(e,`comment target`,!0),n={kind:t.kind,anchor:fe(t.anchor),region:he(t.region),elements:t.elements.map(e=>({selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,rect:he(e.rect),source:null,componentStack:[]})),pageUrl:t.pageUrl,pageTitle:t.pageTitle,capturedAt:t.capturedAt,...t.environment?{environment:oe(t.environment)}:{}},r={elements:t.elements.map(e=>({selector:e.selector,source:e.source?ge(e.source):null,componentStack:e.componentStack.map(ge)})),...t.sourceProvenance?{sourceProvenance:_e(t.sourceProvenance)}:{}};T(n,o,`Public target`);let i=Ce(r,65536,`Source context`);return{publicTarget:n,commentFields:m(n),targetElements:n.elements.map(h),sourceContextJson:i}}function f(e,t,n){let r=y(e,n),i={selector:b(r.anchorSelector,`${n} anchor selector`,c),offsetX:C(r.anchorOffsetX,`${n} anchor offsetX`),offsetY:C(r.anchorOffsetY,`${n} anchor offsetY`),viewportX:C(r.anchorViewportX,`${n} anchor viewportX`),viewportY:C(r.anchorViewportY,`${n} anchor viewportY`)},a=te({kind:r.targetKind,anchor:i,region:{pageX:r.targetPageX,pageY:r.targetPageY,width:r.targetWidth,height:r.targetHeight,viewportX:r.targetViewportX,viewportY:r.targetViewportY,viewportWidth:r.targetViewportWidth,viewportHeight:r.targetViewportHeight},elements:[],pageUrl:me({origin:x(r.targetPageOrigin,`${n} page origin`,1024),pathname:x(r.targetPagePathname,`${n} page pathname`,4096),search:b(r.targetPageSearch,`${n} page search`,1024),hash:b(r.targetPageHash,`${n} page hash`,1024)}),pageTitle:r.targetPageTitle,capturedAt:r.targetCapturedAt,...ae(r,n)},n),o=ee(t,`${n} elements`),s=a;for(let e of o)try{s=te({...a,elements:[...s.elements,e]},n)}catch{}return s}function p(e){if(!Array.isArray(e)||e.length===0)return;let t=[...e].map(e=>{try{let t=y(e,`Comment scope entry`);return{row:t,ordinal:be(t.ordinal,`Comment scope entry ordinal`,0,19),id:typeof t.id==`string`?t.id:``}}catch{return null}}).filter(e=>e!==null).sort((e,t)=>e.ordinal-t.ordinal||e.id.localeCompare(t.id)),n={},r=new Set;for(let{row:e,ordinal:i}of t)if(!r.has(i)){r.add(i);try{let t=x(e.key,`Comment scope key`,256);if(Object.hasOwn(n,t))continue;switch(e.valueType){case`string`:n[t]=b(e.stringValue,`Comment scope ${t}`,l);break;case`number`:n[t]=S(e.numberValue,`Comment scope ${t}`);break;case`boolean`:if(typeof e.booleanValue!=`boolean`)throw E(`Comment scope ${t} is invalid`);n[t]=e.booleanValue;break;case`null`:n[t]=null;break;default:throw E(`Comment scope ${t} is invalid`)}}catch{}}if(Object.keys(n).length!==0)try{return T(n,s,`Comment scope`),n}catch{return}}function m(e){let t=new URL(e.pageUrl);return{anchorSelector:e.anchor.selector,anchorOffsetX:e.anchor.offsetX,anchorOffsetY:e.anchor.offsetY,anchorViewportX:e.anchor.viewportX,anchorViewportY:e.anchor.viewportY,targetKind:e.kind,targetPageX:e.region.pageX,targetPageY:e.region.pageY,targetWidth:e.region.width,targetHeight:e.region.height,targetViewportX:e.region.viewportX,targetViewportY:e.region.viewportY,targetViewportWidth:e.region.viewportWidth,targetViewportHeight:e.region.viewportHeight,targetPageOrigin:t.origin,targetPagePathname:pe(t.pathname),targetPageSearch:t.search.slice(1),targetPageHash:t.hash.slice(1),targetPageTitle:e.pageTitle,targetCapturedAt:e.capturedAt,...e.environment?{environmentBrowser:e.environment.browser,environmentOperatingSystem:e.environment.operatingSystem,environmentDeviceType:e.environment.deviceType,environmentScreenWidth:e.environment.screenWidth,environmentScreenHeight:e.environment.screenHeight,environmentDevicePixelRatio:e.environment.devicePixelRatio}:{}}}function h(e,t){return{ordinal:t,selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,pageX:e.rect.pageX,pageY:e.rect.pageY,width:e.rect.width,height:e.rect.height,viewportX:e.rect.viewportX,viewportY:e.rect.viewportY,viewportWidth:e.rect.viewportWidth,viewportHeight:e.rect.viewportHeight}}function ee(e,t){if(!Array.isArray(e)||e.length===0)return[];let n=[...e].map(e=>{try{let n=y(e,t);return{row:n,ordinal:be(n.ordinal,`${t} ordinal`,0,7),id:typeof n.id==`string`?n.id:``}}catch{return null}}).filter(e=>e!==null).sort((e,t)=>e.ordinal-t.ordinal||e.id.localeCompare(t.id)),r=[],i=new Set;for(let{row:e,ordinal:a}of n)if(!i.has(a)){i.add(a);try{r.push(se({selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,rect:{pageX:e.pageX,pageY:e.pageY,width:e.width,height:e.height,viewportX:e.viewportX,viewportY:e.viewportY,viewportWidth:e.viewportWidth,viewportHeight:e.viewportHeight},source:null,componentStack:[]},`${t}[${a}]`,!1))}catch{}}return r}function te(e,t){return re(e,t,!1)}function g(e,t=`Comment body`){return x(e,t,2e4)}function ne(e){if(e==null)return;let t=y(e,`Comment scope`);if(Object.keys(t).length>20)throw E(`Comment scope has too many fields`);let n={};for(let[e,r]of Object.entries(t)){if(!e.trim()||e.length>256)throw E(`Comment scope has an invalid key`);if(typeof r==`string`){if(r.length>l)throw E(`Comment scope ${e} is too long`);n[e]=r}else if(typeof r==`number`)n[e]=S(r,`Comment scope ${e}`);else if(typeof r==`boolean`||r===null)n[e]=r;else throw E(`Comment scope ${e} is invalid`)}return T(n,s,`Comment scope`),n}function re(e,t,n){let r=v(e,t,[`kind`,`anchor`,`region`,`elements`,`pageUrl`,`pageTitle`,`capturedAt`,`environment`,`sourceProvenance`],[`environment`,`sourceProvenance`]),i=r.kind;if(i!==`element`&&i!==`region`&&i!==`viewport`)throw E(`${t} kind is invalid`);let a=ve(r.elements,`${t} elements`);if(a.length>8)throw E(`${t} contains too many elements`);if(!n&&r.sourceProvenance!=null)throw E(`${t} exposes source provenance`);let s=x(r.pageUrl,`${t} pageUrl`,8192);Se(s,`${t} pageUrl`);let c={kind:i,anchor:ce(r.anchor,`${t} anchor`),region:le(r.region,`${t} region`),elements:a.map((e,r)=>se(e,`${t} elements[${r}]`,n)),pageUrl:s,pageTitle:b(r.pageTitle,`${t} pageTitle`,l),capturedAt:w(r.capturedAt,`${t} capturedAt`),...r.environment==null?{}:{environment:ie(r.environment,`${t} environment`)},...n&&r.sourceProvenance!=null?{sourceProvenance:de(r.sourceProvenance,`${t} provenance`)}:{}};return T(c,n?196608:o,t),c}function ie(e,t){let n=v(e,t,[`browser`,`operatingSystem`,`deviceType`,`screenWidth`,`screenHeight`,`devicePixelRatio`]),r=n.deviceType;if(r!==`desktop`&&r!==`tablet`&&r!==`mobile`&&r!==`unknown`)throw E(`${t} deviceType is invalid`);return{browser:x(n.browser,`${t} browser`,120),operatingSystem:x(n.operatingSystem,`${t} operatingSystem`,120),deviceType:r,screenWidth:_(n.screenWidth,`${t} screenWidth`,1e5),screenHeight:_(n.screenHeight,`${t} screenHeight`,1e5),devicePixelRatio:_(n.devicePixelRatio,`${t} devicePixelRatio`,100)}}function ae(e,t){if([e.environmentBrowser,e.environmentOperatingSystem,e.environmentDeviceType,e.environmentScreenWidth,e.environmentScreenHeight,e.environmentDevicePixelRatio].every(e=>e==null))return{};try{return{environment:ie({browser:e.environmentBrowser,operatingSystem:e.environmentOperatingSystem,deviceType:e.environmentDeviceType,screenWidth:e.environmentScreenWidth,screenHeight:e.environmentScreenHeight,devicePixelRatio:e.environmentDevicePixelRatio},`${t} environment`)}}catch{return{}}}function oe(e){return{...e}}function _(e,t,n){let r=S(e,t);if(r<=0||r>n)throw E(`${t} is invalid`);return r}function se(e,t,n){let r=v(e,t,[`selector`,`tagName`,`textPreview`,`rect`,`source`,`componentStack`]),i=ve(r.componentStack,`${t} componentStack`);if(i.length>32)throw E(`${t} componentStack is too large`);if(!n&&(r.source!=null||i.length>0))throw E(`${t} exposes source metadata`);return{selector:x(r.selector,`${t} selector`,c),tagName:x(r.tagName,`${t} tagName`,128),textPreview:b(r.textPreview,`${t} textPreview`,l),rect:le(r.rect,`${t} rect`),source:n&&r.source!=null?ue(r.source,`${t} source`):null,componentStack:n?i.map((e,n)=>ue(e,`${t} stack[${n}]`)):[]}}function ce(e,t){let n=v(e,t,[`selector`,`offsetX`,`offsetY`,`viewportX`,`viewportY`]);return{selector:b(n.selector,`${t} selector`,c),offsetX:C(n.offsetX,`${t} offsetX`),offsetY:C(n.offsetY,`${t} offsetY`),viewportX:C(n.viewportX,`${t} viewportX`),viewportY:C(n.viewportY,`${t} viewportY`)}}function le(e,t){let n=v(e,t,[`pageX`,`pageY`,`width`,`height`,`viewportX`,`viewportY`,`viewportWidth`,`viewportHeight`]),r={pageX:S(n.pageX,`${t} pageX`),pageY:S(n.pageY,`${t} pageY`),width:S(n.width,`${t} width`),height:S(n.height,`${t} height`),viewportX:S(n.viewportX,`${t} viewportX`),viewportY:S(n.viewportY,`${t} viewportY`),viewportWidth:S(n.viewportWidth,`${t} viewportWidth`),viewportHeight:S(n.viewportHeight,`${t} viewportHeight`)};if(r.width<0||r.height<0||r.viewportWidth<0||r.viewportHeight<0)throw E(`${t} has a negative dimension`);return r}function ue(e,n){let r=v(e,n,[`filePath`,`lineNumber`,`columnNumber`,`componentName`,`origin`,`generated`],[`generated`]),i=r.origin;if(i!==`app`&&i!==`shared-ui`&&i!==`dependency`&&i!==`generated`&&i!==`unknown`)throw E(`${n} origin is invalid`);let a=x(r.filePath,`${n} filePath`,c);return{filePath:a,lineNumber:xe(r.lineNumber,`${n} lineNumber`),columnNumber:xe(r.columnNumber,`${n} columnNumber`),componentName:r.componentName==null?null:x(r.componentName,`${n} componentName`,512),origin:t(a)}}function de(e,t){let n=v(e,t,[`provider`,`build`,`resolvedAt`]),r=n.provider;if(r!==`react-grab`&&r!==`embedded`&&r!==`custom`)throw E(`${t} provider is invalid`);let i=v(n.build,`${t} build`,[`buildId`,`gitCommit`,`generatedAt`,`mode`],[`generatedAt`]),a=i.mode;if(a!==`development`&&a!==`preview`&&a!==`production`)throw E(`${t} build mode is invalid`);return{provider:r,build:{buildId:x(i.buildId,`${t} buildId`,512),gitCommit:i.gitCommit==null?null:x(i.gitCommit,`${t} gitCommit`,256),...i.generatedAt==null?{}:{generatedAt:w(i.generatedAt,`${t} generatedAt`)},mode:a},resolvedAt:w(n.resolvedAt,`${t} resolvedAt`)}}function fe(e){return{...e}}function pe(e){return e.replace(/\/+$/,``)||`/`}function me(e){return`${e.origin}${e.pathname}${e.search?`?${e.search}`:``}${e.hash?`#${e.hash}`:``}`}function he(e){return{...e}}function ge(e){return{...e}}function _e(e){return{...e,build:{...e.build}}}function v(e,t,n,r=[]){let i=y(e,t);if(Object.keys(i).some(e=>!n.includes(e)))throw E(`${t} contains unknown fields`);for(let e of n)if(!r.includes(e)&&!Object.hasOwn(i,e))throw E(`${t} is missing ${e}`);return i}function y(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw E(`${t} is missing or invalid`);return e}function ve(e,t){if(!Array.isArray(e))throw E(`${t} is missing or invalid`);return e}function b(e,t,n){if(typeof e!=`string`||ye(e,n)>n)throw E(`${t} is invalid or too long`);return e}function ye(e,t){let n=0;for(let r of e)if(n+=1,n>t)return n;return n}function x(e,t,n){let r=b(e,t,n);if(!r.trim())throw E(`${t} is empty`);return r}function S(e,t){if(typeof e!=`number`||!Number.isFinite(e))throw E(`${t} is invalid`);return e}function be(e,t,n,r){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<n||e>r)throw E(`${t} is invalid`);return e}function C(e,t){let n=S(e,t);if(n<0||n>1)throw E(`${t} is outside 0..1`);return n}function w(e,t){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw E(`${t} is invalid`);return e}function xe(e,t){if(e===null)return null;if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0)throw E(`${t} is invalid`);return e}function Se(e,t){let n;try{n=new URL(e)}catch(e){throw E(`${t} is invalid`,e)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw E(`${t} must use HTTP or HTTPS`)}function T(e,t,n){Ce(e,t,n)}function Ce(e,t,n){let r;try{r=JSON.stringify(e)}catch(e){throw E(`${n} cannot be serialized`,e)}if(r.length>t)throw E(`${n} is too large`);return r}function E(e,t){return new u(e,{cause:t instanceof Error?t:void 0})}new Uint8Array([107,167,184,17,157,173,17,209,128,180,0,192,79,212,48,200]);const we=n.schema({entities:{$files:n.entity({path:n.string().unique().indexed(),url:n.string()}),$users:n.entity({email:n.string().unique().indexed()}),projects:n.entity({name:n.string(),slug:n.string().unique().indexed(),allowedOrigin:n.string().optional(),originDisconnectedAt:n.number().optional(),originModelVersion:n.number().optional(),createdAt:n.number().indexed(),updatedAt:n.number()}),projectOrigins:n.entity({projectId:n.string().indexed(),originKey:n.string().unique().indexed(),origin:n.string().indexed(),label:n.string().optional(),createdAt:n.number().indexed(),updatedAt:n.number()}),reviewPages:n.entity({projectId:n.string().indexed(),autoRegistrationSlot:n.string().unique().indexed().optional(),name:n.string(),pathname:n.string(),stagingOrigin:n.string(),createdAt:n.number().indexed(),updatedAt:n.number()}),reviewPageBuilds:n.entity({projectId:n.string().indexed(),pageId:n.string().unique().indexed(),buildId:n.string(),gitCommit:n.string().optional(),generatedAt:n.number().optional(),mode:n.string(),updatedAt:n.number().indexed()}),reviewers:n.entity({authUserId:n.string().indexed(),projectId:n.string().indexed(),email:n.string().indexed(),displayName:n.string(),role:n.string(),createdAt:n.number()}),reviewerIdentityClaims:n.entity({reviewerId:n.string().unique().indexed(),projectId:n.string().indexed(),authUserId:n.string().indexed(),email:n.string(),displayName:n.string(),role:n.string(),createdAt:n.number()}),invitations:n.entity({projectId:n.string().indexed(),reviewerId:n.string().indexed().optional(),email:n.string().indexed(),status:n.string().indexed(),claimRevision:n.number(),claimedByAuthUserId:n.string().indexed().optional(),expiresAt:n.number().indexed(),createdAt:n.number(),acceptedAt:n.number().optional(),revokedAt:n.number().optional(),emailTokenHash:n.string().optional(),emailSentAt:n.number().optional(),reviewUrl:n.string().optional()}),comments:n.entity({pageId:n.string().indexed(),pageNumber:n.number().optional(),authorId:n.string().indexed(),authorAuthUserId:n.string().indexed(),authorName:n.string(),body:n.string(),bodyContentMarker:n.string().optional(),anchorSelector:n.string().optional(),anchorOffsetX:n.number().optional(),anchorOffsetY:n.number().optional(),anchorViewportX:n.number().optional(),anchorViewportY:n.number().optional(),targetKind:n.string().optional(),targetPageX:n.number().optional(),targetPageY:n.number().optional(),targetWidth:n.number().optional(),targetHeight:n.number().optional(),targetViewportX:n.number().optional(),targetViewportY:n.number().optional(),targetViewportWidth:n.number().optional(),targetViewportHeight:n.number().optional(),targetPageOrigin:n.string().optional(),targetPagePathname:n.string().optional(),targetPageSearch:n.string().optional(),targetPageHash:n.string().optional(),targetPageTitle:n.string().optional(),targetCapturedAt:n.number().optional(),environmentBrowser:n.string().optional(),environmentOperatingSystem:n.string().optional(),environmentDeviceType:n.string().optional(),environmentScreenWidth:n.number().optional(),environmentScreenHeight:n.number().optional(),environmentDevicePixelRatio:n.number().optional(),status:n.string().indexed(),workflowRevision:n.number(),createdAt:n.number().indexed(),updatedAt:n.number().indexed(),resolvedAt:n.number().optional(),resolvedById:n.string().optional(),deletingAt:n.number().optional()}),commentWorkflowClaims:n.entity({claimKey:n.string().unique().indexed(),commentId:n.string().indexed(),expectedWorkflowRevision:n.number(),createdAt:n.number().indexed()}),commentPageNumberClaims:n.entity({claimKey:n.string().unique().indexed(),pageId:n.string().indexed(),pageNumber:n.number(),commentId:n.string().indexed(),createdAt:n.number().indexed()}),commentTargetElements:n.entity({commentId:n.string().indexed(),slotKey:n.string().unique().indexed().optional(),ordinal:n.number(),selector:n.string(),tagName:n.string(),textPreview:n.string(),pageX:n.number(),pageY:n.number(),width:n.number(),height:n.number(),viewportX:n.number(),viewportY:n.number(),viewportWidth:n.number(),viewportHeight:n.number(),authorAuthUserId:n.string().indexed()}),commentScopeEntries:n.entity({commentId:n.string().indexed(),slotKey:n.string().unique().indexed().optional(),ordinal:n.number(),key:n.string(),valueType:n.string(),stringValue:n.string().optional(),numberValue:n.number().optional(),booleanValue:n.boolean().optional(),authorAuthUserId:n.string().indexed()}),commentSourceContexts:n.entity({commentId:n.string().unique().indexed(),pageId:n.string().indexed(),authorAuthUserId:n.string().indexed(),contextJson:n.string(),createdAt:n.number().indexed()}),replies:n.entity({pageId:n.string().indexed(),commentId:n.string().indexed(),authorId:n.string().indexed(),authorAuthUserId:n.string().indexed(),authorName:n.string(),body:n.string(),bodyContentMarker:n.string().optional(),createdAt:n.number().indexed(),updatedAt:n.number().indexed()}),reviewMessages:n.entity({pageId:n.string().indexed(),pathname:n.string().indexed(),authorId:n.string().indexed(),authorAuthUserId:n.string().indexed(),authorName:n.string(),body:n.string(),bodyContentMarker:n.string(),createdAt:n.number().indexed(),updatedAt:n.number().indexed()})},links:{projectOwners:{forward:{on:`projects`,has:`many`,label:`owners`},reverse:{on:`$users`,has:`many`,label:`ownedProjects`}},projectPages:{forward:{on:`projects`,has:`many`,label:`pages`},reverse:{on:`reviewPages`,has:`one`,label:`project`}},projectOriginProject:{forward:{on:`projects`,has:`many`,label:`origins`},reverse:{on:`projectOrigins`,has:`one`,label:`project`}},pageCurrentBuild:{forward:{on:`reviewPageBuilds`,has:`one`,label:`page`,required:!0,onDelete:`cascade`},reverse:{on:`reviewPages`,has:`one`,label:`currentBuild`}},projectReviewers:{forward:{on:`projects`,has:`many`,label:`reviewers`},reverse:{on:`reviewers`,has:`one`,label:`project`}},reviewerUser:{forward:{on:`reviewers`,has:`one`,label:`$user`},reverse:{on:`$users`,has:`many`,label:`reviewerMemberships`}},projectInvitations:{forward:{on:`projects`,has:`many`,label:`invitations`},reverse:{on:`invitations`,has:`one`,label:`project`}},invitationReviewer:{forward:{on:`invitations`,has:`one`,label:`reviewer`},reverse:{on:`reviewers`,has:`many`,label:`acceptedInvitations`}},invitationActiveUser:{forward:{on:`invitations`,has:`one`,label:`activeUser`},reverse:{on:`$users`,has:`many`,label:`activeReviewInvitations`}},pageComments:{forward:{on:`reviewPages`,has:`many`,label:`comments`},reverse:{on:`comments`,has:`one`,label:`page`}},pageReviewMessages:{forward:{on:`reviewPages`,has:`many`,label:`reviewMessages`},reverse:{on:`reviewMessages`,has:`one`,label:`page`}},commentReplies:{forward:{on:`comments`,has:`many`,label:`replies`},reverse:{on:`replies`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`}},commentTargetElements:{forward:{on:`commentTargetElements`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`},reverse:{on:`comments`,has:`many`,label:`targetElements`}},commentScopeEntries:{forward:{on:`commentScopeEntries`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`},reverse:{on:`comments`,has:`many`,label:`scopeEntries`}},commentSourceContext:{forward:{on:`commentSourceContexts`,has:`one`,label:`comment`,required:!0,onDelete:`cascade`},reverse:{on:`comments`,has:`one`,label:`sourceContext`}},pageSourceContexts:{forward:{on:`commentSourceContexts`,has:`one`,label:`page`,required:!0},reverse:{on:`reviewPages`,has:`many`,label:`sourceContexts`}},sourceContextAuthor:{forward:{on:`commentSourceContexts`,has:`one`,label:`author`,required:!0},reverse:{on:`reviewers`,has:`many`,label:`sourceContexts`}},commentAuthor:{forward:{on:`comments`,has:`one`,label:`author`},reverse:{on:`reviewers`,has:`many`,label:`comments`}},replyAuthor:{forward:{on:`replies`,has:`one`,label:`author`},reverse:{on:`reviewers`,has:`many`,label:`replies`}},reviewMessageAuthor:{forward:{on:`reviewMessages`,has:`one`,label:`author`},reverse:{on:`reviewers`,has:`many`,label:`reviewMessages`}}},rooms:{visualReview:{presence:n.entity({reviewerId:n.string(),displayName:n.string(),color:n.string(),active:n.boolean(),pathname:n.string().optional(),cursorX:n.number().optional(),cursorY:n.number().optional(),viewportWidth:n.number().optional(),viewportHeight:n.number().optional(),cursorChat:n.string().optional()})}}}),D={$default:`false`},O={$default:`false`},k=`$user.activeReviewInvitations`,A=`${k}.project.id`;function j(e){return[`auth.id != null`,`size(auth.ref('${k}.id')) > 0`,`size(auth.ref('${A}')) == size(auth.ref('${k}.id'))`,`size(auth.ref('${k}.status')) == size(auth.ref('${k}.id'))`,`size(auth.ref('${k}.expiresAt')) == size(auth.ref('${k}.id'))`,`size(auth.ref('${k}.revokedAt')) == 0`,`auth.ref('${k}.status').all(status, status == 'accepted')`,`auth.ref('${k}.expiresAt').all(expiresAt, request.time < timestamp(expiresAt))`,e].join(` && `)}function M(...e){return e.map(e=>`(${e})`).join(` && `)}function N(...e){return e.map(e=>`(${e})`).join(` || `)}function P(e){let t=`data.ref('${e}project.origins.origin')`,n=`data.ref('${e}project.allowedOrigin')`,r=`data.ref('${e}project.originModelVersion')`;return N(`request.origin in ${t}`,M(`size(${r}) == 0`,`request.origin in ${n}`))}j(`data.ref('project.id')[0] in auth.ref('${A}')`),N(`request.origin in data.ref('project.origins.origin')`,M(`size(data.ref('project.originModelVersion')) == 0`,`request.origin in data.ref('project.allowedOrigin')`)),N(`request.origin in data.ref('origins.origin')`,M(`size(data.ref('originModelVersion')) == 0`,`request.origin in data.ref('allowedOrigin')`)),j(`data.ref('page.project.id')[0] in auth.ref('${A}')`),P(`page.`),N(`auth.id != null && auth.id in data.ref('comment.page.project.owners.id')`,M(j(`data.ref('comment.page.project.id')[0] in auth.ref('${A}')`),P(`comment.page.`))),j(`data.ref('comment.page.project.id')[0] in auth.ref('${A}')`),P(`comment.page.`),j(`data.ref('page.project.id')[0] in auth.ref('${A}')`),P(`page.`),P(``);const Te=M(`data.reviewerId != null`,`data.projectId in data.ref('project.id')`,`data.reviewerId in data.ref('reviewer.id')`,`data.projectId in data.ref('reviewer.project.id')`,`auth.id in data.ref('reviewer.$user.id')`,`auth.email in data.ref('reviewer.email')`);M(`auth.id != null`,`data.revokedAt == null`,`data.status in ['pending', 'accepted']`,`data.status == 'pending' || data.claimedByAuthUserId == auth.id`,`request.time < timestamp(data.expiresAt)`,`request.modifiedFields.all(field, field in ['status', 'claimedByAuthUserId', 'acceptedAt', 'claimRevision', 'activeUser'])`,`'status' in request.modifiedFields`,`'claimedByAuthUserId' in request.modifiedFields`,`'acceptedAt' in request.modifiedFields`,`'claimRevision' in request.modifiedFields`,`'activeUser' in request.modifiedFields`,`newData.status == 'accepted'`,`newData.claimedByAuthUserId == auth.id`,`newData.claimRevision == data.claimRevision + 1`,`math.abs((request.time - timestamp(newData.acceptedAt)).getMinutes()) <= 1`,Te),M(`actions.data == 'update'`,`actions.linkedData == 'update'`,`auth.id != null`,`auth.email != null`,`linkedData.id == auth.id`,`linkedData.email == auth.email`,`data.email == auth.email`,`data.revokedAt == null`,`data.status in ['pending', 'accepted']`,`data.status == 'pending' || data.claimedByAuthUserId == auth.id`,`request.time < timestamp(data.expiresAt)`,`newData.status == 'accepted'`,`newData.claimedByAuthUserId == auth.id`,`newData.claimRevision == data.claimRevision + 1`,`math.abs((request.time - timestamp(newData.acceptedAt)).getMinutes()) <= 1`,Te),M(`actions.data == 'update'`,`actions.linkedData == 'update'`,`auth.id != null`,`auth.email != null`,`data.id == auth.id`,`data.email == auth.email`,`linkedData.email == auth.email`,`linkedData.revokedAt == null`,`linkedData.status == 'accepted'`,`linkedData.claimedByAuthUserId == auth.id`,`request.time < timestamp(linkedData.expiresAt)`,`math.abs((request.time - timestamp(linkedData.acceptedAt)).getMinutes()) <= 1`,`linkedData.projectId in linkedData.ref('project.id')`,`linkedData.reviewerId in linkedData.ref('reviewer.id')`,`linkedData.projectId in linkedData.ref('reviewer.project.id')`,`auth.id in linkedData.ref('reviewer.$user.id')`,`auth.email in linkedData.ref('reviewer.email')`),M(`auth.id != null`,`auth.email != null`,`linkedData.id == auth.id`,`linkedData.email == auth.email`,`data.email == auth.email`,`data.claimedByAuthUserId == auth.id`,`auth.id in data.ref('activeUser.id')`),M(`auth.id != null`,`auth.email != null`,`data.id == auth.id`,`data.email == auth.email`,`linkedData.email == auth.email`,`linkedData.claimedByAuthUserId == auth.id`,`auth.id in linkedData.ref('activeUser.id')`),{...D},{...D},{...O},{...O},j(`data.id in auth.ref('${A}')`),{...D},{...O},{...D},{...D},{...O},{...D},{...O},j(`data.ref('project.id')[0] in auth.ref('${A}')`),{...D},{...O},{...D},{...D},{...O},{...O},{...D},{...O},{...D},{...D},{...D},{...D},{...D},{...D},{...D};function Ee(e){if(!e.trim())throw Error(`InstantDB app ID is required`);return r({appId:e,schema:we,devtool:!1})}var De=class{db;session;#e;attachScreenshot;constructor(e,t,n={}){this.db=e,this.session=t,this.#e=n.commentTransport,this.#e&&(this.attachScreenshot=(e,t,n)=>this.#e.uploadScreenshot({pageId:e,commentId:t,screenshot:n}))}async getSnapshot(e){let{data:t}=await this.db.queryOnce(Oe(e,this.session.authUserId));return Ae(e,t.comments,t.replies)}async getProjectSnapshot(e){this.#t(e);let{data:t}=await this.db.queryOnce(ke(e,this.session.authUserId));return je(e,t.comments,t.replies)}subscribe(e,t,n){return this.db.subscribeQuery(Oe(e,this.session.authUserId),r=>{if(r.error){n?.(Re(r.error));return}if(r.data)try{t(Ae(e,r.data.comments,r.data.replies))}catch{n?.({type:`error`,code:`data-integrity`,recovery:`retry`,clearSnapshot:!0})}})}subscribeProject(e,t,n){return this.#t(e),this.db.subscribeQuery(ke(e,this.session.authUserId),r=>{if(r.error){n?.(Re(r.error));return}if(r.data)try{t(je(e,r.data.comments,r.data.replies))}catch{n?.({type:`error`,code:`data-integrity`,recovery:`retry`,clearSnapshot:!0})}})}async mutate(e,t){switch(t.type){case`comment.upsert`:{if(t.comment.pageId!==e)throw Error(`Comment page mismatch`);let n=t.comment;if(n.authorId!==this.session.reviewerId)throw Error(`Comment author mismatch`);let r=g(n.body).trim(),i=z(n.createdAt,`Comment createdAt`);if(z(n.updatedAt,`Comment updatedAt`)<i)throw new u(`Comment updatedAt precedes createdAt`);if(n.createdAt!==n.updatedAt)throw new u(`Comment edits must go through the review service`);if(n.status!==`open`||n.resolvedAt!==void 0||n.resolvedById!==void 0)throw new u(`New comments must start open`);let a=d(n.target);if(!Ie(n.anchor,a.publicTarget.anchor))throw new u(`Comment anchor does not match its target`);if(!this.#e)throw new u(`Comment creation requires the review service transport`);await this.#e.createComment({pageId:e,commentId:n.id,body:r,target:n.target,...n.scope===void 0?{}:{scope:n.scope}});return}case`comment.delete`:throw new u(`Comment deletion must go through the review service`);case`reply.upsert`:{let e=t.reply;if(e.authorId!==this.session.reviewerId)throw Error(`Reply author mismatch`);let n=g(e.body,`Reply body`).trim(),r=z(e.createdAt,`Reply createdAt`);if(z(e.updatedAt,`Reply updatedAt`)<r)throw new u(`Reply updatedAt precedes createdAt`);if(e.createdAt!==e.updatedAt)throw new u(`Reply edits must go through the review service`);if(!this.#e)throw new u(`Reply creation requires the review service transport`);await this.#e.createReply({commentId:e.commentId,replyId:e.id,body:n});return}case`reply.delete`:throw new u(`Reply deletion must go through the review service`)}}#t(e){if(!e.trim()||e!==this.session.projectId)throw Error(`Project does not belong to the reviewer session`)}};function Oe(e,t){return{comments:{$:{where:{pageId:e},order:{createdAt:`asc`}},targetElements:{},scopeEntries:{}},replies:{$:{where:{pageId:e},order:{createdAt:`asc`}}},$users:{$:{where:{id:t}},activeReviewInvitations:{project:{}}}}}function ke(e,t){return{comments:{$:{where:{"page.project.id":e},order:{createdAt:`asc`}},page:{project:{}},targetElements:{},scopeEntries:{}},replies:{$:{where:{"comment.page.project.id":e},order:{createdAt:`asc`}},comment:{page:{project:{}}}},$users:{$:{where:{id:t}},activeReviewInvitations:{project:{}}}}}function Ae(e,t,n){let r=t.map(t=>Ne(t,e));F(r,`comment`);let i=new Set(r.map(({id:e})=>e)),a=n.map(t=>Pe(t,e));F(a,`reply`);for(let e of a)if(!i.has(e.commentId))throw new u(`Reply ${e.id} references a comment outside the page snapshot`);return{pageId:e,comments:r,replies:a}}function je(e,t,n){let r=new Map,i=t.map(t=>{let n=L(t.pageId,`comment pageId`);Me(t.page,n,e,`comment ${String(t.id)}`);let i=I(t.page,`comment ${String(t.id)} page`),a=Ne(t,n),o=`/`;try{o=new URL(a.target.pageUrl).pathname||`/`}catch{}return r.set(n,{id:n,name:typeof i.name==`string`&&i.name.trim()?i.name.trim():a.target.pageTitle.trim()||o,pathname:typeof i.pathname==`string`&&i.pathname.trim()?i.pathname.trim():o}),a});F(i,`comment`);let a=new Map(i.map(e=>[e.id,e])),o=n.map(t=>{let n=L(t.pageId,`reply pageId`),r=I(t.comment,`reply ${String(t.id)} comment`),i=L(t.commentId,`reply ${String(t.id)} commentId`);if(L(r.id,`reply ${String(t.id)} comment relation id`)!==i)throw new u(`Reply ${String(t.id)} has an inconsistent comment relation`);Me(r.page,n,e,`reply ${String(t.id)}`);let o=Pe(t,n),s=a.get(o.commentId);if(!s||s.pageId!==n)throw new u(`Reply ${o.id} references a comment outside the project snapshot`);return o});return F(o,`reply`),{projectId:e,pages:[...r.values()].sort((e,t)=>e.pathname.localeCompare(t.pathname)||e.id.localeCompare(t.id)),comments:i,replies:o}}function Me(e,t,n,r){let i=I(e,`${r} page`);if(L(i.id,`${r} page id`)!==t)throw new u(`${r} escaped its page relation`);if(L(I(i.project,`${r} project`).id,`${r} project id`)!==n)throw new u(`${r} escaped its project scope`)}function Ne(e,t){let n=I(e,`comment`),r=L(n.id,`comment id`);if(L(n.pageId,`comment ${r} pageId`)!==t)throw new u(`Comment ${r} escaped its page scope`);L(n.authorAuthUserId,`comment ${r} authorAuthUserId`);let i=!(Object.hasOwn(n,`anchor`)&&Object.hasOwn(n,`target`)),a=i?f(n,n.targetElements,`comment ${r} target`):te(n.target,`comment ${r} target`),o=i?{...a.anchor}:Fe(n.anchor,`comment ${r} anchor`);if(!Ie(o,a.anchor))throw new u(`Comment ${r} has inconsistent anchors`);let s=n.status;if(s!==`open`&&s!==`resolved`)throw new u(`Comment ${r} has an invalid status`);let c=z(n.createdAt,`comment ${r} createdAt`),l=z(n.updatedAt,`comment ${r} updatedAt`);if(l<c)throw new u(`Comment ${r} updatedAt precedes createdAt`);let d=He(n.resolvedAt,`comment ${r} resolvedAt`),m=Ue(n.resolvedById,`comment ${r} resolvedById`);if(s===`open`&&(d!==void 0||m!==void 0))throw new u(`Open comment ${r} contains resolution metadata`);if(s===`resolved`&&(d===void 0||m===void 0||d!==l))throw new u(`Resolved comment ${r} has invalid workflow metadata`);return{id:r,pageId:t,...We(n.pageNumber,`comment ${r} pageNumber`),authorId:L(n.authorId,`comment ${r} authorId`),authorName:L(n.authorName,`comment ${r} authorName`),body:g(n.body,`comment ${r} body`),anchor:o,target:a,...i?Le(p(n.scopeEntries)):n.scope==null?{}:{scope:ne(n.scope)},status:s,workflowRevision:Ve(n.workflowRevision,`comment ${r} workflowRevision`),createdAt:c,updatedAt:l,...d===void 0?{}:{resolvedAt:d},...m===void 0?{}:{resolvedById:m}}}function Pe(e,t){let n=I(e,`reply`),r=L(n.id,`reply id`);if(L(n.pageId,`reply ${r} pageId`)!==t)throw new u(`Reply ${r} escaped its page scope`);L(n.authorAuthUserId,`reply ${r} authorAuthUserId`);let i=z(n.createdAt,`reply ${r} createdAt`),a=z(n.updatedAt,`reply ${r} updatedAt`);if(a<i)throw new u(`Reply ${r} updatedAt precedes createdAt`);return{id:r,commentId:L(n.commentId,`reply ${r} commentId`),authorId:L(n.authorId,`reply ${r} authorId`),authorName:L(n.authorName,`reply ${r} authorName`),body:g(n.body,`reply ${r} body`),createdAt:i,updatedAt:a}}function Fe(e,t){let n=I(e,t);if(Object.keys(n).length!==5||!Object.hasOwn(n,`selector`)||!Object.hasOwn(n,`offsetX`)||!Object.hasOwn(n,`offsetY`)||!Object.hasOwn(n,`viewportX`)||!Object.hasOwn(n,`viewportY`))throw new u(`${t} has invalid fields`);return{selector:Be(n.selector,`${t} selector`),offsetX:R(n.offsetX,`${t} offsetX`),offsetY:R(n.offsetY,`${t} offsetY`),viewportX:R(n.viewportX,`${t} viewportX`),viewportY:R(n.viewportY,`${t} viewportY`)}}function Ie(e,t){return e.selector===t.selector&&e.offsetX===t.offsetX&&e.offsetY===t.offsetY&&e.viewportX===t.viewportX&&e.viewportY===t.viewportY}function Le(e){return e===void 0?{}:{scope:e}}function F(e,t){let n=new Set;for(let r of e){if(n.has(r.id))throw new u(`Duplicate ${t} ${r.id}`);n.add(r.id)}}function Re(e){let t=ze(e).toLowerCase();return t.includes(`expired`)||t.includes(`token`)?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:t.includes(`permission`)||t.includes(`forbidden`)||t.includes(`unauthorized`)?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:`transport`,recovery:`retry`,clearSnapshot:!0}}function ze(e){return e instanceof Error?e.message:e&&typeof e==`object`&&`message`in e?String(e.message):``}function I(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new u(`${t} is missing or invalid`);return e}function Be(e,t){if(typeof e!=`string`)throw new u(`${t} is invalid`);return e}function L(e,t){let n=Be(e,t);if(!n.trim())throw new u(`${t} is empty`);return n}function R(e,t){if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw new u(`${t} is invalid`);return e}function z(e,t){if(!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw new u(`${t} is invalid`);return e}function Ve(e,t){if(!Number.isSafeInteger(e)||e<0)throw new u(`${t} is invalid`);return e}function He(e,t){return e==null?void 0:z(e,t)}function Ue(e,t){return e==null?void 0:L(e,t)}function We(e,t){if(e==null)return{};let n=Ve(e,t);if(n<1)throw new u(`${t} is invalid`);return{pageNumber:n}}Object.freeze({field:`createdAt`,direction:`desc`,tieBreaker:`id`,tieDirection:`desc`}),Object.freeze({comments:200,replies:1e3,sourceContexts:200});var Ge=class{db;session;roomCredential;#e=new Map;constructor(e,t,n){this.db=e,this.session=t,this.roomCredential=n}subscribe(e,t,n,r){let i=[],a=[],o=!1,s=[],c=()=>{o||n({pageId:e,peers:structuredClone(i),messages:structuredClone(a)})};if(t.cursors){let n=rt(e,t.roomId),a,l,u=this.roomCredential?.id===t.roomId?this.roomCredential:void 0,d=u??{id:t.roomId,expiresAt:2**53-1,refresh:async()=>void 0},f=t=>{let o=this.db.joinRoom(`visualReview`,t),s=o.subscribePresence({},e=>{if(e.error){r?.(at(e.error));return}i=Object.values(e.peers).map(e=>qe(e)).filter(e=>e!==null).sort((e,t)=>e.displayName.localeCompare(t.displayName)||e.peerId.localeCompare(t.peerId)),c()}),l=a;a=()=>{s(),o.leaveRoom()},this.#e.set(n,{pageId:e,roomId:t,publishPresence:e=>o.publishPresence(e)}),l?.()},p=()=>{if(!u||o)return;let e=Math.max(1e3,d.expiresAt-Date.now()+250);l=setTimeout(()=>{m()},e)},m=async()=>{try{let e=await d.refresh();if(o||!e)return;d={...e,refresh:d.refresh},u&&(u.id=e.id,u.expiresAt=e.expiresAt),f(e.id),p()}catch(e){if(o)return;r?.(at(e)),o||(l=setTimeout(()=>{m()},5e3))}};f(d.id),p(),s.push(()=>{l&&clearTimeout(l),this.#e.delete(n),a?.()})}return t.chat&&s.push(this.db.subscribeQuery(Ke(e,this.session.authUserId),t=>{if(t.error){r?.(at(t.error));return}if(t.data)try{a=t.data.reviewMessages.map(t=>Xe(t,e)).sort(it),c()}catch{r?.({type:`error`,code:`data-integrity`,recovery:`retry`,clearSnapshot:!0})}})),queueMicrotask(c),()=>{if(!o){o=!0;for(let e of s.reverse())try{e()}catch{}}}}publishPresence(e,t,n){let r=this.#e.get(rt(e,t));r&&r.publishPresence({reviewerId:this.session.reviewerId,displayName:this.session.displayName,color:n.color,active:n.active,pathname:Ye(n.pathname),...n.cursorX===void 0?{}:{cursorX:n.cursorX},...n.cursorY===void 0?{}:{cursorY:n.cursorY},...n.viewportWidth===void 0?{}:{viewportWidth:n.viewportWidth},...n.viewportHeight===void 0?{}:{viewportHeight:n.viewportHeight},cursorChat:Je(n.cursorChat)})}async sendMessage(e,t){throw Error(`Persisted review messages are no longer supported`)}};function Ke(e,t){return{reviewMessages:{$:{where:{pageId:e},order:{createdAt:`desc`},limit:200}},$users:{$:{where:{id:t}},activeReviewInvitations:{project:{}}}}}function qe(e){let t=$e(e.reviewerId,128),n=$e(e.displayName,512),r=typeof e.color==`string`&&/^#[0-9a-f]{6}$/iu.test(e.color)?e.color:null;if(!t||!n||!r||typeof e.active!=`boolean`)return null;let i=et(e.cursorX),a=et(e.cursorY),o=tt(e.viewportWidth),s=tt(e.viewportHeight),c=Je(e.cursorChat),l=Ye(e.pathname);return{peerId:e.peerId,reviewerId:t,displayName:n,color:r,active:e.active,pathname:l,...i===void 0?{}:{cursorX:i},...a===void 0?{}:{cursorY:a},...o===void 0?{}:{viewportWidth:o},...s===void 0?{}:{viewportHeight:s},...c?{cursorChat:c}:{}}}function Je(e){return typeof e==`string`?e.trim().slice(0,280):``}function Ye(e){if(typeof e!=`string`)return`/`;let t=e.trim();return t.startsWith(`/`)?t.slice(0,2e3):`/`}function Xe(e,t){let n=B(e.id,`Review message id`,128);if(B(e.pageId,`Review message pageId`,128)!==t)throw Error(`Review message page mismatch`);return{id:n,pageId:t,pathname:Qe(e.pathname),authorId:B(e.authorId,`Review message authorId`,128),authorName:B(e.authorName,`Review message authorName`,512),body:Ze(e.body),createdAt:nt(e.createdAt,`Review message createdAt`),updatedAt:nt(e.updatedAt,`Review message updatedAt`)}}function Ze(e){return B(e,`Review message body`,4e3)}function Qe(e){let t=B(e,`Review message pathname`,2e3);if(!t.startsWith(`/`))throw Error(`Review message pathname is invalid`);return t}function B(e,t,n){if(typeof e!=`string`)throw Error(`${t} is invalid`);let r=e.trim();if(!r||r.length>n)throw Error(`${t} is invalid`);return r}function $e(e,t){if(typeof e!=`string`)return null;let n=e.trim();return n&&n.length<=t?n:null}function et(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function tt(e){let t=et(e);return t!==void 0&&t>0?t:void 0}function nt(e,t){if(!Number.isSafeInteger(e)||e<0)throw Error(`${t} is invalid`);return e}function rt(e,t){return JSON.stringify([e,t])}function it(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function at(e){let t=e&&typeof e==`object`&&`code`in e?String(e.code):``;if(/^INVITATION_(?:EXPIRED|NOT_FOUND|REQUIRED|REVOKED)$/u.test(t))return{type:`access-lost`,code:t===`INVITATION_EXPIRED`?`session-expired`:`membership-revoked`,recovery:`reauthenticate`,clearSnapshot:!0};let n=String(e instanceof Error||e&&typeof e==`object`&&`message`in e?e.message:e).toLowerCase();return n.includes(`expired`)||n.includes(`token`)?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:n.includes(`permission`)||n.includes(`forbidden`)||n.includes(`unauthorized`)?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:`transport`,recovery:`retry`,clearSnapshot:!0}}Object.freeze({field:`createdAt`,direction:`desc`,tieBreaker:`id`,tieDirection:`desc`});var V=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ReviewerCommentSaveError`}};function ot(e,t){let n=e.replace(/\/+$/,``),r=async(e,r)=>{let i=await t();if(!i)throw new V(`AUTH_REQUIRED`,`로그인 세션이 만료되었습니다. 새로고침 후 다시 시도해 주세요.`);let a;try{a=await fetch(`${n}${e}`,{method:`POST`,headers:{authorization:`Bearer ${i}`,"content-type":`application/json`},body:JSON.stringify(r)})}catch{throw new V(`NETWORK`,`리뷰 서버에 연결하지 못했습니다. 연결을 확인하고 다시 시도해 주세요.`)}if(!a.ok)throw new V(...await ct(a))};return{createComment:({target:e,...t})=>{let{environment:n,...i}=e;return r(`/v1/comments`,{...t,target:i,...n?{environment:n}:{}})},createReply:e=>r(`/v1/replies`,e),uploadScreenshot:async({pageId:e,commentId:r,screenshot:i})=>{let a=await t();if(!a)throw new V(`AUTH_REQUIRED`,`로그인 세션이 만료되어 위치 캡처를 저장하지 못했습니다.`);let o;try{o=await fetch(`${n}/v1/comments/${encodeURIComponent(r)}/screenshot`,{method:`PUT`,headers:{authorization:`Bearer ${a}`,"content-type":i.contentType,"x-review-page-id":e,"x-review-image-width":String(i.width),"x-review-image-height":String(i.height)},body:st(i.bytes)})}catch{throw new V(`NETWORK`,`리뷰 서버에 연결하지 못해 위치 캡처를 저장하지 못했습니다.`)}if(!o.ok)throw new V(...await ct(o))}}}function st(e){let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}async function ct(e){let t=e.status>=500?`리뷰 서버가 코멘트를 저장하지 못했습니다. 잠시 후 다시 시도해 주세요.`:`코멘트를 저장하지 못했습니다.`;try{let n=await e.json();if(!n||typeof n!=`object`)return[`UNKNOWN`,t];let r=n;return[typeof r.error==`string`?r.error:`UNKNOWN`,typeof r.message==`string`&&r.message.trim()?r.message:t]}catch{return[`UNKNOWN`,t]}}var H=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ReviewBootstrapError`}};function lt(e,t={}){let n=e.trim();if(!n)throw Error(`InstantDB app ID is required`);return{async resolve(e){let{db:r,user:i}=await ut(n,e,t);t.resolveReviewPage&&await t.resolveReviewPage({refreshToken:i.refresh_token,invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname,signal:e.signal});let{data:a}=await r.queryOnce({reviewers:{$:{where:{authUserId:i.id}}},reviewPages:{},invitations:{}}),o=ft(a.invitations,a.reviewers,a.reviewPages,{invitationId:e.invitationId,authUserId:i.id,email:i.email??``,location:e.location,now:Date.now()});if(!o.ok)throw new H(o.code,Ot(o.code));let s={authUserId:i.id,reviewerId:o.reviewer.id,projectId:o.reviewer.projectId,invitationId:e.invitationId,email:o.reviewer.email||i.email||``,displayName:o.reviewer.displayName||i.email||`Reviewer`,role:o.reviewer.role===`agency`?`agency`:`reviewer`},c=o.page.id,l=e.collaboration?.scopeId,u=(e.collaboration?.cursors===!0||e.collaboration?.chat===!0)&&t.resolveCollaborationRoom?await t.resolveCollaborationRoom({refreshToken:i.refresh_token,invitationId:e.invitationId,pageId:o.page.id,scopeId:e.collaboration.scopeId,signal:e.signal}):void 0,d=u&&t.resolveCollaborationRoom?{...u,refresh:async()=>{let n=await r.getAuth();if(!(!n?.refresh_token||l===void 0))return t.resolveCollaborationRoom?.({refreshToken:n.refresh_token,invitationId:e.invitationId,pageId:c,scopeId:l,signal:new AbortController().signal})}}:void 0,f=0;return{pageId:o.page.id,resolvePage:async n=>{let i=++f,a=()=>i!==f||n.signal.aborted,o=(e,t,n)=>({pageId:e,...n&&d?{collaborationRoomId:n.id}:{},commit:()=>{a()||(c=e,t!==void 0&&(l=t),!(!n||!d)&&(d.id=n.id,d.expiresAt=n.expiresAt))}});if(n.location.origin!==e.location.origin)throw new H(`PAGE_NOT_FOUND`,Ot(`PAGE_NOT_FOUND`));let{data:u}=await r.queryOnce({reviewPages:{$:{where:{projectId:s.projectId}}}});if(a())throw G();let p=Et(n.location.pathname),m=pt(u.reviewPages,s.projectId,n.location.origin,p);if(!m&&t.resolveReviewPage){let i=await r.getAuth();if(a())throw G();if(!i?.refresh_token)throw Error(`리뷰 세션이 만료되어 페이지를 등록할 수 없습니다.`);if(await t.resolveReviewPage({refreshToken:i.refresh_token,invitationId:e.invitationId,origin:n.location.origin,pathname:p,signal:n.signal}),a()||({data:u}=await r.queryOnce({reviewPages:{$:{where:{projectId:s.projectId}}}}),a()))throw G();m=pt(u.reviewPages,s.projectId,n.location.origin,p)}if(!m)throw new H(`PAGE_NOT_FOUND`,Ot(`PAGE_NOT_FOUND`));if(n.collaboration?.cursors!==!0&&n.collaboration?.chat!==!0||d===void 0||t.resolveCollaborationRoom===void 0||!n.collaboration)return o(m.id,n.collaboration?.scopeId);let h=await r.getAuth();if(a())throw G();if(!h?.refresh_token)throw Error(`리뷰 세션이 만료되어 실시간 협업 연결을 갱신할 수 없습니다.`);let ee=await t.resolveCollaborationRoom({refreshToken:h.refresh_token,invitationId:e.invitationId,pageId:m.id,scopeId:n.collaboration.scopeId,signal:n.signal});if(a())throw G();return o(m.id,n.collaboration.scopeId,ee)},session:s,repository:new De(r,s,{...t.serviceUrl===void 0?{}:{commentTransport:ot(t.serviceUrl,async()=>(await r.getAuth())?.refresh_token??null)}}),...e.collaboration?.cursors===!0||e.collaboration?.chat===!0?{collaborationRepository:new Ge(r,s,d)}:{},...(e.collaboration?.cursors===!0||e.collaboration?.chat===!0)&&d?{collaborationRoomId:d.id}:{},allowedStagingHosts:[e.location.hostname],sessionScope:`browser`}}}}async function ut(e,t,n){let r=(n.databaseFactory??Ee)(e),i=!!t.emailToken,a;if(t.emailToken){if(!n.redeemEmailInvitation)throw new H(`INVITATION_EMAIL_REQUIRED`,`이 리뷰는 이메일 초대 링크에서만 시작할 수 있습니다.`);await _t(t.authHost,t.signal,t.styleNonce);let e=await n.redeemEmailInvitation({invitationId:t.invitationId,emailToken:t.emailToken,origin:t.location.origin,pathname:t.location.pathname,signal:t.signal});await U(t.signal,()=>r.getAuth())&&await U(t.signal,async()=>r.auth.signOut()),await U(t.signal,async()=>r.auth.signInWithToken(e));let i=await U(t.signal,()=>r.getAuth());if(!i)throw Error(`인증 세션을 확인할 수 없습니다.`);a=i}else a=await mt(r,t.signal);if(!i)try{await dt(n.acceptInvitation,{refreshToken:a.refresh_token,invitationId:t.invitationId,suggestedDisplayName:Ct(a.email),authHost:t.authHost,signal:t.signal,styleNonce:t.styleNonce})}catch(e){throw wt(e,`INVITATION_EMAIL_MISMATCH`)?new H(`INVITATION_EMAIL_REQUIRED`,`초대받은 이메일의 링크를 다시 열어 주세요.`):e}return{db:r,user:a}}async function dt(e,t){if(!e)return;let n={refreshToken:t.refreshToken,invitationId:t.invitationId,signal:t.signal};try{await e(n);return}catch(e){if(!wt(e,`DISPLAY_NAME_REQUIRED`))throw e}let r=await gt(t.authHost,t.signal,t.suggestedDisplayName,t.styleNonce);await e({...n,displayName:r})}function ft(e,t,n,r){let i=e.find(({id:e})=>e===r.invitationId);if(!i||Dt(i.email)!==Dt(r.email))return{ok:!1,code:`INVITATION_REQUIRED`};if(i.status===`revoked`)return{ok:!1,code:`INVITATION_REVOKED`};if(i.status===`expired`||i.expiresAt<=r.now)return{ok:!1,code:`INVITATION_EXPIRED`};if(i.status!==`accepted`)return{ok:!1,code:`INVITATION_NOT_ACCEPTED`};let a=t.find(e=>e.authUserId===r.authUserId&&e.projectId===i.projectId);if(!a)return{ok:!1,code:`MEMBERSHIP_REQUIRED`};let o=Et(r.location.pathname),s=pt(n,i.projectId,r.location.origin,o);return s?{ok:!0,invitation:i,reviewer:a,page:s}:{ok:!1,code:`PAGE_NOT_FOUND`}}function pt(e,t,n,r){let i=e.filter(e=>e.projectId===t&&Et(e.pathname)===r),a=i.filter(({stagingOrigin:e})=>e===n);return(a.length>0?a:i).sort((e,t)=>(e.createdAt??2**53-1)-(t.createdAt??2**53-1)||e.id.localeCompare(t.id))[0]}async function mt(e,t){let n=await U(t,()=>e.getAuth());if(n)return n;throw new H(`INVITATION_EMAIL_REQUIRED`,`초대받은 이메일의 링크를 열어 주세요.`)}async function U(e,t){ht(e);let n=await t();return ht(e),n}function ht(e){if(e.aborted)throw K()}function gt(e,t,n=``,r){if(t.aborted)return Promise.reject(K());let i=yt(e);i.replaceChildren(bt(i,r),xt(i));let a=i.querySelector(`form`),o=a.elements.namedItem(`displayName`),s=i.querySelector(`button`),c=i.querySelector(`.error`);return o.value=n.trim().slice(0,120),o.focus(),o.select(),new Promise((e,n)=>{let r=!1,l=e=>{r||(r=!0,t.removeEventListener(`abort`,u),i.removeEventListener(`keydown`,p),a.removeEventListener(`submit`,f),e())},u=()=>l(()=>n(K())),d=()=>{let t=o.value.trim();if(!t){c.textContent=`이름을 입력해 주세요.`,o.focus();return}if(t.length>120){c.textContent=`이름은 120자 이하여야 합니다.`,o.focus();return}c.textContent=``,s.disabled=!0,a.setAttribute(`aria-busy`,`true`),l(()=>e(t))},f=e=>{e.preventDefault(),d()},p=e=>{let t=e;if(t.key===`Escape`){t.preventDefault(),u();return}if(t.key===`Tab`){Tt(i,t);return}t.key===`Enter`&&!t.isComposing&&t.target===o&&(t.preventDefault(),d())};t.addEventListener(`abort`,u,{once:!0}),i.addEventListener(`keydown`,p),a.addEventListener(`submit`,f)})}function _t(e,t,n){if(t.aborted)return Promise.reject(K());let r=yt(e);r.replaceChildren(bt(r,n),St(r));let i=r.querySelector(`form`),a=r.querySelector(`button`);return a.focus(),new Promise((e,n)=>{let o=!1,s=e=>{o||(o=!0,t.removeEventListener(`abort`,c),r.removeEventListener(`keydown`,u),i.removeEventListener(`submit`,l),e())},c=()=>s(()=>n(K())),l=t=>{t.preventDefault(),a.disabled=!0,i.setAttribute(`aria-busy`,`true`),s(e)},u=e=>{let t=e;t.key===`Escape`?(t.preventDefault(),c()):t.key===`Tab`&&Tt(r,t)};t.addEventListener(`abort`,c,{once:!0}),r.addEventListener(`keydown`,u),i.addEventListener(`submit`,l)})}async function vt(e,t,n,r){if(t.aborted)throw K();let i=await n.requestCode();if(t.aborted)throw K();let a=yt(e),o=a.ownerDocument.createElement(`form`);o.setAttribute(`role`,`dialog`),o.setAttribute(`aria-modal`,`true`);let s=W(a.ownerDocument,`p`,`01.works`,`eyebrow`),c=W(a.ownerDocument,`h2`,`리뷰 접속 복구`),l=W(a.ownerDocument,`p`,`${i.emailHint}로 보낸 6자리 코드를 입력하세요.`,`description`),u=W(a.ownerDocument,`label`,`복구 코드`),d=a.ownerDocument.createElement(`input`);d.name=`code`,d.inputMode=`numeric`,d.autocomplete=`one-time-code`,d.pattern=`[0-9]{6}`,d.maxLength=6,d.required=!0;let f=W(a.ownerDocument,`p`,``,`error`);f.setAttribute(`role`,`alert`);let p=W(a.ownerDocument,`button`,`접속 복구`);return p.type=`submit`,u.append(d),o.append(s,c,l,u,f,p),a.replaceChildren(bt(a,r),o),d.focus(),new Promise((e,r)=>{let s=!1,c=e=>{s||(s=!0,t.removeEventListener(`abort`,l),a.removeEventListener(`keydown`,u),o.removeEventListener(`submit`,m),e())},l=()=>c(()=>r(K())),u=e=>{let t=e;t.key===`Escape`?(t.preventDefault(),l()):t.key===`Tab`&&Tt(a,t)},m=t=>{t.preventDefault();let r=d.value.trim();if(!/^\d{6}$/.test(r)){f.textContent=`6자리 숫자를 입력해 주세요.`;return}p.disabled=!0,o.setAttribute(`aria-busy`,`true`),f.textContent=``,n.verifyCode(i.challengeId,r).then(t=>c(()=>e(t)),e=>{p.disabled=!1,o.removeAttribute(`aria-busy`),f.textContent=e instanceof Error?e.message:`복구 코드를 확인하지 못했습니다.`,d.select()})};t.addEventListener(`abort`,l,{once:!0}),a.addEventListener(`keydown`,u),o.addEventListener(`submit`,m)})}function yt(e){return e.shadowRoot??e.attachShadow({mode:`open`})}function bt(e,t){let n=e.ownerDocument.createElement(`style`);return t&&(n.nonce=t),n.textContent=kt,n}function xt(e){let t=e.ownerDocument,n=t.createElement(`form`);n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-labelledby`,`visual-review-name-title`),n.setAttribute(`aria-describedby`,`visual-review-name-description`);let r=W(t,`p`,`01.works`,`eyebrow`),i=W(t,`h2`,`표시 이름`);i.id=`visual-review-name-title`;let a=W(t,`p`,`피드백에 이 이름이 표시됩니다.`,`description`);a.id=`visual-review-name-description`;let o=W(t,`label`,`이름`);o.htmlFor=`visual-review-display-name`;let s=t.createElement(`input`);s.id=`visual-review-display-name`,s.name=`displayName`,s.autocomplete=`name`,s.maxLength=120,s.required=!0;let c=W(t,`p`,``,`error`);c.setAttribute(`role`,`alert`);let l=W(t,`button`,`리뷰 시작`);return l.type=`submit`,n.append(r,i,a,o,s,c,l),n}function St(e){let t=e.ownerDocument,n=t.createElement(`form`);n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-labelledby`,`visual-review-invitation-title`),n.setAttribute(`aria-describedby`,`visual-review-invitation-description`);let r=W(t,`p`,`01.works`,`eyebrow`),i=W(t,`h2`,`리뷰 초대`);i.id=`visual-review-invitation-title`;let a=W(t,`p`,`초대받은 프로젝트를 열고 화면에 피드백을 남길 수 있습니다.`,`description`);a.id=`visual-review-invitation-description`;let o=W(t,`button`,`리뷰 시작`);return o.type=`submit`,n.append(r,i,a,o),n}function W(e,t,n,r){let i=e.createElement(t);return i.textContent=n,r&&(i.className=r),i}function Ct(e){return e?.split(`@`)[0]?.trim().slice(0,120)??``}function wt(e,t){return!!(e&&typeof e==`object`&&`code`in e&&e.code===t)}function G(){return new DOMException(`Aborted`,`AbortError`)}function K(){return new H(`AUTH_CANCELLED`,`리뷰 로그인이 취소되었습니다.`)}function Tt(e,t){let n=Array.from(e.querySelectorAll(`input:not([disabled]),button:not([disabled])`)).filter(e=>!e.closest(`[hidden]`));if(n.length===0)return;let r=n[0],i=n.at(-1);t.shiftKey&&e.activeElement===r?(t.preventDefault(),i.focus()):!t.shiftKey&&e.activeElement===i&&(t.preventDefault(),r.focus())}function Et(e){return e.replace(/\/+$/,``)||`/`}function Dt(e){return e.trim().toLowerCase()}function Ot(e){switch(e){case`INVITATION_REQUIRED`:return`현재 계정과 일치하는 리뷰 초대를 찾을 수 없습니다.`;case`INVITATION_NOT_ACCEPTED`:return`아직 수락되지 않은 리뷰 초대입니다.`;case`INVITATION_REVOKED`:return`취소된 리뷰 초대입니다. 계속 검토하려면 담당자에게 다시 요청하세요.`;case`INVITATION_EXPIRED`:return`만료된 리뷰 초대입니다. 담당자에게 새 링크를 요청하세요.`;case`MEMBERSHIP_REQUIRED`:return`이 프로젝트의 reviewer membership이 없습니다.`;case`PAGE_NOT_FOUND`:return`이 페이지는 아직 리뷰 대상이 아닙니다. 담당자에게 문의하세요.`}}const kt=`
2
2
  :host{all:initial;--vr-panel:#fff;--vr-text:#161616;--vr-muted:#707070;--vr-label:#3f3f3f;--vr-control:#fff;--vr-border:#d9d9d9;--vr-action:#161616;--vr-action-text:#fff;position:fixed;inset:0;z-index:2147483646;display:grid;place-items:center;overflow:auto;padding:8px;box-sizing:border-box;background:rgba(15,15,15,.34);font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:var(--vr-text)}
3
3
  form{box-sizing:border-box;width:min(320px,calc(100vw - 16px));padding:20px;border:0;border-radius:14px;background:var(--vr-panel);box-shadow:0 18px 56px rgba(0,0,0,.18)}
4
4
  .eyebrow{margin:0 0 10px;color:var(--vr-muted);font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase}
@@ -10,4 +10,4 @@ import{r as e}from"./install-BVH5H7gL.js";import{t}from"./embedded-source-DSDHbb
10
10
  @media (pointer:coarse){input,button{height:44px}}
11
11
  @media (max-width:480px){form{padding:18px}input{font-size:16px}}
12
12
  @media (prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
13
- `,q=Object.freeze({resolveSession:i(`reviews:resolveSession`),pageSnapshot:i(`reviews:pageSnapshot`),projectSnapshot:i(`reviews:projectSnapshot`),createComment:i(`reviews:createComment`),createReply:i(`reviews:createReply`),presenceList:i(`presence:list`),presenceUpdate:i(`presence:update`),presenceDisconnect:i(`presence:disconnect`),screenshotUploadUrl:i(`screenshots:generateUploadUrl`),screenshotCommit:i(`screenshots:commitUpload`),screenshotDiscard:i(`screenshots:discardUpload`)});Object.freeze({catalog:i(`owners:catalog`),listProjects:i(`owners:listProjects`),projectOverview:i(`owners:projectOverview`),createProject:i(`owners:createProject`),deleteProject:i(`owners:deleteProject`),addOrigin:i(`owners:addOrigin`),removeOrigin:i(`owners:removeOrigin`),createPage:i(`owners:createPage`),deletePage:i(`owners:deletePage`),upsertPageBuild:i(`owners:upsertPageBuild`),createInvitation:i(`owners:createInvitation`),revokeInvitation:i(`owners:revokeInvitation`),setCommentStatus:i(`owners:setCommentStatus`),createReply:i(`owners:createReply`),deleteComment:i(`owners:deleteComment`),deleteReply:i(`owners:deleteReply`),screenshotDownload:i(`screenshots:ownerDownload`)});var kt=class{client;session;#e;#t;#n;constructor(e,t,n){this.client=e,this.session=t,this.#e=Y(n.invitationId??t.invitationId,`invitationId`),this.#t=Nt(n.origin),this.#n=n.fetch??globalThis.fetch.bind(globalThis)}async attachScreenshot(e,t,n){Y(e,`pageId`);let r=Y(t,`commentId`);if(n.bytes.byteLength===0||n.bytes.byteLength>15e5)throw Error(`Screenshot size is invalid`);let i=await this.client.mutation(q.screenshotUploadUrl,{...this.#r(),commentId:r}),a=await this.#n(i,{method:`POST`,headers:{"content-type":n.contentType},body:At(n.bytes)});if(!a.ok)throw Error(`Screenshot upload failed`);let o=await a.json();if(typeof o.storageId!=`string`||!o.storageId)throw Error(`Screenshot upload returned an invalid storage ID`);try{await this.client.mutation(q.screenshotCommit,{...this.#r(),commentId:r,storageId:o.storageId,contentType:n.contentType,width:n.width,height:n.height})}catch(e){throw await this.client.mutation(q.screenshotDiscard,{...this.#r(),commentId:r,storageId:o.storageId}).catch(()=>void 0),e}}async getSnapshot(e){return Mt(await this.client.query(q.pageSnapshot,{...this.#r(),pageId:Y(e,`pageId`)}))}async getProjectSnapshot(e){return this.#i(e),structuredClone(await this.client.query(q.projectSnapshot,{...this.#r(),projectId:e}))}subscribe(e,t,n){return this.client.onUpdate(q.pageSnapshot,{...this.#r(),pageId:Y(e,`pageId`)},e=>t(Mt(e)),e=>n?.(J(e)))}subscribeProject(e,t,n){return this.#i(e),this.client.onUpdate(q.projectSnapshot,{...this.#r(),projectId:e},e=>t(structuredClone(e)),e=>n?.(J(e)))}async mutate(e,t){switch(t.type){case`comment.upsert`:{let n=t.comment;if(n.pageId!==e)throw Error(`Comment page mismatch`);if(n.authorId!==this.session.reviewerId)throw Error(`Comment author mismatch`);if(n.status!==`open`||n.resolvedAt!==void 0||n.resolvedById!==void 0||n.createdAt!==n.updatedAt)throw Error(`Only new open comments can be created by a reviewer`);let r=g(n.body).trim(),i=d(n.target),a=n.scope===void 0?void 0:ne(n.scope);await this.client.mutation(q.createComment,{...this.#r(),pageId:e,commentId:n.id,body:r,targetJson:JSON.stringify(i.publicTarget),sourceContextJson:i.sourceContextJson,...a===void 0?{}:{scopeJson:JSON.stringify(a)}});return}case`reply.upsert`:{let e=t.reply;if(e.authorId!==this.session.reviewerId)throw Error(`Reply author mismatch`);if(e.createdAt!==e.updatedAt)throw Error(`Reply edits require an owner command`);await this.client.mutation(q.createReply,{...this.#r(),commentId:e.commentId,replyId:e.id,body:g(e.body,`Reply body`).trim()});return}case`comment.delete`:throw Error(`Comment deletion requires an owner command`);case`reply.delete`:throw Error(`Reply deletion requires an owner command`)}}#r(){return{invitationId:this.#e,origin:this.#t}}#i(e){if(!e.trim()||e!==this.session.projectId)throw Error(`Project does not belong to the reviewer session`)}};function At(e){let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}function J(e){let t=jt(e);return t===`UNAUTHENTICATED`||t===`INVITATION_EXPIRED`?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:t===`INVITATION_REVOKED`||t===`MEMBERSHIP_REVOKED`?{type:`access-lost`,code:`membership-revoked`,recovery:`reauthenticate`,clearSnapshot:!0}:t===`ORIGIN_MISMATCH`||t===`ORIGIN_NOT_ALLOWED`||t===`INVITATION_REQUIRED`?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:e instanceof Error?`transport`:`unknown`,recovery:`retry`,clearSnapshot:!0}}function jt(e){if(!e||typeof e!=`object`)return;let t=e.data;if(typeof t==`string`)return t;if(t&&typeof t==`object`){let e=t.code;if(typeof e==`string`)return e}}function Mt(e){return structuredClone(e)}function Y(e,t){let n=e.trim();if(!n)throw Error(`${t} is required`);return n}function Nt(e){let t=Y(e,`origin`);try{let e=new URL(t);if(e.origin!==t)throw Error();return e.origin}catch{throw Error(`A valid browser origin is required`)}}var Pt=class{client;session;#e=new Map;#t;#n;#r;#i;#a;#o;constructor(e,t,n){this.client=e,this.session=t,this.#t=(n.invitationId??t.invitationId).trim(),this.#n=new URL(n.origin).origin,this.#r=Ft(n.cursorThrottleMs??80,40,1e3),this.#i=Ft(n.heartbeatMs??1e4,2e3,2e4),this.#a=n.now??Date.now,this.#o=n.sessionId??(()=>globalThis.crypto.randomUUID())}subscribe(e,t,n,r){let i=!1,a=[],o=this.#s(e,t.roomId),s=()=>{i||n({pageId:e,peers:structuredClone(a),messages:[]})},c=t.cursors||t.chat?this.client.onUpdate(q.presenceList,{...this.#d(),pageId:e,roomId:t.roomId},e=>{let t=this.#a();a=e.filter(({peerId:e,expiresAt:n})=>e!==o.sessionId&&n>t).map(({expiresAt:e,...t})=>t).sort((e,t)=>e.displayName.localeCompare(t.displayName)||e.peerId.localeCompare(t.peerId)),s()},e=>r?.(J(e))):()=>void 0;return queueMicrotask(s),()=>{i||(i=!0,c(),this.#u(o))}}publishPresence(e,t,n){let r=this.#e.get(X(e,t));!r||r.stopped||(r.latest={...n,reviewerId:this.session.reviewerId,displayName:this.session.displayName},this.#c(r))}async sendMessage(e,t){let n=[...this.#e.values()].find(t=>t.pageId===e);n?.latest&&(n.latest={...n.latest,cursorChat:t.body.slice(0,4e3)},await this.#l(n))}#s(e,t){let n=X(e,t),r=this.#e.get(n);r&&this.#u(r);let i={pageId:e,roomId:t,sessionId:this.#o(),stopped:!1,lastSentAt:-1/0,inFlight:!1};return i.heartbeatTimer=setInterval(()=>{i.latest&&this.#l(i)},this.#i),this.#e.set(n,i),i}#c(e){if(e.inFlight||e.flushTimer||e.stopped)return;let t=Math.max(0,this.#r-(this.#a()-e.lastSentAt));if(t===0){this.#l(e);return}e.flushTimer=setTimeout(()=>{e.flushTimer=void 0,this.#l(e)},t)}async#l(e){if(e.stopped||e.inFlight||!e.latest)return;e.inFlight=!0;let t=e.latest;e.latest=void 0;try{await this.client.mutation(q.presenceUpdate,{...this.#d(),pageId:e.pageId,roomId:e.roomId,sessionId:e.sessionId,color:t.color,active:t.active,...t.pathname===void 0?{}:{pathname:t.pathname},...t.cursorX===void 0?{}:{cursorX:t.cursorX},...t.cursorY===void 0?{}:{cursorY:t.cursorY},...t.viewportWidth===void 0?{}:{viewportWidth:t.viewportWidth},...t.viewportHeight===void 0?{}:{viewportHeight:t.viewportHeight},...t.cursorChat===void 0?{}:{cursorChat:t.cursorChat}}),e.lastSentAt=this.#a()}finally{e.inFlight=!1,e.latest&&this.#c(e)}}#u(e){e.stopped||(e.stopped=!0,e.flushTimer&&clearTimeout(e.flushTimer),e.heartbeatTimer&&clearInterval(e.heartbeatTimer),this.#e.delete(X(e.pageId,e.roomId)),this.client.mutation(q.presenceDisconnect,{...this.#d(),sessionId:e.sessionId}).catch(()=>void 0))}#d(){return{invitationId:this.#t,origin:this.#n}}};function X(e,t){return`${e}\u0000${t}`}function Ft(e,t,n){return Number.isFinite(e)?Math.min(n,Math.max(t,Math.round(e))):t}function It(e,t){let n=e.trim();if(!/^https:\/\/[^/]+$/.test(n))throw Error(`A valid HTTPS Convex deployment URL is required`);let r=new a(n);return r.setAuth(t),r}function Lt(e,t){let n=e.trim();if(!n)throw Error(`Convex deployment URL is required`);return{async resolve(e){let r=await t.fetchAccessToken(zt(e,!1));if(!r)throw Error(`Convex review authentication is required`);let i=r,a=(t.clientFactory??It)(n,async({forceRefreshToken:n})=>{if(!n&&i){let e=i;return i=null,e}return t.fetchAccessToken({...zt(e,n),signal:new AbortController().signal})}),o=await a.mutation(q.resolveSession,{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname}),s=Vt(o.session,e.invitationId),c=o.pageId,l=e.collaboration?await Bt(t,e,c,e.collaboration.scopeId):void 0,u=0;return Rt({client:a,session:s,request:e,pageId:c,roomId:l,resolvePage:async n=>{if(n.location.origin!==e.location.origin)throw Error(`Convex review session cannot move to another origin`);let r=++u,i=await a.mutation(q.resolveSession,{invitationId:e.invitationId,origin:n.location.origin,pathname:n.location.pathname});if(n.signal.aborted||r!==u)throw Ht();let o=n.collaboration?await Bt(t,e,i.pageId,n.collaboration.scopeId,n.signal):void 0;if(n.signal.aborted||r!==u)throw Ht();return{pageId:i.pageId,...o===void 0?{}:{collaborationRoomId:o},commit:()=>{n.signal.aborted||r!==u||(c=i.pageId,l=o)}}}})}}}function Rt(e){let t=new kt(e.client,e.session,{origin:e.request.location.origin}),n=e.request.collaboration?.cursors===!0||e.request.collaboration?.chat===!0;return{pageId:e.pageId,session:e.session,repository:t,...n?{collaborationRepository:new Pt(e.client,e.session,{origin:e.request.location.origin})}:{},...e.roomId===void 0?{}:{collaborationRoomId:e.roomId},resolvePage:e.resolvePage,allowedStagingHosts:[e.request.location.hostname]}}function zt(e,t){return{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname,...e.emailToken===void 0?{}:{emailToken:e.emailToken},forceRefreshToken:t,signal:e.signal}}async function Bt(e,t,n,r,i=t.signal){return e.resolveCollaborationRoom?e.resolveCollaborationRoom({invitationId:t.invitationId,pageId:n,scopeId:r,origin:t.location.origin,signal:i}):`${n}:${r}`.slice(0,512)}function Vt(e,t){if(!e||e.invitationId!==t||!e.authUserId||!e.reviewerId||!e.projectId)throw Error(`Convex returned an invalid reviewer session`);return structuredClone(e)}function Ht(){return Object.assign(Error(`Review page resolution was superseded`),{code:`PAGE_SWAP_SUPERSEDED`})}var Z=class extends Error{code;status;constructor(e,t,n){super(t),this.code=e,this.status=n,this.name=`HostedBootstrapError`}};function Ut(e={}){return Wt(e)}function Wt(t={},n={}){let r=e(t.serviceUrl??`https://review.01.works`),i=t.fetch??globalThis.fetch,a=n.instantRuntimeFactory??lt,o=n.convexRuntimeFactory??Lt,s=n.now??Date.now,c=new Map,l=n.reviewerSessionStorage===void 0?tn():n.reviewerSessionStorage;if(typeof i!=`function`)throw Error(`Visual Review bootstrap requires the Fetch API`);return{async resolve(e){let t=Jt(e),u=await Zt(r,i,t,e.signal),d=s(),f={serviceUrl:r,...n.instantAuthDatabaseFactory===void 0?{}:{databaseFactory:n.instantAuthDatabaseFactory},redeemEmailInvitation:e=>qt(r,i,e),acceptInvitation:async e=>{let t=await i(`${r}/v1/invitations/accept`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${e.refreshToken}`,"content-type":`application/json`},body:JSON.stringify({invitationId:e.invitationId,...e.displayName===void 0?{}:{displayName:e.displayName}}),cache:`no-store`,credentials:`omit`,signal:e.signal}),n=await Q(t);if(!t.ok)throw new Z($(n,`error`)??`INVITATION_ACCEPT_FAILED`,$(n,`message`)??`리뷰 초대 수락에 실패했습니다.`,t.status)},resolveReviewPage:e=>Xt(r,i,e),...e.collaboration?.cursors===!0||e.collaboration?.chat===!0?{resolveCollaborationRoom:e=>Yt(r,i,e)}:{}},p=u.apiVersion===2?await Gt({config:u,convexRuntimeFactory:o,fetcher:i,memorySessions:c,request:e,sessionStorage:l,serviceUrl:r}):{...await a(u.instantAppId,f).resolve(e),sessionScope:`browser`,sessionExpiresAt:u.invitationExpiresAt},m=p.resolvePage;if(!m)return p;let h=async t=>{await Zt(r,i,{invitationId:e.invitationId,origin:t.location.origin,pathname:t.location.pathname},t.signal),d=s()};return{...p,resolvePage:async e=>(s()-d>=3e5&&await h(e),m(e))}}}}async function Gt(e){let t=en(e.serviceUrl,e.request.location.origin,e.request.invitationId),n;if(e.request.emailToken?(await _t(e.request.authHost,e.request.signal,e.request.styleNonce),n=await qt(e.serviceUrl,e.fetcher,{invitationId:e.request.invitationId,emailToken:e.request.emailToken,origin:e.request.location.origin,pathname:e.request.location.pathname,signal:e.request.signal}),rn(e.sessionStorage,e.memorySessions,t,n)):n=nn(e.sessionStorage,e.memorySessions,t),!n)throw new Z(`INVITATION_EMAIL_REQUIRED`,`이 탭의 리뷰 세션이 종료되었습니다. 담당자에게 새 초대를 요청하세요.`,401);return{...await e.convexRuntimeFactory(e.config.convexUrl,{fetchAccessToken:r=>Kt(e.serviceUrl,e.fetcher,n,r,()=>an(e.sessionStorage,e.memorySessions,t))}).resolve(e.request),sessionScope:`tab`,sessionExpiresAt:e.config.invitationExpiresAt,clearLocalSession:()=>an(e.sessionStorage,e.memorySessions,t)}}async function Kt(e,t,n,r,i){let a=await t(`${e}/v1/convex/token`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${n}`,"content-type":`application/json`},body:JSON.stringify({invitationId:r.invitationId,origin:r.origin,pathname:r.pathname}),cache:`no-store`,credentials:`omit`,signal:r.signal}),o=await Q(a),s=$(o,`token`);if(!a.ok||!s||s.length>16e3)throw[401,403,409,410].includes(a.status)&&i(),new Z($(o,`error`)??`CONVEX_AUTH_FAILED`,$(o,`message`)??`리뷰 인증을 갱신하지 못했습니다.`,a.status);return s}async function qt(e,t,n){let r=await t(`${e}/v1/invitations/redeem-email`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,emailToken:n.emailToken,pathname:n.pathname}),cache:`no-store`,credentials:`omit`,signal:n.signal}),i=await Q(r);if(!r.ok)throw new Z($(i,`error`)??`INVITATION_REDEEM_FAILED`,$(i,`message`)??`리뷰 초대를 시작하지 못했습니다.`,r.status);let a=$(i,`refreshToken`);if(!a||a.length>4096)throw new Z(`INVALID_INVITATION_REDEEM_RESPONSE`,`잘못된 초대 인증 응답입니다.`,502);return a}function Jt(e){return{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname}}async function Yt(e,t,n){let r=await t(`${e}/v1/collaboration/room`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${n.refreshToken}`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,pageId:n.pageId,scopeId:n.scopeId}),cache:`no-store`,credentials:`omit`,signal:n.signal}),i=await Q(r);if(!r.ok)throw new Z($(i,`error`)??`COLLABORATION_ROOM_FAILED`,$(i,`message`)??`실시간 협업 연결에 실패했습니다.`,r.status);if(!i||typeof i!=`object`||Array.isArray(i))throw new Z(`INVALID_COLLABORATION_ROOM`,`잘못된 협업 응답입니다.`,502);let a=i,o=$(a,`id`);if(!o||!/^vr_[A-Za-z0-9_-]{43}$/u.test(o)||!Number.isSafeInteger(a.expiresAt))throw new Z(`INVALID_COLLABORATION_ROOM`,`잘못된 협업 응답입니다.`,502);return{id:o,expiresAt:a.expiresAt}}async function Xt(e,t,n){let r=await t(`${e}/v1/pages/resolve`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${n.refreshToken}`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,origin:n.origin,pathname:n.pathname}),cache:`no-store`,credentials:`omit`,signal:n.signal});if(r.ok)return;let i=await Q(r);throw new Z($(i,`error`)??`PAGE_RESOLVE_FAILED`,$(i,`message`)??`리뷰 페이지를 준비하지 못했습니다.`,r.status)}async function Zt(e,t,n,r){let i=await t(`${e}/v1/bootstrap`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify(n),cache:`no-store`,credentials:`omit`,signal:r}),a=await Q(i);if(!i.ok)throw new Z($(a,`error`)??`BOOTSTRAP_FAILED`,$(a,`message`)??`Visual Review bootstrap에 실패했습니다.`,i.status);return Qt(a)}function Qt(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new Z(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);let t=e;if(typeof t.apiVersion==`number`&&t.apiVersion!==1&&t.apiVersion!==2)throw new Z(`UNSUPPORTED_SERVICE_VERSION`,`이 Visual Review 위젯 버전은 더 이상 지원되지 않습니다. 사이트의 @01.works/visual-review를 업데이트해 주세요.`,502);if(t.apiVersion===2){let e=on(t.convexUrl),n=$t(t.invitationExpiresAt);if(t.provider!==`convex`||!e||n===null)throw new Z(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return{apiVersion:2,provider:`convex`,convexUrl:e,...n===void 0?{}:{invitationExpiresAt:n}}}let n=$(t,`instantAppId`),r=$t(t.invitationExpiresAt);if(t.apiVersion!==1||!n||!sn(n)||r===null)throw new Z(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return{apiVersion:1,instantAppId:n,...r===void 0?{}:{invitationExpiresAt:r}}}function $t(e){if(e!==void 0)return Number.isSafeInteger(e)&&e>0?e:null}function en(e,t,n){return`01works.visual-review.convex-session.v1:${JSON.stringify([e,t,n])}`}function tn(){try{return globalThis.sessionStorage??null}catch{return null}}function nn(e,t,n){try{let t=e?.getItem(n);if(t)return t}catch{}return t.get(n)??null}function rn(e,t,n,r){t.set(n,r);try{e?.setItem(n,r)}catch{}}function an(e,t,n){t.delete(n);try{e?.removeItem(n)}catch{}}function on(e){if(typeof e!=`string`||!e.trim())return null;try{let t=new URL(e.trim());return t.origin!==e.trim()||t.protocol!==`https:`||!t.hostname.endsWith(`.convex.cloud`)?null:t.origin}catch{return null}}async function Q(e){try{return await e.json()}catch{throw new Z(`INVALID_BOOTSTRAP_RESPONSE`,`JSON bootstrap 응답이 필요합니다.`,502)}}function $(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e[t];return typeof n==`string`&&n.trim()?n.trim():null}function sn(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)}export{Ut as createHostedReviewRuntime};
13
+ `,q=Object.freeze({resolveSession:i(`reviews:resolveSession`),pageSnapshot:i(`reviews:pageSnapshot`),projectSnapshot:i(`reviews:projectSnapshot`),createComment:i(`reviews:createComment`),createReply:i(`reviews:createReply`),presenceList:i(`presence:list`),presenceUpdate:i(`presence:update`),presenceDisconnect:i(`presence:disconnect`),screenshotUploadUrl:i(`screenshots:generateUploadUrl`),screenshotCommit:i(`screenshots:commitUpload`),screenshotDiscard:i(`screenshots:discardUpload`)});Object.freeze({catalog:i(`owners:catalog`),listProjects:i(`owners:listProjects`),projectOverview:i(`owners:projectOverview`),createProject:i(`owners:createProject`),deleteProject:i(`owners:deleteProject`),addOrigin:i(`owners:addOrigin`),removeOrigin:i(`owners:removeOrigin`),createPage:i(`owners:createPage`),deletePage:i(`owners:deletePage`),upsertPageBuild:i(`owners:upsertPageBuild`),createInvitation:i(`owners:createInvitation`),revokeInvitation:i(`owners:revokeInvitation`),setCommentStatus:i(`owners:setCommentStatus`),createReply:i(`owners:createReply`),deleteComment:i(`owners:deleteComment`),deleteReply:i(`owners:deleteReply`),screenshotDownload:i(`screenshots:ownerDownload`)});var At=class{client;session;#e;#t;#n;constructor(e,t,n){this.client=e,this.session=t,this.#e=Y(n.invitationId??t.invitationId,`invitationId`),this.#t=Pt(n.origin),this.#n=n.fetch??globalThis.fetch.bind(globalThis)}async attachScreenshot(e,t,n){Y(e,`pageId`);let r=Y(t,`commentId`);if(n.bytes.byteLength===0||n.bytes.byteLength>15e5)throw Error(`Screenshot size is invalid`);let i=await this.client.mutation(q.screenshotUploadUrl,{...this.#r(),commentId:r}),a=await this.#n(i,{method:`POST`,headers:{"content-type":n.contentType},body:jt(n.bytes)});if(!a.ok)throw Error(`Screenshot upload failed`);let o=await a.json();if(typeof o.storageId!=`string`||!o.storageId)throw Error(`Screenshot upload returned an invalid storage ID`);try{await this.client.mutation(q.screenshotCommit,{...this.#r(),commentId:r,storageId:o.storageId,contentType:n.contentType,width:n.width,height:n.height})}catch(e){throw await this.client.mutation(q.screenshotDiscard,{...this.#r(),commentId:r,storageId:o.storageId}).catch(()=>void 0),e}}async getSnapshot(e){return Nt(await this.client.query(q.pageSnapshot,{...this.#r(),pageId:Y(e,`pageId`)}))}async getProjectSnapshot(e){return this.#i(e),structuredClone(await this.client.query(q.projectSnapshot,{...this.#r(),projectId:e}))}subscribe(e,t,n){return this.client.onUpdate(q.pageSnapshot,{...this.#r(),pageId:Y(e,`pageId`)},e=>t(Nt(e)),e=>n?.(J(e)))}subscribeProject(e,t,n){return this.#i(e),this.client.onUpdate(q.projectSnapshot,{...this.#r(),projectId:e},e=>t(structuredClone(e)),e=>n?.(J(e)))}async mutate(e,t){switch(t.type){case`comment.upsert`:{let n=t.comment;if(n.pageId!==e)throw Error(`Comment page mismatch`);if(n.authorId!==this.session.reviewerId)throw Error(`Comment author mismatch`);if(n.status!==`open`||n.resolvedAt!==void 0||n.resolvedById!==void 0||n.createdAt!==n.updatedAt)throw Error(`Only new open comments can be created by a reviewer`);let r=g(n.body).trim(),i=d(n.target),a=n.scope===void 0?void 0:ne(n.scope);await this.client.mutation(q.createComment,{...this.#r(),pageId:e,commentId:n.id,body:r,targetJson:JSON.stringify(i.publicTarget),sourceContextJson:i.sourceContextJson,...a===void 0?{}:{scopeJson:JSON.stringify(a)}});return}case`reply.upsert`:{let e=t.reply;if(e.authorId!==this.session.reviewerId)throw Error(`Reply author mismatch`);if(e.createdAt!==e.updatedAt)throw Error(`Reply edits require an owner command`);await this.client.mutation(q.createReply,{...this.#r(),commentId:e.commentId,replyId:e.id,body:g(e.body,`Reply body`).trim()});return}case`comment.delete`:throw Error(`Comment deletion requires an owner command`);case`reply.delete`:throw Error(`Reply deletion requires an owner command`)}}#r(){return{invitationId:this.#e,origin:this.#t}}#i(e){if(!e.trim()||e!==this.session.projectId)throw Error(`Project does not belong to the reviewer session`)}};function jt(e){let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}function J(e){let t=Mt(e);return t===`UNAUTHENTICATED`||t===`INVITATION_EXPIRED`?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:t===`INVITATION_REVOKED`||t===`MEMBERSHIP_REVOKED`?{type:`access-lost`,code:`membership-revoked`,recovery:`reauthenticate`,clearSnapshot:!0}:t===`ORIGIN_MISMATCH`||t===`ORIGIN_NOT_ALLOWED`||t===`INVITATION_REQUIRED`?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:e instanceof Error?`transport`:`unknown`,recovery:`retry`,clearSnapshot:!0}}function Mt(e){if(!e||typeof e!=`object`)return;let t=e.data;if(typeof t==`string`)return t;if(t&&typeof t==`object`){let e=t.code;if(typeof e==`string`)return e}}function Nt(e){return structuredClone(e)}function Y(e,t){let n=e.trim();if(!n)throw Error(`${t} is required`);return n}function Pt(e){let t=Y(e,`origin`);try{let e=new URL(t);if(e.origin!==t)throw Error();return e.origin}catch{throw Error(`A valid browser origin is required`)}}var Ft=class{client;session;#e=new Map;#t;#n;#r;#i;#a;#o;constructor(e,t,n){this.client=e,this.session=t,this.#t=(n.invitationId??t.invitationId).trim(),this.#n=new URL(n.origin).origin,this.#r=It(n.cursorThrottleMs??80,40,1e3),this.#i=It(n.heartbeatMs??1e4,2e3,2e4),this.#a=n.now??Date.now,this.#o=n.sessionId??(()=>globalThis.crypto.randomUUID())}subscribe(e,t,n,r){let i=!1,a=[],o=this.#s(e,t.roomId),s=()=>{i||n({pageId:e,peers:structuredClone(a),messages:[]})},c=t.cursors||t.chat?this.client.onUpdate(q.presenceList,{...this.#d(),pageId:e,roomId:t.roomId},e=>{let t=this.#a();a=e.filter(({peerId:e,expiresAt:n})=>e!==o.sessionId&&n>t).map(({expiresAt:e,...t})=>t).sort((e,t)=>e.displayName.localeCompare(t.displayName)||e.peerId.localeCompare(t.peerId)),s()},e=>r?.(J(e))):()=>void 0;return queueMicrotask(s),()=>{i||(i=!0,c(),this.#u(o))}}publishPresence(e,t,n){let r=this.#e.get(X(e,t));!r||r.stopped||(r.latest={...n,reviewerId:this.session.reviewerId,displayName:this.session.displayName},this.#c(r))}async sendMessage(e,t){let n=[...this.#e.values()].find(t=>t.pageId===e);n?.latest&&(n.latest={...n.latest,cursorChat:t.body.slice(0,4e3)},await this.#l(n))}#s(e,t){let n=X(e,t),r=this.#e.get(n);r&&this.#u(r);let i={pageId:e,roomId:t,sessionId:this.#o(),stopped:!1,lastSentAt:-1/0,inFlight:!1};return i.heartbeatTimer=setInterval(()=>{i.latest&&this.#l(i)},this.#i),this.#e.set(n,i),i}#c(e){if(e.inFlight||e.flushTimer||e.stopped)return;let t=Math.max(0,this.#r-(this.#a()-e.lastSentAt));if(t===0){this.#l(e);return}e.flushTimer=setTimeout(()=>{e.flushTimer=void 0,this.#l(e)},t)}async#l(e){if(e.stopped||e.inFlight||!e.latest)return;e.inFlight=!0;let t=e.latest;e.latest=void 0;try{await this.client.mutation(q.presenceUpdate,{...this.#d(),pageId:e.pageId,roomId:e.roomId,sessionId:e.sessionId,color:t.color,active:t.active,...t.pathname===void 0?{}:{pathname:t.pathname},...t.cursorX===void 0?{}:{cursorX:t.cursorX},...t.cursorY===void 0?{}:{cursorY:t.cursorY},...t.viewportWidth===void 0?{}:{viewportWidth:t.viewportWidth},...t.viewportHeight===void 0?{}:{viewportHeight:t.viewportHeight},...t.cursorChat===void 0?{}:{cursorChat:t.cursorChat}}),e.lastSentAt=this.#a()}finally{e.inFlight=!1,e.latest&&this.#c(e)}}#u(e){e.stopped||(e.stopped=!0,e.flushTimer&&clearTimeout(e.flushTimer),e.heartbeatTimer&&clearInterval(e.heartbeatTimer),this.#e.delete(X(e.pageId,e.roomId)),this.client.mutation(q.presenceDisconnect,{...this.#d(),sessionId:e.sessionId}).catch(()=>void 0))}#d(){return{invitationId:this.#t,origin:this.#n}}};function X(e,t){return`${e}\u0000${t}`}function It(e,t,n){return Number.isFinite(e)?Math.min(n,Math.max(t,Math.round(e))):t}function Lt(e,t){let n=e.trim();if(!/^https:\/\/[^/]+$/.test(n))throw Error(`A valid HTTPS Convex deployment URL is required`);let r=new a(n);return r.setAuth(t),r}function Rt(e,t){let n=e.trim();if(!n)throw Error(`Convex deployment URL is required`);return{async resolve(e){let r=await t.fetchAccessToken(Bt(e,!1));if(!r)throw Error(`Convex review authentication is required`);let i=r,a=(t.clientFactory??Lt)(n,async({forceRefreshToken:n})=>{if(!n&&i){let e=i;return i=null,e}return t.fetchAccessToken({...Bt(e,n),signal:new AbortController().signal})}),o=await a.mutation(q.resolveSession,{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname}),s=Ht(o.session,e.invitationId),c=o.pageId,l=e.collaboration?await Vt(t,e,c,e.collaboration.scopeId):void 0,u=0;return zt({client:a,session:s,request:e,pageId:c,roomId:l,resolvePage:async n=>{if(n.location.origin!==e.location.origin)throw Error(`Convex review session cannot move to another origin`);let r=++u,i=await a.mutation(q.resolveSession,{invitationId:e.invitationId,origin:n.location.origin,pathname:n.location.pathname});if(n.signal.aborted||r!==u)throw Ut();let o=n.collaboration?await Vt(t,e,i.pageId,n.collaboration.scopeId,n.signal):void 0;if(n.signal.aborted||r!==u)throw Ut();return{pageId:i.pageId,...o===void 0?{}:{collaborationRoomId:o},commit:()=>{n.signal.aborted||r!==u||(c=i.pageId,l=o)}}}})}}}function zt(e){let t=new At(e.client,e.session,{origin:e.request.location.origin}),n=e.request.collaboration?.cursors===!0||e.request.collaboration?.chat===!0;return{pageId:e.pageId,session:e.session,repository:t,...n?{collaborationRepository:new Ft(e.client,e.session,{origin:e.request.location.origin})}:{},...e.roomId===void 0?{}:{collaborationRoomId:e.roomId},resolvePage:e.resolvePage,allowedStagingHosts:[e.request.location.hostname]}}function Bt(e,t){return{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname,...e.emailToken===void 0?{}:{emailToken:e.emailToken},forceRefreshToken:t,signal:e.signal}}async function Vt(e,t,n,r,i=t.signal){return e.resolveCollaborationRoom?e.resolveCollaborationRoom({invitationId:t.invitationId,pageId:n,scopeId:r,origin:t.location.origin,signal:i}):`${n}:${r}`.slice(0,512)}function Ht(e,t){if(!e||e.invitationId!==t||!e.authUserId||!e.reviewerId||!e.projectId)throw Error(`Convex returned an invalid reviewer session`);return structuredClone(e)}function Ut(){return Object.assign(Error(`Review page resolution was superseded`),{code:`PAGE_SWAP_SUPERSEDED`})}var Z=class extends Error{code;status;constructor(e,t,n){super(t),this.code=e,this.status=n,this.name=`HostedBootstrapError`}};function Wt(e={}){return Gt(e)}function Gt(t={},n={}){let r=e(t.serviceUrl??`https://review.01.works`),i=t.fetch??globalThis.fetch,a=n.instantRuntimeFactory??lt,o=n.convexRuntimeFactory??Rt,s=n.now??Date.now,c=new Map,l=n.reviewerSessionStorage===void 0?sn():n.reviewerSessionStorage;if(typeof i!=`function`)throw Error(`Visual Review bootstrap requires the Fetch API`);return{async resolve(e){let t=$t(e),u=await nn(r,i,t,e.signal),d=s(),f={serviceUrl:r,...n.instantAuthDatabaseFactory===void 0?{}:{databaseFactory:n.instantAuthDatabaseFactory},redeemEmailInvitation:e=>Yt(r,i,e),acceptInvitation:async e=>{let t=await i(`${r}/v1/invitations/accept`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${e.refreshToken}`,"content-type":`application/json`},body:JSON.stringify({invitationId:e.invitationId,...e.displayName===void 0?{}:{displayName:e.displayName}}),cache:`no-store`,credentials:`omit`,signal:e.signal}),n=await Q(t);if(!t.ok)throw new Z($(n,`error`)??`INVITATION_ACCEPT_FAILED`,$(n,`message`)??`리뷰 초대 수락에 실패했습니다.`,t.status)},resolveReviewPage:e=>tn(r,i,e),...e.collaboration?.cursors===!0||e.collaboration?.chat===!0?{resolveCollaborationRoom:e=>en(r,i,e)}:{}},p=u.apiVersion===2?await Kt({config:u,convexRuntimeFactory:o,fetcher:i,memorySessions:c,request:e,sessionStorage:l,serviceUrl:r}):{...await a(u.instantAppId,f).resolve(e),sessionScope:`browser`,sessionExpiresAt:u.invitationExpiresAt},m=p.resolvePage;if(!m)return p;let h=async t=>{await nn(r,i,{invitationId:e.invitationId,origin:t.location.origin,pathname:t.location.pathname},t.signal),d=s()};return{...p,resolvePage:async e=>(s()-d>=3e5&&await h(e),m(e))}}}}async function Kt(e){let t=on(e.serviceUrl,e.request.location.origin,e.request.invitationId),n;if(e.request.emailToken){await _t(e.request.authHost,e.request.signal,e.request.styleNonce);try{n=await Yt(e.serviceUrl,e.fetcher,{invitationId:e.request.invitationId,emailToken:e.request.emailToken,origin:e.request.location.origin,pathname:e.request.location.pathname,signal:e.request.signal})}catch(t){if(!(t instanceof Z)||t.code!==`INVITATION_TOKEN_USED`)throw t;n=await qt(e)}ln(e.sessionStorage,e.memorySessions,t,n)}else n=cn(e.sessionStorage,e.memorySessions,t);return n||(n=await qt(e),ln(e.sessionStorage,e.memorySessions,t,n)),{...await e.convexRuntimeFactory(e.config.convexUrl,{fetchAccessToken:r=>Jt(e.serviceUrl,e.fetcher,n,r,()=>un(e.sessionStorage,e.memorySessions,t))}).resolve(e.request),sessionScope:`tab`,sessionExpiresAt:e.config.invitationExpiresAt,clearLocalSession:()=>un(e.sessionStorage,e.memorySessions,t)}}async function qt(e){let t={invitationId:e.request.invitationId,pathname:e.request.location.pathname,signal:e.request.signal};return vt(e.request.authHost,e.request.signal,{requestCode:()=>Xt(e.serviceUrl,e.fetcher,t),verifyCode:(n,r)=>Zt(e.serviceUrl,e.fetcher,{...t,challengeId:n,code:r})},e.request.styleNonce)}async function Jt(e,t,n,r,i){let a=await t(`${e}/v1/convex/token`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${n}`,"content-type":`application/json`},body:JSON.stringify({invitationId:r.invitationId,origin:r.origin,pathname:r.pathname}),cache:`no-store`,credentials:`omit`,signal:r.signal}),o=await Q(a),s=$(o,`token`);if(!a.ok||!s||s.length>16e3)throw[401,403,409,410].includes(a.status)&&i(),new Z($(o,`error`)??`CONVEX_AUTH_FAILED`,$(o,`message`)??`리뷰 인증을 갱신하지 못했습니다.`,a.status);return s}async function Yt(e,t,n){let r=await t(`${e}/v1/invitations/redeem-email`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,emailToken:n.emailToken,pathname:n.pathname}),cache:`no-store`,credentials:`omit`,signal:n.signal}),i=await Q(r);if(!r.ok)throw new Z($(i,`error`)??`INVITATION_REDEEM_FAILED`,$(i,`message`)??`리뷰 초대를 시작하지 못했습니다.`,r.status);let a=$(i,`refreshToken`);if(!a||a.length>4096)throw new Z(`INVALID_INVITATION_REDEEM_RESPONSE`,`잘못된 초대 인증 응답입니다.`,502);return a}async function Xt(e,t,n){let r=await Qt(e,t,`start`,n),i=$(r,`challengeId`),a=$(r,`emailHint`);if(!i||!a)throw new Z(`INVALID_RECOVERY_RESPONSE`,`잘못된 복구 응답입니다.`,502);return{challengeId:i,emailHint:a}}async function Zt(e,t,n){let r=$(await Qt(e,t,`verify`,n),`refreshToken`);if(!r||r.length>4096)throw new Z(`INVALID_RECOVERY_RESPONSE`,`잘못된 복구 응답입니다.`,502);return r}async function Qt(e,t,n,r){let{signal:i,...a}=r,o=await t(`${e}/v1/invitations/recovery/${n}`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify(a),cache:`no-store`,credentials:`omit`,signal:i}),s=await Q(o);if(!o.ok)throw new Z($(s,`error`)??`RECOVERY_FAILED`,$(s,`message`)??`리뷰 접속을 복구하지 못했습니다.`,o.status);if(!s||typeof s!=`object`||Array.isArray(s))throw new Z(`INVALID_RECOVERY_RESPONSE`,`잘못된 복구 응답입니다.`,502);return s}function $t(e){return{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname}}async function en(e,t,n){let r=await t(`${e}/v1/collaboration/room`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${n.refreshToken}`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,pageId:n.pageId,scopeId:n.scopeId}),cache:`no-store`,credentials:`omit`,signal:n.signal}),i=await Q(r);if(!r.ok)throw new Z($(i,`error`)??`COLLABORATION_ROOM_FAILED`,$(i,`message`)??`실시간 협업 연결에 실패했습니다.`,r.status);if(!i||typeof i!=`object`||Array.isArray(i))throw new Z(`INVALID_COLLABORATION_ROOM`,`잘못된 협업 응답입니다.`,502);let a=i,o=$(a,`id`);if(!o||!/^vr_[A-Za-z0-9_-]{43}$/u.test(o)||!Number.isSafeInteger(a.expiresAt))throw new Z(`INVALID_COLLABORATION_ROOM`,`잘못된 협업 응답입니다.`,502);return{id:o,expiresAt:a.expiresAt}}async function tn(e,t,n){let r=await t(`${e}/v1/pages/resolve`,{method:`POST`,headers:{accept:`application/json`,authorization:`Bearer ${n.refreshToken}`,"content-type":`application/json`},body:JSON.stringify({invitationId:n.invitationId,origin:n.origin,pathname:n.pathname}),cache:`no-store`,credentials:`omit`,signal:n.signal});if(r.ok)return;let i=await Q(r);throw new Z($(i,`error`)??`PAGE_RESOLVE_FAILED`,$(i,`message`)??`리뷰 페이지를 준비하지 못했습니다.`,r.status)}async function nn(e,t,n,r){let i=await t(`${e}/v1/bootstrap`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/json`},body:JSON.stringify(n),cache:`no-store`,credentials:`omit`,signal:r}),a=await Q(i);if(!i.ok)throw new Z($(a,`error`)??`BOOTSTRAP_FAILED`,$(a,`message`)??`Visual Review bootstrap에 실패했습니다.`,i.status);return rn(a)}function rn(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new Z(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);let t=e;if(typeof t.apiVersion==`number`&&t.apiVersion!==1&&t.apiVersion!==2)throw new Z(`UNSUPPORTED_SERVICE_VERSION`,`이 Visual Review 위젯 버전은 더 이상 지원되지 않습니다. 사이트의 @01.works/visual-review를 업데이트해 주세요.`,502);if(t.apiVersion===2){let e=dn(t.convexUrl),n=an(t.invitationExpiresAt);if(t.provider!==`convex`||!e||n===null)throw new Z(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return{apiVersion:2,provider:`convex`,convexUrl:e,...n===void 0?{}:{invitationExpiresAt:n}}}let n=$(t,`instantAppId`),r=an(t.invitationExpiresAt);if(t.apiVersion!==1||!n||!fn(n)||r===null)throw new Z(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return{apiVersion:1,instantAppId:n,...r===void 0?{}:{invitationExpiresAt:r}}}function an(e){if(e!==void 0)return Number.isSafeInteger(e)&&e>0?e:null}function on(e,t,n){return`01works.visual-review.convex-session.v1:${JSON.stringify([e,t,n])}`}function sn(){try{return globalThis.sessionStorage??null}catch{return null}}function cn(e,t,n){try{let t=e?.getItem(n);if(t)return t}catch{}return t.get(n)??null}function ln(e,t,n,r){t.set(n,r);try{e?.setItem(n,r)}catch{}}function un(e,t,n){t.delete(n);try{e?.removeItem(n)}catch{}}function dn(e){if(typeof e!=`string`||!e.trim())return null;try{let t=new URL(e.trim());return t.origin!==e.trim()||t.protocol!==`https:`||!t.hostname.endsWith(`.convex.cloud`)?null:t.origin}catch{return null}}async function Q(e){try{return await e.json()}catch{throw new Z(`INVALID_BOOTSTRAP_RESPONSE`,`JSON bootstrap 응답이 필요합니다.`,502)}}function $(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e[t];return typeof n==`string`&&n.trim()?n.trim():null}function fn(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)}export{Wt as createHostedReviewRuntime};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./install-BVH5H7gL.js";export{e as installVisualReview};
1
+ import{t as e}from"./install-Dh6WT91E.js";export{e as installVisualReview};
@@ -1,2 +1,2 @@
1
1
  const e=`https://review.01.works`;function t(e){let t=new URL(e),n=t.hostname===`localhost`||t.hostname===`127.0.0.1`||t.hostname.endsWith(`.test`)||t.hostname.endsWith(`.local`);if(t.protocol!==`https:`&&!(n&&t.protocol===`http:`))throw Error(`Visual Review serviceUrl must use HTTPS outside local development`);if(t.username||t.password||t.search||t.hash)throw Error(`Visual Review serviceUrl must be a plain origin or base path`);return t.toString().replace(/\/+$/,``)}const n=()=>{let e=Promise.resolve(null);return{ready:e,refresh:()=>e,dispose(){}}},r=new Map,i=6e4,a=1e4,o=new WeakMap;function s(e={}){if(e.enabled===!1||typeof window>`u`||typeof document>`u`)return n();let r=!1,i=0,a=null,o=null,s=null,v=null,y=!1,b=!1,x=null,S=null,E=null,O=t(e.serviceUrl??`https://review.01.works`),A=e.activationParam??`visual-review`,j=ue(window),M=de(window),P=w(window.location);if(!(ie(O,A,P,M,j,e.runtime!==void 0)??T(ne(O,P.origin)))){let t={reason:`missing-activation`,origin:P.origin};return N(e.build).mode===`development`&&c(document,t.origin),l(e.onInactive,t),n()}let F=document.baseURI,I=new WeakMap,L=new Map,R=pe(e.styleNonce,document),z=C(window.location,A),B=ee(window,e=>{let t=C(e,A);if(t===z)return;let n=k(A,e.href);n&&(b=!1,L.set(e.origin,n)),z=t,V(e)}),ce=e=>{if(!(r||!v)){if(e===`membership-revoked`){let e=w(window.location),t=L.get(e.origin);t&&(D(O,e.origin,t),L.delete(e.origin),K(O,e.origin,M,j,t));return}z=C(window.location,A),W()}};return{ready:W(),refresh(){return r?Promise.resolve(null):(z=C(window.location,A),V(w(window.location),!0))},dispose(){r||(r=!0,i+=1,U(),v?.remove(),v=null,E=null,S?.remove(),S=null,L.clear(),x?.dispose(),x=null,B.unsubscribe())}};function V(e,t=!1){return!v||!E||E.origin!==e.origin||k(A,e.href)?W():H(v,E,e,t)}function H(t,n,r,c){let l=++i;a!==o&&a?.abort();let d=new AbortController;a=d;let f=u(e.build,r),p=(async()=>{try{let i=await oe(n.resolvePage({location:r,signal:d.signal,collaboration:{cursors:e.collaboration?.cursors===!0,chat:e.collaboration?.chat===!0,scopeId:f}}),d.signal);return Q(l,d)?(i.commit?.(),t.setPage({pageId:i.pageId,collaboration:{roomId:i.collaborationRoomId,scopeId:f}},{reload:c}),t.isConnected||document.body?.append(t),t):$(l)}catch{return Q(l,d)?W():$(l)}})();return s=p,p}function U(){a?.abort(),o?.abort(),a=null,o=null}function W(){if(b&&!k(A,w(window.location).href))return Promise.resolve(null);let t=++i;U(),x?.suspendSession(),v?.remove(),v=null,E=null,S?.remove();let n=new AbortController,r=document.createElement(`div`);r.dataset.agencyReviewRoot=``,a=n,o=n,S=r;let c=q(t,n,r);return s=c,c.then(r=>{r&&Q(t,n)&&v===r&&e.onReady?.(r)}),c}async function q(t,n,i){try{let e=document.body??await se(document,n.signal);if(!Q(t,n))return $(t);e.append(i);let r=await J(t,n,i);return Q(t,n)?r:(i.remove(),$(t))}catch(a){if(!Q(t,n))return i.remove(),$(t);if(m(a,`AUTH_CANCELLED`))return i.remove(),S===i&&(S=null),null;let o=I.get(i),s=o?.[3];if(Z(a,i),h(s)&&m(a,`INVITATION_EMAIL_REQUIRED`)&&!y){let e=o?.[1]??w(window.location).origin,t=o?.[2];return t&&(L.delete(e),K(O,e,M,j,t)),i.remove(),S===i&&(S=null),null}let c=fe(a,o?.[2]),u=o?.[1]??w(window.location).origin,d=m(a,`ORIGIN_NOT_ALLOWED`);if(d&&l(e.onInactive,{reason:`origin-not-allowed`,origin:u}),!h(s)||y||!g(a)){let{originNotAllowedMessage:e,renderBootstrapError:o}=await import(`./bootstrap-error-B30Je5Pg.js`);if(!Q(t,n))return i.remove(),$(t);let s=_(a)?void 0:()=>{r||S!==i||(z=C(window.location,A),W())};o(i,d?e(u):c.message,R,s)}else i.remove(),S===i&&(S=null);return e.onError?.(c),window.dispatchEvent(new CustomEvent(`visual-review:error`,{detail:c})),null}}async function J(t,n,r){let i=w(window.location),a=ie(O,A,i,M,j,e.runtime!==void 0),o=te(L.get(i.origin)),s=T(ne(O,i.origin)),c=a?.source===`url`?a:s??o??a;if(!c)return I.delete(r),r.remove(),S===r&&(S=null),null;let l=c.invitationId;I.set(r,[O,i.origin,l,c.source,c.emailToken]),c.source===`url`?(K(O,i.origin,M,j),L.set(i.origin,l),re(O,i.origin,l,c.emailToken),B.suppress(()=>ae(A))):c.source===`handoff`&&L.set(i.origin,l),z=C(window.location,A);let m=w(window.location),h=await oe((e.runtime??await d(O)).resolve({invitationId:l,emailToken:c.emailToken,location:m,signal:n.signal,authHost:r,styleNonce:R,collaboration:{cursors:e.collaboration?.cursors===!0,chat:e.collaboration?.chat===!0,scopeId:u(e.build,m)}}),n.signal);if(!Q(t,n))return null;D(O,i.origin,l),le(O,l,i,M,j,h.sessionScope??`browser`,h.sessionExpiresAt),c.source===`url`&&G(j,X(O,i.origin)),L.set(i.origin,l);let g=e.sourceContextResolver??await p(e.build,F,n.signal,R);if(!Q(t,n))return null;let{createActiveReviewSessionLifecycle:_,createReviewNavigationHandler:ee,mountReviewWidget:b}=await f(n.signal);if(!Q(t,n))return null;x??=_({window,document,storage:j,onExit:Y,onReauthenticationRequired:ce});let k=x.bindSession(l,X(O,i.origin),h.clearLocalSession);return Q(t,n)?(v=b({...h,collaboration:{cursors:e.collaboration?.cursors===!0&&!!(h.collaborationRepository&&h.collaborationRoomId),chat:e.collaboration?.chat===!0&&!!h.collaborationRepository,repository:h.collaborationRepository,roomId:h.collaborationRoomId,scopeId:u(e.build,i)},developerTools:e.developerTools?.codeContextCopy===!0||e.developerTools?.reactGrab===!0?{codeContextCopy:!0}:void 0,offset:e.offset,onExitReview:k,onNavigateToFeedback:ee(window,e.navigateToFeedback),sourceContextResolver:g,styleNonce:R,position:e.position}),x.attachWidget(v),E=h.resolvePage?{origin:i.origin,resolvePage:e=>h.resolvePage(e)}:null,r.remove(),S===r&&(S=null),y=!0,window.dispatchEvent(new CustomEvent(`visual-review:ready`,{detail:v})),v):null}function Y(e){let t=w(window.location).origin;b=!0,D(O,t,e),L.delete(t),K(O,t,M,j,e),i+=1,U(),v?.remove(),v=null,E=null,S?.remove(),S=null}function Z(e,t){if(!g(e))return;let n=I.get(t);if(!n)return;let[r,i,a]=n;D(r,i,a),L.get(i)===a&&L.delete(i),K(r,i,M,j,a)}function Q(e,t){return!r&&i===e&&a===t&&!t.signal.aborted}function $(e){return!r&&i!==e?s:null}}function c(e,t){let n=o.get(e);n||(n=new Set,o.set(e,n)),!n.has(t)&&(n.add(t),console.info([`[VisualReview] Inactive: no invitation or resume marker was found.`,`Open this page using a Visual Review invitation URL.`,`Current origin: ${t}`].join(`
2
- `)))}function l(e,t){if(e)try{e(t)}catch(e){console.error(`[VisualReview] onInactive callback failed.`,e)}}function u(e,t){return JSON.stringify([N(e).buildId,t.pathname,t.search])}async function d(e){let{createHostedReviewRuntime:t}=await import(`./hosted-runtime-CgqmJMRn.js`);return t({serviceUrl:e})}async function f(e){return M(import(`./active-review-mount-rDsOt0bB.js`),e,a,`리뷰 위젯을 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`)}async function p(e,t,n,r){let i=N(e),{createGeneratedSourceContextResolver:o}=await M(import(`./generated-source-context-D59o5CKS.js`),n,a,`리뷰 소스 정보를 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`);return o({build:i})}function m(e,t){return e instanceof Error&&`code`in e&&e.code===t}function h(e){return e===`tab-storage`||e===`browser-storage`||e===`legacy-storage`}function g(e){let t=v(e);return typeof t==`string`&&/^INVITATION_(?:EXPIRED|NOT_FOUND|REVOKED)$/.test(t)}function _(e){return g(e)||v(e)===`UNSUPPORTED_SERVICE_VERSION`}function v(e){return e instanceof Error&&`code`in e?e.code:void 0}const y=new WeakMap;function ee(e,t){let n=y.get(e);if(!n){let t=e.history,r=t.pushState,i=t.replaceState,a=new Set;n={history:t,originalPushStateDescriptor:Object.getOwnPropertyDescriptor(t,`pushState`),originalReplaceStateDescriptor:Object.getOwnPropertyDescriptor(t,`replaceState`),patchedPushState:function(t,n,i){r.call(this,t,n,i),b(e)},patchedReplaceState:function(t,n,r){i.call(this,t,n,r),b(e)},popstateListener:()=>b(e),subscribers:a,suppressionDepth:0},y.set(e,n),x(t,`pushState`,n.patchedPushState),x(t,`replaceState`,n.patchedReplaceState),e.addEventListener(`popstate`,n.popstateListener)}n.subscribers.add(t);let r=!0;return{suppress(e){n.suppressionDepth+=1;try{return e()}finally{--n.suppressionDepth}},unsubscribe(){r&&(r=!1,n.subscribers.delete(t),!(n.subscribers.size>0)&&(e.removeEventListener(`popstate`,n.popstateListener),S(n.history,`pushState`,n.patchedPushState,n.originalPushStateDescriptor),S(n.history,`replaceState`,n.patchedReplaceState,n.originalReplaceStateDescriptor),y.delete(e)))}}}function b(e){let t=y.get(e);if(!t||t.suppressionDepth>0)return;let n=w(e.location);[...t.subscribers].forEach(e=>e(n))}function x(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:!0,value:n})}function S(e,t,n,r){if(Object.getOwnPropertyDescriptor(e,t)?.value===n){if(r){Object.defineProperty(e,t,r);return}delete e[t]}}function C(e,t){return`${e.origin}\n${e.pathname}\n${k(t,e.href)??``}`}function w(e){return new URL(e.href)}function te(e){return e?{invitationId:e,source:`memory`}:null}function T(e){return e?{invitationId:e.invitationId,emailToken:e.emailToken,source:`handoff`}:null}function E(e,t){return JSON.stringify([e,t])}function ne(e,t,n=Date.now()){let i=E(e,t),a=r.get(i);if(a){if(a.expiresAt>n)return a;clearTimeout(a.timeout),r.delete(i)}}function re(e,t,n,a,o=Date.now()){O(o);let s=E(e,t),c=r.get(s);for(c&&(clearTimeout(c.timeout),r.delete(s));r.size>=32;){let e=r.keys().next().value;if(!e)break;let t=r.get(e);t&&clearTimeout(t.timeout),r.delete(e)}let l=o+i,u=setTimeout(()=>{r.get(s)?.expiresAt===l&&r.delete(s)},i);r.set(s,{invitationId:n,emailToken:a,expiresAt:l,timeout:u})}function D(e,t,n){let i=E(e,t),a=r.get(i);a?.invitationId===n&&(clearTimeout(a.timeout),r.delete(i))}function O(e){for(let[t,n]of r)n.expiresAt>e||(clearTimeout(n.timeout),r.delete(t))}function ie(e,t,n,r,i,a){let o=k(t,n.href);if(o)return{invitationId:o,emailToken:A(n.href)??void 0,source:`url`};let s=U(i,X(e,n.origin)),c=U(r,J(e,n.origin));if(c&&c!==s)return{invitationId:c,source:`tab-storage`};let l=H(i,Y(e,n.origin));if(l&&l.invitationId!==s)return{invitationId:l.invitationId,source:`browser-storage`};let u=U(i,q(e,n.origin));return u&&u!==s?{invitationId:u,source:`legacy-storage`}:a&&Z(n.hostname)?{invitationId:`local-preview`,source:`local-preview`}:null}function k(e,t){let n=new URL(t),r=j(n.hash);return(r?.get(e)??r?.get(`visual-review`)??r?.get(`agency-review`)??r?.get(`agency-review-invite`)??n.searchParams.get(e)??n.searchParams.get(`agency-review`)??n.searchParams.get(`agency-review-invite`))?.trim()||null}function A(e){let t=(j(new URL(e).hash)?.get(`visual-review-token`))?.trim();return t&&/^[A-Za-z0-9_-]{43}$/u.test(t)?t:null}function j(e){let t=e.startsWith(`#`)?e.slice(1):e,n=t.startsWith(`?`)?t.slice(1):t;return n.includes(`=`)?new URLSearchParams(n):null}function ae(e){let t=new URL(window.location.href),n=new Set([e,`visual-review`,`agency-review`,`agency-review-invite`,`visual-review-token`]),r=!1;n.forEach(e=>{t.searchParams.has(e)&&(t.searchParams.delete(e),r=!0)});let i=j(t.hash);if(i){n.forEach(e=>{i.has(e)&&(i.delete(e),r=!0)});let e=i.toString();t.hash=e?`#${e}`:``}r&&window.history.replaceState(window.history.state,``,`${t.pathname}${t.search}${t.hash}`)}function oe(e,t){return new Promise((n,r)=>{let i=()=>r(new DOMException(`Aborted`,`AbortError`));if(t.aborted){i();return}t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})})}function M(e,t,n,r){return new Promise((i,a)=>{let o=!1,s=e=>{o||(o=!0,clearTimeout(l),t.removeEventListener(`abort`,c),e())},c=()=>{s(()=>a(new DOMException(`Aborted`,`AbortError`)))},l=setTimeout(()=>{s(()=>a(Error(r)))},n);if(t.aborted){c();return}t.addEventListener(`abort`,c,{once:!0}),e.then(e=>s(()=>i(e)),e=>s(()=>a(e)))})}function se(e,t){return e.body?Promise.resolve(e.body):t.aborted?Promise.reject(new DOMException(`Aborted`,`AbortError`)):new Promise((n,r)=>{let i=!1,a=new MutationObserver(()=>c()),o=()=>{e.removeEventListener(`DOMContentLoaded`,c),t.removeEventListener(`abort`,l),a.disconnect()},s=e=>{i||(i=!0,o(),e())},c=()=>{let t=e.body;t&&s(()=>n(t))},l=()=>{s(()=>r(new DOMException(`Aborted`,`AbortError`)))};e.addEventListener(`DOMContentLoaded`,c),t.addEventListener(`abort`,l,{once:!0}),a.observe(e,{childList:!0,subtree:!0}),c()})}function N(e){let t=document.querySelector(`meta[name="visual-review-build"]`),n=document.querySelector(`meta[name="visual-review-commit"]`),r=V(I()),i=V(L());return{buildId:ce(e?.buildId)??B(t)??r??`unversioned`,gitCommit:R(e,n,i),generatedAt:e?.generatedAt,mode:e?.mode??F(P())??(Z(window.location.hostname)?`development`:`production`)}}function P(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_MODE}catch{return}}function F(e){return e===`development`||e===`preview`||e===`production`?e:void 0}function I(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_ID}catch{return}}function L(){try{return process.env.VISUAL_REVIEW_PUBLIC_GIT_COMMIT}catch{return}}function R(e,t,n){return e?.gitCommit===null?null:typeof e?.gitCommit==`string`?z(e.gitCommit):z(t?.content)??z(n)}function z(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();return/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(t)?t:null}function B(e){return V(e?.content)}function ce(e){let t=typeof e==`string`?e.trim():``;return t.length>0?t:null}function V(e){return typeof e==`string`&&e.length>0?e:null}function le(e,t,n,r,i,a,o){if(a===`tab`){try{r?.setItem(J(e,n.origin),t)}catch{}G(i,Y(e,n.origin))}else{let a=Number.isSafeInteger(o)&&o>Date.now()?o:Date.now()+1440*6e4;try{i?.setItem(Y(e,n.origin),JSON.stringify({version:2,invitationId:t,expiresAt:a}))}catch{}G(r,J(e,n.origin))}W(e,n.origin,i,t)}function H(e,t){let n=U(e,t);if(!n)return null;let r=()=>{try{e?.removeItem?.(t)}catch{}};try{let e=JSON.parse(n),t=e.expiresAt;return e.version!==2||typeof e.invitationId!=`string`||!e.invitationId.trim()||!Number.isSafeInteger(t)||t<=Date.now()?(r(),null):{version:2,invitationId:e.invitationId,expiresAt:t}}catch{return r(),null}}function U(e,t){try{return e?.getItem(t)??null}catch{return null}}function ue(e){try{return e.localStorage}catch{return null}}function de(e){try{return e.sessionStorage}catch{return null}}function W(e,t,n,r){try{if(!n)return;let i=q(e,t),a=n.getItem(i);if(a===null||r!==void 0&&a!==r)return;n.removeItem(i)}catch{}}function G(e,t){try{e?.removeItem(t)}catch{}}function K(e,t,n,r,i){W(e,t,r,i);let a=J(e,t),o=Y(e,t);if(i===void 0){G(n,a),G(r,o);return}U(n,a)===i&&G(n,a),H(r,o)?.invitationId===i&&G(r,o)}function q(e,t){return`visual-review:${e}:${t}:invitation`}function J(e,t){return`visual-review:${e}:${t}:invitation:tab:v2`}function Y(e,t){return`visual-review:${e}:${t}:invitation:browser:v2`}function X(e,t){return`visual-review:${e}:${t}:exit:v1`}function Z(e){return e===`localhost`||e===`127.0.0.1`||e.endsWith(`.test`)||e.endsWith(`.local`)}function fe(e,t){let n=e instanceof Error?e.message:String(e),r=Error(Q(n,t));if(e&&typeof e==`object`){let n=`code`in e?e.code:void 0,i=`status`in e?e.status:void 0;typeof n==`string`&&Object.defineProperty(r,"code",{configurable:!0,enumerable:!0,value:Q(n,t)}),typeof i==`number`&&Number.isFinite(i)&&Object.defineProperty(r,"status",{configurable:!0,enumerable:!0,value:i})}return r}function Q(e,t){if(!t)return e;let n=new Set([t,encodeURIComponent(t)]),r=e;for(let e of n)e&&(r=r.split(e).join(`[redacted]`));return r}function pe(e,t){if(e!==void 0)return me(e);let n=t.currentScript,r=n?$(n):void 0;if(r)return r;try{for(let e of t.querySelectorAll(`script[nonce],style[nonce]`)){let t=$(e);if(t)return t}}catch{}}function $(e){let t=`nonce`in e?e.nonce:void 0;return typeof t==`string`?me(t):void 0}function me(e){return e.trim()||void 0}export{e as n,t as r,s as t};
2
+ `)))}function l(e,t){if(e)try{e(t)}catch(e){console.error(`[VisualReview] onInactive callback failed.`,e)}}function u(e,t){return JSON.stringify([N(e).buildId,t.pathname,t.search])}async function d(e){let{createHostedReviewRuntime:t}=await import(`./hosted-runtime-D6Xuc19F.js`);return t({serviceUrl:e})}async function f(e){return M(import(`./active-review-mount-DtVtT0xd.js`),e,a,`리뷰 위젯을 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`)}async function p(e,t,n,r){let i=N(e),{createGeneratedSourceContextResolver:o}=await M(import(`./generated-source-context-D59o5CKS.js`),n,a,`리뷰 소스 정보를 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`);return o({build:i})}function m(e,t){return e instanceof Error&&`code`in e&&e.code===t}function h(e){return e===`tab-storage`||e===`browser-storage`||e===`legacy-storage`}function g(e){let t=v(e);return typeof t==`string`&&/^INVITATION_(?:EXPIRED|NOT_FOUND|REVOKED)$/.test(t)}function _(e){return g(e)||v(e)===`UNSUPPORTED_SERVICE_VERSION`}function v(e){return e instanceof Error&&`code`in e?e.code:void 0}const y=new WeakMap;function ee(e,t){let n=y.get(e);if(!n){let t=e.history,r=t.pushState,i=t.replaceState,a=new Set;n={history:t,originalPushStateDescriptor:Object.getOwnPropertyDescriptor(t,`pushState`),originalReplaceStateDescriptor:Object.getOwnPropertyDescriptor(t,`replaceState`),patchedPushState:function(t,n,i){r.call(this,t,n,i),b(e)},patchedReplaceState:function(t,n,r){i.call(this,t,n,r),b(e)},popstateListener:()=>b(e),subscribers:a,suppressionDepth:0},y.set(e,n),x(t,`pushState`,n.patchedPushState),x(t,`replaceState`,n.patchedReplaceState),e.addEventListener(`popstate`,n.popstateListener)}n.subscribers.add(t);let r=!0;return{suppress(e){n.suppressionDepth+=1;try{return e()}finally{--n.suppressionDepth}},unsubscribe(){r&&(r=!1,n.subscribers.delete(t),!(n.subscribers.size>0)&&(e.removeEventListener(`popstate`,n.popstateListener),S(n.history,`pushState`,n.patchedPushState,n.originalPushStateDescriptor),S(n.history,`replaceState`,n.patchedReplaceState,n.originalReplaceStateDescriptor),y.delete(e)))}}}function b(e){let t=y.get(e);if(!t||t.suppressionDepth>0)return;let n=w(e.location);[...t.subscribers].forEach(e=>e(n))}function x(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:!0,value:n})}function S(e,t,n,r){if(Object.getOwnPropertyDescriptor(e,t)?.value===n){if(r){Object.defineProperty(e,t,r);return}delete e[t]}}function C(e,t){return`${e.origin}\n${e.pathname}\n${k(t,e.href)??``}`}function w(e){return new URL(e.href)}function te(e){return e?{invitationId:e,source:`memory`}:null}function T(e){return e?{invitationId:e.invitationId,emailToken:e.emailToken,source:`handoff`}:null}function E(e,t){return JSON.stringify([e,t])}function ne(e,t,n=Date.now()){let i=E(e,t),a=r.get(i);if(a){if(a.expiresAt>n)return a;clearTimeout(a.timeout),r.delete(i)}}function re(e,t,n,a,o=Date.now()){O(o);let s=E(e,t),c=r.get(s);for(c&&(clearTimeout(c.timeout),r.delete(s));r.size>=32;){let e=r.keys().next().value;if(!e)break;let t=r.get(e);t&&clearTimeout(t.timeout),r.delete(e)}let l=o+i,u=setTimeout(()=>{r.get(s)?.expiresAt===l&&r.delete(s)},i);r.set(s,{invitationId:n,emailToken:a,expiresAt:l,timeout:u})}function D(e,t,n){let i=E(e,t),a=r.get(i);a?.invitationId===n&&(clearTimeout(a.timeout),r.delete(i))}function O(e){for(let[t,n]of r)n.expiresAt>e||(clearTimeout(n.timeout),r.delete(t))}function ie(e,t,n,r,i,a){let o=k(t,n.href);if(o)return{invitationId:o,emailToken:A(n.href)??void 0,source:`url`};let s=U(i,X(e,n.origin)),c=U(r,J(e,n.origin));if(c&&c!==s)return{invitationId:c,source:`tab-storage`};let l=H(i,Y(e,n.origin));if(l&&l.invitationId!==s)return{invitationId:l.invitationId,source:`browser-storage`};let u=U(i,q(e,n.origin));return u&&u!==s?{invitationId:u,source:`legacy-storage`}:a&&Z(n.hostname)?{invitationId:`local-preview`,source:`local-preview`}:null}function k(e,t){let n=new URL(t),r=j(n.hash);return(r?.get(e)??r?.get(`visual-review`)??r?.get(`agency-review`)??r?.get(`agency-review-invite`)??n.searchParams.get(e)??n.searchParams.get(`agency-review`)??n.searchParams.get(`agency-review-invite`))?.trim()||null}function A(e){let t=(j(new URL(e).hash)?.get(`visual-review-token`))?.trim();return t&&/^[A-Za-z0-9_-]{43}$/u.test(t)?t:null}function j(e){let t=e.startsWith(`#`)?e.slice(1):e,n=t.startsWith(`?`)?t.slice(1):t;return n.includes(`=`)?new URLSearchParams(n):null}function ae(e){let t=new URL(window.location.href),n=new Set([e,`visual-review`,`agency-review`,`agency-review-invite`,`visual-review-token`]),r=!1;n.forEach(e=>{t.searchParams.has(e)&&(t.searchParams.delete(e),r=!0)});let i=j(t.hash);if(i){n.forEach(e=>{i.has(e)&&(i.delete(e),r=!0)});let e=i.toString();t.hash=e?`#${e}`:``}r&&window.history.replaceState(window.history.state,``,`${t.pathname}${t.search}${t.hash}`)}function oe(e,t){return new Promise((n,r)=>{let i=()=>r(new DOMException(`Aborted`,`AbortError`));if(t.aborted){i();return}t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})})}function M(e,t,n,r){return new Promise((i,a)=>{let o=!1,s=e=>{o||(o=!0,clearTimeout(l),t.removeEventListener(`abort`,c),e())},c=()=>{s(()=>a(new DOMException(`Aborted`,`AbortError`)))},l=setTimeout(()=>{s(()=>a(Error(r)))},n);if(t.aborted){c();return}t.addEventListener(`abort`,c,{once:!0}),e.then(e=>s(()=>i(e)),e=>s(()=>a(e)))})}function se(e,t){return e.body?Promise.resolve(e.body):t.aborted?Promise.reject(new DOMException(`Aborted`,`AbortError`)):new Promise((n,r)=>{let i=!1,a=new MutationObserver(()=>c()),o=()=>{e.removeEventListener(`DOMContentLoaded`,c),t.removeEventListener(`abort`,l),a.disconnect()},s=e=>{i||(i=!0,o(),e())},c=()=>{let t=e.body;t&&s(()=>n(t))},l=()=>{s(()=>r(new DOMException(`Aborted`,`AbortError`)))};e.addEventListener(`DOMContentLoaded`,c),t.addEventListener(`abort`,l,{once:!0}),a.observe(e,{childList:!0,subtree:!0}),c()})}function N(e){let t=document.querySelector(`meta[name="visual-review-build"]`),n=document.querySelector(`meta[name="visual-review-commit"]`),r=V(I()),i=V(L());return{buildId:ce(e?.buildId)??B(t)??r??`unversioned`,gitCommit:R(e,n,i),generatedAt:e?.generatedAt,mode:e?.mode??F(P())??(Z(window.location.hostname)?`development`:`production`)}}function P(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_MODE}catch{return}}function F(e){return e===`development`||e===`preview`||e===`production`?e:void 0}function I(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_ID}catch{return}}function L(){try{return process.env.VISUAL_REVIEW_PUBLIC_GIT_COMMIT}catch{return}}function R(e,t,n){return e?.gitCommit===null?null:typeof e?.gitCommit==`string`?z(e.gitCommit):z(t?.content)??z(n)}function z(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();return/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(t)?t:null}function B(e){return V(e?.content)}function ce(e){let t=typeof e==`string`?e.trim():``;return t.length>0?t:null}function V(e){return typeof e==`string`&&e.length>0?e:null}function le(e,t,n,r,i,a,o){if(a===`tab`){try{r?.setItem(J(e,n.origin),t)}catch{}G(i,Y(e,n.origin))}else{let a=Number.isSafeInteger(o)&&o>Date.now()?o:Date.now()+1440*6e4;try{i?.setItem(Y(e,n.origin),JSON.stringify({version:2,invitationId:t,expiresAt:a}))}catch{}G(r,J(e,n.origin))}W(e,n.origin,i,t)}function H(e,t){let n=U(e,t);if(!n)return null;let r=()=>{try{e?.removeItem?.(t)}catch{}};try{let e=JSON.parse(n),t=e.expiresAt;return e.version!==2||typeof e.invitationId!=`string`||!e.invitationId.trim()||!Number.isSafeInteger(t)||t<=Date.now()?(r(),null):{version:2,invitationId:e.invitationId,expiresAt:t}}catch{return r(),null}}function U(e,t){try{return e?.getItem(t)??null}catch{return null}}function ue(e){try{return e.localStorage}catch{return null}}function de(e){try{return e.sessionStorage}catch{return null}}function W(e,t,n,r){try{if(!n)return;let i=q(e,t),a=n.getItem(i);if(a===null||r!==void 0&&a!==r)return;n.removeItem(i)}catch{}}function G(e,t){try{e?.removeItem(t)}catch{}}function K(e,t,n,r,i){W(e,t,r,i);let a=J(e,t),o=Y(e,t);if(i===void 0){G(n,a),G(r,o);return}U(n,a)===i&&G(n,a),H(r,o)?.invitationId===i&&G(r,o)}function q(e,t){return`visual-review:${e}:${t}:invitation`}function J(e,t){return`visual-review:${e}:${t}:invitation:tab:v2`}function Y(e,t){return`visual-review:${e}:${t}:invitation:browser:v2`}function X(e,t){return`visual-review:${e}:${t}:exit:v1`}function Z(e){return e===`localhost`||e===`127.0.0.1`||e.endsWith(`.test`)||e.endsWith(`.local`)}function fe(e,t){let n=e instanceof Error?e.message:String(e),r=Error(Q(n,t));if(e&&typeof e==`object`){let n=`code`in e?e.code:void 0,i=`status`in e?e.status:void 0;typeof n==`string`&&Object.defineProperty(r,"code",{configurable:!0,enumerable:!0,value:Q(n,t)}),typeof i==`number`&&Number.isFinite(i)&&Object.defineProperty(r,"status",{configurable:!0,enumerable:!0,value:i})}return r}function Q(e,t){if(!t)return e;let n=new Set([t,encodeURIComponent(t)]),r=e;for(let e of n)e&&(r=r.split(e).join(`[redacted]`));return r}function pe(e,t){if(e!==void 0)return me(e);let n=t.currentScript,r=n?$(n):void 0;if(r)return r;try{for(let e of t.querySelectorAll(`script[nonce],style[nonce]`)){let t=$(e);if(t)return t}}catch{}}function $(e){let t=`nonce`in e?e.nonce:void 0;return typeof t==`string`?me(t):void 0}function me(e){return e.trim()||void 0}export{e as n,t as r,s as t};
package/dist/react.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./install-BVH5H7gL.js";import{useEffect as t,useRef as n}from"react";function r({activationParam:r,build:i,collaboration:a,developerTools:o,enabled:s,navigateToFeedback:c,offset:l,onError:u,onInactive:d,onReady:f,position:p,runtime:m,serviceUrl:h,sourceContextResolver:g,styleNonce:_}){let v=n(u),y=n(d),b=n(f),x=n(null),S=i?.buildId,C=i?.gitCommit,w=i?.generatedAt,T=i?.mode,E=o?.codeContextCopy===!0||o?.reactGrab===!0,D=a?.cursors===!0,O=a?.chat===!0;return v.current=u,y.current=d,b.current=f,t(()=>{if(s===!1)return;let t=e({activationParam:r,build:S===void 0&&C===void 0&&w===void 0&&T===void 0?void 0:{buildId:S,gitCommit:C,generatedAt:w,mode:T},collaboration:D||O?{cursors:D,chat:O}:void 0,developerTools:E?{codeContextCopy:!0}:void 0,enabled:s,navigateToFeedback:c,offset:l,onError:e=>v.current?.(e),onInactive:e=>{let t=`${e.reason}\n${e.origin}`;x.current!==t&&(x.current=t,y.current?.(e))},onReady:e=>{x.current=null,b.current?.(e)},runtime:m,position:p,serviceUrl:h,sourceContextResolver:g,styleNonce:_});return()=>t.dispose()},[r,S,T,O,D,E,s,w,C,c,l?.x,l?.y,p,m,h,g,_]),null}r.displayName=`VisualReview`;export{r as VisualReview};
1
+ import{t as e}from"./install-Dh6WT91E.js";import{useEffect as t,useRef as n}from"react";function r({activationParam:r,build:i,collaboration:a,developerTools:o,enabled:s,navigateToFeedback:c,offset:l,onError:u,onInactive:d,onReady:f,position:p,runtime:m,serviceUrl:h,sourceContextResolver:g,styleNonce:_}){let v=n(u),y=n(d),b=n(f),x=n(null),S=i?.buildId,C=i?.gitCommit,w=i?.generatedAt,T=i?.mode,E=o?.codeContextCopy===!0||o?.reactGrab===!0,D=a?.cursors===!0,O=a?.chat===!0;return v.current=u,y.current=d,b.current=f,t(()=>{if(s===!1)return;let t=e({activationParam:r,build:S===void 0&&C===void 0&&w===void 0&&T===void 0?void 0:{buildId:S,gitCommit:C,generatedAt:w,mode:T},collaboration:D||O?{cursors:D,chat:O}:void 0,developerTools:E?{codeContextCopy:!0}:void 0,enabled:s,navigateToFeedback:c,offset:l,onError:e=>v.current?.(e),onInactive:e=>{let t=`${e.reason}\n${e.origin}`;x.current!==t&&(x.current=t,y.current?.(e))},onReady:e=>{x.current=null,b.current?.(e)},runtime:m,position:p,serviceUrl:h,sourceContextResolver:g,styleNonce:_});return()=>t.dispose()},[r,S,T,O,D,E,s,w,C,c,l?.x,l?.y,p,m,h,g,_]),null}r.displayName=`VisualReview`;export{r as VisualReview};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@01.works/visual-review",
3
- "version": "0.9.5",
3
+ "version": "0.9.6",
4
4
  "description": "Invitation-only visual feedback for staging websites, hosted by 01.works.",
5
5
  "repository": {
6
6
  "type": "git",