@designfever/web-review-kit 0.1.0 → 0.3.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.
Files changed (45) hide show
  1. package/README.md +77 -179
  2. package/dist/{chunk-U5K2YGGL.js → chunk-I76WEDLA.js} +2248 -2722
  3. package/dist/chunk-I76WEDLA.js.map +1 -0
  4. package/dist/index.cjs +2346 -2603
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.d.cts +10 -6
  7. package/dist/index.d.ts +10 -6
  8. package/dist/index.js +220 -7
  9. package/dist/index.js.map +1 -1
  10. package/dist/react-shell.cjs +8953 -6632
  11. package/dist/react-shell.cjs.map +1 -1
  12. package/dist/react-shell.d.cts +8 -3
  13. package/dist/react-shell.d.ts +8 -3
  14. package/dist/react-shell.js +5956 -3636
  15. package/dist/react-shell.js.map +1 -1
  16. package/dist/{types-D_mNjOHx.d.cts → types-Cf2x5ky6.d.cts} +8 -14
  17. package/dist/{types-D_mNjOHx.d.ts → types-Cf2x5ky6.d.ts} +8 -14
  18. package/dist/vite.cjs +186 -0
  19. package/dist/vite.cjs.map +1 -0
  20. package/dist/vite.d.cts +16 -0
  21. package/dist/vite.d.ts +16 -0
  22. package/dist/vite.js +161 -0
  23. package/dist/vite.js.map +1 -0
  24. package/docs/README.md +21 -30
  25. package/docs/adaptor.sample.ts +182 -0
  26. package/docs/architecture.md +125 -0
  27. package/docs/db-setup.md +253 -0
  28. package/docs/figma-overlay.md +52 -0
  29. package/docs/grid-overlay.md +38 -0
  30. package/docs/installation.md +108 -40
  31. package/package.json +22 -6
  32. package/dist/chunk-U5K2YGGL.js.map +0 -1
  33. package/docs/adapter-handoff.md +0 -146
  34. package/docs/concept.md +0 -102
  35. package/docs/df-sheet-adapter.md +0 -336
  36. package/docs/df-sheet-next.md +0 -222
  37. package/docs/initial-plan.md +0 -226
  38. package/docs/package-split-checkpoint.md +0 -79
  39. package/docs/presence-handoff.md +0 -138
  40. package/docs/review-feedback-2026-06-20.md +0 -267
  41. package/docs/smoke-baseline-2026-06-20.md +0 -41
  42. package/docs/stabilize-ui-work-guide.md +0 -243
  43. package/docs/supabase-presence.md +0 -198
  44. package/docs/supabase-review-items.md +0 -365
  45. package/docs/supabase.md +0 -205
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react-shell.tsx","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/mergeClasses.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toKebabCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toCamelCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toPascalCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/defaultAttributes.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/hasA11yProp.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/context.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/Icon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/createLucideIcon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/circle-question-mark.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/copy.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/external-link.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/eye-off.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/eye.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/grip-vertical.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/image.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/layout-grid.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/list-filter.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/map.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/maximize-2.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/monitor.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/rectangle-horizontal.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/refresh-cw.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/ruler.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/scan.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/settings.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/smartphone.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/square-mouse-pointer.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/sticky-note.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/upload.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/users.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/x.ts","../src/status.ts","../src/react-shell/adapters.ts","../src/react-shell/style.ts","../src/route.ts","../src/adapters/local.ts","../src/core/overlay-style.ts","../src/core/review-scope.ts","../src/core/web-review-kit-app.ts","../src/react-shell/presence.ts","../src/react-shell/constants.ts","../src/react-shell/route.ts","../src/react-shell/viewport.ts","../src/react-shell/anchor-restore.ts","../src/react-shell/target.ts","../src/react-shell/ruler.ts","../src/react-shell/settings.ts","../src/react-shell/prompt.ts","../src/react-shell/shell-modals.tsx","../src/react-shell/topbar.tsx","../src/react-shell/pages.ts","../src/react-shell/supabase-presence.ts"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {\n CircleHelp as CircleHelpIcon,\n Copy as CopyIcon,\n ExternalLink as ExternalLinkIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n GripVertical as GripVerticalIcon,\n Image as ImageIcon,\n LayoutGrid as LayoutGridIcon,\n ListFilter as ListFilterIcon,\n Map as MapIcon,\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n RefreshCw as RefreshCwIcon,\n Ruler as RulerIcon,\n Scan as ScanIcon,\n Settings as SettingsIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n StickyNote as StickyNoteIcon,\n Upload as UploadIcon,\n Users as UsersIcon,\n X as XIcon\n} from 'lucide-react';\nimport { createRoot } from 'react-dom/client';\nimport { normalizeReviewShellAdapters } from './react-shell/adapters';\nimport { ensureReviewShellStyle } from './react-shell/style';\nimport {\n createWebReviewKit,\n getNumberedReviewItems,\n normalizeReviewItemStatus,\n type NumberedReviewItem,\n type ReviewItemScope,\n type ReviewSource,\n type ReviewItem,\n type ReviewItemStatus,\n type ReviewMode,\n type WebReviewKitController\n} from './index';\n\nimport type {\n ReviewPromptTab,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewQaFilter,\n ReviewRulerPoint,\n ReviewShellMountOptions,\n ReviewShellProps,\n ReviewShellStatusOption,\n ReviewShellTheme,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n TargetOverlayKey,\n TargetOverlayState,\n} from './react-shell/types';\nimport {\n getReviewPresenceColor,\n getReviewPresenceDisplayName,\n getReviewPresenceSessionId,\n} from './react-shell/presence';\nimport {\n DEFAULT_INITIAL_REVIEW_PROMPT,\n DEFAULT_REVIEW_THEME,\n FIGMA_OVERLAY_UNAVAILABLE_MESSAGE,\n FIGMA_TOKEN_STORAGE_KEY,\n FIGMA_TOKEN_GUIDE_ID,\n REVIEW_QA_FILTERS,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_THEME_OPTIONS,\n REVIEW_USER_ID_STORAGE_KEY,\n} from './react-shell/constants';\nimport {\n DEFAULT_REVIEW_PATH_PREFIX,\n buildTargetSrc,\n getFrameRouteTarget,\n getInitialItemId,\n getInitialSource,\n getInitialTarget,\n getItemTarget,\n normalizeTarget,\n updateShellUrl,\n updateShellUrlForItem,\n} from './react-shell/route';\nimport {\n DEFAULT_REVIEW_VIEWPORT_PRESETS,\n findViewportPreset,\n getInitialSize,\n getIsFigmaOverlayAvailable,\n getRestoredSize,\n getViewportPresetKind,\n toReviewViewportPresets,\n} from './react-shell/viewport';\nimport {\n getReviewItemRestoreScrollPosition,\n isAnchorRestorableReviewItem,\n queryReviewItemAnchorElement,\n setDocumentScrollInstantly,\n} from './react-shell/anchor-restore';\nimport {\n getTargetOverlayState,\n isEditableEventTarget,\n setTargetScrollbarHidden,\n} from './react-shell/target';\nimport { getRulerMeasure, getRulerPointFromRect } from './react-shell/ruler';\nimport {\n getStoredFigmaToken,\n getStoredReviewTheme,\n getStoredReviewUserId,\n getSystemReviewTheme,\n normalizeReviewTheme,\n writeStoredFigmaToken,\n writeStoredReviewTheme,\n writeStoredReviewUserId,\n} from './react-shell/settings';\nimport {\n buildReviewItemPrompt,\n formatDate,\n getItemTitle,\n getPromptLengthLabel,\n} from './react-shell/prompt';\nimport {\n PromptModal,\n ReviewSettingsModal,\n SitemapModal,\n} from './react-shell/shell-modals';\nimport { ReviewTopbar } from './react-shell/topbar';\n\nexport type {\n CreateReviewPagesOptions,\n ReviewShellAdapter,\n ReviewShellAdapters,\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewShellGlobEntries,\n ReviewShellMountOptions,\n ReviewShellPage,\n ReviewShellProps,\n ReviewShellStatusOption,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n} from './react-shell/types';\nexport { createReviewPagesFromGlob } from './react-shell/pages';\nexport { DEFAULT_REVIEW_VIEWPORT_PRESETS } from './react-shell/viewport';\nexport {\n createFallbackPresenceAdapter,\n createLocalPresenceAdapter,\n} from './react-shell/presence';\nexport type { LocalPresenceAdapterOptions } from './react-shell/presence';\nexport { createSupabasePresenceAdapter } from './react-shell/supabase-presence';\nexport type {\n SupabasePresenceAdapterOptions,\n SupabasePresenceClient,\n} from './react-shell/supabase-presence';\n\nconst ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nconst isDomReviewItem = (item: ReviewItem) =>\n isAnchorRestorableReviewItem(item);\n\nconst getReviewItemMode = (item: ReviewItem) =>\n isDomReviewItem(item) ? 'dom' : item.kind;\n\ntype SitemapItemsBySource = {\n local: ReviewItem[];\n remote: ReviewItem[];\n};\n\ntype SitemapQaCount = {\n local: number;\n remote: number;\n};\n\nconst createEmptySitemapQaCount = (): SitemapQaCount => ({\n local: 0,\n remote: 0,\n});\n\nconst getStatusOption = (\n status: ReviewItemStatus,\n statusOptions: readonly ReviewShellStatusOption[]\n) => {\n const normalizedStatus = normalizeReviewItemStatus(status);\n return (\n statusOptions.find((statusOption) => statusOption.value === status) ??\n statusOptions.find(\n (statusOption) => statusOption.value === normalizedStatus\n ) ??\n statusOptions[0]\n );\n};\n\nconst ReviewItemModeIcon = ({\n mode\n}: {\n mode: ReturnType<typeof getReviewItemMode>;\n}) => {\n if (mode === 'area') return <ScanIcon aria-hidden=\"true\" />;\n if (mode === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <StickyNoteIcon aria-hidden=\"true\" />;\n};\n\nconst getPresenceUserTarget = (\n user: ReviewPresenceUser,\n reviewPathPrefix: string\n) => normalizeTarget(user.target || user.routeKey, reviewPathPrefix);\n\nconst dedupePresenceUsersByPageAndId = (\n users: ReviewPresenceUser[],\n reviewPathPrefix: string\n) => {\n const userByPageAndId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const userId = user.userId.trim();\n if (!userId) return;\n\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const key = `${userTarget}::${userId}`;\n const currentUser = userByPageAndId.get(key);\n\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userByPageAndId.set(key, user);\n }\n });\n\n return Array.from(userByPageAndId.values());\n};\n\nfunction runWithAutoScrollBehavior(\n targetDocument: Document | undefined,\n callback: () => void\n) {\n const elements = [\n targetDocument?.documentElement,\n targetDocument?.body,\n ].filter((element): element is HTMLElement => Boolean(element));\n const previousValues = elements.map((element) => element.style.scrollBehavior);\n\n elements.forEach((element) => {\n element.style.scrollBehavior = 'auto';\n });\n\n try {\n callback();\n } finally {\n elements.forEach((element, index) => {\n element.style.scrollBehavior = previousValues[index] ?? '';\n });\n }\n}\n\nexport const ReviewShell = ({\n projectId,\n pages,\n adapters,\n presets = DEFAULT_REVIEW_VIEWPORT_PRESETS,\n ruler,\n initialPrompt = DEFAULT_INITIAL_REVIEW_PROMPT,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX,\n presence\n}: ReviewShellProps) => {\n const viewportPresets =\n presets.length > 0 ? presets : DEFAULT_REVIEW_VIEWPORT_PRESETS;\n const reviewViewportPresets = useMemo(\n () => toReviewViewportPresets(viewportPresets),\n [viewportPresets]\n );\n const normalizedAdapters = useMemo(\n () => normalizeReviewShellAdapters(adapters),\n [adapters]\n );\n const localAdapterEntry = normalizedAdapters.local;\n const remoteAdapterEntry = normalizedAdapters.remote;\n const [source, setSource] = useState<ReviewSource>(() =>\n getInitialSource(remoteAdapterEntry?.label)\n );\n const remoteSource = remoteAdapterEntry?.label ?? null;\n const isRemoteSource = Boolean(remoteSource && source === remoteSource);\n const activeAdapterEntry =\n isRemoteSource && remoteAdapterEntry\n ? remoteAdapterEntry\n : localAdapterEntry;\n const adapter = activeAdapterEntry.adapter;\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const frameScrollRef = useRef<HTMLDivElement | null>(null);\n const rulerOverlayRef = useRef<HTMLDivElement | null>(null);\n const rulerDragRectRef = useRef<DOMRect | null>(null);\n const isRulerDraggingRef = useRef(false);\n const controllerRef = useRef<WebReviewKitController | null>(null);\n const cleanupTargetRef = useRef<(() => void) | null>(null);\n const presenceSessionRef = useRef<ReviewPresenceSession | null>(null);\n const pendingRestoreRef = useRef<ReviewItem | null>(null);\n const pendingInitialItemIdRef = useRef(getInitialItemId());\n const selectedItemIdRef = useRef(getInitialItemId());\n const hiddenOverlayItemIdListRef = useRef<string[]>([]);\n const [target, setTarget] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [draftTarget, setDraftTarget] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [activeRoute, setActiveRoute] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [size, setSize] = useState<ReviewShellViewportPreset>(() =>\n getInitialSize(viewportPresets)\n );\n const [items, setItems] = useState<ReviewItem[]>([]);\n const [mode, setMode] = useState<ReviewMode>('idle');\n const [targetOverlayState, setTargetOverlayState] =\n useState<TargetOverlayState>({\n grid: false,\n figma: false\n });\n const [selectedItemId, setSelectedItemId] = useState(getInitialItemId());\n const [hiddenOverlayItemIds, setHiddenOverlayItemIds] = useState<\n Set<string>\n >(() => new Set());\n const [isListVisible, setIsListVisible] = useState(true);\n const [isSitemapOpen, setIsSitemapOpen] = useState(false);\n const [isFigmaSettingsOpen, setIsFigmaSettingsOpen] = useState(false);\n const [figmaTokenDraft, setFigmaTokenDraft] = useState(getStoredFigmaToken);\n const [reviewUserId, setReviewUserId] = useState(getStoredReviewUserId);\n const [reviewUserIdDraft, setReviewUserIdDraft] = useState(\n getStoredReviewUserId\n );\n const [reviewTheme, setReviewTheme] = useState(getStoredReviewTheme);\n const [reviewThemeDraft, setReviewThemeDraft] =\n useState(getStoredReviewTheme);\n const [systemReviewTheme, setSystemReviewTheme] =\n useState(getSystemReviewTheme);\n const [figmaSettingsStatus, setFigmaSettingsStatus] = useState('');\n const [isFigmaTokenVisible, setIsFigmaTokenVisible] = useState(false);\n const [isFigmaTokenGuideOpen, setIsFigmaTokenGuideOpen] = useState(false);\n const [qaFilter, setQaFilter] = useState<ReviewQaFilter>('all');\n const [copyLabel, setCopyLabel] = useState('Copy URL');\n const [sitemapItems, setSitemapItems] = useState<SitemapItemsBySource>(() => ({\n local: [],\n remote: [],\n }));\n const [isRulerVisible, setIsRulerVisible] = useState(false);\n const [rulerStart, setRulerStart] = useState<ReviewRulerPoint | null>(null);\n const [rulerPoint, setRulerPoint] = useState<ReviewRulerPoint | null>(null);\n const [rulerHover, setRulerHover] = useState<ReviewRulerPoint | null>(null);\n const [isRulerDragging, setIsRulerDragging] = useState(false);\n const [promptItemId, setPromptItemId] = useState<string | null>(null);\n const [promptTab, setPromptTab] = useState<ReviewPromptTab>('item');\n const [copiedPromptKey, setCopiedPromptKey] = useState<string | null>(null);\n const [presenceUsers, setPresenceUsers] = useState<ReviewPresenceUser[]>([]);\n const [presenceSessionVersion, setPresenceSessionVersion] = useState(0);\n const presenceSessionId = useMemo(getReviewPresenceSessionId, []);\n const targetRef = useRef(target);\n const sizeRef = useRef(size);\n\n const effectiveReviewTheme =\n reviewTheme === 'system' ? systemReviewTheme : reviewTheme;\n const isFigmaOverlayAvailable = getIsFigmaOverlayAvailable(size);\n const isRulerAvailable =\n ruler?.enabled !== false &&\n typeof size.designWidth === 'number' &&\n size.designWidth > 0;\n const rulerUnit = ruler?.unit ?? 'px';\n const rulerScaleX =\n isRulerAvailable && size.designWidth\n ? size.width / size.designWidth\n : 1;\n const rulerScaleY =\n size.designHeight && size.designHeight > 0\n ? size.height / size.designHeight\n : rulerScaleX;\n const rulerMeasure = useMemo(\n () => getRulerMeasure(rulerStart, rulerPoint),\n [rulerPoint, rulerStart]\n );\n const rulerMeasureLabel = useMemo(() => {\n if (!rulerMeasure) return '';\n\n const designWidth = Math.round(rulerMeasure.width / rulerScaleX);\n const designHeight = Math.round(rulerMeasure.height / rulerScaleY);\n\n return `Figma ${designWidth}x${designHeight}${rulerUnit}`;\n }, [rulerMeasure, rulerScaleX, rulerScaleY, rulerUnit]);\n const targetSrc = useMemo(() => buildTargetSrc(target), [target]);\n const pageTargets = useMemo(\n () =>\n new Set(\n pages.map((page) => normalizeTarget(page.href, reviewPathPrefix))\n ),\n [pages, reviewPathPrefix]\n );\n const activeItems = useMemo(\n () =>\n items\n .filter((item) => getItemTarget(item, reviewPathPrefix) === activeRoute)\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)),\n [activeRoute, items, reviewPathPrefix]\n );\n const numberedActiveItems = useMemo(\n () => getNumberedReviewItems(activeItems, reviewViewportPresets),\n [activeItems, reviewViewportPresets]\n );\n const filteredNumberedActiveItems = useMemo(\n () =>\n qaFilter === 'all'\n ? numberedActiveItems\n : numberedActiveItems.filter(\n (numberedItem) => numberedItem.scope === qaFilter\n ),\n [numberedActiveItems, qaFilter]\n );\n const hiddenOverlayItemIdList = useMemo(\n () => Array.from(hiddenOverlayItemIds),\n [hiddenOverlayItemIds]\n );\n const qaFilterCounts = useMemo(() => {\n const counts = new Map<ReviewQaFilter, number>();\n counts.set('all', numberedActiveItems.length);\n numberedActiveItems.forEach((numberedItem) => {\n counts.set(numberedItem.scope, (counts.get(numberedItem.scope) ?? 0) + 1);\n });\n return counts;\n }, [numberedActiveItems]);\n const getItemPresetScope = useCallback(\n (item: ReviewItem) =>\n getViewportPresetKind(\n findViewportPreset(\n viewportPresets,\n item.viewport?.width ?? 0,\n item.viewport?.height ?? 0\n )\n ),\n [viewportPresets]\n );\n const presetScopeCounts = useMemo(() => {\n const counts = new Map<ReviewShellViewportKind, number>();\n activeItems.forEach((item) => {\n const scope = getItemPresetScope(item);\n counts.set(scope, (counts.get(scope) ?? 0) + 1);\n });\n return counts;\n }, [activeItems, getItemPresetScope]);\n const currentPresetScope = getViewportPresetKind(size);\n const pageQaCounts = useMemo(() => {\n const counts = new Map<string, SitemapQaCount>();\n const addItems = (\n sourceKey: keyof SitemapItemsBySource,\n sourceItems: ReviewItem[]\n ) => {\n sourceItems.forEach((item) => {\n const pageTarget = normalizeTarget(\n getItemTarget(item, reviewPathPrefix),\n reviewPathPrefix\n );\n const count = counts.get(pageTarget) ?? createEmptySitemapQaCount();\n count[sourceKey] += 1;\n counts.set(pageTarget, count);\n });\n };\n\n addItems('local', sitemapItems.local);\n addItems('remote', sitemapItems.remote);\n\n return counts;\n }, [reviewPathPrefix, sitemapItems]);\n const promptDialogNumberedItem = useMemo(\n () =>\n promptItemId\n ? numberedActiveItems.find(\n (numberedItem) => numberedItem.item.id === promptItemId\n )\n : undefined,\n [numberedActiveItems, promptItemId]\n );\n const selectedNumberedItem = useMemo(\n () =>\n selectedItemId\n ? numberedActiveItems.find(\n (numberedItem) => numberedItem.item.id === selectedItemId\n )\n : undefined,\n [numberedActiveItems, selectedItemId]\n );\n const initialPromptText = initialPrompt.trim();\n const promptDialogItemPrompt = promptDialogNumberedItem\n ? buildReviewItemPrompt(promptDialogNumberedItem, reviewPathPrefix)\n : '';\n const promptDialogItemCopyKey = promptDialogNumberedItem\n ? `dialog:${promptDialogNumberedItem.item.id}`\n : 'dialog:item';\n const promptDialogActiveText =\n promptTab === 'initial' ? initialPromptText : promptDialogItemPrompt;\n const promptDialogActiveLabel =\n promptTab === 'initial' ? 'Initial prompt' : 'This QA prompt';\n const promptDialogActiveCopyKey =\n promptTab === 'initial' ? 'initial' : promptDialogItemCopyKey;\n const normalizedReviewUserId = reviewUserId.trim();\n const presenceDisplayName = getReviewPresenceDisplayName(\n normalizedReviewUserId\n );\n const presenceColor = getReviewPresenceColor(\n normalizedReviewUserId || presenceSessionId\n );\n const presenceViewport = useMemo(\n () => ({\n label: size.label,\n width: size.width,\n height: size.height,\n kind: getViewportPresetKind(size),\n }),\n [size]\n );\n const presenceStatus: ReviewPresenceStatus =\n mode === 'idle' ? 'reviewing' : 'editing';\n const visiblePresenceUsers = useMemo(\n () => {\n const projectPresenceUsers = presenceUsers.filter(\n (user) => user.projectId === projectId && user.userId.trim()\n );\n\n return dedupePresenceUsersByPageAndId(\n projectPresenceUsers,\n reviewPathPrefix\n );\n },\n [presenceUsers, projectId, reviewPathPrefix]\n );\n const currentPagePresenceUsers = useMemo(\n () =>\n visiblePresenceUsers.filter((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n\n return userTarget === activeRoute;\n }),\n [activeRoute, reviewPathPrefix, visiblePresenceUsers]\n );\n const pagePresenceUsers = useMemo(() => {\n const usersByTarget = new Map<string, ReviewPresenceUser[]>();\n\n visiblePresenceUsers.forEach((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const pageUsers = usersByTarget.get(userTarget) ?? [];\n\n pageUsers.push(user);\n usersByTarget.set(userTarget, pageUsers);\n });\n\n return usersByTarget;\n }, [reviewPathPrefix, visiblePresenceUsers]);\n\n const getCurrentPresenceState = useCallback(\n (): ReviewPresenceState => ({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n routeKey: activeRoute,\n target: activeRoute,\n source,\n viewport: presenceViewport,\n mode,\n selectedItemId: selectedNumberedItem?.item.id ?? null,\n selectedReviewNumber: selectedNumberedItem?.number ?? null,\n status: presenceStatus,\n updatedAt: new Date().toISOString(),\n }),\n [\n activeRoute,\n mode,\n normalizedReviewUserId,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n presenceStatus,\n presenceViewport,\n projectId,\n selectedNumberedItem,\n source,\n ]\n );\n\n const refreshItems = useCallback(async () => {\n const nextItems = await adapter.list({\n projectId,\n pageId: activeAdapterEntry.pageId,\n routeKey: isRemoteSource ? activeRoute : undefined\n });\n setItems(nextItems);\n return nextItems;\n }, [activeAdapterEntry.pageId, activeRoute, adapter, isRemoteSource, projectId]);\n\n const refreshSitemapItems = useCallback(async () => {\n const [localResult, remoteResult] = await Promise.allSettled([\n localAdapterEntry.adapter.list({\n projectId,\n pageId: localAdapterEntry.pageId,\n }),\n remoteAdapterEntry\n ? remoteAdapterEntry.adapter.list({\n projectId,\n pageId: remoteAdapterEntry.pageId,\n source: remoteAdapterEntry.label,\n })\n : Promise.resolve([]),\n ]);\n\n setSitemapItems({\n local: localResult.status === 'fulfilled' ? localResult.value : [],\n remote: remoteResult.status === 'fulfilled' ? remoteResult.value : [],\n });\n }, [localAdapterEntry, projectId, remoteAdapterEntry]);\n\n const refreshReviewData = useCallback(async () => {\n await controllerRef.current?.reload();\n await Promise.all([refreshItems(), refreshSitemapItems()]);\n }, [refreshItems, refreshSitemapItems]);\n\n const clearSelectedItem = useCallback(() => {\n pendingRestoreRef.current = null;\n selectedItemIdRef.current = null;\n setSelectedItemId(null);\n controllerRef.current?.highlightItem(undefined);\n }, []);\n\n const toggleItemOverlayVisibility = useCallback(\n (itemId: string) => {\n const nextHiddenItemIds = new Set(hiddenOverlayItemIds);\n if (nextHiddenItemIds.has(itemId)) {\n nextHiddenItemIds.delete(itemId);\n } else {\n nextHiddenItemIds.add(itemId);\n }\n\n const nextHiddenItemIdList = Array.from(nextHiddenItemIds);\n\n setHiddenOverlayItemIds(nextHiddenItemIds);\n const controller = controllerRef.current;\n controller?.setHiddenItemIds(nextHiddenItemIdList);\n hiddenOverlayItemIdListRef.current = nextHiddenItemIdList;\n },\n [hiddenOverlayItemIds]\n );\n\n const destroyReviewKit = useCallback(() => {\n cleanupTargetRef.current?.();\n cleanupTargetRef.current = null;\n controllerRef.current?.destroy();\n controllerRef.current = null;\n }, []);\n\n const syncTargetViewport = useCallback(() => {\n window.dispatchEvent(new Event('resize'));\n }, []);\n\n const refreshTargetOverlayState = useCallback(() => {\n setTargetOverlayState(\n getTargetOverlayState(iframeRef.current?.contentDocument ?? undefined)\n );\n }, []);\n\n const dispatchTargetOverlayHotkey = useCallback(\n (overlay: TargetOverlayKey) => {\n const targetWindow = iframeRef.current?.contentWindow;\n if (!targetWindow) return false;\n\n const code = overlay === 'grid' ? 'KeyG' : 'KeyF';\n targetWindow.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n cancelable: true,\n code,\n key: code.replace('Key', '').toLowerCase(),\n shiftKey: true\n })\n );\n window.setTimeout(refreshTargetOverlayState, 80);\n return true;\n },\n [refreshTargetOverlayState]\n );\n\n const toggleTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n if (overlay === 'figma' && !isFigmaOverlayAvailable) {\n refreshTargetOverlayState();\n return;\n }\n\n dispatchTargetOverlayHotkey(overlay);\n },\n [\n dispatchTargetOverlayHotkey,\n isFigmaOverlayAvailable,\n refreshTargetOverlayState\n ]\n );\n\n const closeTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n const currentState = getTargetOverlayState(\n iframeRef.current?.contentDocument ?? undefined\n );\n setTargetOverlayState(currentState);\n if (!currentState[overlay]) return false;\n\n return dispatchTargetOverlayHotkey(overlay);\n },\n [dispatchTargetOverlayHotkey]\n );\n\n const syncShellTarget = useCallback(\n (nextTarget: string) => {\n const normalizedTarget = normalizeTarget(nextTarget, reviewPathPrefix);\n\n if (normalizedTarget !== targetRef.current) {\n clearSelectedItem();\n targetRef.current = normalizedTarget;\n setTarget(normalizedTarget);\n setDraftTarget(normalizedTarget);\n setActiveRoute(normalizedTarget);\n }\n\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n normalizedTarget,\n sizeRef.current,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n }\n },\n [clearSelectedItem, reviewPathPrefix, source]\n );\n\n const applyItemScroll = useCallback(\n (item: ReviewItem) => {\n if (selectedItemIdRef.current !== item.id) return;\n\n const targetWindow = iframeRef.current?.contentWindow;\n const targetDocument = iframeRef.current?.contentDocument;\n if (!targetWindow) return;\n\n const anchorElement = targetDocument\n ? queryReviewItemAnchorElement(targetDocument, item)\n : undefined;\n\n runWithAutoScrollBehavior(targetDocument ?? undefined, () => {\n if (!targetDocument) return;\n\n setDocumentScrollInstantly(\n targetWindow,\n targetDocument,\n getReviewItemRestoreScrollPosition(\n targetWindow,\n targetDocument,\n item,\n anchorElement\n )\n );\n });\n syncTargetViewport();\n controllerRef.current?.highlightItem(item.id);\n },\n [syncTargetViewport]\n );\n\n const applyPendingRestore = useCallback(() => {\n const item = pendingRestoreRef.current;\n if (!item) return;\n\n applyItemScroll(item);\n pendingRestoreRef.current = null;\n }, [applyItemScroll]);\n\n const cancelReviewMode = useCallback(() => {\n const controller = controllerRef.current;\n if (!controller || controller.getMode() === 'idle') return false;\n\n controller.setMode('idle');\n setMode(controller.getMode());\n return true;\n }, []);\n\n const clearRulerMeasure = useCallback(() => {\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setRulerStart(null);\n setRulerPoint(null);\n setRulerHover(null);\n setIsRulerDragging(false);\n }, []);\n\n const closeRuler = useCallback(() => {\n if (!isRulerVisible) return false;\n\n setIsRulerVisible(false);\n clearRulerMeasure();\n return true;\n }, [clearRulerMeasure, isRulerVisible]);\n\n const toggleRuler = useCallback(() => {\n if (!isRulerAvailable) return;\n\n cancelReviewMode();\n setIsSitemapOpen(false);\n setIsFigmaSettingsOpen(false);\n setPromptItemId(null);\n clearRulerMeasure();\n setIsRulerVisible((current) => !current);\n }, [cancelReviewMode, clearRulerMeasure, isRulerAvailable]);\n\n const finishRulerDrag = useCallback((point?: ReviewRulerPoint) => {\n if (point) {\n setRulerPoint(point);\n }\n\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setIsRulerDragging(false);\n }, []);\n\n const startRulerDrag = useCallback(\n (clientX: number, clientY: number, rect: DOMRect) => {\n const point = getRulerPointFromRect(clientX, clientY, rect);\n\n rulerDragRectRef.current = rect;\n isRulerDraggingRef.current = true;\n\n setRulerStart(point);\n setRulerPoint(point);\n setIsRulerDragging(true);\n },\n []\n );\n\n const reloadTargetFrame = useCallback(() => {\n try {\n iframeRef.current?.contentWindow?.location.reload();\n } catch {\n return;\n }\n }, []);\n\n const openFigmaSettings = useCallback(() => {\n cancelReviewMode();\n setIsSitemapOpen(false);\n setPromptItemId(null);\n setFigmaTokenDraft(getStoredFigmaToken());\n setReviewUserIdDraft(getStoredReviewUserId());\n setReviewThemeDraft(reviewTheme);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n setIsFigmaSettingsOpen(true);\n }, [cancelReviewMode, reviewTheme]);\n\n const closeFigmaSettings = useCallback(() => {\n setIsFigmaSettingsOpen(false);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n }, []);\n\n const saveReviewSettings = useCallback(\n (token: string, userId: string, theme: ReviewShellTheme) => {\n const nextToken = token.trim();\n const nextUserId = userId.trim();\n const nextTheme = normalizeReviewTheme(theme);\n const shouldReload =\n nextToken !== getStoredFigmaToken() ||\n nextUserId !== getStoredReviewUserId();\n\n writeStoredFigmaToken(nextToken);\n writeStoredReviewUserId(nextUserId);\n writeStoredReviewTheme(nextTheme);\n setFigmaTokenDraft(nextToken);\n setReviewUserId(nextUserId);\n setReviewUserIdDraft(nextUserId);\n setReviewTheme(nextTheme);\n setReviewThemeDraft(nextTheme);\n setFigmaSettingsStatus(\n nextToken || nextUserId || nextTheme !== DEFAULT_REVIEW_THEME\n ? 'Saved'\n : 'Cleared'\n );\n\n if (shouldReload) {\n reloadTargetFrame();\n }\n },\n [reloadTargetFrame]\n );\n\n const restoreReviewItem = useCallback(\n (item: ReviewItem) => {\n const nextTarget = getItemTarget(item, reviewPathPrefix);\n const nextSize = getRestoredSize(item, viewportPresets);\n\n pendingRestoreRef.current = item;\n selectedItemIdRef.current = item.id;\n setSelectedItemId(item.id);\n setActiveRoute(nextTarget);\n setDraftTarget(nextTarget);\n setSize(nextSize);\n updateShellUrlForItem(nextTarget, nextSize, item.id, source);\n\n if (targetRef.current !== nextTarget) {\n setTarget(nextTarget);\n return;\n }\n\n applyPendingRestore();\n },\n [applyPendingRestore, viewportPresets, reviewPathPrefix, source]\n );\n\n const restoreInitialItem = useCallback(async () => {\n const itemId = pendingInitialItemIdRef.current;\n if (!itemId) return;\n\n pendingInitialItemIdRef.current = null;\n\n const item = await adapter.get(itemId);\n if (item) {\n restoreReviewItem(item);\n }\n }, [adapter, restoreReviewItem]);\n\n const initReviewKit = useCallback(() => {\n destroyReviewKit();\n\n const iframe = iframeRef.current;\n const targetWindow = iframe?.contentWindow;\n const targetDocument = iframe?.contentDocument;\n if (!iframe || !targetWindow || !targetDocument) return;\n\n const syncRouteFromFrame = () => {\n const nextTarget = getFrameRouteTarget(targetWindow, reviewPathPrefix);\n if (nextTarget !== targetRef.current && !pageTargets.has(nextTarget)) {\n return;\n }\n\n syncShellTarget(nextTarget);\n };\n\n const handleClick = (event: MouseEvent) => {\n if (event.defaultPrevented || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n const targetElement = event.target;\n if (!targetElement || !('closest' in targetElement)) return;\n\n const link = (targetElement as Element).closest('a[href]');\n const href = link?.getAttribute('href');\n const linkTarget = link?.getAttribute('target');\n if (!href || (linkTarget && linkTarget !== '_self')) return;\n\n const url = new URL(href, targetWindow.location.href);\n if (url.origin !== targetWindow.location.origin) return;\n\n const nextTarget = normalizeTarget(url.pathname, reviewPathPrefix);\n if (nextTarget === targetRef.current) return;\n\n event.preventDefault();\n syncShellTarget(nextTarget);\n };\n\n const handleFrameKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n if (!cancelReviewMode() && !closeRuler()) return;\n\n event.preventDefault();\n event.stopPropagation();\n };\n\n const history = targetWindow.history;\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<History['pushState']>) => {\n originalPushState(...args);\n syncRouteFromFrame();\n };\n history.replaceState = (...args: Parameters<History['replaceState']>) => {\n originalReplaceState(...args);\n syncRouteFromFrame();\n };\n\n syncRouteFromFrame();\n targetWindow.addEventListener('popstate', syncRouteFromFrame);\n targetWindow.addEventListener('hashchange', syncRouteFromFrame);\n targetWindow.addEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.addEventListener('click', handleClick, true);\n targetWindow.addEventListener('scroll', syncTargetViewport, true);\n targetWindow.addEventListener('resize', syncTargetViewport);\n cleanupTargetRef.current = () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n targetWindow.removeEventListener('popstate', syncRouteFromFrame);\n targetWindow.removeEventListener('hashchange', syncRouteFromFrame);\n targetWindow.removeEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.removeEventListener('click', handleClick, true);\n targetWindow.removeEventListener('scroll', syncTargetViewport, true);\n targetWindow.removeEventListener('resize', syncTargetViewport);\n };\n\n controllerRef.current = createWebReviewKit({\n projectId,\n adapter,\n target: () => {\n const frame = iframeRef.current;\n const frameWindow = frame?.contentWindow;\n const frameDocument = frame?.contentDocument;\n\n if (!frame || !frameWindow || !frameDocument) return undefined;\n\n return {\n window: frameWindow,\n document: frameDocument,\n getViewportRect: () => frame.getBoundingClientRect(),\n getOverlayRect: () => {\n const frameRect = frame.getBoundingClientRect();\n const scrollRect = frameScrollRef.current?.getBoundingClientRect();\n if (!scrollRect) return frameRect;\n\n const left = Math.max(frameRect.left, scrollRect.left);\n const top = Math.max(frameRect.top, scrollRect.top);\n const right = Math.min(\n frameRect.left + frameRect.width,\n scrollRect.left + scrollRect.width\n );\n const bottom = Math.min(\n frameRect.top + frameRect.height,\n scrollRect.top + scrollRect.height\n );\n\n return {\n left,\n top,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top)\n };\n }\n };\n },\n hotkeys: {\n qa: 'Shift+Q'\n },\n anchors: {\n attribute: 'data-qa-id'\n },\n viewports: {\n presets: reviewViewportPresets\n },\n ruler,\n onRestoreItem: restoreReviewItem,\n onItemsChange: () => {\n void refreshItems();\n },\n onModeChange: setMode,\n ui: {\n panel: false\n },\n modules: {\n qa: true,\n grid: false,\n figma: false\n }\n });\n controllerRef.current.open();\n controllerRef.current.setHiddenItemIds(hiddenOverlayItemIdListRef.current);\n setMode(controllerRef.current.getMode());\n void refreshItems();\n void restoreInitialItem();\n applyPendingRestore();\n refreshTargetOverlayState();\n setTargetScrollbarHidden(\n targetDocument,\n getViewportPresetKind(sizeRef.current) === 'mobile'\n );\n }, [\n adapter,\n applyPendingRestore,\n cancelReviewMode,\n closeRuler,\n destroyReviewKit,\n projectId,\n pageTargets,\n refreshItems,\n refreshTargetOverlayState,\n reviewViewportPresets,\n restoreInitialItem,\n restoreReviewItem,\n ruler,\n reviewPathPrefix,\n syncShellTarget,\n syncTargetViewport\n ]);\n\n useEffect(() => destroyReviewKit, [destroyReviewKit]);\n\n useEffect(() => {\n if (!presence || !normalizedReviewUserId) {\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n return undefined;\n }\n\n let isActive = true;\n let unsubscribe: (() => void) | undefined;\n const initialState = getCurrentPresenceState();\n\n void Promise.resolve(\n presence.connect({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n initialState,\n })\n ).then((session) => {\n if (!isActive) {\n void session.disconnect();\n return;\n }\n\n presenceSessionRef.current = session;\n unsubscribe = session.subscribe(setPresenceUsers);\n setPresenceSessionVersion((current) => current + 1);\n void session.update(initialState);\n }).catch(() => {\n if (!isActive) return;\n\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n });\n\n return () => {\n isActive = false;\n unsubscribe?.();\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n };\n }, [\n normalizedReviewUserId,\n presence,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n projectId,\n ]);\n\n useEffect(() => {\n const session = presenceSessionRef.current;\n if (!session || !normalizedReviewUserId) return;\n\n void session.update(getCurrentPresenceState());\n }, [\n getCurrentPresenceState,\n normalizedReviewUserId,\n presenceSessionVersion,\n ]);\n\n useEffect(() => {\n const frameDocument = iframeRef.current?.contentDocument;\n if (!frameDocument || frameDocument.readyState !== 'complete') return;\n initReviewKit();\n }, [initReviewKit]);\n\n useEffect(() => {\n void refreshItems();\n }, [refreshItems]);\n\n useEffect(() => {\n void refreshSitemapItems();\n }, [refreshSitemapItems]);\n\n useEffect(() => {\n if (!isSitemapOpen) return;\n void refreshSitemapItems();\n }, [isSitemapOpen, refreshSitemapItems]);\n\n useEffect(() => {\n hiddenOverlayItemIdListRef.current = hiddenOverlayItemIdList;\n controllerRef.current?.setHiddenItemIds(hiddenOverlayItemIdList);\n }, [hiddenOverlayItemIdList]);\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return undefined;\n\n const query = window.matchMedia('(prefers-color-scheme: light)');\n const syncSystemTheme = () => {\n setSystemReviewTheme(query.matches ? 'light' : 'dark');\n };\n\n syncSystemTheme();\n\n if (query.addEventListener) {\n query.addEventListener('change', syncSystemTheme);\n return () => query.removeEventListener('change', syncSystemTheme);\n }\n\n query.addListener(syncSystemTheme);\n return () => query.removeListener(syncSystemTheme);\n }, []);\n\n useEffect(() => {\n document.body.classList.toggle(\n 'df-review-theme-light',\n effectiveReviewTheme === 'light'\n );\n document.body.classList.toggle(\n 'df-review-theme-dark',\n effectiveReviewTheme === 'dark'\n );\n\n return () => {\n document.body.classList.remove(\n 'df-review-theme-light',\n 'df-review-theme-dark'\n );\n };\n }, [effectiveReviewTheme]);\n\n useEffect(() => {\n if (\n mode === 'idle' &&\n !isRulerVisible &&\n !promptItemId &&\n !isSitemapOpen &&\n !isFigmaSettingsOpen\n ) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n\n if (mode !== 'idle' && cancelReviewMode()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (closeRuler()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (promptItemId) {\n setPromptItemId(null);\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isSitemapOpen) {\n setIsSitemapOpen(false);\n return;\n }\n\n if (isFigmaSettingsOpen) {\n closeFigmaSettings();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [\n cancelReviewMode,\n closeRuler,\n closeFigmaSettings,\n isFigmaSettingsOpen,\n isRulerVisible,\n isSitemapOpen,\n promptItemId,\n mode\n ]);\n\n useEffect(() => {\n targetRef.current = target;\n setActiveRoute(target);\n }, [target]);\n\n useEffect(() => {\n sizeRef.current = size;\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n targetRef.current,\n size,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(targetRef.current, size, source);\n }\n syncTargetViewport();\n setTargetScrollbarHidden(\n iframeRef.current?.contentDocument,\n getViewportPresetKind(size) === 'mobile'\n );\n }, [size, source, syncTargetViewport]);\n\n useEffect(() => {\n const frameScroll = frameScrollRef.current;\n if (!frameScroll) return undefined;\n\n const centerFrameScroll = () => {\n frameScroll.scrollLeft = Math.max(\n 0,\n (frameScroll.scrollWidth - frameScroll.clientWidth) / 2\n );\n frameScroll.scrollTop = 0;\n };\n\n const animationFrame = window.requestAnimationFrame(centerFrameScroll);\n const transitionTimeout = window.setTimeout(centerFrameScroll, 180);\n\n return () => {\n window.cancelAnimationFrame(animationFrame);\n window.clearTimeout(transitionTimeout);\n };\n }, [isListVisible, size.height, size.width, targetSrc]);\n\n useEffect(() => {\n if (isFigmaOverlayAvailable || !targetOverlayState.figma) return;\n\n dispatchTargetOverlayHotkey('figma');\n }, [\n dispatchTargetOverlayHotkey,\n isFigmaOverlayAvailable,\n targetOverlayState.figma\n ]);\n\n useEffect(() => {\n if (!isRulerVisible || !isRulerAvailable) return undefined;\n\n const getRulerEventClientPoint = (event: MouseEvent) => {\n const frame = iframeRef.current;\n let isFrameEvent = false;\n\n try {\n isFrameEvent =\n Boolean(frame?.contentWindow) && event.view === frame?.contentWindow;\n\n if (!isFrameEvent && frame?.contentDocument) {\n const targetDocument = (\n event.target as { ownerDocument?: Document } | null\n )?.ownerDocument;\n isFrameEvent = targetDocument === frame.contentDocument;\n }\n } catch {\n isFrameEvent = false;\n }\n\n if (isFrameEvent && frame) {\n const frameRect = frame.getBoundingClientRect();\n\n return {\n clientX: event.clientX + frameRect.left,\n clientY: event.clientY + frameRect.top\n };\n }\n\n return {\n clientX: event.clientX,\n clientY: event.clientY\n };\n };\n\n const snapDesign = (screen: number, axis: 'x' | 'y') => {\n const current = sizeRef.current;\n const scaleX = current.designWidth\n ? current.width / current.designWidth\n : 1;\n const scale =\n axis === 'y'\n ? current.designHeight\n ? current.height / current.designHeight\n : scaleX\n : scaleX;\n return Math.round(Math.round(screen / scale) * scale);\n };\n\n const getActiveRulerPoint = (event: MouseEvent) => {\n const rect =\n rulerDragRectRef.current ??\n rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return undefined;\n\n const point = getRulerEventClientPoint(event);\n const snapped = getRulerPointFromRect(point.clientX, point.clientY, rect);\n\n return { x: snapDesign(snapped.x, 'x'), y: snapDesign(snapped.y, 'y') };\n };\n\n const getHoverRulerPoint = (event: MouseEvent) => {\n const rect = rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return null;\n\n const { clientX, clientY } = getRulerEventClientPoint(event);\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n if (x < 0 || y < 0 || x > rect.width || y > rect.height) return null;\n\n return { x: snapDesign(x, 'x'), y: snapDesign(y, 'y') };\n };\n\n const handleDragStart: EventListener = (event) => {\n if (isRulerDraggingRef.current) return;\n\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.button !== 0) return;\n\n const overlay = rulerOverlayRef.current;\n const target = mouseEvent.target;\n if (!overlay || !(target instanceof Node) || !overlay.contains(target)) {\n return;\n }\n\n event.preventDefault();\n startRulerDrag(\n mouseEvent.clientX,\n mouseEvent.clientY,\n overlay.getBoundingClientRect()\n );\n };\n\n const handlePointerMove: EventListener = (event) => {\n const mouseEvent = event as MouseEvent;\n\n if (isRulerDraggingRef.current) {\n const point = getActiveRulerPoint(mouseEvent);\n if (!point) return;\n\n mouseEvent.preventDefault();\n setRulerPoint(point);\n setRulerHover(point);\n return;\n }\n\n setRulerHover(getHoverRulerPoint(mouseEvent));\n };\n\n const handleDragEnd: EventListener = (event) => {\n if (!isRulerDraggingRef.current) return;\n\n const point = getActiveRulerPoint(event as MouseEvent);\n event.preventDefault();\n finishRulerDrag(point);\n };\n\n const handleWindowBlur = () => {\n if (!isRulerDraggingRef.current) return;\n\n finishRulerDrag();\n };\n\n const dragTargets = new Set<EventTarget>([window]);\n const frame = iframeRef.current;\n\n try {\n if (frame?.contentWindow) dragTargets.add(frame.contentWindow);\n if (frame?.contentDocument) dragTargets.add(frame.contentDocument);\n } catch {\n // Cross-origin frames cannot expose their document. Parent listeners still run.\n }\n\n dragTargets.forEach((target) => {\n target.addEventListener('mousedown', handleDragStart, true);\n target.addEventListener('mousemove', handlePointerMove, true);\n target.addEventListener('mouseup', handleDragEnd, true);\n });\n\n window.addEventListener('blur', handleWindowBlur);\n\n return () => {\n dragTargets.forEach((target) => {\n target.removeEventListener('mousedown', handleDragStart, true);\n target.removeEventListener('mousemove', handlePointerMove, true);\n target.removeEventListener('mouseup', handleDragEnd, true);\n });\n window.removeEventListener('blur', handleWindowBlur);\n };\n }, [finishRulerDrag, isRulerAvailable, isRulerVisible, startRulerDrag]);\n\n useEffect(() => {\n clearRulerMeasure();\n }, [clearRulerMeasure, size.height, size.width, targetSrc]);\n\n useEffect(() => {\n if (!isRulerVisible || isRulerAvailable) return;\n closeRuler();\n }, [closeRuler, isRulerAvailable, isRulerVisible]);\n\n const applyTarget = () => {\n const normalizedTarget = normalizeTarget(draftTarget, reviewPathPrefix);\n clearSelectedItem();\n targetRef.current = normalizedTarget;\n setActiveRoute(normalizedTarget);\n setDraftTarget(normalizedTarget);\n setTarget(normalizedTarget);\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n };\n\n const selectPage = (href: string) => {\n const normalizedTarget = normalizeTarget(href, reviewPathPrefix);\n clearSelectedItem();\n targetRef.current = normalizedTarget;\n setActiveRoute(normalizedTarget);\n setDraftTarget(normalizedTarget);\n setTarget(normalizedTarget);\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n setIsSitemapOpen(false);\n };\n\n const setReviewMode = (nextMode: ReviewMode) => {\n if (isRemoteSource) return;\n closeRuler();\n if (nextMode === 'element') {\n closeTargetOverlay('figma');\n }\n controllerRef.current?.setMode(nextMode);\n setMode(controllerRef.current?.getMode() ?? 'idle');\n };\n\n const copyCurrentUrl = async () => {\n await navigator.clipboard.writeText(window.location.href);\n setCopyLabel('Copied');\n window.setTimeout(() => setCopyLabel('Copy URL'), 1200);\n };\n\n const changeReviewSource = (nextSource: ReviewSource) => {\n if (nextSource !== 'local' && nextSource !== remoteSource) return;\n\n cancelReviewMode();\n clearSelectedItem();\n setItems([]);\n setSource(nextSource);\n updateShellUrl(targetRef.current, sizeRef.current, nextSource);\n };\n\n const changeItemStatus = async (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => {\n if (!activeAdapterEntry.updateStatus) return;\n\n const statusIndex = activeAdapterEntry.statusOptions.findIndex(\n (statusOption) => statusOption.value === nextStatus\n );\n const statusOption = activeAdapterEntry.statusOptions[statusIndex];\n if (!statusOption) return;\n\n await activeAdapterEntry.updateStatus({\n id: item.id,\n item,\n status: statusOption.value,\n statusOption,\n statusIndex,\n });\n await refreshReviewData();\n };\n\n const submitItem = async (numberedItem: NumberedReviewItem) => {\n const { item } = numberedItem;\n if (\n !remoteAdapterEntry ||\n !localAdapterEntry.syncSubmission ||\n item.submitStatus === 'submitted'\n ) {\n return;\n }\n\n await localAdapterEntry.syncSubmission({\n id: item.id,\n item,\n patch: {\n submitStatus: 'submitting',\n submitError: undefined\n }\n });\n await refreshReviewData();\n\n try {\n await remoteAdapterEntry.adapter.create({\n ...item,\n reviewNumber: undefined,\n externalIssueId: undefined,\n externalIssueUrl: undefined,\n submittedAt: undefined,\n submitStatus: 'submitted',\n submitError: undefined\n });\n await localAdapterEntry.adapter.remove(item.id);\n if (selectedItemIdRef.current === item.id) {\n clearSelectedItem();\n }\n } catch (error) {\n await localAdapterEntry.syncSubmission({\n id: item.id,\n item,\n patch: {\n submitStatus: 'failed',\n submitError:\n error instanceof Error ? error.message : 'Failed to submit remote'\n }\n });\n }\n\n await refreshReviewData();\n };\n\n const copyPrompt = async (value: string, key: string) => {\n if (!value) return;\n\n await navigator.clipboard.writeText(value);\n setCopiedPromptKey(key);\n window.setTimeout(() => {\n setCopiedPromptKey((current) => (current === key ? null : current));\n }, 1200);\n };\n\n const copyItemPrompt = async (numberedItem: NumberedReviewItem) => {\n await copyPrompt(\n buildReviewItemPrompt(numberedItem, reviewPathPrefix),\n `item:${numberedItem.item.id}`\n );\n };\n\n const removeItem = async (item: ReviewItem) => {\n if (\n !activeAdapterEntry.canRemove ||\n item.submitStatus === 'submitting' ||\n (!isRemoteSource && item.submitStatus === 'submitted')\n ) {\n return;\n }\n\n await activeAdapterEntry.adapter.remove(item.id);\n if (selectedItemIdRef.current === item.id) {\n clearSelectedItem();\n updateShellUrl(targetRef.current, sizeRef.current, source);\n }\n await refreshReviewData();\n };\n\n useEffect(() => {\n const handleHotkey = (event: KeyboardEvent) => {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {\n return;\n }\n if (isEditableEventTarget(event)) return;\n\n const actions: Record<string, () => void> = {\n r: () => {\n if (isRulerAvailable) toggleRuler();\n },\n g: () => toggleTargetOverlay('grid'),\n f: () => toggleTargetOverlay('figma'),\n n: () => setReviewMode('note'),\n e: () => setReviewMode('element'),\n a: () => setReviewMode('area')\n };\n const action = actions[event.key.toLowerCase()];\n if (!action) return;\n\n event.preventDefault();\n action();\n };\n\n window.addEventListener('keydown', handleHotkey);\n return () => window.removeEventListener('keydown', handleHotkey);\n }, [isRulerAvailable, toggleRuler, toggleTargetOverlay, setReviewMode]);\n\n return (\n <div\n className={`df-review-shell is-theme-${effectiveReviewTheme}${\n isListVisible ? ' is-list-visible' : ''\n }`}\n >\n <ReviewTopbar\n draftTarget={draftTarget}\n copyLabel={copyLabel}\n viewportPresets={viewportPresets}\n size={size}\n presetScopeCounts={presetScopeCounts}\n isRulerAvailable={isRulerAvailable}\n isRulerVisible={isRulerVisible}\n targetOverlayState={targetOverlayState}\n isFigmaOverlayAvailable={isFigmaOverlayAvailable}\n onDraftTargetChange={setDraftTarget}\n onApplyTarget={applyTarget}\n onOpenSitemap={() => setIsSitemapOpen(true)}\n onCopyCurrentUrl={() => void copyCurrentUrl()}\n onSizeChange={setSize}\n onToggleRuler={toggleRuler}\n onToggleTargetOverlay={toggleTargetOverlay}\n onOpenSettings={openFigmaSettings}\n />\n\n {isSitemapOpen && (\n <SitemapModal\n pages={pages}\n activeRoute={activeRoute}\n pageQaCounts={pageQaCounts}\n pagePresenceUsers={pagePresenceUsers}\n getPageTarget={(href) => normalizeTarget(href, reviewPathPrefix)}\n onClose={() => setIsSitemapOpen(false)}\n onSelectPage={selectPage}\n />\n )}\n\n {isFigmaSettingsOpen && (\n <ReviewSettingsModal\n figmaTokenDraft={figmaTokenDraft}\n reviewUserIdDraft={reviewUserIdDraft}\n reviewThemeDraft={reviewThemeDraft}\n figmaSettingsStatus={figmaSettingsStatus}\n isFigmaTokenVisible={isFigmaTokenVisible}\n isFigmaTokenGuideOpen={isFigmaTokenGuideOpen}\n onClose={closeFigmaSettings}\n onFigmaTokenDraftChange={setFigmaTokenDraft}\n onReviewUserIdDraftChange={setReviewUserIdDraft}\n onReviewThemeDraftChange={setReviewThemeDraft}\n onClearStatus={() => setFigmaSettingsStatus('')}\n onToggleFigmaTokenVisible={() =>\n setIsFigmaTokenVisible((current) => !current)\n }\n onToggleFigmaTokenGuide={() =>\n setIsFigmaTokenGuideOpen((current) => !current)\n }\n onSave={saveReviewSettings}\n />\n )}\n\n {promptDialogNumberedItem && (\n <PromptModal\n numberedItem={promptDialogNumberedItem}\n promptTab={promptTab}\n activeLabel={promptDialogActiveLabel}\n activeText={promptDialogActiveText}\n activeCopyKey={promptDialogActiveCopyKey}\n copiedPromptKey={copiedPromptKey}\n onClose={() => setPromptItemId(null)}\n onPromptTabChange={setPromptTab}\n onCopyPrompt={(text, key) => void copyPrompt(text, key)}\n />\n )}\n\n <div className=\"df-review-side-rail\">\n <button\n aria-label={isListVisible ? 'Hide QA list' : 'Show QA list'}\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={() => setIsListVisible((current) => !current)}\n >\n <span aria-hidden=\"true\">\n <GripVerticalIcon />\n </span>\n <strong>QA</strong>\n </button>\n </div>\n\n <aside className=\"df-review-qa-panel\" aria-hidden={!isListVisible}>\n <div className=\"df-review-panel-body\">\n <section className=\"df-review-item-list\">\n <div className=\"df-review-list-header\">\n <div className=\"df-review-list-toolbar\">\n <div className=\"df-review-list-controls\">\n <select\n aria-label=\"QA source\"\n className=\"df-review-source-select\"\n value={source}\n onChange={(event) =>\n changeReviewSource(event.currentTarget.value as ReviewSource)\n }\n >\n <option value=\"local\">local</option>\n {remoteAdapterEntry && (\n <option value={remoteAdapterEntry.label}>\n {remoteAdapterEntry.label}\n </option>\n )}\n </select>\n <button\n aria-label=\"Refresh QA\"\n className=\"df-review-source-refresh\"\n type=\"button\"\n onClick={() => void refreshReviewData()}\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-filter-tabs\" aria-label=\"QA filters\">\n {REVIEW_QA_FILTERS.map((filter) => {\n const count = qaFilterCounts.get(filter.key) ?? 0;\n const isActive = qaFilter === filter.key;\n\n return (\n <button\n key={filter.key}\n aria-label={`${filter.label} QA (${count})`}\n aria-pressed={isActive}\n className={`df-review-filter-tab${\n isActive ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => setQaFilter(filter.key)}\n >\n <span className=\"df-review-filter-icon\">\n {filter.scope ? (\n <ReviewScopeIcon scope={filter.scope} />\n ) : (\n <ListFilterIcon aria-hidden=\"true\" />\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"df-review-list-title\">\n <span>{activeAdapterEntry.label} QA</span>\n <strong>\n {filteredNumberedActiveItems.length}\n {qaFilter === 'all' ? '' : `/${activeItems.length}`}\n </strong>\n </div>\n {currentPagePresenceUsers.length > 0 && (\n <div\n aria-label=\"Review presence\"\n className=\"df-review-presence-row\"\n >\n <span className=\"df-review-presence-label\">\n <UsersIcon aria-hidden=\"true\" />\n online {currentPagePresenceUsers.length}\n </span>\n <div className=\"df-review-presence-list\">\n {currentPagePresenceUsers.map((user) => (\n <span\n key={user.sessionId}\n className={`df-review-presence-chip${\n user.sessionId === presenceSessionId\n ? ' is-self'\n : ''\n }`}\n style={{\n '--df-review-presence-color': user.color,\n } as React.CSSProperties}\n >\n <span\n className=\"df-review-presence-dot\"\n aria-hidden=\"true\"\n />\n <span className=\"df-review-presence-name\">\n {user.userId}\n </span>\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n <div className=\"df-review-list-scroll\">\n {activeItems.length === 0 && (\n <p className=\"df-review-empty\">\n {isRemoteSource\n ? `No ${activeAdapterEntry.label} QA on this page.`\n : 'No QA on this page.'}\n </p>\n )}\n {activeItems.length > 0 &&\n filteredNumberedActiveItems.length === 0 && (\n <p className=\"df-review-empty\">No QA in this filter.</p>\n )}\n {filteredNumberedActiveItems.map((numberedItem) => {\n const { item } = numberedItem;\n const itemMode = getReviewItemMode(item);\n const isSubmitted = item.submitStatus === 'submitted';\n const isSubmitting = item.submitStatus === 'submitting';\n const canRemoveItem =\n activeAdapterEntry.canRemove &&\n !isSubmitting &&\n (isRemoteSource || !isSubmitted);\n const hasRemoteActions =\n (!isRemoteSource && Boolean(remoteAdapterEntry)) ||\n Boolean(item.externalIssueUrl);\n const isItemOverlayVisible = !hiddenOverlayItemIds.has(item.id);\n const itemComment = item.comment.trim() || getItemTitle(item);\n const statusOptions = activeAdapterEntry.statusOptions;\n const currentStatusOption = getStatusOption(\n item.status,\n statusOptions\n );\n const canUpdateStatus =\n Boolean(activeAdapterEntry.updateStatus) &&\n statusOptions.length > 0 &&\n !isSubmitting;\n\n return (\n <article\n key={item.id}\n className={`df-review-item-card${\n item.id === selectedItemId ? ' is-active' : ''\n }${\n getItemPresetScope(item) !== currentPresetScope\n ? ' is-dim'\n : ''\n }${isItemOverlayVisible ? '' : ' is-overlay-hidden'}`}\n onClick={() => restoreReviewItem(item)}\n >\n <div className=\"df-review-item-header\">\n <div className=\"df-review-item-main\">\n <span className=\"df-review-item-badges\">\n <span className=\"df-review-item-id\">\n #{numberedItem.number}\n </span>\n <span\n className={`df-review-item-scope is-scope-${numberedItem.scope}`}\n >\n <ReviewScopeIcon scope={numberedItem.scope} />\n {numberedItem.label}\n </span>\n <span\n className={`df-review-item-mode is-mode-${itemMode}`}\n >\n <ReviewItemModeIcon mode={itemMode} />\n {itemMode}\n </span>\n {currentStatusOption && (\n canUpdateStatus ? (\n <select\n aria-label=\"QA status\"\n className=\"df-review-item-status-select\"\n value={currentStatusOption.value}\n onClick={(event) => event.stopPropagation()}\n onChange={(event) =>\n void changeItemStatus(\n item,\n event.currentTarget\n .value as ReviewItemStatus\n )\n }\n >\n {statusOptions.map((statusOption) => (\n <option\n key={statusOption.value}\n value={statusOption.value}\n >\n {statusOption.label}\n </option>\n ))}\n </select>\n ) : (\n <span className=\"df-review-item-status-badge\">\n {currentStatusOption.label}\n </span>\n )\n )}\n </span>\n <strong className=\"df-review-item-comment\">\n {itemComment}\n </strong>\n <small>{formatDate(item.createdAt)}</small>\n {item.submitError && (\n <small className=\"df-review-item-error\">\n {item.submitError}\n </small>\n )}\n </div>\n <div\n className=\"df-review-item-header-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n <button\n aria-label={\n isItemOverlayVisible\n ? 'Hide QA overlay'\n : 'Show QA overlay'\n }\n className={`df-review-item-visibility${\n isItemOverlayVisible ? ' is-visible' : ' is-hidden'\n }`}\n type=\"button\"\n onClick={() => toggleItemOverlayVisibility(item.id)}\n >\n {isItemOverlayVisible ? (\n <EyeIcon aria-hidden=\"true\" />\n ) : (\n <EyeOffIcon aria-hidden=\"true\" />\n )}\n </button>\n {canRemoveItem && (\n <button\n aria-label=\"Delete QA\"\n className=\"df-review-item-delete\"\n type=\"button\"\n onClick={() => void removeItem(item)}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n <div className=\"df-review-item-actions\">\n <div\n className=\"df-review-item-prompt-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n <button\n className=\"df-review-item-prompt\"\n type=\"button\"\n onClick={() => {\n setPromptTab('item');\n setPromptItemId(item.id);\n }}\n >\n Prompt\n </button>\n <button\n aria-label=\"Copy QA prompt\"\n className={`df-review-item-prompt-copy${\n copiedPromptKey === `item:${item.id}`\n ? ' is-copied'\n : ''\n }`}\n type=\"button\"\n onClick={() => void copyItemPrompt(numberedItem)}\n >\n <CopyIcon aria-hidden=\"true\" />\n </button>\n </div>\n {hasRemoteActions && (\n <div\n className=\"df-review-item-remote-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {!isRemoteSource && remoteAdapterEntry && (\n <button\n aria-label=\"Submit to remote\"\n className=\"df-review-item-action-button df-review-item-submit-button\"\n disabled={isSubmitted || isSubmitting}\n type=\"button\"\n onClick={() => void submitItem(numberedItem)}\n >\n <UploadIcon aria-hidden=\"true\" />\n <span>\n {isSubmitted\n ? '등록됨'\n : isSubmitting\n ? '등록 중'\n : 'remote 등록'}\n </span>\n </button>\n )}\n {item.externalIssueUrl && (\n <a\n aria-label=\"Open remote issue\"\n className=\"df-review-item-action-button\"\n href={item.externalIssueUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n )}\n </div>\n )}\n </div>\n </article>\n );\n })}\n </div>\n </section>\n </div>\n </aside>\n\n <main className=\"df-review-stage\">\n <div className=\"df-review-frame\">\n <div className=\"df-review-frame-scroll\" ref={frameScrollRef}>\n <div className=\"df-review-frame-canvas\">\n <div\n className={`df-review-device-frame${\n isRulerVisible && isRulerAvailable ? ' is-ruler' : ''\n }`}\n >\n {isRulerVisible && isRulerAvailable && (\n <>\n <div className=\"df-review-ruler-corner\" aria-hidden=\"true\" />\n <div\n className=\"df-review-ruler-gutter is-x\"\n style={\n {\n '--df-review-ruler-step-x': `${rulerScaleX * 20}px`\n } as React.CSSProperties\n }\n >\n <div className=\"df-review-ruler-frame-label\">\n <strong>{size.label}</strong>\n <span>\n {size.designWidth}\n {size.designHeight ? `x${size.designHeight}` : ''}\n {rulerUnit}\n </span>\n </div>\n {rulerHover && (\n <div\n className=\"df-review-ruler-coord is-x\"\n style={{ left: `${rulerHover.x}px` }}\n >\n {Math.round(rulerHover.x / rulerScaleX)}\n </div>\n )}\n </div>\n <div\n className=\"df-review-ruler-gutter is-y\"\n style={\n {\n '--df-review-ruler-step-y': `${rulerScaleY * 20}px`\n } as React.CSSProperties\n }\n >\n {rulerHover && (\n <div\n className=\"df-review-ruler-coord is-y\"\n style={{ top: `${rulerHover.y}px` }}\n >\n {Math.round(rulerHover.y / rulerScaleY)}\n </div>\n )}\n </div>\n </>\n )}\n <div\n className=\"df-review-device\"\n style={{\n width: `${size.width}px`,\n height: `${size.height}px`,\n minWidth: `${size.width}px`,\n minHeight: `${size.height}px`\n }}\n >\n <iframe\n key={targetSrc}\n ref={iframeRef}\n width={size.width}\n height={size.height}\n src={targetSrc}\n title=\"Review target\"\n onLoad={initReviewKit}\n />\n {isRulerVisible && isRulerAvailable && (\n <div\n ref={rulerOverlayRef}\n aria-label=\"Ruler\"\n className={`df-review-ruler-overlay${\n isRulerDragging ? ' is-dragging' : ''\n }`}\n role=\"application\"\n onWheel={(event) => {\n iframeRef.current?.contentWindow?.scrollBy(\n event.deltaX,\n event.deltaY\n );\n }}\n >\n {rulerHover && (\n <>\n <div\n className=\"df-review-ruler-guide is-x\"\n aria-hidden=\"true\"\n style={{ top: `${rulerHover.y}px` }}\n />\n <div\n className=\"df-review-ruler-guide is-y\"\n aria-hidden=\"true\"\n style={{ left: `${rulerHover.x}px` }}\n />\n </>\n )}\n {rulerMeasure &&\n (rulerMeasure.width > 0 || rulerMeasure.height > 0) && (\n <>\n <div\n className=\"df-review-ruler-selection\"\n aria-hidden=\"true\"\n style={{\n left: `${rulerMeasure.left}px`,\n top: `${rulerMeasure.top}px`,\n width: `${rulerMeasure.width}px`,\n height: `${rulerMeasure.height}px`\n }}\n />\n <div\n className=\"df-review-ruler-label\"\n style={{\n left: `${Math.min(\n Math.max(\n rulerMeasure.left + rulerMeasure.width + 8,\n 8\n ),\n Math.max(8, size.width - 164)\n )}px`,\n top: `${Math.min(\n Math.max(\n rulerMeasure.top + rulerMeasure.height + 8,\n 8\n ),\n Math.max(8, size.height - 34)\n )}px`\n }}\n >\n {rulerMeasureLabel}\n </div>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n <div className=\"df-review-frame-actions\">\n {!isRemoteSource && (\n <div className=\"df-review-mode\" aria-label=\"Add QA\">\n <button\n aria-label=\"Element\"\n className={`df-review-mode-button is-element${\n mode === 'element' ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => setReviewMode('element')}\n >\n <SquareMousePointerIcon aria-hidden=\"true\" />\n </button>\n <span className=\"df-review-mode-divider\" aria-hidden=\"true\">\n |\n </span>\n <button\n aria-label=\"Note\"\n className={`df-review-mode-button is-note${\n mode === 'note' ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => setReviewMode('note')}\n >\n <StickyNoteIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Area\"\n className={`df-review-mode-button is-area${\n mode === 'area' ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => setReviewMode('area')}\n >\n <ScanIcon aria-hidden=\"true\" />\n </button>\n </div>\n )}\n </div>\n </div>\n </main>\n </div>\n );\n};\n\nexport const mountReviewShell = (options: ReviewShellMountOptions) => {\n if (typeof document === 'undefined' || !document.head) return;\n\n const { rootId = 'root', ...shellProps } = options;\n\n ensureReviewShellStyle();\n\n const root = document.getElementById(rootId);\n if (!root) return;\n\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.margin = '0';\n\n createRoot(root).render(\n <React.StrictMode>\n <ReviewShell {...shellProps} />\n </React.StrictMode>\n );\n};\n","/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n","/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n","import { CamelToPascal } from '../utility-types';\nimport { toCamelCase } from './toCamelCase';\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n\n return false;\n};\n","'use client';\n\nimport { createContext, createElement, type ReactNode, useContext, useMemo } from 'react';\nimport { LucideProps } from './types';\n\ntype LucideConfig = {\n size: number;\n color: string;\n strokeWidth: number;\n absoluteStrokeWidth: boolean;\n className: string;\n};\n\nconst LucideContext = createContext<LucideProps>({});\n\ntype LucideProviderProps = {\n children: ReactNode;\n} & Partial<LucideConfig>;\n\nexport function LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n}: LucideProviderProps) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className],\n );\n\n return createElement(LucideContext.Provider, { value }, children);\n}\n\nexport const useLucideContext = () => useContext(LucideContext);\n","'use client';\n\nimport { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\nimport { useLucideContext } from './context';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n { color, size, strokeWidth, absoluteStrokeWidth, className = '', children, iconNode, ...rest },\n ref,\n ) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = 'currentColor',\n className: contextClass = '',\n } = useLucideContext() ?? {};\n\n const calculatedStrokeWidth =\n absoluteStrokeWidth ?? contextAbsoluteStrokeWidth\n ? (Number(strokeWidth ?? contextStrokeWidth) * 24) / Number(size ?? contextSize)\n : strokeWidth ?? contextStrokeWidth;\n\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses('lucide', contextClass, className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3', key: '1u773s' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n];\n\n/**\n * @component @name CircleQuestionMark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMiIC8+CiAgPHBhdGggZD0iTTEyIDE3aC4wMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/circle-question-mark\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleQuestionMark = createLucideIcon('circle-question-mark', __iconNode);\n\nexport default CircleQuestionMark;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n];\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHg9IjgiIHk9IjgiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('copy', __iconNode);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'M10 14 21 3', key: 'gplh6r' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6', key: 'a6xqqp' }],\n];\n\n/**\n * @component @name ExternalLink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0iTTEwIDE0IDIxIDMiIC8+CiAgPHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ExternalLink = createLucideIcon('external-link', __iconNode);\n\nexport default ExternalLink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49',\n key: 'ct8e1f',\n },\n ],\n ['path', { d: 'M14.084 14.158a3 3 0 0 1-4.242-4.242', key: '151rxh' }],\n [\n 'path',\n {\n d: 'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143',\n key: '13bj9a',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNzMzIDUuMDc2YTEwLjc0NCAxMC43NDQgMCAwIDEgMTEuMjA1IDYuNTc1IDEgMSAwIDAgMSAwIC42OTYgMTAuNzQ3IDEwLjc0NyAwIDAgMS0xLjQ0NCAyLjQ5IiAvPgogIDxwYXRoIGQ9Ik0xNC4wODQgMTQuMTU4YTMgMyAwIDAgMS00LjI0Mi00LjI0MiIgLz4KICA8cGF0aCBkPSJNMTcuNDc5IDE3LjQ5OWExMC43NSAxMC43NSAwIDAgMS0xNS40MTctNS4xNTEgMSAxIDAgMCAxIDAtLjY5NiAxMC43NSAxMC43NSAwIDAgMSA0LjQ0Ni01LjE0MyIgLz4KICA8cGF0aCBkPSJtMiAyIDIwIDIwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst EyeOff = createLucideIcon('eye-off', __iconNode);\n\nexport default EyeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n key: '1nclc0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi4wNjIgMTIuMzQ4YTEgMSAwIDAgMSAwLS42OTYgMTAuNzUgMTAuNzUgMCAwIDEgMTkuODc2IDAgMSAxIDAgMCAxIDAgLjY5NiAxMC43NSAxMC43NSAwIDAgMS0xOS44NzYgMCIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Eye = createLucideIcon('eye', __iconNode);\n\nexport default Eye;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '9', cy: '12', r: '1', key: '1vctgf' }],\n ['circle', { cx: '9', cy: '5', r: '1', key: 'hp0tcf' }],\n ['circle', { cx: '9', cy: '19', r: '1', key: 'fkjjf6' }],\n ['circle', { cx: '15', cy: '12', r: '1', key: '1tmaij' }],\n ['circle', { cx: '15', cy: '5', r: '1', key: '19l28e' }],\n ['circle', { cx: '15', cy: '19', r: '1', key: 'f4zoj3' }],\n];\n\n/**\n * @component @name GripVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjUiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTUiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTkiIHI9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/grip-vertical\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GripVertical = createLucideIcon('grip-vertical', __iconNode);\n\nexport default GripVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '7', height: '7', x: '3', y: '3', rx: '1', key: '1g98yp' }],\n ['rect', { width: '7', height: '7', x: '14', y: '3', rx: '1', key: '6d4xhi' }],\n ['rect', { width: '7', height: '7', x: '14', y: '14', rx: '1', key: 'nxv5o0' }],\n ['rect', { width: '7', height: '7', x: '3', y: '14', rx: '1', key: '1bb6yr' }],\n];\n\n/**\n * @component @name LayoutGrid\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIzIiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIxNCIgeT0iMyIgcng9IjEiIC8+CiAgPHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iNyIgeD0iMTQiIHk9IjE0IiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIxNCIgcng9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/layout-grid\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LayoutGrid = createLucideIcon('layout-grid', __iconNode);\n\nexport default LayoutGrid;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M2 5h20', key: '1fs1ex' }],\n ['path', { d: 'M6 12h12', key: '8npq4p' }],\n ['path', { d: 'M9 19h6', key: '456am0' }],\n];\n\n/**\n * @component @name ListFilter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMiA1aDIwIiAvPgogIDxwYXRoIGQ9Ik02IDEyaDEyIiAvPgogIDxwYXRoIGQ9Ik05IDE5aDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/list-filter\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ListFilter = createLucideIcon('list-filter', __iconNode);\n\nexport default ListFilter;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z',\n key: '169xi5',\n },\n ],\n ['path', { d: 'M15 5.764v15', key: '1pn4in' }],\n ['path', { d: 'M9 3.236v15', key: '1uimfh' }],\n];\n\n/**\n * @component @name Map\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQuMTA2IDUuNTUzYTIgMiAwIDAgMCAxLjc4OCAwbDMuNjU5LTEuODNBMSAxIDAgMCAxIDIxIDQuNjE5djEyLjc2NGExIDEgMCAwIDEtLjU1My44OTRsLTQuNTUzIDIuMjc3YTIgMiAwIDAgMS0xLjc4OCAwbC00LjIxMi0yLjEwNmEyIDIgMCAwIDAtMS43ODggMGwtMy42NTkgMS44M0ExIDEgMCAwIDEgMyAxOS4zODFWNi42MThhMSAxIDAgMCAxIC41NTMtLjg5NGw0LjU1My0yLjI3N2EyIDIgMCAwIDEgMS43ODggMHoiIC8+CiAgPHBhdGggZD0iTTE1IDUuNzY0djE1IiAvPgogIDxwYXRoIGQ9Ik05IDMuMjM2djE1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/map\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Map = createLucideIcon('map', __iconNode);\n\nexport default Map;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'm21 3-7 7', key: '1l2asr' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M9 21H3v-6', key: 'wtvkvv' }],\n];\n\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0ibTIxIDMtNyA3IiAvPgogIDxwYXRoIGQ9Im0zIDIxIDctNyIgLz4KICA8cGF0aCBkPSJNOSAyMUgzdi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize2 = createLucideIcon('maximize-2', __iconNode);\n\nexport default Maximize2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '12', x: '2', y: '6', rx: '2', key: '9lu3g6' }],\n];\n\n/**\n * @component @name RectangleHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTIiIHg9IjIiIHk9IjYiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rectangle-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RectangleHorizontal = createLucideIcon('rectangle-horizontal', __iconNode);\n\nexport default RectangleHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z',\n key: 'icamh8',\n },\n ],\n ['path', { d: 'm14.5 12.5 2-2', key: 'inckbg' }],\n ['path', { d: 'm11.5 9.5 2-2', key: 'fmmyf7' }],\n ['path', { d: 'm8.5 6.5 2-2', key: 'vc6u1g' }],\n ['path', { d: 'm17.5 15.5 2-2', key: 'wo5hmg' }],\n];\n\n/**\n * @component @name Ruler\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMyAxNS4zYTIuNCAyLjQgMCAwIDEgMCAzLjRsLTIuNiAyLjZhMi40IDIuNCAwIDAgMS0zLjQgMEwyLjcgOC43YTIuNDEgMi40MSAwIDAgMSAwLTMuNGwyLjYtMi42YTIuNDEgMi40MSAwIDAgMSAzLjQgMFoiIC8+CiAgPHBhdGggZD0ibTE0LjUgMTIuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTExLjUgOS41IDItMiIgLz4KICA8cGF0aCBkPSJtOC41IDYuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTE3LjUgMTUuNSAyLTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/ruler\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ruler = createLucideIcon('ruler', __iconNode);\n\nexport default Ruler;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 7V5a2 2 0 0 1 2-2h2', key: 'aa7l1z' }],\n ['path', { d: 'M17 3h2a2 2 0 0 1 2 2v2', key: '4qcy5o' }],\n ['path', { d: 'M21 17v2a2 2 0 0 1-2 2h-2', key: '6vwrx8' }],\n ['path', { d: 'M7 21H5a2 2 0 0 1-2-2v-2', key: 'ioqczr' }],\n];\n\n/**\n * @component @name Scan\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiAvPgogIDxwYXRoIGQ9Ik0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiAvPgogIDxwYXRoIGQ9Ik0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIC8+CiAgPHBhdGggZD0iTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/scan\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Scan = createLucideIcon('scan', __iconNode);\n\nexport default Scan;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '20', x: '5', y: '2', rx: '2', ry: '2', key: '1yt0o3' }],\n ['path', { d: 'M12 18h.01', key: 'mhygvu' }],\n];\n\n/**\n * @component @name Smartphone\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMjAiIHg9IjUiIHk9IjIiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNMTIgMThoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/smartphone\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Smartphone = createLucideIcon('smartphone', __iconNode);\n\nexport default Smartphone;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z',\n key: 'xwnzip',\n },\n ],\n ['path', { d: 'M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6', key: '14rsvq' }],\n];\n\n/**\n * @component @name SquareMousePointer\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuMDM0IDEyLjY4MWEuNDk4LjQ5OCAwIDAgMSAuNjQ3LS42NDdsOSAzLjVhLjUuNSAwIDAgMS0uMDMzLjk0M2wtMy40NDQgMS4wNjhhMSAxIDAgMCAwLS42Ni42NmwtMS4wNjcgMy40NDNhLjUuNSAwIDAgMS0uOTQzLjAzM3oiIC8+CiAgPHBhdGggZD0iTTIxIDExVjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/square-mouse-pointer\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareMousePointer = createLucideIcon('square-mouse-pointer', __iconNode);\n\nexport default SquareMousePointer;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z',\n key: '1dfntj',\n },\n ],\n ['path', { d: 'M15 3v5a1 1 0 0 0 1 1h5', key: '6s6qgf' }],\n];\n\n/**\n * @component @name StickyNote\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgOWEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTUgM0g1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yeiIgLz4KICA8cGF0aCBkPSJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/sticky-note\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst StickyNote = createLucideIcon('sticky-note', __iconNode);\n\nexport default StickyNote;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v12', key: '1x0j5s' }],\n ['path', { d: 'm17 8-5-5-5 5', key: '7q97r8' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n];\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxMiIgLz4KICA8cGF0aCBkPSJtMTcgOC01LTUtNSA1IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('upload', __iconNode);\n\nexport default Upload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2', key: '1yyitq' }],\n ['path', { d: 'M16 3.128a4 4 0 0 1 0 7.744', key: '16gr8j' }],\n ['path', { d: 'M22 21v-2a4 4 0 0 0-3-3.87', key: 'kshegd' }],\n ['circle', { cx: '9', cy: '7', r: '4', key: 'nufk8' }],\n];\n\n/**\n * @component @name Users\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIgLz4KICA8cGF0aCBkPSJNMTYgMy4xMjhhNCA0IDAgMCAxIDAgNy43NDQiIC8+CiAgPHBhdGggZD0iTTIyIDIxdi0yYTQgNCAwIDAgMC0zLTMuODciIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/users\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Users = createLucideIcon('users', __iconNode);\n\nexport default Users;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","import type { ReviewItemStatus, ReviewWorkflowStatus } from './types';\n\nexport const REVIEW_WORKFLOW_STATUS_OPTIONS: Array<{\n value: ReviewWorkflowStatus;\n label: string;\n}> = [\n { value: 'todo', label: '작업전' },\n { value: 'doing', label: '작업중' },\n { value: 'review', label: '검토 필요' },\n { value: 'hold', label: '보류' },\n { value: 'done', label: '완료' },\n];\n\nexport function normalizeReviewItemStatus(\n status: ReviewItemStatus | undefined\n): ReviewWorkflowStatus {\n if (status === 'resolved') return 'done';\n if (status === 'open' || !status) return 'todo';\n return status;\n}\n\nexport function matchesReviewItemStatus(\n itemStatus: ReviewItemStatus | undefined,\n queryStatus: ReviewItemStatus\n) {\n return (\n normalizeReviewItemStatus(itemStatus) === normalizeReviewItemStatus(queryStatus)\n );\n}\n","import { REVIEW_WORKFLOW_STATUS_OPTIONS } from '../status';\nimport type {\n ReviewSource,\n WebReviewKitAdapter,\n} from '../types';\nimport type {\n ReviewShellAdapter,\n ReviewShellAdapterMap,\n ReviewShellAdapters,\n ReviewShellStatusOption,\n ReviewShellSyncSubmissionInput,\n ReviewShellUpdateStatusInput,\n} from './types';\n\nexport type NormalizedReviewShellAdapter = {\n label: ReviewSource;\n adapter: WebReviewKitAdapter;\n statusOptions: ReviewShellStatusOption[];\n updateStatus?: (input: ReviewShellUpdateStatusInput) => Promise<unknown>;\n syncSubmission?: (input: ReviewShellSyncSubmissionInput) => Promise<unknown>;\n canRemove: boolean;\n pageId?: string;\n};\n\nexport type NormalizedReviewShellAdapters = {\n local: NormalizedReviewShellAdapter;\n remote: NormalizedReviewShellAdapter | null;\n};\n\nexport function normalizeReviewShellAdapters(\n adapters: ReviewShellAdapters\n): NormalizedReviewShellAdapters {\n if (Array.isArray(adapters)) {\n const local = adapters.find((adapter) => adapter.label === 'local');\n const remote =\n adapters.find((adapter) => adapter.label !== 'local') ?? null;\n\n if (!local) {\n throw new Error('ReviewShell requires a local adapter.');\n }\n\n return {\n local: normalizeShellAdapter(local),\n remote: remote ? normalizeShellAdapter(remote) : null,\n };\n }\n\n return normalizeLegacyAdapterMap(adapters);\n}\n\nfunction normalizeLegacyAdapterMap(\n adapters: ReviewShellAdapterMap\n): NormalizedReviewShellAdapters {\n return {\n local: {\n label: 'local',\n adapter: adapters.local,\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n updateStatus: ({ id, status }) => adapters.local.update(id, { status }),\n syncSubmission: ({ id, patch }) => adapters.local.update(id, patch),\n canRemove: true,\n },\n remote: adapters.remote\n ? {\n label: 'df-sheet',\n adapter: adapters.remote,\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n canRemove: false,\n pageId: adapters.remotePageId,\n }\n : null,\n };\n}\n\nfunction normalizeShellAdapter(\n adapterConfig: ReviewShellAdapter\n): NormalizedReviewShellAdapter {\n return {\n label: adapterConfig.label,\n pageId: adapterConfig.pageId,\n statusOptions: [...(adapterConfig.statusOptions ?? [])],\n updateStatus: adapterConfig.updateStatus,\n syncSubmission: adapterConfig.syncSubmission,\n canRemove: Boolean(adapterConfig.remove),\n adapter: {\n get: adapterConfig.get,\n list: adapterConfig.list,\n create: adapterConfig.create,\n update: async (id, patch) => {\n const nextStatus = patch.status;\n if (nextStatus && adapterConfig.updateStatus) {\n const statusIndex = (adapterConfig.statusOptions ?? []).findIndex(\n (statusOption) => statusOption.value === nextStatus\n );\n const statusOption = (adapterConfig.statusOptions ?? [])[statusIndex];\n\n if (statusOption) {\n const item = await adapterConfig.get(id);\n if (!item) throw new Error(`Review item not found: ${id}`);\n\n return adapterConfig.updateStatus({\n id,\n item,\n status: nextStatus,\n statusOption,\n statusIndex,\n });\n }\n }\n\n if (!adapterConfig.syncSubmission) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support update.`\n );\n }\n\n const item = await adapterConfig.get(id);\n if (!item) throw new Error(`Review item not found: ${id}`);\n\n return adapterConfig.syncSubmission({\n id,\n item,\n patch,\n });\n },\n remove: async (id) => {\n if (!adapterConfig.remove) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support remove.`\n );\n }\n\n return adapterConfig.remove(id);\n },\n },\n };\n}\n","const REVIEW_SHELL_STYLE_ID = 'df-review-shell-style';\n\nexport function ensureReviewShellStyle() {\n if (!document.getElementById(REVIEW_SHELL_STYLE_ID)) {\n const style = document.createElement('style');\n style.id = REVIEW_SHELL_STYLE_ID;\n style.textContent = `\n\t * {\n\t box-sizing: border-box;\n\t scrollbar-color: var(--df-review-scrollbar-thumb, rgba(237, 243, 251, 0.2)) var(--df-review-scrollbar-track, rgba(237, 243, 251, 0.04));\n\t scrollbar-width: thin;\n\t }\n\n\t *::-webkit-scrollbar {\n\t width: 10px;\n\t height: 10px;\n\t }\n\n\t *::-webkit-scrollbar-track {\n\t background: var(--df-review-scrollbar-track, rgba(237, 243, 251, 0.04));\n\t }\n\n\t *::-webkit-scrollbar-thumb {\n\t border: 2px solid var(--df-review-scrollbar-border, rgba(15, 18, 24, 0.92));\n\t border-radius: var(--df-review-radius-pill);\n\t background: var(--df-review-scrollbar-thumb, rgba(237, 243, 251, 0.18));\n\t }\n\n\t *::-webkit-scrollbar-thumb:hover {\n\t background: var(--df-review-scrollbar-thumb-hover, rgba(237, 243, 251, 0.28));\n\t }\n\n\t *::-webkit-scrollbar-corner {\n\t background: transparent;\n\t }\n\n html,\n body,\n #root {\n width: 100%;\n height: 100%;\n margin: 0;\n }\n\n\t body {\n\t overflow: hidden;\n\t color-scheme: dark;\n\n\t /* df-review-token layer. Keep these names internal to review-kit. */\n\t --df-review-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n\t --df-review-font-mono: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n\t --df-review-font-size-3xs: 9px;\n\t --df-review-font-size-2xs: 10px;\n\t --df-review-font-size-xs: 11px;\n\t --df-review-font-size-sm: 12px;\n\t --df-review-font-size-md: 13px;\n\t --df-review-font-size-lg: 14px;\n\t --df-review-font-size-xl: 15px;\n\t --df-review-font-size-2xl: 18px;\n\t --df-review-font-weight-medium: 650;\n\t --df-review-font-weight-bold: 700;\n\t --df-review-font-weight-strong: 800;\n\t --df-review-font-weight-heavy: 900;\n\t --df-review-line-height-tight: 1.25;\n\t --df-review-line-height-base: 1.42;\n\t --df-review-line-height-relaxed: 1.55;\n\t --df-review-space-0: 0;\n\t --df-review-space-1: 4px;\n\t --df-review-space-1-5: 6px;\n\t --df-review-space-2: 8px;\n\t --df-review-space-2-5: 10px;\n\t --df-review-space-3: 12px;\n\t --df-review-space-3-5: 14px;\n\t --df-review-space-4: 16px;\n\t --df-review-space-5: 20px;\n\t --df-review-space-6: 24px;\n\t --df-review-space-8: 32px;\n\t --df-review-control-height-sm: 32px;\n\t --df-review-control-height-md: 34px;\n\t --df-review-control-height-lg: 38px;\n\t --df-review-radius-xs: 3px;\n\t --df-review-radius-sm: 6px;\n\t --df-review-radius-md: 8px;\n\t --df-review-radius-lg: 12px;\n\t --df-review-radius-pill: 999px;\n\t --df-review-color-canvas: #0f1218;\n\t --df-review-color-surface: #171c24;\n\t --df-review-color-panel: #131821;\n\t --df-review-color-panel-strong: #1b2430;\n\t --df-review-color-card: rgba(237, 243, 251, 0.035);\n\t --df-review-color-card-hover: rgba(237, 243, 251, 0.065);\n\t --df-review-color-control: #202938;\n\t --df-review-color-control-hover: #273345;\n\t --df-review-color-border: rgba(226, 233, 245, 0.14);\n\t --df-review-color-border-soft: rgba(226, 233, 245, 0.08);\n\t --df-review-color-text: #edf3fb;\n\t --df-review-color-text-muted: rgba(237, 243, 251, 0.58);\n\t --df-review-color-text-subtle: rgba(237, 243, 251, 0.42);\n\t --df-review-color-accent: #7cc7ff;\n\t --df-review-color-accent-contrast: #0f1218;\n\t --df-review-color-accent-soft: rgba(124, 199, 255, 0.12);\n\t --df-review-color-accent-hover: rgba(124, 199, 255, 0.2);\n\t --df-review-color-danger: #ff8f61;\n\t --df-review-color-danger-soft: rgba(255, 143, 97, 0.12);\n\t --df-review-color-purple: #b395ff;\n\t --df-review-color-purple-soft: rgba(179, 149, 255, 0.16);\n\t --df-review-color-note: #f3b75f;\n\t --df-review-color-note-soft: rgba(243, 183, 95, 0.14);\n\t --df-review-color-area: #63d7c7;\n\t --df-review-color-area-soft: rgba(99, 215, 199, 0.14);\n\t --df-review-color-side-rail: #111722;\n\t --df-review-color-mode-bar: rgba(15, 18, 24, 0.86);\n\t --df-review-color-chip: rgba(237, 243, 251, 0.06);\n\t --df-review-color-scrollbar-track: rgba(237, 243, 251, 0.04);\n\t --df-review-color-scrollbar-thumb: rgba(237, 243, 251, 0.18);\n\t --df-review-color-scrollbar-thumb-hover: rgba(237, 243, 251, 0.28);\n\t --df-review-color-scrollbar-border: rgba(15, 18, 24, 0.92);\n\t --df-review-color-backdrop: rgba(2, 6, 12, 0.62);\n\t --df-review-focus-ring: rgba(124, 199, 255, 0.58);\n\t --df-review-shadow-card: 0 14px 36px rgba(0, 0, 0, 0.34);\n\t --df-review-shadow-control: inset 0 1px 0 rgba(255, 255, 255, 0.04);\n\t --df-review-shadow-device: 0 24px 60px rgba(0, 0, 0, 0.38);\n\t --df-review-shadow-panel: 0 18px 48px rgba(0, 0, 0, 0.38);\n\t --df-review-shadow-modal: 0 24px 70px rgba(0, 0, 0, 0.48);\n\n\t /* Semantic aliases consumed by the existing shell chrome. */\n\t --df-review-bg: var(--df-review-color-canvas);\n\t --df-review-topbar: var(--df-review-color-surface);\n\t --df-review-panel: var(--df-review-color-panel);\n\t --df-review-panel-strong: var(--df-review-color-panel-strong);\n\t --df-review-card: var(--df-review-color-card);\n\t --df-review-card-hover: var(--df-review-color-card-hover);\n\t --df-review-control: var(--df-review-color-control);\n\t --df-review-control-hover: var(--df-review-color-control-hover);\n\t --df-review-line: var(--df-review-color-border);\n\t --df-review-line-soft: var(--df-review-color-border-soft);\n\t --df-review-text: var(--df-review-color-text);\n\t --df-review-muted: var(--df-review-color-text-muted);\n\t --df-review-subtle: var(--df-review-color-text-subtle);\n\t --df-review-accent: var(--df-review-color-accent);\n\t --df-review-accent-contrast: var(--df-review-color-accent-contrast);\n\t --df-review-accent-soft: var(--df-review-color-accent-soft);\n\t --df-review-accent-hover: var(--df-review-color-accent-hover);\n\t --df-review-danger: var(--df-review-color-danger);\n\t --df-review-danger-soft: var(--df-review-color-danger-soft);\n\t --df-review-purple: var(--df-review-color-purple);\n\t --df-review-purple-soft: var(--df-review-color-purple-soft);\n\t --df-review-note: var(--df-review-color-note);\n\t --df-review-note-soft: var(--df-review-color-note-soft);\n\t --df-review-area: var(--df-review-color-area);\n\t --df-review-area-soft: var(--df-review-color-area-soft);\n\t --df-review-side-rail: var(--df-review-color-side-rail);\n\t --df-review-mode-bar: var(--df-review-color-mode-bar);\n\t --df-review-chip-bg: var(--df-review-color-chip);\n\t --df-review-scrollbar-track: var(--df-review-color-scrollbar-track);\n\t --df-review-scrollbar-thumb: var(--df-review-color-scrollbar-thumb);\n\t --df-review-scrollbar-thumb-hover: var(--df-review-color-scrollbar-thumb-hover);\n\t --df-review-scrollbar-border: var(--df-review-color-scrollbar-border);\n\t background: var(--df-review-bg);\n\t color: var(--df-review-text);\n\t font-family: var(--df-review-font-sans);\n\t }\n\n\t body.df-review-theme-light {\n\t color-scheme: light;\n\t --df-review-color-canvas: #f4f6f9;\n\t --df-review-color-surface: #ffffff;\n\t --df-review-color-panel: #ffffff;\n\t --df-review-color-panel-strong: #edf1f6;\n\t --df-review-color-card: rgba(23, 32, 44, 0.035);\n\t --df-review-color-card-hover: rgba(23, 32, 44, 0.065);\n\t --df-review-color-control: #eef2f7;\n\t --df-review-color-control-hover: #e3e9f1;\n\t --df-review-color-border: rgba(16, 24, 40, 0.14);\n\t --df-review-color-border-soft: rgba(16, 24, 40, 0.08);\n\t --df-review-color-text: #17202c;\n\t --df-review-color-text-muted: rgba(23, 32, 44, 0.62);\n\t --df-review-color-text-subtle: rgba(23, 32, 44, 0.44);\n\t --df-review-color-accent: #1769aa;\n\t --df-review-color-accent-contrast: #ffffff;\n\t --df-review-color-accent-soft: rgba(23, 105, 170, 0.1);\n\t --df-review-color-accent-hover: rgba(23, 105, 170, 0.16);\n\t --df-review-color-danger: #b94418;\n\t --df-review-color-danger-soft: rgba(185, 68, 24, 0.1);\n\t --df-review-color-purple: #6543b8;\n\t --df-review-color-purple-soft: rgba(101, 67, 184, 0.12);\n\t --df-review-color-note: #a76617;\n\t --df-review-color-note-soft: rgba(167, 102, 23, 0.12);\n\t --df-review-color-area: #087f73;\n\t --df-review-color-area-soft: rgba(8, 127, 115, 0.12);\n\t --df-review-color-side-rail: #edf1f6;\n\t --df-review-color-mode-bar: rgba(255, 255, 255, 0.9);\n\t --df-review-color-chip: rgba(23, 32, 44, 0.06);\n\t --df-review-color-scrollbar-track: rgba(23, 32, 44, 0.06);\n\t --df-review-color-scrollbar-thumb: rgba(23, 32, 44, 0.24);\n\t --df-review-color-scrollbar-thumb-hover: rgba(23, 32, 44, 0.34);\n\t --df-review-color-scrollbar-border: rgba(244, 246, 249, 0.92);\n\t --df-review-color-backdrop: rgba(15, 23, 42, 0.32);\n\t --df-review-focus-ring: rgba(23, 105, 170, 0.42);\n\t --df-review-shadow-card: 0 14px 36px rgba(15, 23, 42, 0.14);\n\t --df-review-shadow-control: inset 0 1px 0 rgba(255, 255, 255, 0.72);\n\t --df-review-shadow-device: 0 24px 60px rgba(15, 23, 42, 0.18);\n\t --df-review-shadow-panel: 0 18px 48px rgba(15, 23, 42, 0.18);\n\t --df-review-shadow-modal: 0 24px 70px rgba(15, 23, 42, 0.2);\n\t }\n\n\t button,\n\t input,\n\t select,\n\t textarea {\n\t font: inherit;\n\t }\n\n button {\n cursor: pointer;\n }\n\n .df-review-shell {\n --df-review-frame-gutter-x: var(--df-review-space-4);\n display: grid;\n grid-template-columns: minmax(0, 1fr) 0 32px;\n grid-template-rows: auto minmax(0, 1fr);\n width: 100%;\n height: 100%;\n overflow: hidden;\n transition: grid-template-columns 160ms ease;\n }\n\n .df-review-shell.is-list-visible {\n grid-template-columns: minmax(0, 1fr) clamp(320px, 28vw, 420px) 32px;\n }\n\n\t .df-review-topbar {\n\t grid-column: 1;\n\t grid-row: 1;\n\t display: grid;\n\t gap: var(--df-review-space-2);\n\t container-type: inline-size;\n\t min-width: 0;\n\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t border-bottom: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-topbar), var(--df-review-panel));\n\t box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.025);\n\t }\n\n\t\t .df-review-address {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(160px, 1fr) auto auto;\n\t\t align-items: stretch;\n\t\t gap: var(--df-review-space-2);\n\t\t width: 100%;\n\t\t max-width: 1440px;\n\t\t margin: 0 auto;\n\t\t }\n\n .df-review-address input {\n\t width: 100%;\n\t min-height: var(--df-review-control-height-md);\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t padding: 0 11px;\n\t color: var(--df-review-text);\n\t background: var(--df-review-bg);\n\t box-shadow: var(--df-review-shadow-control);\n\t font-size: var(--df-review-font-size-md);\n\t transition: border-color 140ms ease, box-shadow 140ms ease, background 140ms ease;\n\t }\n\n\t .df-review-address input:focus {\n\t outline: 2px solid var(--df-review-focus-ring);\n\t outline-offset: 1px;\n\t }\n\n\t\t .df-review-address button,\n\t\t .df-review-side-toggle,\n\t\t .df-review-presets button,\n\t\t .df-review-overlay-button,\n\t\t\t .df-review-mode-button,\n\t\t\t .df-review-settings-header button,\n\t\t\t .df-review-prompt-header button,\n\t\t\t .df-review-settings-actions button,\n\t\t\t .df-review-prompt-tabs button,\n\t\t\t .df-review-prompt-block-header button,\n\t\t\t .df-review-item-actions button {\n\t\t min-height: var(--df-review-control-height-md);\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t background: var(--df-review-control);\n\t box-shadow: var(--df-review-shadow-control);\n\t color: var(--df-review-text);\n\t font-size: var(--df-review-font-size-sm);\n\t font-weight: 700;\n\t transition: border-color 140ms ease, background 140ms ease, color 140ms ease, box-shadow 140ms ease, opacity 140ms ease;\n\t }\n\n\t\t .df-review-address button:hover,\n\t .df-review-side-toggle:hover,\n\t\t .df-review-presets button:hover,\n\t\t .df-review-overlay-button:hover,\n\t\t .df-review-mode-button:hover,\n\t\t .df-review-settings-header button:hover,\n\t\t .df-review-prompt-header button:hover,\n\t\t .df-review-settings-actions button:hover,\n\t\t .df-review-prompt-tabs button:hover,\n\t\t .df-review-prompt-tabs button.is-active,\n\t\t .df-review-prompt-block-header button:hover,\n\t\t\t .df-review-item-actions button:hover,\n\t\t .df-review-item-visibility:hover,\n\t\t .df-review-item-delete:hover,\n\t\t .df-review-presets button.is-active,\n\t\t\t .df-review-overlay-button.is-active,\n\t\t\t .df-review-mode-button.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-control-hover);\n\t\t }\n\n\t .df-review-overlay-button.is-active,\n .df-review-mode-button.is-active {\n border-color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-sitemap-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n\t width: 38px;\n\t min-width: 38px;\n\t padding: 0;\n\t color: var(--df-review-accent);\n\t }\n\n .df-review-sitemap-button svg,\n .df-review-sitemap-header button svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.8;\n }\n\n .df-review-sitemap-modal {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: grid;\n place-items: center;\n\t\t\t\t padding: 18px;\n }\n\n\t .df-review-sitemap-backdrop {\n\t position: absolute;\n\t inset: 0;\n\t min-height: 0;\n\t border: 0;\n\t border-radius: 0;\n\t padding: 0;\n\t background: var(--df-review-color-backdrop);\n\t }\n\n .df-review-sitemap-dialog {\n position: relative;\n z-index: 1;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n\t width: min(760px, calc(100vw - 48px));\n\t max-height: min(720px, calc(100vh - 48px));\n\t overflow: hidden;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: var(--df-review-panel);\n\t box-shadow: var(--df-review-shadow-modal);\n\t }\n\n .df-review-sitemap-header {\n display: flex;\n align-items: center;\n\t justify-content: space-between;\n\t gap: 12px;\n\t min-height: 54px;\n\t padding: 0 14px 0 16px;\n\t border-bottom: 1px solid var(--df-review-line);\n\t }\n\n .df-review-sitemap-header div {\n display: flex;\n align-items: baseline;\n gap: 10px;\n min-width: 0;\n }\n\n .df-review-sitemap-header strong {\n font-size: var(--df-review-font-size-lg);\n }\n\n\t .df-review-sitemap-header span {\n\t color: var(--df-review-muted);\n\t font-size: var(--df-review-font-size-sm);\n\t font-weight: 700;\n\t }\n\n .df-review-sitemap-header button {\n display: grid;\n place-items: center;\n\t width: 34px;\n\t min-width: 34px;\n\t min-height: var(--df-review-control-height-md);\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t background: var(--df-review-control);\n\t color: var(--df-review-text);\n\t font-size: var(--df-review-font-size-md);\n\t font-weight: 800;\n\t }\n\n\t .df-review-sitemap-header button:hover {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-control-hover);\n\t }\n\n .df-review-sitemap-list {\n display: grid;\n align-content: start;\n min-height: 0;\n overflow: auto;\n padding: 8px;\n }\n\n .df-review-sitemap-list button {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 12px;\n min-height: 40px;\n\t border: 0;\n\t border-radius: var(--df-review-radius-sm);\n\t padding: 8px 10px;\n\t background: transparent;\n\t color: var(--df-review-text);\n\t text-align: left;\n\t }\n\n\t .df-review-sitemap-list button:hover,\n\t .df-review-sitemap-list button.is-active {\n\t background: var(--df-review-accent-soft);\n\t }\n\n\t .df-review-sitemap-path {\n\t min-width: 0;\n\t overflow-wrap: anywhere;\n\t color: var(--df-review-text);\n\t font-size: var(--df-review-font-size-md);\n\t font-weight: 800;\n\t line-height: 1.35;\n }\n\n .df-review-sitemap-meta {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 6px;\n min-width: 0;\n }\n\n .df-review-sitemap-users {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-sitemap-user {\n --df-review-presence-color: var(--df-review-accent);\n display: inline-flex;\n align-items: center;\n min-height: 22px;\n border: 1px solid var(--df-review-presence-color);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n background: var(--df-review-chip-bg);\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .df-review-sitemap-counts {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n white-space: nowrap;\n }\n\n .df-review-sitemap-count {\n display: inline-grid;\n\t place-items: center;\n\t min-width: 34px;\n\t height: 24px;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-pill);\n\t padding: 0 7px;\n\t background: var(--df-review-chip-bg);\n\t color: var(--df-review-muted);\n\t font-size: var(--df-review-font-size-sm);\n\t font-weight: 900;\n\t }\n\n .df-review-sitemap-count.is-local {\n border-color: var(--df-review-accent);\n color: var(--df-review-accent);\n }\n\n .df-review-sitemap-count.is-remote {\n border-color: var(--df-review-area);\n color: var(--df-review-area);\n }\n\n\t .df-review-sitemap-list button:hover .df-review-sitemap-path,\n\t .df-review-sitemap-list button.is-active .df-review-sitemap-path {\n\t color: var(--df-review-text);\n\t }\n\n\t\t .df-review-sitemap-list button:hover .df-review-sitemap-count,\n\t\t .df-review-sitemap-list button.is-active .df-review-sitemap-count {\n\t\t background: var(--df-review-accent-hover);\n\t\t }\n\n\t\t .df-review-settings-modal {\n\t\t position: fixed;\n\t\t inset: 0;\n\t\t z-index: 1001;\n\t\t display: grid;\n\t\t place-items: center;\n\t\t padding: 24px;\n\t\t }\n\n\t\t .df-review-settings-backdrop {\n\t\t position: absolute;\n\t\t inset: 0;\n\t\t min-height: 0;\n\t\t border: 0;\n\t\t border-radius: 0;\n\t\t padding: 0;\n\t\t background: var(--df-review-color-backdrop);\n\t\t }\n\n\t\t .df-review-settings-dialog {\n\t\t position: relative;\n\t\t z-index: 1;\n\t\t display: grid;\n\t\t width: min(460px, calc(100vw - 48px));\n\t\t overflow: hidden;\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-lg);\n\t\t background: var(--df-review-panel);\n\t\t box-shadow: var(--df-review-shadow-modal);\n\t\t }\n\n\t\t .df-review-settings-header {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t justify-content: space-between;\n\t\t gap: 12px;\n\t\t min-height: 54px;\n\t\t padding: 0 14px 0 16px;\n\t\t border-bottom: 1px solid var(--df-review-line);\n\t\t }\n\n\t\t .df-review-settings-header div {\n\t\t display: grid;\n\t\t gap: 2px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-settings-header strong {\n\t\t color: var(--df-review-text);\n\t\t font-size: var(--df-review-font-size-lg);\n\t\t }\n\n\t\t .df-review-settings-header span {\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-header button {\n\t\t display: grid;\n\t\t place-items: center;\n\t\t width: 34px;\n\t\t min-width: 34px;\n\t\t padding: 0;\n\t\t font-size: var(--df-review-font-size-md);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-body {\n\t\t display: grid;\n\t\t gap: 12px;\n\t\t padding: 16px;\n\t\t }\n\n\t\t .df-review-settings-field {\n\t\t display: grid;\n\t\t gap: 7px;\n\t\t }\n\n\t\t .df-review-settings-field span,\n\t\t .df-review-settings-label-row label {\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-label-row {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t gap: 6px;\n\t\t }\n\n\t\t .df-review-settings-help-button {\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: 20px;\n\t\t min-width: 20px;\n\t\t min-height: 20px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: 50%;\n\t\t padding: 0;\n\t\t background: transparent;\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-settings-help-button:hover,\n\t\t .df-review-settings-help-button.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t .df-review-settings-help-button svg {\n\t\t width: 13px;\n\t\t height: 13px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t stroke-width: 2.1;\n\t\t }\n\n\t\t\t .df-review-settings-token-input,\n\t\t\t .df-review-settings-text-input,\n\t\t\t .df-review-settings-select-input {\n\t\t\t display: grid;\n\t\t\t align-items: stretch;\n\t\t\t overflow: hidden;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t background: var(--df-review-bg);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input {\n\t\t\t grid-template-columns: minmax(0, 1fr) 38px;\n\t\t\t }\n\n\t\t\t .df-review-settings-text-input,\n\t\t\t .df-review-settings-select-input {\n\t\t\t grid-template-columns: minmax(0, 1fr);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input:focus-within,\n\t\t\t .df-review-settings-text-input:focus-within,\n\t\t\t .df-review-settings-select-input:focus-within {\n\t\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t\t outline-offset: 1px;\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input,\n\t\t\t .df-review-settings-text-input input,\n\t\t\t .df-review-settings-select-input select {\n\t\t\t min-width: 0;\n\t\t\t min-height: var(--df-review-control-height-lg);\n\t\t\t border: 0;\n\t\t padding: 0 10px;\n\t\t background: transparent;\n\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input:focus,\n\t\t\t .df-review-settings-text-input input:focus,\n\t\t\t .df-review-settings-select-input select:focus {\n\t\t\t outline: 0;\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input.is-token-masked {\n\t\t\t -webkit-text-security: disc;\n\t\t\t }\n\n\t\t\t .df-review-settings-select-input select {\n\t\t\t appearance: none;\n\t\t\t cursor: pointer;\n\t\t\t }\n\n\t\t .df-review-settings-token-toggle {\n\t\t display: grid;\n\t\t place-items: center;\n\t\t width: 38px;\n\t\t min-width: 38px;\n\t\t min-height: var(--df-review-control-height-lg);\n\t\t border: 0;\n\t\t border-left: 1px solid var(--df-review-line-soft);\n\t\t border-radius: 0;\n\t\t padding: 0;\n\t\t background: transparent;\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-settings-token-toggle:hover {\n\t\t background: var(--df-review-chip-bg);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-settings-token-toggle svg {\n\t\t width: 16px;\n\t\t height: 16px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t stroke-width: 2;\n\t\t }\n\n\t\t .df-review-settings-guide {\n\t\t margin-top: -2px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 9px 11px;\n\t\t background: var(--df-review-chip-bg);\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 700;\n\t\t line-height: 1.55;\n\t\t }\n\n\t\t .df-review-settings-guide ol {\n\t\t display: grid;\n\t\t gap: 3px;\n\t\t margin: 0;\n\t\t padding-left: 17px;\n\t\t }\n\n\t\t .df-review-settings-status {\n\t\t min-height: 20px;\n\t\t margin: 0;\n\t\t color: var(--df-review-accent);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-actions {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(0, 1fr) auto auto;\n\t\t gap: 8px;\n\t\t align-items: center;\n\t\t }\n\n\t\t .df-review-settings-actions button {\n\t\t padding: 0 12px;\n\t\t }\n\n\t\t\t .df-review-settings-actions button[type='submit'] {\n\t\t\t border-color: var(--df-review-accent);\n\t\t\t background: var(--df-review-accent-soft);\n\t\t\t color: var(--df-review-accent);\n\t\t\t }\n\n\t\t\t .df-review-prompt-modal {\n\t\t\t position: fixed;\n\t\t\t inset: 0;\n\t\t\t z-index: 1002;\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t padding: 24px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-backdrop {\n\t\t\t position: absolute;\n\t\t\t inset: 0;\n\t\t\t min-height: 0;\n\t\t\t border: 0;\n\t\t\t border-radius: 0;\n\t\t\t padding: 0;\n\t\t\t background: var(--df-review-color-backdrop);\n\t\t\t }\n\n\t\t\t .df-review-prompt-dialog {\n\t\t\t position: relative;\n\t\t\t z-index: 1;\n\t\t\t display: grid;\n\t\t\t grid-template-rows: auto minmax(0, 1fr);\n\t\t\t\t width: min(1040px, calc(100vw - 36px));\n\t\t\t\t max-height: min(900px, calc(100vh - 36px));\n\t\t\t overflow: hidden;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-lg);\n\t\t\t background: var(--df-review-panel);\n\t\t\t box-shadow: var(--df-review-shadow-modal);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t justify-content: space-between;\n\t\t\t gap: 12px;\n\t\t\t min-height: 54px;\n\t\t\t padding: 0 14px 0 16px;\n\t\t\t border-bottom: 1px solid var(--df-review-line);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header div {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-lg);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header span {\n\t\t\t overflow: hidden;\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t text-overflow: ellipsis;\n\t\t\t white-space: nowrap;\n\t\t\t }\n\n\t\t\t .df-review-prompt-header button {\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t width: 34px;\n\t\t\t min-width: 34px;\n\t\t\t padding: 0;\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-body {\n\t\t\t display: grid;\n\t\t\t gap: 12px;\n\t\t\t min-height: 0;\n\t\t\t overflow: auto;\n\t\t\t padding: 16px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-tabs {\n\t\t\t display: grid;\n\t\t\t grid-template-columns: repeat(2, minmax(0, 1fr));\n\t\t\t gap: 4px;\n\t\t\t padding: 3px;\n\t\t\t border: 1px solid var(--df-review-line-soft);\n\t\t\t border-radius: 7px;\n\t\t\t background: var(--df-review-line-soft);\n\t\t\t }\n\n\t\t\t .df-review-prompt-tabs button {\n\t\t\t min-width: 0;\n\t\t\t min-height: 32px;\n\t\t\t padding: 0 10px;\n\t\t\t border-color: transparent;\n\t\t\t background: transparent;\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-tabs button:hover,\n\t\t\t .df-review-prompt-tabs button.is-active {\n\t\t\t border-color: var(--df-review-line);\n\t\t\t background: var(--df-review-panel);\n\t\t\t color: var(--df-review-text);\n\t\t\t }\n\n\t\t\t .df-review-prompt-block {\n\t\t\t display: grid;\n\t\t\t gap: 8px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t justify-content: space-between;\n\t\t\t gap: 12px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header div {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header span {\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header button {\n\t\t\t display: inline-flex;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-height: 30px;\n\t\t\t padding: 0 10px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header button:disabled {\n\t\t\t cursor: not-allowed;\n\t\t\t opacity: 0.5;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header svg {\n\t\t\t width: 13px;\n\t\t\t height: 13px;\n\t\t\t fill: none;\n\t\t\t stroke: currentColor;\n\t\t\t stroke-linecap: round;\n\t\t\t stroke-linejoin: round;\n\t\t\t stroke-width: 2;\n\t\t\t }\n\n\t\t\t\t .df-review-prompt-block textarea {\n\t\t\t\t width: 100%;\n\t\t\t\t height: min(520px, calc(100vh - 290px));\n\t\t\t\t min-height: 360px;\n\t\t\t\t max-height: calc(100vh - 290px);\n\t\t\t resize: vertical;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t padding: 10px;\n\t\t\t background: var(--df-review-bg);\n\t\t\t color: var(--df-review-text);\n\t\t\t font-family: var(--df-review-font-mono);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 600;\n\t\t\t line-height: 1.5;\n\t\t\t white-space: pre;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block textarea:focus {\n\t\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t\t outline-offset: 1px;\n\t\t\t }\n\n\t\t\t\t .df-review-tools {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t justify-content: space-between;\n\t\t gap: 12px;\n\t\t width: 100%;\n\t\t max-width: 1440px;\n\t\t min-width: 0;\n\t\t margin: 0 auto;\n\t\t }\n\n\t\t .df-review-tool-controls {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t justify-content: flex-start;\n\t\t gap: 12px;\n\t\t min-width: 0;\n\t\t flex-wrap: wrap;\n\t }\n\n\t\t .df-review-presets,\n\t\t .df-review-mode,\n\t .df-review-overlays {\n\t display: flex;\n\t align-items: center;\n\t gap: var(--df-review-space-1-5);\n\t min-height: calc(var(--df-review-control-height-lg) + 6px);\n\t padding: 3px;\n\t border: 1px solid var(--df-review-line-soft);\n\t border-radius: var(--df-review-radius-md);\n\t background: var(--df-review-card);\n\t }\n\n\t\t .df-review-tool-divider,\n\t\t .df-review-mode-divider {\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t color: var(--df-review-line);\n\t\t font-size: var(--df-review-font-size-2xl);\n\t\t font-weight: 700;\n\t line-height: 1;\n\t\t user-select: none;\n\t }\n\n\t\t .df-review-active-size {\n\t\t flex: 0 0 auto;\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t min-height: var(--df-review-control-height-lg);\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-variant-numeric: tabular-nums;\n\t font-weight: 800;\n\t line-height: 1;\n\t }\n\n\t .df-review-presets button {\n\t display: inline-flex;\n\t align-items: center;\n gap: 7px;\n min-height: var(--df-review-control-height-lg);\n padding: 0 11px 0 9px;\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-presets button svg {\n width: 16px;\n height: 16px;\n flex: 0 0 auto;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n }\n\n .df-review-preset-count {\n min-width: 16px;\n padding: 0 5px;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-line-soft);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 16px;\n text-align: center;\n }\n\n .df-review-presets button.is-active .df-review-preset-count {\n background: var(--df-review-accent-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-presets button.is-active {\n color: var(--df-review-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n }\n\n .df-review-preset-copy {\n display: grid;\n gap: 1px;\n min-width: 0;\n text-align: left;\n line-height: 1.05;\n }\n\n .df-review-preset-copy strong {\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-sm);\n }\n\n\t .df-review-overlay-button,\n\t .df-review-mode-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n\t width: 38px;\n\t min-width: 38px;\n\t padding: 0;\n\t border-color: transparent;\n\t background: transparent;\n\t box-shadow: none;\n\t color: var(--df-review-muted);\n\t }\n\n .df-review-overlay-button svg,\n .df-review-mode-button svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n\t }\n\n\n\n\n\n\n\n\t\t .df-review-overlay-button.is-settings {\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-overlay-button.is-settings:hover {\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t .df-review-overlay-button.is-disabled,\n\t .df-review-overlay-button.is-disabled:hover {\n\t cursor: not-allowed;\n\t border-color: var(--df-review-line);\n\t background: var(--df-review-line-soft);\n\t color: var(--df-review-subtle);\n\t }\n\n\t @container (max-width: 1040px) {\n\t .df-review-tools {\n\t flex-direction: column;\n\t align-items: stretch;\n\t justify-content: flex-start;\n\t }\n\n\t .df-review-tool-controls {\n\t width: 100%;\n\t }\n\n\t .df-review-presets {\n\t flex-wrap: wrap;\n\t }\n\n\t .df-review-overlays {\n\t width: 100%;\n\t justify-content: flex-start;\n\t }\n\t }\n\n\t .df-review-side-rail {\n\t grid-column: 3;\n\t grid-row: 1 / span 2;\n\t display: flex;\n\t align-items: stretch;\n\t justify-content: center;\n\t min-width: 0;\n\t min-height: 0;\n\t border-left: 1px solid var(--df-review-line);\n\t background: var(--df-review-side-rail);\n\t }\n\n .df-review-side-toggle {\n display: grid;\n grid-template-rows: 28px auto;\n align-items: start;\n justify-items: center;\n gap: 8px;\n width: 100%;\n min-height: 100%;\n border: 0;\n\t border-radius: 0;\n\t padding: 10px 0;\n\t background: transparent;\n\t color: var(--df-review-muted);\n\t }\n\n\t .df-review-side-toggle:hover {\n\t background: var(--df-review-accent-soft);\n\t color: var(--df-review-text);\n\t }\n\n .df-review-side-toggle span {\n display: grid;\n place-items: center;\n\t width: 20px;\n\t height: 24px;\n\t line-height: 1;\n\t }\n\n\t .df-review-side-toggle svg {\n\t width: 18px;\n\t height: 18px;\n\t fill: none;\n\t stroke: currentColor;\n\t stroke-linecap: round;\n\t stroke-width: 2;\n\t }\n\n .df-review-side-toggle strong {\n writing-mode: vertical-rl;\n text-orientation: mixed;\n color: inherit;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n letter-spacing: 0.08em;\n }\n\n\t .df-review-qa-panel {\n\t grid-column: 2;\n\t grid-row: 1 / span 2;\n\t display: grid;\n\t grid-template-rows: minmax(0, 1fr);\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t border-left: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-panel), var(--df-review-bg));\n\t }\n\n\t .df-review-shell:not(.is-list-visible) .df-review-qa-panel {\n\t visibility: hidden;\n\t border-left: 0;\n\t }\n\n\t .df-review-panel-body {\n\t display: grid;\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t }\n\n .df-review-item-list {\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n min-width: 0;\n min-height: 0;\n }\n\n\t\t\t .df-review-list-header {\n\t\t\t display: grid;\n\t\t\t grid-template-rows: auto auto;\n\t\t\t gap: var(--df-review-space-2);\n\t\t\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t\t\t border-bottom: 1px solid var(--df-review-line-soft);\n\t\t\t background: var(--df-review-card);\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-list-toolbar {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n\t\t\t .df-review-list-title {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t gap: 8px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-list-title span {\n\t\t min-width: 0;\n\t\t overflow: hidden;\n\t\t text-overflow: ellipsis;\n\t\t white-space: nowrap;\n\t\t }\n\n\t\t .df-review-list-title strong {\n\t\t flex: 0 0 auto;\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-variant-numeric: tabular-nums;\n\t\t }\n\n .df-review-presence-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n gap: 5px;\n min-width: 0;\n }\n\n .df-review-presence-label {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n }\n\n .df-review-presence-label svg {\n width: 12px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n .df-review-presence-list {\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-presence-chip {\n --df-review-presence-color: var(--df-review-accent);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n flex: 0 1 auto;\n min-height: 22px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n color: var(--df-review-text);\n background: var(--df-review-chip-bg);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .df-review-presence-chip.is-self {\n border-color: var(--df-review-presence-color);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-presence-dot {\n width: 7px;\n min-width: 7px;\n height: 7px;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-presence-color);\n }\n\n .df-review-presence-name {\n min-width: 0;\n }\n\n\t\t .df-review-list-controls {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t gap: 4px;\n\t\t }\n\n\t\t .df-review-source-select {\n\t\t width: 104px;\n\t\t min-height: 30px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0 24px 0 8px;\n\t\t color: var(--df-review-text);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-source-refresh {\n\t\t position: relative;\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: 30px;\n\t\t min-width: 30px;\n\t\t height: 30px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0;\n\t\t color: var(--df-review-muted);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t }\n\n\t\t .df-review-source-refresh svg {\n\t\t width: 14px;\n\t\t height: 14px;\n\t\t }\n\n\t\t\t .df-review-filter-tabs {\n display: flex;\n align-items: center;\n gap: 2px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-card);\n box-shadow: var(--df-review-shadow-control);\n }\n\n\t\t\t\t .df-review-filter-tab {\n position: relative;\n display: grid;\n place-items: center;\n width: 26px;\n min-width: 26px;\n height: 26px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--df-review-subtle);\n }\n\n\t\t\t\t .df-review-filter-icon {\n display: grid;\n place-items: center;\n width: 100%;\n height: 100%;\n }\n\n\t\t\t\t .df-review-filter-separator {\n\t\t\t\t display: block;\n\t\t\t\t width: 18px;\n\t\t\t\t height: 1px;\n\t\t\t\t border-radius: var(--df-review-radius-pill);\n\t\t\t\t background: currentColor;\n\t\t\t\t opacity: 0.42;\n\t\t\t\t }\n\n\t\t .df-review-filter-tab:hover,\n\t\t .df-review-filter-tab.is-active {\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-filter-tab.is-active {\n\t\t box-shadow: inset 0 0 0 1px rgba(124, 199, 255, 0.42);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t\t\t .df-review-filter-icon svg {\n\t\t\t\t width: 15px;\n\t\t\t\t height: 15px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t\t stroke-width: 2;\n\t\t\t }\n\n\t\t\t .df-review-filter-count {\n\t\t\t color: currentColor;\n\t\t\t font-size: var(--df-review-font-size-3xs);\n\t\t\t font-weight: 900;\n\t\t\t font-variant-numeric: tabular-nums;\n\t\t\t line-height: 1;\n\t\t\t }\n\n .df-review-list-scroll {\n display: grid;\n align-content: start;\n gap: var(--df-review-space-2);\n min-height: 0;\n overflow: auto;\n padding: var(--df-review-space-2);\n }\n\n\t .df-review-empty {\n\t margin: 0;\n\t padding: var(--df-review-space-5) var(--df-review-space-4);\n\t border: 1px dashed var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: var(--df-review-card);\n\t color: var(--df-review-subtle);\n\t font-size: var(--df-review-font-size-sm);\n\t line-height: 1.45;\n\t }\n\n .df-review-item-card.is-dim {\n opacity: 0.4;\n }\n\n .df-review-item-card.is-dim:hover {\n opacity: 0.72;\n }\n\n\t .df-review-item-card {\n\t\t position: relative;\n\t\t display: grid;\n\t\t gap: var(--df-review-space-2);\n\t\t padding: var(--df-review-space-3);\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-lg);\n\t\t background: var(--df-review-card);\n\t\t cursor: pointer;\n\t\t transition: border-color 140ms ease, background 140ms ease, opacity 140ms ease, transform 140ms ease;\n\t\t }\n\n\t .df-review-item-card:not(.is-dim) {\n border-left: 3px solid var(--df-review-accent);\n padding-left: calc(var(--df-review-space-3) - 2px);\n }\n\n .df-review-item-card:not(.is-dim):hover {\n border-color: var(--df-review-line);\n background: var(--df-review-card-hover);\n transform: translateY(-1px);\n }\n\n .df-review-item-card.is-active {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-accent-soft);\n\t box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n\t }\n\n .df-review-item-card.is-overlay-hidden .df-review-item-main {\n opacity: 0.68;\n }\n\n .df-review-item-header {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n gap: 8px;\n min-width: 0;\n }\n\n .df-review-item-main {\n display: grid;\n gap: 4px;\n min-width: 0;\n\t border: 0;\n\t padding: 0;\n\t text-align: left;\n\t background: transparent;\n\t color: var(--df-review-text);\n\t }\n\n .df-review-item-main strong {\n overflow-wrap: anywhere;\n font-size: var(--df-review-font-size-md);\n line-height: 1.35;\n }\n\n .df-review-item-comment {\n padding: 5px 0;\n white-space: pre-wrap;\n }\n\n\t .df-review-item-main small {\n\t color: var(--df-review-subtle);\n\t font-size: var(--df-review-font-size-xs);\n\t }\n\n .df-review-item-error {\n color: var(--df-review-danger) !important;\n overflow-wrap: anywhere;\n }\n\n .df-review-item-badges {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-item-id,\n .df-review-item-scope,\n .df-review-item-mode,\n .df-review-item-status-badge,\n .df-review-item-status-select {\n --df-review-scope: var(--df-review-accent);\n --df-review-scope-rgb: 124, 199, 255;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-height: 20px;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n text-transform: uppercase;\n }\n\n .df-review-item-id {\n border-color: var(--df-review-line);\n background: rgba(255, 255, 255, 0.03);\n color: var(--df-review-text);\n }\n\n .df-review-item-scope {\n border-color: rgba(var(--df-review-scope-rgb), 0.36);\n background: rgba(var(--df-review-scope-rgb), 0.12);\n color: var(--df-review-scope);\n }\n\n .df-review-item-scope.is-scope-tablet {\n --df-review-scope: var(--df-review-area);\n --df-review-scope-rgb: 99, 215, 199;\n }\n\n .df-review-item-scope.is-scope-desktop {\n --df-review-scope: var(--df-review-note);\n --df-review-scope-rgb: 243, 183, 95;\n }\n\n .df-review-item-scope.is-scope-wide {\n --df-review-scope: var(--df-review-purple);\n --df-review-scope-rgb: 201, 156, 255;\n }\n\n .df-review-item-scope.is-scope-dom {\n --df-review-scope: var(--df-review-danger);\n --df-review-scope-rgb: 255, 143, 97;\n }\n\n .df-review-item-scope svg,\n .df-review-item-mode svg {\n width: 12px;\n height: 12px;\n flex: 0 0 auto;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n\t .df-review-item-mode {\n\t color: var(--df-review-muted);\n background: var(--df-review-line-soft);\n }\n\n .df-review-item-mode.is-mode-area {\n color: var(--df-review-area);\n }\n\n .df-review-item-mode.is-mode-dom {\n color: var(--df-review-danger);\n }\n\n .df-review-item-status-badge {\n border-color: var(--df-review-line);\n color: var(--df-review-muted);\n background: var(--df-review-line-soft);\n }\n\n .df-review-item-status-select {\n max-width: 86px;\n cursor: pointer;\n border-color: var(--df-review-line);\n color: var(--df-review-text);\n background: var(--df-review-control);\n outline: 0;\n }\n\n .df-review-item-status-select:focus-visible {\n border-color: var(--df-review-accent);\n box-shadow: 0 0 0 2px var(--df-review-accent-soft);\n }\n\n .df-review-item-status-badge.is-error {\n border-color: rgba(255, 143, 97, 0.36);\n color: var(--df-review-danger);\n background: var(--df-review-danger-soft);\n }\n\n\t .df-review-item-main img {\n\t width: 100%;\n\t max-height: 110px;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t object-fit: cover;\n\t background: var(--df-review-control);\n }\n\n\t .df-review-item-header-actions {\n\t display: inline-flex;\n\t align-items: center;\n\t justify-content: flex-end;\n\t gap: 4px;\n\t cursor: auto;\n\t }\n\n .df-review-item-delete,\n .df-review-item-visibility {\n display: inline-grid;\n place-items: center;\n width: 24px;\n height: 24px;\n border: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n }\n\n .df-review-item-visibility.is-visible {\n color: var(--df-review-accent);\n }\n\n .df-review-item-visibility.is-hidden {\n opacity: 0.7;\n color: var(--df-review-subtle);\n }\n\n .df-review-item-delete svg,\n .df-review-item-visibility svg {\n width: 14px;\n height: 14px;\n }\n\n\t\t\t\t .df-review-item-actions {\n\t\t\t\t display: grid;\n\t\t\t\t grid-template-columns: auto minmax(0, 1fr) auto;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-item-prompt-actions {\n\t\t\t display: inline-grid;\n\t\t\t grid-template-columns: auto 28px;\n\t\t align-items: stretch;\n\t\t\t min-width: 0;\n\t\t cursor: auto;\n\t\t\t }\n\n\t\t\t .df-review-item-remote-actions {\n\t\t\t display: inline-flex;\n\t\t\t grid-column: 3;\n\t\t\t align-items: center;\n\t\t\t justify-content: flex-end;\n\t\t\t gap: 6px;\n\t\t\t min-width: 0;\n\t\t cursor: auto;\n\t\t\t }\n\n\t .df-review-item-prompt {\n\t display: inline-flex;\n\t align-items: center;\n\t min-height: 28px;\n\t padding: 0 8px;\n\t border-top-right-radius: 0;\n\t border-bottom-right-radius: 0;\n\t font-size: var(--df-review-font-size-2xs);\n\t text-transform: uppercase;\n\t }\n\n\t .df-review-item-prompt-copy {\n\t position: relative;\n\t display: inline-grid;\n\t place-items: center;\n\t width: 28px;\n\t min-width: 28px;\n\t min-height: 28px;\n\t border-left: 0;\n\t border-top-left-radius: 0;\n\t border-bottom-left-radius: 0;\n\t padding: 0;\n\t }\n\n\t .df-review-item-prompt-copy.is-copied {\n\t border-color: var(--df-review-accent);\n\t color: var(--df-review-accent);\n\t }\n\n\t .df-review-item-prompt-copy svg {\n\t width: 12px;\n\t height: 12px;\n\t fill: none;\n\t stroke: currentColor;\n\t stroke-linecap: round;\n\t stroke-linejoin: round;\n\t stroke-width: 2;\n\t }\n\n .df-review-item-action-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: 30px;\n min-width: 30px;\n height: 28px;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: var(--df-review-control);\n }\n\n\t .df-review-item-action-button:hover:not(:disabled) {\n\t border-color: rgba(124, 199, 255, 0.42);\n\t color: var(--df-review-text);\n\t background: var(--df-review-control-hover);\n\t }\n\n\t\t .df-review-item-submit-button {\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t gap: 6px;\n\t\t width: auto;\n\t\t min-width: 0;\n\t\t padding: 0 9px;\n\t\t border-color: rgba(124, 199, 255, 0.46);\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t .df-review-item-submit-button span {\n\t\t font-size: var(--df-review-font-size-2xs);\n\t\t font-weight: 900;\n\t\t line-height: 1;\n\t\t white-space: nowrap;\n\t\t }\n\n\t .df-review-item-submit-button:hover:not(:disabled) {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-accent-hover);\n\t color: var(--df-review-text);\n\t }\n\n .df-review-item-action-button:disabled {\n cursor: default;\n opacity: 0.45;\n }\n\n .df-review-item-action-button svg {\n width: 14px;\n height: 14px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n\t .df-review-stage {\n\t grid-column: 1;\n\t grid-row: 2;\n\t display: grid;\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t }\n\n .df-review-frame {\n display: grid;\n grid-template-rows: minmax(0, 1fr) auto;\n min-width: 0;\n min-height: 0;\n }\n\n .df-review-frame-actions {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 56px;\n padding: 8px 40px 10px;\n border-top: 1px solid var(--df-review-line-soft);\n background: var(--df-review-mode-bar);\n }\n\n\t .df-review-frame-scroll {\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: auto;\n\t }\n\n\t .df-review-frame-canvas {\n\t display: grid;\n\t place-items: center;\n\t width: max-content;\n\t height: max-content;\n\t min-width: 100%;\n\t min-height: 100%;\n\t padding: 34px 40px 12px;\n\t }\n\n .df-review-device {\n\t box-sizing: border-box;\n\t flex: 0 0 auto;\n\t position: relative;\n\t margin: 0;\n\t overflow: hidden;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: #fff;\n\t box-shadow: var(--df-review-shadow-device);\n }\n\n .df-review-device iframe {\n display: block;\n width: inherit;\n height: inherit;\n min-width: inherit;\n min-height: inherit;\n border: 0;\n background: #fff;\n }\n\n .df-review-device-frame {\n position: relative;\n box-sizing: border-box;\n flex: 0 0 auto;\n }\n\n .df-review-ruler-corner {\n position: absolute;\n left: -26px;\n top: -26px;\n width: 26px;\n height: 26px;\n z-index: 6;\n border-right: 1px solid var(--df-review-line-soft);\n border-bottom: 1px solid var(--df-review-line-soft);\n background: rgba(10, 13, 18, 0.92);\n }\n\n .df-review-ruler-gutter {\n position: absolute;\n z-index: 6;\n background: rgba(10, 13, 18, 0.92);\n color: var(--df-review-muted);\n user-select: none;\n }\n\n .df-review-ruler-gutter.is-x {\n left: 0;\n right: 0;\n top: -26px;\n height: 26px;\n border-bottom: 1px solid var(--df-review-line-soft);\n background-image:\n linear-gradient(to right, rgba(179, 149, 255, 0.75) 1px, transparent 1px),\n linear-gradient(to right, rgba(237, 243, 251, 0.2) 1px, transparent 1px);\n background-size:\n calc(var(--df-review-ruler-step-x) * 5) 11px,\n var(--df-review-ruler-step-x) 6px;\n background-position: left bottom;\n background-repeat: repeat-x;\n }\n\n .df-review-ruler-gutter.is-y {\n left: -26px;\n top: 0;\n bottom: 0;\n width: 26px;\n border-right: 1px solid var(--df-review-line-soft);\n background-image:\n linear-gradient(to bottom, rgba(179, 149, 255, 0.75) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(237, 243, 251, 0.2) 1px, transparent 1px);\n background-size:\n 11px calc(var(--df-review-ruler-step-y) * 5),\n 6px var(--df-review-ruler-step-y);\n background-position: right top;\n background-repeat: repeat-y;\n }\n\n .df-review-ruler-frame-label {\n position: absolute;\n right: 6px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 7px;\n border-radius: 5px;\n background: rgba(20, 24, 32, 0.92);\n line-height: 1;\n white-space: nowrap;\n }\n\n .df-review-ruler-frame-label strong {\n color: #e1d8ff;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n }\n\n .df-review-ruler-frame-label span {\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n }\n\n .df-review-ruler-coord {\n position: absolute;\n z-index: 7;\n padding: 2px 4px;\n border-radius: 4px;\n background: #b395ff;\n color: #14111f;\n font-size: var(--df-review-font-size-3xs);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n pointer-events: none;\n }\n\n .df-review-ruler-coord.is-x {\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n .df-review-ruler-coord.is-y {\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n .df-review-ruler-overlay {\n position: absolute;\n left: 0;\n top: 0;\n width: inherit;\n height: inherit;\n z-index: 5;\n cursor: crosshair;\n overflow: hidden;\n touch-action: none;\n user-select: none;\n }\n\n .df-review-ruler-overlay.is-dragging {\n cursor: crosshair;\n }\n\n .df-review-ruler-guide {\n position: absolute;\n z-index: 2;\n pointer-events: none;\n background: rgba(255, 255, 255, 0.74);\n box-shadow: 0 0 0 1px rgba(87, 55, 166, 0.45);\n }\n\n .df-review-ruler-guide.is-x {\n left: 0;\n right: 0;\n height: 1px;\n }\n\n .df-review-ruler-guide.is-y {\n top: 0;\n bottom: 0;\n width: 1px;\n }\n\n .df-review-ruler-selection {\n position: absolute;\n z-index: 3;\n pointer-events: none;\n border: 1px solid #c9b8ff;\n background: rgba(179, 149, 255, 0.16);\n box-shadow:\n inset 0 0 0 1px rgba(20, 12, 40, 0.38),\n 0 0 0 1px rgba(20, 12, 40, 0.38);\n }\n\n .df-review-ruler-label {\n position: absolute;\n z-index: 4;\n pointer-events: none;\n min-width: 156px;\n padding: 7px 8px;\n border: 1px solid rgba(237, 243, 251, 0.22);\n border-radius: var(--df-review-radius-sm);\n background: rgba(10, 13, 18, 0.9);\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n box-shadow: 0 8px 22px rgba(0, 0, 0, 0.34);\n }\n\n\t @media (max-width: 860px) {\n\t .df-review-shell,\n\t .df-review-shell.is-list-visible {\n\t grid-template-columns: minmax(0, 1fr) 0 32px;\n\t grid-template-rows: auto minmax(0, 1fr);\n\t }\n\n\t .df-review-shell.is-list-visible {\n\t grid-template-columns: minmax(0, 1fr) minmax(260px, 70vw) 32px;\n\t }\n\n\t .df-review-qa-panel {\n\t border-left: 1px solid var(--df-review-line);\n\t border-bottom: 0;\n\t }\n\n\t .df-review-tools {\n\t flex-wrap: wrap;\n\t }\n\n\t .df-review-tool-controls {\n\t justify-content: flex-start;\n\t }\n\n .df-review-frame-actions {\n padding: 8px 20px 10px;\n }\n\n\t .df-review-frame-canvas {\n\t padding: 34px 28px 12px;\n\t }\n\n\t\t .df-review-prompt-modal {\n\t\t padding: 12px;\n\t\t }\n\n\t\t .df-review-prompt-dialog {\n\t\t width: calc(100vw - 24px);\n\t\t max-height: calc(100vh - 24px);\n\t\t }\n\n\t\t .df-review-prompt-block textarea {\n\t\t height: min(360px, calc(100vh - 270px));\n\t\t min-height: 240px;\n\t\t max-height: calc(100vh - 270px);\n\t\t }\n\n\t .df-review-panel-body {\n\t min-height: 0;\n\t }\n }\n `;\n document.head.append(style);\n }\n}\n","import type { ReviewItem } from './types';\n\nexport function getItemRouteKey(\n item: Pick<ReviewItem, 'routeKey' | 'normalizedPath'>\n) {\n return item.routeKey || normalizeRoutePath(item.normalizedPath);\n}\n\nexport function normalizeRoutePath(pathname: string) {\n const [pathWithoutQuery] = pathname.split(/[?#]/);\n const path = (pathWithoutQuery || '/').replace(/\\/index\\.html$/, '/');\n return path.startsWith('/') ? path : `/${path}`;\n}\n","import { getItemRouteKey } from '../route';\nimport { matchesReviewItemStatus } from '../status';\nimport type {\n LocalAdapterOptions,\n ReviewItem,\n WebReviewKitAdapter,\n} from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'df-web-review-kit:items';\n\nexport function localAdapter(\n options: LocalAdapterOptions = {}\n): WebReviewKitAdapter {\n const storageKey = options.storageKey ?? DEFAULT_STORAGE_KEY;\n\n const write = (items: ReviewItem[]) => {\n window.localStorage.setItem(storageKey, JSON.stringify(items));\n };\n\n const read = (): ReviewItem[] => {\n if (typeof window === 'undefined') return [];\n\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return [];\n\n try {\n const value = JSON.parse(raw);\n if (!Array.isArray(value)) return [];\n\n let changed = false;\n const items = value.flatMap((item) => {\n const normalized = normalizeStoredReviewItem(item);\n if (!normalized || normalized !== item) changed = true;\n return normalized ? [normalized] : [];\n });\n const numberedItems = ensureStoredReviewNumbers(items);\n if (numberedItems !== items) changed = true;\n\n if (changed) write(numberedItems);\n return numberedItems;\n } catch {\n return [];\n }\n };\n\n return {\n async get(id) {\n return read().find((item) => item.id === id) ?? null;\n },\n\n async list(query) {\n return read().filter((item) => {\n if (item.projectId !== query.projectId) return false;\n const queryRouteKey = query.routeKey ?? query.normalizedPath;\n if (\n queryRouteKey &&\n getItemRouteKey(item) !== queryRouteKey\n ) {\n return false;\n }\n if (query.status && !matchesReviewItemStatus(item.status, query.status)) {\n return false;\n }\n return true;\n });\n },\n\n async create(item) {\n const items = read();\n items.unshift(item);\n write(items);\n return item;\n },\n\n async update(id, patch) {\n const items = read();\n const index = items.findIndex((item) => item.id === id);\n\n if (index < 0) {\n throw new Error(`Review item not found: ${id}`);\n }\n\n const next: ReviewItem = {\n ...items[index],\n ...patch,\n id,\n createdAt: items[index].createdAt,\n updatedAt: new Date().toISOString(),\n };\n\n items[index] = next;\n write(items);\n return next;\n },\n\n async remove(id) {\n write(read().filter((item) => item.id !== id));\n },\n };\n}\n\nfunction normalizeStoredReviewItem(value: unknown): ReviewItem | undefined {\n if (!value || typeof value !== 'object') return undefined;\n\n const raw = value as Omit<ReviewItem, 'kind'> & {\n kind?: string;\n screenshot?: unknown;\n };\n const kind =\n raw.kind === 'text' ? 'note' :\n raw.kind === 'capture' ? 'area' :\n raw.kind;\n\n if (kind !== 'note' && kind !== 'area') return undefined;\n\n const { screenshot: _screenshot, ...item } = raw;\n\n if (kind === raw.kind && _screenshot === undefined) {\n return raw as ReviewItem;\n }\n\n return {\n ...item,\n kind,\n } as ReviewItem;\n}\n\nfunction ensureStoredReviewNumbers(items: ReviewItem[]) {\n const usedNumbers = new Set<number>();\n let maxNumber = 0;\n let changed = false;\n\n items.forEach((item) => {\n const number = normalizeReviewNumber(item.reviewNumber);\n if (!number) {\n changed = true;\n return;\n }\n\n if (usedNumbers.has(number)) {\n changed = true;\n return;\n }\n\n usedNumbers.add(number);\n maxNumber = Math.max(maxNumber, number);\n });\n\n if (!changed) return items;\n\n let nextNumber = maxNumber + 1;\n const assignedNumbers = new Set<number>();\n const numberById = new Map<string, number>();\n\n [...items]\n .sort((a, b) => {\n const createdOrder = a.createdAt.localeCompare(b.createdAt);\n if (createdOrder !== 0) return createdOrder;\n return a.id.localeCompare(b.id);\n })\n .forEach((item) => {\n const storedNumber = normalizeReviewNumber(item.reviewNumber);\n const reviewNumber =\n storedNumber && !assignedNumbers.has(storedNumber)\n ? storedNumber\n : nextNumber++;\n\n assignedNumbers.add(reviewNumber);\n numberById.set(item.id, reviewNumber);\n });\n\n return items.map((item) => {\n const reviewNumber = numberById.get(item.id);\n return item.reviewNumber === reviewNumber ? item : { ...item, reviewNumber };\n });\n}\n\nfunction normalizeReviewNumber(value: unknown) {\n if (typeof value !== 'number') return undefined;\n if (!Number.isInteger(value) || value < 1) return undefined;\n return value;\n}\n","export function createStyleElement() {\n const style = document.createElement('style');\n style.textContent = `\n :host {\n color-scheme: dark;\n --df-review-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --df-review-font-size-2xs: 10px;\n --df-review-font-size-xs: 11px;\n --df-review-font-size-sm: 12px;\n --df-review-font-size-md: 13px;\n --df-review-font-size-xl: 15px;\n --df-review-space-1: 4px;\n --df-review-space-1-5: 6px;\n --df-review-space-2: 8px;\n --df-review-space-2-5: 10px;\n --df-review-space-3: 12px;\n --df-review-space-3-5: 14px;\n --df-review-space-4: 16px;\n --df-review-control-height-sm: 32px;\n --df-review-control-height-md: 34px;\n --df-review-radius-xs: 3px;\n --df-review-radius-sm: 6px;\n --df-review-radius-md: 8px;\n --df-review-radius-pill: 999px;\n --df-review-color-canvas: #111820;\n --df-review-color-panel: #1f2428;\n --df-review-color-panel-strong: #15191d;\n --df-review-color-control: #2c3338;\n --df-review-color-control-hover: #3b444b;\n --df-review-color-border: rgba(255, 255, 255, 0.14);\n --df-review-color-border-strong: rgba(255, 255, 255, 0.18);\n --df-review-color-text: #f7f7f2;\n --df-review-color-text-muted: rgba(247, 247, 242, 0.62);\n --df-review-color-text-subtle: rgba(247, 247, 242, 0.46);\n --df-review-color-accent: #d7ff5f;\n --df-review-color-accent-contrast: #171b1e;\n --df-review-color-accent-soft: rgba(215, 255, 95, 0.16);\n --df-review-color-accent-ring: rgba(215, 255, 95, 0.6);\n --df-review-color-area: #63d7c7;\n --df-review-color-error: #ffb7a7;\n --df-review-shadow-panel: 0 18px 48px rgba(0, 0, 0, 0.34);\n --df-review-shadow-popover: 0 16px 38px rgba(0, 0, 0, 0.32);\n --df-review-shadow-highlight: 0 10px 30px rgba(0, 0, 0, 0.22);\n font-family: var(--df-review-font-sans);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .dfwr-shell {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 500;\n pointer-events: none;\n }\n\n .dfwr-shell.is-open {\n display: block;\n }\n\n .dfwr-panel {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 3;\n width: min(380px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-panel);\n }\n\n .dfwr-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n padding: 14px 14px 10px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n }\n\n .dfwr-title {\n font-size: 15px;\n font-weight: 700;\n line-height: 1.25;\n }\n\n .dfwr-meta {\n max-width: 292px;\n margin-top: 4px;\n overflow: hidden;\n color: rgba(247, 247, 242, 0.56);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dfwr-toolbar,\n .dfwr-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 14px;\n }\n\n .dfwr-body,\n .dfwr-list {\n padding: 0 14px 14px;\n }\n\n .dfwr-list {\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n padding-top: 12px;\n }\n\n .dfwr-button,\n .dfwr-icon-button {\n appearance: none;\n border: 1px solid var(--df-review-color-border-strong);\n background: var(--df-review-color-control);\n color: var(--df-review-color-text);\n cursor: pointer;\n font: inherit;\n }\n\n .dfwr-button {\n min-height: var(--df-review-control-height-md);\n padding: 0 12px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-sm);\n font-weight: 650;\n }\n\n .dfwr-button:hover,\n .dfwr-icon-button:hover,\n .dfwr-button.is-active {\n border-color: rgba(255, 255, 255, 0.4);\n background: var(--df-review-color-control-hover);\n }\n\n .dfwr-button.is-primary {\n border-color: var(--df-review-color-accent);\n background: var(--df-review-color-accent);\n color: var(--df-review-color-accent-contrast);\n }\n\n .dfwr-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: var(--df-review-control-height-sm);\n padding: 0 8px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-xs);\n font-weight: 700;\n line-height: 1;\n text-transform: uppercase;\n }\n\n .dfwr-marker-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n }\n\n .dfwr-area-preview-layer {\n position: fixed;\n inset: 0;\n z-index: 3;\n pointer-events: none;\n }\n\n .dfwr-selection-highlight {\n position: fixed;\n z-index: 1;\n border: 2px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.12),\n 0 10px 30px rgba(0, 0, 0, 0.22);\n animation: dfwr-selection-pulse 900ms ease 0s 2;\n }\n\n .dfwr-selection-highlight.is-draft {\n border-color: #63d7c7;\n background: rgba(99, 215, 199, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 10px 30px rgba(0, 0, 0, 0.2);\n animation: none;\n }\n\n .dfwr-dom-hover {\n position: fixed;\n z-index: 2;\n border: 1px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08);\n pointer-events: none;\n }\n\n .dfwr-dom-hover[hidden] {\n display: none;\n }\n\n .dfwr-bound-marker,\n .dfwr-item-scope {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n }\n\n .dfwr-bound-marker.is-scope-tablet,\n .dfwr-item-scope.is-scope-tablet {\n --dfwr-scope: #63d7c7;\n --dfwr-scope-rgb: 99, 215, 199;\n }\n\n .dfwr-bound-marker.is-scope-desktop,\n .dfwr-item-scope.is-scope-desktop {\n --dfwr-scope: #f3b75f;\n --dfwr-scope-rgb: 243, 183, 95;\n }\n\n .dfwr-bound-marker.is-scope-wide,\n .dfwr-item-scope.is-scope-wide {\n --dfwr-scope: #c99cff;\n --dfwr-scope-rgb: 201, 156, 255;\n }\n\n .dfwr-bound-marker.is-scope-dom,\n .dfwr-item-scope.is-scope-dom {\n --dfwr-scope: #ff8f61;\n --dfwr-scope-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight,\n .dfwr-item-target-label {\n --dfwr-item-color: #7cc7ff;\n --dfwr-item-color-rgb: 124, 199, 255;\n }\n\n .dfwr-item-target-highlight.is-mode-area,\n .dfwr-item-target-label.is-mode-area {\n --dfwr-item-color: #63d7c7;\n --dfwr-item-color-rgb: 99, 215, 199;\n }\n\n .dfwr-item-target-highlight.is-mode-dom,\n .dfwr-item-target-label.is-mode-dom {\n --dfwr-item-color: #ff8f61;\n --dfwr-item-color-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight {\n position: fixed;\n z-index: 2;\n border: 2px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: rgba(var(--dfwr-item-color-rgb), 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.78),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 12px 30px rgba(0, 0, 0, 0.24);\n pointer-events: none;\n }\n\n .dfwr-item-target-highlight.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-item-target-highlight.is-highlighted {\n border-width: 3px;\n background: rgba(var(--dfwr-item-color-rgb), 0.12);\n }\n\n .dfwr-item-target-highlight.is-highlighted::after {\n content: \"\";\n position: absolute;\n inset: -6px;\n border: 2px solid var(--dfwr-item-color);\n border-radius: var(--df-review-radius-md);\n opacity: 0;\n animation: dfwr-target-ring-blink 1000ms ease-in-out infinite;\n pointer-events: none;\n }\n\n .dfwr-item-target-label {\n position: fixed;\n z-index: 3;\n display: inline-flex;\n align-items: center;\n min-width: 24px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: var(--dfwr-item-color);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-item-color-rgb), 0.2),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n pointer-events: none;\n }\n\n .dfwr-item-target-label.is-highlighted {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker {\n position: fixed;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n min-width: 28px;\n height: 22px;\n padding: 0 6px;\n transform: translate(-50%, -50%);\n border: 1px solid var(--dfwr-scope);\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-panel);\n box-shadow: 0 0 0 4px rgba(var(--dfwr-scope-rgb), 0.18);\n color: var(--dfwr-scope);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n }\n\n .dfwr-bound-marker.is-highlighted {\n min-width: 32px;\n height: 26px;\n border-width: 2px;\n box-shadow:\n 0 0 0 5px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 12px 26px rgba(0, 0, 0, 0.34);\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-bound-marker.is-note-callout,\n .dfwr-bound-marker.is-note-callout.is-highlighted {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n min-width: 0;\n width: 0;\n height: 0;\n padding: 0;\n transform: none;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n color: var(--dfwr-scope);\n animation: none;\n overflow: visible;\n }\n\n .dfwr-bound-marker.is-note-callout::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n width: 8px;\n height: 8px;\n transform: translate(-50%, -50%);\n border: 2px solid #111820;\n border-radius: var(--df-review-radius-pill);\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 6px 16px rgba(0, 0, 0, 0.28);\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted::before {\n animation: dfwr-note-dot-pulse 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon {\n position: absolute;\n left: 0;\n top: 0;\n width: 31px;\n height: 2px;\n transform: rotate(-42deg);\n transform-origin: left center;\n border-radius: var(--df-review-radius-pill);\n background: currentColor;\n opacity: 1;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::after {\n display: none;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-number {\n position: absolute;\n left: 24px;\n top: -41px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-scope);\n border-radius: 4px;\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.18),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n text-align: center;\n line-height: 1;\n white-space: nowrap;\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-icon,\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-number {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-area-preview-layer .dfwr-bound-marker {\n border-color: #63d7c7;\n background: var(--df-review-color-panel);\n box-shadow:\n 0 0 0 5px rgba(99, 215, 199, 0.2),\n 0 12px 26px rgba(0, 0, 0, 0.3);\n color: #63d7c7;\n }\n\n .dfwr-bound-marker-icon {\n position: relative;\n display: inline-block;\n width: 10px;\n height: 10px;\n flex: 0 0 auto;\n }\n\n .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker-icon::after {\n content: \"\";\n position: absolute;\n display: block;\n }\n\n .dfwr-bound-marker-icon::before {\n inset: 1px 2px;\n border: 1.5px solid currentColor;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-mobile .dfwr-bound-marker-icon::before {\n inset: 0 2.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-tablet .dfwr-bound-marker-icon::before {\n inset: 0.5px 1.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::before {\n inset: 1px 0 3px;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::after {\n left: 3px;\n right: 3px;\n bottom: 0;\n height: 1.5px;\n background: currentColor;\n }\n\n .dfwr-bound-marker.is-scope-wide .dfwr-bound-marker-icon::before {\n inset: 2px 0;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-dom .dfwr-bound-marker-icon::before {\n inset: 2px;\n border-radius: 1px;\n transform: rotate(45deg);\n }\n\n .dfwr-bound-marker-number {\n min-width: 6px;\n text-align: center;\n line-height: 1;\n }\n\n .dfwr-note-draft {\n position: fixed;\n inset: 0;\n z-index: 4;\n pointer-events: none;\n }\n\n .dfwr-note-pin {\n appearance: none;\n position: fixed;\n z-index: 5;\n width: 18px;\n height: 18px;\n padding: 0;\n transform: translate(-50%, -50%);\n border: 2px solid #1f2428;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-accent);\n box-shadow:\n 0 0 0 4px rgba(215, 255, 95, 0.22),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n cursor: grab;\n pointer-events: auto;\n }\n\n .dfwr-note-pin:active {\n cursor: grabbing;\n }\n\n .dfwr-note-popover {\n position: fixed;\n z-index: 4;\n width: min(320px, calc(100vw - 24px));\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-area-draft {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 4;\n width: min(360px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-note-popover .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-area-draft .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-form {\n display: grid;\n gap: 10px;\n }\n\n .dfwr-textarea {\n width: 100%;\n min-height: 92px;\n resize: vertical;\n border: 1px solid rgba(255, 255, 255, 0.16);\n border-radius: var(--df-review-radius-sm);\n padding: 10px;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel-strong);\n font: inherit;\n font-size: var(--df-review-font-size-md);\n line-height: 1.45;\n }\n\n .dfwr-textarea:focus {\n outline: 2px solid var(--df-review-color-accent-ring);\n outline-offset: 1px;\n }\n\n .dfwr-empty,\n .dfwr-error {\n margin: 0;\n color: rgba(247, 247, 242, 0.62);\n font-size: var(--df-review-font-size-sm);\n line-height: 1.45;\n }\n\n .dfwr-error {\n color: var(--df-review-color-error);\n }\n\n .dfwr-preview,\n .dfwr-thumb {\n display: block;\n width: 100%;\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-sm);\n object-fit: cover;\n background: var(--df-review-color-canvas);\n }\n\n .dfwr-preview {\n max-height: 180px;\n }\n\n .dfwr-thumb {\n max-height: 120px;\n margin-top: 10px;\n }\n\n .dfwr-list-heading {\n margin-bottom: 10px;\n color: rgba(247, 247, 242, 0.74);\n font-size: var(--df-review-font-size-sm);\n font-weight: 700;\n }\n\n .dfwr-item {\n display: flex;\n gap: 12px;\n justify-content: space-between;\n padding: 12px 0;\n border-top: 1px solid rgba(255, 255, 255, 0.08);\n cursor: pointer;\n }\n\n .dfwr-item:first-of-type {\n border-top: 0;\n }\n\n .dfwr-item:focus-visible {\n outline: 2px solid rgba(215, 255, 95, 0.72);\n outline-offset: 4px;\n }\n\n .dfwr-item-body {\n min-width: 0;\n flex: 1;\n }\n\n .dfwr-item-badges {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n }\n\n .dfwr-item-scope,\n .dfwr-item-kind {\n display: inline-flex;\n align-items: center;\n min-height: 20px;\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 1;\n letter-spacing: 0;\n text-transform: uppercase;\n }\n\n .dfwr-item-scope {\n border: 1px solid rgba(var(--dfwr-scope-rgb), 0.38);\n background: rgba(var(--dfwr-scope-rgb), 0.12);\n color: var(--dfwr-scope);\n }\n\n .dfwr-item-kind {\n border: 1px solid rgba(255, 255, 255, 0.12);\n background: rgba(255, 255, 255, 0.05);\n color: rgba(247, 247, 242, 0.64);\n }\n\n .dfwr-item-comment {\n margin: 4px 0;\n color: var(--df-review-color-text);\n font-size: var(--df-review-font-size-md);\n line-height: 1.42;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n .dfwr-item-date {\n color: rgba(247, 247, 242, 0.46);\n font-size: var(--df-review-font-size-xs);\n }\n\n .dfwr-item-actions {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex: 0 0 auto;\n }\n\n .dfwr-text-layer,\n .dfwr-element-layer,\n .dfwr-area-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: auto;\n }\n\n .dfwr-text-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-element-layer {\n cursor: cell;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-area-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.22);\n }\n\n .dfwr-area-box {\n position: fixed;\n z-index: 2;\n width: 0;\n height: 0;\n border: 1px solid #d7ff5f;\n background: rgba(215, 255, 95, 0.16);\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.18);\n }\n\n @keyframes dfwr-marker-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.92);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.1);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-note-dot-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.88);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.3);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-selected-blink {\n 0%,\n 100% {\n opacity: 0.78;\n }\n 50% {\n opacity: 1;\n }\n }\n\n @keyframes dfwr-target-ring-blink {\n 0%,\n 100% {\n opacity: 0;\n transform: scale(0.98);\n }\n 50% {\n opacity: 0.82;\n transform: scale(1);\n }\n }\n\n @keyframes dfwr-selection-pulse {\n 0% {\n opacity: 0.72;\n }\n 45% {\n opacity: 1;\n }\n 100% {\n opacity: 0.86;\n }\n }\n\n @media (max-width: 520px) {\n .dfwr-panel {\n right: 8px;\n top: 8px;\n width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n }\n }\n `;\n return style;\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemScope,\n ReviewViewportPreset,\n ViewportSize,\n} from '../types';\n\nexport const DEFAULT_REVIEW_VIEWPORTS: ReviewViewportPreset[] = [\n { label: 'Mobile', width: 390, height: 720, scope: 'mobile' },\n { label: 'Tablet', width: 768, height: 1024, scope: 'tablet' },\n { label: 'Desktop', width: 1440, height: 900, scope: 'desktop' },\n { label: 'Wide', width: 1980, height: 1080, scope: 'wide' },\n];\n\nconst REVIEW_SCOPE_LABELS: Record<ReviewItemScope, string> = {\n mobile: 'Mobile',\n tablet: 'Tablet',\n desktop: 'Desktop',\n wide: 'Wide',\n dom: 'Element',\n};\n\nconst normalizeReviewItemScope = (value: unknown): ReviewItemScope | undefined => {\n if (value === 'element') return 'dom';\n if (\n value === 'mobile' ||\n value === 'tablet' ||\n value === 'desktop' ||\n value === 'wide' ||\n value === 'dom'\n ) {\n return value;\n }\n\n return undefined;\n};\n\nconst getViewportPresetDistance = (\n preset: ReviewViewportPreset,\n viewport: ViewportSize\n) =>\n Math.abs(preset.width - viewport.width) +\n Math.abs(preset.height - viewport.height);\n\nconst inferViewportScope = (\n preset: ReviewViewportPreset\n): Exclude<ReviewItemScope, 'dom'> => {\n if (preset.scope) return preset.scope;\n\n const label = preset.label.toLowerCase();\n\n if (label.includes('mobile') || label.includes('phone')) return 'mobile';\n if (label.includes('tablet') || label.includes('pad')) return 'tablet';\n if (\n label.includes('wide') ||\n label.includes('1980') ||\n label.includes('1940') ||\n label.includes('1920')\n ) {\n return 'wide';\n }\n if (label.includes('desktop')) return 'desktop';\n if (preset.width >= 1800) return 'wide';\n if (preset.width >= 1000) return 'desktop';\n if (preset.width >= 700) return 'tablet';\n return 'mobile';\n};\n\nexport function findReviewViewportPreset(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const fallback = presets[0] ?? DEFAULT_REVIEW_VIEWPORTS[0];\n const exact = presets.find(\n (preset) =>\n preset.width === viewport.width && preset.height === viewport.height\n );\n\n if (exact) return exact;\n\n return presets.reduce((closest, preset) => {\n const closestDistance = getViewportPresetDistance(closest, viewport);\n const presetDistance = getViewportPresetDistance(preset, viewport);\n return presetDistance < closestDistance ? preset : closest;\n }, fallback);\n}\n\nexport function getReviewViewportScope(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): Exclude<ReviewItemScope, 'dom'> {\n return inferViewportScope(findReviewViewportPreset(viewport, presets));\n}\n\nexport function getReviewItemScope(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): ReviewItemScope {\n const scope = normalizeReviewItemScope(item.scope);\n if (scope && scope !== 'dom') return scope;\n return getReviewViewportScope(item.viewport, presets);\n}\n\nexport function getReviewItemScopeLabel(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const scope = getReviewItemScope(item, presets);\n if (scope === 'dom') return REVIEW_SCOPE_LABELS.dom;\n\n const preset = findReviewViewportPreset(item.viewport, presets);\n return preset.label || REVIEW_SCOPE_LABELS[scope];\n}\n\nexport function getNumberedReviewItems(\n items: ReviewItem[],\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): NumberedReviewItem[] {\n const numbers = new Map<string, number>();\n const usedNumbers = new Set<number>();\n let nextNumber = getNextReviewItemNumber(items);\n\n [...items]\n .sort((a, b) => {\n const createdOrder = a.createdAt.localeCompare(b.createdAt);\n if (createdOrder !== 0) return createdOrder;\n return a.id.localeCompare(b.id);\n })\n .forEach((item) => {\n const storedNumber = getReviewItemNumber(item);\n const number =\n storedNumber && !usedNumbers.has(storedNumber)\n ? storedNumber\n : nextNumber++;\n\n usedNumbers.add(number);\n numbers.set(item.id, number);\n });\n\n return items.map((item) => {\n const scope = getReviewItemScope(item, presets);\n const label = getReviewItemScopeLabel(item, presets);\n const number = numbers.get(item.id) ?? 0;\n\n return {\n item,\n scope,\n label,\n number,\n displayLabel: `#${number}`,\n };\n });\n}\n\nexport function getReviewItemNumber(item: Pick<ReviewItem, 'reviewNumber'>) {\n return normalizeReviewNumber(item.reviewNumber);\n}\n\nexport function getNextReviewItemNumber(\n items: Array<Pick<ReviewItem, 'reviewNumber'>>\n) {\n const maxNumber = items.reduce((max, item) => {\n const number = getReviewItemNumber(item);\n return number ? Math.max(max, number) : max;\n }, 0);\n\n return maxNumber + 1;\n}\n\nfunction normalizeReviewNumber(value: unknown) {\n if (typeof value !== 'number') return undefined;\n if (!Number.isInteger(value) || value < 1) return undefined;\n return value;\n}\n","import { localAdapter } from '../adapters/local';\nimport { normalizeRoutePath } from '../route';\nimport type {\n DomAnchor,\n DomAnchorCandidate,\n DomSourceHint,\n NumberedReviewItem,\n RelativeSelection,\n ReviewItem,\n ReviewItemScope,\n ReviewMarker,\n ReviewMode,\n ReviewPoint,\n ReviewSelection,\n ViewportSize,\n WebReviewKitAdapter,\n WebReviewKitController,\n WebReviewKitOptions,\n} from '../types';\nimport { createStyleElement } from './overlay-style';\nimport {\n getNextReviewItemNumber,\n getNumberedReviewItems,\n getReviewViewportScope,\n} from './review-scope';\n\ninterface ViewportSelection {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\ninterface AreaDraft {\n viewport: ViewportSize;\n anchor?: DomAnchor;\n marker?: ReviewMarker;\n selection?: ReviewSelection;\n}\n\ninterface NoteDraft {\n viewport: ViewportSize;\n anchor?: DomAnchor;\n marker: ReviewMarker;\n selection?: ReviewSelection;\n comment?: string;\n}\n\ninterface ReviewEnvironment {\n window: Window;\n document: Document;\n viewportRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n overlayRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n}\n\ntype ReviewItemHighlightMode = 'note' | 'area' | 'dom';\ninterface ReviewItemHighlightSelection {\n viewport: ViewportSelection;\n isBound: boolean;\n}\n\nconst ROOT_ID = 'df-web-review-kit-root';\nconst INTERNAL_QUERY_PARAMS = ['__dfwr_target'];\nexport function createWebReviewKit(\n options: WebReviewKitOptions\n): WebReviewKitController {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return createNoopController();\n }\n\n const app = new WebReviewKitApp(options);\n app.mount();\n\n return {\n open: () => app.open(),\n close: () => app.close(),\n toggle: () => app.toggle(),\n setMode: (mode) => app.setMode(mode),\n getMode: () => app.getMode(),\n highlightItem: (itemId) => app.highlightItem(itemId),\n setHiddenItemIds: (itemIds) => app.setHiddenItemIds(itemIds),\n reload: () => app.reload(),\n getItems: () => app.getItems(),\n destroy: () => app.destroy(),\n };\n}\n\nclass WebReviewKitApp {\n private readonly adapter: WebReviewKitAdapter;\n private readonly hotkey: string;\n private root?: HTMLDivElement;\n private shadow?: ShadowRoot;\n private panel?: HTMLDivElement;\n private isOpen = false;\n private mode: ReviewMode = 'idle';\n private items: ReviewItem[] = [];\n private noteDraft?: NoteDraft;\n private areaDraft?: AreaDraft;\n private isSelectingArea = false;\n private highlightedItemId?: string;\n private hiddenItemIds?: Set<string>;\n private renderFrame?: number;\n\n constructor(private readonly options: WebReviewKitOptions) {\n this.adapter = options.adapter ?? localAdapter();\n this.hotkey = options.hotkeys?.qa ?? 'Shift+Q';\n }\n\n mount() {\n if (this.root) return;\n\n const existing = document.getElementById(ROOT_ID);\n if (existing) existing.remove();\n\n this.root = document.createElement('div');\n this.root.id = ROOT_ID;\n this.root.style.display = 'contents';\n\n this.shadow = this.root.attachShadow({ mode: 'open' });\n document.body.appendChild(this.root);\n document.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('scroll', this.handleViewportChange, true);\n window.addEventListener('resize', this.handleViewportChange);\n\n this.render();\n }\n\n destroy() {\n document.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('scroll', this.handleViewportChange, true);\n window.removeEventListener('resize', this.handleViewportChange);\n if (this.renderFrame) {\n window.cancelAnimationFrame(this.renderFrame);\n this.renderFrame = undefined;\n }\n this.root?.remove();\n this.root = undefined;\n this.shadow = undefined;\n }\n\n open() {\n if (this.isOpen) return;\n\n this.isOpen = true;\n void this.reload();\n }\n\n close() {\n this.isOpen = false;\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n }\n\n toggle() {\n if (this.isOpen) {\n this.close();\n return;\n }\n\n this.open();\n }\n\n setMode(mode: ReviewMode) {\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.setModeState(this.mode === mode ? 'idle' : mode);\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.render();\n }\n\n getMode() {\n return this.mode;\n }\n\n getItems() {\n return this.items;\n }\n\n highlightItem(itemId?: string) {\n if (!itemId) {\n this.clearHighlightedItem();\n return;\n }\n\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.highlightedItemId = itemId;\n this.render();\n }\n\n setHiddenItemIds(itemIds?: string[]) {\n this.hiddenItemIds = itemIds ? new Set(itemIds) : undefined;\n this.updateHiddenItemsStyle();\n }\n\n private clearHighlightedItem() {\n if (!this.highlightedItemId) return;\n\n this.highlightedItemId = undefined;\n this.render();\n }\n\n private createHiddenItemsStyleElement() {\n const style = document.createElement('style');\n style.dataset.dfwrHiddenItems = 'true';\n style.textContent = this.getHiddenItemsCss();\n return style;\n }\n\n private updateHiddenItemsStyle() {\n if (!this.shadow) return;\n\n let style = this.shadow.querySelector<HTMLStyleElement>(\n 'style[data-dfwr-hidden-items=\"true\"]'\n );\n if (!style) {\n style = this.createHiddenItemsStyleElement();\n this.shadow.prepend(style);\n return;\n }\n\n style.textContent = this.getHiddenItemsCss();\n }\n\n private getHiddenItemsCss() {\n if (!this.hiddenItemIds?.size) return '';\n\n return Array.from(this.hiddenItemIds)\n .map(\n (itemId) =>\n `[data-review-item-id=\"${cssEscape(itemId)}\"] { display: none !important; }`\n )\n .join('\\n');\n }\n\n private setModeState(mode: ReviewMode) {\n if (this.mode === mode) return;\n\n this.mode = mode;\n this.options.onModeChange?.(mode);\n }\n\n private cancelMode() {\n if (\n this.mode === 'idle' &&\n !this.noteDraft &&\n !this.areaDraft &&\n !this.isSelectingArea\n ) {\n return false;\n }\n\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n return true;\n }\n\n private readonly handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.cancelMode()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (!isHotkey(event, this.hotkey)) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.toggle();\n };\n\n private readonly handleViewportChange = () => {\n if (!this.isOpen || this.renderFrame) return;\n\n this.renderFrame = window.requestAnimationFrame(() => {\n this.renderFrame = undefined;\n this.render();\n });\n };\n\n private getEnvironment(): ReviewEnvironment | undefined {\n const target =\n typeof this.options.target === 'function'\n ? this.options.target()\n : this.options.target;\n\n if (!target) {\n return {\n window,\n document,\n viewportRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n overlayRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n };\n }\n\n try {\n const rect = target.getViewportRect?.() ?? {\n left: 0,\n top: 0,\n width: target.window.innerWidth,\n height: target.window.innerHeight,\n };\n const overlayRect = target.getOverlayRect?.() ?? rect;\n\n return {\n window: target.window,\n document: target.document,\n viewportRect: {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n },\n overlayRect: {\n left: overlayRect.left,\n top: overlayRect.top,\n width: overlayRect.width,\n height: overlayRect.height,\n },\n };\n } catch {\n return undefined;\n }\n }\n\n async reload() {\n const environment = this.getEnvironment();\n if (!environment) return this.items;\n\n this.items = await this.adapter.list({\n projectId: this.options.projectId,\n routeKey: getRouteKey(environment),\n });\n this.options.onItemsChange?.(this.items);\n if (this.isOpen) {\n this.render();\n }\n return this.items;\n }\n\n private render() {\n if (!this.shadow) return;\n\n this.shadow.replaceChildren();\n this.shadow.append(createStyleElement());\n this.shadow.append(this.createHiddenItemsStyleElement());\n\n const shell = document.createElement('div');\n shell.className = `dfwr-shell${this.isOpen ? ' is-open' : ''}`;\n shell.setAttribute('aria-hidden', this.isOpen ? 'false' : 'true');\n\n if (this.options.ui?.panel !== false) {\n this.panel = document.createElement('div');\n this.panel.className = 'dfwr-panel';\n this.panel.setAttribute('role', 'dialog');\n this.panel.setAttribute('aria-label', 'Web review kit');\n\n this.panel.append(\n this.createHeader(),\n this.createToolbar(),\n this.createBody(),\n this.createList()\n );\n\n shell.append(this.panel);\n } else {\n this.panel = undefined;\n }\n\n shell.append(this.createMarkerLayer());\n\n if (this.isOpen && (this.mode === 'note' || this.mode === 'element')) {\n shell.append(\n this.noteDraft\n ? this.createNotePopover(this.noteDraft)\n : this.mode === 'element'\n ? this.createElementLayer()\n : this.createNoteLayer()\n );\n }\n\n if (this.isOpen && this.mode === 'area' && !this.areaDraft) {\n shell.append(this.createAreaLayer());\n }\n\n if (\n this.isOpen &&\n this.mode === 'area' &&\n this.areaDraft &&\n this.options.ui?.panel === false\n ) {\n if (this.areaDraft.selection) {\n shell.append(this.createAreaDraftOverlay(this.areaDraft));\n }\n shell.append(this.createAreaDraftPopover(this.areaDraft));\n }\n\n this.shadow.append(shell);\n }\n\n private createHeader() {\n const header = document.createElement('div');\n header.className = 'dfwr-header';\n\n const title = document.createElement('div');\n title.className = 'dfwr-title';\n title.textContent = 'Review Kit';\n\n const meta = document.createElement('div');\n meta.className = 'dfwr-meta';\n meta.textContent = getRouteKey(this.getEnvironment());\n\n const titleGroup = document.createElement('div');\n titleGroup.append(title, meta);\n\n const close = document.createElement('button');\n close.className = 'dfwr-icon-button';\n close.type = 'button';\n close.textContent = 'x';\n close.setAttribute('aria-label', 'Close');\n close.addEventListener('click', () => this.close());\n\n header.append(titleGroup, close);\n return header;\n }\n\n private createToolbar() {\n const toolbar = document.createElement('div');\n toolbar.className = 'dfwr-toolbar';\n\n toolbar.append(\n this.createToolbarButton('Note', this.mode === 'note', () => {\n this.setModeState(this.mode === 'note' ? 'idle' : 'note');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.render();\n }),\n this.createToolbarButton('Element', this.mode === 'element', () => {\n this.setModeState(this.mode === 'element' ? 'idle' : 'element');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.render();\n }),\n this.createToolbarButton(\n this.isSelectingArea ? 'Selecting' : 'Area',\n this.mode === 'area',\n () => {\n this.setModeState(this.mode === 'area' ? 'idle' : 'area');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.render();\n }\n ),\n this.createToolbarButton('Refresh', false, () => {\n void this.reload();\n })\n );\n\n return toolbar;\n }\n\n private createToolbarButton(\n label: string,\n active: boolean,\n onClick: () => void\n ) {\n const button = document.createElement('button');\n button.className = `dfwr-button${active ? ' is-active' : ''}`;\n button.type = 'button';\n button.textContent = label;\n button.addEventListener('click', onClick);\n return button;\n }\n\n private createBody() {\n const body = document.createElement('div');\n body.className = 'dfwr-body';\n\n if (this.mode === 'idle') {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Add a note or mark an area.';\n body.append(empty);\n return body;\n }\n\n if (this.mode === 'note' || this.mode === 'element') {\n body.append(this.createNoteBody());\n return body;\n }\n\n body.append(this.createAreaForm());\n return body;\n }\n\n private createNoteBody() {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = this.noteDraft\n ? 'Write the note in the page box.'\n : this.mode === 'element'\n ? 'Click an element to add QA.'\n : 'Click on the page to place a note.';\n return empty;\n }\n\n private createNotePopover(draft: NoteDraft) {\n const environment = this.getEnvironment();\n const group = document.createElement('div');\n group.className = 'dfwr-note-draft';\n if (!environment) return group;\n\n const hostPoint = toHostPoint(draft.marker.viewport, environment);\n\n if (draft.selection) {\n group.append(\n this.createSelectionHighlight(\n toViewportSelection(draft.selection.viewport),\n environment,\n true\n )\n );\n }\n\n const pin = document.createElement('button');\n pin.className = 'dfwr-note-pin';\n pin.type = 'button';\n pin.setAttribute('aria-label', 'Move note point');\n pin.style.left = `${hostPoint.x}px`;\n pin.style.top = `${hostPoint.y}px`;\n\n const popover = document.createElement('div');\n const position = getPopoverPosition(hostPoint, environment);\n\n popover.className = 'dfwr-note-popover';\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n\n const meta = document.createElement('div');\n meta.className = 'dfwr-item-date';\n meta.textContent = formatNoteDraftMeta(draft);\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Review comment';\n textarea.rows = 4;\n textarea.value = draft.comment ?? '';\n textarea.addEventListener('input', () => {\n if (!this.noteDraft) return;\n this.noteDraft = {\n ...this.noteDraft,\n comment: textarea.value,\n };\n });\n\n const actions = this.createFormActions('Save note', () => {\n const comment = textarea.value.trim();\n if (!comment) return;\n void this.createItem({\n kind: 'note',\n comment,\n viewport: draft.viewport,\n anchor: draft.anchor,\n marker: draft.marker,\n selection: draft.selection,\n });\n });\n\n form.append(meta, textarea, actions);\n popover.append(form);\n group.append(pin, popover);\n\n this.attachDraftPinDrag(pin, popover, meta, textarea);\n\n window.setTimeout(() => textarea.focus(), 0);\n\n return group;\n }\n\n private createAreaForm() {\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n\n if (!this.areaDraft) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Drag on the page to select an area.';\n form.append(empty);\n return form;\n }\n\n const meta = document.createElement('div');\n meta.className = 'dfwr-item-date';\n meta.textContent = formatAreaDraftMeta(this.areaDraft);\n form.append(meta);\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Area comment';\n textarea.rows = 4;\n\n const actions = this.createFormActions('Save area', () => {\n const comment = textarea.value.trim();\n if (!comment || !this.areaDraft) return;\n void this.createItem({\n kind: 'area',\n comment,\n viewport: this.areaDraft.viewport,\n anchor: this.areaDraft.anchor,\n marker: this.areaDraft.marker,\n selection: this.areaDraft.selection,\n });\n });\n\n form.append(textarea, actions);\n return form;\n }\n\n private createAreaDraftOverlay(draft: AreaDraft) {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-preview-layer';\n\n const environment = this.getEnvironment();\n if (!environment || !draft.selection) return layer;\n\n const selection = toViewportSelection(draft.selection.viewport);\n layer.append(this.createSelectionHighlight(selection, environment, true));\n\n if (draft.marker) {\n const hostPoint = toHostPoint(draft.marker.viewport, environment);\n layer.append(\n this.createMarkerElement(\n undefined,\n hostPoint,\n '•',\n getReviewViewportScope(\n draft.viewport,\n this.options.viewports?.presets\n ),\n true,\n true\n )\n );\n }\n\n return layer;\n }\n\n private createAreaDraftPopover(draft: AreaDraft) {\n const environment = this.getEnvironment();\n const popover = document.createElement('div');\n popover.className = 'dfwr-area-draft';\n if (environment && draft.selection) {\n const selection = toHostSelection(\n toViewportSelection(draft.selection.viewport),\n environment\n );\n const position = getAreaPopoverPosition(selection, environment);\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n popover.style.right = 'auto';\n }\n popover.append(this.createAreaForm());\n return popover;\n }\n\n private createFormActions(saveLabel: string, onSave: () => void) {\n const actions = document.createElement('div');\n actions.className = 'dfwr-actions';\n\n const save = document.createElement('button');\n save.className = 'dfwr-button is-primary';\n save.type = 'button';\n save.textContent = saveLabel;\n save.addEventListener('click', onSave);\n\n const cancel = document.createElement('button');\n cancel.className = 'dfwr-button';\n cancel.type = 'button';\n cancel.textContent = 'Cancel';\n cancel.addEventListener('click', () => {\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.render();\n });\n\n actions.append(save, cancel);\n return actions;\n }\n\n private createList() {\n const section = document.createElement('div');\n section.className = 'dfwr-list';\n\n const heading = document.createElement('div');\n heading.className = 'dfwr-list-heading';\n heading.textContent = `Review items (${this.items.length})`;\n section.append(heading);\n\n if (this.items.length === 0) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'No review items on this page.';\n section.append(empty);\n return section;\n }\n\n for (const numberedItem of getNumberedReviewItems(\n this.items,\n this.options.viewports?.presets\n )) {\n section.append(this.createListItem(numberedItem));\n }\n\n return section;\n }\n\n private createListItem(numberedItem: NumberedReviewItem) {\n const { item } = numberedItem;\n const row = document.createElement('article');\n row.className = 'dfwr-item';\n row.tabIndex = 0;\n row.setAttribute('role', 'button');\n row.setAttribute(\n 'aria-label',\n `Restore review item: ${item.title ?? item.comment}`\n );\n row.addEventListener('click', () => {\n void this.restoreItem(item);\n });\n row.addEventListener('keydown', (event) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n\n event.preventDefault();\n void this.restoreItem(item);\n });\n\n const body = document.createElement('div');\n body.className = 'dfwr-item-body';\n\n const badges = document.createElement('div');\n badges.className = 'dfwr-item-badges';\n\n const scope = document.createElement('div');\n scope.className = `dfwr-item-scope is-scope-${numberedItem.scope}`;\n scope.textContent = numberedItem.displayLabel;\n\n const kind = document.createElement('div');\n kind.className = 'dfwr-item-kind';\n kind.textContent = item.kind;\n badges.append(scope, kind);\n\n const comment = document.createElement('p');\n comment.className = 'dfwr-item-comment';\n comment.textContent = item.comment;\n\n const date = document.createElement('time');\n date.className = 'dfwr-item-date';\n date.dateTime = item.createdAt;\n date.textContent = formatItemMeta(item);\n\n body.append(badges, comment, date);\n\n const actions = document.createElement('div');\n actions.className = 'dfwr-item-actions';\n actions.addEventListener('click', (event) => event.stopPropagation());\n actions.addEventListener('keydown', (event) => event.stopPropagation());\n\n const remove = document.createElement('button');\n remove.className = 'dfwr-icon-button';\n remove.type = 'button';\n remove.textContent = 'x';\n remove.setAttribute('aria-label', 'Delete');\n remove.addEventListener('click', (event) => {\n event.stopPropagation();\n void this.adapter\n .remove(item.id)\n .then(() => this.reload());\n });\n\n actions.append(remove);\n row.append(body, actions);\n return row;\n }\n\n private createMarkerLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-marker-layer';\n const environment = this.getEnvironment();\n if (!environment) return layer;\n\n const currentScope = getReviewViewportScope(\n getViewportSize(environment),\n this.options.viewports?.presets\n );\n\n getNumberedReviewItems(\n this.items,\n this.options.viewports?.presets\n ).forEach((numberedItem) => {\n const { item, scope, number, displayLabel } = numberedItem;\n if (!shouldShowMarkerForScope(scope, currentScope)) {\n return;\n }\n\n const isHighlighted = item.id === this.highlightedItemId;\n const highlightMode = getReviewItemHighlightMode(item);\n if (highlightMode !== 'note') {\n const selection = getItemHighlightSelection(item, environment);\n if (selection) {\n layer.append(\n ...this.createItemHighlightElements(\n selection.viewport,\n environment,\n item,\n String(number),\n selection.isBound,\n isHighlighted\n )\n );\n return;\n }\n }\n\n const point = getBoundMarkerPoint(item, environment);\n if (!point || !isPointInViewport(point.viewport, environment)) {\n return;\n }\n\n const hostPoint = toHostPoint(point.viewport, environment);\n const marker = this.createMarkerElement(\n item.id,\n hostPoint,\n String(number),\n scope,\n point.isBound,\n isHighlighted,\n highlightMode === 'note' ? 'note' : 'default'\n );\n marker.title = `${displayLabel} / ${item.comment}\\n${formatItemMeta(item)}`;\n layer.append(marker);\n });\n\n return layer;\n }\n\n private createItemHighlightElements(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n item: ReviewItem,\n label: string,\n isBound: boolean,\n isHighlighted: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const mode = getReviewItemHighlightMode(item);\n const highlight = document.createElement('div');\n highlight.className = [\n 'dfwr-item-target-highlight',\n `is-mode-${mode}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n highlight.dataset.reviewItemId = item.id;\n\n const labelElement = document.createElement('div');\n labelElement.className = [\n 'dfwr-item-target-label',\n `is-mode-${mode}`,\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n labelElement.textContent = `#${label}`;\n labelElement.style.left = `${Math.max(4, rect.left)}px`;\n labelElement.style.top = `${Math.max(4, rect.top - 24)}px`;\n labelElement.dataset.reviewItemId = item.id;\n\n return [highlight, labelElement];\n }\n\n private createSelectionHighlight(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n isDraft: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const highlight = document.createElement('div');\n highlight.className = `dfwr-selection-highlight${\n isDraft ? ' is-draft' : ''\n }`;\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n return highlight;\n }\n\n private createMarkerElement(\n itemId: string | undefined,\n hostPoint: ReviewPoint,\n label: string,\n scope: ReviewItemScope,\n isBound: boolean,\n isHighlighted: boolean,\n variant: 'default' | 'note' = 'default'\n ) {\n const isNoteCallout = variant === 'note';\n const marker = document.createElement('div');\n marker.className = [\n 'dfwr-bound-marker',\n isNoteCallout ? 'is-note-callout' : '',\n `is-scope-${scope}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n marker.style.left = `${hostPoint.x}px`;\n marker.style.top = `${hostPoint.y}px`;\n marker.dataset.scope = scope;\n if (itemId) {\n marker.dataset.reviewItemId = itemId;\n }\n\n const iconElement = document.createElement('span');\n iconElement.className = 'dfwr-bound-marker-icon';\n iconElement.setAttribute('aria-hidden', 'true');\n const labelElement = document.createElement('span');\n labelElement.className = 'dfwr-bound-marker-number';\n labelElement.textContent = isNoteCallout ? `#${label}` : label;\n marker.append(iconElement, labelElement);\n\n return marker;\n }\n\n private attachDraftPinDrag(\n pin: HTMLButtonElement,\n popover: HTMLDivElement,\n meta: HTMLDivElement,\n textarea: HTMLTextAreaElement\n ) {\n let isDragging = false;\n\n const moveDraftUi = (hostPoint: ReviewPoint) => {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const nextPoint = clampPoint(toTargetPoint(hostPoint, environment), environment);\n const nextHostPoint = toHostPoint(nextPoint, environment);\n const position = getPopoverPosition(nextHostPoint, environment);\n\n pin.style.left = `${nextHostPoint.x}px`;\n pin.style.top = `${nextHostPoint.y}px`;\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n\n if (!this.noteDraft) return;\n\n this.noteDraft = {\n ...this.noteDraft,\n marker: {\n ...this.noteDraft.marker,\n viewport: roundPoint(nextPoint),\n },\n comment: textarea.value,\n };\n meta.textContent = formatNoteDraftMeta(this.noteDraft);\n };\n\n pin.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = true;\n pin.setPointerCapture(event.pointerId);\n });\n\n pin.addEventListener('pointermove', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n moveDraftUi({\n x: event.clientX,\n y: event.clientY,\n });\n });\n\n pin.addEventListener('pointerup', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = false;\n pin.releasePointerCapture(event.pointerId);\n\n const nextPoint = toTargetPointFromHostEvent(event, this.getEnvironment());\n void (this.mode === 'element'\n ? this.bindElementDraftToPoint(nextPoint, textarea.value)\n : this.bindNoteDraftToPoint(nextPoint, textarea.value));\n });\n }\n\n private createNoteLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-text-layer';\n const environment = this.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.createNoteDraft(\n toTargetPointFromHostEvent(event, this.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private createElementLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-element-layer';\n const environment = this.getEnvironment();\n const hover = document.createElement('div');\n hover.className = 'dfwr-dom-hover';\n hover.hidden = true;\n layer.append(hover);\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const updateHover = (point: ReviewPoint) => {\n const nextEnvironment = this.getEnvironment();\n if (!nextEnvironment) return;\n\n const anchor = getDomAnchorFromPoint(\n clampPoint(point, nextEnvironment),\n this.options.anchors?.attribute,\n nextEnvironment\n );\n const selection = anchor\n ? getElementViewportSelection(anchor, nextEnvironment)\n : undefined;\n\n if (!selection) {\n hover.hidden = true;\n return;\n }\n\n const rect = toHostSelection(selection, nextEnvironment);\n hover.hidden = false;\n hover.style.left = `${rect.left}px`;\n hover.style.top = `${rect.top}px`;\n hover.style.width = `${rect.width}px`;\n hover.style.height = `${rect.height}px`;\n };\n\n layer.addEventListener('pointermove', (event) => {\n updateHover(toTargetPointFromHostEvent(event, this.getEnvironment()));\n });\n\n layer.addEventListener('pointerleave', () => {\n hover.hidden = true;\n });\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.createElementDraft(\n toTargetPointFromHostEvent(event, this.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private async createNoteDraft(point: ReviewPoint) {\n await this.bindNoteDraftToPoint(point);\n }\n\n private async createElementDraft(point: ReviewPoint) {\n await this.bindElementDraftToPoint(point);\n }\n\n private async bindNoteDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const selection = getPointSelection(nextPoint);\n const anchor = getDomAnchor(\n selection,\n this.options.anchors?.attribute,\n environment\n );\n const marker: ReviewMarker = {\n viewport: roundPoint(nextPoint),\n relative: anchor\n ? getRelativePoint(nextPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n comment,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private async bindElementDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const anchor = getDomAnchorFromPoint(\n nextPoint,\n this.options.anchors?.attribute,\n environment\n );\n const elementSelection = anchor\n ? getElementViewportSelection(anchor, environment)\n : undefined;\n const selection = elementSelection ?? getPointSelection(nextPoint);\n const markerPoint = getSelectionCenter(selection);\n const reviewSelection = elementSelection\n ? {\n viewport: toPublicSelection(elementSelection),\n relative: getRelativeSelection(\n elementSelection,\n anchor as DomAnchor,\n environment\n ),\n }\n : undefined;\n const marker: ReviewMarker = {\n viewport: roundPoint(markerPoint),\n relative: anchor\n ? getRelativePoint(markerPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n selection: reviewSelection,\n comment,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private createAreaLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-layer';\n const environment = this.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const box = document.createElement('div');\n box.className = 'dfwr-area-box';\n layer.append(box);\n\n let startX = 0;\n let startY = 0;\n let selection: ViewportSelection | undefined;\n\n const updateBox = (event: PointerEvent) => {\n const nextPoint = toTargetPointFromHostEvent(\n event,\n this.getEnvironment()\n );\n const left = Math.min(startX, nextPoint.x);\n const top = Math.min(startY, nextPoint.y);\n const width = Math.abs(nextPoint.x - startX);\n const height = Math.abs(nextPoint.y - startY);\n const hostPoint = toHostPoint(\n { x: left, y: top },\n this.getEnvironment()\n );\n\n selection = { left, top, width, height };\n box.style.left = `${hostPoint.x}px`;\n box.style.top = `${hostPoint.y}px`;\n box.style.width = `${width}px`;\n box.style.height = `${height}px`;\n };\n\n layer.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n layer.setPointerCapture(event.pointerId);\n const startPoint = toTargetPointFromHostEvent(\n event,\n this.getEnvironment()\n );\n startX = startPoint.x;\n startY = startPoint.y;\n updateBox(event);\n });\n\n layer.addEventListener('pointermove', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n updateBox(event);\n });\n\n layer.addEventListener('pointerup', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n layer.releasePointerCapture(event.pointerId);\n updateBox(event);\n\n if (!selection || selection.width < 8 || selection.height < 8) return;\n\n this.isSelectingArea = true;\n this.render();\n void this.createAreaDraft(selection);\n });\n\n return layer;\n }\n\n private async createAreaDraft(selection: ViewportSelection) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n\n this.areaDraft = await this.withOverlayHidden(() => {\n const anchor = getDomAnchor(\n selection,\n this.options.anchors?.attribute,\n environment\n );\n const relativeSelection = anchor\n ? getRelativeSelection(selection, anchor, environment)\n : undefined;\n const marker = createSelectionCenterMarker(\n selection,\n anchor,\n environment\n );\n const reviewSelection: ReviewSelection = {\n viewport: toPublicSelection(selection),\n relative: relativeSelection,\n };\n\n return {\n viewport,\n anchor,\n marker,\n selection: reviewSelection,\n };\n });\n this.isSelectingArea = false;\n this.setModeState('area');\n this.render();\n }\n\n private async withOverlayHidden<T>(callback: () => Promise<T> | T) {\n if (!this.root) return callback();\n\n const previousDisplay = this.root.style.display;\n this.root.style.display = 'none';\n\n try {\n return await callback();\n } finally {\n this.root.style.display = previousDisplay;\n }\n }\n\n private async createItem(\n input: Pick<ReviewItem, 'kind' | 'comment'> &\n Partial<\n Pick<ReviewItem, 'scope' | 'viewport' | 'anchor' | 'marker' | 'selection'>\n >\n ) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const now = new Date().toISOString();\n const routeKey = getRouteKey(environment);\n const viewport = input.viewport ?? getViewportSize(environment);\n const reviewNumber = await this.getNextReviewNumber();\n const item: ReviewItem = {\n id: createId(),\n reviewNumber,\n projectId: this.options.projectId,\n routeKey,\n pageUrl: getPageUrl(environment),\n originalUrl: getOriginalUrl(environment),\n normalizedPath: routeKey,\n scope:\n input.scope ??\n getReviewViewportScope(viewport, this.options.viewports?.presets),\n kind: input.kind,\n title: input.comment.split('\\n')[0]?.slice(0, 80),\n comment: input.comment,\n status: 'todo',\n viewport,\n devicePixelRatio: environment.window.devicePixelRatio || 1,\n scroll: {\n x: environment.window.scrollX,\n y: environment.window.scrollY,\n },\n anchor: input.anchor,\n marker: input.marker,\n selection: input.selection,\n createdAt: now,\n updatedAt: now,\n };\n\n await this.adapter.create(item);\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.highlightItem(item.id);\n await this.reload();\n }\n\n private async getNextReviewNumber() {\n const items = await this.adapter.list({\n projectId: this.options.projectId,\n });\n return getNextReviewItemNumber(items);\n }\n\n private async restoreItem(item: ReviewItem) {\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n\n if (this.options.onRestoreItem) {\n await this.options.onRestoreItem(item);\n return;\n }\n\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const scroll = item.scroll;\n if (scroll) {\n runWithAutoScrollBehavior(environment.document, () => {\n setDocumentScrollInstantly(environment, scroll);\n });\n await waitForNextFrame(environment);\n }\n\n this.highlightItem(item.id);\n this.render();\n }\n}\n\nfunction rectanglesIntersect(\n a: ViewportSelection,\n b: ViewportSelection\n) {\n return (\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top\n );\n}\n\nfunction waitForNextFrame(environment?: ReviewEnvironment) {\n return new Promise<void>((resolve) => {\n (environment?.window ?? window).requestAnimationFrame(() => resolve());\n });\n}\n\nfunction getDomAnchor(\n selection: ViewportSelection,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const x = selection.left + selection.width / 2;\n const y = selection.top + selection.height / 2;\n return getDomAnchorFromPoint({ x, y }, configuredAttribute, environment);\n}\n\nfunction getDomAnchorFromPoint(\n point: ReviewPoint,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const target = environment.document.elementFromPoint(point.x, point.y);\n if (!target) return undefined;\n\n const candidates = createAnchorCandidates(target, configuredAttribute);\n const primary = candidates[0];\n if (!primary) return undefined;\n\n return {\n ...primary,\n candidates,\n htmlSnippet: getElementHtmlSnippet(\n getAnchorSourceElement(target, primary, configuredAttribute) ?? target\n ),\n source: getDomSourceHint(target),\n };\n}\n\nfunction getElementViewportSelection(\n anchor: DomAnchor,\n environment: ReviewEnvironment\n): ViewportSelection | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return undefined;\n\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n}\n\nfunction createAnchorCandidates(\n target: Element,\n configuredAttribute: string\n): DomAnchorCandidate[] {\n const candidates: DomAnchorCandidate[] = [];\n\n const anchoredByAttribute = target.closest(`[${configuredAttribute}]`);\n if (anchoredByAttribute) {\n const value = anchoredByAttribute.getAttribute(configuredAttribute);\n if (value) {\n candidates.push({\n selector: `[${configuredAttribute}=\"${cssEscape(value)}\"]`,\n strategy: 'configured-attribute',\n confidence: 0.98,\n textFingerprint: getTextFingerprint(anchoredByAttribute),\n });\n }\n }\n\n if (isMeaningfulId(target.id)) {\n candidates.push({\n selector: `#${cssEscape(target.id)}`,\n strategy: 'id',\n confidence: 0.94,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n const targetClassName = getMeaningfulClassName(target);\n if (targetClassName) {\n candidates.push({\n selector: `${target.tagName.toLowerCase()}.${cssEscape(targetClassName)}`,\n strategy: 'class',\n confidence: 0.82,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n candidates.push({\n selector: getDomPath(target),\n strategy: 'dom-path',\n confidence: 0.9,\n textFingerprint: getTextFingerprint(target),\n });\n\n const parent = target.parentElement;\n const anchoredById = parent\n ? findClosest(parent, (element) => isMeaningfulId(element.id))\n : undefined;\n if (anchoredById?.id) {\n candidates.push({\n selector: `#${cssEscape(anchoredById.id)}`,\n strategy: 'id',\n confidence: 0.72,\n textFingerprint: getTextFingerprint(anchoredById),\n });\n }\n\n const anchoredByClass = parent\n ? findClosest(parent, (element) => Boolean(getMeaningfulClassName(element)))\n : undefined;\n const className = anchoredByClass\n ? getMeaningfulClassName(anchoredByClass)\n : undefined;\n\n if (anchoredByClass && className) {\n candidates.push({\n selector: `${anchoredByClass.tagName.toLowerCase()}.${cssEscape(\n className\n )}`,\n strategy: 'class',\n confidence: 0.58,\n textFingerprint: getTextFingerprint(anchoredByClass),\n });\n }\n\n return dedupeAnchorCandidates(candidates);\n}\n\nfunction getAnchorSourceElement(\n target: Element,\n candidate: DomAnchorCandidate,\n configuredAttribute: string\n) {\n if (candidate.strategy === 'configured-attribute') {\n return target.closest(`[${configuredAttribute}]`);\n }\n\n if (candidate.strategy === 'dom-path') return target;\n\n try {\n return target.closest(candidate.selector);\n } catch {\n return target;\n }\n}\n\nfunction getElementHtmlSnippet(element: Element, maxLength = 1000) {\n const html = decodeHtmlEntities(element.outerHTML.replace(/\\s+/g, ' ').trim());\n if (html.length <= maxLength) return html;\n return `${html.slice(0, maxLength - 3)}...`;\n}\n\nfunction decodeHtmlEntities(value: string) {\n return value.replace(\n /&(#\\d+|#x[\\da-f]+|lt|gt|quot|apos|amp);/gi,\n (match, entity: string) => {\n const normalized = entity.toLowerCase();\n\n if (normalized === 'lt') return '<';\n if (normalized === 'gt') return '>';\n if (normalized === 'quot') return '\"';\n if (normalized === 'apos') return \"'\";\n if (normalized === 'amp') return '&';\n\n const codePoint = normalized.startsWith('#x')\n ? Number.parseInt(normalized.slice(2), 16)\n : Number.parseInt(normalized.slice(1), 10);\n\n return Number.isFinite(codePoint)\n ? String.fromCodePoint(codePoint)\n : match;\n }\n );\n}\n\nfunction getDomSourceHint(target: Element): DomSourceHint | undefined {\n const sourceElement = target.closest(\n '[data-file], [data-component], [data-section-index], [data-section-id]'\n );\n if (!sourceElement) return undefined;\n\n const dataset = (sourceElement as HTMLElement).dataset;\n const source: DomSourceHint = {\n component: dataset.component,\n file: dataset.file,\n sectionId: dataset.sectionId,\n sectionIndex: dataset.sectionIndex,\n };\n\n return Object.values(source).some(Boolean) ? source : undefined;\n}\n\nfunction getRelativeSelection(\n selection: ViewportSelection,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): RelativeSelection | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((selection.left - rect.left) / rect.width),\n y: roundRatio((selection.top - rect.top) / rect.height),\n width: roundRatio(selection.width / rect.width),\n height: roundRatio(selection.height / rect.height),\n };\n}\n\nfunction getRelativePoint(\n point: ReviewPoint,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): ReviewPoint | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((point.x - rect.left) / rect.width),\n y: roundRatio((point.y - rect.top) / rect.height),\n };\n}\n\nfunction getBoundMarkerPoint(\n item: ReviewItem,\n environment: ReviewEnvironment\n) {\n const marker = getItemMarker(item);\n if (!marker) return undefined;\n\n if (item.anchor && marker.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: roundPoint({\n x: rect.left + rect.width * marker.relative.x,\n y: rect.top + rect.height * marker.relative.y,\n }),\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n\n return {\n viewport: roundPoint({\n x: marker.viewport.x + sourceScroll.x - environment.window.scrollX,\n y: marker.viewport.y + sourceScroll.y - environment.window.scrollY,\n }),\n isBound: false,\n confidence: 0,\n };\n}\n\nfunction getBoundSelection(item: ReviewItem, environment: ReviewEnvironment) {\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n if (item.anchor && selection.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: {\n left: rect.left + rect.width * selection.relative.x,\n top: rect.top + rect.height * selection.relative.y,\n width: rect.width * selection.relative.width,\n height: rect.height * selection.relative.height,\n },\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n const viewportSelection = toViewportSelection(selection.viewport);\n\n return {\n viewport: {\n left: viewportSelection.left + sourceScroll.x - environment.window.scrollX,\n top: viewportSelection.top + sourceScroll.y - environment.window.scrollY,\n width: viewportSelection.width,\n height: viewportSelection.height,\n },\n isBound: false,\n confidence: 0,\n };\n}\n\nfunction getItemHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (item.kind === 'area') {\n return getVisibleHighlightSelection(\n [\n getBoundSelection(item, environment),\n getAnchorHighlightSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n if (isDomReviewItem(item)) {\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n}\n\nfunction getAnchorHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (!item.anchor) return undefined;\n\n const viewport = getElementViewportSelection(item.anchor, environment);\n if (!viewport) return undefined;\n\n return {\n viewport,\n isBound: true,\n };\n}\n\nfunction getPointHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n const point = getBoundMarkerPoint(item, environment);\n if (!point) return undefined;\n\n const size = 16;\n return {\n viewport: {\n left: point.viewport.x - size / 2,\n top: point.viewport.y - size / 2,\n width: size,\n height: size,\n },\n isBound: point.isBound,\n };\n}\n\nfunction getVisibleHighlightSelection(\n candidates: Array<ReviewItemHighlightSelection | undefined>,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n return candidates.find(\n (candidate): candidate is ReviewItemHighlightSelection =>\n Boolean(candidate && isSelectionInViewport(candidate.viewport, environment))\n );\n}\n\nfunction getReviewItemHighlightMode(\n item: ReviewItem\n): ReviewItemHighlightMode {\n if (isDomReviewItem(item)) return 'dom';\n if (item.kind === 'area') return 'area';\n return 'note';\n}\n\nfunction isDomReviewItem(item: ReviewItem) {\n return (\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && getItemSelection(item)))\n );\n}\n\nfunction getItemMarker(item: ReviewItem): ReviewMarker | undefined {\n if (item.marker) return item.marker;\n\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n return {\n viewport: roundPoint(getSelectionCenter(selection.viewport)),\n relative: selection.relative\n ? roundPoint(getSelectionCenter(selection.relative))\n : undefined,\n };\n}\n\nfunction getItemSelection(item: ReviewItem): ReviewSelection | undefined {\n const value = item.selection as ReviewSelection | RelativeSelection | undefined;\n if (!value) return undefined;\n\n if ('viewport' in value && isRelativeSelection(value.viewport)) {\n return value;\n }\n\n if (isRelativeSelection(value)) {\n return {\n viewport: value,\n };\n }\n\n return undefined;\n}\n\nfunction shouldShowMarkerForScope(\n scope: ReviewItemScope,\n currentScope: ReviewItemScope\n) {\n return scope === currentScope;\n}\n\nfunction createSelectionCenterMarker(\n selection: ViewportSelection,\n anchor: DomAnchor | undefined,\n environment: ReviewEnvironment\n): ReviewMarker {\n const centerPoint = getSelectionCenter(selection);\n\n return {\n viewport: roundPoint(centerPoint),\n relative: anchor ? getRelativePoint(centerPoint, anchor, environment) : undefined,\n };\n}\n\nfunction getAnchorElement(\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n) {\n return typeof anchor === 'string'\n ? queryAnchorElement(anchor, environment)\n : resolveAnchorElement(anchor, environment)?.element;\n}\n\nfunction resolveAnchorElement(\n anchor: DomAnchor,\n environment: ReviewEnvironment\n) {\n const matches = getAnchorCandidates(anchor).flatMap((candidate) => {\n const match = queryBestAnchorCandidate(\n candidate,\n candidate.textFingerprint ?? anchor.textFingerprint,\n environment\n );\n\n if (!match) return [];\n\n const confidence = roundRatio(\n (candidate.confidence ?? 0.5) * match.score\n );\n\n return [{\n element: match.element,\n candidate,\n confidence,\n }];\n });\n\n return matches.sort((a, b) => b.confidence - a.confidence)[0];\n}\n\nfunction getAnchorCandidates(anchor: DomAnchor) {\n return dedupeAnchorCandidates([\n anchor,\n ...(anchor.candidates ?? []),\n ]);\n}\n\nfunction dedupeAnchorCandidates(candidates: DomAnchorCandidate[]) {\n const seen = new Set<string>();\n\n return candidates.filter((candidate) => {\n const key = `${candidate.strategy}:${candidate.selector}`;\n if (seen.has(key)) return false;\n\n seen.add(key);\n return true;\n });\n}\n\nfunction queryBestAnchorCandidate(\n candidate: DomAnchorCandidate,\n textFingerprint: string | undefined,\n environment: ReviewEnvironment\n) {\n const elements = queryAnchorElements(candidate.selector, environment);\n if (elements.length === 0) return undefined;\n if (!textFingerprint) {\n return {\n element: elements[0],\n score: 1,\n };\n }\n\n return elements\n .map((element) => ({\n element,\n score: getTextFingerprintScore(\n textFingerprint,\n getTextFingerprint(element)\n ),\n }))\n .sort((a, b) => b.score - a.score)[0];\n}\n\nfunction queryAnchorElement(selector: string, environment: ReviewEnvironment) {\n return queryAnchorElements(selector, environment)[0];\n}\n\nfunction queryAnchorElements(selector: string, environment: ReviewEnvironment) {\n try {\n return Array.from(environment.document.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction getPointSelection(point: ReviewPoint): ViewportSelection {\n return {\n left: point.x,\n top: point.y,\n width: 1,\n height: 1,\n };\n}\n\nfunction toViewportSelection(selection: RelativeSelection): ViewportSelection {\n return {\n left: selection.x,\n top: selection.y,\n width: selection.width,\n height: selection.height,\n };\n}\n\nfunction toPublicSelection(selection: ViewportSelection): RelativeSelection {\n return {\n x: Math.round(selection.left),\n y: Math.round(selection.top),\n width: Math.round(selection.width),\n height: Math.round(selection.height),\n };\n}\n\nfunction getSelectionCenter(\n selection: ViewportSelection | RelativeSelection\n): ReviewPoint {\n if ('left' in selection) {\n return {\n x: selection.left + selection.width / 2,\n y: selection.top + selection.height / 2,\n };\n }\n\n return {\n x: selection.x + selection.width / 2,\n y: selection.y + selection.height / 2,\n };\n}\n\nfunction isRelativeSelection(value: unknown): value is RelativeSelection {\n if (!value || typeof value !== 'object') return false;\n\n const selection = value as Partial<RelativeSelection>;\n return (\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n );\n}\n\nfunction findClosest(\n start: Element,\n predicate: (element: Element) => boolean\n) {\n let element: Element | null = start;\n const root = start.ownerDocument.documentElement;\n\n while (element && element !== root) {\n if (predicate(element)) return element;\n element = element.parentElement;\n }\n\n return undefined;\n}\n\nfunction getDomPath(element: Element) {\n const parts: string[] = [];\n let current: Element | null = element;\n const ownerDocument = element.ownerDocument;\n\n while (\n current &&\n current !== ownerDocument.body &&\n current !== ownerDocument.documentElement\n ) {\n const parent: Element | null = current.parentElement;\n const tag = current.tagName.toLowerCase();\n\n if (!parent) {\n parts.unshift(tag);\n break;\n }\n\n const currentTagName = current.tagName;\n const siblings: Element[] = Array.from(parent.children).filter(\n (child) => child.tagName === currentTagName\n );\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${tag}:nth-of-type(${index})`);\n current = parent;\n }\n\n return `body > ${parts.join(' > ')}`;\n}\n\nfunction getTextFingerprint(element: Element) {\n const text = element.textContent?.replace(/\\s+/g, ' ').trim();\n return text ? text.slice(0, 120) : undefined;\n}\n\nfunction getTextFingerprintScore(expected?: string, actual?: string) {\n if (!expected) return 1;\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getFingerprintTokens(expected);\n const actualTokens = new Set(getFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return clamp(matches.length / expectedTokens.length, 0.25, 0.76);\n}\n\nfunction getFingerprintTokens(value: string) {\n return value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n}\n\nfunction isMeaningfulId(value: string) {\n const normalized = value.trim().toLowerCase();\n if (normalized.length <= 1) return false;\n\n return ![\n 'app',\n 'main',\n 'page',\n 'root',\n '__next',\n '__nuxt',\n ].includes(normalized);\n}\n\nfunction getMeaningfulClassName(element: Element) {\n return Array.from(element.classList).find((name) => isMeaningfulClass(name));\n}\n\nfunction isMeaningfulClass(value: string) {\n const normalized = value.trim();\n if (\n [\n 'absolute',\n 'block',\n 'contents',\n 'fixed',\n 'flex',\n 'grid',\n 'hidden',\n 'relative',\n 'sticky',\n ].includes(normalized)\n ) {\n return false;\n }\n\n return (\n normalized.length > 2 &&\n !normalized.includes(':') &&\n !/^(aspect|basis|bg|border|bottom|col|content|delay|duration|ease|font|from|gap|grow|h|inset|items|justify|leading|left|m|max-h|max-w|mb|ml|mr|mt|mx|my|min-h|min-w|object|opacity|order|origin|overflow|p|pb|pl|place|pointer|pr|pt|px|py|right|rotate|rounded|row|scale|self|shadow|shrink|text|to|top|tracking|transition|translate|via|w|z)-/.test(\n normalized\n ) &&\n !normalized.startsWith('mq-')\n );\n}\n\nfunction isHotkey(event: KeyboardEvent, hotkey: string) {\n const parts = hotkey\n .split('+')\n .map((part) => part.trim().toLowerCase())\n .filter(Boolean);\n const key = parts.find(\n (part) => !['shift', 'ctrl', 'control', 'alt', 'meta', 'cmd'].includes(part)\n );\n\n if (!key) return false;\n if (parts.includes('shift') !== event.shiftKey) return false;\n if (\n (parts.includes('ctrl') || parts.includes('control')) !== event.ctrlKey\n ) {\n return false;\n }\n if (parts.includes('alt') !== event.altKey) return false;\n if ((parts.includes('meta') || parts.includes('cmd')) !== event.metaKey) {\n return false;\n }\n\n return isHotkeyKey(event, key);\n}\n\nfunction isHotkeyKey(event: KeyboardEvent, key: string) {\n const normalizedKey = key.toLowerCase();\n\n if (event.key.toLowerCase() === normalizedKey) return true;\n\n if (getHotkeyCode(normalizedKey) === event.code) return true;\n\n const aliases: Record<string, string[]> = {\n q: ['ㅂ', 'ㅃ'],\n };\n\n return aliases[normalizedKey]?.includes(event.key) ?? false;\n}\n\nfunction getHotkeyCode(key: string) {\n if (/^[a-z]$/.test(key)) return `Key${key.toUpperCase()}`;\n if (/^[0-9]$/.test(key)) return `Digit${key}`;\n return undefined;\n}\n\nfunction getPageUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\nfunction getOriginalUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\nfunction getRouteKey(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n return normalizeRoutePath(location.pathname);\n}\n\nfunction getNormalizedPath(environment?: ReviewEnvironment) {\n return getRouteKey(environment);\n}\n\nfunction getPublicSearch(location: Location) {\n const params = new URLSearchParams(location.search);\n\n INTERNAL_QUERY_PARAMS.forEach((key) => params.delete(key));\n\n const value = params.toString();\n return value ? `?${value}` : '';\n}\n\nfunction createId() {\n if ('randomUUID' in crypto) return crypto.randomUUID();\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction formatDate(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return date.toLocaleString(undefined, {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction formatAreaDraftMeta(draft: AreaDraft) {\n const parts = [`viewport ${formatSize(draft.viewport)}`];\n\n if (draft.selection) {\n parts.push(`rect ${formatSelection(draft.selection.viewport)}`);\n }\n\n if (draft.marker) {\n parts.push(`point ${formatPoint(draft.marker.viewport)}`);\n }\n\n return parts.join(' / ');\n}\n\nfunction formatNoteDraftMeta(draft: NoteDraft) {\n const parts = [\n `viewport ${formatSize(draft.viewport)}`,\n `point ${formatPoint(draft.marker.viewport)}`,\n ];\n\n if (draft.anchor) {\n parts.push(formatAnchorMeta(draft.anchor));\n }\n\n return parts.join(' / ');\n}\n\nfunction formatItemMeta(item: ReviewItem) {\n const parts = [formatDate(item.createdAt)];\n const marker = getItemMarker(item);\n const selection = getItemSelection(item);\n\n if (item.viewport) {\n parts.push(`viewport ${formatSize(item.viewport)}`);\n }\n\n if (marker) {\n parts.push(`point ${formatPoint(marker.viewport)}`);\n }\n\n if (selection) {\n parts.push(`rect ${formatSelection(selection.viewport)}`);\n }\n\n if (item.anchor) {\n parts.push(formatAnchorMeta(item.anchor));\n }\n\n return parts.join(' / ');\n}\n\nfunction formatSize(size: ViewportSize) {\n return `${Math.round(size.width)}x${Math.round(size.height)}`;\n}\n\nfunction formatPoint(point: ReviewPoint) {\n return `${Math.round(point.x)},${Math.round(point.y)}`;\n}\n\nfunction formatSelection(selection: RelativeSelection) {\n return [\n Math.round(selection.x),\n Math.round(selection.y),\n Math.round(selection.width),\n Math.round(selection.height),\n ].join(',');\n}\n\nfunction formatAnchorMeta(anchor: DomAnchor) {\n const parts = [`dom ${anchor.strategy}`];\n\n if (typeof anchor.confidence === 'number') {\n parts.push(`${Math.round(anchor.confidence * 100)}%`);\n }\n\n const candidates = getAnchorCandidates(anchor);\n if (candidates.length > 1) {\n parts.push(`${candidates.length} candidates`);\n }\n\n return parts.join(' ');\n}\n\nfunction getViewportSize(environment?: ReviewEnvironment): ViewportSize {\n const targetWindow = environment?.window ?? window;\n return {\n width: targetWindow.innerWidth,\n height: targetWindow.innerHeight,\n };\n}\n\nfunction roundPoint(point: ReviewPoint): ReviewPoint {\n return {\n x: Math.round(point.x),\n y: Math.round(point.y),\n };\n}\n\nfunction runWithAutoScrollBehavior(\n targetDocument: Document,\n callback: () => void\n) {\n const elements = [\n targetDocument.documentElement,\n targetDocument.body,\n ].filter((element): element is HTMLElement => Boolean(element));\n const previousValues = elements.map((element) => element.style.scrollBehavior);\n\n elements.forEach((element) => {\n element.style.scrollBehavior = 'auto';\n });\n\n try {\n callback();\n } finally {\n elements.forEach((element, index) => {\n element.style.scrollBehavior = previousValues[index] ?? '';\n });\n }\n}\n\nfunction setDocumentScrollInstantly(\n environment: ReviewEnvironment,\n position: { x: number; y: number }\n) {\n const scrollElement = environment.document.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = Math.max(0, Math.round(position.x));\n scrollElement.scrollTop = Math.max(0, Math.round(position.y));\n return;\n }\n\n environment.window.scrollTo(\n Math.max(0, Math.round(position.x)),\n Math.max(0, Math.round(position.y))\n );\n}\n\nfunction isPointInViewport(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return (\n point.x >= 0 &&\n point.y >= 0 &&\n point.x <= viewport.width &&\n point.y <= viewport.height\n );\n}\n\nfunction isSelectionInViewport(\n selection: ViewportSelection,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return rectanglesIntersect(selection, {\n left: 0,\n top: 0,\n width: viewport.width,\n height: viewport.height,\n });\n}\n\nfunction clampPoint(point: ReviewPoint, environment?: ReviewEnvironment) {\n const viewport = getViewportSize(environment);\n return {\n x: clamp(point.x, 0, viewport.width),\n y: clamp(point.y, 0, viewport.height),\n };\n}\n\nfunction getPopoverPosition(\n point: ReviewPoint,\n environment?: ReviewEnvironment,\n options?: {\n width?: number;\n estimatedHeight?: number;\n offset?: number;\n }\n) {\n const bounds = getPopoverBounds(environment);\n const margin = 12;\n const width = Math.min(\n options?.width ?? 320,\n Math.max(240, bounds.width - margin * 2)\n );\n const estimatedHeight = options?.estimatedHeight ?? 178;\n const offset = options?.offset ?? 12;\n\n return {\n left: clamp(\n point.x + offset,\n bounds.left + margin,\n bounds.left + bounds.width - width - margin\n ),\n top: clamp(\n point.y + offset,\n bounds.top + margin,\n bounds.top + bounds.height - estimatedHeight - margin\n ),\n };\n}\n\nfunction getAreaPopoverPosition(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n) {\n return getPopoverPosition(\n {\n x: selection.left + selection.width,\n y: selection.top,\n },\n environment,\n {\n width: 360,\n estimatedHeight: 206,\n }\n );\n}\n\nfunction getPopoverBounds(environment?: ReviewEnvironment) {\n if (!environment) {\n return {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n\n return environment.overlayRect;\n}\n\nfunction toHostPoint(point: ReviewPoint, environment?: ReviewEnvironment) {\n if (!environment) return point;\n\n return {\n x: point.x + environment.viewportRect.left,\n y: point.y + environment.viewportRect.top,\n };\n}\n\nfunction toHostSelection(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n): ViewportSelection {\n return {\n left: selection.left + environment.viewportRect.left,\n top: selection.top + environment.viewportRect.top,\n width: selection.width,\n height: selection.height,\n };\n}\n\nfunction toTargetPoint(point: ReviewPoint, environment?: ReviewEnvironment) {\n if (!environment) return point;\n\n return {\n x: point.x - environment.viewportRect.left,\n y: point.y - environment.viewportRect.top,\n };\n}\n\nfunction toTargetPointFromHostEvent(\n event: Pick<PointerEvent, 'clientX' | 'clientY'>,\n environment?: ReviewEnvironment\n) {\n return toTargetPoint(\n {\n x: event.clientX,\n y: event.clientY,\n },\n environment\n );\n}\n\nfunction placeLayerOverTarget(\n layer: HTMLElement,\n environment: ReviewEnvironment\n) {\n layer.style.left = `${environment.viewportRect.left}px`;\n layer.style.top = `${environment.viewportRect.top}px`;\n layer.style.width = `${environment.viewportRect.width}px`;\n layer.style.height = `${environment.viewportRect.height}px`;\n layer.style.right = 'auto';\n layer.style.bottom = 'auto';\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), Math.max(min, max));\n}\n\nfunction roundRatio(value: number) {\n return Math.round(value * 10000) / 10000;\n}\n\nfunction cssEscape(value: string) {\n if ('CSS' in window && typeof window.CSS.escape === 'function') {\n return window.CSS.escape(value);\n }\n\n return value.replace(/[^a-zA-Z0-9_-]/g, '\\\\$&');\n}\n\nfunction createNoopController(): WebReviewKitController {\n return {\n open() {},\n close() {},\n toggle() {},\n setMode() {},\n getMode() {\n return 'idle';\n },\n highlightItem() {},\n setHiddenItemIds() {},\n async reload() {\n return [];\n },\n getItems() {\n return [];\n },\n destroy() {},\n };\n}\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from './types';\n\nconst REVIEW_PRESENCE_SESSION_KEY = 'df-review-presence-session-id';\nconst DEFAULT_LOCAL_PRESENCE_CHANNEL = 'df-review-kit:presence';\nconst DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS = 5000;\nconst DEFAULT_LOCAL_PRESENCE_STALE_MS = 16000;\nconst PRESENCE_COLORS = [\n '#7cc7ff',\n '#63d7c7',\n '#f3b75f',\n '#c99cff',\n '#ff8f61',\n '#9cc76b',\n '#f278a6',\n '#79a7ff',\n];\n\ntype LocalPresenceMessage =\n | {\n type: 'request';\n sessionId: string;\n }\n | {\n type: 'update';\n sessionId: string;\n user: ReviewPresenceUser;\n }\n | {\n type: 'leave';\n sessionId: string;\n };\n\nexport type LocalPresenceAdapterOptions = {\n channelName?: string;\n heartbeatMs?: number;\n staleMs?: number;\n};\n\nconst createId = () => {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nconst hashString = (value: string) => {\n let hash = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(index);\n hash |= 0;\n }\n\n return Math.abs(hash);\n};\n\nexport const getReviewPresenceColor = (value: string) =>\n PRESENCE_COLORS[hashString(value || 'anonymous') % PRESENCE_COLORS.length];\n\nexport const getReviewPresenceDisplayName = (userId: string) =>\n userId.trim() || 'anonymous';\n\nexport const getReviewPresenceSessionId = () => {\n if (typeof window === 'undefined') return createId();\n\n try {\n const stored = window.sessionStorage.getItem(REVIEW_PRESENCE_SESSION_KEY);\n if (stored) return stored;\n\n const nextId = createId();\n window.sessionStorage.setItem(REVIEW_PRESENCE_SESSION_KEY, nextId);\n return nextId;\n } catch {\n return createId();\n }\n};\n\nconst getTimestamp = () => new Date().toISOString();\n\nconst normalizePresenceUser = (\n state: ReviewPresenceState\n): ReviewPresenceUser => ({\n ...state,\n displayName: getReviewPresenceDisplayName(state.displayName || state.userId),\n updatedAt: state.updatedAt || getTimestamp(),\n});\n\nexport const createLocalPresenceAdapter = (\n options: LocalPresenceAdapterOptions = {}\n): ReviewPresenceAdapter => ({\n label: 'local-presence',\n connect: (context: ReviewPresenceContext) => {\n const heartbeatMs =\n options.heartbeatMs ?? DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS;\n const staleMs = options.staleMs ?? DEFAULT_LOCAL_PRESENCE_STALE_MS;\n const users = new Map<string, ReviewPresenceUser>();\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentUser = normalizePresenceUser({\n ...context.initialState,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n\n const Channel =\n typeof BroadcastChannel === 'undefined' ? undefined : BroadcastChannel;\n const channel = Channel\n ? new Channel(options.channelName ?? DEFAULT_LOCAL_PRESENCE_CHANNEL)\n : null;\n\n const getUsers = () => {\n const now = Date.now();\n\n users.forEach((user, sessionId) => {\n if (now - Date.parse(user.updatedAt) > staleMs) {\n users.delete(sessionId);\n }\n });\n\n return Array.from(users.values()).sort((a, b) => {\n if (a.sessionId === context.sessionId) return -1;\n if (b.sessionId === context.sessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n };\n\n const emit = () => {\n const nextUsers = getUsers();\n listeners.forEach((listener) => listener(nextUsers));\n };\n\n const post = (message: LocalPresenceMessage) => {\n try {\n channel?.postMessage(message);\n } catch {\n return;\n }\n };\n\n const publish = () => {\n post({\n type: 'update',\n sessionId: context.sessionId,\n user: currentUser,\n });\n };\n\n if (channel) {\n channel.onmessage = (event: MessageEvent<LocalPresenceMessage>) => {\n const message = event.data;\n if (!message || message.sessionId === context.sessionId) return;\n\n if (message.type === 'request') {\n publish();\n return;\n }\n\n if (message.type === 'leave') {\n users.delete(message.sessionId);\n emit();\n return;\n }\n\n if (message.type === 'update' && message.user) {\n users.set(message.sessionId, normalizePresenceUser(message.user));\n emit();\n }\n };\n }\n\n const intervalId =\n typeof window === 'undefined'\n ? undefined\n : window.setInterval(() => {\n currentUser = {\n ...currentUser,\n updatedAt: getTimestamp(),\n };\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n }, heartbeatMs);\n\n emit();\n publish();\n post({\n type: 'request',\n sessionId: context.sessionId,\n });\n\n return {\n update: (state) => {\n currentUser = normalizePresenceUser({\n ...currentUser,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: () => {\n if (intervalId) {\n window.clearInterval(intervalId);\n }\n post({\n type: 'leave',\n sessionId: context.sessionId,\n });\n channel?.close();\n listeners.clear();\n users.clear();\n },\n };\n },\n});\n\nexport const createFallbackPresenceAdapter = (\n primaryAdapter: ReviewPresenceAdapter,\n fallbackAdapter: ReviewPresenceAdapter\n): ReviewPresenceAdapter => ({\n label: `${primaryAdapter.label}-with-${fallbackAdapter.label}-fallback`,\n connect: async (context: ReviewPresenceContext) => {\n try {\n return await primaryAdapter.connect(context);\n } catch (error) {\n if (typeof console !== 'undefined') {\n console.warn(\n `[df-review-kit] ${primaryAdapter.label} failed. Falling back to ${fallbackAdapter.label}.`,\n error\n );\n }\n return fallbackAdapter.connect(context);\n }\n },\n});\n","import type { ReviewItemScope } from '../types';\nimport type { ReviewQaFilter, ReviewShellTheme } from './types';\n\nexport const REVIEW_QA_FILTERS: Array<{\n key: ReviewQaFilter;\n label: string;\n scope?: ReviewItemScope;\n}> = [\n { key: 'all', label: 'All' },\n { key: 'mobile', label: 'Mobile', scope: 'mobile' },\n { key: 'tablet', label: 'Tablet', scope: 'tablet' },\n { key: 'desktop', label: 'Desktop', scope: 'desktop' },\n { key: 'wide', label: 'Wide', scope: 'wide' },\n];\n\nexport const FIGMA_OVERLAY_UNAVAILABLE_MESSAGE =\n '피그마 오버레이 디버깅이 안되는 해상도';\nexport const FIGMA_TOKEN_STORAGE_KEY = 'figma-token';\nexport const REVIEW_USER_ID_STORAGE_KEY = 'user-id';\nexport const REVIEW_THEME_STORAGE_KEY = 'df-review-theme';\nexport const DEFAULT_REVIEW_THEME: ReviewShellTheme = 'dark';\nexport const FIGMA_TOKEN_GUIDE_ID = 'df-review-figma-token-guide';\nexport const DEFAULT_INITIAL_REVIEW_PROMPT =\n 'You are fixing QA issues collected with df-web-review-kit. Use the copied QA prompt as the source of truth for page, viewport, selector, DOM metadata, coordinates, and user comment. Make the smallest code or CSS change that fixes the issue, preserve unrelated behavior, then verify the target viewport again.';\n\nexport const REVIEW_THEME_OPTIONS: Array<{\n value: ReviewShellTheme;\n label: string;\n}> = [\n { value: 'dark', label: 'Dark' },\n { value: 'light', label: 'Light' },\n { value: 'system', label: 'System' }\n];\n","import type { ReviewItem, ReviewSource } from '../types';\nimport type { ReviewShellViewportPreset } from './types';\n\nexport const DEFAULT_REVIEW_PATH_PREFIX = '/review';\n\nexport const normalizeReviewPathPrefix = (value: string) => {\n const raw = value.trim() || DEFAULT_REVIEW_PATH_PREFIX;\n const prefix = raw.startsWith('/') ? raw : `/${raw}`;\n return prefix.length > 1 && prefix.endsWith('/')\n ? prefix.slice(0, -1)\n : prefix;\n};\n\nexport const normalizeTarget = (\n value: string,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n const raw = value.trim() || '/';\n const [path] = raw.split(/[?#]/);\n const normalized = path.startsWith('/') ? path : `/${path}`;\n const reviewPrefix = normalizeReviewPathPrefix(reviewPathPrefix);\n\n return normalized === reviewPrefix ||\n normalized.startsWith(`${reviewPrefix}/`)\n ? '/'\n : normalized;\n};\n\nexport const getInitialTarget = (reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX) => {\n if (typeof window === 'undefined') return '/';\n\n const target = new URLSearchParams(window.location.search).get('target');\n return target ? normalizeTarget(target, reviewPathPrefix) : '/';\n};\n\nexport const buildTargetSrc = (target: string) => {\n const url = new URL(target || '/', window.location.origin);\n url.searchParams.set('__dfwr_target', '1');\n return `${url.pathname}${url.search}${url.hash}`;\n};\n\nexport const getHashRoutePath = (hash: string) => {\n if (!hash.startsWith('#/')) return null;\n\n const [path] = hash.slice(1).split(/[?#]/);\n try {\n return decodeURI(path || '/');\n } catch {\n return path || '/';\n }\n};\n\nexport const getFrameRouteTarget = (\n targetWindow: Window,\n reviewPathPrefix: string\n) => {\n const hashPath = getHashRoutePath(targetWindow.location.hash);\n return normalizeTarget(\n hashPath ?? targetWindow.location.pathname,\n reviewPathPrefix\n );\n};\n\nexport const updateShellUrl = (\n target: string,\n size: ReviewShellViewportPreset,\n source: ReviewSource\n) => {\n const url = new URL(window.location.href);\n url.searchParams.set('target', target);\n url.searchParams.set('w', String(size.width));\n url.searchParams.set('h', String(size.height));\n if (source !== 'local') {\n url.searchParams.set('source', source);\n } else {\n url.searchParams.delete('source');\n }\n url.searchParams.delete('item');\n window.history.replaceState(null, '', `${url.pathname}${url.search}`);\n};\n\nexport const updateShellUrlForItem = (\n target: string,\n size: ReviewShellViewportPreset,\n itemId: string,\n source: ReviewSource\n) => {\n const url = new URL(window.location.href);\n url.searchParams.set('target', target);\n url.searchParams.set('w', String(size.width));\n url.searchParams.set('h', String(size.height));\n url.searchParams.set('item', itemId);\n if (source !== 'local') {\n url.searchParams.set('source', source);\n } else {\n url.searchParams.delete('source');\n }\n window.history.replaceState(null, '', `${url.pathname}${url.search}`);\n};\n\nexport const getInitialItemId = () => {\n if (typeof window === 'undefined') return null;\n return new URLSearchParams(window.location.search).get('item');\n};\n\nexport const getInitialSource = (\n remoteSource: ReviewSource | null | undefined\n): ReviewSource => {\n if (typeof window === 'undefined' || !remoteSource) return 'local';\n return new URLSearchParams(window.location.search).get('source') ===\n remoteSource\n ? remoteSource\n : 'local';\n};\n\nexport const getItemTarget = (\n item: ReviewItem,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n if (item.routeKey) return normalizeTarget(item.routeKey, reviewPathPrefix);\n if (item.normalizedPath) {\n return normalizeTarget(item.normalizedPath, reviewPathPrefix);\n }\n\n try {\n return normalizeTarget(new URL(item.pageUrl).pathname, reviewPathPrefix);\n } catch {\n return '/';\n }\n};\n","import type { ReviewItem, ReviewViewportPreset } from '../types';\nimport type { ReviewShellViewportKind, ReviewShellViewportPreset } from './types';\n\nexport const DEFAULT_REVIEW_VIEWPORT_PRESETS: ReviewShellViewportPreset[] = [\n { label: 'Mobile', width: 390, height: 720, kind: 'mobile' },\n { label: 'Tablet', width: 768, height: 1024, kind: 'tablet' },\n { label: 'Desktop', width: 1440, height: 900, kind: 'desktop' },\n { label: 'Wide', width: 1980, height: 1080, kind: 'wide' }\n];\n\nexport const getFallbackPreset = (presets: ReviewShellViewportPreset[]) =>\n presets[0] ?? DEFAULT_REVIEW_VIEWPORT_PRESETS[0];\n\nexport const getViewportPresetDistance = (\n preset: ReviewShellViewportPreset,\n width: number,\n height: number\n) => Math.abs(preset.width - width) + Math.abs(preset.height - height);\n\nexport const findViewportPreset = (\n presets: ReviewShellViewportPreset[],\n width: number,\n height: number\n) => {\n const fallback = getFallbackPreset(presets);\n const exact = presets.find(\n (preset) => preset.width === width && preset.height === height\n );\n\n if (exact) return exact;\n\n return presets.reduce((closest, preset) => {\n const closestDistance = getViewportPresetDistance(closest, width, height);\n const presetDistance = getViewportPresetDistance(preset, width, height);\n return presetDistance < closestDistance ? preset : closest;\n }, fallback);\n};\n\nexport const getInitialSize = (\n presets: ReviewShellViewportPreset[]\n): ReviewShellViewportPreset => {\n if (typeof window === 'undefined') return getFallbackPreset(presets);\n\n const params = new URLSearchParams(window.location.search);\n const width = Number(params.get('w'));\n const height = Number(params.get('h'));\n\n if (\n Number.isFinite(width) &&\n Number.isFinite(height) &&\n width > 0 &&\n height > 0\n ) {\n return findViewportPreset(presets, width, height);\n }\n\n return getFallbackPreset(presets);\n};\n\nexport const getRestoredSize = (\n item: ReviewItem,\n presets: ReviewShellViewportPreset[]\n): ReviewShellViewportPreset =>\n findViewportPreset(\n presets,\n Math.max(\n 240,\n Math.round(item.viewport?.width ?? getFallbackPreset(presets).width)\n ),\n Math.max(\n 320,\n Math.round(item.viewport?.height ?? getFallbackPreset(presets).height)\n )\n );\n\nexport const getViewportPresetKind = (\n preset: ReviewShellViewportPreset\n): ReviewShellViewportKind => {\n if (preset.kind) return preset.kind;\n\n const label = preset.label.toLowerCase();\n\n if (label.includes('mobile') || label.includes('phone')) return 'mobile';\n if (label.includes('tablet') || label.includes('pad')) return 'tablet';\n if (\n label.includes('wide') ||\n label.includes('1980') ||\n label.includes('1940') ||\n label.includes('1920')\n ) {\n return 'wide';\n }\n if (label.includes('desktop')) return 'desktop';\n if (preset.width >= 1800) return 'wide';\n if (preset.width >= 1000) return 'desktop';\n if (preset.width >= 700) return 'tablet';\n return 'mobile';\n};\n\nexport const toReviewViewportPresets = (\n presets: ReviewShellViewportPreset[]\n): ReviewViewportPreset[] =>\n presets.map((preset) => ({\n label: preset.label,\n width: preset.width,\n height: preset.height,\n scope: getViewportPresetKind(preset)\n }));\n\nexport const getIsFigmaOverlayAvailable = (preset: ReviewShellViewportPreset) => {\n const kind = getViewportPresetKind(preset);\n return kind === 'mobile' || kind === 'wide';\n};\n","import type { ReviewItem } from '../types';\n\nexport const isAnchorRestorableReviewItem = (item: ReviewItem) =>\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && item.selection));\n\nexport const queryReviewItemAnchorElement = (\n targetDocument: Document,\n item: ReviewItem\n) => {\n const anchor = item.anchor;\n if (!anchor || !isAnchorRestorableReviewItem(item)) return undefined;\n\n const expectedRect = getReviewItemExpectedDocumentRect(item);\n const candidates = [anchor, ...(anchor.candidates ?? [])].filter(\n (candidate) => Boolean(candidate.selector)\n );\n const matches: Array<{\n element: Element;\n score: number;\n }> = [];\n\n candidates.forEach((candidate, index) => {\n try {\n targetDocument.querySelectorAll(candidate.selector).forEach((element) => {\n if (!isScrollableReviewAnchorElement(element)) return;\n\n matches.push({\n element,\n score: getReviewAnchorMatchScore(\n element,\n expectedRect,\n candidate.textFingerprint ?? anchor.textFingerprint,\n index\n )\n });\n });\n } catch {\n return;\n }\n });\n\n return matches.sort((a, b) => a.score - b.score)[0]?.element;\n};\n\nexport const getReviewItemRestoreScrollPosition = (\n targetWindow: Window,\n targetDocument: Document,\n item: ReviewItem,\n anchorElement?: Element\n) => {\n if (anchorElement) {\n const rect = anchorElement.getBoundingClientRect();\n return clampDocumentScrollPosition(targetDocument, {\n left:\n targetWindow.scrollX +\n rect.left -\n Math.max(0, (targetWindow.innerWidth - rect.width) / 2),\n top:\n targetWindow.scrollY +\n rect.top -\n Math.max(0, (targetWindow.innerHeight - rect.height) / 2)\n });\n }\n\n return clampDocumentScrollPosition(targetDocument, {\n left: item.scroll?.x ?? 0,\n top: item.scroll?.y ?? 0\n });\n};\n\nexport const setDocumentScrollInstantly = (\n targetWindow: Window,\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = position.left;\n scrollElement.scrollTop = position.top;\n return;\n }\n\n targetWindow.scrollTo(position.left, position.top);\n};\n\nexport const getReviewItemExpectedDocumentRect = (item: ReviewItem) => {\n const scroll = item.scroll ?? { x: 0, y: 0 };\n const selection = item.selection?.viewport;\n if (\n selection &&\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n ) {\n return {\n left: scroll.x + selection.x,\n top: scroll.y + selection.y,\n width: selection.width,\n height: selection.height\n };\n }\n\n const marker = item.marker?.viewport;\n if (marker && typeof marker.x === 'number' && typeof marker.y === 'number') {\n return {\n left: scroll.x + marker.x,\n top: scroll.y + marker.y,\n width: 1,\n height: 1\n };\n }\n\n return undefined;\n};\n\nexport const getReviewAnchorMatchScore = (\n element: Element,\n expectedRect:\n | {\n left: number;\n top: number;\n width: number;\n height: number;\n }\n | undefined,\n textFingerprint: string | undefined,\n candidateIndex: number\n) => {\n const rect = getElementDocumentRect(element);\n let score = candidateIndex * 25;\n\n if (expectedRect) {\n score += Math.abs(rect.top - expectedRect.top);\n score += Math.abs(rect.left - expectedRect.left) * 0.25;\n score += Math.abs(rect.width - expectedRect.width) * 0.1;\n score += Math.abs(rect.height - expectedRect.height) * 0.1;\n }\n\n if (textFingerprint) {\n score +=\n (1 - getReviewTextFingerprintScore(textFingerprint, element)) * 100;\n }\n\n return score;\n};\n\nexport const getElementDocumentRect = (element: Element) => {\n const rect = element.getBoundingClientRect();\n const view = element.ownerDocument.defaultView;\n\n return {\n left: rect.left + (view?.scrollX ?? 0),\n top: rect.top + (view?.scrollY ?? 0),\n width: rect.width,\n height: rect.height\n };\n};\n\nconst clampDocumentScrollPosition = (\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement;\n const view = targetDocument.defaultView;\n const maxLeft = Math.max(\n 0,\n (scrollElement?.scrollWidth ?? 0) - (view?.innerWidth ?? 0)\n );\n const maxTop = Math.max(\n 0,\n (scrollElement?.scrollHeight ?? 0) - (view?.innerHeight ?? 0)\n );\n\n return {\n left: Math.min(Math.max(0, Math.round(position.left)), maxLeft),\n top: Math.min(Math.max(0, Math.round(position.top)), maxTop)\n };\n};\n\nexport const getReviewTextFingerprintScore = (expected: string, element: Element) => {\n const actual = element.textContent?.replace(/\\s+/g, ' ').trim();\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getReviewFingerprintTokens(expected);\n const actualTokens = new Set(getReviewFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return Math.min(Math.max(matches.length / expectedTokens.length, 0.25), 0.76);\n};\n\nexport const getReviewFingerprintTokens = (value: string) =>\n value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n\nexport const isScrollableReviewAnchorElement = (element: Element) => {\n const id = element.id.trim().toLowerCase();\n if (\n element === element.ownerDocument.body ||\n element === element.ownerDocument.documentElement ||\n ['app', 'main', 'page', 'root', '__next', '__nuxt'].includes(id)\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n const viewportHeight = element.ownerDocument.documentElement.clientHeight;\n const scrollHeight = element.ownerDocument.documentElement.scrollHeight;\n return !(\n scrollHeight > viewportHeight * 1.5 && rect.height > viewportHeight * 3\n );\n};\n","import type { TargetOverlayState } from './types';\n\nexport const HIDE_SCROLLBAR_STYLE_ID = 'df-review-hide-scrollbar';\n\nexport const setTargetScrollbarHidden = (\n targetDocument: Document | null | undefined,\n hidden: boolean\n) => {\n if (!targetDocument) return;\n\n const existing = targetDocument.getElementById(HIDE_SCROLLBAR_STYLE_ID);\n if (hidden) {\n if (existing) return;\n const style = targetDocument.createElement('style');\n style.id = HIDE_SCROLLBAR_STYLE_ID;\n style.textContent =\n 'html{scrollbar-width:none}html::-webkit-scrollbar,body::-webkit-scrollbar{width:0;height:0;display:none}';\n targetDocument.head?.appendChild(style);\n } else {\n existing?.remove();\n }\n};\n\nexport const isEditableEventTarget = (event: KeyboardEvent) => {\n const path = event.composedPath?.() ?? [];\n const element = (path[0] ?? event.target) as HTMLElement | null;\n if (!element || typeof element.tagName !== 'string') return false;\n const tag = element.tagName;\n return (\n tag === 'INPUT' || tag === 'TEXTAREA' || element.isContentEditable === true\n );\n};\n\nexport const getTargetOverlayState = (\n targetDocument: Document | undefined\n): TargetOverlayState => ({\n grid: Boolean(\n targetDocument?.body.classList.contains('is-help') ||\n targetDocument?.querySelector('.helper.onShow')\n ),\n figma: Boolean(\n targetDocument?.querySelector(\n '.helper-figma-root, .helper-figma-loading-backdrop'\n )\n )\n});\n","import type { ReviewRulerMeasure, ReviewRulerPoint } from './types';\n\nexport const getRulerPointFromRect = (\n clientX: number,\n clientY: number,\n rect: DOMRect\n): ReviewRulerPoint => {\n const x = Math.min(Math.max(clientX - rect.left, 0), rect.width);\n const y = Math.min(Math.max(clientY - rect.top, 0), rect.height);\n\n return {\n x: Math.round(x),\n y: Math.round(y)\n };\n};\n\nexport const getRulerMeasure = (\n start: ReviewRulerPoint | null,\n end: ReviewRulerPoint | null\n): ReviewRulerMeasure | undefined => {\n if (!start || !end) return undefined;\n\n return {\n left: Math.min(start.x, end.x),\n top: Math.min(start.y, end.y),\n width: Math.abs(end.x - start.x),\n height: Math.abs(end.y - start.y)\n };\n};\n","import type { ReviewShellTheme } from './types';\nimport {\n DEFAULT_REVIEW_THEME,\n FIGMA_TOKEN_STORAGE_KEY,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from './constants';\n\nexport const normalizeReviewTheme = (value: string | null): ReviewShellTheme =>\n value === 'light' || value === 'system' || value === 'dark'\n ? value\n : DEFAULT_REVIEW_THEME;\n\nexport const getStoredFigmaToken = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return window.localStorage.getItem(FIGMA_TOKEN_STORAGE_KEY) ?? '';\n } catch {\n return '';\n }\n};\n\nexport const writeStoredFigmaToken = (token: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (token) {\n window.localStorage.setItem(FIGMA_TOKEN_STORAGE_KEY, token);\n } else {\n window.localStorage.removeItem(FIGMA_TOKEN_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewUserId = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return window.localStorage.getItem(REVIEW_USER_ID_STORAGE_KEY) ?? '';\n } catch {\n return '';\n }\n};\n\nexport const writeStoredReviewUserId = (userId: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (userId) {\n window.localStorage.setItem(REVIEW_USER_ID_STORAGE_KEY, userId);\n } else {\n window.localStorage.removeItem(REVIEW_USER_ID_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewTheme = () => {\n if (typeof window === 'undefined') return DEFAULT_REVIEW_THEME;\n\n try {\n return normalizeReviewTheme(\n window.localStorage.getItem(REVIEW_THEME_STORAGE_KEY)\n );\n } catch {\n return DEFAULT_REVIEW_THEME;\n }\n};\n\nexport const writeStoredReviewTheme = (theme: ReviewShellTheme) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (theme === DEFAULT_REVIEW_THEME) {\n window.localStorage.removeItem(REVIEW_THEME_STORAGE_KEY);\n } else {\n window.localStorage.setItem(REVIEW_THEME_STORAGE_KEY, theme);\n }\n } catch {\n return;\n }\n};\n\nexport const getSystemReviewTheme = (): Exclude<ReviewShellTheme, 'system'> => {\n if (typeof window === 'undefined' || !window.matchMedia) return 'dark';\n return window.matchMedia('(prefers-color-scheme: light)').matches\n ? 'light'\n : 'dark';\n};\n","import type { NumberedReviewItem, ReviewItem } from '../types';\nimport { getItemTarget } from './route';\n\nexport const getItemTitle = (item: ReviewItem) =>\n item.title || item.comment.split('\\n')[0] || item.kind;\n\nexport const formatItemMeta = (item: ReviewItem) => {\n const parts = [\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(item.viewport?.height ?? 0)}`\n ];\n\n if (item.scroll) {\n parts.push(\n `scroll ${Math.round(item.scroll.x)},${Math.round(item.scroll.y)}`\n );\n }\n\n return parts.join(' / ');\n};\n\nexport const formatPromptViewport = (item: ReviewItem) =>\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(\n item.viewport?.height ?? 0\n )}`;\n\nexport const formatPromptPoint = (point: { x: number; y: number } | undefined) =>\n point ? `x=${Math.round(point.x)}, y=${Math.round(point.y)}` : '(none)';\n\nexport const formatPromptSelection = (\n selection:\n | {\n x?: number;\n y?: number;\n left?: number;\n top?: number;\n width: number;\n height: number;\n }\n | undefined\n) => {\n if (!selection) return '(none)';\n\n const x = 'x' in selection ? selection.x : selection.left;\n const y = 'y' in selection ? selection.y : selection.top;\n return `x=${Math.round(x ?? 0)}, y=${Math.round(y ?? 0)}, width=${Math.round(\n selection.width\n )}, height=${Math.round(selection.height)}`;\n};\n\nexport const decodePromptHtmlEntities = (value: string) =>\n value.replace(\n /&(#\\d+|#x[\\da-f]+|lt|gt|quot|apos|amp);/gi,\n (match, entity: string) => {\n const normalized = entity.toLowerCase();\n\n if (normalized === 'lt') return '<';\n if (normalized === 'gt') return '>';\n if (normalized === 'quot') return '\"';\n if (normalized === 'apos') return \"'\";\n if (normalized === 'amp') return '&';\n\n const codePoint = normalized.startsWith('#x')\n ? Number.parseInt(normalized.slice(2), 16)\n : Number.parseInt(normalized.slice(1), 10);\n\n return Number.isFinite(codePoint)\n ? String.fromCodePoint(codePoint)\n : match;\n }\n );\n\nexport const getPromptAnchorCandidates = (item: ReviewItem) => {\n const anchor = item.anchor;\n if (!anchor) return [];\n\n const seen = new Set<string>();\n return [anchor, ...(anchor.candidates ?? [])].filter((candidate) => {\n const key = `${candidate.strategy}:${candidate.selector}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\nexport const formatPromptSourceHint = (item: ReviewItem) => {\n const source = item.anchor?.source;\n if (!source) return '(none)';\n\n return [\n `Component: ${source.component ?? '(unknown)'}`,\n `File: ${source.file ?? '(unknown)'}`,\n `Section index: ${source.sectionIndex ?? '(unknown)'}`,\n `Section id: ${source.sectionId ?? '(none)'}`,\n ].join('\\n');\n};\n\nexport const buildReviewItemPrompt = (\n numberedItem: NumberedReviewItem,\n reviewPathPrefix: string\n) => {\n const { item } = numberedItem;\n const anchor = item.anchor;\n const candidates = getPromptAnchorCandidates(item);\n const candidateLines =\n candidates.length > 0\n ? candidates\n .map((candidate, index) => {\n const confidence =\n typeof candidate.confidence === 'number'\n ? `, confidence=${Math.round(candidate.confidence * 100)}%`\n : '';\n const fingerprint = candidate.textFingerprint\n ? `, text=\"${candidate.textFingerprint}\"`\n : '';\n return `${index + 1}. ${candidate.selector} (${candidate.strategy}${confidence}${fingerprint})`;\n })\n .join('\\n')\n : '(none)';\n\n return [\n 'Fix this df-web-review-kit QA issue.',\n '',\n `Page: ${getItemTarget(item, reviewPathPrefix)}`,\n `URL: ${item.originalUrl ?? item.pageUrl}`,\n `QA item: ${numberedItem.displayLabel}`,\n `Viewport: ${numberedItem.label} ${formatPromptViewport(item)}`,\n `Scroll: ${formatPromptPoint(item.scroll)}`,\n '',\n 'Target:',\n `Primary selector: ${anchor?.selector ?? '(missing)'}`,\n `Primary strategy: ${anchor?.strategy ?? '(missing)'}`,\n `Text fingerprint: ${anchor?.textFingerprint ?? '(none)'}`,\n 'Selector candidates:',\n candidateLines,\n '',\n 'Source hint:',\n formatPromptSourceHint(item),\n '',\n `Marker: ${formatPromptPoint(item.marker?.viewport)}`,\n `Marker relative: ${formatPromptPoint(item.marker?.relative)}`,\n `Selection: ${formatPromptSelection(item.selection?.viewport)}`,\n `Selection relative: ${formatPromptSelection(item.selection?.relative)}`,\n '',\n 'Element HTML snippet:',\n '```html',\n anchor?.htmlSnippet\n ? decodePromptHtmlEntities(anchor.htmlSnippet)\n : '(not available)',\n '```',\n '',\n 'Issue:',\n item.comment,\n '',\n 'Request:',\n 'Find the target element with the selector candidates above and apply the smallest UI/CSS/code change that fixes this QA issue. If the selector is missing because CSR or hydration has not finished, wait for the page to load and use the Source hint first. Preserve unrelated layout and behavior.'\n ].join('\\n');\n};\n\nexport const getPromptLengthLabel = (value: string) => {\n const length = value.length;\n if (length <= 2000) return `${length} chars / Discord 2,000 OK`;\n if (length <= 4000) return `${length} chars / Nitro 4,000 OK`;\n return `${length} chars / attach as file`;\n};\n\nexport const formatDate = (value: string) => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return date.toLocaleString(undefined, {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n};\n","import type React from 'react';\nimport {\n CircleHelp as CircleHelpIcon,\n Copy as CopyIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n} from 'lucide-react';\nimport type { NumberedReviewItem } from '../index';\nimport {\n DEFAULT_REVIEW_THEME,\n FIGMA_TOKEN_GUIDE_ID,\n FIGMA_TOKEN_STORAGE_KEY,\n REVIEW_THEME_OPTIONS,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from './constants';\nimport { getItemTitle, getPromptLengthLabel } from './prompt';\nimport { normalizeReviewTheme } from './settings';\nimport type {\n ReviewPresenceUser,\n ReviewPromptTab,\n ReviewShellPage,\n ReviewShellTheme,\n} from './types';\n\ntype SitemapQaCount = {\n local: number;\n remote: number;\n};\n\ninterface SitemapModalProps {\n pages: ReviewShellPage[];\n activeRoute: string;\n pageQaCounts: ReadonlyMap<string, SitemapQaCount>;\n pagePresenceUsers: ReadonlyMap<string, ReviewPresenceUser[]>;\n getPageTarget: (href: string) => string;\n onClose: () => void;\n onSelectPage: (href: string) => void;\n}\n\nconst EMPTY_SITEMAP_QA_COUNT: SitemapQaCount = {\n local: 0,\n remote: 0,\n};\n\nexport const SitemapModal = ({\n pages,\n activeRoute,\n pageQaCounts,\n pagePresenceUsers,\n getPageTarget,\n onClose,\n onSelectPage,\n}: SitemapModalProps) => {\n return (\n <div\n aria-label=\"Sitemap\"\n aria-modal=\"true\"\n className=\"df-review-sitemap-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close sitemap\"\n className=\"df-review-sitemap-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-sitemap-dialog\">\n <div className=\"df-review-sitemap-header\">\n <div>\n <strong>Sitemap</strong>\n <span>{pages.length} pages</span>\n </div>\n <button aria-label=\"Close sitemap\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n <div className=\"df-review-sitemap-list\">\n {pages.map((page) => {\n const pageTarget = getPageTarget(page.href);\n const qaCount = pageQaCounts.get(pageTarget) ?? EMPTY_SITEMAP_QA_COUNT;\n const pageUsers = pagePresenceUsers.get(pageTarget) ?? [];\n\n return (\n <button\n key={page.href}\n aria-label={`${page.href} / local ${qaCount.local} QA / remote ${qaCount.remote} QA / ${pageUsers.length} online`}\n className={pageTarget === activeRoute ? 'is-active' : ''}\n type=\"button\"\n onClick={() => onSelectPage(page.href)}\n >\n <span className=\"df-review-sitemap-path\">{page.href}</span>\n <span className=\"df-review-sitemap-meta\">\n {pageUsers.length > 0 && (\n <span className=\"df-review-sitemap-users\">\n {pageUsers.map((user) => (\n <span\n key={user.sessionId}\n className=\"df-review-sitemap-user\"\n style={{\n '--df-review-presence-color': user.color,\n } as React.CSSProperties}\n >\n {user.userId}\n </span>\n ))}\n </span>\n )}\n <span className=\"df-review-sitemap-counts\">\n <span className=\"df-review-sitemap-count is-local\">\n L {qaCount.local}\n </span>\n <span className=\"df-review-sitemap-count is-remote\">\n R {qaCount.remote}\n </span>\n </span>\n </span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n\ninterface ReviewSettingsModalProps {\n figmaTokenDraft: string;\n reviewUserIdDraft: string;\n reviewThemeDraft: ReviewShellTheme;\n figmaSettingsStatus: string;\n isFigmaTokenVisible: boolean;\n isFigmaTokenGuideOpen: boolean;\n onClose: () => void;\n onFigmaTokenDraftChange: (value: string) => void;\n onReviewUserIdDraftChange: (value: string) => void;\n onReviewThemeDraftChange: (value: ReviewShellTheme) => void;\n onClearStatus: () => void;\n onToggleFigmaTokenVisible: () => void;\n onToggleFigmaTokenGuide: () => void;\n onSave: (\n figmaToken: string,\n reviewUserId: string,\n reviewTheme: ReviewShellTheme\n ) => void;\n}\n\nexport const ReviewSettingsModal = ({\n figmaTokenDraft,\n reviewUserIdDraft,\n reviewThemeDraft,\n figmaSettingsStatus,\n isFigmaTokenVisible,\n isFigmaTokenGuideOpen,\n onClose,\n onFigmaTokenDraftChange,\n onReviewUserIdDraftChange,\n onReviewThemeDraftChange,\n onClearStatus,\n onToggleFigmaTokenVisible,\n onToggleFigmaTokenGuide,\n onSave,\n}: ReviewSettingsModalProps) => {\n return (\n <div\n aria-label=\"Review settings\"\n aria-modal=\"true\"\n className=\"df-review-settings-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close settings\"\n className=\"df-review-settings-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <form\n className=\"df-review-settings-dialog\"\n onSubmit={(event) => {\n event.preventDefault();\n onSave(figmaTokenDraft, reviewUserIdDraft, reviewThemeDraft);\n }}\n >\n <div className=\"df-review-settings-header\">\n <div>\n <strong>Settings</strong>\n <span>\n {FIGMA_TOKEN_STORAGE_KEY} / {REVIEW_USER_ID_STORAGE_KEY} /{' '}\n {REVIEW_THEME_STORAGE_KEY}\n </span>\n </div>\n <button aria-label=\"Close settings\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n <div className=\"df-review-settings-body\">\n <div className=\"df-review-settings-field\">\n <div className=\"df-review-settings-label-row\">\n <label htmlFor=\"df-review-figma-token\">Figma token</label>\n <button\n aria-controls={FIGMA_TOKEN_GUIDE_ID}\n aria-expanded={isFigmaTokenGuideOpen}\n aria-label=\"Show Figma token guide\"\n className={`df-review-settings-help-button${\n isFigmaTokenGuideOpen ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={onToggleFigmaTokenGuide}\n >\n <CircleHelpIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-settings-token-input\">\n <input\n id=\"df-review-figma-token\"\n aria-label=\"Figma token\"\n aria-describedby={\n isFigmaTokenGuideOpen ? FIGMA_TOKEN_GUIDE_ID : undefined\n }\n autoCapitalize=\"off\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n className={isFigmaTokenVisible ? undefined : 'is-token-masked'}\n data-1p-ignore=\"true\"\n data-lpignore=\"true\"\n inputMode=\"text\"\n name=\"df-review-figma-access-key\"\n spellCheck={false}\n type=\"text\"\n value={figmaTokenDraft}\n onChange={(event) => {\n onFigmaTokenDraftChange(event.target.value);\n onClearStatus();\n }}\n />\n <button\n aria-label={\n isFigmaTokenVisible\n ? 'Hide Figma token'\n : 'Show Figma token'\n }\n className=\"df-review-settings-token-toggle\"\n type=\"button\"\n onClick={onToggleFigmaTokenVisible}\n >\n {isFigmaTokenVisible ? (\n <EyeOffIcon aria-hidden=\"true\" />\n ) : (\n <EyeIcon aria-hidden=\"true\" />\n )}\n </button>\n </div>\n {isFigmaTokenGuideOpen && (\n <div\n className=\"df-review-settings-guide\"\n id={FIGMA_TOKEN_GUIDE_ID}\n >\n <ol>\n <li>Figma file browser에서 account menu를 열고 Settings로 이동</li>\n <li>Security 탭의 Personal access tokens로 이동</li>\n <li>Generate new token에서 이름과 scope를 정한 뒤 생성</li>\n <li>생성된 token을 복사해서 여기에 붙여넣기</li>\n </ol>\n </div>\n )}\n </div>\n <label className=\"df-review-settings-field\">\n <span>User ID</span>\n <div className=\"df-review-settings-text-input\">\n <input\n aria-label=\"Review user ID\"\n autoComplete=\"off\"\n spellCheck={false}\n type=\"text\"\n value={reviewUserIdDraft}\n onChange={(event) => {\n onReviewUserIdDraftChange(event.target.value);\n onClearStatus();\n }}\n />\n </div>\n </label>\n <label className=\"df-review-settings-field\">\n <span>Theme</span>\n <div className=\"df-review-settings-select-input\">\n <select\n aria-label=\"Review theme\"\n value={reviewThemeDraft}\n onChange={(event) => {\n onReviewThemeDraftChange(\n normalizeReviewTheme(event.target.value)\n );\n onClearStatus();\n }}\n >\n {REVIEW_THEME_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n </label>\n {figmaSettingsStatus && (\n <p className=\"df-review-settings-status\">{figmaSettingsStatus}</p>\n )}\n <div className=\"df-review-settings-actions\">\n <button\n type=\"button\"\n onClick={() => onSave('', '', DEFAULT_REVIEW_THEME)}\n >\n Clear\n </button>\n <span />\n <button type=\"button\" onClick={onClose}>\n Cancel\n </button>\n <button type=\"submit\">Save</button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n\ninterface PromptModalProps {\n numberedItem: NumberedReviewItem;\n promptTab: ReviewPromptTab;\n activeLabel: string;\n activeText: string;\n activeCopyKey: string;\n copiedPromptKey: string | null;\n onClose: () => void;\n onPromptTabChange: (tab: ReviewPromptTab) => void;\n onCopyPrompt: (text: string, key: string) => void;\n}\n\nexport const PromptModal = ({\n numberedItem,\n promptTab,\n activeLabel,\n activeText,\n activeCopyKey,\n copiedPromptKey,\n onClose,\n onPromptTabChange,\n onCopyPrompt,\n}: PromptModalProps) => {\n return (\n <div\n aria-label=\"Prompt\"\n aria-modal=\"true\"\n className=\"df-review-prompt-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close prompt\"\n className=\"df-review-prompt-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-prompt-dialog\">\n <div className=\"df-review-prompt-header\">\n <div>\n <strong>Prompt</strong>\n <span>\n {numberedItem.displayLabel} / {getItemTitle(numberedItem.item)}\n </span>\n </div>\n <button aria-label=\"Close prompt\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n <div className=\"df-review-prompt-body\">\n <div className=\"df-review-prompt-tabs\" role=\"tablist\">\n <button\n aria-selected={promptTab === 'initial'}\n className={promptTab === 'initial' ? 'is-active' : ''}\n role=\"tab\"\n type=\"button\"\n onClick={() => onPromptTabChange('initial')}\n >\n Initial prompt\n </button>\n <button\n aria-selected={promptTab === 'item'}\n className={promptTab === 'item' ? 'is-active' : ''}\n role=\"tab\"\n type=\"button\"\n onClick={() => onPromptTabChange('item')}\n >\n This QA prompt\n </button>\n </div>\n <section className=\"df-review-prompt-block\" role=\"tabpanel\">\n <div className=\"df-review-prompt-block-header\">\n <div>\n <strong>{activeLabel}</strong>\n <span>{getPromptLengthLabel(activeText)}</span>\n </div>\n <button\n disabled={!activeText}\n type=\"button\"\n onClick={() => onCopyPrompt(activeText, activeCopyKey)}\n >\n <CopyIcon aria-hidden=\"true\" />\n {copiedPromptKey === activeCopyKey ? 'Copied' : 'Copy'}\n </button>\n </div>\n <textarea\n readOnly\n aria-label={activeLabel}\n value={activeText || `${activeLabel} is not configured.`}\n />\n </section>\n </div>\n </div>\n </div>\n );\n};\n","import {\n Image as ImageIcon,\n LayoutGrid as LayoutGridIcon,\n Map as MapIcon,\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n Ruler as RulerIcon,\n Settings as SettingsIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n} from 'lucide-react';\nimport type { ReviewItemScope } from '../index';\nimport { FIGMA_OVERLAY_UNAVAILABLE_MESSAGE } from './constants';\nimport type {\n ReviewShellViewportPreset,\n TargetOverlayKey,\n TargetOverlayState,\n} from './types';\nimport { getViewportPresetKind } from './viewport';\n\ninterface ReviewTopbarProps {\n draftTarget: string;\n copyLabel: string;\n viewportPresets: ReviewShellViewportPreset[];\n size: ReviewShellViewportPreset;\n presetScopeCounts: ReadonlyMap<ReviewItemScope, number>;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n targetOverlayState: TargetOverlayState;\n isFigmaOverlayAvailable: boolean;\n onDraftTargetChange: (value: string) => void;\n onApplyTarget: () => void;\n onOpenSitemap: () => void;\n onCopyCurrentUrl: () => void;\n onSizeChange: (preset: ReviewShellViewportPreset) => void;\n onToggleRuler: () => void;\n onToggleTargetOverlay: (key: TargetOverlayKey) => void;\n onOpenSettings: () => void;\n}\n\nconst ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nconst ViewportPresetIcon = ({\n preset\n}: {\n preset: ReviewShellViewportPreset;\n}) => {\n return <ReviewScopeIcon scope={getViewportPresetKind(preset)} />;\n};\n\nexport const ReviewTopbar = ({\n draftTarget,\n copyLabel,\n viewportPresets,\n size,\n presetScopeCounts,\n isRulerAvailable,\n isRulerVisible,\n targetOverlayState,\n isFigmaOverlayAvailable,\n onDraftTargetChange,\n onApplyTarget,\n onOpenSitemap,\n onCopyCurrentUrl,\n onSizeChange,\n onToggleRuler,\n onToggleTargetOverlay,\n onOpenSettings,\n}: ReviewTopbarProps) => {\n return (\n <header className=\"df-review-topbar\">\n <form\n className=\"df-review-address\"\n onSubmit={(event) => {\n event.preventDefault();\n onApplyTarget();\n }}\n >\n <button\n aria-label=\"Open sitemap\"\n className=\"df-review-sitemap-button\"\n type=\"button\"\n onClick={onOpenSitemap}\n >\n <MapIcon aria-hidden=\"true\" />\n </button>\n <input\n aria-label=\"Path\"\n value={draftTarget}\n onChange={(event) => onDraftTargetChange(event.target.value)}\n />\n <button type=\"submit\">Load</button>\n <button type=\"button\" onClick={onCopyCurrentUrl}>\n {copyLabel}\n </button>\n </form>\n\n <div className=\"df-review-tools\">\n <div className=\"df-review-tool-controls\">\n <div className=\"df-review-presets\" aria-label=\"Viewport presets\">\n {viewportPresets.map((preset) => (\n <button\n key={preset.label}\n className={preset.label === size.label ? 'is-active' : ''}\n type=\"button\"\n onClick={() => onSizeChange(preset)}\n >\n <ViewportPresetIcon preset={preset} />\n <span className=\"df-review-preset-copy\">\n <strong>{preset.label}</strong>\n </span>\n <span className=\"df-review-preset-count\">\n {presetScopeCounts.get(getViewportPresetKind(preset)) ?? 0}\n </span>\n </button>\n ))}\n </div>\n\n <span className=\"df-review-tool-divider\" aria-hidden=\"true\">\n |\n </span>\n\n <span className=\"df-review-active-size\">\n {size.width}x{size.height}\n </span>\n </div>\n\n <div className=\"df-review-overlays\" aria-label=\"Target overlays\">\n {isRulerAvailable && (\n <button\n aria-label=\"Toggle ruler\"\n className={`df-review-overlay-button is-ruler${\n isRulerVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={onToggleRuler}\n >\n <RulerIcon aria-hidden=\"true\" />\n </button>\n )}\n <button\n aria-label=\"Toggle grid overlay\"\n className={`df-review-overlay-button is-grid${\n targetOverlayState.grid ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onToggleTargetOverlay('grid')}\n >\n <LayoutGridIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-disabled={!isFigmaOverlayAvailable}\n aria-label={\n isFigmaOverlayAvailable\n ? 'Toggle Figma overlay'\n : FIGMA_OVERLAY_UNAVAILABLE_MESSAGE\n }\n className={`df-review-overlay-button is-figma${\n targetOverlayState.figma ? ' is-active' : ''\n }${isFigmaOverlayAvailable ? '' : ' is-disabled'}`}\n type=\"button\"\n onClick={() => onToggleTargetOverlay('figma')}\n >\n <ImageIcon aria-hidden=\"true\" />\n </button>\n <span className=\"df-review-tool-divider\" aria-hidden=\"true\">\n |\n </span>\n <button\n aria-label=\"Open settings\"\n className=\"df-review-overlay-button is-settings\"\n type=\"button\"\n onClick={onOpenSettings}\n >\n <SettingsIcon aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n </header>\n );\n};\n","import type { CreateReviewPagesOptions, ReviewShellGlobEntries, ReviewShellPage } from './types';\n\nconst escapeRegExp = (value: string) =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst normalizePageHref = (value: string) => {\n const href = value || '/';\n return href.startsWith('/') ? href : `/${href}`;\n};\n\nconst sortReviewPages = (a: ReviewShellPage, b: ReviewShellPage) => {\n if (a.href === '/') return -1;\n if (b.href === '/') return 1;\n return a.href.localeCompare(b.href);\n};\n\nexport const createReviewPagesFromGlob = (\n entries: ReviewShellGlobEntries,\n options: CreateReviewPagesOptions = {}\n): ReviewShellPage[] => {\n const root = options.root ?? '/page';\n const rootPattern = root ? new RegExp(`^${escapeRegExp(root)}`) : null;\n\n return Object.keys(entries)\n .map((key) => {\n const withoutRoot = rootPattern ? key.replace(rootPattern, '') : key;\n const href = withoutRoot.replace(/index\\.(tsx|ts|jsx|js)$/, '');\n return normalizePageHref(href === '' ? '/' : href);\n })\n .filter((href) => !options.exclude?.(href))\n .sort((a, b) => sortReviewPages({ href: a }, { href: b }))\n .map((href) => ({ href }));\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from './types';\n\ntype SupabaseRealtimeStatus =\n | 'SUBSCRIBED'\n | 'CHANNEL_ERROR'\n | 'TIMED_OUT'\n | 'CLOSED'\n | string;\n\ntype SupabaseRealtimeChannel = {\n topic?: string;\n on: (\n type: 'presence',\n filter: { event: 'sync' | 'join' | 'leave' },\n callback: () => void\n ) => SupabaseRealtimeChannel;\n subscribe: (\n callback: (status: SupabaseRealtimeStatus, error?: Error) => void\n ) => SupabaseRealtimeChannel;\n track: (payload: ReviewPresenceUser) => Promise<unknown>;\n untrack: () => Promise<unknown>;\n presenceState: () => Record<string, unknown[]>;\n teardown?: () => void;\n};\n\nexport type SupabasePresenceClient = {\n channel: (\n topic: string,\n options?: {\n config?: {\n private?: boolean;\n presence?: {\n key?: string;\n };\n };\n }\n ) => SupabaseRealtimeChannel;\n getChannels?: () => SupabaseRealtimeChannel[];\n removeChannel: (channel: SupabaseRealtimeChannel) => Promise<unknown>;\n};\n\nexport type SupabasePresenceAdapterOptions = {\n client: SupabasePresenceClient;\n channelPrefix?: string;\n private?: boolean;\n};\n\nconst normalizeTopicPart = (value: string) =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'default';\n\nconst getPresenceTopic = (channelPrefix: string, projectId: string) =>\n `${normalizeTopicPart(channelPrefix)}-${normalizeTopicPart(projectId)}`;\n\nconst PRESENCE_BRIDGE_KEY = '__dfReviewPresenceBridge';\n\ntype SupabasePresenceBridge = {\n channel: SupabaseRealtimeChannel;\n emit: () => void;\n getUsers: () => ReviewPresenceUser[];\n listeners: Set<() => void>;\n ready: Promise<void>;\n refCount: number;\n};\n\ntype SupabasePresenceBridgeChannel = SupabaseRealtimeChannel & {\n [PRESENCE_BRIDGE_KEY]?: SupabasePresenceBridge;\n};\n\nconst isReviewPresenceUser = (value: unknown): value is ReviewPresenceUser => {\n if (!value || typeof value !== 'object') return false;\n\n const candidate = value as Partial<ReviewPresenceUser>;\n return (\n typeof candidate.projectId === 'string' &&\n typeof candidate.sessionId === 'string' &&\n typeof candidate.userId === 'string' &&\n typeof candidate.updatedAt === 'string'\n );\n};\n\nconst flattenPresenceState = (\n state: Record<string, unknown[]>\n): ReviewPresenceUser[] =>\n Object.values(state).flat().filter(isReviewPresenceUser);\n\nconst dedupePresenceUsers = (users: ReviewPresenceUser[]) => {\n const userBySessionId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const currentUser = userBySessionId.get(user.sessionId);\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userBySessionId.set(user.sessionId, user);\n }\n });\n\n return Array.from(userBySessionId.values());\n};\n\nconst sortPresenceUsers = (\n users: ReviewPresenceUser[],\n selfSessionId: string\n) =>\n users.sort((a, b) => {\n if (a.sessionId === selfSessionId) return -1;\n if (b.sessionId === selfSessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n\nconst subscribeChannel = (channel: SupabaseRealtimeChannel) =>\n new Promise<void>((resolve, reject) => {\n channel.subscribe((status, error) => {\n if (status === 'SUBSCRIBED') {\n resolve();\n return;\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {\n reject(error ?? new Error(`Supabase presence ${status}`));\n }\n });\n });\n\nconst removeTopicChannels = async (\n client: SupabasePresenceClient,\n topic: string\n) => {\n const existingChannels = client.getChannels?.() ?? [];\n const normalizedTopic = `realtime:${topic}`;\n const topicChannels = existingChannels.filter(\n (channel) => channel.topic === topic || channel.topic === normalizedTopic\n );\n\n await Promise.allSettled(\n topicChannels.map(async (channel) => {\n const result = await client.removeChannel(channel);\n if (result !== 'ok') {\n channel.teardown?.();\n }\n })\n );\n};\n\nconst getTopicChannel = (\n client: SupabasePresenceClient,\n topic: string\n): SupabasePresenceBridgeChannel | undefined => {\n const normalizedTopic = `realtime:${topic}`;\n\n return client\n .getChannels?.()\n .find(\n (channel) =>\n channel.topic === topic || channel.topic === normalizedTopic\n ) as SupabasePresenceBridgeChannel | undefined;\n};\n\nconst createPresenceBridge = (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const channel = client.channel(topic, {\n config: {\n private: isPrivate,\n presence: {\n key: context.sessionId,\n },\n },\n }) as SupabasePresenceBridgeChannel;\n\n const bridge: SupabasePresenceBridge = {\n channel,\n listeners: new Set(),\n refCount: 0,\n getUsers: () =>\n dedupePresenceUsers(flattenPresenceState(channel.presenceState())),\n emit: () => {\n bridge.listeners.forEach((listener) => listener());\n },\n ready: Promise.resolve(),\n };\n\n channel[PRESENCE_BRIDGE_KEY] = bridge;\n channel\n .on('presence', { event: 'sync' }, bridge.emit)\n .on('presence', { event: 'join' }, bridge.emit)\n .on('presence', { event: 'leave' }, bridge.emit);\n\n bridge.ready = subscribeChannel(channel).catch((error) => {\n delete channel[PRESENCE_BRIDGE_KEY];\n throw error;\n });\n\n return bridge;\n};\n\nconst getPresenceBridge = async (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const existingChannel = getTopicChannel(client, topic);\n const existingBridge = existingChannel?.[PRESENCE_BRIDGE_KEY];\n\n if (existingBridge) return existingBridge;\n\n if (existingChannel) {\n await removeTopicChannels(client, topic);\n }\n\n return createPresenceBridge(client, topic, context, isPrivate);\n};\n\nexport const createSupabasePresenceAdapter = ({\n client,\n channelPrefix = 'review-presence',\n private: isPrivate = false,\n}: SupabasePresenceAdapterOptions): ReviewPresenceAdapter => ({\n label: 'supabase-presence',\n connect: async (context: ReviewPresenceContext) => {\n const topic = getPresenceTopic(channelPrefix, context.projectId);\n const bridge = await getPresenceBridge(client, topic, context, isPrivate);\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentState = context.initialState;\n bridge.refCount += 1;\n\n const getUsers = () =>\n sortPresenceUsers(\n [...bridge.getUsers()],\n context.sessionId\n );\n\n const emit = () => {\n const users = getUsers();\n listeners.forEach((listener) => listener(users));\n };\n\n const bridgeListener = () => emit();\n bridge.listeners.add(bridgeListener);\n\n await bridge.ready;\n await bridge.channel.track(currentState);\n bridge.emit();\n emit();\n\n return {\n update: async (state: Partial<ReviewPresenceState>) => {\n currentState = {\n ...currentState,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: new Date().toISOString(),\n };\n await bridge.channel.track(currentState);\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: async () => {\n listeners.clear();\n bridge.listeners.delete(bridgeListener);\n bridge.refCount = Math.max(0, bridge.refCount - 1);\n if (bridge.refCount > 0) return;\n\n delete (bridge.channel as SupabasePresenceBridgeChannel)[\n PRESENCE_BRIDGE_KEY\n ];\n await bridge.channel.untrack();\n await client.removeChannel(bridge.channel);\n },\n };\n },\n});\n"],"mappings":"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CX,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["import_react","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","Map","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","statusOption","item","normalizeReviewNumber","createId","getViewportPresetDistance","setDocumentScrollInstantly","formatDate","import_jsx_runtime","Map","import_jsx_runtime","ReviewScopeIcon","isDomReviewItem","runWithAutoScrollBehavior","setDocumentScrollInstantly","frame","target","statusOption","formatDate","React"]}
1
+ {"version":3,"sources":["../src/react-shell.tsx","../src/react-shell/style.ts","../src/react-shell/review/shell.tsx","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/mergeClasses.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toKebabCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toCamelCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toPascalCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/defaultAttributes.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/hasA11yProp.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/context.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/Icon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/createLucideIcon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/circle-question-mark.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/copy.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/external-link.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/eye-off.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/eye.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/file-code-corner.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/grip-vertical.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/image.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/layout-grid.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/list-filter.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/map.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/maximize-2.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/monitor.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/pencil.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/rectangle-horizontal.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/refresh-cw.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/ruler.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/scan.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/settings.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/smartphone.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/square-mouse-pointer.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/sticky-note.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/upload.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/users.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/x.ts","../src/react-shell/constants.ts","../src/react-shell/route.ts","../src/react-shell/viewport.ts","../src/react-shell/prompt/prompt.ts","../src/react-shell/prompt/modal.tsx","../src/react-shell/settings.ts","../src/react-shell/review/settings.modal.tsx","../src/react-shell/sitemap/tree.ts","../src/react-shell/sitemap/modal.tsx","../src/react-shell/qa/item.edit.modal.tsx","../src/react-shell/qa/item.remote.actions.tsx","../src/status.ts","../src/react-shell/qa/item.status.actions.tsx","../src/react-shell/anchor.restore.ts","../src/react-shell/review/item.icons.tsx","../src/react-shell/source.open.ts","../src/react-shell/qa/item.card.tsx","../src/react-shell/presence/row.tsx","../src/react-shell/qa/panel.header.tsx","../src/react-shell/qa/panel.tsx","../src/react-shell/review/mode.toolbar.tsx","../src/react-shell/ruler/gutters.tsx","../src/react-shell/ruler/overlay.tsx","../src/react-shell/target/frame.tsx","../src/react-shell/topbar.tsx","../src/react-shell/hooks/use.review.controller.ts","../src/react-shell/hooks/use.review.item.restore.ts","../src/react-shell/hooks/use.review.kit.lifecycle.ts","../src/route.ts","../src/adapters/local.ts","../src/core/geometry.ts","../src/core/dom.anchor.ts","../src/core/id.ts","../src/core/hotkey.ts","../src/core/location.ts","../src/core/review/scope.ts","../src/core/review/item.ts","../src/core/scroll.ts","../src/core/overlay.style.ts","../src/core/review/format.ts","../src/core/web.review.kit.view.ts","../src/core/web.review.kit.app.ts","../src/react-shell/target/target.ts","../src/react-shell/hooks/review.frame.navigation.ts","../src/react-shell/hooks/review.kit.target.ts","../src/react-shell/hooks/use.review.target.overlay.ts","../src/react-shell/hooks/use.review.target.sync.ts","../src/react-shell/hooks/use.review.presence.ts","../src/react-shell/presence/presence.ts","../src/react-shell/hooks/use.review.ruler.ts","../src/react-shell/hooks/use.review.ruler.drag.ts","../src/react-shell/ruler/ruler.ts","../src/react-shell/hooks/use.review.settings.ts","../src/react-shell/hooks/use.review.shell.data.ts","../src/react-shell/hooks/use.review.shell.hotkeys.ts","../src/react-shell/hooks/use.review.shell.state.ts","../src/react-shell/adapters.ts","../src/react-shell/review/shell.actions.ts","../src/react-shell/pages.ts","../src/react-shell/presence/supabase.ts"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ensureReviewShellStyle } from './react-shell/style';\nimport type { ReviewShellMountOptions } from './react-shell/types';\nimport { ReviewShell } from './react-shell/review/shell';\n\nexport { ReviewShell } from './react-shell/review/shell';\nexport type {\n CreateReviewPagesOptions,\n ReviewShellAdapter,\n ReviewShellAdapters,\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewShellGlobEntries,\n ReviewShellMountOptions,\n ReviewShellPage,\n ReviewShellProps,\n ReviewShellStatusOption,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n} from './react-shell/types';\nexport { createReviewPagesFromGlob } from './react-shell/pages';\nexport { DEFAULT_REVIEW_VIEWPORT_PRESETS } from './react-shell/viewport';\nexport {\n createFallbackPresenceAdapter,\n createLocalPresenceAdapter,\n} from './react-shell/presence/presence';\nexport type { LocalPresenceAdapterOptions } from './react-shell/presence/presence';\nexport { createSupabasePresenceAdapter } from './react-shell/presence/supabase';\nexport type {\n SupabasePresenceAdapterOptions,\n SupabasePresenceClient,\n} from './react-shell/presence/supabase';\n\nexport const mountReviewShell = (options: ReviewShellMountOptions) => {\n if (typeof document === 'undefined' || !document.head) return;\n\n const { rootId = 'root', ...shellProps } = options;\n\n ensureReviewShellStyle();\n\n const root = document.getElementById(rootId);\n if (!root) return;\n\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.margin = '0';\n\n createRoot(root).render(\n <React.StrictMode>\n <ReviewShell {...shellProps} />\n </React.StrictMode>\n );\n};\n","const REVIEW_SHELL_STYLE_ID = 'df-review-shell-style';\n\nexport function ensureReviewShellStyle() {\n if (!document.getElementById(REVIEW_SHELL_STYLE_ID)) {\n const style = document.createElement('style');\n style.id = REVIEW_SHELL_STYLE_ID;\n style.textContent = `\n\t * {\n\t box-sizing: border-box;\n\t scrollbar-color: var(--df-review-scrollbar-thumb, rgba(237, 243, 251, 0.2)) var(--df-review-scrollbar-track, rgba(237, 243, 251, 0.04));\n\t scrollbar-width: thin;\n\t }\n\n\t *::-webkit-scrollbar {\n\t width: 10px;\n\t height: 10px;\n\t }\n\n\t *::-webkit-scrollbar-track {\n\t background: var(--df-review-scrollbar-track, rgba(237, 243, 251, 0.04));\n\t }\n\n\t *::-webkit-scrollbar-thumb {\n\t border: 2px solid var(--df-review-scrollbar-border, rgba(15, 18, 24, 0.92));\n\t border-radius: var(--df-review-radius-pill);\n\t background: var(--df-review-scrollbar-thumb, rgba(237, 243, 251, 0.18));\n\t }\n\n\t *::-webkit-scrollbar-thumb:hover {\n\t background: var(--df-review-scrollbar-thumb-hover, rgba(237, 243, 251, 0.28));\n\t }\n\n\t *::-webkit-scrollbar-corner {\n\t background: transparent;\n\t }\n\n html,\n body,\n #root {\n width: 100%;\n height: 100%;\n margin: 0;\n }\n\n\t body {\n\t overflow: hidden;\n\t color-scheme: dark;\n\n\t /* df-review-token layer. Keep these names internal to review-kit. */\n\t --df-review-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n\t --df-review-font-mono: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n\t --df-review-font-size-3xs: 9px;\n\t --df-review-font-size-2xs: 10px;\n\t --df-review-font-size-xs: 11px;\n\t --df-review-font-size-sm: 12px;\n\t --df-review-font-size-md: 13px;\n\t --df-review-font-size-lg: 14px;\n\t --df-review-font-size-xl: 15px;\n\t --df-review-font-size-2xl: 18px;\n\t --df-review-font-weight-medium: 650;\n\t --df-review-font-weight-bold: 700;\n\t --df-review-font-weight-strong: 800;\n\t --df-review-font-weight-heavy: 900;\n\t --df-review-line-height-tight: 1.25;\n\t --df-review-line-height-base: 1.42;\n\t --df-review-line-height-relaxed: 1.55;\n\t --df-review-space-0: 0;\n\t --df-review-space-1: 4px;\n\t --df-review-space-1-5: 6px;\n\t --df-review-space-2: 8px;\n\t --df-review-space-2-5: 10px;\n\t --df-review-space-3: 12px;\n\t --df-review-space-3-5: 14px;\n\t --df-review-space-4: 16px;\n\t --df-review-space-5: 20px;\n\t --df-review-space-6: 24px;\n\t --df-review-space-8: 32px;\n\t --df-review-control-height-sm: 32px;\n\t --df-review-control-height-md: 34px;\n\t --df-review-control-height-lg: 38px;\n\t --df-review-radius-xs: 3px;\n\t --df-review-radius-sm: 6px;\n\t --df-review-radius-md: 8px;\n\t --df-review-radius-lg: 12px;\n\t --df-review-radius-pill: 999px;\n\t --df-review-color-canvas: #0f1218;\n\t --df-review-color-surface: #171c24;\n\t --df-review-color-panel: #131821;\n\t --df-review-color-panel-strong: #1b2430;\n\t --df-review-color-card: rgba(237, 243, 251, 0.035);\n\t --df-review-color-card-hover: rgba(237, 243, 251, 0.065);\n\t --df-review-color-control: #202938;\n\t --df-review-color-control-hover: #273345;\n\t --df-review-color-border: rgba(226, 233, 245, 0.14);\n\t --df-review-color-border-soft: rgba(226, 233, 245, 0.08);\n\t --df-review-color-text: #edf3fb;\n\t --df-review-color-text-muted: rgba(237, 243, 251, 0.58);\n\t --df-review-color-text-subtle: rgba(237, 243, 251, 0.42);\n\t --df-review-color-accent: #7cc7ff;\n\t --df-review-color-accent-contrast: #0f1218;\n\t --df-review-color-accent-soft: rgba(124, 199, 255, 0.12);\n\t --df-review-color-accent-hover: rgba(124, 199, 255, 0.2);\n\t --df-review-color-danger: #ff8f61;\n\t --df-review-color-danger-soft: rgba(255, 143, 97, 0.12);\n\t --df-review-color-purple: #b395ff;\n\t --df-review-color-purple-soft: rgba(179, 149, 255, 0.16);\n\t --df-review-color-note: #f3b75f;\n\t --df-review-color-note-soft: rgba(243, 183, 95, 0.14);\n\t --df-review-color-area: #63d7c7;\n\t --df-review-color-area-soft: rgba(99, 215, 199, 0.14);\n\t --df-review-color-side-rail: #111722;\n\t --df-review-color-mode-bar: rgba(15, 18, 24, 0.86);\n\t --df-review-color-chip: rgba(237, 243, 251, 0.06);\n\t --df-review-color-scrollbar-track: rgba(237, 243, 251, 0.04);\n\t --df-review-color-scrollbar-thumb: rgba(237, 243, 251, 0.18);\n\t --df-review-color-scrollbar-thumb-hover: rgba(237, 243, 251, 0.28);\n\t --df-review-color-scrollbar-border: rgba(15, 18, 24, 0.92);\n\t --df-review-color-backdrop: rgba(2, 6, 12, 0.62);\n\t --df-review-color-ruler-surface: transparent;\n\t --df-review-color-ruler-label: rgba(15, 18, 24, 0.9);\n\t --df-review-color-ruler-label-text: #f4efff;\n\t --df-review-color-ruler-tick-major: rgba(201, 184, 255, 0.9);\n\t --df-review-color-ruler-tick-minor: rgba(237, 243, 251, 0.2);\n\t --df-review-color-ruler-guide: rgba(255, 255, 255, 0.86);\n\t --df-review-color-ruler-measure-border: #c9b8ff;\n\t --df-review-color-ruler-measure-bg: rgba(179, 149, 255, 0.18);\n\t --df-review-color-ruler-measure-shadow: rgba(20, 12, 40, 0.52);\n\t --df-review-color-ruler-popover-border: rgba(255, 255, 255, 0.34);\n\t --df-review-color-ruler-popover-bg: rgba(15, 18, 24, 0.94);\n\t --df-review-color-ruler-popover-text: #ffffff;\n\t --df-review-color-ruler-popover-shadow: rgba(0, 0, 0, 0.42);\n\t --df-review-color-ruler-coord-bg: #d7c9ff;\n\t --df-review-color-ruler-coord-text: #14111f;\n\t --df-review-focus-ring: rgba(124, 199, 255, 0.58);\n\t --df-review-shadow-card: 0 14px 36px rgba(0, 0, 0, 0.34);\n\t --df-review-shadow-control: inset 0 1px 0 rgba(255, 255, 255, 0.04);\n\t --df-review-shadow-device: 0 24px 60px rgba(0, 0, 0, 0.38);\n\t --df-review-shadow-panel: 0 18px 48px rgba(0, 0, 0, 0.38);\n\t --df-review-shadow-modal: 0 24px 70px rgba(0, 0, 0, 0.48);\n\n\t /* Semantic aliases consumed by the existing shell chrome. */\n\t --df-review-bg: var(--df-review-color-canvas);\n\t --df-review-topbar: var(--df-review-color-surface);\n\t --df-review-panel: var(--df-review-color-panel);\n\t --df-review-panel-strong: var(--df-review-color-panel-strong);\n\t --df-review-card: var(--df-review-color-card);\n\t --df-review-card-hover: var(--df-review-color-card-hover);\n\t --df-review-control: var(--df-review-color-control);\n\t --df-review-control-hover: var(--df-review-color-control-hover);\n\t --df-review-line: var(--df-review-color-border);\n\t --df-review-line-soft: var(--df-review-color-border-soft);\n\t --df-review-text: var(--df-review-color-text);\n\t --df-review-muted: var(--df-review-color-text-muted);\n\t --df-review-subtle: var(--df-review-color-text-subtle);\n\t --df-review-accent: var(--df-review-color-accent);\n\t --df-review-accent-contrast: var(--df-review-color-accent-contrast);\n\t --df-review-accent-soft: var(--df-review-color-accent-soft);\n\t --df-review-accent-hover: var(--df-review-color-accent-hover);\n\t --df-review-danger: var(--df-review-color-danger);\n\t --df-review-danger-soft: var(--df-review-color-danger-soft);\n\t --df-review-purple: var(--df-review-color-purple);\n\t --df-review-purple-soft: var(--df-review-color-purple-soft);\n\t --df-review-note: var(--df-review-color-note);\n\t --df-review-note-soft: var(--df-review-color-note-soft);\n\t --df-review-area: var(--df-review-color-area);\n\t --df-review-area-soft: var(--df-review-color-area-soft);\n\t --df-review-side-rail: var(--df-review-color-side-rail);\n\t --df-review-mode-bar: var(--df-review-color-mode-bar);\n\t --df-review-chip-bg: var(--df-review-color-chip);\n\t --df-review-scrollbar-track: var(--df-review-color-scrollbar-track);\n\t --df-review-scrollbar-thumb: var(--df-review-color-scrollbar-thumb);\n\t --df-review-scrollbar-thumb-hover: var(--df-review-color-scrollbar-thumb-hover);\n\t --df-review-scrollbar-border: var(--df-review-color-scrollbar-border);\n\t background: var(--df-review-bg);\n\t color: var(--df-review-text);\n\t font-family: var(--df-review-font-sans);\n\t }\n\n\t body.df-review-theme-light {\n\t color-scheme: light;\n\t --df-review-color-canvas: #f4f6f9;\n\t --df-review-color-surface: #ffffff;\n\t --df-review-color-panel: #ffffff;\n\t --df-review-color-panel-strong: #edf1f6;\n\t --df-review-color-card: rgba(23, 32, 44, 0.035);\n\t --df-review-color-card-hover: rgba(23, 32, 44, 0.065);\n\t --df-review-color-control: #eef2f7;\n\t --df-review-color-control-hover: #e3e9f1;\n\t --df-review-color-border: rgba(16, 24, 40, 0.14);\n\t --df-review-color-border-soft: rgba(16, 24, 40, 0.08);\n\t --df-review-color-text: #17202c;\n\t --df-review-color-text-muted: rgba(23, 32, 44, 0.62);\n\t --df-review-color-text-subtle: rgba(23, 32, 44, 0.44);\n\t --df-review-color-accent: #1769aa;\n\t --df-review-color-accent-contrast: #ffffff;\n\t --df-review-color-accent-soft: rgba(23, 105, 170, 0.1);\n\t --df-review-color-accent-hover: rgba(23, 105, 170, 0.16);\n\t --df-review-color-danger: #b94418;\n\t --df-review-color-danger-soft: rgba(185, 68, 24, 0.1);\n\t --df-review-color-purple: #6543b8;\n\t --df-review-color-purple-soft: rgba(101, 67, 184, 0.12);\n\t --df-review-color-note: #a76617;\n\t --df-review-color-note-soft: rgba(167, 102, 23, 0.12);\n\t --df-review-color-area: #087f73;\n\t --df-review-color-area-soft: rgba(8, 127, 115, 0.12);\n\t --df-review-color-side-rail: #edf1f6;\n\t --df-review-color-mode-bar: rgba(255, 255, 255, 0.9);\n\t --df-review-color-chip: rgba(23, 32, 44, 0.06);\n\t --df-review-color-scrollbar-track: rgba(23, 32, 44, 0.06);\n\t --df-review-color-scrollbar-thumb: rgba(23, 32, 44, 0.24);\n\t --df-review-color-scrollbar-thumb-hover: rgba(23, 32, 44, 0.34);\n\t --df-review-color-scrollbar-border: rgba(244, 246, 249, 0.92);\n\t --df-review-color-backdrop: rgba(15, 23, 42, 0.32);\n\t --df-review-color-ruler-surface: transparent;\n\t --df-review-color-ruler-label: rgba(255, 255, 255, 0.94);\n\t --df-review-color-ruler-label-text: #3b247e;\n\t --df-review-color-ruler-tick-major: rgba(0, 95, 204, 0.92);\n\t --df-review-color-ruler-tick-minor: rgba(23, 32, 44, 0.3);\n\t --df-review-color-ruler-guide: rgba(0, 102, 255, 0.96);\n\t --df-review-color-ruler-measure-border: #0066ff;\n\t --df-review-color-ruler-measure-bg: rgba(0, 102, 255, 0.16);\n\t --df-review-color-ruler-measure-shadow: rgba(0, 43, 120, 0.56);\n\t --df-review-color-ruler-popover-border: rgba(255, 255, 255, 0.34);\n\t --df-review-color-ruler-popover-bg: rgba(15, 18, 24, 0.94);\n\t --df-review-color-ruler-popover-text: #ffffff;\n\t --df-review-color-ruler-popover-shadow: rgba(0, 0, 0, 0.42);\n\t --df-review-color-ruler-coord-bg: #005be8;\n\t --df-review-color-ruler-coord-text: #ffffff;\n\t --df-review-focus-ring: rgba(23, 105, 170, 0.42);\n\t --df-review-shadow-card: 0 14px 36px rgba(15, 23, 42, 0.14);\n\t --df-review-shadow-control: inset 0 1px 0 rgba(255, 255, 255, 0.72);\n\t --df-review-shadow-device: 0 24px 60px rgba(15, 23, 42, 0.18);\n\t --df-review-shadow-panel: 0 18px 48px rgba(15, 23, 42, 0.18);\n\t --df-review-shadow-modal: 0 24px 70px rgba(15, 23, 42, 0.2);\n\t }\n\n\t button,\n\t input,\n\t select,\n\t textarea {\n\t font: inherit;\n\t }\n\n button {\n cursor: pointer;\n }\n\n .df-review-shell {\n --df-review-frame-gutter-x: var(--df-review-space-4);\n display: grid;\n grid-template-columns: minmax(0, 1fr) 0 32px;\n grid-template-rows: auto minmax(0, 1fr);\n width: 100%;\n height: 100%;\n overflow: hidden;\n transition: grid-template-columns 160ms ease;\n }\n\n .df-review-shell.is-list-visible {\n grid-template-columns: minmax(0, 1fr) clamp(320px, 28vw, 420px) 32px;\n }\n\n\t .df-review-topbar {\n\t grid-column: 1;\n\t grid-row: 1;\n\t position: relative;\n\t z-index: 600;\n\t display: grid;\n\t gap: var(--df-review-space-2);\n\t container-type: inline-size;\n\t min-width: 0;\n\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t border-bottom: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-topbar), var(--df-review-panel));\n\t box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.025);\n\t }\n\n\t\t .df-review-address {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(160px, 1fr) auto auto;\n\t\t align-items: stretch;\n\t\t gap: var(--df-review-space-2);\n\t\t width: 100%;\n\t\t max-width: 1440px;\n\t\t margin: 0 auto;\n\t\t }\n\n .df-review-address input {\n\t width: 100%;\n\t min-height: var(--df-review-control-height-md);\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t padding: 0 11px;\n\t color: var(--df-review-text);\n\t background: var(--df-review-bg);\n\t box-shadow: var(--df-review-shadow-control);\n\t font-size: var(--df-review-font-size-md);\n\t transition: border-color 140ms ease, box-shadow 140ms ease, background 140ms ease;\n\t }\n\n\t .df-review-address input:focus {\n\t outline: 2px solid var(--df-review-focus-ring);\n\t outline-offset: 1px;\n\t }\n\n\t\t .df-review-address button,\n\t\t .df-review-side-toggle,\n\t\t .df-review-presets button,\n\t\t .df-review-overlay-button,\n\t\t\t .df-review-mode-button,\n\t\t\t .df-review-settings-header button,\n\t\t\t .df-review-prompt-header button,\n\t\t\t .df-review-settings-actions button,\n\t\t\t .df-review-prompt-block-header button,\n\t\t\t .df-review-item-actions button {\n\t\t min-height: var(--df-review-control-height-md);\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t background: var(--df-review-control);\n\t box-shadow: var(--df-review-shadow-control);\n\t color: var(--df-review-text);\n\t font-size: var(--df-review-font-size-sm);\n\t font-weight: 700;\n\t transition: border-color 140ms ease, background 140ms ease, color 140ms ease, box-shadow 140ms ease, opacity 140ms ease;\n\t }\n\n\t\t .df-review-address button:hover,\n\t .df-review-side-toggle:hover,\n\t\t .df-review-presets button:hover,\n\t\t .df-review-overlay-button:hover,\n\t\t .df-review-mode-button:hover,\n\t\t .df-review-settings-header button:hover,\n\t\t .df-review-prompt-header button:hover,\n\t\t .df-review-settings-actions button:hover,\n\t\t .df-review-prompt-block-header button:hover,\n\t\t\t .df-review-item-actions button:hover,\n\t\t .df-review-item-visibility:hover,\n\t\t .df-review-item-source-open:hover,\n\t\t .df-review-item-prompt-copy:hover,\n\t\t .df-review-item-delete:hover,\n\t\t .df-review-presets button.is-active,\n\t\t\t .df-review-overlay-button.is-active,\n\t\t\t .df-review-mode-button.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-control-hover);\n\t\t }\n\n\t .df-review-overlay-button.is-active,\n .df-review-mode-button.is-active {\n border-color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-sitemap-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n\t width: 38px;\n\t min-width: 38px;\n\t padding: 0;\n\t color: var(--df-review-accent);\n\t }\n\n .df-review-sitemap-button svg,\n .df-review-sitemap-header button svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.8;\n }\n\n .df-review-sitemap-modal {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: grid;\n place-items: center;\n\t\t\t\t padding: 18px;\n }\n\n\t .df-review-sitemap-backdrop {\n\t position: absolute;\n\t inset: 0;\n\t min-height: 0;\n\t border: 0;\n\t border-radius: 0;\n\t padding: 0;\n\t background: var(--df-review-color-backdrop);\n\t }\n\n .df-review-sitemap-dialog {\n position: relative;\n z-index: 1;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n\t width: min(760px, calc(100vw - 48px));\n\t max-height: min(720px, calc(100vh - 48px));\n\t overflow: hidden;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: var(--df-review-panel);\n\t box-shadow: var(--df-review-shadow-modal);\n\t }\n\n .df-review-sitemap-header {\n display: flex;\n align-items: center;\n\t justify-content: space-between;\n\t gap: 12px;\n\t min-height: 54px;\n\t padding: 0 14px 0 16px;\n\t border-bottom: 1px solid var(--df-review-line);\n\t }\n\n .df-review-sitemap-header div {\n display: flex;\n align-items: baseline;\n gap: 10px;\n min-width: 0;\n }\n\n .df-review-sitemap-header strong {\n font-size: var(--df-review-font-size-lg);\n }\n\n\t .df-review-sitemap-header span {\n\t color: var(--df-review-muted);\n\t font-size: var(--df-review-font-size-sm);\n\t font-weight: 700;\n\t }\n\n .df-review-sitemap-header button {\n display: grid;\n place-items: center;\n\t width: 34px;\n\t min-width: 34px;\n\t min-height: var(--df-review-control-height-md);\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t background: var(--df-review-control);\n\t color: var(--df-review-text);\n\t font-size: var(--df-review-font-size-md);\n\t font-weight: 800;\n\t }\n\n\t .df-review-sitemap-header button:hover {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-control-hover);\n\t }\n\n .df-review-sitemap-list {\n display: grid;\n align-content: start;\n min-height: 0;\n overflow: auto;\n padding: 8px;\n }\n\n .df-review-sitemap-table-head,\n .df-review-sitemap-row {\n display: grid;\n grid-template-columns: minmax(160px, 1fr) 70px 78px minmax(96px, 140px);\n align-items: center;\n column-gap: 0;\n }\n\n .df-review-sitemap-table-head {\n position: sticky;\n top: 0;\n z-index: 1;\n min-height: 32px;\n border-bottom: 1px solid var(--df-review-line);\n padding: 0 10px;\n background: var(--df-review-surface);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n }\n\n .df-review-sitemap-table-head span:not(:first-child) {\n text-align: right;\n }\n\n .df-review-sitemap-row {\n min-height: 42px;\n border: 0;\n border-bottom: 1px solid var(--df-review-line-soft);\n border-radius: 0;\n padding: 0 10px;\n background: transparent;\n color: var(--df-review-text);\n text-align: left;\n }\n\n button.df-review-sitemap-row {\n cursor: pointer;\n }\n\n .df-review-sitemap-row.is-folder {\n cursor: default;\n }\n\n .df-review-sitemap-row:last-child {\n border-bottom: 0;\n }\n\n button.df-review-sitemap-row:hover,\n .df-review-sitemap-row.is-active {\n background: var(--df-review-accent-soft);\n }\n\n .df-review-sitemap-path {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-md);\n font-weight: 800;\n line-height: 1.35;\n }\n\n .df-review-sitemap-row.is-folder .df-review-sitemap-path {\n color: var(--df-review-muted);\n }\n\n .df-review-sitemap-tree-prefix {\n flex: 0 0 auto;\n color: var(--df-review-muted);\n font-family: var(--df-review-font-mono);\n font-weight: 700;\n white-space: pre;\n }\n\n .df-review-sitemap-cell {\n min-width: 0;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-sm);\n font-variant-numeric: tabular-nums;\n font-weight: 900;\n line-height: 1;\n text-align: right;\n }\n\n .df-review-sitemap-cell.is-local {\n color: var(--df-review-accent);\n }\n\n .df-review-sitemap-cell.is-remote {\n color: var(--df-review-area);\n }\n\n .df-review-sitemap-cell.is-online {\n display: flex;\n justify-content: flex-end;\n color: var(--df-review-text);\n }\n\n .df-review-sitemap-users {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-sitemap-user {\n --df-review-presence-color: var(--df-review-accent);\n display: inline-flex;\n align-items: center;\n min-height: 22px;\n border: 1px solid var(--df-review-presence-color);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n background: var(--df-review-chip-bg);\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .df-review-sitemap-online-empty {\n color: var(--df-review-muted);\n }\n\n button.df-review-sitemap-row:hover .df-review-sitemap-path,\n .df-review-sitemap-row.is-active .df-review-sitemap-path {\n color: var(--df-review-text);\n }\n\n\t\t .df-review-settings-modal {\n\t\t position: fixed;\n\t\t inset: 0;\n\t\t z-index: 1001;\n\t\t display: grid;\n\t\t place-items: center;\n\t\t padding: 24px;\n\t\t }\n\n\t\t .df-review-settings-backdrop {\n\t\t position: absolute;\n\t\t inset: 0;\n\t\t min-height: 0;\n\t\t border: 0;\n\t\t border-radius: 0;\n\t\t padding: 0;\n\t\t background: var(--df-review-color-backdrop);\n\t\t }\n\n\t\t .df-review-settings-dialog {\n\t\t position: relative;\n\t\t z-index: 1;\n\t\t display: grid;\n\t\t width: min(460px, calc(100vw - 48px));\n\t\t overflow: hidden;\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-lg);\n\t\t background: var(--df-review-panel);\n\t\t box-shadow: var(--df-review-shadow-modal);\n\t\t }\n\n\t\t .df-review-settings-header {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t justify-content: space-between;\n\t\t gap: 12px;\n\t\t min-height: 54px;\n\t\t padding: 0 14px 0 16px;\n\t\t border-bottom: 1px solid var(--df-review-line);\n\t\t }\n\n\t\t .df-review-settings-title {\n\t\t display: grid;\n\t\t gap: 2px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-settings-header-actions {\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t justify-content: flex-end;\n\t\t gap: 8px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-settings-header strong {\n\t\t color: var(--df-review-text);\n\t\t font-size: var(--df-review-font-size-lg);\n\t\t }\n\n\t\t .df-review-settings-header span {\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-header button {\n\t\t display: grid;\n\t\t place-items: center;\n\t\t width: 34px;\n\t\t min-width: 34px;\n\t\t padding: 0;\n\t\t font-size: var(--df-review-font-size-md);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-body {\n\t\t display: grid;\n\t\t gap: 12px;\n\t\t padding: 16px;\n\t\t }\n\n\t\t .df-review-settings-field {\n\t\t display: grid;\n\t\t gap: 7px;\n\t\t }\n\n\t\t .df-review-settings-row {\n\t\t display: grid;\n\t\t grid-template-columns: minmax(0, 1fr) auto;\n\t\t align-items: center;\n\t\t gap: 12px;\n\t\t }\n\n\t\t .df-review-settings-field span,\n\t\t .df-review-settings-row > span,\n\t\t .df-review-settings-label-row label {\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-theme-options {\n\t\t display: inline-flex;\n\t\t justify-content: flex-end;\n\t\t gap: 6px;\n\t\t min-width: 0;\n\t\t flex-wrap: wrap;\n\t\t }\n\n\t\t .df-review-settings-theme-option {\n\t\t min-height: 30px;\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0 10px;\n\t\t color: var(--df-review-muted);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-theme-option:hover {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-control-hover);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-settings-theme-option.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t .df-review-settings-theme-option:focus-visible {\n\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t outline-offset: 1px;\n\t\t }\n\n\t\t .df-review-settings-label-row {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t gap: 6px;\n\t\t }\n\n\t\t .df-review-settings-help-button {\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: 20px;\n\t\t min-width: 20px;\n\t\t min-height: 20px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: 50%;\n\t\t padding: 0;\n\t\t background: transparent;\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-settings-help-button:hover,\n\t\t .df-review-settings-help-button.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t .df-review-settings-help-button svg {\n\t\t width: 13px;\n\t\t height: 13px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t stroke-width: 2.1;\n\t\t }\n\n\t\t\t .df-review-settings-token-input,\n\t\t\t .df-review-settings-text-input,\n\t\t\t .df-review-settings-select-input {\n\t\t\t display: grid;\n\t\t\t align-items: stretch;\n\t\t\t overflow: hidden;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t background: var(--df-review-bg);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input {\n\t\t\t grid-template-columns: minmax(0, 1fr) 38px;\n\t\t\t }\n\n\t\t\t .df-review-settings-text-input,\n\t\t\t .df-review-settings-select-input {\n\t\t\t grid-template-columns: minmax(0, 1fr);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input:focus-within,\n\t\t\t .df-review-settings-text-input:focus-within,\n\t\t\t .df-review-settings-select-input:focus-within {\n\t\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t\t outline-offset: 1px;\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input,\n\t\t\t .df-review-settings-text-input input,\n\t\t\t .df-review-settings-select-input select {\n\t\t\t min-width: 0;\n\t\t\t min-height: var(--df-review-control-height-lg);\n\t\t\t border: 0;\n\t\t padding: 0 10px;\n\t\t background: transparent;\n\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input:focus,\n\t\t\t .df-review-settings-text-input input:focus,\n\t\t\t .df-review-settings-select-input select:focus {\n\t\t\t outline: 0;\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input.is-token-masked {\n\t\t\t -webkit-text-security: disc;\n\t\t\t }\n\n\t\t\t .df-review-settings-select-input select {\n\t\t\t appearance: none;\n\t\t\t cursor: pointer;\n\t\t\t }\n\n\t\t .df-review-settings-token-toggle {\n\t\t display: grid;\n\t\t place-items: center;\n\t\t width: 38px;\n\t\t min-width: 38px;\n\t\t min-height: var(--df-review-control-height-lg);\n\t\t border: 0;\n\t\t border-left: 1px solid var(--df-review-line-soft);\n\t\t border-radius: 0;\n\t\t padding: 0;\n\t\t background: transparent;\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-settings-token-toggle:hover {\n\t\t background: var(--df-review-chip-bg);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-settings-token-toggle svg {\n\t\t width: 16px;\n\t\t height: 16px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t stroke-width: 2;\n\t\t }\n\n\t\t .df-review-settings-guide {\n\t\t margin-top: -2px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 9px 11px;\n\t\t background: var(--df-review-chip-bg);\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 700;\n\t\t line-height: 1.55;\n\t\t }\n\n\t\t .df-review-settings-guide ol {\n\t\t display: grid;\n\t\t gap: 3px;\n\t\t margin: 0;\n\t\t padding-left: 17px;\n\t\t }\n\n\t\t .df-review-settings-status {\n\t\t min-height: 20px;\n\t\t margin: 0;\n\t\t color: var(--df-review-accent);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-actions {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(0, 1fr) auto auto;\n\t\t gap: 8px;\n\t\t align-items: center;\n\t\t }\n\n\t\t .df-review-settings-actions button {\n\t\t padding: 0 12px;\n\t\t }\n\n\t\t\t .df-review-settings-actions button[type='submit'] {\n\t\t\t border-color: var(--df-review-accent);\n\t\t\t background: var(--df-review-accent-soft);\n\t\t\t color: var(--df-review-accent);\n\t\t\t }\n\n .df-review-edit-modal {\n position: fixed;\n inset: 0;\n z-index: 1003;\n display: grid;\n place-items: center;\n padding: 24px;\n }\n\n .df-review-edit-dialog {\n position: relative;\n z-index: 1;\n display: grid;\n width: min(460px, calc(100vw - 48px));\n overflow: hidden;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-lg);\n background: var(--df-review-panel);\n box-shadow: var(--df-review-shadow-modal);\n }\n\n .df-review-edit-textarea {\n min-height: 160px;\n }\n\n .df-review-edit-textarea textarea {\n width: 100%;\n min-height: 160px;\n border: 0;\n padding: 10px;\n outline: 0;\n background: transparent;\n color: var(--df-review-text);\n resize: vertical;\n font-size: var(--df-review-font-size-md);\n line-height: 1.5;\n }\n\n .df-review-edit-textarea textarea:focus {\n outline: 0;\n }\n\n .df-review-edit-error {\n margin: 0;\n color: var(--df-review-danger);\n font-size: var(--df-review-font-size-sm);\n font-weight: 800;\n }\n\n .df-review-edit-actions {\n grid-template-columns: minmax(0, 1fr) auto auto;\n }\n\n\t\t\t .df-review-prompt-modal {\n\t\t\t position: fixed;\n\t\t\t inset: 0;\n\t\t\t z-index: 1002;\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t padding: 24px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-backdrop {\n\t\t\t position: absolute;\n\t\t\t inset: 0;\n\t\t\t min-height: 0;\n\t\t\t border: 0;\n\t\t\t border-radius: 0;\n\t\t\t padding: 0;\n\t\t\t background: var(--df-review-color-backdrop);\n\t\t\t }\n\n\t\t\t .df-review-prompt-dialog {\n\t\t\t position: relative;\n\t\t\t z-index: 1;\n\t\t\t display: grid;\n\t\t\t grid-template-rows: auto minmax(0, 1fr);\n\t\t\t\t width: min(1040px, calc(100vw - 36px));\n\t\t\t\t max-height: min(900px, calc(100vh - 36px));\n\t\t\t overflow: hidden;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-lg);\n\t\t\t background: var(--df-review-panel);\n\t\t\t box-shadow: var(--df-review-shadow-modal);\n\t\t\t }\n\n .df-review-copy-toast {\n position: fixed;\n right: 52px;\n bottom: 24px;\n z-index: 1003;\n max-width: min(320px, calc(100vw - 32px));\n padding: 10px 13px;\n border: 1px solid var(--df-review-accent-hover);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-panel);\n box-shadow: var(--df-review-shadow-modal);\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-sm);\n font-weight: 800;\n line-height: 1.25;\n pointer-events: none;\n }\n\n\t\t\t .df-review-prompt-header {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t justify-content: space-between;\n\t\t\t gap: 12px;\n\t\t\t min-height: 54px;\n\t\t\t padding: 0 14px 0 16px;\n\t\t\t border-bottom: 1px solid var(--df-review-line);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header div {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-lg);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header span {\n\t\t\t overflow: hidden;\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t text-overflow: ellipsis;\n\t\t\t white-space: nowrap;\n\t\t\t }\n\n\t\t\t .df-review-prompt-header button {\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t width: 34px;\n\t\t\t min-width: 34px;\n\t\t\t padding: 0;\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-body {\n\t\t\t display: grid;\n\t\t\t gap: 14px;\n\t\t\t min-height: 0;\n\t\t\t overflow: auto;\n\t\t\t padding: 16px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block {\n\t\t\t display: grid;\n\t\t\t gap: 8px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t justify-content: space-between;\n\t\t\t gap: 12px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header div {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header span {\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header button {\n\t\t\t display: inline-flex;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-height: 30px;\n\t\t\t padding: 0 10px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header button:disabled {\n\t\t\t cursor: not-allowed;\n\t\t\t opacity: 0.5;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header svg {\n\t\t\t width: 13px;\n\t\t\t height: 13px;\n\t\t\t fill: none;\n\t\t\t stroke: currentColor;\n\t\t\t stroke-linecap: round;\n\t\t\t stroke-linejoin: round;\n\t\t\t stroke-width: 2;\n\t\t\t }\n\n\t\t\t\t .df-review-prompt-block textarea {\n\t\t\t\t width: 100%;\n\t\t\t\t height: clamp(170px, calc(100vh - 520px), 260px);\n\t\t\t\t min-height: 170px;\n\t\t\t\t max-height: 320px;\n\t\t\t resize: vertical;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t padding: 10px;\n\t\t\t background: var(--df-review-bg);\n\t\t\t color: var(--df-review-text);\n\t\t\t font-family: var(--df-review-font-mono);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 600;\n\t\t\t line-height: 1.5;\n\t\t\t white-space: pre;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block textarea:focus {\n\t\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t\t outline-offset: 1px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-section-header {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-section-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-section-header span {\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about {\n\t\t\t display: grid;\n\t\t\t gap: 10px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid {\n\t\t\t display: grid;\n\t\t\t grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n\t\t\t gap: 10px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid article {\n\t\t\t display: grid;\n\t\t\t align-content: start;\n\t\t\t gap: 6px;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-md);\n\t\t\t padding: 12px;\n\t\t\t background: var(--df-review-surface);\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid p {\n\t\t\t margin: 0;\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 700;\n\t\t\t line-height: 1.55;\n\t\t\t }\n\n\t\t\t\t .df-review-tools {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t justify-content: space-between;\n\t\t gap: 12px;\n\t\t width: 100%;\n\t\t max-width: 1440px;\n\t\t min-width: 0;\n\t\t margin: 0 auto;\n\t\t }\n\n\t\t .df-review-tool-controls {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t justify-content: flex-start;\n\t\t gap: 12px;\n\t\t min-width: 0;\n\t\t flex-wrap: wrap;\n\t }\n\n\t\t .df-review-presets,\n\t\t .df-review-mode,\n\t .df-review-overlays {\n\t display: flex;\n\t align-items: center;\n\t gap: var(--df-review-space-1-5);\n\t min-height: calc(var(--df-review-control-height-lg) + 6px);\n\t padding: 3px;\n\t border: 1px solid var(--df-review-line-soft);\n\t border-radius: var(--df-review-radius-md);\n\t background: var(--df-review-card);\n\t }\n\n\t\t .df-review-tool-divider,\n\t\t .df-review-mode-divider {\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t color: var(--df-review-line);\n\t\t font-size: var(--df-review-font-size-2xl);\n\t\t font-weight: 700;\n\t line-height: 1;\n\t\t user-select: none;\n\t }\n\n\t\t .df-review-active-size {\n\t\t flex: 0 0 auto;\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t min-height: var(--df-review-control-height-lg);\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-variant-numeric: tabular-nums;\n\t font-weight: 800;\n\t line-height: 1;\n\t }\n\n\t .df-review-presets button {\n\t display: inline-flex;\n\t align-items: center;\n gap: 7px;\n min-height: var(--df-review-control-height-lg);\n padding: 0 11px 0 9px;\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-presets button svg {\n width: 16px;\n height: 16px;\n flex: 0 0 auto;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n }\n\n .df-review-preset-count {\n min-width: 16px;\n padding: 0 5px;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-line-soft);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 16px;\n text-align: center;\n }\n\n .df-review-presets button.is-active .df-review-preset-count {\n background: var(--df-review-accent-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-presets button.is-active {\n color: var(--df-review-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n }\n\n .df-review-preset-copy {\n display: grid;\n gap: 1px;\n min-width: 0;\n text-align: left;\n line-height: 1.05;\n }\n\n .df-review-preset-copy strong {\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-sm);\n }\n\n\t .df-review-overlay-button,\n\t .df-review-mode-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n\t width: 38px;\n\t min-width: 38px;\n\t padding: 0;\n\t border-color: transparent;\n\t background: transparent;\n\t box-shadow: none;\n\t color: var(--df-review-muted);\n\t }\n\n .df-review-overlay-button svg,\n .df-review-mode-button svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n\t }\n\n\n\n\n\n\n\n\t\t .df-review-overlay-button.is-settings {\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-overlay-button.is-settings:hover {\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t .df-review-overlay-button.is-disabled,\n\t .df-review-overlay-button.is-disabled:hover {\n\t cursor: not-allowed;\n\t border-color: var(--df-review-line);\n\t background: var(--df-review-line-soft);\n\t color: var(--df-review-subtle);\n\t }\n\n\t @container (max-width: 1040px) {\n\t .df-review-tools {\n\t flex-direction: column;\n\t align-items: stretch;\n\t justify-content: flex-start;\n\t }\n\n\t .df-review-tool-controls {\n\t width: 100%;\n\t }\n\n\t .df-review-presets {\n\t flex-wrap: wrap;\n\t }\n\n\t .df-review-overlays {\n\t width: 100%;\n\t justify-content: flex-start;\n\t }\n\t }\n\n\t .df-review-side-rail {\n\t grid-column: 3;\n\t grid-row: 1 / span 2;\n\t position: relative;\n\t z-index: 600;\n\t display: flex;\n\t align-items: stretch;\n\t justify-content: center;\n\t min-width: 0;\n\t min-height: 0;\n\t border-left: 1px solid var(--df-review-line);\n\t background: var(--df-review-side-rail);\n\t }\n\n .df-review-side-toggle {\n display: grid;\n grid-template-rows: 28px auto;\n align-items: start;\n justify-items: center;\n gap: 8px;\n width: 100%;\n min-height: 100%;\n border: 0;\n\t border-radius: 0;\n\t padding: 10px 0;\n\t background: transparent;\n\t color: var(--df-review-muted);\n\t }\n\n\t .df-review-side-toggle:hover {\n\t background: var(--df-review-accent-soft);\n\t color: var(--df-review-text);\n\t }\n\n .df-review-side-toggle span {\n display: grid;\n place-items: center;\n\t width: 20px;\n\t height: 24px;\n\t line-height: 1;\n\t }\n\n\t .df-review-side-toggle svg {\n\t width: 18px;\n\t height: 18px;\n\t fill: none;\n\t stroke: currentColor;\n\t stroke-linecap: round;\n\t stroke-width: 2;\n\t }\n\n .df-review-side-toggle strong {\n writing-mode: vertical-rl;\n text-orientation: mixed;\n color: inherit;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n letter-spacing: 0.08em;\n }\n\n\t .df-review-qa-panel {\n\t grid-column: 2;\n\t grid-row: 1 / span 2;\n\t position: relative;\n\t z-index: 600;\n\t display: grid;\n\t grid-template-rows: minmax(0, 1fr);\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t border-left: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-panel), var(--df-review-bg));\n\t }\n\n\t .df-review-shell:not(.is-list-visible) .df-review-qa-panel {\n\t visibility: hidden;\n\t border-left: 0;\n\t }\n\n\t .df-review-panel-body {\n\t display: grid;\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t }\n\n .df-review-item-list {\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n min-width: 0;\n min-height: 0;\n }\n\n\t\t\t .df-review-list-header {\n\t\t\t display: grid;\n\t\t\t grid-template-rows: auto auto;\n\t\t\t gap: var(--df-review-space-2);\n\t\t\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t\t\t border-bottom: 1px solid var(--df-review-line-soft);\n\t\t\t background: var(--df-review-card);\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-list-toolbar {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n\t\t\t .df-review-list-title {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t gap: 8px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-list-title span {\n\t\t min-width: 0;\n\t\t overflow: hidden;\n\t\t text-overflow: ellipsis;\n\t\t white-space: nowrap;\n\t\t }\n\n\t\t .df-review-list-title strong {\n\t\t flex: 0 0 auto;\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-variant-numeric: tabular-nums;\n\t\t }\n\n .df-review-presence-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n gap: 5px;\n min-width: 0;\n }\n\n .df-review-presence-label {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n }\n\n .df-review-presence-label svg {\n width: 12px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n .df-review-presence-list {\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-presence-chip {\n --df-review-presence-color: var(--df-review-accent);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n flex: 0 1 auto;\n min-height: 22px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n color: var(--df-review-text);\n background: var(--df-review-chip-bg);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .df-review-presence-chip.is-self {\n border-color: var(--df-review-presence-color);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-presence-dot {\n width: 7px;\n min-width: 7px;\n height: 7px;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-presence-color);\n }\n\n .df-review-presence-name {\n min-width: 0;\n }\n\n\t\t .df-review-list-controls {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t gap: 4px;\n\t\t }\n\n\t\t .df-review-source-select {\n\t\t width: 104px;\n\t\t min-height: 30px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0 24px 0 8px;\n\t\t color: var(--df-review-text);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-source-refresh {\n\t\t position: relative;\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: 30px;\n\t\t min-width: 30px;\n\t\t height: 30px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0;\n\t\t color: var(--df-review-muted);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t }\n\n\t\t .df-review-source-refresh svg {\n\t\t width: 14px;\n\t\t height: 14px;\n\t\t }\n\n\t\t\t .df-review-filter-tabs {\n display: flex;\n align-items: center;\n gap: 2px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-card);\n box-shadow: var(--df-review-shadow-control);\n }\n\n\t\t\t\t .df-review-filter-tab {\n position: relative;\n display: grid;\n place-items: center;\n width: 26px;\n min-width: 26px;\n height: 26px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--df-review-subtle);\n }\n\n\t\t\t\t .df-review-filter-icon {\n display: grid;\n place-items: center;\n width: 100%;\n height: 100%;\n }\n\n\t\t\t\t .df-review-filter-separator {\n\t\t\t\t display: block;\n\t\t\t\t width: 18px;\n\t\t\t\t height: 1px;\n\t\t\t\t border-radius: var(--df-review-radius-pill);\n\t\t\t\t background: currentColor;\n\t\t\t\t opacity: 0.42;\n\t\t\t\t }\n\n\t\t .df-review-filter-tab:hover,\n\t\t .df-review-filter-tab.is-active {\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-filter-tab.is-active {\n\t\t box-shadow: inset 0 0 0 1px rgba(124, 199, 255, 0.42);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t\t\t .df-review-filter-icon svg {\n\t\t\t\t width: 15px;\n\t\t\t\t height: 15px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t\t stroke-width: 2;\n\t\t\t }\n\n\t\t\t .df-review-filter-count {\n\t\t\t color: currentColor;\n\t\t\t font-size: var(--df-review-font-size-3xs);\n\t\t\t font-weight: 900;\n\t\t\t font-variant-numeric: tabular-nums;\n\t\t\t line-height: 1;\n\t\t\t }\n\n .df-review-list-scroll {\n display: grid;\n align-content: start;\n gap: var(--df-review-space-2);\n min-height: 0;\n overflow: auto;\n padding: var(--df-review-space-2);\n }\n\n\t .df-review-empty {\n\t margin: 0;\n\t padding: var(--df-review-space-5) var(--df-review-space-4);\n\t border: 1px dashed var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: var(--df-review-card);\n\t color: var(--df-review-subtle);\n\t font-size: var(--df-review-font-size-sm);\n\t line-height: 1.45;\n\t }\n\n .df-review-item-card.is-dim {\n opacity: 0.4;\n }\n\n .df-review-item-card.is-dim:hover {\n opacity: 0.72;\n }\n\n\t .df-review-item-card {\n\t\t position: relative;\n\t\t display: grid;\n\t\t gap: var(--df-review-space-2-5);\n\t\t padding: var(--df-review-space-3-5);\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-lg);\n\t\t background: var(--df-review-card);\n\t\t cursor: pointer;\n\t\t transition: border-color 140ms ease, background 140ms ease, box-shadow 140ms ease, opacity 140ms ease;\n\t\t }\n\n .df-review-item-card:not(.is-dim):hover {\n border-color: var(--df-review-line);\n }\n\n .df-review-item-card.is-active {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-card);\n\t box-shadow: inset 0 0 0 1px var(--df-review-accent-hover), 0 0 0 3px rgba(124, 199, 255, 0.12);\n\t }\n\n .df-review-item-card.is-overlay-hidden .df-review-item-main {\n opacity: 0.68;\n }\n\n .df-review-item-header {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n gap: 8px;\n min-width: 0;\n }\n\n .df-review-item-main {\n display: grid;\n gap: 4px;\n min-width: 0;\n\t border: 0;\n\t padding: 0;\n\t text-align: left;\n\t background: transparent;\n\t color: var(--df-review-text);\n\t }\n\n .df-review-item-main strong {\n overflow-wrap: anywhere;\n font-size: var(--df-review-font-size-md);\n line-height: 1.35;\n }\n\n .df-review-item-comment {\n padding: 5px 0;\n white-space: pre-wrap;\n }\n\n\t .df-review-item-main small {\n\t color: var(--df-review-subtle);\n\t font-size: var(--df-review-font-size-xs);\n\t }\n\n .df-review-item-meta {\n display: block;\n overflow-wrap: anywhere;\n line-height: 1.35;\n }\n\n .df-review-item-error {\n color: var(--df-review-danger) !important;\n overflow-wrap: anywhere;\n }\n\n .df-review-item-badges {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-item-id,\n .df-review-item-scope,\n .df-review-item-mode,\n .df-review-item-status-badge,\n .df-review-item-status-select {\n --df-review-scope: var(--df-review-accent);\n --df-review-scope-rgb: 124, 199, 255;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-height: 20px;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n text-transform: uppercase;\n }\n\n .df-review-item-id {\n border-color: var(--df-review-line);\n background: rgba(255, 255, 255, 0.03);\n color: var(--df-review-text);\n }\n\n .df-review-item-scope {\n border-color: rgba(var(--df-review-scope-rgb), 0.36);\n background: rgba(var(--df-review-scope-rgb), 0.12);\n color: var(--df-review-scope);\n }\n\n .df-review-item-scope.is-scope-tablet {\n --df-review-scope: var(--df-review-area);\n --df-review-scope-rgb: 99, 215, 199;\n }\n\n .df-review-item-scope.is-scope-desktop {\n --df-review-scope: var(--df-review-note);\n --df-review-scope-rgb: 243, 183, 95;\n }\n\n .df-review-item-scope.is-scope-wide {\n --df-review-scope: var(--df-review-purple);\n --df-review-scope-rgb: 201, 156, 255;\n }\n\n .df-review-item-scope.is-scope-dom {\n --df-review-scope: var(--df-review-danger);\n --df-review-scope-rgb: 255, 143, 97;\n }\n\n .df-review-item-scope svg,\n .df-review-item-mode svg {\n width: 12px;\n height: 12px;\n flex: 0 0 auto;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n\t .df-review-item-mode {\n\t color: var(--df-review-muted);\n background: var(--df-review-line-soft);\n }\n\n .df-review-item-mode.is-mode-area {\n color: var(--df-review-area);\n }\n\n .df-review-item-mode.is-mode-dom {\n color: var(--df-review-danger);\n }\n\n .df-review-item-status-badge {\n min-height: 30px;\n border-radius: var(--df-review-radius-sm);\n padding: 0 11px;\n font-size: var(--df-review-font-size-xs);\n font-weight: 750;\n text-transform: none;\n }\n\n .df-review-item-status-select {\n min-height: 30px;\n min-width: 92px;\n max-width: 118px;\n border-radius: var(--df-review-radius-sm);\n padding: 0 10px;\n cursor: pointer;\n outline: 0;\n font-size: var(--df-review-font-size-xs);\n font-weight: 750;\n text-transform: none;\n }\n\n .df-review-item-status-select:focus-visible {\n border-color: var(--df-review-accent);\n box-shadow: 0 0 0 2px var(--df-review-accent-soft);\n }\n\n .df-review-item-status-badge.is-status-todo,\n .df-review-item-status-select.is-status-todo {\n border-color: var(--df-review-line);\n color: var(--df-review-muted);\n background: var(--df-review-line-soft);\n }\n\n .df-review-item-status-badge.is-status-doing,\n .df-review-item-status-select.is-status-doing {\n border-color: rgba(124, 199, 255, 0.34);\n color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-item-status-badge.is-status-review,\n .df-review-item-status-select.is-status-review {\n border-color: rgba(243, 183, 95, 0.34);\n color: var(--df-review-note);\n background: var(--df-review-note-soft);\n }\n\n .df-review-item-status-badge.is-status-hold,\n .df-review-item-status-select.is-status-hold {\n border-color: rgba(179, 149, 255, 0.32);\n color: var(--df-review-purple);\n background: var(--df-review-purple-soft);\n }\n\n .df-review-item-status-badge.is-status-done,\n .df-review-item-status-select.is-status-done {\n border-color: rgba(99, 215, 199, 0.34);\n color: var(--df-review-area);\n background: var(--df-review-area-soft);\n }\n\n .df-review-item-status-badge.is-error {\n border-color: rgba(255, 143, 97, 0.36);\n color: var(--df-review-danger);\n background: var(--df-review-danger-soft);\n }\n\n\t .df-review-item-main img {\n\t width: 100%;\n\t max-height: 110px;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t object-fit: cover;\n\t background: var(--df-review-control);\n }\n\n\t .df-review-item-header-actions {\n\t display: inline-flex;\n\t align-items: center;\n\t justify-content: flex-end;\n\t gap: 2px;\n\t cursor: auto;\n\t }\n\n .df-review-item-delete,\n .df-review-item-edit,\n .df-review-item-prompt-copy,\n .df-review-item-source-open,\n .df-review-item-visibility {\n display: inline-grid;\n place-items: center;\n width: 26px;\n height: 26px;\n border: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n text-decoration: none;\n transition: border-color 140ms ease, background 140ms ease, color 140ms ease;\n }\n\n .df-review-item-visibility:hover,\n .df-review-item-edit:hover,\n .df-review-item-source-open:hover,\n .df-review-item-prompt-copy:hover {\n border-color: rgba(124, 199, 255, 0.34);\n color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-item-delete:hover {\n border-color: rgba(255, 143, 97, 0.34);\n color: var(--df-review-danger);\n background: var(--df-review-danger-soft);\n }\n\n .df-review-item-visibility.is-visible {\n color: var(--df-review-accent);\n }\n\n .df-review-item-visibility.is-hidden {\n opacity: 0.7;\n color: var(--df-review-subtle);\n }\n\n .df-review-item-prompt-copy.is-copied {\n color: var(--df-review-accent);\n }\n\n .df-review-item-delete svg,\n .df-review-item-edit svg,\n .df-review-item-prompt-copy svg,\n .df-review-item-source-open svg,\n .df-review-item-visibility svg {\n width: 14px;\n height: 14px;\n }\n\n\t\t\t\t .df-review-item-actions {\n\t\t\t\t display: grid;\n\t\t\t\t grid-template-columns: auto minmax(0, 1fr) auto;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-width: 0;\n\t\t\t margin-top: 2px;\n\t\t\t }\n\n\t\t\t .df-review-item-status-actions {\n\t\t\t display: inline-flex;\n\t\t\t grid-column: 1;\n\t\t\t align-items: center;\n\t\t\t min-width: 0;\n\t\t cursor: auto;\n\t\t\t }\n\n\t\t\t .df-review-item-remote-actions {\n\t\t\t display: inline-flex;\n\t\t\t grid-column: 3;\n\t\t\t align-items: center;\n\t\t\t justify-content: flex-end;\n\t\t\t justify-self: end;\n\t\t\t gap: 6px;\n\t\t\t min-width: 0;\n\t\t cursor: auto;\n\t\t\t }\n\n .df-review-item-action-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: 32px;\n min-width: 32px;\n height: 30px;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: var(--df-review-control);\n }\n\n\t .df-review-item-action-button:hover:not(:disabled) {\n\t border-color: rgba(124, 199, 255, 0.42);\n\t color: var(--df-review-text);\n\t background: var(--df-review-control-hover);\n\t }\n\n\t\t\t .df-review-item-actions .df-review-item-submit-button {\n\t\t\t display: inline-flex;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-height: 30px;\n\t\t\t height: 30px;\n\t\t\t width: auto;\n\t\t\t min-width: 0;\n\t\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t padding: 0 11px;\n\t\t border-color: var(--df-review-line);\n\t\t background: var(--df-review-control);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-item-submit-button span {\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 750;\n\t\t line-height: 1;\n\t\t text-transform: none;\n\t\t white-space: nowrap;\n\t\t }\n\n\t .df-review-item-actions .df-review-item-submit-button:hover:not(:disabled) {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-accent-hover);\n\t color: var(--df-review-text);\n\t }\n\n .df-review-item-action-button:disabled {\n cursor: default;\n opacity: 0.45;\n }\n\n .df-review-item-action-button svg {\n width: 14px;\n height: 14px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n\t .df-review-stage {\n\t grid-column: 1;\n\t grid-row: 2;\n\t display: grid;\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t }\n\n .df-review-frame {\n display: grid;\n grid-template-rows: minmax(0, 1fr) auto;\n min-width: 0;\n min-height: 0;\n }\n\n .df-review-frame-actions {\n position: relative;\n z-index: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 56px;\n padding: 8px 40px 10px;\n border-top: 1px solid var(--df-review-line-soft);\n background: var(--df-review-mode-bar);\n }\n\n\t .df-review-frame-scroll {\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: auto;\n\t }\n\n\t .df-review-frame-canvas {\n\t display: grid;\n\t place-items: center;\n\t width: max-content;\n\t height: max-content;\n\t min-width: 100%;\n\t min-height: 100%;\n\t padding: 34px 40px 12px;\n\t }\n\n .df-review-device {\n\t box-sizing: border-box;\n\t flex: 0 0 auto;\n\t position: relative;\n\t margin: 0;\n\t overflow: hidden;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: #fff;\n\t box-shadow: var(--df-review-shadow-device);\n }\n\n .df-review-device iframe {\n display: block;\n width: inherit;\n height: inherit;\n min-width: inherit;\n min-height: inherit;\n border: 0;\n background: #fff;\n }\n\n .df-review-device-frame {\n position: relative;\n box-sizing: border-box;\n flex: 0 0 auto;\n }\n\n .df-review-ruler-corner {\n position: absolute;\n left: -26px;\n top: -26px;\n width: 26px;\n height: 26px;\n z-index: 6;\n border-right: 1px solid var(--df-review-line-soft);\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-color-ruler-surface);\n }\n\n .df-review-ruler-gutter {\n position: absolute;\n z-index: 6;\n background: var(--df-review-color-ruler-surface);\n color: var(--df-review-muted);\n user-select: none;\n }\n\n .df-review-ruler-gutter.is-x {\n left: 0;\n right: 0;\n top: -26px;\n height: 26px;\n border-bottom: 1px solid var(--df-review-line-soft);\n background-image:\n linear-gradient(\n to right,\n var(--df-review-color-ruler-tick-major) 1px,\n transparent 1px\n ),\n linear-gradient(\n to right,\n var(--df-review-color-ruler-tick-minor) 1px,\n transparent 1px\n );\n background-size:\n calc(var(--df-review-ruler-step-x) * 5) 11px,\n var(--df-review-ruler-step-x) 6px;\n background-position: left bottom;\n background-repeat: repeat-x;\n }\n\n .df-review-ruler-gutter.is-y {\n left: -26px;\n top: 0;\n bottom: 0;\n width: 26px;\n border-right: 1px solid var(--df-review-line-soft);\n background-image:\n linear-gradient(\n to bottom,\n var(--df-review-color-ruler-tick-major) 1px,\n transparent 1px\n ),\n linear-gradient(\n to bottom,\n var(--df-review-color-ruler-tick-minor) 1px,\n transparent 1px\n );\n background-size:\n 11px calc(var(--df-review-ruler-step-y) * 5),\n 6px var(--df-review-ruler-step-y);\n background-position: right top;\n background-repeat: repeat-y;\n }\n\n .df-review-ruler-frame-label {\n position: absolute;\n right: 6px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border: 1px solid var(--df-review-color-ruler-popover-border);\n border-radius: var(--df-review-radius-sm);\n background: var(--df-review-color-ruler-label);\n line-height: 1;\n white-space: nowrap;\n box-shadow: 0 6px 18px var(--df-review-color-ruler-popover-shadow);\n }\n\n .df-review-ruler-frame-label strong {\n color: var(--df-review-color-ruler-label-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n }\n\n .df-review-ruler-frame-label span {\n color: var(--df-review-color-ruler-label-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n opacity: 0.78;\n }\n\n .df-review-ruler-coord {\n position: absolute;\n z-index: 7;\n padding: 4px 6px;\n border: 1px solid var(--df-review-color-ruler-popover-border);\n border-radius: var(--df-review-radius-xs);\n background: var(--df-review-color-ruler-coord-bg);\n color: var(--df-review-color-ruler-coord-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n pointer-events: none;\n box-shadow: 0 6px 18px var(--df-review-color-ruler-popover-shadow);\n }\n\n .df-review-ruler-coord.is-x {\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n .df-review-ruler-coord.is-y {\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n .df-review-ruler-overlay {\n position: absolute;\n left: 0;\n top: 0;\n width: inherit;\n height: inherit;\n z-index: 5;\n cursor: crosshair;\n overflow: hidden;\n touch-action: none;\n user-select: none;\n }\n\n .df-review-ruler-overlay.is-dragging {\n cursor: crosshair;\n }\n\n .df-review-ruler-guide {\n position: absolute;\n z-index: 2;\n pointer-events: none;\n background: var(--df-review-color-ruler-guide);\n box-shadow: 0 0 0 1px var(--df-review-color-ruler-measure-shadow);\n }\n\n .df-review-ruler-guide.is-x {\n left: 0;\n right: 0;\n height: 2px;\n }\n\n .df-review-ruler-guide.is-y {\n top: 0;\n bottom: 0;\n width: 2px;\n }\n\n .df-review-ruler-selection {\n position: absolute;\n z-index: 3;\n pointer-events: none;\n border: 3px solid var(--df-review-color-ruler-measure-border);\n background: var(--df-review-color-ruler-measure-bg);\n box-shadow:\n inset 0 0 0 1px var(--df-review-color-ruler-measure-shadow),\n 0 0 0 1px rgba(255, 255, 255, 0.96),\n 0 0 0 4px var(--df-review-color-ruler-measure-shadow);\n }\n\n .df-review-ruler-label {\n position: absolute;\n z-index: 4;\n pointer-events: none;\n min-width: 124px;\n padding: 9px 11px;\n border: 1px solid var(--df-review-color-ruler-popover-border);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-color-ruler-popover-bg);\n color: var(--df-review-color-ruler-popover-text);\n font-family: var(--df-review-font-mono);\n font-size: var(--df-review-font-size-lg);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n letter-spacing: -0.02em;\n text-align: center;\n box-shadow:\n 0 10px 26px var(--df-review-color-ruler-popover-shadow),\n inset 0 1px 0 rgba(255, 255, 255, 0.18);\n }\n\n\t @media (max-width: 860px) {\n\t .df-review-shell,\n\t .df-review-shell.is-list-visible {\n\t grid-template-columns: minmax(0, 1fr) 0 32px;\n\t grid-template-rows: auto minmax(0, 1fr);\n\t }\n\n\t .df-review-shell.is-list-visible {\n\t grid-template-columns: minmax(0, 1fr) minmax(260px, 70vw) 32px;\n\t }\n\n\t .df-review-qa-panel {\n\t border-left: 1px solid var(--df-review-line);\n\t border-bottom: 0;\n\t }\n\n\t .df-review-tools {\n\t flex-wrap: wrap;\n\t }\n\n\t .df-review-tool-controls {\n\t justify-content: flex-start;\n\t }\n\n .df-review-frame-actions {\n padding: 8px 20px 10px;\n }\n\n\t .df-review-frame-canvas {\n\t padding: 34px 28px 12px;\n\t }\n\n\t\t .df-review-prompt-modal {\n\t\t padding: 12px;\n\t\t }\n\n\t\t .df-review-prompt-dialog {\n\t\t width: calc(100vw - 24px);\n\t\t max-height: calc(100vh - 24px);\n\t\t }\n\n\t\t .df-review-prompt-block textarea {\n\t\t height: min(360px, calc(100vh - 270px));\n\t\t min-height: 240px;\n\t\t max-height: calc(100vh - 270px);\n\t\t }\n\n\t .df-review-panel-body {\n\t min-height: 0;\n\t }\n }\n `;\n document.head.append(style);\n }\n}\n","import React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n GripVertical as GripVerticalIcon,\n} from 'lucide-react';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewMode,\n ReviewSource,\n} from '../../types';\n\nimport type {\n ReviewShellProps,\n ReviewShellWriteMode,\n} from '../types';\nimport {\n DEFAULT_INITIAL_REVIEW_PROMPT,\n} from '../constants';\nimport {\n DEFAULT_REVIEW_PATH_PREFIX,\n normalizeTarget,\n updateShellUrl,\n} from '../route';\nimport {\n DEFAULT_REVIEW_VIEWPORT_PRESETS,\n} from '../viewport';\nimport {\n PromptModal,\n ReviewSettingsModal,\n SitemapModal,\n} from '../shell.modals';\nimport { buildReviewItemPrompt } from '../prompt/prompt';\nimport { QaItemEditModal } from '../qa/item.edit.modal';\nimport { ReviewQaPanel } from '../qa/panel';\nimport {\n getElementSourceHint,\n getSourceHintElement,\n openSourceInEditor,\n} from '../source.open';\nimport { ReviewTargetFrame } from '../target/frame';\nimport { ReviewTopbar } from '../topbar';\nimport { useReviewController } from '../hooks/use.review.controller';\nimport { useReviewPresence } from '../hooks/use.review.presence';\nimport { useReviewRuler } from '../hooks/use.review.ruler';\nimport { useReviewSettings } from '../hooks/use.review.settings';\nimport { useReviewShellData } from '../hooks/use.review.shell.data';\nimport { useReviewShellHotkeys } from '../hooks/use.review.shell.hotkeys';\nimport { useReviewShellState } from '../hooks/use.review.shell.state';\nimport {\n copyCurrentReviewUrl,\n copyReviewPrompt,\n removeReviewItem,\n refreshReviewItems,\n refreshSitemapReviewItems,\n refreshReviewData as refreshReviewDataAction,\n submitReviewItem,\n updateReviewItemComment,\n updateReviewItemStatus,\n} from './shell.actions';\n\nconst getReviewModeWriteMode = (\n mode: ReviewMode\n): ReviewShellWriteMode | null => {\n if (mode === 'element') return 'dom';\n if (mode === 'note' || mode === 'area') return mode;\n return null;\n};\n\nexport const ReviewShell = ({\n projectId,\n pages,\n adapters,\n presets = DEFAULT_REVIEW_VIEWPORT_PRESETS,\n ruler,\n initialPrompt = DEFAULT_INITIAL_REVIEW_PROMPT,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX,\n sourceRoot,\n presence\n}: ReviewShellProps) => {\n const {\n activeAdapterEntry,\n activeRoute,\n adapter,\n canWriteArea,\n canWriteDom,\n cleanupTargetRef,\n controllerRef,\n copiedPromptKey,\n copyLabel,\n draftTarget,\n frameScrollRef,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n isInitialPromptOpen,\n isListVisible,\n isRemoteSource,\n isSitemapOpen,\n localAdapterEntry,\n mode,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n remoteAdapterEntry,\n reviewViewportPresets,\n selectedItemId,\n selectedItemIdRef,\n setActiveRoute,\n setCopiedPromptKey,\n setCopyLabel,\n setDraftTarget,\n setIsInitialPromptOpen,\n setIsListVisible,\n setIsSitemapOpen,\n setMode,\n setSelectedItemId,\n setSize,\n setSource,\n setTarget,\n setTargetOverlayState,\n showSourceSelect,\n size,\n sizeRef,\n source,\n sourceEntries,\n target,\n targetOverlayState,\n targetRef,\n toastMessage,\n viewportPresets,\n setToastMessage,\n } = useReviewShellState({\n adapters,\n presets,\n reviewPathPrefix,\n });\n const sourceShortcutCleanupRef = useRef<(() => void) | null>(null);\n const {\n activeItems,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIds,\n pageQaCounts,\n pageTargets,\n presetScopeCounts,\n qaFilter,\n qaFilterCounts,\n selectedNumberedItem,\n setHiddenOverlayItemIds,\n setItems,\n setQaFilter,\n setSitemapItems,\n targetSrc,\n } = useReviewShellData({\n activeRoute,\n pages,\n reviewPathPrefix,\n reviewViewportPresets,\n selectedItemId,\n size,\n target,\n viewportPresets,\n });\n const [editingItem, setEditingItem] = useState<ReviewItem | null>(null);\n const initialPromptText = initialPrompt.trim();\n const refreshItems = useCallback(\n () =>\n refreshReviewItems({\n activeRoute,\n adapter,\n isRemoteSource,\n pageId: activeAdapterEntry.pageId,\n projectId,\n onItemsChange: setItems,\n }),\n [activeAdapterEntry.pageId, activeRoute, adapter, isRemoteSource, projectId]\n );\n\n const refreshSitemapItems = useCallback(\n () =>\n refreshSitemapReviewItems({\n localAdapterEntry,\n projectId,\n remoteAdapterEntry,\n onSitemapItemsChange: setSitemapItems,\n }),\n [localAdapterEntry, projectId, remoteAdapterEntry]\n );\n\n const cancelReviewMode = useCallback(() => {\n const controller = controllerRef.current;\n if (!controller || controller.getMode() === 'idle') return false;\n\n controller.setMode('idle');\n setMode(controller.getMode());\n return true;\n }, []);\n\n const closePromptModal = useCallback(() => {\n setIsInitialPromptOpen(false);\n }, []);\n\n const closeSitemap = useCallback(() => {\n setIsSitemapOpen(false);\n }, []);\n\n const reloadTargetFrame = useCallback(() => {\n try {\n iframeRef.current?.contentWindow?.location.reload();\n } catch {\n return;\n }\n }, []);\n\n const {\n closeFigmaSettings,\n effectiveReviewTheme,\n figmaSettingsStatus,\n figmaTokenDraft,\n isFigmaSettingsOpen,\n isFigmaTokenGuideOpen,\n isFigmaTokenVisible,\n openFigmaSettings,\n reviewThemeDraft,\n reviewUserId,\n reviewUserIdDraft,\n saveReviewSettings,\n setFigmaSettingsStatus,\n setFigmaTokenDraft,\n setIsFigmaTokenGuideOpen,\n setIsFigmaTokenVisible,\n setReviewThemeDraft,\n setReviewUserIdDraft,\n } = useReviewSettings({\n onCancelReviewMode: cancelReviewMode,\n onCloseInitialPrompt: closePromptModal,\n onCloseSitemap: closeSitemap,\n onReloadTargetFrame: reloadTargetFrame,\n });\n\n const {\n currentPagePresenceUsers,\n pagePresenceUsers,\n presenceSessionId,\n } = useReviewPresence({\n activeRoute,\n mode,\n presence,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n selectedNumberedItem,\n size,\n source,\n });\n\n const closeRulerPanels = useCallback(() => {\n closeSitemap();\n closeFigmaSettings();\n }, [closeFigmaSettings, closeSitemap]);\n\n const {\n closeRuler,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n toggleRuler,\n } = useReviewRuler({\n iframeRef,\n ruler,\n size,\n targetSrc,\n onCancelReviewMode: cancelReviewMode,\n onCloseTransientPanels: closeRulerPanels,\n });\n\n const {\n clearSelectedItem,\n closeTargetOverlay,\n initReviewKit,\n reloadReviewKit,\n restoreReviewItem,\n setControllerReviewMode,\n syncTargetViewport,\n toggleTargetOverlay,\n } = useReviewController({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n pageTargets,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetOverlayState,\n targetRef,\n viewportPresets,\n onActiveRouteChange: setActiveRoute,\n onCancelReviewMode: cancelReviewMode,\n onCloseRuler: closeRuler,\n onDraftTargetChange: setDraftTarget,\n onItemsRefresh: refreshItems,\n onModeChange: setMode,\n onSelectedItemIdChange: setSelectedItemId,\n onSizeChange: setSize,\n onTargetChange: setTarget,\n onTargetOverlayStateChange: setTargetOverlayState,\n });\n\n const refreshReviewData = useCallback(() => {\n return refreshReviewDataAction({\n onRefreshItems: refreshItems,\n onRefreshSitemapItems: refreshSitemapItems,\n onReloadReviewKit: reloadReviewKit,\n });\n }, [refreshItems, refreshSitemapItems, reloadReviewKit]);\n\n const toggleItemOverlayVisibility = useCallback((itemId: string) => {\n setHiddenOverlayItemIds((currentHiddenOverlayItemIds) => {\n const nextHiddenItemIds = new Set(currentHiddenOverlayItemIds);\n if (nextHiddenItemIds.has(itemId)) {\n nextHiddenItemIds.delete(itemId);\n } else {\n nextHiddenItemIds.add(itemId);\n }\n\n return nextHiddenItemIds;\n });\n }, []);\n\n useEffect(() => {\n void refreshItems();\n }, [refreshItems]);\n\n useEffect(() => {\n void refreshSitemapItems();\n }, [refreshSitemapItems]);\n\n useEffect(() => {\n if (!isSitemapOpen) return;\n void refreshSitemapItems();\n }, [isSitemapOpen, refreshSitemapItems]);\n\n useEffect(() => {\n const frameScroll = frameScrollRef.current;\n if (!frameScroll) return undefined;\n\n const centerFrameScroll = () => {\n frameScroll.scrollLeft = Math.max(\n 0,\n (frameScroll.scrollWidth - frameScroll.clientWidth) / 2\n );\n frameScroll.scrollTop = 0;\n syncTargetViewport();\n };\n\n const animationFrame = window.requestAnimationFrame(centerFrameScroll);\n const transitionTimeout = window.setTimeout(centerFrameScroll, 180);\n\n return () => {\n window.cancelAnimationFrame(animationFrame);\n window.clearTimeout(transitionTimeout);\n };\n }, [isListVisible, size.height, size.width, syncTargetViewport, targetSrc]);\n\n const applyTarget = () => {\n const normalizedTarget = normalizeTarget(draftTarget, reviewPathPrefix);\n clearSelectedItem();\n targetRef.current = normalizedTarget;\n setActiveRoute(normalizedTarget);\n setDraftTarget(normalizedTarget);\n setTarget(normalizedTarget);\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n };\n\n const selectPage = (href: string) => {\n const normalizedTarget = normalizeTarget(href, reviewPathPrefix);\n clearSelectedItem();\n targetRef.current = normalizedTarget;\n setActiveRoute(normalizedTarget);\n setDraftTarget(normalizedTarget);\n setTarget(normalizedTarget);\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n setIsSitemapOpen(false);\n };\n\n const setReviewMode = (nextMode: ReviewMode) => {\n const writeMode = getReviewModeWriteMode(nextMode);\n if (writeMode && !activeAdapterEntry.writeModes.includes(writeMode)) return;\n closeRuler();\n if (nextMode === 'element') {\n closeTargetOverlay('figma');\n }\n setControllerReviewMode(nextMode);\n };\n\n useReviewShellHotkeys({\n isFigmaSettingsOpen,\n isInitialPromptOpen,\n isRulerAvailable,\n isRulerVisible,\n isSitemapOpen,\n mode,\n onCancelReviewMode: cancelReviewMode,\n onCloseFigmaSettings: closeFigmaSettings,\n onCloseInitialPrompt: closePromptModal,\n onCloseRuler: closeRuler,\n onCloseSitemap: closeSitemap,\n onSetReviewMode: setReviewMode,\n onToggleRuler: toggleRuler,\n onToggleTargetOverlay: toggleTargetOverlay,\n });\n\n const copyCurrentUrl = () =>\n copyCurrentReviewUrl({\n onCopyLabelChange: setCopyLabel,\n });\n\n const showToast = useCallback(\n (message: string) => {\n setToastMessage(message);\n window.setTimeout(() => {\n setToastMessage((current) => (current === message ? '' : current));\n }, 1600);\n },\n [setToastMessage]\n );\n\n const cleanupSourceOpenShortcut = useCallback(() => {\n sourceShortcutCleanupRef.current?.();\n sourceShortcutCleanupRef.current = null;\n }, []);\n\n const bindSourceOpenShortcut = useCallback(() => {\n cleanupSourceOpenShortcut();\n\n let frameDocument: Document | null = null;\n try {\n frameDocument = iframeRef.current?.contentDocument ?? null;\n } catch {\n return;\n }\n\n if (!frameDocument) return;\n\n const hoverAttribute = 'data-dfwr-source-hover';\n const optionAttribute = 'data-dfwr-source-option';\n const fontOverlayAttribute = 'data-dfwr-source-fonts';\n const style = frameDocument.createElement('style');\n style.dataset.dfwrSourceOpenShortcut = 'true';\n style.textContent = `\n html[${optionAttribute}=\"true\"],\n html[${optionAttribute}=\"true\"] * {\n cursor: crosshair !important;\n }\n\n html[${optionAttribute}=\"true\"] body::before {\n position: fixed !important;\n z-index: 2147483647 !important;\n top: 10px !important;\n left: 50% !important;\n transform: translateX(-50%) !important;\n display: block !important;\n border: 1px solid rgba(124, 199, 255, 0.72) !important;\n border-radius: 999px !important;\n padding: 6px 10px !important;\n color: #ffffff !important;\n background: rgba(15, 23, 42, 0.86) !important;\n box-shadow: 0 10px 28px rgba(0, 0, 0, 0.24) !important;\n content: \"Source select\" !important;\n font: 700 12px/1 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif !important;\n pointer-events: none !important;\n }\n\n [${hoverAttribute}=\"true\"] {\n outline: 2px solid rgba(124, 199, 255, 0.96) !important;\n outline-offset: 2px !important;\n }\n\n [${fontOverlayAttribute}] {\n position: fixed !important;\n z-index: 2147483647 !important;\n display: flex !important;\n flex-direction: column !important;\n max-width: 180px !important;\n border: 1px solid rgba(124, 199, 255, 0.72) !important;\n border-radius: 6px !important;\n padding: 4px 6px !important;\n color: #ffffff !important;\n background: rgba(15, 23, 42, 0.9) !important;\n box-shadow: 0 8px 22px rgba(0, 0, 0, 0.28) !important;\n font: 800 11px/1.35 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace !important;\n pointer-events: none !important;\n white-space: nowrap !important;\n }\n\n [${fontOverlayAttribute}] > span {\n display: flex !important;\n justify-content: space-between !important;\n gap: 10px !important;\n }\n\n [${fontOverlayAttribute}][hidden] {\n display: none !important;\n }\n `;\n\n (frameDocument.head ?? frameDocument.documentElement).append(style);\n\n const fontOverlay = frameDocument.createElement('div');\n fontOverlay.setAttribute(fontOverlayAttribute, 'true');\n fontOverlay.hidden = true;\n (frameDocument.body ?? frameDocument.documentElement).append(fontOverlay);\n\n let hoveredElement: Element | null = null;\n let lastSourceElement: Element | null = null;\n let isSourceSelecting = false;\n\n const getFontHints = (element: Element | null) => {\n if (!element) return [];\n\n const values: Array<{ tag: string; value: string }> = [];\n const addValue = (target: Element) => {\n const value = target.getAttribute('data-font')?.trim();\n const tag = target.tagName.toLowerCase();\n if (\n value &&\n !values.some((item) => item.tag === tag && item.value === value)\n ) {\n values.push({ tag, value });\n }\n };\n\n addValue(element);\n element.querySelectorAll('[data-font]').forEach(addValue);\n return values;\n };\n\n const updateFontOverlay = (element: Element | null) => {\n const values = isSourceSelecting ? getFontHints(element) : [];\n if (!values.length || !element) {\n fontOverlay.hidden = true;\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const frameWidth = frameDocument.documentElement.clientWidth;\n const showAbove = rect.top > 48;\n const left = Math.max(4, Math.min(rect.left, frameWidth - 96));\n const top = Math.max(4, showAbove ? rect.top : rect.bottom);\n\n fontOverlay.replaceChildren();\n fontOverlay.style.minWidth = '72px';\n const rows = values.map(({ tag, value }) => {\n const row = frameDocument.createElement('span');\n const tagText = frameDocument.createElement('span');\n const valueText = frameDocument.createElement('span');\n tagText.textContent = tag;\n valueText.textContent = value;\n row.append(tagText, valueText);\n return row;\n });\n fontOverlay.append(...rows);\n fontOverlay.style.left = `${left}px`;\n fontOverlay.style.top = `${top}px`;\n fontOverlay.style.transform = showAbove\n ? 'translateY(calc(-100% - 6px))'\n : 'translateY(6px)';\n fontOverlay.hidden = false;\n };\n\n const setHoveredElement = (element: Element | null) => {\n if (hoveredElement !== element) {\n hoveredElement?.removeAttribute(hoverAttribute);\n hoveredElement = element;\n hoveredElement?.setAttribute(hoverAttribute, 'true');\n }\n updateFontOverlay(element);\n };\n\n const setSourceSelecting = (isSelecting: boolean) => {\n isSourceSelecting = isSelecting;\n if (isSelecting) {\n frameDocument.documentElement.setAttribute(optionAttribute, 'true');\n setHoveredElement(lastSourceElement);\n return;\n }\n\n setHoveredElement(null);\n fontOverlay.hidden = true;\n frameDocument.documentElement.removeAttribute(optionAttribute);\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n lastSourceElement = getSourceHintElement(event.target);\n\n if (event.altKey && !isSourceSelecting) {\n setSourceSelecting(true);\n }\n\n setHoveredElement(isSourceSelecting ? lastSourceElement : null);\n };\n\n const handleClick = (event: MouseEvent) => {\n if (!isSourceSelecting && !event.altKey) return;\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n const source = getElementSourceHint(event.target);\n if (!source?.file) {\n showToast('Source hint not found');\n setSourceSelecting(false);\n return;\n }\n\n const didOpen = openSourceInEditor(source, sourceRoot);\n showToast(didOpen ? 'Source opened' : 'Source root required');\n setSourceSelecting(false);\n };\n\n const isOptionKeyEvent = (event: KeyboardEvent) =>\n event.key === 'Alt' ||\n event.code === 'AltLeft' ||\n event.code === 'AltRight' ||\n event.altKey;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isOptionKeyEvent(event)) return;\n\n cancelReviewMode();\n setSourceSelecting(true);\n };\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (isOptionKeyEvent(event) || !event.altKey) setSourceSelecting(false);\n };\n\n const handleBlur = () => {\n setSourceSelecting(false);\n };\n\n frameDocument.addEventListener('mousemove', handleMouseMove, true);\n frameDocument.addEventListener('click', handleClick, true);\n frameDocument.addEventListener('keydown', handleKeyDown, true);\n frameDocument.addEventListener('keyup', handleKeyUp, true);\n frameDocument.defaultView?.addEventListener('blur', handleBlur);\n window.addEventListener('keydown', handleKeyDown, true);\n window.addEventListener('keyup', handleKeyUp, true);\n window.addEventListener('blur', handleBlur);\n\n sourceShortcutCleanupRef.current = () => {\n frameDocument.removeEventListener('mousemove', handleMouseMove, true);\n frameDocument.removeEventListener('click', handleClick, true);\n frameDocument.removeEventListener('keydown', handleKeyDown, true);\n frameDocument.removeEventListener('keyup', handleKeyUp, true);\n frameDocument.defaultView?.removeEventListener('blur', handleBlur);\n window.removeEventListener('keydown', handleKeyDown, true);\n window.removeEventListener('keyup', handleKeyUp, true);\n window.removeEventListener('blur', handleBlur);\n setSourceSelecting(false);\n style.remove();\n fontOverlay.remove();\n };\n }, [\n cancelReviewMode,\n cleanupSourceOpenShortcut,\n iframeRef,\n showToast,\n sourceRoot,\n ]);\n\n useEffect(() => {\n return cleanupSourceOpenShortcut;\n }, [cleanupSourceOpenShortcut]);\n\n const loadTargetFrame = useCallback(() => {\n initReviewKit();\n bindSourceOpenShortcut();\n }, [bindSourceOpenShortcut, initReviewKit]);\n\n useEffect(() => {\n const frame = window.requestAnimationFrame(bindSourceOpenShortcut);\n return () => window.cancelAnimationFrame(frame);\n }, [bindSourceOpenShortcut, targetSrc]);\n\n const clearSelectedReviewItem = useCallback(() => {\n clearSelectedItem();\n updateShellUrl(targetRef.current, sizeRef.current, source);\n }, [clearSelectedItem, sizeRef, source, targetRef]);\n\n const changeReviewSource = (nextSource: ReviewSource) => {\n if (!sourceEntries.some((entry) => entry.label === nextSource)) return;\n\n cancelReviewMode();\n clearSelectedItem();\n setItems([]);\n setSource(nextSource);\n updateShellUrl(targetRef.current, sizeRef.current, nextSource);\n };\n\n const changeItemStatus = (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) =>\n updateReviewItemStatus({\n activeAdapterEntry,\n item,\n nextStatus,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n\n const saveItemComment = async (item: ReviewItem, comment: string) => {\n await updateReviewItemComment({\n activeAdapterEntry,\n item,\n comment,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n setEditingItem(null);\n };\n\n const submitItem = (numberedItem: NumberedReviewItem) =>\n submitReviewItem({\n localAdapterEntry,\n numberedItem,\n remoteAdapterEntry,\n selectedItemIdRef,\n onClearSelectedItem: clearSelectedItem,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n\n const copyPrompt = (\n value: string,\n key: string,\n toastMessage = 'Prompt copied'\n ) =>\n copyReviewPrompt({\n key,\n toastMessage,\n value,\n onCopiedPromptKeyChange: setCopiedPromptKey,\n onToast: showToast,\n });\n\n const copyItemPrompt = (numberedItem: NumberedReviewItem) =>\n copyPrompt(\n buildReviewItemPrompt(numberedItem, reviewPathPrefix),\n `qa:${numberedItem.item.id}`,\n 'QA prompt copied'\n );\n\n const removeItem = (item: ReviewItem) =>\n removeReviewItem({\n activeAdapterEntry,\n isRemoteSource,\n item,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n onClearSelectedItem: clearSelectedItem,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n\n return (\n <div\n className={`df-review-shell is-theme-${effectiveReviewTheme}${\n isListVisible ? ' is-list-visible' : ''\n }`}\n >\n <ReviewTopbar\n draftTarget={draftTarget}\n copyLabel={copyLabel}\n viewportPresets={viewportPresets}\n size={size}\n presetScopeCounts={presetScopeCounts}\n isRulerAvailable={isRulerAvailable}\n isRulerVisible={isRulerVisible}\n targetOverlayState={targetOverlayState}\n isFigmaOverlayAvailable={isFigmaOverlayAvailable}\n onDraftTargetChange={setDraftTarget}\n onApplyTarget={applyTarget}\n onOpenSitemap={() => setIsSitemapOpen(true)}\n onCopyCurrentUrl={() => void copyCurrentUrl()}\n onSizeChange={setSize}\n onToggleRuler={toggleRuler}\n onToggleTargetOverlay={toggleTargetOverlay}\n onOpenInitialPrompt={() => {\n setIsInitialPromptOpen(true);\n }}\n onOpenSettings={openFigmaSettings}\n />\n\n {isSitemapOpen && (\n <SitemapModal\n pages={pages}\n activeRoute={activeRoute}\n pageQaCounts={pageQaCounts}\n pagePresenceUsers={pagePresenceUsers}\n getPageTarget={(href) => normalizeTarget(href, reviewPathPrefix)}\n onClose={() => setIsSitemapOpen(false)}\n onSelectPage={selectPage}\n />\n )}\n\n {isFigmaSettingsOpen && (\n <ReviewSettingsModal\n figmaTokenDraft={figmaTokenDraft}\n reviewUserIdDraft={reviewUserIdDraft}\n reviewThemeDraft={reviewThemeDraft}\n figmaSettingsStatus={figmaSettingsStatus}\n isFigmaTokenVisible={isFigmaTokenVisible}\n isFigmaTokenGuideOpen={isFigmaTokenGuideOpen}\n onClose={closeFigmaSettings}\n onFigmaTokenDraftChange={setFigmaTokenDraft}\n onReviewUserIdDraftChange={setReviewUserIdDraft}\n onReviewThemeDraftChange={setReviewThemeDraft}\n onClearStatus={() => setFigmaSettingsStatus('')}\n onToggleFigmaTokenVisible={() =>\n setIsFigmaTokenVisible((current) => !current)\n }\n onToggleFigmaTokenGuide={() =>\n setIsFigmaTokenGuideOpen((current) => !current)\n }\n onSave={saveReviewSettings}\n />\n )}\n\n {isInitialPromptOpen && (\n <PromptModal\n initialPromptText={initialPromptText}\n copiedPromptKey={copiedPromptKey}\n onClose={closePromptModal}\n onCopyPrompt={(text, key) => void copyPrompt(text, key)}\n />\n )}\n\n {editingItem && (\n <QaItemEditModal\n item={editingItem}\n onClose={() => setEditingItem(null)}\n onSave={saveItemComment}\n />\n )}\n\n {toastMessage && (\n <div className=\"df-review-copy-toast\" role=\"status\">\n {toastMessage}\n </div>\n )}\n\n <div className=\"df-review-side-rail\">\n <button\n aria-label={isListVisible ? 'Hide QA list' : 'Show QA list'}\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={() => setIsListVisible((current) => !current)}\n >\n <span aria-hidden=\"true\">\n <GripVerticalIcon />\n </span>\n <strong>QA</strong>\n </button>\n </div>\n\n <ReviewQaPanel\n activeAdapterEntry={activeAdapterEntry}\n activeItems={activeItems}\n currentPagePresenceUsers={currentPagePresenceUsers}\n currentPresetScope={currentPresetScope}\n filteredNumberedActiveItems={filteredNumberedActiveItems}\n getItemPresetScope={getItemPresetScope}\n hiddenOverlayItemIds={hiddenOverlayItemIds}\n isListVisible={isListVisible}\n isRemoteSource={isRemoteSource}\n presenceSessionId={presenceSessionId}\n copiedPromptKey={copiedPromptKey}\n qaFilter={qaFilter}\n qaFilterCounts={qaFilterCounts}\n remoteAdapterEntry={remoteAdapterEntry}\n selectedItemId={selectedItemId}\n showSourceSelect={showSourceSelect}\n sourceRoot={sourceRoot}\n source={source}\n sourceEntries={sourceEntries}\n onChangeItemStatus={changeItemStatus}\n onClearSelectedItem={clearSelectedReviewItem}\n onChangeReviewSource={changeReviewSource}\n onCopyItemPrompt={(numberedItem) => void copyItemPrompt(numberedItem)}\n onEditItem={setEditingItem}\n onQaFilterChange={setQaFilter}\n onRefreshReviewData={refreshReviewData}\n onRemoveItem={removeItem}\n onRestoreReviewItem={restoreReviewItem}\n onSubmitItem={submitItem}\n onToggleItemOverlayVisibility={toggleItemOverlayVisibility}\n />\n\n <ReviewTargetFrame\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n frameScrollRef={frameScrollRef}\n iframeRef={iframeRef}\n isRulerAvailable={isRulerAvailable}\n isRulerDragging={isRulerDragging}\n isRulerVisible={isRulerVisible}\n mode={mode}\n rulerHover={rulerHover}\n rulerMeasure={rulerMeasure}\n rulerMeasureLabel={rulerMeasureLabel}\n rulerOverlayRef={rulerOverlayRef}\n rulerScaleX={rulerScaleX}\n rulerScaleY={rulerScaleY}\n rulerUnit={rulerUnit}\n size={size}\n targetSrc={targetSrc}\n onLoadTarget={loadTargetFrame}\n onSetReviewMode={setReviewMode}\n />\n </div>\n );\n};\n","/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n","/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n","import { CamelToPascal } from '../utility-types';\nimport { toCamelCase } from './toCamelCase';\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n\n return false;\n};\n","'use client';\n\nimport { createContext, createElement, type ReactNode, useContext, useMemo } from 'react';\nimport { LucideProps } from './types';\n\ntype LucideConfig = {\n size: number;\n color: string;\n strokeWidth: number;\n absoluteStrokeWidth: boolean;\n className: string;\n};\n\nconst LucideContext = createContext<LucideProps>({});\n\ntype LucideProviderProps = {\n children: ReactNode;\n} & Partial<LucideConfig>;\n\nexport function LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n}: LucideProviderProps) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className],\n );\n\n return createElement(LucideContext.Provider, { value }, children);\n}\n\nexport const useLucideContext = () => useContext(LucideContext);\n","'use client';\n\nimport { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\nimport { useLucideContext } from './context';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n { color, size, strokeWidth, absoluteStrokeWidth, className = '', children, iconNode, ...rest },\n ref,\n ) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = 'currentColor',\n className: contextClass = '',\n } = useLucideContext() ?? {};\n\n const calculatedStrokeWidth =\n absoluteStrokeWidth ?? contextAbsoluteStrokeWidth\n ? (Number(strokeWidth ?? contextStrokeWidth) * 24) / Number(size ?? contextSize)\n : strokeWidth ?? contextStrokeWidth;\n\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses('lucide', contextClass, className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3', key: '1u773s' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n];\n\n/**\n * @component @name CircleQuestionMark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMiIC8+CiAgPHBhdGggZD0iTTEyIDE3aC4wMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/circle-question-mark\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleQuestionMark = createLucideIcon('circle-question-mark', __iconNode);\n\nexport default CircleQuestionMark;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n];\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHg9IjgiIHk9IjgiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('copy', __iconNode);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'M10 14 21 3', key: 'gplh6r' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6', key: 'a6xqqp' }],\n];\n\n/**\n * @component @name ExternalLink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0iTTEwIDE0IDIxIDMiIC8+CiAgPHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ExternalLink = createLucideIcon('external-link', __iconNode);\n\nexport default ExternalLink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49',\n key: 'ct8e1f',\n },\n ],\n ['path', { d: 'M14.084 14.158a3 3 0 0 1-4.242-4.242', key: '151rxh' }],\n [\n 'path',\n {\n d: 'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143',\n key: '13bj9a',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNzMzIDUuMDc2YTEwLjc0NCAxMC43NDQgMCAwIDEgMTEuMjA1IDYuNTc1IDEgMSAwIDAgMSAwIC42OTYgMTAuNzQ3IDEwLjc0NyAwIDAgMS0xLjQ0NCAyLjQ5IiAvPgogIDxwYXRoIGQ9Ik0xNC4wODQgMTQuMTU4YTMgMyAwIDAgMS00LjI0Mi00LjI0MiIgLz4KICA8cGF0aCBkPSJNMTcuNDc5IDE3LjQ5OWExMC43NSAxMC43NSAwIDAgMS0xNS40MTctNS4xNTEgMSAxIDAgMCAxIDAtLjY5NiAxMC43NSAxMC43NSAwIDAgMSA0LjQ0Ni01LjE0MyIgLz4KICA8cGF0aCBkPSJtMiAyIDIwIDIwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst EyeOff = createLucideIcon('eye-off', __iconNode);\n\nexport default EyeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n key: '1nclc0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi4wNjIgMTIuMzQ4YTEgMSAwIDAgMSAwLS42OTYgMTAuNzUgMTAuNzUgMCAwIDEgMTkuODc2IDAgMSAxIDAgMCAxIDAgLjY5NiAxMC43NSAxMC43NSAwIDAgMS0xOS44NzYgMCIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Eye = createLucideIcon('eye', __iconNode);\n\nexport default Eye;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4 12.15V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-3.35',\n key: '1wthlu',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n ['path', { d: 'm5 16-3 3 3 3', key: '331omg' }],\n ['path', { d: 'm9 22 3-3-3-3', key: 'lsp7cz' }],\n];\n\n/**\n * @component @name FileCodeCorner\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCAxMi4xNVY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMmgtMy4zNSIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KICA8cGF0aCBkPSJtNSAxNi0zIDMgMyAzIiAvPgogIDxwYXRoIGQ9Im05IDIyIDMtMy0zLTMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/file-code-corner\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FileCodeCorner = createLucideIcon('file-code-corner', __iconNode);\n\nexport default FileCodeCorner;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '9', cy: '12', r: '1', key: '1vctgf' }],\n ['circle', { cx: '9', cy: '5', r: '1', key: 'hp0tcf' }],\n ['circle', { cx: '9', cy: '19', r: '1', key: 'fkjjf6' }],\n ['circle', { cx: '15', cy: '12', r: '1', key: '1tmaij' }],\n ['circle', { cx: '15', cy: '5', r: '1', key: '19l28e' }],\n ['circle', { cx: '15', cy: '19', r: '1', key: 'f4zoj3' }],\n];\n\n/**\n * @component @name GripVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjUiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTUiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTkiIHI9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/grip-vertical\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GripVertical = createLucideIcon('grip-vertical', __iconNode);\n\nexport default GripVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '7', height: '7', x: '3', y: '3', rx: '1', key: '1g98yp' }],\n ['rect', { width: '7', height: '7', x: '14', y: '3', rx: '1', key: '6d4xhi' }],\n ['rect', { width: '7', height: '7', x: '14', y: '14', rx: '1', key: 'nxv5o0' }],\n ['rect', { width: '7', height: '7', x: '3', y: '14', rx: '1', key: '1bb6yr' }],\n];\n\n/**\n * @component @name LayoutGrid\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIzIiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIxNCIgeT0iMyIgcng9IjEiIC8+CiAgPHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iNyIgeD0iMTQiIHk9IjE0IiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIxNCIgcng9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/layout-grid\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LayoutGrid = createLucideIcon('layout-grid', __iconNode);\n\nexport default LayoutGrid;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M2 5h20', key: '1fs1ex' }],\n ['path', { d: 'M6 12h12', key: '8npq4p' }],\n ['path', { d: 'M9 19h6', key: '456am0' }],\n];\n\n/**\n * @component @name ListFilter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMiA1aDIwIiAvPgogIDxwYXRoIGQ9Ik02IDEyaDEyIiAvPgogIDxwYXRoIGQ9Ik05IDE5aDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/list-filter\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ListFilter = createLucideIcon('list-filter', __iconNode);\n\nexport default ListFilter;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z',\n key: '169xi5',\n },\n ],\n ['path', { d: 'M15 5.764v15', key: '1pn4in' }],\n ['path', { d: 'M9 3.236v15', key: '1uimfh' }],\n];\n\n/**\n * @component @name Map\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQuMTA2IDUuNTUzYTIgMiAwIDAgMCAxLjc4OCAwbDMuNjU5LTEuODNBMSAxIDAgMCAxIDIxIDQuNjE5djEyLjc2NGExIDEgMCAwIDEtLjU1My44OTRsLTQuNTUzIDIuMjc3YTIgMiAwIDAgMS0xLjc4OCAwbC00LjIxMi0yLjEwNmEyIDIgMCAwIDAtMS43ODggMGwtMy42NTkgMS44M0ExIDEgMCAwIDEgMyAxOS4zODFWNi42MThhMSAxIDAgMCAxIC41NTMtLjg5NGw0LjU1My0yLjI3N2EyIDIgMCAwIDEgMS43ODggMHoiIC8+CiAgPHBhdGggZD0iTTE1IDUuNzY0djE1IiAvPgogIDxwYXRoIGQ9Ik05IDMuMjM2djE1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/map\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Map = createLucideIcon('map', __iconNode);\n\nexport default Map;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'm21 3-7 7', key: '1l2asr' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M9 21H3v-6', key: 'wtvkvv' }],\n];\n\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0ibTIxIDMtNyA3IiAvPgogIDxwYXRoIGQ9Im0zIDIxIDctNyIgLz4KICA8cGF0aCBkPSJNOSAyMUgzdi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize2 = createLucideIcon('maximize-2', __iconNode);\n\nexport default Maximize2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n key: '1a8usu',\n },\n ],\n ['path', { d: 'm15 5 4 4', key: '1mk7zo' }],\n];\n\n/**\n * @component @name Pencil\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KICA8cGF0aCBkPSJtMTUgNSA0IDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/pencil\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pencil = createLucideIcon('pencil', __iconNode);\n\nexport default Pencil;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '12', x: '2', y: '6', rx: '2', key: '9lu3g6' }],\n];\n\n/**\n * @component @name RectangleHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTIiIHg9IjIiIHk9IjYiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rectangle-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RectangleHorizontal = createLucideIcon('rectangle-horizontal', __iconNode);\n\nexport default RectangleHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z',\n key: 'icamh8',\n },\n ],\n ['path', { d: 'm14.5 12.5 2-2', key: 'inckbg' }],\n ['path', { d: 'm11.5 9.5 2-2', key: 'fmmyf7' }],\n ['path', { d: 'm8.5 6.5 2-2', key: 'vc6u1g' }],\n ['path', { d: 'm17.5 15.5 2-2', key: 'wo5hmg' }],\n];\n\n/**\n * @component @name Ruler\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMyAxNS4zYTIuNCAyLjQgMCAwIDEgMCAzLjRsLTIuNiAyLjZhMi40IDIuNCAwIDAgMS0zLjQgMEwyLjcgOC43YTIuNDEgMi40MSAwIDAgMSAwLTMuNGwyLjYtMi42YTIuNDEgMi40MSAwIDAgMSAzLjQgMFoiIC8+CiAgPHBhdGggZD0ibTE0LjUgMTIuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTExLjUgOS41IDItMiIgLz4KICA8cGF0aCBkPSJtOC41IDYuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTE3LjUgMTUuNSAyLTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/ruler\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ruler = createLucideIcon('ruler', __iconNode);\n\nexport default Ruler;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 7V5a2 2 0 0 1 2-2h2', key: 'aa7l1z' }],\n ['path', { d: 'M17 3h2a2 2 0 0 1 2 2v2', key: '4qcy5o' }],\n ['path', { d: 'M21 17v2a2 2 0 0 1-2 2h-2', key: '6vwrx8' }],\n ['path', { d: 'M7 21H5a2 2 0 0 1-2-2v-2', key: 'ioqczr' }],\n];\n\n/**\n * @component @name Scan\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiAvPgogIDxwYXRoIGQ9Ik0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiAvPgogIDxwYXRoIGQ9Ik0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIC8+CiAgPHBhdGggZD0iTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/scan\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Scan = createLucideIcon('scan', __iconNode);\n\nexport default Scan;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '20', x: '5', y: '2', rx: '2', ry: '2', key: '1yt0o3' }],\n ['path', { d: 'M12 18h.01', key: 'mhygvu' }],\n];\n\n/**\n * @component @name Smartphone\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMjAiIHg9IjUiIHk9IjIiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNMTIgMThoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/smartphone\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Smartphone = createLucideIcon('smartphone', __iconNode);\n\nexport default Smartphone;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z',\n key: 'xwnzip',\n },\n ],\n ['path', { d: 'M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6', key: '14rsvq' }],\n];\n\n/**\n * @component @name SquareMousePointer\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuMDM0IDEyLjY4MWEuNDk4LjQ5OCAwIDAgMSAuNjQ3LS42NDdsOSAzLjVhLjUuNSAwIDAgMS0uMDMzLjk0M2wtMy40NDQgMS4wNjhhMSAxIDAgMCAwLS42Ni42NmwtMS4wNjcgMy40NDNhLjUuNSAwIDAgMS0uOTQzLjAzM3oiIC8+CiAgPHBhdGggZD0iTTIxIDExVjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/square-mouse-pointer\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareMousePointer = createLucideIcon('square-mouse-pointer', __iconNode);\n\nexport default SquareMousePointer;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z',\n key: '1dfntj',\n },\n ],\n ['path', { d: 'M15 3v5a1 1 0 0 0 1 1h5', key: '6s6qgf' }],\n];\n\n/**\n * @component @name StickyNote\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgOWEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTUgM0g1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yeiIgLz4KICA8cGF0aCBkPSJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/sticky-note\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst StickyNote = createLucideIcon('sticky-note', __iconNode);\n\nexport default StickyNote;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v12', key: '1x0j5s' }],\n ['path', { d: 'm17 8-5-5-5 5', key: '7q97r8' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n];\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxMiIgLz4KICA8cGF0aCBkPSJtMTcgOC01LTUtNSA1IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('upload', __iconNode);\n\nexport default Upload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2', key: '1yyitq' }],\n ['path', { d: 'M16 3.128a4 4 0 0 1 0 7.744', key: '16gr8j' }],\n ['path', { d: 'M22 21v-2a4 4 0 0 0-3-3.87', key: 'kshegd' }],\n ['circle', { cx: '9', cy: '7', r: '4', key: 'nufk8' }],\n];\n\n/**\n * @component @name Users\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIgLz4KICA8cGF0aCBkPSJNMTYgMy4xMjhhNCA0IDAgMCAxIDAgNy43NDQiIC8+CiAgPHBhdGggZD0iTTIyIDIxdi0yYTQgNCAwIDAgMC0zLTMuODciIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/users\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Users = createLucideIcon('users', __iconNode);\n\nexport default Users;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","import type { ReviewItemScope } from '../types';\nimport type { ReviewQaFilter, ReviewShellTheme } from './types';\n\nexport const REVIEW_QA_FILTERS: Array<{\n key: ReviewQaFilter;\n label: string;\n scope?: ReviewItemScope;\n}> = [\n { key: 'all', label: 'All' },\n { key: 'mobile', label: 'Mobile', scope: 'mobile' },\n { key: 'tablet', label: 'Tablet', scope: 'tablet' },\n { key: 'desktop', label: 'Desktop', scope: 'desktop' },\n { key: 'wide', label: 'Wide', scope: 'wide' },\n];\n\nexport const FIGMA_OVERLAY_UNAVAILABLE_MESSAGE =\n '피그마 오버레이 디버깅이 안되는 해상도';\nexport const FIGMA_TOKEN_STORAGE_KEY = 'figma-token';\nexport const REVIEW_USER_ID_STORAGE_KEY = 'user-id';\nexport const REVIEW_THEME_STORAGE_KEY = 'df-review-theme';\nexport const DEFAULT_REVIEW_THEME: ReviewShellTheme = 'dark';\nexport const FIGMA_TOKEN_GUIDE_ID = 'df-review-figma-token-guide';\nexport const DEFAULT_INITIAL_REVIEW_PROMPT =\n 'You are fixing QA issues collected with df-web-review-kit. Use the copied QA prompt as the source of truth for page, viewport, selector, DOM metadata, coordinates, and user comment. Make the smallest code or CSS change that fixes the issue, preserve unrelated behavior, then verify the target viewport again.';\n\nexport const REVIEW_THEME_OPTIONS: Array<{\n value: ReviewShellTheme;\n label: string;\n}> = [\n { value: 'dark', label: 'Dark' },\n { value: 'light', label: 'Light' },\n { value: 'system', label: 'System' }\n];\n","import type { ReviewItem, ReviewSource } from '../types';\nimport type { ReviewShellViewportPreset } from './types';\n\nexport const DEFAULT_REVIEW_PATH_PREFIX = '/review';\n\nexport const normalizeReviewPathPrefix = (value: string) => {\n const raw = value.trim() || DEFAULT_REVIEW_PATH_PREFIX;\n const prefix = raw.startsWith('/') ? raw : `/${raw}`;\n return prefix.length > 1 && prefix.endsWith('/')\n ? prefix.slice(0, -1)\n : prefix;\n};\n\nexport const normalizeTarget = (\n value: string,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n const raw = value.trim() || '/';\n const [path] = raw.split(/[?#]/);\n const normalized = path.startsWith('/') ? path : `/${path}`;\n const reviewPrefix = normalizeReviewPathPrefix(reviewPathPrefix);\n\n return normalized === reviewPrefix ||\n normalized.startsWith(`${reviewPrefix}/`)\n ? '/'\n : normalized;\n};\n\nexport const getInitialTarget = (reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX) => {\n if (typeof window === 'undefined') return '/';\n\n const target = new URLSearchParams(window.location.search).get('target');\n return target ? normalizeTarget(target, reviewPathPrefix) : '/';\n};\n\nexport const buildTargetSrc = (target: string) => {\n const url = new URL(target || '/', window.location.origin);\n url.searchParams.set('__dfwr_target', '1');\n return `${url.pathname}${url.search}${url.hash}`;\n};\n\nexport const getHashRoutePath = (hash: string) => {\n if (!hash.startsWith('#/')) return null;\n\n const [path] = hash.slice(1).split(/[?#]/);\n try {\n return decodeURI(path || '/');\n } catch {\n return path || '/';\n }\n};\n\nexport const getFrameRouteTarget = (\n targetWindow: Window,\n reviewPathPrefix: string\n) => {\n const hashPath = getHashRoutePath(targetWindow.location.hash);\n return normalizeTarget(\n hashPath ?? targetWindow.location.pathname,\n reviewPathPrefix\n );\n};\n\nexport const updateShellUrl = (\n target: string,\n size: ReviewShellViewportPreset,\n source: ReviewSource\n) => {\n const url = new URL(window.location.href);\n url.searchParams.set('target', target);\n url.searchParams.set('w', String(size.width));\n url.searchParams.set('h', String(size.height));\n if (source !== 'local') {\n url.searchParams.set('source', source);\n } else {\n url.searchParams.delete('source');\n }\n url.searchParams.delete('item');\n window.history.replaceState(null, '', `${url.pathname}${url.search}`);\n};\n\nexport const updateShellUrlForItem = (\n target: string,\n size: ReviewShellViewportPreset,\n itemId: string,\n source: ReviewSource\n) => {\n const url = new URL(window.location.href);\n url.searchParams.set('target', target);\n url.searchParams.set('w', String(size.width));\n url.searchParams.set('h', String(size.height));\n url.searchParams.set('item', itemId);\n if (source !== 'local') {\n url.searchParams.set('source', source);\n } else {\n url.searchParams.delete('source');\n }\n window.history.replaceState(null, '', `${url.pathname}${url.search}`);\n};\n\nexport const getInitialItemId = () => {\n if (typeof window === 'undefined') return null;\n return new URLSearchParams(window.location.search).get('item');\n};\n\nexport const getInitialSource = (\n remoteSource: ReviewSource | null | undefined\n): ReviewSource => {\n if (typeof window === 'undefined' || !remoteSource) return 'local';\n return new URLSearchParams(window.location.search).get('source') ===\n remoteSource\n ? remoteSource\n : 'local';\n};\n\nexport const getItemTarget = (\n item: ReviewItem,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n if (item.routeKey) return normalizeTarget(item.routeKey, reviewPathPrefix);\n if (item.normalizedPath) {\n return normalizeTarget(item.normalizedPath, reviewPathPrefix);\n }\n\n try {\n return normalizeTarget(new URL(item.pageUrl).pathname, reviewPathPrefix);\n } catch {\n return '/';\n }\n};\n","import type { ReviewItem, ReviewViewportPreset } from '../types';\nimport type { ReviewShellViewportKind, ReviewShellViewportPreset } from './types';\n\nexport const DEFAULT_REVIEW_VIEWPORT_PRESETS: ReviewShellViewportPreset[] = [\n { label: 'Mobile', width: 390, height: 720, kind: 'mobile' },\n { label: 'Tablet', width: 768, height: 1024, kind: 'tablet' },\n { label: 'Desktop', width: 1440, height: 900, kind: 'desktop' },\n { label: 'Wide', width: 1980, height: 1080, kind: 'wide' }\n];\n\nexport const getFallbackPreset = (presets: ReviewShellViewportPreset[]) =>\n presets[0] ?? DEFAULT_REVIEW_VIEWPORT_PRESETS[0];\n\nexport const getViewportPresetDistance = (\n preset: ReviewShellViewportPreset,\n width: number,\n height: number\n) => Math.abs(preset.width - width) + Math.abs(preset.height - height);\n\nexport const findViewportPreset = (\n presets: ReviewShellViewportPreset[],\n width: number,\n height: number\n) => {\n const fallback = getFallbackPreset(presets);\n const exact = presets.find(\n (preset) => preset.width === width && preset.height === height\n );\n\n if (exact) return exact;\n\n return presets.reduce((closest, preset) => {\n const closestDistance = getViewportPresetDistance(closest, width, height);\n const presetDistance = getViewportPresetDistance(preset, width, height);\n return presetDistance < closestDistance ? preset : closest;\n }, fallback);\n};\n\nexport const getInitialSize = (\n presets: ReviewShellViewportPreset[]\n): ReviewShellViewportPreset => {\n if (typeof window === 'undefined') return getFallbackPreset(presets);\n\n const params = new URLSearchParams(window.location.search);\n const width = Number(params.get('w'));\n const height = Number(params.get('h'));\n\n if (\n Number.isFinite(width) &&\n Number.isFinite(height) &&\n width > 0 &&\n height > 0\n ) {\n return findViewportPreset(presets, width, height);\n }\n\n return getFallbackPreset(presets);\n};\n\nexport const getRestoredSize = (\n item: ReviewItem,\n presets: ReviewShellViewportPreset[]\n): ReviewShellViewportPreset =>\n findViewportPreset(\n presets,\n Math.max(\n 240,\n Math.round(item.viewport?.width ?? getFallbackPreset(presets).width)\n ),\n Math.max(\n 320,\n Math.round(item.viewport?.height ?? getFallbackPreset(presets).height)\n )\n );\n\nexport const getViewportPresetKind = (\n preset: ReviewShellViewportPreset\n): ReviewShellViewportKind => {\n if (preset.kind) return preset.kind;\n\n const label = preset.label.toLowerCase();\n\n if (label.includes('mobile') || label.includes('phone')) return 'mobile';\n if (label.includes('tablet') || label.includes('pad')) return 'tablet';\n if (\n label.includes('wide') ||\n label.includes('1980') ||\n label.includes('1940') ||\n label.includes('1920')\n ) {\n return 'wide';\n }\n if (label.includes('desktop')) return 'desktop';\n if (preset.width >= 1800) return 'wide';\n if (preset.width >= 1000) return 'desktop';\n if (preset.width >= 700) return 'tablet';\n return 'mobile';\n};\n\nexport const toReviewViewportPresets = (\n presets: ReviewShellViewportPreset[]\n): ReviewViewportPreset[] =>\n presets.map((preset) => ({\n label: preset.label,\n width: preset.width,\n height: preset.height,\n scope: getViewportPresetKind(preset)\n }));\n\nexport const getIsFigmaOverlayAvailable = (preset: ReviewShellViewportPreset) => {\n const kind = getViewportPresetKind(preset);\n return kind === 'mobile' || kind === 'wide';\n};\n","import type { NumberedReviewItem, ReviewItem } from '../../types';\nimport { getItemTarget } from '../route';\n\nexport const getItemTitle = (item: ReviewItem) =>\n item.title || item.comment.split('\\n')[0] || item.kind;\n\nexport const formatItemMeta = (item: ReviewItem) => {\n const parts = [\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(item.viewport?.height ?? 0)}`\n ];\n\n if (item.scroll) {\n parts.push(\n `scroll ${Math.round(item.scroll.x)},${Math.round(item.scroll.y)}`\n );\n }\n\n return parts.join(' / ');\n};\n\nexport const formatPromptViewport = (item: ReviewItem) =>\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(\n item.viewport?.height ?? 0\n )}`;\n\nexport const formatPromptPoint = (point: { x: number; y: number } | undefined) =>\n point ? `x=${Math.round(point.x)}, y=${Math.round(point.y)}` : '(none)';\n\nexport const formatPromptSelection = (\n selection:\n | {\n x?: number;\n y?: number;\n left?: number;\n top?: number;\n width: number;\n height: number;\n }\n | undefined\n) => {\n if (!selection) return '(none)';\n\n const x = 'x' in selection ? selection.x : selection.left;\n const y = 'y' in selection ? selection.y : selection.top;\n return `x=${Math.round(x ?? 0)}, y=${Math.round(y ?? 0)}, width=${Math.round(\n selection.width\n )}, height=${Math.round(selection.height)}`;\n};\n\nexport const decodePromptHtmlEntities = (value: string) =>\n value.replace(\n /&(#\\d+|#x[\\da-f]+|lt|gt|quot|apos|amp);/gi,\n (match, entity: string) => {\n const normalized = entity.toLowerCase();\n\n if (normalized === 'lt') return '<';\n if (normalized === 'gt') return '>';\n if (normalized === 'quot') return '\"';\n if (normalized === 'apos') return \"'\";\n if (normalized === 'amp') return '&';\n\n const codePoint = normalized.startsWith('#x')\n ? Number.parseInt(normalized.slice(2), 16)\n : Number.parseInt(normalized.slice(1), 10);\n\n return Number.isFinite(codePoint)\n ? String.fromCodePoint(codePoint)\n : match;\n }\n );\n\nexport const getPromptAnchorCandidates = (item: ReviewItem) => {\n const anchor = item.anchor;\n if (!anchor) return [];\n\n const seen = new Set<string>();\n return [anchor, ...(anchor.candidates ?? [])].filter((candidate) => {\n const key = `${candidate.strategy}:${candidate.selector}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\nexport const formatPromptSourceHint = (item: ReviewItem) => {\n const source = item.anchor?.source;\n if (!source) return '(none)';\n\n return [\n `Component: ${source.component ?? '(unknown)'}`,\n `File: ${source.file ?? '(unknown)'}`,\n `Line: ${source.line ?? '(unknown)'}`,\n `Column: ${source.column ?? '(unknown)'}`,\n `Section index: ${source.sectionIndex ?? '(unknown)'}`,\n `Section id: ${source.sectionId ?? '(none)'}`,\n ].join('\\n');\n};\n\nexport const buildReviewItemPrompt = (\n numberedItem: NumberedReviewItem,\n reviewPathPrefix: string\n) => {\n const { item } = numberedItem;\n const anchor = item.anchor;\n const candidates = getPromptAnchorCandidates(item);\n const candidateLines =\n candidates.length > 0\n ? candidates\n .map((candidate, index) => {\n const confidence =\n typeof candidate.confidence === 'number'\n ? `, confidence=${Math.round(candidate.confidence * 100)}%`\n : '';\n const fingerprint = candidate.textFingerprint\n ? `, text=\"${candidate.textFingerprint}\"`\n : '';\n return `${index + 1}. ${candidate.selector} (${candidate.strategy}${confidence}${fingerprint})`;\n })\n .join('\\n')\n : '(none)';\n\n return [\n 'Fix this df-web-review-kit QA issue.',\n '',\n `Page: ${getItemTarget(item, reviewPathPrefix)}`,\n `URL: ${item.originalUrl ?? item.pageUrl}`,\n `QA item: ${numberedItem.displayLabel}`,\n `Viewport: ${numberedItem.label} ${formatPromptViewport(item)}`,\n `Scroll: ${formatPromptPoint(item.scroll)}`,\n '',\n 'Target:',\n `Primary selector: ${anchor?.selector ?? '(missing)'}`,\n `Primary strategy: ${anchor?.strategy ?? '(missing)'}`,\n `Text fingerprint: ${anchor?.textFingerprint ?? '(none)'}`,\n 'Selector candidates:',\n candidateLines,\n '',\n 'Source hint:',\n formatPromptSourceHint(item),\n '',\n `Marker: ${formatPromptPoint(item.marker?.viewport)}`,\n `Marker relative: ${formatPromptPoint(item.marker?.relative)}`,\n `Selection: ${formatPromptSelection(item.selection?.viewport)}`,\n `Selection relative: ${formatPromptSelection(item.selection?.relative)}`,\n '',\n 'Element HTML snippet:',\n '```html',\n anchor?.htmlSnippet\n ? decodePromptHtmlEntities(anchor.htmlSnippet)\n : '(not available)',\n '```',\n '',\n 'Issue:',\n item.comment,\n '',\n 'Request:',\n 'Find the target element with the selector candidates above and apply the smallest UI/CSS/code change that fixes this QA issue. If the selector is missing because CSR or hydration has not finished, wait for the page to load and use the Source hint first. Preserve unrelated layout and behavior.'\n ].join('\\n');\n};\n\nexport const getPromptLengthLabel = (value: string) => {\n const length = value.length;\n if (length <= 2000) return `${length} chars / Discord 2,000 OK`;\n if (length <= 4000) return `${length} chars / Nitro 4,000 OK`;\n return `${length} chars / attach as file`;\n};\n\nexport const formatDate = (value: string) => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return date.toLocaleString(undefined, {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n};\n","import { Copy as CopyIcon } from 'lucide-react';\nimport { getPromptLengthLabel } from './prompt';\n\ninterface PromptModalProps {\n initialPromptText: string;\n copiedPromptKey: string | null;\n onClose: () => void;\n onCopyPrompt: (text: string, key: string) => void;\n}\n\nconst ABOUT_SECTIONS = [\n {\n title: 'What this is',\n body:\n 'df-web-review-kit is a project-embedded review shell. It mounts a /review page, opens real host pages in an iframe, and lets reviewers create QA notes, area markers, and DOM markers against the actual implementation instead of a separate screenshot tool.',\n },\n {\n title: 'How to setup',\n body:\n 'Install the package, mount the review route in the host project, and choose the storage adapters for that project. Local drafts work by default; shared remote QA and realtime presence depend on the host project configuration.',\n },\n {\n title: 'Figma token',\n body:\n 'Add a browser-safe Figma token in Settings only when the host page already supports the Figma overlay helper. The package stores it in localStorage as figma-token and does not own a server-side Figma integration.',\n },\n {\n title: 'User ID',\n body:\n 'Set your User ID in Settings before reviewing. It is used for presence, online user pills, and author context so teammates can tell who is looking at the same project or route.',\n },\n {\n title: 'Remote',\n body:\n 'Remote QA is optional and project-specific. If you need shared canonical items, Supabase, or realtime presence, ask the project owner or 담당 개발자 which remote adapter and browser-safe env values are connected. Never put service_role or operator secrets in the browser.',\n },\n];\n\nexport const PromptModal = ({\n initialPromptText,\n copiedPromptKey,\n onClose,\n onCopyPrompt,\n}: PromptModalProps) => {\n return (\n <div\n aria-label=\"Review help\"\n aria-modal=\"true\"\n className=\"df-review-prompt-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close help\"\n className=\"df-review-prompt-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-prompt-dialog\">\n <div className=\"df-review-prompt-header\">\n <div>\n <strong>Review shell help</strong>\n <span>About / Initial prompt</span>\n </div>\n <button aria-label=\"Close help\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n <div className=\"df-review-prompt-body\">\n <section\n className=\"df-review-prompt-about\"\n aria-labelledby=\"df-review-about-title\"\n >\n <div className=\"df-review-prompt-section-header\">\n <strong id=\"df-review-about-title\">About</strong>\n <span>Program overview and setup notes</span>\n </div>\n <div className=\"df-review-prompt-about-grid\">\n {ABOUT_SECTIONS.map((section) => (\n <article key={section.title}>\n <strong>{section.title}</strong>\n <p>{section.body}</p>\n </article>\n ))}\n </div>\n </section>\n <section\n className=\"df-review-prompt-block\"\n aria-labelledby=\"df-review-initial-prompt-title\"\n >\n <div className=\"df-review-prompt-block-header\">\n <div>\n <strong id=\"df-review-initial-prompt-title\">\n Initial Prompt\n </strong>\n <span>{getPromptLengthLabel(initialPromptText)}</span>\n </div>\n <button\n disabled={!initialPromptText}\n type=\"button\"\n onClick={() => onCopyPrompt(initialPromptText, 'initial')}\n >\n <CopyIcon aria-hidden=\"true\" />\n {copiedPromptKey === 'initial' ? 'Copied' : 'Copy'}\n </button>\n </div>\n <textarea\n readOnly\n aria-label=\"Initial Prompt content\"\n value={initialPromptText || 'Initial prompt is not configured.'}\n />\n </section>\n </div>\n </div>\n </div>\n );\n};\n","import type { ReviewShellTheme } from './types';\nimport {\n DEFAULT_REVIEW_THEME,\n FIGMA_TOKEN_STORAGE_KEY,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from './constants';\n\nexport const normalizeReviewTheme = (value: string | null): ReviewShellTheme =>\n value === 'light' || value === 'system' || value === 'dark'\n ? value\n : DEFAULT_REVIEW_THEME;\n\nexport const getStoredFigmaToken = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return window.localStorage.getItem(FIGMA_TOKEN_STORAGE_KEY) ?? '';\n } catch {\n return '';\n }\n};\n\nexport const writeStoredFigmaToken = (token: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (token) {\n window.localStorage.setItem(FIGMA_TOKEN_STORAGE_KEY, token);\n } else {\n window.localStorage.removeItem(FIGMA_TOKEN_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewUserId = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return window.localStorage.getItem(REVIEW_USER_ID_STORAGE_KEY) ?? '';\n } catch {\n return '';\n }\n};\n\nexport const writeStoredReviewUserId = (userId: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (userId) {\n window.localStorage.setItem(REVIEW_USER_ID_STORAGE_KEY, userId);\n } else {\n window.localStorage.removeItem(REVIEW_USER_ID_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewTheme = () => {\n if (typeof window === 'undefined') return DEFAULT_REVIEW_THEME;\n\n try {\n return normalizeReviewTheme(\n window.localStorage.getItem(REVIEW_THEME_STORAGE_KEY)\n );\n } catch {\n return DEFAULT_REVIEW_THEME;\n }\n};\n\nexport const writeStoredReviewTheme = (theme: ReviewShellTheme) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (theme === DEFAULT_REVIEW_THEME) {\n window.localStorage.removeItem(REVIEW_THEME_STORAGE_KEY);\n } else {\n window.localStorage.setItem(REVIEW_THEME_STORAGE_KEY, theme);\n }\n } catch {\n return;\n }\n};\n\nexport const getSystemReviewTheme = (): Exclude<ReviewShellTheme, 'system'> => {\n if (typeof window === 'undefined' || !window.matchMedia) return 'dark';\n return window.matchMedia('(prefers-color-scheme: light)').matches\n ? 'light'\n : 'dark';\n};\n","import {\n CircleHelp as CircleHelpIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n} from 'lucide-react';\nimport {\n DEFAULT_REVIEW_THEME,\n FIGMA_TOKEN_GUIDE_ID,\n FIGMA_TOKEN_STORAGE_KEY,\n REVIEW_THEME_OPTIONS,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from '../constants';\nimport { normalizeReviewTheme } from '../settings';\nimport type { ReviewShellTheme } from '../types';\n\ninterface ReviewSettingsModalProps {\n figmaTokenDraft: string;\n reviewUserIdDraft: string;\n reviewThemeDraft: ReviewShellTheme;\n figmaSettingsStatus: string;\n isFigmaTokenVisible: boolean;\n isFigmaTokenGuideOpen: boolean;\n onClose: () => void;\n onFigmaTokenDraftChange: (value: string) => void;\n onReviewUserIdDraftChange: (value: string) => void;\n onReviewThemeDraftChange: (value: ReviewShellTheme) => void;\n onClearStatus: () => void;\n onToggleFigmaTokenVisible: () => void;\n onToggleFigmaTokenGuide: () => void;\n onSave: (\n figmaToken: string,\n reviewUserId: string,\n reviewTheme: ReviewShellTheme\n ) => void;\n}\n\nexport const ReviewSettingsModal = ({\n figmaTokenDraft,\n reviewUserIdDraft,\n reviewThemeDraft,\n figmaSettingsStatus,\n isFigmaTokenVisible,\n isFigmaTokenGuideOpen,\n onClose,\n onFigmaTokenDraftChange,\n onReviewUserIdDraftChange,\n onReviewThemeDraftChange,\n onClearStatus,\n onToggleFigmaTokenVisible,\n onToggleFigmaTokenGuide,\n onSave,\n}: ReviewSettingsModalProps) => {\n return (\n <div\n aria-label=\"Review settings\"\n aria-modal=\"true\"\n className=\"df-review-settings-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close settings\"\n className=\"df-review-settings-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <form\n className=\"df-review-settings-dialog\"\n onSubmit={(event) => {\n event.preventDefault();\n onSave(figmaTokenDraft, reviewUserIdDraft, reviewThemeDraft);\n }}\n >\n <div className=\"df-review-settings-header\">\n <div className=\"df-review-settings-title\">\n <strong>Settings</strong>\n <span>\n {FIGMA_TOKEN_STORAGE_KEY} / {REVIEW_USER_ID_STORAGE_KEY} /{' '}\n {REVIEW_THEME_STORAGE_KEY}\n </span>\n </div>\n <div className=\"df-review-settings-header-actions\">\n <button aria-label=\"Close settings\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n </div>\n <div className=\"df-review-settings-body\">\n <div className=\"df-review-settings-row\">\n <span>Theme</span>\n <div className=\"df-review-settings-theme-options\">\n {REVIEW_THEME_OPTIONS.map((option) => (\n <button\n aria-pressed={reviewThemeDraft === option.value}\n className={`df-review-settings-theme-option${\n reviewThemeDraft === option.value ? ' is-active' : ''\n }`}\n key={option.value}\n type=\"button\"\n onClick={() => {\n onReviewThemeDraftChange(normalizeReviewTheme(option.value));\n onClearStatus();\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n <div className=\"df-review-settings-field\">\n <div className=\"df-review-settings-label-row\">\n <label htmlFor=\"df-review-figma-token\">Figma token</label>\n <button\n aria-controls={FIGMA_TOKEN_GUIDE_ID}\n aria-expanded={isFigmaTokenGuideOpen}\n aria-label=\"Show Figma token guide\"\n className={`df-review-settings-help-button${\n isFigmaTokenGuideOpen ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={onToggleFigmaTokenGuide}\n >\n <CircleHelpIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-settings-token-input\">\n <input\n id=\"df-review-figma-token\"\n aria-label=\"Figma token\"\n aria-describedby={\n isFigmaTokenGuideOpen ? FIGMA_TOKEN_GUIDE_ID : undefined\n }\n autoCapitalize=\"off\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n className={isFigmaTokenVisible ? undefined : 'is-token-masked'}\n data-1p-ignore=\"true\"\n data-lpignore=\"true\"\n inputMode=\"text\"\n name=\"df-review-figma-access-key\"\n spellCheck={false}\n type=\"text\"\n value={figmaTokenDraft}\n onChange={(event) => {\n onFigmaTokenDraftChange(event.target.value);\n onClearStatus();\n }}\n />\n <button\n aria-label={\n isFigmaTokenVisible\n ? 'Hide Figma token'\n : 'Show Figma token'\n }\n className=\"df-review-settings-token-toggle\"\n type=\"button\"\n onClick={onToggleFigmaTokenVisible}\n >\n {isFigmaTokenVisible ? (\n <EyeOffIcon aria-hidden=\"true\" />\n ) : (\n <EyeIcon aria-hidden=\"true\" />\n )}\n </button>\n </div>\n {isFigmaTokenGuideOpen && (\n <div\n className=\"df-review-settings-guide\"\n id={FIGMA_TOKEN_GUIDE_ID}\n >\n <ol>\n <li>Figma file browser에서 account menu를 열고 Settings로 이동</li>\n <li>Security 탭의 Personal access tokens로 이동</li>\n <li>Generate new token에서 이름과 scope를 정한 뒤 생성</li>\n <li>생성된 token을 복사해서 여기에 붙여넣기</li>\n </ol>\n </div>\n )}\n </div>\n <label className=\"df-review-settings-field\">\n <span>User ID</span>\n <div className=\"df-review-settings-text-input\">\n <input\n aria-label=\"Review user ID\"\n autoComplete=\"off\"\n spellCheck={false}\n type=\"text\"\n value={reviewUserIdDraft}\n onChange={(event) => {\n onReviewUserIdDraftChange(event.target.value);\n onClearStatus();\n }}\n />\n </div>\n </label>\n\n {figmaSettingsStatus && (\n <p className=\"df-review-settings-status\">{figmaSettingsStatus}</p>\n )}\n <div className=\"df-review-settings-actions\">\n <button\n type=\"button\"\n onClick={() => onSave('', '', DEFAULT_REVIEW_THEME)}\n >\n Clear\n </button>\n <span />\n <button type=\"button\" onClick={onClose}>\n Cancel\n </button>\n <button type=\"submit\">Save</button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n","import type {\n ReviewPresenceUser,\n ReviewShellPage,\n} from '../types';\n\nexport type SitemapQaCount = {\n local: number;\n remote: number;\n};\n\ntype SitemapTreeNode = {\n href: string;\n label: string;\n isPage: boolean;\n children: Map<string, SitemapTreeNode>;\n};\n\nexport type SitemapTreeRow = {\n href: string;\n label: string;\n prefix: string;\n isPage: boolean;\n isActive: boolean;\n qaCount: SitemapQaCount;\n users: ReviewPresenceUser[];\n};\n\nconst EMPTY_SITEMAP_QA_COUNT: SitemapQaCount = {\n local: 0,\n remote: 0,\n};\n\nconst normalizeSitemapHref = (href: string) => {\n const [path = '/'] = href.split(/[?#]/);\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n return normalizedPath || '/';\n};\n\nconst getSitemapSegments = (href: string) =>\n normalizeSitemapHref(href)\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean);\n\nconst createSitemapNode = (\n href: string,\n label: string,\n isPage = false\n): SitemapTreeNode => ({\n href,\n label,\n isPage,\n children: new Map(),\n});\n\nconst mergeSitemapUsers = (users: ReviewPresenceUser[]) => {\n const userByKey = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const key = user.sessionId || user.userId;\n const currentUser = userByKey.get(key);\n\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userByKey.set(key, user);\n }\n });\n\n return Array.from(userByKey.values());\n};\n\nconst addSitemapQaCounts = (\n first: SitemapQaCount,\n second: SitemapQaCount\n): SitemapQaCount => ({\n local: first.local + second.local,\n remote: first.remote + second.remote,\n});\n\nexport const createSitemapRows = (\n pages: ReviewShellPage[],\n activeRoute: string,\n pageQaCounts: ReadonlyMap<string, SitemapQaCount>,\n pagePresenceUsers: ReadonlyMap<string, ReviewPresenceUser[]>,\n getPageTarget: (href: string) => string\n) => {\n const root = createSitemapNode('/', '/', false);\n\n pages.forEach((page) => {\n const pageHref = page.href.startsWith('/') ? page.href : `/${page.href}`;\n const pathHref = normalizeSitemapHref(pageHref);\n const segments = getSitemapSegments(pathHref);\n\n if (segments.length === 0) {\n root.href = pageHref;\n root.isPage = true;\n return;\n }\n\n let parent = root;\n\n segments.forEach((segment, segmentIndex) => {\n const isLastSegment = segmentIndex === segments.length - 1;\n const segmentPath = `/${segments.slice(0, segmentIndex + 1).join('/')}`;\n const segmentHref = isLastSegment ? pageHref : `${segmentPath}/`;\n const segmentLabel = `${segment}${\n !isLastSegment || pathHref.endsWith('/') ? '/' : ''\n }`;\n const existingNode = parent.children.get(segment);\n const node =\n existingNode ?? createSitemapNode(segmentHref, segmentLabel, false);\n\n node.href = isLastSegment ? pageHref : node.href;\n node.label = isLastSegment ? segmentLabel : node.label;\n node.isPage = node.isPage || isLastSegment;\n parent.children.set(segment, node);\n parent = node;\n });\n });\n\n const getDirectCount = (node: SitemapTreeNode) => {\n if (!node.isPage) return EMPTY_SITEMAP_QA_COUNT;\n\n return pageQaCounts.get(getPageTarget(node.href)) ?? EMPTY_SITEMAP_QA_COUNT;\n };\n\n const getDirectUsers = (node: SitemapTreeNode) => {\n if (!node.isPage) return [];\n\n return pagePresenceUsers.get(getPageTarget(node.href)) ?? [];\n };\n\n const rows: SitemapTreeRow[] = [];\n\n const appendNodeRows = (\n node: SitemapTreeNode,\n depth: number,\n ancestorLastList: boolean[],\n isLastNode: boolean\n ): { count: SitemapQaCount; users: ReviewPresenceUser[] } => {\n const children = Array.from(node.children.values());\n const directCount = getDirectCount(node);\n const directUsers = getDirectUsers(node);\n let rowIndex: number | null = null;\n\n if (node.isPage || depth > 0) {\n const prefix =\n depth === 0\n ? ''\n : `${ancestorLastList.map((isLast) => (isLast ? ' ' : '│ ')).join('')}${\n isLastNode ? '└─ ' : '├─ '\n }`;\n const pageTarget = node.isPage ? getPageTarget(node.href) : null;\n\n rowIndex = rows.length;\n rows.push({\n href: node.href,\n label: node.label,\n prefix,\n isPage: node.isPage,\n isActive: pageTarget === activeRoute,\n qaCount: directCount,\n users: directUsers,\n });\n }\n\n const childAggregate = children.reduce(\n (aggregate, child, childIndex) => {\n const childResult = appendNodeRows(\n child,\n depth + 1,\n depth === 0 ? [] : [...ancestorLastList, isLastNode],\n childIndex === children.length - 1\n );\n\n return {\n count: addSitemapQaCounts(aggregate.count, childResult.count),\n users: mergeSitemapUsers([...aggregate.users, ...childResult.users]),\n };\n },\n { count: EMPTY_SITEMAP_QA_COUNT, users: [] as ReviewPresenceUser[] }\n );\n\n if (rowIndex !== null && !node.isPage) {\n rows[rowIndex] = {\n ...rows[rowIndex],\n qaCount: childAggregate.count,\n users: childAggregate.users,\n };\n }\n\n return {\n count: node.isPage\n ? addSitemapQaCounts(directCount, childAggregate.count)\n : childAggregate.count,\n users: mergeSitemapUsers([...directUsers, ...childAggregate.users]),\n };\n };\n\n if (root.isPage) {\n const directCount = getDirectCount(root);\n const directUsers = getDirectUsers(root);\n\n rows.push({\n href: root.href,\n label: root.label,\n prefix: '',\n isPage: true,\n isActive: getPageTarget(root.href) === activeRoute,\n qaCount: directCount,\n users: directUsers,\n });\n }\n\n Array.from(root.children.values()).forEach((node, index, siblings) => {\n appendNodeRows(node, 1, [], index === siblings.length - 1);\n });\n\n return rows;\n};\n","import type { CSSProperties } from 'react';\nimport type {\n ReviewPresenceUser,\n ReviewShellPage,\n} from '../types';\nimport {\n createSitemapRows,\n type SitemapQaCount,\n} from './tree';\n\ninterface SitemapModalProps {\n pages: ReviewShellPage[];\n activeRoute: string;\n pageQaCounts: ReadonlyMap<string, SitemapQaCount>;\n pagePresenceUsers: ReadonlyMap<string, ReviewPresenceUser[]>;\n getPageTarget: (href: string) => string;\n onClose: () => void;\n onSelectPage: (href: string) => void;\n}\n\nexport const SitemapModal = ({\n pages,\n activeRoute,\n pageQaCounts,\n pagePresenceUsers,\n getPageTarget,\n onClose,\n onSelectPage,\n}: SitemapModalProps) => {\n const sitemapRows = createSitemapRows(\n pages,\n activeRoute,\n pageQaCounts,\n pagePresenceUsers,\n getPageTarget\n );\n\n return (\n <div\n aria-label=\"Sitemap\"\n aria-modal=\"true\"\n className=\"df-review-sitemap-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close sitemap\"\n className=\"df-review-sitemap-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-sitemap-dialog\">\n <div className=\"df-review-sitemap-header\">\n <div>\n <strong>Sitemap</strong>\n <span>{pages.length} pages</span>\n </div>\n <button aria-label=\"Close sitemap\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n <div className=\"df-review-sitemap-list\">\n <div className=\"df-review-sitemap-table-head\" aria-hidden=\"true\">\n <span>Page</span>\n <span>Local</span>\n <span>Remote</span>\n <span>Online</span>\n </div>\n {sitemapRows.map((row) => {\n const rowClassName = [\n 'df-review-sitemap-row',\n row.isPage ? 'is-page' : 'is-folder',\n row.isActive ? 'is-active' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const rowContent = (\n <>\n <span className=\"df-review-sitemap-path\">\n <span className=\"df-review-sitemap-tree-prefix\">\n {row.prefix}\n </span>\n <span>{row.label}</span>\n </span>\n <span className=\"df-review-sitemap-cell is-local\">\n {row.qaCount.local}\n </span>\n <span className=\"df-review-sitemap-cell is-remote\">\n {row.qaCount.remote}\n </span>\n <span className=\"df-review-sitemap-cell is-online\">\n {row.users.length > 0 ? (\n <span className=\"df-review-sitemap-users\">\n {row.users.map((user) => (\n <span\n key={user.sessionId}\n className=\"df-review-sitemap-user\"\n style={{\n '--df-review-presence-color': user.color,\n } as CSSProperties}\n >\n {user.userId}\n </span>\n ))}\n </span>\n ) : (\n <span className=\"df-review-sitemap-online-empty\">0</span>\n )}\n </span>\n </>\n );\n\n if (!row.isPage) {\n return (\n <div\n key={row.href}\n aria-label={`${row.href} group / local ${row.qaCount.local} QA / remote ${row.qaCount.remote} QA / ${row.users.length} online`}\n className={rowClassName}\n role=\"row\"\n >\n {rowContent}\n </div>\n );\n }\n\n return (\n <button\n key={row.href}\n aria-label={`${row.href} / local ${row.qaCount.local} QA / remote ${row.qaCount.remote} QA / ${row.users.length} online`}\n className={rowClassName}\n type=\"button\"\n onClick={() => onSelectPage(row.href)}\n >\n {rowContent}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n","import { useEffect, useState } from 'react';\nimport type { ReviewItem } from '../../types';\n\ninterface QaItemEditModalProps {\n item: ReviewItem;\n onClose: () => void;\n onSave: (item: ReviewItem, comment: string) => Promise<void>;\n}\n\nexport const QaItemEditModal = ({\n item,\n onClose,\n onSave,\n}: QaItemEditModalProps) => {\n const [commentDraft, setCommentDraft] = useState(item.comment);\n const [error, setError] = useState('');\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setCommentDraft(item.comment);\n setError('');\n setIsSaving(false);\n }, [item.id, item.comment]);\n\n const saveComment = async () => {\n const nextComment = commentDraft.trim();\n if (!nextComment) {\n setError('Comment is required.');\n return;\n }\n\n setError('');\n setIsSaving(true);\n try {\n await onSave(item, nextComment);\n } catch (error) {\n setError(\n error instanceof Error ? error.message : 'Failed to update QA comment.'\n );\n setIsSaving(false);\n }\n };\n\n return (\n <div\n aria-modal=\"true\"\n className=\"df-review-edit-modal\"\n role=\"dialog\"\n aria-labelledby=\"df-review-edit-title\"\n >\n <button\n aria-label=\"Close edit dialog\"\n className=\"df-review-settings-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <form\n className=\"df-review-edit-dialog\"\n onSubmit={(event) => {\n event.preventDefault();\n void saveComment();\n }}\n >\n <header className=\"df-review-settings-header\">\n <div className=\"df-review-settings-title\">\n <strong id=\"df-review-edit-title\">Edit QA comment</strong>\n <span>Update the text shown on this QA item.</span>\n </div>\n <div className=\"df-review-settings-header-actions\">\n <button\n aria-label=\"Close edit dialog\"\n type=\"button\"\n onClick={onClose}\n >\n x\n </button>\n </div>\n </header>\n <div className=\"df-review-settings-body df-review-edit-body\">\n <label className=\"df-review-settings-field\">\n <span>Comment</span>\n <div className=\"df-review-settings-text-input df-review-edit-textarea\">\n <textarea\n autoFocus\n value={commentDraft}\n onChange={(event) => {\n setCommentDraft(event.target.value);\n if (error) setError('');\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onClose();\n }\n if (\n (event.metaKey || event.ctrlKey) &&\n event.key === 'Enter'\n ) {\n event.preventDefault();\n void saveComment();\n }\n }}\n />\n </div>\n </label>\n {error && <p className=\"df-review-edit-error\">{error}</p>}\n <footer className=\"df-review-settings-actions df-review-edit-actions\">\n <span />\n <button disabled={isSaving} type=\"button\" onClick={onClose}>\n Cancel\n </button>\n <button disabled={isSaving} type=\"submit\">\n {isSaving ? 'Saving…' : 'Save'}\n </button>\n </footer>\n </div>\n </form>\n </div>\n );\n};\n","import {\n ExternalLink as ExternalLinkIcon,\n Upload as UploadIcon,\n} from 'lucide-react';\nimport type { NumberedReviewItem, ReviewItem } from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\n\ninterface QaItemRemoteActionsProps {\n isRemoteSource: boolean;\n isSubmitted: boolean;\n isSubmitting: boolean;\n item: ReviewItem;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n}\n\nexport const QaItemRemoteActions = ({\n isRemoteSource,\n isSubmitted,\n isSubmitting,\n item,\n numberedItem,\n remoteAdapterEntry,\n onSubmitItem,\n}: QaItemRemoteActionsProps) => {\n const canSubmitToRemote = !isRemoteSource && Boolean(remoteAdapterEntry);\n const canOpenRemoteIssue = !isRemoteSource && Boolean(item.externalIssueUrl);\n const hasRemoteActions = canSubmitToRemote || canOpenRemoteIssue;\n\n if (!hasRemoteActions) return null;\n\n return (\n <div\n className=\"df-review-item-remote-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canSubmitToRemote && remoteAdapterEntry && (\n <button\n aria-label=\"Submit to remote\"\n className=\"df-review-item-action-button df-review-item-submit-button\"\n disabled={isSubmitted || isSubmitting}\n type=\"button\"\n onClick={() => void onSubmitItem(numberedItem)}\n >\n <UploadIcon aria-hidden=\"true\" />\n <span>\n {isSubmitted\n ? 'Submitted'\n : isSubmitting\n ? 'Submitting'\n : 'Submit'}\n </span>\n </button>\n )}\n {canOpenRemoteIssue && (\n <a\n aria-label=\"Open remote issue\"\n className=\"df-review-item-action-button\"\n href={item.externalIssueUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n )}\n </div>\n );\n};\n","import type { ReviewItemStatus, ReviewWorkflowStatus } from './types';\n\nexport const REVIEW_WORKFLOW_STATUS_OPTIONS: Array<{\n value: ReviewWorkflowStatus;\n label: string;\n}> = [\n { value: 'todo', label: 'Todo' },\n { value: 'doing', label: 'Doing' },\n { value: 'review', label: 'Review' },\n { value: 'hold', label: 'Hold' },\n { value: 'done', label: 'Done' },\n];\n\nexport function normalizeReviewItemStatus(\n status: ReviewItemStatus | undefined\n): ReviewWorkflowStatus {\n if (status === 'resolved') return 'done';\n if (status === 'open' || !status) return 'todo';\n return status;\n}\n\nexport function matchesReviewItemStatus(\n itemStatus: ReviewItemStatus | undefined,\n queryStatus: ReviewItemStatus\n) {\n return (\n normalizeReviewItemStatus(itemStatus) === normalizeReviewItemStatus(queryStatus)\n );\n}\n","import { normalizeReviewItemStatus } from '../../status';\nimport type { ReviewItem, ReviewItemStatus } from '../../types';\nimport type { ReviewShellStatusOption } from '../types';\n\ninterface QaItemStatusActionsProps {\n canUpdateStatus: boolean;\n item: ReviewItem;\n statusOptions: readonly ReviewShellStatusOption[];\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n}\n\nconst getStatusOption = (\n status: ReviewItemStatus,\n statusOptions: readonly ReviewShellStatusOption[]\n) => {\n const normalizedStatus = normalizeReviewItemStatus(status);\n return (\n statusOptions.find((statusOption) => statusOption.value === status) ??\n statusOptions.find(\n (statusOption) => statusOption.value === normalizedStatus\n ) ??\n statusOptions[0]\n );\n};\n\nexport const QaItemStatusActions = ({\n canUpdateStatus,\n item,\n statusOptions,\n onChangeItemStatus,\n}: QaItemStatusActionsProps) => {\n const currentStatusOption = getStatusOption(item.status, statusOptions);\n if (!currentStatusOption) return null;\n const statusClassName = `is-status-${normalizeReviewItemStatus(\n currentStatusOption.value\n )}`;\n\n return (\n <div\n className=\"df-review-item-status-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canUpdateStatus ? (\n <select\n aria-label=\"QA status\"\n className={`df-review-item-status-select ${statusClassName}`}\n value={currentStatusOption.value}\n onChange={(event) =>\n void onChangeItemStatus(\n item,\n event.currentTarget.value as ReviewItemStatus\n )\n }\n >\n {statusOptions.map((statusOption) => (\n <option key={statusOption.value} value={statusOption.value}>\n {statusOption.label}\n </option>\n ))}\n </select>\n ) : (\n <span className={`df-review-item-status-badge ${statusClassName}`}>\n {currentStatusOption.label}\n </span>\n )}\n </div>\n );\n};\n","import type { ReviewItem } from '../types';\n\nexport const isAnchorRestorableReviewItem = (item: ReviewItem) =>\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && item.selection));\n\nexport const queryReviewItemAnchorElement = (\n targetDocument: Document,\n item: ReviewItem\n) => {\n const anchor = item.anchor;\n if (!anchor || !isAnchorRestorableReviewItem(item)) return undefined;\n\n const expectedRect = getReviewItemExpectedDocumentRect(item);\n const candidates = [anchor, ...(anchor.candidates ?? [])].filter(\n (candidate) => Boolean(candidate.selector)\n );\n const matches: Array<{\n element: Element;\n score: number;\n }> = [];\n\n candidates.forEach((candidate, index) => {\n try {\n targetDocument.querySelectorAll(candidate.selector).forEach((element) => {\n if (!isScrollableReviewAnchorElement(element)) return;\n\n matches.push({\n element,\n score: getReviewAnchorMatchScore(\n element,\n expectedRect,\n candidate.textFingerprint ?? anchor.textFingerprint,\n index\n )\n });\n });\n } catch {\n return;\n }\n });\n\n return matches.sort((a, b) => a.score - b.score)[0]?.element;\n};\n\nexport const getReviewItemRestoreScrollPosition = (\n targetWindow: Window,\n targetDocument: Document,\n item: ReviewItem,\n anchorElement?: Element\n) => {\n if (anchorElement) {\n const rect = anchorElement.getBoundingClientRect();\n return clampDocumentScrollPosition(targetDocument, {\n left:\n targetWindow.scrollX +\n rect.left -\n Math.max(0, (targetWindow.innerWidth - rect.width) / 2),\n top:\n targetWindow.scrollY +\n rect.top -\n Math.max(0, (targetWindow.innerHeight - rect.height) / 2)\n });\n }\n\n return clampDocumentScrollPosition(targetDocument, {\n left: item.scroll?.x ?? 0,\n top: item.scroll?.y ?? 0\n });\n};\n\nexport const setDocumentScrollInstantly = (\n targetWindow: Window,\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = position.left;\n scrollElement.scrollTop = position.top;\n return;\n }\n\n targetWindow.scrollTo(position.left, position.top);\n};\n\nexport const getReviewItemExpectedDocumentRect = (item: ReviewItem) => {\n const scroll = item.scroll ?? { x: 0, y: 0 };\n const selection = item.selection?.viewport;\n if (\n selection &&\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n ) {\n return {\n left: scroll.x + selection.x,\n top: scroll.y + selection.y,\n width: selection.width,\n height: selection.height\n };\n }\n\n const marker = item.marker?.viewport;\n if (marker && typeof marker.x === 'number' && typeof marker.y === 'number') {\n return {\n left: scroll.x + marker.x,\n top: scroll.y + marker.y,\n width: 1,\n height: 1\n };\n }\n\n return undefined;\n};\n\nexport const getReviewAnchorMatchScore = (\n element: Element,\n expectedRect:\n | {\n left: number;\n top: number;\n width: number;\n height: number;\n }\n | undefined,\n textFingerprint: string | undefined,\n candidateIndex: number\n) => {\n const rect = getElementDocumentRect(element);\n let score = candidateIndex * 25;\n\n if (expectedRect) {\n score += Math.abs(rect.top - expectedRect.top);\n score += Math.abs(rect.left - expectedRect.left) * 0.25;\n score += Math.abs(rect.width - expectedRect.width) * 0.1;\n score += Math.abs(rect.height - expectedRect.height) * 0.1;\n }\n\n if (textFingerprint) {\n score +=\n (1 - getReviewTextFingerprintScore(textFingerprint, element)) * 100;\n }\n\n return score;\n};\n\nexport const getElementDocumentRect = (element: Element) => {\n const rect = element.getBoundingClientRect();\n const view = element.ownerDocument.defaultView;\n\n return {\n left: rect.left + (view?.scrollX ?? 0),\n top: rect.top + (view?.scrollY ?? 0),\n width: rect.width,\n height: rect.height\n };\n};\n\nconst clampDocumentScrollPosition = (\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement;\n const view = targetDocument.defaultView;\n const maxLeft = Math.max(\n 0,\n (scrollElement?.scrollWidth ?? 0) - (view?.innerWidth ?? 0)\n );\n const maxTop = Math.max(\n 0,\n (scrollElement?.scrollHeight ?? 0) - (view?.innerHeight ?? 0)\n );\n\n return {\n left: Math.min(Math.max(0, Math.round(position.left)), maxLeft),\n top: Math.min(Math.max(0, Math.round(position.top)), maxTop)\n };\n};\n\nexport const getReviewTextFingerprintScore = (expected: string, element: Element) => {\n const actual = element.textContent?.replace(/\\s+/g, ' ').trim();\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getReviewFingerprintTokens(expected);\n const actualTokens = new Set(getReviewFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return Math.min(Math.max(matches.length / expectedTokens.length, 0.25), 0.76);\n};\n\nexport const getReviewFingerprintTokens = (value: string) =>\n value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n\nexport const isScrollableReviewAnchorElement = (element: Element) => {\n const id = element.id.trim().toLowerCase();\n if (\n element === element.ownerDocument.body ||\n element === element.ownerDocument.documentElement ||\n ['app', 'main', 'page', 'root', '__next', '__nuxt'].includes(id)\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n const viewportHeight = element.ownerDocument.documentElement.clientHeight;\n const scrollHeight = element.ownerDocument.documentElement.scrollHeight;\n return !(\n scrollHeight > viewportHeight * 1.5 && rect.height > viewportHeight * 3\n );\n};\n","import {\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n Scan as ScanIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n StickyNote as StickyNoteIcon,\n} from 'lucide-react';\nimport type { ReviewItem, ReviewItemScope } from '../../types';\nimport { isAnchorRestorableReviewItem } from '../anchor.restore';\n\nexport const ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nexport const getReviewItemMode = (item: ReviewItem) =>\n isAnchorRestorableReviewItem(item) ? 'dom' : item.kind;\n\nexport const ReviewItemModeIcon = ({\n mode,\n}: {\n mode: ReturnType<typeof getReviewItemMode>;\n}) => {\n if (mode === 'area') return <ScanIcon aria-hidden=\"true\" />;\n if (mode === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <StickyNoteIcon aria-hidden=\"true\" />;\n};\n","import type { DomSourceHint } from '../types';\n\nconst SOURCE_SELECTOR = [\n '[data-wrk-source-file]',\n '[data-wrk-source-component]',\n '[data-wrk-source-line]',\n '[data-wrk-source-column]',\n '[data-file]',\n '[data-component]',\n '[data-section-index]',\n '[data-section-id]',\n].join(', ');\n\nexport const getSourceHintElement = (target: EventTarget | null) => {\n return getEventElement(target)?.closest(SOURCE_SELECTOR) ?? null;\n};\n\nexport const getElementSourceHint = (\n target: EventTarget | null\n): DomSourceHint | undefined => {\n const sourceElement = getSourceHintElement(target);\n if (!sourceElement) return undefined;\n\n const source: DomSourceHint = {\n component: getSourceAttribute(\n sourceElement,\n 'data-wrk-source-component',\n 'data-component'\n ),\n file: getSourceAttribute(sourceElement, 'data-wrk-source-file', 'data-file'),\n line: getSourceAttribute(sourceElement, 'data-wrk-source-line'),\n column: getSourceAttribute(sourceElement, 'data-wrk-source-column'),\n sectionId: getSourceAttribute(sourceElement, 'data-section-id'),\n sectionIndex: getSourceAttribute(sourceElement, 'data-section-index'),\n };\n\n return Object.values(source).some(Boolean) ? source : undefined;\n};\n\nexport const getSourceOpenUrl = (\n source: DomSourceHint | undefined,\n sourceRoot?: string\n) => {\n const file = source?.file?.trim();\n if (!file) return null;\n\n const sourcePath = getSourcePath(file, sourceRoot);\n if (!sourcePath) return null;\n\n const line = getSourcePosition(source?.line);\n const column = getSourcePosition(source?.column);\n const encodedPath = encodeURI(sourcePath).replace(/[#?]/g, (match) =>\n match === '#' ? '%23' : '%3F'\n );\n\n return `vscode://file/${encodedPath}:${line}:${column}`;\n};\n\nexport const openSourceInEditor = (\n source: DomSourceHint | undefined,\n sourceRoot?: string\n) => {\n const url = getSourceOpenUrl(source, sourceRoot);\n if (!url) return false;\n\n window.open(url, '_blank', 'noreferrer');\n return true;\n};\n\nfunction getSourceAttribute(element: Element, ...names: string[]) {\n for (const name of names) {\n const value = element.getAttribute(name)?.trim();\n if (value) return value;\n }\n\n return undefined;\n}\n\nfunction getEventElement(target: EventTarget | null): Element | null {\n if (!target || typeof target !== 'object') return null;\n\n const node = target as {\n closest?: (selector: string) => Element | null;\n nodeType?: number;\n parentElement?: Element | null;\n };\n\n if (node.nodeType === 1 && typeof node.closest === 'function') {\n return node as Element;\n }\n\n if (node.parentElement && typeof node.parentElement.closest === 'function') {\n return node.parentElement;\n }\n\n return null;\n}\n\nfunction getSourcePath(file: string, sourceRoot?: string) {\n const normalizedFile = file.replace(/\\\\/g, '/');\n if (normalizedFile.startsWith('/') || /^[a-zA-Z]:\\//.test(normalizedFile)) {\n return normalizedFile;\n }\n\n const normalizedRoot = sourceRoot\n ?.trim()\n .replace(/\\\\/g, '/')\n .replace(/\\/+$/, '');\n if (!normalizedRoot) return null;\n\n return `${normalizedRoot}/${normalizedFile.replace(/^\\/+/, '')}`;\n}\n\nfunction getSourcePosition(value: string | undefined) {\n const position = Number(value);\n return Number.isInteger(position) && position > 0 ? position : 1;\n}\n","import {\n Copy as CopyIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n FileCode2 as FileCode2Icon,\n Pencil as PencilIcon,\n X as XIcon,\n} from 'lucide-react';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { getItemTitle } from '../prompt/prompt';\nimport { QaItemRemoteActions } from './item.remote.actions';\nimport { QaItemStatusActions } from './item.status.actions';\nimport {\n getReviewItemMode,\n ReviewItemModeIcon,\n ReviewScopeIcon,\n} from '../review/item.icons';\nimport { getSourceOpenUrl } from '../source.open';\nimport type { ReviewShellViewportKind } from '../types';\n\ninterface QaItemCardProps {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n currentPresetScope: ReviewShellViewportKind;\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n isOverlayVisible: boolean;\n isRemoteSource: boolean;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n copiedPromptKey: string | null;\n selectedItemId: string | null;\n sourceRoot?: string;\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onRemoveItem: (item: ReviewItem) => Promise<void>;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onEditItem: (item: ReviewItem) => void;\n onRestoreReviewItem: (item: ReviewItem) => void;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n onToggleItemOverlayVisibility: (itemId: string) => void;\n}\n\nconst formatItemCardDate = (value: string) => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return new Intl.DateTimeFormat('en', {\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n month: 'short',\n }).format(date);\n};\n\nexport const QaItemCard = ({\n activeAdapterEntry,\n currentPresetScope,\n getItemPresetScope,\n isOverlayVisible,\n isRemoteSource,\n numberedItem,\n remoteAdapterEntry,\n copiedPromptKey,\n selectedItemId,\n sourceRoot,\n onChangeItemStatus,\n onClearSelectedItem,\n onRemoveItem,\n onCopyItemPrompt,\n onEditItem,\n onRestoreReviewItem,\n onSubmitItem,\n onToggleItemOverlayVisibility,\n}: QaItemCardProps) => {\n const { item } = numberedItem;\n const itemMode = getReviewItemMode(item);\n const isSubmitted = item.submitStatus === 'submitted';\n const isSubmitting = item.submitStatus === 'submitting';\n const canRemoveItem =\n activeAdapterEntry.canRemove &&\n !isSubmitting &&\n (isRemoteSource || !isSubmitted);\n const itemComment = item.comment.trim() || getItemTitle(item);\n const itemAuthor = item.createdBy?.trim();\n const promptCopyKey = `qa:${item.id}`;\n const isPromptCopied = copiedPromptKey === promptCopyKey;\n const statusOptions = activeAdapterEntry.statusOptions;\n const isActive = item.id === selectedItemId;\n const canUpdateStatus =\n Boolean(activeAdapterEntry.updateStatus) &&\n statusOptions.length > 0 &&\n !isSubmitting;\n const canEditItem = activeAdapterEntry.canUpdate && !isSubmitting;\n const itemMeta = [formatItemCardDate(item.createdAt), itemAuthor]\n .filter(Boolean)\n .join(' | ');\n const sourceOpenUrl = getSourceOpenUrl(item.anchor?.source, sourceRoot);\n\n return (\n <article\n className={`df-review-item-card${isActive ? ' is-active' : ''}${\n getItemPresetScope(item) !== currentPresetScope ? ' is-dim' : ''\n }${isOverlayVisible ? '' : ' is-overlay-hidden'}`}\n onClick={() => {\n if (isActive) {\n onClearSelectedItem();\n return;\n }\n\n onRestoreReviewItem(item);\n }}\n >\n <div className=\"df-review-item-header\">\n <div className=\"df-review-item-main\">\n <span className=\"df-review-item-badges\">\n <span className=\"df-review-item-id\">\n {numberedItem.displayLabel}\n </span>\n <span\n className={`df-review-item-scope is-scope-${numberedItem.scope}`}\n >\n <ReviewScopeIcon scope={numberedItem.scope} />\n {numberedItem.label}\n </span>\n <span className={`df-review-item-mode is-mode-${itemMode}`}>\n <ReviewItemModeIcon mode={itemMode} />\n {itemMode}\n </span>\n </span>\n <strong className=\"df-review-item-comment\">{itemComment}</strong>\n <small className=\"df-review-item-meta\">{itemMeta}</small>\n {item.submitError && (\n <small className=\"df-review-item-error\">{item.submitError}</small>\n )}\n </div>\n <div\n className=\"df-review-item-header-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n <button\n aria-label={isOverlayVisible ? 'Hide QA overlay' : 'Show QA overlay'}\n className={`df-review-item-visibility${\n isOverlayVisible ? ' is-visible' : ' is-hidden'\n }`}\n type=\"button\"\n onClick={() => onToggleItemOverlayVisibility(item.id)}\n >\n {isOverlayVisible ? (\n <EyeIcon aria-hidden=\"true\" />\n ) : (\n <EyeOffIcon aria-hidden=\"true\" />\n )}\n </button>\n {sourceOpenUrl && (\n <a\n aria-label=\"Open source in VS Code\"\n className=\"df-review-item-source-open\"\n href={sourceOpenUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n title=\"Open source in VS Code\"\n >\n <FileCode2Icon aria-hidden=\"true\" />\n </a>\n )}\n <button\n aria-label={isPromptCopied ? 'Copied QA prompt' : 'Copy QA prompt'}\n className={`df-review-item-prompt-copy${\n isPromptCopied ? ' is-copied' : ''\n }`}\n title={isPromptCopied ? 'Copied QA prompt' : 'Copy QA prompt'}\n type=\"button\"\n onClick={() => onCopyItemPrompt(numberedItem)}\n >\n <CopyIcon aria-hidden=\"true\" />\n </button>\n {canEditItem && (\n <button\n aria-label=\"Edit QA comment\"\n className=\"df-review-item-edit\"\n title=\"Edit QA comment\"\n type=\"button\"\n onClick={() => onEditItem(item)}\n >\n <PencilIcon aria-hidden=\"true\" />\n </button>\n )}\n {canRemoveItem && (\n <button\n aria-label=\"Delete QA\"\n className=\"df-review-item-delete\"\n type=\"button\"\n onClick={() => void onRemoveItem(item)}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n <div className=\"df-review-item-actions\">\n <QaItemStatusActions\n canUpdateStatus={canUpdateStatus}\n item={item}\n statusOptions={statusOptions}\n onChangeItemStatus={onChangeItemStatus}\n />\n <QaItemRemoteActions\n isRemoteSource={isRemoteSource}\n isSubmitted={isSubmitted}\n isSubmitting={isSubmitting}\n item={item}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n onSubmitItem={onSubmitItem}\n />\n </div>\n </article>\n );\n};\n","import type { CSSProperties } from 'react';\nimport { Users as UsersIcon } from 'lucide-react';\nimport type { ReviewPresenceUser } from '../types';\n\ninterface PresenceRowProps {\n presenceSessionId: string;\n users: ReviewPresenceUser[];\n}\n\nexport const PresenceRow = ({\n presenceSessionId,\n users,\n}: PresenceRowProps) => {\n if (users.length === 0) return null;\n\n return (\n <div aria-label=\"Review presence\" className=\"df-review-presence-row\">\n <span className=\"df-review-presence-label\">\n <UsersIcon aria-hidden=\"true\" />\n online {users.length}\n </span>\n <div className=\"df-review-presence-list\">\n {users.map((user) => (\n <span\n key={user.sessionId}\n className={`df-review-presence-chip${\n user.sessionId === presenceSessionId ? ' is-self' : ''\n }`}\n style={\n {\n '--df-review-presence-color': user.color,\n } as CSSProperties\n }\n >\n <span className=\"df-review-presence-dot\" aria-hidden=\"true\" />\n <span className=\"df-review-presence-name\">{user.userId}</span>\n </span>\n ))}\n </div>\n </div>\n );\n};\n","import {\n ListFilter as ListFilterIcon,\n RefreshCw as RefreshCwIcon,\n} from 'lucide-react';\nimport type { ReviewSource } from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { REVIEW_QA_FILTERS } from '../constants';\nimport { PresenceRow } from '../presence/row';\nimport { ReviewScopeIcon } from '../review/item.icons';\nimport type { ReviewPresenceUser, ReviewQaFilter } from '../types';\n\ninterface QaPanelHeaderProps {\n activeItemCount: number;\n currentPagePresenceUsers: ReviewPresenceUser[];\n filteredItemCount: number;\n label: ReviewSource;\n presenceSessionId: string;\n qaFilter: ReviewQaFilter;\n qaFilterCounts: ReadonlyMap<ReviewQaFilter, number>;\n showSourceSelect: boolean;\n source: ReviewSource;\n sourceEntries: NormalizedReviewShellAdapter[];\n onChangeReviewSource: (nextSource: ReviewSource) => void;\n onQaFilterChange: (filter: ReviewQaFilter) => void;\n onRefreshReviewData: () => Promise<void>;\n}\n\nexport const QaPanelHeader = ({\n activeItemCount,\n currentPagePresenceUsers,\n filteredItemCount,\n label,\n presenceSessionId,\n qaFilter,\n qaFilterCounts,\n showSourceSelect,\n source,\n sourceEntries,\n onChangeReviewSource,\n onQaFilterChange,\n onRefreshReviewData,\n}: QaPanelHeaderProps) => {\n return (\n <div className=\"df-review-list-header\">\n <div className=\"df-review-list-toolbar\">\n <div className=\"df-review-list-controls\">\n {showSourceSelect && (\n <select\n aria-label=\"QA source\"\n className=\"df-review-source-select\"\n value={source}\n onChange={(event) =>\n onChangeReviewSource(event.currentTarget.value as ReviewSource)\n }\n >\n {sourceEntries.map((entry) => (\n <option key={entry.label} value={entry.label}>\n {entry.label}\n </option>\n ))}\n </select>\n )}\n <button\n aria-label=\"Refresh QA\"\n className=\"df-review-source-refresh\"\n type=\"button\"\n onClick={() => void onRefreshReviewData()}\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-filter-tabs\" aria-label=\"QA filters\">\n {REVIEW_QA_FILTERS.map((filter) => {\n const count = qaFilterCounts.get(filter.key) ?? 0;\n const isActive = qaFilter === filter.key;\n\n return (\n <button\n key={filter.key}\n aria-label={`${filter.label} QA (${count})`}\n aria-pressed={isActive}\n className={`df-review-filter-tab${\n isActive ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onQaFilterChange(filter.key)}\n >\n <span className=\"df-review-filter-icon\">\n {filter.scope ? (\n <ReviewScopeIcon scope={filter.scope} />\n ) : (\n <ListFilterIcon aria-hidden=\"true\" />\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"df-review-list-title\">\n <span>{label} QA</span>\n <strong>\n {filteredItemCount}\n {qaFilter === 'all' ? '' : `/${activeItemCount}`}\n </strong>\n </div>\n <PresenceRow\n presenceSessionId={presenceSessionId}\n users={currentPagePresenceUsers}\n />\n </div>\n );\n};\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewSource,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { QaItemCard } from './item.card';\nimport { QaPanelHeader } from './panel.header';\nimport type {\n ReviewPresenceUser,\n ReviewQaFilter,\n ReviewShellViewportKind,\n} from '../types';\n\ninterface ReviewQaPanelProps {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n activeItems: ReviewItem[];\n currentPagePresenceUsers: ReviewPresenceUser[];\n currentPresetScope: ReviewShellViewportKind;\n filteredNumberedActiveItems: NumberedReviewItem[];\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n hiddenOverlayItemIds: ReadonlySet<string>;\n isListVisible: boolean;\n isRemoteSource: boolean;\n presenceSessionId: string;\n copiedPromptKey: string | null;\n qaFilter: ReviewQaFilter;\n qaFilterCounts: ReadonlyMap<ReviewQaFilter, number>;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n selectedItemId: string | null;\n showSourceSelect: boolean;\n sourceRoot?: string;\n source: ReviewSource;\n sourceEntries: NormalizedReviewShellAdapter[];\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onChangeReviewSource: (nextSource: ReviewSource) => void;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onEditItem: (item: ReviewItem) => void;\n onQaFilterChange: (filter: ReviewQaFilter) => void;\n onRefreshReviewData: () => Promise<void>;\n onRemoveItem: (item: ReviewItem) => Promise<void>;\n onRestoreReviewItem: (item: ReviewItem) => void;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n onToggleItemOverlayVisibility: (itemId: string) => void;\n}\n\nexport const ReviewQaPanel = ({\n activeAdapterEntry,\n activeItems,\n currentPagePresenceUsers,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIds,\n isListVisible,\n isRemoteSource,\n presenceSessionId,\n copiedPromptKey,\n qaFilter,\n qaFilterCounts,\n remoteAdapterEntry,\n selectedItemId,\n showSourceSelect,\n sourceRoot,\n source,\n sourceEntries,\n onChangeItemStatus,\n onClearSelectedItem,\n onChangeReviewSource,\n onCopyItemPrompt,\n onEditItem,\n onQaFilterChange,\n onRefreshReviewData,\n onRemoveItem,\n onRestoreReviewItem,\n onSubmitItem,\n onToggleItemOverlayVisibility,\n}: ReviewQaPanelProps) => {\n return (\n <aside className=\"df-review-qa-panel\" aria-hidden={!isListVisible}>\n <div className=\"df-review-panel-body\">\n <section className=\"df-review-item-list\">\n <QaPanelHeader\n activeItemCount={activeItems.length}\n currentPagePresenceUsers={currentPagePresenceUsers}\n filteredItemCount={filteredNumberedActiveItems.length}\n label={activeAdapterEntry.label}\n presenceSessionId={presenceSessionId}\n qaFilter={qaFilter}\n qaFilterCounts={qaFilterCounts}\n showSourceSelect={showSourceSelect}\n source={source}\n sourceEntries={sourceEntries}\n onChangeReviewSource={onChangeReviewSource}\n onQaFilterChange={onQaFilterChange}\n onRefreshReviewData={onRefreshReviewData}\n />\n <div\n className=\"df-review-list-scroll\"\n onClick={(event) => {\n if (event.target === event.currentTarget) {\n onClearSelectedItem();\n }\n }}\n >\n {activeItems.length === 0 && (\n <p className=\"df-review-empty\">\n {isRemoteSource\n ? `No ${activeAdapterEntry.label} QA on this page.`\n : 'No QA on this page.'}\n </p>\n )}\n {activeItems.length > 0 &&\n filteredNumberedActiveItems.length === 0 && (\n <p className=\"df-review-empty\">No QA in this filter.</p>\n )}\n {filteredNumberedActiveItems.map((numberedItem) => {\n const { item } = numberedItem;\n\n return (\n <QaItemCard\n key={item.id}\n activeAdapterEntry={activeAdapterEntry}\n currentPresetScope={currentPresetScope}\n getItemPresetScope={getItemPresetScope}\n isOverlayVisible={!hiddenOverlayItemIds.has(item.id)}\n isRemoteSource={isRemoteSource}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n copiedPromptKey={copiedPromptKey}\n selectedItemId={selectedItemId}\n sourceRoot={sourceRoot}\n onChangeItemStatus={onChangeItemStatus}\n onClearSelectedItem={onClearSelectedItem}\n onCopyItemPrompt={onCopyItemPrompt}\n onEditItem={onEditItem}\n onRemoveItem={onRemoveItem}\n onRestoreReviewItem={onRestoreReviewItem}\n onSubmitItem={onSubmitItem}\n onToggleItemOverlayVisibility={onToggleItemOverlayVisibility}\n />\n );\n })}\n </div>\n </section>\n </div>\n </aside>\n );\n};\n","import {\n Scan as ScanIcon,\n SquareMousePointer as SquareMousePointerIcon,\n} from 'lucide-react';\nimport type { ReviewMode } from '../../types';\n\ninterface ReviewModeToolbarProps {\n canWriteArea: boolean;\n canWriteDom: boolean;\n mode: ReviewMode;\n onSetReviewMode: (mode: ReviewMode) => void;\n}\n\nexport const ReviewModeToolbar = ({\n canWriteArea,\n canWriteDom,\n mode,\n onSetReviewMode,\n}: ReviewModeToolbarProps) => {\n if (!canWriteDom && !canWriteArea) return null;\n\n return (\n <div className=\"df-review-mode\" aria-label=\"Add QA\">\n {canWriteDom && (\n <button\n aria-label=\"Element\"\n className={`df-review-mode-button is-element${\n mode === 'element' ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onSetReviewMode('element')}\n >\n <SquareMousePointerIcon aria-hidden=\"true\" />\n </button>\n )}\n {canWriteDom && canWriteArea && (\n <span className=\"df-review-mode-divider\" aria-hidden=\"true\">\n |\n </span>\n )}\n {canWriteArea && (\n <button\n aria-label=\"Area\"\n className={`df-review-mode-button is-area${\n mode === 'area' ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onSetReviewMode('area')}\n >\n <ScanIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n};\n","import type { CSSProperties } from 'react';\nimport type { ReviewRulerPoint, ReviewShellViewportPreset } from '../types';\n\ninterface RulerGuttersProps {\n rulerHover: ReviewRulerPoint | null;\n rulerScaleX: number;\n rulerScaleY: number;\n rulerUnit: string;\n size: ReviewShellViewportPreset;\n}\n\nexport const RulerGutters = ({\n rulerHover,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n size,\n}: RulerGuttersProps) => {\n return (\n <>\n <div className=\"df-review-ruler-corner\" aria-hidden=\"true\" />\n <div\n className=\"df-review-ruler-gutter is-x\"\n style={\n {\n '--df-review-ruler-step-x': `${rulerScaleX * 20}px`,\n } as CSSProperties\n }\n >\n <div className=\"df-review-ruler-frame-label\">\n <strong>{size.label}</strong>\n <span>\n {size.designWidth}\n {size.designHeight ? `x${size.designHeight}` : ''}\n {rulerUnit}\n </span>\n </div>\n {rulerHover && (\n <div\n className=\"df-review-ruler-coord is-x\"\n style={{ left: `${rulerHover.x}px` }}\n >\n {Math.round(rulerHover.x / rulerScaleX)}\n </div>\n )}\n </div>\n <div\n className=\"df-review-ruler-gutter is-y\"\n style={\n {\n '--df-review-ruler-step-y': `${rulerScaleY * 20}px`,\n } as CSSProperties\n }\n >\n {rulerHover && (\n <div\n className=\"df-review-ruler-coord is-y\"\n style={{ top: `${rulerHover.y}px` }}\n >\n {Math.round(rulerHover.y / rulerScaleY)}\n </div>\n )}\n </div>\n </>\n );\n};\n","import type { RefObject } from 'react';\nimport type {\n ReviewRulerMeasure,\n ReviewRulerPoint,\n ReviewShellViewportPreset,\n} from '../types';\n\ninterface RulerOverlayProps {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerDragging: boolean;\n rulerHover: ReviewRulerPoint | null;\n rulerMeasure: ReviewRulerMeasure | undefined;\n rulerMeasureLabel: string;\n rulerOverlayRef: RefObject<HTMLDivElement | null>;\n size: ReviewShellViewportPreset;\n}\n\nexport const RulerOverlay = ({\n iframeRef,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n size,\n}: RulerOverlayProps) => {\n return (\n <div\n ref={rulerOverlayRef}\n aria-label=\"Ruler\"\n className={`df-review-ruler-overlay${\n isRulerDragging ? ' is-dragging' : ''\n }`}\n role=\"application\"\n onWheel={(event) => {\n iframeRef.current?.contentWindow?.scrollBy(\n event.deltaX,\n event.deltaY\n );\n }}\n >\n {rulerHover && (\n <>\n <div\n className=\"df-review-ruler-guide is-x\"\n aria-hidden=\"true\"\n style={{ top: `${rulerHover.y}px` }}\n />\n <div\n className=\"df-review-ruler-guide is-y\"\n aria-hidden=\"true\"\n style={{ left: `${rulerHover.x}px` }}\n />\n </>\n )}\n {rulerMeasure &&\n (rulerMeasure.width > 0 || rulerMeasure.height > 0) && (\n <>\n <div\n className=\"df-review-ruler-selection\"\n aria-hidden=\"true\"\n style={{\n left: `${rulerMeasure.left}px`,\n top: `${rulerMeasure.top}px`,\n width: `${rulerMeasure.width}px`,\n height: `${rulerMeasure.height}px`,\n }}\n />\n <div\n className=\"df-review-ruler-label\"\n style={{\n left: `${Math.min(\n Math.max(rulerMeasure.left + rulerMeasure.width + 8, 8),\n Math.max(8, size.width - 164)\n )}px`,\n top: `${Math.min(\n Math.max(rulerMeasure.top + rulerMeasure.height + 8, 8),\n Math.max(8, size.height - 34)\n )}px`,\n }}\n >\n {rulerMeasureLabel}\n </div>\n </>\n )}\n </div>\n );\n};\n","import type { RefObject } from 'react';\nimport type { ReviewMode } from '../../types';\nimport type {\n ReviewRulerMeasure,\n ReviewRulerPoint,\n ReviewShellViewportPreset,\n} from '../types';\nimport { ReviewModeToolbar } from '../review/mode.toolbar';\nimport { RulerGutters } from '../ruler/gutters';\nimport { RulerOverlay } from '../ruler/overlay';\n\ninterface ReviewTargetFrameProps {\n canWriteArea: boolean;\n canWriteDom: boolean;\n frameScrollRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerAvailable: boolean;\n isRulerDragging: boolean;\n isRulerVisible: boolean;\n mode: ReviewMode;\n rulerHover: ReviewRulerPoint | null;\n rulerMeasure: ReviewRulerMeasure | undefined;\n rulerMeasureLabel: string;\n rulerOverlayRef: RefObject<HTMLDivElement | null>;\n rulerScaleX: number;\n rulerScaleY: number;\n rulerUnit: string;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onLoadTarget: () => void;\n onSetReviewMode: (mode: ReviewMode) => void;\n}\n\nexport const ReviewTargetFrame = ({\n canWriteArea,\n canWriteDom,\n frameScrollRef,\n iframeRef,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n mode,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n size,\n targetSrc,\n onLoadTarget,\n onSetReviewMode,\n}: ReviewTargetFrameProps) => {\n const showRuler = isRulerVisible && isRulerAvailable;\n\n return (\n <main className=\"df-review-stage\">\n <div className=\"df-review-frame\">\n <div className=\"df-review-frame-scroll\" ref={frameScrollRef}>\n <div className=\"df-review-frame-canvas\">\n <div\n className={`df-review-device-frame${\n showRuler ? ' is-ruler' : ''\n }`}\n >\n {showRuler && (\n <RulerGutters\n rulerHover={rulerHover}\n rulerScaleX={rulerScaleX}\n rulerScaleY={rulerScaleY}\n rulerUnit={rulerUnit}\n size={size}\n />\n )}\n <div\n className=\"df-review-device\"\n style={{\n width: `${size.width}px`,\n height: `${size.height}px`,\n minWidth: `${size.width}px`,\n minHeight: `${size.height}px`,\n }}\n >\n <iframe\n key={targetSrc}\n ref={iframeRef}\n width={size.width}\n height={size.height}\n src={targetSrc}\n title=\"Review target\"\n onLoad={onLoadTarget}\n />\n {showRuler && (\n <RulerOverlay\n iframeRef={iframeRef}\n isRulerDragging={isRulerDragging}\n rulerHover={rulerHover}\n rulerMeasure={rulerMeasure}\n rulerMeasureLabel={rulerMeasureLabel}\n rulerOverlayRef={rulerOverlayRef}\n size={size}\n />\n )}\n </div>\n </div>\n </div>\n </div>\n <div className=\"df-review-frame-actions\">\n <ReviewModeToolbar\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n mode={mode}\n onSetReviewMode={onSetReviewMode}\n />\n </div>\n </div>\n </main>\n );\n};\n","import {\n CircleHelp as CircleHelpIcon,\n Image as ImageIcon,\n LayoutGrid as LayoutGridIcon,\n Map as MapIcon,\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n Ruler as RulerIcon,\n Settings as SettingsIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n} from 'lucide-react';\nimport type { ReviewItemScope } from '../index';\nimport { FIGMA_OVERLAY_UNAVAILABLE_MESSAGE } from './constants';\nimport type {\n ReviewShellViewportPreset,\n TargetOverlayKey,\n TargetOverlayState,\n} from './types';\nimport { getViewportPresetKind } from './viewport';\n\ninterface ReviewTopbarProps {\n draftTarget: string;\n copyLabel: string;\n viewportPresets: ReviewShellViewportPreset[];\n size: ReviewShellViewportPreset;\n presetScopeCounts: ReadonlyMap<ReviewItemScope, number>;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n targetOverlayState: TargetOverlayState;\n isFigmaOverlayAvailable: boolean;\n onDraftTargetChange: (value: string) => void;\n onApplyTarget: () => void;\n onOpenSitemap: () => void;\n onCopyCurrentUrl: () => void;\n onSizeChange: (preset: ReviewShellViewportPreset) => void;\n onToggleRuler: () => void;\n onToggleTargetOverlay: (key: TargetOverlayKey) => void;\n onOpenInitialPrompt: () => void;\n onOpenSettings: () => void;\n}\n\nconst ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nconst ViewportPresetIcon = ({\n preset\n}: {\n preset: ReviewShellViewportPreset;\n}) => {\n return <ReviewScopeIcon scope={getViewportPresetKind(preset)} />;\n};\n\nexport const ReviewTopbar = ({\n draftTarget,\n copyLabel,\n viewportPresets,\n size,\n presetScopeCounts,\n isRulerAvailable,\n isRulerVisible,\n targetOverlayState,\n isFigmaOverlayAvailable,\n onDraftTargetChange,\n onApplyTarget,\n onOpenSitemap,\n onCopyCurrentUrl,\n onSizeChange,\n onToggleRuler,\n onToggleTargetOverlay,\n onOpenInitialPrompt,\n onOpenSettings,\n}: ReviewTopbarProps) => {\n return (\n <header className=\"df-review-topbar\">\n <form\n className=\"df-review-address\"\n onSubmit={(event) => {\n event.preventDefault();\n onApplyTarget();\n }}\n >\n <button\n aria-label=\"Open sitemap\"\n className=\"df-review-sitemap-button\"\n type=\"button\"\n onClick={onOpenSitemap}\n >\n <MapIcon aria-hidden=\"true\" />\n </button>\n <input\n aria-label=\"Path\"\n value={draftTarget}\n onChange={(event) => onDraftTargetChange(event.target.value)}\n />\n <button type=\"submit\">Load</button>\n <button type=\"button\" onClick={onCopyCurrentUrl}>\n {copyLabel}\n </button>\n </form>\n\n <div className=\"df-review-tools\">\n <div className=\"df-review-tool-controls\">\n <div className=\"df-review-presets\" aria-label=\"Viewport presets\">\n {viewportPresets.map((preset) => (\n <button\n key={preset.label}\n className={preset.label === size.label ? 'is-active' : ''}\n type=\"button\"\n onClick={() => onSizeChange(preset)}\n >\n <ViewportPresetIcon preset={preset} />\n <span className=\"df-review-preset-copy\">\n <strong>{preset.label}</strong>\n </span>\n <span className=\"df-review-preset-count\">\n {presetScopeCounts.get(getViewportPresetKind(preset)) ?? 0}\n </span>\n </button>\n ))}\n </div>\n\n <span className=\"df-review-tool-divider\" aria-hidden=\"true\">\n |\n </span>\n\n <span className=\"df-review-active-size\">\n {size.width}x{size.height}\n </span>\n </div>\n\n <div className=\"df-review-overlays\" aria-label=\"Target overlays\">\n {isRulerAvailable && (\n <button\n aria-label=\"Toggle ruler\"\n className={`df-review-overlay-button is-ruler${\n isRulerVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={onToggleRuler}\n >\n <RulerIcon aria-hidden=\"true\" />\n </button>\n )}\n <button\n aria-label=\"Toggle grid overlay\"\n className={`df-review-overlay-button is-grid${\n targetOverlayState.grid ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onToggleTargetOverlay('grid')}\n >\n <LayoutGridIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-disabled={!isFigmaOverlayAvailable}\n aria-label={\n isFigmaOverlayAvailable\n ? 'Toggle Figma overlay'\n : FIGMA_OVERLAY_UNAVAILABLE_MESSAGE\n }\n className={`df-review-overlay-button is-figma${\n targetOverlayState.figma ? ' is-active' : ''\n }${isFigmaOverlayAvailable ? '' : ' is-disabled'}`}\n type=\"button\"\n onClick={() => onToggleTargetOverlay('figma')}\n >\n <ImageIcon aria-hidden=\"true\" />\n </button>\n <span className=\"df-review-tool-divider\" aria-hidden=\"true\">\n |\n </span>\n <button\n aria-label=\"Open initial prompt\"\n className=\"df-review-overlay-button is-prompt\"\n type=\"button\"\n onClick={onOpenInitialPrompt}\n >\n <CircleHelpIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Open settings\"\n className=\"df-review-overlay-button is-settings\"\n type=\"button\"\n onClick={onOpenSettings}\n >\n <SettingsIcon aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n </header>\n );\n};\n","import {\n useCallback,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewMode,\n ReviewRulerConfig,\n ReviewSource,\n ReviewViewportPreset,\n WebReviewKitAdapter,\n WebReviewKitController,\n} from '../../types';\nimport type {\n ReviewShellViewportPreset,\n TargetOverlayState,\n} from '../types';\nimport { useReviewItemRestore } from './use.review.item.restore';\nimport { useReviewKitLifecycle } from './use.review.kit.lifecycle';\nimport { useReviewTargetOverlay } from './use.review.target.overlay';\nimport { useReviewTargetSync } from './use.review.target.sync';\n\ninterface UseReviewControllerOptions {\n adapter: WebReviewKitAdapter;\n cleanupTargetRef: MutableRefObject<(() => void) | null>;\n controllerRef: MutableRefObject<WebReviewKitController | null>;\n frameScrollRef: RefObject<HTMLDivElement | null>;\n hiddenOverlayItemIdList: string[];\n hiddenOverlayItemIdListRef: MutableRefObject<string[]>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isFigmaOverlayAvailable: boolean;\n pageTargets: ReadonlySet<string>;\n pendingInitialItemIdRef: MutableRefObject<string | null>;\n pendingRestoreRef: MutableRefObject<ReviewItem | null>;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n reviewViewportPresets: ReviewViewportPreset[];\n ruler?: ReviewRulerConfig;\n selectedItemIdRef: MutableRefObject<string | null>;\n size: ReviewShellViewportPreset;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n target: string;\n targetOverlayState: TargetOverlayState;\n targetRef: MutableRefObject<string>;\n viewportPresets: ReviewShellViewportPreset[];\n onActiveRouteChange: (target: string) => void;\n onCancelReviewMode: () => boolean;\n onDraftTargetChange: (target: string) => void;\n onItemsRefresh: () => Promise<ReviewItem[]>;\n onModeChange: (mode: ReviewMode) => void;\n onSelectedItemIdChange: (itemId: string | null) => void;\n onSizeChange: (size: ReviewShellViewportPreset) => void;\n onTargetChange: (target: string) => void;\n onTargetOverlayStateChange: (state: TargetOverlayState) => void;\n onCloseRuler: () => boolean;\n}\n\nexport const useReviewController = ({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n pageTargets,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetOverlayState,\n targetRef,\n viewportPresets,\n onActiveRouteChange,\n onCancelReviewMode,\n onDraftTargetChange,\n onItemsRefresh,\n onModeChange,\n onSelectedItemIdChange,\n onSizeChange,\n onTargetChange,\n onTargetOverlayStateChange,\n onCloseRuler,\n}: UseReviewControllerOptions) => {\n const syncTargetViewport = useCallback(() => {\n window.dispatchEvent(new Event('resize'));\n }, []);\n const {\n closeTargetOverlay,\n refreshTargetOverlayState,\n toggleTargetOverlay,\n } = useReviewTargetOverlay({\n iframeRef,\n isFigmaOverlayAvailable,\n targetOverlayState,\n onTargetOverlayStateChange,\n });\n const {\n applyPendingRestore,\n clearSelectedItem,\n restoreInitialItem,\n restoreReviewItem,\n } = useReviewItemRestore({\n adapter,\n controllerRef,\n iframeRef,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n reviewPathPrefix,\n selectedItemIdRef,\n source,\n targetRef,\n viewportPresets,\n onActiveRouteChange,\n onDraftTargetChange,\n onSelectedItemIdChange,\n onSizeChange,\n onSyncTargetViewport: syncTargetViewport,\n onTargetChange,\n });\n const { syncShellTarget } = useReviewTargetSync({\n iframeRef,\n reviewPathPrefix,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetRef,\n onActiveRouteChange,\n onClearSelectedItem: clearSelectedItem,\n onDraftTargetChange,\n onSyncTargetViewport: syncTargetViewport,\n onTargetChange,\n });\n const {\n initReviewKit,\n reloadReviewKit,\n setControllerReviewMode,\n } = useReviewKitLifecycle({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n pageTargets,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n sizeRef,\n targetRef,\n onApplyPendingRestore: applyPendingRestore,\n onCancelReviewMode,\n onCloseRuler,\n onCreateItem: restoreReviewItem,\n onItemsRefresh,\n onModeChange,\n onRefreshTargetOverlayState: refreshTargetOverlayState,\n onRestoreInitialItem: restoreInitialItem,\n onRestoreReviewItem: restoreReviewItem,\n onSyncShellTarget: syncShellTarget,\n onSyncTargetViewport: syncTargetViewport,\n });\n\n return {\n clearSelectedItem,\n closeTargetOverlay,\n initReviewKit,\n reloadReviewKit,\n restoreReviewItem,\n setControllerReviewMode,\n syncTargetViewport,\n toggleTargetOverlay,\n };\n};\n","import {\n useCallback,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewSource,\n WebReviewKitAdapter,\n WebReviewKitController,\n} from '../../types';\nimport {\n getReviewItemRestoreScrollPosition,\n queryReviewItemAnchorElement,\n setDocumentScrollInstantly,\n} from '../anchor.restore';\nimport {\n getItemTarget,\n updateShellUrlForItem,\n} from '../route';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getRestoredSize } from '../viewport';\n\ninterface UseReviewItemRestoreOptions {\n adapter: WebReviewKitAdapter;\n controllerRef: MutableRefObject<WebReviewKitController | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n pendingInitialItemIdRef: MutableRefObject<string | null>;\n pendingRestoreRef: MutableRefObject<ReviewItem | null>;\n reviewPathPrefix: string;\n selectedItemIdRef: MutableRefObject<string | null>;\n source: ReviewSource;\n targetRef: MutableRefObject<string>;\n viewportPresets: ReviewShellViewportPreset[];\n onActiveRouteChange: (target: string) => void;\n onDraftTargetChange: (target: string) => void;\n onSelectedItemIdChange: (itemId: string | null) => void;\n onSizeChange: (size: ReviewShellViewportPreset) => void;\n onSyncTargetViewport: () => void;\n onTargetChange: (target: string) => void;\n}\n\nfunction runWithAutoScrollBehavior(\n targetDocument: Document | undefined,\n callback: () => void\n) {\n const elements = [\n targetDocument?.documentElement,\n targetDocument?.body,\n ].filter((element): element is HTMLElement => Boolean(element));\n const previousValues = elements.map((element) => element.style.scrollBehavior);\n\n elements.forEach((element) => {\n element.style.scrollBehavior = 'auto';\n });\n\n try {\n callback();\n } finally {\n elements.forEach((element, index) => {\n element.style.scrollBehavior = previousValues[index] ?? '';\n });\n }\n}\n\nexport const useReviewItemRestore = ({\n adapter,\n controllerRef,\n iframeRef,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n reviewPathPrefix,\n selectedItemIdRef,\n source,\n targetRef,\n viewportPresets,\n onActiveRouteChange,\n onDraftTargetChange,\n onSelectedItemIdChange,\n onSizeChange,\n onSyncTargetViewport,\n onTargetChange,\n}: UseReviewItemRestoreOptions) => {\n const clearSelectedItem = useCallback(() => {\n pendingRestoreRef.current = null;\n selectedItemIdRef.current = null;\n onSelectedItemIdChange(null);\n controllerRef.current?.highlightItem(undefined);\n }, [\n controllerRef,\n onSelectedItemIdChange,\n pendingRestoreRef,\n selectedItemIdRef,\n ]);\n\n const applyItemScroll = useCallback(\n (item: ReviewItem) => {\n if (selectedItemIdRef.current !== item.id) return;\n\n const targetWindow = iframeRef.current?.contentWindow;\n const targetDocument = iframeRef.current?.contentDocument;\n if (!targetWindow) return;\n\n const anchorElement = targetDocument\n ? queryReviewItemAnchorElement(targetDocument, item)\n : undefined;\n\n runWithAutoScrollBehavior(targetDocument ?? undefined, () => {\n if (!targetDocument) return;\n\n setDocumentScrollInstantly(\n targetWindow,\n targetDocument,\n getReviewItemRestoreScrollPosition(\n targetWindow,\n targetDocument,\n item,\n anchorElement\n )\n );\n });\n onSyncTargetViewport();\n controllerRef.current?.highlightItem(item.id);\n },\n [controllerRef, iframeRef, onSyncTargetViewport, selectedItemIdRef]\n );\n\n const applyPendingRestore = useCallback(() => {\n const item = pendingRestoreRef.current;\n if (!item) return;\n\n applyItemScroll(item);\n pendingRestoreRef.current = null;\n }, [applyItemScroll, pendingRestoreRef]);\n\n const restoreReviewItem = useCallback(\n (item: ReviewItem) => {\n const nextTarget = getItemTarget(item, reviewPathPrefix);\n const nextSize = getRestoredSize(item, viewportPresets);\n\n pendingRestoreRef.current = item;\n selectedItemIdRef.current = item.id;\n onSelectedItemIdChange(item.id);\n onActiveRouteChange(nextTarget);\n onDraftTargetChange(nextTarget);\n onSizeChange(nextSize);\n updateShellUrlForItem(nextTarget, nextSize, item.id, source);\n\n if (targetRef.current !== nextTarget) {\n onTargetChange(nextTarget);\n return;\n }\n\n applyPendingRestore();\n },\n [\n applyPendingRestore,\n onActiveRouteChange,\n onDraftTargetChange,\n onSelectedItemIdChange,\n onSizeChange,\n onTargetChange,\n pendingRestoreRef,\n reviewPathPrefix,\n selectedItemIdRef,\n source,\n targetRef,\n viewportPresets,\n ]\n );\n\n const restoreInitialItem = useCallback(async () => {\n const itemId = pendingInitialItemIdRef.current;\n if (!itemId) return;\n\n pendingInitialItemIdRef.current = null;\n\n const item = await adapter.get(itemId);\n if (item) {\n restoreReviewItem(item);\n }\n }, [adapter, pendingInitialItemIdRef, restoreReviewItem]);\n\n return {\n applyPendingRestore,\n clearSelectedItem,\n restoreInitialItem,\n restoreReviewItem,\n };\n};\n","import {\n useCallback,\n useEffect,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewMode,\n ReviewRulerConfig,\n ReviewViewportPreset,\n WebReviewKitAdapter,\n WebReviewKitController,\n} from '../../types';\nimport { createWebReviewKit } from '../../core/web.review.kit.app';\nimport { setTargetScrollbarHidden } from '../target/target';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\nimport { bindReviewFrameNavigation } from './review.frame.navigation';\nimport { getReviewKitTarget } from './review.kit.target';\n\ninterface UseReviewKitLifecycleOptions {\n adapter: WebReviewKitAdapter;\n cleanupTargetRef: MutableRefObject<(() => void) | null>;\n controllerRef: MutableRefObject<WebReviewKitController | null>;\n frameScrollRef: RefObject<HTMLDivElement | null>;\n hiddenOverlayItemIdList: string[];\n hiddenOverlayItemIdListRef: MutableRefObject<string[]>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n pageTargets: ReadonlySet<string>;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n reviewViewportPresets: ReviewViewportPreset[];\n ruler?: ReviewRulerConfig;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n targetRef: MutableRefObject<string>;\n onApplyPendingRestore: () => void;\n onCancelReviewMode: () => boolean;\n onCloseRuler: () => boolean;\n onItemsRefresh: () => Promise<ReviewItem[]>;\n onModeChange: (mode: ReviewMode) => void;\n onCreateItem: (item: ReviewItem) => void;\n onRefreshTargetOverlayState: () => void;\n onRestoreInitialItem: () => Promise<void>;\n onRestoreReviewItem: (item: ReviewItem) => void;\n onSyncShellTarget: (target: string) => void;\n onSyncTargetViewport: () => void;\n}\n\nexport const useReviewKitLifecycle = ({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n pageTargets,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n sizeRef,\n targetRef,\n onApplyPendingRestore,\n onCancelReviewMode,\n onCloseRuler,\n onItemsRefresh,\n onModeChange,\n onCreateItem,\n onRefreshTargetOverlayState,\n onRestoreInitialItem,\n onRestoreReviewItem,\n onSyncShellTarget,\n onSyncTargetViewport,\n}: UseReviewKitLifecycleOptions) => {\n const destroyReviewKit = useCallback(() => {\n cleanupTargetRef.current?.();\n cleanupTargetRef.current = null;\n controllerRef.current?.destroy();\n controllerRef.current = null;\n }, [cleanupTargetRef, controllerRef]);\n\n const initReviewKit = useCallback(() => {\n destroyReviewKit();\n\n const iframe = iframeRef.current;\n const targetWindow = iframe?.contentWindow;\n const targetDocument = iframe?.contentDocument;\n if (!iframe || !targetWindow || !targetDocument) return;\n\n cleanupTargetRef.current = bindReviewFrameNavigation({\n pageTargets,\n reviewPathPrefix,\n targetDocument,\n targetRef,\n targetWindow,\n onCancelReviewMode,\n onCloseRuler,\n onSyncShellTarget,\n onSyncTargetViewport,\n });\n\n controllerRef.current = createWebReviewKit({\n projectId,\n userId: reviewUserId.trim() || undefined,\n adapter,\n target: () => getReviewKitTarget({ frameScrollRef, iframeRef }),\n hotkeys: {\n qa: 'Shift+Q',\n },\n anchors: {\n attribute: 'data-qa-id',\n },\n viewports: {\n presets: reviewViewportPresets,\n },\n ruler,\n onCreateItem,\n onRestoreItem: onRestoreReviewItem,\n onItemsChange: () => {\n void onItemsRefresh();\n },\n onModeChange,\n ui: {\n panel: false,\n },\n modules: {\n qa: true,\n grid: false,\n figma: false,\n },\n });\n controllerRef.current.open();\n controllerRef.current.setHiddenItemIds(hiddenOverlayItemIdListRef.current);\n onModeChange(controllerRef.current.getMode());\n void onItemsRefresh();\n void onRestoreInitialItem();\n onApplyPendingRestore();\n onRefreshTargetOverlayState();\n setTargetScrollbarHidden(\n targetDocument,\n getViewportPresetKind(sizeRef.current) === 'mobile'\n );\n }, [\n adapter,\n cleanupTargetRef,\n controllerRef,\n destroyReviewKit,\n frameScrollRef,\n hiddenOverlayItemIdListRef,\n iframeRef,\n onApplyPendingRestore,\n onCancelReviewMode,\n onCloseRuler,\n onCreateItem,\n onItemsRefresh,\n onModeChange,\n onRefreshTargetOverlayState,\n onRestoreInitialItem,\n onRestoreReviewItem,\n onSyncShellTarget,\n onSyncTargetViewport,\n pageTargets,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n sizeRef,\n targetRef,\n ]);\n\n const reloadReviewKit = useCallback(async () => {\n await controllerRef.current?.reload();\n }, [controllerRef]);\n\n const setControllerReviewMode = useCallback(\n (nextMode: ReviewMode) => {\n controllerRef.current?.setMode(nextMode);\n onModeChange(controllerRef.current?.getMode() ?? 'idle');\n },\n [controllerRef, onModeChange]\n );\n\n useEffect(() => destroyReviewKit, [destroyReviewKit]);\n\n useEffect(() => {\n const frameDocument = iframeRef.current?.contentDocument;\n if (!frameDocument || frameDocument.readyState !== 'complete') return;\n initReviewKit();\n }, [iframeRef, initReviewKit]);\n\n useEffect(() => {\n hiddenOverlayItemIdListRef.current = hiddenOverlayItemIdList;\n controllerRef.current?.setHiddenItemIds(hiddenOverlayItemIdList);\n }, [controllerRef, hiddenOverlayItemIdList, hiddenOverlayItemIdListRef]);\n\n return {\n destroyReviewKit,\n initReviewKit,\n reloadReviewKit,\n setControllerReviewMode,\n };\n};\n","import type { ReviewItem } from './types';\n\nexport function getItemRouteKey(\n item: Pick<ReviewItem, 'routeKey' | 'normalizedPath'>\n) {\n return item.routeKey || normalizeRoutePath(item.normalizedPath);\n}\n\nexport function normalizeRoutePath(pathname: string) {\n const [pathWithoutQuery] = pathname.split(/[?#]/);\n const path = (pathWithoutQuery || '/').replace(/\\/index\\.html$/, '/');\n return path.startsWith('/') ? path : `/${path}`;\n}\n","import { getItemRouteKey } from '../route';\nimport { matchesReviewItemStatus } from '../status';\nimport type {\n LocalAdapterOptions,\n ReviewItem,\n WebReviewKitAdapter,\n} from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'df-web-review-kit:items';\n\nexport function localAdapter(\n options: LocalAdapterOptions = {}\n): WebReviewKitAdapter {\n const storageKey = options.storageKey ?? DEFAULT_STORAGE_KEY;\n\n const write = (items: ReviewItem[]) => {\n window.localStorage.setItem(storageKey, JSON.stringify(items));\n };\n\n const read = (): ReviewItem[] => {\n if (typeof window === 'undefined') return [];\n\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return [];\n\n try {\n const value = JSON.parse(raw);\n if (!Array.isArray(value)) return [];\n\n let changed = false;\n const items = value.flatMap((item) => {\n const normalized = normalizeStoredReviewItem(item);\n if (!normalized || normalized !== item) changed = true;\n return normalized ? [normalized] : [];\n });\n\n if (changed) write(items);\n return items;\n } catch {\n return [];\n }\n };\n\n return {\n async get(id) {\n return read().find((item) => item.id === id) ?? null;\n },\n\n async list(query) {\n return read().filter((item) => {\n if (item.projectId !== query.projectId) return false;\n const queryRouteKey = query.routeKey ?? query.normalizedPath;\n if (\n queryRouteKey &&\n getItemRouteKey(item) !== queryRouteKey\n ) {\n return false;\n }\n if (query.status && !matchesReviewItemStatus(item.status, query.status)) {\n return false;\n }\n return true;\n });\n },\n\n async create(item) {\n const items = read();\n items.unshift(item);\n write(items);\n return item;\n },\n\n async update(id, patch) {\n const items = read();\n const index = items.findIndex((item) => item.id === id);\n\n if (index < 0) {\n throw new Error(`Review item not found: ${id}`);\n }\n\n const next: ReviewItem = {\n ...items[index],\n ...patch,\n id,\n createdAt: items[index].createdAt,\n updatedAt: new Date().toISOString(),\n };\n\n items[index] = next;\n write(items);\n return next;\n },\n\n async remove(id) {\n write(read().filter((item) => item.id !== id));\n },\n };\n}\n\nfunction normalizeStoredReviewItem(value: unknown): ReviewItem | undefined {\n if (!value || typeof value !== 'object') return undefined;\n\n const raw = value as Omit<ReviewItem, 'kind'> & {\n kind?: string;\n reviewNumber?: unknown;\n screenshot?: unknown;\n };\n const kind =\n raw.kind === 'text' ? 'note' :\n raw.kind === 'capture' ? 'area' :\n raw.kind;\n\n if (kind !== 'note' && kind !== 'area') return undefined;\n\n const { screenshot: _screenshot, reviewNumber: _reviewNumber, ...item } = raw;\n\n if (\n kind === raw.kind &&\n _screenshot === undefined &&\n _reviewNumber === undefined\n ) {\n return raw as ReviewItem;\n }\n\n return {\n ...item,\n kind,\n } as ReviewItem;\n}\n","import type {\n RelativeSelection,\n ReviewPoint,\n ViewportSize,\n} from '../types';\n\n/** Rectangle expressed in the target viewport coordinate space. */\nexport interface ViewportSelection {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/** Same-origin target document plus its placement inside the host shell. */\nexport interface ReviewEnvironment {\n window: Window;\n document: Document;\n viewportRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n overlayRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n}\n\n/** Returns true when two viewport rectangles overlap. */\nexport function rectanglesIntersect(\n a: ViewportSelection,\n b: ViewportSelection\n) {\n return (\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top\n );\n}\n\n/** Converts a point into a 1x1 selection for shared selection handling. */\nexport function getPointSelection(point: ReviewPoint): ViewportSelection {\n return {\n left: point.x,\n top: point.y,\n width: 1,\n height: 1,\n };\n}\n\n/** Converts public API selection fields into internal viewport rectangle fields. */\nexport function toViewportSelection(\n selection: RelativeSelection\n): ViewportSelection {\n return {\n left: selection.x,\n top: selection.y,\n width: selection.width,\n height: selection.height,\n };\n}\n\n/** Rounds an internal viewport rectangle back to the public selection shape. */\nexport function toPublicSelection(\n selection: ViewportSelection\n): RelativeSelection {\n return {\n x: Math.round(selection.left),\n y: Math.round(selection.top),\n width: Math.round(selection.width),\n height: Math.round(selection.height),\n };\n}\n\n/** Finds the center point of either internal or public selection shapes. */\nexport function getSelectionCenter(\n selection: ViewportSelection | RelativeSelection\n): ReviewPoint {\n if ('left' in selection) {\n return {\n x: selection.left + selection.width / 2,\n y: selection.top + selection.height / 2,\n };\n }\n\n return {\n x: selection.x + selection.width / 2,\n y: selection.y + selection.height / 2,\n };\n}\n\n/** Runtime guard for legacy and current persisted selection values. */\nexport function isRelativeSelection(value: unknown): value is RelativeSelection {\n if (!value || typeof value !== 'object') return false;\n\n const selection = value as Partial<RelativeSelection>;\n return (\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n );\n}\n\n/** Reads the active target viewport size, falling back to the host window. */\nexport function getViewportSize(\n environment?: ReviewEnvironment\n): ViewportSize {\n const targetWindow = environment?.window ?? window;\n return {\n width: targetWindow.innerWidth,\n height: targetWindow.innerHeight,\n };\n}\n\n/** Returns whether a target-space point is currently visible in the target viewport. */\nexport function isPointInViewport(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return (\n point.x >= 0 &&\n point.y >= 0 &&\n point.x <= viewport.width &&\n point.y <= viewport.height\n );\n}\n\n/** Returns whether any part of a target-space selection is visible. */\nexport function isSelectionInViewport(\n selection: ViewportSelection,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return rectanglesIntersect(selection, {\n left: 0,\n top: 0,\n width: viewport.width,\n height: viewport.height,\n });\n}\n\n/** Clamps a target-space point to the visible target viewport. */\nexport function clampPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return {\n x: clamp(point.x, 0, viewport.width),\n y: clamp(point.y, 0, viewport.height),\n };\n}\n\n/** Places a popover inside the current overlay bounds near a host-space point. */\nexport function getPopoverPosition(\n point: ReviewPoint,\n environment?: ReviewEnvironment,\n options?: {\n width?: number;\n estimatedHeight?: number;\n offset?: number;\n }\n) {\n const bounds = getPopoverBounds(environment);\n const margin = 12;\n const width = Math.min(\n options?.width ?? 320,\n Math.max(240, bounds.width - margin * 2)\n );\n const estimatedHeight = options?.estimatedHeight ?? 178;\n const offset = options?.offset ?? 12;\n\n return {\n left: clamp(\n point.x + offset,\n bounds.left + margin,\n bounds.left + bounds.width - width - margin\n ),\n top: clamp(\n point.y + offset,\n bounds.top + margin,\n bounds.top + bounds.height - estimatedHeight - margin\n ),\n };\n}\n\n/** Places the area draft popover near the selected area edge. */\nexport function getAreaPopoverPosition(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n) {\n return getPopoverPosition(\n {\n x: selection.left + selection.width,\n y: selection.top,\n },\n environment,\n {\n width: 360,\n estimatedHeight: 206,\n }\n );\n}\n\n/** Uses overlay bounds when embedded in a shell, otherwise the host viewport. */\nexport function getPopoverBounds(environment?: ReviewEnvironment) {\n if (!environment) {\n return {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n\n return environment.overlayRect;\n}\n\n/** Converts a target-space point to the host shell coordinate space. */\nexport function toHostPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n if (!environment) return point;\n\n return {\n x: point.x + environment.viewportRect.left,\n y: point.y + environment.viewportRect.top,\n };\n}\n\n/** Converts a target-space rectangle to the host shell coordinate space. */\nexport function toHostSelection(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n): ViewportSelection {\n return {\n left: selection.left + environment.viewportRect.left,\n top: selection.top + environment.viewportRect.top,\n width: selection.width,\n height: selection.height,\n };\n}\n\n/** Converts a host-space point back into target viewport coordinates. */\nexport function toTargetPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n if (!environment) return point;\n\n return {\n x: point.x - environment.viewportRect.left,\n y: point.y - environment.viewportRect.top,\n };\n}\n\n/** Extracts a host pointer event position as a target-space point. */\nexport function toTargetPointFromHostEvent(\n event: Pick<PointerEvent, 'clientX' | 'clientY'>,\n environment?: ReviewEnvironment\n) {\n return toTargetPoint(\n {\n x: event.clientX,\n y: event.clientY,\n },\n environment\n );\n}\n\n/** Sizes and positions an overlay layer to cover the target viewport in host space. */\nexport function placeLayerOverTarget(\n layer: HTMLElement,\n environment: ReviewEnvironment\n) {\n layer.style.left = `${environment.viewportRect.left}px`;\n layer.style.top = `${environment.viewportRect.top}px`;\n layer.style.width = `${environment.viewportRect.width}px`;\n layer.style.height = `${environment.viewportRect.height}px`;\n layer.style.right = 'auto';\n layer.style.bottom = 'auto';\n}\n\n/** Clamps a value even when max is smaller than min. */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), Math.max(min, max));\n}\n\n/** Keeps persisted relative coordinates stable without excessive precision. */\nexport function roundRatio(value: number) {\n return Math.round(value * 10000) / 10000;\n}\n\n/** Rounds a point to pixel coordinates for persisted review data. */\nexport function roundPoint(point: ReviewPoint): ReviewPoint {\n return {\n x: Math.round(point.x),\n y: Math.round(point.y),\n };\n}\n","import type {\n DomAnchor,\n DomAnchorCandidate,\n DomSourceHint,\n RelativeSelection,\n ReviewPoint,\n} from '../types';\nimport {\n clamp,\n roundRatio,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\n\n/** Resolves a DOM anchor from the center of a target-space selection. */\nexport function getDomAnchor(\n selection: ViewportSelection,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const x = selection.left + selection.width / 2;\n const y = selection.top + selection.height / 2;\n return getDomAnchorFromPoint({ x, y }, configuredAttribute, environment);\n}\n\n/** Builds the best DOM anchor candidate set from a target-space point. */\nexport function getDomAnchorFromPoint(\n point: ReviewPoint,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const target = environment.document.elementFromPoint(point.x, point.y);\n if (!target) return undefined;\n\n const candidates = createAnchorCandidates(target, configuredAttribute);\n const primary = candidates[0];\n if (!primary) return undefined;\n\n return {\n ...primary,\n candidates,\n htmlSnippet: getElementHtmlSnippet(\n getAnchorSourceElement(target, primary, configuredAttribute) ?? target\n ),\n source: getDomSourceHint(target),\n };\n}\n\n/** Reads the current target-space rectangle for a previously captured anchor. */\nexport function getElementViewportSelection(\n anchor: DomAnchor,\n environment: ReviewEnvironment\n): ViewportSelection | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return undefined;\n\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n}\n\n/** Stores a selection relative to an anchor so it can survive layout shifts. */\nexport function getRelativeSelection(\n selection: ViewportSelection,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): RelativeSelection | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((selection.left - rect.left) / rect.width),\n y: roundRatio((selection.top - rect.top) / rect.height),\n width: roundRatio(selection.width / rect.width),\n height: roundRatio(selection.height / rect.height),\n };\n}\n\n/** Stores a point relative to an anchor so marker positions can be rebound. */\nexport function getRelativePoint(\n point: ReviewPoint,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): ReviewPoint | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((point.x - rect.left) / rect.width),\n y: roundRatio((point.y - rect.top) / rect.height),\n };\n}\n\n/** Returns the primary anchor plus any fallback candidates without duplicates. */\nexport function getAnchorCandidates(anchor: DomAnchor) {\n return dedupeAnchorCandidates([\n anchor,\n ...(anchor.candidates ?? []),\n ]);\n}\n\n/** Finds the best current DOM element for a persisted anchor candidate set. */\nexport function resolveAnchorElement(\n anchor: DomAnchor,\n environment: ReviewEnvironment\n) {\n // Try every persisted candidate because IDs/classes can disappear between builds.\n const matches = getAnchorCandidates(anchor).flatMap((candidate) => {\n const match = queryBestAnchorCandidate(\n candidate,\n candidate.textFingerprint ?? anchor.textFingerprint,\n environment\n );\n\n if (!match) return [];\n\n const confidence = roundRatio(\n (candidate.confidence ?? 0.5) * match.score\n );\n\n return [{\n element: match.element,\n candidate,\n confidence,\n }];\n });\n\n return matches.sort((a, b) => b.confidence - a.confidence)[0];\n}\n\n/** CSS.escape wrapper with a small fallback for older browsers. */\nexport function cssEscape(value: string) {\n if ('CSS' in window && typeof window.CSS.escape === 'function') {\n return window.CSS.escape(value);\n }\n\n return value.replace(/[^a-zA-Z0-9_-]/g, '\\\\$&');\n}\n\nfunction getAnchorElement(\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n) {\n return typeof anchor === 'string'\n ? queryAnchorElement(anchor, environment)\n : resolveAnchorElement(anchor, environment)?.element;\n}\n\nfunction createAnchorCandidates(\n target: Element,\n configuredAttribute: string\n): DomAnchorCandidate[] {\n const candidates: DomAnchorCandidate[] = [];\n\n // Prefer explicit project-authored anchors, then fall back to stable-enough DOM hints.\n const anchoredByAttribute = target.closest(`[${configuredAttribute}]`);\n if (anchoredByAttribute) {\n const value = anchoredByAttribute.getAttribute(configuredAttribute);\n if (value) {\n candidates.push({\n selector: `[${configuredAttribute}=\"${cssEscape(value)}\"]`,\n strategy: 'configured-attribute',\n confidence: 0.98,\n textFingerprint: getTextFingerprint(anchoredByAttribute),\n });\n }\n }\n\n if (isMeaningfulId(target.id)) {\n candidates.push({\n selector: `#${cssEscape(target.id)}`,\n strategy: 'id',\n confidence: 0.94,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n const targetClassName = getMeaningfulClassName(target);\n if (targetClassName) {\n candidates.push({\n selector: `${target.tagName.toLowerCase()}.${cssEscape(targetClassName)}`,\n strategy: 'class',\n confidence: 0.82,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n candidates.push({\n selector: getDomPath(target),\n strategy: 'dom-path',\n confidence: 0.9,\n textFingerprint: getTextFingerprint(target),\n });\n\n const parent = target.parentElement;\n const anchoredById = parent\n ? findClosest(parent, (element) => isMeaningfulId(element.id))\n : undefined;\n if (anchoredById?.id) {\n candidates.push({\n selector: `#${cssEscape(anchoredById.id)}`,\n strategy: 'id',\n confidence: 0.72,\n textFingerprint: getTextFingerprint(anchoredById),\n });\n }\n\n const anchoredByClass = parent\n ? findClosest(parent, (element) => Boolean(getMeaningfulClassName(element)))\n : undefined;\n const className = anchoredByClass\n ? getMeaningfulClassName(anchoredByClass)\n : undefined;\n\n if (anchoredByClass && className) {\n candidates.push({\n selector: `${anchoredByClass.tagName.toLowerCase()}.${cssEscape(\n className\n )}`,\n strategy: 'class',\n confidence: 0.58,\n textFingerprint: getTextFingerprint(anchoredByClass),\n });\n }\n\n return dedupeAnchorCandidates(candidates);\n}\n\nfunction getAnchorSourceElement(\n target: Element,\n candidate: DomAnchorCandidate,\n configuredAttribute: string\n) {\n if (candidate.strategy === 'configured-attribute') {\n return target.closest(`[${configuredAttribute}]`);\n }\n\n if (candidate.strategy === 'dom-path') return target;\n\n try {\n return target.closest(candidate.selector);\n } catch {\n return target;\n }\n}\n\nfunction getElementHtmlSnippet(element: Element, maxLength = 1000) {\n const html = decodeHtmlEntities(element.outerHTML.replace(/\\s+/g, ' ').trim());\n if (html.length <= maxLength) return html;\n return `${html.slice(0, maxLength - 3)}...`;\n}\n\nfunction decodeHtmlEntities(value: string) {\n return value.replace(\n /&(#\\d+|#x[\\da-f]+|lt|gt|quot|apos|amp);/gi,\n (match, entity: string) => {\n const normalized = entity.toLowerCase();\n\n if (normalized === 'lt') return '<';\n if (normalized === 'gt') return '>';\n if (normalized === 'quot') return '\"';\n if (normalized === 'apos') return \"'\";\n if (normalized === 'amp') return '&';\n\n const codePoint = normalized.startsWith('#x')\n ? Number.parseInt(normalized.slice(2), 16)\n : Number.parseInt(normalized.slice(1), 10);\n\n return Number.isFinite(codePoint)\n ? String.fromCodePoint(codePoint)\n : match;\n }\n );\n}\n\nfunction getDomSourceHint(target: Element): DomSourceHint | undefined {\n const sourceElement = target.closest(\n [\n '[data-wrk-source-file]',\n '[data-wrk-source-component]',\n '[data-wrk-source-line]',\n '[data-wrk-source-column]',\n '[data-file]',\n '[data-component]',\n '[data-section-index]',\n '[data-section-id]',\n ].join(', ')\n );\n if (!sourceElement) return undefined;\n\n const source: DomSourceHint = {\n component: getSourceAttribute(\n sourceElement,\n 'data-wrk-source-component',\n 'data-component'\n ),\n file: getSourceAttribute(sourceElement, 'data-wrk-source-file', 'data-file'),\n line: getSourceAttribute(sourceElement, 'data-wrk-source-line'),\n column: getSourceAttribute(sourceElement, 'data-wrk-source-column'),\n sectionId: getSourceAttribute(sourceElement, 'data-section-id'),\n sectionIndex: getSourceAttribute(sourceElement, 'data-section-index'),\n };\n\n return Object.values(source).some(Boolean) ? source : undefined;\n}\n\nfunction getSourceAttribute(element: Element, ...names: string[]) {\n for (const name of names) {\n const value = element.getAttribute(name)?.trim();\n if (value) return value;\n }\n\n return undefined;\n}\n\nfunction dedupeAnchorCandidates(candidates: DomAnchorCandidate[]) {\n const seen = new Set<string>();\n\n return candidates.filter((candidate) => {\n const key = `${candidate.strategy}:${candidate.selector}`;\n if (seen.has(key)) return false;\n\n seen.add(key);\n return true;\n });\n}\n\nfunction queryBestAnchorCandidate(\n candidate: DomAnchorCandidate,\n textFingerprint: string | undefined,\n environment: ReviewEnvironment\n) {\n const elements = queryAnchorElements(candidate.selector, environment);\n if (elements.length === 0) return undefined;\n if (!textFingerprint) {\n return {\n element: elements[0],\n score: 1,\n };\n }\n\n // If a selector matches multiple nodes, text similarity keeps restore deterministic.\n return elements\n .map((element) => ({\n element,\n score: getTextFingerprintScore(\n textFingerprint,\n getTextFingerprint(element)\n ),\n }))\n .sort((a, b) => b.score - a.score)[0];\n}\n\nfunction queryAnchorElement(selector: string, environment: ReviewEnvironment) {\n return queryAnchorElements(selector, environment)[0];\n}\n\nfunction queryAnchorElements(selector: string, environment: ReviewEnvironment) {\n try {\n return Array.from(environment.document.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction findClosest(\n start: Element,\n predicate: (element: Element) => boolean\n) {\n let element: Element | null = start;\n const root = start.ownerDocument.documentElement;\n\n while (element && element !== root) {\n if (predicate(element)) return element;\n element = element.parentElement;\n }\n\n return undefined;\n}\n\nfunction getDomPath(element: Element) {\n const parts: string[] = [];\n let current: Element | null = element;\n const ownerDocument = element.ownerDocument;\n\n while (\n current &&\n current !== ownerDocument.body &&\n current !== ownerDocument.documentElement\n ) {\n const parent: Element | null = current.parentElement;\n const tag = current.tagName.toLowerCase();\n\n if (!parent) {\n parts.unshift(tag);\n break;\n }\n\n const currentTagName = current.tagName;\n const siblings: Element[] = Array.from(parent.children).filter(\n (child) => child.tagName === currentTagName\n );\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${tag}:nth-of-type(${index})`);\n current = parent;\n }\n\n return `body > ${parts.join(' > ')}`;\n}\n\nfunction getTextFingerprint(element: Element) {\n const text = element.textContent?.replace(/\\s+/g, ' ').trim();\n return text ? text.slice(0, 120) : undefined;\n}\n\nfunction getTextFingerprintScore(expected?: string, actual?: string) {\n if (!expected) return 1;\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getFingerprintTokens(expected);\n const actualTokens = new Set(getFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return clamp(matches.length / expectedTokens.length, 0.25, 0.76);\n}\n\nfunction getFingerprintTokens(value: string) {\n return value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n}\n\nfunction isMeaningfulId(value: string) {\n const normalized = value.trim().toLowerCase();\n if (normalized.length <= 1) return false;\n\n return ![\n 'app',\n 'main',\n 'page',\n 'root',\n '__next',\n '__nuxt',\n ].includes(normalized);\n}\n\nfunction getMeaningfulClassName(element: Element) {\n return Array.from(element.classList).find((name) => isMeaningfulClass(name));\n}\n\nfunction isMeaningfulClass(value: string) {\n const normalized = value.trim();\n if (\n [\n 'absolute',\n 'block',\n 'contents',\n 'fixed',\n 'flex',\n 'grid',\n 'hidden',\n 'relative',\n 'sticky',\n ].includes(normalized)\n ) {\n return false;\n }\n\n return (\n normalized.length > 2 &&\n !normalized.includes(':') &&\n !/^(aspect|basis|bg|border|bottom|col|content|delay|duration|ease|font|from|gap|grow|h|inset|items|justify|leading|left|m|max-h|max-w|mb|ml|mr|mt|mx|my|min-h|min-w|object|opacity|order|origin|overflow|p|pb|pl|place|pointer|pr|pt|px|py|right|rotate|rounded|row|scale|self|shadow|shrink|text|to|top|tracking|transition|translate|via|w|z)-/.test(\n normalized\n ) &&\n !normalized.startsWith('mq-')\n );\n}\n","/** Creates a stable item id with crypto UUID when available. */\nexport function createId() {\n if ('randomUUID' in crypto) return crypto.randomUUID();\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n","/** Matches configured hotkeys while supporting common Korean keyboard aliases. */\nexport function isHotkey(event: KeyboardEvent, hotkey: string) {\n const parts = hotkey\n .split('+')\n .map((part) => part.trim().toLowerCase())\n .filter(Boolean);\n const key = parts.find(\n (part) => !['shift', 'ctrl', 'control', 'alt', 'meta', 'cmd'].includes(part)\n );\n\n if (!key) return false;\n if (parts.includes('shift') !== event.shiftKey) return false;\n if (\n (parts.includes('ctrl') || parts.includes('control')) !== event.ctrlKey\n ) {\n return false;\n }\n if (parts.includes('alt') !== event.altKey) return false;\n if ((parts.includes('meta') || parts.includes('cmd')) !== event.metaKey) {\n return false;\n }\n\n return isHotkeyKey(event, key);\n}\n\nfunction isHotkeyKey(event: KeyboardEvent, key: string) {\n const normalizedKey = key.toLowerCase();\n\n if (event.key.toLowerCase() === normalizedKey) return true;\n\n if (getHotkeyCode(normalizedKey) === event.code) return true;\n\n const aliases: Record<string, string[]> = {\n q: ['ㅂ', 'ㅃ'],\n };\n\n return aliases[normalizedKey]?.includes(event.key) ?? false;\n}\n\nfunction getHotkeyCode(key: string) {\n if (/^[a-z]$/.test(key)) return `Key${key.toUpperCase()}`;\n if (/^[0-9]$/.test(key)) return `Digit${key}`;\n return undefined;\n}\n","import { normalizeRoutePath } from '../route';\nimport type { ReviewEnvironment } from './geometry';\n\nconst INTERNAL_QUERY_PARAMS = ['__dfwr_target'];\n\n/** Returns the public target URL without review-only query params. */\nexport function getPageUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\n/** Mirrors page URL today, kept separate for future canonical/original URL support. */\nexport function getOriginalUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\n/** Returns the normalized route key used for adapter queries. */\nexport function getRouteKey(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n return normalizeRoutePath(location.pathname);\n}\n\n/** Alias for route key until route and path concepts diverge. */\nexport function getNormalizedPath(environment?: ReviewEnvironment) {\n return getRouteKey(environment);\n}\n\nfunction getPublicSearch(location: Location) {\n const params = new URLSearchParams(location.search);\n\n INTERNAL_QUERY_PARAMS.forEach((key) => params.delete(key));\n\n const value = params.toString();\n return value ? `?${value}` : '';\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemScope,\n ReviewViewportPreset,\n ViewportSize,\n} from '../../types';\n\n/** Default viewport presets used when a host project does not provide its own. */\nexport const DEFAULT_REVIEW_VIEWPORTS: ReviewViewportPreset[] = [\n { label: 'Mobile', width: 390, height: 720, scope: 'mobile' },\n { label: 'Tablet', width: 768, height: 1024, scope: 'tablet' },\n { label: 'Desktop', width: 1440, height: 900, scope: 'desktop' },\n { label: 'Wide', width: 1980, height: 1080, scope: 'wide' },\n];\n\nconst REVIEW_SCOPE_LABELS: Record<ReviewItemScope, string> = {\n mobile: 'Mobile',\n tablet: 'Tablet',\n desktop: 'Desktop',\n wide: 'Wide',\n dom: 'Element',\n};\n\nconst normalizeReviewItemScope = (value: unknown): ReviewItemScope | undefined => {\n if (value === 'element') return 'dom';\n if (\n value === 'mobile' ||\n value === 'tablet' ||\n value === 'desktop' ||\n value === 'wide' ||\n value === 'dom'\n ) {\n return value;\n }\n\n return undefined;\n};\n\nconst getViewportPresetDistance = (\n preset: ReviewViewportPreset,\n viewport: ViewportSize\n) =>\n Math.abs(preset.width - viewport.width) +\n Math.abs(preset.height - viewport.height);\n\nconst inferViewportScope = (\n preset: ReviewViewportPreset\n): Exclude<ReviewItemScope, 'dom'> => {\n if (preset.scope) return preset.scope;\n\n const label = preset.label.toLowerCase();\n\n if (label.includes('mobile') || label.includes('phone')) return 'mobile';\n if (label.includes('tablet') || label.includes('pad')) return 'tablet';\n if (\n label.includes('wide') ||\n label.includes('1980') ||\n label.includes('1940') ||\n label.includes('1920')\n ) {\n return 'wide';\n }\n if (label.includes('desktop')) return 'desktop';\n if (preset.width >= 1800) return 'wide';\n if (preset.width >= 1000) return 'desktop';\n if (preset.width >= 700) return 'tablet';\n return 'mobile';\n};\n\n/** Finds the nearest configured preset for a viewport size. */\nexport function findReviewViewportPreset(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const fallback = presets[0] ?? DEFAULT_REVIEW_VIEWPORTS[0];\n const exact = presets.find(\n (preset) =>\n preset.width === viewport.width && preset.height === viewport.height\n );\n\n if (exact) return exact;\n\n return presets.reduce((closest, preset) => {\n const closestDistance = getViewportPresetDistance(closest, viewport);\n const presetDistance = getViewportPresetDistance(preset, viewport);\n return presetDistance < closestDistance ? preset : closest;\n }, fallback);\n}\n\n/** Resolves a viewport size to the review scope used for item grouping. */\nexport function getReviewViewportScope(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): Exclude<ReviewItemScope, 'dom'> {\n return inferViewportScope(findReviewViewportPreset(viewport, presets));\n}\n\n/** Resolves an item's persisted scope, falling back to its captured viewport. */\nexport function getReviewItemScope(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): ReviewItemScope {\n const scope = normalizeReviewItemScope(item.scope);\n if (scope && scope !== 'dom') return scope;\n return getReviewViewportScope(item.viewport, presets);\n}\n\n/** Returns the display label for an item's resolved review scope. */\nexport function getReviewItemScopeLabel(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const scope = getReviewItemScope(item, presets);\n if (scope === 'dom') return REVIEW_SCOPE_LABELS.dom;\n\n const preset = findReviewViewportPreset(item.viewport, presets);\n return preset.label || REVIEW_SCOPE_LABELS[scope];\n}\n\n/** Adds scope-aware display labels to review items without mutating them. */\nexport function getNumberedReviewItems(\n items: ReviewItem[],\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): NumberedReviewItem[] {\n const draftLabels = new Map<string, string>();\n let nextDraftNumber = 1;\n\n [...items]\n .sort((a, b) => {\n const createdOrder = a.createdAt.localeCompare(b.createdAt);\n if (createdOrder !== 0) return createdOrder;\n return a.id.localeCompare(b.id);\n })\n .forEach((item) => {\n if (!getReviewItemNumber(item)) {\n draftLabels.set(item.id, `draft-${nextDraftNumber++}`);\n }\n });\n\n return items.map((item) => {\n const scope = getReviewItemScope(item, presets);\n const label = getReviewItemScopeLabel(item, presets);\n const number = getReviewItemNumber(item);\n\n return {\n item,\n scope,\n label,\n number,\n displayLabel: number ? `#${number}` : draftLabels.get(item.id) ?? 'draft',\n };\n });\n}\n\n/** Reads a persisted review number when present. */\nexport function getReviewItemNumber(item: Pick<ReviewItem, 'reviewNumber'>) {\n return normalizeReviewNumber(item.reviewNumber);\n}\n\n\nfunction normalizeReviewNumber(value: unknown) {\n if (typeof value !== 'number') return undefined;\n if (!Number.isInteger(value) || value < 1) return undefined;\n return value;\n}\n","import type {\n DomAnchor,\n RelativeSelection,\n ReviewItem,\n ReviewItemScope,\n ReviewMarker,\n ReviewSelection,\n} from '../../types';\nimport {\n getElementViewportSelection,\n getRelativePoint,\n resolveAnchorElement,\n} from '../dom.anchor';\nimport {\n getSelectionCenter,\n isRelativeSelection,\n isSelectionInViewport,\n roundPoint,\n toViewportSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from '../geometry';\n\n/** Rendering mode used by marker and highlight overlays. */\nexport type ReviewItemHighlightMode = 'note' | 'area' | 'dom';\n\n/** Target-space highlight rectangle plus whether it was rebound to an anchor. */\nexport interface ReviewItemHighlightSelection {\n viewport: ViewportSelection;\n isBound: boolean;\n}\n\n/** Resolves a review marker to its current viewport point, with scroll fallback. */\nexport function getBoundMarkerPoint(\n item: ReviewItem,\n environment: ReviewEnvironment\n) {\n const marker = getItemMarker(item);\n if (!marker) return undefined;\n\n // Prefer anchor-relative positions because absolute viewport points drift after layout changes.\n if (item.kind !== 'area' && item.anchor && marker.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: roundPoint({\n x: rect.left + rect.width * marker.relative.x,\n y: rect.top + rect.height * marker.relative.y,\n }),\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n\n return {\n viewport: roundPoint({\n x: marker.viewport.x + sourceScroll.x - environment.window.scrollX,\n y: marker.viewport.y + sourceScroll.y - environment.window.scrollY,\n }),\n isBound: false,\n confidence: 0,\n };\n}\n\n/** Chooses the best visible highlight selection for the current target viewport. */\nexport function getItemHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (item.kind === 'area') {\n return getVisibleHighlightSelection(\n [\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n if (isDomReviewItem(item)) {\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n}\n\n/** Maps an item to its overlay visual treatment. */\nexport function getReviewItemHighlightMode(\n item: ReviewItem\n): ReviewItemHighlightMode {\n if (isDomReviewItem(item)) return 'dom';\n if (item.kind === 'area') return 'area';\n return 'note';\n}\n\n/** Returns an explicit marker or derives one from the item's selection center. */\nexport function getItemMarker(item: ReviewItem): ReviewMarker | undefined {\n if (item.marker) return item.marker;\n\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n return {\n viewport: roundPoint(getSelectionCenter(selection.viewport)),\n relative: selection.relative\n ? roundPoint(getSelectionCenter(selection.relative))\n : undefined,\n };\n}\n\n/** Normalizes current and legacy selection shapes into ReviewSelection. */\nexport function getItemSelection(item: ReviewItem): ReviewSelection | undefined {\n const value = item.selection as ReviewSelection | RelativeSelection | undefined;\n if (!value) return undefined;\n\n if ('viewport' in value && isRelativeSelection(value.viewport)) {\n return value;\n }\n\n if (isRelativeSelection(value)) {\n return {\n viewport: value,\n };\n }\n\n return undefined;\n}\n\n/** Filters markers to the active viewport scope. */\nexport function shouldShowMarkerForScope(\n scope: ReviewItemScope,\n currentScope: ReviewItemScope\n) {\n return scope === currentScope;\n}\n\n/** Creates a marker at the selection center and stores an anchor-relative fallback. */\nexport function createSelectionCenterMarker(\n selection: ViewportSelection,\n anchor: DomAnchor | undefined,\n environment: ReviewEnvironment\n): ReviewMarker {\n const centerPoint = getSelectionCenter(selection);\n\n return {\n viewport: roundPoint(centerPoint),\n relative: anchor ? getRelativePoint(centerPoint, anchor, environment) : undefined,\n };\n}\n\nfunction getBoundSelection(item: ReviewItem, environment: ReviewEnvironment) {\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n // Rebuild the rectangle from the anchor when possible, then fall back to scroll offset.\n if (item.kind !== 'area' && item.anchor && selection.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: {\n left: rect.left + rect.width * selection.relative.x,\n top: rect.top + rect.height * selection.relative.y,\n width: rect.width * selection.relative.width,\n height: rect.height * selection.relative.height,\n },\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n const viewportSelection = toViewportSelection(selection.viewport);\n\n return {\n viewport: {\n left: viewportSelection.left + sourceScroll.x - environment.window.scrollX,\n top: viewportSelection.top + sourceScroll.y - environment.window.scrollY,\n width: viewportSelection.width,\n height: viewportSelection.height,\n },\n isBound: item.kind === 'area',\n confidence: 0,\n };\n}\n\nfunction getAnchorHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (!item.anchor) return undefined;\n\n const viewport = getElementViewportSelection(item.anchor, environment);\n if (!viewport) return undefined;\n\n return {\n viewport,\n isBound: true,\n };\n}\n\nfunction getPointHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n const point = getBoundMarkerPoint(item, environment);\n if (!point) return undefined;\n\n const size = 16;\n return {\n viewport: {\n left: point.viewport.x - size / 2,\n top: point.viewport.y - size / 2,\n width: size,\n height: size,\n },\n isBound: point.isBound,\n };\n}\n\nfunction getVisibleHighlightSelection(\n candidates: Array<ReviewItemHighlightSelection | undefined>,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n // Candidate order encodes item-type priority; this only discards offscreen options.\n return candidates.find(\n (candidate): candidate is ReviewItemHighlightSelection =>\n Boolean(candidate && isSelectionInViewport(candidate.viewport, environment))\n );\n}\n\nfunction isDomReviewItem(item: ReviewItem) {\n return (\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && getItemSelection(item)))\n );\n}\n","import type { ReviewEnvironment } from './geometry';\n\n/** Waits one target animation frame before reading/restoring overlay state. */\nexport function waitForNextFrame(environment?: ReviewEnvironment) {\n return new Promise<void>((resolve) => {\n (environment?.window ?? window).requestAnimationFrame(() => resolve());\n });\n}\n\n/** Temporarily disables smooth scroll so restore lands synchronously. */\nexport function runWithAutoScrollBehavior(\n targetDocument: Document,\n callback: () => void\n) {\n const elements = [\n targetDocument.documentElement,\n targetDocument.body,\n ].filter((element): element is HTMLElement => Boolean(element));\n const previousValues = elements.map((element) => element.style.scrollBehavior);\n\n elements.forEach((element) => {\n element.style.scrollBehavior = 'auto';\n });\n\n try {\n callback();\n } finally {\n elements.forEach((element, index) => {\n element.style.scrollBehavior = previousValues[index] ?? '';\n });\n }\n}\n\n/** Restores target document scroll without relying on smooth scrolling behavior. */\nexport function setDocumentScrollInstantly(\n environment: ReviewEnvironment,\n position: { x: number; y: number }\n) {\n const scrollElement = environment.document.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = Math.max(0, Math.round(position.x));\n scrollElement.scrollTop = Math.max(0, Math.round(position.y));\n return;\n }\n\n environment.window.scrollTo(\n Math.max(0, Math.round(position.x)),\n Math.max(0, Math.round(position.y))\n );\n}\n","/** Creates the shadow-root stylesheet for the standalone core overlay. */\nexport function createStyleElement() {\n const style = document.createElement('style');\n style.textContent = `\n :host {\n color-scheme: dark;\n --df-review-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --df-review-font-size-2xs: 10px;\n --df-review-font-size-xs: 11px;\n --df-review-font-size-sm: 12px;\n --df-review-font-size-md: 13px;\n --df-review-font-size-xl: 15px;\n --df-review-space-1: 4px;\n --df-review-space-1-5: 6px;\n --df-review-space-2: 8px;\n --df-review-space-2-5: 10px;\n --df-review-space-3: 12px;\n --df-review-space-3-5: 14px;\n --df-review-space-4: 16px;\n --df-review-control-height-sm: 32px;\n --df-review-control-height-md: 34px;\n --df-review-radius-xs: 3px;\n --df-review-radius-sm: 6px;\n --df-review-radius-md: 8px;\n --df-review-radius-pill: 999px;\n --df-review-color-canvas: #111820;\n --df-review-color-panel: #1f2428;\n --df-review-color-panel-strong: #15191d;\n --df-review-color-control: #2c3338;\n --df-review-color-control-hover: #3b444b;\n --df-review-color-border: rgba(255, 255, 255, 0.14);\n --df-review-color-border-strong: rgba(255, 255, 255, 0.18);\n --df-review-color-text: #f7f7f2;\n --df-review-color-text-muted: rgba(247, 247, 242, 0.62);\n --df-review-color-text-subtle: rgba(247, 247, 242, 0.46);\n --df-review-color-accent: #d7ff5f;\n --df-review-color-accent-contrast: #171b1e;\n --df-review-color-accent-soft: rgba(215, 255, 95, 0.16);\n --df-review-color-accent-ring: rgba(215, 255, 95, 0.6);\n --df-review-color-area: #63d7c7;\n --df-review-color-error: #ffb7a7;\n --df-review-shadow-panel: 0 18px 48px rgba(0, 0, 0, 0.34);\n --df-review-shadow-popover: 0 16px 38px rgba(0, 0, 0, 0.32);\n --df-review-shadow-highlight: 0 10px 30px rgba(0, 0, 0, 0.22);\n font-family: var(--df-review-font-sans);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .dfwr-shell {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 500;\n pointer-events: none;\n }\n\n .dfwr-shell.is-open {\n display: block;\n }\n\n .dfwr-panel {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 3;\n width: min(380px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-panel);\n }\n\n .dfwr-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n padding: 14px 14px 10px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n }\n\n .dfwr-title {\n font-size: 15px;\n font-weight: 700;\n line-height: 1.25;\n }\n\n .dfwr-meta {\n max-width: 292px;\n margin-top: 4px;\n overflow: hidden;\n color: rgba(247, 247, 242, 0.56);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dfwr-toolbar,\n .dfwr-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 14px;\n }\n\n .dfwr-body,\n .dfwr-list {\n padding: 0 14px 14px;\n }\n\n .dfwr-list {\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n padding-top: 12px;\n }\n\n .dfwr-button,\n .dfwr-icon-button {\n appearance: none;\n border: 1px solid var(--df-review-color-border-strong);\n background: var(--df-review-color-control);\n color: var(--df-review-color-text);\n cursor: pointer;\n font: inherit;\n }\n\n .dfwr-button {\n min-height: var(--df-review-control-height-md);\n padding: 0 12px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-sm);\n font-weight: 650;\n }\n\n .dfwr-button:hover,\n .dfwr-icon-button:hover,\n .dfwr-button.is-active {\n border-color: rgba(255, 255, 255, 0.4);\n background: var(--df-review-color-control-hover);\n }\n\n .dfwr-button.is-primary {\n border-color: var(--df-review-color-accent);\n background: var(--df-review-color-accent);\n color: var(--df-review-color-accent-contrast);\n }\n\n .dfwr-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: var(--df-review-control-height-sm);\n padding: 0 8px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-xs);\n font-weight: 700;\n line-height: 1;\n text-transform: uppercase;\n }\n\n .dfwr-marker-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n }\n\n .dfwr-area-preview-layer {\n position: fixed;\n inset: 0;\n z-index: 3;\n pointer-events: none;\n }\n\n .dfwr-selection-highlight {\n position: fixed;\n z-index: 1;\n border: 2px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.12),\n 0 10px 30px rgba(0, 0, 0, 0.22);\n animation: dfwr-selection-pulse 900ms ease 0s 2;\n }\n\n .dfwr-selection-highlight.is-draft {\n border-color: #63d7c7;\n background: rgba(99, 215, 199, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 10px 30px rgba(0, 0, 0, 0.2);\n animation: none;\n }\n\n .dfwr-dom-hover {\n position: fixed;\n z-index: 2;\n border: 1px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08);\n pointer-events: none;\n }\n\n .dfwr-dom-hover[hidden] {\n display: none;\n }\n\n .dfwr-bound-marker,\n .dfwr-item-scope {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n }\n\n .dfwr-bound-marker.is-scope-tablet,\n .dfwr-item-scope.is-scope-tablet {\n --dfwr-scope: #63d7c7;\n --dfwr-scope-rgb: 99, 215, 199;\n }\n\n .dfwr-bound-marker.is-scope-desktop,\n .dfwr-item-scope.is-scope-desktop {\n --dfwr-scope: #f3b75f;\n --dfwr-scope-rgb: 243, 183, 95;\n }\n\n .dfwr-bound-marker.is-scope-wide,\n .dfwr-item-scope.is-scope-wide {\n --dfwr-scope: #c99cff;\n --dfwr-scope-rgb: 201, 156, 255;\n }\n\n .dfwr-bound-marker.is-scope-dom,\n .dfwr-item-scope.is-scope-dom {\n --dfwr-scope: #ff8f61;\n --dfwr-scope-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight,\n .dfwr-item-target-label {\n --dfwr-item-color: #7cc7ff;\n --dfwr-item-color-rgb: 124, 199, 255;\n }\n\n .dfwr-item-target-highlight.is-mode-area,\n .dfwr-item-target-label.is-mode-area {\n --dfwr-item-color: #63d7c7;\n --dfwr-item-color-rgb: 99, 215, 199;\n }\n\n .dfwr-item-target-highlight.is-mode-dom,\n .dfwr-item-target-label.is-mode-dom {\n --dfwr-item-color: #ff8f61;\n --dfwr-item-color-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight {\n position: fixed;\n z-index: 2;\n border: 2px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: rgba(var(--dfwr-item-color-rgb), 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.78),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 12px 30px rgba(0, 0, 0, 0.24);\n pointer-events: none;\n }\n\n .dfwr-item-target-highlight.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-item-target-highlight.is-highlighted {\n border-width: 3px;\n background: rgba(var(--dfwr-item-color-rgb), 0.12);\n }\n\n .dfwr-item-target-highlight.is-highlighted::after {\n content: \"\";\n position: absolute;\n inset: -6px;\n border: 2px solid var(--dfwr-item-color);\n border-radius: var(--df-review-radius-md);\n opacity: 0;\n animation: dfwr-target-ring-blink 1000ms ease-in-out infinite;\n pointer-events: none;\n }\n\n .dfwr-item-target-label {\n position: fixed;\n z-index: 3;\n display: inline-flex;\n align-items: center;\n min-width: 24px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: var(--dfwr-item-color);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-item-color-rgb), 0.2),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n pointer-events: none;\n }\n\n .dfwr-item-target-label.is-highlighted {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker {\n position: fixed;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n min-width: 28px;\n height: 22px;\n padding: 0 6px;\n transform: translate(-50%, -50%);\n border: 1px solid var(--dfwr-scope);\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-panel);\n box-shadow: 0 0 0 4px rgba(var(--dfwr-scope-rgb), 0.18);\n color: var(--dfwr-scope);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n }\n\n .dfwr-bound-marker.is-highlighted {\n min-width: 32px;\n height: 26px;\n border-width: 2px;\n box-shadow:\n 0 0 0 5px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 12px 26px rgba(0, 0, 0, 0.34);\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-bound-marker.is-note-callout,\n .dfwr-bound-marker.is-note-callout.is-highlighted {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n min-width: 0;\n width: 0;\n height: 0;\n padding: 0;\n transform: none;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n color: var(--dfwr-scope);\n animation: none;\n overflow: visible;\n }\n\n .dfwr-bound-marker.is-note-callout::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n width: 8px;\n height: 8px;\n transform: translate(-50%, -50%);\n border: 2px solid #111820;\n border-radius: var(--df-review-radius-pill);\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 6px 16px rgba(0, 0, 0, 0.28);\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted::before {\n animation: dfwr-note-dot-pulse 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon {\n position: absolute;\n left: 0;\n top: 0;\n width: 31px;\n height: 2px;\n transform: rotate(-42deg);\n transform-origin: left center;\n border-radius: var(--df-review-radius-pill);\n background: currentColor;\n opacity: 1;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::after {\n display: none;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-number {\n position: absolute;\n left: 24px;\n top: -41px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-scope);\n border-radius: 4px;\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.18),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n text-align: center;\n line-height: 1;\n white-space: nowrap;\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-icon,\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-number {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-area-preview-layer .dfwr-bound-marker {\n border-color: #63d7c7;\n background: var(--df-review-color-panel);\n box-shadow:\n 0 0 0 5px rgba(99, 215, 199, 0.2),\n 0 12px 26px rgba(0, 0, 0, 0.3);\n color: #63d7c7;\n }\n\n .dfwr-bound-marker-icon {\n position: relative;\n display: inline-block;\n width: 10px;\n height: 10px;\n flex: 0 0 auto;\n }\n\n .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker-icon::after {\n content: \"\";\n position: absolute;\n display: block;\n }\n\n .dfwr-bound-marker-icon::before {\n inset: 1px 2px;\n border: 1.5px solid currentColor;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-mobile .dfwr-bound-marker-icon::before {\n inset: 0 2.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-tablet .dfwr-bound-marker-icon::before {\n inset: 0.5px 1.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::before {\n inset: 1px 0 3px;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::after {\n left: 3px;\n right: 3px;\n bottom: 0;\n height: 1.5px;\n background: currentColor;\n }\n\n .dfwr-bound-marker.is-scope-wide .dfwr-bound-marker-icon::before {\n inset: 2px 0;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-dom .dfwr-bound-marker-icon::before {\n inset: 2px;\n border-radius: 1px;\n transform: rotate(45deg);\n }\n\n .dfwr-bound-marker-number {\n min-width: 6px;\n text-align: center;\n line-height: 1;\n }\n\n .dfwr-note-draft {\n position: fixed;\n inset: 0;\n z-index: 4;\n pointer-events: none;\n }\n\n .dfwr-note-pin {\n appearance: none;\n position: fixed;\n z-index: 5;\n width: 18px;\n height: 18px;\n padding: 0;\n transform: translate(-50%, -50%);\n border: 2px solid #1f2428;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-accent);\n box-shadow:\n 0 0 0 4px rgba(215, 255, 95, 0.22),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n cursor: grab;\n pointer-events: auto;\n }\n\n .dfwr-note-pin:active {\n cursor: grabbing;\n }\n\n .dfwr-note-popover {\n position: fixed;\n z-index: 4;\n width: min(320px, calc(100vw - 24px));\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-area-draft {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 4;\n width: min(360px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-note-popover .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-area-draft .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-form {\n display: grid;\n gap: 10px;\n }\n\n .dfwr-textarea {\n width: 100%;\n min-height: 92px;\n resize: vertical;\n border: 1px solid rgba(255, 255, 255, 0.16);\n border-radius: var(--df-review-radius-sm);\n padding: 10px;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel-strong);\n font: inherit;\n font-size: var(--df-review-font-size-md);\n line-height: 1.45;\n }\n\n .dfwr-textarea:focus {\n outline: 2px solid var(--df-review-color-accent-ring);\n outline-offset: 1px;\n }\n\n .dfwr-empty,\n .dfwr-error {\n margin: 0;\n color: rgba(247, 247, 242, 0.62);\n font-size: var(--df-review-font-size-sm);\n line-height: 1.45;\n }\n\n .dfwr-error {\n color: var(--df-review-color-error);\n }\n\n .dfwr-preview,\n .dfwr-thumb {\n display: block;\n width: 100%;\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-sm);\n object-fit: cover;\n background: var(--df-review-color-canvas);\n }\n\n .dfwr-preview {\n max-height: 180px;\n }\n\n .dfwr-thumb {\n max-height: 120px;\n margin-top: 10px;\n }\n\n .dfwr-list-heading {\n margin-bottom: 10px;\n color: rgba(247, 247, 242, 0.74);\n font-size: var(--df-review-font-size-sm);\n font-weight: 700;\n }\n\n .dfwr-item {\n display: flex;\n gap: 12px;\n justify-content: space-between;\n padding: 12px 0;\n border-top: 1px solid rgba(255, 255, 255, 0.08);\n cursor: pointer;\n }\n\n .dfwr-item:first-of-type {\n border-top: 0;\n }\n\n .dfwr-item:focus-visible {\n outline: 2px solid rgba(215, 255, 95, 0.72);\n outline-offset: 4px;\n }\n\n .dfwr-item-body {\n min-width: 0;\n flex: 1;\n }\n\n .dfwr-item-badges {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n }\n\n .dfwr-item-scope,\n .dfwr-item-kind {\n display: inline-flex;\n align-items: center;\n min-height: 20px;\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 1;\n letter-spacing: 0;\n text-transform: uppercase;\n }\n\n .dfwr-item-scope {\n border: 1px solid rgba(var(--dfwr-scope-rgb), 0.38);\n background: rgba(var(--dfwr-scope-rgb), 0.12);\n color: var(--dfwr-scope);\n }\n\n .dfwr-item-kind {\n border: 1px solid rgba(255, 255, 255, 0.12);\n background: rgba(255, 255, 255, 0.05);\n color: rgba(247, 247, 242, 0.64);\n }\n\n .dfwr-item-comment {\n margin: 4px 0;\n color: var(--df-review-color-text);\n font-size: var(--df-review-font-size-md);\n line-height: 1.42;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n .dfwr-item-date {\n color: rgba(247, 247, 242, 0.46);\n font-size: var(--df-review-font-size-xs);\n }\n\n .dfwr-item-actions {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex: 0 0 auto;\n }\n\n .dfwr-text-layer,\n .dfwr-element-layer,\n .dfwr-area-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: auto;\n }\n\n .dfwr-text-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-element-layer {\n cursor: cell;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-area-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.22);\n }\n\n .dfwr-area-box {\n position: fixed;\n z-index: 2;\n width: 0;\n height: 0;\n border: 1px solid #d7ff5f;\n background: rgba(215, 255, 95, 0.16);\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.18);\n }\n\n @keyframes dfwr-marker-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.92);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.1);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-note-dot-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.88);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.3);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-selected-blink {\n 0%,\n 100% {\n opacity: 0.78;\n }\n 50% {\n opacity: 1;\n }\n }\n\n @keyframes dfwr-target-ring-blink {\n 0%,\n 100% {\n opacity: 0;\n transform: scale(0.98);\n }\n 50% {\n opacity: 0.82;\n transform: scale(1);\n }\n }\n\n @keyframes dfwr-selection-pulse {\n 0% {\n opacity: 0.72;\n }\n 45% {\n opacity: 1;\n }\n 100% {\n opacity: 0.86;\n }\n }\n\n @media (max-width: 520px) {\n .dfwr-panel {\n right: 8px;\n top: 8px;\n width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n }\n }\n `;\n return style;\n}\n","import type {\n DomAnchor,\n RelativeSelection,\n ReviewItem,\n ReviewPoint,\n ViewportSize,\n} from '../../types';\nimport { getAnchorCandidates } from '../dom.anchor';\nimport type { AreaDraft, NoteDraft } from './draft';\nimport { getItemMarker, getItemSelection } from './item';\n\n/** Formats area draft metadata for compact debug display in the overlay UI. */\nexport function formatAreaDraftMeta(draft: AreaDraft) {\n const parts = [`viewport ${formatSize(draft.viewport)}`];\n\n if (draft.selection) {\n parts.push(`rect ${formatSelection(draft.selection.viewport)}`);\n }\n\n if (draft.marker) {\n parts.push(`point ${formatPoint(draft.marker.viewport)}`);\n }\n\n return parts.join(' / ');\n}\n\n/** Formats note draft metadata for compact debug display in the overlay UI. */\nexport function formatNoteDraftMeta(draft: NoteDraft) {\n const parts = [\n `viewport ${formatSize(draft.viewport)}`,\n `point ${formatPoint(draft.marker.viewport)}`,\n ];\n\n if (draft.anchor) {\n parts.push(formatAnchorMeta(draft.anchor));\n }\n\n return parts.join(' / ');\n}\n\n/** Formats persisted item metadata for list rows, marker titles, and overlays. */\nexport function formatItemMeta(item: ReviewItem) {\n const parts = [formatDate(item.createdAt)];\n const marker = getItemMarker(item);\n const selection = getItemSelection(item);\n\n if (item.viewport) {\n parts.push(`viewport ${formatSize(item.viewport)}`);\n }\n\n if (marker) {\n parts.push(`point ${formatPoint(marker.viewport)}`);\n }\n\n if (selection) {\n parts.push(`rect ${formatSelection(selection.viewport)}`);\n }\n\n if (item.anchor) {\n parts.push(formatAnchorMeta(item.anchor));\n }\n\n return parts.join(' / ');\n}\n\nfunction formatDate(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return date.toLocaleString(undefined, {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction formatSize(size: ViewportSize) {\n return `${Math.round(size.width)}x${Math.round(size.height)}`;\n}\n\nfunction formatPoint(point: ReviewPoint) {\n return `${Math.round(point.x)},${Math.round(point.y)}`;\n}\n\nfunction formatSelection(selection: RelativeSelection) {\n return [\n Math.round(selection.x),\n Math.round(selection.y),\n Math.round(selection.width),\n Math.round(selection.height),\n ].join(',');\n}\n\nfunction formatAnchorMeta(anchor: DomAnchor) {\n const parts = [`dom ${anchor.strategy}`];\n\n if (typeof anchor.confidence === 'number') {\n parts.push(`${Math.round(anchor.confidence * 100)}%`);\n }\n\n const candidates = getAnchorCandidates(anchor);\n if (candidates.length > 1) {\n parts.push(`${candidates.length} candidates`);\n }\n\n return parts.join(' ');\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemScope,\n ReviewMode,\n ReviewPoint,\n WebReviewKitOptions,\n} from '../types';\nimport {\n getDomAnchorFromPoint,\n getElementViewportSelection,\n} from './dom.anchor';\nimport {\n clampPoint,\n getAreaPopoverPosition,\n getPopoverPosition,\n getViewportSize,\n isPointInViewport,\n placeLayerOverTarget,\n roundPoint,\n toHostPoint,\n toHostSelection,\n toTargetPoint,\n toTargetPointFromHostEvent,\n toViewportSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\nimport { getRouteKey } from './location';\nimport { createStyleElement } from './overlay.style';\nimport type { AreaDraft, NoteDraft } from './review/draft';\nimport {\n formatAreaDraftMeta,\n formatItemMeta,\n formatNoteDraftMeta,\n} from './review/format';\nimport {\n getBoundMarkerPoint,\n getItemHighlightSelection,\n getReviewItemHighlightMode,\n shouldShowMarkerForScope,\n} from './review/item';\nimport {\n getNumberedReviewItems,\n getReviewViewportScope,\n} from './review/scope';\n\n/** Minimal item payload collected by the view before the app fills persistence metadata. */\nexport type CreateReviewItemInput = Pick<ReviewItem, 'kind' | 'comment'> &\n Partial<\n Pick<ReviewItem, 'scope' | 'viewport' | 'anchor' | 'marker' | 'selection'>\n >;\n\ninterface WebReviewKitViewState {\n isOpen: boolean;\n mode: ReviewMode;\n items: ReviewItem[];\n noteDraft?: NoteDraft;\n areaDraft?: AreaDraft;\n isSelectingArea: boolean;\n highlightedItemId?: string;\n}\n\ninterface WebReviewKitViewActions {\n close: () => void;\n render: () => void;\n reload: () => Promise<ReviewItem[]>;\n restoreItem: (item: ReviewItem) => Promise<void>;\n removeItem: (itemId: string) => Promise<void>;\n setModeState: (mode: ReviewMode) => void;\n clearDrafts: () => void;\n setNoteDraft: (draft?: NoteDraft) => void;\n setSelectingArea: (isSelectingArea: boolean) => void;\n createItem: (input: CreateReviewItemInput) => Promise<void>;\n bindNoteDraftToPoint: (point: ReviewPoint, comment?: string) => Promise<void>;\n bindElementDraftToPoint: (\n point: ReviewPoint,\n comment?: string\n ) => Promise<void>;\n createAreaDraft: (selection: ViewportSelection) => Promise<void>;\n}\n\ninterface WebReviewKitViewConfig {\n options: WebReviewKitOptions;\n getState: () => WebReviewKitViewState;\n getEnvironment: () => ReviewEnvironment | undefined;\n actions: WebReviewKitViewActions;\n}\n\n/** Vanilla DOM renderer for the core overlay, separate from React shell chrome. */\nexport class WebReviewKitView {\n constructor(private readonly config: WebReviewKitViewConfig) {}\n\n render(shadow: ShadowRoot, hiddenItemsStyle: HTMLStyleElement) {\n const state = this.state;\n\n shadow.replaceChildren();\n shadow.append(createStyleElement());\n shadow.append(hiddenItemsStyle);\n\n const shell = document.createElement('div');\n shell.className = `dfwr-shell${state.isOpen ? ' is-open' : ''}`;\n shell.setAttribute('aria-hidden', state.isOpen ? 'false' : 'true');\n\n if (this.config.options.ui?.panel !== false) {\n // Standalone core usage gets a built-in panel; React shell disables this.\n const panel = document.createElement('div');\n panel.className = 'dfwr-panel';\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-label', 'Web review kit');\n\n panel.append(\n this.createHeader(),\n this.createToolbar(),\n this.createBody(),\n this.createList()\n );\n\n shell.append(panel);\n }\n\n shell.append(this.createMarkerLayer());\n\n if (state.isOpen && (state.mode === 'note' || state.mode === 'element')) {\n shell.append(\n state.noteDraft\n ? this.createNotePopover(state.noteDraft)\n : state.mode === 'element'\n ? this.createElementLayer()\n : this.createNoteLayer()\n );\n }\n\n if (state.isOpen && state.mode === 'area' && !state.areaDraft) {\n shell.append(this.createAreaLayer());\n }\n\n if (\n state.isOpen &&\n state.mode === 'area' &&\n state.areaDraft &&\n this.config.options.ui?.panel === false\n ) {\n // Shell mode renders the draft form near the target because the side panel is React-owned.\n if (state.areaDraft.selection) {\n shell.append(this.createAreaDraftOverlay(state.areaDraft));\n }\n shell.append(this.createAreaDraftPopover(state.areaDraft));\n }\n\n shadow.append(shell);\n }\n\n private get state() {\n return this.config.getState();\n }\n\n private createHeader() {\n const header = document.createElement('div');\n header.className = 'dfwr-header';\n\n const title = document.createElement('div');\n title.className = 'dfwr-title';\n title.textContent = 'Review Kit';\n\n const meta = document.createElement('div');\n meta.className = 'dfwr-meta';\n meta.textContent = getRouteKey(this.config.getEnvironment());\n\n const titleGroup = document.createElement('div');\n titleGroup.append(title, meta);\n\n const close = document.createElement('button');\n close.className = 'dfwr-icon-button';\n close.type = 'button';\n close.textContent = 'x';\n close.setAttribute('aria-label', 'Close');\n close.addEventListener('click', () => this.config.actions.close());\n\n header.append(titleGroup, close);\n return header;\n }\n\n private createToolbar() {\n const toolbar = document.createElement('div');\n toolbar.className = 'dfwr-toolbar';\n\n toolbar.append(\n this.createToolbarButton('Note', this.state.mode === 'note', () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(mode === 'note' ? 'idle' : 'note');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }),\n this.createToolbarButton('Element', this.state.mode === 'element', () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(\n mode === 'element' ? 'idle' : 'element'\n );\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }),\n this.createToolbarButton(\n this.state.isSelectingArea ? 'Selecting' : 'Area',\n this.state.mode === 'area',\n () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(mode === 'area' ? 'idle' : 'area');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }\n ),\n this.createToolbarButton('Refresh', false, () => {\n void this.config.actions.reload();\n })\n );\n\n return toolbar;\n }\n\n private createToolbarButton(\n label: string,\n active: boolean,\n onClick: () => void\n ) {\n const button = document.createElement('button');\n button.className = `dfwr-button${active ? ' is-active' : ''}`;\n button.type = 'button';\n button.textContent = label;\n button.addEventListener('click', onClick);\n return button;\n }\n\n private createBody() {\n const body = document.createElement('div');\n body.className = 'dfwr-body';\n const state = this.state;\n\n if (state.mode === 'idle') {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Add a note or mark an area.';\n body.append(empty);\n return body;\n }\n\n if (state.mode === 'note' || state.mode === 'element') {\n body.append(this.createNoteBody());\n return body;\n }\n\n body.append(this.createAreaForm());\n return body;\n }\n\n private createNoteBody() {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = this.state.noteDraft\n ? 'Write the note in the page box.'\n : this.state.mode === 'element'\n ? 'Click an element to add QA.'\n : 'Click on the page to place a note.';\n return empty;\n }\n\n private createNotePopover(draft: NoteDraft) {\n const environment = this.config.getEnvironment();\n const group = document.createElement('div');\n group.className = 'dfwr-note-draft';\n if (!environment) return group;\n\n const hostPoint = toHostPoint(draft.marker.viewport, environment);\n\n if (draft.selection) {\n group.append(\n this.createSelectionHighlight(\n toViewportSelection(draft.selection.viewport),\n environment,\n true\n )\n );\n }\n\n const pin = document.createElement('button');\n pin.className = 'dfwr-note-pin';\n pin.type = 'button';\n pin.setAttribute('aria-label', 'Move note point');\n pin.style.left = `${hostPoint.x}px`;\n pin.style.top = `${hostPoint.y}px`;\n\n const popover = document.createElement('div');\n const position = getPopoverPosition(hostPoint, environment);\n\n popover.className = 'dfwr-note-popover';\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n\n const meta = document.createElement('div');\n meta.className = 'dfwr-item-date';\n meta.textContent = formatNoteDraftMeta(draft);\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Review comment';\n textarea.rows = 4;\n textarea.value = draft.comment ?? '';\n textarea.addEventListener('input', () => {\n const noteDraft = this.state.noteDraft;\n if (!noteDraft) return;\n this.config.actions.setNoteDraft({\n ...noteDraft,\n comment: textarea.value,\n });\n });\n\n const actions = this.createFormActions('Save note', () => {\n const comment = textarea.value.trim();\n if (!comment) return;\n void this.config.actions.createItem({\n kind: 'note',\n comment,\n viewport: draft.viewport,\n anchor: draft.anchor,\n marker: draft.marker,\n selection: draft.selection,\n });\n });\n\n form.append(meta, textarea, actions);\n popover.append(form);\n group.append(pin, popover);\n\n this.attachDraftPinDrag(pin, popover, meta, textarea);\n\n window.setTimeout(() => textarea.focus(), 0);\n\n return group;\n }\n\n private createAreaForm() {\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n const areaDraft = this.state.areaDraft;\n\n if (!areaDraft) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Drag on the page to select an area.';\n form.append(empty);\n return form;\n }\n\n const meta = document.createElement('div');\n meta.className = 'dfwr-item-date';\n meta.textContent = formatAreaDraftMeta(areaDraft);\n form.append(meta);\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Area comment';\n textarea.rows = 4;\n\n const actions = this.createFormActions('Save area', () => {\n const comment = textarea.value.trim();\n const draft = this.state.areaDraft;\n if (!comment || !draft) return;\n void this.config.actions.createItem({\n kind: 'area',\n comment,\n viewport: draft.viewport,\n anchor: draft.anchor,\n marker: draft.marker,\n selection: draft.selection,\n });\n });\n\n form.append(textarea, actions);\n return form;\n }\n\n private createAreaDraftOverlay(draft: AreaDraft) {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-preview-layer';\n\n const environment = this.config.getEnvironment();\n if (!environment || !draft.selection) return layer;\n\n const selection = toViewportSelection(draft.selection.viewport);\n layer.append(this.createSelectionHighlight(selection, environment, true));\n\n if (draft.marker) {\n const hostPoint = toHostPoint(draft.marker.viewport, environment);\n layer.append(\n this.createMarkerElement(\n undefined,\n hostPoint,\n '•',\n getReviewViewportScope(\n draft.viewport,\n this.config.options.viewports?.presets\n ),\n true,\n true\n )\n );\n }\n\n return layer;\n }\n\n private createAreaDraftPopover(draft: AreaDraft) {\n const environment = this.config.getEnvironment();\n const popover = document.createElement('div');\n popover.className = 'dfwr-area-draft';\n if (environment && draft.selection) {\n const selection = toHostSelection(\n toViewportSelection(draft.selection.viewport),\n environment\n );\n const position = getAreaPopoverPosition(selection, environment);\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n popover.style.right = 'auto';\n }\n popover.append(this.createAreaForm());\n return popover;\n }\n\n private createFormActions(saveLabel: string, onSave: () => void) {\n const actions = document.createElement('div');\n actions.className = 'dfwr-actions';\n\n const save = document.createElement('button');\n save.className = 'dfwr-button is-primary';\n save.type = 'button';\n save.textContent = saveLabel;\n save.addEventListener('click', onSave);\n\n const cancel = document.createElement('button');\n cancel.className = 'dfwr-button';\n cancel.type = 'button';\n cancel.textContent = 'Cancel';\n cancel.addEventListener('click', () => {\n this.config.actions.setModeState('idle');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n });\n\n actions.append(save, cancel);\n return actions;\n }\n\n private createList() {\n const section = document.createElement('div');\n section.className = 'dfwr-list';\n const state = this.state;\n\n const heading = document.createElement('div');\n heading.className = 'dfwr-list-heading';\n heading.textContent = `Review items (${state.items.length})`;\n section.append(heading);\n\n if (state.items.length === 0) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'No review items on this page.';\n section.append(empty);\n return section;\n }\n\n for (const numberedItem of getNumberedReviewItems(\n state.items,\n this.config.options.viewports?.presets\n )) {\n section.append(this.createListItem(numberedItem));\n }\n\n return section;\n }\n\n private createListItem(numberedItem: NumberedReviewItem) {\n const { item } = numberedItem;\n const row = document.createElement('article');\n row.className = 'dfwr-item';\n row.tabIndex = 0;\n row.setAttribute('role', 'button');\n row.setAttribute(\n 'aria-label',\n `Restore review item: ${item.title ?? item.comment}`\n );\n row.addEventListener('click', () => {\n void this.config.actions.restoreItem(item);\n });\n row.addEventListener('keydown', (event) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n\n event.preventDefault();\n void this.config.actions.restoreItem(item);\n });\n\n const body = document.createElement('div');\n body.className = 'dfwr-item-body';\n\n const badges = document.createElement('div');\n badges.className = 'dfwr-item-badges';\n\n const scope = document.createElement('div');\n scope.className = `dfwr-item-scope is-scope-${numberedItem.scope}`;\n scope.textContent = numberedItem.displayLabel;\n\n const kind = document.createElement('div');\n kind.className = 'dfwr-item-kind';\n kind.textContent = item.kind;\n badges.append(scope, kind);\n\n const comment = document.createElement('p');\n comment.className = 'dfwr-item-comment';\n comment.textContent = item.comment;\n\n const date = document.createElement('time');\n date.className = 'dfwr-item-date';\n date.dateTime = item.createdAt;\n date.textContent = formatItemMeta(item);\n\n body.append(badges, comment, date);\n\n const actions = document.createElement('div');\n actions.className = 'dfwr-item-actions';\n actions.addEventListener('click', (event) => event.stopPropagation());\n actions.addEventListener('keydown', (event) => event.stopPropagation());\n\n const remove = document.createElement('button');\n remove.className = 'dfwr-icon-button';\n remove.type = 'button';\n remove.textContent = 'x';\n remove.setAttribute('aria-label', 'Delete');\n remove.addEventListener('click', (event) => {\n event.stopPropagation();\n void this.config.actions\n .removeItem(item.id)\n .then(() => this.config.actions.reload());\n });\n\n actions.append(remove);\n row.append(body, actions);\n return row;\n }\n\n private createMarkerLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-marker-layer';\n const environment = this.config.getEnvironment();\n if (!environment) return layer;\n\n const currentScope = getReviewViewportScope(\n getViewportSize(environment),\n this.config.options.viewports?.presets\n );\n\n getNumberedReviewItems(\n this.state.items,\n this.config.options.viewports?.presets\n ).forEach((numberedItem) => {\n const { item, scope, displayLabel } = numberedItem;\n if (!shouldShowMarkerForScope(scope, currentScope)) {\n return;\n }\n\n const isHighlighted = item.id === this.state.highlightedItemId;\n const highlightMode = getReviewItemHighlightMode(item);\n if (\n highlightMode !== 'note' &&\n (!this.state.highlightedItemId || isHighlighted)\n ) {\n const selection = getItemHighlightSelection(item, environment);\n if (selection) {\n layer.append(\n ...this.createItemHighlightElements(\n selection.viewport,\n environment,\n item,\n displayLabel,\n selection.isBound,\n isHighlighted\n )\n );\n return;\n }\n }\n\n const point = getBoundMarkerPoint(item, environment);\n if (!point || !isPointInViewport(point.viewport, environment)) {\n return;\n }\n\n const hostPoint = toHostPoint(point.viewport, environment);\n const marker = this.createMarkerElement(\n item.id,\n hostPoint,\n displayLabel,\n scope,\n point.isBound,\n isHighlighted,\n highlightMode === 'note' ? 'note' : 'default'\n );\n marker.title = `${displayLabel} / ${item.comment}\\n${formatItemMeta(item)}`;\n layer.append(marker);\n });\n\n return layer;\n }\n\n private createItemHighlightElements(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n item: ReviewItem,\n label: string,\n isBound: boolean,\n isHighlighted: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const mode = getReviewItemHighlightMode(item);\n const highlight = document.createElement('div');\n highlight.className = [\n 'dfwr-item-target-highlight',\n `is-mode-${mode}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n highlight.dataset.reviewItemId = item.id;\n\n const labelElement = document.createElement('div');\n labelElement.className = [\n 'dfwr-item-target-label',\n `is-mode-${mode}`,\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n labelElement.textContent = label;\n labelElement.style.left = `${Math.max(4, rect.left)}px`;\n labelElement.style.top = `${Math.max(4, rect.top - 24)}px`;\n labelElement.dataset.reviewItemId = item.id;\n\n return [highlight, labelElement];\n }\n\n private createSelectionHighlight(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n isDraft: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const highlight = document.createElement('div');\n highlight.className = `dfwr-selection-highlight${\n isDraft ? ' is-draft' : ''\n }`;\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n return highlight;\n }\n\n private createMarkerElement(\n itemId: string | undefined,\n hostPoint: ReviewPoint,\n label: string,\n scope: ReviewItemScope,\n isBound: boolean,\n isHighlighted: boolean,\n variant: 'default' | 'note' = 'default'\n ) {\n const isNoteCallout = variant === 'note';\n const marker = document.createElement('div');\n marker.className = [\n 'dfwr-bound-marker',\n isNoteCallout ? 'is-note-callout' : '',\n `is-scope-${scope}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n marker.style.left = `${hostPoint.x}px`;\n marker.style.top = `${hostPoint.y}px`;\n marker.dataset.scope = scope;\n if (itemId) {\n marker.dataset.reviewItemId = itemId;\n }\n\n const iconElement = document.createElement('span');\n iconElement.className = 'dfwr-bound-marker-icon';\n iconElement.setAttribute('aria-hidden', 'true');\n const labelElement = document.createElement('span');\n labelElement.className = 'dfwr-bound-marker-number';\n labelElement.textContent = label;\n marker.append(iconElement, labelElement);\n\n return marker;\n }\n\n private attachDraftPinDrag(\n pin: HTMLButtonElement,\n popover: HTMLDivElement,\n meta: HTMLDivElement,\n textarea: HTMLTextAreaElement\n ) {\n let isDragging = false;\n\n const moveDraftUi = (hostPoint: ReviewPoint) => {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const nextPoint = clampPoint(toTargetPoint(hostPoint, environment), environment);\n const nextHostPoint = toHostPoint(nextPoint, environment);\n const position = getPopoverPosition(nextHostPoint, environment);\n\n pin.style.left = `${nextHostPoint.x}px`;\n pin.style.top = `${nextHostPoint.y}px`;\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n\n const noteDraft = this.state.noteDraft;\n if (!noteDraft) return;\n\n const nextDraft = {\n ...noteDraft,\n marker: {\n ...noteDraft.marker,\n viewport: roundPoint(nextPoint),\n },\n comment: textarea.value,\n };\n this.config.actions.setNoteDraft(nextDraft);\n meta.textContent = formatNoteDraftMeta(nextDraft);\n };\n\n pin.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = true;\n pin.setPointerCapture(event.pointerId);\n });\n\n pin.addEventListener('pointermove', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n moveDraftUi({\n x: event.clientX,\n y: event.clientY,\n });\n });\n\n pin.addEventListener('pointerup', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = false;\n pin.releasePointerCapture(event.pointerId);\n\n const nextPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n void (this.state.mode === 'element'\n ? this.config.actions.bindElementDraftToPoint(nextPoint, textarea.value)\n : this.config.actions.bindNoteDraftToPoint(nextPoint, textarea.value));\n });\n }\n\n private createNoteLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-text-layer';\n const environment = this.config.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.config.actions.bindNoteDraftToPoint(\n toTargetPointFromHostEvent(event, this.config.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private createElementLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-element-layer';\n const environment = this.config.getEnvironment();\n const hover = document.createElement('div');\n hover.className = 'dfwr-dom-hover';\n hover.hidden = true;\n layer.append(hover);\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const updateHover = (point: ReviewPoint) => {\n const nextEnvironment = this.config.getEnvironment();\n if (!nextEnvironment) return;\n\n const anchor = getDomAnchorFromPoint(\n clampPoint(point, nextEnvironment),\n this.config.options.anchors?.attribute,\n nextEnvironment\n );\n const selection = anchor\n ? getElementViewportSelection(anchor, nextEnvironment)\n : undefined;\n\n if (!selection) {\n hover.hidden = true;\n return;\n }\n\n const rect = toHostSelection(selection, nextEnvironment);\n hover.hidden = false;\n hover.style.left = `${rect.left}px`;\n hover.style.top = `${rect.top}px`;\n hover.style.width = `${rect.width}px`;\n hover.style.height = `${rect.height}px`;\n };\n\n layer.addEventListener('pointermove', (event) => {\n updateHover(toTargetPointFromHostEvent(event, this.config.getEnvironment()));\n });\n\n layer.addEventListener('pointerleave', () => {\n hover.hidden = true;\n });\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.config.actions.bindElementDraftToPoint(\n toTargetPointFromHostEvent(event, this.config.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private createAreaLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-layer';\n const environment = this.config.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const box = document.createElement('div');\n box.className = 'dfwr-area-box';\n layer.append(box);\n\n let startX = 0;\n let startY = 0;\n let selection: ViewportSelection | undefined;\n\n const updateBox = (event: PointerEvent) => {\n const nextPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n const left = Math.min(startX, nextPoint.x);\n const top = Math.min(startY, nextPoint.y);\n const width = Math.abs(nextPoint.x - startX);\n const height = Math.abs(nextPoint.y - startY);\n const hostPoint = toHostPoint(\n { x: left, y: top },\n this.config.getEnvironment()\n );\n\n selection = { left, top, width, height };\n box.style.left = `${hostPoint.x}px`;\n box.style.top = `${hostPoint.y}px`;\n box.style.width = `${width}px`;\n box.style.height = `${height}px`;\n };\n\n layer.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n layer.setPointerCapture(event.pointerId);\n const startPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n startX = startPoint.x;\n startY = startPoint.y;\n updateBox(event);\n });\n\n layer.addEventListener('pointermove', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n updateBox(event);\n });\n\n layer.addEventListener('pointerup', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n layer.releasePointerCapture(event.pointerId);\n updateBox(event);\n\n if (!selection || selection.width < 8 || selection.height < 8) return;\n\n this.config.actions.setSelectingArea(true);\n this.config.actions.render();\n void this.config.actions.createAreaDraft(selection);\n });\n\n return layer;\n }\n}\n","import { localAdapter } from '../adapters/local';\nimport type {\n DomAnchor,\n ReviewItem,\n ReviewMarker,\n ReviewMode,\n ReviewPoint,\n ReviewSelection,\n WebReviewKitAdapter,\n WebReviewKitController,\n WebReviewKitOptions,\n} from '../types';\nimport {\n cssEscape,\n getDomAnchor,\n getDomAnchorFromPoint,\n getElementViewportSelection,\n getRelativePoint,\n getRelativeSelection,\n} from './dom.anchor';\nimport {\n createId,\n} from './id';\nimport {\n clampPoint,\n getPointSelection,\n getSelectionCenter,\n getViewportSize,\n roundPoint,\n toPublicSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\nimport { isHotkey } from './hotkey';\nimport {\n getOriginalUrl,\n getPageUrl,\n getRouteKey,\n} from './location';\nimport { getReviewViewportScope } from './review/scope';\nimport { createSelectionCenterMarker } from './review/item';\nimport type { AreaDraft, NoteDraft } from './review/draft';\nimport {\n runWithAutoScrollBehavior,\n setDocumentScrollInstantly,\n waitForNextFrame,\n} from './scroll';\nimport {\n WebReviewKitView,\n type CreateReviewItemInput,\n} from './web.review.kit.view';\n\nconst ROOT_ID = 'df-web-review-kit-root';\n\nfunction isEditableEventTarget(event: KeyboardEvent) {\n const path = event.composedPath?.() ?? [];\n const element = (path[0] ?? event.target) as HTMLElement | null;\n if (!element || typeof element.tagName !== 'string') return false;\n\n const tag = element.tagName;\n return (\n tag === 'INPUT' ||\n tag === 'TEXTAREA' ||\n tag === 'SELECT' ||\n element.isContentEditable === true\n );\n}\n\n/** Creates the vanilla runtime controller that mounts review overlays on a target page. */\nexport function createWebReviewKit(\n options: WebReviewKitOptions\n): WebReviewKitController {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return createNoopController();\n }\n\n const app = new WebReviewKitApp(options);\n app.mount();\n\n return {\n open: () => app.open(),\n close: () => app.close(),\n toggle: () => app.toggle(),\n setMode: (mode) => app.setMode(mode),\n getMode: () => app.getMode(),\n highlightItem: (itemId) => app.highlightItem(itemId),\n setHiddenItemIds: (itemIds) => app.setHiddenItemIds(itemIds),\n reload: () => app.reload(),\n getItems: () => app.getItems(),\n destroy: () => app.destroy(),\n };\n}\n\nclass WebReviewKitApp {\n private readonly adapter: WebReviewKitAdapter;\n private readonly hotkey: string;\n private readonly view: WebReviewKitView;\n private root?: HTMLDivElement;\n private shadow?: ShadowRoot;\n private isOpen = false;\n private mode: ReviewMode = 'idle';\n private items: ReviewItem[] = [];\n private noteDraft?: NoteDraft;\n private areaDraft?: AreaDraft;\n private isSelectingArea = false;\n private highlightedItemId?: string;\n private hiddenItemIds?: Set<string>;\n private renderFrame?: number;\n\n constructor(private readonly options: WebReviewKitOptions) {\n this.adapter = options.adapter ?? localAdapter();\n this.hotkey = options.hotkeys?.qa ?? 'Shift+Q';\n this.view = new WebReviewKitView({\n options,\n getState: () => ({\n isOpen: this.isOpen,\n mode: this.mode,\n items: this.items,\n noteDraft: this.noteDraft,\n areaDraft: this.areaDraft,\n isSelectingArea: this.isSelectingArea,\n highlightedItemId: this.highlightedItemId,\n }),\n getEnvironment: () => this.getEnvironment(),\n actions: {\n close: () => this.close(),\n render: () => this.render(),\n reload: () => this.reload(),\n restoreItem: (item) => this.restoreItem(item),\n removeItem: (itemId) => this.adapter.remove(itemId),\n setModeState: (mode) => this.setModeState(mode),\n clearDrafts: () => {\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n },\n setNoteDraft: (draft) => {\n this.noteDraft = draft;\n },\n setSelectingArea: (isSelectingArea) => {\n this.isSelectingArea = isSelectingArea;\n },\n createItem: (input) => this.createItem(input),\n bindNoteDraftToPoint: (point, comment) =>\n this.bindNoteDraftToPoint(point, comment),\n bindElementDraftToPoint: (point, comment) =>\n this.bindElementDraftToPoint(point, comment),\n createAreaDraft: (selection) => this.createAreaDraft(selection),\n },\n });\n }\n\n mount() {\n if (this.root) return;\n\n const existing = document.getElementById(ROOT_ID);\n if (existing) existing.remove();\n\n this.root = document.createElement('div');\n this.root.id = ROOT_ID;\n this.root.style.display = 'contents';\n\n this.shadow = this.root.attachShadow({ mode: 'open' });\n document.body.appendChild(this.root);\n document.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('scroll', this.handleViewportChange, true);\n window.addEventListener('resize', this.handleViewportChange);\n\n this.render();\n }\n\n destroy() {\n document.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('scroll', this.handleViewportChange, true);\n window.removeEventListener('resize', this.handleViewportChange);\n if (this.renderFrame) {\n window.cancelAnimationFrame(this.renderFrame);\n this.renderFrame = undefined;\n }\n this.root?.remove();\n this.root = undefined;\n this.shadow = undefined;\n }\n\n open() {\n if (this.isOpen) return;\n\n this.isOpen = true;\n void this.reload();\n }\n\n close() {\n this.isOpen = false;\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n }\n\n toggle() {\n if (this.isOpen) {\n this.close();\n return;\n }\n\n this.open();\n }\n\n setMode(mode: ReviewMode) {\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.setModeState(this.mode === mode ? 'idle' : mode);\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.render();\n }\n\n getMode() {\n return this.mode;\n }\n\n getItems() {\n return this.items;\n }\n\n highlightItem(itemId?: string) {\n if (!itemId) {\n this.clearHighlightedItem();\n return;\n }\n\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.highlightedItemId = itemId;\n this.render();\n }\n\n setHiddenItemIds(itemIds?: string[]) {\n this.hiddenItemIds = itemIds ? new Set(itemIds) : undefined;\n this.updateHiddenItemsStyle();\n }\n\n private clearHighlightedItem() {\n if (!this.highlightedItemId) return;\n\n this.highlightedItemId = undefined;\n this.render();\n }\n\n private createHiddenItemsStyleElement() {\n const style = document.createElement('style');\n style.dataset.dfwrHiddenItems = 'true';\n style.textContent = this.getHiddenItemsCss();\n return style;\n }\n\n private updateHiddenItemsStyle() {\n if (!this.shadow) return;\n\n let style = this.shadow.querySelector<HTMLStyleElement>(\n 'style[data-dfwr-hidden-items=\"true\"]'\n );\n if (!style) {\n style = this.createHiddenItemsStyleElement();\n this.shadow.prepend(style);\n return;\n }\n\n style.textContent = this.getHiddenItemsCss();\n }\n\n private getHiddenItemsCss() {\n if (!this.hiddenItemIds?.size) return '';\n\n return Array.from(this.hiddenItemIds)\n .map(\n (itemId) =>\n `[data-review-item-id=\"${cssEscape(itemId)}\"] { display: none !important; }`\n )\n .join('\\n');\n }\n\n private setModeState(mode: ReviewMode) {\n if (this.mode === mode) return;\n\n this.mode = mode;\n this.options.onModeChange?.(mode);\n }\n\n private cancelMode() {\n if (\n this.mode === 'idle' &&\n !this.noteDraft &&\n !this.areaDraft &&\n !this.isSelectingArea\n ) {\n return false;\n }\n\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n return true;\n }\n\n private readonly handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.cancelMode()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isEditableEventTarget(event) || !isHotkey(event, this.hotkey)) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.toggle();\n };\n\n private readonly handleViewportChange = () => {\n if (!this.isOpen || this.renderFrame) return;\n\n this.renderFrame = window.requestAnimationFrame(() => {\n this.renderFrame = undefined;\n this.render();\n });\n };\n\n private getEnvironment(): ReviewEnvironment | undefined {\n const target =\n typeof this.options.target === 'function'\n ? this.options.target()\n : this.options.target;\n\n if (!target) {\n return {\n window,\n document,\n viewportRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n overlayRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n };\n }\n\n try {\n const rect = target.getViewportRect?.() ?? {\n left: 0,\n top: 0,\n width: target.window.innerWidth,\n height: target.window.innerHeight,\n };\n const overlayRect = target.getOverlayRect?.() ?? rect;\n\n return {\n window: target.window,\n document: target.document,\n viewportRect: {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n },\n overlayRect: {\n left: overlayRect.left,\n top: overlayRect.top,\n width: overlayRect.width,\n height: overlayRect.height,\n },\n };\n } catch {\n return undefined;\n }\n }\n\n async reload() {\n const environment = this.getEnvironment();\n if (!environment) return this.items;\n\n this.items = await this.adapter.list({\n projectId: this.options.projectId,\n routeKey: getRouteKey(environment),\n });\n this.options.onItemsChange?.(this.items);\n if (this.isOpen) {\n this.render();\n }\n return this.items;\n }\n\n private render() {\n if (!this.shadow) return;\n\n this.view.render(this.shadow, this.createHiddenItemsStyleElement());\n }\n\n private async bindNoteDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const selection = getPointSelection(nextPoint);\n const anchor = getDomAnchor(\n selection,\n this.options.anchors?.attribute,\n environment\n );\n const marker: ReviewMarker = {\n viewport: roundPoint(nextPoint),\n relative: anchor\n ? getRelativePoint(nextPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n comment,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private async bindElementDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const anchor = getDomAnchorFromPoint(\n nextPoint,\n this.options.anchors?.attribute,\n environment\n );\n const elementSelection = anchor\n ? getElementViewportSelection(anchor, environment)\n : undefined;\n const selection = elementSelection ?? getPointSelection(nextPoint);\n const markerPoint = getSelectionCenter(selection);\n const reviewSelection = elementSelection\n ? {\n viewport: toPublicSelection(elementSelection),\n relative: getRelativeSelection(\n elementSelection,\n anchor as DomAnchor,\n environment\n ),\n }\n : undefined;\n const marker: ReviewMarker = {\n viewport: roundPoint(markerPoint),\n relative: anchor\n ? getRelativePoint(markerPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n selection: reviewSelection,\n comment,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private async createAreaDraft(selection: ViewportSelection) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n\n this.areaDraft = await this.withOverlayHidden(() => {\n const marker = createSelectionCenterMarker(\n selection,\n undefined,\n environment\n );\n const reviewSelection: ReviewSelection = {\n viewport: toPublicSelection(selection),\n };\n\n return {\n viewport,\n marker,\n selection: reviewSelection,\n };\n });\n this.isSelectingArea = false;\n this.setModeState('area');\n this.render();\n }\n\n private async withOverlayHidden<T>(callback: () => Promise<T> | T) {\n if (!this.root) return callback();\n\n const previousDisplay = this.root.style.display;\n this.root.style.display = 'none';\n\n try {\n // Hide our own overlay while sampling elementFromPoint so we anchor to the page.\n return await callback();\n } finally {\n this.root.style.display = previousDisplay;\n }\n }\n\n private async createItem(input: CreateReviewItemInput) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const now = new Date().toISOString();\n const routeKey = getRouteKey(environment);\n const viewport = input.viewport ?? getViewportSize(environment);\n const createdBy = this.options.userId?.trim();\n const item: ReviewItem = {\n id: createId(),\n projectId: this.options.projectId,\n routeKey,\n pageUrl: getPageUrl(environment),\n originalUrl: getOriginalUrl(environment),\n normalizedPath: routeKey,\n scope:\n input.scope ??\n getReviewViewportScope(viewport, this.options.viewports?.presets),\n kind: input.kind,\n title: input.comment.split('\\n')[0]?.slice(0, 80),\n comment: input.comment,\n createdBy: createdBy || undefined,\n status: 'todo',\n viewport,\n devicePixelRatio: environment.window.devicePixelRatio || 1,\n scroll: {\n x: environment.window.scrollX,\n y: environment.window.scrollY,\n },\n anchor: input.anchor,\n marker: input.marker,\n selection: input.selection,\n createdAt: now,\n updatedAt: now,\n };\n\n const createdItem = await this.adapter.create(item);\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.highlightItem(createdItem.id);\n await this.reload();\n await this.options.onCreateItem?.(createdItem);\n }\n\n private async restoreItem(item: ReviewItem) {\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n\n if (this.options.onRestoreItem) {\n await this.options.onRestoreItem(item);\n return;\n }\n\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const scroll = item.scroll;\n if (scroll) {\n runWithAutoScrollBehavior(environment.document, () => {\n setDocumentScrollInstantly(environment, scroll);\n });\n await waitForNextFrame(environment);\n }\n\n this.highlightItem(item.id);\n this.render();\n }\n}\n\nfunction createNoopController(): WebReviewKitController {\n return {\n open() {},\n close() {},\n toggle() {},\n setMode() {},\n getMode() {\n return 'idle';\n },\n highlightItem() {},\n setHiddenItemIds() {},\n async reload() {\n return [];\n },\n getItems() {\n return [];\n },\n destroy() {},\n };\n}\n","import type { TargetOverlayState } from '../types';\n\nexport const HIDE_SCROLLBAR_STYLE_ID = 'df-review-hide-scrollbar';\n\nexport const setTargetScrollbarHidden = (\n targetDocument: Document | null | undefined,\n hidden: boolean\n) => {\n if (!targetDocument) return;\n\n const existing = targetDocument.getElementById(HIDE_SCROLLBAR_STYLE_ID);\n if (hidden) {\n if (existing) return;\n const style = targetDocument.createElement('style');\n style.id = HIDE_SCROLLBAR_STYLE_ID;\n style.textContent =\n 'html{scrollbar-width:none}html::-webkit-scrollbar,body::-webkit-scrollbar{width:0;height:0;display:none}';\n targetDocument.head?.appendChild(style);\n } else {\n existing?.remove();\n }\n};\n\nexport const isEditableEventTarget = (event: KeyboardEvent) => {\n const path = event.composedPath?.() ?? [];\n const element = (path[0] ?? event.target) as HTMLElement | null;\n if (!element || typeof element.tagName !== 'string') return false;\n const tag = element.tagName;\n return (\n tag === 'INPUT' || tag === 'TEXTAREA' || element.isContentEditable === true\n );\n};\n\nexport const getTargetOverlayState = (\n targetDocument: Document | undefined\n): TargetOverlayState => ({\n grid: Boolean(\n targetDocument?.body.classList.contains('is-help') ||\n targetDocument?.querySelector('.helper.onShow')\n ),\n figma: Boolean(\n targetDocument?.querySelector(\n '.helper-figma-root, .helper-figma-loading-backdrop'\n )\n )\n});\n","import type { MutableRefObject } from 'react';\nimport {\n getFrameRouteTarget,\n normalizeTarget,\n} from '../route';\n\ninterface BindReviewFrameNavigationOptions {\n pageTargets: ReadonlySet<string>;\n reviewPathPrefix: string;\n targetDocument: Document;\n targetRef: MutableRefObject<string>;\n targetWindow: Window;\n onCancelReviewMode: () => boolean;\n onCloseRuler: () => boolean;\n onSyncShellTarget: (target: string) => void;\n onSyncTargetViewport: () => void;\n}\n\nexport const bindReviewFrameNavigation = ({\n pageTargets,\n reviewPathPrefix,\n targetDocument,\n targetRef,\n targetWindow,\n onCancelReviewMode,\n onCloseRuler,\n onSyncShellTarget,\n onSyncTargetViewport,\n}: BindReviewFrameNavigationOptions) => {\n const syncRouteFromFrame = () => {\n const nextTarget = getFrameRouteTarget(targetWindow, reviewPathPrefix);\n if (nextTarget !== targetRef.current && !pageTargets.has(nextTarget)) {\n return;\n }\n\n onSyncShellTarget(nextTarget);\n };\n\n const handleClick = (event: MouseEvent) => {\n if (event.defaultPrevented || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n const targetElement = event.target;\n if (!targetElement || !('closest' in targetElement)) return;\n\n const link = (targetElement as Element).closest('a[href]');\n const href = link?.getAttribute('href');\n const linkTarget = link?.getAttribute('target');\n if (!href || (linkTarget && linkTarget !== '_self')) return;\n\n const url = new URL(href, targetWindow.location.href);\n if (url.origin !== targetWindow.location.origin) return;\n\n const nextTarget = normalizeTarget(url.pathname, reviewPathPrefix);\n if (nextTarget === targetRef.current) return;\n\n event.preventDefault();\n onSyncShellTarget(nextTarget);\n };\n\n const handleFrameKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n if (!onCancelReviewMode() && !onCloseRuler()) return;\n\n event.preventDefault();\n event.stopPropagation();\n };\n\n const history = targetWindow.history;\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<History['pushState']>) => {\n originalPushState(...args);\n syncRouteFromFrame();\n };\n history.replaceState = (...args: Parameters<History['replaceState']>) => {\n originalReplaceState(...args);\n syncRouteFromFrame();\n };\n\n syncRouteFromFrame();\n targetWindow.addEventListener('popstate', syncRouteFromFrame);\n targetWindow.addEventListener('hashchange', syncRouteFromFrame);\n targetWindow.addEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.addEventListener('click', handleClick, true);\n targetWindow.addEventListener('scroll', onSyncTargetViewport, true);\n targetWindow.addEventListener('resize', onSyncTargetViewport);\n\n return () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n targetWindow.removeEventListener('popstate', syncRouteFromFrame);\n targetWindow.removeEventListener('hashchange', syncRouteFromFrame);\n targetWindow.removeEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.removeEventListener('click', handleClick, true);\n targetWindow.removeEventListener('scroll', onSyncTargetViewport, true);\n targetWindow.removeEventListener('resize', onSyncTargetViewport);\n };\n};\n","import type { RefObject } from 'react';\nimport type { WebReviewKitTarget } from '../../types';\n\ninterface GetReviewKitTargetOptions {\n frameScrollRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n}\n\nexport const getReviewKitTarget = ({\n frameScrollRef,\n iframeRef,\n}: GetReviewKitTargetOptions): WebReviewKitTarget | undefined => {\n const frame = iframeRef.current;\n const frameWindow = frame?.contentWindow;\n const frameDocument = frame?.contentDocument;\n\n if (!frame || !frameWindow || !frameDocument) return undefined;\n\n return {\n window: frameWindow,\n document: frameDocument,\n getViewportRect: () => frame.getBoundingClientRect(),\n getOverlayRect: () => {\n const frameRect = frame.getBoundingClientRect();\n const scrollRect = frameScrollRef.current?.getBoundingClientRect();\n if (!scrollRect) return frameRect;\n\n const left = Math.max(frameRect.left, scrollRect.left);\n const top = Math.max(frameRect.top, scrollRect.top);\n const right = Math.min(\n frameRect.left + frameRect.width,\n scrollRect.left + scrollRect.width\n );\n const bottom = Math.min(\n frameRect.top + frameRect.height,\n scrollRect.top + scrollRect.height\n );\n\n return {\n left,\n top,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n };\n },\n };\n};\n","import { useCallback, useEffect, type RefObject } from 'react';\nimport { getTargetOverlayState } from '../target/target';\nimport type {\n TargetOverlayKey,\n TargetOverlayState,\n} from '../types';\n\ninterface UseReviewTargetOverlayOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isFigmaOverlayAvailable: boolean;\n targetOverlayState: TargetOverlayState;\n onTargetOverlayStateChange: (state: TargetOverlayState) => void;\n}\n\nexport const useReviewTargetOverlay = ({\n iframeRef,\n isFigmaOverlayAvailable,\n targetOverlayState,\n onTargetOverlayStateChange,\n}: UseReviewTargetOverlayOptions) => {\n const refreshTargetOverlayState = useCallback(() => {\n onTargetOverlayStateChange(\n getTargetOverlayState(iframeRef.current?.contentDocument ?? undefined)\n );\n }, [iframeRef, onTargetOverlayStateChange]);\n\n const dispatchTargetOverlayHotkey = useCallback(\n (overlay: TargetOverlayKey) => {\n const targetWindow = iframeRef.current?.contentWindow;\n if (!targetWindow) return false;\n\n const code = overlay === 'grid' ? 'KeyG' : 'KeyF';\n targetWindow.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n cancelable: true,\n code,\n key: code.replace('Key', '').toLowerCase(),\n shiftKey: true,\n })\n );\n window.setTimeout(refreshTargetOverlayState, 80);\n return true;\n },\n [iframeRef, refreshTargetOverlayState]\n );\n\n const toggleTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n if (overlay === 'figma' && !isFigmaOverlayAvailable) {\n refreshTargetOverlayState();\n return;\n }\n\n dispatchTargetOverlayHotkey(overlay);\n },\n [\n dispatchTargetOverlayHotkey,\n isFigmaOverlayAvailable,\n refreshTargetOverlayState,\n ]\n );\n\n const closeTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n const currentState = getTargetOverlayState(\n iframeRef.current?.contentDocument ?? undefined\n );\n onTargetOverlayStateChange(currentState);\n if (!currentState[overlay]) return false;\n\n return dispatchTargetOverlayHotkey(overlay);\n },\n [dispatchTargetOverlayHotkey, iframeRef, onTargetOverlayStateChange]\n );\n\n useEffect(() => {\n if (isFigmaOverlayAvailable || !targetOverlayState.figma) return;\n closeTargetOverlay('figma');\n }, [closeTargetOverlay, isFigmaOverlayAvailable, targetOverlayState.figma]);\n\n return {\n closeTargetOverlay,\n refreshTargetOverlayState,\n toggleTargetOverlay,\n };\n};\n","import {\n useCallback,\n useEffect,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type { ReviewSource } from '../../types';\nimport {\n normalizeTarget,\n updateShellUrl,\n updateShellUrlForItem,\n} from '../route';\nimport { setTargetScrollbarHidden } from '../target/target';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface UseReviewTargetSyncOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n reviewPathPrefix: string;\n selectedItemIdRef: MutableRefObject<string | null>;\n size: ReviewShellViewportPreset;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n target: string;\n targetRef: MutableRefObject<string>;\n onActiveRouteChange: (target: string) => void;\n onClearSelectedItem: () => void;\n onDraftTargetChange: (target: string) => void;\n onSyncTargetViewport: () => void;\n onTargetChange: (target: string) => void;\n}\n\nexport const useReviewTargetSync = ({\n iframeRef,\n reviewPathPrefix,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetRef,\n onActiveRouteChange,\n onClearSelectedItem,\n onDraftTargetChange,\n onSyncTargetViewport,\n onTargetChange,\n}: UseReviewTargetSyncOptions) => {\n const syncShellTarget = useCallback(\n (nextTarget: string) => {\n const normalizedTarget = normalizeTarget(nextTarget, reviewPathPrefix);\n\n if (normalizedTarget !== targetRef.current) {\n onClearSelectedItem();\n targetRef.current = normalizedTarget;\n onTargetChange(normalizedTarget);\n onDraftTargetChange(normalizedTarget);\n onActiveRouteChange(normalizedTarget);\n }\n\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n normalizedTarget,\n sizeRef.current,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n }\n },\n [\n onActiveRouteChange,\n onClearSelectedItem,\n onDraftTargetChange,\n onTargetChange,\n reviewPathPrefix,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n ]\n );\n\n useEffect(() => {\n targetRef.current = target;\n onActiveRouteChange(target);\n }, [onActiveRouteChange, target, targetRef]);\n\n useEffect(() => {\n sizeRef.current = size;\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n targetRef.current,\n size,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(targetRef.current, size, source);\n }\n onSyncTargetViewport();\n setTargetScrollbarHidden(\n iframeRef.current?.contentDocument,\n getViewportPresetKind(size) === 'mobile'\n );\n }, [\n iframeRef,\n onSyncTargetViewport,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n targetRef,\n ]);\n\n return {\n syncShellTarget,\n };\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { NumberedReviewItem, ReviewMode, ReviewSource } from '../../types';\nimport {\n getReviewPresenceColor,\n getReviewPresenceDisplayName,\n getReviewPresenceSessionId,\n} from '../presence/presence';\nimport { normalizeTarget } from '../route';\nimport type {\n ReviewPresenceAdapter,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewShellViewportPreset,\n} from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface UseReviewPresenceOptions {\n activeRoute: string;\n mode: ReviewMode;\n presence?: ReviewPresenceAdapter;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n selectedNumberedItem?: NumberedReviewItem;\n size: ReviewShellViewportPreset;\n source: ReviewSource;\n}\n\nconst getPresenceUserTarget = (\n user: ReviewPresenceUser,\n reviewPathPrefix: string\n) => normalizeTarget(user.target || user.routeKey, reviewPathPrefix);\n\nconst dedupePresenceUsersByPageAndId = (\n users: ReviewPresenceUser[],\n reviewPathPrefix: string\n) => {\n const userByPageAndId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const userId = user.userId.trim();\n if (!userId) return;\n\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const key = `${userTarget}::${userId}`;\n const currentUser = userByPageAndId.get(key);\n\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userByPageAndId.set(key, user);\n }\n });\n\n return Array.from(userByPageAndId.values());\n};\n\nexport const useReviewPresence = ({\n activeRoute,\n mode,\n presence,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n selectedNumberedItem,\n size,\n source,\n}: UseReviewPresenceOptions) => {\n const presenceSessionRef = useRef<ReviewPresenceSession | null>(null);\n const [presenceUsers, setPresenceUsers] = useState<ReviewPresenceUser[]>([]);\n const [presenceSessionVersion, setPresenceSessionVersion] = useState(0);\n const presenceSessionId = useMemo(getReviewPresenceSessionId, []);\n const normalizedReviewUserId = reviewUserId.trim();\n const presenceDisplayName = getReviewPresenceDisplayName(\n normalizedReviewUserId\n );\n const presenceColor = getReviewPresenceColor(\n normalizedReviewUserId || presenceSessionId\n );\n const presenceViewport = useMemo(\n () => ({\n label: size.label,\n width: size.width,\n height: size.height,\n kind: getViewportPresetKind(size),\n }),\n [size]\n );\n const presenceStatus: ReviewPresenceStatus =\n mode === 'idle' ? 'reviewing' : 'editing';\n const visiblePresenceUsers = useMemo(\n () => {\n const projectPresenceUsers = presenceUsers.filter(\n (user) => user.projectId === projectId && user.userId.trim()\n );\n\n return dedupePresenceUsersByPageAndId(\n projectPresenceUsers,\n reviewPathPrefix\n );\n },\n [presenceUsers, projectId, reviewPathPrefix]\n );\n const currentPagePresenceUsers = useMemo(\n () =>\n visiblePresenceUsers.filter((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n\n return userTarget === activeRoute;\n }),\n [activeRoute, reviewPathPrefix, visiblePresenceUsers]\n );\n const pagePresenceUsers = useMemo(() => {\n const usersByTarget = new Map<string, ReviewPresenceUser[]>();\n\n visiblePresenceUsers.forEach((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const pageUsers = usersByTarget.get(userTarget) ?? [];\n\n pageUsers.push(user);\n usersByTarget.set(userTarget, pageUsers);\n });\n\n return usersByTarget;\n }, [reviewPathPrefix, visiblePresenceUsers]);\n\n const getCurrentPresenceState = useCallback(\n (): ReviewPresenceState => ({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n routeKey: activeRoute,\n target: activeRoute,\n source,\n viewport: presenceViewport,\n mode,\n selectedItemId: selectedNumberedItem?.item.id ?? null,\n selectedReviewNumber: selectedNumberedItem?.number ?? null,\n status: presenceStatus,\n updatedAt: new Date().toISOString(),\n }),\n [\n activeRoute,\n mode,\n normalizedReviewUserId,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n presenceStatus,\n presenceViewport,\n projectId,\n selectedNumberedItem,\n source,\n ]\n );\n const getCurrentPresenceStateRef = useRef(getCurrentPresenceState);\n getCurrentPresenceStateRef.current = getCurrentPresenceState;\n\n useEffect(() => {\n if (!presence || !normalizedReviewUserId) {\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n return undefined;\n }\n\n let isActive = true;\n let unsubscribe: (() => void) | undefined;\n const initialState = getCurrentPresenceStateRef.current();\n\n void Promise.resolve(\n presence.connect({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n initialState,\n })\n ).then((session) => {\n if (!isActive) {\n void session.disconnect();\n return;\n }\n\n presenceSessionRef.current = session;\n unsubscribe = session.subscribe(setPresenceUsers);\n setPresenceSessionVersion((current) => current + 1);\n void session.update(initialState);\n }).catch(() => {\n if (!isActive) return;\n\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n });\n\n return () => {\n isActive = false;\n unsubscribe?.();\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n };\n }, [\n normalizedReviewUserId,\n presence,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n projectId,\n ]);\n\n useEffect(() => {\n const session = presenceSessionRef.current;\n if (!session || !normalizedReviewUserId) return;\n\n void session.update(getCurrentPresenceState());\n }, [\n getCurrentPresenceState,\n normalizedReviewUserId,\n presenceSessionVersion,\n ]);\n\n return {\n currentPagePresenceUsers,\n pagePresenceUsers,\n presenceSessionId,\n };\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from '../types';\n\nconst REVIEW_PRESENCE_SESSION_KEY = 'df-review-presence-session-id';\nconst DEFAULT_LOCAL_PRESENCE_CHANNEL = 'df-review-kit:presence';\nconst DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS = 5000;\nconst DEFAULT_LOCAL_PRESENCE_STALE_MS = 16000;\nconst PRESENCE_COLORS = [\n '#7cc7ff',\n '#63d7c7',\n '#f3b75f',\n '#c99cff',\n '#ff8f61',\n '#9cc76b',\n '#f278a6',\n '#79a7ff',\n];\n\ntype LocalPresenceMessage =\n | {\n type: 'request';\n sessionId: string;\n }\n | {\n type: 'update';\n sessionId: string;\n user: ReviewPresenceUser;\n }\n | {\n type: 'leave';\n sessionId: string;\n };\n\nexport type LocalPresenceAdapterOptions = {\n channelName?: string;\n heartbeatMs?: number;\n staleMs?: number;\n};\n\nconst createId = () => {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nconst hashString = (value: string) => {\n let hash = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(index);\n hash |= 0;\n }\n\n return Math.abs(hash);\n};\n\nexport const getReviewPresenceColor = (value: string) =>\n PRESENCE_COLORS[hashString(value || 'anonymous') % PRESENCE_COLORS.length];\n\nexport const getReviewPresenceDisplayName = (userId: string) =>\n userId.trim() || 'anonymous';\n\nexport const getReviewPresenceSessionId = () => {\n if (typeof window === 'undefined') return createId();\n\n try {\n const stored = window.sessionStorage.getItem(REVIEW_PRESENCE_SESSION_KEY);\n if (stored) return stored;\n\n const nextId = createId();\n window.sessionStorage.setItem(REVIEW_PRESENCE_SESSION_KEY, nextId);\n return nextId;\n } catch {\n return createId();\n }\n};\n\nconst getTimestamp = () => new Date().toISOString();\n\nconst normalizePresenceUser = (\n state: ReviewPresenceState\n): ReviewPresenceUser => ({\n ...state,\n displayName: getReviewPresenceDisplayName(state.displayName || state.userId),\n updatedAt: state.updatedAt || getTimestamp(),\n});\n\nexport const createLocalPresenceAdapter = (\n options: LocalPresenceAdapterOptions = {}\n): ReviewPresenceAdapter => ({\n label: 'local-presence',\n connect: (context: ReviewPresenceContext) => {\n const heartbeatMs =\n options.heartbeatMs ?? DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS;\n const staleMs = options.staleMs ?? DEFAULT_LOCAL_PRESENCE_STALE_MS;\n const users = new Map<string, ReviewPresenceUser>();\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentUser = normalizePresenceUser({\n ...context.initialState,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n\n const Channel =\n typeof BroadcastChannel === 'undefined' ? undefined : BroadcastChannel;\n const channel = Channel\n ? new Channel(options.channelName ?? DEFAULT_LOCAL_PRESENCE_CHANNEL)\n : null;\n\n const getUsers = () => {\n const now = Date.now();\n\n users.forEach((user, sessionId) => {\n if (now - Date.parse(user.updatedAt) > staleMs) {\n users.delete(sessionId);\n }\n });\n\n return Array.from(users.values()).sort((a, b) => {\n if (a.sessionId === context.sessionId) return -1;\n if (b.sessionId === context.sessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n };\n\n const emit = () => {\n const nextUsers = getUsers();\n listeners.forEach((listener) => listener(nextUsers));\n };\n\n const post = (message: LocalPresenceMessage) => {\n try {\n channel?.postMessage(message);\n } catch {\n return;\n }\n };\n\n const publish = () => {\n post({\n type: 'update',\n sessionId: context.sessionId,\n user: currentUser,\n });\n };\n\n if (channel) {\n channel.onmessage = (event: MessageEvent<LocalPresenceMessage>) => {\n const message = event.data;\n if (!message || message.sessionId === context.sessionId) return;\n\n if (message.type === 'request') {\n publish();\n return;\n }\n\n if (message.type === 'leave') {\n users.delete(message.sessionId);\n emit();\n return;\n }\n\n if (message.type === 'update' && message.user) {\n users.set(message.sessionId, normalizePresenceUser(message.user));\n emit();\n }\n };\n }\n\n const intervalId =\n typeof window === 'undefined'\n ? undefined\n : window.setInterval(() => {\n currentUser = {\n ...currentUser,\n updatedAt: getTimestamp(),\n };\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n }, heartbeatMs);\n\n emit();\n publish();\n post({\n type: 'request',\n sessionId: context.sessionId,\n });\n\n return {\n update: (state) => {\n currentUser = normalizePresenceUser({\n ...currentUser,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: () => {\n if (intervalId) {\n window.clearInterval(intervalId);\n }\n post({\n type: 'leave',\n sessionId: context.sessionId,\n });\n channel?.close();\n listeners.clear();\n users.clear();\n },\n };\n },\n});\n\nexport const createFallbackPresenceAdapter = (\n primaryAdapter: ReviewPresenceAdapter,\n fallbackAdapter: ReviewPresenceAdapter\n): ReviewPresenceAdapter => ({\n label: `${primaryAdapter.label}-with-${fallbackAdapter.label}-fallback`,\n connect: async (context: ReviewPresenceContext) => {\n try {\n return await primaryAdapter.connect(context);\n } catch (error) {\n if (typeof console !== 'undefined') {\n console.warn(\n `[df-review-kit] ${primaryAdapter.label} failed. Falling back to ${fallbackAdapter.label}.`,\n error\n );\n }\n return fallbackAdapter.connect(context);\n }\n },\n});\n","import {\n useCallback,\n useEffect,\n useState,\n type RefObject,\n} from 'react';\nimport type { ReviewRulerConfig } from '../../types';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { useReviewRulerDrag } from './use.review.ruler.drag';\n\ninterface UseReviewRulerOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n ruler?: ReviewRulerConfig;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onCancelReviewMode: () => void;\n onCloseTransientPanels: () => void;\n}\n\nexport const useReviewRuler = ({\n iframeRef,\n ruler,\n size,\n targetSrc,\n onCancelReviewMode,\n onCloseTransientPanels,\n}: UseReviewRulerOptions) => {\n const [isRulerVisible, setIsRulerVisible] = useState(false);\n const isRulerAvailable =\n ruler?.enabled !== false &&\n typeof size.designWidth === 'number' &&\n size.designWidth > 0;\n const rulerUnit = ruler?.unit ?? 'px';\n const rulerScaleX =\n isRulerAvailable && size.designWidth ? size.width / size.designWidth : 1;\n const rulerScaleY =\n size.designHeight && size.designHeight > 0\n ? size.height / size.designHeight\n : rulerScaleX;\n const {\n clearRulerMeasure,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerOverlayRef,\n } = useReviewRulerDrag({\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n size,\n targetSrc,\n });\n const rulerMeasureLabel = rulerMeasure\n ? `${Math.round(rulerMeasure.width / rulerScaleX)} × ${Math.round(\n rulerMeasure.height / rulerScaleY\n )} ${rulerUnit}`\n : '';\n\n const closeRuler = useCallback(() => {\n if (!isRulerVisible) return false;\n\n setIsRulerVisible(false);\n clearRulerMeasure();\n return true;\n }, [clearRulerMeasure, isRulerVisible]);\n\n const toggleRuler = useCallback(() => {\n if (!isRulerAvailable) return;\n\n onCancelReviewMode();\n onCloseTransientPanels();\n clearRulerMeasure();\n setIsRulerVisible((current) => !current);\n }, [\n clearRulerMeasure,\n isRulerAvailable,\n onCancelReviewMode,\n onCloseTransientPanels,\n ]);\n\n useEffect(() => {\n if (!isRulerVisible || isRulerAvailable) return;\n closeRuler();\n }, [closeRuler, isRulerAvailable, isRulerVisible]);\n\n return {\n closeRuler,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n toggleRuler,\n };\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from 'react';\nimport { getRulerMeasure, getRulerPointFromRect } from '../ruler/ruler';\nimport type { ReviewRulerPoint, ReviewShellViewportPreset } from '../types';\n\ninterface UseReviewRulerDragOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n}\n\nexport const useReviewRulerDrag = ({\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n size,\n targetSrc,\n}: UseReviewRulerDragOptions) => {\n const rulerOverlayRef = useRef<HTMLDivElement | null>(null);\n const rulerDragRectRef = useRef<DOMRect | null>(null);\n const isRulerDraggingRef = useRef(false);\n const sizeRef = useRef(size);\n const [rulerStart, setRulerStart] = useState<ReviewRulerPoint | null>(null);\n const [rulerPoint, setRulerPoint] = useState<ReviewRulerPoint | null>(null);\n const [rulerHover, setRulerHover] = useState<ReviewRulerPoint | null>(null);\n const [isRulerDragging, setIsRulerDragging] = useState(false);\n\n const rulerMeasure = useMemo(\n () => getRulerMeasure(rulerStart, rulerPoint),\n [rulerPoint, rulerStart]\n );\n\n const clearRulerMeasure = useCallback(() => {\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setRulerStart(null);\n setRulerPoint(null);\n setRulerHover(null);\n setIsRulerDragging(false);\n }, []);\n\n const finishRulerDrag = useCallback((point?: ReviewRulerPoint) => {\n if (point) {\n setRulerPoint(point);\n }\n\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setIsRulerDragging(false);\n }, []);\n\n const startRulerDrag = useCallback(\n (clientX: number, clientY: number, rect: DOMRect) => {\n const point = getRulerPointFromRect(clientX, clientY, rect);\n\n rulerDragRectRef.current = rect;\n isRulerDraggingRef.current = true;\n\n setRulerStart(point);\n setRulerPoint(point);\n setIsRulerDragging(true);\n },\n []\n );\n\n useEffect(() => {\n sizeRef.current = size;\n }, [size]);\n\n useEffect(() => {\n if (!isRulerVisible || !isRulerAvailable) return undefined;\n\n const getRulerEventClientPoint = (event: MouseEvent) => {\n const frame = iframeRef.current;\n let isFrameEvent = false;\n\n try {\n isFrameEvent =\n Boolean(frame?.contentWindow) && event.view === frame?.contentWindow;\n\n if (!isFrameEvent && frame?.contentDocument) {\n const targetDocument = (\n event.target as { ownerDocument?: Document } | null\n )?.ownerDocument;\n isFrameEvent = targetDocument === frame.contentDocument;\n }\n } catch {\n isFrameEvent = false;\n }\n\n if (isFrameEvent && frame) {\n const frameRect = frame.getBoundingClientRect();\n\n return {\n clientX: event.clientX + frameRect.left,\n clientY: event.clientY + frameRect.top,\n };\n }\n\n return {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n };\n\n const snapDesign = (screen: number, axis: 'x' | 'y') => {\n const current = sizeRef.current;\n const scaleX = current.designWidth\n ? current.width / current.designWidth\n : 1;\n const scale =\n axis === 'y'\n ? current.designHeight\n ? current.height / current.designHeight\n : scaleX\n : scaleX;\n return Math.round(Math.round(screen / scale) * scale);\n };\n\n const getActiveRulerPoint = (event: MouseEvent) => {\n const rect =\n rulerDragRectRef.current ??\n rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return undefined;\n\n const point = getRulerEventClientPoint(event);\n const snapped = getRulerPointFromRect(point.clientX, point.clientY, rect);\n\n return { x: snapDesign(snapped.x, 'x'), y: snapDesign(snapped.y, 'y') };\n };\n\n const getHoverRulerPoint = (event: MouseEvent) => {\n const rect = rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return null;\n\n const { clientX, clientY } = getRulerEventClientPoint(event);\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n if (x < 0 || y < 0 || x > rect.width || y > rect.height) return null;\n\n return { x: snapDesign(x, 'x'), y: snapDesign(y, 'y') };\n };\n\n const handleDragStart: EventListener = (event) => {\n if (isRulerDraggingRef.current) return;\n\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.button !== 0) return;\n\n const overlay = rulerOverlayRef.current;\n const target = mouseEvent.target;\n if (!overlay || !(target instanceof Node) || !overlay.contains(target)) {\n return;\n }\n\n event.preventDefault();\n startRulerDrag(\n mouseEvent.clientX,\n mouseEvent.clientY,\n overlay.getBoundingClientRect()\n );\n };\n\n const handlePointerMove: EventListener = (event) => {\n const mouseEvent = event as MouseEvent;\n\n if (isRulerDraggingRef.current) {\n const point = getActiveRulerPoint(mouseEvent);\n if (!point) return;\n\n mouseEvent.preventDefault();\n setRulerPoint(point);\n setRulerHover(point);\n return;\n }\n\n setRulerHover(getHoverRulerPoint(mouseEvent));\n };\n\n const handleDragEnd: EventListener = (event) => {\n if (!isRulerDraggingRef.current) return;\n\n const point = getActiveRulerPoint(event as MouseEvent);\n event.preventDefault();\n finishRulerDrag(point);\n };\n\n const handleWindowBlur = () => {\n if (!isRulerDraggingRef.current) return;\n\n finishRulerDrag();\n };\n\n const dragTargets = new Set<EventTarget>([window]);\n const frame = iframeRef.current;\n\n try {\n if (frame?.contentWindow) dragTargets.add(frame.contentWindow);\n if (frame?.contentDocument) dragTargets.add(frame.contentDocument);\n } catch {\n // Cross-origin frames cannot expose their document. Parent listeners still run.\n }\n\n dragTargets.forEach((target) => {\n target.addEventListener('mousedown', handleDragStart, true);\n target.addEventListener('mousemove', handlePointerMove, true);\n target.addEventListener('mouseup', handleDragEnd, true);\n });\n\n window.addEventListener('blur', handleWindowBlur);\n\n return () => {\n dragTargets.forEach((target) => {\n target.removeEventListener('mousedown', handleDragStart, true);\n target.removeEventListener('mousemove', handlePointerMove, true);\n target.removeEventListener('mouseup', handleDragEnd, true);\n });\n window.removeEventListener('blur', handleWindowBlur);\n };\n }, [\n finishRulerDrag,\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n startRulerDrag,\n ]);\n\n useEffect(() => {\n clearRulerMeasure();\n }, [clearRulerMeasure, size.height, size.width, targetSrc]);\n\n return {\n clearRulerMeasure,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerOverlayRef,\n };\n};\n","import type { ReviewRulerMeasure, ReviewRulerPoint } from '../types';\n\nexport const getRulerPointFromRect = (\n clientX: number,\n clientY: number,\n rect: DOMRect\n): ReviewRulerPoint => {\n const x = Math.min(Math.max(clientX - rect.left, 0), rect.width);\n const y = Math.min(Math.max(clientY - rect.top, 0), rect.height);\n\n return {\n x: Math.round(x),\n y: Math.round(y)\n };\n};\n\nexport const getRulerMeasure = (\n start: ReviewRulerPoint | null,\n end: ReviewRulerPoint | null\n): ReviewRulerMeasure | undefined => {\n if (!start || !end) return undefined;\n\n return {\n left: Math.min(start.x, end.x),\n top: Math.min(start.y, end.y),\n width: Math.abs(end.x - start.x),\n height: Math.abs(end.y - start.y)\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { DEFAULT_REVIEW_THEME } from '../constants';\nimport {\n getStoredFigmaToken,\n getStoredReviewTheme,\n getStoredReviewUserId,\n getSystemReviewTheme,\n normalizeReviewTheme,\n writeStoredFigmaToken,\n writeStoredReviewTheme,\n writeStoredReviewUserId,\n} from '../settings';\nimport type { ReviewShellTheme } from '../types';\n\ninterface UseReviewSettingsOptions {\n onCancelReviewMode: () => void | boolean;\n onCloseInitialPrompt: () => void;\n onCloseSitemap: () => void;\n onReloadTargetFrame: () => void;\n}\n\nexport const useReviewSettings = ({\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n onReloadTargetFrame,\n}: UseReviewSettingsOptions) => {\n const [figmaTokenDraft, setFigmaTokenDraft] = useState(getStoredFigmaToken);\n const [reviewUserId, setReviewUserId] = useState(getStoredReviewUserId);\n const [reviewUserIdDraft, setReviewUserIdDraft] = useState(\n getStoredReviewUserId\n );\n const [reviewTheme, setReviewTheme] = useState(getStoredReviewTheme);\n const [reviewThemeDraft, setReviewThemeDraft] =\n useState(getStoredReviewTheme);\n const [systemReviewTheme, setSystemReviewTheme] =\n useState(getSystemReviewTheme);\n const [figmaSettingsStatus, setFigmaSettingsStatus] = useState('');\n const [isFigmaSettingsOpen, setIsFigmaSettingsOpen] = useState(false);\n const [isFigmaTokenVisible, setIsFigmaTokenVisible] = useState(false);\n const [isFigmaTokenGuideOpen, setIsFigmaTokenGuideOpen] = useState(false);\n const effectiveReviewTheme =\n reviewTheme === 'system' ? systemReviewTheme : reviewTheme;\n\n const closeFigmaSettings = useCallback(() => {\n setIsFigmaSettingsOpen(false);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n }, []);\n\n const openFigmaSettings = useCallback(() => {\n onCancelReviewMode();\n onCloseSitemap();\n onCloseInitialPrompt();\n setFigmaTokenDraft(getStoredFigmaToken());\n setReviewUserIdDraft(getStoredReviewUserId());\n setReviewThemeDraft(reviewTheme);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n setIsFigmaSettingsOpen(true);\n }, [\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n reviewTheme,\n ]);\n\n const saveReviewSettings = useCallback(\n (token: string, userId: string, theme: ReviewShellTheme) => {\n const nextToken = token.trim();\n const nextUserId = userId.trim();\n const nextTheme = normalizeReviewTheme(theme);\n const shouldReload =\n nextToken !== getStoredFigmaToken() ||\n nextUserId !== getStoredReviewUserId();\n\n writeStoredFigmaToken(nextToken);\n writeStoredReviewUserId(nextUserId);\n writeStoredReviewTheme(nextTheme);\n setFigmaTokenDraft(nextToken);\n setReviewUserId(nextUserId);\n setReviewUserIdDraft(nextUserId);\n setReviewTheme(nextTheme);\n setReviewThemeDraft(nextTheme);\n setFigmaSettingsStatus(\n nextToken || nextUserId || nextTheme !== DEFAULT_REVIEW_THEME\n ? 'Saved'\n : 'Cleared'\n );\n\n if (shouldReload) {\n onReloadTargetFrame();\n }\n closeFigmaSettings();\n },\n [closeFigmaSettings, onReloadTargetFrame]\n );\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return undefined;\n\n const query = window.matchMedia('(prefers-color-scheme: light)');\n const syncSystemTheme = () => {\n setSystemReviewTheme(query.matches ? 'light' : 'dark');\n };\n\n syncSystemTheme();\n\n if (query.addEventListener) {\n query.addEventListener('change', syncSystemTheme);\n return () => query.removeEventListener('change', syncSystemTheme);\n }\n\n query.addListener(syncSystemTheme);\n return () => query.removeListener(syncSystemTheme);\n }, []);\n\n useEffect(() => {\n document.body.classList.toggle(\n 'df-review-theme-light',\n effectiveReviewTheme === 'light'\n );\n document.body.classList.toggle(\n 'df-review-theme-dark',\n effectiveReviewTheme === 'dark'\n );\n\n return () => {\n document.body.classList.remove(\n 'df-review-theme-light',\n 'df-review-theme-dark'\n );\n };\n }, [effectiveReviewTheme]);\n\n return {\n closeFigmaSettings,\n effectiveReviewTheme,\n figmaSettingsStatus,\n figmaTokenDraft,\n isFigmaSettingsOpen,\n isFigmaTokenGuideOpen,\n isFigmaTokenVisible,\n openFigmaSettings,\n reviewThemeDraft,\n reviewUserId,\n reviewUserIdDraft,\n saveReviewSettings,\n setFigmaSettingsStatus,\n setFigmaTokenDraft,\n setIsFigmaTokenGuideOpen,\n setIsFigmaTokenVisible,\n setReviewThemeDraft,\n setReviewUserIdDraft,\n };\n};\n","import { useCallback, useMemo, useState } from 'react';\nimport {\n getNumberedReviewItems,\n} from '../../core/review/scope';\nimport type {\n ReviewItem,\n ReviewViewportPreset,\n} from '../../types';\nimport {\n buildTargetSrc,\n getItemTarget,\n normalizeTarget,\n} from '../route';\nimport type {\n ReviewQaFilter,\n ReviewShellPage,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n} from '../types';\nimport {\n findViewportPreset,\n getViewportPresetKind,\n} from '../viewport';\nimport type { SitemapQaCount } from '../sitemap/tree';\n\nexport type SitemapItemsBySource = {\n local: ReviewItem[];\n remote: ReviewItem[];\n};\n\ninterface UseReviewShellDataOptions {\n activeRoute: string;\n pages: ReviewShellPage[];\n reviewPathPrefix: string;\n reviewViewportPresets: ReviewViewportPreset[];\n selectedItemId: string | null;\n size: ReviewShellViewportPreset;\n target: string;\n viewportPresets: ReviewShellViewportPreset[];\n}\n\nconst createEmptySitemapQaCount = (): SitemapQaCount => ({\n local: 0,\n remote: 0,\n});\n\nexport const useReviewShellData = ({\n activeRoute,\n pages,\n reviewPathPrefix,\n reviewViewportPresets,\n selectedItemId,\n size,\n target,\n viewportPresets,\n}: UseReviewShellDataOptions) => {\n const [items, setItems] = useState<ReviewItem[]>([]);\n const [hiddenOverlayItemIds, setHiddenOverlayItemIds] = useState<Set<string>>(\n () => new Set()\n );\n const [qaFilter, setQaFilter] = useState<ReviewQaFilter>('all');\n const [sitemapItems, setSitemapItems] = useState<SitemapItemsBySource>(() => ({\n local: [],\n remote: [],\n }));\n\n const targetSrc = useMemo(() => buildTargetSrc(target), [target]);\n const pageTargets = useMemo(\n () =>\n new Set(\n pages.map((page) => normalizeTarget(page.href, reviewPathPrefix))\n ),\n [pages, reviewPathPrefix]\n );\n const activeItems = useMemo(\n () =>\n items\n .filter((item) => getItemTarget(item, reviewPathPrefix) === activeRoute)\n .sort((a, b) => b.createdAt.localeCompare(a.createdAt)),\n [activeRoute, items, reviewPathPrefix]\n );\n const numberedActiveItems = useMemo(\n () => getNumberedReviewItems(activeItems, reviewViewportPresets),\n [activeItems, reviewViewportPresets]\n );\n const filteredNumberedActiveItems = useMemo(\n () =>\n qaFilter === 'all'\n ? numberedActiveItems\n : numberedActiveItems.filter(\n (numberedItem) => numberedItem.scope === qaFilter\n ),\n [numberedActiveItems, qaFilter]\n );\n const hiddenOverlayItemIdList = useMemo(\n () => Array.from(hiddenOverlayItemIds),\n [hiddenOverlayItemIds]\n );\n const qaFilterCounts = useMemo(() => {\n const counts = new Map<ReviewQaFilter, number>();\n counts.set('all', numberedActiveItems.length);\n numberedActiveItems.forEach((numberedItem) => {\n counts.set(numberedItem.scope, (counts.get(numberedItem.scope) ?? 0) + 1);\n });\n return counts;\n }, [numberedActiveItems]);\n const getItemPresetScope = useCallback(\n (item: ReviewItem) =>\n getViewportPresetKind(\n findViewportPreset(\n viewportPresets,\n item.viewport?.width ?? 0,\n item.viewport?.height ?? 0\n )\n ),\n [viewportPresets]\n );\n const presetScopeCounts = useMemo(() => {\n const counts = new Map<ReviewShellViewportKind, number>();\n activeItems.forEach((item) => {\n const scope = getItemPresetScope(item);\n counts.set(scope, (counts.get(scope) ?? 0) + 1);\n });\n return counts;\n }, [activeItems, getItemPresetScope]);\n const currentPresetScope = getViewportPresetKind(size);\n const pageQaCounts = useMemo(() => {\n const counts = new Map<string, SitemapQaCount>();\n const addItems = (\n sourceKey: keyof SitemapItemsBySource,\n sourceItems: ReviewItem[]\n ) => {\n sourceItems.forEach((item) => {\n const pageTarget = normalizeTarget(\n getItemTarget(item, reviewPathPrefix),\n reviewPathPrefix\n );\n const count = counts.get(pageTarget) ?? createEmptySitemapQaCount();\n count[sourceKey] += 1;\n counts.set(pageTarget, count);\n });\n };\n\n addItems('local', sitemapItems.local);\n addItems('remote', sitemapItems.remote);\n\n return counts;\n }, [reviewPathPrefix, sitemapItems]);\n const selectedNumberedItem = useMemo(\n () =>\n selectedItemId\n ? numberedActiveItems.find(\n (numberedItem) => numberedItem.item.id === selectedItemId\n )\n : undefined,\n [numberedActiveItems, selectedItemId]\n );\n\n return {\n activeItems,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIds,\n pageQaCounts,\n pageTargets,\n presetScopeCounts,\n qaFilter,\n qaFilterCounts,\n selectedNumberedItem,\n setHiddenOverlayItemIds,\n setItems,\n setQaFilter,\n setSitemapItems,\n targetSrc,\n };\n};\n","import { useEffect } from 'react';\nimport type { ReviewMode } from '../../types';\nimport { isEditableEventTarget } from '../target/target';\nimport type { TargetOverlayKey } from '../types';\n\ninterface UseReviewShellHotkeysOptions {\n isFigmaSettingsOpen: boolean;\n isInitialPromptOpen: boolean;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n isSitemapOpen: boolean;\n mode: ReviewMode;\n onCancelReviewMode: () => boolean;\n onCloseFigmaSettings: () => void;\n onCloseInitialPrompt: () => void;\n onCloseRuler: () => boolean;\n onCloseSitemap: () => void;\n onSetReviewMode: (mode: ReviewMode) => void;\n onToggleRuler: () => void;\n onToggleTargetOverlay: (overlay: TargetOverlayKey) => void;\n}\n\nexport const useReviewShellHotkeys = ({\n isFigmaSettingsOpen,\n isInitialPromptOpen,\n isRulerAvailable,\n isRulerVisible,\n isSitemapOpen,\n mode,\n onCancelReviewMode,\n onCloseFigmaSettings,\n onCloseInitialPrompt,\n onCloseRuler,\n onCloseSitemap,\n onSetReviewMode,\n onToggleRuler,\n onToggleTargetOverlay,\n}: UseReviewShellHotkeysOptions) => {\n useEffect(() => {\n if (\n mode === 'idle' &&\n !isRulerVisible &&\n !isInitialPromptOpen &&\n !isSitemapOpen &&\n !isFigmaSettingsOpen\n ) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n\n if (mode !== 'idle' && onCancelReviewMode()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (onCloseRuler()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isInitialPromptOpen) {\n onCloseInitialPrompt();\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isSitemapOpen) {\n onCloseSitemap();\n return;\n }\n\n if (isFigmaSettingsOpen) {\n onCloseFigmaSettings();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [\n isFigmaSettingsOpen,\n isInitialPromptOpen,\n isRulerVisible,\n isSitemapOpen,\n mode,\n onCancelReviewMode,\n onCloseFigmaSettings,\n onCloseInitialPrompt,\n onCloseRuler,\n onCloseSitemap,\n ]);\n\n useEffect(() => {\n const handleHotkey = (event: KeyboardEvent) => {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {\n return;\n }\n if (isEditableEventTarget(event)) return;\n\n const actions: Record<string, () => void> = {\n r: () => {\n if (isRulerAvailable) onToggleRuler();\n },\n g: () => onToggleTargetOverlay('grid'),\n f: () => onToggleTargetOverlay('figma'),\n n: () => onSetReviewMode('note'),\n e: () => onSetReviewMode('element'),\n a: () => onSetReviewMode('area'),\n };\n const action = actions[event.key.toLowerCase()];\n if (!action) return;\n\n event.preventDefault();\n action();\n };\n\n window.addEventListener('keydown', handleHotkey);\n return () => window.removeEventListener('keydown', handleHotkey);\n }, [\n isRulerAvailable,\n onSetReviewMode,\n onToggleRuler,\n onToggleTargetOverlay,\n ]);\n};\n","import {\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewMode,\n ReviewSource,\n WebReviewKitController,\n} from '../../types';\nimport { normalizeReviewShellAdapters } from '../adapters';\nimport {\n getInitialItemId,\n getInitialSource,\n getInitialTarget,\n} from '../route';\nimport type {\n ReviewShellAdapters,\n ReviewShellViewportPreset,\n TargetOverlayState,\n} from '../types';\nimport {\n DEFAULT_REVIEW_VIEWPORT_PRESETS,\n getInitialSize,\n getIsFigmaOverlayAvailable,\n toReviewViewportPresets,\n} from '../viewport';\n\ninterface UseReviewShellStateOptions {\n adapters: ReviewShellAdapters;\n presets: ReviewShellViewportPreset[];\n reviewPathPrefix: string;\n}\n\nexport const useReviewShellState = ({\n adapters,\n presets,\n reviewPathPrefix,\n}: UseReviewShellStateOptions) => {\n const viewportPresets =\n presets.length > 0 ? presets : DEFAULT_REVIEW_VIEWPORT_PRESETS;\n const reviewViewportPresets = useMemo(\n () => toReviewViewportPresets(viewportPresets),\n [viewportPresets]\n );\n const normalizedAdapters = useMemo(\n () => normalizeReviewShellAdapters(adapters),\n [adapters]\n );\n const localAdapterEntry = normalizedAdapters.local;\n const remoteAdapterEntry = normalizedAdapters.remote;\n const sourceEntries = normalizedAdapters.sources;\n const defaultSource = sourceEntries[0]?.label ?? 'local';\n const [source, setSource] = useState<ReviewSource>(() => {\n const initialSource = getInitialSource(remoteAdapterEntry?.label);\n return sourceEntries.some((entry) => entry.label === initialSource)\n ? initialSource\n : defaultSource;\n });\n const remoteSource = remoteAdapterEntry?.label ?? null;\n const activeAdapterEntry =\n sourceEntries.find((entry) => entry.label === source) ?? sourceEntries[0]!;\n const isRemoteSource = Boolean(\n remoteSource && activeAdapterEntry.label === remoteSource\n );\n const showSourceSelect = sourceEntries.length > 1;\n const canWriteArea = activeAdapterEntry.writeModes.includes('area');\n const canWriteDom = activeAdapterEntry.writeModes.includes('dom');\n const adapter = activeAdapterEntry.adapter;\n\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const frameScrollRef = useRef<HTMLDivElement | null>(null);\n const controllerRef = useRef<WebReviewKitController | null>(null);\n const cleanupTargetRef = useRef<(() => void) | null>(null);\n const pendingRestoreRef = useRef<ReviewItem | null>(null);\n const pendingInitialItemIdRef = useRef(getInitialItemId());\n const selectedItemIdRef = useRef(getInitialItemId());\n const hiddenOverlayItemIdListRef = useRef<string[]>([]);\n const [target, setTarget] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [draftTarget, setDraftTarget] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [activeRoute, setActiveRoute] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [size, setSize] = useState<ReviewShellViewportPreset>(() =>\n getInitialSize(viewportPresets)\n );\n const [mode, setMode] = useState<ReviewMode>('idle');\n const [targetOverlayState, setTargetOverlayState] =\n useState<TargetOverlayState>({\n grid: false,\n figma: false,\n });\n const [selectedItemId, setSelectedItemId] = useState(getInitialItemId());\n const [isListVisible, setIsListVisible] = useState(true);\n const [isSitemapOpen, setIsSitemapOpen] = useState(false);\n const [isInitialPromptOpen, setIsInitialPromptOpen] = useState(false);\n const [copyLabel, setCopyLabel] = useState('Copy URL');\n const [toastMessage, setToastMessage] = useState('');\n const [copiedPromptKey, setCopiedPromptKey] = useState<string | null>(null);\n const targetRef = useRef(target);\n const sizeRef = useRef(size);\n const isFigmaOverlayAvailable = getIsFigmaOverlayAvailable(size);\n\n return {\n activeAdapterEntry,\n activeRoute,\n adapter,\n canWriteArea,\n canWriteDom,\n cleanupTargetRef,\n controllerRef,\n copiedPromptKey,\n copyLabel,\n draftTarget,\n frameScrollRef,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n isInitialPromptOpen,\n isListVisible,\n isRemoteSource,\n isSitemapOpen,\n localAdapterEntry,\n mode,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n remoteAdapterEntry,\n reviewViewportPresets,\n selectedItemId,\n selectedItemIdRef,\n setActiveRoute,\n setCopiedPromptKey,\n setCopyLabel,\n setDraftTarget,\n setIsInitialPromptOpen,\n setIsListVisible,\n setIsSitemapOpen,\n setMode,\n setSelectedItemId,\n setSize,\n setSource,\n setTarget,\n setTargetOverlayState,\n showSourceSelect,\n size,\n sizeRef,\n source,\n sourceEntries,\n target,\n targetOverlayState,\n targetRef,\n toastMessage,\n viewportPresets,\n setToastMessage,\n };\n};\n","import { REVIEW_WORKFLOW_STATUS_OPTIONS } from '../status';\nimport type {\n ReviewItem,\n ReviewSource,\n WebReviewKitAdapter,\n} from '../types';\nimport type {\n ReviewShellAdapter,\n ReviewShellAdapterMap,\n ReviewShellAdapters,\n ReviewShellStatusOption,\n ReviewShellSyncSubmissionInput,\n ReviewShellUpdateStatusInput,\n ReviewShellWriteMode,\n} from './types';\n\nconst ALL_REVIEW_WRITE_MODES: ReviewShellWriteMode[] = ['dom', 'note', 'area'];\n\nexport type NormalizedReviewShellAdapter = {\n label: ReviewSource;\n adapter: WebReviewKitAdapter;\n statusOptions: ReviewShellStatusOption[];\n updateStatus?: (input: ReviewShellUpdateStatusInput) => Promise<unknown>;\n syncSubmission?: (input: ReviewShellSyncSubmissionInput) => Promise<unknown>;\n writeModes: ReviewShellWriteMode[];\n canUpdate: boolean;\n canRemove: boolean;\n pageId?: string;\n};\n\nexport type NormalizedReviewShellAdapters = {\n local: NormalizedReviewShellAdapter | null;\n remote: NormalizedReviewShellAdapter | null;\n sources: NormalizedReviewShellAdapter[];\n};\n\nexport function normalizeReviewShellAdapters(\n adapters: ReviewShellAdapters\n): NormalizedReviewShellAdapters {\n if (Array.isArray(adapters)) {\n const normalized = adapters.map((adapter) => normalizeShellAdapter(adapter));\n const local = normalized.find((adapter) => adapter.label === 'local') ?? null;\n const remote =\n normalized.find((adapter) => adapter.label !== 'local') ?? null;\n\n if (normalized.length === 0 || (!local && !remote)) {\n throw new Error('ReviewShell requires at least one adapter.');\n }\n\n return {\n local,\n remote,\n sources: normalized,\n };\n }\n\n return normalizeLegacyAdapterMap(adapters);\n}\n\nfunction normalizeLegacyAdapterMap(\n adapters: ReviewShellAdapterMap\n): NormalizedReviewShellAdapters {\n const local = {\n label: 'local',\n adapter: adapters.local,\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n updateStatus: ({ id, status }) => adapters.local.update(id, { status }),\n syncSubmission: ({ id, patch }) => adapters.local.update(id, patch),\n writeModes: [...ALL_REVIEW_WRITE_MODES],\n canUpdate: true,\n canRemove: true,\n } satisfies NormalizedReviewShellAdapter;\n const remote = adapters.remote\n ? ({\n label: 'remote',\n adapter: adapters.remote,\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n updateStatus: ({ id, status }) =>\n adapters.remote?.update(id, { status }) ??\n Promise.reject(new Error('Remote adapter is not available.')),\n writeModes: [],\n canUpdate: true,\n canRemove: false,\n pageId: adapters.remotePageId,\n } satisfies NormalizedReviewShellAdapter)\n : null;\n\n return {\n local,\n remote,\n sources: remote ? [local, remote] : [local],\n };\n}\n\nfunction normalizeShellAdapter(\n adapterConfig: ReviewShellAdapter\n): NormalizedReviewShellAdapter {\n const statusOptions = [\n ...(adapterConfig.statusOptions ?? REVIEW_WORKFLOW_STATUS_OPTIONS),\n ];\n const updateAdapter = adapterConfig.update;\n const updateStatus: NormalizedReviewShellAdapter['updateStatus'] =\n adapterConfig.updateStatus\n ? adapterConfig.updateStatus\n : updateAdapter\n ? ({ id, status }) => updateAdapter(id, { status })\n : undefined;\n const writeModes = normalizeWriteModes(\n adapterConfig.create\n ? adapterConfig.canWrite ?? adapterConfig.label === 'local'\n : false\n );\n\n return {\n label: adapterConfig.label,\n pageId: adapterConfig.pageId,\n statusOptions,\n updateStatus,\n syncSubmission: adapterConfig.syncSubmission,\n writeModes,\n canUpdate: Boolean(updateAdapter),\n canRemove: Boolean(adapterConfig.remove),\n adapter: {\n get: adapterConfig.get,\n list: adapterConfig.list,\n create: async (item) => {\n if (!adapterConfig.create) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support create.`\n );\n }\n return adapterConfig.create(item);\n },\n update: async (id, patch) => {\n const nextStatus = patch.status;\n if (nextStatus && updateStatus) {\n const statusIndex = statusOptions.findIndex(\n (statusOption) => statusOption.value === nextStatus\n );\n const statusOption = statusOptions[statusIndex];\n\n if (statusOption) {\n const item = await adapterConfig.get(id);\n if (!item) throw new Error(`Review item not found: ${id}`);\n\n const updated = await updateStatus({\n id,\n item,\n status: nextStatus,\n statusOption,\n statusIndex,\n });\n return updated as ReviewItem;\n }\n }\n\n if (updateAdapter) {\n return updateAdapter(id, patch);\n }\n\n if (!adapterConfig.syncSubmission) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support update.`\n );\n }\n\n const item = await adapterConfig.get(id);\n if (!item) throw new Error(`Review item not found: ${id}`);\n\n await adapterConfig.syncSubmission({\n id,\n item,\n patch,\n });\n const updated = await adapterConfig.get(id);\n if (!updated) throw new Error(`Review item not found after update: ${id}`);\n return updated;\n },\n remove: async (id) => {\n if (!adapterConfig.remove) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support remove.`\n );\n }\n\n return adapterConfig.remove(id);\n },\n },\n };\n}\n\nfunction normalizeWriteModes(\n value: boolean | readonly ReviewShellWriteMode[] | undefined\n): ReviewShellWriteMode[] {\n if (value === true) return [...ALL_REVIEW_WRITE_MODES];\n if (Array.isArray(value)) {\n const modes = value.filter((mode) =>\n ALL_REVIEW_WRITE_MODES.includes(mode)\n );\n return Array.from(new Set(modes));\n }\n return [];\n}\n","import type {\n Dispatch,\n MutableRefObject,\n SetStateAction,\n} from 'react';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewSource,\n WebReviewKitAdapter,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { updateShellUrl } from '../route';\nimport type { ReviewShellViewportPreset } from '../types';\nimport type { SitemapItemsBySource } from '../hooks/use.review.shell.data';\n\ninterface ListReviewItemsOptions {\n activeRoute: string;\n adapter: WebReviewKitAdapter;\n isRemoteSource: boolean;\n pageId?: string;\n projectId: string;\n}\n\ninterface ListSitemapReviewItemsOptions {\n localAdapterEntry: NormalizedReviewShellAdapter | null;\n projectId: string;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n}\n\ninterface CopyCurrentReviewUrlOptions {\n onCopyLabelChange: Dispatch<SetStateAction<string>>;\n}\n\ninterface RefreshReviewItemsOptions extends ListReviewItemsOptions {\n onItemsChange: (items: ReviewItem[]) => void;\n}\n\ninterface RefreshSitemapReviewItemsOptions\n extends ListSitemapReviewItemsOptions {\n onSitemapItemsChange: (items: SitemapItemsBySource) => void;\n}\n\ninterface RefreshReviewDataOptions {\n onRefreshItems: () => Promise<ReviewItem[]>;\n onRefreshSitemapItems: () => Promise<void>;\n onReloadReviewKit: () => Promise<void>;\n}\n\ninterface UpdateReviewItemStatusOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n item: ReviewItem;\n nextStatus: ReviewItemStatus;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface UpdateReviewItemCommentOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n item: ReviewItem;\n comment: string;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface SubmitReviewItemOptions {\n localAdapterEntry: NormalizedReviewShellAdapter | null;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n selectedItemIdRef: MutableRefObject<string | null>;\n onClearSelectedItem: () => void;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface CopyReviewPromptOptions {\n key: string;\n toastMessage?: string;\n value: string;\n onCopiedPromptKeyChange: Dispatch<SetStateAction<string | null>>;\n onToast?: (message: string) => void;\n}\n\ninterface RemoveReviewItemOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n isRemoteSource: boolean;\n item: ReviewItem;\n selectedItemIdRef: MutableRefObject<string | null>;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n targetRef: MutableRefObject<string>;\n onClearSelectedItem: () => void;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\nconst writeClipboardText = async (value: string) => {\n try {\n await navigator.clipboard.writeText(value);\n return;\n } catch {\n const selection = document.getSelection();\n const activeElement = document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n const ranges = selection\n ? Array.from({ length: selection.rangeCount }, (_, index) =>\n selection.getRangeAt(index)\n )\n : [];\n const textarea = document.createElement('textarea');\n textarea.value = value;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '0';\n\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n const isCopied = document.execCommand('copy');\n textarea.remove();\n\n selection?.removeAllRanges();\n ranges.forEach((range) => selection?.addRange(range));\n activeElement?.focus();\n\n if (!isCopied) {\n throw new Error('Failed to copy to clipboard');\n }\n }\n};\n\nexport const listReviewItems = async ({\n activeRoute,\n adapter,\n isRemoteSource,\n pageId,\n projectId,\n}: ListReviewItemsOptions) =>\n adapter.list({\n projectId,\n pageId,\n routeKey: isRemoteSource ? activeRoute : undefined,\n });\n\nexport const listSitemapReviewItems = async ({\n localAdapterEntry,\n projectId,\n remoteAdapterEntry,\n}: ListSitemapReviewItemsOptions): Promise<SitemapItemsBySource> => {\n const [localResult, remoteResult] = await Promise.allSettled([\n localAdapterEntry\n ? localAdapterEntry.adapter.list({\n projectId,\n pageId: localAdapterEntry.pageId,\n })\n : Promise.resolve([]),\n remoteAdapterEntry\n ? remoteAdapterEntry.adapter.list({\n projectId,\n pageId: remoteAdapterEntry.pageId,\n source: remoteAdapterEntry.label,\n })\n : Promise.resolve([]),\n ]);\n\n return {\n local: localResult.status === 'fulfilled' ? localResult.value : [],\n remote: remoteResult.status === 'fulfilled' ? remoteResult.value : [],\n };\n};\n\nexport const refreshReviewItems = async ({\n onItemsChange,\n ...listOptions\n}: RefreshReviewItemsOptions) => {\n const nextItems = await listReviewItems(listOptions);\n onItemsChange(nextItems);\n return nextItems;\n};\n\nexport const refreshSitemapReviewItems = async ({\n onSitemapItemsChange,\n ...listOptions\n}: RefreshSitemapReviewItemsOptions) => {\n const sitemapItems = await listSitemapReviewItems(listOptions);\n onSitemapItemsChange(sitemapItems);\n};\n\nexport const copyCurrentReviewUrl = async ({\n onCopyLabelChange,\n}: CopyCurrentReviewUrlOptions) => {\n await writeClipboardText(window.location.href);\n onCopyLabelChange('Copied');\n window.setTimeout(() => onCopyLabelChange('Copy URL'), 1200);\n};\n\nexport const refreshReviewData = async ({\n onRefreshItems,\n onRefreshSitemapItems,\n onReloadReviewKit,\n}: RefreshReviewDataOptions) => {\n await onReloadReviewKit();\n await Promise.all([onRefreshItems(), onRefreshSitemapItems()]);\n};\n\nexport const updateReviewItemStatus = async ({\n activeAdapterEntry,\n item,\n nextStatus,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemStatusOptions) => {\n if (!activeAdapterEntry.updateStatus) return;\n\n const statusIndex = activeAdapterEntry.statusOptions.findIndex(\n (statusOption) => statusOption.value === nextStatus\n );\n const statusOption = activeAdapterEntry.statusOptions[statusIndex];\n if (!statusOption) return;\n\n await activeAdapterEntry.updateStatus({\n id: item.id,\n item,\n status: statusOption.value,\n statusOption,\n statusIndex,\n });\n await onRefreshReviewData();\n onToast?.('QA status updated');\n};\n\nexport const updateReviewItemComment = async ({\n activeAdapterEntry,\n item,\n comment,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemCommentOptions) => {\n const nextComment = comment.trim();\n if (!nextComment) throw new Error('Comment is required.');\n if (!activeAdapterEntry.canUpdate) {\n throw new Error(\n `Review adapter \"${activeAdapterEntry.label}\" does not support edit.`\n );\n }\n\n if (nextComment === item.comment.trim()) {\n onToast?.('No QA comment changes');\n return item;\n }\n\n const updated = await activeAdapterEntry.adapter.update(item.id, {\n comment: nextComment,\n });\n await onRefreshReviewData();\n onToast?.('QA comment updated');\n return updated;\n};\n\nexport const submitReviewItem = async ({\n localAdapterEntry,\n numberedItem,\n remoteAdapterEntry,\n selectedItemIdRef,\n onClearSelectedItem,\n onRefreshReviewData,\n onToast,\n}: SubmitReviewItemOptions) => {\n const { item } = numberedItem;\n const syncLocalSubmission = localAdapterEntry?.syncSubmission;\n if (\n !remoteAdapterEntry ||\n !localAdapterEntry ||\n !syncLocalSubmission ||\n item.submitStatus === 'submitted'\n ) {\n return;\n }\n\n await syncLocalSubmission({\n id: item.id,\n item,\n patch: {\n submitStatus: 'submitting',\n submitError: undefined,\n },\n });\n await onRefreshReviewData();\n\n let toastMessage: string;\n try {\n await remoteAdapterEntry.adapter.create({\n ...item,\n reviewNumber: undefined,\n externalIssueId: undefined,\n externalIssueUrl: undefined,\n submittedAt: undefined,\n submitStatus: 'submitted',\n submitError: undefined,\n });\n await localAdapterEntry.adapter.remove(item.id);\n if (selectedItemIdRef.current === item.id) {\n onClearSelectedItem();\n }\n toastMessage = 'Remote submitted';\n } catch (error) {\n await syncLocalSubmission({\n id: item.id,\n item,\n patch: {\n submitStatus: 'failed',\n submitError:\n error instanceof Error ? error.message : 'Failed to submit remote',\n },\n });\n toastMessage = 'Remote submit failed';\n }\n\n await onRefreshReviewData();\n onToast?.(toastMessage);\n};\n\nexport const copyReviewPrompt = async ({\n key,\n toastMessage = 'Copied',\n value,\n onCopiedPromptKeyChange,\n onToast,\n}: CopyReviewPromptOptions) => {\n if (!value) return;\n\n await writeClipboardText(value);\n onCopiedPromptKeyChange(key);\n onToast?.(toastMessage);\n window.setTimeout(() => {\n onCopiedPromptKeyChange((current) => (current === key ? null : current));\n }, 1200);\n};\n\nexport const removeReviewItem = async ({\n activeAdapterEntry,\n isRemoteSource,\n item,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n onClearSelectedItem,\n onRefreshReviewData,\n onToast,\n}: RemoveReviewItemOptions) => {\n if (\n !activeAdapterEntry.canRemove ||\n item.submitStatus === 'submitting' ||\n (!isRemoteSource && item.submitStatus === 'submitted')\n ) {\n return;\n }\n\n await activeAdapterEntry.adapter.remove(item.id);\n if (selectedItemIdRef.current === item.id) {\n onClearSelectedItem();\n updateShellUrl(targetRef.current, sizeRef.current, source);\n }\n await onRefreshReviewData();\n onToast?.('QA deleted');\n};\n","import type { CreateReviewPagesOptions, ReviewShellGlobEntries, ReviewShellPage } from './types';\n\nconst escapeRegExp = (value: string) =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst normalizePageHref = (value: string) => {\n const href = value || '/';\n return href.startsWith('/') ? href : `/${href}`;\n};\n\nconst sortReviewPages = (a: ReviewShellPage, b: ReviewShellPage) => {\n if (a.href === '/') return -1;\n if (b.href === '/') return 1;\n return a.href.localeCompare(b.href);\n};\n\nexport const createReviewPagesFromGlob = (\n entries: ReviewShellGlobEntries,\n options: CreateReviewPagesOptions = {}\n): ReviewShellPage[] => {\n const root = options.root ?? '/page';\n const rootPattern = root ? new RegExp(`^${escapeRegExp(root)}`) : null;\n\n return Object.keys(entries)\n .map((key) => {\n const withoutRoot = rootPattern ? key.replace(rootPattern, '') : key;\n const href = withoutRoot.replace(/index\\.(tsx|ts|jsx|js)$/, '');\n return normalizePageHref(href === '' ? '/' : href);\n })\n .filter((href) => !options.exclude?.(href))\n .sort((a, b) => sortReviewPages({ href: a }, { href: b }))\n .map((href) => ({ href }));\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from '../types';\n\ntype SupabaseRealtimeStatus =\n | 'SUBSCRIBED'\n | 'CHANNEL_ERROR'\n | 'TIMED_OUT'\n | 'CLOSED'\n | string;\n\ntype SupabaseRealtimeChannel = {\n topic?: string;\n on: (\n type: 'presence',\n filter: { event: 'sync' | 'join' | 'leave' },\n callback: () => void\n ) => SupabaseRealtimeChannel;\n subscribe: (\n callback: (status: SupabaseRealtimeStatus, error?: Error) => void\n ) => SupabaseRealtimeChannel;\n track: (payload: ReviewPresenceUser) => Promise<unknown>;\n untrack: () => Promise<unknown>;\n presenceState: () => Record<string, unknown[]>;\n teardown?: () => void;\n};\n\nexport type SupabasePresenceClient = {\n channel: (\n topic: string,\n options?: {\n config?: {\n private?: boolean;\n presence?: {\n key?: string;\n };\n };\n }\n ) => SupabaseRealtimeChannel;\n getChannels?: () => SupabaseRealtimeChannel[];\n removeChannel: (channel: SupabaseRealtimeChannel) => Promise<unknown>;\n};\n\nexport type SupabasePresenceAdapterOptions = {\n client: SupabasePresenceClient;\n channelPrefix?: string;\n private?: boolean;\n};\n\nconst normalizeTopicPart = (value: string) =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'default';\n\nconst getPresenceTopic = (channelPrefix: string, projectId: string) =>\n `${normalizeTopicPart(channelPrefix)}-${normalizeTopicPart(projectId)}`;\n\nconst PRESENCE_BRIDGE_KEY = '__dfReviewPresenceBridge';\n\ntype SupabasePresenceBridge = {\n channel: SupabaseRealtimeChannel;\n emit: () => void;\n getUsers: () => ReviewPresenceUser[];\n listeners: Set<() => void>;\n ready: Promise<void>;\n refCount: number;\n};\n\ntype SupabasePresenceBridgeChannel = SupabaseRealtimeChannel & {\n [PRESENCE_BRIDGE_KEY]?: SupabasePresenceBridge;\n};\n\nconst isReviewPresenceUser = (value: unknown): value is ReviewPresenceUser => {\n if (!value || typeof value !== 'object') return false;\n\n const candidate = value as Partial<ReviewPresenceUser>;\n return (\n typeof candidate.projectId === 'string' &&\n typeof candidate.sessionId === 'string' &&\n typeof candidate.userId === 'string' &&\n typeof candidate.updatedAt === 'string'\n );\n};\n\nconst flattenPresenceState = (\n state: Record<string, unknown[]>\n): ReviewPresenceUser[] =>\n Object.values(state).flat().filter(isReviewPresenceUser);\n\nconst dedupePresenceUsers = (users: ReviewPresenceUser[]) => {\n const userBySessionId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const currentUser = userBySessionId.get(user.sessionId);\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userBySessionId.set(user.sessionId, user);\n }\n });\n\n return Array.from(userBySessionId.values());\n};\n\nconst sortPresenceUsers = (\n users: ReviewPresenceUser[],\n selfSessionId: string\n) =>\n users.sort((a, b) => {\n if (a.sessionId === selfSessionId) return -1;\n if (b.sessionId === selfSessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n\nconst subscribeChannel = (channel: SupabaseRealtimeChannel) =>\n new Promise<void>((resolve, reject) => {\n channel.subscribe((status, error) => {\n if (status === 'SUBSCRIBED') {\n resolve();\n return;\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {\n reject(error ?? new Error(`Supabase presence ${status}`));\n }\n });\n });\n\nconst removeTopicChannels = async (\n client: SupabasePresenceClient,\n topic: string\n) => {\n const existingChannels = client.getChannels?.() ?? [];\n const normalizedTopic = `realtime:${topic}`;\n const topicChannels = existingChannels.filter(\n (channel) => channel.topic === topic || channel.topic === normalizedTopic\n );\n\n await Promise.allSettled(\n topicChannels.map(async (channel) => {\n const result = await client.removeChannel(channel);\n if (result !== 'ok') {\n channel.teardown?.();\n }\n })\n );\n};\n\nconst getTopicChannel = (\n client: SupabasePresenceClient,\n topic: string\n): SupabasePresenceBridgeChannel | undefined => {\n const normalizedTopic = `realtime:${topic}`;\n\n return client\n .getChannels?.()\n .find(\n (channel) =>\n channel.topic === topic || channel.topic === normalizedTopic\n ) as SupabasePresenceBridgeChannel | undefined;\n};\n\nconst createPresenceBridge = (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const channel = client.channel(topic, {\n config: {\n private: isPrivate,\n presence: {\n key: context.sessionId,\n },\n },\n }) as SupabasePresenceBridgeChannel;\n\n const bridge: SupabasePresenceBridge = {\n channel,\n listeners: new Set(),\n refCount: 0,\n getUsers: () =>\n dedupePresenceUsers(flattenPresenceState(channel.presenceState())),\n emit: () => {\n bridge.listeners.forEach((listener) => listener());\n },\n ready: Promise.resolve(),\n };\n\n channel[PRESENCE_BRIDGE_KEY] = bridge;\n channel\n .on('presence', { event: 'sync' }, bridge.emit)\n .on('presence', { event: 'join' }, bridge.emit)\n .on('presence', { event: 'leave' }, bridge.emit);\n\n bridge.ready = subscribeChannel(channel).catch((error) => {\n delete channel[PRESENCE_BRIDGE_KEY];\n throw error;\n });\n\n return bridge;\n};\n\nconst getPresenceBridge = async (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const existingChannel = getTopicChannel(client, topic);\n const existingBridge = existingChannel?.[PRESENCE_BRIDGE_KEY];\n\n if (existingBridge) return existingBridge;\n\n if (existingChannel) {\n await removeTopicChannels(client, topic);\n }\n\n return createPresenceBridge(client, topic, context, isPrivate);\n};\n\nexport const createSupabasePresenceAdapter = ({\n client,\n channelPrefix = 'review-presence',\n private: isPrivate = false,\n}: SupabasePresenceAdapterOptions): ReviewPresenceAdapter => ({\n label: 'supabase-presence',\n connect: async (context: ReviewPresenceContext) => {\n const topic = getPresenceTopic(channelPrefix, context.projectId);\n const bridge = await getPresenceBridge(client, topic, context, isPrivate);\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentState = context.initialState;\n bridge.refCount += 1;\n\n const getUsers = () =>\n sortPresenceUsers(\n [...bridge.getUsers()],\n context.sessionId\n );\n\n const emit = () => {\n const users = getUsers();\n listeners.forEach((listener) => listener(users));\n };\n\n const bridgeListener = () => emit();\n bridge.listeners.add(bridgeListener);\n\n await bridge.ready;\n await bridge.channel.track(currentState);\n bridge.emit();\n emit();\n\n return {\n update: async (state: Partial<ReviewPresenceState>) => {\n currentState = {\n ...currentState,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: new Date().toISOString(),\n };\n await bridge.channel.track(currentState);\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: async () => {\n listeners.clear();\n bridge.listeners.delete(bridgeListener);\n bridge.refCount = Math.max(0, bridge.refCount - 1);\n if (bridge.refCount > 0) return;\n\n delete (bridge.channel as SupabasePresenceBridgeChannel)[\n PRESENCE_BRIDGE_KEY\n ];\n await bridge.channel.untrack();\n await client.removeChannel(bridge.channel);\n },\n };\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,iBAAkB;AAClB,oBAA2B;;;ACD3B,IAAM,wBAAwB;AAEvB,SAAS,yBAAyB;AACvC,MAAI,CAAC,SAAS,eAAe,qBAAqB,GAAG;AACnD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["import_react","import_react","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","Map","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","error","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","ReviewScopeIcon","Map","import_react","import_react","import_react","getSourceAttribute","getViewportPresetDistance","runWithAutoScrollBehavior","setDocumentScrollInstantly","runWithAutoScrollBehavior","setDocumentScrollInstantly","isEditableEventTarget","import_react","import_react","import_react","createId","import_react","import_react","frame","import_react","import_react","import_react","isEditableEventTarget","import_react","statusOption","item","updated","statusOption","import_jsx_runtime","refreshReviewData","target","source","toastMessage","import_jsx_runtime","React"]}