@designfever/web-review-kit 0.1.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.
- package/README.md +241 -0
- package/dist/chunk-U5K2YGGL.js +3486 -0
- package/dist/chunk-U5K2YGGL.js.map +1 -0
- package/dist/index.cjs +3524 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +26 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/react-shell.cjs +8841 -0
- package/dist/react-shell.cjs.map +1 -0
- package/dist/react-shell.d.cts +156 -0
- package/dist/react-shell.d.ts +156 -0
- package/dist/react-shell.js +5844 -0
- package/dist/react-shell.js.map +1 -0
- package/dist/types-D_mNjOHx.d.cts +183 -0
- package/dist/types-D_mNjOHx.d.ts +183 -0
- package/docs/README.md +37 -0
- package/docs/adapter-handoff.md +146 -0
- package/docs/concept.md +102 -0
- package/docs/df-sheet-adapter.md +336 -0
- package/docs/df-sheet-next.md +222 -0
- package/docs/initial-plan.md +226 -0
- package/docs/installation.md +222 -0
- package/docs/package-split-checkpoint.md +79 -0
- package/docs/presence-handoff.md +138 -0
- package/docs/review-feedback-2026-06-20.md +267 -0
- package/docs/smoke-baseline-2026-06-20.md +41 -0
- package/docs/stabilize-ui-work-guide.md +243 -0
- package/docs/supabase-presence.md +198 -0
- package/docs/supabase-review-items.md +365 -0
- package/docs/supabase.md +205 -0
- package/package.json +61 -0
|
@@ -0,0 +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/react-shell/adapters.ts","../src/react-shell/style.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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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  - 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 { 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 {\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":";;;;;;;;AAAA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,WAAAA;AAAA,EACA;AAAA,EACA;AAAA,OACK;A;;;;;ACAA,IAAM,eAAe,IAA2C,YACrE,QACG,OAAO,CAAC,WAAW,OAAO,UAAU;AACnC,SACE,QAAQ,SAAS,KAChB,UAAqB,KAAA,MAAW,MACjC,MAAM,QAAQ,SAAS,MAAM;AAEjC,CAAC,EACA,KAAK,GAAG,EACR,KAAA;;;ACVE,IAAM,cAAc,CAAC,WAC1B,OAAO,QAAQ,sBAAsB,OAAO,EAAE,YAAA;;;ACDzC,IAAM,cAAc,CAAmB,WAC5C,OAAO;EAAQ;EAAyB,CAAC,OAAO,IAAI,OAClD,KAAK,GAAG,YAAA,IAAgB,GAAG,YAAA;AAC7B;;;ACAK,IAAM,eAAe,CAAmB,WAAgC;AAC7E,QAAM,YAAY,YAAY,MAAM;AAEpC,SAAQ,UAAU,OAAO,CAAC,EAAE,YAAA,IAAgB,UAAU,MAAM,CAAC;AAC/D;A;;;;;ACbA,IAAA,oBAAe;EACb,OAAO;EACP,OAAO;EACP,QAAQ;EACR,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;EACb,eAAe;EACf,gBAAgB;AAClB;;;ACJO,IAAM,cAAc,CAAC,UAA+B;AACzD,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,OAAO,KAAK,SAAS,UAAU,SAAS,SAAS;AACnE,aAAO;IACT;EACF;AAEA,SAAO;AACT;;;;ACDA,IAAA,gBAAA,cAAA,CAAA,CAAA;AA4BO,IAAA,mBAAA,MAAA,WAAA,aAAA;;;ACdP,IAAA,OAAA;EAAa,CAAA,EAAA,OAAA,MAAA,aAAA,qBAAA,YAAA,IAAA,UAAA,UAAA,GAAA,KAAA,GAAA,QAAA;AAKT,UAAA;MAAM,MAAA,cAAA;MACgB,aAAA,qBAAA;MACc,qBAAA,6BAAA;MACgB,OAAA,eAAA;MAC5B,WAAA,eAAA;IACI,IAAA,iBAAA,KAAA,CAAA;AAG5B,UAAA,wBAAA,uBAAA,6BAAA,OAAA,eAAA,kBAAA,IAAA,KAAA,OAAA,QAAA,WAAA,IAAA,eAAA;AAKA,WAAAC;MAAO;MACL;QACA;QACE,GAAA;QACG,OAAA,QAAA,eAAA,kBAAA;QAC6C,QAAA,QAAA,eAAA,kBAAA;QACC,QAAA,SAAA;QAChC,aAAA;QACJ,WAAA,aAAA,UAAA,cAAA,SAAA;QAC4C,GAAA,CAAA,YAAA,CAAA,YAAA,IAAA,KAAA,EAAA,eAAA,OAAA;QACM,GAAA;MAC5D;MACL;QACA,GAAA,SAAA,IAAA,CAAA,CAAA,KAAA,KAAA,MAAAA,eAAA,KAAA,KAAA,CAAA;QAC6D,GAAA,MAAA,QAAA,QAAA,IAAA,WAAA,CAAA,QAAA;MACT;IACpD;EACF;AAEJ;;;ACrDA,IAAM,mBAAmB,CAAC,UAAkB,aAAuB;AACjE,QAAM,YAAYC;IAAuC,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QACjFC,eAAc,MAAM;MAClB;MACA;MACA,WAAW;QACT,UAAU,YAAY,aAAa,QAAQ,CAAC,CAAC;QAC7C,UAAU,QAAQ;QAClB;MAAA;MAEF,GAAG;IAAA,CACJ;EAAA;AAGH,YAAU,cAAc,aAAa,QAAQ;AAE7C,SAAO;AACT;;;ACzBO,IAAM,aAAuB;EAClC,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,MAAM,KAAK,SAAA,CAAU;EACzD,CAAC,QAAQ,EAAE,GAAG,wCAAwC,KAAK,SAAA,CAAU;EACrE,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAA,CAAU;AAC7C;AAaA,IAAM,qBAAqB,iBAAiB,wBAAwB,UAAU;;;ACjBvE,IAAMC,cAAuB;EAClC,CAAC,QAAQ,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,SAAA,CAAU;EACvF,CAAC,QAAQ,EAAE,GAAG,2DAA2D,KAAK,SAAA,CAAU;AAC1F;AAaA,IAAM,OAAO,iBAAiB,QAAQA,WAAU;;;AChBzC,IAAMC,cAAuB;EAClC,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAA,CAAU;EAC1C,CAAC,QAAQ,EAAE,GAAG,eAAe,KAAK,SAAA,CAAU;EAC5C,CAAC,QAAQ,EAAE,GAAG,4DAA4D,KAAK,SAAA,CAAU;AAC3F;AAaA,IAAM,eAAe,iBAAiB,iBAAiBA,WAAU;;;ACjB1D,IAAMC,cAAuB;EAClC;IACE;IACA;MACE,GAAG;MACH,KAAK;IAAA;EACP;EAEF,CAAC,QAAQ,EAAE,GAAG,wCAAwC,KAAK,SAAA,CAAU;EACrE;IACE;IACA;MACE,GAAG;MACH,KAAK;IAAA;EACP;EAEF,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAA,CAAU;AAC7C;AAaA,IAAM,SAAS,iBAAiB,WAAWA,WAAU;;;AC9B9C,IAAMC,cAAuB;EAClC;IACE;IACA;MACE,GAAG;MACH,KAAK;IAAA;EACP;EAEF,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,SAAA,CAAU;AAC1D;AAaA,IAAM,MAAM,iBAAiB,OAAOA,WAAU;;;ACtBvC,IAAMC,cAAuB;EAClC,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK,KAAK,SAAA,CAAU;EACvD,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,KAAK,SAAA,CAAU;EACtD,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK,KAAK,SAAA,CAAU;EACvD,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,SAAA,CAAU;EACxD,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,KAAK,GAAG,KAAK,KAAK,SAAA,CAAU;EACvD,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,SAAA,CAAU;AAC1D;AAaA,IAAM,eAAe,iBAAiB,iBAAiBA,WAAU;;;ACpB1D,IAAMC,cAAuB;EAClC,CAAC,QAAQ,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,SAAA,CAAU;EACvF,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,KAAK,SAAA,CAAU;EACtD,CAAC,QAAQ,EAAE,GAAG,6CAA6C,KAAK,SAAA,CAAU;AAC5E;AAaA,IAAM,QAAQ,iBAAiB,SAASA,WAAU;;;ACjB3C,IAAMC,cAAuB;EAClC,CAAC,QAAQ,EAAE,OAAO,KAAK,QAAQ,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,SAAA,CAAU;EAC5E,CAAC,QAAQ,EAAE,OAAO,KAAK,QAAQ,KAAK,GAAG,MAAM,GAAG,KAAK,IAAI,KAAK,KAAK,SAAA,CAAU;EAC7E,CAAC,QAAQ,EAAE,OAAO,KAAK,QAAQ,KAAK,GAAG,MAAM,GAAG,MAAM,IAAI,KAAK,KAAK,SAAA,CAAU;EAC9E,CAAC,QAAQ,EAAE,OAAO,KAAK,QAAQ,KAAK,GAAG,KAAK,GAAG,MAAM,IAAI,KAAK,KAAK,SAAA,CAAU;AAC/E;AAaA,IAAM,aAAa,iBAAiB,eAAeA,WAAU;;;AClBtD,IAAMC,cAAuB;EAClC,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAA,CAAU;EACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAA,CAAU;EACzC,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAA,CAAU;AAC1C;AAaA,IAAM,aAAa,iBAAiB,eAAeA,WAAU;;;ACjBtD,IAAMC,eAAuB;EAClC;IACE;IACA;MACE,GAAG;MACH,KAAK;IAAA;EACP;EAEF,CAAC,QAAQ,EAAE,GAAG,gBAAgB,KAAK,SAAA,CAAU;EAC7C,CAAC,QAAQ,EAAE,GAAG,eAAe,KAAK,SAAA,CAAU;AAC9C;AAaA,IAAMC,OAAM,iBAAiB,OAAOD,YAAU;;;ACvBvC,IAAME,eAAuB;EAClC,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAA,CAAU;EAC1C,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAA,CAAU;EAC1C,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAA,CAAU;EAC1C,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAA,CAAU;AAC7C;AAaA,IAAM,YAAY,iBAAiB,cAAcA,YAAU;;;AClBpD,IAAMC,eAAuB;EAClC,CAAC,QAAQ,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,SAAA,CAAU;EAC9E,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAA,CAAU;EACjE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAA,CAAU;AACpE;AAaA,IAAM,UAAU,iBAAiB,WAAWA,YAAU;;;ACjB/C,IAAMC,eAAuB;EAClC,CAAC,QAAQ,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,SAAA,CAAU;AAChF;AAaA,IAAM,sBAAsB,iBAAiB,wBAAwBA,YAAU;;;ACfxE,IAAMC,eAAuB;EAClC,CAAC,QAAQ,EAAE,GAAG,sDAAsD,KAAK,SAAA,CAAU;EACnF,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAA,CAAU;EAC3C,CAAC,QAAQ,EAAE,GAAG,uDAAuD,KAAK,SAAA,CAAU;EACpF,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAA,CAAU;AAC5C;AAaA,IAAM,YAAY,iBAAiB,cAAcA,YAAU;;;AClBpD,IAAMC,eAAuB;EAClC;IACE;IACA;MACE,GAAG;MACH,KAAK;IAAA;EACP;EAEF,CAAC,QAAQ,EAAE,GAAG,kBAAkB,KAAK,SAAA,CAAU;EAC/C,CAAC,QAAQ,EAAE,GAAG,iBAAiB,KAAK,SAAA,CAAU;EAC9C,CAAC,QAAQ,EAAE,GAAG,gBAAgB,KAAK,SAAA,CAAU;EAC7C,CAAC,QAAQ,EAAE,GAAG,kBAAkB,KAAK,SAAA,CAAU;AACjD;AAaA,IAAM,QAAQ,iBAAiB,SAASA,YAAU;;;ACzB3C,IAAMC,eAAuB;EAClC,CAAC,QAAQ,EAAE,GAAG,0BAA0B,KAAK,SAAA,CAAU;EACvD,CAAC,QAAQ,EAAE,GAAG,2BAA2B,KAAK,SAAA,CAAU;EACxD,CAAC,QAAQ,EAAE,GAAG,6BAA6B,KAAK,SAAA,CAAU;EAC1D,CAAC,QAAQ,EAAE,GAAG,4BAA4B,KAAK,SAAA,CAAU;AAC3D;AAaA,IAAM,OAAO,iBAAiB,QAAQA,YAAU;;;AClBzC,IAAMC,eAAuB;EAClC;IACE;IACA;MACE,GAAG;MACH,KAAK;IAAA;EACP;EAEF,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,SAAA,CAAU;AAC1D;AAaA,IAAM,WAAW,iBAAiB,YAAYA,YAAU;;;ACtBjD,IAAMC,eAAuB;EAClC,CAAC,QAAQ,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,SAAA,CAAU;EACvF,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAA,CAAU;AAC7C;AAaA,IAAM,aAAa,iBAAiB,cAAcA,YAAU;;;AChBrD,IAAMC,eAAuB;EAClC;IACE;IACA;MACE,GAAG;MACH,KAAK;IAAA;EACP;EAEF,CAAC,QAAQ,EAAE,GAAG,6DAA6D,KAAK,SAAA,CAAU;AAC5F;AAaA,IAAM,qBAAqB,iBAAiB,wBAAwBA,YAAU;;;ACtBvE,IAAMC,eAAuB;EAClC;IACE;IACA;MACE,GAAG;MACH,KAAK;IAAA;EACP;EAEF,CAAC,QAAQ,EAAE,GAAG,2BAA2B,KAAK,SAAA,CAAU;AAC1D;AAaA,IAAM,aAAa,iBAAiB,eAAeA,YAAU;;;ACtBtD,IAAMC,eAAuB;EAClC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAA,CAAU;EACzC,CAAC,QAAQ,EAAE,GAAG,iBAAiB,KAAK,SAAA,CAAU;EAC9C,CAAC,QAAQ,EAAE,GAAG,6CAA6C,KAAK,SAAA,CAAU;AAC5E;AAaA,IAAM,SAAS,iBAAiB,UAAUA,YAAU;;;ACjB7C,IAAMC,eAAuB;EAClC,CAAC,QAAQ,EAAE,GAAG,6CAA6C,KAAK,SAAA,CAAU;EAC1E,CAAC,QAAQ,EAAE,GAAG,+BAA+B,KAAK,SAAA,CAAU;EAC5D,CAAC,QAAQ,EAAE,GAAG,8BAA8B,KAAK,SAAA,CAAU;EAC3D,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,KAAK,QAAA,CAAS;AACvD;AAaA,IAAM,QAAQ,iBAAiB,SAASA,YAAU;;;AClB3C,IAAMC,eAAuB;EAClC,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAA,CAAU;EAC3C,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAA,CAAU;AAC7C;AAaA,IAAM,IAAI,iBAAiB,KAAKA,YAAU;;;AhCa1C,SAAS,kBAAkB;;;AiCHpB,SAAS,6BACd,UAC+B;AAC/B,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,UAAM,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,UAAU,OAAO;AAClE,UAAM,SACJ,SAAS,KAAK,CAAC,YAAY,QAAQ,UAAU,OAAO,KAAK;AAE3D,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,WAAO;AAAA,MACL,OAAO,sBAAsB,KAAK;AAAA,MAClC,QAAQ,SAAS,sBAAsB,MAAM,IAAI;AAAA,IACnD;AAAA,EACF;AAEA,SAAO,0BAA0B,QAAQ;AAC3C;AAEA,SAAS,0BACP,UAC+B;AAC/B,SAAO;AAAA,IACL,OAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS,SAAS;AAAA,MAClB,eAAe,CAAC,GAAG,8BAA8B;AAAA,MACjD,cAAc,CAAC,EAAE,IAAI,OAAO,MAAM,SAAS,MAAM,OAAO,IAAI,EAAE,OAAO,CAAC;AAAA,MACtE,gBAAgB,CAAC,EAAE,IAAI,MAAM,MAAM,SAAS,MAAM,OAAO,IAAI,KAAK;AAAA,MAClE,WAAW;AAAA,IACb;AAAA,IACA,QAAQ,SAAS,SACb;AAAA,MACE,OAAO;AAAA,MACP,SAAS,SAAS;AAAA,MAClB,eAAe,CAAC,GAAG,8BAA8B;AAAA,MACjD,WAAW;AAAA,MACX,QAAQ,SAAS;AAAA,IACnB,IACA;AAAA,EACN;AACF;AAEA,SAAS,sBACP,eAC8B;AAC9B,SAAO;AAAA,IACL,OAAO,cAAc;AAAA,IACrB,QAAQ,cAAc;AAAA,IACtB,eAAe,CAAC,GAAI,cAAc,iBAAiB,CAAC,CAAE;AAAA,IACtD,cAAc,cAAc;AAAA,IAC5B,gBAAgB,cAAc;AAAA,IAC9B,WAAW,QAAQ,cAAc,MAAM;AAAA,IACvC,SAAS;AAAA,MACP,KAAK,cAAc;AAAA,MACnB,MAAM,cAAc;AAAA,MACpB,QAAQ,cAAc;AAAA,MACtB,QAAQ,OAAO,IAAI,UAAU;AAC3B,cAAM,aAAa,MAAM;AACzB,YAAI,cAAc,cAAc,cAAc;AAC5C,gBAAM,eAAe,cAAc,iBAAiB,CAAC,GAAG;AAAA,YACtD,CAACC,kBAAiBA,cAAa,UAAU;AAAA,UAC3C;AACA,gBAAM,gBAAgB,cAAc,iBAAiB,CAAC,GAAG,WAAW;AAEpE,cAAI,cAAc;AAChB,kBAAMC,QAAO,MAAM,cAAc,IAAI,EAAE;AACvC,gBAAI,CAACA,MAAM,OAAM,IAAI,MAAM,0BAA0B,EAAE,EAAE;AAEzD,mBAAO,cAAc,aAAa;AAAA,cAChC;AAAA,cACA,MAAAA;AAAA,cACA,QAAQ;AAAA,cACR;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAEA,YAAI,CAAC,cAAc,gBAAgB;AACjC,gBAAM,IAAI;AAAA,YACR,mBAAmB,cAAc,KAAK;AAAA,UACxC;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,cAAc,IAAI,EAAE;AACvC,YAAI,CAAC,KAAM,OAAM,IAAI,MAAM,0BAA0B,EAAE,EAAE;AAEzD,eAAO,cAAc,eAAe;AAAA,UAClC;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,OAAO,OAAO;AACpB,YAAI,CAAC,cAAc,QAAQ;AACzB,gBAAM,IAAI;AAAA,YACR,mBAAmB,cAAc,KAAK;AAAA,UACxC;AAAA,QACF;AAEA,eAAO,cAAc,OAAO,EAAE;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;;;ACxIA,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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","names":["useMemo","createElement","forwardRef","createElement","__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","jsx","jsxs","Map","jsx","jsxs","ReviewScopeIcon","useMemo","frame","target","statusOption"]}
|