@01.works/visual-review 0.4.0 → 0.5.0

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.
@@ -0,0 +1 @@
1
+ function e(e){return{unavailableProvenance:()=>n(e,`unavailable`),async resolve(i,a){let o=a?.signal;r(o);let s=i.closest(`[data-review-source]`),c=s?t(s):null;return r(o),{source:c,componentStack:c?[c]:[],provenance:n(e,c?`fallback`:`unavailable`)}}}}function t(e){let t=e.getAttribute(`data-review-source`)?.trim();if(!t)return null;let n=/^(.*?)(?::(\d+))?(?::(\d+))?$/u.exec(t),r=n?.[1]?.trim();return r?{filePath:r,lineNumber:n?.[2]?Number(n[2]):null,columnNumber:n?.[3]?Number(n[3]):null,componentName:e.getAttribute(`data-review-component`)?.trim()||null,origin:`app`}:null}function n(e,t){return{provider:`embedded`,build:e.build,resolvedAt:e.now?.()??Date.now(),sourceMapStatus:t}}function r(e){if(e?.aborted)throw e.reason??Error(`Source context resolution aborted`)}export{e as createGeneratedSourceContextResolver};
@@ -0,0 +1,13 @@
1
+ import{r as e}from"./install-COwLLFZK.js";import{i as t,init as n}from"@instantdb/core";const r=t.schema({entities:{$users:t.entity({email:t.string().unique().indexed()}),projects:t.entity({name:t.string(),slug:t.string().unique().indexed(),allowedOrigin:t.string().optional(),createdAt:t.number().indexed(),updatedAt:t.number()}),reviewPages:t.entity({projectId:t.string().indexed(),autoRegistrationSlot:t.string().unique().indexed().optional(),name:t.string(),pathname:t.string(),stagingOrigin:t.string(),createdAt:t.number().indexed(),updatedAt:t.number()}),reviewPageBuilds:t.entity({projectId:t.string().indexed(),pageId:t.string().unique().indexed(),buildId:t.string(),gitCommit:t.string().optional(),generatedAt:t.number().optional(),mode:t.string(),updatedAt:t.number().indexed()}),reviewers:t.entity({authUserId:t.string().indexed(),projectId:t.string().indexed(),email:t.string().indexed(),displayName:t.string(),role:t.string(),createdAt:t.number()}),reviewerIdentityClaims:t.entity({reviewerId:t.string().unique().indexed(),projectId:t.string().indexed(),authUserId:t.string().indexed(),email:t.string(),displayName:t.string(),role:t.string(),createdAt:t.number()}),invitations:t.entity({projectId:t.string().indexed(),reviewerId:t.string().indexed().optional(),email:t.string().indexed(),status:t.string().indexed(),claimRevision:t.number(),claimedByAuthUserId:t.string().indexed().optional(),expiresAt:t.number().indexed(),createdAt:t.number(),acceptedAt:t.number().optional(),revokedAt:t.number().optional()}),comments:t.entity({pageId:t.string().indexed(),authorId:t.string().indexed(),authorAuthUserId:t.string().indexed(),authorName:t.string(),body:t.string(),bodyContentMarker:t.string().optional(),anchorSelector:t.string().optional(),anchorOffsetX:t.number().optional(),anchorOffsetY:t.number().optional(),anchorViewportX:t.number().optional(),anchorViewportY:t.number().optional(),targetKind:t.string().optional(),targetPageX:t.number().optional(),targetPageY:t.number().optional(),targetWidth:t.number().optional(),targetHeight:t.number().optional(),targetViewportX:t.number().optional(),targetViewportY:t.number().optional(),targetViewportWidth:t.number().optional(),targetViewportHeight:t.number().optional(),targetPageOrigin:t.string().optional(),targetPagePathname:t.string().optional(),targetPageSearch:t.string().optional(),targetPageHash:t.string().optional(),targetPageTitle:t.string().optional(),targetCapturedAt:t.number().optional(),status:t.string().indexed(),workflowRevision:t.number(),createdAt:t.number().indexed(),updatedAt:t.number().indexed(),resolvedAt:t.number().optional(),resolvedById:t.string().optional()}),commentTargetElements:t.entity({commentId:t.string().indexed(),slotKey:t.string().unique().indexed().optional(),ordinal:t.number(),selector:t.string(),tagName:t.string(),textPreview:t.string(),pageX:t.number(),pageY:t.number(),width:t.number(),height:t.number(),viewportX:t.number(),viewportY:t.number(),viewportWidth:t.number(),viewportHeight:t.number(),authorAuthUserId:t.string().indexed()}),commentScopeEntries:t.entity({commentId:t.string().indexed(),slotKey:t.string().unique().indexed().optional(),ordinal:t.number(),key:t.string(),valueType:t.string(),stringValue:t.string().optional(),numberValue:t.number().optional(),booleanValue:t.boolean().optional(),authorAuthUserId:t.string().indexed()}),commentSourceContexts:t.entity({commentId:t.string().unique().indexed(),pageId:t.string().indexed(),authorAuthUserId:t.string().indexed(),contextJson:t.string(),createdAt:t.number().indexed()}),replies:t.entity({pageId:t.string().indexed(),commentId:t.string().indexed(),authorId:t.string().indexed(),authorAuthUserId:t.string().indexed(),authorName:t.string(),body:t.string(),bodyContentMarker:t.string().optional(),createdAt:t.number().indexed(),updatedAt:t.number().indexed()}),reviewMessages:t.entity({pageId:t.string().indexed(),pathname:t.string().indexed(),authorId:t.string().indexed(),authorAuthUserId:t.string().indexed(),authorName:t.string(),body:t.string(),bodyContentMarker:t.string(),createdAt:t.number().indexed(),updatedAt:t.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`}},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:`one`,label:`activeReviewInvitation`}},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`}},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:t.entity({reviewerId:t.string(),displayName:t.string(),color:t.string(),active:t.boolean(),cursorX:t.number().optional(),cursorY:t.number().optional(),viewportWidth:t.number().optional(),viewportHeight:t.number().optional()})}}}),i=new Uint8Array([107,167,184,17,157,173,17,209,128,180,0,192,79,212,48,200]);function a(e,t,n){return l(e,n),`${e}:${t}:${n}`}async function o(e,t,n){return c(a(e,t,n))}async function s(e){if(!e.trim())throw Error(`Comment ID is required for source context`);return c(`${e}:source-context`)}async function c(e){let t=globalThis.crypto?.subtle;if(!t)throw Error(`Web Crypto is required to persist review capture context`);let n=new TextEncoder().encode(`01works.visual-review/v1/${e}`),r=new Uint8Array(i.length+n.length);r.set(i),r.set(n,i.length);let a=new Uint8Array(await t.digest(`SHA-1`,r)).slice(0,16);a[6]=a[6]&15|80,a[8]=a[8]&63|128;let o=[...a].map(e=>e.toString(16).padStart(2,`0`)).join(``);return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20)}`}function l(e,t){if(!e.trim())throw Error(`Comment ID is required for capture context`);if(!Number.isSafeInteger(t)||t<0)throw Error(`Capture child ordinal must be a non-negative integer`)}const u=131072,d=32768,f=4096,p=1e3;var m=class extends Error{constructor(e,t){super(e,t),this.name=`InstantCaptureIntegrityError`}};function h(e){let t=ne(e,`comment target`,!0),n={kind:t.kind,anchor:ce(t.anchor),region:de(t.region),elements:t.elements.map(e=>({selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,rect:de(e.rect),source:null,componentStack:[]})),pageUrl:t.pageUrl,pageTitle:t.pageTitle,capturedAt:t.capturedAt},r={elements:t.elements.map(e=>({selector:e.selector,source:e.source?fe(e.source):null,componentStack:e.componentStack.map(fe)})),...t.sourceProvenance?{sourceProvenance:pe(t.sourceProvenance)}:{}};A(n,u,`Public target`);let i=be(r,65536,`Source context`);return{publicTarget:n,commentFields:y(n),targetElements:n.elements.map(b),sourceContextJson:i}}function g(e,t,n){let r=T(e,n),i={selector:E(r.anchorSelector,`${n} anchor selector`,f),offsetX:k(r.anchorOffsetX,`${n} anchor offsetX`),offsetY:k(r.anchorOffsetY,`${n} anchor offsetY`),viewportX:k(r.anchorViewportX,`${n} anchor viewportX`),viewportY:k(r.anchorViewportY,`${n} anchor viewportY`)},a=ee({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:ue({origin:D(r.targetPageOrigin,`${n} page origin`,1024),pathname:D(r.targetPagePathname,`${n} page pathname`,4096),search:E(r.targetPageSearch,`${n} page search`,1024),hash:E(r.targetPageHash,`${n} page hash`,1024)}),pageTitle:r.targetPageTitle,capturedAt:r.targetCapturedAt},n),o=x(t,`${n} elements`),s=a;for(let e of o)try{s=ee({...a,elements:[...s.elements,e]},n)}catch{}return s}function _(e){let t=te(e);return t?Object.entries(t).map(([e,t],n)=>typeof t==`string`?{ordinal:n,key:e,valueType:`string`,stringValue:t}:typeof t==`number`?{ordinal:n,key:e,valueType:`number`,numberValue:t}:typeof t==`boolean`?{ordinal:n,key:e,valueType:`boolean`,booleanValue:t}:{ordinal:n,key:e,valueType:`null`}):[]}function v(e){if(!Array.isArray(e)||e.length===0)return;let t=[...e].map(e=>{try{let t=T(e,`Comment scope entry`);return{row:t,ordinal:ge(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=D(e.key,`Comment scope key`,256);if(Object.hasOwn(n,t))continue;switch(e.valueType){case`string`:n[t]=E(e.stringValue,`Comment scope ${t}`,p);break;case`number`:n[t]=O(e.numberValue,`Comment scope ${t}`);break;case`boolean`:if(typeof e.booleanValue!=`boolean`)throw j(`Comment scope ${t} is invalid`);n[t]=e.booleanValue;break;case`null`:n[t]=null;break;default:throw j(`Comment scope ${t} is invalid`)}}catch{}}if(Object.keys(n).length!==0)try{return A(n,d,`Comment scope`),n}catch{return}}function y(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:le(t.pathname),targetPageSearch:t.search.slice(1),targetPageHash:t.hash.slice(1),targetPageTitle:e.pageTitle,targetCapturedAt:e.capturedAt}}function b(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 x(e,t){if(!Array.isArray(e)||e.length===0)return[];let n=[...e].map(e=>{try{let n=T(e,t);return{row:n,ordinal:ge(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(re({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 ee(e,t){return ne(e,t,!1)}function S(e,t=`Comment body`){return D(e,t,2e4)}function C(e,t=`Comment body`){let n=S(e,t);for(let e of n)if(e.trim())return e;throw j(`${t} is empty`)}function te(e){if(e==null)return;let t=T(e,`Comment scope`);if(Object.keys(t).length>20)throw j(`Comment scope has too many fields`);let n={};for(let[e,r]of Object.entries(t)){if(!e.trim()||e.length>256)throw j(`Comment scope has an invalid key`);if(typeof r==`string`){if(r.length>p)throw j(`Comment scope ${e} is too long`);n[e]=r}else if(typeof r==`number`)n[e]=O(r,`Comment scope ${e}`);else if(typeof r==`boolean`||r===null)n[e]=r;else throw j(`Comment scope ${e} is invalid`)}return A(n,d,`Comment scope`),n}function ne(e,t,n){let r=w(e,t,[`kind`,`anchor`,`region`,`elements`,`pageUrl`,`pageTitle`,`capturedAt`,`sourceProvenance`],[`sourceProvenance`]),i=r.kind;if(i!==`element`&&i!==`region`&&i!==`viewport`)throw j(`${t} kind is invalid`);let a=me(r.elements,`${t} elements`);if(a.length>8)throw j(`${t} contains too many elements`);if(!n&&r.sourceProvenance!=null)throw j(`${t} exposes source provenance`);let o=D(r.pageUrl,`${t} pageUrl`,8192);ye(o,`${t} pageUrl`);let s={kind:i,anchor:ie(r.anchor,`${t} anchor`),region:ae(r.region,`${t} region`),elements:a.map((e,r)=>re(e,`${t} elements[${r}]`,n)),pageUrl:o,pageTitle:E(r.pageTitle,`${t} pageTitle`,p),capturedAt:_e(r.capturedAt,`${t} capturedAt`),...n&&r.sourceProvenance!=null?{sourceProvenance:se(r.sourceProvenance,`${t} provenance`)}:{}};return A(s,n?196608:u,t),s}function re(e,t,n){let r=w(e,t,[`selector`,`tagName`,`textPreview`,`rect`,`source`,`componentStack`]),i=me(r.componentStack,`${t} componentStack`);if(i.length>32)throw j(`${t} componentStack is too large`);if(!n&&(r.source!=null||i.length>0))throw j(`${t} exposes source metadata`);return{selector:D(r.selector,`${t} selector`,f),tagName:D(r.tagName,`${t} tagName`,128),textPreview:E(r.textPreview,`${t} textPreview`,p),rect:ae(r.rect,`${t} rect`),source:n&&r.source!=null?oe(r.source,`${t} source`):null,componentStack:n?i.map((e,n)=>oe(e,`${t} stack[${n}]`)):[]}}function ie(e,t){let n=w(e,t,[`selector`,`offsetX`,`offsetY`,`viewportX`,`viewportY`]);return{selector:E(n.selector,`${t} selector`,f),offsetX:k(n.offsetX,`${t} offsetX`),offsetY:k(n.offsetY,`${t} offsetY`),viewportX:k(n.viewportX,`${t} viewportX`),viewportY:k(n.viewportY,`${t} viewportY`)}}function ae(e,t){let n=w(e,t,[`pageX`,`pageY`,`width`,`height`,`viewportX`,`viewportY`,`viewportWidth`,`viewportHeight`]),r={pageX:O(n.pageX,`${t} pageX`),pageY:O(n.pageY,`${t} pageY`),width:O(n.width,`${t} width`),height:O(n.height,`${t} height`),viewportX:O(n.viewportX,`${t} viewportX`),viewportY:O(n.viewportY,`${t} viewportY`),viewportWidth:O(n.viewportWidth,`${t} viewportWidth`),viewportHeight:O(n.viewportHeight,`${t} viewportHeight`)};if(r.width<0||r.height<0||r.viewportWidth<0||r.viewportHeight<0)throw j(`${t} has a negative dimension`);return r}function oe(e,t){let n=w(e,t,[`filePath`,`lineNumber`,`columnNumber`,`componentName`,`origin`,`generated`],[`generated`]),r=n.origin;if(r!==`app`&&r!==`shared-ui`&&r!==`dependency`&&r!==`generated`&&r!==`unknown`)throw j(`${t} origin is invalid`);return{filePath:D(n.filePath,`${t} filePath`,f),lineNumber:ve(n.lineNumber,`${t} lineNumber`),columnNumber:ve(n.columnNumber,`${t} columnNumber`),componentName:n.componentName==null?null:D(n.componentName,`${t} componentName`,512),origin:r}}function se(e,t){let n=w(e,t,[`provider`,`build`,`resolvedAt`,`sourceMapStatus`]),r=n.provider;if(r!==`react-grab`&&r!==`embedded`&&r!==`custom`)throw j(`${t} provider is invalid`);let i=n.sourceMapStatus;if(i!==`resolved`&&i!==`fallback`&&i!==`unavailable`)throw j(`${t} sourceMapStatus is invalid`);let a=w(n.build,`${t} build`,[`buildId`,`gitCommit`,`generatedAt`,`mode`],[`generatedAt`]),o=a.mode;if(o!==`development`&&o!==`preview`&&o!==`production`)throw j(`${t} build mode is invalid`);return{provider:r,build:{buildId:D(a.buildId,`${t} buildId`,512),gitCommit:a.gitCommit==null?null:D(a.gitCommit,`${t} gitCommit`,256),...a.generatedAt==null?{}:{generatedAt:_e(a.generatedAt,`${t} generatedAt`)},mode:o},resolvedAt:_e(n.resolvedAt,`${t} resolvedAt`),sourceMapStatus:i}}function ce(e){return{...e}}function le(e){return e.replace(/\/+$/,``)||`/`}function ue(e){return`${e.origin}${e.pathname}${e.search?`?${e.search}`:``}${e.hash?`#${e.hash}`:``}`}function de(e){return{...e}}function fe(e){return{...e}}function pe(e){return{...e,build:{...e.build}}}function w(e,t,n,r=[]){let i=T(e,t);if(Object.keys(i).some(e=>!n.includes(e)))throw j(`${t} contains unknown fields`);for(let e of n)if(!r.includes(e)&&!Object.hasOwn(i,e))throw j(`${t} is missing ${e}`);return i}function T(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw j(`${t} is missing or invalid`);return e}function me(e,t){if(!Array.isArray(e))throw j(`${t} is missing or invalid`);return e}function E(e,t,n){if(typeof e!=`string`||he(e,n)>n)throw j(`${t} is invalid or too long`);return e}function he(e,t){let n=0;for(let r of e)if(n+=1,n>t)return n;return n}function D(e,t,n){let r=E(e,t,n);if(!r.trim())throw j(`${t} is empty`);return r}function O(e,t){if(typeof e!=`number`||!Number.isFinite(e))throw j(`${t} is invalid`);return e}function ge(e,t,n,r){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<n||e>r)throw j(`${t} is invalid`);return e}function k(e,t){let n=O(e,t);if(n<0||n>1)throw j(`${t} is outside 0..1`);return n}function _e(e,t){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw j(`${t} is invalid`);return e}function ve(e,t){if(e===null)return null;if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0)throw j(`${t} is invalid`);return e}function ye(e,t){let n;try{n=new URL(e)}catch(e){throw j(`${t} is invalid`,e)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw j(`${t} must use HTTP or HTTPS`)}function A(e,t,n){be(e,t,n)}function be(e,t,n){let r;try{r=JSON.stringify(e)}catch(e){throw j(`${n} cannot be serialized`,e)}if(r.length>t)throw j(`${n} is too large`);return r}function j(e,t){return new m(e,{cause:t instanceof Error?t:void 0})}function xe(e){if(!e.trim())throw Error(`InstantDB app ID is required`);return n({appId:e,schema:r})}var Se=class{db;session;#e;constructor(e,t,n={}){this.db=e,this.session=t,this.#e=n.commentTransport}async getSnapshot(e){let{data:t}=await this.db.queryOnce(Ce(e,this.session.authUserId));return we(e,t.comments,t.replies)}subscribe(e,t,n){return this.db.subscribeQuery(Ce(e,this.session.authUserId),r=>{if(r.error){n?.(je(r.error));return}if(r.data)try{t(we(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=S(n.body).trim(),i=C(r),c=F(n.createdAt,`Comment createdAt`),l=F(n.updatedAt,`Comment updatedAt`);if(l<c)throw new m(`Comment updatedAt precedes createdAt`);if(n.createdAt!==n.updatedAt)throw new m(`Comment edits must go through the review service`);if(n.status!==`open`||n.resolvedAt!==void 0||n.resolvedById!==void 0)throw new m(`New comments must start open`);let u=h(n.target);if(!Oe(n.anchor,u.publicTarget.anchor))throw new m(`Comment anchor does not match its target`);if(this.#e){await this.#e.createComment({pageId:e,commentId:n.id,body:r,target:n.target,...n.scope===void 0?{}:{scope:n.scope}});return}let d=_(n.scope),f=await Promise.all(u.targetElements.map(async e=>({element:e,id:await o(n.id,`element`,e.ordinal),slotKey:a(n.id,`element`,e.ordinal)}))),p=await Promise.all(d.map(async e=>({entry:e,id:await o(n.id,`scope`,e.ordinal),slotKey:a(n.id,`scope`,e.ordinal)}))),g=await s(n.id);await this.db.transact([this.db.tx.comments[n.id].update({pageId:e,authorId:this.session.reviewerId,authorAuthUserId:this.session.authUserId,authorName:this.session.displayName,body:r,bodyContentMarker:i,...u.commentFields,status:n.status,workflowRevision:0,createdAt:c,updatedAt:l}).link({page:e,author:this.session.reviewerId}),...f.map(({element:e,id:t,slotKey:r})=>this.db.tx.commentTargetElements[t].update({commentId:n.id,slotKey:r,authorAuthUserId:this.session.authUserId,...e}).link({comment:n.id})),...p.map(({entry:e,id:t,slotKey:r})=>this.db.tx.commentScopeEntries[t].update({commentId:n.id,slotKey:r,authorAuthUserId:this.session.authUserId,...e}).link({comment:n.id})),this.db.tx.commentSourceContexts[g].update({commentId:n.id,pageId:e,authorAuthUserId:this.session.authUserId,contextJson:u.sourceContextJson,createdAt:c}).link({comment:n.id,page:e,author:this.session.reviewerId})]);return}case`comment.delete`:throw new m(`Comment deletion must go through the review service`);case`reply.upsert`:{let n=t.reply;if(n.authorId!==this.session.reviewerId)throw Error(`Reply author mismatch`);let r=S(n.body,`Reply body`).trim(),i=C(r,`Reply body`),a=F(n.createdAt,`Reply createdAt`),o=F(n.updatedAt,`Reply updatedAt`);if(o<a)throw new m(`Reply updatedAt precedes createdAt`);if(n.createdAt!==n.updatedAt)throw new m(`Reply edits must go through the review service`);if(this.#e){await this.#e.createReply({commentId:n.commentId,replyId:n.id,body:r});return}await this.db.transact(this.db.tx.replies[n.id].update({pageId:e,commentId:n.commentId,authorId:this.session.reviewerId,authorAuthUserId:this.session.authUserId,authorName:this.session.displayName,body:r,bodyContentMarker:i,createdAt:a,updatedAt:o}).link({comment:n.commentId,author:this.session.reviewerId}));return}case`reply.delete`:throw new m(`Reply deletion must go through the review service`)}}};function Ce(e,t){return{comments:{$:{where:{pageId:e},order:{createdAt:`asc`}},targetElements:{},scopeEntries:{}},replies:{$:{where:{pageId:e},order:{createdAt:`asc`}}},$users:{$:{where:{id:t}},activeReviewInvitation:{project:{}}}}}function we(e,t,n){let r=t.map(t=>Te(t,e));Ae(r,`comment`);let i=new Set(r.map(({id:e})=>e)),a=n.map(t=>Ee(t,e));Ae(a,`reply`);for(let e of a)if(!i.has(e.commentId))throw new m(`Reply ${e.id} references a comment outside the page snapshot`);return{pageId:e,comments:r,replies:a}}function Te(e,t){let n=M(e,`comment`),r=N(n.id,`comment id`);if(N(n.pageId,`comment ${r} pageId`)!==t)throw new m(`Comment ${r} escaped its page scope`);N(n.authorAuthUserId,`comment ${r} authorAuthUserId`);let i=!(Object.hasOwn(n,`anchor`)&&Object.hasOwn(n,`target`)),a=i?g(n,n.targetElements,`comment ${r} target`):ee(n.target,`comment ${r} target`),o=i?{...a.anchor}:De(n.anchor,`comment ${r} anchor`);if(!Oe(o,a.anchor))throw new m(`Comment ${r} has inconsistent anchors`);let s=n.status;if(s!==`open`&&s!==`resolved`)throw new m(`Comment ${r} has an invalid status`);let c=F(n.createdAt,`comment ${r} createdAt`),l=F(n.updatedAt,`comment ${r} updatedAt`);if(l<c)throw new m(`Comment ${r} updatedAt precedes createdAt`);let u=Fe(n.resolvedAt,`comment ${r} resolvedAt`),d=Ie(n.resolvedById,`comment ${r} resolvedById`);if(s===`open`&&(u!==void 0||d!==void 0))throw new m(`Open comment ${r} contains resolution metadata`);if(s===`resolved`&&(u===void 0||d===void 0||u!==l))throw new m(`Resolved comment ${r} has invalid workflow metadata`);return{id:r,pageId:t,authorId:N(n.authorId,`comment ${r} authorId`),authorName:N(n.authorName,`comment ${r} authorName`),body:S(n.body,`comment ${r} body`),anchor:o,target:a,...i?ke(v(n.scopeEntries)):n.scope==null?{}:{scope:te(n.scope)},status:s,workflowRevision:Pe(n.workflowRevision,`comment ${r} workflowRevision`),createdAt:c,updatedAt:l,...u===void 0?{}:{resolvedAt:u},...d===void 0?{}:{resolvedById:d}}}function Ee(e,t){let n=M(e,`reply`),r=N(n.id,`reply id`);if(N(n.pageId,`reply ${r} pageId`)!==t)throw new m(`Reply ${r} escaped its page scope`);N(n.authorAuthUserId,`reply ${r} authorAuthUserId`);let i=F(n.createdAt,`reply ${r} createdAt`),a=F(n.updatedAt,`reply ${r} updatedAt`);if(a<i)throw new m(`Reply ${r} updatedAt precedes createdAt`);return{id:r,commentId:N(n.commentId,`reply ${r} commentId`),authorId:N(n.authorId,`reply ${r} authorId`),authorName:N(n.authorName,`reply ${r} authorName`),body:S(n.body,`reply ${r} body`),createdAt:i,updatedAt:a}}function De(e,t){let n=M(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 m(`${t} has invalid fields`);return{selector:Ne(n.selector,`${t} selector`),offsetX:P(n.offsetX,`${t} offsetX`),offsetY:P(n.offsetY,`${t} offsetY`),viewportX:P(n.viewportX,`${t} viewportX`),viewportY:P(n.viewportY,`${t} viewportY`)}}function Oe(e,t){return e.selector===t.selector&&e.offsetX===t.offsetX&&e.offsetY===t.offsetY&&e.viewportX===t.viewportX&&e.viewportY===t.viewportY}function ke(e){return e===void 0?{}:{scope:e}}function Ae(e,t){let n=new Set;for(let r of e){if(n.has(r.id))throw new m(`Duplicate ${t} ${r.id}`);n.add(r.id)}}function je(e){let t=Me(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 Me(e){return e instanceof Error?e.message:e&&typeof e==`object`&&`message`in e?String(e.message):``}function M(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new m(`${t} is missing or invalid`);return e}function Ne(e,t){if(typeof e!=`string`)throw new m(`${t} is invalid`);return e}function N(e,t){let n=Ne(e,t);if(!n.trim())throw new m(`${t} is empty`);return n}function P(e,t){if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw new m(`${t} is invalid`);return e}function F(e,t){if(!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw new m(`${t} is invalid`);return e}function Pe(e,t){if(!Number.isSafeInteger(e)||e<0)throw new m(`${t} is invalid`);return e}function Fe(e,t){return e==null?void 0:F(e,t)}function Ie(e,t){return e==null?void 0:N(e,t)}Object.freeze({field:`createdAt`,direction:`desc`,tieBreaker:`id`,tieDirection:`desc`}),Object.freeze({comments:200,replies:1e3,sourceContexts:200});var Le=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=Ge(e,t.roomId),a,l,u=this.roomCredential??{id:t.roomId,expiresAt:2**53-1,refresh:async()=>void 0},d=t=>{let o=this.db.joinRoom(`visualReview`,t),s=o.subscribePresence({},e=>{if(e.error){r?.(z(e.error));return}i=Object.values(e.peers).map(e=>ze(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?.()},f=()=>{if(!this.roomCredential||o)return;let e=Math.max(1e3,u.expiresAt-Date.now()+250);l=setTimeout(()=>{p()},e)},p=async()=>{try{let e=await u.refresh();if(o||!e)return;u={...e,refresh:u.refresh},d(e.id),f()}catch(e){if(o)return;r?.(z(e)),o||(l=setTimeout(()=>{p()},5e3))}};d(u.id),f(),s.push(()=>{l&&clearTimeout(l),this.#e.delete(n),a?.()})}return t.chat&&s.push(this.db.subscribeQuery(Re(e,this.session.authUserId),t=>{if(t.error){r?.(z(t.error));return}if(t.data)try{a=t.data.reviewMessages.map(t=>Be(t,e)).sort(Ke),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(Ge(e,t));r&&r.publishPresence({reviewerId:this.session.reviewerId,displayName:this.session.displayName,color:n.color,active:n.active,...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}})}async sendMessage(e,t){if(t.pageId!==e)throw Error(`Review message page mismatch`);if(t.authorId!==this.session.reviewerId)throw Error(`Review message author mismatch`);let n=Ve(t.body),r=He(t.pathname),i=R(t.createdAt,`Review message createdAt`),a=R(t.updatedAt,`Review message updatedAt`);if(i!==a)throw Error(`New review messages must be immutable`);await this.db.transact(this.db.tx.reviewMessages[t.id].update({pageId:e,pathname:r,authorId:this.session.reviewerId,authorAuthUserId:this.session.authUserId,authorName:this.session.displayName,body:n,bodyContentMarker:C(n,`Review message body`),createdAt:i,updatedAt:a}).link({page:e,author:this.session.reviewerId}))}};function Re(e,t){return{reviewMessages:{$:{where:{pageId:e},order:{createdAt:`asc`}}},$users:{$:{where:{id:t}},activeReviewInvitation:{project:{}}}}}function ze(e){let t=Ue(e.reviewerId,128),n=Ue(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=L(e.cursorX),a=L(e.cursorY),o=We(e.viewportWidth),s=We(e.viewportHeight);return{peerId:e.peerId,reviewerId:t,displayName:n,color:r,active:e.active,...i===void 0?{}:{cursorX:i},...a===void 0?{}:{cursorY:a},...o===void 0?{}:{viewportWidth:o},...s===void 0?{}:{viewportHeight:s}}}function Be(e,t){let n=I(e.id,`Review message id`,128);if(I(e.pageId,`Review message pageId`,128)!==t)throw Error(`Review message page mismatch`);return{id:n,pageId:t,pathname:He(e.pathname),authorId:I(e.authorId,`Review message authorId`,128),authorName:I(e.authorName,`Review message authorName`,512),body:Ve(e.body),createdAt:R(e.createdAt,`Review message createdAt`),updatedAt:R(e.updatedAt,`Review message updatedAt`)}}function Ve(e){return I(e,`Review message body`,4e3)}function He(e){let t=I(e,`Review message pathname`,2e3);if(!t.startsWith(`/`))throw Error(`Review message pathname is invalid`);return t}function I(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 Ue(e,t){if(typeof e!=`string`)return null;let n=e.trim();return n&&n.length<=t?n:null}function L(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function We(e){let t=L(e);return t!==void 0&&t>0?t:void 0}function R(e,t){if(!Number.isSafeInteger(e)||e<0)throw Error(`${t} is invalid`);return e}function Ge(e,t){return JSON.stringify([e,t])}function Ke(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function z(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`});const B={$default:`false`},V={$default:`false`},H=`$user.activeReviewInvitation.project.id`;function U(e){return[`auth.id != null`,`size(auth.ref('$user.activeReviewInvitation.id')) == 1`,`size(auth.ref('${H}')) == 1`,`size(auth.ref('$user.activeReviewInvitation.status')) == 1`,`size(auth.ref('$user.activeReviewInvitation.expiresAt')) == 1`,`size(auth.ref('$user.activeReviewInvitation.revokedAt')) == 0`,`auth.ref('$user.activeReviewInvitation.status')[0] == 'accepted'`,`request.time < timestamp(auth.ref('$user.activeReviewInvitation.expiresAt')[0])`,e].join(` && `)}function W(...e){return e.map(e=>`(${e})`).join(` && `)}function G(...e){return e.map(e=>`(${e})`).join(` || `)}function K(e,t){return`!has(${e}.${t}) || ${e}.${t} == null`}const qe=`actions.data == 'create' && actions.linkedData == 'update'`,Je=e=>`${e}.matches('[^ \\t\\n\\r\\f\\u000b\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]')`,Ye=e=>W(`${e} >= 0`,`${e} <= 253402300799999`,`${e} % 1 == 0`),Xe=e=>W(Ye(e),`(request.time - timestamp(${e})).getSeconds() <= 86400`,`(request.time - timestamp(${e})).getSeconds() >= -300`);W(`actions.data == 'update' && actions.linkedData == 'create'`,G(`auth.id != null && auth.id in data.ref('project.owners.id')`,U(`auth.ref('${H}')[0] in data.ref('project.id')`))),W(qe,G(`auth.id != null && auth.id in data.ref('page.project.owners.id')`,U(`auth.ref('${H}')[0] in data.ref('page.project.id')`)),`auth.id != null && auth.id == data.authorAuthUserId && auth.id in data.ref('author.$user.id')`,`data.pageId in data.ref('page.id')`,`data.authorId in data.ref('author.id') && data.authorAuthUserId in data.ref('author.$user.id') && data.authorName in data.ref('author.displayName')`,`data.pageId in data.ref('author.project.pages.id')`),W(qe,`data.pageId == linkedData.id`,`auth.id != null && auth.id == data.authorAuthUserId`,`data.authorId in auth.ref('$user.reviewerMemberships.id')`,`data.authorId in linkedData.ref('project.reviewers.id')`,G(`auth.id != null && auth.id in linkedData.ref('project.owners.id')`,U(`auth.ref('${H}')[0] in linkedData.ref('project.id')`)));const Ze=`auth.id != null && auth.id in data.ref('comment.page.project.owners.id')`,Qe=U(`auth.ref('${H}')[0] in data.ref('comment.page.project.id')`);U(`auth.ref('${H}')[0] in data.ref('comment.page.project.id')`),U(`auth.ref('${H}')[0] in data.ref('page.project.id')`);const $e=W(`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')`);W(`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`,$e),W(`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`,$e),W(`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')`),W(`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')`),W(`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')`),{...B},{...V},{...V},U(`data.id == auth.ref('${H}')[0]`),{...B},W(`isOwner`,G(W(K(`data`,`allowedOrigin`),K(`newData`,`allowedOrigin`)),`newData.allowedOrigin == data.allowedOrigin`)),{...V},{...B},W(`isOwner`,G(W(K(`data`,`autoRegistrationSlot`),K(`newData`,`autoRegistrationSlot`)),`newData.autoRegistrationSlot == data.autoRegistrationSlot`)),{...V},{...B},{...V},U(`auth.ref('${H}')[0] in data.ref('project.id')`),{...B},{...V},{...B},{...B},{...V},{...V},{...B},{...V},{...B},G(Ze,Qe),{...B},G(Ze,Qe),{...B},{...B},W(`data.createdAt == data.updatedAt`,Xe(`data.createdAt`),`size(data.body) > 0`,`size(data.body) <= 4000`,`size(data.bodyContentMarker) == 1`,Je(`data.bodyContentMarker`),`data.body.startsWith(data.bodyContentMarker)`,`size(data.authorName) > 0`,`size(data.authorName) <= 512`,Je(`data.authorName`),`size(data.pathname) > 0`,`size(data.pathname) <= 2000`,`request.modifiedFields.all(field, field in ['pageId', 'pathname', 'authorId', 'authorAuthUserId', 'authorName', 'body', 'bodyContentMarker', 'createdAt', 'updatedAt', 'page', 'author'])`),{...B},{...V};var et=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ReviewerCommentSaveError`}};function tt(e,t){let n=e.replace(/\/+$/,``),r=async(e,r)=>{let i=await t();if(!i)throw new et(`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 et(`NETWORK`,`리뷰 서버에 연결하지 못했습니다. 연결을 확인하고 다시 시도해 주세요.`)}if(!a.ok)throw new et(...await nt(a))};return{createComment:e=>r(`/v1/comments`,e),createReply:e=>r(`/v1/replies`,e)}}async function nt(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 rt=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ReviewBootstrapError`}};const q=new Map;function it(e,t={}){let n=e.trim();if(!n)throw Error(`InstantDB app ID is required`);return{async resolve(e){let r=(t.databaseFactory??xe)(n),i=await st(n,r,e.authHost,e.signal,e.styleNonce,t.reviewerToken);for(;;)try{await at(t.acceptInvitation,{refreshToken:i.refresh_token,invitationId:e.invitationId,suggestedDisplayName:bt(i.email),authHost:e.authHost,signal:e.signal,styleNonce:e.styleNonce});break}catch(a){if(!xt(a,`INVITATION_EMAIL_MISMATCH`))throw a;await pt(e.authHost,e.signal,e.styleNonce),i=await ct(n,r,i,e.authHost,e.signal,e.styleNonce,t.reviewerToken)}let{data:a}=await r.queryOnce({reviewers:{$:{where:{authUserId:i.id}}},reviewPages:{$:{where:{stagingOrigin:e.location.origin}}},invitations:{}}),o=ot(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 rt(o.code,Tt(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=e.collaboration?.cursors===!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,l=c&&t.resolveCollaborationRoom?{...c,refresh:async()=>{let n=await r.getAuth();if(n?.refresh_token)return t.resolveCollaborationRoom?.({refreshToken:n.refresh_token,invitationId:e.invitationId,pageId:o.page.id,scopeId:e.collaboration.scopeId,signal:e.signal})}}:void 0;return{pageId:o.page.id,session:s,repository:new Se(r,s,{...t.serviceUrl===void 0?{}:{commentTransport:tt(t.serviceUrl,async()=>(await r.getAuth())?.refresh_token??null)}}),...e.collaboration?.cursors===!0||e.collaboration?.chat===!0?{collaborationRepository:new Le(r,s,l)}:{},...e.collaboration?.cursors===!0&&l?{collaborationRoomId:l.id}:{},allowedStagingHosts:[e.location.hostname]}}}}async function at(e,t){if(!e)return;let n={refreshToken:t.refreshToken,invitationId:t.invitationId,signal:t.signal};try{await e(n);return}catch(e){if(!xt(e,`DISPLAY_NAME_REQUIRED`))throw e}let r=await ft(t.authHost,t.signal,t.suggestedDisplayName,t.styleNonce);await e({...n,displayName:r})}function ot(e,t,n,r){let i=e.find(({id:e})=>e===r.invitationId);if(!i||wt(i.email)!==wt(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=Ct(r.location.pathname),s=n.find(e=>e.projectId===i.projectId&&e.stagingOrigin===r.location.origin&&Ct(e.pathname)===o);return s?{ok:!0,invitation:i,reviewer:a,page:s}:{ok:!1,code:`PAGE_NOT_FOUND`}}async function st(e,t,n,r,i,a){let o=await J(r,()=>t.getAuth());if(o)return o;let s=await lt(e,r);try{return await J(r,()=>t.getAuth())||(a?await J(r,async()=>{await t.auth.signInWithToken(a);let e=await t.getAuth();if(!e)throw Error(`Reviewer session did not establish`);return e}):await dt(t,n,r,i))}finally{s()}}async function ct(e,t,n,r,i,a,o){Y(i);let s=await lt(e,i);try{let e=await J(i,()=>t.getAuth());return e&&e.id!==n.id?e:(e&&await J(i,async()=>{await t.auth.signOut()}),Y(i),o?await J(i,async()=>{await t.auth.signInWithToken(o);let e=await t.getAuth();if(!e)throw Error(`Reviewer session did not establish`);return e}):await dt(t,r,i,a))}finally{s()}}async function lt(e,t){Y(t);let n=q.get(e);return n||(n={held:!1,waiters:[]},q.set(e,n)),n.held?new Promise((e,r)=>{let i,a=()=>{let e=n.waiters.indexOf(i);e<0||(n.waiters.splice(e,1),t.removeEventListener(`abort`,a),r(Z()))};i={signal:t,resolve:e,reject:r,abort:a},n.waiters.push(i),t.addEventListener(`abort`,a,{once:!0}),t.aborted&&a()}):(n.held=!0,ut(e,n))}function ut(e,t){let n=!1;return()=>{if(!n){for(n=!0;t.waiters.length>0;){let n=t.waiters.shift();if(n.signal.removeEventListener(`abort`,n.abort),n.signal.aborted){n.reject(Z());continue}n.resolve(ut(e,t));return}t.held=!1,q.get(e)===t&&q.delete(e)}}}async function J(e,t){Y(e);let n=await t();return Y(e),n}function Y(e){if(e.aborted)throw Z()}function dt(e,t,n,r){try{Y(n)}catch(e){return Promise.reject(e)}let i=ht(t);i.replaceChildren(gt(i,r),_t(i));let a=i.querySelector(`form`),o=i.querySelector(`h2`),s=i.querySelector(`.description`),c=a.elements.namedItem(`email`),l=a.elements.namedItem(`code`),u=i.querySelector(`.code`),d=i.querySelector(`button`),f=i.querySelector(`.error`),p=!1;return new Promise((t,r)=>{let m=!1,h=!1,g=!1,_=()=>{n.removeEventListener(`abort`,y),i.removeEventListener(`keydown`,b),a.removeEventListener(`submit`,x)},v=e=>{m||(m=!0,_(),e())},y=()=>{m||(g=!0,_(),h||v(()=>r(Z())))},b=e=>{let t=e;t.key===`Escape`?(t.preventDefault(),y()):t.key===`Tab`&&St(i,t)},x=async i=>{if(i.preventDefault(),!(m||h)){h=!0,f.textContent=``,d.disabled=!0,a.setAttribute(`aria-busy`,`true`);try{if(Y(n),!p){let t=c.value.trim();await J(n,async()=>{await e.auth.sendMagicCode({email:t})}),p=!0,c.readOnly=!0,u.hidden=!1,l.required=!0,o.textContent=`인증 코드`,s.textContent=`${t}로 보낸 코드를 입력하세요.`,d.textContent=`확인`,l.focus();return}await J(n,async()=>{await e.auth.signInWithMagicCode({email:c.value.trim(),code:l.value.trim()})});let r=await J(n,()=>e.getAuth());if(!r)throw Error(`인증 세션을 확인할 수 없습니다.`);v(()=>t(r))}catch(e){if(m||n.aborted||xt(e,`AUTH_CANCELLED`))return;f.textContent=mt(e)}finally{h=!1,!m&&(g||n.aborted)?v(()=>r(Z())):m||(d.disabled=!1,a.removeAttribute(`aria-busy`))}}};n.addEventListener(`abort`,y,{once:!0}),i.addEventListener(`keydown`,b),a.addEventListener(`submit`,x)})}function ft(e,t,n=``,r){if(t.aborted)return Promise.reject(Z());let i=ht(e);i.replaceChildren(gt(i,r),vt(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(Z())),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`){St(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 pt(e,t,n){if(t.aborted)return Promise.reject(Z());let r=ht(e);r.replaceChildren(gt(r,n),yt(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(Z())),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`&&St(r,t)};t.addEventListener(`abort`,c,{once:!0}),r.addEventListener(`keydown`,u),i.addEventListener(`submit`,l)})}function mt(e){if(e&&typeof e==`object`&&`body`in e){let t=e.body;if(t?.message)return t.message}return e instanceof Error?e.message:`로그인에 실패했습니다. 다시 시도해 주세요.`}function ht(e){return e.shadowRoot??e.attachShadow({mode:`open`})}function gt(e,t){let n=e.ownerDocument.createElement(`style`);return t&&(n.nonce=t),n.textContent=Et,n}function _t(e){let t=e.ownerDocument,n=t.createElement(`form`);n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-labelledby`,`visual-review-login-title`),n.setAttribute(`aria-describedby`,`visual-review-login-description`);let r=X(t,`p`,`01.works`,`eyebrow`),i=X(t,`h2`,`Visual Review`);i.id=`visual-review-login-title`;let a=X(t,`p`,`초대받은 이메일로 계속하세요.`,`description`);a.id=`visual-review-login-description`;let o=t.createElement(`label`);o.append(`이메일`);let s=t.createElement(`input`);s.name=`email`,s.type=`email`,s.autocomplete=`email`,s.required=!0,o.append(s);let c=t.createElement(`label`);c.className=`code`,c.hidden=!0,c.append(`인증 코드`);let l=t.createElement(`input`);l.name=`code`,l.inputMode=`numeric`,l.autocomplete=`one-time-code`,c.append(l);let u=X(t,`p`,``,`error`);u.setAttribute(`role`,`alert`);let d=X(t,`button`,`코드 받기`);return d.type=`submit`,n.append(r,i,a,o,c,u,d),n}function vt(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=X(t,`p`,`01.works`,`eyebrow`),i=X(t,`h2`,`표시 이름`);i.id=`visual-review-name-title`;let a=X(t,`p`,`피드백에 이 이름이 표시됩니다.`,`description`);a.id=`visual-review-name-description`;let o=X(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=X(t,`p`,``,`error`);c.setAttribute(`role`,`alert`);let l=X(t,`button`,`리뷰 시작`);return l.type=`submit`,n.append(r,i,a,o,s,c,l),n}function yt(e){let t=e.ownerDocument,n=t.createElement(`form`);n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-labelledby`,`visual-review-account-title`),n.setAttribute(`aria-describedby`,`visual-review-account-description`);let r=X(t,`p`,`01.works`,`eyebrow`),i=X(t,`h2`,`계정 확인`);i.id=`visual-review-account-title`;let a=X(t,`p`,`이 초대는 현재 로그인한 계정과 일치하지 않습니다.`,`description`);a.id=`visual-review-account-description`;let o=X(t,`button`,`다른 계정으로 계속`);return o.type=`submit`,n.append(r,i,a,o),n}function X(e,t,n,r){let i=e.createElement(t);return i.textContent=n,r&&(i.className=r),i}function bt(e){return e?.split(`@`)[0]?.trim().slice(0,120)??``}function xt(e,t){return!!(e&&typeof e==`object`&&`code`in e&&e.code===t)}function Z(){return new rt(`AUTH_CANCELLED`,`리뷰 로그인이 취소되었습니다.`)}function St(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 Ct(e){return e.replace(/\/+$/,``)||`/`}function wt(e){return e.trim().toLowerCase()}function Tt(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 Et=`
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
+ 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
+ .eyebrow{margin:0 0 10px;color:var(--vr-muted);font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase}
5
+ h2{margin:0 0 5px;font-size:16px;line-height:1.3;letter-spacing:-.01em}.description{margin:0 0 18px;color:var(--vr-muted);font-size:13px;line-height:1.45}
6
+ label{display:grid;gap:6px;margin-top:12px;color:var(--vr-label);font-size:12px;font-weight:600}input{box-sizing:border-box;width:100%;height:40px;margin-top:6px;padding:0 11px;border:1px solid var(--vr-border);border-radius:9px;background:var(--vr-control);color:var(--vr-text);font:400 13px/1 Inter,ui-sans-serif,system-ui,sans-serif}
7
+ label input{margin-top:0}input:focus{border-color:#999;outline:0;box-shadow:0 0 0 3px rgba(127,127,127,.16)}.error{min-height:17px;margin:8px 0 0;color:#d92d20;font-size:11px;line-height:1.45}
8
+ button{width:100%;height:40px;margin-top:7px;border:0;border-radius:9px;background:var(--vr-action);color:var(--vr-action-text);font:650 13px/1 Inter,ui-sans-serif,system-ui,sans-serif;cursor:pointer}button:focus-visible{outline:2px solid var(--vr-action);outline-offset:2px}button:disabled{opacity:.55;cursor:wait}
9
+ @media (prefers-color-scheme:dark){:host{--vr-panel:#161616;--vr-text:#fff;--vr-muted:#a7a7a7;--vr-label:#d6d6d6;--vr-control:#222;--vr-border:#3a3a3a;--vr-action:#fff;--vr-action-text:#171717}}
10
+ @media (pointer:coarse){input,button{height:44px}}
11
+ @media (max-width:480px){form{padding:18px}input{font-size:16px}}
12
+ @media (prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
13
+ `;var Q=class extends Error{code;status;constructor(e,t,n){super(t),this.code=e,this.status=n,this.name=`HostedBootstrapError`}};function Dt(e={}){return Ot(e)}function Ot(t={},n={}){let r=e(t.serviceUrl??`https://visual-review.01.works`),i=t.fetch??globalThis.fetch,a=n.instantRuntimeFactory??it;if(typeof i!=`function`)throw Error(`Visual Review bootstrap requires the Fetch API`);return{async resolve(e){let t=kt(e),n=await jt(r,i,t,e.signal);return a(n.instantAppId,{serviceUrl:r,...n.reviewer?{reviewerToken:n.reviewer.token}:{},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 Nt(t);if(!t.ok)throw new Q($(n,`error`)??`INVITATION_ACCEPT_FAILED`,$(n,`message`)??`리뷰 초대 수락에 실패했습니다.`,t.status)},...e.collaboration?.cursors===!0?{resolveCollaborationRoom:e=>At(r,i,e)}:{}}).resolve(e)}}}function kt(e){return{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname}}async function At(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 Nt(r);if(!r.ok)throw new Q($(i,`error`)??`COLLABORATION_ROOM_FAILED`,$(i,`message`)??`실시간 협업 연결에 실패했습니다.`,r.status);if(!i||typeof i!=`object`||Array.isArray(i))throw new Q(`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 Q(`INVALID_COLLABORATION_ROOM`,`잘못된 협업 응답입니다.`,502);return{id:o,expiresAt:a.expiresAt}}async function jt(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 Nt(i);if(!i.ok)throw new Q($(a,`error`)??`BOOTSTRAP_FAILED`,$(a,`message`)??`Visual Review bootstrap에 실패했습니다.`,i.status);return Mt(a)}function Mt(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new Q(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);let t=e,n=$(t,`instantAppId`);if(t.apiVersion!==1||!n||!Pt(n))throw new Q(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);let r=t.reviewer;if(r==null)return{apiVersion:1,instantAppId:n};let i=$(r,`token`),a=$(r,`email`);if(!i||!a)throw new Q(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return{apiVersion:1,instantAppId:n,reviewer:{token:i,email:a}}}async function Nt(e){try{return await e.json()}catch{throw new Q(`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 Pt(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{Dt as createHostedReviewRuntime};
package/dist/index.d.ts CHANGED
@@ -5,23 +5,12 @@ export interface VisualReviewBuildContext {
5
5
  mode: 'development' | 'preview' | 'production';
6
6
  }
7
7
 
8
- export interface VisualReviewGeneratedFrameLocator {
9
- assetPath: string;
10
- /** 1-based generated line. */
11
- line1: number;
12
- /** 0-based generated column. */
13
- column0: number;
14
- runtime: 'browser' | 'server-node' | 'server-edge' | 'unknown';
15
- debugId?: string;
16
- }
17
-
18
8
  export interface VisualReviewSourceLocation {
19
9
  filePath: string;
20
10
  lineNumber: number | null;
21
11
  columnNumber: number | null;
22
12
  componentName: string | null;
23
13
  origin: 'app' | 'shared-ui' | 'dependency' | 'generated' | 'unknown';
24
- generated?: VisualReviewGeneratedFrameLocator;
25
14
  }
26
15
 
27
16
  export interface VisualReviewSourceProvenance {
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./install-x8QQBGO-.js";export{e as installVisualReview};
1
+ import{t as e}from"./install-COwLLFZK.js";export{e as installVisualReview};
@@ -0,0 +1 @@
1
+ const e=`https://visual-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;function o(e={}){if(e.enabled!==!0||typeof window>`u`||typeof document>`u`)return n();let r=!1,i=0,a=null,o=null,p=null,h=null,g=document.baseURI,_=new WeakMap,S=new Map,E=W(window),A=Z(e.styleNonce,document),M=e.activationParam??`visual-review`,N=v(window.location,M),P=m(window,e=>{let t=v(e,M);if(t===N)return;let n=D(M,e.href);n&&S.set(e.origin,n),N=t,I()}),F=e=>{r||!p||e.target!==p||(N=v(window.location,M),I())};return window.addEventListener(`visual-review:reauthenticate-required`,F),{ready:I(),refresh(){return r?Promise.resolve(null):(N=v(window.location,M),I())},dispose(){r||(r=!0,i+=1,a?.abort(),a=null,p?.remove(),p=null,h?.remove(),h=null,S.clear(),P.unsubscribe(),window.removeEventListener(`visual-review:reauthenticate-required`,F))}};function I(){let t=++i;a?.abort(),p?.remove(),p=null,h?.remove();let n=new AbortController,r=document.createElement(`div`);r.dataset.agencyReviewRoot=``,a=n,h=r;let s=L(t,n,r);return o=s,s.then(r=>{r&&B(t,n)&&p===r&&e.onReady?.(r)}),s}async function L(t,n,i){try{let e=document.body??await j(document,n.signal);if(!B(t,n))return V(t);e.append(i);let r=await R(t,n,i);return B(t,n)?r:(i.remove(),V(t))}catch(a){if(!B(t,n))return i.remove(),V(t);if(d(a,`AUTH_CANCELLED`))return i.remove(),h===i&&(h=null),null;z(a,i);let o=Y(a,_.get(i)?.[2]);return J(i,o.message,A,()=>{r||h!==i||(N=v(window.location,M),I())}),e.onError?.(o),window.dispatchEvent(new CustomEvent(`visual-review:error`,{detail:o})),null}}async function R(n,r,i){let a=t(e.serviceUrl??`https://visual-review.01.works`),o=y(window.location),d=ee(a,M,o,E),f=b(S.get(o.origin)),m=x(C(a,o.origin)),D=d?.source===`url`?d:f??m??d;if(!D)return _.delete(i),i.remove(),h===i&&(h=null),null;let j=D.invitationId;_.set(i,[a,o.origin,j]),D.source===`url`?(G(a,o.origin,E),S.set(o.origin,j),w(a,o.origin,j),P.suppress(()=>O(M))):D.source===`handoff`&&S.set(o.origin,j),N=v(window.location,M);let F=await k((e.runtime??await c(a)).resolve({invitationId:j,location:o,signal:r.signal,authHost:i,styleNonce:A,collaboration:{cursors:e.collaboration?.cursors===!0,chat:e.collaboration?.chat===!0,scopeId:s(e.build,o)}}),r.signal);if(!B(n,r))return null;T(a,o.origin,j),H(a,j,o,E),S.set(o.origin,j);let I=e.sourceContextResolver??await u(e.build,g,r.signal);if(!B(n,r))return null;let{mountReviewWidget:L}=await l(r.signal);return B(n,r)?(p=L({...F,collaboration:{cursors:e.collaboration?.cursors===!0&&!!(F.collaborationRepository&&F.collaborationRoomId),chat:e.collaboration?.chat===!0&&!!F.collaborationRepository,repository:F.collaborationRepository,roomId:F.collaborationRoomId,scopeId:s(e.build,o)},developerTools:e.developerTools,sourceContextResolver:I,styleNonce:A}),i.remove(),h===i&&(h=null),window.dispatchEvent(new CustomEvent(`visual-review:ready`,{detail:p})),p):null}function z(e,t){if(!f(e))return;let n=_.get(t);if(!n)return;let[r,i,a]=n;T(r,i,a),S.get(i)===a&&S.delete(i),G(r,i,E,a)}function B(e,t){return!r&&i===e&&a===t&&!t.signal.aborted}function V(e){return!r&&i!==e?o:null}}function s(e,t){return JSON.stringify([M(e).buildId,t.pathname,t.search])}async function c(e){let{createHostedReviewRuntime:t}=await import(`./hosted-runtime-FHlAhXOq.js`);return t({serviceUrl:e})}async function l(e){return A(import(`./src-reBEPAL1.js`),e,a,`리뷰 위젯을 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`)}async function u(e,t,n){let r=M(e),{createGeneratedSourceContextResolver:i}=await A(import(`./generated-source-context-Cx2Sm1Z8.js`),n,a,`리뷰 소스 정보를 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`);return i({build:r})}function d(e,t){return e instanceof Error&&`code`in e&&e.code===t}function f(e){let t=e instanceof Error&&`code`in e?e.code:void 0;return typeof t==`string`&&/^INVITATION_(?:EXPIRED|NOT_FOUND|REQUIRED|REVOKED)$/.test(t)}const p=new WeakMap;function m(e,t){let n=p.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),h(e)},patchedReplaceState:function(t,n,r){i.call(this,t,n,r),h(e)},popstateListener:()=>h(e),subscribers:a,suppressionDepth:0},p.set(e,n),g(t,`pushState`,n.patchedPushState),g(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),_(n.history,`pushState`,n.patchedPushState,n.originalPushStateDescriptor),_(n.history,`replaceState`,n.patchedReplaceState,n.originalReplaceStateDescriptor),p.delete(e)))}}}function h(e){let t=p.get(e);if(!t||t.suppressionDepth>0)return;let n=y(e.location);[...t.subscribers].forEach(e=>e(n))}function g(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:!0,value:n})}function _(e,t,n,r){if(Object.getOwnPropertyDescriptor(e,t)?.value===n){if(r){Object.defineProperty(e,t,r);return}delete e[t]}}function v(e,t){return`${e.origin}\n${e.pathname}\n${D(t,e.href)??``}`}function y(e){return new URL(e.href)}function b(e){return e?{invitationId:e,source:`memory`}:null}function x(e){return e?{invitationId:e,source:`handoff`}:null}function S(e,t){return JSON.stringify([e,t])}function C(e,t,n=Date.now()){let i=S(e,t),a=r.get(i);if(a){if(a.expiresAt>n)return a.invitationId;clearTimeout(a.timeout),r.delete(i)}}function w(e,t,n,a=Date.now()){E(a);let o=S(e,t),s=r.get(o);for(s&&(clearTimeout(s.timeout),r.delete(o));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 c=a+i,l=setTimeout(()=>{r.get(o)?.expiresAt===c&&r.delete(o)},i);r.set(o,{invitationId:n,expiresAt:c,timeout:l})}function T(e,t,n){let i=S(e,t),a=r.get(i);a?.invitationId===n&&(clearTimeout(a.timeout),r.delete(i))}function E(e){for(let[t,n]of r)n.expiresAt>e||(clearTimeout(n.timeout),r.delete(t))}function ee(e,t,n,r){let i=D(t,n.href);if(i)return{invitationId:i,source:`url`};let a=U(r,K(e,n.origin));return a?{invitationId:a,source:`storage`}:q(n.hostname)?{invitationId:`local-preview`,source:`local-preview`}:null}function D(e,t){let n=new URL(t);return(n.searchParams.get(e)??n.searchParams.get(`agency-review`)??n.searchParams.get(`agency-review-invite`))?.trim()||null}function O(e){let t=new URL(window.location.href),n=new Set([e,`visual-review`,`agency-review`,`agency-review-invite`]),r=!1;n.forEach(e=>{t.searchParams.has(e)&&(t.searchParams.delete(e),r=!0)}),r&&window.history.replaceState(window.history.state,``,`${t.pathname}${t.search}${t.hash}`)}function k(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 A(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 j(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 M(e){let t=document.querySelector(`meta[name="visual-review-build"]`),n=document.querySelector(`meta[name="visual-review-commit"]`),r=V(F()),i=V(I());return{buildId:B(e?.buildId)??z(t)??r??`unversioned`,gitCommit:L(e,n,i),generatedAt:e?.generatedAt,mode:e?.mode??P(N())??(q(window.location.hostname)?`development`:`production`)}}function N(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_MODE}catch{return}}function P(e){return e===`development`||e===`preview`||e===`production`?e:void 0}function F(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_ID}catch{return}}function I(){try{return process.env.VISUAL_REVIEW_PUBLIC_GIT_COMMIT}catch{return}}function L(e,t,n){return e?.gitCommit===null?null:typeof e?.gitCommit==`string`?R(e.gitCommit):R(t?.content)??R(n)}function R(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 z(e){return V(e?.content)}function B(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 H(e,t,n,r){try{r?.setItem(K(e,n.origin),t)}catch{}}function U(e,t){try{return e?.getItem(t)??null}catch{return null}}function W(e){try{return e.localStorage}catch{return null}}function G(e,t,n,r){try{if(!n)return;let i=K(e,t),a=n.getItem(i);if(a===null||r!==void 0&&a!==r)return;n.removeItem(i)}catch{}}function K(e,t){return`visual-review:${e}:${t}:invitation`}function q(e){return e===`localhost`||e===`127.0.0.1`||e.endsWith(`.test`)||e.endsWith(`.local`)}function J(e,t,n,r){let i=e.shadowRoot??e.attachShadow({mode:`open`}),a=i.ownerDocument,o=a.createElement(`style`);n&&(o.nonce=n),o.textContent=te;let s=a.createElement(`strong`);s.textContent=`Visual Review를 시작할 수 없습니다`;let c=a.createElement(`span`);c.textContent=t;let l=a.createElement(`button`);l.type=`button`,l.textContent=`다시 시도`,l.addEventListener(`click`,()=>{l.disabled=!0,r?.()},{once:!0}),i.replaceChildren(o,s,c,l)}function Y(e,t){let n=e instanceof Error?e.message:String(e),r=Error(X(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:X(n,t)}),typeof i==`number`&&Number.isFinite(i)&&Object.defineProperty(r,"status",{configurable:!0,enumerable:!0,value:i})}return r}function X(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 Z(e,t){if(e!==void 0)return $(e);let n=t.currentScript,r=n?Q(n):void 0;if(r)return r;try{for(let e of t.querySelectorAll(`script[nonce],style[nonce]`)){let t=Q(e);if(t)return t}}catch{}}function Q(e){let t=`nonce`in e?e.nonce:void 0;return typeof t==`string`?$(t):void 0}function $(e){return e.trim()||void 0}const te=`:host{all:initial;position:fixed;right:18px;bottom:18px;z-index:2147483646;max-width:360px;padding:16px 18px;border:1px solid #efc4bd;border-radius:14px;background:#fff8f6;box-shadow:0 12px 40px rgba(0,0,0,.14);color:#7a271a;font:13px/1.5 Inter,ui-sans-serif,system-ui,sans-serif}strong{display:block;margin-bottom:4px;color:#53150d}span{display:block}button{margin-top:12px;padding:7px 10px;border:1px solid #d9a79f;border-radius:8px;background:#fff;color:#7a271a;font:650 12px/1 Inter,ui-sans-serif,system-ui,sans-serif;cursor:pointer}button:focus-visible{outline:2px solid #7a271a;outline-offset:2px}button:disabled{opacity:.55;cursor:wait}`;export{e as n,t as r,o as t};
package/dist/react.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./install-x8QQBGO-.js";import{useEffect as t,useRef as n}from"react";function r({activationParam:r,build:i,collaboration:a,developerTools:o,enabled:s,onError:c,onReady:l,runtime:u,serviceUrl:d,sourceContextResolver:f,styleNonce:p}){let m=n(c),h=n(l),g=i?.buildId,_=i?.gitCommit,v=i?.generatedAt,y=i?.mode,b=o?.reactGrab===!0,x=a?.cursors===!0,S=a?.chat===!0;return m.current=c,h.current=l,t(()=>{if(s!==!0)return;let t=e({activationParam:r,build:g===void 0&&_===void 0&&v===void 0&&y===void 0?void 0:{buildId:g,gitCommit:_,generatedAt:v,mode:y},collaboration:x||S?{cursors:x,chat:S}:void 0,developerTools:b?{reactGrab:!0}:void 0,enabled:s,onError:e=>m.current?.(e),onReady:e=>h.current?.(e),runtime:u,serviceUrl:d,sourceContextResolver:f,styleNonce:p});return()=>t.dispose()},[r,g,y,S,x,b,s,v,_,u,d,f,p]),null}r.displayName=`VisualReview`;export{r as VisualReview};
1
+ import{t as e}from"./install-COwLLFZK.js";import{useEffect as t,useRef as n}from"react";function r({activationParam:r,build:i,collaboration:a,developerTools:o,enabled:s,onError:c,onReady:l,runtime:u,serviceUrl:d,sourceContextResolver:f,styleNonce:p}){let m=n(c),h=n(l),g=i?.buildId,_=i?.gitCommit,v=i?.generatedAt,y=i?.mode,b=o?.reactGrab===!0,x=a?.cursors===!0,S=a?.chat===!0;return m.current=c,h.current=l,t(()=>{if(s!==!0)return;let t=e({activationParam:r,build:g===void 0&&_===void 0&&v===void 0&&y===void 0?void 0:{buildId:g,gitCommit:_,generatedAt:v,mode:y},collaboration:x||S?{cursors:x,chat:S}:void 0,developerTools:b?{reactGrab:!0}:void 0,enabled:s,onError:e=>m.current?.(e),onReady:e=>h.current?.(e),runtime:u,serviceUrl:d,sourceContextResolver:f,styleNonce:p});return()=>t.dispose()},[r,g,y,S,x,b,s,v,_,u,d,f,p]),null}r.displayName=`VisualReview`;export{r as VisualReview};
@@ -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=p(e);t&&!r.has(t)&&n.push(t);let i=m(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`?p(r):m(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=h(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){try{return e.shadowRoot}catch{return null}}function m(e){if(e.tagName.toLowerCase()!==`iframe`)return null;try{return e.contentDocument}catch{return null}}function h(e){try{let t=e.frameElement;return t&&`clientLeft`in t?t:null}catch{return null}}function ee(e){return typeof CSS<`u`&&CSS.escape?CSS.escape(e):e.replace(/([^\w-])/g,`\\$1`)}function g(e){let t=y(e),r=_(e,t);if(t===document)return r;let i=[];for(;t!==document;){if(d(t)){let e=t.host,n=y(e);i.unshift({kind:`shadow`,selector:_(e,n)}),t=n;continue}let e=ne(t);if(!e)return r;let n=y(e);i.unshift({kind:`frame`,selector:_(e,n)}),t=n}let a=n(i,r);return a.length<=4096?a:r}function _(e,t){let n=[],r=e,i=e.ownerDocument;for(;r&&r!==i.documentElement;){if(r===i.body){n.unshift(`body`);break}let e=te(r,t);if(e){n.unshift(e);break}let a=r.tagName.toLowerCase(),o=r.parentElement,s=o??v(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 v(e){let t=e.parentNode;return t&&`children`in t?t:null}function te(e,t){return[e.id?`#${ee(e.id)}`:null,b(e,`data-review-id`),b(e,`data-testid`),b(e,`data-id`)].find(e=>{if(!e)return!1;try{return t.querySelectorAll(e).length===1}catch{return!1}})??null}function y(e){let t=e.getRootNode();return f(t)||d(t)?t:e.ownerDocument}function ne(e){try{return e.defaultView?.frameElement??null}catch{return null}}function b(e,t){let n=e.getAttribute(t);return n?`[${t}="${ee(n)}"]`:null}function re(e){if(!ie(e))return!1;let t=ae(e);for(;t;){if(!ie(t))return!1;t=ae(t)}let n=l(e);return n.width>0&&n.height>0&&e.getClientRects().length>0}function ie(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 ae(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 oe(e){if(!e.selector)return[];if(r(e.selector))return a(e.selector).filter(e=>!x(e));try{let t=Array.from(document.querySelectorAll(e.selector)).filter(e=>!x(e));if(t.length>0)return t}catch{return[]}return a(e.selector).filter(e=>!x(e))}function x(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 se(e,t,n){let r=l(e),i=Math.max(r.width,1),a=Math.max(r.height,1);return{selector:g(e),offsetX:C((t-(r.left+window.scrollX))/i),offsetY:C((n-(r.top+window.scrollY))/a),viewportX:C((t-window.scrollX)/Math.max(window.innerWidth,1)),viewportY:C((n-window.scrollY)/Math.max(window.innerHeight,1))}}function ce(e,t){return{selector:``,offsetX:C(e),offsetY:C(t),viewportX:C(e),viewportY:C(t)}}function le(e,t){let n=typeof document.elementFromPoint==`function`?document.elementFromPoint(e,t):null;return!n||n.closest(`[data-agency-review-root]`)?ce(e/Math.max(window.innerWidth,1),t/Math.max(window.innerHeight,1)):se(n,e+window.scrollX,t+window.scrollY)}function S(e){let t=oe(e),n=t.find(re)??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:re(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 C(e){return Math.min(1,Math.max(0,Number.isFinite(e)?e:0))}let w=null,T=null;function ue(e){fe(e).catch(()=>void 0)}function de(){return w}function fe(e){if(w)return Promise.resolve(w);if(T)return T;let t=pe(e);return T=t,t.catch(()=>{T===t&&(T=null)}),t}async function pe(e){let t=me(e);try{let e=await import(`./primitives-lxsPH8SN.js`);return w=e,e}finally{t()}}function me(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())}const he=`visual-review-sources-[0-9a-f]{16}\\.json`;RegExp(`^/(?:[^/]+/)*\\.visual-review/${he}$`,`u`),RegExp(`^/(?:[^/]+/)*_next/static/${he}$`,`u`);const ge=`[data-agency-review-root], [data-react-grab-ignore]`;function _e(e){ue(e)}function ve(e,t){let n=de();if(!n)return be(e,t);try{let r=n.getElementAtPoint(e,t,{filter:e=>n.isElementGrabbable(e)&&!D(e)});return r?xe(r,e,t):null}catch{return be(e,t)}}function E(e){if(e.ownerDocument!==document)return l(e);let t=de();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 ye(e){ue(e);let t=de();if(!t)return()=>void 0;let n=!1;try{if(!t.isFreezeActive()){let r=me(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 D(e){let t=e;for(;t;){if(t.matches(ge)||t.closest(ge))return!0;let e=t.getRootNode();t=d(e)?e.host:null}return!1}function be(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=>!D(e))??null;return n?xe(n,e,t):null}function xe(e,t,n){let r=e,i=t,a=n,o=new Set;for(;!o.has(r);){o.add(r);let e=Se(r,i,a);if(e&&e!==r&&!D(e)){r=e;continue}let t=Ce(r,i,a);if(!t)break;r=t.element,i=t.clientX,a=t.clientY}return r}function Se(e,t,n){try{return e.shadowRoot?.elementFromPoint(t,n)??null}catch{return null}}function Ce(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&&!D(l)?{element:l,clientX:s,clientY:c}:null}catch{return null}}const O=Symbol(`source-resolution-stopped`);function we(e,t){let n=E(e),r=se(e,t.clientX+window.scrollX,t.clientY+window.scrollY),i=A(n);return k(r,`element`,i,[Ie(e,i)])}function Te(e){let t=ve(e.clientX,e.clientY);return t?we(t,e):k(le(e.clientX,e.clientY),`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 Ee(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=Ae(De(o),ke(o)).slice(0,8),c={clientX:n+i/2,clientY:r+a/2},u=s[0];return k(u?se(u,c.clientX+window.scrollX,c.clientY+window.scrollY):ce(c.clientX/Math.max(window.innerWidth,1),c.clientY/Math.max(window.innerHeight,1)),`region`,A(o),s.map(e=>Ie(e,A(l(e)))))}function De(e){let t=a(`*`).filter(t=>t===t.ownerDocument.body||t===t.ownerDocument.documentElement||D(t)||!re(t)?!1:Re(e,l(t))),n=new Set(t),r=new Set;return t.forEach(e=>{let t=Oe(e);for(;t;)n.has(t)&&r.add(t),t=Oe(t)}),t.filter(e=>!r.has(e))}function Oe(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 ke(e){return{clientX:e.left+e.width/2,clientY:e.top+e.height/2}}function Ae(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 je(e,t,n={}){if(n.signal?.aborted)return Ne(e,t);let r=Me(n),i=e.elements.map(async e=>{let n=ze(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!==O?t.value.context:e.elements[n]),o=Fe(n.flatMap(e=>e.status===`fulfilled`&&e.value!==O&&e.value.provenance?[e.value.provenance]:[]))??e.sourceProvenance??Pe(t);return{...e,elements:a,...o?{sourceProvenance:o}:{}}}finally{r.dispose()}}function Me(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(O);return}t.signal.addEventListener(`abort`,()=>e(O),{once:!0})});return{signal:t.signal,stopped:o,dispose(){clearTimeout(a),n?.removeEventListener(`abort`,r)}}}function Ne(e,t){let n=e.sourceProvenance??Pe(t);return{...e,...n?{sourceProvenance:n}:{}}}function Pe(e){try{return e.unavailableProvenance?.()}catch{return}}function Fe(e){let t={resolved:3,fallback:2,unavailable:1};return e.reduce((e,n)=>!e||t[n.sourceMapStatus]>t[e.sourceMapStatus]?n:e,void 0)}function k(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()}}function Ie(e,t){return{selector:g(e),tagName:e.tagName.toLowerCase(),textPreview:Le(e),rect:t,source:null,componentStack:[]}}function Le(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 A(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 Re(e,t){return e.left<t.right&&e.right>t.left&&e.top<t.bottom&&e.bottom>t.top}function ze(e){return e?oe({selector:e,offsetX:0,offsetY:0,viewportX:0,viewportY:0})[0]??null:null}function Be(e){let t,n=!1,r={pageId:e.pageId,peers:[],messages:[]},i,a,o=!1,s=!1,c=``,l=``,u=j(`rg-collaboration-cursors`);u.setAttribute(`aria-hidden`,`true`);let d=j(`rg-collaboration-participants`);d.setAttribute(`aria-label`,`리뷰 참여자 1명`),d.textContent=`1명`;let f=Ke(`rg-collaboration-chat-trigger`,`실시간 채팅 열기`);f.type=`button`,f.setAttribute(`aria-expanded`,`false`),f.setAttribute(`aria-keyshortcuts`,`/`),f.title=`실시간 채팅 열기 (/)`,f.textContent=`채팅`;let p=document.createElement(`section`);p.className=`rg-collaboration-chat`,p.hidden=!0,p.setAttribute(`role`,`dialog`),p.setAttribute(`aria-label`,`현재 페이지 실시간 채팅`);let m=()=>{Ve(d,r.peers,e.session.displayName),e.cursors&&He(u,r.peers),e.chat&&h()},h=()=>{let t=e.root.activeElement?.classList.contains(`rg-collaboration-chat-input`)===!0;p.replaceChildren();let n=j(`rg-collaboration-chat-header`),i=document.createElement(`h2`);i.textContent=`현재 페이지 채팅`;let a=Ke(`rg-collaboration-chat-close`,`채팅 닫기`);a.type=`button`,a.textContent=`×`,a.addEventListener(`click`,()=>g(!1)),n.append(i,a);let u=j(`rg-collaboration-chat-messages`);if(u.setAttribute(`role`,`log`),u.setAttribute(`aria-live`,`polite`),r.messages.length===0){let e=j(`rg-collaboration-chat-empty`);e.textContent=`함께 보고 있는 사람에게 메시지를 남겨보세요.`,u.append(e)}else for(let t of r.messages){let n=document.createElement(`article`);n.className=`rg-collaboration-chat-message`,t.authorId===e.session.reviewerId&&(n.dataset.mine=`true`);let r=j(`rg-collaboration-chat-meta`),i=document.createElement(`strong`);i.textContent=t.authorName;let a=document.createElement(`time`);a.dateTime=new Date(t.createdAt).toISOString(),a.textContent=We(t.createdAt);let o=j(`rg-collaboration-chat-pathname`);o.textContent=t.pathname,o.title=`메시지를 보낸 페이지: ${t.pathname}`,r.append(i,o,a);let s=document.createElement(`p`);s.textContent=t.body,n.append(r,s),u.append(n)}let d=document.createElement(`form`);d.className=`rg-collaboration-chat-form`;let f=document.createElement(`textarea`);f.className=`rg-collaboration-chat-input`,f.maxLength=4e3,f.rows=2,f.placeholder=`메시지 입력`,f.setAttribute(`aria-label`,`채팅 메시지`),f.value=l,f.disabled=s,f.addEventListener(`input`,()=>{l=f.value}),f.addEventListener(`keydown`,e=>{e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),d.requestSubmit())});let m=Ke(`rg-collaboration-chat-send`,s?`전송 중`:`메시지 전송`);if(m.type=`submit`,m.disabled=s,m.textContent=s?`전송 중…`:`전송`,d.addEventListener(`submit`,e=>{e.preventDefault(),ee(f.value)}),d.append(f,m),c){let e=j(`rg-collaboration-chat-error`);e.setAttribute(`role`,`alert`),e.textContent=c,d.prepend(e)}p.append(n,u,d),o&&queueMicrotask(()=>{u.scrollTop=u.scrollHeight,t&&(f.focus(),f.setSelectionRange(f.value.length,f.value.length))})},ee=async t=>{let n=t.trim();if(!n||s)return;l=t,s=!0,c=``,h();let r=e.now?.()??Date.now(),i={id:e.id?.()??crypto.randomUUID(),pageId:e.pageId,pathname:e.pathname,authorId:e.session.reviewerId,authorName:e.session.displayName,body:n,createdAt:r,updatedAt:r};try{await e.repository.sendMessage(e.pageId,i),l=``}catch{c=`메시지를 전송하지 못했습니다. 다시 시도하세요.`}finally{s=!1,h()}},g=e=>{o=e,p.hidden=!e,f.setAttribute(`aria-expanded`,String(e)),f.setAttribute(`aria-label`,e?`실시간 채팅 닫기`:`실시간 채팅 열기`),e?(h(),queueMicrotask(()=>p.querySelector(`textarea`)?.focus())):f.focus()},_=t=>{!e.cursors||n||e.repository.publishPresence(e.pageId,e.roomId,t)},v=()=>({reviewerId:e.session.reviewerId,displayName:e.session.displayName,color:Ue(e.session.reviewerId),active:!1}),te=t=>{t.pointerType===`touch`||t.composedPath().includes(e.root.host)||(a=t,i===void 0&&(i=window.requestAnimationFrame(()=>{i=void 0;let t=a;a=void 0,t&&_({reviewerId:e.session.reviewerId,displayName:e.session.displayName,color:Ue(e.session.reviewerId),active:!0,cursorX:t.clientX,cursorY:t.clientY,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight})})))},y=()=>{document.visibilityState!==`visible`&&_(v())},ne=()=>_(v()),b=t=>{t.key!==`/`||t.defaultPrevented||t.repeat||t.isComposing||t.metaKey||t.ctrlKey||t.altKey||o||Ge(t)||e.canOpenChat?.()===!1||(t.preventDefault(),g(!0))};return{start(){if(n)return;let i=e.root.querySelector(`.rg-toolbar-actions`);e.cursors&&i?.append(d),e.chat&&(i?.append(f),e.root.append(p),f.addEventListener(`click`,()=>g(!o)),p.addEventListener(`keydown`,e=>{e.key===`Escape`&&g(!1)}),document.addEventListener(`keydown`,b)),e.cursors&&(e.root.prepend(u),document.addEventListener(`pointermove`,te,{passive:!0}),document.addEventListener(`pointerleave`,ne),document.addEventListener(`visibilitychange`,y)),t=e.repository.subscribe(e.pageId,{roomId:e.roomId,cursors:e.cursors,chat:e.chat},e=>{r=e,m()},e.onFailure),_(v()),m()},stop(){n||(n=!0,i!==void 0&&window.cancelAnimationFrame(i),document.removeEventListener(`pointermove`,te),document.removeEventListener(`pointerleave`,ne),document.removeEventListener(`visibilitychange`,y),document.removeEventListener(`keydown`,b),t?.(),u.remove(),d.remove(),f.remove(),p.remove())}}}function Ve(e,t,n){let r=[n,...t.map(({displayName:e})=>e)];e.textContent=`${r.length}명`,e.setAttribute(`aria-label`,`리뷰 참여자 ${r.length}명: ${r.join(`, `)}`),e.title=r.join(`, `)}function He(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=j(`rg-collaboration-cursor`);t.style.setProperty(`--rg-peer-color`,n.color),t.style.left=`${n.cursorX/n.viewportWidth*window.innerWidth}px`,t.style.top=`${n.cursorY/n.viewportHeight*window.innerHeight}px`;let r=j(`rg-collaboration-cursor-pointer`),i=j(`rg-collaboration-cursor-label`);i.textContent=n.displayName,t.append(r,i),e.append(t)}}function Ue(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 We(e){return new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,minute:`2-digit`}).format(e)}function Ge(e){let t=e.composedPath()[0];return t instanceof Element&&t.closest(`input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`)!==null}function j(e){let t=document.createElement(`div`);return t.className=e,t}function Ke(e,t){let n=document.createElement(`button`);return n.className=e,n.setAttribute(`aria-label`,t),n}function qe(e={}){let t=document.createElement(`div`);t.className=`rg-toolbar`,t.setAttribute(`role`,`toolbar`),t.setAttribute(`aria-label`,`Visual Review`);let n=F(`rg-toolbar-actions-shell`),r=F(`rg-toolbar-actions`);e.developerGrab&&r.append(Je());let i=F(`rg-action-wrap`),a=I(`rg-action rg-feedback-tool`,`피드백 위치 선택`);a.setAttribute(`aria-pressed`,`false`),a.append(Ze());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=I(`rg-collapse`,`Visual Review 접기`);if(s.setAttribute(`aria-expanded`,`true`),s.append($e()),t.append(n,s),e.developerGrab){let e=F(`rg-developer-status`);e.dataset.visible=`false`,e.dataset.tone=`neutral`,e.setAttribute(`aria-hidden`,`true`),t.append(e)}return t}function Je(){let e=F(`rg-action-wrap rg-developer-grab-action-wrap`),t=I(`rg-action rg-developer-grab-tool`,`React Grab 코드 선택`);t.setAttribute(`aria-keyshortcuts`,`Meta+C Control+C`),t.setAttribute(`aria-pressed`,`false`),t.append(Qe());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 Ye(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=N(`0 0 16 8`,[P(`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=F(`rg-surface`),o=F(`rg-tag-row`),s=document.createElement(`span`);s.className=`rg-tag`,s.textContent=e,o.append(s);let c=F(`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=I(`rg-submit`,`피드백 저장`);return u.title=`저장 (⌘/Ctrl+Enter)`,u.append(et()),c.append(l,u),a.append(o,c),r.append(i,a),r}function Xe(){return N(`0 0 12 12`,[P(`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 M(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=tt(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=tt(c-(l-n.width/2),16,n.width-16);e.style.setProperty(`--rg-arrow-left`,`${f}px`)})}function Ze(){return N(`0 0 12 12`,[P(`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 Qe(){return N(`0 0 12 12`,[P(`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 $e(){return N(`0 0 24 24`,[P(`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 et(){return N(`0 0 24 24`,[P(`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 N(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 P(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 F(e){let t=document.createElement(`div`);return t.className=e,t}function I(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=e,n.setAttribute(`aria-label`,t),n}function tt(e,t,n){return Math.min(n,Math.max(t,e))}async function nt(e){let t=window.__REACT_GRAB__;if(it(t))return rt(t);let n=await fe(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=p(e);t&&!r.has(t)&&n.push(t);let i=m(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`?p(r):m(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=h(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){try{return e.shadowRoot}catch{return null}}function m(e){if(e.tagName.toLowerCase()!==`iframe`)return null;try{return e.contentDocument}catch{return null}}function h(e){try{let t=e.frameElement;return t&&`clientLeft`in t?t:null}catch{return null}}function ee(e){return typeof CSS<`u`&&CSS.escape?CSS.escape(e):e.replace(/([^\w-])/g,`\\$1`)}function g(e){let t=y(e),r=_(e,t);if(t===document)return r;let i=[];for(;t!==document;){if(d(t)){let e=t.host,n=y(e);i.unshift({kind:`shadow`,selector:_(e,n)}),t=n;continue}let e=ne(t);if(!e)return r;let n=y(e);i.unshift({kind:`frame`,selector:_(e,n)}),t=n}let a=n(i,r);return a.length<=4096?a:r}function _(e,t){let n=[],r=e,i=e.ownerDocument;for(;r&&r!==i.documentElement;){if(r===i.body){n.unshift(`body`);break}let e=te(r,t);if(e){n.unshift(e);break}let a=r.tagName.toLowerCase(),o=r.parentElement,s=o??v(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 v(e){let t=e.parentNode;return t&&`children`in t?t:null}function te(e,t){return[e.id?`#${ee(e.id)}`:null,b(e,`data-review-id`),b(e,`data-testid`),b(e,`data-id`)].find(e=>{if(!e)return!1;try{return t.querySelectorAll(e).length===1}catch{return!1}})??null}function y(e){let t=e.getRootNode();return f(t)||d(t)?t:e.ownerDocument}function ne(e){try{return e.defaultView?.frameElement??null}catch{return null}}function b(e,t){let n=e.getAttribute(t);return n?`[${t}="${ee(n)}"]`:null}function re(e){if(!ie(e))return!1;let t=ae(e);for(;t;){if(!ie(t))return!1;t=ae(t)}let n=l(e);return n.width>0&&n.height>0&&e.getClientRects().length>0}function ie(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 ae(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 oe(e){if(!e.selector)return[];if(r(e.selector))return a(e.selector).filter(e=>!x(e));try{let t=Array.from(document.querySelectorAll(e.selector)).filter(e=>!x(e));if(t.length>0)return t}catch{return[]}return a(e.selector).filter(e=>!x(e))}function x(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 se(e,t,n){let r=l(e),i=Math.max(r.width,1),a=Math.max(r.height,1);return{selector:g(e),offsetX:C((t-(r.left+window.scrollX))/i),offsetY:C((n-(r.top+window.scrollY))/a),viewportX:C((t-window.scrollX)/Math.max(window.innerWidth,1)),viewportY:C((n-window.scrollY)/Math.max(window.innerHeight,1))}}function ce(e,t){return{selector:``,offsetX:C(e),offsetY:C(t),viewportX:C(e),viewportY:C(t)}}function le(e,t){let n=typeof document.elementFromPoint==`function`?document.elementFromPoint(e,t):null;return!n||n.closest(`[data-agency-review-root]`)?ce(e/Math.max(window.innerWidth,1),t/Math.max(window.innerHeight,1)):se(n,e+window.scrollX,t+window.scrollY)}function S(e){let t=oe(e),n=t.find(re)??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:re(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 C(e){return Math.min(1,Math.max(0,Number.isFinite(e)?e:0))}let w=null,T=null;function ue(e){fe(e).catch(()=>void 0)}function de(){return w}function fe(e){if(w)return Promise.resolve(w);if(T)return T;let t=pe(e);return T=t,t.catch(()=>{T===t&&(T=null)}),t}async function pe(e){let t=me(e);try{let e=await import(`./primitives-lxsPH8SN.js`);return w=e,e}finally{t()}}function me(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())}const he=`[data-agency-review-root], [data-react-grab-ignore]`;function ge(e){ue(e)}function _e(e,t){let n=de();if(!n)return ye(e,t);try{let r=n.getElementAtPoint(e,t,{filter:e=>n.isElementGrabbable(e)&&!D(e)});return r?be(r,e,t):null}catch{return ye(e,t)}}function E(e){if(e.ownerDocument!==document)return l(e);let t=de();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 ve(e){ue(e);let t=de();if(!t)return()=>void 0;let n=!1;try{if(!t.isFreezeActive()){let r=me(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 D(e){let t=e;for(;t;){if(t.matches(he)||t.closest(he))return!0;let e=t.getRootNode();t=d(e)?e.host:null}return!1}function ye(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=>!D(e))??null;return n?be(n,e,t):null}function be(e,t,n){let r=e,i=t,a=n,o=new Set;for(;!o.has(r);){o.add(r);let e=xe(r,i,a);if(e&&e!==r&&!D(e)){r=e;continue}let t=Se(r,i,a);if(!t)break;r=t.element,i=t.clientX,a=t.clientY}return r}function xe(e,t,n){try{return e.shadowRoot?.elementFromPoint(t,n)??null}catch{return null}}function Se(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&&!D(l)?{element:l,clientX:s,clientY:c}:null}catch{return null}}const O=Symbol(`source-resolution-stopped`);function Ce(e,t){let n=E(e),r=se(e,t.clientX+window.scrollX,t.clientY+window.scrollY),i=A(n);return k(r,`element`,i,[Fe(e,i)])}function we(e){let t=_e(e.clientX,e.clientY);return t?Ce(t,e):k(le(e.clientX,e.clientY),`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 Te(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=ke(Ee(o),Oe(o)).slice(0,8),c={clientX:n+i/2,clientY:r+a/2},u=s[0];return k(u?se(u,c.clientX+window.scrollX,c.clientY+window.scrollY):ce(c.clientX/Math.max(window.innerWidth,1),c.clientY/Math.max(window.innerHeight,1)),`region`,A(o),s.map(e=>Fe(e,A(l(e)))))}function Ee(e){let t=a(`*`).filter(t=>t===t.ownerDocument.body||t===t.ownerDocument.documentElement||D(t)||!re(t)?!1:Le(e,l(t))),n=new Set(t),r=new Set;return t.forEach(e=>{let t=De(e);for(;t;)n.has(t)&&r.add(t),t=De(t)}),t.filter(e=>!r.has(e))}function De(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 Oe(e){return{clientX:e.left+e.width/2,clientY:e.top+e.height/2}}function ke(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 Ae(e,t,n={}){if(n.signal?.aborted)return Me(e,t);let r=je(n),i=e.elements.map(async e=>{let n=Re(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!==O?t.value.context:e.elements[n]),o=Pe(n.flatMap(e=>e.status===`fulfilled`&&e.value!==O&&e.value.provenance?[e.value.provenance]:[]))??e.sourceProvenance??Ne(t);return{...e,elements:a,...o?{sourceProvenance:o}:{}}}finally{r.dispose()}}function je(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(O);return}t.signal.addEventListener(`abort`,()=>e(O),{once:!0})});return{signal:t.signal,stopped:o,dispose(){clearTimeout(a),n?.removeEventListener(`abort`,r)}}}function Me(e,t){let n=e.sourceProvenance??Ne(t);return{...e,...n?{sourceProvenance:n}:{}}}function Ne(e){try{return e.unavailableProvenance?.()}catch{return}}function Pe(e){let t={resolved:3,fallback:2,unavailable:1};return e.reduce((e,n)=>!e||t[n.sourceMapStatus]>t[e.sourceMapStatus]?n:e,void 0)}function k(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()}}function Fe(e,t){return{selector:g(e),tagName:e.tagName.toLowerCase(),textPreview:Ie(e),rect:t,source:null,componentStack:[]}}function Ie(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 A(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 Le(e,t){return e.left<t.right&&e.right>t.left&&e.top<t.bottom&&e.bottom>t.top}function Re(e){return e?oe({selector:e,offsetX:0,offsetY:0,viewportX:0,viewportY:0})[0]??null:null}function ze(e){let t,n=!1,r={pageId:e.pageId,peers:[],messages:[]},i,a,o=!1,s=!1,c=``,l=``,u=j(`rg-collaboration-cursors`);u.setAttribute(`aria-hidden`,`true`);let d=j(`rg-collaboration-participants`);d.setAttribute(`aria-label`,`리뷰 참여자 1명`),d.textContent=`1명`;let f=Ge(`rg-collaboration-chat-trigger`,`실시간 채팅 열기`);f.type=`button`,f.setAttribute(`aria-expanded`,`false`),f.setAttribute(`aria-keyshortcuts`,`/`),f.title=`실시간 채팅 열기 (/)`,f.textContent=`채팅`;let p=document.createElement(`section`);p.className=`rg-collaboration-chat`,p.hidden=!0,p.setAttribute(`role`,`dialog`),p.setAttribute(`aria-label`,`현재 페이지 실시간 채팅`);let m=()=>{Be(d,r.peers,e.session.displayName),e.cursors&&Ve(u,r.peers),e.chat&&h()},h=()=>{let t=e.root.activeElement?.classList.contains(`rg-collaboration-chat-input`)===!0;p.replaceChildren();let n=j(`rg-collaboration-chat-header`),i=document.createElement(`h2`);i.textContent=`현재 페이지 채팅`;let a=Ge(`rg-collaboration-chat-close`,`채팅 닫기`);a.type=`button`,a.textContent=`×`,a.addEventListener(`click`,()=>g(!1)),n.append(i,a);let u=j(`rg-collaboration-chat-messages`);if(u.setAttribute(`role`,`log`),u.setAttribute(`aria-live`,`polite`),r.messages.length===0){let e=j(`rg-collaboration-chat-empty`);e.textContent=`함께 보고 있는 사람에게 메시지를 남겨보세요.`,u.append(e)}else for(let t of r.messages){let n=document.createElement(`article`);n.className=`rg-collaboration-chat-message`,t.authorId===e.session.reviewerId&&(n.dataset.mine=`true`);let r=j(`rg-collaboration-chat-meta`),i=document.createElement(`strong`);i.textContent=t.authorName;let a=document.createElement(`time`);a.dateTime=new Date(t.createdAt).toISOString(),a.textContent=Ue(t.createdAt);let o=j(`rg-collaboration-chat-pathname`);o.textContent=t.pathname,o.title=`메시지를 보낸 페이지: ${t.pathname}`,r.append(i,o,a);let s=document.createElement(`p`);s.textContent=t.body,n.append(r,s),u.append(n)}let d=document.createElement(`form`);d.className=`rg-collaboration-chat-form`;let f=document.createElement(`textarea`);f.className=`rg-collaboration-chat-input`,f.maxLength=4e3,f.rows=2,f.placeholder=`메시지 입력`,f.setAttribute(`aria-label`,`채팅 메시지`),f.value=l,f.disabled=s,f.addEventListener(`input`,()=>{l=f.value}),f.addEventListener(`keydown`,e=>{e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),d.requestSubmit())});let m=Ge(`rg-collaboration-chat-send`,s?`전송 중`:`메시지 전송`);if(m.type=`submit`,m.disabled=s,m.textContent=s?`전송 중…`:`전송`,d.addEventListener(`submit`,e=>{e.preventDefault(),ee(f.value)}),d.append(f,m),c){let e=j(`rg-collaboration-chat-error`);e.setAttribute(`role`,`alert`),e.textContent=c,d.prepend(e)}p.append(n,u,d),o&&queueMicrotask(()=>{u.scrollTop=u.scrollHeight,t&&(f.focus(),f.setSelectionRange(f.value.length,f.value.length))})},ee=async t=>{let n=t.trim();if(!n||s)return;l=t,s=!0,c=``,h();let r=e.now?.()??Date.now(),i={id:e.id?.()??crypto.randomUUID(),pageId:e.pageId,pathname:e.pathname,authorId:e.session.reviewerId,authorName:e.session.displayName,body:n,createdAt:r,updatedAt:r};try{await e.repository.sendMessage(e.pageId,i),l=``}catch{c=`메시지를 전송하지 못했습니다. 다시 시도하세요.`}finally{s=!1,h()}},g=e=>{o=e,p.hidden=!e,f.setAttribute(`aria-expanded`,String(e)),f.setAttribute(`aria-label`,e?`실시간 채팅 닫기`:`실시간 채팅 열기`),e?(h(),queueMicrotask(()=>p.querySelector(`textarea`)?.focus())):f.focus()},_=t=>{!e.cursors||n||e.repository.publishPresence(e.pageId,e.roomId,t)},v=()=>({reviewerId:e.session.reviewerId,displayName:e.session.displayName,color:He(e.session.reviewerId),active:!1}),te=t=>{t.pointerType===`touch`||t.composedPath().includes(e.root.host)||(a=t,i===void 0&&(i=window.requestAnimationFrame(()=>{i=void 0;let t=a;a=void 0,t&&_({reviewerId:e.session.reviewerId,displayName:e.session.displayName,color:He(e.session.reviewerId),active:!0,cursorX:t.clientX,cursorY:t.clientY,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight})})))},y=()=>{document.visibilityState!==`visible`&&_(v())},ne=()=>_(v()),b=t=>{t.key!==`/`||t.defaultPrevented||t.repeat||t.isComposing||t.metaKey||t.ctrlKey||t.altKey||o||We(t)||e.canOpenChat?.()===!1||(t.preventDefault(),g(!0))};return{start(){if(n)return;let i=e.root.querySelector(`.rg-toolbar-actions`);e.cursors&&i?.append(d),e.chat&&(i?.append(f),e.root.append(p),f.addEventListener(`click`,()=>g(!o)),p.addEventListener(`keydown`,e=>{e.key===`Escape`&&g(!1)}),document.addEventListener(`keydown`,b)),e.cursors&&(e.root.prepend(u),document.addEventListener(`pointermove`,te,{passive:!0}),document.addEventListener(`pointerleave`,ne),document.addEventListener(`visibilitychange`,y)),t=e.repository.subscribe(e.pageId,{roomId:e.roomId,cursors:e.cursors,chat:e.chat},e=>{r=e,m()},e.onFailure),_(v()),m()},stop(){n||(n=!0,i!==void 0&&window.cancelAnimationFrame(i),document.removeEventListener(`pointermove`,te),document.removeEventListener(`pointerleave`,ne),document.removeEventListener(`visibilitychange`,y),document.removeEventListener(`keydown`,b),t?.(),u.remove(),d.remove(),f.remove(),p.remove())}}}function Be(e,t,n){let r=[n,...t.map(({displayName:e})=>e)];e.textContent=`${r.length}명`,e.setAttribute(`aria-label`,`리뷰 참여자 ${r.length}명: ${r.join(`, `)}`),e.title=r.join(`, `)}function Ve(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=j(`rg-collaboration-cursor`);t.style.setProperty(`--rg-peer-color`,n.color),t.style.left=`${n.cursorX/n.viewportWidth*window.innerWidth}px`,t.style.top=`${n.cursorY/n.viewportHeight*window.innerHeight}px`;let r=j(`rg-collaboration-cursor-pointer`),i=j(`rg-collaboration-cursor-label`);i.textContent=n.displayName,t.append(r,i),e.append(t)}}function He(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 Ue(e){return new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,minute:`2-digit`}).format(e)}function We(e){let t=e.composedPath()[0];return t instanceof Element&&t.closest(`input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`)!==null}function j(e){let t=document.createElement(`div`);return t.className=e,t}function Ge(e,t){let n=document.createElement(`button`);return n.className=e,n.setAttribute(`aria-label`,t),n}function Ke(e={}){let t=document.createElement(`div`);t.className=`rg-toolbar`,t.setAttribute(`role`,`toolbar`),t.setAttribute(`aria-label`,`Visual Review`);let n=F(`rg-toolbar-actions-shell`),r=F(`rg-toolbar-actions`);e.developerGrab&&r.append(qe());let i=F(`rg-action-wrap`),a=I(`rg-action rg-feedback-tool`,`피드백 위치 선택`);a.setAttribute(`aria-pressed`,`false`),a.append(Xe());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=I(`rg-collapse`,`Visual Review 접기`);if(s.setAttribute(`aria-expanded`,`true`),s.append(Qe()),t.append(n,s),e.developerGrab){let e=F(`rg-developer-status`);e.dataset.visible=`false`,e.dataset.tone=`neutral`,e.setAttribute(`aria-hidden`,`true`),t.append(e)}return t}function qe(){let e=F(`rg-action-wrap rg-developer-grab-action-wrap`),t=I(`rg-action rg-developer-grab-tool`,`React Grab 코드 선택`);t.setAttribute(`aria-keyshortcuts`,`Meta+C Control+C`),t.setAttribute(`aria-pressed`,`false`),t.append(Ze());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 Je(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=N(`0 0 16 8`,[P(`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=F(`rg-surface`),o=F(`rg-tag-row`),s=document.createElement(`span`);s.className=`rg-tag`,s.textContent=e,o.append(s);let c=F(`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=I(`rg-submit`,`피드백 저장`);return u.title=`저장 (⌘/Ctrl+Enter)`,u.append($e()),c.append(l,u),a.append(o,c),r.append(i,a),r}function Ye(){return N(`0 0 12 12`,[P(`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 M(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 Xe(){return N(`0 0 12 12`,[P(`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 Ze(){return N(`0 0 12 12`,[P(`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 Qe(){return N(`0 0 24 24`,[P(`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 $e(){return N(`0 0 24 24`,[P(`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 N(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 P(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 F(e){let t=document.createElement(`div`);return t.className=e,t}function I(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))}async function tt(e){let t=window.__REACT_GRAB__;if(rt(t))return nt(t);let n=await fe(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 rt(e){return{copyElement:t=>e.copyElement(t),dispose(){}}}function it(e){return typeof e==`object`&&!!e&&`copyElement`in e&&typeof e.copyElement==`function`}function at(e,t=`all`){let n=[...e.comments].sort(ot),r=new Map(n.map((e,t)=>[e.id,t+1])),i=new Map;for(let t of e.replies){if(!r.has(t.commentId))continue;let e=i.get(t.commentId);e?(e.replyCount+=1,e.lastReplyAt=Math.max(e.lastReplyAt,t.updatedAt)):i.set(t.commentId,{replyCount:1,lastReplyAt:t.updatedAt})}let a=n.map(e=>{let t=i.get(e.id);return{comment:e,pinNumber:r.get(e.id),replyCount:t?.replyCount??0,lastActivityAt:Math.max(e.updatedAt,t?.lastReplyAt??e.updatedAt)}}),o={all:a.length,open:a.filter(({comment:e})=>e.status===`open`).length,resolved:a.filter(({comment:e})=>e.status===`resolved`).length};return{rows:a.filter(({comment:e})=>t===`all`||e.status===t).sort(st),counts:o,pinNumberByCommentId:r}}function ot(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function st(e,t){return t.lastActivityAt-e.lastActivityAt||t.comment.createdAt-e.comment.createdAt||e.comment.id.localeCompare(t.comment.id)}const ct=`visual-review-feedback-navigator`,lt=[`all`,`open`,`resolved`],ut={all:`전체`,open:`진행 중`,resolved:`완료`};function dt(e,t={}){let n=t.controlsId??ct,r=z(`rg-action-wrap rg-feedback-list-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`,`피드백 목록, 총 ${B(e)}개`),i.append(ht());let a=document.createElement(`span`);return a.className=`rg-tooltip`,a.setAttribute(`aria-hidden`,`true`),a.textContent=`목록`,r.append(i,a),r}function ft(e,t={}){let n=t.id??ct,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.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=z(`rg-feedback-navigator-header`),s=z(`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(B(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(gt()),o.append(s,u);let d=z(`rg-feedback-navigator-content`);if(yt(d,e),e.loadState!==`loading`&&e.loadState!==`error`)if(e.rows.length===0)d.append(bt(e.counts.all===0));else{let t=document.createElement(`ul`);t.className=`rg-feedback-list`,t.setAttribute(`aria-label`,`피드백 목록`);for(let n of e.rows)t.append(mt(n,e.activeCommentId));d.append(t)}if(a.append(o),e.counts.all>0&&e.loadState!==`loading`&&e.loadState!==`error`){let t=z(`rg-feedback-filters`);t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,`피드백 상태 필터`);for(let n of lt)t.append(pt(n,e.counts[n],e.filter===n));a.append(t)}return a.append(d),a}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`,`${ut[e]} 피드백 ${B(t)}개`);let i=document.createElement(`span`);i.className=`rg-feedback-filter-label`,i.textContent=ut[e];let a=document.createElement(`span`);return a.className=`rg-feedback-filter-count`,a.setAttribute(`aria-hidden`,`true`),a.textContent=String(B(t)),r.append(i,a),r}function mt(e,t){let n=document.createElement(`li`);n.className=`rg-feedback-item`,n.dataset.commentId=e.id;let r=document.createElement(`button`);r.type=`button`,r.className=`rg-feedback-row`,r.dataset.commentId=e.id,r.dataset.feedbackNavigatorAction=`open-comment`,r.dataset.status=e.status,r.dataset.locationAvailable=String(e.locationAvailable!==!1),e.id===t&&r.setAttribute(`aria-current`,`true`),r.setAttribute(`aria-label`,xt(e));let i=document.createElement(`span`);i.className=`rg-feedback-row-pin`,i.setAttribute(`aria-hidden`,`true`),i.textContent=String(Math.max(1,Math.trunc(e.pinNumber)));let a=z(`rg-feedback-row-copy`),o=document.createElement(`span`);if(o.className=`rg-feedback-row-body`,e.targetLabel?.trim()){let t=document.createElement(`span`);t.className=`rg-feedback-row-target`,t.textContent=e.targetLabel.trim(),o.append(t,document.createTextNode(` — ${e.body}`))}else o.textContent=e.body;let s=z(`rg-feedback-row-detail`),c=document.createElement(`span`);c.className=`rg-feedback-row-meta`,c.textContent=`${e.authorName} · ${e.timeLabel}`;let l=z(`rg-feedback-row-trailing`);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(_t()),l.append(e)}if(e.replyCount>0){let t=document.createElement(`span`);t.className=`rg-feedback-row-replies`,t.setAttribute(`aria-hidden`,`true`),t.textContent=`답글 ${B(e.replyCount)}`,l.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),l.append(e)}return s.append(c,l),a.append(o,s),r.append(i,a),n.append(r),n}function ht(){return L(`0 0 14 14`,[R(`M4.75 3.25h6.5M4.75 7h6.5M4.75 10.75h6.5`),R(`M2.25 3.25h.01M2.25 7h.01M2.25 10.75h.01`,{"stroke-linecap":`round`,"stroke-width":`1.5`})])}function gt(){return L(`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`,{fill:`currentColor`,stroke:`none`})])}function _t(){return L(`0 0 14 14`,[R(`M7 12.25s4-3.27 4-6.5a4 4 0 1 0-8 0c0 3.23 4 6.5 4 6.5Z`),R(`m4.75 3.5 4.5 4.5`)])}function vt(){return L(`0 0 12 12`,[R(`m2.25 6.25 2.25 2.25 5.25-5.25`)])}function yt(e,t){let n=t.loadState??`ready`;if(n===`ready`)return;let r=z(`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 bt(e){let t=z(`rg-feedback-navigator-empty`);return t.setAttribute(`role`,`status`),t.textContent=e?`피드백 없음`:`해당 피드백 없음`,t}function xt(e){let t=[`${Math.max(1,Math.trunc(e.pinNumber))}번 피드백`,...e.targetLabel?.trim()?[`대상 ${e.targetLabel.trim()}`]:[],e.body,e.authorName,`최근 활동 ${e.timeLabel}`];return e.replyCount>0&&t.push(`답글 ${B(e.replyCount)}개`),t.push(e.status===`resolved`?`완료`:`진행 중`),e.locationAvailable===!1&&t.push(`현재 화면에서 위치를 찾을 수 없음`),t.join(`, `)}function L(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 R(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 z(e){let t=document.createElement(`div`);return t.className=e,t}function B(e){return Math.max(0,Math.trunc(Number.isFinite(e)?e:0))}const St=`agency-review-widget`,Ct=`visual-review:reauthenticate-required`,V=`visual-review-feedback-navigator`,wt=`${V}-surface`,Tt=new Set([`combobox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`radio`,`searchbox`,`slider`,`spinbutton`,`textbox`]);var Et=class extends HTMLElement{#e=this.attachShadow({mode:`open`});#t=null;#n=null;#r=null;#i=null;#a=!1;#o=null;#s=null;#c=null;#l=null;#u=``;#d=``;#f=null;#p=null;#m=null;#h=null;#g=null;#_=!1;#v=`all`;#y=`loading`;#b=``;#x=`retry`;#S=!1;#C=0;#w=0;#T=!navigator.onLine;#E=null;#D=null;#O=null;#k=null;#A=null;#j=null;#M=null;#N=!1;#P=!1;#F=null;#I=null;#L=!1;#R=null;#z=null;#B=!1;#V=null;#H=new Set;#U=new Map;#W=new Map;#G=new Map;#K=new Map;#q=new Map;#J=new Map;configure(e){if(this.#t)throw Error(`Review widget is already configured`);if(!Ot(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.#Y()}connectedCallback(){this.dataset.agencyReviewRoot=``,this.dataset.reactGrabIgnore=``,this.dataset.rgTheme=an(),this.#t&&this.#Y()}disconnectedCallback(){this.#ne()}async#Y(){!this.#t||this.#E||(this.#E=new AbortController,this.#T=!navigator.onLine,this.#re(),this.#ie(),this.#ae(),this.#$e(),document.addEventListener(`keydown`,this.#He,{capture:!0,signal:this.#E.signal}),document.addEventListener(`keyup`,this.#Ue,{capture:!0,signal:this.#E.signal}),document.addEventListener(`pointerdown`,this.#Ke,{capture:!0,signal:this.#E.signal}),document.addEventListener(`click`,this.#qe,{capture:!0,signal:this.#E.signal}),document.addEventListener(`focusin`,this.#Be,{capture:!0,signal:this.#E.signal}),document.addEventListener(`scroll`,this.#Xe,{capture:!0,passive:!0,signal:this.#E.signal}),window.addEventListener(`scroll`,this.#Xe,{passive:!0,signal:this.#E.signal}),window.addEventListener(`resize`,this.#Xe,{passive:!0,signal:this.#E.signal}),window.visualViewport?.addEventListener(`scroll`,this.#Xe,{passive:!0,signal:this.#E.signal}),window.visualViewport?.addEventListener(`resize`,this.#Xe,{passive:!0,signal:this.#E.signal}),window.addEventListener(`online`,this.#te,{signal:this.#E.signal}),window.addEventListener(`offline`,this.#te,{signal:this.#E.signal}),await this.#X())}async#X(){if(!this.#t||!this.#E)return;let e=this.#y===`error`,t=++this.#C,n=this.#E.signal,{pageId:r,repository:i}=this.#t;this.#y=`loading`,this.#b=``,this.#se(),this.#pe();try{let e=await i.getSnapshot(r);if(n.aborted||t!==this.#C)return;let a=this.#n;this.#n=null;try{a?.()}catch{}let o=!1,s=!1,c=e,l=i.subscribe(r,e=>{if(!(n.aborted||t!==this.#C||!this.#E)){if(!s){c=e;return}this.#Q(e)}},e=>{n.aborted||t!==this.#C||!this.#E||(o=!0,this.#$(e))});if(o){try{l()}catch{}return}if(n.aborted||t!==this.#C||!this.#E){try{l()}catch{}return}this.#n=l,s=!0,this.#Q(c)}catch(r){if(n.aborted||t!==this.#C)return;let i=en(r)?r:{type:`error`,code:`unknown`,recovery:`retry`,clearSnapshot:!0};this.#$(i,i.type===`access-lost`),e&&this.#_&&queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-navigator-retry`)?.focus({preventScroll:!0}))}}#Z=new Map;#Q=e=>{for(let[t,n]of[...this.#Z])e.comments.some(({id:e})=>e===t)&&(this.#Z.delete(t),n());this.#y=`ready`,this.#x=`retry`,this.#S=!1,this.#i=e,this.#ee(e);let t=!1;if(this.#h&&!e.comments.some(({id:e})=>e===this.#h)){let e=this.#h;t=!0,this.#G.delete(e),this.#K.delete(e),this.#q.delete(e),this.#J.delete(e),this.#h=null,this.#g=null,this.#De(`열려 있던 피드백이 삭제되었습니다.`)}this.#ae();let n=t&&!this.#_?this.#fe():!1;t&&queueMicrotask(()=>{n||(this.#_?this.#ye():this.#be()?.focus())})};#$(e,t=!0){let n=e.type===`access-lost`;this.#C+=1,this.#w+=1;let r=this.#n;if(this.#n=null,e.clearSnapshot&&(this.#i=null),!n&&this.#l){let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);this.#m={target:this.#l,body:e?.value??this.#u},this.#l=null,this.#u=``}if(!n&&this.#p?.comment){let{target:e,body:t,comment:n}=this.#p;this.#f??={target:e,body:t,comment:n},this.#d||=`저장하지 못했습니다. 다시 시도하세요.`}n||this.#K.forEach(({body:e,reply:t},n)=>{this.#G.set(n,e),this.#J.has(n)||this.#J.set(n,{body:e,reply:t}),this.#q.has(n)||this.#q.set(n,`답글을 저장하지 못했습니다. 다시 시도하세요.`)}),this.#p=null,this.#K.clear(),n&&(this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#m=null,this.#h=null,this.#g=null,this.#G.clear(),this.#q.clear(),this.#J.clear()),this.#a?this.#oe(!1):this.#ut(),this.#y=`error`,this.#x=e.recovery,this.#S=e.type===`access-lost`,this.#b=e.type===`access-lost`?`다시 인증하세요.`:`다시 시도하세요.`,t&&(this.#_=!0);try{r?.()}catch{}if(this.#se(),this.#ae(),this.#De(this.#b),e.type===`access-lost`){try{this.#t?.onReauthenticationRequired?.(e)}catch{}this.dispatchEvent(new CustomEvent(Ct,{bubbles:!0,composed:!0,detail:{code:e.code}}))}}#ee(e){let t=new Set(e.comments.map(({id:e})=>e)),n=this.#p,r=this.#f,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.#l!==null&&o.includes(this.#l);this.#l&&o.includes(this.#l)&&(this.#l=null,this.#u=``),this.#m&&o.includes(this.#m.target)&&(this.#m=null),i&&(this.#p=null),a&&(this.#f=null),this.#d=``,this.#De(`피드백을 저장했습니다.`),e&&queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}))}new Set([...this.#G.keys(),...this.#K.keys(),...this.#q.keys(),...this.#J.keys()]).forEach(n=>{if(!t.has(n)){this.#G.delete(n),this.#K.delete(n),this.#q.delete(n),this.#J.delete(n);return}let r=this.#K.get(n),i=this.#J.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.#K.delete(n),o&&this.#J.delete(n),this.#q.delete(n),this.#G.delete(n),this.#De(`답글을 저장했습니다.`))})}#te=()=>{this.#T=!navigator.onLine,this.#pe()};#ne(){this.#C+=1,this.#w+=1,this.#We(),this.#ke(),this.#Ye(),this.#Re(),this.#it(),this.#a&&this.#oe(!1),this.#O?.(),this.#O=null,this.#D?.(),this.#D=null;let e=this.#n;this.#n=null,this.#r?.stop(),this.#r=null,this.#E?.abort(),this.#E=null,this.#i=null,this.#y=`loading`,this.#b=``,this.#x=`retry`,this.#S=!1,this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#p=null,this.#m=null,this.#h=null,this.#g=null,this.#_=!1,this.#v=`all`,this.#P=!1,this.#G.clear(),this.#K.clear(),this.#q.clear(),this.#J.clear(),this.#e.replaceChildren();try{e?.()}catch{}}#re(){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.#E?.signal})});let t=document.createElement(`style`);this.#t?.styleNonce&&(t.nonce=this.#t.styleNonce),t.textContent=`
3
+ `))},dispose(){}}}function nt(e){return{copyElement:t=>e.copyElement(t),dispose(){}}}function rt(e){return typeof e==`object`&&!!e&&`copyElement`in e&&typeof e.copyElement==`function`}function it(e,t=`all`){let n=[...e.comments].sort(at),r=new Map(n.map((e,t)=>[e.id,t+1])),i=new Map;for(let t of e.replies){if(!r.has(t.commentId))continue;let e=i.get(t.commentId);e?(e.replyCount+=1,e.lastReplyAt=Math.max(e.lastReplyAt,t.updatedAt)):i.set(t.commentId,{replyCount:1,lastReplyAt:t.updatedAt})}let a=n.map(e=>{let t=i.get(e.id);return{comment:e,pinNumber:r.get(e.id),replyCount:t?.replyCount??0,lastActivityAt:Math.max(e.updatedAt,t?.lastReplyAt??e.updatedAt)}}),o={all:a.length,open:a.filter(({comment:e})=>e.status===`open`).length,resolved:a.filter(({comment:e})=>e.status===`resolved`).length};return{rows:a.filter(({comment:e})=>t===`all`||e.status===t).sort(ot),counts:o,pinNumberByCommentId:r}}function at(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function ot(e,t){return t.lastActivityAt-e.lastActivityAt||t.comment.createdAt-e.comment.createdAt||e.comment.id.localeCompare(t.comment.id)}const st=`visual-review-feedback-navigator`,ct=[`all`,`open`,`resolved`],lt={all:`전체`,open:`진행 중`,resolved:`완료`};function ut(e,t={}){let n=t.controlsId??st,r=z(`rg-action-wrap rg-feedback-list-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`,`피드백 목록, 총 ${B(e)}개`),i.append(mt());let a=document.createElement(`span`);return a.className=`rg-tooltip`,a.setAttribute(`aria-hidden`,`true`),a.textContent=`목록`,r.append(i,a),r}function dt(e,t={}){let n=t.id??st,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.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=z(`rg-feedback-navigator-header`),s=z(`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(B(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(ht()),o.append(s,u);let d=z(`rg-feedback-navigator-content`);if(vt(d,e),e.loadState!==`loading`&&e.loadState!==`error`)if(e.rows.length===0)d.append(yt(e.counts.all===0));else{let t=document.createElement(`ul`);t.className=`rg-feedback-list`,t.setAttribute(`aria-label`,`피드백 목록`);for(let n of e.rows)t.append(pt(n,e.activeCommentId));d.append(t)}if(a.append(o),e.counts.all>0&&e.loadState!==`loading`&&e.loadState!==`error`){let t=z(`rg-feedback-filters`);t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,`피드백 상태 필터`);for(let n of ct)t.append(ft(n,e.counts[n],e.filter===n));a.append(t)}return a.append(d),a}function ft(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`,`${lt[e]} 피드백 ${B(t)}개`);let i=document.createElement(`span`);i.className=`rg-feedback-filter-label`,i.textContent=lt[e];let a=document.createElement(`span`);return a.className=`rg-feedback-filter-count`,a.setAttribute(`aria-hidden`,`true`),a.textContent=String(B(t)),r.append(i,a),r}function pt(e,t){let n=document.createElement(`li`);n.className=`rg-feedback-item`,n.dataset.commentId=e.id;let r=document.createElement(`button`);r.type=`button`,r.className=`rg-feedback-row`,r.dataset.commentId=e.id,r.dataset.feedbackNavigatorAction=`open-comment`,r.dataset.status=e.status,r.dataset.locationAvailable=String(e.locationAvailable!==!1),e.id===t&&r.setAttribute(`aria-current`,`true`),r.setAttribute(`aria-label`,bt(e));let i=document.createElement(`span`);i.className=`rg-feedback-row-pin`,i.setAttribute(`aria-hidden`,`true`),i.textContent=String(Math.max(1,Math.trunc(e.pinNumber)));let a=z(`rg-feedback-row-copy`),o=document.createElement(`span`);if(o.className=`rg-feedback-row-body`,e.targetLabel?.trim()){let t=document.createElement(`span`);t.className=`rg-feedback-row-target`,t.textContent=e.targetLabel.trim(),o.append(t,document.createTextNode(` — ${e.body}`))}else o.textContent=e.body;let s=z(`rg-feedback-row-detail`),c=document.createElement(`span`);c.className=`rg-feedback-row-meta`,c.textContent=`${e.authorName} · ${e.timeLabel}`;let l=z(`rg-feedback-row-trailing`);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(gt()),l.append(e)}if(e.replyCount>0){let t=document.createElement(`span`);t.className=`rg-feedback-row-replies`,t.setAttribute(`aria-hidden`,`true`),t.textContent=`답글 ${B(e.replyCount)}`,l.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(_t());let t=document.createElement(`span`);t.className=`rg-visually-hidden`,t.textContent=`완료`,e.append(t),l.append(e)}return s.append(c,l),a.append(o,s),r.append(i,a),n.append(r),n}function mt(){return L(`0 0 14 14`,[R(`M4.75 3.25h6.5M4.75 7h6.5M4.75 10.75h6.5`),R(`M2.25 3.25h.01M2.25 7h.01M2.25 10.75h.01`,{"stroke-linecap":`round`,"stroke-width":`1.5`})])}function ht(){return L(`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`,{fill:`currentColor`,stroke:`none`})])}function gt(){return L(`0 0 14 14`,[R(`M7 12.25s4-3.27 4-6.5a4 4 0 1 0-8 0c0 3.23 4 6.5 4 6.5Z`),R(`m4.75 3.5 4.5 4.5`)])}function _t(){return L(`0 0 12 12`,[R(`m2.25 6.25 2.25 2.25 5.25-5.25`)])}function vt(e,t){let n=t.loadState??`ready`;if(n===`ready`)return;let r=z(`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 yt(e){let t=z(`rg-feedback-navigator-empty`);return t.setAttribute(`role`,`status`),t.textContent=e?`피드백 없음`:`해당 피드백 없음`,t}function bt(e){let t=[`${Math.max(1,Math.trunc(e.pinNumber))}번 피드백`,...e.targetLabel?.trim()?[`대상 ${e.targetLabel.trim()}`]:[],e.body,e.authorName,`최근 활동 ${e.timeLabel}`];return e.replyCount>0&&t.push(`답글 ${B(e.replyCount)}개`),t.push(e.status===`resolved`?`완료`:`진행 중`),e.locationAvailable===!1&&t.push(`현재 화면에서 위치를 찾을 수 없음`),t.join(`, `)}function L(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 R(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 z(e){let t=document.createElement(`div`);return t.className=e,t}function B(e){return Math.max(0,Math.trunc(Number.isFinite(e)?e:0))}const xt=`agency-review-widget`,St=`visual-review:reauthenticate-required`,V=`visual-review-feedback-navigator`,Ct=`${V}-surface`,wt=new Set([`combobox`,`menuitem`,`menuitemcheckbox`,`menuitemradio`,`option`,`radio`,`searchbox`,`slider`,`spinbutton`,`textbox`]);var Tt=class extends HTMLElement{#e=this.attachShadow({mode:`open`});#t=null;#n=null;#r=null;#i=null;#a=!1;#o=null;#s=null;#c=null;#l=null;#u=``;#d=``;#f=null;#p=null;#m=null;#h=null;#g=null;#_=!1;#v=`all`;#y=`loading`;#b=``;#x=`retry`;#S=!1;#C=0;#w=0;#T=!navigator.onLine;#E=null;#D=null;#O=null;#k=null;#A=null;#j=null;#M=null;#N=!1;#P=!1;#F=null;#I=null;#L=!1;#R=null;#z=null;#B=!1;#V=null;#H=new Set;#U=new Map;#W=new Map;#G=new Map;#K=new Map;#q=new Map;#J=new Map;configure(e){if(this.#t)throw Error(`Review widget is already configured`);if(!Dt(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.#Y()}connectedCallback(){this.dataset.agencyReviewRoot=``,this.dataset.reactGrabIgnore=``,this.dataset.rgTheme=rn(),this.#t&&this.#Y()}disconnectedCallback(){this.#ne()}async#Y(){!this.#t||this.#E||(this.#E=new AbortController,this.#T=!navigator.onLine,this.#re(),this.#ie(),this.#ae(),this.#$e(),document.addEventListener(`keydown`,this.#He,{capture:!0,signal:this.#E.signal}),document.addEventListener(`keyup`,this.#Ue,{capture:!0,signal:this.#E.signal}),document.addEventListener(`pointerdown`,this.#Ke,{capture:!0,signal:this.#E.signal}),document.addEventListener(`click`,this.#qe,{capture:!0,signal:this.#E.signal}),document.addEventListener(`focusin`,this.#Be,{capture:!0,signal:this.#E.signal}),document.addEventListener(`scroll`,this.#Xe,{capture:!0,passive:!0,signal:this.#E.signal}),window.addEventListener(`scroll`,this.#Xe,{passive:!0,signal:this.#E.signal}),window.addEventListener(`resize`,this.#Xe,{passive:!0,signal:this.#E.signal}),window.visualViewport?.addEventListener(`scroll`,this.#Xe,{passive:!0,signal:this.#E.signal}),window.visualViewport?.addEventListener(`resize`,this.#Xe,{passive:!0,signal:this.#E.signal}),window.addEventListener(`online`,this.#te,{signal:this.#E.signal}),window.addEventListener(`offline`,this.#te,{signal:this.#E.signal}),await this.#X())}async#X(){if(!this.#t||!this.#E)return;let e=this.#y===`error`,t=++this.#C,n=this.#E.signal,{pageId:r,repository:i}=this.#t;this.#y=`loading`,this.#b=``,this.#se(),this.#pe();try{let e=await i.getSnapshot(r);if(n.aborted||t!==this.#C)return;let a=this.#n;this.#n=null;try{a?.()}catch{}let o=!1,s=!1,c=e,l=i.subscribe(r,e=>{if(!(n.aborted||t!==this.#C||!this.#E)){if(!s){c=e;return}this.#Q(e)}},e=>{n.aborted||t!==this.#C||!this.#E||(o=!0,this.#$(e))});if(o){try{l()}catch{}return}if(n.aborted||t!==this.#C||!this.#E){try{l()}catch{}return}this.#n=l,s=!0,this.#Q(c)}catch(r){if(n.aborted||t!==this.#C)return;let i=$t(r)?r:{type:`error`,code:`unknown`,recovery:`retry`,clearSnapshot:!0};this.#$(i,i.type===`access-lost`),e&&this.#_&&queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-navigator-retry`)?.focus({preventScroll:!0}))}}#Z=new Map;#Q=e=>{for(let[t,n]of[...this.#Z])e.comments.some(({id:e})=>e===t)&&(this.#Z.delete(t),n());this.#y=`ready`,this.#x=`retry`,this.#S=!1,this.#i=e,this.#ee(e);let t=!1;if(this.#h&&!e.comments.some(({id:e})=>e===this.#h)){let e=this.#h;t=!0,this.#G.delete(e),this.#K.delete(e),this.#q.delete(e),this.#J.delete(e),this.#h=null,this.#g=null,this.#De(`열려 있던 피드백이 삭제되었습니다.`)}this.#ae();let n=t&&!this.#_?this.#fe():!1;t&&queueMicrotask(()=>{n||(this.#_?this.#ye():this.#be()?.focus())})};#$(e,t=!0){let n=e.type===`access-lost`;this.#C+=1,this.#w+=1;let r=this.#n;if(this.#n=null,e.clearSnapshot&&(this.#i=null),!n&&this.#l){let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);this.#m={target:this.#l,body:e?.value??this.#u},this.#l=null,this.#u=``}if(!n&&this.#p?.comment){let{target:e,body:t,comment:n}=this.#p;this.#f??={target:e,body:t,comment:n},this.#d||=`저장하지 못했습니다. 다시 시도하세요.`}n||this.#K.forEach(({body:e,reply:t},n)=>{this.#G.set(n,e),this.#J.has(n)||this.#J.set(n,{body:e,reply:t}),this.#q.has(n)||this.#q.set(n,`답글을 저장하지 못했습니다. 다시 시도하세요.`)}),this.#p=null,this.#K.clear(),n&&(this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#m=null,this.#h=null,this.#g=null,this.#G.clear(),this.#q.clear(),this.#J.clear()),this.#a?this.#oe(!1):this.#ut(),this.#y=`error`,this.#x=e.recovery,this.#S=e.type===`access-lost`,this.#b=e.type===`access-lost`?`다시 인증하세요.`:`다시 시도하세요.`,t&&(this.#_=!0);try{r?.()}catch{}if(this.#se(),this.#ae(),this.#De(this.#b),e.type===`access-lost`){try{this.#t?.onReauthenticationRequired?.(e)}catch{}this.dispatchEvent(new CustomEvent(St,{bubbles:!0,composed:!0,detail:{code:e.code}}))}}#ee(e){let t=new Set(e.comments.map(({id:e})=>e)),n=this.#p,r=this.#f,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.#l!==null&&o.includes(this.#l);this.#l&&o.includes(this.#l)&&(this.#l=null,this.#u=``),this.#m&&o.includes(this.#m.target)&&(this.#m=null),i&&(this.#p=null),a&&(this.#f=null),this.#d=``,this.#De(`피드백을 저장했습니다.`),e&&queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}))}new Set([...this.#G.keys(),...this.#K.keys(),...this.#q.keys(),...this.#J.keys()]).forEach(n=>{if(!t.has(n)){this.#G.delete(n),this.#K.delete(n),this.#q.delete(n),this.#J.delete(n);return}let r=this.#K.get(n),i=this.#J.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.#K.delete(n),o&&this.#J.delete(n),this.#q.delete(n),this.#G.delete(n),this.#De(`답글을 저장했습니다.`))})}#te=()=>{this.#T=!navigator.onLine,this.#pe()};#ne(){this.#C+=1,this.#w+=1,this.#We(),this.#ke(),this.#Ye(),this.#Re(),this.#it(),this.#a&&this.#oe(!1),this.#O?.(),this.#O=null,this.#D?.(),this.#D=null;let e=this.#n;this.#n=null,this.#r?.stop(),this.#r=null,this.#E?.abort(),this.#E=null,this.#i=null,this.#y=`loading`,this.#b=``,this.#x=`retry`,this.#S=!1,this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#p=null,this.#m=null,this.#h=null,this.#g=null,this.#_=!1,this.#v=`all`,this.#P=!1,this.#G.clear(),this.#K.clear(),this.#q.clear(),this.#J.clear(),this.#e.replaceChildren();try{e?.()}catch{}}#re(){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.#E?.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
  --review-accent: #e5484d;
@@ -918,4 +918,4 @@ const e=`visual-review:v1:`,t=4096;function n(t,n){return`${e}${encodeURICompone
918
918
  @media (max-width: 640px) {
919
919
  .rg-collaboration-chat { left: 8px; right: 8px; bottom: 58px; width: auto; max-height: calc(100dvh - 76px); }
920
920
  }
921
- `;let n=H(`highlight`);n.dataset.slot=`highlight`;let r=H(`region`);r.dataset.slot=`region`;let i=H(`pins`);i.dataset.slot=`pins`;let a=H(`panels`);a.dataset.slot=`panels`;let o=H(`navigator-slot`);o.dataset.slot=`navigator`,o.id=V,o.addEventListener(`click`,this.#Se),o.addEventListener(`keydown`,this.#Ce);let s=H(`rg-visually-hidden`);s.dataset.slot=`announcer`,s.setAttribute(`aria-live`,`polite`),s.setAttribute(`aria-atomic`,`true`);let c=qe({developerGrab:this.#t?.developerTools?.reactGrab===!0});c.querySelector(`.rg-toolbar-actions`)?.append(dt(0,{controlsId:V,presentation:this.#ge()})),c.querySelector(`.rg-feedback-tool`)?.addEventListener(`click`,()=>{if(!this.#ce()){this.#_||this.#ue(!0),this.#De(this.#le());return}if(this.#_&&this.#ue(!1,{restoreFocus:!1,restoreComposer:!0}))return;if(this.#p){this.#De(`피드백을 저장하는 중입니다.`);return}if(this.#a&&this.#o===`react-grab`&&this.#m){this.#oe(!1);return}let e=this.#a&&this.#o===`feedback`;this.#oe(!e,`feedback`)}),c.querySelector(`.rg-developer-grab-tool`)?.addEventListener(`click`,()=>{if(this.#P){this.#De(`코드 컨텍스트를 복사하는 중입니다.`);return}if(this.#p){this.#De(`피드백을 저장하는 중입니다.`);return}this.#_&&this.#ue(!1,{restoreFocus:!1});let e=this.#a&&this.#o===`react-grab`;e||this.#de(),this.#oe(!e,`react-grab`)}),c.querySelector(`.rg-feedback-list-tool`)?.addEventListener(`click`,()=>{this.#ue(!this.#_)}),c.querySelector(`.rg-collapse`)?.addEventListener(`click`,()=>{let e=c.dataset.collapsed===`true`;!e&&this.#a&&this.#oe(!1),!e&&this.#_&&this.#ue(!1,{restoreFocus:!1});let t=!e;c.dataset.collapsed=String(t);let n=c.querySelector(`.rg-toolbar-actions-shell`);n&&(n.inert=t,n.setAttribute(`aria-hidden`,String(t))),c.querySelector(`.rg-collapse`)?.setAttribute(`aria-expanded`,String(e)),c.querySelector(`.rg-collapse`)?.setAttribute(`aria-label`,e?`Visual Review 접기`:`Visual Review 펼치기`)}),this.#e.append(t,n,r,i,a,o,s,c)}#ie(){let e=this.#t?.collaboration,t=e?.repository;if(!this.#t||!t||!e.cursors&&!e.chat)return;let n=e.roomId??e.scopeId;this.#r=Be({root:this.#e,pageId:this.#t.pageId,pathname:nn(window.location.pathname),roomId:n,session:this.#t.session,repository:t,cursors:e.cursors,chat:e.chat,now:this.#t.now,id:this.#t.id,canOpenChat:()=>!this.#a&&!this.#_&&!this.#l&&!this.#h,onFailure:e=>{e.type===`access-lost`?(this.#r?.stop(),this.#r=null,this.#$(e)):this.#De(`실시간 협업 연결이 불안정합니다. 다시 연결하는 중입니다.`)}}),this.#r.start()}#ae(){this.#pt(),this.#ht(),this.#pe(),this.#he(),this.#se(),this.#rt(),this.#at()}#oe(e,t=`feedback`){let n=this.#o;if(e&&(this.#w+=1),e&&t===`feedback`&&!this.#ce()){this.#_||this.#ue(!0),this.#De(this.#le());return}if(e&&t===`feedback`&&this.#p){this.#De(`피드백을 저장하는 중입니다.`);return}if(e&&t===`feedback`&&this.#m){this.#h?this.#ot(!1):this.#fe(),this.#De(`작성 중인 피드백을 복원했습니다.`);return}if(e&&this.#a){this.#o=t,this.#s=null,this.#c=null,this.#ut(),this.#se();return}this.#a=e,this.#o=e?t:null,this.#se(),e?(this.#h=null,this.#g=null,this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#ut(),document.addEventListener(`pointermove`,this.#Ae,!0),document.addEventListener(`pointerdown`,this.#je,!0),document.addEventListener(`pointerup`,this.#Me,!0),document.addEventListener(`pointercancel`,this.#Ne,!0),document.addEventListener(`keydown`,this.#Pe,!0),this.#k={value:document.body.style.getPropertyValue(`cursor`),priority:document.body.style.getPropertyPriority(`cursor`)},document.body.style.setProperty(`cursor`,`crosshair`),this.#D=ye(this.#t?.styleNonce),queueMicrotask(()=>this.#Ve())):(document.removeEventListener(`pointermove`,this.#Ae,!0),document.removeEventListener(`pointerdown`,this.#je,!0),document.removeEventListener(`pointerup`,this.#Me,!0),document.removeEventListener(`pointercancel`,this.#Ne,!0),document.removeEventListener(`keydown`,this.#Pe,!0),this.#k&&=($(document.body,`cursor`,this.#k),null),this.#D?.(),this.#D=null,this.#s=null,this.#c=null,this.#ut()),this.#ht(),!e&&n===`react-grab`&&this.#fe()}#se(){let e=this.#e.querySelector(`.rg-toolbar`),t=this.#e.querySelector(`.rg-feedback-tool`),n=this.#e.querySelector(`.rg-developer-grab-tool`),r=this.#a&&this.#o===`feedback`,i=this.#a&&this.#o===`react-grab`;e&&(e.dataset.selecting=String(this.#a)),t&&(t.setAttribute(`aria-pressed`,String(r)),t.setAttribute(`aria-label`,r?`선택 취소`:`피드백 위치 선택`),t.setAttribute(`aria-disabled`,String(!this.#ce()))),n&&(n.setAttribute(`aria-pressed`,String(i)),n.setAttribute(`aria-label`,i?`코드 선택 취소`:`React Grab 코드 선택`),n.setAttribute(`aria-disabled`,String(this.#P)))}#ce(){return!this.#S&&this.#y===`ready`&&this.#i!==null}#le(){return this.#S?`다시 인증하세요.`:this.#y===`loading`?`불러오는 중입니다.`:`다시 시도하세요.`}#ue(e,t={}){let n=t.restoreFocus??!0,r=t.restoreComposer??!0;if(e===this.#_)return!1;if(e)return this.#w+=1,this.#a&&this.#oe(!1),this.#de(),this.#_=!0,this.#ht(),this.#pe(),this.#he(),queueMicrotask(()=>this.#ye()),!1;(t.cancelNavigation??!0)&&(this.#w+=1),this.#_=!1,this.#O?.(),this.#O=null,this.#pe(),this.#he();let i=r&&this.#fe();return n&&!i&&queueMicrotask(()=>this.#be()?.focus()),i}#de(){if(!this.#l)return!1;let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);return this.#m={target:this.#l,body:e?.value??this.#u},this.#l=null,this.#u=``,!0}#fe(){if(!this.#m||this.#_||this.#h)return!1;let e=this.#m;return this.#m=null,this.#l=e.target,this.#u=e.body,this.#ht(),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}#pe(){let e=this.#e.querySelector(`[data-slot="navigator"]`);if(!e)return;let t=e.querySelector(`.rg-feedback-navigator`),n=t?.querySelector(`.rg-feedback-navigator-content`),r=t?.dataset.presentation,i=t?`refresh`:`enter`,a=n?.scrollTop??0,o=this.#e.activeElement instanceof HTMLElement?this.#e.activeElement:null,s=o?.closest(`.rg-feedback-row[data-comment-id]`)?.dataset.commentId,c=o?.closest(`[data-feedback-filter]`)?.dataset.feedbackFilter,l=!!o?.closest(`.rg-feedback-navigator-close`),u=!!o?.closest(`.rg-feedback-navigator-retry`);if(e.replaceChildren(),!this.#_)return;let d=this.#ge(),f=H(`rg-feedback-navigator-scrim`);f.dataset.motion=i,f.dataset.feedbackNavigatorAction=`close`,f.setAttribute(`aria-hidden`,`true`);let p=ft(this.#me(),{id:wt,presentation:d});p.dataset.motion=i,e.append(f,p),this.#ve(d),queueMicrotask(()=>this.#_e()),queueMicrotask(()=>{if(!this.#_)return;let t=e.querySelector(`.rg-feedback-navigator-content`);if(t&&(t.scrollTop=a),s){let e=this.#xe(s);e?e.focus({preventScroll:!0}):this.#ye()}else if(c&&tn(c))e.querySelector(`[data-feedback-filter="${c}"]`)?.focus({preventScroll:!0});else if(l)e.querySelector(`.rg-feedback-navigator-close`)?.focus({preventScroll:!0});else if(u){let t=e.querySelector(`.rg-feedback-navigator-retry`);t?t.focus({preventScroll:!0}):this.#ye()}else d===`sheet`&&r!==`sheet`&&this.#ye()})}#me(){let e=at(this.#i??{pageId:this.#t?.pageId??``,comments:[],replies:[]},this.#v),t=this.#t?.now?.()??Date.now(),n=this.#T&&this.#y===`ready`?`reconnecting`:this.#y;return{filter:this.#v,counts:e.counts,rows:e.rows.map(({comment:e,pinNumber:n,replyCount:r,lastActivityAt:i})=>({id:e.id,pinNumber:n,targetLabel:Mt(e.target),authorName:e.authorName,body:e.body,timeLabel:rn(i,t),replyCount:r,status:e.status,locationAvailable:W(e).available})),activeCommentId:this.#h,loadState:n,errorMessage:this.#b,errorRecovery:this.#x}}#he(){let e=this.#be();if(!e)return;let t=this.#i?.comments.length??0;e.setAttribute(`aria-label`,`피드백 목록, 총 ${t}개`),e.setAttribute(`aria-expanded`,String(this.#_)),e.setAttribute(`aria-controls`,V),this.#ge()===`sheet`?e.setAttribute(`aria-haspopup`,`dialog`):e.removeAttribute(`aria-haspopup`),e.removeAttribute(`aria-pressed`)}#ge(){return window.matchMedia?.(`(max-width: 640px)`).matches||window.innerWidth<=640?`sheet`:`tray`}#_e(){let e=this.#e.querySelector(`.rg-feedback-navigator`),t=this.#be(),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||a<=0)return;let o=r.left+r.width/2,s=X(o-a/2,8,Math.max(8,window.innerWidth-a-8));e.style.left=`${s}px`,e.style.bottom=`${Math.max(8,window.innerHeight-i.top+8)}px`,e.style.setProperty(`--rg-navigator-origin-x`,`${X(o-s,16,a-16)}px`)}#ve(e){if(e!==`sheet`){this.#O?.(),this.#O=null;return}if(this.#O)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?Q(r,`visibility`):null;r&&r.style.setProperty(`visibility`,`hidden`);let a=Q(document.body,`overflow`),o=Q(document.documentElement,`overflow`),s=e=>{let t=this.#e.querySelector(`.rg-feedback-navigator`);!t||e.composedPath().includes(t)||queueMicrotask(()=>this.#ye())};document.addEventListener(`focusin`,s,!0),document.body.style.setProperty(`overflow`,`hidden`),document.documentElement.style.setProperty(`overflow`,`hidden`),this.#O=()=>{n.forEach(({element:e,inert:t})=>{e.inert=t}),r&&i&&$(r,`visibility`,i),document.removeEventListener(`focusin`,s,!0),$(document.body,`overflow`,a),$(document.documentElement,`overflow`,o)}}#ye(){if(!this.#_)return;let e=this.#h?this.#xe(this.#h):null,t=this.#e.querySelector(`.rg-feedback-row`),n=this.#e.querySelector(`.rg-feedback-navigator-retry`),r=this.#e.querySelector(`.rg-feedback-navigator-close`);(e??t??n??r)?.focus({preventScroll:!0})}#be(){return this.#e.querySelector(`.rg-feedback-list-tool`)}#xe(e){return[...this.#e.querySelectorAll(`.rg-feedback-row[data-comment-id]`)].find(({dataset:t})=>t.commentId===e)}#Se=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.#ue(!1);return}if(n===`retry`){this.#X();return}if(n===`filter`){let e=t.dataset.feedbackFilter;if(!tn(e)||e===this.#v)return;this.#v=e,this.#pe();return}n===`open-comment`&&t.dataset.commentId&&this.#we(t.dataset.commentId,{origin:`navigator`,navigate:!0})}};#Ce=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.#ge()!==`sheet`)return;let r=this.#e.querySelector(`.rg-feedback-navigator`),i=r?[...r.querySelectorAll(`button:not(:disabled), [tabindex]:not([tabindex="-1"])`)]:[];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#we(e,t){let n=this.#i?.comments.find(({id:t})=>t===e);if(!n)return;this.#a&&this.#oe(!1);let r=++this.#w;if(t.origin===`navigator`&&this.#_&&this.#ge()===`sheet`&&(this.#ue(!1,{restoreFocus:!1,restoreComposer:!1,cancelNavigation:!1}),await Z()),!(r!==this.#w||!this.#E)){if(!this.#i?.comments.some(({id:t})=>t===e)){this.#Te();return}if(t.navigate&&await this.#Ee(n),r===this.#w){if(!this.#i?.comments.some(({id:t})=>t===e)){this.#Te();return}this.#l=null,this.#h=e,this.#g=t.origin,this.#ae(),W(n).available||this.#De(`현재 화면에서 피드백 위치를 찾을 수 없습니다.`),queueMicrotask(()=>this.#e.querySelector(`.rg-thread-label`)?.focus({preventScroll:!0}))}}}#Te(){!this.#_&&this.#fe()||queueMicrotask(()=>{this.#_?this.#ye():this.#be()?.focus({preventScroll:!0})})}async#Ee(e){let t=W(e);if(!t.available||t.pageY===null)return;let n=window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`;if(e.target.kind!==`viewport`){let t=S(e.anchor).element;if(t&&typeof t.scrollIntoView==`function`)try{t.scrollIntoView({block:`center`,inline:`center`,behavior:n}),await Z(),await Z();return}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{}await Z(),await Z()}#De(e){let t=this.#e.querySelector(`[data-slot="announcer"]`);t&&(t.textContent=``,queueMicrotask(()=>{t.textContent=e}))}#Oe(e,t=`neutral`){let n=this.#e.querySelector(`.rg-developer-status`);n&&(this.#ke(),n.textContent=e,n.dataset.tone=t,n.dataset.visible=`true`,this.#j=window.setTimeout(()=>{this.#j=null,n.isConnected&&(n.dataset.visible=`false`)},1800))}#ke(){this.#j!==null&&(window.clearTimeout(this.#j),this.#j=null)}#Ae=e=>{if(!this.#a||this.#Ct(e)||this.#s&&e.pointerId!==this.#c)return;let t=Xt(e);if(this.#s&&kt(this.#s,t)>=6){this.#lt(this.#s,t);return}this.#ct(t)};#je=e=>{!this.#a||this.#Ct(e)||e.button!==0||this.#s||(e.preventDefault(),e.stopImmediatePropagation(),this.#s=Xt(e),this.#c=e.pointerId)};#Me=e=>{if(!this.#a||!this.#s||e.pointerId!==this.#c)return;if(this.#Ct(e)){this.#s=null,this.#c=null,this.#ut();return}e.preventDefault(),e.stopImmediatePropagation();let t=this.#s,n=this.#o,r=Xt(e),i=kt(t,r)>=6;n===`feedback`&&(this.#l=i?Ee(t,r):Te(r));let a=n===`react-grab`?this.#Fe(t,r,i):[];this.#Je(),this.#oe(!1),n===`react-grab`?this.#Ie(a):queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label textarea`)?.focus())};#Ne=e=>{!this.#a||!this.#s||e.pointerId!==this.#c||(e.preventDefault(),e.stopImmediatePropagation(),this.#s=null,this.#c=null,this.#ut())};#Pe=e=>{if(!this.#a)return;if(e.key===`Escape`){e.preventDefault(),e.stopImmediatePropagation(),this.#oe(!1);return}if(e.key!==`Enter`||e.isComposing||this.#Ct(e)||Y(e))return;let t=Kt(e);if(!t)return;let n=E(t);if(n.width<=0||n.height<=0)return;e.preventDefault(),e.stopImmediatePropagation();let r=this.#o;r===`feedback`&&(this.#l=we(t,{clientX:n.left+n.width/2,clientY:n.top+n.height/2})),this.#oe(!1),r===`react-grab`?this.#Ie([t]):queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label textarea`)?.focus())};#Fe(e,t,n){if(!n){let e=ve(t.clientX,t.clientY);return e?[e]:[]}return De(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#Ie(e){if(e.length===0){this.#De(`선택할 요소를 찾지 못했습니다.`),this.#Oe(`선택할 요소가 없습니다`,`error`),this.#ze();return}if(!this.#E||this.#P)return;let t=this.#E.signal;this.#P=!0,this.#se(),this.#De(`코드 컨텍스트를 복사하는 중입니다.`),this.#Oe(`코드 컨텍스트 복사 중…`);try{let n=this.#Le(),r=await n;if(t.aborted||n!==this.#F)return;let i=await r.copyElement(e.length===1?e[0]:e);if(t.aborted)return;this.#De(i?`코드 컨텍스트를 복사했습니다.`:`코드 컨텍스트를 복사하지 못했습니다. 다시 시도하세요.`),this.#Oe(i?`코드 컨텍스트 복사됨`:`복사 실패 · 다시 시도`,i?`neutral`:`error`)}catch{t.aborted||(this.#De(`코드 컨텍스트를 복사하지 못했습니다. 다시 시도하세요.`),this.#Oe(`복사 실패 · 다시 시도`,`error`))}finally{t.aborted||(this.#P=!1,this.#se(),this.#ze())}}#Le(){if(this.#F)return this.#F;let e=(this.#t?.developerTools?.loadReactGrab??(()=>nt(this.#t?.styleNonce)))();return this.#F=e,e.catch(()=>{this.#F===e&&(this.#F=null)}),e}#Re(){let e=this.#F;this.#F=null,e&&e.then(e=>e.dispose()).catch(()=>void 0)}#ze(){this.#l||queueMicrotask(()=>this.#e.querySelector(`.rg-developer-grab-tool`)?.focus({preventScroll:!0}))}#Be=e=>{if(!this.#a)return;if(this.#Ct(e)||Y(e)){this.#ut();return}let t=Kt(e);if(!t){this.#ut();return}let n=E(t);if(n.width<=0||n.height<=0){this.#ut();return}let r=this.#e.querySelector(`[data-slot="region"]`);r&&(r.style.display=`none`);let i=this.#e.querySelector(`[data-slot="highlight"]`);i&&U(i,n)};#Ve(){if(!this.#a)return;let e=qt(document);if(!e||D(e)||Gt(e))return;let t=E(e);if(t.width<=0||t.height<=0)return;let n=this.#e.querySelector(`[data-slot="highlight"]`);n&&U(n,t)}#He=e=>{if(e.key===`Escape`&&!e.isComposing){if(this.#_){e.preventDefault(),e.stopImmediatePropagation(),this.#ue(!1);return}if(this.#h){e.preventDefault(),e.stopImmediatePropagation(),this.#ot(!0);return}if(this.#l){if(e.preventDefault(),e.stopImmediatePropagation(),this.#p?.target===this.#l){this.#De(`피드백을 저장하는 중입니다.`);return}this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#ht(),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?.reactGrab!==!0||e.repeat||this.#a||this.#l||this.#h||this.#_||this.#P||this.#A!==null||Y(e)||Yt(e)||(this.#A=window.setTimeout(()=>{this.#A=null,!(this.#a||this.#l||this.#h||this.#_||this.#p||this.#P)&&this.#Ge()},100))};#Ue=e=>{let t=e.code===`KeyC`||e.key.toLowerCase()===`c`,n=e.key===`Meta`||e.key===`Control`;(t||n)&&this.#We()};#We(){this.#A!==null&&(window.clearTimeout(this.#A),this.#A=null)}#Ge(){if(this.#t?.developerTools?.reactGrab!==!0)return;let e=this.#e.querySelector(`.rg-toolbar`);if(e?.dataset.collapsed===`true`){e.dataset.collapsed=`false`;let t=e.querySelector(`.rg-toolbar-actions-shell`);t&&(t.inert=!1,t.setAttribute(`aria-hidden`,`false`));let n=e.querySelector(`.rg-collapse`);n?.setAttribute(`aria-expanded`,`true`),n?.setAttribute(`aria-label`,`Visual Review 접기`)}this.#oe(!0,`react-grab`)}#Ke=e=>{!this.#h||this.#Ct(e)||this.#ot(!1)};#qe=e=>{!this.#N||this.#Ct(e)||(e.preventDefault(),e.stopImmediatePropagation(),this.#Ye())};#Je(){this.#Ye(),this.#N=!0,this.#M=window.setTimeout(()=>{this.#M=null,this.#N=!1},0)}#Ye(){this.#M!==null&&(window.clearTimeout(this.#M),this.#M=null),this.#N=!1}#Xe=()=>{this.#Ze()};#Ze(){if(!(!this.#E||this.#I!==null)){if(typeof window.requestAnimationFrame==`function`){this.#L=!0,this.#I=-1;let e=window.requestAnimationFrame(()=>{this.#I=null,this.#Qe()});this.#I!==null&&(this.#I=e);return}this.#L=!1,this.#I=window.setTimeout(()=>{this.#I=null,this.#Qe()},16)}}#Qe(){if(!this.#E)return;this.#B&&(this.#B=!1,this.#et()),this.#rt(),this.#mt(),this.#dt(),this.#st();let e=this.#e.querySelector(`.rg-feedback-navigator`);e&&e.dataset.presentation!==this.#ge()?(this.#pe(),this.#he()):this.#_e(),this.#at()}#$e(){typeof window.ResizeObserver==`function`&&(this.#R=new window.ResizeObserver(this.#Xe)),typeof window.MutationObserver==`function`&&(this.#z=new window.MutationObserver(e=>{e.some(({type:e})=>e===`childList`)&&(this.#B=!0),this.#Xe()}),this.#et()),this.#rt()}#et(){let e=this.#z;if(!e)return;e.disconnect();let t=i();this.#tt(t),this.#nt();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{}}}#tt(e){let t=new Set(e.filter(e=>f(e)&&e!==document));for(let[e,n]of this.#U)t.has(e)||(n(),this.#U.delete(e));for(let e of t){if(this.#U.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.#He),n(`keyup`,this.#Ue),n(`keydown`,this.#Pe),n(`pointermove`,this.#Ae),n(`pointerdown`,this.#Ke),n(`pointerdown`,this.#je),n(`pointerup`,this.#Me),n(`pointercancel`,this.#Ne),n(`click`,this.#qe),n(`focusin`,this.#Be),n(`scroll`,this.#Xe);let r=e.defaultView;r?.addEventListener(`resize`,this.#Xe,{passive:!0}),r?.visualViewport?.addEventListener(`scroll`,this.#Xe,{passive:!0}),r?.visualViewport?.addEventListener(`resize`,this.#Xe,{passive:!0}),this.#U.set(e,()=>{t.forEach(({type:t,listener:n,capture:r})=>{e.removeEventListener(t,n,r)}),r?.removeEventListener(`resize`,this.#Xe),r?.visualViewport?.removeEventListener(`scroll`,this.#Xe),r?.visualViewport?.removeEventListener(`resize`,this.#Xe)})}}#nt(){let e=new Set(a(`iframe`));for(let[t,n]of this.#W)e.has(t)||(n(),this.#W.delete(t));for(let t of e){if(this.#W.has(t))continue;let e=()=>{this.#B=!0,this.#Ze()};t.addEventListener(`load`,e),this.#W.set(t,()=>{t.removeEventListener(`load`,e)})}}#rt(){let e=this.#R;if(!e)return;let t=new Set,n=new Set;for(let e of this.#i?.comments??[]){let n=S(e.anchor).element;n&&Jt(n,t)}if(this.#l){let e=S(this.#l.anchor).element;e&&Jt(e,t)}for(let r of this.#H){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.#H.clear(),n.forEach(e=>this.#H.add(e))}#it(){this.#I!==null&&(this.#L&&typeof window.cancelAnimationFrame==`function`?window.cancelAnimationFrame(this.#I):window.clearTimeout(this.#I),this.#I=null),this.#V!==null&&(window.clearTimeout(this.#V),this.#V=null),this.#R?.disconnect(),this.#R=null,this.#z?.disconnect(),this.#z=null,this.#B=!1,this.#H.clear(),this.#U.forEach(e=>e()),this.#U.clear(),this.#W.forEach(e=>e()),this.#W.clear()}#at(){let e=(this.#i?.comments??[]).some(e=>e.target.kind===`element`&&r(e.anchor.selector)&&!W(e).available);if(!this.#E||!e){this.#V!==null&&(window.clearTimeout(this.#V),this.#V=null);return}this.#V===null&&(this.#V=window.setTimeout(()=>{this.#V=null,this.#B=!0,this.#Ze()},750))}#ot(e){let t=this.#h;if(!t)return;let n=this.#g;this.#w+=1,this.#h=null,this.#g=null,this.#pt(),this.#ht(),this.#pe(),!(!this.#_&&this.#fe())&&e&&queueMicrotask(()=>{if(n===`navigator`&&this.#_){let e=this.#xe(t);e?e.focus():this.#ye();return}if(n===`navigator`){this.#be()?.focus();return}let e=[...this.#e.querySelectorAll(`.pin[data-comment-id]`)].find(({dataset:e})=>e.commentId===t);e?e.focus():this.#be()?.focus({preventScroll:!0})})}#st(){let e=this.#e.querySelector(`.rg-selection-label`);if(!e)return;if(this.#l){M(e,Nt(this.#l));return}if(!this.#h)return;let t=this.#i?.comments.find(({id:e})=>e===this.#h);t&&M(e,Pt(t))}#ct(e){let t=ve(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}U(n,E(t))}#lt(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`),U(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))))}#ut(){this.#e.querySelectorAll(`.highlight, .region`).forEach(e=>{e.style.display=`none`,e.removeAttribute(`data-context-target`),e.removeAttribute(`data-point`)})}#dt(){if(this.#a)return;if(this.#l){this.#ft(this.#l);return}let e=this.#i?.comments.find(({id:e})=>e===this.#h);if(e){this.#ft(e.target);return}this.#ut()}#ft(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=S(e.anchor);if(!n.anchored||!n.visible||!n.element)return;let r=E(n.element);t.dataset.contextTarget=`true`,U(t,r);return}if(n.dataset.contextTarget=`true`,e.kind===`viewport`){n.dataset.point=`true`,U(n,zt(e));return}U(n,It(e))}}#pt(){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.#i;if(!n)return;let r=at(n).pinNumberByCommentId;n.comments.forEach(t=>{let n=W(t);if(!n.available||n.pageX===null||n.pageY===null)return;let i=r.get(t.id)??1,a=document.createElement(`button`);a.type=`button`,a.className=`pin`,a.dataset.commentId=t.id,a.dataset.resolved=String(t.status===`resolved`),a.dataset.active=String(t.id===this.#h),a.style.display=`grid`,a.style.left=`${n.pageX-window.scrollX}px`,a.style.top=`${n.pageY-window.scrollY}px`,a.textContent=String(i),a.setAttribute(`aria-label`,`${i}번 피드백: ${t.body.slice(0,80)}`),a.setAttribute(`aria-expanded`,String(t.id===this.#h)),a.setAttribute(`aria-controls`,Ft(t.id)),a.addEventListener(`click`,()=>{if(this.#h===t.id){this.#ot(!0);return}this.#we(t.id,{origin:`pin`,navigate:!1})}),e.append(a)}),t&&queueMicrotask(()=>{[...e.querySelectorAll(`.pin[data-comment-id]`)].find(({dataset:e})=>e.commentId===t)?.focus({preventScroll:!0})})}#mt(){let e=new Map(this.#i?.comments.map(e=>[e.id,e])??[]),t=[...this.#e.querySelectorAll(`.pin[data-comment-id]`)],n=new Set(t.map(({dataset:e})=>e.commentId??``));if([...e.values()].some(e=>{if(n.has(e.id))return!1;let t=W(e);return t.available&&t.pageX!==null&&t.pageY!==null})){this.#pt();return}t.forEach(t=>{let n=e.get(t.dataset.commentId??``);if(!n)return;let r=W(n);if(!r.available||r.pageX===null||r.pageY===null){t.style.display=`none`;return}t.style.display=`grid`,t.style.left=`${r.pageX-window.scrollX}px`,t.style.top=`${r.pageY-window.scrollY}px`})}#ht(){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.#l){this.#ft(this.#l),e.append(this.#gt(this.#l)),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.#i?.comments.find(({id:e})=>e===this.#h);if(o){this.#ft(o.target),e.append(this.#yt(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.#a||this.#ut()}#gt(e){let t=Ye(`피드백`,`변경할 점`,`변경할 점 입력`);M(t,Nt(e));let n=t.querySelector(`textarea`),r=t.querySelector(`.rg-submit`);n.value=this.#u;let i=this.#p?.target===e&&this.#p.body===n.value.trim();n.disabled=i,r.disabled=i||!this.#ce();let a=()=>{n.style.height=`auto`,n.style.height=`${Math.min(n.scrollHeight,95)}px`};return n.addEventListener(`input`,()=>{this.#u=n.value,this.#f?.body!==n.value.trim()&&(this.#f=null,this.#d=``,t.querySelector(`.rg-inline-error`)?.remove()),a()}),n.addEventListener(`keydown`,t=>{if(t.key===`Escape`){if(t.preventDefault(),this.#p?.target===e){this.#De(`피드백을 저장하는 중입니다.`);return}this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#ht(),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.#_t(t,e)),this.#d&&jt(t,this.#d),t}async#_t(e,t){if(!this.#t||this.#p||!this.#ce())return;let n=this.#E?.signal;if(!n)return;let r=e.querySelector(`textarea`),i=e.querySelector(`.rg-submit`),a=r?.value.trim()??``;if(!a||!r||!i)return;i.disabled=!0,r.disabled=!0;let o={target:t,body:a,comment:null};this.#p=o;let s=this.#f?.target===t&&this.#f.body===a?this.#f.comment:null;if(!s){let e=t;if(this.#t.sourceContextResolver)try{e=await je(t,this.#t.sourceContextResolver,{signal:n})}catch{}if(n.aborted||this.#p!==o)return;let r=this.#t.now?.()??Date.now();s={id:this.#t.id?.()??crypto.randomUUID(),pageId:this.#t.pageId,authorId:this.#t.session.reviewerId,authorName:this.#t.session.displayName,body:a,anchor:e.anchor,target:e,status:`open`,createdAt:r,updatedAt:r}}o.comment=s;try{await this.#t.repository.mutate(this.#t.pageId,{type:`comment.upsert`,comment:s}),await this.#vt(s.id,n)}catch{if(n.aborted||this.#p!==o)return;this.#p=null,this.#f={target:t,body:a,comment:s},this.#d=`저장하지 못했습니다. 다시 시도하세요.`,!this.#_&&this.#l===t&&(this.#ht(),queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`)?.focus({preventScroll:!0})));return}n.aborted||this.#p!==o||(this.#p=null,this.#f=null,this.#d=``,this.#m?.target===t&&(this.#m=null),this.#l===t&&(this.#l=null,this.#u=``,this.#ht(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}))),this.#De(`피드백을 저장했습니다.`))}async#vt(e,t){this.#i?.comments.some(({id:t})=>t===e)||await new Promise((n,r)=>{let i=()=>{clearTimeout(o),t.removeEventListener(`abort`,a),this.#Z.delete(e)},a=()=>{i(),n()},o=setTimeout(()=>{i(),r(Error(`Comment was not confirmed by the review service`))},1e4);this.#Z.set(e,()=>{i(),n()}),t.addEventListener(`abort`,a,{once:!0})})}#yt(e){let t=this.#i?at(this.#i).pinNumberByCommentId.get(e.id)??1:1,n=!W(e).available,r=Ye(`피드백 ${t}${e.status===`resolved`?` · 완료`:``}${n?` · 위치 없음`:``}`,`답글`,`답글 입력`);r.classList.add(`rg-thread-label`),r.id=Ft(e.id),r.tabIndex=-1,r.dataset.commentId=e.id,r.setAttribute(`aria-label`,`피드백 대화`),M(r,Pt(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(Xe()),i.append(a);let o=H(`rg-thread-messages`);o.append(At(e.authorName,e.body,e.createdAt)),(this.#i?.replies.filter(({commentId:t})=>t===e.id)??[]).forEach(e=>o.append(At(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.#G.get(e.id)??``;let l=this.#K.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.#G.set(e.id,s.value),this.#J.get(e.id)?.body!==s.value.trim()&&(this.#J.delete(e.id),this.#q.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.#ot(!0)),c.addEventListener(`click`,()=>void this.#bt(r,e));let d=this.#q.get(e.id);return d&&jt(r,d),queueMicrotask(u),r}async#bt(e,t){if(!this.#t||!this.#ce())return;let n=this.#E?.signal;if(!n||this.#K.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.#J.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.#K.set(t.id,{request:l,body:a,reply:c}),this.#xt(t.id,!0);try{await this.#t.repository.mutate(this.#t.pageId,{type:`reply.upsert`,reply:c})}catch{if(n.aborted||this.#K.get(t.id)?.request!==l)return;this.#K.delete(t.id),this.#J.set(t.id,{body:a,reply:c}),this.#q.set(t.id,`답글을 저장하지 못했습니다. 다시 시도하세요.`),i.disabled=!1,r.disabled=!1,this.#h===t.id&&(this.#ht(),queueMicrotask(()=>this.#St(t.id)?.querySelector(`textarea`)?.focus({preventScroll:!0})));return}if(n.aborted||this.#K.get(t.id)?.request!==l)return;this.#K.delete(t.id),this.#J.delete(t.id),this.#q.delete(t.id),this.#G.delete(t.id);let u=this.#St(t.id)?.querySelector(`textarea`);u&&(u.value=``,u.style.height=`auto`),this.#xt(t.id,!1),this.#De(`답글을 저장했습니다.`)}#xt(e,t){let n=this.#St(e),r=n?.querySelector(`textarea`),i=n?.querySelector(`.rg-submit`);r&&(r.disabled=t),i&&(i.disabled=t)}#St(e){return[...this.#e.querySelectorAll(`.rg-thread-label`)].find(({dataset:t})=>t.commentId===e)}#Ct(e){return e.composedPath().includes(this)}};function Dt(e){_e(e.styleNonce),customElements.get(`agency-review-widget`)||customElements.define(St,Et);let t=document.createElement(St);return t.configure(e),document.body.append(t),t}function Ot(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 H(e){let t=document.createElement(`div`);return t.className=e,t}function U(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 kt(e,t){return Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)}function At(e,t,n){let r=document.createElement(`article`);r.className=`rg-message`;let i=H(`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 jt(e,t){let n=e.querySelector(`.rg-inline-error`);if(!n){n=H(`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 Mt(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 Nt(e){let t=S(e.anchor),n=t.x-window.scrollX;if(t.y-window.scrollY,e.kind===`element`&&t.element){let e=E(t.element);return{x:e.left,y:e.top,width:e.width,height:e.height,anchorX:n}}if(e.kind===`viewport`){let t=zt(e);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}let r=It(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 Pt(e){if(e.target.kind===`element`){if(W(e).available)return Nt(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=zt(e.target);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}let t=It(e.target);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}function W(e){if(e.target.kind===`element`){let t=S(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=Lt(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=Vt(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 Ft(e){return`visual-review-thread-${e.replace(/[^a-zA-Z0-9_-]/g,`-`)}`}function It(e){let t=G(e),n=Lt(e,t),r=q(e.region.width)*t.x,i=q(e.region.height)*t.y;return Ht(new DOMRect(n.pageX-window.scrollX-r/2,n.pageY-window.scrollY-i/2,r,i))}function Lt(e,t=G(e)){return Rt(e,t)??Bt(e,t)}function Rt(e,t){if(e.kind!==`region`||!e.anchor.selector)return null;let n=S(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 zt(e){let t=Vt(e);return Ut(new DOMRect(t.pageX-window.scrollX-7,t.pageY-window.scrollY-7,14,14))}function Bt(e,t=G(e)){let n=Vt(e,t);return{pageX:n.pageX+n.width/2,pageY:n.pageY+n.height/2}}function Vt(e,t=G(e)){let n=e.region,r=J(n.viewportX,n.pageX),i=J(n.viewportY,n.pageY),a=J(n.pageX,window.scrollX+r),o=J(n.pageY,window.scrollY+i),s=a-r,c=o-i;return{pageX:s+r*t.x,pageY:c+i*t.y,width:q(n.width)*t.x,height:q(n.height)*t.y}}function G(e){let t=K(window.innerWidth,1),n=K(window.innerHeight,1),r=K(e.region.viewportWidth,t),i=K(e.region.viewportHeight,n);return{x:t/r,y:n/i}}function Ht(e){let t=Wt(),n=X(J(e.left,t.left),t.left,t.right),r=X(J(e.top,t.top),t.top,t.bottom),i=X(J(e.right,n),t.left,t.right),a=X(J(e.bottom,r),t.top,t.bottom);return new DOMRect(n,r,Math.max(0,i-n),Math.max(0,a-r))}function Ut(e){let t=Wt(),n=Math.min(q(e.width),t.width),r=Math.min(q(e.height),t.height);return new DOMRect(X(J(e.left,t.left),t.left,t.right-n),X(J(e.top,t.top),t.top,t.bottom-r),n,r)}function Wt(){let e=window.visualViewport;return new DOMRect(J(e?.offsetLeft,0),J(e?.offsetTop,0),K(e?.width,window.innerWidth),K(e?.height,window.innerHeight))}function K(e,t){return Number.isFinite(e)&&(e??0)>0?e:Math.max(Number.isFinite(t)?t:1,1)}function q(e){return Number.isFinite(e)?Math.max(0,e):0}function J(e,t){return Number.isFinite(e)?e:Number.isFinite(t)?t:0}function Y(e){return Zt(e).designMode===`on`||e.composedPath().some(e=>{let t=Qt(e);return t?Gt(t):!1})}function Gt(e){let t=e.tagName.toLowerCase();return t===`input`||t===`textarea`||t===`select`||`isContentEditable`in e&&!!e.isContentEditable||Tt.has(e.getAttribute(`role`)??``)}function Kt(e){let t=e.composedPath().map(Qt).find(Boolean)??null;return!t||t===t.ownerDocument.documentElement||t===t.ownerDocument.body||D(t)?null:t}function qt(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 Jt(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 Yt(e){let t=Zt(e).defaultView?.getSelection();return!!(t&&!t.isCollapsed&&t.toString().length>0)}function Xt(e){let t=e.clientX,n=e.clientY,r=Zt(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 Zt(e){for(let t of e.composedPath()){if($t(t))return t;let e=Qt(t);if(e)return e.ownerDocument}return document}function Qt(e){return e&&`nodeType`in e&&e.nodeType===1?e:null}function $t(e){return`nodeType`in e&&e.nodeType===9}function en(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 tn(e){return e===`all`||e===`open`||e===`resolved`}function X(e,t,n){return Math.min(n,Math.max(t,e))}function nn(e){return e.replace(/\/+$/,``)||`/`}function rn(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 Z(){return new Promise(e=>{if(typeof window.requestAnimationFrame==`function`){window.requestAnimationFrame(()=>e());return}queueMicrotask(e)})}function Q(e,t){return{value:e.style.getPropertyValue(t),priority:e.style.getPropertyPriority(t)}}function $(e,t,n){n.value?e.style.setProperty(t,n.value,n.priority):e.style.removeProperty(t)}function an(){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`}export{Ct as REVIEW_REAUTHENTICATION_REQUIRED_EVENT,St as REVIEW_WIDGET_TAG,Et as ReviewWidgetElement,Ot as isStagingLocation,Dt as mountReviewWidget};
921
+ `;let n=H(`highlight`);n.dataset.slot=`highlight`;let r=H(`region`);r.dataset.slot=`region`;let i=H(`pins`);i.dataset.slot=`pins`;let a=H(`panels`);a.dataset.slot=`panels`;let o=H(`navigator-slot`);o.dataset.slot=`navigator`,o.id=V,o.addEventListener(`click`,this.#Se),o.addEventListener(`keydown`,this.#Ce);let s=H(`rg-visually-hidden`);s.dataset.slot=`announcer`,s.setAttribute(`aria-live`,`polite`),s.setAttribute(`aria-atomic`,`true`);let c=Ke({developerGrab:this.#t?.developerTools?.reactGrab===!0});c.querySelector(`.rg-toolbar-actions`)?.append(ut(0,{controlsId:V,presentation:this.#ge()})),c.querySelector(`.rg-feedback-tool`)?.addEventListener(`click`,()=>{if(!this.#ce()){this.#_||this.#ue(!0),this.#De(this.#le());return}if(this.#_&&this.#ue(!1,{restoreFocus:!1,restoreComposer:!0}))return;if(this.#p){this.#De(`피드백을 저장하는 중입니다.`);return}if(this.#a&&this.#o===`react-grab`&&this.#m){this.#oe(!1);return}let e=this.#a&&this.#o===`feedback`;this.#oe(!e,`feedback`)}),c.querySelector(`.rg-developer-grab-tool`)?.addEventListener(`click`,()=>{if(this.#P){this.#De(`코드 컨텍스트를 복사하는 중입니다.`);return}if(this.#p){this.#De(`피드백을 저장하는 중입니다.`);return}this.#_&&this.#ue(!1,{restoreFocus:!1});let e=this.#a&&this.#o===`react-grab`;e||this.#de(),this.#oe(!e,`react-grab`)}),c.querySelector(`.rg-feedback-list-tool`)?.addEventListener(`click`,()=>{this.#ue(!this.#_)}),c.querySelector(`.rg-collapse`)?.addEventListener(`click`,()=>{let e=c.dataset.collapsed===`true`;!e&&this.#a&&this.#oe(!1),!e&&this.#_&&this.#ue(!1,{restoreFocus:!1});let t=!e;c.dataset.collapsed=String(t);let n=c.querySelector(`.rg-toolbar-actions-shell`);n&&(n.inert=t,n.setAttribute(`aria-hidden`,String(t))),c.querySelector(`.rg-collapse`)?.setAttribute(`aria-expanded`,String(e)),c.querySelector(`.rg-collapse`)?.setAttribute(`aria-label`,e?`Visual Review 접기`:`Visual Review 펼치기`)}),this.#e.append(t,n,r,i,a,o,s,c)}#ie(){let e=this.#t?.collaboration,t=e?.repository;if(!this.#t||!t||!e.cursors&&!e.chat)return;let n=e.roomId??e.scopeId;this.#r=ze({root:this.#e,pageId:this.#t.pageId,pathname:tn(window.location.pathname),roomId:n,session:this.#t.session,repository:t,cursors:e.cursors,chat:e.chat,now:this.#t.now,id:this.#t.id,canOpenChat:()=>!this.#a&&!this.#_&&!this.#l&&!this.#h,onFailure:e=>{e.type===`access-lost`?(this.#r?.stop(),this.#r=null,this.#$(e)):this.#De(`실시간 협업 연결이 불안정합니다. 다시 연결하는 중입니다.`)}}),this.#r.start()}#ae(){this.#pt(),this.#ht(),this.#pe(),this.#he(),this.#se(),this.#rt(),this.#at()}#oe(e,t=`feedback`){let n=this.#o;if(e&&(this.#w+=1),e&&t===`feedback`&&!this.#ce()){this.#_||this.#ue(!0),this.#De(this.#le());return}if(e&&t===`feedback`&&this.#p){this.#De(`피드백을 저장하는 중입니다.`);return}if(e&&t===`feedback`&&this.#m){this.#h?this.#ot(!1):this.#fe(),this.#De(`작성 중인 피드백을 복원했습니다.`);return}if(e&&this.#a){this.#o=t,this.#s=null,this.#c=null,this.#ut(),this.#se();return}this.#a=e,this.#o=e?t:null,this.#se(),e?(this.#h=null,this.#g=null,this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#ut(),document.addEventListener(`pointermove`,this.#Ae,!0),document.addEventListener(`pointerdown`,this.#je,!0),document.addEventListener(`pointerup`,this.#Me,!0),document.addEventListener(`pointercancel`,this.#Ne,!0),document.addEventListener(`keydown`,this.#Pe,!0),this.#k={value:document.body.style.getPropertyValue(`cursor`),priority:document.body.style.getPropertyPriority(`cursor`)},document.body.style.setProperty(`cursor`,`crosshair`),this.#D=ve(this.#t?.styleNonce),queueMicrotask(()=>this.#Ve())):(document.removeEventListener(`pointermove`,this.#Ae,!0),document.removeEventListener(`pointerdown`,this.#je,!0),document.removeEventListener(`pointerup`,this.#Me,!0),document.removeEventListener(`pointercancel`,this.#Ne,!0),document.removeEventListener(`keydown`,this.#Pe,!0),this.#k&&=($(document.body,`cursor`,this.#k),null),this.#D?.(),this.#D=null,this.#s=null,this.#c=null,this.#ut()),this.#ht(),!e&&n===`react-grab`&&this.#fe()}#se(){let e=this.#e.querySelector(`.rg-toolbar`),t=this.#e.querySelector(`.rg-feedback-tool`),n=this.#e.querySelector(`.rg-developer-grab-tool`),r=this.#a&&this.#o===`feedback`,i=this.#a&&this.#o===`react-grab`;e&&(e.dataset.selecting=String(this.#a)),t&&(t.setAttribute(`aria-pressed`,String(r)),t.setAttribute(`aria-label`,r?`선택 취소`:`피드백 위치 선택`),t.setAttribute(`aria-disabled`,String(!this.#ce()))),n&&(n.setAttribute(`aria-pressed`,String(i)),n.setAttribute(`aria-label`,i?`코드 선택 취소`:`React Grab 코드 선택`),n.setAttribute(`aria-disabled`,String(this.#P)))}#ce(){return!this.#S&&this.#y===`ready`&&this.#i!==null}#le(){return this.#S?`다시 인증하세요.`:this.#y===`loading`?`불러오는 중입니다.`:`다시 시도하세요.`}#ue(e,t={}){let n=t.restoreFocus??!0,r=t.restoreComposer??!0;if(e===this.#_)return!1;if(e)return this.#w+=1,this.#a&&this.#oe(!1),this.#de(),this.#_=!0,this.#ht(),this.#pe(),this.#he(),queueMicrotask(()=>this.#ye()),!1;(t.cancelNavigation??!0)&&(this.#w+=1),this.#_=!1,this.#O?.(),this.#O=null,this.#pe(),this.#he();let i=r&&this.#fe();return n&&!i&&queueMicrotask(()=>this.#be()?.focus()),i}#de(){if(!this.#l)return!1;let e=this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`);return this.#m={target:this.#l,body:e?.value??this.#u},this.#l=null,this.#u=``,!0}#fe(){if(!this.#m||this.#_||this.#h)return!1;let e=this.#m;return this.#m=null,this.#l=e.target,this.#u=e.body,this.#ht(),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}#pe(){let e=this.#e.querySelector(`[data-slot="navigator"]`);if(!e)return;let t=e.querySelector(`.rg-feedback-navigator`),n=t?.querySelector(`.rg-feedback-navigator-content`),r=t?.dataset.presentation,i=t?`refresh`:`enter`,a=n?.scrollTop??0,o=this.#e.activeElement instanceof HTMLElement?this.#e.activeElement:null,s=o?.closest(`.rg-feedback-row[data-comment-id]`)?.dataset.commentId,c=o?.closest(`[data-feedback-filter]`)?.dataset.feedbackFilter,l=!!o?.closest(`.rg-feedback-navigator-close`),u=!!o?.closest(`.rg-feedback-navigator-retry`);if(e.replaceChildren(),!this.#_)return;let d=this.#ge(),f=H(`rg-feedback-navigator-scrim`);f.dataset.motion=i,f.dataset.feedbackNavigatorAction=`close`,f.setAttribute(`aria-hidden`,`true`);let p=dt(this.#me(),{id:Ct,presentation:d});p.dataset.motion=i,e.append(f,p),this.#ve(d),queueMicrotask(()=>this.#_e()),queueMicrotask(()=>{if(!this.#_)return;let t=e.querySelector(`.rg-feedback-navigator-content`);if(t&&(t.scrollTop=a),s){let e=this.#xe(s);e?e.focus({preventScroll:!0}):this.#ye()}else if(c&&en(c))e.querySelector(`[data-feedback-filter="${c}"]`)?.focus({preventScroll:!0});else if(l)e.querySelector(`.rg-feedback-navigator-close`)?.focus({preventScroll:!0});else if(u){let t=e.querySelector(`.rg-feedback-navigator-retry`);t?t.focus({preventScroll:!0}):this.#ye()}else d===`sheet`&&r!==`sheet`&&this.#ye()})}#me(){let e=it(this.#i??{pageId:this.#t?.pageId??``,comments:[],replies:[]},this.#v),t=this.#t?.now?.()??Date.now(),n=this.#T&&this.#y===`ready`?`reconnecting`:this.#y;return{filter:this.#v,counts:e.counts,rows:e.rows.map(({comment:e,pinNumber:n,replyCount:r,lastActivityAt:i})=>({id:e.id,pinNumber:n,targetLabel:jt(e.target),authorName:e.authorName,body:e.body,timeLabel:nn(i,t),replyCount:r,status:e.status,locationAvailable:W(e).available})),activeCommentId:this.#h,loadState:n,errorMessage:this.#b,errorRecovery:this.#x}}#he(){let e=this.#be();if(!e)return;let t=this.#i?.comments.length??0;e.setAttribute(`aria-label`,`피드백 목록, 총 ${t}개`),e.setAttribute(`aria-expanded`,String(this.#_)),e.setAttribute(`aria-controls`,V),this.#ge()===`sheet`?e.setAttribute(`aria-haspopup`,`dialog`):e.removeAttribute(`aria-haspopup`),e.removeAttribute(`aria-pressed`)}#ge(){return window.matchMedia?.(`(max-width: 640px)`).matches||window.innerWidth<=640?`sheet`:`tray`}#_e(){let e=this.#e.querySelector(`.rg-feedback-navigator`),t=this.#be(),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||a<=0)return;let o=r.left+r.width/2,s=X(o-a/2,8,Math.max(8,window.innerWidth-a-8));e.style.left=`${s}px`,e.style.bottom=`${Math.max(8,window.innerHeight-i.top+8)}px`,e.style.setProperty(`--rg-navigator-origin-x`,`${X(o-s,16,a-16)}px`)}#ve(e){if(e!==`sheet`){this.#O?.(),this.#O=null;return}if(this.#O)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?Q(r,`visibility`):null;r&&r.style.setProperty(`visibility`,`hidden`);let a=Q(document.body,`overflow`),o=Q(document.documentElement,`overflow`),s=e=>{let t=this.#e.querySelector(`.rg-feedback-navigator`);!t||e.composedPath().includes(t)||queueMicrotask(()=>this.#ye())};document.addEventListener(`focusin`,s,!0),document.body.style.setProperty(`overflow`,`hidden`),document.documentElement.style.setProperty(`overflow`,`hidden`),this.#O=()=>{n.forEach(({element:e,inert:t})=>{e.inert=t}),r&&i&&$(r,`visibility`,i),document.removeEventListener(`focusin`,s,!0),$(document.body,`overflow`,a),$(document.documentElement,`overflow`,o)}}#ye(){if(!this.#_)return;let e=this.#h?this.#xe(this.#h):null,t=this.#e.querySelector(`.rg-feedback-row`),n=this.#e.querySelector(`.rg-feedback-navigator-retry`),r=this.#e.querySelector(`.rg-feedback-navigator-close`);(e??t??n??r)?.focus({preventScroll:!0})}#be(){return this.#e.querySelector(`.rg-feedback-list-tool`)}#xe(e){return[...this.#e.querySelectorAll(`.rg-feedback-row[data-comment-id]`)].find(({dataset:t})=>t.commentId===e)}#Se=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.#ue(!1);return}if(n===`retry`){this.#X();return}if(n===`filter`){let e=t.dataset.feedbackFilter;if(!en(e)||e===this.#v)return;this.#v=e,this.#pe();return}n===`open-comment`&&t.dataset.commentId&&this.#we(t.dataset.commentId,{origin:`navigator`,navigate:!0})}};#Ce=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.#ge()!==`sheet`)return;let r=this.#e.querySelector(`.rg-feedback-navigator`),i=r?[...r.querySelectorAll(`button:not(:disabled), [tabindex]:not([tabindex="-1"])`)]:[];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#we(e,t){let n=this.#i?.comments.find(({id:t})=>t===e);if(!n)return;this.#a&&this.#oe(!1);let r=++this.#w;if(t.origin===`navigator`&&this.#_&&this.#ge()===`sheet`&&(this.#ue(!1,{restoreFocus:!1,restoreComposer:!1,cancelNavigation:!1}),await Z()),!(r!==this.#w||!this.#E)){if(!this.#i?.comments.some(({id:t})=>t===e)){this.#Te();return}if(t.navigate&&await this.#Ee(n),r===this.#w){if(!this.#i?.comments.some(({id:t})=>t===e)){this.#Te();return}this.#l=null,this.#h=e,this.#g=t.origin,this.#ae(),W(n).available||this.#De(`현재 화면에서 피드백 위치를 찾을 수 없습니다.`),queueMicrotask(()=>this.#e.querySelector(`.rg-thread-label`)?.focus({preventScroll:!0}))}}}#Te(){!this.#_&&this.#fe()||queueMicrotask(()=>{this.#_?this.#ye():this.#be()?.focus({preventScroll:!0})})}async#Ee(e){let t=W(e);if(!t.available||t.pageY===null)return;let n=window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`;if(e.target.kind!==`viewport`){let t=S(e.anchor).element;if(t&&typeof t.scrollIntoView==`function`)try{t.scrollIntoView({block:`center`,inline:`center`,behavior:n}),await Z(),await Z();return}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{}await Z(),await Z()}#De(e){let t=this.#e.querySelector(`[data-slot="announcer"]`);t&&(t.textContent=``,queueMicrotask(()=>{t.textContent=e}))}#Oe(e,t=`neutral`){let n=this.#e.querySelector(`.rg-developer-status`);n&&(this.#ke(),n.textContent=e,n.dataset.tone=t,n.dataset.visible=`true`,this.#j=window.setTimeout(()=>{this.#j=null,n.isConnected&&(n.dataset.visible=`false`)},1800))}#ke(){this.#j!==null&&(window.clearTimeout(this.#j),this.#j=null)}#Ae=e=>{if(!this.#a||this.#Ct(e)||this.#s&&e.pointerId!==this.#c)return;let t=Xt(e);if(this.#s&&Ot(this.#s,t)>=6){this.#lt(this.#s,t);return}this.#ct(t)};#je=e=>{!this.#a||this.#Ct(e)||e.button!==0||this.#s||(e.preventDefault(),e.stopImmediatePropagation(),this.#s=Xt(e),this.#c=e.pointerId)};#Me=e=>{if(!this.#a||!this.#s||e.pointerId!==this.#c)return;if(this.#Ct(e)){this.#s=null,this.#c=null,this.#ut();return}e.preventDefault(),e.stopImmediatePropagation();let t=this.#s,n=this.#o,r=Xt(e),i=Ot(t,r)>=6;n===`feedback`&&(this.#l=i?Te(t,r):we(r));let a=n===`react-grab`?this.#Fe(t,r,i):[];this.#Je(),this.#oe(!1),n===`react-grab`?this.#Ie(a):queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label textarea`)?.focus())};#Ne=e=>{!this.#a||!this.#s||e.pointerId!==this.#c||(e.preventDefault(),e.stopImmediatePropagation(),this.#s=null,this.#c=null,this.#ut())};#Pe=e=>{if(!this.#a)return;if(e.key===`Escape`){e.preventDefault(),e.stopImmediatePropagation(),this.#oe(!1);return}if(e.key!==`Enter`||e.isComposing||this.#Ct(e)||Wt(e))return;let t=Kt(e);if(!t)return;let n=E(t);if(n.width<=0||n.height<=0)return;e.preventDefault(),e.stopImmediatePropagation();let r=this.#o;r===`feedback`&&(this.#l=Ce(t,{clientX:n.left+n.width/2,clientY:n.top+n.height/2})),this.#oe(!1),r===`react-grab`?this.#Ie([t]):queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label textarea`)?.focus())};#Fe(e,t,n){if(!n){let e=_e(t.clientX,t.clientY);return e?[e]:[]}return Ee(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#Ie(e){if(e.length===0){this.#De(`선택할 요소를 찾지 못했습니다.`),this.#Oe(`선택할 요소가 없습니다`,`error`),this.#ze();return}if(!this.#E||this.#P)return;let t=this.#E.signal;this.#P=!0,this.#se(),this.#De(`코드 컨텍스트를 복사하는 중입니다.`),this.#Oe(`코드 컨텍스트 복사 중…`);try{let n=this.#Le(),r=await n;if(t.aborted||n!==this.#F)return;let i=await r.copyElement(e.length===1?e[0]:e);if(t.aborted)return;this.#De(i?`코드 컨텍스트를 복사했습니다.`:`코드 컨텍스트를 복사하지 못했습니다. 다시 시도하세요.`),this.#Oe(i?`코드 컨텍스트 복사됨`:`복사 실패 · 다시 시도`,i?`neutral`:`error`)}catch{t.aborted||(this.#De(`코드 컨텍스트를 복사하지 못했습니다. 다시 시도하세요.`),this.#Oe(`복사 실패 · 다시 시도`,`error`))}finally{t.aborted||(this.#P=!1,this.#se(),this.#ze())}}#Le(){if(this.#F)return this.#F;let e=(this.#t?.developerTools?.loadReactGrab??(()=>tt(this.#t?.styleNonce)))();return this.#F=e,e.catch(()=>{this.#F===e&&(this.#F=null)}),e}#Re(){let e=this.#F;this.#F=null,e&&e.then(e=>e.dispose()).catch(()=>void 0)}#ze(){this.#l||queueMicrotask(()=>this.#e.querySelector(`.rg-developer-grab-tool`)?.focus({preventScroll:!0}))}#Be=e=>{if(!this.#a)return;if(this.#Ct(e)||Wt(e)){this.#ut();return}let t=Kt(e);if(!t){this.#ut();return}let n=E(t);if(n.width<=0||n.height<=0){this.#ut();return}let r=this.#e.querySelector(`[data-slot="region"]`);r&&(r.style.display=`none`);let i=this.#e.querySelector(`[data-slot="highlight"]`);i&&U(i,n)};#Ve(){if(!this.#a)return;let e=qt(document);if(!e||D(e)||Gt(e))return;let t=E(e);if(t.width<=0||t.height<=0)return;let n=this.#e.querySelector(`[data-slot="highlight"]`);n&&U(n,t)}#He=e=>{if(e.key===`Escape`&&!e.isComposing){if(this.#_){e.preventDefault(),e.stopImmediatePropagation(),this.#ue(!1);return}if(this.#h){e.preventDefault(),e.stopImmediatePropagation(),this.#ot(!0);return}if(this.#l){if(e.preventDefault(),e.stopImmediatePropagation(),this.#p?.target===this.#l){this.#De(`피드백을 저장하는 중입니다.`);return}this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#ht(),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?.reactGrab!==!0||e.repeat||this.#a||this.#l||this.#h||this.#_||this.#P||this.#A!==null||Wt(e)||Yt(e)||(this.#A=window.setTimeout(()=>{this.#A=null,!(this.#a||this.#l||this.#h||this.#_||this.#p||this.#P)&&this.#Ge()},100))};#Ue=e=>{let t=e.code===`KeyC`||e.key.toLowerCase()===`c`,n=e.key===`Meta`||e.key===`Control`;(t||n)&&this.#We()};#We(){this.#A!==null&&(window.clearTimeout(this.#A),this.#A=null)}#Ge(){if(this.#t?.developerTools?.reactGrab!==!0)return;let e=this.#e.querySelector(`.rg-toolbar`);if(e?.dataset.collapsed===`true`){e.dataset.collapsed=`false`;let t=e.querySelector(`.rg-toolbar-actions-shell`);t&&(t.inert=!1,t.setAttribute(`aria-hidden`,`false`));let n=e.querySelector(`.rg-collapse`);n?.setAttribute(`aria-expanded`,`true`),n?.setAttribute(`aria-label`,`Visual Review 접기`)}this.#oe(!0,`react-grab`)}#Ke=e=>{!this.#h||this.#Ct(e)||this.#ot(!1)};#qe=e=>{!this.#N||this.#Ct(e)||(e.preventDefault(),e.stopImmediatePropagation(),this.#Ye())};#Je(){this.#Ye(),this.#N=!0,this.#M=window.setTimeout(()=>{this.#M=null,this.#N=!1},0)}#Ye(){this.#M!==null&&(window.clearTimeout(this.#M),this.#M=null),this.#N=!1}#Xe=()=>{this.#Ze()};#Ze(){if(!(!this.#E||this.#I!==null)){if(typeof window.requestAnimationFrame==`function`){this.#L=!0,this.#I=-1;let e=window.requestAnimationFrame(()=>{this.#I=null,this.#Qe()});this.#I!==null&&(this.#I=e);return}this.#L=!1,this.#I=window.setTimeout(()=>{this.#I=null,this.#Qe()},16)}}#Qe(){if(!this.#E)return;this.#B&&(this.#B=!1,this.#et()),this.#rt(),this.#mt(),this.#dt(),this.#st();let e=this.#e.querySelector(`.rg-feedback-navigator`);e&&e.dataset.presentation!==this.#ge()?(this.#pe(),this.#he()):this.#_e(),this.#at()}#$e(){typeof window.ResizeObserver==`function`&&(this.#R=new window.ResizeObserver(this.#Xe)),typeof window.MutationObserver==`function`&&(this.#z=new window.MutationObserver(e=>{e.some(({type:e})=>e===`childList`)&&(this.#B=!0),this.#Xe()}),this.#et()),this.#rt()}#et(){let e=this.#z;if(!e)return;e.disconnect();let t=i();this.#tt(t),this.#nt();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{}}}#tt(e){let t=new Set(e.filter(e=>f(e)&&e!==document));for(let[e,n]of this.#U)t.has(e)||(n(),this.#U.delete(e));for(let e of t){if(this.#U.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.#He),n(`keyup`,this.#Ue),n(`keydown`,this.#Pe),n(`pointermove`,this.#Ae),n(`pointerdown`,this.#Ke),n(`pointerdown`,this.#je),n(`pointerup`,this.#Me),n(`pointercancel`,this.#Ne),n(`click`,this.#qe),n(`focusin`,this.#Be),n(`scroll`,this.#Xe);let r=e.defaultView;r?.addEventListener(`resize`,this.#Xe,{passive:!0}),r?.visualViewport?.addEventListener(`scroll`,this.#Xe,{passive:!0}),r?.visualViewport?.addEventListener(`resize`,this.#Xe,{passive:!0}),this.#U.set(e,()=>{t.forEach(({type:t,listener:n,capture:r})=>{e.removeEventListener(t,n,r)}),r?.removeEventListener(`resize`,this.#Xe),r?.visualViewport?.removeEventListener(`scroll`,this.#Xe),r?.visualViewport?.removeEventListener(`resize`,this.#Xe)})}}#nt(){let e=new Set(a(`iframe`));for(let[t,n]of this.#W)e.has(t)||(n(),this.#W.delete(t));for(let t of e){if(this.#W.has(t))continue;let e=()=>{this.#B=!0,this.#Ze()};t.addEventListener(`load`,e),this.#W.set(t,()=>{t.removeEventListener(`load`,e)})}}#rt(){let e=this.#R;if(!e)return;let t=new Set,n=new Set;for(let e of this.#i?.comments??[]){let n=S(e.anchor).element;n&&Jt(n,t)}if(this.#l){let e=S(this.#l.anchor).element;e&&Jt(e,t)}for(let r of this.#H){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.#H.clear(),n.forEach(e=>this.#H.add(e))}#it(){this.#I!==null&&(this.#L&&typeof window.cancelAnimationFrame==`function`?window.cancelAnimationFrame(this.#I):window.clearTimeout(this.#I),this.#I=null),this.#V!==null&&(window.clearTimeout(this.#V),this.#V=null),this.#R?.disconnect(),this.#R=null,this.#z?.disconnect(),this.#z=null,this.#B=!1,this.#H.clear(),this.#U.forEach(e=>e()),this.#U.clear(),this.#W.forEach(e=>e()),this.#W.clear()}#at(){let e=(this.#i?.comments??[]).some(e=>e.target.kind===`element`&&r(e.anchor.selector)&&!W(e).available);if(!this.#E||!e){this.#V!==null&&(window.clearTimeout(this.#V),this.#V=null);return}this.#V===null&&(this.#V=window.setTimeout(()=>{this.#V=null,this.#B=!0,this.#Ze()},750))}#ot(e){let t=this.#h;if(!t)return;let n=this.#g;this.#w+=1,this.#h=null,this.#g=null,this.#pt(),this.#ht(),this.#pe(),!(!this.#_&&this.#fe())&&e&&queueMicrotask(()=>{if(n===`navigator`&&this.#_){let e=this.#xe(t);e?e.focus():this.#ye();return}if(n===`navigator`){this.#be()?.focus();return}let e=[...this.#e.querySelectorAll(`.pin[data-comment-id]`)].find(({dataset:e})=>e.commentId===t);e?e.focus():this.#be()?.focus({preventScroll:!0})})}#st(){let e=this.#e.querySelector(`.rg-selection-label`);if(!e)return;if(this.#l){M(e,Mt(this.#l));return}if(!this.#h)return;let t=this.#i?.comments.find(({id:e})=>e===this.#h);t&&M(e,Nt(t))}#ct(e){let t=_e(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}U(n,E(t))}#lt(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`),U(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))))}#ut(){this.#e.querySelectorAll(`.highlight, .region`).forEach(e=>{e.style.display=`none`,e.removeAttribute(`data-context-target`),e.removeAttribute(`data-point`)})}#dt(){if(this.#a)return;if(this.#l){this.#ft(this.#l);return}let e=this.#i?.comments.find(({id:e})=>e===this.#h);if(e){this.#ft(e.target);return}this.#ut()}#ft(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=S(e.anchor);if(!n.anchored||!n.visible||!n.element)return;let r=E(n.element);t.dataset.contextTarget=`true`,U(t,r);return}if(n.dataset.contextTarget=`true`,e.kind===`viewport`){n.dataset.point=`true`,U(n,Rt(e));return}U(n,Ft(e))}}#pt(){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.#i;if(!n)return;let r=it(n).pinNumberByCommentId;n.comments.forEach(t=>{let n=W(t);if(!n.available||n.pageX===null||n.pageY===null)return;let i=r.get(t.id)??1,a=document.createElement(`button`);a.type=`button`,a.className=`pin`,a.dataset.commentId=t.id,a.dataset.resolved=String(t.status===`resolved`),a.dataset.active=String(t.id===this.#h),a.style.display=`grid`,a.style.left=`${n.pageX-window.scrollX}px`,a.style.top=`${n.pageY-window.scrollY}px`,a.textContent=String(i),a.setAttribute(`aria-label`,`${i}번 피드백: ${t.body.slice(0,80)}`),a.setAttribute(`aria-expanded`,String(t.id===this.#h)),a.setAttribute(`aria-controls`,Pt(t.id)),a.addEventListener(`click`,()=>{if(this.#h===t.id){this.#ot(!0);return}this.#we(t.id,{origin:`pin`,navigate:!1})}),e.append(a)}),t&&queueMicrotask(()=>{[...e.querySelectorAll(`.pin[data-comment-id]`)].find(({dataset:e})=>e.commentId===t)?.focus({preventScroll:!0})})}#mt(){let e=new Map(this.#i?.comments.map(e=>[e.id,e])??[]),t=[...this.#e.querySelectorAll(`.pin[data-comment-id]`)],n=new Set(t.map(({dataset:e})=>e.commentId??``));if([...e.values()].some(e=>{if(n.has(e.id))return!1;let t=W(e);return t.available&&t.pageX!==null&&t.pageY!==null})){this.#pt();return}t.forEach(t=>{let n=e.get(t.dataset.commentId??``);if(!n)return;let r=W(n);if(!r.available||r.pageX===null||r.pageY===null){t.style.display=`none`;return}t.style.display=`grid`,t.style.left=`${r.pageX-window.scrollX}px`,t.style.top=`${r.pageY-window.scrollY}px`})}#ht(){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.#l){this.#ft(this.#l),e.append(this.#gt(this.#l)),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.#i?.comments.find(({id:e})=>e===this.#h);if(o){this.#ft(o.target),e.append(this.#yt(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.#a||this.#ut()}#gt(e){let t=Je(`피드백`,`변경할 점`,`변경할 점 입력`);M(t,Mt(e));let n=t.querySelector(`textarea`),r=t.querySelector(`.rg-submit`);n.value=this.#u;let i=this.#p?.target===e&&this.#p.body===n.value.trim();n.disabled=i,r.disabled=i||!this.#ce();let a=()=>{n.style.height=`auto`,n.style.height=`${Math.min(n.scrollHeight,95)}px`};return n.addEventListener(`input`,()=>{this.#u=n.value,this.#f?.body!==n.value.trim()&&(this.#f=null,this.#d=``,t.querySelector(`.rg-inline-error`)?.remove()),a()}),n.addEventListener(`keydown`,t=>{if(t.key===`Escape`){if(t.preventDefault(),this.#p?.target===e){this.#De(`피드백을 저장하는 중입니다.`);return}this.#l=null,this.#u=``,this.#d=``,this.#f=null,this.#ht(),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.#_t(t,e)),this.#d&&At(t,this.#d),t}async#_t(e,t){if(!this.#t||this.#p||!this.#ce())return;let n=this.#E?.signal;if(!n)return;let r=e.querySelector(`textarea`),i=e.querySelector(`.rg-submit`),a=r?.value.trim()??``;if(!a||!r||!i)return;i.disabled=!0,r.disabled=!0;let o={target:t,body:a,comment:null};this.#p=o;let s=this.#f?.target===t&&this.#f.body===a?this.#f.comment:null;if(!s){let e=t;if(this.#t.sourceContextResolver)try{e=await Ae(t,this.#t.sourceContextResolver,{signal:n})}catch{}if(n.aborted||this.#p!==o)return;let r=this.#t.now?.()??Date.now();s={id:this.#t.id?.()??crypto.randomUUID(),pageId:this.#t.pageId,authorId:this.#t.session.reviewerId,authorName:this.#t.session.displayName,body:a,anchor:e.anchor,target:e,status:`open`,createdAt:r,updatedAt:r}}o.comment=s;try{await this.#t.repository.mutate(this.#t.pageId,{type:`comment.upsert`,comment:s}),await this.#vt(s.id,n)}catch{if(n.aborted||this.#p!==o)return;this.#p=null,this.#f={target:t,body:a,comment:s},this.#d=`저장하지 못했습니다. 다시 시도하세요.`,!this.#_&&this.#l===t&&(this.#ht(),queueMicrotask(()=>this.#e.querySelector(`.rg-selection-label:not(.rg-thread-label) textarea`)?.focus({preventScroll:!0})));return}n.aborted||this.#p!==o||(this.#p=null,this.#f=null,this.#d=``,this.#m?.target===t&&(this.#m=null),this.#l===t&&(this.#l=null,this.#u=``,this.#ht(),queueMicrotask(()=>this.#e.querySelector(`.rg-feedback-tool`)?.focus({preventScroll:!0}))),this.#De(`피드백을 저장했습니다.`))}async#vt(e,t){this.#i?.comments.some(({id:t})=>t===e)||await new Promise((n,r)=>{let i=()=>{clearTimeout(o),t.removeEventListener(`abort`,a),this.#Z.delete(e)},a=()=>{i(),n()},o=setTimeout(()=>{i(),r(Error(`Comment was not confirmed by the review service`))},1e4);this.#Z.set(e,()=>{i(),n()}),t.addEventListener(`abort`,a,{once:!0})})}#yt(e){let t=this.#i?it(this.#i).pinNumberByCommentId.get(e.id)??1:1,n=!W(e).available,r=Je(`피드백 ${t}${e.status===`resolved`?` · 완료`:``}${n?` · 위치 없음`:``}`,`답글`,`답글 입력`);r.classList.add(`rg-thread-label`),r.id=Pt(e.id),r.tabIndex=-1,r.dataset.commentId=e.id,r.setAttribute(`aria-label`,`피드백 대화`),M(r,Nt(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(Ye()),i.append(a);let o=H(`rg-thread-messages`);o.append(kt(e.authorName,e.body,e.createdAt)),(this.#i?.replies.filter(({commentId:t})=>t===e.id)??[]).forEach(e=>o.append(kt(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.#G.get(e.id)??``;let l=this.#K.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.#G.set(e.id,s.value),this.#J.get(e.id)?.body!==s.value.trim()&&(this.#J.delete(e.id),this.#q.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.#ot(!0)),c.addEventListener(`click`,()=>void this.#bt(r,e));let d=this.#q.get(e.id);return d&&At(r,d),queueMicrotask(u),r}async#bt(e,t){if(!this.#t||!this.#ce())return;let n=this.#E?.signal;if(!n||this.#K.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.#J.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.#K.set(t.id,{request:l,body:a,reply:c}),this.#xt(t.id,!0);try{await this.#t.repository.mutate(this.#t.pageId,{type:`reply.upsert`,reply:c})}catch{if(n.aborted||this.#K.get(t.id)?.request!==l)return;this.#K.delete(t.id),this.#J.set(t.id,{body:a,reply:c}),this.#q.set(t.id,`답글을 저장하지 못했습니다. 다시 시도하세요.`),i.disabled=!1,r.disabled=!1,this.#h===t.id&&(this.#ht(),queueMicrotask(()=>this.#St(t.id)?.querySelector(`textarea`)?.focus({preventScroll:!0})));return}if(n.aborted||this.#K.get(t.id)?.request!==l)return;this.#K.delete(t.id),this.#J.delete(t.id),this.#q.delete(t.id),this.#G.delete(t.id);let u=this.#St(t.id)?.querySelector(`textarea`);u&&(u.value=``,u.style.height=`auto`),this.#xt(t.id,!1),this.#De(`답글을 저장했습니다.`)}#xt(e,t){let n=this.#St(e),r=n?.querySelector(`textarea`),i=n?.querySelector(`.rg-submit`);r&&(r.disabled=t),i&&(i.disabled=t)}#St(e){return[...this.#e.querySelectorAll(`.rg-thread-label`)].find(({dataset:t})=>t.commentId===e)}#Ct(e){return e.composedPath().includes(this)}};function Et(e){ge(e.styleNonce),customElements.get(`agency-review-widget`)||customElements.define(xt,Tt);let t=document.createElement(xt);return t.configure(e),document.body.append(t),t}function Dt(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 H(e){let t=document.createElement(`div`);return t.className=e,t}function U(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 Ot(e,t){return Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)}function kt(e,t,n){let r=document.createElement(`article`);r.className=`rg-message`;let i=H(`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 At(e,t){let n=e.querySelector(`.rg-inline-error`);if(!n){n=H(`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 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 Mt(e){let t=S(e.anchor),n=t.x-window.scrollX;if(t.y-window.scrollY,e.kind===`element`&&t.element){let e=E(t.element);return{x:e.left,y:e.top,width:e.width,height:e.height,anchorX:n}}if(e.kind===`viewport`){let t=Rt(e);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}let r=Ft(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 Nt(e){if(e.target.kind===`element`){if(W(e).available)return Mt(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=Rt(e.target);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}let t=Ft(e.target);return{x:t.left,y:t.top,width:t.width,height:t.height,anchorX:t.left+t.width/2}}function W(e){if(e.target.kind===`element`){let t=S(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=It(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=Bt(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 Pt(e){return`visual-review-thread-${e.replace(/[^a-zA-Z0-9_-]/g,`-`)}`}function Ft(e){let t=G(e),n=It(e,t),r=q(e.region.width)*t.x,i=q(e.region.height)*t.y;return Vt(new DOMRect(n.pageX-window.scrollX-r/2,n.pageY-window.scrollY-i/2,r,i))}function It(e,t=G(e)){return Lt(e,t)??zt(e,t)}function Lt(e,t){if(e.kind!==`region`||!e.anchor.selector)return null;let n=S(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 Rt(e){let t=Bt(e);return Ht(new DOMRect(t.pageX-window.scrollX-7,t.pageY-window.scrollY-7,14,14))}function zt(e,t=G(e)){let n=Bt(e,t);return{pageX:n.pageX+n.width/2,pageY:n.pageY+n.height/2}}function Bt(e,t=G(e)){let n=e.region,r=J(n.viewportX,n.pageX),i=J(n.viewportY,n.pageY),a=J(n.pageX,window.scrollX+r),o=J(n.pageY,window.scrollY+i),s=a-r,c=o-i;return{pageX:s+r*t.x,pageY:c+i*t.y,width:q(n.width)*t.x,height:q(n.height)*t.y}}function G(e){let t=K(window.innerWidth,1),n=K(window.innerHeight,1),r=K(e.region.viewportWidth,t),i=K(e.region.viewportHeight,n);return{x:t/r,y:n/i}}function Vt(e){let t=Ut(),n=X(J(e.left,t.left),t.left,t.right),r=X(J(e.top,t.top),t.top,t.bottom),i=X(J(e.right,n),t.left,t.right),a=X(J(e.bottom,r),t.top,t.bottom);return new DOMRect(n,r,Math.max(0,i-n),Math.max(0,a-r))}function Ht(e){let t=Ut(),n=Math.min(q(e.width),t.width),r=Math.min(q(e.height),t.height);return new DOMRect(X(J(e.left,t.left),t.left,t.right-n),X(J(e.top,t.top),t.top,t.bottom-r),n,r)}function Ut(){let e=window.visualViewport;return new DOMRect(J(e?.offsetLeft,0),J(e?.offsetTop,0),K(e?.width,window.innerWidth),K(e?.height,window.innerHeight))}function K(e,t){return Number.isFinite(e)&&(e??0)>0?e:Math.max(Number.isFinite(t)?t:1,1)}function q(e){return Number.isFinite(e)?Math.max(0,e):0}function J(e,t){return Number.isFinite(e)?e:Number.isFinite(t)?t:0}function Wt(e){return Y(e).designMode===`on`||e.composedPath().some(e=>{let t=Zt(e);return t?Gt(t):!1})}function Gt(e){let t=e.tagName.toLowerCase();return t===`input`||t===`textarea`||t===`select`||`isContentEditable`in e&&!!e.isContentEditable||wt.has(e.getAttribute(`role`)??``)}function Kt(e){let t=e.composedPath().map(Zt).find(Boolean)??null;return!t||t===t.ownerDocument.documentElement||t===t.ownerDocument.body||D(t)?null:t}function qt(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 Jt(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 Yt(e){let t=Y(e).defaultView?.getSelection();return!!(t&&!t.isCollapsed&&t.toString().length>0)}function Xt(e){let t=e.clientX,n=e.clientY,r=Y(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 Y(e){for(let t of e.composedPath()){if(Qt(t))return t;let e=Zt(t);if(e)return e.ownerDocument}return document}function Zt(e){return e&&`nodeType`in e&&e.nodeType===1?e:null}function Qt(e){return`nodeType`in e&&e.nodeType===9}function $t(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 en(e){return e===`all`||e===`open`||e===`resolved`}function X(e,t,n){return Math.min(n,Math.max(t,e))}function tn(e){return e.replace(/\/+$/,``)||`/`}function nn(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 Z(){return new Promise(e=>{if(typeof window.requestAnimationFrame==`function`){window.requestAnimationFrame(()=>e());return}queueMicrotask(e)})}function Q(e,t){return{value:e.style.getPropertyValue(t),priority:e.style.getPropertyPriority(t)}}function $(e,t,n){n.value?e.style.setProperty(t,n.value,n.priority):e.style.removeProperty(t)}function rn(){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`}export{St as REVIEW_REAUTHENTICATION_REQUIRED_EVENT,xt as REVIEW_WIDGET_TAG,Tt as ReviewWidgetElement,Dt as isStagingLocation,Et as mountReviewWidget};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@01.works/visual-review",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Invitation-only visual feedback for staging websites, hosted by 01.works.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- function e(e){if(typeof e!=`string`||e.length===0||e.length>8192||e.trim()!==e)return null;let n=/^[A-Za-z]:[\\/]/u.test(e),a=n?e.replaceAll(`\\`,`/`):e;if(!n&&a.includes(`\\`)||a.startsWith(`///`)||!a||u.test(a))return null;let o;try{if(a.startsWith(`//`)){let e=new URL(`https:${a}`);if(e.username||e.password||r(i(a,2))===null)return null;o=r(e.pathname)??``}else if(/^https?:\/\//iu.test(a)){let e=new URL(a);if(e.username||e.password||r(i(a,a.indexOf(`://`)+3))===null)return null;o=r(e.pathname)??``}else if(/^file:\/\//iu.test(a)){let e=new URL(a);if(e.hostname&&e.hostname!==`localhost`||r(i(a,a.indexOf(`://`)+3))===null)return null;o=t(r(e.pathname)??``)??``}else if(/^[A-Za-z]:\//u.test(a)){let e=r(a.split(/[?#]/u,1)[0]??``);if(e===null)return null;o=t(e)??``}else{let e=/^[a-z][a-z0-9+.-]*:/iu.exec(a)?.[0];if(e){if(!c.has(e.toLowerCase()))return null;let n=r(a.slice(e.length).split(/[?#]/u,1)[0]??``,!0);if(n===null)return null;o=t(n)??``}else{let e=r(a.split(/[?#]/u,1)[0]??``);if(e===null)return null;let n=e.startsWith(`/`);o=n?e:`/${e}`,n||(o=t(o)??o)}}}catch{return null}s.test(o)&&(o=t(o)??o);let l=r(o);return!o||o===`/`||o.length>4096||l===null?null:l.startsWith(`/`)?l:`/${l}`}function t(e){let t=e.replaceAll(`\\`,`/`);for(let e of a){let n=t.lastIndexOf(e);if(n>=0)return t.slice(n)}return n(t,o)}function n(e,t){let n=e.replaceAll(`\\`,`/`),r=-1;for(let e of t){let t=n.indexOf(e);t>=0&&(r<0||t<r)&&(r=t)}return r<0?null:n.slice(r)}function r(e,t=!1){let n=e;for(let e=0;e<4&&l.test(n);e+=1)try{n=decodeURIComponent(n)}catch{return null}return n=n.normalize(`NFC`),l.test(n)||u.test(n)||n.includes(`\\`)||n.includes(`?`)||n.includes(`#`)||!t&&n.startsWith(`//`)||n.split(`/`).some(e=>e===`.`||e===`..`)?null:n}function i(e,t){let n=e.indexOf(`/`,t);return n<0?`/`:e.slice(n).split(/[?#]/u,1)[0]??`/`}const a=[`/.next/`,`/_next/`],o=[`/dist/`,`/build/`],s=/^\/(?:Users\/[^/]+|home\/[^/]+|github\/workspace|vercel\/path\d+|opt\/build\/repo|workspace|workspaces|private\/(?:var|tmp)|tmp)(?:\/|$)/u,c=new Set([`webpack:`,`webpack-internal:`,`turbopack:`]),l=/%[0-9a-f]{2}/iu,u=/[\u0000-\u001F\u007F-\u009F\u061C\u200B-\u200F\u2028-\u202E\u2060-\u206F\uFEFF]/u;export{e as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./generated-frame-CkUKpj5U.js";function t(e){let t=new Map,i=e.sourceIndexBaseUrl;return{unavailableProvenance:()=>p(e,`unavailable`),async resolve(a,o){let s=o?.signal;m(s);let c=a.closest(`[data-review-source]`),l=a.closest(`[data-visual-review-source]`),u=c?n(c):l?await r(l,t,s,i):null;return m(s),{source:u,componentStack:u?[u]:[],provenance:p(e,u?`fallback`:`unavailable`)}}}}function n(e){let t=e.getAttribute(`data-review-source`)?.trim();if(!t)return null;let n=/^(.*?)(?::(\d+))?(?::(\d+))?$/u.exec(t),r=n?.[1]?.trim();return r?{filePath:r,lineNumber:n?.[2]?Number(n[2]):null,columnNumber:n?.[3]?Number(n[3]):null,componentName:e.getAttribute(`data-review-component`)?.trim()||null,origin:`app`}:null}async function r(e,t,n,r){let a=e.getAttribute(`data-visual-review-source`),s=e.getAttribute(`data-visual-review-source-index`);if(!a||!/^vr1_[0-9a-f]{32}$/u.test(a)||!s)return null;let l=i(s,e.ownerDocument,r);if(!l||typeof globalThis.fetch!=`function`)return null;let u=t.get(l);if(!u){if(t.size>=y)return null;u=o(l),t.set(l,u)}let f;try{f=await h(u,n)}catch{return null}let p=c(f,a);return p?d(p):null}function i(e,t,n){if(e.length>2048||e.trim()!==e||e.includes(`\\`)||/[\u0000-\u001f\u007f\u202a-\u202e\u2066-\u2069]/u.test(e))return null;try{let r=new URL(e,n??t.baseURI);return r.origin!==t.location.origin||r.username||r.password||r.search||r.hash||!a(r.pathname)?null:r.href}catch{return null}}function a(e){return S.test(e)||C.test(e)}async function o(e){let t=await globalThis.fetch(e,{cache:`force-cache`,credentials:`same-origin`});if(!t.ok)throw Error(`Visual Review source index returned HTTP ${t.status}`);let n=t.headers.get(`content-length`),r=n===null?null:Number(n);if(r!==null&&(!Number.isSafeInteger(r)||r<0||r>v))throw Error(`Visual Review source index exceeds 8 MiB`);let i=await s(t);return JSON.parse(i)}async function s(e){let t=e.body?.getReader();if(!t)return``;let n=new TextDecoder(`utf-8`,{fatal:!0}),r=[],i=0;try{for(;;){let{done:e,value:a}=await t.read();if(e)break;if(i+=a.byteLength,i>v)throw await t.cancel(`Visual Review source index exceeds 8 MiB`),Error(`Visual Review source index exceeds 8 MiB`);r.push(n.decode(a,{stream:!0}))}return r.push(n.decode()),r.join(``)}finally{t.releaseLock()}}function c(t,n){if(!u(t)||t.schemaVersion!==1||!u(t.entries))return;let r=t.entries[n];if(!(!Array.isArray(r)||r.length===0||r.length>b))for(let t of r){if(!u(t)||!l(t.runtime))continue;let n=e(t.assetPath),r=f(t.line1,1,g),i=f(t.column0,0,_);if(!(!n||r===null||i===null))return{assetPath:n,line1:r,column0:i,runtime:t.runtime}}}function l(e){return e===`browser`||e===`server-node`||e===`server-edge`}function u(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function d(e){return{filePath:e.assetPath,lineNumber:e.line1,columnNumber:e.column0+1,componentName:null,origin:`generated`,generated:e}}function f(e,t,n){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=t&&e<=n?e:null}function p(e,t){return{provider:`embedded`,build:e.build,resolvedAt:e.now?.()??Date.now(),sourceMapStatus:t}}function m(e){if(e?.aborted)throw e.reason??Error(`Source context resolution aborted`)}function h(e,t){return t?t.aborted?Promise.reject(t.reason??Error(`Source context resolution aborted`)):new Promise((n,r)=>{let i=()=>r(t.reason??Error(`Source context resolution aborted`));t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})}):e}const g=1e7,_=1e7,v=8*1024*1024,y=16,b=64,x=`visual-review-sources-[0-9a-f]{16}\\.json`,S=RegExp(`^/(?:[^/]+/)*\\.visual-review/${x}$`,`u`),C=RegExp(`^/(?:[^/]+/)*_next/static/${x}$`,`u`);export{t as createGeneratedSourceContextResolver};
@@ -1,13 +0,0 @@
1
- import{r as e}from"./install-x8QQBGO-.js";import{t}from"./generated-frame-CkUKpj5U.js";import{i as n,init as r}from"@instantdb/core";const i=n.schema({entities:{$users:n.entity({email:n.string().unique().indexed()}),projects:n.entity({name:n.string(),slug:n.string().unique().indexed(),allowedOrigin: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()}),comments:n.entity({pageId:n.string().indexed(),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(),status:n.string().indexed(),workflowRevision:n.number(),createdAt:n.number().indexed(),updatedAt:n.number().indexed(),resolvedAt:n.number().optional(),resolvedById:n.string().optional()}),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`}},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:`one`,label:`activeReviewInvitation`}},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`}},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(),cursorX:n.number().optional(),cursorY:n.number().optional(),viewportWidth:n.number().optional(),viewportHeight:n.number().optional()})}}}),a=new Uint8Array([107,167,184,17,157,173,17,209,128,180,0,192,79,212,48,200]);function o(e,t,n){return u(e,n),`${e}:${t}:${n}`}async function s(e,t,n){return l(o(e,t,n))}async function c(e){if(!e.trim())throw Error(`Comment ID is required for source context`);return l(`${e}:source-context`)}async function l(e){let t=globalThis.crypto?.subtle;if(!t)throw Error(`Web Crypto is required to persist review capture context`);let n=new TextEncoder().encode(`01works.visual-review/v1/${e}`),r=new Uint8Array(a.length+n.length);r.set(a),r.set(n,a.length);let i=new Uint8Array(await t.digest(`SHA-1`,r)).slice(0,16);i[6]=i[6]&15|80,i[8]=i[8]&63|128;let o=[...i].map(e=>e.toString(16).padStart(2,`0`)).join(``);return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20)}`}function u(e,t){if(!e.trim())throw Error(`Comment ID is required for capture context`);if(!Number.isSafeInteger(t)||t<0)throw Error(`Capture child ordinal must be a non-negative integer`)}const d=131072,f=32768,p=4096,m=1e3;var h=class extends Error{constructor(e,t){super(e,t),this.name=`InstantCaptureIntegrityError`}};function g(e){let t=re(e,`comment target`,!0),n={kind:t.kind,anchor:ue(t.anchor),region:pe(t.region),elements:t.elements.map(e=>({selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,rect:pe(e.rect),source:null,componentStack:[]})),pageUrl:t.pageUrl,pageTitle:t.pageTitle,capturedAt:t.capturedAt},r={elements:t.elements.map(e=>({selector:e.selector,source:e.source?me(e.source):null,componentStack:e.componentStack.map(me)})),...t.sourceProvenance?{sourceProvenance:he(t.sourceProvenance)}:{}};M(n,d,`Public target`);let i=xe(r,65536,`Source context`);return{publicTarget:n,commentFields:y(n),targetElements:n.elements.map(b),sourceContextJson:i}}function ee(e,t,n){let r=T(e,n),i={selector:E(r.anchorSelector,`${n} anchor selector`,p),offsetX:A(r.anchorOffsetX,`${n} anchor offsetX`),offsetY:A(r.anchorOffsetY,`${n} anchor offsetY`),viewportX:A(r.anchorViewportX,`${n} anchor viewportX`),viewportY:A(r.anchorViewportY,`${n} anchor viewportY`)},a=x({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:fe({origin:D(r.targetPageOrigin,`${n} page origin`,1024),pathname:D(r.targetPagePathname,`${n} page pathname`,4096),search:E(r.targetPageSearch,`${n} page search`,1024),hash:E(r.targetPageHash,`${n} page hash`,1024)}),pageTitle:r.targetPageTitle,capturedAt:r.targetCapturedAt},n),o=te(t,`${n} elements`),s=a;for(let e of o)try{s=x({...a,elements:[...s.elements,e]},n)}catch{}return s}function _(e){let t=ne(e);return t?Object.entries(t).map(([e,t],n)=>typeof t==`string`?{ordinal:n,key:e,valueType:`string`,stringValue:t}:typeof t==`number`?{ordinal:n,key:e,valueType:`number`,numberValue:t}:typeof t==`boolean`?{ordinal:n,key:e,valueType:`boolean`,booleanValue:t}:{ordinal:n,key:e,valueType:`null`}):[]}function v(e){if(!Array.isArray(e)||e.length===0)return;let t=[...e].map(e=>{try{let t=T(e,`Comment scope entry`);return{row:t,ordinal:k(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=D(e.key,`Comment scope key`,256);if(Object.hasOwn(n,t))continue;switch(e.valueType){case`string`:n[t]=E(e.stringValue,`Comment scope ${t}`,m);break;case`number`:n[t]=O(e.numberValue,`Comment scope ${t}`);break;case`boolean`:if(typeof e.booleanValue!=`boolean`)throw N(`Comment scope ${t} is invalid`);n[t]=e.booleanValue;break;case`null`:n[t]=null;break;default:throw N(`Comment scope ${t} is invalid`)}}catch{}}if(Object.keys(n).length!==0)try{return M(n,f,`Comment scope`),n}catch{return}}function y(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:de(t.pathname),targetPageSearch:t.search.slice(1),targetPageHash:t.hash.slice(1),targetPageTitle:e.pageTitle,targetCapturedAt:e.capturedAt}}function b(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 te(e,t){if(!Array.isArray(e)||e.length===0)return[];let n=[...e].map(e=>{try{let n=T(e,t);return{row:n,ordinal:k(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(ie({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 x(e,t){return re(e,t,!1)}function S(e,t=`Comment body`){return D(e,t,2e4)}function C(e,t=`Comment body`){let n=S(e,t);for(let e of n)if(e.trim())return e;throw N(`${t} is empty`)}function ne(e){if(e==null)return;let t=T(e,`Comment scope`);if(Object.keys(t).length>20)throw N(`Comment scope has too many fields`);let n={};for(let[e,r]of Object.entries(t)){if(!e.trim()||e.length>256)throw N(`Comment scope has an invalid key`);if(typeof r==`string`){if(r.length>m)throw N(`Comment scope ${e} is too long`);n[e]=r}else if(typeof r==`number`)n[e]=O(r,`Comment scope ${e}`);else if(typeof r==`boolean`||r===null)n[e]=r;else throw N(`Comment scope ${e} is invalid`)}return M(n,f,`Comment scope`),n}function re(e,t,n){let r=w(e,t,[`kind`,`anchor`,`region`,`elements`,`pageUrl`,`pageTitle`,`capturedAt`,`sourceProvenance`],[`sourceProvenance`]),i=r.kind;if(i!==`element`&&i!==`region`&&i!==`viewport`)throw N(`${t} kind is invalid`);let a=ge(r.elements,`${t} elements`);if(a.length>8)throw N(`${t} contains too many elements`);if(!n&&r.sourceProvenance!=null)throw N(`${t} exposes source provenance`);let o=D(r.pageUrl,`${t} pageUrl`,8192);be(o,`${t} pageUrl`);let s={kind:i,anchor:ae(r.anchor,`${t} anchor`),region:oe(r.region,`${t} region`),elements:a.map((e,r)=>ie(e,`${t} elements[${r}]`,n)),pageUrl:o,pageTitle:E(r.pageTitle,`${t} pageTitle`,m),capturedAt:j(r.capturedAt,`${t} capturedAt`),...n&&r.sourceProvenance!=null?{sourceProvenance:le(r.sourceProvenance,`${t} provenance`)}:{}};return M(s,n?196608:d,t),s}function ie(e,t,n){let r=w(e,t,[`selector`,`tagName`,`textPreview`,`rect`,`source`,`componentStack`]),i=ge(r.componentStack,`${t} componentStack`);if(i.length>32)throw N(`${t} componentStack is too large`);if(!n&&(r.source!=null||i.length>0))throw N(`${t} exposes source metadata`);return{selector:D(r.selector,`${t} selector`,p),tagName:D(r.tagName,`${t} tagName`,128),textPreview:E(r.textPreview,`${t} textPreview`,m),rect:oe(r.rect,`${t} rect`),source:n&&r.source!=null?se(r.source,`${t} source`):null,componentStack:n?i.map((e,n)=>se(e,`${t} stack[${n}]`)):[]}}function ae(e,t){let n=w(e,t,[`selector`,`offsetX`,`offsetY`,`viewportX`,`viewportY`]);return{selector:E(n.selector,`${t} selector`,p),offsetX:A(n.offsetX,`${t} offsetX`),offsetY:A(n.offsetY,`${t} offsetY`),viewportX:A(n.viewportX,`${t} viewportX`),viewportY:A(n.viewportY,`${t} viewportY`)}}function oe(e,t){let n=w(e,t,[`pageX`,`pageY`,`width`,`height`,`viewportX`,`viewportY`,`viewportWidth`,`viewportHeight`]),r={pageX:O(n.pageX,`${t} pageX`),pageY:O(n.pageY,`${t} pageY`),width:O(n.width,`${t} width`),height:O(n.height,`${t} height`),viewportX:O(n.viewportX,`${t} viewportX`),viewportY:O(n.viewportY,`${t} viewportY`),viewportWidth:O(n.viewportWidth,`${t} viewportWidth`),viewportHeight:O(n.viewportHeight,`${t} viewportHeight`)};if(r.width<0||r.height<0||r.viewportWidth<0||r.viewportHeight<0)throw N(`${t} has a negative dimension`);return r}function se(e,t){let n=w(e,t,[`filePath`,`lineNumber`,`columnNumber`,`componentName`,`origin`,`generated`],[`generated`]),r=n.origin;if(r!==`app`&&r!==`shared-ui`&&r!==`dependency`&&r!==`generated`&&r!==`unknown`)throw N(`${t} origin is invalid`);return{filePath:D(n.filePath,`${t} filePath`,p),lineNumber:ye(n.lineNumber,`${t} lineNumber`),columnNumber:ye(n.columnNumber,`${t} columnNumber`),componentName:n.componentName==null?null:D(n.componentName,`${t} componentName`,512),origin:r,...n.generated===void 0?{}:{generated:ce(n.generated,`${t} generated`)}}}function ce(e,n){let r=w(e,n,[`assetPath`,`line1`,`column0`,`runtime`,`debugId`],[`debugId`]),i=t(r.assetPath);if(!i)throw N(`${n} assetPath is invalid`);let a=r.runtime;if(a!==`browser`&&a!==`server-node`&&a!==`server-edge`&&a!==`unknown`)throw N(`${n} runtime is invalid`);return{assetPath:i,line1:k(r.line1,`${n} line1`,1,1e7),column0:k(r.column0,`${n} column0`,0,1e7),runtime:a,...r.debugId===void 0?{}:{debugId:ve(r.debugId,`${n} debugId`)}}}function le(e,t){let n=w(e,t,[`provider`,`build`,`resolvedAt`,`sourceMapStatus`]),r=n.provider;if(r!==`react-grab`&&r!==`embedded`&&r!==`custom`)throw N(`${t} provider is invalid`);let i=n.sourceMapStatus;if(i!==`resolved`&&i!==`fallback`&&i!==`unavailable`)throw N(`${t} sourceMapStatus is invalid`);let a=w(n.build,`${t} build`,[`buildId`,`gitCommit`,`generatedAt`,`mode`],[`generatedAt`]),o=a.mode;if(o!==`development`&&o!==`preview`&&o!==`production`)throw N(`${t} build mode is invalid`);return{provider:r,build:{buildId:D(a.buildId,`${t} buildId`,512),gitCommit:a.gitCommit==null?null:D(a.gitCommit,`${t} gitCommit`,256),...a.generatedAt==null?{}:{generatedAt:j(a.generatedAt,`${t} generatedAt`)},mode:o},resolvedAt:j(n.resolvedAt,`${t} resolvedAt`),sourceMapStatus:i}}function ue(e){return{...e}}function de(e){return e.replace(/\/+$/,``)||`/`}function fe(e){return`${e.origin}${e.pathname}${e.search?`?${e.search}`:``}${e.hash?`#${e.hash}`:``}`}function pe(e){return{...e}}function me(e){return{...e,...e.generated?{generated:{...e.generated}}:{}}}function he(e){return{...e,build:{...e.build}}}function w(e,t,n,r=[]){let i=T(e,t);if(Object.keys(i).some(e=>!n.includes(e)))throw N(`${t} contains unknown fields`);for(let e of n)if(!r.includes(e)&&!Object.hasOwn(i,e))throw N(`${t} is missing ${e}`);return i}function T(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw N(`${t} is missing or invalid`);return e}function ge(e,t){if(!Array.isArray(e))throw N(`${t} is missing or invalid`);return e}function E(e,t,n){if(typeof e!=`string`||_e(e,n)>n)throw N(`${t} is invalid or too long`);return e}function _e(e,t){let n=0;for(let r of e)if(n+=1,n>t)return n;return n}function D(e,t,n){let r=E(e,t,n);if(!r.trim())throw N(`${t} is empty`);return r}function O(e,t){if(typeof e!=`number`||!Number.isFinite(e))throw N(`${t} is invalid`);return e}function k(e,t,n,r){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<n||e>r)throw N(`${t} is invalid`);return e}function ve(e,t){let n=D(e,t,256);if(!/^[A-Za-z0-9._:-]+$/u.test(n))throw N(`${t} is invalid`);return n}function A(e,t){let n=O(e,t);if(n<0||n>1)throw N(`${t} is outside 0..1`);return n}function j(e,t){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw N(`${t} is invalid`);return e}function ye(e,t){if(e===null)return null;if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0)throw N(`${t} is invalid`);return e}function be(e,t){let n;try{n=new URL(e)}catch(e){throw N(`${t} is invalid`,e)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw N(`${t} must use HTTP or HTTPS`)}function M(e,t,n){xe(e,t,n)}function xe(e,t,n){let r;try{r=JSON.stringify(e)}catch(e){throw N(`${n} cannot be serialized`,e)}if(r.length>t)throw N(`${n} is too large`);return r}function N(e,t){return new h(e,{cause:t instanceof Error?t:void 0})}function Se(e){if(!e.trim())throw Error(`InstantDB app ID is required`);return r({appId:e,schema:i})}var Ce=class{db;session;#e;constructor(e,t,n={}){this.db=e,this.session=t,this.#e=n.commentTransport}async getSnapshot(e){let{data:t}=await this.db.queryOnce(we(e,this.session.authUserId));return Te(e,t.comments,t.replies)}subscribe(e,t,n){return this.db.subscribeQuery(we(e,this.session.authUserId),r=>{if(r.error){n?.(Me(r.error));return}if(r.data)try{t(Te(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=S(n.body).trim(),i=C(r),a=L(n.createdAt,`Comment createdAt`),l=L(n.updatedAt,`Comment updatedAt`);if(l<a)throw new h(`Comment updatedAt precedes createdAt`);if(n.createdAt!==n.updatedAt)throw new h(`Comment edits must go through the review service`);if(n.status!==`open`||n.resolvedAt!==void 0||n.resolvedById!==void 0)throw new h(`New comments must start open`);let u=g(n.target);if(!ke(n.anchor,u.publicTarget.anchor))throw new h(`Comment anchor does not match its target`);if(this.#e){await this.#e.createComment({pageId:e,commentId:n.id,body:r,target:n.target,...n.scope===void 0?{}:{scope:n.scope}});return}let d=_(n.scope),f=await Promise.all(u.targetElements.map(async e=>({element:e,id:await s(n.id,`element`,e.ordinal),slotKey:o(n.id,`element`,e.ordinal)}))),p=await Promise.all(d.map(async e=>({entry:e,id:await s(n.id,`scope`,e.ordinal),slotKey:o(n.id,`scope`,e.ordinal)}))),m=await c(n.id);await this.db.transact([this.db.tx.comments[n.id].update({pageId:e,authorId:this.session.reviewerId,authorAuthUserId:this.session.authUserId,authorName:this.session.displayName,body:r,bodyContentMarker:i,...u.commentFields,status:n.status,workflowRevision:0,createdAt:a,updatedAt:l}).link({page:e,author:this.session.reviewerId}),...f.map(({element:e,id:t,slotKey:r})=>this.db.tx.commentTargetElements[t].update({commentId:n.id,slotKey:r,authorAuthUserId:this.session.authUserId,...e}).link({comment:n.id})),...p.map(({entry:e,id:t,slotKey:r})=>this.db.tx.commentScopeEntries[t].update({commentId:n.id,slotKey:r,authorAuthUserId:this.session.authUserId,...e}).link({comment:n.id})),this.db.tx.commentSourceContexts[m].update({commentId:n.id,pageId:e,authorAuthUserId:this.session.authUserId,contextJson:u.sourceContextJson,createdAt:a}).link({comment:n.id,page:e,author:this.session.reviewerId})]);return}case`comment.delete`:throw new h(`Comment deletion must go through the review service`);case`reply.upsert`:{let n=t.reply;if(n.authorId!==this.session.reviewerId)throw Error(`Reply author mismatch`);let r=S(n.body,`Reply body`).trim(),i=C(r,`Reply body`),a=L(n.createdAt,`Reply createdAt`),o=L(n.updatedAt,`Reply updatedAt`);if(o<a)throw new h(`Reply updatedAt precedes createdAt`);if(n.createdAt!==n.updatedAt)throw new h(`Reply edits must go through the review service`);if(this.#e){await this.#e.createReply({commentId:n.commentId,replyId:n.id,body:r});return}await this.db.transact(this.db.tx.replies[n.id].update({pageId:e,commentId:n.commentId,authorId:this.session.reviewerId,authorAuthUserId:this.session.authUserId,authorName:this.session.displayName,body:r,bodyContentMarker:i,createdAt:a,updatedAt:o}).link({comment:n.commentId,author:this.session.reviewerId}));return}case`reply.delete`:throw new h(`Reply deletion must go through the review service`)}}};function we(e,t){return{comments:{$:{where:{pageId:e},order:{createdAt:`asc`}},targetElements:{},scopeEntries:{}},replies:{$:{where:{pageId:e},order:{createdAt:`asc`}}},$users:{$:{where:{id:t}},activeReviewInvitation:{project:{}}}}}function Te(e,t,n){let r=t.map(t=>Ee(t,e));je(r,`comment`);let i=new Set(r.map(({id:e})=>e)),a=n.map(t=>De(t,e));je(a,`reply`);for(let e of a)if(!i.has(e.commentId))throw new h(`Reply ${e.id} references a comment outside the page snapshot`);return{pageId:e,comments:r,replies:a}}function Ee(e,t){let n=P(e,`comment`),r=F(n.id,`comment id`);if(F(n.pageId,`comment ${r} pageId`)!==t)throw new h(`Comment ${r} escaped its page scope`);F(n.authorAuthUserId,`comment ${r} authorAuthUserId`);let i=!(Object.hasOwn(n,`anchor`)&&Object.hasOwn(n,`target`)),a=i?ee(n,n.targetElements,`comment ${r} target`):x(n.target,`comment ${r} target`),o=i?{...a.anchor}:Oe(n.anchor,`comment ${r} anchor`);if(!ke(o,a.anchor))throw new h(`Comment ${r} has inconsistent anchors`);let s=n.status;if(s!==`open`&&s!==`resolved`)throw new h(`Comment ${r} has an invalid status`);let c=L(n.createdAt,`comment ${r} createdAt`),l=L(n.updatedAt,`comment ${r} updatedAt`);if(l<c)throw new h(`Comment ${r} updatedAt precedes createdAt`);let u=Ie(n.resolvedAt,`comment ${r} resolvedAt`),d=Le(n.resolvedById,`comment ${r} resolvedById`);if(s===`open`&&(u!==void 0||d!==void 0))throw new h(`Open comment ${r} contains resolution metadata`);if(s===`resolved`&&(u===void 0||d===void 0||u!==l))throw new h(`Resolved comment ${r} has invalid workflow metadata`);return{id:r,pageId:t,authorId:F(n.authorId,`comment ${r} authorId`),authorName:F(n.authorName,`comment ${r} authorName`),body:S(n.body,`comment ${r} body`),anchor:o,target:a,...i?Ae(v(n.scopeEntries)):n.scope==null?{}:{scope:ne(n.scope)},status:s,workflowRevision:Fe(n.workflowRevision,`comment ${r} workflowRevision`),createdAt:c,updatedAt:l,...u===void 0?{}:{resolvedAt:u},...d===void 0?{}:{resolvedById:d}}}function De(e,t){let n=P(e,`reply`),r=F(n.id,`reply id`);if(F(n.pageId,`reply ${r} pageId`)!==t)throw new h(`Reply ${r} escaped its page scope`);F(n.authorAuthUserId,`reply ${r} authorAuthUserId`);let i=L(n.createdAt,`reply ${r} createdAt`),a=L(n.updatedAt,`reply ${r} updatedAt`);if(a<i)throw new h(`Reply ${r} updatedAt precedes createdAt`);return{id:r,commentId:F(n.commentId,`reply ${r} commentId`),authorId:F(n.authorId,`reply ${r} authorId`),authorName:F(n.authorName,`reply ${r} authorName`),body:S(n.body,`reply ${r} body`),createdAt:i,updatedAt:a}}function Oe(e,t){let n=P(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 h(`${t} has invalid fields`);return{selector:Pe(n.selector,`${t} selector`),offsetX:I(n.offsetX,`${t} offsetX`),offsetY:I(n.offsetY,`${t} offsetY`),viewportX:I(n.viewportX,`${t} viewportX`),viewportY:I(n.viewportY,`${t} viewportY`)}}function ke(e,t){return e.selector===t.selector&&e.offsetX===t.offsetX&&e.offsetY===t.offsetY&&e.viewportX===t.viewportX&&e.viewportY===t.viewportY}function Ae(e){return e===void 0?{}:{scope:e}}function je(e,t){let n=new Set;for(let r of e){if(n.has(r.id))throw new h(`Duplicate ${t} ${r.id}`);n.add(r.id)}}function Me(e){let t=Ne(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 Ne(e){return e instanceof Error?e.message:e&&typeof e==`object`&&`message`in e?String(e.message):``}function P(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new h(`${t} is missing or invalid`);return e}function Pe(e,t){if(typeof e!=`string`)throw new h(`${t} is invalid`);return e}function F(e,t){let n=Pe(e,t);if(!n.trim())throw new h(`${t} is empty`);return n}function I(e,t){if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw new h(`${t} is invalid`);return e}function L(e,t){if(!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw new h(`${t} is invalid`);return e}function Fe(e,t){if(!Number.isSafeInteger(e)||e<0)throw new h(`${t} is invalid`);return e}function Ie(e,t){return e==null?void 0:L(e,t)}function Le(e,t){return e==null?void 0:F(e,t)}Object.freeze({field:`createdAt`,direction:`desc`,tieBreaker:`id`,tieDirection:`desc`}),Object.freeze({comments:200,replies:1e3,sourceContexts:200});var Re=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=qe(e,t.roomId),a,l,u=this.roomCredential??{id:t.roomId,expiresAt:2**53-1,refresh:async()=>void 0},d=t=>{let o=this.db.joinRoom(`visualReview`,t),s=o.subscribePresence({},e=>{if(e.error){r?.(Ye(e.error));return}i=Object.values(e.peers).map(e=>Be(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?.()},f=()=>{if(!this.roomCredential||o)return;let e=Math.max(1e3,u.expiresAt-Date.now()+250);l=setTimeout(()=>{p()},e)},p=async()=>{try{let e=await u.refresh();if(o||!e)return;u={...e,refresh:u.refresh},d(e.id),f()}catch(e){if(o)return;r?.(Ye(e)),o||(l=setTimeout(()=>{p()},5e3))}};d(u.id),f(),s.push(()=>{l&&clearTimeout(l),this.#e.delete(n),a?.()})}return t.chat&&s.push(this.db.subscribeQuery(ze(e,this.session.authUserId),t=>{if(t.error){r?.(Ye(t.error));return}if(t.data)try{a=t.data.reviewMessages.map(t=>Ve(t,e)).sort(Je),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(qe(e,t));r&&r.publishPresence({reviewerId:this.session.reviewerId,displayName:this.session.displayName,color:n.color,active:n.active,...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}})}async sendMessage(e,t){if(t.pageId!==e)throw Error(`Review message page mismatch`);if(t.authorId!==this.session.reviewerId)throw Error(`Review message author mismatch`);let n=He(t.body),r=Ue(t.pathname),i=z(t.createdAt,`Review message createdAt`),a=z(t.updatedAt,`Review message updatedAt`);if(i!==a)throw Error(`New review messages must be immutable`);await this.db.transact(this.db.tx.reviewMessages[t.id].update({pageId:e,pathname:r,authorId:this.session.reviewerId,authorAuthUserId:this.session.authUserId,authorName:this.session.displayName,body:n,bodyContentMarker:C(n,`Review message body`),createdAt:i,updatedAt:a}).link({page:e,author:this.session.reviewerId}))}};function ze(e,t){return{reviewMessages:{$:{where:{pageId:e},order:{createdAt:`asc`}}},$users:{$:{where:{id:t}},activeReviewInvitation:{project:{}}}}}function Be(e){let t=We(e.reviewerId,128),n=We(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=Ge(e.cursorX),a=Ge(e.cursorY),o=Ke(e.viewportWidth),s=Ke(e.viewportHeight);return{peerId:e.peerId,reviewerId:t,displayName:n,color:r,active:e.active,...i===void 0?{}:{cursorX:i},...a===void 0?{}:{cursorY:a},...o===void 0?{}:{viewportWidth:o},...s===void 0?{}:{viewportHeight:s}}}function Ve(e,t){let n=R(e.id,`Review message id`,128);if(R(e.pageId,`Review message pageId`,128)!==t)throw Error(`Review message page mismatch`);return{id:n,pageId:t,pathname:Ue(e.pathname),authorId:R(e.authorId,`Review message authorId`,128),authorName:R(e.authorName,`Review message authorName`,512),body:He(e.body),createdAt:z(e.createdAt,`Review message createdAt`),updatedAt:z(e.updatedAt,`Review message updatedAt`)}}function He(e){return R(e,`Review message body`,4e3)}function Ue(e){let t=R(e,`Review message pathname`,2e3);if(!t.startsWith(`/`))throw Error(`Review message pathname is invalid`);return t}function R(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 We(e,t){if(typeof e!=`string`)return null;let n=e.trim();return n&&n.length<=t?n:null}function Ge(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function Ke(e){let t=Ge(e);return t!==void 0&&t>0?t:void 0}function z(e,t){if(!Number.isSafeInteger(e)||e<0)throw Error(`${t} is invalid`);return e}function qe(e,t){return JSON.stringify([e,t])}function Je(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function Ye(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`});const B={$default:`false`},V={$default:`false`},H=`$user.activeReviewInvitation.project.id`;function U(e){return[`auth.id != null`,`size(auth.ref('$user.activeReviewInvitation.id')) == 1`,`size(auth.ref('${H}')) == 1`,`size(auth.ref('$user.activeReviewInvitation.status')) == 1`,`size(auth.ref('$user.activeReviewInvitation.expiresAt')) == 1`,`size(auth.ref('$user.activeReviewInvitation.revokedAt')) == 0`,`auth.ref('$user.activeReviewInvitation.status')[0] == 'accepted'`,`request.time < timestamp(auth.ref('$user.activeReviewInvitation.expiresAt')[0])`,e].join(` && `)}function W(...e){return e.map(e=>`(${e})`).join(` && `)}function G(...e){return e.map(e=>`(${e})`).join(` || `)}function K(e,t){return`!has(${e}.${t}) || ${e}.${t} == null`}const Xe=`actions.data == 'create' && actions.linkedData == 'update'`,Ze=e=>`${e}.matches('[^ \\t\\n\\r\\f\\u000b\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]')`,Qe=e=>W(`${e} >= 0`,`${e} <= 253402300799999`,`${e} % 1 == 0`),$e=e=>W(Qe(e),`(request.time - timestamp(${e})).getSeconds() <= 86400`,`(request.time - timestamp(${e})).getSeconds() >= -300`);W(`actions.data == 'update' && actions.linkedData == 'create'`,G(`auth.id != null && auth.id in data.ref('project.owners.id')`,U(`auth.ref('${H}')[0] in data.ref('project.id')`))),W(Xe,G(`auth.id != null && auth.id in data.ref('page.project.owners.id')`,U(`auth.ref('${H}')[0] in data.ref('page.project.id')`)),`auth.id != null && auth.id == data.authorAuthUserId && auth.id in data.ref('author.$user.id')`,`data.pageId in data.ref('page.id')`,`data.authorId in data.ref('author.id') && data.authorAuthUserId in data.ref('author.$user.id') && data.authorName in data.ref('author.displayName')`,`data.pageId in data.ref('author.project.pages.id')`),W(Xe,`data.pageId == linkedData.id`,`auth.id != null && auth.id == data.authorAuthUserId`,`data.authorId in auth.ref('$user.reviewerMemberships.id')`,`data.authorId in linkedData.ref('project.reviewers.id')`,G(`auth.id != null && auth.id in linkedData.ref('project.owners.id')`,U(`auth.ref('${H}')[0] in linkedData.ref('project.id')`)));const et=`auth.id != null && auth.id in data.ref('comment.page.project.owners.id')`,tt=U(`auth.ref('${H}')[0] in data.ref('comment.page.project.id')`);U(`auth.ref('${H}')[0] in data.ref('comment.page.project.id')`),U(`auth.ref('${H}')[0] in data.ref('page.project.id')`);const nt=W(`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')`);W(`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`,nt),W(`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`,nt),W(`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')`),W(`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')`),W(`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')`),{...B},{...V},{...V},U(`data.id == auth.ref('${H}')[0]`),{...B},W(`isOwner`,G(W(K(`data`,`allowedOrigin`),K(`newData`,`allowedOrigin`)),`newData.allowedOrigin == data.allowedOrigin`)),{...V},{...B},W(`isOwner`,G(W(K(`data`,`autoRegistrationSlot`),K(`newData`,`autoRegistrationSlot`)),`newData.autoRegistrationSlot == data.autoRegistrationSlot`)),{...V},{...B},{...V},U(`auth.ref('${H}')[0] in data.ref('project.id')`),{...B},{...V},{...B},{...B},{...V},{...V},{...B},{...V},{...B},G(et,tt),{...B},G(et,tt),{...B},{...B},W(`data.createdAt == data.updatedAt`,$e(`data.createdAt`),`size(data.body) > 0`,`size(data.body) <= 4000`,`size(data.bodyContentMarker) == 1`,Ze(`data.bodyContentMarker`),`data.body.startsWith(data.bodyContentMarker)`,`size(data.authorName) > 0`,`size(data.authorName) <= 512`,Ze(`data.authorName`),`size(data.pathname) > 0`,`size(data.pathname) <= 2000`,`request.modifiedFields.all(field, field in ['pageId', 'pathname', 'authorId', 'authorAuthUserId', 'authorName', 'body', 'bodyContentMarker', 'createdAt', 'updatedAt', 'page', 'author'])`),{...B},{...V};var rt=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ReviewerCommentSaveError`}};function it(e,t){let n=e.replace(/\/+$/,``),r=async(e,r)=>{let i=await t();if(!i)throw new rt(`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 rt(`NETWORK`,`리뷰 서버에 연결하지 못했습니다. 연결을 확인하고 다시 시도해 주세요.`)}if(!a.ok)throw new rt(...await at(a))};return{createComment:e=>r(`/v1/comments`,e),createReply:e=>r(`/v1/replies`,e)}}async function at(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 ot=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ReviewBootstrapError`}};const q=new Map;function st(e,t={}){let n=e.trim();if(!n)throw Error(`InstantDB app ID is required`);return{async resolve(e){let r=(t.databaseFactory??Se)(n),i=await ut(n,r,e.authHost,e.signal,e.styleNonce,t.reviewerToken);for(;;)try{await ct(t.acceptInvitation,{refreshToken:i.refresh_token,invitationId:e.invitationId,suggestedDisplayName:Ct(i.email),authHost:e.authHost,signal:e.signal,styleNonce:e.styleNonce});break}catch(a){if(!wt(a,`INVITATION_EMAIL_MISMATCH`))throw a;await gt(e.authHost,e.signal,e.styleNonce),i=await dt(n,r,i,e.authHost,e.signal,e.styleNonce,t.reviewerToken)}let{data:a}=await r.queryOnce({reviewers:{$:{where:{authUserId:i.id}}},reviewPages:{$:{where:{stagingOrigin:e.location.origin}}},invitations:{}}),o=lt(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 ot(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=e.collaboration?.cursors===!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,l=c&&t.resolveCollaborationRoom?{...c,refresh:async()=>{let n=await r.getAuth();if(n?.refresh_token)return t.resolveCollaborationRoom?.({refreshToken:n.refresh_token,invitationId:e.invitationId,pageId:o.page.id,scopeId:e.collaboration.scopeId,signal:e.signal})}}:void 0;return{pageId:o.page.id,session:s,repository:new Ce(r,s,{...t.serviceUrl===void 0?{}:{commentTransport:it(t.serviceUrl,async()=>(await r.getAuth())?.refresh_token??null)}}),...e.collaboration?.cursors===!0||e.collaboration?.chat===!0?{collaborationRepository:new Re(r,s,l)}:{},...e.collaboration?.cursors===!0&&l?{collaborationRoomId:l.id}:{},allowedStagingHosts:[e.location.hostname]}}}}async function ct(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 ht(t.authHost,t.signal,t.suggestedDisplayName,t.styleNonce);await e({...n,displayName:r})}function lt(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=n.find(e=>e.projectId===i.projectId&&e.stagingOrigin===r.location.origin&&Et(e.pathname)===o);return s?{ok:!0,invitation:i,reviewer:a,page:s}:{ok:!1,code:`PAGE_NOT_FOUND`}}async function ut(e,t,n,r,i,a){let o=await J(r,()=>t.getAuth());if(o)return o;let s=await ft(e,r);try{return await J(r,()=>t.getAuth())||(a?await J(r,async()=>{await t.auth.signInWithToken(a);let e=await t.getAuth();if(!e)throw Error(`Reviewer session did not establish`);return e}):await mt(t,n,r,i))}finally{s()}}async function dt(e,t,n,r,i,a,o){Y(i);let s=await ft(e,i);try{let e=await J(i,()=>t.getAuth());return e&&e.id!==n.id?e:(e&&await J(i,async()=>{await t.auth.signOut()}),Y(i),o?await J(i,async()=>{await t.auth.signInWithToken(o);let e=await t.getAuth();if(!e)throw Error(`Reviewer session did not establish`);return e}):await mt(t,r,i,a))}finally{s()}}async function ft(e,t){Y(t);let n=q.get(e);return n||(n={held:!1,waiters:[]},q.set(e,n)),n.held?new Promise((e,r)=>{let i,a=()=>{let e=n.waiters.indexOf(i);e<0||(n.waiters.splice(e,1),t.removeEventListener(`abort`,a),r(Z()))};i={signal:t,resolve:e,reject:r,abort:a},n.waiters.push(i),t.addEventListener(`abort`,a,{once:!0}),t.aborted&&a()}):(n.held=!0,pt(e,n))}function pt(e,t){let n=!1;return()=>{if(!n){for(n=!0;t.waiters.length>0;){let n=t.waiters.shift();if(n.signal.removeEventListener(`abort`,n.abort),n.signal.aborted){n.reject(Z());continue}n.resolve(pt(e,t));return}t.held=!1,q.get(e)===t&&q.delete(e)}}}async function J(e,t){Y(e);let n=await t();return Y(e),n}function Y(e){if(e.aborted)throw Z()}function mt(e,t,n,r){try{Y(n)}catch(e){return Promise.reject(e)}let i=vt(t);i.replaceChildren(yt(i,r),bt(i));let a=i.querySelector(`form`),o=i.querySelector(`h2`),s=i.querySelector(`.description`),c=a.elements.namedItem(`email`),l=a.elements.namedItem(`code`),u=i.querySelector(`.code`),d=i.querySelector(`button`),f=i.querySelector(`.error`),p=!1;return new Promise((t,r)=>{let m=!1,h=!1,g=!1,ee=()=>{n.removeEventListener(`abort`,v),i.removeEventListener(`keydown`,y),a.removeEventListener(`submit`,b)},_=e=>{m||(m=!0,ee(),e())},v=()=>{m||(g=!0,ee(),h||_(()=>r(Z())))},y=e=>{let t=e;t.key===`Escape`?(t.preventDefault(),v()):t.key===`Tab`&&Tt(i,t)},b=async i=>{if(i.preventDefault(),!(m||h)){h=!0,f.textContent=``,d.disabled=!0,a.setAttribute(`aria-busy`,`true`);try{if(Y(n),!p){let t=c.value.trim();await J(n,async()=>{await e.auth.sendMagicCode({email:t})}),p=!0,c.readOnly=!0,u.hidden=!1,l.required=!0,o.textContent=`인증 코드`,s.textContent=`${t}로 보낸 코드를 입력하세요.`,d.textContent=`확인`,l.focus();return}await J(n,async()=>{await e.auth.signInWithMagicCode({email:c.value.trim(),code:l.value.trim()})});let r=await J(n,()=>e.getAuth());if(!r)throw Error(`인증 세션을 확인할 수 없습니다.`);_(()=>t(r))}catch(e){if(m||n.aborted||wt(e,`AUTH_CANCELLED`))return;f.textContent=_t(e)}finally{h=!1,!m&&(g||n.aborted)?_(()=>r(Z())):m||(d.disabled=!1,a.removeAttribute(`aria-busy`))}}};n.addEventListener(`abort`,v,{once:!0}),i.addEventListener(`keydown`,y),a.addEventListener(`submit`,b)})}function ht(e,t,n=``,r){if(t.aborted)return Promise.reject(Z());let i=vt(e);i.replaceChildren(yt(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(Z())),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 gt(e,t,n){if(t.aborted)return Promise.reject(Z());let r=vt(e);r.replaceChildren(yt(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(Z())),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)})}function _t(e){if(e&&typeof e==`object`&&`body`in e){let t=e.body;if(t?.message)return t.message}return e instanceof Error?e.message:`로그인에 실패했습니다. 다시 시도해 주세요.`}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=kt,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-login-title`),n.setAttribute(`aria-describedby`,`visual-review-login-description`);let r=X(t,`p`,`01.works`,`eyebrow`),i=X(t,`h2`,`Visual Review`);i.id=`visual-review-login-title`;let a=X(t,`p`,`초대받은 이메일로 계속하세요.`,`description`);a.id=`visual-review-login-description`;let o=t.createElement(`label`);o.append(`이메일`);let s=t.createElement(`input`);s.name=`email`,s.type=`email`,s.autocomplete=`email`,s.required=!0,o.append(s);let c=t.createElement(`label`);c.className=`code`,c.hidden=!0,c.append(`인증 코드`);let l=t.createElement(`input`);l.name=`code`,l.inputMode=`numeric`,l.autocomplete=`one-time-code`,c.append(l);let u=X(t,`p`,``,`error`);u.setAttribute(`role`,`alert`);let d=X(t,`button`,`코드 받기`);return d.type=`submit`,n.append(r,i,a,o,c,u,d),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=X(t,`p`,`01.works`,`eyebrow`),i=X(t,`h2`,`표시 이름`);i.id=`visual-review-name-title`;let a=X(t,`p`,`피드백에 이 이름이 표시됩니다.`,`description`);a.id=`visual-review-name-description`;let o=X(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=X(t,`p`,``,`error`);c.setAttribute(`role`,`alert`);let l=X(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-account-title`),n.setAttribute(`aria-describedby`,`visual-review-account-description`);let r=X(t,`p`,`01.works`,`eyebrow`),i=X(t,`h2`,`계정 확인`);i.id=`visual-review-account-title`;let a=X(t,`p`,`이 초대는 현재 로그인한 계정과 일치하지 않습니다.`,`description`);a.id=`visual-review-account-description`;let o=X(t,`button`,`다른 계정으로 계속`);return o.type=`submit`,n.append(r,i,a,o),n}function X(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 Z(){return new ot(`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
- :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
- 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
- .eyebrow{margin:0 0 10px;color:var(--vr-muted);font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase}
5
- h2{margin:0 0 5px;font-size:16px;line-height:1.3;letter-spacing:-.01em}.description{margin:0 0 18px;color:var(--vr-muted);font-size:13px;line-height:1.45}
6
- label{display:grid;gap:6px;margin-top:12px;color:var(--vr-label);font-size:12px;font-weight:600}input{box-sizing:border-box;width:100%;height:40px;margin-top:6px;padding:0 11px;border:1px solid var(--vr-border);border-radius:9px;background:var(--vr-control);color:var(--vr-text);font:400 13px/1 Inter,ui-sans-serif,system-ui,sans-serif}
7
- label input{margin-top:0}input:focus{border-color:#999;outline:0;box-shadow:0 0 0 3px rgba(127,127,127,.16)}.error{min-height:17px;margin:8px 0 0;color:#d92d20;font-size:11px;line-height:1.45}
8
- button{width:100%;height:40px;margin-top:7px;border:0;border-radius:9px;background:var(--vr-action);color:var(--vr-action-text);font:650 13px/1 Inter,ui-sans-serif,system-ui,sans-serif;cursor:pointer}button:focus-visible{outline:2px solid var(--vr-action);outline-offset:2px}button:disabled{opacity:.55;cursor:wait}
9
- @media (prefers-color-scheme:dark){:host{--vr-panel:#161616;--vr-text:#fff;--vr-muted:#a7a7a7;--vr-label:#d6d6d6;--vr-control:#222;--vr-border:#3a3a3a;--vr-action:#fff;--vr-action-text:#171717}}
10
- @media (pointer:coarse){input,button{height:44px}}
11
- @media (max-width:480px){form{padding:18px}input{font-size:16px}}
12
- @media (prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
13
- `;var Q=class extends Error{code;status;constructor(e,t,n){super(t),this.code=e,this.status=n,this.name=`HostedBootstrapError`}};function At(e={}){return jt(e)}function jt(t={},n={}){let r=e(t.serviceUrl??`https://visual-review.01.works`),i=t.fetch??globalThis.fetch,a=n.instantRuntimeFactory??st;if(typeof i!=`function`)throw Error(`Visual Review bootstrap requires the Fetch API`);return{async resolve(e){let t=Mt(e),n=await Pt(r,i,t,e.signal);return a(n.instantAppId,{serviceUrl:r,...n.reviewer?{reviewerToken:n.reviewer.token}:{},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 It(t);if(!t.ok)throw new Q($(n,`error`)??`INVITATION_ACCEPT_FAILED`,$(n,`message`)??`리뷰 초대 수락에 실패했습니다.`,t.status)},...e.collaboration?.cursors===!0?{resolveCollaborationRoom:e=>Nt(r,i,e)}:{}}).resolve(e)}}}function Mt(e){return{invitationId:e.invitationId,origin:e.location.origin,pathname:e.location.pathname}}async function Nt(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 It(r);if(!r.ok)throw new Q($(i,`error`)??`COLLABORATION_ROOM_FAILED`,$(i,`message`)??`실시간 협업 연결에 실패했습니다.`,r.status);if(!i||typeof i!=`object`||Array.isArray(i))throw new Q(`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 Q(`INVALID_COLLABORATION_ROOM`,`잘못된 협업 응답입니다.`,502);return{id:o,expiresAt:a.expiresAt}}async function Pt(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 It(i);if(!i.ok)throw new Q($(a,`error`)??`BOOTSTRAP_FAILED`,$(a,`message`)??`Visual Review bootstrap에 실패했습니다.`,i.status);return Ft(a)}function Ft(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new Q(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);let t=e,n=$(t,`instantAppId`);if(t.apiVersion!==1||!n||!Lt(n))throw new Q(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);let r=t.reviewer;if(r==null)return{apiVersion:1,instantAppId:n};let i=$(r,`token`),a=$(r,`email`);if(!i||!a)throw new Q(`INVALID_BOOTSTRAP_RESPONSE`,`잘못된 bootstrap 응답입니다.`,502);return{apiVersion:1,instantAppId:n,reviewer:{token:i,email:a}}}async function It(e){try{return await e.json()}catch{throw new Q(`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 Lt(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{At as createHostedReviewRuntime};
@@ -1 +0,0 @@
1
- const e=`https://visual-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;function o(e={}){if(e.enabled!==!0||typeof window>`u`||typeof document>`u`)return n();let r=!1,i=0,a=null,o=null,p=null,h=null,g=document.baseURI,_=new WeakMap,S=new Map,E=W(window),A=Z(e.styleNonce,document),M=e.activationParam??`visual-review`,N=v(window.location,M),P=m(window,e=>{let t=v(e,M);if(t===N)return;let n=D(M,e.href);n&&S.set(e.origin,n),N=t,I()}),F=e=>{r||!p||e.target!==p||(N=v(window.location,M),I())};return window.addEventListener(`visual-review:reauthenticate-required`,F),{ready:I(),refresh(){return r?Promise.resolve(null):(N=v(window.location,M),I())},dispose(){r||(r=!0,i+=1,a?.abort(),a=null,p?.remove(),p=null,h?.remove(),h=null,S.clear(),P.unsubscribe(),window.removeEventListener(`visual-review:reauthenticate-required`,F))}};function I(){let t=++i;a?.abort(),p?.remove(),p=null,h?.remove();let n=new AbortController,r=document.createElement(`div`);r.dataset.agencyReviewRoot=``,a=n,h=r;let s=L(t,n,r);return o=s,s.then(r=>{r&&B(t,n)&&p===r&&e.onReady?.(r)}),s}async function L(t,n,i){try{let e=document.body??await j(document,n.signal);if(!B(t,n))return V(t);e.append(i);let r=await R(t,n,i);return B(t,n)?r:(i.remove(),V(t))}catch(a){if(!B(t,n))return i.remove(),V(t);if(d(a,`AUTH_CANCELLED`))return i.remove(),h===i&&(h=null),null;z(a,i);let o=Y(a,_.get(i)?.[2]);return J(i,o.message,A,()=>{r||h!==i||(N=v(window.location,M),I())}),e.onError?.(o),window.dispatchEvent(new CustomEvent(`visual-review:error`,{detail:o})),null}}async function R(n,r,i){let a=t(e.serviceUrl??`https://visual-review.01.works`),o=y(window.location),d=ee(a,M,o,E),f=b(S.get(o.origin)),m=x(C(a,o.origin)),D=d?.source===`url`?d:f??m??d;if(!D)return _.delete(i),i.remove(),h===i&&(h=null),null;let j=D.invitationId;_.set(i,[a,o.origin,j]),D.source===`url`?(G(a,o.origin,E),S.set(o.origin,j),w(a,o.origin,j),P.suppress(()=>O(M))):D.source===`handoff`&&S.set(o.origin,j),N=v(window.location,M);let F=await k((e.runtime??await c(a)).resolve({invitationId:j,location:o,signal:r.signal,authHost:i,styleNonce:A,collaboration:{cursors:e.collaboration?.cursors===!0,chat:e.collaboration?.chat===!0,scopeId:s(e.build,o)}}),r.signal);if(!B(n,r))return null;T(a,o.origin,j),H(a,j,o,E),S.set(o.origin,j);let I=e.sourceContextResolver??await u(e.build,g,r.signal);if(!B(n,r))return null;let{mountReviewWidget:L}=await l(r.signal);return B(n,r)?(p=L({...F,collaboration:{cursors:e.collaboration?.cursors===!0&&!!(F.collaborationRepository&&F.collaborationRoomId),chat:e.collaboration?.chat===!0&&!!F.collaborationRepository,repository:F.collaborationRepository,roomId:F.collaborationRoomId,scopeId:s(e.build,o)},developerTools:e.developerTools,sourceContextResolver:I,styleNonce:A}),i.remove(),h===i&&(h=null),window.dispatchEvent(new CustomEvent(`visual-review:ready`,{detail:p})),p):null}function z(e,t){if(!f(e))return;let n=_.get(t);if(!n)return;let[r,i,a]=n;T(r,i,a),S.get(i)===a&&S.delete(i),G(r,i,E,a)}function B(e,t){return!r&&i===e&&a===t&&!t.signal.aborted}function V(e){return!r&&i!==e?o:null}}function s(e,t){return JSON.stringify([M(e).buildId,t.pathname,t.search])}async function c(e){let{createHostedReviewRuntime:t}=await import(`./hosted-runtime-DHzdpdSj.js`);return t({serviceUrl:e})}async function l(e){return A(import(`./src-DX1bVKG6.js`),e,a,`리뷰 위젯을 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`)}async function u(e,t,n){let r=M(e),{createGeneratedSourceContextResolver:i}=await A(import(`./generated-source-context-C6kocvPg.js`),n,a,`리뷰 소스 정보를 불러오는 시간이 초과되었습니다. 다시 시도해 주세요.`);return i({build:r,sourceIndexBaseUrl:t})}function d(e,t){return e instanceof Error&&`code`in e&&e.code===t}function f(e){let t=e instanceof Error&&`code`in e?e.code:void 0;return typeof t==`string`&&/^INVITATION_(?:EXPIRED|NOT_FOUND|REQUIRED|REVOKED)$/.test(t)}const p=new WeakMap;function m(e,t){let n=p.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),h(e)},patchedReplaceState:function(t,n,r){i.call(this,t,n,r),h(e)},popstateListener:()=>h(e),subscribers:a,suppressionDepth:0},p.set(e,n),g(t,`pushState`,n.patchedPushState),g(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),_(n.history,`pushState`,n.patchedPushState,n.originalPushStateDescriptor),_(n.history,`replaceState`,n.patchedReplaceState,n.originalReplaceStateDescriptor),p.delete(e)))}}}function h(e){let t=p.get(e);if(!t||t.suppressionDepth>0)return;let n=y(e.location);[...t.subscribers].forEach(e=>e(n))}function g(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:!0,value:n})}function _(e,t,n,r){if(Object.getOwnPropertyDescriptor(e,t)?.value===n){if(r){Object.defineProperty(e,t,r);return}delete e[t]}}function v(e,t){return`${e.origin}\n${e.pathname}\n${D(t,e.href)??``}`}function y(e){return new URL(e.href)}function b(e){return e?{invitationId:e,source:`memory`}:null}function x(e){return e?{invitationId:e,source:`handoff`}:null}function S(e,t){return JSON.stringify([e,t])}function C(e,t,n=Date.now()){let i=S(e,t),a=r.get(i);if(a){if(a.expiresAt>n)return a.invitationId;clearTimeout(a.timeout),r.delete(i)}}function w(e,t,n,a=Date.now()){E(a);let o=S(e,t),s=r.get(o);for(s&&(clearTimeout(s.timeout),r.delete(o));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 c=a+i,l=setTimeout(()=>{r.get(o)?.expiresAt===c&&r.delete(o)},i);r.set(o,{invitationId:n,expiresAt:c,timeout:l})}function T(e,t,n){let i=S(e,t),a=r.get(i);a?.invitationId===n&&(clearTimeout(a.timeout),r.delete(i))}function E(e){for(let[t,n]of r)n.expiresAt>e||(clearTimeout(n.timeout),r.delete(t))}function ee(e,t,n,r){let i=D(t,n.href);if(i)return{invitationId:i,source:`url`};let a=U(r,K(e,n.origin));return a?{invitationId:a,source:`storage`}:q(n.hostname)?{invitationId:`local-preview`,source:`local-preview`}:null}function D(e,t){let n=new URL(t);return(n.searchParams.get(e)??n.searchParams.get(`agency-review`)??n.searchParams.get(`agency-review-invite`))?.trim()||null}function O(e){let t=new URL(window.location.href),n=new Set([e,`visual-review`,`agency-review`,`agency-review-invite`]),r=!1;n.forEach(e=>{t.searchParams.has(e)&&(t.searchParams.delete(e),r=!0)}),r&&window.history.replaceState(window.history.state,``,`${t.pathname}${t.search}${t.hash}`)}function k(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 A(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 j(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 M(e){let t=document.querySelector(`meta[name="visual-review-build"]`),n=document.querySelector(`meta[name="visual-review-commit"]`),r=V(F()),i=V(I());return{buildId:B(e?.buildId)??z(t)??r??`unversioned`,gitCommit:L(e,n,i),generatedAt:e?.generatedAt,mode:e?.mode??P(N())??(q(window.location.hostname)?`development`:`production`)}}function N(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_MODE}catch{return}}function P(e){return e===`development`||e===`preview`||e===`production`?e:void 0}function F(){try{return process.env.VISUAL_REVIEW_PUBLIC_BUILD_ID}catch{return}}function I(){try{return process.env.VISUAL_REVIEW_PUBLIC_GIT_COMMIT}catch{return}}function L(e,t,n){return e?.gitCommit===null?null:typeof e?.gitCommit==`string`?R(e.gitCommit):R(t?.content)??R(n)}function R(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 z(e){return V(e?.content)}function B(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 H(e,t,n,r){try{r?.setItem(K(e,n.origin),t)}catch{}}function U(e,t){try{return e?.getItem(t)??null}catch{return null}}function W(e){try{return e.localStorage}catch{return null}}function G(e,t,n,r){try{if(!n)return;let i=K(e,t),a=n.getItem(i);if(a===null||r!==void 0&&a!==r)return;n.removeItem(i)}catch{}}function K(e,t){return`visual-review:${e}:${t}:invitation`}function q(e){return e===`localhost`||e===`127.0.0.1`||e.endsWith(`.test`)||e.endsWith(`.local`)}function J(e,t,n,r){let i=e.shadowRoot??e.attachShadow({mode:`open`}),a=i.ownerDocument,o=a.createElement(`style`);n&&(o.nonce=n),o.textContent=te;let s=a.createElement(`strong`);s.textContent=`Visual Review를 시작할 수 없습니다`;let c=a.createElement(`span`);c.textContent=t;let l=a.createElement(`button`);l.type=`button`,l.textContent=`다시 시도`,l.addEventListener(`click`,()=>{l.disabled=!0,r?.()},{once:!0}),i.replaceChildren(o,s,c,l)}function Y(e,t){let n=e instanceof Error?e.message:String(e),r=Error(X(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:X(n,t)}),typeof i==`number`&&Number.isFinite(i)&&Object.defineProperty(r,"status",{configurable:!0,enumerable:!0,value:i})}return r}function X(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 Z(e,t){if(e!==void 0)return $(e);let n=t.currentScript,r=n?Q(n):void 0;if(r)return r;try{for(let e of t.querySelectorAll(`script[nonce],style[nonce]`)){let t=Q(e);if(t)return t}}catch{}}function Q(e){let t=`nonce`in e?e.nonce:void 0;return typeof t==`string`?$(t):void 0}function $(e){return e.trim()||void 0}const te=`:host{all:initial;position:fixed;right:18px;bottom:18px;z-index:2147483646;max-width:360px;padding:16px 18px;border:1px solid #efc4bd;border-radius:14px;background:#fff8f6;box-shadow:0 12px 40px rgba(0,0,0,.14);color:#7a271a;font:13px/1.5 Inter,ui-sans-serif,system-ui,sans-serif}strong{display:block;margin-bottom:4px;color:#53150d}span{display:block}button{margin-top:12px;padding:7px 10px;border:1px solid #d9a79f;border-radius:8px;background:#fff;color:#7a271a;font:650 12px/1 Inter,ui-sans-serif,system-ui,sans-serif;cursor:pointer}button:focus-visible{outline:2px solid #7a271a;outline-offset:2px}button:disabled{opacity:.55;cursor:wait}`;export{e as n,t as r,o as t};