@designfever/web-review-kit 0.3.0 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react-shell.tsx","../src/react-shell/style.ts","../src/react-shell/review/shell.tsx","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/mergeClasses.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toKebabCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toCamelCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toPascalCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/defaultAttributes.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/hasA11yProp.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/context.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/Icon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/createLucideIcon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/circle-question-mark.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/copy.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/external-link.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/eye-off.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/eye.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/file-code-corner.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/grip-vertical.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/image.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/layout-grid.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/list-filter.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/map.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/maximize-2.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/monitor.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/pencil.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/rectangle-horizontal.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/refresh-cw.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/ruler.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/scan.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/settings.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/smartphone.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/square-mouse-pointer.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/sticky-note.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/upload.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/users.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/x.ts","../src/react-shell/constants.ts","../src/react-shell/route.ts","../src/react-shell/viewport.ts","../src/react-shell/prompt/prompt.ts","../src/react-shell/prompt/modal.tsx","../src/react-shell/settings.ts","../src/react-shell/review/settings.modal.tsx","../src/react-shell/sitemap/tree.ts","../src/react-shell/sitemap/modal.tsx","../src/react-shell/qa/item.edit.modal.tsx","../src/react-shell/qa/item.remote.actions.tsx","../src/react-shell/qa/item.status.actions.tsx","../src/react-shell/anchor.restore.ts","../src/react-shell/review/item.icons.tsx","../src/react-shell/source.open.ts","../src/react-shell/qa/item.card.tsx","../src/react-shell/presence/row.tsx","../src/react-shell/qa/panel.header.tsx","../src/react-shell/qa/panel.tsx","../src/react-shell/review/mode.toolbar.tsx","../src/react-shell/ruler/gutters.tsx","../src/react-shell/ruler/overlay.tsx","../src/react-shell/target/frame.tsx","../src/react-shell/topbar.tsx","../src/react-shell/hooks/use.review.controller.ts","../src/react-shell/hooks/use.review.item.restore.ts","../src/react-shell/hooks/use.review.kit.lifecycle.ts","../src/react-shell/target/target.ts","../src/react-shell/hooks/review.frame.navigation.ts","../src/react-shell/hooks/review.kit.target.ts","../src/react-shell/hooks/use.review.target.overlay.ts","../src/react-shell/hooks/use.review.target.sync.ts","../src/react-shell/hooks/use.review.presence.ts","../src/react-shell/presence/presence.ts","../src/react-shell/hooks/use.review.ruler.ts","../src/react-shell/hooks/use.review.ruler.drag.ts","../src/react-shell/ruler/ruler.ts","../src/react-shell/hooks/use.review.settings.ts","../src/react-shell/hooks/use.review.shell.data.ts","../src/react-shell/hooks/use.review.shell.hotkeys.ts","../src/react-shell/hooks/use.review.shell.state.ts","../src/react-shell/adapters.ts","../src/react-shell/review/shell.actions.ts","../src/react-shell/pages.ts","../src/react-shell/presence/supabase.ts"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ensureReviewShellStyle } from './react-shell/style';\nimport type { ReviewShellMountOptions } from './react-shell/types';\nimport { ReviewShell } from './react-shell/review/shell';\n\nexport { ReviewShell } from './react-shell/review/shell';\nexport type {\n CreateReviewPagesOptions,\n ReviewShellAdapter,\n ReviewShellAdapters,\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewShellGlobEntries,\n ReviewShellMountOptions,\n ReviewShellPage,\n ReviewShellProps,\n ReviewShellStatusOption,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n} from './react-shell/types';\nexport { createReviewPagesFromGlob } from './react-shell/pages';\nexport { DEFAULT_REVIEW_VIEWPORT_PRESETS } from './react-shell/viewport';\nexport {\n createFallbackPresenceAdapter,\n createLocalPresenceAdapter,\n} from './react-shell/presence/presence';\nexport type { LocalPresenceAdapterOptions } from './react-shell/presence/presence';\nexport { createSupabasePresenceAdapter } from './react-shell/presence/supabase';\nexport type {\n SupabasePresenceAdapterOptions,\n SupabasePresenceClient,\n} from './react-shell/presence/supabase';\n\nexport const mountReviewShell = (options: ReviewShellMountOptions) => {\n if (typeof document === 'undefined' || !document.head) return;\n\n const { rootId = 'root', ...shellProps } = options;\n\n ensureReviewShellStyle();\n\n const root = document.getElementById(rootId);\n if (!root) return;\n\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.margin = '0';\n\n createRoot(root).render(\n <React.StrictMode>\n <ReviewShell {...shellProps} />\n </React.StrictMode>\n );\n};\n","const REVIEW_SHELL_STYLE_ID = 'df-review-shell-style';\n\nexport function ensureReviewShellStyle() {\n if (!document.getElementById(REVIEW_SHELL_STYLE_ID)) {\n const style = document.createElement('style');\n style.id = REVIEW_SHELL_STYLE_ID;\n style.textContent = `\n\t * {\n\t box-sizing: border-box;\n\t scrollbar-color: var(--df-review-scrollbar-thumb, rgba(237, 243, 251, 0.2)) var(--df-review-scrollbar-track, rgba(237, 243, 251, 0.04));\n\t scrollbar-width: thin;\n\t }\n\n\t *::-webkit-scrollbar {\n\t width: 10px;\n\t height: 10px;\n\t }\n\n\t *::-webkit-scrollbar-track {\n\t background: var(--df-review-scrollbar-track, rgba(237, 243, 251, 0.04));\n\t }\n\n\t *::-webkit-scrollbar-thumb {\n\t border: 2px solid var(--df-review-scrollbar-border, rgba(15, 18, 24, 0.92));\n\t border-radius: var(--df-review-radius-pill);\n\t background: var(--df-review-scrollbar-thumb, rgba(237, 243, 251, 0.18));\n\t }\n\n\t *::-webkit-scrollbar-thumb:hover {\n\t background: var(--df-review-scrollbar-thumb-hover, rgba(237, 243, 251, 0.28));\n\t }\n\n\t *::-webkit-scrollbar-corner {\n\t background: transparent;\n\t }\n\n html,\n body,\n #root {\n width: 100%;\n height: 100%;\n margin: 0;\n }\n\n\t body {\n\t overflow: hidden;\n\t color-scheme: dark;\n\n\t /* df-review-token layer. Keep these names internal to review-kit. */\n\t --df-review-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n\t --df-review-font-mono: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n\t --df-review-font-size-3xs: 9px;\n\t --df-review-font-size-2xs: 10px;\n\t --df-review-font-size-xs: 11px;\n\t --df-review-font-size-sm: 12px;\n\t --df-review-font-size-md: 13px;\n\t --df-review-font-size-lg: 14px;\n\t --df-review-font-size-xl: 15px;\n\t --df-review-font-size-2xl: 18px;\n\t --df-review-font-weight-medium: 650;\n\t --df-review-font-weight-bold: 700;\n\t --df-review-font-weight-strong: 800;\n\t --df-review-font-weight-heavy: 900;\n\t --df-review-line-height-tight: 1.25;\n\t --df-review-line-height-base: 1.42;\n\t --df-review-line-height-relaxed: 1.55;\n\t --df-review-space-0: 0;\n\t --df-review-space-1: 4px;\n\t --df-review-space-1-5: 6px;\n\t --df-review-space-2: 8px;\n\t --df-review-space-2-5: 10px;\n\t --df-review-space-3: 12px;\n\t --df-review-space-3-5: 14px;\n\t --df-review-space-4: 16px;\n\t --df-review-space-5: 20px;\n\t --df-review-space-6: 24px;\n\t --df-review-space-8: 32px;\n\t --df-review-control-height-sm: 32px;\n\t --df-review-control-height-md: 34px;\n\t --df-review-control-height-lg: 38px;\n\t --df-review-radius-xs: 3px;\n\t --df-review-radius-sm: 6px;\n\t --df-review-radius-md: 8px;\n\t --df-review-radius-lg: 12px;\n\t --df-review-radius-pill: 999px;\n\t --df-review-color-canvas: #0f1218;\n\t --df-review-color-surface: #171c24;\n\t --df-review-color-panel: #131821;\n\t --df-review-color-panel-strong: #1b2430;\n\t --df-review-color-card: rgba(237, 243, 251, 0.035);\n\t --df-review-color-card-hover: rgba(237, 243, 251, 0.065);\n\t --df-review-color-control: #202938;\n\t --df-review-color-control-hover: #273345;\n\t --df-review-color-border: rgba(226, 233, 245, 0.14);\n\t --df-review-color-border-soft: rgba(226, 233, 245, 0.08);\n\t --df-review-color-text: #edf3fb;\n\t --df-review-color-text-muted: rgba(237, 243, 251, 0.58);\n\t --df-review-color-text-subtle: rgba(237, 243, 251, 0.42);\n\t --df-review-color-accent: #7cc7ff;\n\t --df-review-color-accent-contrast: #0f1218;\n\t --df-review-color-accent-soft: rgba(124, 199, 255, 0.12);\n\t --df-review-color-accent-hover: rgba(124, 199, 255, 0.2);\n\t --df-review-color-danger: #ff8f61;\n\t --df-review-color-danger-soft: rgba(255, 143, 97, 0.12);\n\t --df-review-color-purple: #b395ff;\n\t --df-review-color-purple-soft: rgba(179, 149, 255, 0.16);\n\t --df-review-color-note: #f3b75f;\n\t --df-review-color-note-soft: rgba(243, 183, 95, 0.14);\n\t --df-review-color-area: #63d7c7;\n\t --df-review-color-area-soft: rgba(99, 215, 199, 0.14);\n\t --df-review-color-side-rail: #111722;\n\t --df-review-color-mode-bar: rgba(15, 18, 24, 0.86);\n\t --df-review-color-chip: rgba(237, 243, 251, 0.06);\n\t --df-review-color-scrollbar-track: rgba(237, 243, 251, 0.04);\n\t --df-review-color-scrollbar-thumb: rgba(237, 243, 251, 0.18);\n\t --df-review-color-scrollbar-thumb-hover: rgba(237, 243, 251, 0.28);\n\t --df-review-color-scrollbar-border: rgba(15, 18, 24, 0.92);\n\t --df-review-color-backdrop: rgba(2, 6, 12, 0.62);\n\t --df-review-color-ruler-surface: transparent;\n\t --df-review-color-ruler-label: rgba(15, 18, 24, 0.9);\n\t --df-review-color-ruler-label-text: #f4efff;\n\t --df-review-color-ruler-tick-major: rgba(201, 184, 255, 0.9);\n\t --df-review-color-ruler-tick-minor: rgba(237, 243, 251, 0.2);\n\t --df-review-color-ruler-guide: rgba(255, 255, 255, 0.86);\n\t --df-review-color-ruler-measure-border: #c9b8ff;\n\t --df-review-color-ruler-measure-bg: rgba(179, 149, 255, 0.18);\n\t --df-review-color-ruler-measure-shadow: rgba(20, 12, 40, 0.52);\n\t --df-review-color-ruler-popover-border: rgba(255, 255, 255, 0.34);\n\t --df-review-color-ruler-popover-bg: rgba(15, 18, 24, 0.94);\n\t --df-review-color-ruler-popover-text: #ffffff;\n\t --df-review-color-ruler-popover-shadow: rgba(0, 0, 0, 0.42);\n\t --df-review-color-ruler-coord-bg: #d7c9ff;\n\t --df-review-color-ruler-coord-text: #14111f;\n\t --df-review-focus-ring: rgba(124, 199, 255, 0.58);\n\t --df-review-shadow-card: 0 14px 36px rgba(0, 0, 0, 0.34);\n\t --df-review-shadow-control: inset 0 1px 0 rgba(255, 255, 255, 0.04);\n\t --df-review-shadow-device: 0 24px 60px rgba(0, 0, 0, 0.38);\n\t --df-review-shadow-panel: 0 18px 48px rgba(0, 0, 0, 0.38);\n\t --df-review-shadow-modal: 0 24px 70px rgba(0, 0, 0, 0.48);\n\n\t /* Semantic aliases consumed by the existing shell chrome. */\n\t --df-review-bg: var(--df-review-color-canvas);\n\t --df-review-topbar: var(--df-review-color-surface);\n\t --df-review-panel: var(--df-review-color-panel);\n\t --df-review-panel-strong: var(--df-review-color-panel-strong);\n\t --df-review-card: var(--df-review-color-card);\n\t --df-review-card-hover: var(--df-review-color-card-hover);\n\t --df-review-control: var(--df-review-color-control);\n\t --df-review-control-hover: var(--df-review-color-control-hover);\n\t --df-review-line: var(--df-review-color-border);\n\t --df-review-line-soft: var(--df-review-color-border-soft);\n\t --df-review-text: var(--df-review-color-text);\n\t --df-review-muted: var(--df-review-color-text-muted);\n\t --df-review-subtle: var(--df-review-color-text-subtle);\n\t --df-review-accent: var(--df-review-color-accent);\n\t --df-review-accent-contrast: var(--df-review-color-accent-contrast);\n\t --df-review-accent-soft: var(--df-review-color-accent-soft);\n\t --df-review-accent-hover: var(--df-review-color-accent-hover);\n\t --df-review-danger: var(--df-review-color-danger);\n\t --df-review-danger-soft: var(--df-review-color-danger-soft);\n\t --df-review-purple: var(--df-review-color-purple);\n\t --df-review-purple-soft: var(--df-review-color-purple-soft);\n\t --df-review-note: var(--df-review-color-note);\n\t --df-review-note-soft: var(--df-review-color-note-soft);\n\t --df-review-area: var(--df-review-color-area);\n\t --df-review-area-soft: var(--df-review-color-area-soft);\n\t --df-review-side-rail: var(--df-review-color-side-rail);\n\t --df-review-mode-bar: var(--df-review-color-mode-bar);\n\t --df-review-chip-bg: var(--df-review-color-chip);\n\t --df-review-scrollbar-track: var(--df-review-color-scrollbar-track);\n\t --df-review-scrollbar-thumb: var(--df-review-color-scrollbar-thumb);\n\t --df-review-scrollbar-thumb-hover: var(--df-review-color-scrollbar-thumb-hover);\n\t --df-review-scrollbar-border: var(--df-review-color-scrollbar-border);\n\t background: var(--df-review-bg);\n\t color: var(--df-review-text);\n\t font-family: var(--df-review-font-sans);\n\t }\n\n\t body.df-review-theme-light {\n\t color-scheme: light;\n\t --df-review-color-canvas: #f4f6f9;\n\t --df-review-color-surface: #ffffff;\n\t --df-review-color-panel: #ffffff;\n\t --df-review-color-panel-strong: #edf1f6;\n\t --df-review-color-card: rgba(23, 32, 44, 0.035);\n\t --df-review-color-card-hover: rgba(23, 32, 44, 0.065);\n\t --df-review-color-control: #eef2f7;\n\t --df-review-color-control-hover: #e3e9f1;\n\t --df-review-color-border: rgba(16, 24, 40, 0.14);\n\t --df-review-color-border-soft: rgba(16, 24, 40, 0.08);\n\t --df-review-color-text: #17202c;\n\t --df-review-color-text-muted: rgba(23, 32, 44, 0.62);\n\t --df-review-color-text-subtle: rgba(23, 32, 44, 0.44);\n\t --df-review-color-accent: #1769aa;\n\t --df-review-color-accent-contrast: #ffffff;\n\t --df-review-color-accent-soft: rgba(23, 105, 170, 0.1);\n\t --df-review-color-accent-hover: rgba(23, 105, 170, 0.16);\n\t --df-review-color-danger: #b94418;\n\t --df-review-color-danger-soft: rgba(185, 68, 24, 0.1);\n\t --df-review-color-purple: #6543b8;\n\t --df-review-color-purple-soft: rgba(101, 67, 184, 0.12);\n\t --df-review-color-note: #a76617;\n\t --df-review-color-note-soft: rgba(167, 102, 23, 0.12);\n\t --df-review-color-area: #087f73;\n\t --df-review-color-area-soft: rgba(8, 127, 115, 0.12);\n\t --df-review-color-side-rail: #edf1f6;\n\t --df-review-color-mode-bar: rgba(255, 255, 255, 0.9);\n\t --df-review-color-chip: rgba(23, 32, 44, 0.06);\n\t --df-review-color-scrollbar-track: rgba(23, 32, 44, 0.06);\n\t --df-review-color-scrollbar-thumb: rgba(23, 32, 44, 0.24);\n\t --df-review-color-scrollbar-thumb-hover: rgba(23, 32, 44, 0.34);\n\t --df-review-color-scrollbar-border: rgba(244, 246, 249, 0.92);\n\t --df-review-color-backdrop: rgba(15, 23, 42, 0.32);\n\t --df-review-color-ruler-surface: transparent;\n\t --df-review-color-ruler-label: rgba(255, 255, 255, 0.94);\n\t --df-review-color-ruler-label-text: #3b247e;\n\t --df-review-color-ruler-tick-major: rgba(0, 95, 204, 0.92);\n\t --df-review-color-ruler-tick-minor: rgba(23, 32, 44, 0.3);\n\t --df-review-color-ruler-guide: rgba(0, 102, 255, 0.96);\n\t --df-review-color-ruler-measure-border: #0066ff;\n\t --df-review-color-ruler-measure-bg: rgba(0, 102, 255, 0.16);\n\t --df-review-color-ruler-measure-shadow: rgba(0, 43, 120, 0.56);\n\t --df-review-color-ruler-popover-border: rgba(255, 255, 255, 0.34);\n\t --df-review-color-ruler-popover-bg: rgba(15, 18, 24, 0.94);\n\t --df-review-color-ruler-popover-text: #ffffff;\n\t --df-review-color-ruler-popover-shadow: rgba(0, 0, 0, 0.42);\n\t --df-review-color-ruler-coord-bg: #005be8;\n\t --df-review-color-ruler-coord-text: #ffffff;\n\t --df-review-focus-ring: rgba(23, 105, 170, 0.42);\n\t --df-review-shadow-card: 0 14px 36px rgba(15, 23, 42, 0.14);\n\t --df-review-shadow-control: inset 0 1px 0 rgba(255, 255, 255, 0.72);\n\t --df-review-shadow-device: 0 24px 60px rgba(15, 23, 42, 0.18);\n\t --df-review-shadow-panel: 0 18px 48px rgba(15, 23, 42, 0.18);\n\t --df-review-shadow-modal: 0 24px 70px rgba(15, 23, 42, 0.2);\n\t }\n\n\t button,\n\t input,\n\t select,\n\t textarea {\n\t font: inherit;\n\t }\n\n button {\n cursor: pointer;\n }\n\n .df-review-shell {\n --df-review-frame-gutter-x: var(--df-review-space-4);\n display: grid;\n grid-template-columns: minmax(0, 1fr) 0 32px;\n grid-template-rows: auto minmax(0, 1fr);\n width: 100%;\n height: 100%;\n overflow: hidden;\n transition: grid-template-columns 160ms ease;\n }\n\n .df-review-shell.is-list-visible {\n grid-template-columns: minmax(0, 1fr) clamp(320px, 28vw, 420px) 32px;\n }\n\n\t .df-review-topbar {\n\t grid-column: 1;\n\t grid-row: 1;\n\t position: relative;\n\t z-index: 600;\n\t display: grid;\n\t gap: var(--df-review-space-2);\n\t container-type: inline-size;\n\t min-width: 0;\n\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t border-bottom: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-topbar), var(--df-review-panel));\n\t box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.025);\n\t }\n\n\t\t .df-review-address {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(160px, 1fr) auto auto;\n\t\t align-items: stretch;\n\t\t gap: var(--df-review-space-2);\n\t\t width: 100%;\n\t\t max-width: 1440px;\n\t\t margin: 0 auto;\n\t\t }\n\n .df-review-address input {\n\t width: 100%;\n\t min-height: var(--df-review-control-height-md);\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t padding: 0 11px;\n\t color: var(--df-review-text);\n\t background: var(--df-review-bg);\n\t box-shadow: var(--df-review-shadow-control);\n\t font-size: var(--df-review-font-size-md);\n\t transition: border-color 140ms ease, box-shadow 140ms ease, background 140ms ease;\n\t }\n\n\t .df-review-address input:focus {\n\t outline: 2px solid var(--df-review-focus-ring);\n\t outline-offset: 1px;\n\t }\n\n\t\t .df-review-address button,\n\t\t .df-review-side-toggle,\n\t\t .df-review-presets button,\n\t\t .df-review-overlay-button,\n\t\t\t .df-review-mode-button,\n\t\t\t .df-review-settings-header button,\n\t\t\t .df-review-prompt-header button,\n\t\t\t .df-review-settings-actions button,\n\t\t\t .df-review-prompt-block-header button,\n\t\t\t .df-review-item-actions button {\n\t\t min-height: var(--df-review-control-height-md);\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t background: var(--df-review-control);\n\t box-shadow: var(--df-review-shadow-control);\n\t color: var(--df-review-text);\n\t font-size: var(--df-review-font-size-sm);\n\t font-weight: 700;\n\t transition: border-color 140ms ease, background 140ms ease, color 140ms ease, box-shadow 140ms ease, opacity 140ms ease;\n\t }\n\n\t\t .df-review-address button:hover,\n\t .df-review-side-toggle:hover,\n\t\t .df-review-presets button:hover,\n\t\t .df-review-overlay-button:hover,\n\t\t .df-review-mode-button:hover,\n\t\t .df-review-settings-header button:hover,\n\t\t .df-review-prompt-header button:hover,\n\t\t .df-review-settings-actions button:hover,\n\t\t .df-review-prompt-block-header button:hover,\n\t\t\t .df-review-item-actions button:hover,\n\t\t .df-review-item-visibility:hover,\n\t\t .df-review-item-source-open:hover,\n\t\t .df-review-item-prompt-copy:hover,\n\t\t .df-review-item-delete:hover,\n\t\t .df-review-presets button.is-active,\n\t\t\t .df-review-overlay-button.is-active,\n\t\t\t .df-review-mode-button.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-control-hover);\n\t\t }\n\n\t .df-review-overlay-button.is-active,\n .df-review-mode-button.is-active {\n border-color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-sitemap-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n\t width: 38px;\n\t min-width: 38px;\n\t padding: 0;\n\t color: var(--df-review-accent);\n\t }\n\n .df-review-sitemap-button svg,\n .df-review-sitemap-header button svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.8;\n }\n\n .df-review-sitemap-modal {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: grid;\n place-items: center;\n\t\t\t\t padding: 18px;\n }\n\n\t .df-review-sitemap-backdrop {\n\t position: absolute;\n\t inset: 0;\n\t min-height: 0;\n\t border: 0;\n\t border-radius: 0;\n\t padding: 0;\n\t background: var(--df-review-color-backdrop);\n\t }\n\n .df-review-sitemap-dialog {\n position: relative;\n z-index: 1;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n\t width: min(760px, calc(100vw - 48px));\n\t max-height: min(720px, calc(100vh - 48px));\n\t overflow: hidden;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: var(--df-review-panel);\n\t box-shadow: var(--df-review-shadow-modal);\n\t }\n\n .df-review-sitemap-header {\n display: flex;\n align-items: center;\n\t justify-content: space-between;\n\t gap: 12px;\n\t min-height: 54px;\n\t padding: 0 14px 0 16px;\n\t border-bottom: 1px solid var(--df-review-line);\n\t }\n\n .df-review-sitemap-header div {\n display: flex;\n align-items: baseline;\n gap: 10px;\n min-width: 0;\n }\n\n .df-review-sitemap-header strong {\n font-size: var(--df-review-font-size-lg);\n }\n\n\t .df-review-sitemap-header span {\n\t color: var(--df-review-muted);\n\t font-size: var(--df-review-font-size-sm);\n\t font-weight: 700;\n\t }\n\n .df-review-sitemap-header button {\n display: grid;\n place-items: center;\n\t width: 34px;\n\t min-width: 34px;\n\t min-height: var(--df-review-control-height-md);\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t background: var(--df-review-control);\n\t color: var(--df-review-text);\n\t font-size: var(--df-review-font-size-md);\n\t font-weight: 800;\n\t }\n\n\t .df-review-sitemap-header button:hover {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-control-hover);\n\t }\n\n .df-review-sitemap-list {\n display: grid;\n align-content: start;\n min-height: 0;\n overflow: auto;\n padding: 8px;\n }\n\n .df-review-sitemap-table-head,\n .df-review-sitemap-row {\n display: grid;\n grid-template-columns: minmax(160px, 1fr) 70px 78px minmax(96px, 140px);\n align-items: center;\n column-gap: 0;\n }\n\n .df-review-sitemap-table-head {\n position: sticky;\n top: 0;\n z-index: 1;\n min-height: 32px;\n border-bottom: 1px solid var(--df-review-line);\n padding: 0 10px;\n background: var(--df-review-surface);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n }\n\n .df-review-sitemap-table-head span:not(:first-child) {\n text-align: right;\n }\n\n .df-review-sitemap-row {\n min-height: 42px;\n border: 0;\n border-bottom: 1px solid var(--df-review-line-soft);\n border-radius: 0;\n padding: 0 10px;\n background: transparent;\n color: var(--df-review-text);\n text-align: left;\n }\n\n button.df-review-sitemap-row {\n cursor: pointer;\n }\n\n .df-review-sitemap-row.is-folder {\n cursor: default;\n }\n\n .df-review-sitemap-row:last-child {\n border-bottom: 0;\n }\n\n button.df-review-sitemap-row:hover,\n .df-review-sitemap-row.is-active {\n background: var(--df-review-accent-soft);\n }\n\n .df-review-sitemap-path {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-md);\n font-weight: 800;\n line-height: 1.35;\n }\n\n .df-review-sitemap-row.is-folder .df-review-sitemap-path {\n color: var(--df-review-muted);\n }\n\n .df-review-sitemap-tree-prefix {\n flex: 0 0 auto;\n color: var(--df-review-muted);\n font-family: var(--df-review-font-mono);\n font-weight: 700;\n white-space: pre;\n }\n\n .df-review-sitemap-cell {\n min-width: 0;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-sm);\n font-variant-numeric: tabular-nums;\n font-weight: 900;\n line-height: 1;\n text-align: right;\n }\n\n .df-review-sitemap-cell.is-local {\n color: var(--df-review-accent);\n }\n\n .df-review-sitemap-cell.is-remote {\n color: var(--df-review-area);\n }\n\n .df-review-sitemap-cell.is-online {\n display: flex;\n justify-content: flex-end;\n color: var(--df-review-text);\n }\n\n .df-review-sitemap-users {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-sitemap-user {\n --df-review-presence-color: var(--df-review-accent);\n display: inline-flex;\n align-items: center;\n min-height: 22px;\n border: 1px solid var(--df-review-presence-color);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n background: var(--df-review-chip-bg);\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .df-review-sitemap-online-empty {\n color: var(--df-review-muted);\n }\n\n button.df-review-sitemap-row:hover .df-review-sitemap-path,\n .df-review-sitemap-row.is-active .df-review-sitemap-path {\n color: var(--df-review-text);\n }\n\n\t\t .df-review-settings-modal {\n\t\t position: fixed;\n\t\t inset: 0;\n\t\t z-index: 1001;\n\t\t display: grid;\n\t\t place-items: center;\n\t\t padding: 24px;\n\t\t }\n\n\t\t .df-review-settings-backdrop {\n\t\t position: absolute;\n\t\t inset: 0;\n\t\t min-height: 0;\n\t\t border: 0;\n\t\t border-radius: 0;\n\t\t padding: 0;\n\t\t background: var(--df-review-color-backdrop);\n\t\t }\n\n\t\t .df-review-settings-dialog {\n\t\t position: relative;\n\t\t z-index: 1;\n\t\t display: grid;\n\t\t width: min(460px, calc(100vw - 48px));\n\t\t overflow: hidden;\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-lg);\n\t\t background: var(--df-review-panel);\n\t\t box-shadow: var(--df-review-shadow-modal);\n\t\t }\n\n\t\t .df-review-settings-header {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t justify-content: space-between;\n\t\t gap: 12px;\n\t\t min-height: 54px;\n\t\t padding: 0 14px 0 16px;\n\t\t border-bottom: 1px solid var(--df-review-line);\n\t\t }\n\n\t\t .df-review-settings-title {\n\t\t display: grid;\n\t\t gap: 2px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-settings-header-actions {\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t justify-content: flex-end;\n\t\t gap: 8px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-settings-header strong {\n\t\t color: var(--df-review-text);\n\t\t font-size: var(--df-review-font-size-lg);\n\t\t }\n\n\t\t .df-review-settings-header span {\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-header button {\n\t\t display: grid;\n\t\t place-items: center;\n\t\t width: 34px;\n\t\t min-width: 34px;\n\t\t padding: 0;\n\t\t font-size: var(--df-review-font-size-md);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-body {\n\t\t display: grid;\n\t\t gap: 12px;\n\t\t padding: 16px;\n\t\t }\n\n\t\t .df-review-settings-field {\n\t\t display: grid;\n\t\t gap: 7px;\n\t\t }\n\n\t\t .df-review-settings-row {\n\t\t display: grid;\n\t\t grid-template-columns: minmax(0, 1fr) auto;\n\t\t align-items: center;\n\t\t gap: 12px;\n\t\t }\n\n\t\t .df-review-settings-field span,\n\t\t .df-review-settings-row > span,\n\t\t .df-review-settings-label-row label {\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-theme-options {\n\t\t display: inline-flex;\n\t\t justify-content: flex-end;\n\t\t gap: 6px;\n\t\t min-width: 0;\n\t\t flex-wrap: wrap;\n\t\t }\n\n\t\t .df-review-settings-theme-option {\n\t\t min-height: 30px;\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0 10px;\n\t\t color: var(--df-review-muted);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-theme-option:hover {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-control-hover);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-settings-theme-option.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t .df-review-settings-theme-option:focus-visible {\n\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t outline-offset: 1px;\n\t\t }\n\n\t\t .df-review-settings-label-row {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t gap: 6px;\n\t\t }\n\n\t\t .df-review-settings-help-button {\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: 20px;\n\t\t min-width: 20px;\n\t\t min-height: 20px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: 50%;\n\t\t padding: 0;\n\t\t background: transparent;\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-settings-help-button:hover,\n\t\t .df-review-settings-help-button.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t .df-review-settings-help-button svg {\n\t\t width: 13px;\n\t\t height: 13px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t stroke-width: 2.1;\n\t\t }\n\n\t\t\t .df-review-settings-token-input,\n\t\t\t .df-review-settings-text-input,\n\t\t\t .df-review-settings-select-input {\n\t\t\t display: grid;\n\t\t\t align-items: stretch;\n\t\t\t overflow: hidden;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t background: var(--df-review-bg);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input {\n\t\t\t grid-template-columns: minmax(0, 1fr) 38px;\n\t\t\t }\n\n\t\t\t .df-review-settings-text-input,\n\t\t\t .df-review-settings-select-input {\n\t\t\t grid-template-columns: minmax(0, 1fr);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input:focus-within,\n\t\t\t .df-review-settings-text-input:focus-within,\n\t\t\t .df-review-settings-select-input:focus-within {\n\t\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t\t outline-offset: 1px;\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input,\n\t\t\t .df-review-settings-text-input input,\n\t\t\t .df-review-settings-select-input select {\n\t\t\t min-width: 0;\n\t\t\t min-height: var(--df-review-control-height-lg);\n\t\t\t border: 0;\n\t\t padding: 0 10px;\n\t\t background: transparent;\n\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input:focus,\n\t\t\t .df-review-settings-text-input input:focus,\n\t\t\t .df-review-settings-select-input select:focus {\n\t\t\t outline: 0;\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input.is-token-masked {\n\t\t\t -webkit-text-security: disc;\n\t\t\t }\n\n\t\t\t .df-review-settings-select-input select {\n\t\t\t appearance: none;\n\t\t\t cursor: pointer;\n\t\t\t }\n\n\t\t .df-review-settings-token-toggle {\n\t\t display: grid;\n\t\t place-items: center;\n\t\t width: 38px;\n\t\t min-width: 38px;\n\t\t min-height: var(--df-review-control-height-lg);\n\t\t border: 0;\n\t\t border-left: 1px solid var(--df-review-line-soft);\n\t\t border-radius: 0;\n\t\t padding: 0;\n\t\t background: transparent;\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-settings-token-toggle:hover {\n\t\t background: var(--df-review-chip-bg);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-settings-token-toggle svg {\n\t\t width: 16px;\n\t\t height: 16px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t stroke-width: 2;\n\t\t }\n\n\t\t .df-review-settings-guide {\n\t\t margin-top: -2px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 9px 11px;\n\t\t background: var(--df-review-chip-bg);\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 700;\n\t\t line-height: 1.55;\n\t\t }\n\n\t\t .df-review-settings-guide ol {\n\t\t display: grid;\n\t\t gap: 3px;\n\t\t margin: 0;\n\t\t padding-left: 17px;\n\t\t }\n\n\t\t .df-review-settings-status {\n\t\t min-height: 20px;\n\t\t margin: 0;\n\t\t color: var(--df-review-accent);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-actions {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(0, 1fr) auto auto;\n\t\t gap: 8px;\n\t\t align-items: center;\n\t\t }\n\n\t\t .df-review-settings-actions button {\n\t\t padding: 0 12px;\n\t\t }\n\n\t\t\t .df-review-settings-actions button[type='submit'] {\n\t\t\t border-color: var(--df-review-accent);\n\t\t\t background: var(--df-review-accent-soft);\n\t\t\t color: var(--df-review-accent);\n\t\t\t }\n\n .df-review-edit-modal {\n position: fixed;\n inset: 0;\n z-index: 1003;\n display: grid;\n place-items: center;\n padding: 24px;\n }\n\n .df-review-edit-dialog {\n position: relative;\n z-index: 1;\n display: grid;\n width: min(460px, calc(100vw - 48px));\n overflow: hidden;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-lg);\n background: var(--df-review-panel);\n box-shadow: var(--df-review-shadow-modal);\n }\n\n .df-review-edit-textarea {\n min-height: 160px;\n }\n\n .df-review-edit-textarea textarea {\n width: 100%;\n min-height: 160px;\n border: 0;\n padding: 10px;\n outline: 0;\n background: transparent;\n color: var(--df-review-text);\n resize: vertical;\n font-size: var(--df-review-font-size-md);\n line-height: 1.5;\n }\n\n .df-review-edit-textarea textarea:focus {\n outline: 0;\n }\n\n .df-review-edit-error {\n margin: 0;\n color: var(--df-review-danger);\n font-size: var(--df-review-font-size-sm);\n font-weight: 800;\n }\n\n .df-review-edit-actions {\n grid-template-columns: minmax(0, 1fr) auto auto;\n }\n\n\t\t\t .df-review-prompt-modal {\n\t\t\t position: fixed;\n\t\t\t inset: 0;\n\t\t\t z-index: 1002;\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t padding: 24px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-backdrop {\n\t\t\t position: absolute;\n\t\t\t inset: 0;\n\t\t\t min-height: 0;\n\t\t\t border: 0;\n\t\t\t border-radius: 0;\n\t\t\t padding: 0;\n\t\t\t background: var(--df-review-color-backdrop);\n\t\t\t }\n\n\t\t\t .df-review-prompt-dialog {\n\t\t\t position: relative;\n\t\t\t z-index: 1;\n\t\t\t display: grid;\n\t\t\t grid-template-rows: auto minmax(0, 1fr);\n\t\t\t\t width: min(1040px, calc(100vw - 36px));\n\t\t\t\t max-height: min(900px, calc(100vh - 36px));\n\t\t\t overflow: hidden;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-lg);\n\t\t\t background: var(--df-review-panel);\n\t\t\t box-shadow: var(--df-review-shadow-modal);\n\t\t\t }\n\n .df-review-copy-toast {\n position: fixed;\n right: 52px;\n bottom: 24px;\n z-index: 1003;\n max-width: min(320px, calc(100vw - 32px));\n padding: 10px 13px;\n border: 1px solid var(--df-review-accent-hover);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-panel);\n box-shadow: var(--df-review-shadow-modal);\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-sm);\n font-weight: 800;\n line-height: 1.25;\n pointer-events: none;\n }\n\n\t\t\t .df-review-prompt-header {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t justify-content: space-between;\n\t\t\t gap: 12px;\n\t\t\t min-height: 54px;\n\t\t\t padding: 0 14px 0 16px;\n\t\t\t border-bottom: 1px solid var(--df-review-line);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header div {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-lg);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header span {\n\t\t\t overflow: hidden;\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t text-overflow: ellipsis;\n\t\t\t white-space: nowrap;\n\t\t\t }\n\n\t\t\t .df-review-prompt-header button {\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t width: 34px;\n\t\t\t min-width: 34px;\n\t\t\t padding: 0;\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-body {\n\t\t\t display: grid;\n\t\t\t gap: 14px;\n\t\t\t min-height: 0;\n\t\t\t overflow: auto;\n\t\t\t padding: 16px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block {\n\t\t\t display: grid;\n\t\t\t gap: 8px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t justify-content: space-between;\n\t\t\t gap: 12px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header div {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header span {\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header button {\n\t\t\t display: inline-flex;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-height: 30px;\n\t\t\t padding: 0 10px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header button:disabled {\n\t\t\t cursor: not-allowed;\n\t\t\t opacity: 0.5;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header svg {\n\t\t\t width: 13px;\n\t\t\t height: 13px;\n\t\t\t fill: none;\n\t\t\t stroke: currentColor;\n\t\t\t stroke-linecap: round;\n\t\t\t stroke-linejoin: round;\n\t\t\t stroke-width: 2;\n\t\t\t }\n\n\t\t\t\t .df-review-prompt-block textarea {\n\t\t\t\t width: 100%;\n\t\t\t\t height: clamp(170px, calc(100vh - 520px), 260px);\n\t\t\t\t min-height: 170px;\n\t\t\t\t max-height: 320px;\n\t\t\t resize: vertical;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t padding: 10px;\n\t\t\t background: var(--df-review-bg);\n\t\t\t color: var(--df-review-text);\n\t\t\t font-family: var(--df-review-font-mono);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 600;\n\t\t\t line-height: 1.5;\n\t\t\t white-space: pre;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block textarea:focus {\n\t\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t\t outline-offset: 1px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-section-header {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-section-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-section-header span {\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about {\n\t\t\t display: grid;\n\t\t\t gap: 10px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid {\n\t\t\t display: grid;\n\t\t\t grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n\t\t\t gap: 10px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid article {\n\t\t\t display: grid;\n\t\t\t align-content: start;\n\t\t\t gap: 6px;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-md);\n\t\t\t padding: 12px;\n\t\t\t background: var(--df-review-surface);\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid p {\n\t\t\t margin: 0;\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 700;\n\t\t\t line-height: 1.55;\n\t\t\t }\n\n\t\t\t\t .df-review-tools {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t justify-content: space-between;\n\t\t gap: 12px;\n\t\t width: 100%;\n\t\t max-width: 1440px;\n\t\t min-width: 0;\n\t\t margin: 0 auto;\n\t\t }\n\n\t\t .df-review-tool-controls {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t justify-content: flex-start;\n\t\t gap: 12px;\n\t\t min-width: 0;\n\t\t flex-wrap: wrap;\n\t }\n\n\t\t .df-review-presets,\n\t\t .df-review-mode,\n\t .df-review-overlays {\n\t display: flex;\n\t align-items: center;\n\t gap: var(--df-review-space-1-5);\n\t min-height: calc(var(--df-review-control-height-lg) + 6px);\n\t padding: 3px;\n\t border: 1px solid var(--df-review-line-soft);\n\t border-radius: var(--df-review-radius-md);\n\t background: var(--df-review-card);\n\t }\n\n\t\t .df-review-tool-divider,\n\t\t .df-review-mode-divider {\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t color: var(--df-review-line);\n\t\t font-size: var(--df-review-font-size-2xl);\n\t\t font-weight: 700;\n\t line-height: 1;\n\t\t user-select: none;\n\t }\n\n\t\t .df-review-active-size {\n\t\t flex: 0 0 auto;\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t min-height: var(--df-review-control-height-lg);\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-variant-numeric: tabular-nums;\n\t font-weight: 800;\n\t line-height: 1;\n\t }\n\n\t .df-review-presets button {\n\t display: inline-flex;\n\t align-items: center;\n gap: 7px;\n min-height: var(--df-review-control-height-lg);\n padding: 0 11px 0 9px;\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-presets button svg {\n width: 16px;\n height: 16px;\n flex: 0 0 auto;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n }\n\n .df-review-preset-count {\n min-width: 16px;\n padding: 0 5px;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-line-soft);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 16px;\n text-align: center;\n }\n\n .df-review-presets button.is-active .df-review-preset-count {\n background: var(--df-review-accent-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-presets button.is-active {\n color: var(--df-review-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n }\n\n .df-review-preset-copy {\n display: grid;\n gap: 1px;\n min-width: 0;\n text-align: left;\n line-height: 1.05;\n }\n\n .df-review-preset-copy strong {\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-sm);\n }\n\n\t .df-review-overlay-button,\n\t .df-review-mode-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n\t width: 38px;\n\t min-width: 38px;\n\t padding: 0;\n\t border-color: transparent;\n\t background: transparent;\n\t box-shadow: none;\n\t color: var(--df-review-muted);\n\t }\n\n .df-review-overlay-button svg,\n .df-review-mode-button svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n\t }\n\n\n\n\n\n\n\n\t\t .df-review-overlay-button.is-settings {\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-overlay-button.is-settings:hover {\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t .df-review-overlay-button.is-disabled,\n\t .df-review-overlay-button.is-disabled:hover {\n\t cursor: not-allowed;\n\t border-color: var(--df-review-line);\n\t background: var(--df-review-line-soft);\n\t color: var(--df-review-subtle);\n\t }\n\n\t @container (max-width: 1040px) {\n\t .df-review-tools {\n\t flex-direction: column;\n\t align-items: stretch;\n\t justify-content: flex-start;\n\t }\n\n\t .df-review-tool-controls {\n\t width: 100%;\n\t }\n\n\t .df-review-presets {\n\t flex-wrap: wrap;\n\t }\n\n\t .df-review-overlays {\n\t width: 100%;\n\t justify-content: flex-start;\n\t }\n\t }\n\n\t .df-review-side-rail {\n\t grid-column: 3;\n\t grid-row: 1 / span 2;\n\t position: relative;\n\t z-index: 600;\n\t display: flex;\n\t align-items: stretch;\n\t justify-content: center;\n\t min-width: 0;\n\t min-height: 0;\n\t border-left: 1px solid var(--df-review-line);\n\t background: var(--df-review-side-rail);\n\t }\n\n .df-review-side-toggle {\n display: grid;\n grid-template-rows: 28px auto;\n align-items: start;\n justify-items: center;\n gap: 8px;\n width: 100%;\n min-height: 100%;\n border: 0;\n\t border-radius: 0;\n\t padding: 10px 0;\n\t background: transparent;\n\t color: var(--df-review-muted);\n\t }\n\n\t .df-review-side-toggle:hover {\n\t background: var(--df-review-accent-soft);\n\t color: var(--df-review-text);\n\t }\n\n .df-review-side-toggle span {\n display: grid;\n place-items: center;\n\t width: 20px;\n\t height: 24px;\n\t line-height: 1;\n\t }\n\n\t .df-review-side-toggle svg {\n\t width: 18px;\n\t height: 18px;\n\t fill: none;\n\t stroke: currentColor;\n\t stroke-linecap: round;\n\t stroke-width: 2;\n\t }\n\n .df-review-side-toggle strong {\n writing-mode: vertical-rl;\n text-orientation: mixed;\n color: inherit;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n letter-spacing: 0.08em;\n }\n\n\t .df-review-qa-panel {\n\t grid-column: 2;\n\t grid-row: 1 / span 2;\n\t position: relative;\n\t z-index: 600;\n\t display: grid;\n\t grid-template-rows: minmax(0, 1fr);\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t border-left: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-panel), var(--df-review-bg));\n\t }\n\n\t .df-review-shell:not(.is-list-visible) .df-review-qa-panel {\n\t visibility: hidden;\n\t border-left: 0;\n\t }\n\n\t .df-review-panel-body {\n\t display: grid;\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t }\n\n .df-review-item-list {\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n min-width: 0;\n min-height: 0;\n }\n\n\t\t\t .df-review-list-header {\n\t\t\t display: grid;\n\t\t\t grid-template-rows: auto auto;\n\t\t\t gap: var(--df-review-space-2);\n\t\t\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t\t\t border-bottom: 1px solid var(--df-review-line-soft);\n\t\t\t background: var(--df-review-card);\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-list-toolbar {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n\t\t\t .df-review-list-title {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t gap: 8px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-list-title span {\n\t\t min-width: 0;\n\t\t overflow: hidden;\n\t\t text-overflow: ellipsis;\n\t\t white-space: nowrap;\n\t\t }\n\n\t\t .df-review-list-title strong {\n\t\t flex: 0 0 auto;\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-variant-numeric: tabular-nums;\n\t\t }\n\n .df-review-presence-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n gap: 5px;\n min-width: 0;\n }\n\n .df-review-presence-label {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n }\n\n .df-review-presence-label svg {\n width: 12px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n .df-review-presence-list {\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-presence-chip {\n --df-review-presence-color: var(--df-review-accent);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n flex: 0 1 auto;\n min-height: 22px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n color: var(--df-review-text);\n background: var(--df-review-chip-bg);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .df-review-presence-chip.is-self {\n border-color: var(--df-review-presence-color);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-presence-dot {\n width: 7px;\n min-width: 7px;\n height: 7px;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-presence-color);\n }\n\n .df-review-presence-name {\n min-width: 0;\n }\n\n\t\t .df-review-list-controls {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t gap: 4px;\n\t\t }\n\n\t\t .df-review-source-select {\n\t\t width: 104px;\n\t\t min-height: 30px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0 24px 0 8px;\n\t\t color: var(--df-review-text);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-source-refresh {\n\t\t position: relative;\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: 30px;\n\t\t min-width: 30px;\n\t\t height: 30px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0;\n\t\t color: var(--df-review-muted);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t }\n\n\t\t .df-review-source-refresh svg {\n\t\t width: 14px;\n\t\t height: 14px;\n\t\t }\n\n\t\t\t .df-review-filter-tabs {\n display: flex;\n align-items: center;\n gap: 2px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-card);\n box-shadow: var(--df-review-shadow-control);\n }\n\n\t\t\t\t .df-review-filter-tab {\n position: relative;\n display: grid;\n place-items: center;\n width: 26px;\n min-width: 26px;\n height: 26px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--df-review-subtle);\n }\n\n\t\t\t\t .df-review-filter-icon {\n display: grid;\n place-items: center;\n width: 100%;\n height: 100%;\n }\n\n\t\t\t\t .df-review-filter-separator {\n\t\t\t\t display: block;\n\t\t\t\t width: 18px;\n\t\t\t\t height: 1px;\n\t\t\t\t border-radius: var(--df-review-radius-pill);\n\t\t\t\t background: currentColor;\n\t\t\t\t opacity: 0.42;\n\t\t\t\t }\n\n\t\t .df-review-filter-tab:hover,\n\t\t .df-review-filter-tab.is-active {\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-filter-tab.is-active {\n\t\t box-shadow: inset 0 0 0 1px rgba(124, 199, 255, 0.42);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t\t\t .df-review-filter-icon svg {\n\t\t\t\t width: 15px;\n\t\t\t\t height: 15px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t\t stroke-width: 2;\n\t\t\t }\n\n\t\t\t .df-review-filter-count {\n\t\t\t color: currentColor;\n\t\t\t font-size: var(--df-review-font-size-3xs);\n\t\t\t font-weight: 900;\n\t\t\t font-variant-numeric: tabular-nums;\n\t\t\t line-height: 1;\n\t\t\t }\n\n .df-review-list-scroll {\n display: grid;\n align-content: start;\n gap: var(--df-review-space-2);\n min-height: 0;\n overflow: auto;\n padding: var(--df-review-space-2);\n }\n\n\t .df-review-empty {\n\t margin: 0;\n\t padding: var(--df-review-space-5) var(--df-review-space-4);\n\t border: 1px dashed var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: var(--df-review-card);\n\t color: var(--df-review-subtle);\n\t font-size: var(--df-review-font-size-sm);\n\t line-height: 1.45;\n\t }\n\n .df-review-item-card.is-dim {\n opacity: 0.4;\n }\n\n .df-review-item-card.is-dim:hover {\n opacity: 0.72;\n }\n\n\t .df-review-item-card {\n\t\t position: relative;\n\t\t display: grid;\n\t\t gap: var(--df-review-space-2-5);\n\t\t padding: var(--df-review-space-3-5);\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-lg);\n\t\t background: var(--df-review-card);\n\t\t cursor: pointer;\n\t\t transition: border-color 140ms ease, background 140ms ease, box-shadow 140ms ease, opacity 140ms ease;\n\t\t }\n\n .df-review-item-card:not(.is-dim):hover {\n border-color: var(--df-review-line);\n }\n\n .df-review-item-card.is-active {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-card);\n\t box-shadow: inset 0 0 0 1px var(--df-review-accent-hover), 0 0 0 3px rgba(124, 199, 255, 0.12);\n\t }\n\n .df-review-item-card.is-overlay-hidden .df-review-item-main {\n opacity: 0.68;\n }\n\n .df-review-item-header {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n gap: 8px;\n min-width: 0;\n }\n\n .df-review-item-main {\n display: grid;\n gap: 4px;\n min-width: 0;\n\t border: 0;\n\t padding: 0;\n\t text-align: left;\n\t background: transparent;\n\t color: var(--df-review-text);\n\t }\n\n .df-review-item-main strong {\n overflow-wrap: anywhere;\n font-size: var(--df-review-font-size-md);\n line-height: 1.35;\n }\n\n .df-review-item-comment {\n padding: 5px 0;\n white-space: pre-wrap;\n }\n\n\t .df-review-item-main small {\n\t color: var(--df-review-subtle);\n\t font-size: var(--df-review-font-size-xs);\n\t }\n\n .df-review-item-meta {\n display: block;\n overflow-wrap: anywhere;\n line-height: 1.35;\n }\n\n .df-review-item-error {\n color: var(--df-review-danger) !important;\n overflow-wrap: anywhere;\n }\n\n .df-review-item-badges {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-item-id,\n .df-review-item-scope,\n .df-review-item-mode,\n .df-review-item-status-badge,\n .df-review-item-status-select {\n --df-review-scope: var(--df-review-accent);\n --df-review-scope-rgb: 124, 199, 255;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-height: 20px;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n text-transform: uppercase;\n }\n\n .df-review-item-id {\n border-color: var(--df-review-line);\n background: rgba(255, 255, 255, 0.03);\n color: var(--df-review-text);\n }\n\n .df-review-item-scope {\n border-color: rgba(var(--df-review-scope-rgb), 0.36);\n background: rgba(var(--df-review-scope-rgb), 0.12);\n color: var(--df-review-scope);\n }\n\n .df-review-item-scope.is-scope-tablet {\n --df-review-scope: var(--df-review-area);\n --df-review-scope-rgb: 99, 215, 199;\n }\n\n .df-review-item-scope.is-scope-desktop {\n --df-review-scope: var(--df-review-note);\n --df-review-scope-rgb: 243, 183, 95;\n }\n\n .df-review-item-scope.is-scope-wide {\n --df-review-scope: var(--df-review-purple);\n --df-review-scope-rgb: 201, 156, 255;\n }\n\n .df-review-item-scope.is-scope-dom {\n --df-review-scope: var(--df-review-danger);\n --df-review-scope-rgb: 255, 143, 97;\n }\n\n .df-review-item-scope svg,\n .df-review-item-mode svg {\n width: 12px;\n height: 12px;\n flex: 0 0 auto;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n\t .df-review-item-mode {\n\t color: var(--df-review-muted);\n background: var(--df-review-line-soft);\n }\n\n .df-review-item-mode.is-mode-area {\n color: var(--df-review-area);\n }\n\n .df-review-item-mode.is-mode-dom {\n color: var(--df-review-danger);\n }\n\n .df-review-item-status-badge {\n min-height: 30px;\n border-radius: var(--df-review-radius-sm);\n padding: 0 11px;\n font-size: var(--df-review-font-size-xs);\n font-weight: 750;\n text-transform: none;\n }\n\n .df-review-item-status-select {\n min-height: 30px;\n min-width: 92px;\n max-width: 118px;\n border-radius: var(--df-review-radius-sm);\n padding: 0 10px;\n cursor: pointer;\n outline: 0;\n font-size: var(--df-review-font-size-xs);\n font-weight: 750;\n text-transform: none;\n }\n\n .df-review-item-status-select:focus-visible {\n border-color: var(--df-review-accent);\n box-shadow: 0 0 0 2px var(--df-review-accent-soft);\n }\n\n .df-review-item-status-badge.is-status-todo,\n .df-review-item-status-select.is-status-todo {\n border-color: var(--df-review-line);\n color: var(--df-review-muted);\n background: var(--df-review-line-soft);\n }\n\n .df-review-item-status-badge.is-status-doing,\n .df-review-item-status-select.is-status-doing {\n border-color: rgba(124, 199, 255, 0.34);\n color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-item-status-badge.is-status-review,\n .df-review-item-status-select.is-status-review {\n border-color: rgba(243, 183, 95, 0.34);\n color: var(--df-review-note);\n background: var(--df-review-note-soft);\n }\n\n .df-review-item-status-badge.is-status-hold,\n .df-review-item-status-select.is-status-hold {\n border-color: rgba(179, 149, 255, 0.32);\n color: var(--df-review-purple);\n background: var(--df-review-purple-soft);\n }\n\n .df-review-item-status-badge.is-status-done,\n .df-review-item-status-select.is-status-done {\n border-color: rgba(99, 215, 199, 0.34);\n color: var(--df-review-area);\n background: var(--df-review-area-soft);\n }\n\n .df-review-item-status-badge.is-error {\n border-color: rgba(255, 143, 97, 0.36);\n color: var(--df-review-danger);\n background: var(--df-review-danger-soft);\n }\n\n\t .df-review-item-main img {\n\t width: 100%;\n\t max-height: 110px;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t object-fit: cover;\n\t background: var(--df-review-control);\n }\n\n\t .df-review-item-header-actions {\n\t display: inline-flex;\n\t align-items: center;\n\t justify-content: flex-end;\n\t gap: 2px;\n\t cursor: auto;\n\t }\n\n .df-review-item-delete,\n .df-review-item-edit,\n .df-review-item-prompt-copy,\n .df-review-item-source-open,\n .df-review-item-visibility {\n display: inline-grid;\n place-items: center;\n width: 26px;\n height: 26px;\n border: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n text-decoration: none;\n transition: border-color 140ms ease, background 140ms ease, color 140ms ease;\n }\n\n .df-review-item-visibility:hover,\n .df-review-item-edit:hover,\n .df-review-item-source-open:hover,\n .df-review-item-prompt-copy:hover {\n border-color: rgba(124, 199, 255, 0.34);\n color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-item-delete:hover {\n border-color: rgba(255, 143, 97, 0.34);\n color: var(--df-review-danger);\n background: var(--df-review-danger-soft);\n }\n\n .df-review-item-visibility.is-visible {\n color: var(--df-review-accent);\n }\n\n .df-review-item-visibility.is-hidden {\n opacity: 0.7;\n color: var(--df-review-subtle);\n }\n\n .df-review-item-prompt-copy.is-copied {\n color: var(--df-review-accent);\n }\n\n .df-review-item-delete svg,\n .df-review-item-edit svg,\n .df-review-item-prompt-copy svg,\n .df-review-item-source-open svg,\n .df-review-item-visibility svg {\n width: 14px;\n height: 14px;\n }\n\n\t\t\t\t .df-review-item-actions {\n\t\t\t\t display: grid;\n\t\t\t\t grid-template-columns: auto minmax(0, 1fr) auto;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-width: 0;\n\t\t\t margin-top: 2px;\n\t\t\t }\n\n\t\t\t .df-review-item-status-actions {\n\t\t\t display: inline-flex;\n\t\t\t grid-column: 1;\n\t\t\t align-items: center;\n\t\t\t min-width: 0;\n\t\t cursor: auto;\n\t\t\t }\n\n\t\t\t .df-review-item-remote-actions {\n\t\t\t display: inline-flex;\n\t\t\t grid-column: 3;\n\t\t\t align-items: center;\n\t\t\t justify-content: flex-end;\n\t\t\t justify-self: end;\n\t\t\t gap: 6px;\n\t\t\t min-width: 0;\n\t\t cursor: auto;\n\t\t\t }\n\n .df-review-item-action-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: 32px;\n min-width: 32px;\n height: 30px;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: var(--df-review-control);\n }\n\n\t .df-review-item-action-button:hover:not(:disabled) {\n\t border-color: rgba(124, 199, 255, 0.42);\n\t color: var(--df-review-text);\n\t background: var(--df-review-control-hover);\n\t }\n\n\t\t\t .df-review-item-actions .df-review-item-submit-button {\n\t\t\t display: inline-flex;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-height: 30px;\n\t\t\t height: 30px;\n\t\t\t width: auto;\n\t\t\t min-width: 0;\n\t\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t padding: 0 11px;\n\t\t border-color: var(--df-review-line);\n\t\t background: var(--df-review-control);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-item-submit-button span {\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 750;\n\t\t line-height: 1;\n\t\t text-transform: none;\n\t\t white-space: nowrap;\n\t\t }\n\n\t .df-review-item-actions .df-review-item-submit-button:hover:not(:disabled) {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-accent-hover);\n\t color: var(--df-review-text);\n\t }\n\n .df-review-item-action-button:disabled {\n cursor: default;\n opacity: 0.45;\n }\n\n .df-review-item-action-button svg {\n width: 14px;\n height: 14px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n\t .df-review-stage {\n\t grid-column: 1;\n\t grid-row: 2;\n\t display: grid;\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t }\n\n .df-review-frame {\n display: grid;\n grid-template-rows: minmax(0, 1fr) auto;\n min-width: 0;\n min-height: 0;\n }\n\n .df-review-frame-actions {\n position: relative;\n z-index: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 56px;\n padding: 8px 40px 10px;\n border-top: 1px solid var(--df-review-line-soft);\n background: var(--df-review-mode-bar);\n }\n\n\t .df-review-frame-scroll {\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: auto;\n\t }\n\n\t .df-review-frame-canvas {\n\t display: grid;\n\t place-items: center;\n\t width: max-content;\n\t height: max-content;\n\t min-width: 100%;\n\t min-height: 100%;\n\t padding: 34px 40px 12px;\n\t }\n\n .df-review-device {\n\t box-sizing: border-box;\n\t flex: 0 0 auto;\n\t position: relative;\n\t margin: 0;\n\t overflow: hidden;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: #fff;\n\t box-shadow: var(--df-review-shadow-device);\n }\n\n .df-review-device iframe {\n display: block;\n width: inherit;\n height: inherit;\n min-width: inherit;\n min-height: inherit;\n border: 0;\n background: #fff;\n }\n\n .df-review-device-frame {\n position: relative;\n box-sizing: border-box;\n flex: 0 0 auto;\n }\n\n .df-review-ruler-corner {\n position: absolute;\n left: -26px;\n top: -26px;\n width: 26px;\n height: 26px;\n z-index: 6;\n border-right: 1px solid var(--df-review-line-soft);\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-color-ruler-surface);\n }\n\n .df-review-ruler-gutter {\n position: absolute;\n z-index: 6;\n background: var(--df-review-color-ruler-surface);\n color: var(--df-review-muted);\n user-select: none;\n }\n\n .df-review-ruler-gutter.is-x {\n left: 0;\n right: 0;\n top: -26px;\n height: 26px;\n border-bottom: 1px solid var(--df-review-line-soft);\n background-image:\n linear-gradient(\n to right,\n var(--df-review-color-ruler-tick-major) 1px,\n transparent 1px\n ),\n linear-gradient(\n to right,\n var(--df-review-color-ruler-tick-minor) 1px,\n transparent 1px\n );\n background-size:\n calc(var(--df-review-ruler-step-x) * 5) 11px,\n var(--df-review-ruler-step-x) 6px;\n background-position: left bottom;\n background-repeat: repeat-x;\n }\n\n .df-review-ruler-gutter.is-y {\n left: -26px;\n top: 0;\n bottom: 0;\n width: 26px;\n border-right: 1px solid var(--df-review-line-soft);\n background-image:\n linear-gradient(\n to bottom,\n var(--df-review-color-ruler-tick-major) 1px,\n transparent 1px\n ),\n linear-gradient(\n to bottom,\n var(--df-review-color-ruler-tick-minor) 1px,\n transparent 1px\n );\n background-size:\n 11px calc(var(--df-review-ruler-step-y) * 5),\n 6px var(--df-review-ruler-step-y);\n background-position: right top;\n background-repeat: repeat-y;\n }\n\n .df-review-ruler-frame-label {\n position: absolute;\n right: 6px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border: 1px solid var(--df-review-color-ruler-popover-border);\n border-radius: var(--df-review-radius-sm);\n background: var(--df-review-color-ruler-label);\n line-height: 1;\n white-space: nowrap;\n box-shadow: 0 6px 18px var(--df-review-color-ruler-popover-shadow);\n }\n\n .df-review-ruler-frame-label strong {\n color: var(--df-review-color-ruler-label-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n }\n\n .df-review-ruler-frame-label span {\n color: var(--df-review-color-ruler-label-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n opacity: 0.78;\n }\n\n .df-review-ruler-coord {\n position: absolute;\n z-index: 7;\n padding: 4px 6px;\n border: 1px solid var(--df-review-color-ruler-popover-border);\n border-radius: var(--df-review-radius-xs);\n background: var(--df-review-color-ruler-coord-bg);\n color: var(--df-review-color-ruler-coord-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n pointer-events: none;\n box-shadow: 0 6px 18px var(--df-review-color-ruler-popover-shadow);\n }\n\n .df-review-ruler-coord.is-x {\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n .df-review-ruler-coord.is-y {\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n .df-review-ruler-overlay {\n position: absolute;\n left: 0;\n top: 0;\n width: inherit;\n height: inherit;\n z-index: 5;\n cursor: crosshair;\n overflow: hidden;\n touch-action: none;\n user-select: none;\n }\n\n .df-review-ruler-overlay.is-dragging {\n cursor: crosshair;\n }\n\n .df-review-ruler-guide {\n position: absolute;\n z-index: 2;\n pointer-events: none;\n background: var(--df-review-color-ruler-guide);\n box-shadow: 0 0 0 1px var(--df-review-color-ruler-measure-shadow);\n }\n\n .df-review-ruler-guide.is-x {\n left: 0;\n right: 0;\n height: 2px;\n }\n\n .df-review-ruler-guide.is-y {\n top: 0;\n bottom: 0;\n width: 2px;\n }\n\n .df-review-ruler-selection {\n position: absolute;\n z-index: 3;\n pointer-events: none;\n border: 3px solid var(--df-review-color-ruler-measure-border);\n background: var(--df-review-color-ruler-measure-bg);\n box-shadow:\n inset 0 0 0 1px var(--df-review-color-ruler-measure-shadow),\n 0 0 0 1px rgba(255, 255, 255, 0.96),\n 0 0 0 4px var(--df-review-color-ruler-measure-shadow);\n }\n\n .df-review-ruler-label {\n position: absolute;\n z-index: 4;\n pointer-events: none;\n min-width: 124px;\n padding: 9px 11px;\n border: 1px solid var(--df-review-color-ruler-popover-border);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-color-ruler-popover-bg);\n color: var(--df-review-color-ruler-popover-text);\n font-family: var(--df-review-font-mono);\n font-size: var(--df-review-font-size-lg);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n letter-spacing: -0.02em;\n text-align: center;\n box-shadow:\n 0 10px 26px var(--df-review-color-ruler-popover-shadow),\n inset 0 1px 0 rgba(255, 255, 255, 0.18);\n }\n\n\t @media (max-width: 860px) {\n\t .df-review-shell,\n\t .df-review-shell.is-list-visible {\n\t grid-template-columns: minmax(0, 1fr) 0 32px;\n\t grid-template-rows: auto minmax(0, 1fr);\n\t }\n\n\t .df-review-shell.is-list-visible {\n\t grid-template-columns: minmax(0, 1fr) minmax(260px, 70vw) 32px;\n\t }\n\n\t .df-review-qa-panel {\n\t border-left: 1px solid var(--df-review-line);\n\t border-bottom: 0;\n\t }\n\n\t .df-review-tools {\n\t flex-wrap: wrap;\n\t }\n\n\t .df-review-tool-controls {\n\t justify-content: flex-start;\n\t }\n\n .df-review-frame-actions {\n padding: 8px 20px 10px;\n }\n\n\t .df-review-frame-canvas {\n\t padding: 34px 28px 12px;\n\t }\n\n\t\t .df-review-prompt-modal {\n\t\t padding: 12px;\n\t\t }\n\n\t\t .df-review-prompt-dialog {\n\t\t width: calc(100vw - 24px);\n\t\t max-height: calc(100vh - 24px);\n\t\t }\n\n\t\t .df-review-prompt-block textarea {\n\t\t height: min(360px, calc(100vh - 270px));\n\t\t min-height: 240px;\n\t\t max-height: calc(100vh - 270px);\n\t\t }\n\n\t .df-review-panel-body {\n\t min-height: 0;\n\t }\n }\n `;\n document.head.append(style);\n }\n}\n","import React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n GripVertical as GripVerticalIcon,\n} from 'lucide-react';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewMode,\n ReviewSource,\n} from '../../types';\n\nimport type {\n ReviewShellProps,\n ReviewShellWriteMode,\n} from '../types';\nimport {\n DEFAULT_INITIAL_REVIEW_PROMPT,\n} from '../constants';\nimport {\n DEFAULT_REVIEW_PATH_PREFIX,\n normalizeTarget,\n updateShellUrl,\n} from '../route';\nimport {\n DEFAULT_REVIEW_VIEWPORT_PRESETS,\n} from '../viewport';\nimport {\n PromptModal,\n ReviewSettingsModal,\n SitemapModal,\n} from '../shell.modals';\nimport { buildReviewItemPrompt } from '../prompt/prompt';\nimport { QaItemEditModal } from '../qa/item.edit.modal';\nimport { ReviewQaPanel } from '../qa/panel';\nimport {\n getElementSourceHint,\n getSourceHintElement,\n openSourceInEditor,\n} from '../source.open';\nimport { ReviewTargetFrame } from '../target/frame';\nimport { ReviewTopbar } from '../topbar';\nimport { useReviewController } from '../hooks/use.review.controller';\nimport { useReviewPresence } from '../hooks/use.review.presence';\nimport { useReviewRuler } from '../hooks/use.review.ruler';\nimport { useReviewSettings } from '../hooks/use.review.settings';\nimport { useReviewShellData } from '../hooks/use.review.shell.data';\nimport { useReviewShellHotkeys } from '../hooks/use.review.shell.hotkeys';\nimport { useReviewShellState } from '../hooks/use.review.shell.state';\nimport {\n copyCurrentReviewUrl,\n copyReviewPrompt,\n removeReviewItem,\n refreshReviewItems,\n refreshSitemapReviewItems,\n refreshReviewData as refreshReviewDataAction,\n submitReviewItem,\n updateReviewItemComment,\n updateReviewItemStatus,\n} from './shell.actions';\n\nconst getReviewModeWriteMode = (\n mode: ReviewMode\n): ReviewShellWriteMode | null => {\n if (mode === 'element') return 'dom';\n if (mode === 'note' || mode === 'area') return mode;\n return null;\n};\n\nexport const ReviewShell = ({\n projectId,\n pages,\n adapters,\n presets = DEFAULT_REVIEW_VIEWPORT_PRESETS,\n ruler,\n initialPrompt = DEFAULT_INITIAL_REVIEW_PROMPT,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX,\n sourceRoot,\n presence\n}: ReviewShellProps) => {\n const {\n activeAdapterEntry,\n activeRoute,\n adapter,\n canWriteArea,\n canWriteDom,\n cleanupTargetRef,\n controllerRef,\n copiedPromptKey,\n copyLabel,\n draftTarget,\n frameScrollRef,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n isInitialPromptOpen,\n isListVisible,\n isRemoteSource,\n isSitemapOpen,\n localAdapterEntry,\n mode,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n remoteAdapterEntry,\n reviewViewportPresets,\n selectedItemId,\n selectedItemIdRef,\n setActiveRoute,\n setCopiedPromptKey,\n setCopyLabel,\n setDraftTarget,\n setIsInitialPromptOpen,\n setIsListVisible,\n setIsSitemapOpen,\n setMode,\n setSelectedItemId,\n setSize,\n setSource,\n setTarget,\n setTargetOverlayState,\n showSourceSelect,\n size,\n sizeRef,\n source,\n sourceEntries,\n target,\n targetOverlayState,\n targetRef,\n toastMessage,\n viewportPresets,\n setToastMessage,\n } = useReviewShellState({\n adapters,\n presets,\n reviewPathPrefix,\n });\n const sourceShortcutCleanupRef = useRef<(() => void) | null>(null);\n const {\n activeItems,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIds,\n pageQaCounts,\n pageTargets,\n presetScopeCounts,\n qaFilter,\n qaFilterCounts,\n selectedNumberedItem,\n setHiddenOverlayItemIds,\n setItems,\n setQaFilter,\n setSitemapItems,\n targetSrc,\n } = useReviewShellData({\n activeRoute,\n pages,\n reviewPathPrefix,\n reviewViewportPresets,\n selectedItemId,\n size,\n target,\n viewportPresets,\n });\n const [editingItem, setEditingItem] = useState<ReviewItem | null>(null);\n const initialPromptText = initialPrompt.trim();\n const refreshItems = useCallback(\n () =>\n refreshReviewItems({\n activeRoute,\n adapter,\n isRemoteSource,\n pageId: activeAdapterEntry.pageId,\n projectId,\n onItemsChange: setItems,\n }),\n [activeAdapterEntry.pageId, activeRoute, adapter, isRemoteSource, projectId]\n );\n\n const refreshSitemapItems = useCallback(\n () =>\n refreshSitemapReviewItems({\n localAdapterEntry,\n projectId,\n remoteAdapterEntry,\n onSitemapItemsChange: setSitemapItems,\n }),\n [localAdapterEntry, projectId, remoteAdapterEntry]\n );\n\n const cancelReviewMode = useCallback(() => {\n const controller = controllerRef.current;\n if (!controller || controller.getMode() === 'idle') return false;\n\n controller.setMode('idle');\n setMode(controller.getMode());\n return true;\n }, []);\n\n const closePromptModal = useCallback(() => {\n setIsInitialPromptOpen(false);\n }, []);\n\n const closeSitemap = useCallback(() => {\n setIsSitemapOpen(false);\n }, []);\n\n const reloadTargetFrame = useCallback(() => {\n try {\n iframeRef.current?.contentWindow?.location.reload();\n } catch {\n return;\n }\n }, []);\n\n const {\n closeFigmaSettings,\n effectiveReviewTheme,\n figmaSettingsStatus,\n figmaTokenDraft,\n isFigmaSettingsOpen,\n isFigmaTokenGuideOpen,\n isFigmaTokenVisible,\n openFigmaSettings,\n reviewThemeDraft,\n reviewUserId,\n reviewUserIdDraft,\n saveReviewSettings,\n setFigmaSettingsStatus,\n setFigmaTokenDraft,\n setIsFigmaTokenGuideOpen,\n setIsFigmaTokenVisible,\n setReviewThemeDraft,\n setReviewUserIdDraft,\n } = useReviewSettings({\n onCancelReviewMode: cancelReviewMode,\n onCloseInitialPrompt: closePromptModal,\n onCloseSitemap: closeSitemap,\n onReloadTargetFrame: reloadTargetFrame,\n });\n\n const {\n currentPagePresenceUsers,\n pagePresenceUsers,\n presenceSessionId,\n } = useReviewPresence({\n activeRoute,\n mode,\n presence,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n selectedNumberedItem,\n size,\n source,\n });\n\n const closeRulerPanels = useCallback(() => {\n closeSitemap();\n closeFigmaSettings();\n }, [closeFigmaSettings, closeSitemap]);\n\n const {\n closeRuler,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n toggleRuler,\n } = useReviewRuler({\n iframeRef,\n ruler,\n size,\n targetSrc,\n onCancelReviewMode: cancelReviewMode,\n onCloseTransientPanels: closeRulerPanels,\n });\n\n const {\n clearSelectedItem,\n closeTargetOverlay,\n initReviewKit,\n reloadReviewKit,\n restoreReviewItem,\n setControllerReviewMode,\n syncTargetViewport,\n toggleTargetOverlay,\n } = useReviewController({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n pageTargets,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetOverlayState,\n targetRef,\n viewportPresets,\n onActiveRouteChange: setActiveRoute,\n onCancelReviewMode: cancelReviewMode,\n onCloseRuler: closeRuler,\n onDraftTargetChange: setDraftTarget,\n onItemsRefresh: refreshItems,\n onModeChange: setMode,\n onSelectedItemIdChange: setSelectedItemId,\n onSizeChange: setSize,\n onTargetChange: setTarget,\n onTargetOverlayStateChange: setTargetOverlayState,\n });\n\n const refreshReviewData = useCallback(() => {\n return refreshReviewDataAction({\n onRefreshItems: refreshItems,\n onRefreshSitemapItems: refreshSitemapItems,\n onReloadReviewKit: reloadReviewKit,\n });\n }, [refreshItems, refreshSitemapItems, reloadReviewKit]);\n\n const toggleItemOverlayVisibility = useCallback((itemId: string) => {\n setHiddenOverlayItemIds((currentHiddenOverlayItemIds) => {\n const nextHiddenItemIds = new Set(currentHiddenOverlayItemIds);\n if (nextHiddenItemIds.has(itemId)) {\n nextHiddenItemIds.delete(itemId);\n } else {\n nextHiddenItemIds.add(itemId);\n }\n\n return nextHiddenItemIds;\n });\n }, []);\n\n useEffect(() => {\n void refreshItems();\n }, [refreshItems]);\n\n useEffect(() => {\n void refreshSitemapItems();\n }, [refreshSitemapItems]);\n\n useEffect(() => {\n if (!isSitemapOpen) return;\n void refreshSitemapItems();\n }, [isSitemapOpen, refreshSitemapItems]);\n\n useEffect(() => {\n const frameScroll = frameScrollRef.current;\n if (!frameScroll) return undefined;\n\n const centerFrameScroll = () => {\n frameScroll.scrollLeft = Math.max(\n 0,\n (frameScroll.scrollWidth - frameScroll.clientWidth) / 2\n );\n frameScroll.scrollTop = 0;\n syncTargetViewport();\n };\n\n const animationFrame = window.requestAnimationFrame(centerFrameScroll);\n const transitionTimeout = window.setTimeout(centerFrameScroll, 180);\n\n return () => {\n window.cancelAnimationFrame(animationFrame);\n window.clearTimeout(transitionTimeout);\n };\n }, [isListVisible, size.height, size.width, syncTargetViewport, targetSrc]);\n\n const applyTarget = () => {\n const normalizedTarget = normalizeTarget(draftTarget, reviewPathPrefix);\n clearSelectedItem();\n targetRef.current = normalizedTarget;\n setActiveRoute(normalizedTarget);\n setDraftTarget(normalizedTarget);\n setTarget(normalizedTarget);\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n };\n\n const selectPage = (href: string) => {\n const normalizedTarget = normalizeTarget(href, reviewPathPrefix);\n clearSelectedItem();\n targetRef.current = normalizedTarget;\n setActiveRoute(normalizedTarget);\n setDraftTarget(normalizedTarget);\n setTarget(normalizedTarget);\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n setIsSitemapOpen(false);\n };\n\n const setReviewMode = (nextMode: ReviewMode) => {\n const writeMode = getReviewModeWriteMode(nextMode);\n if (writeMode && !activeAdapterEntry.writeModes.includes(writeMode)) return;\n closeRuler();\n if (nextMode === 'element') {\n closeTargetOverlay('figma');\n }\n setControllerReviewMode(nextMode);\n };\n\n useReviewShellHotkeys({\n isFigmaSettingsOpen,\n isInitialPromptOpen,\n isRulerAvailable,\n isRulerVisible,\n isSitemapOpen,\n mode,\n onCancelReviewMode: cancelReviewMode,\n onCloseFigmaSettings: closeFigmaSettings,\n onCloseInitialPrompt: closePromptModal,\n onCloseRuler: closeRuler,\n onCloseSitemap: closeSitemap,\n onSetReviewMode: setReviewMode,\n onToggleRuler: toggleRuler,\n onToggleTargetOverlay: toggleTargetOverlay,\n });\n\n const copyCurrentUrl = () =>\n copyCurrentReviewUrl({\n onCopyLabelChange: setCopyLabel,\n });\n\n const showToast = useCallback(\n (message: string) => {\n setToastMessage(message);\n window.setTimeout(() => {\n setToastMessage((current) => (current === message ? '' : current));\n }, 1600);\n },\n [setToastMessage]\n );\n\n const cleanupSourceOpenShortcut = useCallback(() => {\n sourceShortcutCleanupRef.current?.();\n sourceShortcutCleanupRef.current = null;\n }, []);\n\n const bindSourceOpenShortcut = useCallback(() => {\n cleanupSourceOpenShortcut();\n\n let frameDocument: Document | null = null;\n try {\n frameDocument = iframeRef.current?.contentDocument ?? null;\n } catch {\n return;\n }\n\n if (!frameDocument) return;\n\n const hoverAttribute = 'data-dfwr-source-hover';\n const optionAttribute = 'data-dfwr-source-option';\n const fontOverlayAttribute = 'data-dfwr-source-fonts';\n const style = frameDocument.createElement('style');\n style.dataset.dfwrSourceOpenShortcut = 'true';\n style.textContent = `\n html[${optionAttribute}=\"true\"],\n html[${optionAttribute}=\"true\"] * {\n cursor: crosshair !important;\n }\n\n html[${optionAttribute}=\"true\"] body::before {\n position: fixed !important;\n z-index: 2147483647 !important;\n top: 10px !important;\n left: 50% !important;\n transform: translateX(-50%) !important;\n display: block !important;\n border: 1px solid rgba(124, 199, 255, 0.72) !important;\n border-radius: 999px !important;\n padding: 6px 10px !important;\n color: #ffffff !important;\n background: rgba(15, 23, 42, 0.86) !important;\n box-shadow: 0 10px 28px rgba(0, 0, 0, 0.24) !important;\n content: \"Source select\" !important;\n font: 700 12px/1 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif !important;\n pointer-events: none !important;\n }\n\n [${hoverAttribute}=\"true\"] {\n outline: 2px solid rgba(124, 199, 255, 0.96) !important;\n outline-offset: 2px !important;\n }\n\n [${fontOverlayAttribute}] {\n position: fixed !important;\n z-index: 2147483647 !important;\n display: flex !important;\n flex-direction: column !important;\n max-width: 180px !important;\n border: 1px solid rgba(124, 199, 255, 0.72) !important;\n border-radius: 6px !important;\n padding: 4px 6px !important;\n color: #ffffff !important;\n background: rgba(15, 23, 42, 0.9) !important;\n box-shadow: 0 8px 22px rgba(0, 0, 0, 0.28) !important;\n font: 800 11px/1.35 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace !important;\n pointer-events: none !important;\n white-space: nowrap !important;\n }\n\n [${fontOverlayAttribute}] > span {\n display: flex !important;\n justify-content: space-between !important;\n gap: 10px !important;\n }\n\n [${fontOverlayAttribute}][hidden] {\n display: none !important;\n }\n `;\n\n (frameDocument.head ?? frameDocument.documentElement).append(style);\n\n const fontOverlay = frameDocument.createElement('div');\n fontOverlay.setAttribute(fontOverlayAttribute, 'true');\n fontOverlay.hidden = true;\n (frameDocument.body ?? frameDocument.documentElement).append(fontOverlay);\n\n let hoveredElement: Element | null = null;\n let lastSourceElement: Element | null = null;\n let isSourceSelecting = false;\n\n const getFontHints = (element: Element | null) => {\n if (!element) return [];\n\n const values: Array<{ tag: string; value: string }> = [];\n const addValue = (target: Element) => {\n const value = target.getAttribute('data-font')?.trim();\n const tag = target.tagName.toLowerCase();\n if (\n value &&\n !values.some((item) => item.tag === tag && item.value === value)\n ) {\n values.push({ tag, value });\n }\n };\n\n addValue(element);\n element.querySelectorAll('[data-font]').forEach(addValue);\n return values;\n };\n\n const updateFontOverlay = (element: Element | null) => {\n const values = isSourceSelecting ? getFontHints(element) : [];\n if (!values.length || !element) {\n fontOverlay.hidden = true;\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const frameWidth = frameDocument.documentElement.clientWidth;\n const showAbove = rect.top > 48;\n const left = Math.max(4, Math.min(rect.left, frameWidth - 96));\n const top = Math.max(4, showAbove ? rect.top : rect.bottom);\n\n fontOverlay.replaceChildren();\n fontOverlay.style.minWidth = '72px';\n const rows = values.map(({ tag, value }) => {\n const row = frameDocument.createElement('span');\n const tagText = frameDocument.createElement('span');\n const valueText = frameDocument.createElement('span');\n tagText.textContent = tag;\n valueText.textContent = value;\n row.append(tagText, valueText);\n return row;\n });\n fontOverlay.append(...rows);\n fontOverlay.style.left = `${left}px`;\n fontOverlay.style.top = `${top}px`;\n fontOverlay.style.transform = showAbove\n ? 'translateY(calc(-100% - 6px))'\n : 'translateY(6px)';\n fontOverlay.hidden = false;\n };\n\n const setHoveredElement = (element: Element | null) => {\n if (hoveredElement !== element) {\n hoveredElement?.removeAttribute(hoverAttribute);\n hoveredElement = element;\n hoveredElement?.setAttribute(hoverAttribute, 'true');\n }\n updateFontOverlay(element);\n };\n\n const setSourceSelecting = (isSelecting: boolean) => {\n isSourceSelecting = isSelecting;\n if (isSelecting) {\n frameDocument.documentElement.setAttribute(optionAttribute, 'true');\n setHoveredElement(lastSourceElement);\n return;\n }\n\n setHoveredElement(null);\n fontOverlay.hidden = true;\n frameDocument.documentElement.removeAttribute(optionAttribute);\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n lastSourceElement = getSourceHintElement(event.target);\n\n if (event.altKey && !isSourceSelecting) {\n setSourceSelecting(true);\n }\n\n setHoveredElement(isSourceSelecting ? lastSourceElement : null);\n };\n\n const handleClick = (event: MouseEvent) => {\n if (!isSourceSelecting && !event.altKey) return;\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n const source = getElementSourceHint(event.target);\n if (!source?.file) {\n showToast('Source hint not found');\n setSourceSelecting(false);\n return;\n }\n\n const didOpen = openSourceInEditor(source, sourceRoot);\n showToast(didOpen ? 'Source opened' : 'Source root required');\n setSourceSelecting(false);\n };\n\n const isOptionKeyEvent = (event: KeyboardEvent) =>\n event.key === 'Alt' ||\n event.code === 'AltLeft' ||\n event.code === 'AltRight' ||\n event.altKey;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isOptionKeyEvent(event)) return;\n\n cancelReviewMode();\n setSourceSelecting(true);\n };\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (isOptionKeyEvent(event) || !event.altKey) setSourceSelecting(false);\n };\n\n const handleBlur = () => {\n setSourceSelecting(false);\n };\n\n frameDocument.addEventListener('mousemove', handleMouseMove, true);\n frameDocument.addEventListener('click', handleClick, true);\n frameDocument.addEventListener('keydown', handleKeyDown, true);\n frameDocument.addEventListener('keyup', handleKeyUp, true);\n frameDocument.defaultView?.addEventListener('blur', handleBlur);\n window.addEventListener('keydown', handleKeyDown, true);\n window.addEventListener('keyup', handleKeyUp, true);\n window.addEventListener('blur', handleBlur);\n\n sourceShortcutCleanupRef.current = () => {\n frameDocument.removeEventListener('mousemove', handleMouseMove, true);\n frameDocument.removeEventListener('click', handleClick, true);\n frameDocument.removeEventListener('keydown', handleKeyDown, true);\n frameDocument.removeEventListener('keyup', handleKeyUp, true);\n frameDocument.defaultView?.removeEventListener('blur', handleBlur);\n window.removeEventListener('keydown', handleKeyDown, true);\n window.removeEventListener('keyup', handleKeyUp, true);\n window.removeEventListener('blur', handleBlur);\n setSourceSelecting(false);\n style.remove();\n fontOverlay.remove();\n };\n }, [\n cancelReviewMode,\n cleanupSourceOpenShortcut,\n iframeRef,\n showToast,\n sourceRoot,\n ]);\n\n useEffect(() => {\n return cleanupSourceOpenShortcut;\n }, [cleanupSourceOpenShortcut]);\n\n const loadTargetFrame = useCallback(() => {\n initReviewKit();\n bindSourceOpenShortcut();\n }, [bindSourceOpenShortcut, initReviewKit]);\n\n useEffect(() => {\n const frame = window.requestAnimationFrame(bindSourceOpenShortcut);\n return () => window.cancelAnimationFrame(frame);\n }, [bindSourceOpenShortcut, targetSrc]);\n\n const clearSelectedReviewItem = useCallback(() => {\n clearSelectedItem();\n updateShellUrl(targetRef.current, sizeRef.current, source);\n }, [clearSelectedItem, sizeRef, source, targetRef]);\n\n const changeReviewSource = (nextSource: ReviewSource) => {\n if (!sourceEntries.some((entry) => entry.label === nextSource)) return;\n\n cancelReviewMode();\n clearSelectedItem();\n setItems([]);\n setSource(nextSource);\n updateShellUrl(targetRef.current, sizeRef.current, nextSource);\n };\n\n const changeItemStatus = (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) =>\n updateReviewItemStatus({\n activeAdapterEntry,\n item,\n nextStatus,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n\n const saveItemComment = async (item: ReviewItem, comment: string) => {\n await updateReviewItemComment({\n activeAdapterEntry,\n item,\n comment,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n setEditingItem(null);\n };\n\n const submitItem = (numberedItem: NumberedReviewItem) =>\n submitReviewItem({\n localAdapterEntry,\n numberedItem,\n remoteAdapterEntry,\n selectedItemIdRef,\n onClearSelectedItem: clearSelectedItem,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n\n const copyPrompt = (\n value: string,\n key: string,\n toastMessage = 'Prompt copied'\n ) =>\n copyReviewPrompt({\n key,\n toastMessage,\n value,\n onCopiedPromptKeyChange: setCopiedPromptKey,\n onToast: showToast,\n });\n\n const copyItemPrompt = (numberedItem: NumberedReviewItem) =>\n copyPrompt(\n buildReviewItemPrompt(numberedItem, reviewPathPrefix),\n `qa:${numberedItem.item.id}`,\n 'QA prompt copied'\n );\n\n const removeItem = (item: ReviewItem) =>\n removeReviewItem({\n activeAdapterEntry,\n isRemoteSource,\n item,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n onClearSelectedItem: clearSelectedItem,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n\n return (\n <div\n className={`df-review-shell is-theme-${effectiveReviewTheme}${\n isListVisible ? ' is-list-visible' : ''\n }`}\n >\n <ReviewTopbar\n draftTarget={draftTarget}\n copyLabel={copyLabel}\n viewportPresets={viewportPresets}\n size={size}\n presetScopeCounts={presetScopeCounts}\n isRulerAvailable={isRulerAvailable}\n isRulerVisible={isRulerVisible}\n targetOverlayState={targetOverlayState}\n isFigmaOverlayAvailable={isFigmaOverlayAvailable}\n onDraftTargetChange={setDraftTarget}\n onApplyTarget={applyTarget}\n onOpenSitemap={() => setIsSitemapOpen(true)}\n onCopyCurrentUrl={() => void copyCurrentUrl()}\n onSizeChange={setSize}\n onToggleRuler={toggleRuler}\n onToggleTargetOverlay={toggleTargetOverlay}\n onOpenInitialPrompt={() => {\n setIsInitialPromptOpen(true);\n }}\n onOpenSettings={openFigmaSettings}\n />\n\n {isSitemapOpen && (\n <SitemapModal\n pages={pages}\n activeRoute={activeRoute}\n pageQaCounts={pageQaCounts}\n pagePresenceUsers={pagePresenceUsers}\n getPageTarget={(href) => normalizeTarget(href, reviewPathPrefix)}\n onClose={() => setIsSitemapOpen(false)}\n onSelectPage={selectPage}\n />\n )}\n\n {isFigmaSettingsOpen && (\n <ReviewSettingsModal\n figmaTokenDraft={figmaTokenDraft}\n reviewUserIdDraft={reviewUserIdDraft}\n reviewThemeDraft={reviewThemeDraft}\n figmaSettingsStatus={figmaSettingsStatus}\n isFigmaTokenVisible={isFigmaTokenVisible}\n isFigmaTokenGuideOpen={isFigmaTokenGuideOpen}\n onClose={closeFigmaSettings}\n onFigmaTokenDraftChange={setFigmaTokenDraft}\n onReviewUserIdDraftChange={setReviewUserIdDraft}\n onReviewThemeDraftChange={setReviewThemeDraft}\n onClearStatus={() => setFigmaSettingsStatus('')}\n onToggleFigmaTokenVisible={() =>\n setIsFigmaTokenVisible((current) => !current)\n }\n onToggleFigmaTokenGuide={() =>\n setIsFigmaTokenGuideOpen((current) => !current)\n }\n onSave={saveReviewSettings}\n />\n )}\n\n {isInitialPromptOpen && (\n <PromptModal\n initialPromptText={initialPromptText}\n copiedPromptKey={copiedPromptKey}\n onClose={closePromptModal}\n onCopyPrompt={(text, key) => void copyPrompt(text, key)}\n />\n )}\n\n {editingItem && (\n <QaItemEditModal\n item={editingItem}\n onClose={() => setEditingItem(null)}\n onSave={saveItemComment}\n />\n )}\n\n {toastMessage && (\n <div className=\"df-review-copy-toast\" role=\"status\">\n {toastMessage}\n </div>\n )}\n\n <div className=\"df-review-side-rail\">\n <button\n aria-label={isListVisible ? 'Hide QA list' : 'Show QA list'}\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={() => setIsListVisible((current) => !current)}\n >\n <span aria-hidden=\"true\">\n <GripVerticalIcon />\n </span>\n <strong>QA</strong>\n </button>\n </div>\n\n <ReviewQaPanel\n activeAdapterEntry={activeAdapterEntry}\n activeItems={activeItems}\n currentPagePresenceUsers={currentPagePresenceUsers}\n currentPresetScope={currentPresetScope}\n filteredNumberedActiveItems={filteredNumberedActiveItems}\n getItemPresetScope={getItemPresetScope}\n hiddenOverlayItemIds={hiddenOverlayItemIds}\n isListVisible={isListVisible}\n isRemoteSource={isRemoteSource}\n presenceSessionId={presenceSessionId}\n copiedPromptKey={copiedPromptKey}\n qaFilter={qaFilter}\n qaFilterCounts={qaFilterCounts}\n remoteAdapterEntry={remoteAdapterEntry}\n selectedItemId={selectedItemId}\n showSourceSelect={showSourceSelect}\n sourceRoot={sourceRoot}\n source={source}\n sourceEntries={sourceEntries}\n onChangeItemStatus={changeItemStatus}\n onClearSelectedItem={clearSelectedReviewItem}\n onChangeReviewSource={changeReviewSource}\n onCopyItemPrompt={(numberedItem) => void copyItemPrompt(numberedItem)}\n onEditItem={setEditingItem}\n onQaFilterChange={setQaFilter}\n onRefreshReviewData={refreshReviewData}\n onRemoveItem={removeItem}\n onRestoreReviewItem={restoreReviewItem}\n onSubmitItem={submitItem}\n onToggleItemOverlayVisibility={toggleItemOverlayVisibility}\n />\n\n <ReviewTargetFrame\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n frameScrollRef={frameScrollRef}\n iframeRef={iframeRef}\n isRulerAvailable={isRulerAvailable}\n isRulerDragging={isRulerDragging}\n isRulerVisible={isRulerVisible}\n mode={mode}\n rulerHover={rulerHover}\n rulerMeasure={rulerMeasure}\n rulerMeasureLabel={rulerMeasureLabel}\n rulerOverlayRef={rulerOverlayRef}\n rulerScaleX={rulerScaleX}\n rulerScaleY={rulerScaleY}\n rulerUnit={rulerUnit}\n size={size}\n targetSrc={targetSrc}\n onLoadTarget={loadTargetFrame}\n onSetReviewMode={setReviewMode}\n />\n </div>\n );\n};\n","/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n","/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n","import { CamelToPascal } from '../utility-types';\nimport { toCamelCase } from './toCamelCase';\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n\n return false;\n};\n","'use client';\n\nimport { createContext, createElement, type ReactNode, useContext, useMemo } from 'react';\nimport { LucideProps } from './types';\n\ntype LucideConfig = {\n size: number;\n color: string;\n strokeWidth: number;\n absoluteStrokeWidth: boolean;\n className: string;\n};\n\nconst LucideContext = createContext<LucideProps>({});\n\ntype LucideProviderProps = {\n children: ReactNode;\n} & Partial<LucideConfig>;\n\nexport function LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n}: LucideProviderProps) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className],\n );\n\n return createElement(LucideContext.Provider, { value }, children);\n}\n\nexport const useLucideContext = () => useContext(LucideContext);\n","'use client';\n\nimport { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\nimport { useLucideContext } from './context';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n { color, size, strokeWidth, absoluteStrokeWidth, className = '', children, iconNode, ...rest },\n ref,\n ) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = 'currentColor',\n className: contextClass = '',\n } = useLucideContext() ?? {};\n\n const calculatedStrokeWidth =\n absoluteStrokeWidth ?? contextAbsoluteStrokeWidth\n ? (Number(strokeWidth ?? contextStrokeWidth) * 24) / Number(size ?? contextSize)\n : strokeWidth ?? contextStrokeWidth;\n\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses('lucide', contextClass, className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3', key: '1u773s' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n];\n\n/**\n * @component @name CircleQuestionMark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMiIC8+CiAgPHBhdGggZD0iTTEyIDE3aC4wMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/circle-question-mark\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleQuestionMark = createLucideIcon('circle-question-mark', __iconNode);\n\nexport default CircleQuestionMark;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n];\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHg9IjgiIHk9IjgiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('copy', __iconNode);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'M10 14 21 3', key: 'gplh6r' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6', key: 'a6xqqp' }],\n];\n\n/**\n * @component @name ExternalLink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0iTTEwIDE0IDIxIDMiIC8+CiAgPHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ExternalLink = createLucideIcon('external-link', __iconNode);\n\nexport default ExternalLink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49',\n key: 'ct8e1f',\n },\n ],\n ['path', { d: 'M14.084 14.158a3 3 0 0 1-4.242-4.242', key: '151rxh' }],\n [\n 'path',\n {\n d: 'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143',\n key: '13bj9a',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNzMzIDUuMDc2YTEwLjc0NCAxMC43NDQgMCAwIDEgMTEuMjA1IDYuNTc1IDEgMSAwIDAgMSAwIC42OTYgMTAuNzQ3IDEwLjc0NyAwIDAgMS0xLjQ0NCAyLjQ5IiAvPgogIDxwYXRoIGQ9Ik0xNC4wODQgMTQuMTU4YTMgMyAwIDAgMS00LjI0Mi00LjI0MiIgLz4KICA8cGF0aCBkPSJNMTcuNDc5IDE3LjQ5OWExMC43NSAxMC43NSAwIDAgMS0xNS40MTctNS4xNTEgMSAxIDAgMCAxIDAtLjY5NiAxMC43NSAxMC43NSAwIDAgMSA0LjQ0Ni01LjE0MyIgLz4KICA8cGF0aCBkPSJtMiAyIDIwIDIwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst EyeOff = createLucideIcon('eye-off', __iconNode);\n\nexport default EyeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n key: '1nclc0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi4wNjIgMTIuMzQ4YTEgMSAwIDAgMSAwLS42OTYgMTAuNzUgMTAuNzUgMCAwIDEgMTkuODc2IDAgMSAxIDAgMCAxIDAgLjY5NiAxMC43NSAxMC43NSAwIDAgMS0xOS44NzYgMCIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Eye = createLucideIcon('eye', __iconNode);\n\nexport default Eye;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4 12.15V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-3.35',\n key: '1wthlu',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n ['path', { d: 'm5 16-3 3 3 3', key: '331omg' }],\n ['path', { d: 'm9 22 3-3-3-3', key: 'lsp7cz' }],\n];\n\n/**\n * @component @name FileCodeCorner\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCAxMi4xNVY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMmgtMy4zNSIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KICA8cGF0aCBkPSJtNSAxNi0zIDMgMyAzIiAvPgogIDxwYXRoIGQ9Im05IDIyIDMtMy0zLTMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/file-code-corner\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FileCodeCorner = createLucideIcon('file-code-corner', __iconNode);\n\nexport default FileCodeCorner;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '9', cy: '12', r: '1', key: '1vctgf' }],\n ['circle', { cx: '9', cy: '5', r: '1', key: 'hp0tcf' }],\n ['circle', { cx: '9', cy: '19', r: '1', key: 'fkjjf6' }],\n ['circle', { cx: '15', cy: '12', r: '1', key: '1tmaij' }],\n ['circle', { cx: '15', cy: '5', r: '1', key: '19l28e' }],\n ['circle', { cx: '15', cy: '19', r: '1', key: 'f4zoj3' }],\n];\n\n/**\n * @component @name GripVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjUiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTUiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTkiIHI9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/grip-vertical\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GripVertical = createLucideIcon('grip-vertical', __iconNode);\n\nexport default GripVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '7', height: '7', x: '3', y: '3', rx: '1', key: '1g98yp' }],\n ['rect', { width: '7', height: '7', x: '14', y: '3', rx: '1', key: '6d4xhi' }],\n ['rect', { width: '7', height: '7', x: '14', y: '14', rx: '1', key: 'nxv5o0' }],\n ['rect', { width: '7', height: '7', x: '3', y: '14', rx: '1', key: '1bb6yr' }],\n];\n\n/**\n * @component @name LayoutGrid\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIzIiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIxNCIgeT0iMyIgcng9IjEiIC8+CiAgPHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iNyIgeD0iMTQiIHk9IjE0IiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIxNCIgcng9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/layout-grid\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LayoutGrid = createLucideIcon('layout-grid', __iconNode);\n\nexport default LayoutGrid;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M2 5h20', key: '1fs1ex' }],\n ['path', { d: 'M6 12h12', key: '8npq4p' }],\n ['path', { d: 'M9 19h6', key: '456am0' }],\n];\n\n/**\n * @component @name ListFilter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMiA1aDIwIiAvPgogIDxwYXRoIGQ9Ik02IDEyaDEyIiAvPgogIDxwYXRoIGQ9Ik05IDE5aDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/list-filter\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ListFilter = createLucideIcon('list-filter', __iconNode);\n\nexport default ListFilter;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z',\n key: '169xi5',\n },\n ],\n ['path', { d: 'M15 5.764v15', key: '1pn4in' }],\n ['path', { d: 'M9 3.236v15', key: '1uimfh' }],\n];\n\n/**\n * @component @name Map\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQuMTA2IDUuNTUzYTIgMiAwIDAgMCAxLjc4OCAwbDMuNjU5LTEuODNBMSAxIDAgMCAxIDIxIDQuNjE5djEyLjc2NGExIDEgMCAwIDEtLjU1My44OTRsLTQuNTUzIDIuMjc3YTIgMiAwIDAgMS0xLjc4OCAwbC00LjIxMi0yLjEwNmEyIDIgMCAwIDAtMS43ODggMGwtMy42NTkgMS44M0ExIDEgMCAwIDEgMyAxOS4zODFWNi42MThhMSAxIDAgMCAxIC41NTMtLjg5NGw0LjU1My0yLjI3N2EyIDIgMCAwIDEgMS43ODggMHoiIC8+CiAgPHBhdGggZD0iTTE1IDUuNzY0djE1IiAvPgogIDxwYXRoIGQ9Ik05IDMuMjM2djE1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/map\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Map = createLucideIcon('map', __iconNode);\n\nexport default Map;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'm21 3-7 7', key: '1l2asr' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M9 21H3v-6', key: 'wtvkvv' }],\n];\n\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0ibTIxIDMtNyA3IiAvPgogIDxwYXRoIGQ9Im0zIDIxIDctNyIgLz4KICA8cGF0aCBkPSJNOSAyMUgzdi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize2 = createLucideIcon('maximize-2', __iconNode);\n\nexport default Maximize2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n key: '1a8usu',\n },\n ],\n ['path', { d: 'm15 5 4 4', key: '1mk7zo' }],\n];\n\n/**\n * @component @name Pencil\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KICA8cGF0aCBkPSJtMTUgNSA0IDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/pencil\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pencil = createLucideIcon('pencil', __iconNode);\n\nexport default Pencil;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '12', x: '2', y: '6', rx: '2', key: '9lu3g6' }],\n];\n\n/**\n * @component @name RectangleHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTIiIHg9IjIiIHk9IjYiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rectangle-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RectangleHorizontal = createLucideIcon('rectangle-horizontal', __iconNode);\n\nexport default RectangleHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z',\n key: 'icamh8',\n },\n ],\n ['path', { d: 'm14.5 12.5 2-2', key: 'inckbg' }],\n ['path', { d: 'm11.5 9.5 2-2', key: 'fmmyf7' }],\n ['path', { d: 'm8.5 6.5 2-2', key: 'vc6u1g' }],\n ['path', { d: 'm17.5 15.5 2-2', key: 'wo5hmg' }],\n];\n\n/**\n * @component @name Ruler\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMyAxNS4zYTIuNCAyLjQgMCAwIDEgMCAzLjRsLTIuNiAyLjZhMi40IDIuNCAwIDAgMS0zLjQgMEwyLjcgOC43YTIuNDEgMi40MSAwIDAgMSAwLTMuNGwyLjYtMi42YTIuNDEgMi40MSAwIDAgMSAzLjQgMFoiIC8+CiAgPHBhdGggZD0ibTE0LjUgMTIuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTExLjUgOS41IDItMiIgLz4KICA8cGF0aCBkPSJtOC41IDYuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTE3LjUgMTUuNSAyLTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/ruler\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ruler = createLucideIcon('ruler', __iconNode);\n\nexport default Ruler;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 7V5a2 2 0 0 1 2-2h2', key: 'aa7l1z' }],\n ['path', { d: 'M17 3h2a2 2 0 0 1 2 2v2', key: '4qcy5o' }],\n ['path', { d: 'M21 17v2a2 2 0 0 1-2 2h-2', key: '6vwrx8' }],\n ['path', { d: 'M7 21H5a2 2 0 0 1-2-2v-2', key: 'ioqczr' }],\n];\n\n/**\n * @component @name Scan\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiAvPgogIDxwYXRoIGQ9Ik0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiAvPgogIDxwYXRoIGQ9Ik0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIC8+CiAgPHBhdGggZD0iTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/scan\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Scan = createLucideIcon('scan', __iconNode);\n\nexport default Scan;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '20', x: '5', y: '2', rx: '2', ry: '2', key: '1yt0o3' }],\n ['path', { d: 'M12 18h.01', key: 'mhygvu' }],\n];\n\n/**\n * @component @name Smartphone\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMjAiIHg9IjUiIHk9IjIiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNMTIgMThoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/smartphone\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Smartphone = createLucideIcon('smartphone', __iconNode);\n\nexport default Smartphone;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z',\n key: 'xwnzip',\n },\n ],\n ['path', { d: 'M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6', key: '14rsvq' }],\n];\n\n/**\n * @component @name SquareMousePointer\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuMDM0IDEyLjY4MWEuNDk4LjQ5OCAwIDAgMSAuNjQ3LS42NDdsOSAzLjVhLjUuNSAwIDAgMS0uMDMzLjk0M2wtMy40NDQgMS4wNjhhMSAxIDAgMCAwLS42Ni42NmwtMS4wNjcgMy40NDNhLjUuNSAwIDAgMS0uOTQzLjAzM3oiIC8+CiAgPHBhdGggZD0iTTIxIDExVjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/square-mouse-pointer\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareMousePointer = createLucideIcon('square-mouse-pointer', __iconNode);\n\nexport default SquareMousePointer;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z',\n key: '1dfntj',\n },\n ],\n ['path', { d: 'M15 3v5a1 1 0 0 0 1 1h5', key: '6s6qgf' }],\n];\n\n/**\n * @component @name StickyNote\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgOWEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTUgM0g1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yeiIgLz4KICA8cGF0aCBkPSJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/sticky-note\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst StickyNote = createLucideIcon('sticky-note', __iconNode);\n\nexport default StickyNote;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v12', key: '1x0j5s' }],\n ['path', { d: 'm17 8-5-5-5 5', key: '7q97r8' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n];\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxMiIgLz4KICA8cGF0aCBkPSJtMTcgOC01LTUtNSA1IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('upload', __iconNode);\n\nexport default Upload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2', key: '1yyitq' }],\n ['path', { d: 'M16 3.128a4 4 0 0 1 0 7.744', key: '16gr8j' }],\n ['path', { d: 'M22 21v-2a4 4 0 0 0-3-3.87', key: 'kshegd' }],\n ['circle', { cx: '9', cy: '7', r: '4', key: 'nufk8' }],\n];\n\n/**\n * @component @name Users\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIgLz4KICA8cGF0aCBkPSJNMTYgMy4xMjhhNCA0IDAgMCAxIDAgNy43NDQiIC8+CiAgPHBhdGggZD0iTTIyIDIxdi0yYTQgNCAwIDAgMC0zLTMuODciIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/users\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Users = createLucideIcon('users', __iconNode);\n\nexport default Users;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","import type { ReviewItemScope } from '../types';\nimport type { ReviewQaFilter, ReviewShellTheme } from './types';\n\nexport const REVIEW_QA_FILTERS: Array<{\n key: ReviewQaFilter;\n label: string;\n scope?: ReviewItemScope;\n}> = [\n { key: 'all', label: 'All' },\n { key: 'mobile', label: 'Mobile', scope: 'mobile' },\n { key: 'tablet', label: 'Tablet', scope: 'tablet' },\n { key: 'desktop', label: 'Desktop', scope: 'desktop' },\n { key: 'wide', label: 'Wide', scope: 'wide' },\n];\n\nexport const FIGMA_OVERLAY_UNAVAILABLE_MESSAGE =\n '피그마 오버레이 디버깅이 안되는 해상도';\nexport const FIGMA_TOKEN_STORAGE_KEY = 'figma-token';\nexport const REVIEW_USER_ID_STORAGE_KEY = 'user-id';\nexport const REVIEW_THEME_STORAGE_KEY = 'df-review-theme';\nexport const DEFAULT_REVIEW_THEME: ReviewShellTheme = 'dark';\nexport const FIGMA_TOKEN_GUIDE_ID = 'df-review-figma-token-guide';\nexport const DEFAULT_INITIAL_REVIEW_PROMPT =\n 'You are fixing QA issues collected with df-web-review-kit. Use the copied QA prompt as the source of truth for page, viewport, selector, DOM metadata, coordinates, and user comment. Make the smallest code or CSS change that fixes the issue, preserve unrelated behavior, then verify the target viewport again.';\n\nexport const REVIEW_THEME_OPTIONS: Array<{\n value: ReviewShellTheme;\n label: string;\n}> = [\n { value: 'dark', label: 'Dark' },\n { value: 'light', label: 'Light' },\n { value: 'system', label: 'System' }\n];\n","import type { ReviewItem, ReviewSource } from '../types';\nimport type { ReviewShellViewportPreset } from './types';\n\nexport const DEFAULT_REVIEW_PATH_PREFIX = '/review';\n\nexport const normalizeReviewPathPrefix = (value: string) => {\n const raw = value.trim() || DEFAULT_REVIEW_PATH_PREFIX;\n const prefix = raw.startsWith('/') ? raw : `/${raw}`;\n return prefix.length > 1 && prefix.endsWith('/')\n ? prefix.slice(0, -1)\n : prefix;\n};\n\nexport const normalizeTarget = (\n value: string,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n const raw = value.trim() || '/';\n const [path] = raw.split(/[?#]/);\n const normalized = path.startsWith('/') ? path : `/${path}`;\n const reviewPrefix = normalizeReviewPathPrefix(reviewPathPrefix);\n\n return normalized === reviewPrefix ||\n normalized.startsWith(`${reviewPrefix}/`)\n ? '/'\n : normalized;\n};\n\nexport const getInitialTarget = (reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX) => {\n if (typeof window === 'undefined') return '/';\n\n const target = new URLSearchParams(window.location.search).get('target');\n return target ? normalizeTarget(target, reviewPathPrefix) : '/';\n};\n\nexport const buildTargetSrc = (target: string) => {\n const url = new URL(target || '/', window.location.origin);\n url.searchParams.set('__dfwr_target', '1');\n return `${url.pathname}${url.search}${url.hash}`;\n};\n\nexport const getHashRoutePath = (hash: string) => {\n if (!hash.startsWith('#/')) return null;\n\n const [path] = hash.slice(1).split(/[?#]/);\n try {\n return decodeURI(path || '/');\n } catch {\n return path || '/';\n }\n};\n\nexport const getFrameRouteTarget = (\n targetWindow: Window,\n reviewPathPrefix: string\n) => {\n const hashPath = getHashRoutePath(targetWindow.location.hash);\n return normalizeTarget(\n hashPath ?? targetWindow.location.pathname,\n reviewPathPrefix\n );\n};\n\nexport const updateShellUrl = (\n target: string,\n size: ReviewShellViewportPreset,\n source: ReviewSource\n) => {\n const url = new URL(window.location.href);\n url.searchParams.set('target', target);\n url.searchParams.set('w', String(size.width));\n url.searchParams.set('h', String(size.height));\n if (source !== 'local') {\n url.searchParams.set('source', source);\n } else {\n url.searchParams.delete('source');\n }\n url.searchParams.delete('item');\n window.history.replaceState(null, '', `${url.pathname}${url.search}`);\n};\n\nexport const updateShellUrlForItem = (\n target: string,\n size: ReviewShellViewportPreset,\n itemId: string,\n source: ReviewSource\n) => {\n const url = new URL(window.location.href);\n url.searchParams.set('target', target);\n url.searchParams.set('w', String(size.width));\n url.searchParams.set('h', String(size.height));\n url.searchParams.set('item', itemId);\n if (source !== 'local') {\n url.searchParams.set('source', source);\n } else {\n url.searchParams.delete('source');\n }\n window.history.replaceState(null, '', `${url.pathname}${url.search}`);\n};\n\nexport const getInitialItemId = () => {\n if (typeof window === 'undefined') return null;\n return new URLSearchParams(window.location.search).get('item');\n};\n\nexport const getInitialSource = (\n remoteSource: ReviewSource | null | undefined\n): ReviewSource => {\n if (typeof window === 'undefined' || !remoteSource) return 'local';\n return new URLSearchParams(window.location.search).get('source') ===\n remoteSource\n ? remoteSource\n : 'local';\n};\n\nexport const getItemTarget = (\n item: ReviewItem,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n if (item.routeKey) return normalizeTarget(item.routeKey, reviewPathPrefix);\n if (item.normalizedPath) {\n return normalizeTarget(item.normalizedPath, reviewPathPrefix);\n }\n\n try {\n return normalizeTarget(new URL(item.pageUrl).pathname, reviewPathPrefix);\n } catch {\n return '/';\n }\n};\n","import type { ReviewItem, ReviewViewportPreset } from '../types';\nimport type { ReviewShellViewportKind, ReviewShellViewportPreset } from './types';\n\nexport const DEFAULT_REVIEW_VIEWPORT_PRESETS: ReviewShellViewportPreset[] = [\n { label: 'Mobile', width: 390, height: 720, kind: 'mobile' },\n { label: 'Tablet', width: 768, height: 1024, kind: 'tablet' },\n { label: 'Desktop', width: 1440, height: 900, kind: 'desktop' },\n { label: 'Wide', width: 1980, height: 1080, kind: 'wide' }\n];\n\nexport const getFallbackPreset = (presets: ReviewShellViewportPreset[]) =>\n presets[0] ?? DEFAULT_REVIEW_VIEWPORT_PRESETS[0];\n\nexport const getViewportPresetDistance = (\n preset: ReviewShellViewportPreset,\n width: number,\n height: number\n) => Math.abs(preset.width - width) + Math.abs(preset.height - height);\n\nexport const findViewportPreset = (\n presets: ReviewShellViewportPreset[],\n width: number,\n height: number\n) => {\n const fallback = getFallbackPreset(presets);\n const exact = presets.find(\n (preset) => preset.width === width && preset.height === height\n );\n\n if (exact) return exact;\n\n return presets.reduce((closest, preset) => {\n const closestDistance = getViewportPresetDistance(closest, width, height);\n const presetDistance = getViewportPresetDistance(preset, width, height);\n return presetDistance < closestDistance ? preset : closest;\n }, fallback);\n};\n\nexport const getInitialSize = (\n presets: ReviewShellViewportPreset[]\n): ReviewShellViewportPreset => {\n if (typeof window === 'undefined') return getFallbackPreset(presets);\n\n const params = new URLSearchParams(window.location.search);\n const width = Number(params.get('w'));\n const height = Number(params.get('h'));\n\n if (\n Number.isFinite(width) &&\n Number.isFinite(height) &&\n width > 0 &&\n height > 0\n ) {\n return findViewportPreset(presets, width, height);\n }\n\n return getFallbackPreset(presets);\n};\n\nexport const getRestoredSize = (\n item: ReviewItem,\n presets: ReviewShellViewportPreset[]\n): ReviewShellViewportPreset =>\n findViewportPreset(\n presets,\n Math.max(\n 240,\n Math.round(item.viewport?.width ?? getFallbackPreset(presets).width)\n ),\n Math.max(\n 320,\n Math.round(item.viewport?.height ?? getFallbackPreset(presets).height)\n )\n );\n\nexport const getViewportPresetKind = (\n preset: ReviewShellViewportPreset\n): ReviewShellViewportKind => {\n if (preset.kind) return preset.kind;\n\n const label = preset.label.toLowerCase();\n\n if (label.includes('mobile') || label.includes('phone')) return 'mobile';\n if (label.includes('tablet') || label.includes('pad')) return 'tablet';\n if (\n label.includes('wide') ||\n label.includes('1980') ||\n label.includes('1940') ||\n label.includes('1920')\n ) {\n return 'wide';\n }\n if (label.includes('desktop')) return 'desktop';\n if (preset.width >= 1800) return 'wide';\n if (preset.width >= 1000) return 'desktop';\n if (preset.width >= 700) return 'tablet';\n return 'mobile';\n};\n\nexport const toReviewViewportPresets = (\n presets: ReviewShellViewportPreset[]\n): ReviewViewportPreset[] =>\n presets.map((preset) => ({\n label: preset.label,\n width: preset.width,\n height: preset.height,\n scope: getViewportPresetKind(preset)\n }));\n\nexport const getIsFigmaOverlayAvailable = (preset: ReviewShellViewportPreset) => {\n const kind = getViewportPresetKind(preset);\n return kind === 'mobile' || kind === 'wide';\n};\n","import type { NumberedReviewItem, ReviewItem } from '../../types';\nimport { getItemTarget } from '../route';\n\nexport const getItemTitle = (item: ReviewItem) =>\n item.title || item.comment.split('\\n')[0] || item.kind;\n\nexport const formatItemMeta = (item: ReviewItem) => {\n const parts = [\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(item.viewport?.height ?? 0)}`\n ];\n\n if (item.scroll) {\n parts.push(\n `scroll ${Math.round(item.scroll.x)},${Math.round(item.scroll.y)}`\n );\n }\n\n return parts.join(' / ');\n};\n\nexport const formatPromptViewport = (item: ReviewItem) =>\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(\n item.viewport?.height ?? 0\n )}`;\n\nexport const formatPromptPoint = (point: { x: number; y: number } | undefined) =>\n point ? `x=${Math.round(point.x)}, y=${Math.round(point.y)}` : '(none)';\n\nexport const formatPromptSelection = (\n selection:\n | {\n x?: number;\n y?: number;\n left?: number;\n top?: number;\n width: number;\n height: number;\n }\n | undefined\n) => {\n if (!selection) return '(none)';\n\n const x = 'x' in selection ? selection.x : selection.left;\n const y = 'y' in selection ? selection.y : selection.top;\n return `x=${Math.round(x ?? 0)}, y=${Math.round(y ?? 0)}, width=${Math.round(\n selection.width\n )}, height=${Math.round(selection.height)}`;\n};\n\nexport const decodePromptHtmlEntities = (value: string) =>\n value.replace(\n /&(#\\d+|#x[\\da-f]+|lt|gt|quot|apos|amp);/gi,\n (match, entity: string) => {\n const normalized = entity.toLowerCase();\n\n if (normalized === 'lt') return '<';\n if (normalized === 'gt') return '>';\n if (normalized === 'quot') return '\"';\n if (normalized === 'apos') return \"'\";\n if (normalized === 'amp') return '&';\n\n const codePoint = normalized.startsWith('#x')\n ? Number.parseInt(normalized.slice(2), 16)\n : Number.parseInt(normalized.slice(1), 10);\n\n return Number.isFinite(codePoint)\n ? String.fromCodePoint(codePoint)\n : match;\n }\n );\n\nexport const getPromptAnchorCandidates = (item: ReviewItem) => {\n const anchor = item.anchor;\n if (!anchor) return [];\n\n const seen = new Set<string>();\n return [anchor, ...(anchor.candidates ?? [])].filter((candidate) => {\n const key = `${candidate.strategy}:${candidate.selector}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\nexport const formatPromptSourceHint = (item: ReviewItem) => {\n const source = item.anchor?.source;\n if (!source) return '(none)';\n\n return [\n `Component: ${source.component ?? '(unknown)'}`,\n `File: ${source.file ?? '(unknown)'}`,\n `Line: ${source.line ?? '(unknown)'}`,\n `Column: ${source.column ?? '(unknown)'}`,\n `Section index: ${source.sectionIndex ?? '(unknown)'}`,\n `Section id: ${source.sectionId ?? '(none)'}`,\n ].join('\\n');\n};\n\nexport const buildReviewItemPrompt = (\n numberedItem: NumberedReviewItem,\n reviewPathPrefix: string\n) => {\n const { item } = numberedItem;\n const anchor = item.anchor;\n const candidates = getPromptAnchorCandidates(item);\n const candidateLines =\n candidates.length > 0\n ? candidates\n .map((candidate, index) => {\n const confidence =\n typeof candidate.confidence === 'number'\n ? `, confidence=${Math.round(candidate.confidence * 100)}%`\n : '';\n const fingerprint = candidate.textFingerprint\n ? `, text=\"${candidate.textFingerprint}\"`\n : '';\n return `${index + 1}. ${candidate.selector} (${candidate.strategy}${confidence}${fingerprint})`;\n })\n .join('\\n')\n : '(none)';\n\n return [\n 'Fix this df-web-review-kit QA issue.',\n '',\n `Page: ${getItemTarget(item, reviewPathPrefix)}`,\n `URL: ${item.originalUrl ?? item.pageUrl}`,\n `QA item: ${numberedItem.displayLabel}`,\n `Viewport: ${numberedItem.label} ${formatPromptViewport(item)}`,\n `Scroll: ${formatPromptPoint(item.scroll)}`,\n '',\n 'Target:',\n `Primary selector: ${anchor?.selector ?? '(missing)'}`,\n `Primary strategy: ${anchor?.strategy ?? '(missing)'}`,\n `Text fingerprint: ${anchor?.textFingerprint ?? '(none)'}`,\n 'Selector candidates:',\n candidateLines,\n '',\n 'Source hint:',\n formatPromptSourceHint(item),\n '',\n `Marker: ${formatPromptPoint(item.marker?.viewport)}`,\n `Marker relative: ${formatPromptPoint(item.marker?.relative)}`,\n `Selection: ${formatPromptSelection(item.selection?.viewport)}`,\n `Selection relative: ${formatPromptSelection(item.selection?.relative)}`,\n '',\n 'Element HTML snippet:',\n '```html',\n anchor?.htmlSnippet\n ? decodePromptHtmlEntities(anchor.htmlSnippet)\n : '(not available)',\n '```',\n '',\n 'Issue:',\n item.comment,\n '',\n 'Request:',\n 'Find the target element with the selector candidates above and apply the smallest UI/CSS/code change that fixes this QA issue. If the selector is missing because CSR or hydration has not finished, wait for the page to load and use the Source hint first. Preserve unrelated layout and behavior.'\n ].join('\\n');\n};\n\nexport const getPromptLengthLabel = (value: string) => {\n const length = value.length;\n if (length <= 2000) return `${length} chars / Discord 2,000 OK`;\n if (length <= 4000) return `${length} chars / Nitro 4,000 OK`;\n return `${length} chars / attach as file`;\n};\n\nexport const formatDate = (value: string) => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return date.toLocaleString(undefined, {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n};\n","import { Copy as CopyIcon } from 'lucide-react';\nimport { getPromptLengthLabel } from './prompt';\n\ninterface PromptModalProps {\n initialPromptText: string;\n copiedPromptKey: string | null;\n onClose: () => void;\n onCopyPrompt: (text: string, key: string) => void;\n}\n\nconst ABOUT_SECTIONS = [\n {\n title: 'What this is',\n body:\n 'df-web-review-kit is a project-embedded review shell. It mounts a /review page, opens real host pages in an iframe, and lets reviewers create QA notes, area markers, and DOM markers against the actual implementation instead of a separate screenshot tool.',\n },\n {\n title: 'How to setup',\n body:\n 'Install the package, mount the review route in the host project, and choose the storage adapters for that project. Local drafts work by default; shared remote QA and realtime presence depend on the host project configuration.',\n },\n {\n title: 'Figma token',\n body:\n 'Add a browser-safe Figma token in Settings only when the host page already supports the Figma overlay helper. The package stores it in localStorage as figma-token and does not own a server-side Figma integration.',\n },\n {\n title: 'User ID',\n body:\n 'Set your User ID in Settings before reviewing. It is used for presence, online user pills, and author context so teammates can tell who is looking at the same project or route.',\n },\n {\n title: 'Remote',\n body:\n 'Remote QA is optional and project-specific. If you need shared canonical items, Supabase, or realtime presence, ask the project owner or 담당 개발자 which remote adapter and browser-safe env values are connected. Never put service_role or operator secrets in the browser.',\n },\n];\n\nexport const PromptModal = ({\n initialPromptText,\n copiedPromptKey,\n onClose,\n onCopyPrompt,\n}: PromptModalProps) => {\n return (\n <div\n aria-label=\"Review help\"\n aria-modal=\"true\"\n className=\"df-review-prompt-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close help\"\n className=\"df-review-prompt-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-prompt-dialog\">\n <div className=\"df-review-prompt-header\">\n <div>\n <strong>Review shell help</strong>\n <span>About / Initial prompt</span>\n </div>\n <button aria-label=\"Close help\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n <div className=\"df-review-prompt-body\">\n <section\n className=\"df-review-prompt-about\"\n aria-labelledby=\"df-review-about-title\"\n >\n <div className=\"df-review-prompt-section-header\">\n <strong id=\"df-review-about-title\">About</strong>\n <span>Program overview and setup notes</span>\n </div>\n <div className=\"df-review-prompt-about-grid\">\n {ABOUT_SECTIONS.map((section) => (\n <article key={section.title}>\n <strong>{section.title}</strong>\n <p>{section.body}</p>\n </article>\n ))}\n </div>\n </section>\n <section\n className=\"df-review-prompt-block\"\n aria-labelledby=\"df-review-initial-prompt-title\"\n >\n <div className=\"df-review-prompt-block-header\">\n <div>\n <strong id=\"df-review-initial-prompt-title\">\n Initial Prompt\n </strong>\n <span>{getPromptLengthLabel(initialPromptText)}</span>\n </div>\n <button\n disabled={!initialPromptText}\n type=\"button\"\n onClick={() => onCopyPrompt(initialPromptText, 'initial')}\n >\n <CopyIcon aria-hidden=\"true\" />\n {copiedPromptKey === 'initial' ? 'Copied' : 'Copy'}\n </button>\n </div>\n <textarea\n readOnly\n aria-label=\"Initial Prompt content\"\n value={initialPromptText || 'Initial prompt is not configured.'}\n />\n </section>\n </div>\n </div>\n </div>\n );\n};\n","import type { ReviewShellTheme } from './types';\nimport {\n DEFAULT_REVIEW_THEME,\n FIGMA_TOKEN_STORAGE_KEY,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from './constants';\n\nexport const normalizeReviewTheme = (value: string | null): ReviewShellTheme =>\n value === 'light' || value === 'system' || value === 'dark'\n ? value\n : DEFAULT_REVIEW_THEME;\n\nexport const getStoredFigmaToken = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return window.localStorage.getItem(FIGMA_TOKEN_STORAGE_KEY) ?? '';\n } catch {\n return '';\n }\n};\n\nexport const writeStoredFigmaToken = (token: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (token) {\n window.localStorage.setItem(FIGMA_TOKEN_STORAGE_KEY, token);\n } else {\n window.localStorage.removeItem(FIGMA_TOKEN_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewUserId = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return window.localStorage.getItem(REVIEW_USER_ID_STORAGE_KEY) ?? '';\n } catch {\n return '';\n }\n};\n\nexport const writeStoredReviewUserId = (userId: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (userId) {\n window.localStorage.setItem(REVIEW_USER_ID_STORAGE_KEY, userId);\n } else {\n window.localStorage.removeItem(REVIEW_USER_ID_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewTheme = () => {\n if (typeof window === 'undefined') return DEFAULT_REVIEW_THEME;\n\n try {\n return normalizeReviewTheme(\n window.localStorage.getItem(REVIEW_THEME_STORAGE_KEY)\n );\n } catch {\n return DEFAULT_REVIEW_THEME;\n }\n};\n\nexport const writeStoredReviewTheme = (theme: ReviewShellTheme) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (theme === DEFAULT_REVIEW_THEME) {\n window.localStorage.removeItem(REVIEW_THEME_STORAGE_KEY);\n } else {\n window.localStorage.setItem(REVIEW_THEME_STORAGE_KEY, theme);\n }\n } catch {\n return;\n }\n};\n\nexport const getSystemReviewTheme = (): Exclude<ReviewShellTheme, 'system'> => {\n if (typeof window === 'undefined' || !window.matchMedia) return 'dark';\n return window.matchMedia('(prefers-color-scheme: light)').matches\n ? 'light'\n : 'dark';\n};\n","import {\n CircleHelp as CircleHelpIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n} from 'lucide-react';\nimport {\n DEFAULT_REVIEW_THEME,\n FIGMA_TOKEN_GUIDE_ID,\n FIGMA_TOKEN_STORAGE_KEY,\n REVIEW_THEME_OPTIONS,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from '../constants';\nimport { normalizeReviewTheme } from '../settings';\nimport type { ReviewShellTheme } from '../types';\n\ninterface ReviewSettingsModalProps {\n figmaTokenDraft: string;\n reviewUserIdDraft: string;\n reviewThemeDraft: ReviewShellTheme;\n figmaSettingsStatus: string;\n isFigmaTokenVisible: boolean;\n isFigmaTokenGuideOpen: boolean;\n onClose: () => void;\n onFigmaTokenDraftChange: (value: string) => void;\n onReviewUserIdDraftChange: (value: string) => void;\n onReviewThemeDraftChange: (value: ReviewShellTheme) => void;\n onClearStatus: () => void;\n onToggleFigmaTokenVisible: () => void;\n onToggleFigmaTokenGuide: () => void;\n onSave: (\n figmaToken: string,\n reviewUserId: string,\n reviewTheme: ReviewShellTheme\n ) => void;\n}\n\nexport const ReviewSettingsModal = ({\n figmaTokenDraft,\n reviewUserIdDraft,\n reviewThemeDraft,\n figmaSettingsStatus,\n isFigmaTokenVisible,\n isFigmaTokenGuideOpen,\n onClose,\n onFigmaTokenDraftChange,\n onReviewUserIdDraftChange,\n onReviewThemeDraftChange,\n onClearStatus,\n onToggleFigmaTokenVisible,\n onToggleFigmaTokenGuide,\n onSave,\n}: ReviewSettingsModalProps) => {\n return (\n <div\n aria-label=\"Review settings\"\n aria-modal=\"true\"\n className=\"df-review-settings-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close settings\"\n className=\"df-review-settings-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <form\n className=\"df-review-settings-dialog\"\n onSubmit={(event) => {\n event.preventDefault();\n onSave(figmaTokenDraft, reviewUserIdDraft, reviewThemeDraft);\n }}\n >\n <div className=\"df-review-settings-header\">\n <div className=\"df-review-settings-title\">\n <strong>Settings</strong>\n <span>\n {FIGMA_TOKEN_STORAGE_KEY} / {REVIEW_USER_ID_STORAGE_KEY} /{' '}\n {REVIEW_THEME_STORAGE_KEY}\n </span>\n </div>\n <div className=\"df-review-settings-header-actions\">\n <button aria-label=\"Close settings\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n </div>\n <div className=\"df-review-settings-body\">\n <div className=\"df-review-settings-row\">\n <span>Theme</span>\n <div className=\"df-review-settings-theme-options\">\n {REVIEW_THEME_OPTIONS.map((option) => (\n <button\n aria-pressed={reviewThemeDraft === option.value}\n className={`df-review-settings-theme-option${\n reviewThemeDraft === option.value ? ' is-active' : ''\n }`}\n key={option.value}\n type=\"button\"\n onClick={() => {\n onReviewThemeDraftChange(normalizeReviewTheme(option.value));\n onClearStatus();\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n <div className=\"df-review-settings-field\">\n <div className=\"df-review-settings-label-row\">\n <label htmlFor=\"df-review-figma-token\">Figma token</label>\n <button\n aria-controls={FIGMA_TOKEN_GUIDE_ID}\n aria-expanded={isFigmaTokenGuideOpen}\n aria-label=\"Show Figma token guide\"\n className={`df-review-settings-help-button${\n isFigmaTokenGuideOpen ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={onToggleFigmaTokenGuide}\n >\n <CircleHelpIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-settings-token-input\">\n <input\n id=\"df-review-figma-token\"\n aria-label=\"Figma token\"\n aria-describedby={\n isFigmaTokenGuideOpen ? FIGMA_TOKEN_GUIDE_ID : undefined\n }\n autoCapitalize=\"off\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n className={isFigmaTokenVisible ? undefined : 'is-token-masked'}\n data-1p-ignore=\"true\"\n data-lpignore=\"true\"\n inputMode=\"text\"\n name=\"df-review-figma-access-key\"\n spellCheck={false}\n type=\"text\"\n value={figmaTokenDraft}\n onChange={(event) => {\n onFigmaTokenDraftChange(event.target.value);\n onClearStatus();\n }}\n />\n <button\n aria-label={\n isFigmaTokenVisible\n ? 'Hide Figma token'\n : 'Show Figma token'\n }\n className=\"df-review-settings-token-toggle\"\n type=\"button\"\n onClick={onToggleFigmaTokenVisible}\n >\n {isFigmaTokenVisible ? (\n <EyeOffIcon aria-hidden=\"true\" />\n ) : (\n <EyeIcon aria-hidden=\"true\" />\n )}\n </button>\n </div>\n {isFigmaTokenGuideOpen && (\n <div\n className=\"df-review-settings-guide\"\n id={FIGMA_TOKEN_GUIDE_ID}\n >\n <ol>\n <li>Figma file browser에서 account menu를 열고 Settings로 이동</li>\n <li>Security 탭의 Personal access tokens로 이동</li>\n <li>Generate new token에서 이름과 scope를 정한 뒤 생성</li>\n <li>생성된 token을 복사해서 여기에 붙여넣기</li>\n </ol>\n </div>\n )}\n </div>\n <label className=\"df-review-settings-field\">\n <span>User ID</span>\n <div className=\"df-review-settings-text-input\">\n <input\n aria-label=\"Review user ID\"\n autoComplete=\"off\"\n spellCheck={false}\n type=\"text\"\n value={reviewUserIdDraft}\n onChange={(event) => {\n onReviewUserIdDraftChange(event.target.value);\n onClearStatus();\n }}\n />\n </div>\n </label>\n\n {figmaSettingsStatus && (\n <p className=\"df-review-settings-status\">{figmaSettingsStatus}</p>\n )}\n <div className=\"df-review-settings-actions\">\n <button\n type=\"button\"\n onClick={() => onSave('', '', DEFAULT_REVIEW_THEME)}\n >\n Clear\n </button>\n <span />\n <button type=\"button\" onClick={onClose}>\n Cancel\n </button>\n <button type=\"submit\">Save</button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n","import type {\n ReviewPresenceUser,\n ReviewShellPage,\n} from '../types';\n\nexport type SitemapQaCount = {\n local: number;\n remote: number;\n};\n\ntype SitemapTreeNode = {\n href: string;\n label: string;\n isPage: boolean;\n children: Map<string, SitemapTreeNode>;\n};\n\nexport type SitemapTreeRow = {\n href: string;\n label: string;\n prefix: string;\n isPage: boolean;\n isActive: boolean;\n qaCount: SitemapQaCount;\n users: ReviewPresenceUser[];\n};\n\nconst EMPTY_SITEMAP_QA_COUNT: SitemapQaCount = {\n local: 0,\n remote: 0,\n};\n\nconst normalizeSitemapHref = (href: string) => {\n const [path = '/'] = href.split(/[?#]/);\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n return normalizedPath || '/';\n};\n\nconst getSitemapSegments = (href: string) =>\n normalizeSitemapHref(href)\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean);\n\nconst createSitemapNode = (\n href: string,\n label: string,\n isPage = false\n): SitemapTreeNode => ({\n href,\n label,\n isPage,\n children: new Map(),\n});\n\nconst mergeSitemapUsers = (users: ReviewPresenceUser[]) => {\n const userByKey = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const key = user.sessionId || user.userId;\n const currentUser = userByKey.get(key);\n\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userByKey.set(key, user);\n }\n });\n\n return Array.from(userByKey.values());\n};\n\nconst addSitemapQaCounts = (\n first: SitemapQaCount,\n second: SitemapQaCount\n): SitemapQaCount => ({\n local: first.local + second.local,\n remote: first.remote + second.remote,\n});\n\nexport const createSitemapRows = (\n pages: ReviewShellPage[],\n activeRoute: string,\n pageQaCounts: ReadonlyMap<string, SitemapQaCount>,\n pagePresenceUsers: ReadonlyMap<string, ReviewPresenceUser[]>,\n getPageTarget: (href: string) => string\n) => {\n const root = createSitemapNode('/', '/', false);\n\n pages.forEach((page) => {\n const pageHref = page.href.startsWith('/') ? page.href : `/${page.href}`;\n const pathHref = normalizeSitemapHref(pageHref);\n const segments = getSitemapSegments(pathHref);\n\n if (segments.length === 0) {\n root.href = pageHref;\n root.isPage = true;\n return;\n }\n\n let parent = root;\n\n segments.forEach((segment, segmentIndex) => {\n const isLastSegment = segmentIndex === segments.length - 1;\n const segmentPath = `/${segments.slice(0, segmentIndex + 1).join('/')}`;\n const segmentHref = isLastSegment ? pageHref : `${segmentPath}/`;\n const segmentLabel = `${segment}${\n !isLastSegment || pathHref.endsWith('/') ? '/' : ''\n }`;\n const existingNode = parent.children.get(segment);\n const node =\n existingNode ?? createSitemapNode(segmentHref, segmentLabel, false);\n\n node.href = isLastSegment ? pageHref : node.href;\n node.label = isLastSegment ? segmentLabel : node.label;\n node.isPage = node.isPage || isLastSegment;\n parent.children.set(segment, node);\n parent = node;\n });\n });\n\n const getDirectCount = (node: SitemapTreeNode) => {\n if (!node.isPage) return EMPTY_SITEMAP_QA_COUNT;\n\n return pageQaCounts.get(getPageTarget(node.href)) ?? EMPTY_SITEMAP_QA_COUNT;\n };\n\n const getDirectUsers = (node: SitemapTreeNode) => {\n if (!node.isPage) return [];\n\n return pagePresenceUsers.get(getPageTarget(node.href)) ?? [];\n };\n\n const rows: SitemapTreeRow[] = [];\n\n const appendNodeRows = (\n node: SitemapTreeNode,\n depth: number,\n ancestorLastList: boolean[],\n isLastNode: boolean\n ): { count: SitemapQaCount; users: ReviewPresenceUser[] } => {\n const children = Array.from(node.children.values());\n const directCount = getDirectCount(node);\n const directUsers = getDirectUsers(node);\n let rowIndex: number | null = null;\n\n if (node.isPage || depth > 0) {\n const prefix =\n depth === 0\n ? ''\n : `${ancestorLastList.map((isLast) => (isLast ? ' ' : '│ ')).join('')}${\n isLastNode ? '└─ ' : '├─ '\n }`;\n const pageTarget = node.isPage ? getPageTarget(node.href) : null;\n\n rowIndex = rows.length;\n rows.push({\n href: node.href,\n label: node.label,\n prefix,\n isPage: node.isPage,\n isActive: pageTarget === activeRoute,\n qaCount: directCount,\n users: directUsers,\n });\n }\n\n const childAggregate = children.reduce(\n (aggregate, child, childIndex) => {\n const childResult = appendNodeRows(\n child,\n depth + 1,\n depth === 0 ? [] : [...ancestorLastList, isLastNode],\n childIndex === children.length - 1\n );\n\n return {\n count: addSitemapQaCounts(aggregate.count, childResult.count),\n users: mergeSitemapUsers([...aggregate.users, ...childResult.users]),\n };\n },\n { count: EMPTY_SITEMAP_QA_COUNT, users: [] as ReviewPresenceUser[] }\n );\n\n if (rowIndex !== null && !node.isPage) {\n rows[rowIndex] = {\n ...rows[rowIndex],\n qaCount: childAggregate.count,\n users: childAggregate.users,\n };\n }\n\n return {\n count: node.isPage\n ? addSitemapQaCounts(directCount, childAggregate.count)\n : childAggregate.count,\n users: mergeSitemapUsers([...directUsers, ...childAggregate.users]),\n };\n };\n\n if (root.isPage) {\n const directCount = getDirectCount(root);\n const directUsers = getDirectUsers(root);\n\n rows.push({\n href: root.href,\n label: root.label,\n prefix: '',\n isPage: true,\n isActive: getPageTarget(root.href) === activeRoute,\n qaCount: directCount,\n users: directUsers,\n });\n }\n\n Array.from(root.children.values()).forEach((node, index, siblings) => {\n appendNodeRows(node, 1, [], index === siblings.length - 1);\n });\n\n return rows;\n};\n","import type { CSSProperties } from 'react';\nimport type {\n ReviewPresenceUser,\n ReviewShellPage,\n} from '../types';\nimport {\n createSitemapRows,\n type SitemapQaCount,\n} from './tree';\n\ninterface SitemapModalProps {\n pages: ReviewShellPage[];\n activeRoute: string;\n pageQaCounts: ReadonlyMap<string, SitemapQaCount>;\n pagePresenceUsers: ReadonlyMap<string, ReviewPresenceUser[]>;\n getPageTarget: (href: string) => string;\n onClose: () => void;\n onSelectPage: (href: string) => void;\n}\n\nexport const SitemapModal = ({\n pages,\n activeRoute,\n pageQaCounts,\n pagePresenceUsers,\n getPageTarget,\n onClose,\n onSelectPage,\n}: SitemapModalProps) => {\n const sitemapRows = createSitemapRows(\n pages,\n activeRoute,\n pageQaCounts,\n pagePresenceUsers,\n getPageTarget\n );\n\n return (\n <div\n aria-label=\"Sitemap\"\n aria-modal=\"true\"\n className=\"df-review-sitemap-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close sitemap\"\n className=\"df-review-sitemap-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-sitemap-dialog\">\n <div className=\"df-review-sitemap-header\">\n <div>\n <strong>Sitemap</strong>\n <span>{pages.length} pages</span>\n </div>\n <button aria-label=\"Close sitemap\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n <div className=\"df-review-sitemap-list\">\n <div className=\"df-review-sitemap-table-head\" aria-hidden=\"true\">\n <span>Page</span>\n <span>Local</span>\n <span>Remote</span>\n <span>Online</span>\n </div>\n {sitemapRows.map((row) => {\n const rowClassName = [\n 'df-review-sitemap-row',\n row.isPage ? 'is-page' : 'is-folder',\n row.isActive ? 'is-active' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const rowContent = (\n <>\n <span className=\"df-review-sitemap-path\">\n <span className=\"df-review-sitemap-tree-prefix\">\n {row.prefix}\n </span>\n <span>{row.label}</span>\n </span>\n <span className=\"df-review-sitemap-cell is-local\">\n {row.qaCount.local}\n </span>\n <span className=\"df-review-sitemap-cell is-remote\">\n {row.qaCount.remote}\n </span>\n <span className=\"df-review-sitemap-cell is-online\">\n {row.users.length > 0 ? (\n <span className=\"df-review-sitemap-users\">\n {row.users.map((user) => (\n <span\n key={user.sessionId}\n className=\"df-review-sitemap-user\"\n style={{\n '--df-review-presence-color': user.color,\n } as CSSProperties}\n >\n {user.userId}\n </span>\n ))}\n </span>\n ) : (\n <span className=\"df-review-sitemap-online-empty\">0</span>\n )}\n </span>\n </>\n );\n\n if (!row.isPage) {\n return (\n <div\n key={row.href}\n aria-label={`${row.href} group / local ${row.qaCount.local} QA / remote ${row.qaCount.remote} QA / ${row.users.length} online`}\n className={rowClassName}\n role=\"row\"\n >\n {rowContent}\n </div>\n );\n }\n\n return (\n <button\n key={row.href}\n aria-label={`${row.href} / local ${row.qaCount.local} QA / remote ${row.qaCount.remote} QA / ${row.users.length} online`}\n className={rowClassName}\n type=\"button\"\n onClick={() => onSelectPage(row.href)}\n >\n {rowContent}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n","import { useEffect, useState } from 'react';\nimport type { ReviewItem } from '../../types';\n\ninterface QaItemEditModalProps {\n item: ReviewItem;\n onClose: () => void;\n onSave: (item: ReviewItem, comment: string) => Promise<void>;\n}\n\nexport const QaItemEditModal = ({\n item,\n onClose,\n onSave,\n}: QaItemEditModalProps) => {\n const [commentDraft, setCommentDraft] = useState(item.comment);\n const [error, setError] = useState('');\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setCommentDraft(item.comment);\n setError('');\n setIsSaving(false);\n }, [item.id, item.comment]);\n\n const saveComment = async () => {\n const nextComment = commentDraft.trim();\n if (!nextComment) {\n setError('Comment is required.');\n return;\n }\n\n setError('');\n setIsSaving(true);\n try {\n await onSave(item, nextComment);\n } catch (error) {\n setError(\n error instanceof Error ? error.message : 'Failed to update QA comment.'\n );\n setIsSaving(false);\n }\n };\n\n return (\n <div\n aria-modal=\"true\"\n className=\"df-review-edit-modal\"\n role=\"dialog\"\n aria-labelledby=\"df-review-edit-title\"\n >\n <button\n aria-label=\"Close edit dialog\"\n className=\"df-review-settings-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <form\n className=\"df-review-edit-dialog\"\n onSubmit={(event) => {\n event.preventDefault();\n void saveComment();\n }}\n >\n <header className=\"df-review-settings-header\">\n <div className=\"df-review-settings-title\">\n <strong id=\"df-review-edit-title\">Edit QA comment</strong>\n <span>Update the text shown on this QA item.</span>\n </div>\n <div className=\"df-review-settings-header-actions\">\n <button\n aria-label=\"Close edit dialog\"\n type=\"button\"\n onClick={onClose}\n >\n x\n </button>\n </div>\n </header>\n <div className=\"df-review-settings-body df-review-edit-body\">\n <label className=\"df-review-settings-field\">\n <span>Comment</span>\n <div className=\"df-review-settings-text-input df-review-edit-textarea\">\n <textarea\n autoFocus\n value={commentDraft}\n onChange={(event) => {\n setCommentDraft(event.target.value);\n if (error) setError('');\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onClose();\n }\n if (\n (event.metaKey || event.ctrlKey) &&\n event.key === 'Enter'\n ) {\n event.preventDefault();\n void saveComment();\n }\n }}\n />\n </div>\n </label>\n {error && <p className=\"df-review-edit-error\">{error}</p>}\n <footer className=\"df-review-settings-actions df-review-edit-actions\">\n <span />\n <button disabled={isSaving} type=\"button\" onClick={onClose}>\n Cancel\n </button>\n <button disabled={isSaving} type=\"submit\">\n {isSaving ? 'Saving…' : 'Save'}\n </button>\n </footer>\n </div>\n </form>\n </div>\n );\n};\n","import {\n ExternalLink as ExternalLinkIcon,\n Upload as UploadIcon,\n} from 'lucide-react';\nimport type { NumberedReviewItem, ReviewItem } from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\n\ninterface QaItemRemoteActionsProps {\n isRemoteSource: boolean;\n isSubmitted: boolean;\n isSubmitting: boolean;\n item: ReviewItem;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n}\n\nexport const QaItemRemoteActions = ({\n isRemoteSource,\n isSubmitted,\n isSubmitting,\n item,\n numberedItem,\n remoteAdapterEntry,\n onSubmitItem,\n}: QaItemRemoteActionsProps) => {\n const canSubmitToRemote = !isRemoteSource && Boolean(remoteAdapterEntry);\n const canOpenRemoteIssue = !isRemoteSource && Boolean(item.externalIssueUrl);\n const hasRemoteActions = canSubmitToRemote || canOpenRemoteIssue;\n\n if (!hasRemoteActions) return null;\n\n return (\n <div\n className=\"df-review-item-remote-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canSubmitToRemote && remoteAdapterEntry && (\n <button\n aria-label=\"Submit to remote\"\n className=\"df-review-item-action-button df-review-item-submit-button\"\n disabled={isSubmitted || isSubmitting}\n type=\"button\"\n onClick={() => void onSubmitItem(numberedItem)}\n >\n <UploadIcon aria-hidden=\"true\" />\n <span>\n {isSubmitted\n ? 'Submitted'\n : isSubmitting\n ? 'Submitting'\n : 'Submit'}\n </span>\n </button>\n )}\n {canOpenRemoteIssue && (\n <a\n aria-label=\"Open remote issue\"\n className=\"df-review-item-action-button\"\n href={item.externalIssueUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n )}\n </div>\n );\n};\n","import { normalizeReviewItemStatus } from '../../status';\nimport type { ReviewItem, ReviewItemStatus } from '../../types';\nimport type { ReviewShellStatusOption } from '../types';\n\ninterface QaItemStatusActionsProps {\n canUpdateStatus: boolean;\n item: ReviewItem;\n statusOptions: readonly ReviewShellStatusOption[];\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n}\n\nconst getStatusOption = (\n status: ReviewItemStatus,\n statusOptions: readonly ReviewShellStatusOption[]\n) => {\n const normalizedStatus = normalizeReviewItemStatus(status);\n return (\n statusOptions.find((statusOption) => statusOption.value === status) ??\n statusOptions.find(\n (statusOption) => statusOption.value === normalizedStatus\n ) ??\n statusOptions[0]\n );\n};\n\nexport const QaItemStatusActions = ({\n canUpdateStatus,\n item,\n statusOptions,\n onChangeItemStatus,\n}: QaItemStatusActionsProps) => {\n const currentStatusOption = getStatusOption(item.status, statusOptions);\n if (!currentStatusOption) return null;\n const statusClassName = `is-status-${normalizeReviewItemStatus(\n currentStatusOption.value\n )}`;\n\n return (\n <div\n className=\"df-review-item-status-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canUpdateStatus ? (\n <select\n aria-label=\"QA status\"\n className={`df-review-item-status-select ${statusClassName}`}\n value={currentStatusOption.value}\n onChange={(event) =>\n void onChangeItemStatus(\n item,\n event.currentTarget.value as ReviewItemStatus\n )\n }\n >\n {statusOptions.map((statusOption) => (\n <option key={statusOption.value} value={statusOption.value}>\n {statusOption.label}\n </option>\n ))}\n </select>\n ) : (\n <span className={`df-review-item-status-badge ${statusClassName}`}>\n {currentStatusOption.label}\n </span>\n )}\n </div>\n );\n};\n","import type { ReviewItem } from '../types';\n\nexport const isAnchorRestorableReviewItem = (item: ReviewItem) =>\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && item.selection));\n\nexport const queryReviewItemAnchorElement = (\n targetDocument: Document,\n item: ReviewItem\n) => {\n const anchor = item.anchor;\n if (!anchor || !isAnchorRestorableReviewItem(item)) return undefined;\n\n const expectedRect = getReviewItemExpectedDocumentRect(item);\n const candidates = [anchor, ...(anchor.candidates ?? [])].filter(\n (candidate) => Boolean(candidate.selector)\n );\n const matches: Array<{\n element: Element;\n score: number;\n }> = [];\n\n candidates.forEach((candidate, index) => {\n try {\n targetDocument.querySelectorAll(candidate.selector).forEach((element) => {\n if (!isScrollableReviewAnchorElement(element)) return;\n\n matches.push({\n element,\n score: getReviewAnchorMatchScore(\n element,\n expectedRect,\n candidate.textFingerprint ?? anchor.textFingerprint,\n index\n )\n });\n });\n } catch {\n return;\n }\n });\n\n return matches.sort((a, b) => a.score - b.score)[0]?.element;\n};\n\nexport const getReviewItemRestoreScrollPosition = (\n targetWindow: Window,\n targetDocument: Document,\n item: ReviewItem,\n anchorElement?: Element\n) => {\n if (anchorElement) {\n const rect = anchorElement.getBoundingClientRect();\n return clampDocumentScrollPosition(targetDocument, {\n left:\n targetWindow.scrollX +\n rect.left -\n Math.max(0, (targetWindow.innerWidth - rect.width) / 2),\n top:\n targetWindow.scrollY +\n rect.top -\n Math.max(0, (targetWindow.innerHeight - rect.height) / 2)\n });\n }\n\n return clampDocumentScrollPosition(targetDocument, {\n left: item.scroll?.x ?? 0,\n top: item.scroll?.y ?? 0\n });\n};\n\nexport const setDocumentScrollInstantly = (\n targetWindow: Window,\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = position.left;\n scrollElement.scrollTop = position.top;\n return;\n }\n\n targetWindow.scrollTo(position.left, position.top);\n};\n\nexport const getReviewItemExpectedDocumentRect = (item: ReviewItem) => {\n const scroll = item.scroll ?? { x: 0, y: 0 };\n const selection = item.selection?.viewport;\n if (\n selection &&\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n ) {\n return {\n left: scroll.x + selection.x,\n top: scroll.y + selection.y,\n width: selection.width,\n height: selection.height\n };\n }\n\n const marker = item.marker?.viewport;\n if (marker && typeof marker.x === 'number' && typeof marker.y === 'number') {\n return {\n left: scroll.x + marker.x,\n top: scroll.y + marker.y,\n width: 1,\n height: 1\n };\n }\n\n return undefined;\n};\n\nexport const getReviewAnchorMatchScore = (\n element: Element,\n expectedRect:\n | {\n left: number;\n top: number;\n width: number;\n height: number;\n }\n | undefined,\n textFingerprint: string | undefined,\n candidateIndex: number\n) => {\n const rect = getElementDocumentRect(element);\n let score = candidateIndex * 25;\n\n if (expectedRect) {\n score += Math.abs(rect.top - expectedRect.top);\n score += Math.abs(rect.left - expectedRect.left) * 0.25;\n score += Math.abs(rect.width - expectedRect.width) * 0.1;\n score += Math.abs(rect.height - expectedRect.height) * 0.1;\n }\n\n if (textFingerprint) {\n score +=\n (1 - getReviewTextFingerprintScore(textFingerprint, element)) * 100;\n }\n\n return score;\n};\n\nexport const getElementDocumentRect = (element: Element) => {\n const rect = element.getBoundingClientRect();\n const view = element.ownerDocument.defaultView;\n\n return {\n left: rect.left + (view?.scrollX ?? 0),\n top: rect.top + (view?.scrollY ?? 0),\n width: rect.width,\n height: rect.height\n };\n};\n\nconst clampDocumentScrollPosition = (\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement;\n const view = targetDocument.defaultView;\n const maxLeft = Math.max(\n 0,\n (scrollElement?.scrollWidth ?? 0) - (view?.innerWidth ?? 0)\n );\n const maxTop = Math.max(\n 0,\n (scrollElement?.scrollHeight ?? 0) - (view?.innerHeight ?? 0)\n );\n\n return {\n left: Math.min(Math.max(0, Math.round(position.left)), maxLeft),\n top: Math.min(Math.max(0, Math.round(position.top)), maxTop)\n };\n};\n\nexport const getReviewTextFingerprintScore = (expected: string, element: Element) => {\n const actual = element.textContent?.replace(/\\s+/g, ' ').trim();\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getReviewFingerprintTokens(expected);\n const actualTokens = new Set(getReviewFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return Math.min(Math.max(matches.length / expectedTokens.length, 0.25), 0.76);\n};\n\nexport const getReviewFingerprintTokens = (value: string) =>\n value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n\nexport const isScrollableReviewAnchorElement = (element: Element) => {\n const id = element.id.trim().toLowerCase();\n if (\n element === element.ownerDocument.body ||\n element === element.ownerDocument.documentElement ||\n ['app', 'main', 'page', 'root', '__next', '__nuxt'].includes(id)\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n const viewportHeight = element.ownerDocument.documentElement.clientHeight;\n const scrollHeight = element.ownerDocument.documentElement.scrollHeight;\n return !(\n scrollHeight > viewportHeight * 1.5 && rect.height > viewportHeight * 3\n );\n};\n","import {\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n Scan as ScanIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n StickyNote as StickyNoteIcon,\n} from 'lucide-react';\nimport type { ReviewItem, ReviewItemScope } from '../../types';\nimport { isAnchorRestorableReviewItem } from '../anchor.restore';\n\nexport const ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nexport const getReviewItemMode = (item: ReviewItem) =>\n isAnchorRestorableReviewItem(item) ? 'dom' : item.kind;\n\nexport const ReviewItemModeIcon = ({\n mode,\n}: {\n mode: ReturnType<typeof getReviewItemMode>;\n}) => {\n if (mode === 'area') return <ScanIcon aria-hidden=\"true\" />;\n if (mode === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <StickyNoteIcon aria-hidden=\"true\" />;\n};\n","import type { DomSourceHint } from '../types';\n\nconst SOURCE_SELECTOR = [\n '[data-wrk-source-file]',\n '[data-wrk-source-component]',\n '[data-wrk-source-line]',\n '[data-wrk-source-column]',\n '[data-file]',\n '[data-component]',\n '[data-section-index]',\n '[data-section-id]',\n].join(', ');\n\nexport const getSourceHintElement = (target: EventTarget | null) => {\n return getEventElement(target)?.closest(SOURCE_SELECTOR) ?? null;\n};\n\nexport const getElementSourceHint = (\n target: EventTarget | null\n): DomSourceHint | undefined => {\n const sourceElement = getSourceHintElement(target);\n if (!sourceElement) return undefined;\n\n const source: DomSourceHint = {\n component: getSourceAttribute(\n sourceElement,\n 'data-wrk-source-component',\n 'data-component'\n ),\n file: getSourceAttribute(sourceElement, 'data-wrk-source-file', 'data-file'),\n line: getSourceAttribute(sourceElement, 'data-wrk-source-line'),\n column: getSourceAttribute(sourceElement, 'data-wrk-source-column'),\n sectionId: getSourceAttribute(sourceElement, 'data-section-id'),\n sectionIndex: getSourceAttribute(sourceElement, 'data-section-index'),\n };\n\n return Object.values(source).some(Boolean) ? source : undefined;\n};\n\nexport const getSourceOpenUrl = (\n source: DomSourceHint | undefined,\n sourceRoot?: string\n) => {\n const file = source?.file?.trim();\n if (!file) return null;\n\n const sourcePath = getSourcePath(file, sourceRoot);\n if (!sourcePath) return null;\n\n const line = getSourcePosition(source?.line);\n const column = getSourcePosition(source?.column);\n const encodedPath = encodeURI(sourcePath).replace(/[#?]/g, (match) =>\n match === '#' ? '%23' : '%3F'\n );\n\n return `vscode://file/${encodedPath}:${line}:${column}`;\n};\n\nexport const openSourceInEditor = (\n source: DomSourceHint | undefined,\n sourceRoot?: string\n) => {\n const url = getSourceOpenUrl(source, sourceRoot);\n if (!url) return false;\n\n window.open(url, '_blank', 'noreferrer');\n return true;\n};\n\nfunction getSourceAttribute(element: Element, ...names: string[]) {\n for (const name of names) {\n const value = element.getAttribute(name)?.trim();\n if (value) return value;\n }\n\n return undefined;\n}\n\nfunction getEventElement(target: EventTarget | null): Element | null {\n if (!target || typeof target !== 'object') return null;\n\n const node = target as {\n closest?: (selector: string) => Element | null;\n nodeType?: number;\n parentElement?: Element | null;\n };\n\n if (node.nodeType === 1 && typeof node.closest === 'function') {\n return node as Element;\n }\n\n if (node.parentElement && typeof node.parentElement.closest === 'function') {\n return node.parentElement;\n }\n\n return null;\n}\n\nfunction getSourcePath(file: string, sourceRoot?: string) {\n const normalizedFile = file.replace(/\\\\/g, '/');\n if (normalizedFile.startsWith('/') || /^[a-zA-Z]:\\//.test(normalizedFile)) {\n return normalizedFile;\n }\n\n const normalizedRoot = sourceRoot\n ?.trim()\n .replace(/\\\\/g, '/')\n .replace(/\\/+$/, '');\n if (!normalizedRoot) return null;\n\n return `${normalizedRoot}/${normalizedFile.replace(/^\\/+/, '')}`;\n}\n\nfunction getSourcePosition(value: string | undefined) {\n const position = Number(value);\n return Number.isInteger(position) && position > 0 ? position : 1;\n}\n","import {\n Copy as CopyIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n FileCode2 as FileCode2Icon,\n Pencil as PencilIcon,\n X as XIcon,\n} from 'lucide-react';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { getItemTitle } from '../prompt/prompt';\nimport { QaItemRemoteActions } from './item.remote.actions';\nimport { QaItemStatusActions } from './item.status.actions';\nimport {\n getReviewItemMode,\n ReviewItemModeIcon,\n ReviewScopeIcon,\n} from '../review/item.icons';\nimport { getSourceOpenUrl } from '../source.open';\nimport type { ReviewShellViewportKind } from '../types';\n\ninterface QaItemCardProps {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n currentPresetScope: ReviewShellViewportKind;\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n isOverlayVisible: boolean;\n isRemoteSource: boolean;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n copiedPromptKey: string | null;\n selectedItemId: string | null;\n sourceRoot?: string;\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onRemoveItem: (item: ReviewItem) => Promise<void>;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onEditItem: (item: ReviewItem) => void;\n onRestoreReviewItem: (item: ReviewItem) => void;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n onToggleItemOverlayVisibility: (itemId: string) => void;\n}\n\nconst formatItemCardDate = (value: string) => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return new Intl.DateTimeFormat('en', {\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n month: 'short',\n }).format(date);\n};\n\nexport const QaItemCard = ({\n activeAdapterEntry,\n currentPresetScope,\n getItemPresetScope,\n isOverlayVisible,\n isRemoteSource,\n numberedItem,\n remoteAdapterEntry,\n copiedPromptKey,\n selectedItemId,\n sourceRoot,\n onChangeItemStatus,\n onClearSelectedItem,\n onRemoveItem,\n onCopyItemPrompt,\n onEditItem,\n onRestoreReviewItem,\n onSubmitItem,\n onToggleItemOverlayVisibility,\n}: QaItemCardProps) => {\n const { item } = numberedItem;\n const itemMode = getReviewItemMode(item);\n const isSubmitted = item.submitStatus === 'submitted';\n const isSubmitting = item.submitStatus === 'submitting';\n const canRemoveItem =\n activeAdapterEntry.canRemove &&\n !isSubmitting &&\n (isRemoteSource || !isSubmitted);\n const itemComment = item.comment.trim() || getItemTitle(item);\n const itemAuthor = item.createdBy?.trim();\n const promptCopyKey = `qa:${item.id}`;\n const isPromptCopied = copiedPromptKey === promptCopyKey;\n const statusOptions = activeAdapterEntry.statusOptions;\n const isActive = item.id === selectedItemId;\n const canUpdateStatus =\n Boolean(activeAdapterEntry.updateStatus) &&\n statusOptions.length > 0 &&\n !isSubmitting;\n const canEditItem = activeAdapterEntry.canUpdate && !isSubmitting;\n const itemMeta = [formatItemCardDate(item.createdAt), itemAuthor]\n .filter(Boolean)\n .join(' | ');\n const sourceOpenUrl = getSourceOpenUrl(item.anchor?.source, sourceRoot);\n\n return (\n <article\n className={`df-review-item-card${isActive ? ' is-active' : ''}${\n getItemPresetScope(item) !== currentPresetScope ? ' is-dim' : ''\n }${isOverlayVisible ? '' : ' is-overlay-hidden'}`}\n onClick={() => {\n if (isActive) {\n onClearSelectedItem();\n return;\n }\n\n onRestoreReviewItem(item);\n }}\n >\n <div className=\"df-review-item-header\">\n <div className=\"df-review-item-main\">\n <span className=\"df-review-item-badges\">\n <span className=\"df-review-item-id\">\n {numberedItem.displayLabel}\n </span>\n <span\n className={`df-review-item-scope is-scope-${numberedItem.scope}`}\n >\n <ReviewScopeIcon scope={numberedItem.scope} />\n {numberedItem.label}\n </span>\n <span className={`df-review-item-mode is-mode-${itemMode}`}>\n <ReviewItemModeIcon mode={itemMode} />\n {itemMode}\n </span>\n </span>\n <strong className=\"df-review-item-comment\">{itemComment}</strong>\n <small className=\"df-review-item-meta\">{itemMeta}</small>\n {item.submitError && (\n <small className=\"df-review-item-error\">{item.submitError}</small>\n )}\n </div>\n <div\n className=\"df-review-item-header-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n <button\n aria-label={isOverlayVisible ? 'Hide QA overlay' : 'Show QA overlay'}\n className={`df-review-item-visibility${\n isOverlayVisible ? ' is-visible' : ' is-hidden'\n }`}\n type=\"button\"\n onClick={() => onToggleItemOverlayVisibility(item.id)}\n >\n {isOverlayVisible ? (\n <EyeIcon aria-hidden=\"true\" />\n ) : (\n <EyeOffIcon aria-hidden=\"true\" />\n )}\n </button>\n {sourceOpenUrl && (\n <a\n aria-label=\"Open source in VS Code\"\n className=\"df-review-item-source-open\"\n href={sourceOpenUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n title=\"Open source in VS Code\"\n >\n <FileCode2Icon aria-hidden=\"true\" />\n </a>\n )}\n <button\n aria-label={isPromptCopied ? 'Copied QA prompt' : 'Copy QA prompt'}\n className={`df-review-item-prompt-copy${\n isPromptCopied ? ' is-copied' : ''\n }`}\n title={isPromptCopied ? 'Copied QA prompt' : 'Copy QA prompt'}\n type=\"button\"\n onClick={() => onCopyItemPrompt(numberedItem)}\n >\n <CopyIcon aria-hidden=\"true\" />\n </button>\n {canEditItem && (\n <button\n aria-label=\"Edit QA comment\"\n className=\"df-review-item-edit\"\n title=\"Edit QA comment\"\n type=\"button\"\n onClick={() => onEditItem(item)}\n >\n <PencilIcon aria-hidden=\"true\" />\n </button>\n )}\n {canRemoveItem && (\n <button\n aria-label=\"Delete QA\"\n className=\"df-review-item-delete\"\n type=\"button\"\n onClick={() => void onRemoveItem(item)}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n <div className=\"df-review-item-actions\">\n <QaItemStatusActions\n canUpdateStatus={canUpdateStatus}\n item={item}\n statusOptions={statusOptions}\n onChangeItemStatus={onChangeItemStatus}\n />\n <QaItemRemoteActions\n isRemoteSource={isRemoteSource}\n isSubmitted={isSubmitted}\n isSubmitting={isSubmitting}\n item={item}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n onSubmitItem={onSubmitItem}\n />\n </div>\n </article>\n );\n};\n","import type { CSSProperties } from 'react';\nimport { Users as UsersIcon } from 'lucide-react';\nimport type { ReviewPresenceUser } from '../types';\n\ninterface PresenceRowProps {\n presenceSessionId: string;\n users: ReviewPresenceUser[];\n}\n\nexport const PresenceRow = ({\n presenceSessionId,\n users,\n}: PresenceRowProps) => {\n if (users.length === 0) return null;\n\n return (\n <div aria-label=\"Review presence\" className=\"df-review-presence-row\">\n <span className=\"df-review-presence-label\">\n <UsersIcon aria-hidden=\"true\" />\n online {users.length}\n </span>\n <div className=\"df-review-presence-list\">\n {users.map((user) => (\n <span\n key={user.sessionId}\n className={`df-review-presence-chip${\n user.sessionId === presenceSessionId ? ' is-self' : ''\n }`}\n style={\n {\n '--df-review-presence-color': user.color,\n } as CSSProperties\n }\n >\n <span className=\"df-review-presence-dot\" aria-hidden=\"true\" />\n <span className=\"df-review-presence-name\">{user.userId}</span>\n </span>\n ))}\n </div>\n </div>\n );\n};\n","import {\n ListFilter as ListFilterIcon,\n RefreshCw as RefreshCwIcon,\n} from 'lucide-react';\nimport type { ReviewSource } from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { REVIEW_QA_FILTERS } from '../constants';\nimport { PresenceRow } from '../presence/row';\nimport { ReviewScopeIcon } from '../review/item.icons';\nimport type { ReviewPresenceUser, ReviewQaFilter } from '../types';\n\ninterface QaPanelHeaderProps {\n activeItemCount: number;\n currentPagePresenceUsers: ReviewPresenceUser[];\n filteredItemCount: number;\n label: ReviewSource;\n presenceSessionId: string;\n qaFilter: ReviewQaFilter;\n qaFilterCounts: ReadonlyMap<ReviewQaFilter, number>;\n showSourceSelect: boolean;\n source: ReviewSource;\n sourceEntries: NormalizedReviewShellAdapter[];\n onChangeReviewSource: (nextSource: ReviewSource) => void;\n onQaFilterChange: (filter: ReviewQaFilter) => void;\n onRefreshReviewData: () => Promise<void>;\n}\n\nexport const QaPanelHeader = ({\n activeItemCount,\n currentPagePresenceUsers,\n filteredItemCount,\n label,\n presenceSessionId,\n qaFilter,\n qaFilterCounts,\n showSourceSelect,\n source,\n sourceEntries,\n onChangeReviewSource,\n onQaFilterChange,\n onRefreshReviewData,\n}: QaPanelHeaderProps) => {\n return (\n <div className=\"df-review-list-header\">\n <div className=\"df-review-list-toolbar\">\n <div className=\"df-review-list-controls\">\n {showSourceSelect && (\n <select\n aria-label=\"QA source\"\n className=\"df-review-source-select\"\n value={source}\n onChange={(event) =>\n onChangeReviewSource(event.currentTarget.value as ReviewSource)\n }\n >\n {sourceEntries.map((entry) => (\n <option key={entry.label} value={entry.label}>\n {entry.label}\n </option>\n ))}\n </select>\n )}\n <button\n aria-label=\"Refresh QA\"\n className=\"df-review-source-refresh\"\n type=\"button\"\n onClick={() => void onRefreshReviewData()}\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-filter-tabs\" aria-label=\"QA filters\">\n {REVIEW_QA_FILTERS.map((filter) => {\n const count = qaFilterCounts.get(filter.key) ?? 0;\n const isActive = qaFilter === filter.key;\n\n return (\n <button\n key={filter.key}\n aria-label={`${filter.label} QA (${count})`}\n aria-pressed={isActive}\n className={`df-review-filter-tab${\n isActive ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onQaFilterChange(filter.key)}\n >\n <span className=\"df-review-filter-icon\">\n {filter.scope ? (\n <ReviewScopeIcon scope={filter.scope} />\n ) : (\n <ListFilterIcon aria-hidden=\"true\" />\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"df-review-list-title\">\n <span>{label} QA</span>\n <strong>\n {filteredItemCount}\n {qaFilter === 'all' ? '' : `/${activeItemCount}`}\n </strong>\n </div>\n <PresenceRow\n presenceSessionId={presenceSessionId}\n users={currentPagePresenceUsers}\n />\n </div>\n );\n};\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewSource,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { QaItemCard } from './item.card';\nimport { QaPanelHeader } from './panel.header';\nimport type {\n ReviewPresenceUser,\n ReviewQaFilter,\n ReviewShellViewportKind,\n} from '../types';\n\ninterface ReviewQaPanelProps {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n activeItems: ReviewItem[];\n currentPagePresenceUsers: ReviewPresenceUser[];\n currentPresetScope: ReviewShellViewportKind;\n filteredNumberedActiveItems: NumberedReviewItem[];\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n hiddenOverlayItemIds: ReadonlySet<string>;\n isListVisible: boolean;\n isRemoteSource: boolean;\n presenceSessionId: string;\n copiedPromptKey: string | null;\n qaFilter: ReviewQaFilter;\n qaFilterCounts: ReadonlyMap<ReviewQaFilter, number>;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n selectedItemId: string | null;\n showSourceSelect: boolean;\n sourceRoot?: string;\n source: ReviewSource;\n sourceEntries: NormalizedReviewShellAdapter[];\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onChangeReviewSource: (nextSource: ReviewSource) => void;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onEditItem: (item: ReviewItem) => void;\n onQaFilterChange: (filter: ReviewQaFilter) => void;\n onRefreshReviewData: () => Promise<void>;\n onRemoveItem: (item: ReviewItem) => Promise<void>;\n onRestoreReviewItem: (item: ReviewItem) => void;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n onToggleItemOverlayVisibility: (itemId: string) => void;\n}\n\nexport const ReviewQaPanel = ({\n activeAdapterEntry,\n activeItems,\n currentPagePresenceUsers,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIds,\n isListVisible,\n isRemoteSource,\n presenceSessionId,\n copiedPromptKey,\n qaFilter,\n qaFilterCounts,\n remoteAdapterEntry,\n selectedItemId,\n showSourceSelect,\n sourceRoot,\n source,\n sourceEntries,\n onChangeItemStatus,\n onClearSelectedItem,\n onChangeReviewSource,\n onCopyItemPrompt,\n onEditItem,\n onQaFilterChange,\n onRefreshReviewData,\n onRemoveItem,\n onRestoreReviewItem,\n onSubmitItem,\n onToggleItemOverlayVisibility,\n}: ReviewQaPanelProps) => {\n return (\n <aside className=\"df-review-qa-panel\" aria-hidden={!isListVisible}>\n <div className=\"df-review-panel-body\">\n <section className=\"df-review-item-list\">\n <QaPanelHeader\n activeItemCount={activeItems.length}\n currentPagePresenceUsers={currentPagePresenceUsers}\n filteredItemCount={filteredNumberedActiveItems.length}\n label={activeAdapterEntry.label}\n presenceSessionId={presenceSessionId}\n qaFilter={qaFilter}\n qaFilterCounts={qaFilterCounts}\n showSourceSelect={showSourceSelect}\n source={source}\n sourceEntries={sourceEntries}\n onChangeReviewSource={onChangeReviewSource}\n onQaFilterChange={onQaFilterChange}\n onRefreshReviewData={onRefreshReviewData}\n />\n <div\n className=\"df-review-list-scroll\"\n onClick={(event) => {\n if (event.target === event.currentTarget) {\n onClearSelectedItem();\n }\n }}\n >\n {activeItems.length === 0 && (\n <p className=\"df-review-empty\">\n {isRemoteSource\n ? `No ${activeAdapterEntry.label} QA on this page.`\n : 'No QA on this page.'}\n </p>\n )}\n {activeItems.length > 0 &&\n filteredNumberedActiveItems.length === 0 && (\n <p className=\"df-review-empty\">No QA in this filter.</p>\n )}\n {filteredNumberedActiveItems.map((numberedItem) => {\n const { item } = numberedItem;\n\n return (\n <QaItemCard\n key={item.id}\n activeAdapterEntry={activeAdapterEntry}\n currentPresetScope={currentPresetScope}\n getItemPresetScope={getItemPresetScope}\n isOverlayVisible={!hiddenOverlayItemIds.has(item.id)}\n isRemoteSource={isRemoteSource}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n copiedPromptKey={copiedPromptKey}\n selectedItemId={selectedItemId}\n sourceRoot={sourceRoot}\n onChangeItemStatus={onChangeItemStatus}\n onClearSelectedItem={onClearSelectedItem}\n onCopyItemPrompt={onCopyItemPrompt}\n onEditItem={onEditItem}\n onRemoveItem={onRemoveItem}\n onRestoreReviewItem={onRestoreReviewItem}\n onSubmitItem={onSubmitItem}\n onToggleItemOverlayVisibility={onToggleItemOverlayVisibility}\n />\n );\n })}\n </div>\n </section>\n </div>\n </aside>\n );\n};\n","import {\n Scan as ScanIcon,\n SquareMousePointer as SquareMousePointerIcon,\n} from 'lucide-react';\nimport type { ReviewMode } from '../../types';\n\ninterface ReviewModeToolbarProps {\n canWriteArea: boolean;\n canWriteDom: boolean;\n mode: ReviewMode;\n onSetReviewMode: (mode: ReviewMode) => void;\n}\n\nexport const ReviewModeToolbar = ({\n canWriteArea,\n canWriteDom,\n mode,\n onSetReviewMode,\n}: ReviewModeToolbarProps) => {\n if (!canWriteDom && !canWriteArea) return null;\n\n return (\n <div className=\"df-review-mode\" aria-label=\"Add QA\">\n {canWriteDom && (\n <button\n aria-label=\"Element\"\n className={`df-review-mode-button is-element${\n mode === 'element' ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onSetReviewMode('element')}\n >\n <SquareMousePointerIcon aria-hidden=\"true\" />\n </button>\n )}\n {canWriteDom && canWriteArea && (\n <span className=\"df-review-mode-divider\" aria-hidden=\"true\">\n |\n </span>\n )}\n {canWriteArea && (\n <button\n aria-label=\"Area\"\n className={`df-review-mode-button is-area${\n mode === 'area' ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onSetReviewMode('area')}\n >\n <ScanIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n};\n","import type { CSSProperties } from 'react';\nimport type { ReviewRulerPoint, ReviewShellViewportPreset } from '../types';\n\ninterface RulerGuttersProps {\n rulerHover: ReviewRulerPoint | null;\n rulerScaleX: number;\n rulerScaleY: number;\n rulerUnit: string;\n size: ReviewShellViewportPreset;\n}\n\nexport const RulerGutters = ({\n rulerHover,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n size,\n}: RulerGuttersProps) => {\n return (\n <>\n <div className=\"df-review-ruler-corner\" aria-hidden=\"true\" />\n <div\n className=\"df-review-ruler-gutter is-x\"\n style={\n {\n '--df-review-ruler-step-x': `${rulerScaleX * 20}px`,\n } as CSSProperties\n }\n >\n <div className=\"df-review-ruler-frame-label\">\n <strong>{size.label}</strong>\n <span>\n {size.designWidth}\n {size.designHeight ? `x${size.designHeight}` : ''}\n {rulerUnit}\n </span>\n </div>\n {rulerHover && (\n <div\n className=\"df-review-ruler-coord is-x\"\n style={{ left: `${rulerHover.x}px` }}\n >\n {Math.round(rulerHover.x / rulerScaleX)}\n </div>\n )}\n </div>\n <div\n className=\"df-review-ruler-gutter is-y\"\n style={\n {\n '--df-review-ruler-step-y': `${rulerScaleY * 20}px`,\n } as CSSProperties\n }\n >\n {rulerHover && (\n <div\n className=\"df-review-ruler-coord is-y\"\n style={{ top: `${rulerHover.y}px` }}\n >\n {Math.round(rulerHover.y / rulerScaleY)}\n </div>\n )}\n </div>\n </>\n );\n};\n","import type { RefObject } from 'react';\nimport type {\n ReviewRulerMeasure,\n ReviewRulerPoint,\n ReviewShellViewportPreset,\n} from '../types';\n\ninterface RulerOverlayProps {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerDragging: boolean;\n rulerHover: ReviewRulerPoint | null;\n rulerMeasure: ReviewRulerMeasure | undefined;\n rulerMeasureLabel: string;\n rulerOverlayRef: RefObject<HTMLDivElement | null>;\n size: ReviewShellViewportPreset;\n}\n\nexport const RulerOverlay = ({\n iframeRef,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n size,\n}: RulerOverlayProps) => {\n return (\n <div\n ref={rulerOverlayRef}\n aria-label=\"Ruler\"\n className={`df-review-ruler-overlay${\n isRulerDragging ? ' is-dragging' : ''\n }`}\n role=\"application\"\n onWheel={(event) => {\n iframeRef.current?.contentWindow?.scrollBy(\n event.deltaX,\n event.deltaY\n );\n }}\n >\n {rulerHover && (\n <>\n <div\n className=\"df-review-ruler-guide is-x\"\n aria-hidden=\"true\"\n style={{ top: `${rulerHover.y}px` }}\n />\n <div\n className=\"df-review-ruler-guide is-y\"\n aria-hidden=\"true\"\n style={{ left: `${rulerHover.x}px` }}\n />\n </>\n )}\n {rulerMeasure &&\n (rulerMeasure.width > 0 || rulerMeasure.height > 0) && (\n <>\n <div\n className=\"df-review-ruler-selection\"\n aria-hidden=\"true\"\n style={{\n left: `${rulerMeasure.left}px`,\n top: `${rulerMeasure.top}px`,\n width: `${rulerMeasure.width}px`,\n height: `${rulerMeasure.height}px`,\n }}\n />\n <div\n className=\"df-review-ruler-label\"\n style={{\n left: `${Math.min(\n Math.max(rulerMeasure.left + rulerMeasure.width + 8, 8),\n Math.max(8, size.width - 164)\n )}px`,\n top: `${Math.min(\n Math.max(rulerMeasure.top + rulerMeasure.height + 8, 8),\n Math.max(8, size.height - 34)\n )}px`,\n }}\n >\n {rulerMeasureLabel}\n </div>\n </>\n )}\n </div>\n );\n};\n","import type { RefObject } from 'react';\nimport type { ReviewMode } from '../../types';\nimport type {\n ReviewRulerMeasure,\n ReviewRulerPoint,\n ReviewShellViewportPreset,\n} from '../types';\nimport { ReviewModeToolbar } from '../review/mode.toolbar';\nimport { RulerGutters } from '../ruler/gutters';\nimport { RulerOverlay } from '../ruler/overlay';\n\ninterface ReviewTargetFrameProps {\n canWriteArea: boolean;\n canWriteDom: boolean;\n frameScrollRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerAvailable: boolean;\n isRulerDragging: boolean;\n isRulerVisible: boolean;\n mode: ReviewMode;\n rulerHover: ReviewRulerPoint | null;\n rulerMeasure: ReviewRulerMeasure | undefined;\n rulerMeasureLabel: string;\n rulerOverlayRef: RefObject<HTMLDivElement | null>;\n rulerScaleX: number;\n rulerScaleY: number;\n rulerUnit: string;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onLoadTarget: () => void;\n onSetReviewMode: (mode: ReviewMode) => void;\n}\n\nexport const ReviewTargetFrame = ({\n canWriteArea,\n canWriteDom,\n frameScrollRef,\n iframeRef,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n mode,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n size,\n targetSrc,\n onLoadTarget,\n onSetReviewMode,\n}: ReviewTargetFrameProps) => {\n const showRuler = isRulerVisible && isRulerAvailable;\n\n return (\n <main className=\"df-review-stage\">\n <div className=\"df-review-frame\">\n <div className=\"df-review-frame-scroll\" ref={frameScrollRef}>\n <div className=\"df-review-frame-canvas\">\n <div\n className={`df-review-device-frame${\n showRuler ? ' is-ruler' : ''\n }`}\n >\n {showRuler && (\n <RulerGutters\n rulerHover={rulerHover}\n rulerScaleX={rulerScaleX}\n rulerScaleY={rulerScaleY}\n rulerUnit={rulerUnit}\n size={size}\n />\n )}\n <div\n className=\"df-review-device\"\n style={{\n width: `${size.width}px`,\n height: `${size.height}px`,\n minWidth: `${size.width}px`,\n minHeight: `${size.height}px`,\n }}\n >\n <iframe\n key={targetSrc}\n ref={iframeRef}\n width={size.width}\n height={size.height}\n src={targetSrc}\n title=\"Review target\"\n onLoad={onLoadTarget}\n />\n {showRuler && (\n <RulerOverlay\n iframeRef={iframeRef}\n isRulerDragging={isRulerDragging}\n rulerHover={rulerHover}\n rulerMeasure={rulerMeasure}\n rulerMeasureLabel={rulerMeasureLabel}\n rulerOverlayRef={rulerOverlayRef}\n size={size}\n />\n )}\n </div>\n </div>\n </div>\n </div>\n <div className=\"df-review-frame-actions\">\n <ReviewModeToolbar\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n mode={mode}\n onSetReviewMode={onSetReviewMode}\n />\n </div>\n </div>\n </main>\n );\n};\n","import {\n CircleHelp as CircleHelpIcon,\n Image as ImageIcon,\n LayoutGrid as LayoutGridIcon,\n Map as MapIcon,\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n Ruler as RulerIcon,\n Settings as SettingsIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n} from 'lucide-react';\nimport type { ReviewItemScope } from '../index';\nimport { FIGMA_OVERLAY_UNAVAILABLE_MESSAGE } from './constants';\nimport type {\n ReviewShellViewportPreset,\n TargetOverlayKey,\n TargetOverlayState,\n} from './types';\nimport { getViewportPresetKind } from './viewport';\n\ninterface ReviewTopbarProps {\n draftTarget: string;\n copyLabel: string;\n viewportPresets: ReviewShellViewportPreset[];\n size: ReviewShellViewportPreset;\n presetScopeCounts: ReadonlyMap<ReviewItemScope, number>;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n targetOverlayState: TargetOverlayState;\n isFigmaOverlayAvailable: boolean;\n onDraftTargetChange: (value: string) => void;\n onApplyTarget: () => void;\n onOpenSitemap: () => void;\n onCopyCurrentUrl: () => void;\n onSizeChange: (preset: ReviewShellViewportPreset) => void;\n onToggleRuler: () => void;\n onToggleTargetOverlay: (key: TargetOverlayKey) => void;\n onOpenInitialPrompt: () => void;\n onOpenSettings: () => void;\n}\n\nconst ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nconst ViewportPresetIcon = ({\n preset\n}: {\n preset: ReviewShellViewportPreset;\n}) => {\n return <ReviewScopeIcon scope={getViewportPresetKind(preset)} />;\n};\n\nexport const ReviewTopbar = ({\n draftTarget,\n copyLabel,\n viewportPresets,\n size,\n presetScopeCounts,\n isRulerAvailable,\n isRulerVisible,\n targetOverlayState,\n isFigmaOverlayAvailable,\n onDraftTargetChange,\n onApplyTarget,\n onOpenSitemap,\n onCopyCurrentUrl,\n onSizeChange,\n onToggleRuler,\n onToggleTargetOverlay,\n onOpenInitialPrompt,\n onOpenSettings,\n}: ReviewTopbarProps) => {\n return (\n <header className=\"df-review-topbar\">\n <form\n className=\"df-review-address\"\n onSubmit={(event) => {\n event.preventDefault();\n onApplyTarget();\n }}\n >\n <button\n aria-label=\"Open sitemap\"\n className=\"df-review-sitemap-button\"\n type=\"button\"\n onClick={onOpenSitemap}\n >\n <MapIcon aria-hidden=\"true\" />\n </button>\n <input\n aria-label=\"Path\"\n value={draftTarget}\n onChange={(event) => onDraftTargetChange(event.target.value)}\n />\n <button type=\"submit\">Load</button>\n <button type=\"button\" onClick={onCopyCurrentUrl}>\n {copyLabel}\n </button>\n </form>\n\n <div className=\"df-review-tools\">\n <div className=\"df-review-tool-controls\">\n <div className=\"df-review-presets\" aria-label=\"Viewport presets\">\n {viewportPresets.map((preset) => (\n <button\n key={preset.label}\n className={preset.label === size.label ? 'is-active' : ''}\n type=\"button\"\n onClick={() => onSizeChange(preset)}\n >\n <ViewportPresetIcon preset={preset} />\n <span className=\"df-review-preset-copy\">\n <strong>{preset.label}</strong>\n </span>\n <span className=\"df-review-preset-count\">\n {presetScopeCounts.get(getViewportPresetKind(preset)) ?? 0}\n </span>\n </button>\n ))}\n </div>\n\n <span className=\"df-review-tool-divider\" aria-hidden=\"true\">\n |\n </span>\n\n <span className=\"df-review-active-size\">\n {size.width}x{size.height}\n </span>\n </div>\n\n <div className=\"df-review-overlays\" aria-label=\"Target overlays\">\n {isRulerAvailable && (\n <button\n aria-label=\"Toggle ruler\"\n className={`df-review-overlay-button is-ruler${\n isRulerVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={onToggleRuler}\n >\n <RulerIcon aria-hidden=\"true\" />\n </button>\n )}\n <button\n aria-label=\"Toggle grid overlay\"\n className={`df-review-overlay-button is-grid${\n targetOverlayState.grid ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onToggleTargetOverlay('grid')}\n >\n <LayoutGridIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-disabled={!isFigmaOverlayAvailable}\n aria-label={\n isFigmaOverlayAvailable\n ? 'Toggle Figma overlay'\n : FIGMA_OVERLAY_UNAVAILABLE_MESSAGE\n }\n className={`df-review-overlay-button is-figma${\n targetOverlayState.figma ? ' is-active' : ''\n }${isFigmaOverlayAvailable ? '' : ' is-disabled'}`}\n type=\"button\"\n onClick={() => onToggleTargetOverlay('figma')}\n >\n <ImageIcon aria-hidden=\"true\" />\n </button>\n <span className=\"df-review-tool-divider\" aria-hidden=\"true\">\n |\n </span>\n <button\n aria-label=\"Open initial prompt\"\n className=\"df-review-overlay-button is-prompt\"\n type=\"button\"\n onClick={onOpenInitialPrompt}\n >\n <CircleHelpIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Open settings\"\n className=\"df-review-overlay-button is-settings\"\n type=\"button\"\n onClick={onOpenSettings}\n >\n <SettingsIcon aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n </header>\n );\n};\n","import {\n useCallback,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewMode,\n ReviewRulerConfig,\n ReviewSource,\n ReviewViewportPreset,\n WebReviewKitAdapter,\n WebReviewKitController,\n} from '../../types';\nimport type {\n ReviewShellViewportPreset,\n TargetOverlayState,\n} from '../types';\nimport { useReviewItemRestore } from './use.review.item.restore';\nimport { useReviewKitLifecycle } from './use.review.kit.lifecycle';\nimport { useReviewTargetOverlay } from './use.review.target.overlay';\nimport { useReviewTargetSync } from './use.review.target.sync';\n\ninterface UseReviewControllerOptions {\n adapter: WebReviewKitAdapter;\n cleanupTargetRef: MutableRefObject<(() => void) | null>;\n controllerRef: MutableRefObject<WebReviewKitController | null>;\n frameScrollRef: RefObject<HTMLDivElement | null>;\n hiddenOverlayItemIdList: string[];\n hiddenOverlayItemIdListRef: MutableRefObject<string[]>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isFigmaOverlayAvailable: boolean;\n pageTargets: ReadonlySet<string>;\n pendingInitialItemIdRef: MutableRefObject<string | null>;\n pendingRestoreRef: MutableRefObject<ReviewItem | null>;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n reviewViewportPresets: ReviewViewportPreset[];\n ruler?: ReviewRulerConfig;\n selectedItemIdRef: MutableRefObject<string | null>;\n size: ReviewShellViewportPreset;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n target: string;\n targetOverlayState: TargetOverlayState;\n targetRef: MutableRefObject<string>;\n viewportPresets: ReviewShellViewportPreset[];\n onActiveRouteChange: (target: string) => void;\n onCancelReviewMode: () => boolean;\n onDraftTargetChange: (target: string) => void;\n onItemsRefresh: () => Promise<ReviewItem[]>;\n onModeChange: (mode: ReviewMode) => void;\n onSelectedItemIdChange: (itemId: string | null) => void;\n onSizeChange: (size: ReviewShellViewportPreset) => void;\n onTargetChange: (target: string) => void;\n onTargetOverlayStateChange: (state: TargetOverlayState) => void;\n onCloseRuler: () => boolean;\n}\n\nexport const useReviewController = ({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n pageTargets,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetOverlayState,\n targetRef,\n viewportPresets,\n onActiveRouteChange,\n onCancelReviewMode,\n onDraftTargetChange,\n onItemsRefresh,\n onModeChange,\n onSelectedItemIdChange,\n onSizeChange,\n onTargetChange,\n onTargetOverlayStateChange,\n onCloseRuler,\n}: UseReviewControllerOptions) => {\n const syncTargetViewport = useCallback(() => {\n window.dispatchEvent(new Event('resize'));\n }, []);\n const {\n closeTargetOverlay,\n refreshTargetOverlayState,\n toggleTargetOverlay,\n } = useReviewTargetOverlay({\n iframeRef,\n isFigmaOverlayAvailable,\n targetOverlayState,\n onTargetOverlayStateChange,\n });\n const {\n applyPendingRestore,\n clearSelectedItem,\n restoreInitialItem,\n restoreReviewItem,\n } = useReviewItemRestore({\n adapter,\n controllerRef,\n iframeRef,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n reviewPathPrefix,\n selectedItemIdRef,\n source,\n targetRef,\n viewportPresets,\n onActiveRouteChange,\n onDraftTargetChange,\n onSelectedItemIdChange,\n onSizeChange,\n onSyncTargetViewport: syncTargetViewport,\n onTargetChange,\n });\n const { syncShellTarget } = useReviewTargetSync({\n iframeRef,\n reviewPathPrefix,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetRef,\n onActiveRouteChange,\n onClearSelectedItem: clearSelectedItem,\n onDraftTargetChange,\n onSyncTargetViewport: syncTargetViewport,\n onTargetChange,\n });\n const {\n initReviewKit,\n reloadReviewKit,\n setControllerReviewMode,\n } = useReviewKitLifecycle({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n pageTargets,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n sizeRef,\n targetRef,\n onApplyPendingRestore: applyPendingRestore,\n onCancelReviewMode,\n onCloseRuler,\n onCreateItem: restoreReviewItem,\n onItemsRefresh,\n onModeChange,\n onRefreshTargetOverlayState: refreshTargetOverlayState,\n onRestoreInitialItem: restoreInitialItem,\n onRestoreReviewItem: restoreReviewItem,\n onSyncShellTarget: syncShellTarget,\n onSyncTargetViewport: syncTargetViewport,\n });\n\n return {\n clearSelectedItem,\n closeTargetOverlay,\n initReviewKit,\n reloadReviewKit,\n restoreReviewItem,\n setControllerReviewMode,\n syncTargetViewport,\n toggleTargetOverlay,\n };\n};\n","import {\n useCallback,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewSource,\n WebReviewKitAdapter,\n WebReviewKitController,\n} from '../../types';\nimport {\n getReviewItemRestoreScrollPosition,\n queryReviewItemAnchorElement,\n setDocumentScrollInstantly,\n} from '../anchor.restore';\nimport {\n getItemTarget,\n updateShellUrlForItem,\n} from '../route';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getRestoredSize } from '../viewport';\n\ninterface UseReviewItemRestoreOptions {\n adapter: WebReviewKitAdapter;\n controllerRef: MutableRefObject<WebReviewKitController | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n pendingInitialItemIdRef: MutableRefObject<string | null>;\n pendingRestoreRef: MutableRefObject<ReviewItem | null>;\n reviewPathPrefix: string;\n selectedItemIdRef: MutableRefObject<string | null>;\n source: ReviewSource;\n targetRef: MutableRefObject<string>;\n viewportPresets: ReviewShellViewportPreset[];\n onActiveRouteChange: (target: string) => void;\n onDraftTargetChange: (target: string) => void;\n onSelectedItemIdChange: (itemId: string | null) => void;\n onSizeChange: (size: ReviewShellViewportPreset) => void;\n onSyncTargetViewport: () => void;\n onTargetChange: (target: string) => void;\n}\n\nfunction runWithAutoScrollBehavior(\n targetDocument: Document | undefined,\n callback: () => void\n) {\n const elements = [\n targetDocument?.documentElement,\n targetDocument?.body,\n ].filter((element): element is HTMLElement => Boolean(element));\n const previousValues = elements.map((element) => element.style.scrollBehavior);\n\n elements.forEach((element) => {\n element.style.scrollBehavior = 'auto';\n });\n\n try {\n callback();\n } finally {\n elements.forEach((element, index) => {\n element.style.scrollBehavior = previousValues[index] ?? '';\n });\n }\n}\n\nexport const useReviewItemRestore = ({\n adapter,\n controllerRef,\n iframeRef,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n reviewPathPrefix,\n selectedItemIdRef,\n source,\n targetRef,\n viewportPresets,\n onActiveRouteChange,\n onDraftTargetChange,\n onSelectedItemIdChange,\n onSizeChange,\n onSyncTargetViewport,\n onTargetChange,\n}: UseReviewItemRestoreOptions) => {\n const clearSelectedItem = useCallback(() => {\n pendingRestoreRef.current = null;\n selectedItemIdRef.current = null;\n onSelectedItemIdChange(null);\n controllerRef.current?.highlightItem(undefined);\n }, [\n controllerRef,\n onSelectedItemIdChange,\n pendingRestoreRef,\n selectedItemIdRef,\n ]);\n\n const applyItemScroll = useCallback(\n (item: ReviewItem) => {\n if (selectedItemIdRef.current !== item.id) return;\n\n const targetWindow = iframeRef.current?.contentWindow;\n const targetDocument = iframeRef.current?.contentDocument;\n if (!targetWindow) return;\n\n const anchorElement = targetDocument\n ? queryReviewItemAnchorElement(targetDocument, item)\n : undefined;\n\n runWithAutoScrollBehavior(targetDocument ?? undefined, () => {\n if (!targetDocument) return;\n\n setDocumentScrollInstantly(\n targetWindow,\n targetDocument,\n getReviewItemRestoreScrollPosition(\n targetWindow,\n targetDocument,\n item,\n anchorElement\n )\n );\n });\n onSyncTargetViewport();\n controllerRef.current?.highlightItem(item.id);\n },\n [controllerRef, iframeRef, onSyncTargetViewport, selectedItemIdRef]\n );\n\n const applyPendingRestore = useCallback(() => {\n const item = pendingRestoreRef.current;\n if (!item) return;\n\n applyItemScroll(item);\n pendingRestoreRef.current = null;\n }, [applyItemScroll, pendingRestoreRef]);\n\n const restoreReviewItem = useCallback(\n (item: ReviewItem) => {\n const nextTarget = getItemTarget(item, reviewPathPrefix);\n const nextSize = getRestoredSize(item, viewportPresets);\n\n pendingRestoreRef.current = item;\n selectedItemIdRef.current = item.id;\n onSelectedItemIdChange(item.id);\n onActiveRouteChange(nextTarget);\n onDraftTargetChange(nextTarget);\n onSizeChange(nextSize);\n updateShellUrlForItem(nextTarget, nextSize, item.id, source);\n\n if (targetRef.current !== nextTarget) {\n onTargetChange(nextTarget);\n return;\n }\n\n applyPendingRestore();\n },\n [\n applyPendingRestore,\n onActiveRouteChange,\n onDraftTargetChange,\n onSelectedItemIdChange,\n onSizeChange,\n onTargetChange,\n pendingRestoreRef,\n reviewPathPrefix,\n selectedItemIdRef,\n source,\n targetRef,\n viewportPresets,\n ]\n );\n\n const restoreInitialItem = useCallback(async () => {\n const itemId = pendingInitialItemIdRef.current;\n if (!itemId) return;\n\n pendingInitialItemIdRef.current = null;\n\n const item = await adapter.get(itemId);\n if (item) {\n restoreReviewItem(item);\n }\n }, [adapter, pendingInitialItemIdRef, restoreReviewItem]);\n\n return {\n applyPendingRestore,\n clearSelectedItem,\n restoreInitialItem,\n restoreReviewItem,\n };\n};\n","import {\n useCallback,\n useEffect,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewMode,\n ReviewRulerConfig,\n ReviewViewportPreset,\n WebReviewKitAdapter,\n WebReviewKitController,\n} from '../../types';\nimport { createWebReviewKit } from '../../core/web.review.kit.app';\nimport { setTargetScrollbarHidden } from '../target/target';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\nimport { bindReviewFrameNavigation } from './review.frame.navigation';\nimport { getReviewKitTarget } from './review.kit.target';\n\ninterface UseReviewKitLifecycleOptions {\n adapter: WebReviewKitAdapter;\n cleanupTargetRef: MutableRefObject<(() => void) | null>;\n controllerRef: MutableRefObject<WebReviewKitController | null>;\n frameScrollRef: RefObject<HTMLDivElement | null>;\n hiddenOverlayItemIdList: string[];\n hiddenOverlayItemIdListRef: MutableRefObject<string[]>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n pageTargets: ReadonlySet<string>;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n reviewViewportPresets: ReviewViewportPreset[];\n ruler?: ReviewRulerConfig;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n targetRef: MutableRefObject<string>;\n onApplyPendingRestore: () => void;\n onCancelReviewMode: () => boolean;\n onCloseRuler: () => boolean;\n onItemsRefresh: () => Promise<ReviewItem[]>;\n onModeChange: (mode: ReviewMode) => void;\n onCreateItem: (item: ReviewItem) => void;\n onRefreshTargetOverlayState: () => void;\n onRestoreInitialItem: () => Promise<void>;\n onRestoreReviewItem: (item: ReviewItem) => void;\n onSyncShellTarget: (target: string) => void;\n onSyncTargetViewport: () => void;\n}\n\nexport const useReviewKitLifecycle = ({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n pageTargets,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n sizeRef,\n targetRef,\n onApplyPendingRestore,\n onCancelReviewMode,\n onCloseRuler,\n onItemsRefresh,\n onModeChange,\n onCreateItem,\n onRefreshTargetOverlayState,\n onRestoreInitialItem,\n onRestoreReviewItem,\n onSyncShellTarget,\n onSyncTargetViewport,\n}: UseReviewKitLifecycleOptions) => {\n const destroyReviewKit = useCallback(() => {\n cleanupTargetRef.current?.();\n cleanupTargetRef.current = null;\n controllerRef.current?.destroy();\n controllerRef.current = null;\n }, [cleanupTargetRef, controllerRef]);\n\n const initReviewKit = useCallback(() => {\n destroyReviewKit();\n\n const iframe = iframeRef.current;\n const targetWindow = iframe?.contentWindow;\n const targetDocument = iframe?.contentDocument;\n if (!iframe || !targetWindow || !targetDocument) return;\n\n cleanupTargetRef.current = bindReviewFrameNavigation({\n pageTargets,\n reviewPathPrefix,\n targetDocument,\n targetRef,\n targetWindow,\n onCancelReviewMode,\n onCloseRuler,\n onSyncShellTarget,\n onSyncTargetViewport,\n });\n\n controllerRef.current = createWebReviewKit({\n projectId,\n userId: reviewUserId.trim() || undefined,\n adapter,\n target: () => getReviewKitTarget({ frameScrollRef, iframeRef }),\n hotkeys: {\n qa: 'Shift+Q',\n },\n anchors: {\n attribute: 'data-qa-id',\n },\n viewports: {\n presets: reviewViewportPresets,\n },\n ruler,\n onCreateItem,\n onRestoreItem: onRestoreReviewItem,\n onItemsChange: () => {\n void onItemsRefresh();\n },\n onModeChange,\n ui: {\n panel: false,\n },\n modules: {\n qa: true,\n grid: false,\n figma: false,\n },\n });\n controllerRef.current.open();\n controllerRef.current.setHiddenItemIds(hiddenOverlayItemIdListRef.current);\n onModeChange(controllerRef.current.getMode());\n void onItemsRefresh();\n void onRestoreInitialItem();\n onApplyPendingRestore();\n onRefreshTargetOverlayState();\n setTargetScrollbarHidden(\n targetDocument,\n getViewportPresetKind(sizeRef.current) === 'mobile'\n );\n }, [\n adapter,\n cleanupTargetRef,\n controllerRef,\n destroyReviewKit,\n frameScrollRef,\n hiddenOverlayItemIdListRef,\n iframeRef,\n onApplyPendingRestore,\n onCancelReviewMode,\n onCloseRuler,\n onCreateItem,\n onItemsRefresh,\n onModeChange,\n onRefreshTargetOverlayState,\n onRestoreInitialItem,\n onRestoreReviewItem,\n onSyncShellTarget,\n onSyncTargetViewport,\n pageTargets,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n sizeRef,\n targetRef,\n ]);\n\n const reloadReviewKit = useCallback(async () => {\n await controllerRef.current?.reload();\n }, [controllerRef]);\n\n const setControllerReviewMode = useCallback(\n (nextMode: ReviewMode) => {\n controllerRef.current?.setMode(nextMode);\n onModeChange(controllerRef.current?.getMode() ?? 'idle');\n },\n [controllerRef, onModeChange]\n );\n\n useEffect(() => destroyReviewKit, [destroyReviewKit]);\n\n useEffect(() => {\n const frameDocument = iframeRef.current?.contentDocument;\n if (!frameDocument || frameDocument.readyState !== 'complete') return;\n initReviewKit();\n }, [iframeRef, initReviewKit]);\n\n useEffect(() => {\n hiddenOverlayItemIdListRef.current = hiddenOverlayItemIdList;\n controllerRef.current?.setHiddenItemIds(hiddenOverlayItemIdList);\n }, [controllerRef, hiddenOverlayItemIdList, hiddenOverlayItemIdListRef]);\n\n return {\n destroyReviewKit,\n initReviewKit,\n reloadReviewKit,\n setControllerReviewMode,\n };\n};\n","import type { TargetOverlayState } from '../types';\n\nexport const HIDE_SCROLLBAR_STYLE_ID = 'df-review-hide-scrollbar';\n\nexport const setTargetScrollbarHidden = (\n targetDocument: Document | null | undefined,\n hidden: boolean\n) => {\n if (!targetDocument) return;\n\n const existing = targetDocument.getElementById(HIDE_SCROLLBAR_STYLE_ID);\n if (hidden) {\n if (existing) return;\n const style = targetDocument.createElement('style');\n style.id = HIDE_SCROLLBAR_STYLE_ID;\n style.textContent =\n 'html{scrollbar-width:none}html::-webkit-scrollbar,body::-webkit-scrollbar{width:0;height:0;display:none}';\n targetDocument.head?.appendChild(style);\n } else {\n existing?.remove();\n }\n};\n\nexport const isEditableEventTarget = (event: KeyboardEvent) => {\n const path = event.composedPath?.() ?? [];\n const element = (path[0] ?? event.target) as HTMLElement | null;\n if (!element || typeof element.tagName !== 'string') return false;\n const tag = element.tagName;\n return (\n tag === 'INPUT' || tag === 'TEXTAREA' || element.isContentEditable === true\n );\n};\n\nexport const getTargetOverlayState = (\n targetDocument: Document | undefined\n): TargetOverlayState => ({\n grid: Boolean(\n targetDocument?.body.classList.contains('is-help') ||\n targetDocument?.querySelector('.helper.onShow')\n ),\n figma: Boolean(\n targetDocument?.querySelector(\n '.helper-figma-root, .helper-figma-loading-backdrop'\n )\n )\n});\n","import type { MutableRefObject } from 'react';\nimport {\n getFrameRouteTarget,\n normalizeTarget,\n} from '../route';\n\ninterface BindReviewFrameNavigationOptions {\n pageTargets: ReadonlySet<string>;\n reviewPathPrefix: string;\n targetDocument: Document;\n targetRef: MutableRefObject<string>;\n targetWindow: Window;\n onCancelReviewMode: () => boolean;\n onCloseRuler: () => boolean;\n onSyncShellTarget: (target: string) => void;\n onSyncTargetViewport: () => void;\n}\n\nexport const bindReviewFrameNavigation = ({\n pageTargets,\n reviewPathPrefix,\n targetDocument,\n targetRef,\n targetWindow,\n onCancelReviewMode,\n onCloseRuler,\n onSyncShellTarget,\n onSyncTargetViewport,\n}: BindReviewFrameNavigationOptions) => {\n const syncRouteFromFrame = () => {\n const nextTarget = getFrameRouteTarget(targetWindow, reviewPathPrefix);\n if (nextTarget !== targetRef.current && !pageTargets.has(nextTarget)) {\n return;\n }\n\n onSyncShellTarget(nextTarget);\n };\n\n const handleClick = (event: MouseEvent) => {\n if (event.defaultPrevented || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n const targetElement = event.target;\n if (!targetElement || !('closest' in targetElement)) return;\n\n const link = (targetElement as Element).closest('a[href]');\n const href = link?.getAttribute('href');\n const linkTarget = link?.getAttribute('target');\n if (!href || (linkTarget && linkTarget !== '_self')) return;\n\n const url = new URL(href, targetWindow.location.href);\n if (url.origin !== targetWindow.location.origin) return;\n\n const nextTarget = normalizeTarget(url.pathname, reviewPathPrefix);\n if (nextTarget === targetRef.current) return;\n\n event.preventDefault();\n onSyncShellTarget(nextTarget);\n };\n\n const handleFrameKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n if (!onCancelReviewMode() && !onCloseRuler()) return;\n\n event.preventDefault();\n event.stopPropagation();\n };\n\n const history = targetWindow.history;\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<History['pushState']>) => {\n originalPushState(...args);\n syncRouteFromFrame();\n };\n history.replaceState = (...args: Parameters<History['replaceState']>) => {\n originalReplaceState(...args);\n syncRouteFromFrame();\n };\n\n syncRouteFromFrame();\n targetWindow.addEventListener('popstate', syncRouteFromFrame);\n targetWindow.addEventListener('hashchange', syncRouteFromFrame);\n targetWindow.addEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.addEventListener('click', handleClick, true);\n targetWindow.addEventListener('scroll', onSyncTargetViewport, true);\n targetWindow.addEventListener('resize', onSyncTargetViewport);\n\n return () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n targetWindow.removeEventListener('popstate', syncRouteFromFrame);\n targetWindow.removeEventListener('hashchange', syncRouteFromFrame);\n targetWindow.removeEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.removeEventListener('click', handleClick, true);\n targetWindow.removeEventListener('scroll', onSyncTargetViewport, true);\n targetWindow.removeEventListener('resize', onSyncTargetViewport);\n };\n};\n","import type { RefObject } from 'react';\nimport type { WebReviewKitTarget } from '../../types';\n\ninterface GetReviewKitTargetOptions {\n frameScrollRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n}\n\nexport const getReviewKitTarget = ({\n frameScrollRef,\n iframeRef,\n}: GetReviewKitTargetOptions): WebReviewKitTarget | undefined => {\n const frame = iframeRef.current;\n const frameWindow = frame?.contentWindow;\n const frameDocument = frame?.contentDocument;\n\n if (!frame || !frameWindow || !frameDocument) return undefined;\n\n return {\n window: frameWindow,\n document: frameDocument,\n getViewportRect: () => frame.getBoundingClientRect(),\n getOverlayRect: () => {\n const frameRect = frame.getBoundingClientRect();\n const scrollRect = frameScrollRef.current?.getBoundingClientRect();\n if (!scrollRect) return frameRect;\n\n const left = Math.max(frameRect.left, scrollRect.left);\n const top = Math.max(frameRect.top, scrollRect.top);\n const right = Math.min(\n frameRect.left + frameRect.width,\n scrollRect.left + scrollRect.width\n );\n const bottom = Math.min(\n frameRect.top + frameRect.height,\n scrollRect.top + scrollRect.height\n );\n\n return {\n left,\n top,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n };\n },\n };\n};\n","import { useCallback, useEffect, type RefObject } from 'react';\nimport { getTargetOverlayState } from '../target/target';\nimport type {\n TargetOverlayKey,\n TargetOverlayState,\n} from '../types';\n\ninterface UseReviewTargetOverlayOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isFigmaOverlayAvailable: boolean;\n targetOverlayState: TargetOverlayState;\n onTargetOverlayStateChange: (state: TargetOverlayState) => void;\n}\n\nexport const useReviewTargetOverlay = ({\n iframeRef,\n isFigmaOverlayAvailable,\n targetOverlayState,\n onTargetOverlayStateChange,\n}: UseReviewTargetOverlayOptions) => {\n const refreshTargetOverlayState = useCallback(() => {\n onTargetOverlayStateChange(\n getTargetOverlayState(iframeRef.current?.contentDocument ?? undefined)\n );\n }, [iframeRef, onTargetOverlayStateChange]);\n\n const dispatchTargetOverlayHotkey = useCallback(\n (overlay: TargetOverlayKey) => {\n const targetWindow = iframeRef.current?.contentWindow;\n if (!targetWindow) return false;\n\n const code = overlay === 'grid' ? 'KeyG' : 'KeyF';\n targetWindow.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n cancelable: true,\n code,\n key: code.replace('Key', '').toLowerCase(),\n shiftKey: true,\n })\n );\n window.setTimeout(refreshTargetOverlayState, 80);\n return true;\n },\n [iframeRef, refreshTargetOverlayState]\n );\n\n const toggleTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n if (overlay === 'figma' && !isFigmaOverlayAvailable) {\n refreshTargetOverlayState();\n return;\n }\n\n dispatchTargetOverlayHotkey(overlay);\n },\n [\n dispatchTargetOverlayHotkey,\n isFigmaOverlayAvailable,\n refreshTargetOverlayState,\n ]\n );\n\n const closeTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n const currentState = getTargetOverlayState(\n iframeRef.current?.contentDocument ?? undefined\n );\n onTargetOverlayStateChange(currentState);\n if (!currentState[overlay]) return false;\n\n return dispatchTargetOverlayHotkey(overlay);\n },\n [dispatchTargetOverlayHotkey, iframeRef, onTargetOverlayStateChange]\n );\n\n useEffect(() => {\n if (isFigmaOverlayAvailable || !targetOverlayState.figma) return;\n closeTargetOverlay('figma');\n }, [closeTargetOverlay, isFigmaOverlayAvailable, targetOverlayState.figma]);\n\n return {\n closeTargetOverlay,\n refreshTargetOverlayState,\n toggleTargetOverlay,\n };\n};\n","import {\n useCallback,\n useEffect,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type { ReviewSource } from '../../types';\nimport {\n normalizeTarget,\n updateShellUrl,\n updateShellUrlForItem,\n} from '../route';\nimport { setTargetScrollbarHidden } from '../target/target';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface UseReviewTargetSyncOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n reviewPathPrefix: string;\n selectedItemIdRef: MutableRefObject<string | null>;\n size: ReviewShellViewportPreset;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n target: string;\n targetRef: MutableRefObject<string>;\n onActiveRouteChange: (target: string) => void;\n onClearSelectedItem: () => void;\n onDraftTargetChange: (target: string) => void;\n onSyncTargetViewport: () => void;\n onTargetChange: (target: string) => void;\n}\n\nexport const useReviewTargetSync = ({\n iframeRef,\n reviewPathPrefix,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetRef,\n onActiveRouteChange,\n onClearSelectedItem,\n onDraftTargetChange,\n onSyncTargetViewport,\n onTargetChange,\n}: UseReviewTargetSyncOptions) => {\n const syncShellTarget = useCallback(\n (nextTarget: string) => {\n const normalizedTarget = normalizeTarget(nextTarget, reviewPathPrefix);\n\n if (normalizedTarget !== targetRef.current) {\n onClearSelectedItem();\n targetRef.current = normalizedTarget;\n onTargetChange(normalizedTarget);\n onDraftTargetChange(normalizedTarget);\n onActiveRouteChange(normalizedTarget);\n }\n\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n normalizedTarget,\n sizeRef.current,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n }\n },\n [\n onActiveRouteChange,\n onClearSelectedItem,\n onDraftTargetChange,\n onTargetChange,\n reviewPathPrefix,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n ]\n );\n\n useEffect(() => {\n targetRef.current = target;\n onActiveRouteChange(target);\n }, [onActiveRouteChange, target, targetRef]);\n\n useEffect(() => {\n sizeRef.current = size;\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n targetRef.current,\n size,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(targetRef.current, size, source);\n }\n onSyncTargetViewport();\n setTargetScrollbarHidden(\n iframeRef.current?.contentDocument,\n getViewportPresetKind(size) === 'mobile'\n );\n }, [\n iframeRef,\n onSyncTargetViewport,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n targetRef,\n ]);\n\n return {\n syncShellTarget,\n };\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { NumberedReviewItem, ReviewMode, ReviewSource } from '../../types';\nimport {\n getReviewPresenceColor,\n getReviewPresenceDisplayName,\n getReviewPresenceSessionId,\n} from '../presence/presence';\nimport { normalizeTarget } from '../route';\nimport type {\n ReviewPresenceAdapter,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewShellViewportPreset,\n} from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface UseReviewPresenceOptions {\n activeRoute: string;\n mode: ReviewMode;\n presence?: ReviewPresenceAdapter;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n selectedNumberedItem?: NumberedReviewItem;\n size: ReviewShellViewportPreset;\n source: ReviewSource;\n}\n\nconst getPresenceUserTarget = (\n user: ReviewPresenceUser,\n reviewPathPrefix: string\n) => normalizeTarget(user.target || user.routeKey, reviewPathPrefix);\n\nconst dedupePresenceUsersByPageAndId = (\n users: ReviewPresenceUser[],\n reviewPathPrefix: string\n) => {\n const userByPageAndId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const userId = user.userId.trim();\n if (!userId) return;\n\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const key = `${userTarget}::${userId}`;\n const currentUser = userByPageAndId.get(key);\n\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userByPageAndId.set(key, user);\n }\n });\n\n return Array.from(userByPageAndId.values());\n};\n\nexport const useReviewPresence = ({\n activeRoute,\n mode,\n presence,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n selectedNumberedItem,\n size,\n source,\n}: UseReviewPresenceOptions) => {\n const presenceSessionRef = useRef<ReviewPresenceSession | null>(null);\n const [presenceUsers, setPresenceUsers] = useState<ReviewPresenceUser[]>([]);\n const [presenceSessionVersion, setPresenceSessionVersion] = useState(0);\n const presenceSessionId = useMemo(getReviewPresenceSessionId, []);\n const normalizedReviewUserId = reviewUserId.trim();\n const presenceDisplayName = getReviewPresenceDisplayName(\n normalizedReviewUserId\n );\n const presenceColor = getReviewPresenceColor(\n normalizedReviewUserId || presenceSessionId\n );\n const presenceViewport = useMemo(\n () => ({\n label: size.label,\n width: size.width,\n height: size.height,\n kind: getViewportPresetKind(size),\n }),\n [size]\n );\n const presenceStatus: ReviewPresenceStatus =\n mode === 'idle' ? 'reviewing' : 'editing';\n const visiblePresenceUsers = useMemo(\n () => {\n const projectPresenceUsers = presenceUsers.filter(\n (user) => user.projectId === projectId && user.userId.trim()\n );\n\n return dedupePresenceUsersByPageAndId(\n projectPresenceUsers,\n reviewPathPrefix\n );\n },\n [presenceUsers, projectId, reviewPathPrefix]\n );\n const currentPagePresenceUsers = useMemo(\n () =>\n visiblePresenceUsers.filter((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n\n return userTarget === activeRoute;\n }),\n [activeRoute, reviewPathPrefix, visiblePresenceUsers]\n );\n const pagePresenceUsers = useMemo(() => {\n const usersByTarget = new Map<string, ReviewPresenceUser[]>();\n\n visiblePresenceUsers.forEach((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const pageUsers = usersByTarget.get(userTarget) ?? [];\n\n pageUsers.push(user);\n usersByTarget.set(userTarget, pageUsers);\n });\n\n return usersByTarget;\n }, [reviewPathPrefix, visiblePresenceUsers]);\n\n const getCurrentPresenceState = useCallback(\n (): ReviewPresenceState => ({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n routeKey: activeRoute,\n target: activeRoute,\n source,\n viewport: presenceViewport,\n mode,\n selectedItemId: selectedNumberedItem?.item.id ?? null,\n selectedReviewNumber: selectedNumberedItem?.number ?? null,\n status: presenceStatus,\n updatedAt: new Date().toISOString(),\n }),\n [\n activeRoute,\n mode,\n normalizedReviewUserId,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n presenceStatus,\n presenceViewport,\n projectId,\n selectedNumberedItem,\n source,\n ]\n );\n const getCurrentPresenceStateRef = useRef(getCurrentPresenceState);\n getCurrentPresenceStateRef.current = getCurrentPresenceState;\n\n useEffect(() => {\n if (!presence || !normalizedReviewUserId) {\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n return undefined;\n }\n\n let isActive = true;\n let unsubscribe: (() => void) | undefined;\n const initialState = getCurrentPresenceStateRef.current();\n\n void Promise.resolve(\n presence.connect({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n initialState,\n })\n ).then((session) => {\n if (!isActive) {\n void session.disconnect();\n return;\n }\n\n presenceSessionRef.current = session;\n unsubscribe = session.subscribe(setPresenceUsers);\n setPresenceSessionVersion((current) => current + 1);\n void session.update(initialState);\n }).catch(() => {\n if (!isActive) return;\n\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n });\n\n return () => {\n isActive = false;\n unsubscribe?.();\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n };\n }, [\n normalizedReviewUserId,\n presence,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n projectId,\n ]);\n\n useEffect(() => {\n const session = presenceSessionRef.current;\n if (!session || !normalizedReviewUserId) return;\n\n void session.update(getCurrentPresenceState());\n }, [\n getCurrentPresenceState,\n normalizedReviewUserId,\n presenceSessionVersion,\n ]);\n\n return {\n currentPagePresenceUsers,\n pagePresenceUsers,\n presenceSessionId,\n };\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from '../types';\n\nconst REVIEW_PRESENCE_SESSION_KEY = 'df-review-presence-session-id';\nconst DEFAULT_LOCAL_PRESENCE_CHANNEL = 'df-review-kit:presence';\nconst DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS = 5000;\nconst DEFAULT_LOCAL_PRESENCE_STALE_MS = 16000;\nconst PRESENCE_COLORS = [\n '#7cc7ff',\n '#63d7c7',\n '#f3b75f',\n '#c99cff',\n '#ff8f61',\n '#9cc76b',\n '#f278a6',\n '#79a7ff',\n];\n\ntype LocalPresenceMessage =\n | {\n type: 'request';\n sessionId: string;\n }\n | {\n type: 'update';\n sessionId: string;\n user: ReviewPresenceUser;\n }\n | {\n type: 'leave';\n sessionId: string;\n };\n\nexport type LocalPresenceAdapterOptions = {\n channelName?: string;\n heartbeatMs?: number;\n staleMs?: number;\n};\n\nconst createId = () => {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nconst hashString = (value: string) => {\n let hash = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(index);\n hash |= 0;\n }\n\n return Math.abs(hash);\n};\n\nexport const getReviewPresenceColor = (value: string) =>\n PRESENCE_COLORS[hashString(value || 'anonymous') % PRESENCE_COLORS.length];\n\nexport const getReviewPresenceDisplayName = (userId: string) =>\n userId.trim() || 'anonymous';\n\nexport const getReviewPresenceSessionId = () => {\n if (typeof window === 'undefined') return createId();\n\n try {\n const stored = window.sessionStorage.getItem(REVIEW_PRESENCE_SESSION_KEY);\n if (stored) return stored;\n\n const nextId = createId();\n window.sessionStorage.setItem(REVIEW_PRESENCE_SESSION_KEY, nextId);\n return nextId;\n } catch {\n return createId();\n }\n};\n\nconst getTimestamp = () => new Date().toISOString();\n\nconst normalizePresenceUser = (\n state: ReviewPresenceState\n): ReviewPresenceUser => ({\n ...state,\n displayName: getReviewPresenceDisplayName(state.displayName || state.userId),\n updatedAt: state.updatedAt || getTimestamp(),\n});\n\nexport const createLocalPresenceAdapter = (\n options: LocalPresenceAdapterOptions = {}\n): ReviewPresenceAdapter => ({\n label: 'local-presence',\n connect: (context: ReviewPresenceContext) => {\n const heartbeatMs =\n options.heartbeatMs ?? DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS;\n const staleMs = options.staleMs ?? DEFAULT_LOCAL_PRESENCE_STALE_MS;\n const users = new Map<string, ReviewPresenceUser>();\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentUser = normalizePresenceUser({\n ...context.initialState,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n\n const Channel =\n typeof BroadcastChannel === 'undefined' ? undefined : BroadcastChannel;\n const channel = Channel\n ? new Channel(options.channelName ?? DEFAULT_LOCAL_PRESENCE_CHANNEL)\n : null;\n\n const getUsers = () => {\n const now = Date.now();\n\n users.forEach((user, sessionId) => {\n if (now - Date.parse(user.updatedAt) > staleMs) {\n users.delete(sessionId);\n }\n });\n\n return Array.from(users.values()).sort((a, b) => {\n if (a.sessionId === context.sessionId) return -1;\n if (b.sessionId === context.sessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n };\n\n const emit = () => {\n const nextUsers = getUsers();\n listeners.forEach((listener) => listener(nextUsers));\n };\n\n const post = (message: LocalPresenceMessage) => {\n try {\n channel?.postMessage(message);\n } catch {\n return;\n }\n };\n\n const publish = () => {\n post({\n type: 'update',\n sessionId: context.sessionId,\n user: currentUser,\n });\n };\n\n if (channel) {\n channel.onmessage = (event: MessageEvent<LocalPresenceMessage>) => {\n const message = event.data;\n if (!message || message.sessionId === context.sessionId) return;\n\n if (message.type === 'request') {\n publish();\n return;\n }\n\n if (message.type === 'leave') {\n users.delete(message.sessionId);\n emit();\n return;\n }\n\n if (message.type === 'update' && message.user) {\n users.set(message.sessionId, normalizePresenceUser(message.user));\n emit();\n }\n };\n }\n\n const intervalId =\n typeof window === 'undefined'\n ? undefined\n : window.setInterval(() => {\n currentUser = {\n ...currentUser,\n updatedAt: getTimestamp(),\n };\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n }, heartbeatMs);\n\n emit();\n publish();\n post({\n type: 'request',\n sessionId: context.sessionId,\n });\n\n return {\n update: (state) => {\n currentUser = normalizePresenceUser({\n ...currentUser,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: () => {\n if (intervalId) {\n window.clearInterval(intervalId);\n }\n post({\n type: 'leave',\n sessionId: context.sessionId,\n });\n channel?.close();\n listeners.clear();\n users.clear();\n },\n };\n },\n});\n\nexport const createFallbackPresenceAdapter = (\n primaryAdapter: ReviewPresenceAdapter,\n fallbackAdapter: ReviewPresenceAdapter\n): ReviewPresenceAdapter => ({\n label: `${primaryAdapter.label}-with-${fallbackAdapter.label}-fallback`,\n connect: async (context: ReviewPresenceContext) => {\n try {\n return await primaryAdapter.connect(context);\n } catch (error) {\n if (typeof console !== 'undefined') {\n console.warn(\n `[df-review-kit] ${primaryAdapter.label} failed. Falling back to ${fallbackAdapter.label}.`,\n error\n );\n }\n return fallbackAdapter.connect(context);\n }\n },\n});\n","import {\n useCallback,\n useEffect,\n useState,\n type RefObject,\n} from 'react';\nimport type { ReviewRulerConfig } from '../../types';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { useReviewRulerDrag } from './use.review.ruler.drag';\n\ninterface UseReviewRulerOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n ruler?: ReviewRulerConfig;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onCancelReviewMode: () => void;\n onCloseTransientPanels: () => void;\n}\n\nexport const useReviewRuler = ({\n iframeRef,\n ruler,\n size,\n targetSrc,\n onCancelReviewMode,\n onCloseTransientPanels,\n}: UseReviewRulerOptions) => {\n const [isRulerVisible, setIsRulerVisible] = useState(false);\n const isRulerAvailable =\n ruler?.enabled !== false &&\n typeof size.designWidth === 'number' &&\n size.designWidth > 0;\n const rulerUnit = ruler?.unit ?? 'px';\n const rulerScaleX =\n isRulerAvailable && size.designWidth ? size.width / size.designWidth : 1;\n const rulerScaleY =\n size.designHeight && size.designHeight > 0\n ? size.height / size.designHeight\n : rulerScaleX;\n const {\n clearRulerMeasure,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerOverlayRef,\n } = useReviewRulerDrag({\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n size,\n targetSrc,\n });\n const rulerMeasureLabel = rulerMeasure\n ? `${Math.round(rulerMeasure.width / rulerScaleX)} × ${Math.round(\n rulerMeasure.height / rulerScaleY\n )} ${rulerUnit}`\n : '';\n\n const closeRuler = useCallback(() => {\n if (!isRulerVisible) return false;\n\n setIsRulerVisible(false);\n clearRulerMeasure();\n return true;\n }, [clearRulerMeasure, isRulerVisible]);\n\n const toggleRuler = useCallback(() => {\n if (!isRulerAvailable) return;\n\n onCancelReviewMode();\n onCloseTransientPanels();\n clearRulerMeasure();\n setIsRulerVisible((current) => !current);\n }, [\n clearRulerMeasure,\n isRulerAvailable,\n onCancelReviewMode,\n onCloseTransientPanels,\n ]);\n\n useEffect(() => {\n if (!isRulerVisible || isRulerAvailable) return;\n closeRuler();\n }, [closeRuler, isRulerAvailable, isRulerVisible]);\n\n return {\n closeRuler,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n toggleRuler,\n };\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from 'react';\nimport { getRulerMeasure, getRulerPointFromRect } from '../ruler/ruler';\nimport type { ReviewRulerPoint, ReviewShellViewportPreset } from '../types';\n\ninterface UseReviewRulerDragOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n}\n\nexport const useReviewRulerDrag = ({\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n size,\n targetSrc,\n}: UseReviewRulerDragOptions) => {\n const rulerOverlayRef = useRef<HTMLDivElement | null>(null);\n const rulerDragRectRef = useRef<DOMRect | null>(null);\n const isRulerDraggingRef = useRef(false);\n const sizeRef = useRef(size);\n const [rulerStart, setRulerStart] = useState<ReviewRulerPoint | null>(null);\n const [rulerPoint, setRulerPoint] = useState<ReviewRulerPoint | null>(null);\n const [rulerHover, setRulerHover] = useState<ReviewRulerPoint | null>(null);\n const [isRulerDragging, setIsRulerDragging] = useState(false);\n\n const rulerMeasure = useMemo(\n () => getRulerMeasure(rulerStart, rulerPoint),\n [rulerPoint, rulerStart]\n );\n\n const clearRulerMeasure = useCallback(() => {\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setRulerStart(null);\n setRulerPoint(null);\n setRulerHover(null);\n setIsRulerDragging(false);\n }, []);\n\n const finishRulerDrag = useCallback((point?: ReviewRulerPoint) => {\n if (point) {\n setRulerPoint(point);\n }\n\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setIsRulerDragging(false);\n }, []);\n\n const startRulerDrag = useCallback(\n (clientX: number, clientY: number, rect: DOMRect) => {\n const point = getRulerPointFromRect(clientX, clientY, rect);\n\n rulerDragRectRef.current = rect;\n isRulerDraggingRef.current = true;\n\n setRulerStart(point);\n setRulerPoint(point);\n setIsRulerDragging(true);\n },\n []\n );\n\n useEffect(() => {\n sizeRef.current = size;\n }, [size]);\n\n useEffect(() => {\n if (!isRulerVisible || !isRulerAvailable) return undefined;\n\n const getRulerEventClientPoint = (event: MouseEvent) => {\n const frame = iframeRef.current;\n let isFrameEvent = false;\n\n try {\n isFrameEvent =\n Boolean(frame?.contentWindow) && event.view === frame?.contentWindow;\n\n if (!isFrameEvent && frame?.contentDocument) {\n const targetDocument = (\n event.target as { ownerDocument?: Document } | null\n )?.ownerDocument;\n isFrameEvent = targetDocument === frame.contentDocument;\n }\n } catch {\n isFrameEvent = false;\n }\n\n if (isFrameEvent && frame) {\n const frameRect = frame.getBoundingClientRect();\n\n return {\n clientX: event.clientX + frameRect.left,\n clientY: event.clientY + frameRect.top,\n };\n }\n\n return {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n };\n\n const snapDesign = (screen: number, axis: 'x' | 'y') => {\n const current = sizeRef.current;\n const scaleX = current.designWidth\n ? current.width / current.designWidth\n : 1;\n const scale =\n axis === 'y'\n ? current.designHeight\n ? current.height / current.designHeight\n : scaleX\n : scaleX;\n return Math.round(Math.round(screen / scale) * scale);\n };\n\n const getActiveRulerPoint = (event: MouseEvent) => {\n const rect =\n rulerDragRectRef.current ??\n rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return undefined;\n\n const point = getRulerEventClientPoint(event);\n const snapped = getRulerPointFromRect(point.clientX, point.clientY, rect);\n\n return { x: snapDesign(snapped.x, 'x'), y: snapDesign(snapped.y, 'y') };\n };\n\n const getHoverRulerPoint = (event: MouseEvent) => {\n const rect = rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return null;\n\n const { clientX, clientY } = getRulerEventClientPoint(event);\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n if (x < 0 || y < 0 || x > rect.width || y > rect.height) return null;\n\n return { x: snapDesign(x, 'x'), y: snapDesign(y, 'y') };\n };\n\n const handleDragStart: EventListener = (event) => {\n if (isRulerDraggingRef.current) return;\n\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.button !== 0) return;\n\n const overlay = rulerOverlayRef.current;\n const target = mouseEvent.target;\n if (!overlay || !(target instanceof Node) || !overlay.contains(target)) {\n return;\n }\n\n event.preventDefault();\n startRulerDrag(\n mouseEvent.clientX,\n mouseEvent.clientY,\n overlay.getBoundingClientRect()\n );\n };\n\n const handlePointerMove: EventListener = (event) => {\n const mouseEvent = event as MouseEvent;\n\n if (isRulerDraggingRef.current) {\n const point = getActiveRulerPoint(mouseEvent);\n if (!point) return;\n\n mouseEvent.preventDefault();\n setRulerPoint(point);\n setRulerHover(point);\n return;\n }\n\n setRulerHover(getHoverRulerPoint(mouseEvent));\n };\n\n const handleDragEnd: EventListener = (event) => {\n if (!isRulerDraggingRef.current) return;\n\n const point = getActiveRulerPoint(event as MouseEvent);\n event.preventDefault();\n finishRulerDrag(point);\n };\n\n const handleWindowBlur = () => {\n if (!isRulerDraggingRef.current) return;\n\n finishRulerDrag();\n };\n\n const dragTargets = new Set<EventTarget>([window]);\n const frame = iframeRef.current;\n\n try {\n if (frame?.contentWindow) dragTargets.add(frame.contentWindow);\n if (frame?.contentDocument) dragTargets.add(frame.contentDocument);\n } catch {\n // Cross-origin frames cannot expose their document. Parent listeners still run.\n }\n\n dragTargets.forEach((target) => {\n target.addEventListener('mousedown', handleDragStart, true);\n target.addEventListener('mousemove', handlePointerMove, true);\n target.addEventListener('mouseup', handleDragEnd, true);\n });\n\n window.addEventListener('blur', handleWindowBlur);\n\n return () => {\n dragTargets.forEach((target) => {\n target.removeEventListener('mousedown', handleDragStart, true);\n target.removeEventListener('mousemove', handlePointerMove, true);\n target.removeEventListener('mouseup', handleDragEnd, true);\n });\n window.removeEventListener('blur', handleWindowBlur);\n };\n }, [\n finishRulerDrag,\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n startRulerDrag,\n ]);\n\n useEffect(() => {\n clearRulerMeasure();\n }, [clearRulerMeasure, size.height, size.width, targetSrc]);\n\n return {\n clearRulerMeasure,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerOverlayRef,\n };\n};\n","import type { ReviewRulerMeasure, ReviewRulerPoint } from '../types';\n\nexport const getRulerPointFromRect = (\n clientX: number,\n clientY: number,\n rect: DOMRect\n): ReviewRulerPoint => {\n const x = Math.min(Math.max(clientX - rect.left, 0), rect.width);\n const y = Math.min(Math.max(clientY - rect.top, 0), rect.height);\n\n return {\n x: Math.round(x),\n y: Math.round(y)\n };\n};\n\nexport const getRulerMeasure = (\n start: ReviewRulerPoint | null,\n end: ReviewRulerPoint | null\n): ReviewRulerMeasure | undefined => {\n if (!start || !end) return undefined;\n\n return {\n left: Math.min(start.x, end.x),\n top: Math.min(start.y, end.y),\n width: Math.abs(end.x - start.x),\n height: Math.abs(end.y - start.y)\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { DEFAULT_REVIEW_THEME } from '../constants';\nimport {\n getStoredFigmaToken,\n getStoredReviewTheme,\n getStoredReviewUserId,\n getSystemReviewTheme,\n normalizeReviewTheme,\n writeStoredFigmaToken,\n writeStoredReviewTheme,\n writeStoredReviewUserId,\n} from '../settings';\nimport type { ReviewShellTheme } from '../types';\n\ninterface UseReviewSettingsOptions {\n onCancelReviewMode: () => void | boolean;\n onCloseInitialPrompt: () => void;\n onCloseSitemap: () => void;\n onReloadTargetFrame: () => void;\n}\n\nexport const useReviewSettings = ({\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n onReloadTargetFrame,\n}: UseReviewSettingsOptions) => {\n const [figmaTokenDraft, setFigmaTokenDraft] = useState(getStoredFigmaToken);\n const [reviewUserId, setReviewUserId] = useState(getStoredReviewUserId);\n const [reviewUserIdDraft, setReviewUserIdDraft] = useState(\n getStoredReviewUserId\n );\n const [reviewTheme, setReviewTheme] = useState(getStoredReviewTheme);\n const [reviewThemeDraft, setReviewThemeDraft] =\n useState(getStoredReviewTheme);\n const [systemReviewTheme, setSystemReviewTheme] =\n useState(getSystemReviewTheme);\n const [figmaSettingsStatus, setFigmaSettingsStatus] = useState('');\n const [isFigmaSettingsOpen, setIsFigmaSettingsOpen] = useState(false);\n const [isFigmaTokenVisible, setIsFigmaTokenVisible] = useState(false);\n const [isFigmaTokenGuideOpen, setIsFigmaTokenGuideOpen] = useState(false);\n const effectiveReviewTheme =\n reviewTheme === 'system' ? systemReviewTheme : reviewTheme;\n\n const closeFigmaSettings = useCallback(() => {\n setIsFigmaSettingsOpen(false);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n }, []);\n\n const openFigmaSettings = useCallback(() => {\n onCancelReviewMode();\n onCloseSitemap();\n onCloseInitialPrompt();\n setFigmaTokenDraft(getStoredFigmaToken());\n setReviewUserIdDraft(getStoredReviewUserId());\n setReviewThemeDraft(reviewTheme);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n setIsFigmaSettingsOpen(true);\n }, [\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n reviewTheme,\n ]);\n\n const saveReviewSettings = useCallback(\n (token: string, userId: string, theme: ReviewShellTheme) => {\n const nextToken = token.trim();\n const nextUserId = userId.trim();\n const nextTheme = normalizeReviewTheme(theme);\n const shouldReload =\n nextToken !== getStoredFigmaToken() ||\n nextUserId !== getStoredReviewUserId();\n\n writeStoredFigmaToken(nextToken);\n writeStoredReviewUserId(nextUserId);\n writeStoredReviewTheme(nextTheme);\n setFigmaTokenDraft(nextToken);\n setReviewUserId(nextUserId);\n setReviewUserIdDraft(nextUserId);\n setReviewTheme(nextTheme);\n setReviewThemeDraft(nextTheme);\n setFigmaSettingsStatus(\n nextToken || nextUserId || nextTheme !== DEFAULT_REVIEW_THEME\n ? 'Saved'\n : 'Cleared'\n );\n\n if (shouldReload) {\n onReloadTargetFrame();\n }\n closeFigmaSettings();\n },\n [closeFigmaSettings, onReloadTargetFrame]\n );\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return undefined;\n\n const query = window.matchMedia('(prefers-color-scheme: light)');\n const syncSystemTheme = () => {\n setSystemReviewTheme(query.matches ? 'light' : 'dark');\n };\n\n syncSystemTheme();\n\n if (query.addEventListener) {\n query.addEventListener('change', syncSystemTheme);\n return () => query.removeEventListener('change', syncSystemTheme);\n }\n\n query.addListener(syncSystemTheme);\n return () => query.removeListener(syncSystemTheme);\n }, []);\n\n useEffect(() => {\n document.body.classList.toggle(\n 'df-review-theme-light',\n effectiveReviewTheme === 'light'\n );\n document.body.classList.toggle(\n 'df-review-theme-dark',\n effectiveReviewTheme === 'dark'\n );\n\n return () => {\n document.body.classList.remove(\n 'df-review-theme-light',\n 'df-review-theme-dark'\n );\n };\n }, [effectiveReviewTheme]);\n\n return {\n closeFigmaSettings,\n effectiveReviewTheme,\n figmaSettingsStatus,\n figmaTokenDraft,\n isFigmaSettingsOpen,\n isFigmaTokenGuideOpen,\n isFigmaTokenVisible,\n openFigmaSettings,\n reviewThemeDraft,\n reviewUserId,\n reviewUserIdDraft,\n saveReviewSettings,\n setFigmaSettingsStatus,\n setFigmaTokenDraft,\n setIsFigmaTokenGuideOpen,\n setIsFigmaTokenVisible,\n setReviewThemeDraft,\n setReviewUserIdDraft,\n };\n};\n","import { useCallback, useMemo, useState } from 'react';\nimport {\n getNumberedReviewItems,\n} from '../../core/review/scope';\nimport type {\n ReviewItem,\n ReviewViewportPreset,\n} from '../../types';\nimport {\n buildTargetSrc,\n getItemTarget,\n normalizeTarget,\n} from '../route';\nimport type {\n ReviewQaFilter,\n ReviewShellPage,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n} from '../types';\nimport {\n findViewportPreset,\n getViewportPresetKind,\n} from '../viewport';\nimport type { SitemapQaCount } from '../sitemap/tree';\n\nexport type SitemapItemsBySource = {\n local: ReviewItem[];\n remote: ReviewItem[];\n};\n\ninterface UseReviewShellDataOptions {\n activeRoute: string;\n pages: ReviewShellPage[];\n reviewPathPrefix: string;\n reviewViewportPresets: ReviewViewportPreset[];\n selectedItemId: string | null;\n size: ReviewShellViewportPreset;\n target: string;\n viewportPresets: ReviewShellViewportPreset[];\n}\n\nconst createEmptySitemapQaCount = (): SitemapQaCount => ({\n local: 0,\n remote: 0,\n});\n\nexport const useReviewShellData = ({\n activeRoute,\n pages,\n reviewPathPrefix,\n reviewViewportPresets,\n selectedItemId,\n size,\n target,\n viewportPresets,\n}: UseReviewShellDataOptions) => {\n const [items, setItems] = useState<ReviewItem[]>([]);\n const [hiddenOverlayItemIds, setHiddenOverlayItemIds] = useState<Set<string>>(\n () => new Set()\n );\n const [qaFilter, setQaFilter] = useState<ReviewQaFilter>('all');\n const [sitemapItems, setSitemapItems] = useState<SitemapItemsBySource>(() => ({\n local: [],\n remote: [],\n }));\n\n const targetSrc = useMemo(() => buildTargetSrc(target), [target]);\n const pageTargets = useMemo(\n () =>\n new Set(\n pages.map((page) => normalizeTarget(page.href, reviewPathPrefix))\n ),\n [pages, reviewPathPrefix]\n );\n const activeItems = useMemo(\n () =>\n items\n .filter((item) => getItemTarget(item, reviewPathPrefix) === activeRoute)\n .sort((a, b) => b.createdAt.localeCompare(a.createdAt)),\n [activeRoute, items, reviewPathPrefix]\n );\n const numberedActiveItems = useMemo(\n () => getNumberedReviewItems(activeItems, reviewViewportPresets),\n [activeItems, reviewViewportPresets]\n );\n const filteredNumberedActiveItems = useMemo(\n () =>\n qaFilter === 'all'\n ? numberedActiveItems\n : numberedActiveItems.filter(\n (numberedItem) => numberedItem.scope === qaFilter\n ),\n [numberedActiveItems, qaFilter]\n );\n const hiddenOverlayItemIdList = useMemo(\n () => Array.from(hiddenOverlayItemIds),\n [hiddenOverlayItemIds]\n );\n const qaFilterCounts = useMemo(() => {\n const counts = new Map<ReviewQaFilter, number>();\n counts.set('all', numberedActiveItems.length);\n numberedActiveItems.forEach((numberedItem) => {\n counts.set(numberedItem.scope, (counts.get(numberedItem.scope) ?? 0) + 1);\n });\n return counts;\n }, [numberedActiveItems]);\n const getItemPresetScope = useCallback(\n (item: ReviewItem) =>\n getViewportPresetKind(\n findViewportPreset(\n viewportPresets,\n item.viewport?.width ?? 0,\n item.viewport?.height ?? 0\n )\n ),\n [viewportPresets]\n );\n const presetScopeCounts = useMemo(() => {\n const counts = new Map<ReviewShellViewportKind, number>();\n activeItems.forEach((item) => {\n const scope = getItemPresetScope(item);\n counts.set(scope, (counts.get(scope) ?? 0) + 1);\n });\n return counts;\n }, [activeItems, getItemPresetScope]);\n const currentPresetScope = getViewportPresetKind(size);\n const pageQaCounts = useMemo(() => {\n const counts = new Map<string, SitemapQaCount>();\n const addItems = (\n sourceKey: keyof SitemapItemsBySource,\n sourceItems: ReviewItem[]\n ) => {\n sourceItems.forEach((item) => {\n const pageTarget = normalizeTarget(\n getItemTarget(item, reviewPathPrefix),\n reviewPathPrefix\n );\n const count = counts.get(pageTarget) ?? createEmptySitemapQaCount();\n count[sourceKey] += 1;\n counts.set(pageTarget, count);\n });\n };\n\n addItems('local', sitemapItems.local);\n addItems('remote', sitemapItems.remote);\n\n return counts;\n }, [reviewPathPrefix, sitemapItems]);\n const selectedNumberedItem = useMemo(\n () =>\n selectedItemId\n ? numberedActiveItems.find(\n (numberedItem) => numberedItem.item.id === selectedItemId\n )\n : undefined,\n [numberedActiveItems, selectedItemId]\n );\n\n return {\n activeItems,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIds,\n pageQaCounts,\n pageTargets,\n presetScopeCounts,\n qaFilter,\n qaFilterCounts,\n selectedNumberedItem,\n setHiddenOverlayItemIds,\n setItems,\n setQaFilter,\n setSitemapItems,\n targetSrc,\n };\n};\n","import { useEffect } from 'react';\nimport type { ReviewMode } from '../../types';\nimport { isEditableEventTarget } from '../target/target';\nimport type { TargetOverlayKey } from '../types';\n\ninterface UseReviewShellHotkeysOptions {\n isFigmaSettingsOpen: boolean;\n isInitialPromptOpen: boolean;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n isSitemapOpen: boolean;\n mode: ReviewMode;\n onCancelReviewMode: () => boolean;\n onCloseFigmaSettings: () => void;\n onCloseInitialPrompt: () => void;\n onCloseRuler: () => boolean;\n onCloseSitemap: () => void;\n onSetReviewMode: (mode: ReviewMode) => void;\n onToggleRuler: () => void;\n onToggleTargetOverlay: (overlay: TargetOverlayKey) => void;\n}\n\nexport const useReviewShellHotkeys = ({\n isFigmaSettingsOpen,\n isInitialPromptOpen,\n isRulerAvailable,\n isRulerVisible,\n isSitemapOpen,\n mode,\n onCancelReviewMode,\n onCloseFigmaSettings,\n onCloseInitialPrompt,\n onCloseRuler,\n onCloseSitemap,\n onSetReviewMode,\n onToggleRuler,\n onToggleTargetOverlay,\n}: UseReviewShellHotkeysOptions) => {\n useEffect(() => {\n if (\n mode === 'idle' &&\n !isRulerVisible &&\n !isInitialPromptOpen &&\n !isSitemapOpen &&\n !isFigmaSettingsOpen\n ) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n\n if (mode !== 'idle' && onCancelReviewMode()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (onCloseRuler()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isInitialPromptOpen) {\n onCloseInitialPrompt();\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isSitemapOpen) {\n onCloseSitemap();\n return;\n }\n\n if (isFigmaSettingsOpen) {\n onCloseFigmaSettings();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [\n isFigmaSettingsOpen,\n isInitialPromptOpen,\n isRulerVisible,\n isSitemapOpen,\n mode,\n onCancelReviewMode,\n onCloseFigmaSettings,\n onCloseInitialPrompt,\n onCloseRuler,\n onCloseSitemap,\n ]);\n\n useEffect(() => {\n const handleHotkey = (event: KeyboardEvent) => {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {\n return;\n }\n if (isEditableEventTarget(event)) return;\n\n const actions: Record<string, () => void> = {\n r: () => {\n if (isRulerAvailable) onToggleRuler();\n },\n g: () => onToggleTargetOverlay('grid'),\n f: () => onToggleTargetOverlay('figma'),\n n: () => onSetReviewMode('note'),\n e: () => onSetReviewMode('element'),\n a: () => onSetReviewMode('area'),\n };\n const action = actions[event.key.toLowerCase()];\n if (!action) return;\n\n event.preventDefault();\n action();\n };\n\n window.addEventListener('keydown', handleHotkey);\n return () => window.removeEventListener('keydown', handleHotkey);\n }, [\n isRulerAvailable,\n onSetReviewMode,\n onToggleRuler,\n onToggleTargetOverlay,\n ]);\n};\n","import {\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewMode,\n ReviewSource,\n WebReviewKitController,\n} from '../../types';\nimport { normalizeReviewShellAdapters } from '../adapters';\nimport {\n getInitialItemId,\n getInitialSource,\n getInitialTarget,\n} from '../route';\nimport type {\n ReviewShellAdapters,\n ReviewShellViewportPreset,\n TargetOverlayState,\n} from '../types';\nimport {\n DEFAULT_REVIEW_VIEWPORT_PRESETS,\n getInitialSize,\n getIsFigmaOverlayAvailable,\n toReviewViewportPresets,\n} from '../viewport';\n\ninterface UseReviewShellStateOptions {\n adapters: ReviewShellAdapters;\n presets: ReviewShellViewportPreset[];\n reviewPathPrefix: string;\n}\n\nexport const useReviewShellState = ({\n adapters,\n presets,\n reviewPathPrefix,\n}: UseReviewShellStateOptions) => {\n const viewportPresets =\n presets.length > 0 ? presets : DEFAULT_REVIEW_VIEWPORT_PRESETS;\n const reviewViewportPresets = useMemo(\n () => toReviewViewportPresets(viewportPresets),\n [viewportPresets]\n );\n const normalizedAdapters = useMemo(\n () => normalizeReviewShellAdapters(adapters),\n [adapters]\n );\n const localAdapterEntry = normalizedAdapters.local;\n const remoteAdapterEntry = normalizedAdapters.remote;\n const sourceEntries = normalizedAdapters.sources;\n const defaultSource = sourceEntries[0]?.label ?? 'local';\n const [source, setSource] = useState<ReviewSource>(() => {\n const initialSource = getInitialSource(remoteAdapterEntry?.label);\n return sourceEntries.some((entry) => entry.label === initialSource)\n ? initialSource\n : defaultSource;\n });\n const remoteSource = remoteAdapterEntry?.label ?? null;\n const activeAdapterEntry =\n sourceEntries.find((entry) => entry.label === source) ?? sourceEntries[0]!;\n const isRemoteSource = Boolean(\n remoteSource && activeAdapterEntry.label === remoteSource\n );\n const showSourceSelect = sourceEntries.length > 1;\n const canWriteArea = activeAdapterEntry.writeModes.includes('area');\n const canWriteDom = activeAdapterEntry.writeModes.includes('dom');\n const adapter = activeAdapterEntry.adapter;\n\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const frameScrollRef = useRef<HTMLDivElement | null>(null);\n const controllerRef = useRef<WebReviewKitController | null>(null);\n const cleanupTargetRef = useRef<(() => void) | null>(null);\n const pendingRestoreRef = useRef<ReviewItem | null>(null);\n const pendingInitialItemIdRef = useRef(getInitialItemId());\n const selectedItemIdRef = useRef(getInitialItemId());\n const hiddenOverlayItemIdListRef = useRef<string[]>([]);\n const [target, setTarget] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [draftTarget, setDraftTarget] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [activeRoute, setActiveRoute] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [size, setSize] = useState<ReviewShellViewportPreset>(() =>\n getInitialSize(viewportPresets)\n );\n const [mode, setMode] = useState<ReviewMode>('idle');\n const [targetOverlayState, setTargetOverlayState] =\n useState<TargetOverlayState>({\n grid: false,\n figma: false,\n });\n const [selectedItemId, setSelectedItemId] = useState(getInitialItemId());\n const [isListVisible, setIsListVisible] = useState(true);\n const [isSitemapOpen, setIsSitemapOpen] = useState(false);\n const [isInitialPromptOpen, setIsInitialPromptOpen] = useState(false);\n const [copyLabel, setCopyLabel] = useState('Copy URL');\n const [toastMessage, setToastMessage] = useState('');\n const [copiedPromptKey, setCopiedPromptKey] = useState<string | null>(null);\n const targetRef = useRef(target);\n const sizeRef = useRef(size);\n const isFigmaOverlayAvailable = getIsFigmaOverlayAvailable(size);\n\n return {\n activeAdapterEntry,\n activeRoute,\n adapter,\n canWriteArea,\n canWriteDom,\n cleanupTargetRef,\n controllerRef,\n copiedPromptKey,\n copyLabel,\n draftTarget,\n frameScrollRef,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n isInitialPromptOpen,\n isListVisible,\n isRemoteSource,\n isSitemapOpen,\n localAdapterEntry,\n mode,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n remoteAdapterEntry,\n reviewViewportPresets,\n selectedItemId,\n selectedItemIdRef,\n setActiveRoute,\n setCopiedPromptKey,\n setCopyLabel,\n setDraftTarget,\n setIsInitialPromptOpen,\n setIsListVisible,\n setIsSitemapOpen,\n setMode,\n setSelectedItemId,\n setSize,\n setSource,\n setTarget,\n setTargetOverlayState,\n showSourceSelect,\n size,\n sizeRef,\n source,\n sourceEntries,\n target,\n targetOverlayState,\n targetRef,\n toastMessage,\n viewportPresets,\n setToastMessage,\n };\n};\n","import { REVIEW_WORKFLOW_STATUS_OPTIONS } from '../status';\nimport type {\n ReviewItem,\n ReviewSource,\n WebReviewKitAdapter,\n} from '../types';\nimport type {\n ReviewShellAdapter,\n ReviewShellAdapterMap,\n ReviewShellAdapters,\n ReviewShellStatusOption,\n ReviewShellSyncSubmissionInput,\n ReviewShellUpdateStatusInput,\n ReviewShellWriteMode,\n} from './types';\n\nconst ALL_REVIEW_WRITE_MODES: ReviewShellWriteMode[] = ['dom', 'note', 'area'];\n\nexport type NormalizedReviewShellAdapter = {\n label: ReviewSource;\n adapter: WebReviewKitAdapter;\n statusOptions: ReviewShellStatusOption[];\n updateStatus?: (input: ReviewShellUpdateStatusInput) => Promise<unknown>;\n syncSubmission?: (input: ReviewShellSyncSubmissionInput) => Promise<unknown>;\n writeModes: ReviewShellWriteMode[];\n canUpdate: boolean;\n canRemove: boolean;\n pageId?: string;\n};\n\nexport type NormalizedReviewShellAdapters = {\n local: NormalizedReviewShellAdapter | null;\n remote: NormalizedReviewShellAdapter | null;\n sources: NormalizedReviewShellAdapter[];\n};\n\nexport function normalizeReviewShellAdapters(\n adapters: ReviewShellAdapters\n): NormalizedReviewShellAdapters {\n if (Array.isArray(adapters)) {\n const normalized = adapters.map((adapter) => normalizeShellAdapter(adapter));\n const local = normalized.find((adapter) => adapter.label === 'local') ?? null;\n const remote =\n normalized.find((adapter) => adapter.label !== 'local') ?? null;\n\n if (normalized.length === 0 || (!local && !remote)) {\n throw new Error('ReviewShell requires at least one adapter.');\n }\n\n return {\n local,\n remote,\n sources: normalized,\n };\n }\n\n return normalizeLegacyAdapterMap(adapters);\n}\n\nfunction normalizeLegacyAdapterMap(\n adapters: ReviewShellAdapterMap\n): NormalizedReviewShellAdapters {\n const local = {\n label: 'local',\n adapter: adapters.local,\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n updateStatus: ({ id, status }) => adapters.local.update(id, { status }),\n syncSubmission: ({ id, patch }) => adapters.local.update(id, patch),\n writeModes: [...ALL_REVIEW_WRITE_MODES],\n canUpdate: true,\n canRemove: true,\n } satisfies NormalizedReviewShellAdapter;\n const remote = adapters.remote\n ? ({\n label: 'remote',\n adapter: adapters.remote,\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n updateStatus: ({ id, status }) =>\n adapters.remote?.update(id, { status }) ??\n Promise.reject(new Error('Remote adapter is not available.')),\n writeModes: [],\n canUpdate: true,\n canRemove: false,\n pageId: adapters.remotePageId,\n } satisfies NormalizedReviewShellAdapter)\n : null;\n\n return {\n local,\n remote,\n sources: remote ? [local, remote] : [local],\n };\n}\n\nfunction normalizeShellAdapter(\n adapterConfig: ReviewShellAdapter\n): NormalizedReviewShellAdapter {\n const statusOptions = [\n ...(adapterConfig.statusOptions ?? REVIEW_WORKFLOW_STATUS_OPTIONS),\n ];\n const updateAdapter = adapterConfig.update;\n const updateStatus: NormalizedReviewShellAdapter['updateStatus'] =\n adapterConfig.updateStatus\n ? adapterConfig.updateStatus\n : updateAdapter\n ? ({ id, status }) => updateAdapter(id, { status })\n : undefined;\n const writeModes = normalizeWriteModes(\n adapterConfig.create\n ? adapterConfig.canWrite ?? adapterConfig.label === 'local'\n : false\n );\n\n return {\n label: adapterConfig.label,\n pageId: adapterConfig.pageId,\n statusOptions,\n updateStatus,\n syncSubmission: adapterConfig.syncSubmission,\n writeModes,\n canUpdate: Boolean(updateAdapter),\n canRemove: Boolean(adapterConfig.remove),\n adapter: {\n get: adapterConfig.get,\n list: adapterConfig.list,\n create: async (item) => {\n if (!adapterConfig.create) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support create.`\n );\n }\n return adapterConfig.create(item);\n },\n update: async (id, patch) => {\n const nextStatus = patch.status;\n if (nextStatus && updateStatus) {\n const statusIndex = statusOptions.findIndex(\n (statusOption) => statusOption.value === nextStatus\n );\n const statusOption = statusOptions[statusIndex];\n\n if (statusOption) {\n const item = await adapterConfig.get(id);\n if (!item) throw new Error(`Review item not found: ${id}`);\n\n const updated = await updateStatus({\n id,\n item,\n status: nextStatus,\n statusOption,\n statusIndex,\n });\n return updated as ReviewItem;\n }\n }\n\n if (updateAdapter) {\n return updateAdapter(id, patch);\n }\n\n if (!adapterConfig.syncSubmission) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support update.`\n );\n }\n\n const item = await adapterConfig.get(id);\n if (!item) throw new Error(`Review item not found: ${id}`);\n\n await adapterConfig.syncSubmission({\n id,\n item,\n patch,\n });\n const updated = await adapterConfig.get(id);\n if (!updated) throw new Error(`Review item not found after update: ${id}`);\n return updated;\n },\n remove: async (id) => {\n if (!adapterConfig.remove) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support remove.`\n );\n }\n\n return adapterConfig.remove(id);\n },\n },\n };\n}\n\nfunction normalizeWriteModes(\n value: boolean | readonly ReviewShellWriteMode[] | undefined\n): ReviewShellWriteMode[] {\n if (value === true) return [...ALL_REVIEW_WRITE_MODES];\n if (Array.isArray(value)) {\n const modes = value.filter((mode) =>\n ALL_REVIEW_WRITE_MODES.includes(mode)\n );\n return Array.from(new Set(modes));\n }\n return [];\n}\n","import type {\n Dispatch,\n MutableRefObject,\n SetStateAction,\n} from 'react';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewSource,\n WebReviewKitAdapter,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { updateShellUrl } from '../route';\nimport type { ReviewShellViewportPreset } from '../types';\nimport type { SitemapItemsBySource } from '../hooks/use.review.shell.data';\n\ninterface ListReviewItemsOptions {\n activeRoute: string;\n adapter: WebReviewKitAdapter;\n isRemoteSource: boolean;\n pageId?: string;\n projectId: string;\n}\n\ninterface ListSitemapReviewItemsOptions {\n localAdapterEntry: NormalizedReviewShellAdapter | null;\n projectId: string;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n}\n\ninterface CopyCurrentReviewUrlOptions {\n onCopyLabelChange: Dispatch<SetStateAction<string>>;\n}\n\ninterface RefreshReviewItemsOptions extends ListReviewItemsOptions {\n onItemsChange: (items: ReviewItem[]) => void;\n}\n\ninterface RefreshSitemapReviewItemsOptions\n extends ListSitemapReviewItemsOptions {\n onSitemapItemsChange: (items: SitemapItemsBySource) => void;\n}\n\ninterface RefreshReviewDataOptions {\n onRefreshItems: () => Promise<ReviewItem[]>;\n onRefreshSitemapItems: () => Promise<void>;\n onReloadReviewKit: () => Promise<void>;\n}\n\ninterface UpdateReviewItemStatusOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n item: ReviewItem;\n nextStatus: ReviewItemStatus;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface UpdateReviewItemCommentOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n item: ReviewItem;\n comment: string;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface SubmitReviewItemOptions {\n localAdapterEntry: NormalizedReviewShellAdapter | null;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n selectedItemIdRef: MutableRefObject<string | null>;\n onClearSelectedItem: () => void;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface CopyReviewPromptOptions {\n key: string;\n toastMessage?: string;\n value: string;\n onCopiedPromptKeyChange: Dispatch<SetStateAction<string | null>>;\n onToast?: (message: string) => void;\n}\n\ninterface RemoveReviewItemOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n isRemoteSource: boolean;\n item: ReviewItem;\n selectedItemIdRef: MutableRefObject<string | null>;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n targetRef: MutableRefObject<string>;\n onClearSelectedItem: () => void;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\nconst writeClipboardText = async (value: string) => {\n try {\n await navigator.clipboard.writeText(value);\n return;\n } catch {\n const selection = document.getSelection();\n const activeElement = document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n const ranges = selection\n ? Array.from({ length: selection.rangeCount }, (_, index) =>\n selection.getRangeAt(index)\n )\n : [];\n const textarea = document.createElement('textarea');\n textarea.value = value;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '0';\n\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n const isCopied = document.execCommand('copy');\n textarea.remove();\n\n selection?.removeAllRanges();\n ranges.forEach((range) => selection?.addRange(range));\n activeElement?.focus();\n\n if (!isCopied) {\n throw new Error('Failed to copy to clipboard');\n }\n }\n};\n\nexport const listReviewItems = async ({\n activeRoute,\n adapter,\n isRemoteSource,\n pageId,\n projectId,\n}: ListReviewItemsOptions) =>\n adapter.list({\n projectId,\n pageId,\n routeKey: isRemoteSource ? activeRoute : undefined,\n });\n\nexport const listSitemapReviewItems = async ({\n localAdapterEntry,\n projectId,\n remoteAdapterEntry,\n}: ListSitemapReviewItemsOptions): Promise<SitemapItemsBySource> => {\n const [localResult, remoteResult] = await Promise.allSettled([\n localAdapterEntry\n ? localAdapterEntry.adapter.list({\n projectId,\n pageId: localAdapterEntry.pageId,\n })\n : Promise.resolve([]),\n remoteAdapterEntry\n ? remoteAdapterEntry.adapter.list({\n projectId,\n pageId: remoteAdapterEntry.pageId,\n source: remoteAdapterEntry.label,\n })\n : Promise.resolve([]),\n ]);\n\n return {\n local: localResult.status === 'fulfilled' ? localResult.value : [],\n remote: remoteResult.status === 'fulfilled' ? remoteResult.value : [],\n };\n};\n\nexport const refreshReviewItems = async ({\n onItemsChange,\n ...listOptions\n}: RefreshReviewItemsOptions) => {\n const nextItems = await listReviewItems(listOptions);\n onItemsChange(nextItems);\n return nextItems;\n};\n\nexport const refreshSitemapReviewItems = async ({\n onSitemapItemsChange,\n ...listOptions\n}: RefreshSitemapReviewItemsOptions) => {\n const sitemapItems = await listSitemapReviewItems(listOptions);\n onSitemapItemsChange(sitemapItems);\n};\n\nexport const copyCurrentReviewUrl = async ({\n onCopyLabelChange,\n}: CopyCurrentReviewUrlOptions) => {\n await writeClipboardText(window.location.href);\n onCopyLabelChange('Copied');\n window.setTimeout(() => onCopyLabelChange('Copy URL'), 1200);\n};\n\nexport const refreshReviewData = async ({\n onRefreshItems,\n onRefreshSitemapItems,\n onReloadReviewKit,\n}: RefreshReviewDataOptions) => {\n await onReloadReviewKit();\n await Promise.all([onRefreshItems(), onRefreshSitemapItems()]);\n};\n\nexport const updateReviewItemStatus = async ({\n activeAdapterEntry,\n item,\n nextStatus,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemStatusOptions) => {\n if (!activeAdapterEntry.updateStatus) return;\n\n const statusIndex = activeAdapterEntry.statusOptions.findIndex(\n (statusOption) => statusOption.value === nextStatus\n );\n const statusOption = activeAdapterEntry.statusOptions[statusIndex];\n if (!statusOption) return;\n\n await activeAdapterEntry.updateStatus({\n id: item.id,\n item,\n status: statusOption.value,\n statusOption,\n statusIndex,\n });\n await onRefreshReviewData();\n onToast?.('QA status updated');\n};\n\nexport const updateReviewItemComment = async ({\n activeAdapterEntry,\n item,\n comment,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemCommentOptions) => {\n const nextComment = comment.trim();\n if (!nextComment) throw new Error('Comment is required.');\n if (!activeAdapterEntry.canUpdate) {\n throw new Error(\n `Review adapter \"${activeAdapterEntry.label}\" does not support edit.`\n );\n }\n\n if (nextComment === item.comment.trim()) {\n onToast?.('No QA comment changes');\n return item;\n }\n\n const updated = await activeAdapterEntry.adapter.update(item.id, {\n comment: nextComment,\n });\n await onRefreshReviewData();\n onToast?.('QA comment updated');\n return updated;\n};\n\nexport const submitReviewItem = async ({\n localAdapterEntry,\n numberedItem,\n remoteAdapterEntry,\n selectedItemIdRef,\n onClearSelectedItem,\n onRefreshReviewData,\n onToast,\n}: SubmitReviewItemOptions) => {\n const { item } = numberedItem;\n const syncLocalSubmission = localAdapterEntry?.syncSubmission;\n if (\n !remoteAdapterEntry ||\n !localAdapterEntry ||\n !syncLocalSubmission ||\n item.submitStatus === 'submitted'\n ) {\n return;\n }\n\n await syncLocalSubmission({\n id: item.id,\n item,\n patch: {\n submitStatus: 'submitting',\n submitError: undefined,\n },\n });\n await onRefreshReviewData();\n\n let toastMessage: string;\n try {\n await remoteAdapterEntry.adapter.create({\n ...item,\n reviewNumber: undefined,\n externalIssueId: undefined,\n externalIssueUrl: undefined,\n submittedAt: undefined,\n submitStatus: 'submitted',\n submitError: undefined,\n });\n await localAdapterEntry.adapter.remove(item.id);\n if (selectedItemIdRef.current === item.id) {\n onClearSelectedItem();\n }\n toastMessage = 'Remote submitted';\n } catch (error) {\n await syncLocalSubmission({\n id: item.id,\n item,\n patch: {\n submitStatus: 'failed',\n submitError:\n error instanceof Error ? error.message : 'Failed to submit remote',\n },\n });\n toastMessage = 'Remote submit failed';\n }\n\n await onRefreshReviewData();\n onToast?.(toastMessage);\n};\n\nexport const copyReviewPrompt = async ({\n key,\n toastMessage = 'Copied',\n value,\n onCopiedPromptKeyChange,\n onToast,\n}: CopyReviewPromptOptions) => {\n if (!value) return;\n\n await writeClipboardText(value);\n onCopiedPromptKeyChange(key);\n onToast?.(toastMessage);\n window.setTimeout(() => {\n onCopiedPromptKeyChange((current) => (current === key ? null : current));\n }, 1200);\n};\n\nexport const removeReviewItem = async ({\n activeAdapterEntry,\n isRemoteSource,\n item,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n onClearSelectedItem,\n onRefreshReviewData,\n onToast,\n}: RemoveReviewItemOptions) => {\n if (\n !activeAdapterEntry.canRemove ||\n item.submitStatus === 'submitting' ||\n (!isRemoteSource && item.submitStatus === 'submitted')\n ) {\n return;\n }\n\n await activeAdapterEntry.adapter.remove(item.id);\n if (selectedItemIdRef.current === item.id) {\n onClearSelectedItem();\n updateShellUrl(targetRef.current, sizeRef.current, source);\n }\n await onRefreshReviewData();\n onToast?.('QA deleted');\n};\n","import type { CreateReviewPagesOptions, ReviewShellGlobEntries, ReviewShellPage } from './types';\n\nconst escapeRegExp = (value: string) =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst normalizePageHref = (value: string) => {\n const href = value || '/';\n return href.startsWith('/') ? href : `/${href}`;\n};\n\nconst sortReviewPages = (a: ReviewShellPage, b: ReviewShellPage) => {\n if (a.href === '/') return -1;\n if (b.href === '/') return 1;\n return a.href.localeCompare(b.href);\n};\n\nexport const createReviewPagesFromGlob = (\n entries: ReviewShellGlobEntries,\n options: CreateReviewPagesOptions = {}\n): ReviewShellPage[] => {\n const root = options.root ?? '/page';\n const rootPattern = root ? new RegExp(`^${escapeRegExp(root)}`) : null;\n\n return Object.keys(entries)\n .map((key) => {\n const withoutRoot = rootPattern ? key.replace(rootPattern, '') : key;\n const href = withoutRoot.replace(/index\\.(tsx|ts|jsx|js)$/, '');\n return normalizePageHref(href === '' ? '/' : href);\n })\n .filter((href) => !options.exclude?.(href))\n .sort((a, b) => sortReviewPages({ href: a }, { href: b }))\n .map((href) => ({ href }));\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from '../types';\n\ntype SupabaseRealtimeStatus =\n | 'SUBSCRIBED'\n | 'CHANNEL_ERROR'\n | 'TIMED_OUT'\n | 'CLOSED'\n | string;\n\ntype SupabaseRealtimeChannel = {\n topic?: string;\n on: (\n type: 'presence',\n filter: { event: 'sync' | 'join' | 'leave' },\n callback: () => void\n ) => SupabaseRealtimeChannel;\n subscribe: (\n callback: (status: SupabaseRealtimeStatus, error?: Error) => void\n ) => SupabaseRealtimeChannel;\n track: (payload: ReviewPresenceUser) => Promise<unknown>;\n untrack: () => Promise<unknown>;\n presenceState: () => Record<string, unknown[]>;\n teardown?: () => void;\n};\n\nexport type SupabasePresenceClient = {\n channel: (\n topic: string,\n options?: {\n config?: {\n private?: boolean;\n presence?: {\n key?: string;\n };\n };\n }\n ) => SupabaseRealtimeChannel;\n getChannels?: () => SupabaseRealtimeChannel[];\n removeChannel: (channel: SupabaseRealtimeChannel) => Promise<unknown>;\n};\n\nexport type SupabasePresenceAdapterOptions = {\n client: SupabasePresenceClient;\n channelPrefix?: string;\n private?: boolean;\n};\n\nconst normalizeTopicPart = (value: string) =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'default';\n\nconst getPresenceTopic = (channelPrefix: string, projectId: string) =>\n `${normalizeTopicPart(channelPrefix)}-${normalizeTopicPart(projectId)}`;\n\nconst PRESENCE_BRIDGE_KEY = '__dfReviewPresenceBridge';\n\ntype SupabasePresenceBridge = {\n channel: SupabaseRealtimeChannel;\n emit: () => void;\n getUsers: () => ReviewPresenceUser[];\n listeners: Set<() => void>;\n ready: Promise<void>;\n refCount: number;\n};\n\ntype SupabasePresenceBridgeChannel = SupabaseRealtimeChannel & {\n [PRESENCE_BRIDGE_KEY]?: SupabasePresenceBridge;\n};\n\nconst isReviewPresenceUser = (value: unknown): value is ReviewPresenceUser => {\n if (!value || typeof value !== 'object') return false;\n\n const candidate = value as Partial<ReviewPresenceUser>;\n return (\n typeof candidate.projectId === 'string' &&\n typeof candidate.sessionId === 'string' &&\n typeof candidate.userId === 'string' &&\n typeof candidate.updatedAt === 'string'\n );\n};\n\nconst flattenPresenceState = (\n state: Record<string, unknown[]>\n): ReviewPresenceUser[] =>\n Object.values(state).flat().filter(isReviewPresenceUser);\n\nconst dedupePresenceUsers = (users: ReviewPresenceUser[]) => {\n const userBySessionId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const currentUser = userBySessionId.get(user.sessionId);\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userBySessionId.set(user.sessionId, user);\n }\n });\n\n return Array.from(userBySessionId.values());\n};\n\nconst sortPresenceUsers = (\n users: ReviewPresenceUser[],\n selfSessionId: string\n) =>\n users.sort((a, b) => {\n if (a.sessionId === selfSessionId) return -1;\n if (b.sessionId === selfSessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n\nconst subscribeChannel = (channel: SupabaseRealtimeChannel) =>\n new Promise<void>((resolve, reject) => {\n channel.subscribe((status, error) => {\n if (status === 'SUBSCRIBED') {\n resolve();\n return;\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {\n reject(error ?? new Error(`Supabase presence ${status}`));\n }\n });\n });\n\nconst removeTopicChannels = async (\n client: SupabasePresenceClient,\n topic: string\n) => {\n const existingChannels = client.getChannels?.() ?? [];\n const normalizedTopic = `realtime:${topic}`;\n const topicChannels = existingChannels.filter(\n (channel) => channel.topic === topic || channel.topic === normalizedTopic\n );\n\n await Promise.allSettled(\n topicChannels.map(async (channel) => {\n const result = await client.removeChannel(channel);\n if (result !== 'ok') {\n channel.teardown?.();\n }\n })\n );\n};\n\nconst getTopicChannel = (\n client: SupabasePresenceClient,\n topic: string\n): SupabasePresenceBridgeChannel | undefined => {\n const normalizedTopic = `realtime:${topic}`;\n\n return client\n .getChannels?.()\n .find(\n (channel) =>\n channel.topic === topic || channel.topic === normalizedTopic\n ) as SupabasePresenceBridgeChannel | undefined;\n};\n\nconst createPresenceBridge = (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const channel = client.channel(topic, {\n config: {\n private: isPrivate,\n presence: {\n key: context.sessionId,\n },\n },\n }) as SupabasePresenceBridgeChannel;\n\n const bridge: SupabasePresenceBridge = {\n channel,\n listeners: new Set(),\n refCount: 0,\n getUsers: () =>\n dedupePresenceUsers(flattenPresenceState(channel.presenceState())),\n emit: () => {\n bridge.listeners.forEach((listener) => listener());\n },\n ready: Promise.resolve(),\n };\n\n channel[PRESENCE_BRIDGE_KEY] = bridge;\n channel\n .on('presence', { event: 'sync' }, bridge.emit)\n .on('presence', { event: 'join' }, bridge.emit)\n .on('presence', { event: 'leave' }, bridge.emit);\n\n bridge.ready = subscribeChannel(channel).catch((error) => {\n delete channel[PRESENCE_BRIDGE_KEY];\n throw error;\n });\n\n return bridge;\n};\n\nconst getPresenceBridge = async (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const existingChannel = getTopicChannel(client, topic);\n const existingBridge = existingChannel?.[PRESENCE_BRIDGE_KEY];\n\n if (existingBridge) return existingBridge;\n\n if (existingChannel) {\n await removeTopicChannels(client, topic);\n }\n\n return createPresenceBridge(client, topic, context, isPrivate);\n};\n\nexport const createSupabasePresenceAdapter = ({\n client,\n channelPrefix = 'review-presence',\n private: isPrivate = false,\n}: SupabasePresenceAdapterOptions): ReviewPresenceAdapter => ({\n label: 'supabase-presence',\n connect: async (context: ReviewPresenceContext) => {\n const topic = getPresenceTopic(channelPrefix, context.projectId);\n const bridge = await getPresenceBridge(client, topic, context, isPrivate);\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentState = context.initialState;\n bridge.refCount += 1;\n\n const getUsers = () =>\n sortPresenceUsers(\n [...bridge.getUsers()],\n context.sessionId\n );\n\n const emit = () => {\n const users = getUsers();\n listeners.forEach((listener) => listener(users));\n };\n\n const bridgeListener = () => emit();\n bridge.listeners.add(bridgeListener);\n\n await bridge.ready;\n await bridge.channel.track(currentState);\n bridge.emit();\n emit();\n\n return {\n update: async (state: Partial<ReviewPresenceState>) => {\n currentState = {\n ...currentState,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: new Date().toISOString(),\n };\n await bridge.channel.track(currentState);\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: async () => {\n listeners.clear();\n bridge.listeners.delete(bridgeListener);\n bridge.refCount = Math.max(0, bridge.refCount - 1);\n if (bridge.refCount > 0) return;\n\n delete (bridge.channel as SupabasePresenceBridgeChannel)[\n PRESENCE_BRIDGE_KEY\n ];\n await bridge.channel.untrack();\n await client.removeChannel(bridge.channel);\n },\n };\n },\n});\n"],"mappings":";;;;;;;;AAAA,OAAOA,YAAW;AAClB,SAAS,kBAAkB;;;ACD3B,IAAM,wBAAwB;AAEvB,SAAS,yBAAyB;AACvC,MAAI,CAAC,SAAS,eAAe,qBAAqB,GAAG;AACnD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["React","useCallback","useEffect","useRef","useState","createElement","forwardRef","createElement","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","Map","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","jsx","jsxs","jsx","jsxs","jsx","jsxs","error","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","ReviewScopeIcon","Map","useCallback","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useCallback","useEffect","useMemo","useState","useState","useMemo","useCallback","useEffect","useCallback","useEffect","useState","useCallback","useEffect","useMemo","useRef","useState","useRef","useState","useMemo","useCallback","useEffect","frame","useState","useCallback","useEffect","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useMemo","useState","useState","useMemo","useCallback","useEffect","useEffect","useMemo","useRef","useState","statusOption","item","updated","useMemo","useState","useRef","statusOption","jsx","jsxs","useRef","useState","useCallback","refreshReviewData","useEffect","target","source","toastMessage","jsx","React"]}
1
+ {"version":3,"sources":["../src/react-shell.tsx","../src/react-shell/style.ts","../src/react-shell/review/shell.tsx","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/mergeClasses.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toKebabCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toCamelCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/toPascalCase.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/defaultAttributes.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/shared/src/utils/hasA11yProp.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/context.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/Icon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/createLucideIcon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/bot.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/link-2.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/list-filter.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/map.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/maximize-2.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/monitor.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/pencil.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/rectangle-horizontal.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/refresh-cw.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/ruler.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/scan.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/settings.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/smartphone.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/square-mouse-pointer.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/sticky-note.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/upload.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/x.ts","../src/react-shell/constants.ts","../src/react-shell/route.ts","../src/react-shell/viewport.ts","../src/react-shell/prompt/prompt.ts","../src/react-shell/prompt/modal.tsx","../src/react-shell/settings.ts","../src/react-shell/review/settings.modal.tsx","../src/react-shell/sitemap/modal.tsx","../src/react-shell/sitemap/tree.ts","../src/react-shell/figma.ts","../src/react-shell/qa/item.edit.modal.tsx","../src/react-shell/qa/item.remote.actions.tsx","../src/react-shell/qa/item.status.actions.tsx","../src/react-shell/anchor.restore.ts","../src/react-shell/review/item.icons.tsx","../src/react-shell/qa/item.card.tsx","../src/react-shell/qa/panel.header.tsx","../src/react-shell/qa/panel.tsx","../src/react-shell/presence/overlay.tsx","../src/react-shell/source.open.ts","../src/react-shell/review/mode.toolbar.tsx","../src/react-shell/ruler/gutters.tsx","../src/react-shell/ruler/overlay.tsx","../src/react-shell/target/frame.tsx","../src/react-shell/topbar.tsx","../src/react-shell/hooks/use.review.controller.ts","../src/react-shell/hooks/use.review.item.restore.ts","../src/react-shell/hooks/use.review.kit.lifecycle.ts","../src/react-shell/target/target.ts","../src/react-shell/hooks/review.frame.navigation.ts","../src/react-shell/hooks/review.kit.target.ts","../src/react-shell/hooks/use.review.target.overlay.ts","../src/react-shell/hooks/use.review.target.sync.ts","../src/react-shell/hooks/use.review.presence.ts","../src/react-shell/presence/presence.ts","../src/react-shell/hooks/use.review.ruler.ts","../src/react-shell/hooks/use.review.ruler.drag.ts","../src/react-shell/ruler/ruler.ts","../src/react-shell/hooks/use.review.settings.ts","../src/react-shell/hooks/use.review.shell.data.ts","../src/react-shell/hooks/use.review.shell.hotkeys.ts","../src/react-shell/hooks/use.review.shell.state.ts","../src/react-shell/adapters.ts","../src/react-shell/review/shell.actions.ts","../src/react-shell/pages.ts","../src/react-shell/presence/supabase.ts"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ensureReviewShellStyle } from './react-shell/style';\nimport type { ReviewShellMountOptions } from './react-shell/types';\nimport { ReviewShell } from './react-shell/review/shell';\n\nexport { ReviewShell } from './react-shell/review/shell';\nexport type {\n CreateReviewPagesOptions,\n ReviewShellAdapter,\n ReviewShellAdapters,\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewSourceEditor,\n ReviewSourceInspectorOptions,\n ReviewShellGlobEntries,\n ReviewShellMountOptions,\n ReviewShellPage,\n ReviewShellProps,\n ReviewShellStatusOption,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n} from './react-shell/types';\nexport { createReviewPagesFromGlob } from './react-shell/pages';\nexport { DEFAULT_REVIEW_VIEWPORT_PRESETS } from './react-shell/viewport';\nexport {\n createFallbackPresenceAdapter,\n createLocalPresenceAdapter,\n} from './react-shell/presence/presence';\nexport type { LocalPresenceAdapterOptions } from './react-shell/presence/presence';\nexport { createSupabasePresenceAdapter } from './react-shell/presence/supabase';\nexport type {\n SupabasePresenceAdapterOptions,\n SupabasePresenceClient,\n} from './react-shell/presence/supabase';\n\nexport const mountReviewShell = (options: ReviewShellMountOptions) => {\n if (typeof document === 'undefined' || !document.head) return;\n\n const { rootId = 'root', ...shellProps } = options;\n\n ensureReviewShellStyle();\n\n const root = document.getElementById(rootId);\n if (!root) return;\n\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.margin = '0';\n\n createRoot(root).render(\n <React.StrictMode>\n <ReviewShell {...shellProps} />\n </React.StrictMode>\n );\n};\n","const REVIEW_SHELL_STYLE_ID = 'df-review-shell-style';\n\nexport function ensureReviewShellStyle() {\n if (!document.getElementById(REVIEW_SHELL_STYLE_ID)) {\n const style = document.createElement('style');\n style.id = REVIEW_SHELL_STYLE_ID;\n style.textContent = `\n\t * {\n\t box-sizing: border-box;\n\t scrollbar-color: var(--df-review-scrollbar-thumb, rgba(237, 243, 251, 0.2)) var(--df-review-scrollbar-track, rgba(237, 243, 251, 0.04));\n\t scrollbar-width: thin;\n\t }\n\n\t *::-webkit-scrollbar {\n\t width: 10px;\n\t height: 10px;\n\t }\n\n\t *::-webkit-scrollbar-track {\n\t background: var(--df-review-scrollbar-track, rgba(237, 243, 251, 0.04));\n\t }\n\n\t *::-webkit-scrollbar-thumb {\n\t border: 2px solid var(--df-review-scrollbar-border, rgba(15, 18, 24, 0.92));\n\t border-radius: var(--df-review-radius-pill);\n\t background: var(--df-review-scrollbar-thumb, rgba(237, 243, 251, 0.18));\n\t }\n\n\t *::-webkit-scrollbar-thumb:hover {\n\t background: var(--df-review-scrollbar-thumb-hover, rgba(237, 243, 251, 0.28));\n\t }\n\n\t *::-webkit-scrollbar-corner {\n\t background: transparent;\n\t }\n\n html,\n body,\n #root {\n width: 100%;\n height: 100%;\n margin: 0;\n }\n\n\t body {\n\t overflow: hidden;\n\t color-scheme: dark;\n\n\t /* df-review-token layer. Keep these names internal to review-kit. */\n\t --df-review-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n\t --df-review-font-mono: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n\t --df-review-font-size-3xs: 9px;\n\t --df-review-font-size-2xs: 10px;\n\t --df-review-font-size-xs: 11px;\n\t --df-review-font-size-sm: 12px;\n\t --df-review-font-size-md: 13px;\n\t --df-review-font-size-lg: 14px;\n\t --df-review-font-size-xl: 15px;\n\t --df-review-font-size-2xl: 18px;\n\t --df-review-font-weight-medium: 650;\n\t --df-review-font-weight-bold: 700;\n\t --df-review-font-weight-strong: 800;\n\t --df-review-font-weight-heavy: 900;\n\t --df-review-line-height-tight: 1.25;\n\t --df-review-line-height-base: 1.42;\n\t --df-review-line-height-relaxed: 1.55;\n\t --df-review-space-0: 0;\n\t --df-review-space-1: 4px;\n\t --df-review-space-1-5: 6px;\n\t --df-review-space-2: 8px;\n\t --df-review-space-2-5: 10px;\n\t --df-review-space-3: 12px;\n\t --df-review-space-3-5: 14px;\n\t --df-review-space-4: 16px;\n\t --df-review-space-5: 20px;\n\t --df-review-space-6: 24px;\n\t --df-review-space-8: 32px;\n\t --df-review-control-height-sm: 32px;\n\t --df-review-control-height-md: 34px;\n\t --df-review-control-height-lg: 38px;\n\t --df-review-radius-xs: 3px;\n\t --df-review-radius-sm: 6px;\n\t --df-review-radius-md: 8px;\n\t --df-review-radius-lg: 12px;\n\t --df-review-radius-pill: 999px;\n\t --df-review-color-canvas: #0f1218;\n\t --df-review-color-surface: #171c24;\n\t --df-review-color-panel: #131821;\n\t --df-review-color-panel-strong: #1b2430;\n\t --df-review-color-card: rgba(237, 243, 251, 0.035);\n\t --df-review-color-card-hover: rgba(237, 243, 251, 0.065);\n\t --df-review-color-control: #202938;\n\t --df-review-color-control-hover: #273345;\n\t --df-review-color-border: rgba(226, 233, 245, 0.14);\n\t --df-review-color-border-soft: rgba(226, 233, 245, 0.08);\n\t --df-review-color-text: #edf3fb;\n\t --df-review-color-text-muted: rgba(237, 243, 251, 0.58);\n\t --df-review-color-text-subtle: rgba(237, 243, 251, 0.42);\n\t --df-review-color-accent: #7cc7ff;\n\t --df-review-color-accent-contrast: #0f1218;\n\t --df-review-color-accent-soft: rgba(124, 199, 255, 0.12);\n\t --df-review-color-accent-hover: rgba(124, 199, 255, 0.2);\n\t --df-review-color-danger: #ff8f61;\n\t --df-review-color-danger-soft: rgba(255, 143, 97, 0.12);\n\t --df-review-color-purple: #b395ff;\n\t --df-review-color-purple-soft: rgba(179, 149, 255, 0.16);\n\t --df-review-color-note: #f3b75f;\n\t --df-review-color-note-soft: rgba(243, 183, 95, 0.14);\n\t --df-review-color-area: #63d7c7;\n\t --df-review-color-area-soft: rgba(99, 215, 199, 0.14);\n\t --df-review-color-side-rail: #111722;\n\t --df-review-color-mode-bar: rgba(15, 18, 24, 0.86);\n\t --df-review-color-chip: rgba(237, 243, 251, 0.06);\n\t --df-review-color-scrollbar-track: rgba(237, 243, 251, 0.04);\n\t --df-review-color-scrollbar-thumb: rgba(237, 243, 251, 0.18);\n\t --df-review-color-scrollbar-thumb-hover: rgba(237, 243, 251, 0.28);\n\t --df-review-color-scrollbar-border: rgba(15, 18, 24, 0.92);\n\t --df-review-color-backdrop: rgba(2, 6, 12, 0.62);\n\t --df-review-color-ruler-surface: transparent;\n\t --df-review-color-ruler-label: rgba(15, 18, 24, 0.9);\n\t --df-review-color-ruler-label-text: #f4efff;\n\t --df-review-color-ruler-tick-major: rgba(201, 184, 255, 0.9);\n\t --df-review-color-ruler-tick-minor: rgba(237, 243, 251, 0.2);\n\t --df-review-color-ruler-guide: rgba(255, 255, 255, 0.86);\n\t --df-review-color-ruler-measure-border: #c9b8ff;\n\t --df-review-color-ruler-measure-bg: rgba(179, 149, 255, 0.18);\n\t --df-review-color-ruler-measure-shadow: rgba(20, 12, 40, 0.52);\n\t --df-review-color-ruler-popover-border: rgba(255, 255, 255, 0.34);\n\t --df-review-color-ruler-popover-bg: rgba(15, 18, 24, 0.94);\n\t --df-review-color-ruler-popover-text: #ffffff;\n\t --df-review-color-ruler-popover-shadow: rgba(0, 0, 0, 0.42);\n\t --df-review-color-ruler-coord-bg: #d7c9ff;\n\t --df-review-color-ruler-coord-text: #14111f;\n\t --df-review-focus-ring: rgba(124, 199, 255, 0.58);\n\t --df-review-shadow-card: 0 14px 36px rgba(0, 0, 0, 0.34);\n\t --df-review-shadow-control: inset 0 1px 0 rgba(255, 255, 255, 0.04);\n\t --df-review-shadow-device: 0 24px 60px rgba(0, 0, 0, 0.38);\n\t --df-review-shadow-panel: 0 18px 48px rgba(0, 0, 0, 0.38);\n\t --df-review-shadow-modal: 0 24px 70px rgba(0, 0, 0, 0.48);\n\t --df-review-select-chevron: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d7e0ec' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\");\n\n\t /* Semantic aliases consumed by the existing shell chrome. */\n\t --df-review-bg: var(--df-review-color-canvas);\n\t --df-review-topbar: var(--df-review-color-surface);\n\t --df-review-panel: var(--df-review-color-panel);\n\t --df-review-panel-strong: var(--df-review-color-panel-strong);\n\t --df-review-card: var(--df-review-color-card);\n\t --df-review-card-hover: var(--df-review-color-card-hover);\n\t --df-review-control: var(--df-review-color-control);\n\t --df-review-control-hover: var(--df-review-color-control-hover);\n\t --df-review-line: var(--df-review-color-border);\n\t --df-review-line-soft: var(--df-review-color-border-soft);\n\t --df-review-text: var(--df-review-color-text);\n\t --df-review-muted: var(--df-review-color-text-muted);\n\t --df-review-subtle: var(--df-review-color-text-subtle);\n\t --df-review-accent: var(--df-review-color-accent);\n\t --df-review-accent-contrast: var(--df-review-color-accent-contrast);\n\t --df-review-accent-soft: var(--df-review-color-accent-soft);\n\t --df-review-accent-hover: var(--df-review-color-accent-hover);\n\t --df-review-danger: var(--df-review-color-danger);\n\t --df-review-danger-soft: var(--df-review-color-danger-soft);\n\t --df-review-purple: var(--df-review-color-purple);\n\t --df-review-purple-soft: var(--df-review-color-purple-soft);\n\t --df-review-note: var(--df-review-color-note);\n\t --df-review-note-soft: var(--df-review-color-note-soft);\n\t --df-review-area: var(--df-review-color-area);\n\t --df-review-area-soft: var(--df-review-color-area-soft);\n\t --df-review-side-rail: var(--df-review-color-side-rail);\n\t --df-review-mode-bar: var(--df-review-color-mode-bar);\n\t --df-review-chip-bg: var(--df-review-color-chip);\n\t --df-review-scrollbar-track: var(--df-review-color-scrollbar-track);\n\t --df-review-scrollbar-thumb: var(--df-review-color-scrollbar-thumb);\n\t --df-review-scrollbar-thumb-hover: var(--df-review-color-scrollbar-thumb-hover);\n\t --df-review-scrollbar-border: var(--df-review-color-scrollbar-border);\n\t background: var(--df-review-bg);\n\t color: var(--df-review-text);\n\t font-family: var(--df-review-font-sans);\n\t }\n\n\t body.df-review-theme-light {\n\t color-scheme: light;\n\t --df-review-color-canvas: #f4f6f9;\n\t --df-review-color-surface: #ffffff;\n\t --df-review-color-panel: #ffffff;\n\t --df-review-color-panel-strong: #edf1f6;\n\t --df-review-color-card: rgba(23, 32, 44, 0.035);\n\t --df-review-color-card-hover: rgba(23, 32, 44, 0.065);\n\t --df-review-color-control: #eef2f7;\n\t --df-review-color-control-hover: #e3e9f1;\n\t --df-review-color-border: rgba(16, 24, 40, 0.14);\n\t --df-review-color-border-soft: rgba(16, 24, 40, 0.08);\n\t --df-review-color-text: #17202c;\n\t --df-review-color-text-muted: rgba(23, 32, 44, 0.62);\n\t --df-review-color-text-subtle: rgba(23, 32, 44, 0.44);\n\t --df-review-color-accent: #1769aa;\n\t --df-review-color-accent-contrast: #ffffff;\n\t --df-review-color-accent-soft: rgba(23, 105, 170, 0.1);\n\t --df-review-color-accent-hover: rgba(23, 105, 170, 0.16);\n\t --df-review-color-danger: #b94418;\n\t --df-review-color-danger-soft: rgba(185, 68, 24, 0.1);\n\t --df-review-color-purple: #6543b8;\n\t --df-review-color-purple-soft: rgba(101, 67, 184, 0.12);\n\t --df-review-color-note: #a76617;\n\t --df-review-color-note-soft: rgba(167, 102, 23, 0.12);\n\t --df-review-color-area: #087f73;\n\t --df-review-color-area-soft: rgba(8, 127, 115, 0.12);\n\t --df-review-color-side-rail: #edf1f6;\n\t --df-review-color-mode-bar: rgba(255, 255, 255, 0.9);\n\t --df-review-color-chip: rgba(23, 32, 44, 0.06);\n\t --df-review-color-scrollbar-track: rgba(23, 32, 44, 0.06);\n\t --df-review-color-scrollbar-thumb: rgba(23, 32, 44, 0.24);\n\t --df-review-color-scrollbar-thumb-hover: rgba(23, 32, 44, 0.34);\n\t --df-review-color-scrollbar-border: rgba(244, 246, 249, 0.92);\n\t --df-review-color-backdrop: rgba(15, 23, 42, 0.32);\n\t --df-review-color-ruler-surface: transparent;\n\t --df-review-color-ruler-label: rgba(255, 255, 255, 0.94);\n\t --df-review-color-ruler-label-text: #3b247e;\n\t --df-review-color-ruler-tick-major: rgba(0, 95, 204, 0.92);\n\t --df-review-color-ruler-tick-minor: rgba(23, 32, 44, 0.3);\n\t --df-review-color-ruler-guide: rgba(0, 102, 255, 0.96);\n\t --df-review-color-ruler-measure-border: #0066ff;\n\t --df-review-color-ruler-measure-bg: rgba(0, 102, 255, 0.16);\n\t --df-review-color-ruler-measure-shadow: rgba(0, 43, 120, 0.56);\n\t --df-review-color-ruler-popover-border: rgba(255, 255, 255, 0.34);\n\t --df-review-color-ruler-popover-bg: rgba(15, 18, 24, 0.94);\n\t --df-review-color-ruler-popover-text: #ffffff;\n\t --df-review-color-ruler-popover-shadow: rgba(0, 0, 0, 0.42);\n\t --df-review-color-ruler-coord-bg: #005be8;\n\t --df-review-color-ruler-coord-text: #ffffff;\n\t --df-review-focus-ring: rgba(23, 105, 170, 0.42);\n\t --df-review-shadow-card: 0 14px 36px rgba(15, 23, 42, 0.14);\n\t --df-review-shadow-control: inset 0 1px 0 rgba(255, 255, 255, 0.72);\n\t --df-review-shadow-device: 0 24px 60px rgba(15, 23, 42, 0.18);\n\t --df-review-shadow-panel: 0 18px 48px rgba(15, 23, 42, 0.18);\n\t --df-review-shadow-modal: 0 24px 70px rgba(15, 23, 42, 0.2);\n\t --df-review-select-chevron: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2317202c' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\");\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 auto minmax(0, 1fr);\n width: 100%;\n height: 100%;\n overflow: hidden;\n transition: grid-template-columns 160ms ease;\n }\n\n .df-review-shell.is-list-visible {\n grid-template-columns: minmax(0, 1fr) clamp(320px, 28vw, 420px) 32px;\n }\n\n\t .df-review-topbar {\n\t grid-column: 1;\n\t grid-row: 1;\n\t position: relative;\n\t z-index: 600;\n\t display: grid;\n\t gap: var(--df-review-space-2);\n\t container-type: inline-size;\n\t min-width: 0;\n\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t border-bottom: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-topbar), var(--df-review-panel));\n\t box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.025);\n\t }\n\n .df-review-presence-row {\n grid-column: 1;\n grid-row: 2;\n position: relative;\n z-index: 590;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n min-width: 0;\n padding: var(--df-review-space-2) var(--df-review-frame-gutter-x);\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-panel);\n }\n\n\t\t .df-review-address {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(160px, 1fr) auto auto;\n\t\t align-items: stretch;\n\t\t gap: var(--df-review-space-2);\n\t\t width: 100%;\n\t\t max-width: 1440px;\n\t\t margin: 0 auto;\n\t\t }\n\n .df-review-address input {\n\t width: 100%;\n\t min-height: var(--df-review-control-height-md);\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t padding: 0 11px;\n\t color: var(--df-review-text);\n\t background: var(--df-review-bg);\n\t box-shadow: var(--df-review-shadow-control);\n\t font-size: var(--df-review-font-size-md);\n\t transition: border-color 140ms ease, box-shadow 140ms ease, background 140ms ease;\n\t }\n\n\t .df-review-address input:focus {\n\t outline: 2px solid var(--df-review-focus-ring);\n\t outline-offset: 1px;\n\t }\n\n\t\t .df-review-address button,\n\t\t .df-review-side-toggle,\n\t\t .df-review-presets button,\n\t\t .df-review-overlay-button,\n\t\t\t .df-review-mode-button,\n\t\t\t .df-review-settings-header button,\n\t\t\t .df-review-prompt-header button,\n\t\t\t .df-review-settings-actions button,\n\t\t\t .df-review-prompt-block-header button,\n\t\t\t .df-review-item-actions button {\n\t\t min-height: var(--df-review-control-height-md);\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t background: var(--df-review-control);\n\t box-shadow: var(--df-review-shadow-control);\n\t color: var(--df-review-text);\n\t font-size: var(--df-review-font-size-sm);\n\t font-weight: 700;\n\t transition: border-color 140ms ease, background 140ms ease, color 140ms ease, box-shadow 140ms ease, opacity 140ms ease;\n\t }\n\n\t\t .df-review-address button:hover,\n\t .df-review-side-toggle:hover,\n\t\t .df-review-presets button:hover,\n\t\t .df-review-overlay-button:hover,\n\t\t .df-review-mode-button:hover,\n\t\t .df-review-settings-header button:hover,\n\t\t .df-review-prompt-header button:hover,\n\t\t .df-review-settings-actions button:hover,\n\t\t .df-review-prompt-block-header button:hover,\n\t\t\t .df-review-item-actions button:hover,\n\t\t .df-review-item-visibility:hover,\n\t\t .df-review-item-link-copy:hover,\n\t\t .df-review-item-prompt-copy:hover,\n\t\t .df-review-item-delete:hover,\n\t\t .df-review-presets button.is-active,\n\t\t\t .df-review-overlay-button.is-active,\n\t\t\t .df-review-mode-button.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-control-hover);\n\t\t }\n\n\t .df-review-overlay-button.is-active,\n .df-review-mode-button.is-active {\n border-color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-sitemap-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n\t width: 38px;\n\t min-width: 38px;\n\t padding: 0;\n\t color: var(--df-review-accent);\n\t }\n\n .df-review-sitemap-button svg,\n .df-review-sitemap-header button svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.8;\n }\n\n .df-review-sitemap-modal {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: grid;\n place-items: center;\n\t\t\t\t padding: 18px;\n }\n\n\t .df-review-sitemap-backdrop {\n\t position: absolute;\n\t inset: 0;\n\t min-height: 0;\n\t border: 0;\n\t border-radius: 0;\n\t padding: 0;\n\t background: var(--df-review-color-backdrop);\n\t }\n\n .df-review-sitemap-dialog {\n position: relative;\n z-index: 1;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n\t width: min(940px, 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-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n padding: 10px 12px;\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-panel);\n }\n\n .df-review-sitemap-controls select {\n min-width: 138px;\n min-height: 32px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: 0 26px 0 10px;\n color: var(--df-review-text);\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n font-size: var(--df-review-font-size-xs);\n font-weight: 850;\n }\n\n .df-review-sitemap-list {\n --df-review-sitemap-grid-template: minmax(190px, 1fr) 74px 78px 64px minmax(108px, 160px);\n display: grid;\n align-content: start;\n min-height: 0;\n overflow: auto;\n padding: 8px;\n }\n\n .df-review-sitemap-table-head,\n .df-review-sitemap-row {\n display: grid;\n grid-template-columns: var(--df-review-sitemap-grid-template);\n align-items: center;\n column-gap: 0;\n }\n\n .df-review-sitemap-table-head {\n position: sticky;\n top: 0;\n z-index: 1;\n min-height: 32px;\n border-bottom: 1px solid var(--df-review-line);\n padding: 0 10px;\n background: var(--df-review-surface);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n font-weight: 720;\n letter-spacing: 0.03em;\n text-transform: uppercase;\n }\n\n .df-review-sitemap-sort {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n min-width: 0;\n min-height: 28px;\n border: 0;\n border-radius: 0;\n padding: 0 0 0 8px;\n color: inherit;\n background: transparent;\n box-shadow: none;\n font: inherit;\n letter-spacing: inherit;\n text-align: right;\n text-transform: inherit;\n cursor: pointer;\n }\n\n .df-review-sitemap-sort.is-page {\n justify-content: flex-start;\n padding-left: 0;\n text-align: left;\n }\n\n .df-review-sitemap-sort-indicator {\n width: 8px;\n min-width: 8px;\n color: var(--df-review-accent);\n text-align: center;\n }\n\n .df-review-sitemap-sort-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-sitemap-sort:hover,\n .df-review-sitemap-sort.is-active {\n color: var(--df-review-text);\n }\n\n .df-review-sitemap-row {\n min-height: 42px;\n border: 0;\n border-bottom: 1px solid var(--df-review-line-soft);\n border-radius: 0;\n padding: 0 10px;\n background: transparent;\n color: var(--df-review-text);\n text-align: left;\n }\n\n button.df-review-sitemap-row {\n cursor: pointer;\n }\n\n .df-review-sitemap-row.is-summary {\n position: sticky;\n bottom: 0;\n z-index: 1;\n border-top: 1px solid var(--df-review-line);\n border-bottom: 0;\n background: var(--df-review-surface);\n }\n\n .df-review-sitemap-row.is-folder {\n cursor: default;\n }\n\n .df-review-sitemap-row:last-child {\n border-bottom: 0;\n }\n\n button.df-review-sitemap-row:hover,\n .df-review-sitemap-row.is-active {\n background: var(--df-review-accent-soft);\n }\n\n .df-review-sitemap-path {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-md);\n font-weight: 650;\n line-height: 1.35;\n }\n\n .df-review-sitemap-row.is-folder .df-review-sitemap-path {\n color: var(--df-review-muted);\n }\n\n .df-review-sitemap-tree-prefix {\n flex: 0 0 auto;\n color: var(--df-review-muted);\n font-family: var(--df-review-font-mono);\n font-weight: 500;\n white-space: pre;\n }\n\n .df-review-sitemap-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .df-review-sitemap-cell {\n min-width: 0;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-sm);\n font-variant-numeric: tabular-nums;\n font-weight: 650;\n line-height: 1;\n text-align: right;\n }\n\n .df-review-sitemap-cell.is-total {\n color: var(--df-review-accent);\n font-weight: 760;\n }\n\n .df-review-sitemap-cell.is-total strong {\n font: inherit;\n }\n\n .df-review-sitemap-cell.is-online {\n display: flex;\n justify-content: flex-end;\n color: var(--df-review-text);\n }\n\n .df-review-sitemap-users {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-sitemap-user {\n --df-review-presence-color: var(--df-review-accent);\n display: inline-flex;\n align-items: center;\n min-height: 22px;\n border: 1px solid var(--df-review-presence-color);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n background: var(--df-review-chip-bg);\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .df-review-sitemap-online-empty {\n color: var(--df-review-muted);\n }\n\n button.df-review-sitemap-row:hover .df-review-sitemap-path,\n .df-review-sitemap-row.is-active .df-review-sitemap-path {\n color: var(--df-review-text);\n }\n\n\t\t .df-review-settings-modal {\n\t\t position: fixed;\n\t\t inset: 0;\n\t\t z-index: 1001;\n\t\t display: grid;\n\t\t place-items: center;\n\t\t padding: 24px;\n\t\t }\n\n\t\t .df-review-settings-backdrop {\n\t\t position: absolute;\n\t\t inset: 0;\n\t\t min-height: 0;\n\t\t border: 0;\n\t\t border-radius: 0;\n\t\t padding: 0;\n\t\t background: var(--df-review-color-backdrop);\n\t\t }\n\n\t\t .df-review-settings-dialog {\n\t\t position: relative;\n\t\t z-index: 1;\n\t\t display: grid;\n\t\t width: min(460px, calc(100vw - 48px));\n\t\t overflow: hidden;\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-lg);\n\t\t background: var(--df-review-panel);\n\t\t box-shadow: var(--df-review-shadow-modal);\n\t\t }\n\n\t\t .df-review-settings-header {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t justify-content: space-between;\n\t\t gap: 12px;\n\t\t min-height: 54px;\n\t\t padding: 0 14px 0 16px;\n\t\t border-bottom: 1px solid var(--df-review-line);\n\t\t }\n\n\t\t .df-review-settings-title {\n\t\t display: grid;\n\t\t gap: 2px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-settings-header-actions {\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t justify-content: flex-end;\n\t\t gap: 8px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-settings-header strong {\n\t\t color: var(--df-review-text);\n\t\t font-size: var(--df-review-font-size-lg);\n\t\t }\n\n\t\t .df-review-settings-header span {\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-header button {\n\t\t display: grid;\n\t\t place-items: center;\n\t\t width: 34px;\n\t\t min-width: 34px;\n\t\t padding: 0;\n\t\t font-size: var(--df-review-font-size-md);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-body {\n\t\t display: grid;\n\t\t gap: 12px;\n\t\t padding: 16px;\n\t\t }\n\n\t\t .df-review-settings-field {\n\t\t display: grid;\n\t\t gap: 7px;\n\t\t }\n\n\t\t .df-review-settings-row {\n\t\t display: grid;\n\t\t grid-template-columns: minmax(0, 1fr) auto;\n\t\t align-items: center;\n\t\t gap: 12px;\n\t\t }\n\n\t\t .df-review-settings-field span,\n\t\t .df-review-settings-row > span,\n\t\t .df-review-settings-label-row label {\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-theme-options {\n\t\t display: inline-flex;\n\t\t justify-content: flex-end;\n\t\t gap: 6px;\n\t\t min-width: 0;\n\t\t flex-wrap: wrap;\n\t\t }\n\n\t\t .df-review-settings-theme-option {\n\t\t min-height: 30px;\n\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0 10px;\n\t\t color: var(--df-review-muted);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-theme-option:hover {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-control-hover);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-settings-theme-option.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t .df-review-settings-theme-option:focus-visible {\n\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t outline-offset: 1px;\n\t\t }\n\n\t\t .df-review-settings-label-row {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t gap: 6px;\n\t\t }\n\n\t\t .df-review-settings-help-button {\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: 20px;\n\t\t min-width: 20px;\n\t\t min-height: 20px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: 50%;\n\t\t padding: 0;\n\t\t background: transparent;\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-settings-help-button:hover,\n\t\t .df-review-settings-help-button.is-active {\n\t\t border-color: var(--df-review-accent);\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t .df-review-settings-help-button svg {\n\t\t width: 13px;\n\t\t height: 13px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t stroke-width: 2.1;\n\t\t }\n\n\t\t\t .df-review-settings-token-input,\n\t\t\t .df-review-settings-text-input,\n\t\t\t .df-review-settings-select-input {\n\t\t\t display: grid;\n\t\t\t align-items: stretch;\n\t\t\t overflow: hidden;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t background: var(--df-review-bg);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input {\n\t\t\t grid-template-columns: minmax(0, 1fr) 38px;\n\t\t\t }\n\n\t\t\t .df-review-settings-text-input,\n\t\t\t .df-review-settings-select-input {\n\t\t\t grid-template-columns: minmax(0, 1fr);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input:focus-within,\n\t\t\t .df-review-settings-text-input:focus-within,\n\t\t\t .df-review-settings-select-input:focus-within {\n\t\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t\t outline-offset: 1px;\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input,\n\t\t\t .df-review-settings-text-input input,\n\t\t\t .df-review-settings-select-input select {\n\t\t\t min-width: 0;\n\t\t\t min-height: var(--df-review-control-height-lg);\n\t\t\t border: 0;\n\t\t padding: 0 10px;\n\t\t background: transparent;\n\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input:focus,\n\t\t\t .df-review-settings-text-input input:focus,\n\t\t\t .df-review-settings-select-input select:focus {\n\t\t\t outline: 0;\n\t\t\t }\n\n\t\t\t .df-review-settings-token-input input.is-token-masked {\n\t\t\t -webkit-text-security: disc;\n\t\t\t }\n\n\t\t\t .df-review-settings-select-input select {\n\t\t\t appearance: none;\n\t\t\t cursor: pointer;\n\t\t\t }\n\n\t\t .df-review-settings-token-toggle {\n\t\t display: grid;\n\t\t place-items: center;\n\t\t width: 38px;\n\t\t min-width: 38px;\n\t\t min-height: var(--df-review-control-height-lg);\n\t\t border: 0;\n\t\t border-left: 1px solid var(--df-review-line-soft);\n\t\t border-radius: 0;\n\t\t padding: 0;\n\t\t background: transparent;\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-settings-token-toggle:hover {\n\t\t background: var(--df-review-chip-bg);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-settings-token-toggle svg {\n\t\t width: 16px;\n\t\t height: 16px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t stroke-width: 2;\n\t\t }\n\n\t\t .df-review-settings-guide {\n\t\t margin-top: -2px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 9px 11px;\n\t\t background: var(--df-review-chip-bg);\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 700;\n\t\t line-height: 1.55;\n\t\t }\n\n\t\t .df-review-settings-guide ol {\n\t\t display: grid;\n\t\t gap: 3px;\n\t\t margin: 0;\n\t\t padding-left: 17px;\n\t\t }\n\n\t\t .df-review-settings-status {\n\t\t min-height: 20px;\n\t\t margin: 0;\n\t\t color: var(--df-review-accent);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-weight: 800;\n\t\t }\n\n\t\t .df-review-settings-actions {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(0, 1fr) auto auto;\n\t\t gap: 8px;\n\t\t align-items: center;\n\t\t }\n\n\t\t .df-review-settings-actions button {\n\t\t padding: 0 12px;\n\t\t }\n\n\t\t\t .df-review-settings-actions button[type='submit'] {\n\t\t\t border-color: var(--df-review-accent);\n\t\t\t background: var(--df-review-accent-soft);\n\t\t\t color: var(--df-review-accent);\n\t\t\t }\n\n .df-review-edit-modal {\n position: fixed;\n inset: 0;\n z-index: 1003;\n display: grid;\n place-items: center;\n padding: 24px;\n }\n\n .df-review-edit-dialog {\n position: relative;\n z-index: 1;\n display: grid;\n width: min(460px, calc(100vw - 48px));\n overflow: hidden;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-lg);\n background: var(--df-review-panel);\n box-shadow: var(--df-review-shadow-modal);\n }\n\n .df-review-edit-textarea {\n min-height: 160px;\n }\n\n .df-review-edit-textarea textarea {\n width: 100%;\n min-height: 160px;\n border: 0;\n padding: 10px;\n outline: 0;\n background: transparent;\n color: var(--df-review-text);\n resize: vertical;\n font-size: var(--df-review-font-size-md);\n line-height: 1.5;\n }\n\n .df-review-edit-textarea textarea:focus {\n outline: 0;\n }\n\n .df-review-edit-error {\n margin: 0;\n color: var(--df-review-danger);\n font-size: var(--df-review-font-size-sm);\n font-weight: 800;\n }\n\n .df-review-edit-actions {\n grid-template-columns: minmax(0, 1fr) auto auto;\n }\n\n\t\t\t .df-review-prompt-modal {\n\t\t\t position: fixed;\n\t\t\t inset: 0;\n\t\t\t z-index: 1002;\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t padding: 24px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-backdrop {\n\t\t\t position: absolute;\n\t\t\t inset: 0;\n\t\t\t min-height: 0;\n\t\t\t border: 0;\n\t\t\t border-radius: 0;\n\t\t\t padding: 0;\n\t\t\t background: var(--df-review-color-backdrop);\n\t\t\t }\n\n\t\t\t .df-review-prompt-dialog {\n\t\t\t position: relative;\n\t\t\t z-index: 1;\n\t\t\t display: grid;\n\t\t\t grid-template-rows: auto minmax(0, 1fr);\n\t\t\t\t width: min(1040px, calc(100vw - 36px));\n\t\t\t\t max-height: min(900px, calc(100vh - 36px));\n\t\t\t overflow: hidden;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-lg);\n\t\t\t background: var(--df-review-panel);\n\t\t\t box-shadow: var(--df-review-shadow-modal);\n\t\t\t }\n\n .df-review-copy-toast {\n position: fixed;\n right: 52px;\n bottom: 24px;\n z-index: 1003;\n max-width: min(320px, calc(100vw - 32px));\n padding: 10px 13px;\n border: 1px solid var(--df-review-accent-hover);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-panel);\n box-shadow: var(--df-review-shadow-modal);\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-sm);\n font-weight: 800;\n line-height: 1.25;\n pointer-events: none;\n }\n\n\t\t\t .df-review-prompt-header {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t justify-content: space-between;\n\t\t\t gap: 12px;\n\t\t\t min-height: 54px;\n\t\t\t padding: 0 14px 0 16px;\n\t\t\t border-bottom: 1px solid var(--df-review-line);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header div {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-lg);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header span {\n\t\t\t overflow: hidden;\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t text-overflow: ellipsis;\n\t\t\t white-space: nowrap;\n\t\t\t }\n\n\t\t\t .df-review-prompt-header button {\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t width: 34px;\n\t\t\t min-width: 34px;\n\t\t\t padding: 0;\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-body {\n\t\t\t display: grid;\n\t\t\t gap: 14px;\n\t\t\t min-height: 0;\n\t\t\t overflow: auto;\n\t\t\t padding: 16px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block {\n\t\t\t display: grid;\n\t\t\t gap: 8px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t justify-content: space-between;\n\t\t\t gap: 12px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header div {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header span {\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header button {\n\t\t\t display: inline-flex;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-height: 30px;\n\t\t\t padding: 0 10px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header button:disabled {\n\t\t\t cursor: not-allowed;\n\t\t\t opacity: 0.5;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block-header svg {\n\t\t\t width: 13px;\n\t\t\t height: 13px;\n\t\t\t fill: none;\n\t\t\t stroke: currentColor;\n\t\t\t stroke-linecap: round;\n\t\t\t stroke-linejoin: round;\n\t\t\t stroke-width: 2;\n\t\t\t }\n\n\t\t\t\t .df-review-prompt-block textarea {\n\t\t\t\t width: 100%;\n\t\t\t\t height: clamp(170px, calc(100vh - 520px), 260px);\n\t\t\t\t min-height: 170px;\n\t\t\t\t max-height: 320px;\n\t\t\t resize: vertical;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t padding: 10px;\n\t\t\t background: var(--df-review-bg);\n\t\t\t color: var(--df-review-text);\n\t\t\t font-family: var(--df-review-font-mono);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 600;\n\t\t\t line-height: 1.5;\n\t\t\t white-space: pre;\n\t\t\t }\n\n\t\t\t .df-review-prompt-block textarea:focus {\n\t\t\t outline: 2px solid var(--df-review-focus-ring);\n\t\t\t outline-offset: 1px;\n\t\t\t }\n\n\t\t\t .df-review-prompt-section-header {\n\t\t\t display: grid;\n\t\t\t gap: 2px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-section-header strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-md);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-section-header span {\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about {\n\t\t\t display: grid;\n\t\t\t gap: 10px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid {\n\t\t\t display: grid;\n\t\t\t grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n\t\t\t gap: 10px;\n\t\t\t min-width: 0;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid article {\n\t\t\t display: grid;\n\t\t\t align-content: start;\n\t\t\t gap: 6px;\n\t\t\t border: 1px solid var(--df-review-line);\n\t\t\t border-radius: var(--df-review-radius-md);\n\t\t\t padding: 12px;\n\t\t\t background: var(--df-review-surface);\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid strong {\n\t\t\t color: var(--df-review-text);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 900;\n\t\t\t }\n\n\t\t\t .df-review-prompt-about-grid p {\n\t\t\t margin: 0;\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 700;\n\t\t\t line-height: 1.55;\n\t\t\t }\n\n\t\t\t\t .df-review-tools {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t justify-content: space-between;\n\t\t gap: 12px;\n\t\t width: 100%;\n\t\t max-width: 1440px;\n\t\t min-width: 0;\n\t\t margin: 0 auto;\n\t\t }\n\n\t\t .df-review-tool-controls {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t justify-content: flex-start;\n\t\t gap: 12px;\n\t\t min-width: 0;\n\t\t flex-wrap: wrap;\n\t }\n\n\t\t .df-review-presets,\n\t\t .df-review-mode,\n\t .df-review-overlays {\n\t display: flex;\n\t align-items: center;\n\t gap: var(--df-review-space-1-5);\n\t min-height: calc(var(--df-review-control-height-lg) + 6px);\n\t padding: 3px;\n\t border: 1px solid var(--df-review-line-soft);\n\t border-radius: var(--df-review-radius-md);\n\t background: var(--df-review-card);\n\t }\n\n\t\t .df-review-tool-divider,\n\t\t .df-review-mode-divider {\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t color: var(--df-review-line);\n\t\t font-size: var(--df-review-font-size-2xl);\n\t\t font-weight: 700;\n\t line-height: 1;\n\t\t user-select: none;\n\t }\n\n\t\t .df-review-active-size {\n\t\t flex: 0 0 auto;\n\t\t display: inline-flex;\n\t\t align-items: center;\n\t\t min-height: var(--df-review-control-height-lg);\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-sm);\n\t\t font-variant-numeric: tabular-nums;\n\t font-weight: 800;\n\t line-height: 1;\n\t }\n\n\t .df-review-presets button {\n\t display: inline-flex;\n\t align-items: center;\n gap: 7px;\n min-height: var(--df-review-control-height-lg);\n padding: 0 11px 0 9px;\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-presets button svg {\n width: 16px;\n height: 16px;\n flex: 0 0 auto;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n }\n\n .df-review-preset-count {\n min-width: 16px;\n padding: 0 5px;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-line-soft);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 16px;\n text-align: center;\n }\n\n .df-review-presets button.is-active .df-review-preset-count {\n background: var(--df-review-accent-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-presets button.is-active {\n color: var(--df-review-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n }\n\n .df-review-preset-copy {\n display: grid;\n gap: 1px;\n min-width: 0;\n text-align: left;\n line-height: 1.05;\n }\n\n .df-review-preset-copy strong {\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-sm);\n }\n\n\t .df-review-overlay-button,\n\t .df-review-mode-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n\t width: 38px;\n\t min-width: 38px;\n\t padding: 0;\n\t border-color: transparent;\n\t background: transparent;\n\t box-shadow: none;\n\t color: var(--df-review-muted);\n\t }\n\n .df-review-overlay-button svg,\n .df-review-mode-button svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n\t }\n\n\n\n\n\n\n\n\t\t .df-review-overlay-button.is-settings {\n\t\t color: var(--df-review-muted);\n\t\t }\n\n\t\t .df-review-overlay-button.is-settings:hover {\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t .df-review-overlay-button.is-disabled,\n\t .df-review-overlay-button.is-disabled:hover {\n\t cursor: not-allowed;\n\t border-color: var(--df-review-line);\n\t background: var(--df-review-line-soft);\n\t color: var(--df-review-subtle);\n\t }\n\n\t @container (max-width: 1040px) {\n\t .df-review-tools {\n\t flex-direction: column;\n\t align-items: stretch;\n\t justify-content: flex-start;\n\t }\n\n\t .df-review-tool-controls {\n\t width: 100%;\n\t }\n\n\t .df-review-presets {\n\t flex-wrap: wrap;\n\t }\n\n\t .df-review-overlays {\n\t width: 100%;\n\t justify-content: flex-start;\n\t }\n\t }\n\n\t .df-review-side-rail {\n\t grid-column: 3;\n\t grid-row: 1 / span 3;\n\t position: relative;\n\t z-index: 600;\n\t display: flex;\n\t align-items: stretch;\n\t justify-content: center;\n\t min-width: 0;\n\t min-height: 0;\n\t border-left: 1px solid var(--df-review-line);\n\t background: var(--df-review-side-rail);\n\t }\n\n .df-review-side-toggle {\n display: grid;\n grid-template-rows: 28px auto;\n align-items: start;\n justify-items: center;\n gap: 8px;\n width: 100%;\n min-height: 100%;\n border: 0;\n\t border-radius: 0;\n\t padding: 10px 0;\n\t background: transparent;\n\t color: var(--df-review-muted);\n\t }\n\n\t .df-review-side-toggle:hover {\n\t background: var(--df-review-accent-soft);\n\t color: var(--df-review-text);\n\t }\n\n .df-review-side-toggle span {\n display: grid;\n place-items: center;\n\t width: 20px;\n\t height: 24px;\n\t line-height: 1;\n\t }\n\n\t .df-review-side-toggle svg {\n\t width: 18px;\n\t height: 18px;\n\t fill: none;\n\t stroke: currentColor;\n\t stroke-linecap: round;\n\t stroke-width: 2;\n\t }\n\n .df-review-side-toggle strong {\n writing-mode: vertical-rl;\n text-orientation: mixed;\n color: inherit;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n letter-spacing: 0.08em;\n }\n\n\t .df-review-qa-panel {\n\t grid-column: 2;\n\t grid-row: 1 / span 3;\n\t position: relative;\n\t z-index: 600;\n\t display: grid;\n\t grid-template-rows: minmax(0, 1fr);\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t border-left: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-panel), var(--df-review-bg));\n\t }\n\n\t .df-review-shell:not(.is-list-visible) .df-review-qa-panel {\n\t visibility: hidden;\n\t border-left: 0;\n\t }\n\n\t .df-review-panel-body {\n\t display: grid;\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t }\n\n .df-review-item-list {\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n min-width: 0;\n min-height: 0;\n }\n\n\t\t\t .df-review-list-header {\n\t\t\t display: grid;\n\t\t\t grid-template-rows: auto auto;\n\t\t\t gap: var(--df-review-space-2);\n\t\t\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t\t\t border-bottom: 1px solid var(--df-review-line-soft);\n\t\t\t background: var(--df-review-card);\n\t\t\t color: var(--df-review-muted);\n\t\t\t font-size: var(--df-review-font-size-sm);\n\t\t\t font-weight: 800;\n\t\t\t }\n\n\t\t\t .df-review-list-toolbar {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n\t\t\t .df-review-list-title {\n\t\t\t display: flex;\n\t\t\t align-items: center;\n\t\t\t gap: 8px;\n\t\t min-width: 0;\n\t\t }\n\n\t\t .df-review-list-title span {\n\t\t min-width: 0;\n\t\t overflow: hidden;\n\t\t text-overflow: ellipsis;\n\t\t white-space: nowrap;\n\t\t }\n\n\t\t .df-review-list-title strong {\n\t\t flex: 0 0 auto;\n\t\t color: var(--df-review-muted);\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-variant-numeric: tabular-nums;\n\t\t }\n\n .df-review-presence-overlay {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 5px;\n max-width: 100%;\n pointer-events: none;\n }\n\n .df-review-presence-row .df-review-presence-overlay {\n width: 100%;\n max-width: 1440px;\n margin: 0 auto;\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 min-width: 0;\n max-width: min(220px, calc(100% - 20px));\n min-height: 24px;\n border: 1px solid rgba(15, 23, 42, 0.12);\n border-radius: var(--df-review-radius-pill);\n padding: 0 8px;\n color: #17202c;\n background: rgba(255, 255, 255, 0.92);\n box-shadow: 0 8px 22px rgba(15, 23, 42, 0.14);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1.1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n backdrop-filter: blur(8px);\n }\n\n .df-review-presence-row .df-review-presence-chip {\n max-width: none;\n }\n\n .df-review-presence-chip.is-self {\n border-color: var(--df-review-presence-color);\n box-shadow:\n inset 0 0 0 1px var(--df-review-presence-color),\n 0 8px 22px rgba(15, 23, 42, 0.14);\n }\n\n .df-review-presence-more {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n min-height: 24px;\n border: 1px solid rgba(15, 23, 42, 0.12);\n border-radius: var(--df-review-radius-pill);\n padding: 0 8px;\n color: #17202c;\n background: rgba(255, 255, 255, 0.92);\n box-shadow: 0 8px 22px rgba(15, 23, 42, 0.14);\n cursor: pointer;\n font: inherit;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n pointer-events: auto;\n backdrop-filter: blur(8px);\n }\n\n .df-review-presence-more:hover {\n border-color: rgba(0, 102, 255, 0.42);\n color: #005be8;\n background: rgba(255, 255, 255, 0.98);\n }\n\n .df-review-list-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .df-review-source-select,\n .df-review-status-filter-select {\n min-height: 30px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: 0 24px 0 8px;\n color: var(--df-review-text);\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n font-size: var(--df-review-font-size-xs);\n font-weight: 800;\n }\n\n .df-review-source-select {\n width: 104px;\n }\n\n .df-review-status-filter-select {\n width: 124px;\n }\n\n .df-review-list-title .df-review-status-filter-select {\n margin-left: auto;\n }\n\n .df-review-source-refresh {\n position: relative;\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: 30px;\n\t\t min-width: 30px;\n\t\t height: 30px;\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-sm);\n\t\t padding: 0;\n\t\t color: var(--df-review-muted);\n\t\t background: var(--df-review-control);\n\t\t box-shadow: var(--df-review-shadow-control);\n\t\t }\n\n\t\t .df-review-source-refresh svg {\n\t\t width: 14px;\n\t\t height: 14px;\n\t\t }\n\n\t\t\t .df-review-filter-tabs {\n display: flex;\n align-items: center;\n gap: 2px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-card);\n box-shadow: var(--df-review-shadow-control);\n }\n\n\t\t\t\t .df-review-filter-tab {\n position: relative;\n display: grid;\n place-items: center;\n width: 26px;\n min-width: 26px;\n height: 26px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--df-review-subtle);\n }\n\n\t\t\t\t .df-review-filter-icon {\n display: grid;\n place-items: center;\n width: 100%;\n height: 100%;\n }\n\n\t\t\t\t .df-review-filter-separator {\n\t\t\t\t display: block;\n\t\t\t\t width: 18px;\n\t\t\t\t height: 1px;\n\t\t\t\t border-radius: var(--df-review-radius-pill);\n\t\t\t\t background: currentColor;\n\t\t\t\t opacity: 0.42;\n\t\t\t\t }\n\n\t\t .df-review-filter-tab:hover,\n\t\t .df-review-filter-tab.is-active {\n\t\t background: var(--df-review-accent-soft);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-filter-tab.is-active {\n\t\t box-shadow: inset 0 0 0 1px rgba(124, 199, 255, 0.42);\n\t\t color: var(--df-review-accent);\n\t\t }\n\n\t\t\t\t .df-review-filter-icon svg {\n\t\t\t\t width: 15px;\n\t\t\t\t height: 15px;\n\t\t fill: none;\n\t\t stroke: currentColor;\n\t\t stroke-linecap: round;\n\t\t stroke-linejoin: round;\n\t\t\t stroke-width: 2;\n\t\t\t }\n\n\t\t\t .df-review-filter-count {\n\t\t\t color: currentColor;\n\t\t\t font-size: var(--df-review-font-size-3xs);\n\t\t\t font-weight: 900;\n\t\t\t font-variant-numeric: tabular-nums;\n\t\t\t line-height: 1;\n\t\t\t }\n\n .df-review-list-scroll {\n display: grid;\n align-content: start;\n gap: var(--df-review-space-2);\n min-height: 0;\n overflow: auto;\n padding: var(--df-review-space-2);\n }\n\n\t .df-review-empty {\n\t margin: 0;\n\t padding: var(--df-review-space-5) var(--df-review-space-4);\n\t border: 1px dashed var(--df-review-line);\n\t border-radius: var(--df-review-radius-lg);\n\t background: var(--df-review-card);\n\t color: var(--df-review-subtle);\n\t font-size: var(--df-review-font-size-sm);\n\t line-height: 1.45;\n\t }\n\n .df-review-item-card.is-dim {\n opacity: 0.4;\n }\n\n .df-review-item-card.is-dim:hover {\n opacity: 0.72;\n }\n\n\t .df-review-item-card {\n\t\t position: relative;\n\t\t display: grid;\n\t\t gap: var(--df-review-space-2-5);\n\t\t padding: var(--df-review-space-3-5);\n\t\t border: 1px solid var(--df-review-line-soft);\n\t\t border-radius: var(--df-review-radius-lg);\n\t\t background: var(--df-review-card);\n\t\t cursor: pointer;\n\t\t transition: border-color 140ms ease, background 140ms ease, box-shadow 140ms ease, opacity 140ms ease;\n\t\t }\n\n .df-review-item-card:not(.is-dim):hover {\n border-color: var(--df-review-line);\n }\n\n .df-review-item-card.is-active {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-card);\n\t box-shadow: inset 0 0 0 1px var(--df-review-accent-hover), 0 0 0 3px rgba(124, 199, 255, 0.12);\n\t }\n\n .df-review-item-card.is-overlay-hidden .df-review-item-main {\n opacity: 0.68;\n }\n\n .df-review-item-header {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n gap: 8px;\n min-width: 0;\n }\n\n .df-review-item-main {\n display: grid;\n gap: 4px;\n min-width: 0;\n\t border: 0;\n\t padding: 0;\n\t text-align: left;\n\t background: transparent;\n\t color: var(--df-review-text);\n\t }\n\n .df-review-item-main strong {\n overflow-wrap: anywhere;\n font-size: var(--df-review-font-size-md);\n line-height: 1.35;\n }\n\n .df-review-item-comment {\n padding: 5px 0;\n white-space: pre-wrap;\n }\n\n\t .df-review-item-main small {\n\t color: var(--df-review-subtle);\n\t font-size: var(--df-review-font-size-xs);\n\t }\n\n .df-review-item-meta {\n display: block;\n overflow-wrap: anywhere;\n line-height: 1.35;\n }\n\n .df-review-item-error {\n color: var(--df-review-danger) !important;\n overflow-wrap: anywhere;\n }\n\n .df-review-item-badges {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n flex-wrap: wrap;\n }\n\n .df-review-item-id,\n .df-review-item-scope,\n .df-review-item-mode,\n .df-review-item-status-badge,\n .df-review-item-status-select {\n --df-review-scope: var(--df-review-accent);\n --df-review-scope-rgb: 124, 199, 255;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-height: 20px;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n text-transform: uppercase;\n }\n\n .df-review-item-id {\n border-color: var(--df-review-line);\n background: rgba(255, 255, 255, 0.03);\n color: var(--df-review-text);\n }\n\n .df-review-item-scope {\n border-color: rgba(var(--df-review-scope-rgb), 0.36);\n background: rgba(var(--df-review-scope-rgb), 0.12);\n color: var(--df-review-scope);\n }\n\n .df-review-item-scope.is-scope-tablet {\n --df-review-scope: var(--df-review-area);\n --df-review-scope-rgb: 99, 215, 199;\n }\n\n .df-review-item-scope.is-scope-desktop {\n --df-review-scope: var(--df-review-note);\n --df-review-scope-rgb: 243, 183, 95;\n }\n\n .df-review-item-scope.is-scope-wide {\n --df-review-scope: var(--df-review-purple);\n --df-review-scope-rgb: 201, 156, 255;\n }\n\n .df-review-item-scope.is-scope-dom {\n --df-review-scope: var(--df-review-danger);\n --df-review-scope-rgb: 255, 143, 97;\n }\n\n .df-review-item-scope svg,\n .df-review-item-mode svg {\n width: 12px;\n height: 12px;\n flex: 0 0 auto;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n\t .df-review-item-mode {\n\t color: var(--df-review-muted);\n background: var(--df-review-line-soft);\n }\n\n .df-review-item-mode.is-mode-area {\n color: var(--df-review-area);\n }\n\n .df-review-item-mode.is-mode-dom {\n color: var(--df-review-danger);\n }\n\n .df-review-item-status-badge {\n min-height: 30px;\n border-radius: var(--df-review-radius-sm);\n padding: 0 11px;\n font-size: var(--df-review-font-size-xs);\n font-weight: 750;\n text-transform: none;\n }\n\n .df-review-item-status-select {\n min-height: 30px;\n min-width: 92px;\n max-width: 118px;\n border-radius: var(--df-review-radius-sm);\n padding: 0 10px;\n cursor: pointer;\n outline: 0;\n font-size: var(--df-review-font-size-xs);\n font-weight: 750;\n text-transform: none;\n }\n\n .df-review-item-status-select:focus-visible {\n border-color: var(--df-review-accent);\n box-shadow: 0 0 0 2px var(--df-review-accent-soft);\n }\n\n .df-review-item-status-badge.is-status-todo,\n .df-review-item-status-select.is-status-todo {\n border-color: var(--df-review-line);\n color: var(--df-review-muted);\n background: var(--df-review-line-soft);\n }\n\n .df-review-item-status-badge.is-status-doing,\n .df-review-item-status-select.is-status-doing {\n border-color: rgba(124, 199, 255, 0.34);\n color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-item-status-badge.is-status-review,\n .df-review-item-status-select.is-status-review {\n border-color: rgba(243, 183, 95, 0.34);\n color: var(--df-review-note);\n background: var(--df-review-note-soft);\n }\n\n .df-review-item-status-badge.is-status-hold,\n .df-review-item-status-select.is-status-hold {\n border-color: rgba(179, 149, 255, 0.32);\n color: var(--df-review-purple);\n background: var(--df-review-purple-soft);\n }\n\n .df-review-item-status-badge.is-status-done,\n .df-review-item-status-select.is-status-done {\n border-color: rgba(99, 215, 199, 0.34);\n color: var(--df-review-area);\n background: var(--df-review-area-soft);\n }\n\n .df-review-source-select,\n .df-review-status-filter-select,\n .df-review-item-status-select,\n .df-review-item-status-select.is-status-todo,\n .df-review-item-status-select.is-status-doing,\n .df-review-item-status-select.is-status-review,\n .df-review-item-status-select.is-status-hold,\n .df-review-item-status-select.is-status-done,\n .df-review-sitemap-controls select {\n --df-review-select-padding-x: 12px;\n --df-review-select-chevron-size: 14px;\n --df-review-select-chevron-gap: 8px;\n appearance: none;\n -webkit-appearance: none;\n background-image: var(--df-review-select-chevron);\n background-repeat: no-repeat;\n background-position: right var(--df-review-select-padding-x) center;\n background-size:\n var(--df-review-select-chevron-size)\n var(--df-review-select-chevron-size);\n padding-right: calc(\n var(--df-review-select-padding-x) +\n var(--df-review-select-chevron-size) +\n var(--df-review-select-chevron-gap)\n );\n padding-left: var(--df-review-select-padding-x);\n }\n\n .df-review-item-status-badge.is-error {\n border-color: rgba(255, 143, 97, 0.36);\n color: var(--df-review-danger);\n background: var(--df-review-danger-soft);\n }\n\n\t .df-review-item-main img {\n\t width: 100%;\n\t max-height: 110px;\n\t border: 1px solid var(--df-review-line);\n\t border-radius: var(--df-review-radius-sm);\n\t object-fit: cover;\n\t background: var(--df-review-control);\n }\n\n\t .df-review-item-header-actions {\n\t display: inline-flex;\n\t align-items: center;\n\t justify-content: flex-end;\n\t gap: 2px;\n\t cursor: auto;\n\t }\n\n .df-review-item-delete,\n .df-review-item-edit,\n .df-review-item-link-copy,\n .df-review-item-prompt-copy,\n .df-review-item-visibility {\n display: inline-grid;\n place-items: center;\n width: 26px;\n height: 26px;\n border: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n text-decoration: none;\n transition: border-color 140ms ease, background 140ms ease, color 140ms ease;\n }\n\n .df-review-item-visibility:hover,\n .df-review-item-edit:hover,\n .df-review-item-link-copy:hover,\n .df-review-item-prompt-copy:hover {\n border-color: rgba(124, 199, 255, 0.34);\n color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-item-delete:hover {\n border-color: rgba(255, 143, 97, 0.34);\n color: var(--df-review-danger);\n background: var(--df-review-danger-soft);\n }\n\n .df-review-item-visibility.is-visible {\n color: var(--df-review-accent);\n }\n\n .df-review-item-visibility.is-hidden {\n opacity: 0.7;\n color: var(--df-review-subtle);\n }\n\n .df-review-item-link-copy.is-copied,\n .df-review-item-prompt-copy.is-copied {\n color: var(--df-review-accent);\n }\n\n .df-review-item-delete svg,\n .df-review-item-edit svg,\n .df-review-item-link-copy svg,\n .df-review-item-prompt-copy svg,\n .df-review-item-visibility svg {\n width: 14px;\n height: 14px;\n }\n\n\t\t\t\t .df-review-item-actions {\n\t\t\t\t display: grid;\n\t\t\t\t grid-template-columns: auto minmax(0, 1fr) auto;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-width: 0;\n\t\t\t margin-top: 2px;\n\t\t\t }\n\n\t\t\t .df-review-item-status-actions {\n\t\t\t display: inline-flex;\n\t\t\t grid-column: 1;\n\t\t\t align-items: center;\n\t\t\t min-width: 0;\n\t\t cursor: auto;\n\t\t\t }\n\n\t\t\t .df-review-item-prompt-actions {\n\t\t\t display: inline-flex;\n\t\t\t grid-column: 2;\n\t\t\t align-items: center;\n\t\t\t justify-self: end;\n\t\t\t min-width: 0;\n\t\t cursor: auto;\n\t\t\t }\n\n\t\t\t .df-review-item-remote-actions {\n\t\t\t display: inline-flex;\n\t\t\t grid-column: 3;\n\t\t\t align-items: center;\n\t\t\t justify-content: flex-end;\n\t\t\t justify-self: end;\n\t\t\t gap: 6px;\n\t\t\t min-width: 0;\n\t\t cursor: auto;\n\t\t\t }\n\n .df-review-item-action-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: 32px;\n min-width: 32px;\n height: 30px;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: var(--df-review-control);\n }\n\n\t .df-review-item-action-button:hover:not(:disabled) {\n\t border-color: rgba(124, 199, 255, 0.42);\n\t color: var(--df-review-text);\n\t background: var(--df-review-control-hover);\n\t }\n\n\t\t\t .df-review-item-actions .df-review-item-submit-button {\n\t\t\t display: inline-flex;\n\t\t\t align-items: center;\n\t\t\t gap: 6px;\n\t\t\t min-height: 30px;\n\t\t\t height: 30px;\n\t\t\t width: auto;\n\t\t\t min-width: 0;\n\t\t\t border-radius: var(--df-review-radius-sm);\n\t\t\t padding: 0 11px;\n\t\t border-color: var(--df-review-line);\n\t\t background: var(--df-review-control);\n\t\t color: var(--df-review-text);\n\t\t }\n\n\t\t .df-review-item-submit-button span {\n\t\t font-size: var(--df-review-font-size-xs);\n\t\t font-weight: 750;\n\t\t line-height: 1;\n\t\t text-transform: none;\n\t\t white-space: nowrap;\n\t\t }\n\n\t .df-review-item-actions .df-review-item-submit-button:hover:not(:disabled) {\n\t border-color: var(--df-review-accent);\n\t background: var(--df-review-accent-hover);\n\t color: var(--df-review-text);\n\t }\n\n .df-review-item-action-button:disabled {\n cursor: default;\n opacity: 0.45;\n }\n\n .df-review-item-action-button svg {\n width: 14px;\n height: 14px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n\n\t .df-review-stage {\n\t grid-column: 1;\n\t grid-row: 3;\n\t display: grid;\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: hidden;\n\t }\n\n .df-review-frame {\n display: grid;\n grid-template-rows: minmax(0, 1fr) auto;\n min-width: 0;\n min-height: 0;\n }\n\n .df-review-frame-actions {\n position: relative;\n z-index: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 56px;\n padding: 8px 40px 10px;\n border-top: 1px solid var(--df-review-line-soft);\n background: var(--df-review-mode-bar);\n }\n\n\t .df-review-frame-scroll {\n\t min-width: 0;\n\t min-height: 0;\n\t overflow: auto;\n\t }\n\n\t .df-review-frame-canvas {\n\t display: grid;\n\t place-items: center;\n\t width: max-content;\n\t height: max-content;\n\t min-width: 100%;\n\t min-height: 100%;\n\t padding: 34px 58px 12px 40px;\n\t }\n\n .df-review-target-stack {\n display: grid;\n justify-items: start;\n gap: 8px;\n width: max-content;\n max-width: 100%;\n }\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-frame-link-stack {\n position: absolute;\n z-index: 14;\n top: 0;\n right: -44px;\n display: grid;\n gap: 8px;\n }\n\n .df-review-frame-link {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n border: 1px solid rgba(15, 23, 42, 0.16);\n border-radius: var(--df-review-radius-md);\n color: #17202c;\n background: rgba(255, 255, 255, 0.92);\n box-shadow: 0 10px 26px rgba(15, 23, 42, 0.18);\n text-decoration: none;\n backdrop-filter: blur(8px);\n transition: transform 140ms ease, border-color 140ms ease, color 140ms ease,\n background 140ms ease;\n }\n\n .df-review-frame-link:hover {\n transform: translateY(-1px);\n border-color: rgba(0, 102, 255, 0.42);\n color: #005be8;\n background: rgba(255, 255, 255, 0.98);\n }\n\n .df-review-frame-link svg {\n width: 18px;\n height: 18px;\n }\n\n .df-review-frame-link.is-target svg {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n }\n\n .df-review-frame-link.is-figma svg {\n fill: currentColor;\n stroke: none;\n }\n\n .df-review-source-outline {\n position: fixed;\n z-index: 880;\n pointer-events: none;\n border: 2px solid rgba(124, 199, 255, 0.96);\n border-radius: 4px;\n box-shadow:\n 0 0 0 1px rgba(15, 18, 24, 0.58),\n 0 0 0 5px rgba(124, 199, 255, 0.16);\n }\n\n .df-review-source-outline.is-pinned {\n border-color: var(--df-review-note);\n box-shadow:\n 0 0 0 1px rgba(15, 18, 24, 0.58),\n 0 0 0 5px rgba(243, 183, 95, 0.16);\n }\n\n .df-review-source-popover {\n --df-review-source-popover-line: rgba(226, 233, 245, 0.16);\n --df-review-source-popover-text: #edf3fb;\n --df-review-source-popover-muted: rgba(237, 243, 251, 0.68);\n --df-review-source-popover-subtle: rgba(237, 243, 251, 0.5);\n --df-review-source-popover-hover: rgba(124, 199, 255, 0.14);\n position: fixed;\n z-index: 890;\n display: grid;\n width: fit-content;\n min-width: min(240px, calc(100vw - 24px));\n max-width: min(440px, calc(100vw - 24px));\n max-height: 260px;\n overflow: hidden;\n border: 1px solid var(--df-review-source-popover-line);\n border-radius: var(--df-review-radius-md);\n padding: 8px 6px 6px;\n color: var(--df-review-source-popover-text);\n color-scheme: dark;\n background: rgba(19, 24, 33, 0.96);\n box-shadow: var(--df-review-shadow-panel);\n backdrop-filter: blur(10px);\n }\n\n .df-review-source-popover-close {\n position: absolute;\n top: 5px;\n right: 5px;\n z-index: 1;\n }\n\n .df-review-source-popover-close button {\n display: 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-source-popover-subtle);\n background: transparent;\n font-size: 16px;\n font-weight: 800;\n line-height: 1;\n }\n\n .df-review-source-popover-close button:hover {\n border-color: var(--df-review-source-popover-line);\n color: var(--df-review-source-popover-text);\n background: var(--df-review-source-popover-hover);\n }\n\n .df-review-source-candidate-list {\n display: grid;\n gap: 0;\n min-height: 0;\n overflow: auto;\n }\n\n .df-review-source-candidate {\n display: grid;\n width: 100%;\n min-height: 54px;\n border: 0;\n border-radius: var(--df-review-radius-sm);\n padding: 6px 30px 6px 8px;\n color: var(--df-review-source-popover-text);\n background: transparent;\n text-align: left;\n }\n\n .df-review-source-candidate:hover {\n background: var(--df-review-source-popover-hover);\n }\n\n .df-review-source-candidate-main {\n display: grid;\n gap: 2px;\n min-width: 0;\n }\n\n .df-review-source-candidate-main strong,\n .df-review-source-candidate-main small {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-source-candidate-main strong {\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n }\n\n .df-review-source-candidate-main span {\n overflow-wrap: anywhere;\n color: var(--df-review-source-popover-muted);\n font-family: var(--df-review-font-mono);\n font-size: var(--df-review-font-size-2xs);\n line-height: 1.25;\n white-space: normal;\n }\n\n .df-review-source-candidate-main small {\n color: var(--df-review-source-popover-subtle);\n font-family: var(--df-review-font-mono);\n font-size: var(--df-review-font-size-2xs);\n }\n\n .df-review-device-frame {\n position: relative;\n box-sizing: border-box;\n flex: 0 0 auto;\n }\n\n .df-review-ruler-corner {\n position: absolute;\n left: -26px;\n top: -26px;\n width: 26px;\n height: 26px;\n z-index: 6;\n border-right: 1px solid var(--df-review-line-soft);\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-color-ruler-surface);\n }\n\n .df-review-ruler-gutter {\n position: absolute;\n z-index: 6;\n background: var(--df-review-color-ruler-surface);\n color: var(--df-review-muted);\n user-select: none;\n }\n\n .df-review-ruler-gutter.is-x {\n left: 0;\n right: 0;\n top: -26px;\n height: 26px;\n border-bottom: 1px solid var(--df-review-line-soft);\n background-image:\n linear-gradient(\n to right,\n var(--df-review-color-ruler-tick-major) 1px,\n transparent 1px\n ),\n linear-gradient(\n to right,\n var(--df-review-color-ruler-tick-minor) 1px,\n transparent 1px\n );\n background-size:\n calc(var(--df-review-ruler-step-x) * 5) 11px,\n var(--df-review-ruler-step-x) 6px;\n background-position: left bottom;\n background-repeat: repeat-x;\n }\n\n .df-review-ruler-gutter.is-y {\n left: -26px;\n top: 0;\n bottom: 0;\n width: 26px;\n border-right: 1px solid var(--df-review-line-soft);\n background-image:\n linear-gradient(\n to bottom,\n var(--df-review-color-ruler-tick-major) 1px,\n transparent 1px\n ),\n linear-gradient(\n to bottom,\n var(--df-review-color-ruler-tick-minor) 1px,\n transparent 1px\n );\n background-size:\n 11px calc(var(--df-review-ruler-step-y) * 5),\n 6px var(--df-review-ruler-step-y);\n background-position: right top;\n background-repeat: repeat-y;\n }\n\n .df-review-ruler-frame-label {\n position: absolute;\n right: 6px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border: 1px solid var(--df-review-color-ruler-popover-border);\n border-radius: var(--df-review-radius-sm);\n background: var(--df-review-color-ruler-label);\n line-height: 1;\n white-space: nowrap;\n box-shadow: 0 6px 18px var(--df-review-color-ruler-popover-shadow);\n }\n\n .df-review-ruler-frame-label strong {\n color: var(--df-review-color-ruler-label-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n }\n\n .df-review-ruler-frame-label span {\n color: var(--df-review-color-ruler-label-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n opacity: 0.78;\n }\n\n .df-review-ruler-coord {\n position: absolute;\n z-index: 7;\n padding: 4px 6px;\n border: 1px solid var(--df-review-color-ruler-popover-border);\n border-radius: var(--df-review-radius-xs);\n background: var(--df-review-color-ruler-coord-bg);\n color: var(--df-review-color-ruler-coord-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n pointer-events: none;\n box-shadow: 0 6px 18px var(--df-review-color-ruler-popover-shadow);\n }\n\n .df-review-ruler-coord.is-x {\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n .df-review-ruler-coord.is-y {\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n .df-review-ruler-overlay {\n position: absolute;\n left: 0;\n top: 0;\n width: inherit;\n height: inherit;\n z-index: 5;\n cursor: crosshair;\n overflow: hidden;\n touch-action: none;\n user-select: none;\n }\n\n .df-review-ruler-overlay.is-dragging {\n cursor: crosshair;\n }\n\n .df-review-ruler-guide {\n position: absolute;\n z-index: 2;\n pointer-events: none;\n background: var(--df-review-color-ruler-guide);\n box-shadow: 0 0 0 1px var(--df-review-color-ruler-measure-shadow);\n }\n\n .df-review-ruler-guide.is-x {\n left: 0;\n right: 0;\n height: 2px;\n }\n\n .df-review-ruler-guide.is-y {\n top: 0;\n bottom: 0;\n width: 2px;\n }\n\n .df-review-ruler-selection {\n position: absolute;\n z-index: 3;\n pointer-events: none;\n border: 3px solid var(--df-review-color-ruler-measure-border);\n background: var(--df-review-color-ruler-measure-bg);\n box-shadow:\n inset 0 0 0 1px var(--df-review-color-ruler-measure-shadow),\n 0 0 0 1px rgba(255, 255, 255, 0.96),\n 0 0 0 4px var(--df-review-color-ruler-measure-shadow);\n }\n\n .df-review-ruler-label {\n position: absolute;\n z-index: 4;\n pointer-events: none;\n min-width: 124px;\n padding: 9px 11px;\n border: 1px solid var(--df-review-color-ruler-popover-border);\n border-radius: var(--df-review-radius-md);\n background: var(--df-review-color-ruler-popover-bg);\n color: var(--df-review-color-ruler-popover-text);\n font-family: var(--df-review-font-mono);\n font-size: var(--df-review-font-size-lg);\n font-weight: 900;\n line-height: 1;\n white-space: nowrap;\n letter-spacing: -0.02em;\n text-align: center;\n box-shadow:\n 0 10px 26px var(--df-review-color-ruler-popover-shadow),\n inset 0 1px 0 rgba(255, 255, 255, 0.18);\n }\n\n\t @media (max-width: 860px) {\n\t .df-review-shell,\n\t .df-review-shell.is-list-visible {\n\t grid-template-columns: minmax(0, 1fr) 0 32px;\n\t grid-template-rows: auto auto minmax(0, 1fr);\n\t }\n\n\t .df-review-shell.is-list-visible {\n\t grid-template-columns: minmax(0, 1fr) minmax(260px, 70vw) 32px;\n\t }\n\n\t .df-review-qa-panel {\n\t border-left: 1px solid var(--df-review-line);\n\t border-bottom: 0;\n\t }\n\n\t .df-review-tools {\n\t flex-wrap: wrap;\n\t }\n\n\t .df-review-tool-controls {\n\t justify-content: flex-start;\n\t }\n\n .df-review-frame-actions {\n padding: 8px 20px 10px;\n }\n\n\t .df-review-frame-canvas {\n\t padding: 34px 28px 12px;\n\t }\n\n\t\t .df-review-prompt-modal {\n\t\t padding: 12px;\n\t\t }\n\n\t\t .df-review-prompt-dialog {\n\t\t width: calc(100vw - 24px);\n\t\t max-height: calc(100vh - 24px);\n\t\t }\n\n\t\t .df-review-prompt-block textarea {\n\t\t height: min(360px, calc(100vh - 270px));\n\t\t min-height: 240px;\n\t\t max-height: calc(100vh - 270px);\n\t\t }\n\n\t .df-review-panel-body {\n\t min-height: 0;\n\t }\n }\n `;\n document.head.append(style);\n }\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n GripVertical as GripVerticalIcon,\n} from 'lucide-react';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewMode,\n ReviewSource,\n} from '../../types';\n\nimport type {\n ReviewShellProps,\n ReviewShellWriteMode,\n} from '../types';\nimport {\n DEFAULT_INITIAL_REVIEW_PROMPT,\n} from '../constants';\nimport {\n DEFAULT_REVIEW_PATH_PREFIX,\n getItemTarget,\n getShellUrlForItem,\n normalizeTarget,\n parseReviewAddressInput,\n updateShellUrl,\n} from '../route';\nimport {\n DEFAULT_REVIEW_VIEWPORT_PRESETS,\n findViewportPreset,\n getRestoredSize,\n} from '../viewport';\nimport {\n PromptModal,\n ReviewSettingsModal,\n SitemapModal,\n} from '../shell.modals';\nimport { buildReviewItemPrompt } from '../prompt/prompt';\nimport {\n getFigmaFrameUrl,\n getTargetFigmaFrameConfig,\n type ReviewFigmaFrameConfig,\n} from '../figma';\nimport { QaItemEditModal } from '../qa/item.edit.modal';\nimport { ReviewQaPanel } from '../qa/panel';\nimport { PresenceOverlay } from '../presence/overlay';\nimport {\n getSourceCandidates,\n getSourceOpenUrl,\n openSourceInEditor,\n type SourceCandidate,\n type SourceOpenOptions,\n} from '../source.open';\nimport { ReviewTargetFrame } from '../target/frame';\nimport { ReviewTopbar } from '../topbar';\nimport { useReviewController } from '../hooks/use.review.controller';\nimport { useReviewPresence } from '../hooks/use.review.presence';\nimport { useReviewRuler } from '../hooks/use.review.ruler';\nimport { useReviewSettings } from '../hooks/use.review.settings';\nimport { useReviewShellData } from '../hooks/use.review.shell.data';\nimport { useReviewShellHotkeys } from '../hooks/use.review.shell.hotkeys';\nimport { useReviewShellState } from '../hooks/use.review.shell.state';\nimport {\n copyCurrentReviewUrl,\n copyReviewPrompt,\n removeReviewItem,\n refreshReviewItems,\n refreshSitemapReviewItems,\n refreshReviewData as refreshReviewDataAction,\n submitReviewItem,\n updateReviewItemComment,\n updateReviewItemStatus,\n} from './shell.actions';\n\nconst getReviewModeWriteMode = (\n mode: ReviewMode\n): ReviewShellWriteMode | null => {\n if (mode === 'element') return 'dom';\n if (mode === 'note' || mode === 'area') return mode;\n return null;\n};\n\ntype SourceInspectorRect = {\n height: number;\n left: number;\n top: number;\n width: number;\n};\n\ntype SourceInspectorCandidate = SourceCandidate & {\n openUrl: string | null;\n};\n\ntype SourceInspectorState = {\n candidates: SourceInspectorCandidate[];\n isPinned: boolean;\n panelLeft: number;\n panelMaxWidth: number;\n panelRight: number | null;\n panelTop: number;\n rect: SourceInspectorRect;\n};\n\nconst SOURCE_PANEL_MAX_WIDTH = 440;\nconst SOURCE_PANEL_MIN_WIDTH = 240;\nconst SOURCE_PANEL_MAX_HEIGHT = 260;\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 adjustmentLabel,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX,\n sourceRoot,\n sourceInspector,\n presence\n}: ReviewShellProps) => {\n const {\n activeAdapterEntry,\n activeRoute,\n adapter,\n canWriteArea,\n canWriteDom,\n cleanupTargetRef,\n controllerRef,\n copiedPromptKey,\n copyLabel,\n draftTarget,\n frameScrollRef,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable: isViewportFigmaOverlayAvailable,\n isInitialPromptOpen,\n isListVisible,\n isRemoteSource,\n isSitemapOpen,\n localAdapterEntry,\n mode,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n remoteAdapterEntry,\n reviewViewportPresets,\n selectedItemId,\n selectedItemIdRef,\n setActiveRoute,\n setCopiedPromptKey,\n setCopyLabel,\n setDraftTarget,\n setIsInitialPromptOpen,\n setIsListVisible,\n setIsSitemapOpen,\n setMode,\n setSelectedItemId,\n setSize,\n setSource,\n setTarget,\n setTargetOverlayState,\n showSourceSelect,\n size,\n sizeRef,\n source,\n sourceEntries,\n target,\n targetOverlayState,\n targetRef,\n toastMessage,\n viewportPresets,\n setToastMessage,\n } = useReviewShellState({\n adapters,\n presets,\n reviewPathPrefix,\n });\n const sourceShortcutCleanupRef = useRef<(() => void) | null>(null);\n const sourceInspectorInteractionRef = useRef(false);\n const [sourceInspectorState, setSourceInspectorState] =\n useState<SourceInspectorState | null>(null);\n const [isAllQaVisible, setIsAllQaVisible] = useState(false);\n const sourceOpenOptions = useMemo<SourceOpenOptions>(\n () => ({\n ...sourceInspector,\n sourceRoot,\n }),\n [sourceInspector, sourceRoot]\n );\n const isSourceInspectorEnabled = sourceInspector?.enabled !== false;\n const {\n activeItems,\n activeRemainingItemCount,\n allQaCount,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIds,\n pageQaCounts,\n pageTargets,\n presetScopeCounts,\n qaFilter,\n qaFilterCounts,\n qaStatusFilter,\n qaStatusFilterCounts,\n selectedNumberedItem,\n setHiddenOverlayItemIds,\n setItems,\n setQaFilter,\n setQaStatusFilter,\n setSitemapItems,\n targetSrc,\n } = useReviewShellData({\n activeRoute,\n isAllQaVisible,\n isRemoteSource,\n pages,\n reviewPathPrefix,\n reviewViewportPresets,\n selectedItemId,\n size,\n target,\n viewportPresets,\n });\n const [targetFigmaState, setTargetFigmaState] =\n useState<{ targetSrc: string; config: ReviewFigmaFrameConfig } | null>(null);\n const targetFigmaConfig =\n targetFigmaState?.targetSrc === targetSrc ? targetFigmaState.config : null;\n const figmaFrameUrl = useMemo(\n () => getFigmaFrameUrl(targetFigmaConfig, size),\n [targetFigmaConfig, size]\n );\n const isFigmaOverlayAvailable =\n isViewportFigmaOverlayAvailable && Boolean(targetFigmaConfig);\n const [editingItem, setEditingItem] = useState<ReviewItem | null>(null);\n const initialPromptText = initialPrompt.trim();\n const refreshItems = useCallback(\n () =>\n refreshReviewItems({\n activeRoute,\n adapter,\n isRemoteSource,\n pageId: activeAdapterEntry.pageId,\n projectId,\n onItemsChange: setItems,\n }),\n [activeAdapterEntry.pageId, activeRoute, adapter, isRemoteSource, projectId]\n );\n\n const refreshSitemapItems = useCallback(\n () =>\n refreshSitemapReviewItems({\n localAdapterEntry,\n projectId,\n remoteAdapterEntry,\n onSitemapItemsChange: setSitemapItems,\n }),\n [localAdapterEntry, projectId, remoteAdapterEntry]\n );\n\n const cancelReviewMode = useCallback(() => {\n const controller = controllerRef.current;\n if (!controller || controller.getMode() === 'idle') return false;\n\n controller.setMode('idle');\n setMode(controller.getMode());\n return true;\n }, []);\n\n const closePromptModal = useCallback(() => {\n setIsInitialPromptOpen(false);\n }, []);\n\n const closeSitemap = useCallback(() => {\n setIsSitemapOpen(false);\n }, []);\n\n const reloadTargetFrame = useCallback(() => {\n try {\n iframeRef.current?.contentWindow?.location.reload();\n } catch {\n return;\n }\n }, []);\n\n const {\n closeFigmaSettings,\n effectiveReviewTheme,\n figmaSettingsStatus,\n figmaTokenDraft,\n isFigmaSettingsOpen,\n isFigmaTokenGuideOpen,\n isFigmaTokenVisible,\n openFigmaSettings,\n reviewThemeDraft,\n reviewUserId,\n reviewUserIdDraft,\n saveReviewSettings,\n setFigmaSettingsStatus,\n setFigmaTokenDraft,\n setIsFigmaTokenGuideOpen,\n setIsFigmaTokenVisible,\n setReviewThemeDraft,\n setReviewUserIdDraft,\n } = useReviewSettings({\n onCancelReviewMode: cancelReviewMode,\n onCloseInitialPrompt: closePromptModal,\n onCloseSitemap: closeSitemap,\n onReloadTargetFrame: reloadTargetFrame,\n });\n\n const {\n currentPagePresenceUsers,\n pagePresenceUsers,\n presenceSessionId,\n } = useReviewPresence({\n activeRoute,\n mode,\n presence,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n selectedNumberedItem,\n size,\n source,\n });\n\n const closeRulerPanels = useCallback(() => {\n closeSitemap();\n closeFigmaSettings();\n }, [closeFigmaSettings, closeSitemap]);\n\n const {\n closeRuler,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n toggleRuler,\n } = useReviewRuler({\n iframeRef,\n ruler,\n size,\n targetSrc,\n onCancelReviewMode: cancelReviewMode,\n onCloseTransientPanels: closeRulerPanels,\n });\n\n const {\n clearSelectedItem,\n closeTargetOverlay,\n initReviewKit,\n reloadReviewKit,\n restoreReviewItem,\n setControllerReviewMode,\n syncTargetViewport,\n toggleTargetOverlay,\n } = useReviewController({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n pageTargets,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n adjustmentLabel,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetOverlayState,\n targetRef,\n viewportPresets,\n onActiveRouteChange: setActiveRoute,\n onCancelReviewMode: cancelReviewMode,\n onCloseRuler: closeRuler,\n onDraftTargetChange: setDraftTarget,\n onItemsRefresh: refreshItems,\n onModeChange: setMode,\n onSelectedItemIdChange: setSelectedItemId,\n onSizeChange: setSize,\n onTargetChange: setTarget,\n onTargetOverlayStateChange: setTargetOverlayState,\n });\n\n const refreshReviewData = useCallback(() => {\n return refreshReviewDataAction({\n onRefreshItems: refreshItems,\n onRefreshSitemapItems: refreshSitemapItems,\n onReloadReviewKit: reloadReviewKit,\n });\n }, [refreshItems, refreshSitemapItems, reloadReviewKit]);\n\n const toggleItemOverlayVisibility = useCallback((itemId: string) => {\n setHiddenOverlayItemIds((currentHiddenOverlayItemIds) => {\n const nextHiddenItemIds = new Set(currentHiddenOverlayItemIds);\n if (nextHiddenItemIds.has(itemId)) {\n nextHiddenItemIds.delete(itemId);\n } else {\n nextHiddenItemIds.add(itemId);\n }\n\n return nextHiddenItemIds;\n });\n }, []);\n\n useEffect(() => {\n void refreshItems();\n }, [refreshItems]);\n\n useEffect(() => {\n void refreshSitemapItems();\n }, [refreshSitemapItems]);\n\n useEffect(() => {\n if (!isSitemapOpen) return;\n void refreshSitemapItems();\n }, [isSitemapOpen, refreshSitemapItems]);\n\n useEffect(() => {\n const frameScroll = frameScrollRef.current;\n if (!frameScroll) return undefined;\n\n const centerFrameScroll = () => {\n frameScroll.scrollLeft = Math.max(\n 0,\n (frameScroll.scrollWidth - frameScroll.clientWidth) / 2\n );\n frameScroll.scrollTop = 0;\n syncTargetViewport();\n };\n\n const animationFrame = window.requestAnimationFrame(centerFrameScroll);\n const transitionTimeout = window.setTimeout(centerFrameScroll, 180);\n\n return () => {\n window.cancelAnimationFrame(animationFrame);\n window.clearTimeout(transitionTimeout);\n };\n }, [isListVisible, size.height, size.width, syncTargetViewport, targetSrc]);\n\n const applyTarget = async () => {\n const parsedInput = parseReviewAddressInput(draftTarget, reviewPathPrefix);\n const normalizedTarget = parsedInput.target;\n const nextSource =\n parsedInput.source &&\n sourceEntries.some((entry) => entry.label === parsedInput.source)\n ? parsedInput.source\n : source;\n const nextSize =\n parsedInput.width && parsedInput.height\n ? findViewportPreset(\n viewportPresets,\n parsedInput.width,\n parsedInput.height\n )\n : sizeRef.current;\n const nextAdapter =\n sourceEntries.find((entry) => entry.label === nextSource) ??\n activeAdapterEntry;\n\n if (parsedInput.itemId) {\n const item = await nextAdapter.adapter.get(parsedInput.itemId);\n if (item) {\n setIsAllQaVisible(false);\n setSource(nextSource);\n restoreReviewItem(item);\n return;\n }\n }\n\n clearSelectedItem();\n setIsAllQaVisible(false);\n setSource(nextSource);\n targetRef.current = normalizedTarget;\n setActiveRoute(normalizedTarget);\n setDraftTarget(normalizedTarget);\n setSize(nextSize);\n setTarget(normalizedTarget);\n updateShellUrl(normalizedTarget, nextSize, nextSource);\n };\n\n const selectPage = (href: string) => {\n const normalizedTarget = normalizeTarget(href, reviewPathPrefix);\n clearSelectedItem();\n setIsAllQaVisible(false);\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 selectAllQa = () => {\n setIsAllQaVisible(true);\n setIsSitemapOpen(false);\n };\n\n const setReviewMode = (nextMode: ReviewMode) => {\n const writeMode = getReviewModeWriteMode(nextMode);\n if (writeMode && !activeAdapterEntry.writeModes.includes(writeMode)) return;\n closeRuler();\n if (nextMode === 'element') {\n closeTargetOverlay('figma');\n }\n setControllerReviewMode(nextMode);\n };\n\n useReviewShellHotkeys({\n isFigmaSettingsOpen,\n isInitialPromptOpen,\n isRulerAvailable,\n isRulerVisible,\n isSitemapOpen,\n mode,\n onCancelReviewMode: cancelReviewMode,\n onCloseFigmaSettings: closeFigmaSettings,\n onCloseInitialPrompt: closePromptModal,\n onCloseRuler: closeRuler,\n onCloseSitemap: closeSitemap,\n onSetReviewMode: setReviewMode,\n onToggleRuler: toggleRuler,\n onToggleTargetOverlay: toggleTargetOverlay,\n });\n\n const copyCurrentUrl = () =>\n copyCurrentReviewUrl({\n onCopyLabelChange: setCopyLabel,\n });\n\n const showToast = useCallback(\n (message: string) => {\n setToastMessage(message);\n window.setTimeout(() => {\n setToastMessage((current) => (current === message ? '' : current));\n }, 1600);\n },\n [setToastMessage]\n );\n\n const refreshTargetFigmaConfig = useCallback(() => {\n const config = getTargetFigmaFrameConfig(\n iframeRef.current?.contentWindow\n );\n setTargetFigmaState(config ? { targetSrc, config } : null);\n }, [iframeRef, targetSrc]);\n\n const clearSourceInspector = useCallback(() => {\n sourceInspectorInteractionRef.current = false;\n setSourceInspectorState(null);\n }, []);\n\n const getSourceInspectorRect = useCallback(\n (element: Element): SourceInspectorRect | null => {\n const frame = iframeRef.current;\n if (!frame) return null;\n\n const frameRect = frame.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n const left = Math.max(frameRect.left, frameRect.left + elementRect.left);\n const top = Math.max(frameRect.top, frameRect.top + elementRect.top);\n const right = Math.min(\n frameRect.right,\n frameRect.left + elementRect.right\n );\n const bottom = Math.min(\n frameRect.bottom,\n frameRect.top + elementRect.bottom\n );\n\n return {\n height: Math.max(2, bottom - top),\n left,\n top,\n width: Math.max(2, right - left),\n };\n },\n [iframeRef]\n );\n\n const getSourceInspectorPanelPosition = useCallback(\n (rect: SourceInspectorRect) => {\n const margin = 12;\n const gap = 10;\n const preferredLeft = rect.left + rect.width + gap;\n const rightSpace = window.innerWidth - preferredLeft - margin;\n const leftSpace = rect.left - gap - margin;\n const canOpenRight = rightSpace >= SOURCE_PANEL_MIN_WIDTH;\n const canOpenLeft = leftSpace >= SOURCE_PANEL_MIN_WIDTH;\n const left = canOpenRight || !canOpenLeft ? preferredLeft : margin;\n const right = canOpenRight || !canOpenLeft\n ? null\n : Math.max(margin, window.innerWidth - (rect.left - gap));\n const maxWidth = Math.min(\n SOURCE_PANEL_MAX_WIDTH,\n Math.max(\n SOURCE_PANEL_MIN_WIDTH,\n canOpenRight\n ? rightSpace\n : canOpenLeft\n ? leftSpace\n : window.innerWidth - margin * 2\n )\n );\n const top = Math.min(\n Math.max(margin, rect.top),\n Math.max(margin, window.innerHeight - SOURCE_PANEL_MAX_HEIGHT - margin)\n );\n\n return { left, maxWidth, right, top };\n },\n []\n );\n\n const showSourceInspectorForTarget = useCallback(\n (target: EventTarget | null, isPinned = false) => {\n const candidates = getSourceCandidates(target).map((candidate) => ({\n ...candidate,\n openUrl: getSourceOpenUrl(candidate.source, {\n ...sourceOpenOptions,\n omitPosition: !candidate.usesPosition,\n }),\n }));\n const firstCandidate = candidates[0];\n const rect = firstCandidate\n ? getSourceInspectorRect(firstCandidate.element)\n : null;\n\n if (!firstCandidate || !rect) {\n setSourceInspectorState(null);\n return [];\n }\n\n const { left, maxWidth, right, top } =\n getSourceInspectorPanelPosition(rect);\n setSourceInspectorState({\n candidates,\n isPinned,\n panelLeft: left,\n panelMaxWidth: maxWidth,\n panelRight: right,\n panelTop: top,\n rect,\n });\n return candidates;\n },\n [\n getSourceInspectorPanelPosition,\n getSourceInspectorRect,\n sourceOpenOptions,\n ]\n );\n\n const showSourceOutlineForTarget = useCallback(\n (target: EventTarget | null) => {\n const firstCandidate = getSourceCandidates(target)[0];\n const rect = firstCandidate\n ? getSourceInspectorRect(firstCandidate.element)\n : null;\n\n if (!firstCandidate || !rect) {\n setSourceInspectorState(null);\n return null;\n }\n\n setSourceInspectorState({\n candidates: [],\n isPinned: false,\n panelLeft: 0,\n panelMaxWidth: SOURCE_PANEL_MAX_WIDTH,\n panelRight: null,\n panelTop: 0,\n rect,\n });\n return firstCandidate;\n },\n [getSourceInspectorRect]\n );\n\n const openSourceCandidate = useCallback(\n (candidate: SourceInspectorCandidate) => {\n const didOpen = openSourceInEditor(candidate.source, {\n ...sourceOpenOptions,\n omitPosition: !candidate.usesPosition,\n });\n showToast(didOpen ? 'Source opened' : 'Source root required');\n clearSourceInspector();\n },\n [clearSourceInspector, showToast, sourceOpenOptions]\n );\n\n const cleanupSourceOpenShortcut = useCallback(() => {\n sourceShortcutCleanupRef.current?.();\n sourceShortcutCleanupRef.current = null;\n }, []);\n\n const bindSourceOpenShortcut = useCallback(() => {\n cleanupSourceOpenShortcut();\n\n let frameDocument: Document | null = null;\n try {\n frameDocument = iframeRef.current?.contentDocument ?? null;\n } catch {\n return;\n }\n\n if (!frameDocument || !isSourceInspectorEnabled) return;\n\n const frameRoot = frameDocument.head ?? frameDocument.documentElement;\n const frameBody = frameDocument.body ?? frameDocument.documentElement;\n if (!frameRoot || !frameBody) return;\n\n const optionAttribute = 'data-dfwr-source-option';\n const fontOverlayAttribute = 'data-dfwr-source-fonts';\n const style = frameDocument.createElement('style');\n style.dataset.dfwrSourceOpenShortcut = 'true';\n style.textContent = `\n html[${optionAttribute}=\"true\"],\n html[${optionAttribute}=\"true\"] * {\n cursor: crosshair !important;\n }\n\n html[${optionAttribute}=\"true\"] body::before {\n position: fixed !important;\n z-index: 2147483647 !important;\n top: 10px !important;\n left: 50% !important;\n transform: translateX(-50%) !important;\n display: block !important;\n border: 1px solid rgba(124, 199, 255, 0.72) !important;\n border-radius: 999px !important;\n padding: 6px 10px !important;\n color: #ffffff !important;\n background: rgba(15, 23, 42, 0.86) !important;\n box-shadow: 0 10px 28px rgba(0, 0, 0, 0.24) !important;\n content: \"Source select\" !important;\n font: 700 12px/1 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif !important;\n pointer-events: none !important;\n }\n\n [${fontOverlayAttribute}] {\n position: fixed !important;\n z-index: 2147483647 !important;\n display: flex !important;\n flex-direction: column !important;\n width: max-content !important;\n max-width: calc(100vw - 8px) !important;\n border: 1px solid rgba(124, 199, 255, 0.72) !important;\n border-radius: 6px !important;\n padding: 4px 6px !important;\n color: #ffffff !important;\n background: rgba(15, 23, 42, 0.9) !important;\n box-shadow: 0 8px 22px rgba(0, 0, 0, 0.28) !important;\n font: 800 11px/1.35 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace !important;\n overflow-wrap: anywhere !important;\n pointer-events: none !important;\n white-space: normal !important;\n }\n\n [${fontOverlayAttribute}] > span {\n display: grid !important;\n grid-template-columns: auto minmax(0, 1fr) !important;\n justify-content: space-between !important;\n gap: 10px !important;\n }\n\n [${fontOverlayAttribute}] > span > span:last-child {\n min-width: 0 !important;\n text-align: right !important;\n }\n\n [${fontOverlayAttribute}][hidden] {\n display: none !important;\n }\n `;\n\n frameRoot.append(style);\n\n const fontOverlay = frameDocument.createElement('div');\n fontOverlay.setAttribute(fontOverlayAttribute, 'true');\n fontOverlay.hidden = true;\n frameBody.append(fontOverlay);\n\n let hoveredElement: Element | null = null;\n let lastSourceTarget: EventTarget | null = null;\n let isSourceSelecting = false;\n let isSourcePanelPinned = false;\n\n const getFontHints = (element: Element | null) => {\n if (!element) return [];\n\n const values: Array<{ tag: string; value: string }> = [];\n const addValue = (target: Element) => {\n const value = target.getAttribute('data-font')?.trim();\n const tag = target.tagName.toLowerCase();\n if (\n value &&\n !values.some((item) => item.tag === tag && item.value === value)\n ) {\n values.push({ tag, value });\n }\n };\n\n addValue(element);\n element.querySelectorAll('[data-font]').forEach(addValue);\n return values;\n };\n\n const updateFontOverlay = (element: Element | null) => {\n const values = isSourceSelecting ? getFontHints(element) : [];\n if (!values.length || !element) {\n fontOverlay.hidden = true;\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const frameWidth = frameDocument.documentElement.clientWidth;\n const showAbove = rect.top > 48;\n const top = Math.max(4, showAbove ? rect.top : rect.bottom);\n\n fontOverlay.replaceChildren();\n fontOverlay.style.minWidth = '72px';\n fontOverlay.style.left = '4px';\n fontOverlay.style.top = `${top}px`;\n fontOverlay.style.transform = showAbove\n ? 'translateY(calc(-100% - 6px))'\n : 'translateY(6px)';\n fontOverlay.style.visibility = 'hidden';\n const rows = values.map(({ tag, value }) => {\n const row = frameDocument.createElement('span');\n const tagText = frameDocument.createElement('span');\n const valueText = frameDocument.createElement('span');\n tagText.textContent = tag;\n valueText.textContent = value;\n row.append(tagText, valueText);\n return row;\n });\n fontOverlay.append(...rows);\n fontOverlay.hidden = false;\n const overlayWidth = fontOverlay.getBoundingClientRect().width;\n const left = Math.max(\n 4,\n Math.min(rect.left, frameWidth - overlayWidth - 4)\n );\n fontOverlay.style.left = `${left}px`;\n fontOverlay.style.visibility = '';\n };\n\n const setHoveredElement = (element: Element | null) => {\n hoveredElement = element;\n updateFontOverlay(element);\n };\n\n const setSourceSelecting = (isSelecting: boolean) => {\n isSourceSelecting = isSelecting;\n if (isSelecting) {\n isSourcePanelPinned = false;\n frameDocument.documentElement.setAttribute(optionAttribute, 'true');\n const candidate = showSourceOutlineForTarget(lastSourceTarget);\n setHoveredElement(candidate?.element ?? hoveredElement);\n return;\n }\n\n setHoveredElement(null);\n fontOverlay.hidden = true;\n frameDocument.documentElement.removeAttribute(optionAttribute);\n if (!isSourcePanelPinned && !sourceInspectorInteractionRef.current) {\n clearSourceInspector();\n }\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n lastSourceTarget = event.target;\n const candidates = getSourceCandidates(event.target);\n const sourceElement = candidates[0]?.element ?? null;\n\n if (event.altKey && !isSourceSelecting) {\n setSourceSelecting(true);\n }\n\n if (isSourceSelecting && !isSourcePanelPinned) {\n showSourceOutlineForTarget(event.target);\n }\n\n setHoveredElement(isSourceSelecting ? sourceElement : null);\n };\n\n const handleClick = (event: MouseEvent) => {\n if (!isSourceSelecting && !event.altKey) return;\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n const candidates = showSourceInspectorForTarget(event.target, true);\n if (!candidates.length) {\n showToast('Source hint not found');\n isSourcePanelPinned = false;\n setSourceSelecting(false);\n return;\n }\n\n isSourcePanelPinned = true;\n setSourceSelecting(false);\n };\n\n const isOptionKeyEvent = (event: KeyboardEvent) =>\n event.key === 'Alt' ||\n event.code === 'AltLeft' ||\n event.code === 'AltRight' ||\n event.altKey;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n isSourcePanelPinned = false;\n setSourceSelecting(false);\n clearSourceInspector();\n return;\n }\n if (!isOptionKeyEvent(event)) return;\n\n cancelReviewMode();\n setSourceSelecting(true);\n };\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (isOptionKeyEvent(event) || !event.altKey) setSourceSelecting(false);\n };\n\n const handleBlur = () => {\n isSourcePanelPinned = false;\n setSourceSelecting(false);\n };\n\n const handleWindowPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (\n target instanceof Element &&\n target.closest('.df-review-source-popover')\n ) {\n sourceInspectorInteractionRef.current = true;\n return;\n }\n\n isSourcePanelPinned = false;\n sourceInspectorInteractionRef.current = false;\n setSourceSelecting(false);\n clearSourceInspector();\n };\n\n frameDocument.addEventListener('mousemove', handleMouseMove, true);\n frameDocument.addEventListener('click', handleClick, true);\n frameDocument.addEventListener('keydown', handleKeyDown, true);\n frameDocument.addEventListener('keyup', handleKeyUp, true);\n window.addEventListener('keydown', handleKeyDown, true);\n window.addEventListener('keyup', handleKeyUp, true);\n window.addEventListener('blur', handleBlur);\n window.addEventListener('pointerdown', handleWindowPointerDown, true);\n\n sourceShortcutCleanupRef.current = () => {\n frameDocument.removeEventListener('mousemove', handleMouseMove, true);\n frameDocument.removeEventListener('click', handleClick, true);\n frameDocument.removeEventListener('keydown', handleKeyDown, true);\n frameDocument.removeEventListener('keyup', handleKeyUp, true);\n window.removeEventListener('keydown', handleKeyDown, true);\n window.removeEventListener('keyup', handleKeyUp, true);\n window.removeEventListener('blur', handleBlur);\n window.removeEventListener('pointerdown', handleWindowPointerDown, true);\n isSourcePanelPinned = false;\n setSourceSelecting(false);\n style.remove();\n fontOverlay.remove();\n };\n }, [\n cancelReviewMode,\n clearSourceInspector,\n cleanupSourceOpenShortcut,\n iframeRef,\n isSourceInspectorEnabled,\n showToast,\n showSourceOutlineForTarget,\n showSourceInspectorForTarget,\n ]);\n\n useEffect(() => {\n return cleanupSourceOpenShortcut;\n }, [cleanupSourceOpenShortcut]);\n\n const loadTargetFrame = useCallback(() => {\n initReviewKit();\n refreshTargetFigmaConfig();\n bindSourceOpenShortcut();\n }, [bindSourceOpenShortcut, initReviewKit, refreshTargetFigmaConfig]);\n\n useEffect(() => {\n const frame = window.requestAnimationFrame(bindSourceOpenShortcut);\n return () => window.cancelAnimationFrame(frame);\n }, [bindSourceOpenShortcut, targetSrc]);\n\n const clearSelectedReviewItem = useCallback(() => {\n clearSelectedItem();\n updateShellUrl(targetRef.current, sizeRef.current, source);\n }, [clearSelectedItem, sizeRef, source, targetRef]);\n\n const changeReviewSource = (nextSource: ReviewSource) => {\n if (!sourceEntries.some((entry) => entry.label === nextSource)) return;\n\n cancelReviewMode();\n clearSelectedItem();\n setItems([]);\n setSource(nextSource);\n updateShellUrl(targetRef.current, sizeRef.current, nextSource);\n };\n\n const changeItemStatus = (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) =>\n updateReviewItemStatus({\n activeAdapterEntry,\n item,\n nextStatus,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n\n const saveItemComment = async (item: ReviewItem, comment: string) => {\n await updateReviewItemComment({\n activeAdapterEntry,\n item,\n comment,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n setEditingItem(null);\n };\n\n const submitItem = (numberedItem: NumberedReviewItem) =>\n submitReviewItem({\n localAdapterEntry,\n numberedItem,\n remoteAdapterEntry,\n selectedItemIdRef,\n onClearSelectedItem: clearSelectedItem,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n\n const copyPrompt = (\n value: string,\n key: string,\n toastMessage = 'Prompt copied'\n ) =>\n copyReviewPrompt({\n key,\n toastMessage,\n value,\n onCopiedPromptKeyChange: setCopiedPromptKey,\n onToast: showToast,\n });\n\n const copyItemPrompt = (numberedItem: NumberedReviewItem) =>\n copyPrompt(\n buildReviewItemPrompt(numberedItem, reviewPathPrefix),\n `qa:${numberedItem.item.id}`,\n 'QA prompt copied'\n );\n\n const copyItemLink = (numberedItem: NumberedReviewItem) => {\n const { item } = numberedItem;\n return copyPrompt(\n getShellUrlForItem(\n getItemTarget(item, reviewPathPrefix),\n getRestoredSize(item, viewportPresets),\n item.id,\n source\n ).href,\n `link:${item.id}`,\n 'QA link copied'\n );\n };\n\n const removeItem = (item: ReviewItem) =>\n removeReviewItem({\n activeAdapterEntry,\n isRemoteSource,\n item,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n onClearSelectedItem: clearSelectedItem,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n });\n\n return (\n <div\n className={`df-review-shell is-theme-${effectiveReviewTheme}${\n isListVisible ? ' is-list-visible' : ''\n }`}\n >\n <ReviewTopbar\n draftTarget={draftTarget}\n copyLabel={copyLabel}\n viewportPresets={viewportPresets}\n size={size}\n presetScopeCounts={presetScopeCounts}\n isRulerAvailable={isRulerAvailable}\n isRulerVisible={isRulerVisible}\n targetOverlayState={targetOverlayState}\n isFigmaOverlayAvailable={isFigmaOverlayAvailable}\n onDraftTargetChange={setDraftTarget}\n onApplyTarget={applyTarget}\n onOpenSitemap={() => setIsSitemapOpen(true)}\n onCopyCurrentUrl={() => void copyCurrentUrl()}\n onSizeChange={setSize}\n onToggleRuler={toggleRuler}\n onToggleTargetOverlay={toggleTargetOverlay}\n onOpenInitialPrompt={() => {\n setIsInitialPromptOpen(true);\n }}\n onOpenSettings={openFigmaSettings}\n />\n\n {currentPagePresenceUsers.length > 0 && (\n <div className=\"df-review-presence-row\">\n <PresenceOverlay\n presenceSessionId={presenceSessionId}\n users={currentPagePresenceUsers}\n />\n </div>\n )}\n\n {isSitemapOpen && (\n <SitemapModal\n pages={pages}\n activeRoute={activeRoute}\n allQaCount={allQaCount}\n isAllQaVisible={isAllQaVisible}\n pageQaCounts={pageQaCounts}\n pagePresenceUsers={pagePresenceUsers}\n getPageTarget={(href) => normalizeTarget(href, reviewPathPrefix)}\n onClose={() => setIsSitemapOpen(false)}\n onSelectAllQa={selectAllQa}\n onSelectPage={selectPage}\n />\n )}\n\n {isFigmaSettingsOpen && (\n <ReviewSettingsModal\n figmaTokenDraft={figmaTokenDraft}\n reviewUserIdDraft={reviewUserIdDraft}\n reviewThemeDraft={reviewThemeDraft}\n figmaSettingsStatus={figmaSettingsStatus}\n isFigmaTokenVisible={isFigmaTokenVisible}\n isFigmaTokenGuideOpen={isFigmaTokenGuideOpen}\n onClose={closeFigmaSettings}\n onFigmaTokenDraftChange={setFigmaTokenDraft}\n onReviewUserIdDraftChange={setReviewUserIdDraft}\n onReviewThemeDraftChange={setReviewThemeDraft}\n onClearStatus={() => setFigmaSettingsStatus('')}\n onToggleFigmaTokenVisible={() =>\n setIsFigmaTokenVisible((current) => !current)\n }\n onToggleFigmaTokenGuide={() =>\n setIsFigmaTokenGuideOpen((current) => !current)\n }\n onSave={saveReviewSettings}\n />\n )}\n\n {isInitialPromptOpen && (\n <PromptModal\n initialPromptText={initialPromptText}\n copiedPromptKey={copiedPromptKey}\n onClose={closePromptModal}\n onCopyPrompt={(text, key) => void copyPrompt(text, key)}\n />\n )}\n\n {editingItem && (\n <QaItemEditModal\n item={editingItem}\n onClose={() => setEditingItem(null)}\n onSave={saveItemComment}\n />\n )}\n\n {toastMessage && (\n <div className=\"df-review-copy-toast\" role=\"status\">\n {toastMessage}\n </div>\n )}\n\n <div className=\"df-review-side-rail\">\n <button\n aria-label={isListVisible ? 'Hide QA list' : 'Show QA list'}\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={() => setIsListVisible((current) => !current)}\n >\n <span aria-hidden=\"true\">\n <GripVerticalIcon />\n </span>\n <strong>QA</strong>\n </button>\n </div>\n\n <ReviewQaPanel\n activeAdapterEntry={activeAdapterEntry}\n activeItems={activeItems}\n activeRemainingItemCount={activeRemainingItemCount}\n currentPresetScope={currentPresetScope}\n filteredNumberedActiveItems={filteredNumberedActiveItems}\n getItemPresetScope={getItemPresetScope}\n hiddenOverlayItemIds={hiddenOverlayItemIds}\n isListVisible={isListVisible}\n isAllQaVisible={isAllQaVisible}\n isRemoteSource={isRemoteSource}\n copiedPromptKey={copiedPromptKey}\n qaFilter={qaFilter}\n qaFilterCounts={qaFilterCounts}\n qaStatusFilter={qaStatusFilter}\n qaStatusFilterCounts={qaStatusFilterCounts}\n remoteAdapterEntry={remoteAdapterEntry}\n selectedItemId={selectedItemId}\n showSourceSelect={showSourceSelect}\n source={source}\n sourceEntries={sourceEntries}\n onChangeItemStatus={changeItemStatus}\n onClearSelectedItem={clearSelectedReviewItem}\n onChangeReviewSource={changeReviewSource}\n onCopyItemLink={(numberedItem) => void copyItemLink(numberedItem)}\n onCopyItemPrompt={(numberedItem) => void copyItemPrompt(numberedItem)}\n onEditItem={setEditingItem}\n onQaFilterChange={setQaFilter}\n onQaStatusFilterChange={setQaStatusFilter}\n onRefreshReviewData={refreshReviewData}\n onRemoveItem={removeItem}\n onRestoreReviewItem={restoreReviewItem}\n onSubmitItem={submitItem}\n onToggleItemOverlayVisibility={toggleItemOverlayVisibility}\n />\n\n <ReviewTargetFrame\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n figmaFrameUrl={figmaFrameUrl}\n frameScrollRef={frameScrollRef}\n iframeRef={iframeRef}\n isRulerAvailable={isRulerAvailable}\n isRulerDragging={isRulerDragging}\n isRulerVisible={isRulerVisible}\n mode={mode}\n rulerHover={rulerHover}\n rulerMeasure={rulerMeasure}\n rulerMeasureLabel={rulerMeasureLabel}\n rulerOverlayRef={rulerOverlayRef}\n rulerScaleX={rulerScaleX}\n rulerScaleY={rulerScaleY}\n rulerUnit={rulerUnit}\n size={size}\n targetSrc={targetSrc}\n onLoadTarget={loadTargetFrame}\n onSetReviewMode={setReviewMode}\n />\n\n {sourceInspectorState && (\n <>\n <div\n className={`df-review-source-outline${\n sourceInspectorState.isPinned ? ' is-pinned' : ''\n }`}\n style={{\n height: `${sourceInspectorState.rect.height}px`,\n left: `${sourceInspectorState.rect.left}px`,\n top: `${sourceInspectorState.rect.top}px`,\n width: `${sourceInspectorState.rect.width}px`,\n }}\n />\n {sourceInspectorState.candidates.length > 0 && (\n <div\n className={`df-review-source-popover${\n sourceInspectorState.isPinned ? ' is-pinned' : ''\n }`}\n style={{\n left:\n sourceInspectorState.panelRight === null\n ? `${sourceInspectorState.panelLeft}px`\n : undefined,\n maxWidth: `${sourceInspectorState.panelMaxWidth}px`,\n right:\n sourceInspectorState.panelRight === null\n ? undefined\n : `${sourceInspectorState.panelRight}px`,\n top: `${sourceInspectorState.panelTop}px`,\n }}\n onPointerDown={() => {\n sourceInspectorInteractionRef.current = true;\n }}\n onPointerEnter={() => {\n sourceInspectorInteractionRef.current = true;\n }}\n onPointerLeave={() => {\n sourceInspectorInteractionRef.current = false;\n }}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"df-review-source-popover-close\">\n <button\n aria-label=\"Close source candidates\"\n type=\"button\"\n onClick={clearSourceInspector}\n >\n ×\n </button>\n </div>\n <div className=\"df-review-source-candidate-list\">\n {sourceInspectorState.candidates.map((candidate) => (\n <button\n key={candidate.id}\n className=\"df-review-source-candidate\"\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n openSourceCandidate(candidate);\n }}\n >\n <span className=\"df-review-source-candidate-main\">\n <strong>{candidate.label}</strong>\n <span>{candidate.filePath}</span>\n <small>\n {candidate.positionLabel ||\n (candidate.usesPosition ? '' : 'file only')}\n </small>\n </span>\n </button>\n ))}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n};\n","/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n","/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n","import { CamelToPascal } from '../utility-types';\nimport { toCamelCase } from './toCamelCase';\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n\n return false;\n};\n","'use client';\n\nimport { createContext, createElement, type ReactNode, useContext, useMemo } from 'react';\nimport { LucideProps } from './types';\n\ntype LucideConfig = {\n size: number;\n color: string;\n strokeWidth: number;\n absoluteStrokeWidth: boolean;\n className: string;\n};\n\nconst LucideContext = createContext<LucideProps>({});\n\ntype LucideProviderProps = {\n children: ReactNode;\n} & Partial<LucideConfig>;\n\nexport function LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n}: LucideProviderProps) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className],\n );\n\n return createElement(LucideContext.Provider, { value }, children);\n}\n\nexport const useLucideContext = () => useContext(LucideContext);\n","'use client';\n\nimport { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\nimport { useLucideContext } from './context';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n { color, size, strokeWidth, absoluteStrokeWidth, className = '', children, iconNode, ...rest },\n ref,\n ) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = 'currentColor',\n className: contextClass = '',\n } = useLucideContext() ?? {};\n\n const calculatedStrokeWidth =\n absoluteStrokeWidth ?? contextAbsoluteStrokeWidth\n ? (Number(strokeWidth ?? contextStrokeWidth) * 24) / Number(size ?? contextSize)\n : strokeWidth ?? contextStrokeWidth;\n\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses('lucide', contextClass, className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 8V4H8', key: 'hb8ula' }],\n ['rect', { width: '16', height: '12', x: '4', y: '8', rx: '2', key: 'enze0r' }],\n ['path', { d: 'M2 14h2', key: 'vft8re' }],\n ['path', { d: 'M20 14h2', key: '4cs60a' }],\n ['path', { d: 'M15 13v2', key: '1xurst' }],\n ['path', { d: 'M9 13v2', key: 'rq6x2g' }],\n];\n\n/**\n * @component @name Bot\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgOFY0SDgiIC8+CiAgPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjEyIiB4PSI0IiB5PSI4IiByeD0iMiIgLz4KICA8cGF0aCBkPSJNMiAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0xNSAxM3YyIiAvPgogIDxwYXRoIGQ9Ik05IDEzdjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/bot\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 Bot = createLucideIcon('bot', __iconNode);\n\nexport default Bot;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3', key: '1u773s' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n];\n\n/**\n * @component @name CircleQuestionMark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMiIC8+CiAgPHBhdGggZD0iTTEyIDE3aC4wMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/circle-question-mark\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleQuestionMark = createLucideIcon('circle-question-mark', __iconNode);\n\nexport default CircleQuestionMark;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n];\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHg9IjgiIHk9IjgiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('copy', __iconNode);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'M10 14 21 3', key: 'gplh6r' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6', key: 'a6xqqp' }],\n];\n\n/**\n * @component @name ExternalLink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0iTTEwIDE0IDIxIDMiIC8+CiAgPHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ExternalLink = createLucideIcon('external-link', __iconNode);\n\nexport default ExternalLink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49',\n key: 'ct8e1f',\n },\n ],\n ['path', { d: 'M14.084 14.158a3 3 0 0 1-4.242-4.242', key: '151rxh' }],\n [\n 'path',\n {\n d: 'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143',\n key: '13bj9a',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNzMzIDUuMDc2YTEwLjc0NCAxMC43NDQgMCAwIDEgMTEuMjA1IDYuNTc1IDEgMSAwIDAgMSAwIC42OTYgMTAuNzQ3IDEwLjc0NyAwIDAgMS0xLjQ0NCAyLjQ5IiAvPgogIDxwYXRoIGQ9Ik0xNC4wODQgMTQuMTU4YTMgMyAwIDAgMS00LjI0Mi00LjI0MiIgLz4KICA8cGF0aCBkPSJNMTcuNDc5IDE3LjQ5OWExMC43NSAxMC43NSAwIDAgMS0xNS40MTctNS4xNTEgMSAxIDAgMCAxIDAtLjY5NiAxMC43NSAxMC43NSAwIDAgMSA0LjQ0Ni01LjE0MyIgLz4KICA8cGF0aCBkPSJtMiAyIDIwIDIwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst EyeOff = createLucideIcon('eye-off', __iconNode);\n\nexport default EyeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n key: '1nclc0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi4wNjIgMTIuMzQ4YTEgMSAwIDAgMSAwLS42OTYgMTAuNzUgMTAuNzUgMCAwIDEgMTkuODc2IDAgMSAxIDAgMCAxIDAgLjY5NiAxMC43NSAxMC43NSAwIDAgMS0xOS44NzYgMCIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Eye = createLucideIcon('eye', __iconNode);\n\nexport default Eye;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '9', cy: '12', r: '1', key: '1vctgf' }],\n ['circle', { cx: '9', cy: '5', r: '1', key: 'hp0tcf' }],\n ['circle', { cx: '9', cy: '19', r: '1', key: 'fkjjf6' }],\n ['circle', { cx: '15', cy: '12', r: '1', key: '1tmaij' }],\n ['circle', { cx: '15', cy: '5', r: '1', key: '19l28e' }],\n ['circle', { cx: '15', cy: '19', r: '1', key: 'f4zoj3' }],\n];\n\n/**\n * @component @name GripVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjUiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTUiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTkiIHI9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/grip-vertical\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GripVertical = createLucideIcon('grip-vertical', __iconNode);\n\nexport default GripVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '7', height: '7', x: '3', y: '3', rx: '1', key: '1g98yp' }],\n ['rect', { width: '7', height: '7', x: '14', y: '3', rx: '1', key: '6d4xhi' }],\n ['rect', { width: '7', height: '7', x: '14', y: '14', rx: '1', key: 'nxv5o0' }],\n ['rect', { width: '7', height: '7', x: '3', y: '14', rx: '1', key: '1bb6yr' }],\n];\n\n/**\n * @component @name LayoutGrid\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIzIiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIxNCIgeT0iMyIgcng9IjEiIC8+CiAgPHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iNyIgeD0iMTQiIHk9IjE0IiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIxNCIgcng9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/layout-grid\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LayoutGrid = createLucideIcon('layout-grid', __iconNode);\n\nexport default LayoutGrid;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M9 17H7A5 5 0 0 1 7 7h2', key: '8i5ue5' }],\n ['path', { d: 'M15 7h2a5 5 0 1 1 0 10h-2', key: '1b9ql8' }],\n ['line', { x1: '8', x2: '16', y1: '12', y2: '12', key: '1jonct' }],\n];\n\n/**\n * @component @name Link2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOSAxN0g3QTUgNSAwIDAgMSA3IDdoMiIgLz4KICA8cGF0aCBkPSJNMTUgN2gyYTUgNSAwIDEgMSAwIDEwaC0yIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIxMiIgeTI9IjEyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/link-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 Link2 = createLucideIcon('link-2', __iconNode);\n\nexport default Link2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M2 5h20', key: '1fs1ex' }],\n ['path', { d: 'M6 12h12', key: '8npq4p' }],\n ['path', { d: 'M9 19h6', key: '456am0' }],\n];\n\n/**\n * @component @name ListFilter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMiA1aDIwIiAvPgogIDxwYXRoIGQ9Ik02IDEyaDEyIiAvPgogIDxwYXRoIGQ9Ik05IDE5aDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/list-filter\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ListFilter = createLucideIcon('list-filter', __iconNode);\n\nexport default ListFilter;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z',\n key: '169xi5',\n },\n ],\n ['path', { d: 'M15 5.764v15', key: '1pn4in' }],\n ['path', { d: 'M9 3.236v15', key: '1uimfh' }],\n];\n\n/**\n * @component @name Map\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQuMTA2IDUuNTUzYTIgMiAwIDAgMCAxLjc4OCAwbDMuNjU5LTEuODNBMSAxIDAgMCAxIDIxIDQuNjE5djEyLjc2NGExIDEgMCAwIDEtLjU1My44OTRsLTQuNTUzIDIuMjc3YTIgMiAwIDAgMS0xLjc4OCAwbC00LjIxMi0yLjEwNmEyIDIgMCAwIDAtMS43ODggMGwtMy42NTkgMS44M0ExIDEgMCAwIDEgMyAxOS4zODFWNi42MThhMSAxIDAgMCAxIC41NTMtLjg5NGw0LjU1My0yLjI3N2EyIDIgMCAwIDEgMS43ODggMHoiIC8+CiAgPHBhdGggZD0iTTE1IDUuNzY0djE1IiAvPgogIDxwYXRoIGQ9Ik05IDMuMjM2djE1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/map\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Map = createLucideIcon('map', __iconNode);\n\nexport default Map;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'm21 3-7 7', key: '1l2asr' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M9 21H3v-6', key: 'wtvkvv' }],\n];\n\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0ibTIxIDMtNyA3IiAvPgogIDxwYXRoIGQ9Im0zIDIxIDctNyIgLz4KICA8cGF0aCBkPSJNOSAyMUgzdi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize2 = createLucideIcon('maximize-2', __iconNode);\n\nexport default Maximize2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n key: '1a8usu',\n },\n ],\n ['path', { d: 'm15 5 4 4', key: '1mk7zo' }],\n];\n\n/**\n * @component @name Pencil\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KICA8cGF0aCBkPSJtMTUgNSA0IDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/pencil\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pencil = createLucideIcon('pencil', __iconNode);\n\nexport default Pencil;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '12', x: '2', y: '6', rx: '2', key: '9lu3g6' }],\n];\n\n/**\n * @component @name RectangleHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTIiIHg9IjIiIHk9IjYiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rectangle-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RectangleHorizontal = createLucideIcon('rectangle-horizontal', __iconNode);\n\nexport default RectangleHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z',\n key: 'icamh8',\n },\n ],\n ['path', { d: 'm14.5 12.5 2-2', key: 'inckbg' }],\n ['path', { d: 'm11.5 9.5 2-2', key: 'fmmyf7' }],\n ['path', { d: 'm8.5 6.5 2-2', key: 'vc6u1g' }],\n ['path', { d: 'm17.5 15.5 2-2', key: 'wo5hmg' }],\n];\n\n/**\n * @component @name Ruler\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMyAxNS4zYTIuNCAyLjQgMCAwIDEgMCAzLjRsLTIuNiAyLjZhMi40IDIuNCAwIDAgMS0zLjQgMEwyLjcgOC43YTIuNDEgMi40MSAwIDAgMSAwLTMuNGwyLjYtMi42YTIuNDEgMi40MSAwIDAgMSAzLjQgMFoiIC8+CiAgPHBhdGggZD0ibTE0LjUgMTIuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTExLjUgOS41IDItMiIgLz4KICA8cGF0aCBkPSJtOC41IDYuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTE3LjUgMTUuNSAyLTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/ruler\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ruler = createLucideIcon('ruler', __iconNode);\n\nexport default Ruler;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 7V5a2 2 0 0 1 2-2h2', key: 'aa7l1z' }],\n ['path', { d: 'M17 3h2a2 2 0 0 1 2 2v2', key: '4qcy5o' }],\n ['path', { d: 'M21 17v2a2 2 0 0 1-2 2h-2', key: '6vwrx8' }],\n ['path', { d: 'M7 21H5a2 2 0 0 1-2-2v-2', key: 'ioqczr' }],\n];\n\n/**\n * @component @name Scan\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiAvPgogIDxwYXRoIGQ9Ik0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiAvPgogIDxwYXRoIGQ9Ik0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIC8+CiAgPHBhdGggZD0iTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/scan\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Scan = createLucideIcon('scan', __iconNode);\n\nexport default Scan;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '20', x: '5', y: '2', rx: '2', ry: '2', key: '1yt0o3' }],\n ['path', { d: 'M12 18h.01', key: 'mhygvu' }],\n];\n\n/**\n * @component @name Smartphone\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMjAiIHg9IjUiIHk9IjIiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNMTIgMThoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/smartphone\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Smartphone = createLucideIcon('smartphone', __iconNode);\n\nexport default Smartphone;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z',\n key: 'xwnzip',\n },\n ],\n ['path', { d: 'M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6', key: '14rsvq' }],\n];\n\n/**\n * @component @name SquareMousePointer\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuMDM0IDEyLjY4MWEuNDk4LjQ5OCAwIDAgMSAuNjQ3LS42NDdsOSAzLjVhLjUuNSAwIDAgMS0uMDMzLjk0M2wtMy40NDQgMS4wNjhhMSAxIDAgMCAwLS42Ni42NmwtMS4wNjcgMy40NDNhLjUuNSAwIDAgMS0uOTQzLjAzM3oiIC8+CiAgPHBhdGggZD0iTTIxIDExVjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/square-mouse-pointer\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareMousePointer = createLucideIcon('square-mouse-pointer', __iconNode);\n\nexport default SquareMousePointer;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z',\n key: '1dfntj',\n },\n ],\n ['path', { d: 'M15 3v5a1 1 0 0 0 1 1h5', key: '6s6qgf' }],\n];\n\n/**\n * @component @name StickyNote\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgOWEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTUgM0g1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yeiIgLz4KICA8cGF0aCBkPSJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/sticky-note\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst StickyNote = createLucideIcon('sticky-note', __iconNode);\n\nexport default StickyNote;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v12', key: '1x0j5s' }],\n ['path', { d: 'm17 8-5-5-5 5', key: '7q97r8' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n];\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxMiIgLz4KICA8cGF0aCBkPSJtMTcgOC01LTUtNSA1IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('upload', __iconNode);\n\nexport default Upload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","import type { ReviewItemScope } from '../types';\nimport type { ReviewQaFilter, ReviewShellTheme } from './types';\n\nexport const REVIEW_QA_FILTERS: Array<{\n key: ReviewQaFilter;\n label: string;\n scope?: ReviewItemScope;\n}> = [\n { key: 'all', label: 'All' },\n { key: 'mobile', label: 'Mobile', scope: 'mobile' },\n { key: 'tablet', label: 'Tablet', scope: 'tablet' },\n { key: 'desktop', label: 'Desktop', scope: 'desktop' },\n { key: 'wide', label: 'Wide', scope: 'wide' },\n];\n\nexport const FIGMA_OVERLAY_UNAVAILABLE_MESSAGE =\n '피그마 오버레이 디버깅이 안되는 해상도';\nexport const FIGMA_TOKEN_STORAGE_KEY = 'figma-token';\nexport const REVIEW_USER_ID_STORAGE_KEY = 'user-id';\nexport const REVIEW_THEME_STORAGE_KEY = 'df-review-theme';\nexport const DEFAULT_REVIEW_THEME: ReviewShellTheme = 'dark';\nexport const FIGMA_TOKEN_GUIDE_ID = 'df-review-figma-token-guide';\nexport const DEFAULT_INITIAL_REVIEW_PROMPT =\n 'You are fixing QA issues collected with df-web-review-kit. Use the copied QA prompt as the source of truth for page, viewport, selector, DOM metadata, coordinates, and user comment. Make the smallest code or CSS change that fixes the issue, preserve unrelated behavior, then verify the target viewport again.';\n\nexport const REVIEW_THEME_OPTIONS: Array<{\n value: ReviewShellTheme;\n label: string;\n}> = [\n { value: 'dark', label: 'Dark' },\n { value: 'light', label: 'Light' },\n { value: 'system', label: 'System' }\n];\n","import type { ReviewItem, ReviewSource } from '../types';\nimport type { ReviewShellViewportPreset } from './types';\n\nexport const DEFAULT_REVIEW_PATH_PREFIX = '/review';\n\nexport type ReviewAddressInput = {\n height?: number;\n itemId?: string | null;\n source?: ReviewSource;\n target: string;\n width?: number;\n};\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 parseReviewAddressInput = (\n value: string,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n): ReviewAddressInput => {\n const raw = value.trim();\n if (!raw) return { target: '/' };\n\n const parsedUrl = parseSameOriginUrl(raw);\n if (!parsedUrl) {\n return { target: normalizeTarget(raw, reviewPathPrefix) };\n }\n\n const reviewPrefix = normalizeReviewPathPrefix(reviewPathPrefix);\n const isReviewUrl =\n parsedUrl.pathname === reviewPrefix ||\n parsedUrl.pathname.startsWith(`${reviewPrefix}/`);\n\n if (!isReviewUrl) {\n return {\n target: normalizeTarget(parsedUrl.pathname, reviewPathPrefix),\n };\n }\n\n const source = parsedUrl.searchParams.get('source')?.trim();\n\n return {\n height: getPositiveParamNumber(parsedUrl.searchParams, 'h'),\n itemId: parsedUrl.searchParams.get('item'),\n source: source ? source as ReviewSource : undefined,\n target: normalizeTarget(\n parsedUrl.searchParams.get('target') ?? '/',\n reviewPathPrefix\n ),\n width: getPositiveParamNumber(parsedUrl.searchParams, 'w'),\n };\n};\n\nfunction parseSameOriginUrl(value: string) {\n if (typeof window === 'undefined') return null;\n\n try {\n const url = new URL(value, window.location.origin);\n return url.origin === window.location.origin ? url : null;\n } catch {\n return null;\n }\n}\n\nfunction getPositiveParamNumber(params: URLSearchParams, name: string) {\n const value = Number(params.get(name));\n return Number.isFinite(value) && value > 0 ? value : undefined;\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 = getShellUrlForItem(target, size, itemId, source);\n window.history.replaceState(null, '', `${url.pathname}${url.search}`);\n};\n\nexport const getShellUrlForItem = (\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 return url;\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 designWidth: preset.designWidth,\n designHeight: preset.designHeight\n }));\n\nexport const getIsFigmaOverlayAvailable = (preset: ReviewShellViewportPreset) => {\n const kind = getViewportPresetKind(preset);\n return kind === 'mobile' || kind === 'wide';\n};\n","import type { NumberedReviewItem, ReviewItem } from '../../types';\nimport { getItemTarget } from '../route';\n\nexport const getItemTitle = (item: ReviewItem) =>\n item.title || item.comment.split('\\n')[0] || item.kind;\n\nexport const formatItemMeta = (item: ReviewItem) => {\n const parts = [\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(item.viewport?.height ?? 0)}`\n ];\n\n if (item.scroll) {\n parts.push(\n `scroll ${Math.round(item.scroll.x)},${Math.round(item.scroll.y)}`\n );\n }\n\n return parts.join(' / ');\n};\n\nexport const formatPromptViewport = (item: ReviewItem) =>\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(\n item.viewport?.height ?? 0\n )}`;\n\nexport const formatPromptPoint = (point: { x: number; y: number } | undefined) =>\n point ? `x=${Math.round(point.x)}, y=${Math.round(point.y)}` : '(none)';\n\nexport const formatPromptSelection = (\n selection:\n | {\n x?: number;\n y?: number;\n left?: number;\n top?: number;\n width: number;\n height: number;\n }\n | undefined\n) => {\n if (!selection) return '(none)';\n\n const x = 'x' in selection ? selection.x : selection.left;\n const y = 'y' in selection ? selection.y : selection.top;\n return `x=${Math.round(x ?? 0)}, y=${Math.round(y ?? 0)}, width=${Math.round(\n selection.width\n )}, height=${Math.round(selection.height)}`;\n};\n\nexport const decodePromptHtmlEntities = (value: string) =>\n value.replace(\n /&(#\\d+|#x[\\da-f]+|lt|gt|quot|apos|amp);/gi,\n (match, entity: string) => {\n const normalized = entity.toLowerCase();\n\n if (normalized === 'lt') return '<';\n if (normalized === 'gt') return '>';\n if (normalized === 'quot') return '\"';\n if (normalized === 'apos') return \"'\";\n if (normalized === 'amp') return '&';\n\n const codePoint = normalized.startsWith('#x')\n ? Number.parseInt(normalized.slice(2), 16)\n : Number.parseInt(normalized.slice(1), 10);\n\n return Number.isFinite(codePoint)\n ? String.fromCodePoint(codePoint)\n : match;\n }\n );\n\nexport const getPromptAnchorCandidates = (item: ReviewItem) => {\n const anchor = item.anchor;\n if (!anchor) return [];\n\n const seen = new Set<string>();\n return [anchor, ...(anchor.candidates ?? [])].filter((candidate) => {\n const key = `${candidate.strategy}:${candidate.selector}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\nexport const formatPromptSourceHint = (item: ReviewItem) => {\n const source = item.anchor?.source;\n if (!source) return '(none)';\n\n return [\n `Component: ${source.component ?? '(unknown)'}`,\n `File: ${source.file ?? '(unknown)'}`,\n `Line: ${source.line ?? '(unknown)'}`,\n `Column: ${source.column ?? '(unknown)'}`,\n `Section index: ${source.sectionIndex ?? '(unknown)'}`,\n `Section id: ${source.sectionId ?? '(none)'}`,\n ].join('\\n');\n};\n\nexport const buildReviewItemPrompt = (\n numberedItem: NumberedReviewItem,\n reviewPathPrefix: string\n) => {\n const { item } = numberedItem;\n const anchor = item.anchor;\n const candidates = getPromptAnchorCandidates(item);\n const candidateLines =\n candidates.length > 0\n ? candidates\n .map((candidate, index) => {\n const confidence =\n typeof candidate.confidence === 'number'\n ? `, confidence=${Math.round(candidate.confidence * 100)}%`\n : '';\n const fingerprint = candidate.textFingerprint\n ? `, text=\"${candidate.textFingerprint}\"`\n : '';\n return `${index + 1}. ${candidate.selector} (${candidate.strategy}${confidence}${fingerprint})`;\n })\n .join('\\n')\n : '(none)';\n\n return [\n 'Fix this df-web-review-kit QA issue.',\n '',\n `Page: ${getItemTarget(item, reviewPathPrefix)}`,\n `URL: ${item.originalUrl ?? item.pageUrl}`,\n `QA item: ${numberedItem.displayLabel}`,\n `Viewport: ${numberedItem.label} ${formatPromptViewport(item)}`,\n `Scroll: ${formatPromptPoint(item.scroll)}`,\n '',\n 'Target:',\n `Primary selector: ${anchor?.selector ?? '(missing)'}`,\n `Primary strategy: ${anchor?.strategy ?? '(missing)'}`,\n `Text fingerprint: ${anchor?.textFingerprint ?? '(none)'}`,\n 'Selector candidates:',\n candidateLines,\n '',\n 'Source hint:',\n formatPromptSourceHint(item),\n '',\n `Marker: ${formatPromptPoint(item.marker?.viewport)}`,\n `Marker relative: ${formatPromptPoint(item.marker?.relative)}`,\n `Selection: ${formatPromptSelection(item.selection?.viewport)}`,\n `Selection relative: ${formatPromptSelection(item.selection?.relative)}`,\n '',\n 'Element HTML snippet:',\n '```html',\n anchor?.htmlSnippet\n ? decodePromptHtmlEntities(anchor.htmlSnippet)\n : '(not available)',\n '```',\n '',\n 'Issue:',\n item.comment,\n '',\n 'Request:',\n 'Find the target element with the selector candidates above and apply the smallest UI/CSS/code change that fixes this QA issue. If the selector is missing because CSR or hydration has not finished, wait for the page to load and use the Source hint first. Preserve unrelated layout and behavior.'\n ].join('\\n');\n};\n\nexport const getPromptLengthLabel = (value: string) => {\n const length = value.length;\n if (length <= 2000) return `${length} chars / Discord 2,000 OK`;\n if (length <= 4000) return `${length} chars / Nitro 4,000 OK`;\n return `${length} chars / attach as file`;\n};\n\nexport const formatDate = (value: string) => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return date.toLocaleString(undefined, {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n};\n","import { Copy as CopyIcon } from 'lucide-react';\nimport { getPromptLengthLabel } from './prompt';\n\ninterface PromptModalProps {\n initialPromptText: string;\n copiedPromptKey: string | null;\n onClose: () => void;\n onCopyPrompt: (text: string, key: string) => void;\n}\n\nconst ABOUT_SECTIONS = [\n {\n title: 'What this is',\n body:\n 'df-web-review-kit is a project-embedded review shell. It mounts a /review page, opens real host pages in an iframe, and lets reviewers create QA notes, area markers, and DOM markers against the actual implementation instead of a separate screenshot tool.',\n },\n {\n title: 'How to setup',\n body:\n 'Install the package, mount the review route in the host project, and choose the storage adapters for that project. Local drafts work by default; shared remote QA and realtime presence depend on the host project configuration.',\n },\n {\n title: 'Figma token',\n body:\n 'Add a browser-safe Figma token in Settings only when the host page already supports the Figma overlay helper. The package stores it in localStorage as figma-token and does not own a server-side Figma integration.',\n },\n {\n title: 'User ID',\n body:\n 'Set your User ID in Settings before reviewing. It is used for presence, online user pills, and author context so teammates can tell who is looking at the same project or route.',\n },\n {\n title: 'Remote',\n body:\n 'Remote QA is optional and project-specific. If you need shared canonical items, Supabase, or realtime presence, ask the project owner or 담당 개발자 which remote adapter and browser-safe env values are connected. Never put service_role or operator secrets in the browser.',\n },\n];\n\nexport const PromptModal = ({\n initialPromptText,\n copiedPromptKey,\n onClose,\n onCopyPrompt,\n}: PromptModalProps) => {\n return (\n <div\n aria-label=\"Review help\"\n aria-modal=\"true\"\n className=\"df-review-prompt-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close help\"\n className=\"df-review-prompt-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-prompt-dialog\">\n <div className=\"df-review-prompt-header\">\n <div>\n <strong>Review shell help</strong>\n <span>About / Initial prompt</span>\n </div>\n <button aria-label=\"Close help\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n <div className=\"df-review-prompt-body\">\n <section\n className=\"df-review-prompt-about\"\n aria-labelledby=\"df-review-about-title\"\n >\n <div className=\"df-review-prompt-section-header\">\n <strong id=\"df-review-about-title\">About</strong>\n <span>Program overview and setup notes</span>\n </div>\n <div className=\"df-review-prompt-about-grid\">\n {ABOUT_SECTIONS.map((section) => (\n <article key={section.title}>\n <strong>{section.title}</strong>\n <p>{section.body}</p>\n </article>\n ))}\n </div>\n </section>\n <section\n className=\"df-review-prompt-block\"\n aria-labelledby=\"df-review-initial-prompt-title\"\n >\n <div className=\"df-review-prompt-block-header\">\n <div>\n <strong id=\"df-review-initial-prompt-title\">\n Initial Prompt\n </strong>\n <span>{getPromptLengthLabel(initialPromptText)}</span>\n </div>\n <button\n disabled={!initialPromptText}\n type=\"button\"\n onClick={() => onCopyPrompt(initialPromptText, 'initial')}\n >\n <CopyIcon aria-hidden=\"true\" />\n {copiedPromptKey === 'initial' ? 'Copied' : 'Copy'}\n </button>\n </div>\n <textarea\n readOnly\n aria-label=\"Initial Prompt content\"\n value={initialPromptText || 'Initial prompt is not configured.'}\n />\n </section>\n </div>\n </div>\n </div>\n );\n};\n","import type { ReviewShellTheme } from './types';\nimport {\n DEFAULT_REVIEW_THEME,\n FIGMA_TOKEN_STORAGE_KEY,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from './constants';\n\nexport const normalizeReviewTheme = (value: string | null): ReviewShellTheme =>\n value === 'light' || value === 'system' || value === 'dark'\n ? value\n : DEFAULT_REVIEW_THEME;\n\nexport const getStoredFigmaToken = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return window.localStorage.getItem(FIGMA_TOKEN_STORAGE_KEY) ?? '';\n } catch {\n return '';\n }\n};\n\nexport const writeStoredFigmaToken = (token: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (token) {\n window.localStorage.setItem(FIGMA_TOKEN_STORAGE_KEY, token);\n } else {\n window.localStorage.removeItem(FIGMA_TOKEN_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewUserId = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return window.localStorage.getItem(REVIEW_USER_ID_STORAGE_KEY) ?? '';\n } catch {\n return '';\n }\n};\n\nexport const writeStoredReviewUserId = (userId: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (userId) {\n window.localStorage.setItem(REVIEW_USER_ID_STORAGE_KEY, userId);\n } else {\n window.localStorage.removeItem(REVIEW_USER_ID_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewTheme = () => {\n if (typeof window === 'undefined') return DEFAULT_REVIEW_THEME;\n\n try {\n return normalizeReviewTheme(\n window.localStorage.getItem(REVIEW_THEME_STORAGE_KEY)\n );\n } catch {\n return DEFAULT_REVIEW_THEME;\n }\n};\n\nexport const writeStoredReviewTheme = (theme: ReviewShellTheme) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (theme === DEFAULT_REVIEW_THEME) {\n window.localStorage.removeItem(REVIEW_THEME_STORAGE_KEY);\n } else {\n window.localStorage.setItem(REVIEW_THEME_STORAGE_KEY, theme);\n }\n } catch {\n return;\n }\n};\n\nexport const getSystemReviewTheme = (): Exclude<ReviewShellTheme, 'system'> => {\n if (typeof window === 'undefined' || !window.matchMedia) return 'dark';\n return window.matchMedia('(prefers-color-scheme: light)').matches\n ? 'light'\n : 'dark';\n};\n","import {\n CircleHelp as CircleHelpIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n} from 'lucide-react';\nimport {\n DEFAULT_REVIEW_THEME,\n FIGMA_TOKEN_GUIDE_ID,\n FIGMA_TOKEN_STORAGE_KEY,\n REVIEW_THEME_OPTIONS,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from '../constants';\nimport { normalizeReviewTheme } from '../settings';\nimport type { ReviewShellTheme } from '../types';\n\ninterface ReviewSettingsModalProps {\n figmaTokenDraft: string;\n reviewUserIdDraft: string;\n reviewThemeDraft: ReviewShellTheme;\n figmaSettingsStatus: string;\n isFigmaTokenVisible: boolean;\n isFigmaTokenGuideOpen: boolean;\n onClose: () => void;\n onFigmaTokenDraftChange: (value: string) => void;\n onReviewUserIdDraftChange: (value: string) => void;\n onReviewThemeDraftChange: (value: ReviewShellTheme) => void;\n onClearStatus: () => void;\n onToggleFigmaTokenVisible: () => void;\n onToggleFigmaTokenGuide: () => void;\n onSave: (\n figmaToken: string,\n reviewUserId: string,\n reviewTheme: ReviewShellTheme\n ) => void;\n}\n\nexport const ReviewSettingsModal = ({\n figmaTokenDraft,\n reviewUserIdDraft,\n reviewThemeDraft,\n figmaSettingsStatus,\n isFigmaTokenVisible,\n isFigmaTokenGuideOpen,\n onClose,\n onFigmaTokenDraftChange,\n onReviewUserIdDraftChange,\n onReviewThemeDraftChange,\n onClearStatus,\n onToggleFigmaTokenVisible,\n onToggleFigmaTokenGuide,\n onSave,\n}: ReviewSettingsModalProps) => {\n return (\n <div\n aria-label=\"Review settings\"\n aria-modal=\"true\"\n className=\"df-review-settings-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close settings\"\n className=\"df-review-settings-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <form\n className=\"df-review-settings-dialog\"\n onSubmit={(event) => {\n event.preventDefault();\n onSave(figmaTokenDraft, reviewUserIdDraft, reviewThemeDraft);\n }}\n >\n <div className=\"df-review-settings-header\">\n <div className=\"df-review-settings-title\">\n <strong>Settings</strong>\n <span>\n {FIGMA_TOKEN_STORAGE_KEY} / {REVIEW_USER_ID_STORAGE_KEY} /{' '}\n {REVIEW_THEME_STORAGE_KEY}\n </span>\n </div>\n <div className=\"df-review-settings-header-actions\">\n <button aria-label=\"Close settings\" type=\"button\" onClick={onClose}>\n x\n </button>\n </div>\n </div>\n <div className=\"df-review-settings-body\">\n <div className=\"df-review-settings-row\">\n <span>Theme</span>\n <div className=\"df-review-settings-theme-options\">\n {REVIEW_THEME_OPTIONS.map((option) => (\n <button\n aria-pressed={reviewThemeDraft === option.value}\n className={`df-review-settings-theme-option${\n reviewThemeDraft === option.value ? ' is-active' : ''\n }`}\n key={option.value}\n type=\"button\"\n onClick={() => {\n onReviewThemeDraftChange(normalizeReviewTheme(option.value));\n onClearStatus();\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n <div className=\"df-review-settings-field\">\n <div className=\"df-review-settings-label-row\">\n <label htmlFor=\"df-review-figma-token\">Figma token</label>\n <button\n aria-controls={FIGMA_TOKEN_GUIDE_ID}\n aria-expanded={isFigmaTokenGuideOpen}\n aria-label=\"Show Figma token guide\"\n className={`df-review-settings-help-button${\n isFigmaTokenGuideOpen ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={onToggleFigmaTokenGuide}\n >\n <CircleHelpIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-settings-token-input\">\n <input\n id=\"df-review-figma-token\"\n aria-label=\"Figma token\"\n aria-describedby={\n isFigmaTokenGuideOpen ? FIGMA_TOKEN_GUIDE_ID : undefined\n }\n autoCapitalize=\"off\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n className={isFigmaTokenVisible ? undefined : 'is-token-masked'}\n data-1p-ignore=\"true\"\n data-lpignore=\"true\"\n inputMode=\"text\"\n name=\"df-review-figma-access-key\"\n spellCheck={false}\n type=\"text\"\n value={figmaTokenDraft}\n onChange={(event) => {\n onFigmaTokenDraftChange(event.target.value);\n onClearStatus();\n }}\n />\n <button\n aria-label={\n isFigmaTokenVisible\n ? 'Hide Figma token'\n : 'Show Figma token'\n }\n className=\"df-review-settings-token-toggle\"\n type=\"button\"\n onClick={onToggleFigmaTokenVisible}\n >\n {isFigmaTokenVisible ? (\n <EyeOffIcon aria-hidden=\"true\" />\n ) : (\n <EyeIcon aria-hidden=\"true\" />\n )}\n </button>\n </div>\n {isFigmaTokenGuideOpen && (\n <div\n className=\"df-review-settings-guide\"\n id={FIGMA_TOKEN_GUIDE_ID}\n >\n <ol>\n <li>Figma file browser에서 account menu를 열고 Settings로 이동</li>\n <li>Security 탭의 Personal access tokens로 이동</li>\n <li>Generate new token에서 이름과 scope를 정한 뒤 생성</li>\n <li>생성된 token을 복사해서 여기에 붙여넣기</li>\n </ol>\n </div>\n )}\n </div>\n <label className=\"df-review-settings-field\">\n <span>User ID</span>\n <div className=\"df-review-settings-text-input\">\n <input\n aria-label=\"Review user ID\"\n autoComplete=\"off\"\n spellCheck={false}\n type=\"text\"\n value={reviewUserIdDraft}\n onChange={(event) => {\n onReviewUserIdDraftChange(event.target.value);\n onClearStatus();\n }}\n />\n </div>\n </label>\n\n {figmaSettingsStatus && (\n <p className=\"df-review-settings-status\">{figmaSettingsStatus}</p>\n )}\n <div className=\"df-review-settings-actions\">\n <button\n type=\"button\"\n onClick={() => onSave('', '', DEFAULT_REVIEW_THEME)}\n >\n Clear\n </button>\n <span />\n <button type=\"button\" onClick={onClose}>\n Cancel\n </button>\n <button type=\"submit\">Save</button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n","import {\n useMemo,\n useState,\n type CSSProperties,\n} from 'react';\nimport type {\n ReviewPresenceUser,\n ReviewShellPage,\n} from '../types';\nimport {\n createSitemapRows,\n type SitemapQaCount,\n type SitemapSortDirection,\n type SitemapSortKey,\n} from './tree';\n\ninterface SitemapModalProps {\n pages: ReviewShellPage[];\n activeRoute: string;\n allQaCount: SitemapQaCount;\n isAllQaVisible: boolean;\n pageQaCounts: ReadonlyMap<string, SitemapQaCount>;\n pagePresenceUsers: ReadonlyMap<string, ReviewPresenceUser[]>;\n getPageTarget: (href: string) => string;\n onClose: () => void;\n onSelectAllQa: () => void;\n onSelectPage: (href: string) => void;\n}\n\ntype SortState = {\n key: SitemapSortKey;\n direction: SitemapSortDirection;\n};\n\ntype SortHeader = {\n key: SitemapSortKey;\n label: string;\n title?: string;\n className?: string;\n};\n\nconst getNextSortDirection = (\n current: SortState,\n key: SitemapSortKey\n): SitemapSortDirection => {\n if (current.key !== key) return key === 'page' ? 'asc' : 'desc';\n\n return current.direction === 'desc' ? 'asc' : 'desc';\n};\n\nconst getSortIndicator = (sort: SortState, key: SitemapSortKey) => {\n if (sort.key !== key) return '';\n\n return sort.direction === 'desc' ? '↓' : '↑';\n};\n\nconst mergePresenceUsers = (users: ReviewPresenceUser[]) => {\n const userByKey = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const key = user.sessionId || user.userId;\n const currentUser = userByKey.get(key);\n\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userByKey.set(key, user);\n }\n });\n\n return Array.from(userByKey.values());\n};\n\nexport const SitemapModal = ({\n pages,\n activeRoute,\n allQaCount,\n isAllQaVisible,\n pageQaCounts,\n pagePresenceUsers,\n getPageTarget,\n onClose,\n onSelectAllQa,\n onSelectPage,\n}: SitemapModalProps) => {\n const [sort, setSort] = useState<SortState>({\n key: 'total',\n direction: 'desc',\n });\n const allQaUsers = useMemo(\n () => mergePresenceUsers(Array.from(pagePresenceUsers.values()).flat()),\n [pagePresenceUsers]\n );\n const sitemapRows = createSitemapRows(\n pages,\n activeRoute,\n pageQaCounts,\n pagePresenceUsers,\n getPageTarget,\n {\n sortKey: sort.key,\n sortDirection: sort.direction,\n }\n );\n const gridStyle = {\n '--df-review-sitemap-grid-template': 'minmax(190px, 1fr) 74px 78px 64px minmax(108px, 160px)',\n } as CSSProperties;\n const sortHeaders: SortHeader[] = [\n { key: 'page', label: '', title: 'Page', className: 'is-page' },\n { key: 'total', label: 'Total', title: 'Remaining total' },\n { key: 'review', label: 'Review' },\n { key: 'hold', label: 'Hold' },\n { key: 'online', label: 'Online', className: 'is-online' },\n ];\n const setSortKey = (key: SitemapSortKey) => {\n setSort((current) => ({\n key,\n direction: getNextSortDirection(current, key),\n }));\n };\n\n return (\n <div\n aria-label=\"Sitemap\"\n aria-modal=\"true\"\n className=\"df-review-sitemap-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close sitemap\"\n className=\"df-review-sitemap-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-sitemap-dialog\">\n <div className=\"df-review-sitemap-header\">\n <div>\n <strong>Sitemap</strong>\n <span>\n {pages.length} pages · {allQaCount.remaining} remaining ·{' '}\n {allQaCount.status.review} review · {allQaCount.status.hold} hold\n </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\" style={gridStyle}>\n <div className=\"df-review-sitemap-table-head\" role=\"row\">\n {sortHeaders.map((header) => (\n <button\n key={header.key}\n aria-label={`Sort sitemap by ${header.title ?? header.label}`}\n className={[\n 'df-review-sitemap-sort',\n header.className ?? '',\n sort.key === header.key ? 'is-active' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n title={header.title ?? header.label}\n type=\"button\"\n onClick={() => setSortKey(header.key)}\n >\n <span\n aria-hidden=\"true\"\n className=\"df-review-sitemap-sort-indicator\"\n >\n {getSortIndicator(sort, header.key)}\n </span>\n <span className=\"df-review-sitemap-sort-label\">\n {header.label}\n </span>\n </button>\n ))}\n </div>\n {sitemapRows.map((row) => {\n const rowClassName = [\n 'df-review-sitemap-row',\n row.isPage ? 'is-page' : 'is-folder',\n row.isActive ? 'is-active' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const rowContent = (\n <SitemapRowContent\n label={row.label}\n prefix={row.prefix}\n qaCount={row.qaCount}\n users={row.users}\n />\n );\n\n if (!row.isPage) {\n return (\n <div\n key={row.href}\n aria-label={`${row.href} group / ${row.qaCount.remaining} remaining / ${row.qaCount.status.review} review / ${row.qaCount.status.hold} hold / ${row.users.length} online`}\n className={rowClassName}\n role=\"row\"\n >\n {rowContent}\n </div>\n );\n }\n\n return (\n <button\n key={row.href}\n aria-label={`${row.href} / ${row.qaCount.remaining} remaining / ${row.qaCount.status.review} review / ${row.qaCount.status.hold} hold / ${row.users.length} online`}\n className={rowClassName}\n type=\"button\"\n onClick={() => onSelectPage(row.href)}\n >\n {rowContent}\n </button>\n );\n })}\n <button\n aria-label={`All QA / ${allQaCount.remaining} remaining / ${allQaCount.status.review} review / ${allQaCount.status.hold} hold`}\n className={`df-review-sitemap-row is-summary${\n isAllQaVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={onSelectAllQa}\n >\n <SitemapRowContent\n label=\"\"\n prefix=\"\"\n qaCount={allQaCount}\n users={allQaUsers}\n />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nconst SitemapRowContent = ({\n label,\n prefix,\n qaCount,\n users,\n}: {\n label: string;\n prefix: string;\n qaCount: SitemapQaCount;\n users: ReviewPresenceUser[];\n}) => (\n <>\n <span className=\"df-review-sitemap-path\">\n <span className=\"df-review-sitemap-tree-prefix\">{prefix}</span>\n <span className=\"df-review-sitemap-label\">{label}</span>\n </span>\n <span className=\"df-review-sitemap-cell is-total\">\n <strong>{qaCount.remaining}</strong>\n </span>\n <span className=\"df-review-sitemap-cell is-review\">\n {qaCount.status.review}\n </span>\n <span className=\"df-review-sitemap-cell is-hold\">\n {qaCount.status.hold}\n </span>\n <span className=\"df-review-sitemap-cell is-online\">\n {users.length > 0 ? (\n <span className=\"df-review-sitemap-users\">\n {users.map((user) => (\n <span\n key={user.sessionId}\n className=\"df-review-sitemap-user\"\n style={{\n '--df-review-presence-color': user.color,\n } as CSSProperties}\n >\n {user.userId}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n </>\n);\n","import type {\n ReviewItemScope,\n ReviewWorkflowStatus,\n} from '../../types';\nimport type {\n ReviewPresenceUser,\n ReviewShellPage,\n ReviewShellViewportPreset,\n} from '../types';\n\nexport type SitemapViewportCount = {\n total: number;\n remaining: number;\n};\n\nexport type SitemapViewportColumn = {\n key: string;\n label: string;\n title: string;\n};\n\nexport type SitemapQaCount = {\n total: number;\n remaining: number;\n local: number;\n remote: number;\n status: Record<ReviewWorkflowStatus, number>;\n scope: Partial<Record<ReviewItemScope, number>>;\n viewport: Record<string, SitemapViewportCount>;\n};\n\ntype SitemapTreeNode = {\n href: string;\n label: string;\n isPage: boolean;\n children: Map<string, SitemapTreeNode>;\n};\n\nexport type SitemapTreeRow = {\n href: string;\n label: string;\n prefix: string;\n isPage: boolean;\n isActive: boolean;\n qaCount: SitemapQaCount;\n users: ReviewPresenceUser[];\n};\n\nexport type SitemapSortDirection = 'asc' | 'desc';\n\nexport type SitemapSortKey =\n | 'page'\n | 'total'\n | 'review'\n | 'hold'\n | 'online'\n | `viewport:${string}`;\n\nconst WORKFLOW_STATUSES: ReviewWorkflowStatus[] = [\n 'todo',\n 'doing',\n 'review',\n 'hold',\n 'done',\n];\n\nexport const createEmptySitemapQaCount = (): SitemapQaCount => ({\n total: 0,\n remaining: 0,\n local: 0,\n remote: 0,\n status: {\n todo: 0,\n doing: 0,\n review: 0,\n hold: 0,\n done: 0,\n },\n scope: {},\n viewport: {},\n});\n\nexport const createSitemapViewportColumn = (\n preset: ReviewShellViewportPreset,\n index: number\n): SitemapViewportColumn => ({\n key: `${index}:${preset.width}x${preset.height}`,\n label: preset.label,\n title: `${preset.label} ${preset.width}x${preset.height}`,\n});\n\nconst normalizeSitemapHref = (href: string) => {\n const [path = '/'] = href.split(/[?#]/);\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n return normalizedPath || '/';\n};\n\nconst getSitemapSegments = (href: string) =>\n normalizeSitemapHref(href)\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean);\n\nconst createSitemapNode = (\n href: string,\n label: string,\n isPage = false\n): SitemapTreeNode => ({\n href,\n label,\n isPage,\n children: new Map(),\n});\n\nconst mergeSitemapUsers = (users: ReviewPresenceUser[]) => {\n const userByKey = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const key = user.sessionId || user.userId;\n const currentUser = userByKey.get(key);\n\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userByKey.set(key, user);\n }\n });\n\n return Array.from(userByKey.values());\n};\n\nexport const addSitemapQaCounts = (\n first: SitemapQaCount,\n second: SitemapQaCount\n): SitemapQaCount => ({\n total: first.total + second.total,\n remaining: first.remaining + second.remaining,\n local: first.local + second.local,\n remote: first.remote + second.remote,\n status: WORKFLOW_STATUSES.reduce(\n (statusCounts, status) => ({\n ...statusCounts,\n [status]: first.status[status] + second.status[status],\n }),\n {} as Record<ReviewWorkflowStatus, number>\n ),\n scope: Array.from(\n new Set([\n ...Object.keys(first.scope),\n ...Object.keys(second.scope),\n ] as ReviewItemScope[])\n ).reduce(\n (scopeCounts, scope) => ({\n ...scopeCounts,\n [scope]: (first.scope[scope] ?? 0) + (second.scope[scope] ?? 0),\n }),\n {} as Partial<Record<ReviewItemScope, number>>\n ),\n viewport: Array.from(\n new Set([...Object.keys(first.viewport), ...Object.keys(second.viewport)])\n ).reduce(\n (viewportCounts, viewportKey) => ({\n ...viewportCounts,\n [viewportKey]: {\n total:\n (first.viewport[viewportKey]?.total ?? 0) +\n (second.viewport[viewportKey]?.total ?? 0),\n remaining:\n (first.viewport[viewportKey]?.remaining ?? 0) +\n (second.viewport[viewportKey]?.remaining ?? 0),\n },\n }),\n {} as Record<string, SitemapViewportCount>\n ),\n});\n\ntype SitemapTreeSummary = {\n node: SitemapTreeNode;\n directCount: SitemapQaCount;\n directUsers: ReviewPresenceUser[];\n count: SitemapQaCount;\n users: ReviewPresenceUser[];\n children: SitemapTreeSummary[];\n};\n\nexport const createSitemapRows = (\n pages: ReviewShellPage[],\n activeRoute: string,\n pageQaCounts: ReadonlyMap<string, SitemapQaCount>,\n pagePresenceUsers: ReadonlyMap<string, ReviewPresenceUser[]>,\n getPageTarget: (href: string) => string,\n options: {\n sortKey?: SitemapSortKey;\n sortDirection?: SitemapSortDirection;\n } = {}\n) => {\n const sortKey = options.sortKey ?? 'page';\n const sortDirection = options.sortDirection ?? 'asc';\n const root = createSitemapNode('/', '/', false);\n\n pages.forEach((page) => {\n const pageHref = page.href.startsWith('/') ? page.href : `/${page.href}`;\n const pathHref = normalizeSitemapHref(pageHref);\n const segments = getSitemapSegments(pathHref);\n\n if (segments.length === 0) {\n root.href = pageHref;\n root.isPage = true;\n return;\n }\n\n let parent = root;\n\n segments.forEach((segment, segmentIndex) => {\n const isLastSegment = segmentIndex === segments.length - 1;\n const segmentPath = `/${segments.slice(0, segmentIndex + 1).join('/')}`;\n const segmentHref = isLastSegment ? pageHref : `${segmentPath}/`;\n const segmentLabel = `${segment}${\n !isLastSegment || pathHref.endsWith('/') ? '/' : ''\n }`;\n const existingNode = parent.children.get(segment);\n const node =\n existingNode ?? createSitemapNode(segmentHref, segmentLabel, false);\n\n node.href = isLastSegment ? pageHref : node.href;\n node.label = isLastSegment ? segmentLabel : node.label;\n node.isPage = node.isPage || isLastSegment;\n parent.children.set(segment, node);\n parent = node;\n });\n });\n\n const getDirectCount = (node: SitemapTreeNode) => {\n if (!node.isPage) return createEmptySitemapQaCount();\n\n return (\n pageQaCounts.get(getPageTarget(node.href)) ??\n createEmptySitemapQaCount()\n );\n };\n\n const getDirectUsers = (node: SitemapTreeNode) => {\n if (!node.isPage) return [];\n\n return pagePresenceUsers.get(getPageTarget(node.href)) ?? [];\n };\n\n const createNodeSummary = (node: SitemapTreeNode): SitemapTreeSummary => {\n const directCount = getDirectCount(node);\n const directUsers = getDirectUsers(node);\n const children = Array.from(node.children.values()).map(createNodeSummary);\n const childAggregate = children.reduce(\n (aggregate, child) => ({\n count: addSitemapQaCounts(aggregate.count, child.count),\n users: mergeSitemapUsers([...aggregate.users, ...child.users]),\n }),\n {\n count: createEmptySitemapQaCount(),\n users: [] as ReviewPresenceUser[],\n }\n );\n\n return {\n node,\n directCount,\n directUsers,\n count: node.isPage\n ? addSitemapQaCounts(directCount, childAggregate.count)\n : childAggregate.count,\n users: mergeSitemapUsers([...directUsers, ...childAggregate.users]),\n children,\n };\n };\n\n const getSortValue = (summary: SitemapTreeSummary) => {\n if (sortKey === 'page') return summary.node.label;\n if (sortKey === 'total') return summary.count.remaining;\n if (sortKey === 'review') return summary.count.status.review;\n if (sortKey === 'hold') return summary.count.status.hold;\n if (sortKey === 'online') return summary.users.length;\n if (sortKey.startsWith('viewport:')) {\n const viewportKey = sortKey.slice('viewport:'.length);\n return summary.count.viewport[viewportKey]?.remaining ?? 0;\n }\n\n return 0;\n };\n\n const sortSummaries = (summaries: SitemapTreeSummary[]) => {\n return [...summaries].sort((a, b) => {\n const firstValue = getSortValue(a);\n const secondValue = getSortValue(b);\n const valueDiff =\n typeof firstValue === 'string' && typeof secondValue === 'string'\n ? firstValue.localeCompare(secondValue)\n : Number(firstValue) - Number(secondValue);\n\n if (valueDiff !== 0) {\n return sortDirection === 'asc' ? valueDiff : -valueDiff;\n }\n\n const totalDiff = b.count.remaining - a.count.remaining;\n if (totalDiff !== 0) return totalDiff;\n return a.node.label.localeCompare(b.node.label);\n });\n };\n\n const rows: SitemapTreeRow[] = [];\n\n const appendSummaryRows = (\n summary: SitemapTreeSummary,\n depth: number,\n ancestorLastList: boolean[],\n isLastNode: boolean\n ) => {\n const { node } = summary;\n const rowCount = node.isPage ? summary.directCount : summary.count;\n const rowUsers = node.isPage ? summary.directUsers : summary.users;\n\n if (node.isPage || depth > 0) {\n const prefix =\n depth === 0\n ? ''\n : `${ancestorLastList.map((isLast) => (isLast ? ' ' : '│ ')).join('')}${\n isLastNode ? '└─ ' : '├─ '\n }`;\n const pageTarget = node.isPage ? getPageTarget(node.href) : null;\n\n rows.push({\n href: node.href,\n label: node.label,\n prefix,\n isPage: node.isPage,\n isActive: pageTarget === activeRoute,\n qaCount: rowCount,\n users: rowUsers,\n });\n }\n\n const visibleChildren = sortSummaries(summary.children);\n visibleChildren.forEach((child, childIndex) => {\n appendSummaryRows(\n child,\n depth + 1,\n depth === 0 ? [] : [...ancestorLastList, isLastNode],\n childIndex === visibleChildren.length - 1\n );\n });\n };\n\n if (root.isPage) {\n const directCount = getDirectCount(root);\n const directUsers = getDirectUsers(root);\n\n rows.push({\n href: root.href,\n label: root.label,\n prefix: '',\n isPage: true,\n isActive: getPageTarget(root.href) === activeRoute,\n qaCount: directCount,\n users: directUsers,\n });\n }\n\n const rootSummaries = sortSummaries(\n Array.from(root.children.values()).map(createNodeSummary)\n );\n\n rootSummaries.forEach((summary, index, siblings) => {\n appendSummaryRows(summary, 1, [], index === siblings.length - 1);\n });\n\n return rows;\n};\n","import type { ReviewShellViewportPreset } from './types';\nimport { getViewportPresetKind } from './viewport';\n\nexport type ReviewFigmaFrameConfig = {\n desktopNodeId?: string;\n mobileNodeId?: string;\n};\n\ntype ReviewFigmaWindow = Window & {\n __figma?: ReviewFigmaFrameConfig;\n};\n\nexport function getTargetFigmaFrameConfig(\n targetWindow: Window | null | undefined\n): ReviewFigmaFrameConfig | null {\n try {\n const config = (targetWindow as ReviewFigmaWindow | null)?.__figma;\n if (!config || typeof config !== 'object') return null;\n\n const desktopNodeId = normalizeFigmaNodeValue(config.desktopNodeId);\n const mobileNodeId = normalizeFigmaNodeValue(config.mobileNodeId);\n\n if (!desktopNodeId && !mobileNodeId) return null;\n\n return {\n desktopNodeId,\n mobileNodeId,\n };\n } catch {\n return null;\n }\n}\n\nexport function getFigmaFrameUrl(\n config: ReviewFigmaFrameConfig | null | undefined,\n preset: ReviewShellViewportPreset\n) {\n if (!config) return null;\n\n const kind = getViewportPresetKind(preset);\n const value =\n kind === 'mobile' ? config.mobileNodeId : config.desktopNodeId;\n\n return value ? createFigmaFrameUrl(value) : null;\n}\n\nfunction normalizeFigmaNodeValue(value: unknown) {\n return typeof value === 'string' ? value.trim() || undefined : undefined;\n}\n\nfunction createFigmaFrameUrl(value: string) {\n const [fileKey, nodeId] = value.split('->').map((part) => part.trim());\n if (!fileKey || !nodeId) return null;\n\n const urlNodeId = encodeURIComponent(nodeId.replace(/:/g, '-'));\n return `https://www.figma.com/design/${encodeURIComponent(\n fileKey\n )}?node-id=${urlNodeId}`;\n}\n","import { useEffect, useState } from 'react';\nimport type { ReviewItem } from '../../types';\n\ninterface QaItemEditModalProps {\n item: ReviewItem;\n onClose: () => void;\n onSave: (item: ReviewItem, comment: string) => Promise<void>;\n}\n\nexport const QaItemEditModal = ({\n item,\n onClose,\n onSave,\n}: QaItemEditModalProps) => {\n const [commentDraft, setCommentDraft] = useState(item.comment);\n const [error, setError] = useState('');\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setCommentDraft(item.comment);\n setError('');\n setIsSaving(false);\n }, [item.id, item.comment]);\n\n const saveComment = async () => {\n const nextComment = commentDraft.trim();\n if (!nextComment) {\n setError('Comment is required.');\n return;\n }\n\n setError('');\n setIsSaving(true);\n try {\n await onSave(item, nextComment);\n } catch (error) {\n setError(\n error instanceof Error ? error.message : 'Failed to update QA comment.'\n );\n setIsSaving(false);\n }\n };\n\n return (\n <div\n aria-modal=\"true\"\n className=\"df-review-edit-modal\"\n role=\"dialog\"\n aria-labelledby=\"df-review-edit-title\"\n >\n <button\n aria-label=\"Close edit dialog\"\n className=\"df-review-settings-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <form\n className=\"df-review-edit-dialog\"\n onSubmit={(event) => {\n event.preventDefault();\n void saveComment();\n }}\n >\n <header className=\"df-review-settings-header\">\n <div className=\"df-review-settings-title\">\n <strong id=\"df-review-edit-title\">Edit QA comment</strong>\n <span>Update the text shown on this QA item.</span>\n </div>\n <div className=\"df-review-settings-header-actions\">\n <button\n aria-label=\"Close edit dialog\"\n type=\"button\"\n onClick={onClose}\n >\n x\n </button>\n </div>\n </header>\n <div className=\"df-review-settings-body df-review-edit-body\">\n <label className=\"df-review-settings-field\">\n <span>Comment</span>\n <div className=\"df-review-settings-text-input df-review-edit-textarea\">\n <textarea\n autoFocus\n value={commentDraft}\n onChange={(event) => {\n setCommentDraft(event.target.value);\n if (error) setError('');\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onClose();\n }\n if (\n (event.metaKey || event.ctrlKey) &&\n event.key === 'Enter'\n ) {\n event.preventDefault();\n void saveComment();\n }\n }}\n />\n </div>\n </label>\n {error && <p className=\"df-review-edit-error\">{error}</p>}\n <footer className=\"df-review-settings-actions df-review-edit-actions\">\n <span />\n <button disabled={isSaving} type=\"button\" onClick={onClose}>\n Cancel\n </button>\n <button disabled={isSaving} type=\"submit\">\n {isSaving ? 'Saving…' : 'Save'}\n </button>\n </footer>\n </div>\n </form>\n </div>\n );\n};\n","import {\n ExternalLink as ExternalLinkIcon,\n Upload as UploadIcon,\n} from 'lucide-react';\nimport type { NumberedReviewItem, ReviewItem } from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\n\ninterface QaItemRemoteActionsProps {\n isRemoteSource: boolean;\n isSubmitted: boolean;\n isSubmitting: boolean;\n item: ReviewItem;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n}\n\nexport const QaItemRemoteActions = ({\n isRemoteSource,\n isSubmitted,\n isSubmitting,\n item,\n numberedItem,\n remoteAdapterEntry,\n onSubmitItem,\n}: QaItemRemoteActionsProps) => {\n const canSubmitToRemote = !isRemoteSource && Boolean(remoteAdapterEntry);\n const canOpenRemoteIssue = !isRemoteSource && Boolean(item.externalIssueUrl);\n const hasRemoteActions = canSubmitToRemote || canOpenRemoteIssue;\n\n if (!hasRemoteActions) return null;\n\n return (\n <div\n className=\"df-review-item-remote-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canSubmitToRemote && remoteAdapterEntry && (\n <button\n aria-label=\"Submit to remote\"\n className=\"df-review-item-action-button df-review-item-submit-button\"\n disabled={isSubmitted || isSubmitting}\n type=\"button\"\n onClick={() => void onSubmitItem(numberedItem)}\n >\n <UploadIcon aria-hidden=\"true\" />\n <span>\n {isSubmitted\n ? 'Submitted'\n : isSubmitting\n ? 'Submitting'\n : 'Submit'}\n </span>\n </button>\n )}\n {canOpenRemoteIssue && (\n <a\n aria-label=\"Open remote issue\"\n className=\"df-review-item-action-button\"\n href={item.externalIssueUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n )}\n </div>\n );\n};\n","import { normalizeReviewItemStatus } from '../../status';\nimport type { ReviewItem, ReviewItemStatus } from '../../types';\nimport type { ReviewShellStatusOption } from '../types';\n\ninterface QaItemStatusActionsProps {\n canUpdateStatus: boolean;\n item: ReviewItem;\n statusOptions: readonly ReviewShellStatusOption[];\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n}\n\nconst getStatusOption = (\n status: ReviewItemStatus,\n statusOptions: readonly ReviewShellStatusOption[]\n) => {\n const normalizedStatus = normalizeReviewItemStatus(status);\n return (\n statusOptions.find((statusOption) => statusOption.value === status) ??\n statusOptions.find(\n (statusOption) => statusOption.value === normalizedStatus\n ) ??\n statusOptions[0]\n );\n};\n\nexport const QaItemStatusActions = ({\n canUpdateStatus,\n item,\n statusOptions,\n onChangeItemStatus,\n}: QaItemStatusActionsProps) => {\n const currentStatusOption = getStatusOption(item.status, statusOptions);\n if (!currentStatusOption) return null;\n const statusClassName = `is-status-${normalizeReviewItemStatus(\n currentStatusOption.value\n )}`;\n\n return (\n <div\n className=\"df-review-item-status-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canUpdateStatus ? (\n <select\n aria-label=\"QA status\"\n className={`df-review-item-status-select ${statusClassName}`}\n value={currentStatusOption.value}\n onChange={(event) =>\n void onChangeItemStatus(\n item,\n event.currentTarget.value as ReviewItemStatus\n )\n }\n >\n {statusOptions.map((statusOption) => (\n <option key={statusOption.value} value={statusOption.value}>\n {statusOption.label}\n </option>\n ))}\n </select>\n ) : (\n <span className={`df-review-item-status-badge ${statusClassName}`}>\n {currentStatusOption.label}\n </span>\n )}\n </div>\n );\n};\n","import type { ReviewItem } from '../types';\n\nexport const isAnchorRestorableReviewItem = (item: ReviewItem) =>\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && item.selection));\n\nexport const queryReviewItemAnchorElement = (\n targetDocument: Document,\n item: ReviewItem\n) => {\n const anchor = item.anchor;\n if (!anchor || !isAnchorRestorableReviewItem(item)) return undefined;\n\n const expectedRect = getReviewItemExpectedDocumentRect(item);\n const candidates = [anchor, ...(anchor.candidates ?? [])].filter(\n (candidate) => Boolean(candidate.selector)\n );\n const matches: Array<{\n element: Element;\n score: number;\n }> = [];\n\n candidates.forEach((candidate, index) => {\n try {\n targetDocument.querySelectorAll(candidate.selector).forEach((element) => {\n if (!isScrollableReviewAnchorElement(element)) return;\n\n matches.push({\n element,\n score: getReviewAnchorMatchScore(\n element,\n expectedRect,\n candidate.textFingerprint ?? anchor.textFingerprint,\n index\n )\n });\n });\n } catch {\n return;\n }\n });\n\n return matches.sort((a, b) => a.score - b.score)[0]?.element;\n};\n\nexport const getReviewItemRestoreScrollPosition = (\n targetWindow: Window,\n targetDocument: Document,\n item: ReviewItem,\n anchorElement?: Element\n) => {\n if (anchorElement) {\n const rect = anchorElement.getBoundingClientRect();\n return clampDocumentScrollPosition(targetDocument, {\n left:\n targetWindow.scrollX +\n rect.left -\n Math.max(0, (targetWindow.innerWidth - rect.width) / 2),\n top:\n targetWindow.scrollY +\n rect.top -\n Math.max(0, (targetWindow.innerHeight - rect.height) / 2)\n });\n }\n\n return clampDocumentScrollPosition(targetDocument, {\n left: item.scroll?.x ?? 0,\n top: item.scroll?.y ?? 0\n });\n};\n\nexport const setDocumentScrollInstantly = (\n targetWindow: Window,\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = position.left;\n scrollElement.scrollTop = position.top;\n return;\n }\n\n targetWindow.scrollTo(position.left, position.top);\n};\n\nexport const getReviewItemExpectedDocumentRect = (item: ReviewItem) => {\n const scroll = item.scroll ?? { x: 0, y: 0 };\n const selection = item.selection?.viewport;\n if (\n selection &&\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n ) {\n return {\n left: scroll.x + selection.x,\n top: scroll.y + selection.y,\n width: selection.width,\n height: selection.height\n };\n }\n\n const marker = item.marker?.viewport;\n if (marker && typeof marker.x === 'number' && typeof marker.y === 'number') {\n return {\n left: scroll.x + marker.x,\n top: scroll.y + marker.y,\n width: 1,\n height: 1\n };\n }\n\n return undefined;\n};\n\nexport const getReviewAnchorMatchScore = (\n element: Element,\n expectedRect:\n | {\n left: number;\n top: number;\n width: number;\n height: number;\n }\n | undefined,\n textFingerprint: string | undefined,\n candidateIndex: number\n) => {\n const rect = getElementDocumentRect(element);\n let score = candidateIndex * 25;\n\n if (expectedRect) {\n score += Math.abs(rect.top - expectedRect.top);\n score += Math.abs(rect.left - expectedRect.left) * 0.25;\n score += Math.abs(rect.width - expectedRect.width) * 0.1;\n score += Math.abs(rect.height - expectedRect.height) * 0.1;\n }\n\n if (textFingerprint) {\n score +=\n (1 - getReviewTextFingerprintScore(textFingerprint, element)) * 100;\n }\n\n return score;\n};\n\nexport const getElementDocumentRect = (element: Element) => {\n const rect = element.getBoundingClientRect();\n const view = element.ownerDocument.defaultView;\n\n return {\n left: rect.left + (view?.scrollX ?? 0),\n top: rect.top + (view?.scrollY ?? 0),\n width: rect.width,\n height: rect.height\n };\n};\n\nconst clampDocumentScrollPosition = (\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement;\n const view = targetDocument.defaultView;\n const maxLeft = Math.max(\n 0,\n (scrollElement?.scrollWidth ?? 0) - (view?.innerWidth ?? 0)\n );\n const maxTop = Math.max(\n 0,\n (scrollElement?.scrollHeight ?? 0) - (view?.innerHeight ?? 0)\n );\n\n return {\n left: Math.min(Math.max(0, Math.round(position.left)), maxLeft),\n top: Math.min(Math.max(0, Math.round(position.top)), maxTop)\n };\n};\n\nexport const getReviewTextFingerprintScore = (expected: string, element: Element) => {\n const actual = element.textContent?.replace(/\\s+/g, ' ').trim();\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getReviewFingerprintTokens(expected);\n const actualTokens = new Set(getReviewFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return Math.min(Math.max(matches.length / expectedTokens.length, 0.25), 0.76);\n};\n\nexport const getReviewFingerprintTokens = (value: string) =>\n value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n\nexport const isScrollableReviewAnchorElement = (element: Element) => {\n const id = element.id.trim().toLowerCase();\n if (\n element === element.ownerDocument.body ||\n element === element.ownerDocument.documentElement ||\n ['app', 'main', 'page', 'root', '__next', '__nuxt'].includes(id)\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n const viewportHeight = element.ownerDocument.documentElement.clientHeight;\n const scrollHeight = element.ownerDocument.documentElement.scrollHeight;\n return !(\n scrollHeight > viewportHeight * 1.5 && rect.height > viewportHeight * 3\n );\n};\n","import {\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n Scan as ScanIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n StickyNote as StickyNoteIcon,\n} from 'lucide-react';\nimport type { ReviewItem, ReviewItemScope } from '../../types';\nimport { isAnchorRestorableReviewItem } from '../anchor.restore';\n\nexport const ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nexport const getReviewItemMode = (item: ReviewItem) =>\n isAnchorRestorableReviewItem(item) ? 'dom' : item.kind;\n\nexport const ReviewItemModeIcon = ({\n mode,\n}: {\n mode: ReturnType<typeof getReviewItemMode>;\n}) => {\n if (mode === 'area') return <ScanIcon aria-hidden=\"true\" />;\n if (mode === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <StickyNoteIcon aria-hidden=\"true\" />;\n};\n","import {\n Bot as BotIcon,\n Copy as CopyIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n Link2 as Link2Icon,\n Pencil as PencilIcon,\n X as XIcon,\n} from 'lucide-react';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { getItemTitle } from '../prompt/prompt';\nimport { QaItemRemoteActions } from './item.remote.actions';\nimport { QaItemStatusActions } from './item.status.actions';\nimport {\n getReviewItemMode,\n ReviewItemModeIcon,\n ReviewScopeIcon,\n} from '../review/item.icons';\nimport type {\n ReviewShellViewportKind,\n} from '../types';\n\ninterface QaItemCardProps {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n currentPresetScope: ReviewShellViewportKind;\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n isOverlayVisible: boolean;\n isRemoteSource: boolean;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n copiedPromptKey: string | null;\n selectedItemId: string | null;\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onRemoveItem: (item: ReviewItem) => Promise<void>;\n onCopyItemLink: (numberedItem: NumberedReviewItem) => void;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onEditItem: (item: ReviewItem) => void;\n onRestoreReviewItem: (item: ReviewItem) => void;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n onToggleItemOverlayVisibility: (itemId: string) => void;\n}\n\nconst formatItemCardDate = (value: string) => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return new Intl.DateTimeFormat('en', {\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n month: 'short',\n }).format(date);\n};\n\nexport const QaItemCard = ({\n activeAdapterEntry,\n currentPresetScope,\n getItemPresetScope,\n isOverlayVisible,\n isRemoteSource,\n numberedItem,\n remoteAdapterEntry,\n copiedPromptKey,\n selectedItemId,\n onChangeItemStatus,\n onClearSelectedItem,\n onRemoveItem,\n onCopyItemLink,\n onCopyItemPrompt,\n onEditItem,\n onRestoreReviewItem,\n onSubmitItem,\n onToggleItemOverlayVisibility,\n}: QaItemCardProps) => {\n const { item } = numberedItem;\n const itemMode = getReviewItemMode(item);\n const isSubmitted = item.submitStatus === 'submitted';\n const isSubmitting = item.submitStatus === 'submitting';\n const canRemoveItem =\n activeAdapterEntry.canRemove &&\n !isSubmitting &&\n (isRemoteSource || !isSubmitted);\n const itemComment = item.comment.trim() || getItemTitle(item);\n const itemAuthor = item.createdBy?.trim();\n const promptCopyKey = `qa:${item.id}`;\n const linkCopyKey = `link:${item.id}`;\n const isPromptCopied = copiedPromptKey === promptCopyKey;\n const isLinkCopied = copiedPromptKey === linkCopyKey;\n const statusOptions = activeAdapterEntry.statusOptions;\n const isActive = item.id === selectedItemId;\n const canUpdateStatus =\n Boolean(activeAdapterEntry.updateStatus) &&\n statusOptions.length > 0 &&\n !isSubmitting;\n const canEditItem = activeAdapterEntry.canUpdate && !isSubmitting;\n const itemMeta = [formatItemCardDate(item.createdAt), itemAuthor]\n .filter(Boolean)\n .join(' | ');\n\n return (\n <article\n className={`df-review-item-card${isActive ? ' is-active' : ''}${\n getItemPresetScope(item) !== currentPresetScope ? ' is-dim' : ''\n }${isOverlayVisible ? '' : ' is-overlay-hidden'}`}\n onClick={() => {\n if (isActive) {\n onClearSelectedItem();\n return;\n }\n\n onRestoreReviewItem(item);\n }}\n >\n <div className=\"df-review-item-header\">\n <div className=\"df-review-item-main\">\n <span className=\"df-review-item-badges\">\n <span className=\"df-review-item-id\">\n {numberedItem.displayLabel}\n </span>\n <span\n className={`df-review-item-scope is-scope-${numberedItem.scope}`}\n >\n <ReviewScopeIcon scope={numberedItem.scope} />\n {numberedItem.label}\n </span>\n <span className={`df-review-item-mode is-mode-${itemMode}`}>\n <ReviewItemModeIcon mode={itemMode} />\n {itemMode}\n </span>\n </span>\n <strong className=\"df-review-item-comment\">{itemComment}</strong>\n <small className=\"df-review-item-meta\">{itemMeta}</small>\n {item.submitError && (\n <small className=\"df-review-item-error\">{item.submitError}</small>\n )}\n </div>\n <div\n className=\"df-review-item-header-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n <button\n aria-label={isOverlayVisible ? 'Hide QA overlay' : 'Show QA overlay'}\n className={`df-review-item-visibility${\n isOverlayVisible ? ' is-visible' : ' is-hidden'\n }`}\n type=\"button\"\n onClick={() => onToggleItemOverlayVisibility(item.id)}\n >\n {isOverlayVisible ? (\n <EyeIcon aria-hidden=\"true\" />\n ) : (\n <EyeOffIcon aria-hidden=\"true\" />\n )}\n </button>\n <button\n aria-label={isLinkCopied ? 'Copied QA link' : 'Copy QA link'}\n className={`df-review-item-link-copy${\n isLinkCopied ? ' is-copied' : ''\n }`}\n title={isLinkCopied ? 'Copied QA link' : 'Copy QA link'}\n type=\"button\"\n onClick={() => onCopyItemLink(numberedItem)}\n >\n <Link2Icon aria-hidden=\"true\" />\n </button>\n {canEditItem && (\n <button\n aria-label=\"Edit QA comment\"\n className=\"df-review-item-edit\"\n title=\"Edit QA comment\"\n type=\"button\"\n onClick={() => onEditItem(item)}\n >\n <PencilIcon aria-hidden=\"true\" />\n </button>\n )}\n {canRemoveItem && (\n <button\n aria-label=\"Delete QA\"\n className=\"df-review-item-delete\"\n type=\"button\"\n onClick={() => void onRemoveItem(item)}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n <div className=\"df-review-item-actions\">\n <QaItemStatusActions\n canUpdateStatus={canUpdateStatus}\n item={item}\n statusOptions={statusOptions}\n onChangeItemStatus={onChangeItemStatus}\n />\n <div\n className=\"df-review-item-prompt-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n <button\n aria-label={isPromptCopied ? 'Copied QA prompt' : 'Copy QA prompt'}\n className={`df-review-item-action-button df-review-item-prompt-copy${\n isPromptCopied ? ' is-copied' : ''\n }`}\n title={isPromptCopied ? 'Copied QA prompt' : 'Copy QA prompt'}\n type=\"button\"\n onClick={() => onCopyItemPrompt(numberedItem)}\n >\n {isPromptCopied ? (\n <CopyIcon aria-hidden=\"true\" />\n ) : (\n <BotIcon aria-hidden=\"true\" />\n )}\n </button>\n </div>\n <QaItemRemoteActions\n isRemoteSource={isRemoteSource}\n isSubmitted={isSubmitted}\n isSubmitting={isSubmitting}\n item={item}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n onSubmitItem={onSubmitItem}\n />\n </div>\n </article>\n );\n};\n","import {\n ListFilter as ListFilterIcon,\n RefreshCw as RefreshCwIcon,\n} from 'lucide-react';\nimport type { ReviewSource } from '../../types';\nimport { normalizeReviewItemStatus } from '../../status';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { REVIEW_QA_FILTERS } from '../constants';\nimport { ReviewScopeIcon } from '../review/item.icons';\nimport type {\n ReviewQaFilter,\n ReviewQaStatusFilter,\n ReviewShellStatusOption,\n} from '../types';\n\ninterface QaPanelHeaderProps {\n activeItemCount: number;\n activeRemainingItemCount: number;\n filteredItemCount: number;\n isAllQaVisible: boolean;\n label: ReviewSource;\n qaFilter: ReviewQaFilter;\n qaFilterCounts: ReadonlyMap<ReviewQaFilter, number>;\n qaStatusFilter: ReviewQaStatusFilter;\n qaStatusFilterCounts: ReadonlyMap<ReviewQaStatusFilter, number>;\n showSourceSelect: boolean;\n source: ReviewSource;\n sourceEntries: NormalizedReviewShellAdapter[];\n statusOptions: readonly ReviewShellStatusOption[];\n onChangeReviewSource: (nextSource: ReviewSource) => void;\n onQaFilterChange: (filter: ReviewQaFilter) => void;\n onQaStatusFilterChange: (filter: ReviewQaStatusFilter) => void;\n onRefreshReviewData: () => Promise<void>;\n}\n\nexport const QaPanelHeader = ({\n activeItemCount,\n activeRemainingItemCount,\n filteredItemCount,\n isAllQaVisible,\n label,\n qaFilter,\n qaFilterCounts,\n qaStatusFilter,\n qaStatusFilterCounts,\n showSourceSelect,\n source,\n sourceEntries,\n statusOptions,\n onChangeReviewSource,\n onQaFilterChange,\n onQaStatusFilterChange,\n onRefreshReviewData,\n}: QaPanelHeaderProps) => {\n const statusFilterOptions = getStatusFilterOptions(statusOptions);\n const hasActiveFilter = qaFilter !== 'all' || qaStatusFilter !== 'all';\n\n return (\n <div className=\"df-review-list-header\">\n <div className=\"df-review-list-toolbar\">\n <div className=\"df-review-list-controls\">\n {showSourceSelect && (\n <select\n aria-label=\"QA source\"\n className=\"df-review-source-select\"\n value={source}\n onChange={(event) =>\n onChangeReviewSource(event.currentTarget.value as ReviewSource)\n }\n >\n {sourceEntries.map((entry) => (\n <option key={entry.label} value={entry.label}>\n {entry.label}\n </option>\n ))}\n </select>\n )}\n <button\n aria-label=\"Refresh QA\"\n className=\"df-review-source-refresh\"\n type=\"button\"\n onClick={() => void onRefreshReviewData()}\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-filter-tabs\" aria-label=\"QA filters\">\n {REVIEW_QA_FILTERS.map((filter) => {\n const count = qaFilterCounts.get(filter.key) ?? 0;\n const isActive = qaFilter === filter.key;\n\n return (\n <button\n key={filter.key}\n aria-label={`${filter.label} QA (${count})`}\n aria-pressed={isActive}\n className={`df-review-filter-tab${\n isActive ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onQaFilterChange(filter.key)}\n >\n <span className=\"df-review-filter-icon\">\n {filter.scope ? (\n <ReviewScopeIcon scope={filter.scope} />\n ) : (\n <ListFilterIcon aria-hidden=\"true\" />\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"df-review-list-title\">\n <span>{isAllQaVisible ? `${label} QA · All pages` : `${label} QA`}</span>\n <strong title={`${activeRemainingItemCount} remaining of ${activeItemCount}`}>\n {!hasActiveFilter\n ? `${activeRemainingItemCount}/${activeItemCount}`\n : `${filteredItemCount}/${activeItemCount}`}\n </strong>\n <select\n aria-label=\"QA status filter\"\n className=\"df-review-status-filter-select\"\n value={qaStatusFilter}\n onChange={(event) =>\n onQaStatusFilterChange(\n event.currentTarget.value as ReviewQaStatusFilter\n )\n }\n >\n <option value=\"all\">\n {`All status (${qaStatusFilterCounts.get('all') ?? 0})`}\n </option>\n {statusFilterOptions.map((statusOption) => (\n <option key={statusOption.value} value={statusOption.value}>\n {`${statusOption.label} (${\n qaStatusFilterCounts.get(statusOption.value) ?? 0\n })`}\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n};\n\nfunction getStatusFilterOptions(\n statusOptions: readonly ReviewShellStatusOption[]\n) {\n const seen = new Set<ReviewQaStatusFilter>();\n\n return statusOptions.flatMap((statusOption) => {\n const value = normalizeReviewItemStatus(statusOption.value);\n if (seen.has(value)) return [];\n\n seen.add(value);\n return [{\n value,\n label: statusOption.label,\n }];\n });\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewSource,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { QaItemCard } from './item.card';\nimport { QaPanelHeader } from './panel.header';\nimport type {\n ReviewQaFilter,\n ReviewQaStatusFilter,\n ReviewShellViewportKind,\n} from '../types';\n\ninterface ReviewQaPanelProps {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n activeItems: ReviewItem[];\n activeRemainingItemCount: number;\n currentPresetScope: ReviewShellViewportKind;\n filteredNumberedActiveItems: NumberedReviewItem[];\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n hiddenOverlayItemIds: ReadonlySet<string>;\n isAllQaVisible: boolean;\n isListVisible: boolean;\n isRemoteSource: boolean;\n copiedPromptKey: string | null;\n qaFilter: ReviewQaFilter;\n qaFilterCounts: ReadonlyMap<ReviewQaFilter, number>;\n qaStatusFilter: ReviewQaStatusFilter;\n qaStatusFilterCounts: ReadonlyMap<ReviewQaStatusFilter, number>;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n selectedItemId: string | null;\n showSourceSelect: boolean;\n source: ReviewSource;\n sourceEntries: NormalizedReviewShellAdapter[];\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onChangeReviewSource: (nextSource: ReviewSource) => void;\n onCopyItemLink: (numberedItem: NumberedReviewItem) => void;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onEditItem: (item: ReviewItem) => void;\n onQaFilterChange: (filter: ReviewQaFilter) => void;\n onQaStatusFilterChange: (filter: ReviewQaStatusFilter) => void;\n onRefreshReviewData: () => Promise<void>;\n onRemoveItem: (item: ReviewItem) => Promise<void>;\n onRestoreReviewItem: (item: ReviewItem) => void;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n onToggleItemOverlayVisibility: (itemId: string) => void;\n}\n\nexport const ReviewQaPanel = ({\n activeAdapterEntry,\n activeItems,\n activeRemainingItemCount,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIds,\n isAllQaVisible,\n isListVisible,\n isRemoteSource,\n copiedPromptKey,\n qaFilter,\n qaFilterCounts,\n qaStatusFilter,\n qaStatusFilterCounts,\n remoteAdapterEntry,\n selectedItemId,\n showSourceSelect,\n source,\n sourceEntries,\n onChangeItemStatus,\n onClearSelectedItem,\n onChangeReviewSource,\n onCopyItemLink,\n onCopyItemPrompt,\n onEditItem,\n onQaFilterChange,\n onQaStatusFilterChange,\n onRefreshReviewData,\n onRemoveItem,\n onRestoreReviewItem,\n onSubmitItem,\n onToggleItemOverlayVisibility,\n}: ReviewQaPanelProps) => {\n const emptyMessage = isAllQaVisible\n ? `No ${activeAdapterEntry.label} QA.`\n : isRemoteSource\n ? `No ${activeAdapterEntry.label} QA on this page.`\n : 'No QA on this page.';\n\n return (\n <aside className=\"df-review-qa-panel\" aria-hidden={!isListVisible}>\n <div className=\"df-review-panel-body\">\n <section className=\"df-review-item-list\">\n <QaPanelHeader\n activeItemCount={activeItems.length}\n activeRemainingItemCount={activeRemainingItemCount}\n filteredItemCount={filteredNumberedActiveItems.length}\n isAllQaVisible={isAllQaVisible}\n label={activeAdapterEntry.label}\n qaFilter={qaFilter}\n qaFilterCounts={qaFilterCounts}\n qaStatusFilter={qaStatusFilter}\n qaStatusFilterCounts={qaStatusFilterCounts}\n showSourceSelect={showSourceSelect}\n source={source}\n sourceEntries={sourceEntries}\n statusOptions={activeAdapterEntry.statusOptions}\n onChangeReviewSource={onChangeReviewSource}\n onQaFilterChange={onQaFilterChange}\n onQaStatusFilterChange={onQaStatusFilterChange}\n onRefreshReviewData={onRefreshReviewData}\n />\n <div\n className=\"df-review-list-scroll\"\n onClick={(event) => {\n if (event.target === event.currentTarget) {\n onClearSelectedItem();\n }\n }}\n >\n {activeItems.length === 0 && (\n <p className=\"df-review-empty\">{emptyMessage}</p>\n )}\n {activeItems.length > 0 &&\n filteredNumberedActiveItems.length === 0 && (\n <p className=\"df-review-empty\">No QA in this filter.</p>\n )}\n {filteredNumberedActiveItems.map((numberedItem) => {\n const { item } = numberedItem;\n\n return (\n <QaItemCard\n key={item.id}\n activeAdapterEntry={activeAdapterEntry}\n currentPresetScope={currentPresetScope}\n getItemPresetScope={getItemPresetScope}\n isOverlayVisible={!hiddenOverlayItemIds.has(item.id)}\n isRemoteSource={isRemoteSource}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n copiedPromptKey={copiedPromptKey}\n selectedItemId={selectedItemId}\n onChangeItemStatus={onChangeItemStatus}\n onClearSelectedItem={onClearSelectedItem}\n onCopyItemLink={onCopyItemLink}\n onCopyItemPrompt={onCopyItemPrompt}\n onEditItem={onEditItem}\n onRemoveItem={onRemoveItem}\n onRestoreReviewItem={onRestoreReviewItem}\n onSubmitItem={onSubmitItem}\n onToggleItemOverlayVisibility={onToggleItemOverlayVisibility}\n />\n );\n })}\n </div>\n </section>\n </div>\n </aside>\n );\n};\n","import { useState, type CSSProperties } from 'react';\nimport type { ReviewPresenceUser } from '../types';\n\ninterface PresenceOverlayProps {\n presenceSessionId: string;\n users: ReviewPresenceUser[];\n}\n\nconst COLLAPSED_USER_COUNT = 1;\n\nconst getPresenceName = (user: ReviewPresenceUser) =>\n user.displayName || user.userId;\n\nexport const PresenceOverlay = ({\n presenceSessionId,\n users,\n}: PresenceOverlayProps) => {\n const [isExpanded, setIsExpanded] = useState(false);\n\n if (users.length === 0) return null;\n\n const visibleUsers = isExpanded ? users : users.slice(0, COLLAPSED_USER_COUNT);\n const hiddenUserCount = users.length - visibleUsers.length;\n\n return (\n <div\n aria-label={`Review presence, ${users.length} online`}\n className={`df-review-presence-overlay${\n isExpanded ? ' is-expanded' : ''\n }`}\n >\n {visibleUsers.map((user) => (\n <span\n key={user.sessionId}\n className={`df-review-presence-chip${\n user.sessionId === presenceSessionId ? ' is-self' : ''\n }`}\n style={\n {\n '--df-review-presence-color': user.color,\n } as CSSProperties\n }\n title={getPresenceName(user)}\n >\n {getPresenceName(user)}\n </span>\n ))}\n {hiddenUserCount > 0 && (\n <button\n aria-label={`Show ${hiddenUserCount} more online reviewers`}\n aria-expanded={isExpanded}\n className=\"df-review-presence-more\"\n type=\"button\"\n onClick={() => setIsExpanded(true)}\n >\n +{hiddenUserCount}\n </button>\n )}\n </div>\n );\n};\n","import type { DomSourceHint } from '../types';\nimport type { ReviewSourceInspectorOptions } from './types';\n\nconst SOURCE_SELECTOR = [\n '[data-wrk-source-file]',\n '[data-wrk-source-component]',\n '[data-wrk-source-line]',\n '[data-wrk-source-column]',\n '[data-file]',\n '[data-component]',\n '[data-section-index]',\n '[data-section-id]',\n].join(', ');\n\nexport const getSourceHintElement = (target: EventTarget | null) => {\n return getEventElement(target)?.closest(SOURCE_SELECTOR) ?? null;\n};\n\nexport type SourceOpenOptions = ReviewSourceInspectorOptions & {\n omitPosition?: boolean;\n sourceRoot?: string;\n};\n\nexport type SourceCandidate = {\n id: string;\n depth: number;\n element: Element;\n filePath: string;\n label: string;\n detail: string;\n positionLabel: string;\n confidence: number;\n confidenceLabel: 'high' | 'medium' | 'low';\n usesPosition: boolean;\n source: DomSourceHint;\n};\n\nexport const getElementSourceHint = (\n target: EventTarget | null\n): DomSourceHint | undefined => {\n const sourceElement = getSourceHintElement(target);\n if (!sourceElement) return undefined;\n\n return getSourceHintFromElement(sourceElement);\n};\n\nexport const getSourceCandidates = (\n target: EventTarget | null\n): SourceCandidate[] => {\n const startElement = getEventElement(target);\n if (!startElement) return [];\n\n const candidates: SourceCandidate[] = [];\n const seen = new Set<string>();\n let element: Element | null = startElement;\n let depth = 0;\n\n while (element && element.nodeType === 1) {\n const source = getSourceHintFromElement(element);\n if (source?.file) {\n const key = getSourceCandidateKey(source);\n if (!seen.has(key)) {\n seen.add(key);\n candidates.push(createSourceCandidate(element, source, depth));\n }\n }\n\n if (element === element.ownerDocument.documentElement) break;\n element = element.parentElement;\n depth += 1;\n }\n\n return candidates.slice(0, 8);\n};\n\nexport const getSourceOpenUrl = (\n source: DomSourceHint | undefined,\n options?: string | SourceOpenOptions\n) => {\n const normalizedOptions = normalizeSourceOpenOptions(options);\n const file = source?.file?.trim();\n if (!file) return null;\n\n const sourcePath = getSourcePath(file, normalizedOptions.sourceRoot);\n if (!sourcePath) return null;\n\n const hasPosition = !normalizedOptions.omitPosition;\n const line = hasPosition ? getSourcePosition(source?.line) : null;\n const column = hasPosition ? getSourcePosition(source?.column) : null;\n const editor = normalizedOptions.editor ?? 'vscode';\n\n if (normalizedOptions.urlTemplate) {\n return buildSourceUrlFromTemplate(normalizedOptions.urlTemplate, {\n column,\n file,\n line,\n sourcePath,\n sourceRoot: normalizedOptions.sourceRoot,\n });\n }\n\n if (editor === 'webstorm') {\n const params = new URLSearchParams({ file: sourcePath });\n if (line) params.set('line', String(line));\n if (column) params.set('column', String(column));\n return `webstorm://open?${params.toString()}`;\n }\n\n if (editor === 'custom') return null;\n\n const encodedPath = encodePathForFileScheme(sourcePath);\n const scheme = editor === 'cursor' ? 'cursor' : 'vscode';\n if (!line) return `${scheme}://file/${encodedPath}`;\n if (!column) return `${scheme}://file/${encodedPath}:${line}`;\n return `${scheme}://file/${encodedPath}:${line}:${column}`;\n};\n\nexport const openSourceInEditor = (\n source: DomSourceHint | undefined,\n options?: string | SourceOpenOptions\n) => {\n const url = getSourceOpenUrl(source, options);\n if (!url) return false;\n\n window.open(url, '_blank', 'noreferrer');\n return true;\n};\n\nfunction getSourceHintFromElement(element: Element): DomSourceHint | undefined {\n const source: DomSourceHint = {\n component: getSourceAttribute(\n element,\n 'data-wrk-source-component',\n 'data-component'\n ),\n file: getSourceAttribute(element, 'data-wrk-source-file', 'data-file'),\n line: getSourceAttribute(element, 'data-wrk-source-line'),\n column: getSourceAttribute(element, 'data-wrk-source-column'),\n sectionId: getSourceAttribute(element, 'data-section-id'),\n sectionIndex: getSourceAttribute(element, 'data-section-index'),\n };\n\n return Object.values(source).some(Boolean) ? source : undefined;\n}\n\nfunction createSourceCandidate(\n element: Element,\n source: DomSourceHint,\n depth: number\n): SourceCandidate {\n const confidence = getSourceConfidence(source, depth);\n const fileName = source.file?.split(/[\\\\/]/).pop() ?? source.file ?? 'source';\n const component = source.component?.trim();\n const fallbackComponent = getComponentNameFromSourceFile(source.file);\n const tag = element.tagName.toLowerCase();\n const line = getSourcePosition(source.line);\n const column = getSourcePosition(source.column);\n const position = line ? `:${line}${column ? `:${column}` : ''}` : '';\n\n return {\n id: getSourceCandidateKey(source),\n depth,\n element,\n filePath: getDisplaySourcePath(source.file) ?? fileName,\n label: component || fallbackComponent || tag,\n detail: `${fileName}${position}`,\n positionLabel: line ? `${line}:${column ?? 1}` : '',\n confidence,\n confidenceLabel:\n confidence >= 0.82 ? 'high' : confidence >= 0.58 ? 'medium' : 'low',\n usesPosition: confidence >= 0.72 && Boolean(line),\n source,\n };\n}\n\nfunction getComponentNameFromSourceFile(file: string | undefined) {\n const normalizedFile = file?.trim().replace(/\\\\/g, '/');\n if (!normalizedFile) return undefined;\n\n const pathParts = normalizedFile.split('/').filter(Boolean);\n const fileName = pathParts[pathParts.length - 1];\n if (!fileName) return undefined;\n\n const stem = fileName.replace(/\\.[^.]+$/, '');\n const sourceName =\n stem.toLowerCase() === 'index'\n ? pathParts[pathParts.length - 2]?.replace(/\\.[^.]+$/, '')\n : stem;\n\n return toPascalCase(sourceName);\n}\n\nfunction toPascalCase(value: string | undefined) {\n const words = value\n ?.split(/[._\\-\\s]+/)\n .map((part) => part.trim())\n .filter(Boolean);\n\n if (!words?.length) return undefined;\n\n return words\n .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)\n .join('');\n}\n\nfunction getDisplaySourcePath(file: string | undefined) {\n const normalizedFile = file?.trim().replace(/\\\\/g, '/');\n if (!normalizedFile) return undefined;\n\n const sourceRootMatch = normalizedFile.match(\n /(?:^|\\/)((?:dev\\/)?src\\/.+|app\\/.+|pages\\/.+|components\\/.+)$/\n );\n return sourceRootMatch?.[1] ?? normalizedFile;\n}\n\nfunction getSourceCandidateKey(source: DomSourceHint) {\n return [\n source.file,\n source.component,\n source.line,\n source.column,\n source.sectionId,\n source.sectionIndex,\n ]\n .filter(Boolean)\n .join('|');\n}\n\nfunction getSourceConfidence(source: DomSourceHint, depth: number) {\n let score = source.file ? 0.54 : 0.12;\n if (source.component) score += 0.12;\n if (getSourcePosition(source.line)) score += 0.22;\n if (getSourcePosition(source.column)) score += 0.08;\n if (source.sectionId || source.sectionIndex) score += 0.04;\n score -= Math.min(depth, 5) * 0.045;\n return Math.max(0.1, Math.min(1, Number(score.toFixed(2))));\n}\n\nfunction normalizeSourceOpenOptions(\n options?: string | SourceOpenOptions\n): SourceOpenOptions {\n return typeof options === 'string' ? { sourceRoot: options } : options ?? {};\n}\n\nfunction buildSourceUrlFromTemplate(\n template: string,\n values: {\n column: number | null;\n file: string;\n line: number | null;\n sourcePath: string;\n sourceRoot?: string;\n }\n) {\n const replacements: Record<string, string> = {\n column: values.column ? String(values.column) : '',\n encodedPath: encodeURIComponent(values.sourcePath),\n file: values.file,\n line: values.line ? String(values.line) : '',\n path: values.sourcePath,\n sourceRoot: values.sourceRoot ?? '',\n uriPath: encodePathForFileScheme(values.sourcePath),\n };\n\n return template.replace(/\\{([a-zA-Z]+)\\}/g, (_, key: string) =>\n replacements[key] ?? ''\n );\n}\n\nfunction getSourceAttribute(element: Element, ...names: string[]) {\n for (const name of names) {\n const value = element.getAttribute(name)?.trim();\n if (value) return value;\n }\n\n return undefined;\n}\n\nfunction getEventElement(target: EventTarget | null): Element | null {\n if (!target || typeof target !== 'object') return null;\n\n const node = target as {\n closest?: (selector: string) => Element | null;\n nodeType?: number;\n parentElement?: Element | null;\n };\n\n if (node.nodeType === 1 && typeof node.closest === 'function') {\n return node as Element;\n }\n\n if (node.parentElement && typeof node.parentElement.closest === 'function') {\n return node.parentElement;\n }\n\n return null;\n}\n\nfunction getSourcePath(file: string, sourceRoot?: string) {\n const normalizedFile = file.replace(/\\\\/g, '/');\n if (normalizedFile.startsWith('/') || /^[a-zA-Z]:\\//.test(normalizedFile)) {\n return normalizedFile;\n }\n\n const normalizedRoot = sourceRoot\n ?.trim()\n .replace(/\\\\/g, '/')\n .replace(/\\/+$/, '');\n if (!normalizedRoot) return null;\n\n return `${normalizedRoot}/${normalizedFile.replace(/^\\/+/, '')}`;\n}\n\nfunction getSourcePosition(value: string | undefined) {\n const position = Number(value);\n return Number.isInteger(position) && position > 0 ? position : null;\n}\n\nfunction encodePathForFileScheme(path: string) {\n return encodeURI(path).replace(/[#?]/g, (match) =>\n match === '#' ? '%23' : '%3F'\n );\n}\n","import {\n Scan as ScanIcon,\n SquareMousePointer as SquareMousePointerIcon,\n} from 'lucide-react';\nimport type { ReviewMode } from '../../types';\n\ninterface ReviewModeToolbarProps {\n canWriteArea: boolean;\n canWriteDom: boolean;\n mode: ReviewMode;\n onSetReviewMode: (mode: ReviewMode) => void;\n}\n\nexport const ReviewModeToolbar = ({\n canWriteArea,\n canWriteDom,\n mode,\n onSetReviewMode,\n}: ReviewModeToolbarProps) => {\n if (!canWriteDom && !canWriteArea) return null;\n\n return (\n <div className=\"df-review-mode\" aria-label=\"Add QA\">\n {canWriteDom && (\n <button\n aria-label=\"Element\"\n className={`df-review-mode-button is-element${\n mode === 'element' ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onSetReviewMode('element')}\n >\n <SquareMousePointerIcon aria-hidden=\"true\" />\n </button>\n )}\n {canWriteDom && canWriteArea && (\n <span className=\"df-review-mode-divider\" aria-hidden=\"true\">\n |\n </span>\n )}\n {canWriteArea && (\n <button\n aria-label=\"Area\"\n className={`df-review-mode-button is-area${\n mode === 'area' ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onSetReviewMode('area')}\n >\n <ScanIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n};\n","import type { CSSProperties } from 'react';\nimport type { ReviewRulerPoint, ReviewShellViewportPreset } from '../types';\n\ninterface RulerGuttersProps {\n rulerHover: ReviewRulerPoint | null;\n rulerScaleX: number;\n rulerScaleY: number;\n rulerUnit: string;\n size: ReviewShellViewportPreset;\n}\n\nexport const RulerGutters = ({\n rulerHover,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n size,\n}: RulerGuttersProps) => {\n return (\n <>\n <div className=\"df-review-ruler-corner\" aria-hidden=\"true\" />\n <div\n className=\"df-review-ruler-gutter is-x\"\n style={\n {\n '--df-review-ruler-step-x': `${rulerScaleX * 20}px`,\n } as CSSProperties\n }\n >\n <div className=\"df-review-ruler-frame-label\">\n <strong>{size.label}</strong>\n <span>\n {size.designWidth}\n {size.designHeight ? `x${size.designHeight}` : ''}\n {rulerUnit}\n </span>\n </div>\n {rulerHover && (\n <div\n className=\"df-review-ruler-coord is-x\"\n style={{ left: `${rulerHover.x}px` }}\n >\n {Math.round(rulerHover.x / rulerScaleX)}\n </div>\n )}\n </div>\n <div\n className=\"df-review-ruler-gutter is-y\"\n style={\n {\n '--df-review-ruler-step-y': `${rulerScaleY * 20}px`,\n } as CSSProperties\n }\n >\n {rulerHover && (\n <div\n className=\"df-review-ruler-coord is-y\"\n style={{ top: `${rulerHover.y}px` }}\n >\n {Math.round(rulerHover.y / rulerScaleY)}\n </div>\n )}\n </div>\n </>\n );\n};\n","import type { RefObject } from 'react';\nimport type {\n ReviewRulerMeasure,\n ReviewRulerPoint,\n ReviewShellViewportPreset,\n} from '../types';\n\ninterface RulerOverlayProps {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerDragging: boolean;\n rulerHover: ReviewRulerPoint | null;\n rulerMeasure: ReviewRulerMeasure | undefined;\n rulerMeasureLabel: string;\n rulerOverlayRef: RefObject<HTMLDivElement | null>;\n size: ReviewShellViewportPreset;\n}\n\nexport const RulerOverlay = ({\n iframeRef,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n size,\n}: RulerOverlayProps) => {\n return (\n <div\n ref={rulerOverlayRef}\n aria-label=\"Ruler\"\n className={`df-review-ruler-overlay${\n isRulerDragging ? ' is-dragging' : ''\n }`}\n role=\"application\"\n onWheel={(event) => {\n iframeRef.current?.contentWindow?.scrollBy(\n event.deltaX,\n event.deltaY\n );\n }}\n >\n {rulerHover && (\n <>\n <div\n className=\"df-review-ruler-guide is-x\"\n aria-hidden=\"true\"\n style={{ top: `${rulerHover.y}px` }}\n />\n <div\n className=\"df-review-ruler-guide is-y\"\n aria-hidden=\"true\"\n style={{ left: `${rulerHover.x}px` }}\n />\n </>\n )}\n {rulerMeasure &&\n (rulerMeasure.width > 0 || rulerMeasure.height > 0) && (\n <>\n <div\n className=\"df-review-ruler-selection\"\n aria-hidden=\"true\"\n style={{\n left: `${rulerMeasure.left}px`,\n top: `${rulerMeasure.top}px`,\n width: `${rulerMeasure.width}px`,\n height: `${rulerMeasure.height}px`,\n }}\n />\n <div\n className=\"df-review-ruler-label\"\n style={{\n left: `${Math.min(\n Math.max(rulerMeasure.left + rulerMeasure.width + 8, 8),\n Math.max(8, size.width - 164)\n )}px`,\n top: `${Math.min(\n Math.max(rulerMeasure.top + rulerMeasure.height + 8, 8),\n Math.max(8, size.height - 34)\n )}px`,\n }}\n >\n {rulerMeasureLabel}\n </div>\n </>\n )}\n </div>\n );\n};\n","import type { RefObject } from 'react';\nimport { ExternalLink as ExternalLinkIcon } from 'lucide-react';\nimport type { ReviewMode } from '../../types';\nimport type {\n ReviewRulerMeasure,\n ReviewRulerPoint,\n ReviewShellViewportPreset,\n} from '../types';\nimport { ReviewModeToolbar } from '../review/mode.toolbar';\nimport { RulerGutters } from '../ruler/gutters';\nimport { RulerOverlay } from '../ruler/overlay';\n\ninterface ReviewTargetFrameProps {\n canWriteArea: boolean;\n canWriteDom: boolean;\n frameScrollRef: RefObject<HTMLDivElement | null>;\n figmaFrameUrl: string | null;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerAvailable: boolean;\n isRulerDragging: boolean;\n isRulerVisible: boolean;\n mode: ReviewMode;\n rulerHover: ReviewRulerPoint | null;\n rulerMeasure: ReviewRulerMeasure | undefined;\n rulerMeasureLabel: string;\n rulerOverlayRef: RefObject<HTMLDivElement | null>;\n rulerScaleX: number;\n rulerScaleY: number;\n rulerUnit: string;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onLoadTarget: () => void;\n onSetReviewMode: (mode: ReviewMode) => void;\n}\n\nexport const ReviewTargetFrame = ({\n canWriteArea,\n canWriteDom,\n frameScrollRef,\n figmaFrameUrl,\n iframeRef,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n mode,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n size,\n targetSrc,\n onLoadTarget,\n onSetReviewMode,\n}: ReviewTargetFrameProps) => {\n const showRuler = isRulerVisible && isRulerAvailable;\n const targetHref = getTargetOpenHref(targetSrc);\n\n return (\n <main className=\"df-review-stage\">\n <div className=\"df-review-frame\">\n <div className=\"df-review-frame-scroll\" ref={frameScrollRef}>\n <div className=\"df-review-frame-canvas\">\n <div className=\"df-review-target-stack\">\n <div\n className={`df-review-device-frame${\n showRuler ? ' is-ruler' : ''\n }`}\n >\n {showRuler && (\n <RulerGutters\n rulerHover={rulerHover}\n rulerScaleX={rulerScaleX}\n rulerScaleY={rulerScaleY}\n rulerUnit={rulerUnit}\n size={size}\n />\n )}\n <div\n className=\"df-review-device\"\n style={{\n width: `${size.width}px`,\n height: `${size.height}px`,\n minWidth: `${size.width}px`,\n minHeight: `${size.height}px`,\n }}\n >\n <iframe\n key={targetSrc}\n ref={iframeRef}\n width={size.width}\n height={size.height}\n src={targetSrc}\n title=\"Review target\"\n onLoad={onLoadTarget}\n />\n {showRuler && (\n <RulerOverlay\n iframeRef={iframeRef}\n isRulerDragging={isRulerDragging}\n rulerHover={rulerHover}\n rulerMeasure={rulerMeasure}\n rulerMeasureLabel={rulerMeasureLabel}\n rulerOverlayRef={rulerOverlayRef}\n size={size}\n />\n )}\n </div>\n <div className=\"df-review-frame-link-stack\">\n <a\n aria-label=\"Open target page\"\n className=\"df-review-frame-link is-target\"\n href={targetHref}\n rel=\"noreferrer\"\n target=\"_blank\"\n title=\"Open target page\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n {figmaFrameUrl && (\n <a\n aria-label=\"Open Figma frame\"\n className=\"df-review-frame-link is-figma\"\n href={figmaFrameUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n title=\"Open Figma frame\"\n >\n <FigmaIcon />\n </a>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"df-review-frame-actions\">\n <ReviewModeToolbar\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n mode={mode}\n onSetReviewMode={onSetReviewMode}\n />\n </div>\n </div>\n </main>\n );\n};\n\nfunction getTargetOpenHref(targetSrc: string) {\n const url = new URL(targetSrc, window.location.origin);\n url.searchParams.delete('__dfwr_target');\n return `${url.pathname}${url.search}${url.hash}`;\n}\n\nconst FigmaIcon = () => (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M15.852 8.981h-4.588V0h4.588c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.491-4.49 4.491zM12.735 7.51h3.117c1.665 0 3.019-1.355 3.019-3.019s-1.355-3.019-3.019-3.019h-3.117V7.51zm0 1.471H8.148c-2.476 0-4.49-2.014-4.49-4.49S5.672 0 8.148 0h4.588v8.981zm-4.587-7.51c-1.665 0-3.019 1.355-3.019 3.019s1.354 3.02 3.019 3.02h3.117V1.471H8.148zm4.587 15.019H8.148c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h4.588v8.98zM8.148 8.981c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h3.117V8.981H8.148zM8.172 24c-2.489 0-4.515-2.014-4.515-4.49s2.014-4.49 4.49-4.49h4.588v4.441C12.735 21.964 10.688 24 8.172 24zm-.024-7.51a3.023 3.023 0 0 0-3.019 3.019c0 1.665 1.365 3.019 3.044 3.019 1.705 0 3.093-1.376 3.093-3.068v-2.97H8.148zm7.704 0h-.098c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h.098c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.49-4.49 4.49zm-.097-7.509c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h.098c1.665 0 3.019-1.355 3.019-3.019s-1.355-3.019-3.019-3.019h-.098z\" />\n </svg>\n);\n","import {\n CircleHelp as CircleHelpIcon,\n Image as ImageIcon,\n LayoutGrid as LayoutGridIcon,\n Map as MapIcon,\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n Ruler as RulerIcon,\n Settings as SettingsIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n} from 'lucide-react';\nimport type { ReviewItemScope } from '../index';\nimport { FIGMA_OVERLAY_UNAVAILABLE_MESSAGE } from './constants';\nimport type {\n ReviewShellViewportPreset,\n TargetOverlayKey,\n TargetOverlayState,\n} from './types';\nimport { getViewportPresetKind } from './viewport';\n\ninterface ReviewTopbarProps {\n draftTarget: string;\n copyLabel: string;\n viewportPresets: ReviewShellViewportPreset[];\n size: ReviewShellViewportPreset;\n presetScopeCounts: ReadonlyMap<ReviewItemScope, number>;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n targetOverlayState: TargetOverlayState;\n isFigmaOverlayAvailable: boolean;\n onDraftTargetChange: (value: string) => void;\n onApplyTarget: () => void;\n onOpenSitemap: () => void;\n onCopyCurrentUrl: () => void;\n onSizeChange: (preset: ReviewShellViewportPreset) => void;\n onToggleRuler: () => void;\n onToggleTargetOverlay: (key: TargetOverlayKey) => void;\n onOpenInitialPrompt: () => void;\n onOpenSettings: () => void;\n}\n\nconst ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nconst ViewportPresetIcon = ({\n preset\n}: {\n preset: ReviewShellViewportPreset;\n}) => {\n return <ReviewScopeIcon scope={getViewportPresetKind(preset)} />;\n};\n\nexport const ReviewTopbar = ({\n draftTarget,\n copyLabel,\n viewportPresets,\n size,\n presetScopeCounts,\n isRulerAvailable,\n isRulerVisible,\n targetOverlayState,\n isFigmaOverlayAvailable,\n onDraftTargetChange,\n onApplyTarget,\n onOpenSitemap,\n onCopyCurrentUrl,\n onSizeChange,\n onToggleRuler,\n onToggleTargetOverlay,\n onOpenInitialPrompt,\n onOpenSettings,\n}: ReviewTopbarProps) => {\n return (\n <header className=\"df-review-topbar\">\n <form\n className=\"df-review-address\"\n onSubmit={(event) => {\n event.preventDefault();\n onApplyTarget();\n }}\n >\n <button\n aria-label=\"Open sitemap\"\n className=\"df-review-sitemap-button\"\n type=\"button\"\n onClick={onOpenSitemap}\n >\n <MapIcon aria-hidden=\"true\" />\n </button>\n <input\n aria-label=\"Path\"\n value={draftTarget}\n onChange={(event) => onDraftTargetChange(event.target.value)}\n />\n <button type=\"submit\">Load</button>\n <button type=\"button\" onClick={onCopyCurrentUrl}>\n {copyLabel}\n </button>\n </form>\n\n <div className=\"df-review-tools\">\n <div className=\"df-review-tool-controls\">\n <div className=\"df-review-presets\" aria-label=\"Viewport presets\">\n {viewportPresets.map((preset) => (\n <button\n key={preset.label}\n className={preset.label === size.label ? 'is-active' : ''}\n type=\"button\"\n onClick={() => onSizeChange(preset)}\n >\n <ViewportPresetIcon preset={preset} />\n <span className=\"df-review-preset-copy\">\n <strong>{preset.label}</strong>\n </span>\n <span className=\"df-review-preset-count\">\n {presetScopeCounts.get(getViewportPresetKind(preset)) ?? 0}\n </span>\n </button>\n ))}\n </div>\n\n <span className=\"df-review-tool-divider\" aria-hidden=\"true\">\n |\n </span>\n\n <span className=\"df-review-active-size\">\n {size.width}x{size.height}\n </span>\n </div>\n\n <div className=\"df-review-overlays\" aria-label=\"Target overlays\">\n {isRulerAvailable && (\n <button\n aria-label=\"Toggle ruler\"\n className={`df-review-overlay-button is-ruler${\n isRulerVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={onToggleRuler}\n >\n <RulerIcon aria-hidden=\"true\" />\n </button>\n )}\n <button\n aria-label=\"Toggle grid overlay\"\n className={`df-review-overlay-button is-grid${\n targetOverlayState.grid ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={() => onToggleTargetOverlay('grid')}\n >\n <LayoutGridIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-disabled={!isFigmaOverlayAvailable}\n aria-label={\n isFigmaOverlayAvailable\n ? 'Toggle Figma overlay'\n : FIGMA_OVERLAY_UNAVAILABLE_MESSAGE\n }\n className={`df-review-overlay-button is-figma${\n targetOverlayState.figma ? ' is-active' : ''\n }${isFigmaOverlayAvailable ? '' : ' is-disabled'}`}\n disabled={!isFigmaOverlayAvailable}\n type=\"button\"\n onClick={() => onToggleTargetOverlay('figma')}\n >\n <ImageIcon aria-hidden=\"true\" />\n </button>\n <span className=\"df-review-tool-divider\" aria-hidden=\"true\">\n |\n </span>\n <button\n aria-label=\"Open initial prompt\"\n className=\"df-review-overlay-button is-prompt\"\n type=\"button\"\n onClick={onOpenInitialPrompt}\n >\n <CircleHelpIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Open settings\"\n className=\"df-review-overlay-button is-settings\"\n type=\"button\"\n onClick={onOpenSettings}\n >\n <SettingsIcon aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n </header>\n );\n};\n","import {\n useCallback,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewMode,\n ReviewRulerConfig,\n ReviewSource,\n ReviewViewportPreset,\n WebReviewKitAdapter,\n WebReviewKitController,\n} from '../../types';\nimport type {\n ReviewShellViewportPreset,\n TargetOverlayState,\n} from '../types';\nimport { useReviewItemRestore } from './use.review.item.restore';\nimport { useReviewKitLifecycle } from './use.review.kit.lifecycle';\nimport { useReviewTargetOverlay } from './use.review.target.overlay';\nimport { useReviewTargetSync } from './use.review.target.sync';\n\ninterface UseReviewControllerOptions {\n adapter: WebReviewKitAdapter;\n cleanupTargetRef: MutableRefObject<(() => void) | null>;\n controllerRef: MutableRefObject<WebReviewKitController | null>;\n frameScrollRef: RefObject<HTMLDivElement | null>;\n hiddenOverlayItemIdList: string[];\n hiddenOverlayItemIdListRef: MutableRefObject<string[]>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isFigmaOverlayAvailable: boolean;\n pageTargets: ReadonlySet<string>;\n pendingInitialItemIdRef: MutableRefObject<string | null>;\n pendingRestoreRef: MutableRefObject<ReviewItem | null>;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n reviewViewportPresets: ReviewViewportPreset[];\n ruler?: ReviewRulerConfig;\n adjustmentLabel?: string;\n selectedItemIdRef: MutableRefObject<string | null>;\n size: ReviewShellViewportPreset;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n target: string;\n targetOverlayState: TargetOverlayState;\n targetRef: MutableRefObject<string>;\n viewportPresets: ReviewShellViewportPreset[];\n onActiveRouteChange: (target: string) => void;\n onCancelReviewMode: () => boolean;\n onDraftTargetChange: (target: string) => void;\n onItemsRefresh: () => Promise<ReviewItem[]>;\n onModeChange: (mode: ReviewMode) => void;\n onSelectedItemIdChange: (itemId: string | null) => void;\n onSizeChange: (size: ReviewShellViewportPreset) => void;\n onTargetChange: (target: string) => void;\n onTargetOverlayStateChange: (state: TargetOverlayState) => void;\n onCloseRuler: () => boolean;\n}\n\nexport const useReviewController = ({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n pageTargets,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n adjustmentLabel,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetOverlayState,\n targetRef,\n viewportPresets,\n onActiveRouteChange,\n onCancelReviewMode,\n onDraftTargetChange,\n onItemsRefresh,\n onModeChange,\n onSelectedItemIdChange,\n onSizeChange,\n onTargetChange,\n onTargetOverlayStateChange,\n onCloseRuler,\n}: UseReviewControllerOptions) => {\n const syncTargetViewport = useCallback(() => {\n window.dispatchEvent(new Event('resize'));\n }, []);\n const {\n closeTargetOverlay,\n refreshTargetOverlayState,\n toggleTargetOverlay,\n } = useReviewTargetOverlay({\n iframeRef,\n isFigmaOverlayAvailable,\n targetOverlayState,\n onTargetOverlayStateChange,\n });\n const {\n applyPendingRestore,\n clearSelectedItem,\n restoreInitialItem,\n restoreReviewItem,\n } = useReviewItemRestore({\n adapter,\n controllerRef,\n iframeRef,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n reviewPathPrefix,\n selectedItemIdRef,\n source,\n targetRef,\n viewportPresets,\n onActiveRouteChange,\n onDraftTargetChange,\n onSelectedItemIdChange,\n onSizeChange,\n onSyncTargetViewport: syncTargetViewport,\n onTargetChange,\n });\n const { syncShellTarget } = useReviewTargetSync({\n iframeRef,\n reviewPathPrefix,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetRef,\n onActiveRouteChange,\n onClearSelectedItem: clearSelectedItem,\n onDraftTargetChange,\n onSyncTargetViewport: syncTargetViewport,\n onTargetChange,\n });\n const {\n initReviewKit,\n reloadReviewKit,\n setControllerReviewMode,\n } = useReviewKitLifecycle({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n pageTargets,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n adjustmentLabel,\n sizeRef,\n targetRef,\n onApplyPendingRestore: applyPendingRestore,\n onCancelReviewMode,\n onCloseRuler,\n onCreateItem: restoreReviewItem,\n onItemsRefresh,\n onModeChange,\n onRefreshTargetOverlayState: refreshTargetOverlayState,\n onRestoreInitialItem: restoreInitialItem,\n onRestoreReviewItem: restoreReviewItem,\n onSyncShellTarget: syncShellTarget,\n onSyncTargetViewport: syncTargetViewport,\n });\n\n return {\n clearSelectedItem,\n closeTargetOverlay,\n initReviewKit,\n reloadReviewKit,\n restoreReviewItem,\n setControllerReviewMode,\n syncTargetViewport,\n toggleTargetOverlay,\n };\n};\n","import {\n useCallback,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewSource,\n WebReviewKitAdapter,\n WebReviewKitController,\n} from '../../types';\nimport {\n getReviewItemRestoreScrollPosition,\n queryReviewItemAnchorElement,\n setDocumentScrollInstantly,\n} from '../anchor.restore';\nimport {\n getItemTarget,\n updateShellUrlForItem,\n} from '../route';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getRestoredSize } from '../viewport';\n\ninterface UseReviewItemRestoreOptions {\n adapter: WebReviewKitAdapter;\n controllerRef: MutableRefObject<WebReviewKitController | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n pendingInitialItemIdRef: MutableRefObject<string | null>;\n pendingRestoreRef: MutableRefObject<ReviewItem | null>;\n reviewPathPrefix: string;\n selectedItemIdRef: MutableRefObject<string | null>;\n source: ReviewSource;\n targetRef: MutableRefObject<string>;\n viewportPresets: ReviewShellViewportPreset[];\n onActiveRouteChange: (target: string) => void;\n onDraftTargetChange: (target: string) => void;\n onSelectedItemIdChange: (itemId: string | null) => void;\n onSizeChange: (size: ReviewShellViewportPreset) => void;\n onSyncTargetViewport: () => void;\n onTargetChange: (target: string) => void;\n}\n\nfunction runWithAutoScrollBehavior(\n targetDocument: Document | undefined,\n callback: () => void\n) {\n const elements = [\n targetDocument?.documentElement,\n targetDocument?.body,\n ].filter((element): element is HTMLElement => Boolean(element));\n const previousValues = elements.map((element) => element.style.scrollBehavior);\n\n elements.forEach((element) => {\n element.style.scrollBehavior = 'auto';\n });\n\n try {\n callback();\n } finally {\n elements.forEach((element, index) => {\n element.style.scrollBehavior = previousValues[index] ?? '';\n });\n }\n}\n\nconst RESTORE_WAIT_MAX_MS = 2600;\nconst RESTORE_STABLE_FRAME_COUNT = 2;\n\nconst waitForNextAnimationFrame = (targetWindow: Window) =>\n new Promise<void>((resolve) => {\n targetWindow.requestAnimationFrame(() => resolve());\n });\n\nconst getRestoreLayoutSnapshot = (\n targetDocument: Document,\n anchorElement?: Element\n) => {\n const root = targetDocument.documentElement;\n const body = targetDocument.body;\n const anchorRect = anchorElement?.getBoundingClientRect();\n\n return [\n root.scrollWidth,\n root.scrollHeight,\n body?.scrollWidth ?? 0,\n body?.scrollHeight ?? 0,\n anchorRect ? Math.round(anchorRect.left) : -1,\n anchorRect ? Math.round(anchorRect.top) : -1,\n anchorRect ? Math.round(anchorRect.width) : -1,\n anchorRect ? Math.round(anchorRect.height) : -1,\n ].join(':');\n};\n\nconst waitForRestoreAnchor = async (\n targetWindow: Window,\n targetDocument: Document,\n item: ReviewItem,\n isCurrent: () => boolean\n) => {\n const startedAt = targetWindow.performance.now();\n let previousSnapshot = '';\n let stableFrameCount = 0;\n\n while (\n isCurrent() &&\n targetWindow.performance.now() - startedAt < RESTORE_WAIT_MAX_MS\n ) {\n const anchorElement = queryReviewItemAnchorElement(targetDocument, item);\n const snapshot = getRestoreLayoutSnapshot(targetDocument, anchorElement);\n const canRestore = item.anchor ? Boolean(anchorElement) : true;\n\n if (snapshot === previousSnapshot) {\n stableFrameCount += 1;\n } else {\n stableFrameCount = 0;\n }\n\n if (canRestore && stableFrameCount >= RESTORE_STABLE_FRAME_COUNT) {\n return anchorElement;\n }\n\n previousSnapshot = snapshot;\n await waitForNextAnimationFrame(targetWindow);\n }\n\n return queryReviewItemAnchorElement(targetDocument, item);\n};\n\nexport const useReviewItemRestore = ({\n adapter,\n controllerRef,\n iframeRef,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n reviewPathPrefix,\n selectedItemIdRef,\n source,\n targetRef,\n viewportPresets,\n onActiveRouteChange,\n onDraftTargetChange,\n onSelectedItemIdChange,\n onSizeChange,\n onSyncTargetViewport,\n onTargetChange,\n}: UseReviewItemRestoreOptions) => {\n const clearSelectedItem = useCallback(() => {\n pendingRestoreRef.current = null;\n selectedItemIdRef.current = null;\n onSelectedItemIdChange(null);\n controllerRef.current?.highlightItem(undefined);\n }, [\n controllerRef,\n onSelectedItemIdChange,\n pendingRestoreRef,\n selectedItemIdRef,\n ]);\n\n const applyItemScroll = useCallback(\n async (item: ReviewItem) => {\n if (selectedItemIdRef.current !== item.id) return false;\n\n const targetWindow = iframeRef.current?.contentWindow;\n const targetDocument = iframeRef.current?.contentDocument;\n if (!targetWindow || !targetDocument) return false;\n\n const isCurrentRestore = () =>\n selectedItemIdRef.current === item.id &&\n iframeRef.current?.contentDocument === targetDocument;\n const anchorElement = await waitForRestoreAnchor(\n targetWindow,\n targetDocument,\n item,\n isCurrentRestore\n );\n if (!isCurrentRestore()) return false;\n\n runWithAutoScrollBehavior(targetDocument, () => {\n setDocumentScrollInstantly(\n targetWindow,\n targetDocument,\n getReviewItemRestoreScrollPosition(\n targetWindow,\n targetDocument,\n item,\n anchorElement\n )\n );\n });\n onSyncTargetViewport();\n controllerRef.current?.highlightItem(item.id);\n return true;\n },\n [controllerRef, iframeRef, onSyncTargetViewport, selectedItemIdRef]\n );\n\n const applyPendingRestore = useCallback(() => {\n const item = pendingRestoreRef.current;\n if (!item) return;\n\n void applyItemScroll(item).then((didApply) => {\n if (didApply && pendingRestoreRef.current?.id === item.id) {\n pendingRestoreRef.current = null;\n }\n });\n }, [applyItemScroll, pendingRestoreRef]);\n\n const restoreReviewItem = useCallback(\n (item: ReviewItem) => {\n const nextTarget = getItemTarget(item, reviewPathPrefix);\n const nextSize = getRestoredSize(item, viewportPresets);\n\n pendingRestoreRef.current = item;\n selectedItemIdRef.current = item.id;\n onSelectedItemIdChange(item.id);\n onActiveRouteChange(nextTarget);\n onDraftTargetChange(nextTarget);\n onSizeChange(nextSize);\n updateShellUrlForItem(nextTarget, nextSize, item.id, source);\n\n if (targetRef.current !== nextTarget) {\n onTargetChange(nextTarget);\n return;\n }\n\n applyPendingRestore();\n },\n [\n applyPendingRestore,\n onActiveRouteChange,\n onDraftTargetChange,\n onSelectedItemIdChange,\n onSizeChange,\n onTargetChange,\n pendingRestoreRef,\n reviewPathPrefix,\n selectedItemIdRef,\n source,\n targetRef,\n viewportPresets,\n ]\n );\n\n const restoreInitialItem = useCallback(async () => {\n const itemId = pendingInitialItemIdRef.current;\n if (!itemId) return;\n\n pendingInitialItemIdRef.current = null;\n\n const item = await adapter.get(itemId);\n if (item) {\n restoreReviewItem(item);\n }\n }, [adapter, pendingInitialItemIdRef, restoreReviewItem]);\n\n return {\n applyPendingRestore,\n clearSelectedItem,\n restoreInitialItem,\n restoreReviewItem,\n };\n};\n","import {\n useCallback,\n useEffect,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewMode,\n ReviewRulerConfig,\n ReviewViewportPreset,\n WebReviewKitAdapter,\n WebReviewKitController,\n} from '../../types';\nimport { createWebReviewKit } from '../../core/web.review.kit.app';\nimport { setTargetScrollbarHidden } from '../target/target';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\nimport { bindReviewFrameNavigation } from './review.frame.navigation';\nimport { getReviewKitTarget } from './review.kit.target';\n\ninterface UseReviewKitLifecycleOptions {\n adapter: WebReviewKitAdapter;\n cleanupTargetRef: MutableRefObject<(() => void) | null>;\n controllerRef: MutableRefObject<WebReviewKitController | null>;\n frameScrollRef: RefObject<HTMLDivElement | null>;\n hiddenOverlayItemIdList: string[];\n hiddenOverlayItemIdListRef: MutableRefObject<string[]>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n pageTargets: ReadonlySet<string>;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n reviewViewportPresets: ReviewViewportPreset[];\n ruler?: ReviewRulerConfig;\n adjustmentLabel?: string;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n targetRef: MutableRefObject<string>;\n onApplyPendingRestore: () => void;\n onCancelReviewMode: () => boolean;\n onCloseRuler: () => boolean;\n onItemsRefresh: () => Promise<ReviewItem[]>;\n onModeChange: (mode: ReviewMode) => void;\n onCreateItem: (item: ReviewItem) => void;\n onRefreshTargetOverlayState: () => void;\n onRestoreInitialItem: () => Promise<void>;\n onRestoreReviewItem: (item: ReviewItem) => void;\n onSyncShellTarget: (target: string) => void;\n onSyncTargetViewport: () => void;\n}\n\nexport const useReviewKitLifecycle = ({\n adapter,\n cleanupTargetRef,\n controllerRef,\n frameScrollRef,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIdListRef,\n iframeRef,\n pageTargets,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n adjustmentLabel,\n sizeRef,\n targetRef,\n onApplyPendingRestore,\n onCancelReviewMode,\n onCloseRuler,\n onItemsRefresh,\n onModeChange,\n onCreateItem,\n onRefreshTargetOverlayState,\n onRestoreInitialItem,\n onRestoreReviewItem,\n onSyncShellTarget,\n onSyncTargetViewport,\n}: UseReviewKitLifecycleOptions) => {\n const destroyReviewKit = useCallback(() => {\n cleanupTargetRef.current?.();\n cleanupTargetRef.current = null;\n controllerRef.current?.destroy();\n controllerRef.current = null;\n }, [cleanupTargetRef, controllerRef]);\n\n const initReviewKit = useCallback(() => {\n destroyReviewKit();\n\n const iframe = iframeRef.current;\n const targetWindow = iframe?.contentWindow;\n const targetDocument = iframe?.contentDocument;\n if (!iframe || !targetWindow || !targetDocument) return;\n\n cleanupTargetRef.current = bindReviewFrameNavigation({\n pageTargets,\n reviewPathPrefix,\n targetDocument,\n targetRef,\n targetWindow,\n onCancelReviewMode,\n onCloseRuler,\n onSyncShellTarget,\n onSyncTargetViewport,\n });\n\n controllerRef.current = createWebReviewKit({\n projectId,\n userId: reviewUserId.trim() || undefined,\n adapter,\n target: () => getReviewKitTarget({ frameScrollRef, iframeRef }),\n hotkeys: {\n qa: 'Shift+Q',\n },\n anchors: {\n attribute: 'data-qa-id',\n },\n viewports: {\n presets: reviewViewportPresets,\n },\n ruler,\n adjustmentLabel,\n onCreateItem,\n onRestoreItem: onRestoreReviewItem,\n onItemsChange: () => {\n void onItemsRefresh();\n },\n onModeChange,\n ui: {\n panel: false,\n },\n modules: {\n qa: true,\n grid: false,\n figma: false,\n },\n });\n controllerRef.current.open();\n controllerRef.current.setHiddenItemIds(hiddenOverlayItemIdListRef.current);\n onModeChange(controllerRef.current.getMode());\n void onItemsRefresh();\n void onRestoreInitialItem().then(onApplyPendingRestore);\n onRefreshTargetOverlayState();\n setTargetScrollbarHidden(\n targetDocument,\n getViewportPresetKind(sizeRef.current) === 'mobile'\n );\n }, [\n adapter,\n cleanupTargetRef,\n controllerRef,\n destroyReviewKit,\n frameScrollRef,\n hiddenOverlayItemIdListRef,\n iframeRef,\n onApplyPendingRestore,\n onCancelReviewMode,\n onCloseRuler,\n onCreateItem,\n onItemsRefresh,\n onModeChange,\n onRefreshTargetOverlayState,\n onRestoreInitialItem,\n onRestoreReviewItem,\n onSyncShellTarget,\n onSyncTargetViewport,\n pageTargets,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n reviewViewportPresets,\n ruler,\n adjustmentLabel,\n sizeRef,\n targetRef,\n ]);\n\n const reloadReviewKit = useCallback(async () => {\n await controllerRef.current?.reload();\n }, [controllerRef]);\n\n const setControllerReviewMode = useCallback(\n (nextMode: ReviewMode) => {\n controllerRef.current?.setMode(nextMode);\n onModeChange(controllerRef.current?.getMode() ?? 'idle');\n },\n [controllerRef, onModeChange]\n );\n\n useEffect(() => destroyReviewKit, [destroyReviewKit]);\n\n useEffect(() => {\n const frameDocument = iframeRef.current?.contentDocument;\n if (!frameDocument || frameDocument.readyState !== 'complete') return;\n initReviewKit();\n }, [iframeRef, initReviewKit]);\n\n useEffect(() => {\n hiddenOverlayItemIdListRef.current = hiddenOverlayItemIdList;\n controllerRef.current?.setHiddenItemIds(hiddenOverlayItemIdList);\n }, [controllerRef, hiddenOverlayItemIdList, hiddenOverlayItemIdListRef]);\n\n return {\n destroyReviewKit,\n initReviewKit,\n reloadReviewKit,\n setControllerReviewMode,\n };\n};\n","import type { TargetOverlayState } from '../types';\n\nexport const HIDE_SCROLLBAR_STYLE_ID = 'df-review-hide-scrollbar';\n\nexport const setTargetScrollbarHidden = (\n targetDocument: Document | null | undefined,\n hidden: boolean\n) => {\n if (!targetDocument) return;\n\n const existing = targetDocument.getElementById(HIDE_SCROLLBAR_STYLE_ID);\n if (hidden) {\n if (existing) return;\n const style = targetDocument.createElement('style');\n style.id = HIDE_SCROLLBAR_STYLE_ID;\n style.textContent =\n 'html{scrollbar-width:none}html::-webkit-scrollbar,body::-webkit-scrollbar{width:0;height:0;display:none}';\n targetDocument.head?.appendChild(style);\n } else {\n existing?.remove();\n }\n};\n\nexport const isEditableEventTarget = (event: KeyboardEvent) => {\n const path = event.composedPath?.() ?? [];\n const element = (path[0] ?? event.target) as HTMLElement | null;\n if (!element || typeof element.tagName !== 'string') return false;\n const tag = element.tagName;\n return (\n tag === 'INPUT' || tag === 'TEXTAREA' || element.isContentEditable === true\n );\n};\n\nexport const getTargetOverlayState = (\n targetDocument: Document | undefined\n): TargetOverlayState => ({\n grid: Boolean(\n targetDocument?.body.classList.contains('is-help') ||\n targetDocument?.querySelector('.helper.onShow')\n ),\n figma: Boolean(\n targetDocument?.querySelector(\n '.helper-figma-root, .helper-figma-loading-backdrop'\n )\n )\n});\n","import type { MutableRefObject } from 'react';\nimport {\n getFrameRouteTarget,\n normalizeTarget,\n} from '../route';\n\ninterface BindReviewFrameNavigationOptions {\n pageTargets: ReadonlySet<string>;\n reviewPathPrefix: string;\n targetDocument: Document;\n targetRef: MutableRefObject<string>;\n targetWindow: Window;\n onCancelReviewMode: () => boolean;\n onCloseRuler: () => boolean;\n onSyncShellTarget: (target: string) => void;\n onSyncTargetViewport: () => void;\n}\n\nexport const bindReviewFrameNavigation = ({\n pageTargets,\n reviewPathPrefix,\n targetDocument,\n targetRef,\n targetWindow,\n onCancelReviewMode,\n onCloseRuler,\n onSyncShellTarget,\n onSyncTargetViewport,\n}: BindReviewFrameNavigationOptions) => {\n const syncRouteFromFrame = () => {\n const nextTarget = getFrameRouteTarget(targetWindow, reviewPathPrefix);\n if (nextTarget !== targetRef.current && !pageTargets.has(nextTarget)) {\n return;\n }\n\n onSyncShellTarget(nextTarget);\n };\n\n const handleClick = (event: MouseEvent) => {\n if (event.defaultPrevented || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n const targetElement = event.target;\n if (!targetElement || !('closest' in targetElement)) return;\n\n const link = (targetElement as Element).closest('a[href]');\n const href = link?.getAttribute('href');\n const linkTarget = link?.getAttribute('target');\n if (!href || (linkTarget && linkTarget !== '_self')) return;\n\n const url = new URL(href, targetWindow.location.href);\n if (url.origin !== targetWindow.location.origin) return;\n\n const nextTarget = normalizeTarget(url.pathname, reviewPathPrefix);\n if (nextTarget === targetRef.current) return;\n\n event.preventDefault();\n onSyncShellTarget(nextTarget);\n };\n\n const handleFrameKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n if (!onCancelReviewMode() && !onCloseRuler()) return;\n\n event.preventDefault();\n event.stopPropagation();\n };\n\n const history = targetWindow.history;\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<History['pushState']>) => {\n originalPushState(...args);\n syncRouteFromFrame();\n };\n history.replaceState = (...args: Parameters<History['replaceState']>) => {\n originalReplaceState(...args);\n syncRouteFromFrame();\n };\n\n syncRouteFromFrame();\n targetWindow.addEventListener('popstate', syncRouteFromFrame);\n targetWindow.addEventListener('hashchange', syncRouteFromFrame);\n targetWindow.addEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.addEventListener('click', handleClick, true);\n targetWindow.addEventListener('scroll', onSyncTargetViewport, true);\n targetWindow.addEventListener('resize', onSyncTargetViewport);\n\n return () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n targetWindow.removeEventListener('popstate', syncRouteFromFrame);\n targetWindow.removeEventListener('hashchange', syncRouteFromFrame);\n targetWindow.removeEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.removeEventListener('click', handleClick, true);\n targetWindow.removeEventListener('scroll', onSyncTargetViewport, true);\n targetWindow.removeEventListener('resize', onSyncTargetViewport);\n };\n};\n","import type { RefObject } from 'react';\nimport type { WebReviewKitTarget } from '../../types';\n\ninterface GetReviewKitTargetOptions {\n frameScrollRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n}\n\nexport const getReviewKitTarget = ({\n frameScrollRef,\n iframeRef,\n}: GetReviewKitTargetOptions): WebReviewKitTarget | undefined => {\n const frame = iframeRef.current;\n const frameWindow = frame?.contentWindow;\n const frameDocument = frame?.contentDocument;\n\n if (!frame || !frameWindow || !frameDocument) return undefined;\n\n return {\n window: frameWindow,\n document: frameDocument,\n getViewportRect: () => frame.getBoundingClientRect(),\n getOverlayRect: () => {\n const frameRect = frame.getBoundingClientRect();\n const scrollRect = frameScrollRef.current?.getBoundingClientRect();\n if (!scrollRect) return frameRect;\n\n const left = Math.max(frameRect.left, scrollRect.left);\n const top = Math.max(frameRect.top, scrollRect.top);\n const right = Math.min(\n frameRect.left + frameRect.width,\n scrollRect.left + scrollRect.width\n );\n const bottom = Math.min(\n frameRect.top + frameRect.height,\n scrollRect.top + scrollRect.height\n );\n\n return {\n left,\n top,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n };\n },\n };\n};\n","import { useCallback, useEffect, type RefObject } from 'react';\nimport { getTargetOverlayState } from '../target/target';\nimport type {\n TargetOverlayKey,\n TargetOverlayState,\n} from '../types';\n\ninterface UseReviewTargetOverlayOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isFigmaOverlayAvailable: boolean;\n targetOverlayState: TargetOverlayState;\n onTargetOverlayStateChange: (state: TargetOverlayState) => void;\n}\n\nexport const useReviewTargetOverlay = ({\n iframeRef,\n isFigmaOverlayAvailable,\n targetOverlayState,\n onTargetOverlayStateChange,\n}: UseReviewTargetOverlayOptions) => {\n const refreshTargetOverlayState = useCallback(() => {\n onTargetOverlayStateChange(\n getTargetOverlayState(iframeRef.current?.contentDocument ?? undefined)\n );\n }, [iframeRef, onTargetOverlayStateChange]);\n\n const dispatchTargetOverlayHotkey = useCallback(\n (overlay: TargetOverlayKey) => {\n const targetWindow = iframeRef.current?.contentWindow;\n if (!targetWindow) return false;\n\n const code = overlay === 'grid' ? 'KeyG' : 'KeyF';\n targetWindow.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n cancelable: true,\n code,\n key: code.replace('Key', '').toLowerCase(),\n shiftKey: true,\n })\n );\n window.setTimeout(refreshTargetOverlayState, 80);\n return true;\n },\n [iframeRef, refreshTargetOverlayState]\n );\n\n const toggleTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n if (overlay === 'figma' && !isFigmaOverlayAvailable) {\n refreshTargetOverlayState();\n return;\n }\n\n dispatchTargetOverlayHotkey(overlay);\n },\n [\n dispatchTargetOverlayHotkey,\n isFigmaOverlayAvailable,\n refreshTargetOverlayState,\n ]\n );\n\n const closeTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n const currentState = getTargetOverlayState(\n iframeRef.current?.contentDocument ?? undefined\n );\n onTargetOverlayStateChange(currentState);\n if (!currentState[overlay]) return false;\n\n return dispatchTargetOverlayHotkey(overlay);\n },\n [dispatchTargetOverlayHotkey, iframeRef, onTargetOverlayStateChange]\n );\n\n useEffect(() => {\n if (isFigmaOverlayAvailable || !targetOverlayState.figma) return;\n closeTargetOverlay('figma');\n }, [closeTargetOverlay, isFigmaOverlayAvailable, targetOverlayState.figma]);\n\n return {\n closeTargetOverlay,\n refreshTargetOverlayState,\n toggleTargetOverlay,\n };\n};\n","import {\n useCallback,\n useEffect,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type { ReviewSource } from '../../types';\nimport {\n normalizeTarget,\n updateShellUrl,\n updateShellUrlForItem,\n} from '../route';\nimport { setTargetScrollbarHidden } from '../target/target';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface UseReviewTargetSyncOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n reviewPathPrefix: string;\n selectedItemIdRef: MutableRefObject<string | null>;\n size: ReviewShellViewportPreset;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n target: string;\n targetRef: MutableRefObject<string>;\n onActiveRouteChange: (target: string) => void;\n onClearSelectedItem: () => void;\n onDraftTargetChange: (target: string) => void;\n onSyncTargetViewport: () => void;\n onTargetChange: (target: string) => void;\n}\n\nexport const useReviewTargetSync = ({\n iframeRef,\n reviewPathPrefix,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetRef,\n onActiveRouteChange,\n onClearSelectedItem,\n onDraftTargetChange,\n onSyncTargetViewport,\n onTargetChange,\n}: UseReviewTargetSyncOptions) => {\n const syncShellTarget = useCallback(\n (nextTarget: string) => {\n const normalizedTarget = normalizeTarget(nextTarget, reviewPathPrefix);\n\n if (normalizedTarget !== targetRef.current) {\n onClearSelectedItem();\n targetRef.current = normalizedTarget;\n onTargetChange(normalizedTarget);\n onDraftTargetChange(normalizedTarget);\n onActiveRouteChange(normalizedTarget);\n }\n\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n normalizedTarget,\n sizeRef.current,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n }\n },\n [\n onActiveRouteChange,\n onClearSelectedItem,\n onDraftTargetChange,\n onTargetChange,\n reviewPathPrefix,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n ]\n );\n\n useEffect(() => {\n targetRef.current = target;\n onActiveRouteChange(target);\n }, [onActiveRouteChange, target, targetRef]);\n\n useEffect(() => {\n sizeRef.current = size;\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n targetRef.current,\n size,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(targetRef.current, size, source);\n }\n onSyncTargetViewport();\n setTargetScrollbarHidden(\n iframeRef.current?.contentDocument,\n getViewportPresetKind(size) === 'mobile'\n );\n }, [\n iframeRef,\n onSyncTargetViewport,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n targetRef,\n ]);\n\n return {\n syncShellTarget,\n };\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { NumberedReviewItem, ReviewMode, ReviewSource } from '../../types';\nimport {\n getReviewPresenceColor,\n getReviewPresenceDisplayName,\n getReviewPresenceSessionId,\n} from '../presence/presence';\nimport { normalizeTarget } from '../route';\nimport type {\n ReviewPresenceAdapter,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewShellViewportPreset,\n} from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface UseReviewPresenceOptions {\n activeRoute: string;\n mode: ReviewMode;\n presence?: ReviewPresenceAdapter;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n selectedNumberedItem?: NumberedReviewItem;\n size: ReviewShellViewportPreset;\n source: ReviewSource;\n}\n\nconst getPresenceUserTarget = (\n user: ReviewPresenceUser,\n reviewPathPrefix: string\n) => normalizeTarget(user.target || user.routeKey, reviewPathPrefix);\n\nconst dedupePresenceUsersByPageAndId = (\n users: ReviewPresenceUser[],\n reviewPathPrefix: string\n) => {\n const userByPageAndId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const userId = user.userId.trim();\n if (!userId) return;\n\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const key = `${userTarget}::${userId}`;\n const currentUser = userByPageAndId.get(key);\n\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userByPageAndId.set(key, user);\n }\n });\n\n return Array.from(userByPageAndId.values());\n};\n\nexport const useReviewPresence = ({\n activeRoute,\n mode,\n presence,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n selectedNumberedItem,\n size,\n source,\n}: UseReviewPresenceOptions) => {\n const presenceSessionRef = useRef<ReviewPresenceSession | null>(null);\n const [presenceUsers, setPresenceUsers] = useState<ReviewPresenceUser[]>([]);\n const [presenceSessionVersion, setPresenceSessionVersion] = useState(0);\n const presenceSessionId = useMemo(getReviewPresenceSessionId, []);\n const normalizedReviewUserId = reviewUserId.trim();\n const presenceDisplayName = getReviewPresenceDisplayName(\n normalizedReviewUserId\n );\n const presenceColor = getReviewPresenceColor(\n normalizedReviewUserId || presenceSessionId\n );\n const presenceViewport = useMemo(\n () => ({\n label: size.label,\n width: size.width,\n height: size.height,\n kind: getViewportPresetKind(size),\n }),\n [size]\n );\n const presenceStatus: ReviewPresenceStatus =\n mode === 'idle' ? 'reviewing' : 'editing';\n const visiblePresenceUsers = useMemo(\n () => {\n const projectPresenceUsers = presenceUsers.filter(\n (user) => user.projectId === projectId && user.userId.trim()\n );\n\n return dedupePresenceUsersByPageAndId(\n projectPresenceUsers,\n reviewPathPrefix\n );\n },\n [presenceUsers, projectId, reviewPathPrefix]\n );\n const currentPagePresenceUsers = useMemo(\n () =>\n visiblePresenceUsers.filter((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n\n return userTarget === activeRoute;\n }),\n [activeRoute, reviewPathPrefix, visiblePresenceUsers]\n );\n const pagePresenceUsers = useMemo(() => {\n const usersByTarget = new Map<string, ReviewPresenceUser[]>();\n\n visiblePresenceUsers.forEach((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const pageUsers = usersByTarget.get(userTarget) ?? [];\n\n pageUsers.push(user);\n usersByTarget.set(userTarget, pageUsers);\n });\n\n return usersByTarget;\n }, [reviewPathPrefix, visiblePresenceUsers]);\n\n const getCurrentPresenceState = useCallback(\n (): ReviewPresenceState => ({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n routeKey: activeRoute,\n target: activeRoute,\n source,\n viewport: presenceViewport,\n mode,\n selectedItemId: selectedNumberedItem?.item.id ?? null,\n selectedReviewNumber: selectedNumberedItem?.number ?? null,\n status: presenceStatus,\n updatedAt: new Date().toISOString(),\n }),\n [\n activeRoute,\n mode,\n normalizedReviewUserId,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n presenceStatus,\n presenceViewport,\n projectId,\n selectedNumberedItem,\n source,\n ]\n );\n const getCurrentPresenceStateRef = useRef(getCurrentPresenceState);\n getCurrentPresenceStateRef.current = getCurrentPresenceState;\n\n useEffect(() => {\n if (!presence || !normalizedReviewUserId) {\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n return undefined;\n }\n\n let isActive = true;\n let unsubscribe: (() => void) | undefined;\n const initialState = getCurrentPresenceStateRef.current();\n\n void Promise.resolve(\n presence.connect({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n initialState,\n })\n ).then((session) => {\n if (!isActive) {\n void session.disconnect();\n return;\n }\n\n presenceSessionRef.current = session;\n unsubscribe = session.subscribe(setPresenceUsers);\n setPresenceSessionVersion((current) => current + 1);\n void session.update(initialState);\n }).catch(() => {\n if (!isActive) return;\n\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n });\n\n return () => {\n isActive = false;\n unsubscribe?.();\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n };\n }, [\n normalizedReviewUserId,\n presence,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n projectId,\n ]);\n\n useEffect(() => {\n const session = presenceSessionRef.current;\n if (!session || !normalizedReviewUserId) return;\n\n void session.update(getCurrentPresenceState());\n }, [\n getCurrentPresenceState,\n normalizedReviewUserId,\n presenceSessionVersion,\n ]);\n\n return {\n currentPagePresenceUsers,\n pagePresenceUsers,\n presenceSessionId,\n };\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from '../types';\n\nconst REVIEW_PRESENCE_SESSION_KEY = 'df-review-presence-session-id';\nconst DEFAULT_LOCAL_PRESENCE_CHANNEL = 'df-review-kit:presence';\nconst DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS = 5000;\nconst DEFAULT_LOCAL_PRESENCE_STALE_MS = 16000;\nconst PRESENCE_COLORS = [\n '#7cc7ff',\n '#63d7c7',\n '#f3b75f',\n '#c99cff',\n '#ff8f61',\n '#9cc76b',\n '#f278a6',\n '#79a7ff',\n];\n\ntype LocalPresenceMessage =\n | {\n type: 'request';\n sessionId: string;\n }\n | {\n type: 'update';\n sessionId: string;\n user: ReviewPresenceUser;\n }\n | {\n type: 'leave';\n sessionId: string;\n };\n\nexport type LocalPresenceAdapterOptions = {\n channelName?: string;\n heartbeatMs?: number;\n staleMs?: number;\n};\n\nconst createId = () => {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nconst hashString = (value: string) => {\n let hash = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(index);\n hash |= 0;\n }\n\n return Math.abs(hash);\n};\n\nexport const getReviewPresenceColor = (value: string) =>\n PRESENCE_COLORS[hashString(value || 'anonymous') % PRESENCE_COLORS.length];\n\nexport const getReviewPresenceDisplayName = (userId: string) =>\n userId.trim() || 'anonymous';\n\nexport const getReviewPresenceSessionId = () => {\n if (typeof window === 'undefined') return createId();\n\n try {\n const stored = window.sessionStorage.getItem(REVIEW_PRESENCE_SESSION_KEY);\n if (stored) return stored;\n\n const nextId = createId();\n window.sessionStorage.setItem(REVIEW_PRESENCE_SESSION_KEY, nextId);\n return nextId;\n } catch {\n return createId();\n }\n};\n\nconst getTimestamp = () => new Date().toISOString();\n\nconst normalizePresenceUser = (\n state: ReviewPresenceState\n): ReviewPresenceUser => ({\n ...state,\n displayName: getReviewPresenceDisplayName(state.displayName || state.userId),\n updatedAt: state.updatedAt || getTimestamp(),\n});\n\nexport const createLocalPresenceAdapter = (\n options: LocalPresenceAdapterOptions = {}\n): ReviewPresenceAdapter => ({\n label: 'local-presence',\n connect: (context: ReviewPresenceContext) => {\n const heartbeatMs =\n options.heartbeatMs ?? DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS;\n const staleMs = options.staleMs ?? DEFAULT_LOCAL_PRESENCE_STALE_MS;\n const users = new Map<string, ReviewPresenceUser>();\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentUser = normalizePresenceUser({\n ...context.initialState,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n\n const Channel =\n typeof BroadcastChannel === 'undefined' ? undefined : BroadcastChannel;\n const channel = Channel\n ? new Channel(options.channelName ?? DEFAULT_LOCAL_PRESENCE_CHANNEL)\n : null;\n\n const getUsers = () => {\n const now = Date.now();\n\n users.forEach((user, sessionId) => {\n if (now - Date.parse(user.updatedAt) > staleMs) {\n users.delete(sessionId);\n }\n });\n\n return Array.from(users.values()).sort((a, b) => {\n if (a.sessionId === context.sessionId) return -1;\n if (b.sessionId === context.sessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n };\n\n const emit = () => {\n const nextUsers = getUsers();\n listeners.forEach((listener) => listener(nextUsers));\n };\n\n const post = (message: LocalPresenceMessage) => {\n try {\n channel?.postMessage(message);\n } catch {\n return;\n }\n };\n\n const publish = () => {\n post({\n type: 'update',\n sessionId: context.sessionId,\n user: currentUser,\n });\n };\n\n if (channel) {\n channel.onmessage = (event: MessageEvent<LocalPresenceMessage>) => {\n const message = event.data;\n if (!message || message.sessionId === context.sessionId) return;\n\n if (message.type === 'request') {\n publish();\n return;\n }\n\n if (message.type === 'leave') {\n users.delete(message.sessionId);\n emit();\n return;\n }\n\n if (message.type === 'update' && message.user) {\n users.set(message.sessionId, normalizePresenceUser(message.user));\n emit();\n }\n };\n }\n\n const intervalId =\n typeof window === 'undefined'\n ? undefined\n : window.setInterval(() => {\n currentUser = {\n ...currentUser,\n updatedAt: getTimestamp(),\n };\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n }, heartbeatMs);\n\n emit();\n publish();\n post({\n type: 'request',\n sessionId: context.sessionId,\n });\n\n return {\n update: (state) => {\n currentUser = normalizePresenceUser({\n ...currentUser,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: () => {\n if (intervalId) {\n window.clearInterval(intervalId);\n }\n post({\n type: 'leave',\n sessionId: context.sessionId,\n });\n channel?.close();\n listeners.clear();\n users.clear();\n },\n };\n },\n});\n\nexport const createFallbackPresenceAdapter = (\n primaryAdapter: ReviewPresenceAdapter,\n fallbackAdapter: ReviewPresenceAdapter\n): ReviewPresenceAdapter => ({\n label: `${primaryAdapter.label}-with-${fallbackAdapter.label}-fallback`,\n connect: async (context: ReviewPresenceContext) => {\n try {\n return await primaryAdapter.connect(context);\n } catch (error) {\n if (typeof console !== 'undefined') {\n console.warn(\n `[df-review-kit] ${primaryAdapter.label} failed. Falling back to ${fallbackAdapter.label}.`,\n error\n );\n }\n return fallbackAdapter.connect(context);\n }\n },\n});\n","import {\n useCallback,\n useEffect,\n useState,\n type RefObject,\n} from 'react';\nimport type { ReviewRulerConfig } from '../../types';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { useReviewRulerDrag } from './use.review.ruler.drag';\n\ninterface UseReviewRulerOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n ruler?: ReviewRulerConfig;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onCancelReviewMode: () => void;\n onCloseTransientPanels: () => void;\n}\n\nexport const useReviewRuler = ({\n iframeRef,\n ruler,\n size,\n targetSrc,\n onCancelReviewMode,\n onCloseTransientPanels,\n}: UseReviewRulerOptions) => {\n const [isRulerVisible, setIsRulerVisible] = useState(false);\n const isRulerAvailable =\n ruler?.enabled !== false &&\n typeof size.designWidth === 'number' &&\n size.designWidth > 0;\n const rulerUnit = ruler?.unit ?? 'px';\n const rulerScaleX =\n isRulerAvailable && size.designWidth ? size.width / size.designWidth : 1;\n const rulerScaleY =\n size.designHeight && size.designHeight > 0\n ? size.height / size.designHeight\n : rulerScaleX;\n const {\n clearRulerMeasure,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerOverlayRef,\n } = useReviewRulerDrag({\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n size,\n targetSrc,\n });\n const rulerMeasureLabel = rulerMeasure\n ? `${Math.round(rulerMeasure.width / rulerScaleX)} × ${Math.round(\n rulerMeasure.height / rulerScaleY\n )} ${rulerUnit}`\n : '';\n\n const closeRuler = useCallback(() => {\n if (!isRulerVisible) return false;\n\n setIsRulerVisible(false);\n clearRulerMeasure();\n return true;\n }, [clearRulerMeasure, isRulerVisible]);\n\n const toggleRuler = useCallback(() => {\n if (!isRulerAvailable) return;\n\n onCancelReviewMode();\n onCloseTransientPanels();\n clearRulerMeasure();\n setIsRulerVisible((current) => !current);\n }, [\n clearRulerMeasure,\n isRulerAvailable,\n onCancelReviewMode,\n onCloseTransientPanels,\n ]);\n\n useEffect(() => {\n if (!isRulerVisible || isRulerAvailable) return;\n closeRuler();\n }, [closeRuler, isRulerAvailable, isRulerVisible]);\n\n return {\n closeRuler,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n toggleRuler,\n };\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from 'react';\nimport { getRulerMeasure, getRulerPointFromRect } from '../ruler/ruler';\nimport type { ReviewRulerPoint, ReviewShellViewportPreset } from '../types';\n\ninterface UseReviewRulerDragOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n}\n\nexport const useReviewRulerDrag = ({\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n size,\n targetSrc,\n}: UseReviewRulerDragOptions) => {\n const rulerOverlayRef = useRef<HTMLDivElement | null>(null);\n const rulerDragRectRef = useRef<DOMRect | null>(null);\n const isRulerDraggingRef = useRef(false);\n const sizeRef = useRef(size);\n const [rulerStart, setRulerStart] = useState<ReviewRulerPoint | null>(null);\n const [rulerPoint, setRulerPoint] = useState<ReviewRulerPoint | null>(null);\n const [rulerHover, setRulerHover] = useState<ReviewRulerPoint | null>(null);\n const [isRulerDragging, setIsRulerDragging] = useState(false);\n\n const rulerMeasure = useMemo(\n () => getRulerMeasure(rulerStart, rulerPoint),\n [rulerPoint, rulerStart]\n );\n\n const clearRulerMeasure = useCallback(() => {\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setRulerStart(null);\n setRulerPoint(null);\n setRulerHover(null);\n setIsRulerDragging(false);\n }, []);\n\n const finishRulerDrag = useCallback((point?: ReviewRulerPoint) => {\n if (point) {\n setRulerPoint(point);\n }\n\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setIsRulerDragging(false);\n }, []);\n\n const startRulerDrag = useCallback(\n (clientX: number, clientY: number, rect: DOMRect) => {\n const point = getRulerPointFromRect(clientX, clientY, rect);\n\n rulerDragRectRef.current = rect;\n isRulerDraggingRef.current = true;\n\n setRulerStart(point);\n setRulerPoint(point);\n setIsRulerDragging(true);\n },\n []\n );\n\n useEffect(() => {\n sizeRef.current = size;\n }, [size]);\n\n useEffect(() => {\n if (!isRulerVisible || !isRulerAvailable) return undefined;\n\n const getRulerEventClientPoint = (event: MouseEvent) => {\n const frame = iframeRef.current;\n let isFrameEvent = false;\n\n try {\n isFrameEvent =\n Boolean(frame?.contentWindow) && event.view === frame?.contentWindow;\n\n if (!isFrameEvent && frame?.contentDocument) {\n const targetDocument = (\n event.target as { ownerDocument?: Document } | null\n )?.ownerDocument;\n isFrameEvent = targetDocument === frame.contentDocument;\n }\n } catch {\n isFrameEvent = false;\n }\n\n if (isFrameEvent && frame) {\n const frameRect = frame.getBoundingClientRect();\n\n return {\n clientX: event.clientX + frameRect.left,\n clientY: event.clientY + frameRect.top,\n };\n }\n\n return {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n };\n\n const snapDesign = (screen: number, axis: 'x' | 'y') => {\n const current = sizeRef.current;\n const scaleX = current.designWidth\n ? current.width / current.designWidth\n : 1;\n const scale =\n axis === 'y'\n ? current.designHeight\n ? current.height / current.designHeight\n : scaleX\n : scaleX;\n return Math.round(Math.round(screen / scale) * scale);\n };\n\n const getActiveRulerPoint = (event: MouseEvent) => {\n const rect =\n rulerDragRectRef.current ??\n rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return undefined;\n\n const point = getRulerEventClientPoint(event);\n const snapped = getRulerPointFromRect(point.clientX, point.clientY, rect);\n\n return { x: snapDesign(snapped.x, 'x'), y: snapDesign(snapped.y, 'y') };\n };\n\n const getHoverRulerPoint = (event: MouseEvent) => {\n const rect = rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return null;\n\n const { clientX, clientY } = getRulerEventClientPoint(event);\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n if (x < 0 || y < 0 || x > rect.width || y > rect.height) return null;\n\n return { x: snapDesign(x, 'x'), y: snapDesign(y, 'y') };\n };\n\n const handleDragStart: EventListener = (event) => {\n if (isRulerDraggingRef.current) return;\n\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.button !== 0) return;\n\n const overlay = rulerOverlayRef.current;\n const target = mouseEvent.target;\n if (!overlay || !(target instanceof Node) || !overlay.contains(target)) {\n return;\n }\n\n event.preventDefault();\n startRulerDrag(\n mouseEvent.clientX,\n mouseEvent.clientY,\n overlay.getBoundingClientRect()\n );\n };\n\n const handlePointerMove: EventListener = (event) => {\n const mouseEvent = event as MouseEvent;\n\n if (isRulerDraggingRef.current) {\n const point = getActiveRulerPoint(mouseEvent);\n if (!point) return;\n\n mouseEvent.preventDefault();\n setRulerPoint(point);\n setRulerHover(point);\n return;\n }\n\n setRulerHover(getHoverRulerPoint(mouseEvent));\n };\n\n const handleDragEnd: EventListener = (event) => {\n if (!isRulerDraggingRef.current) return;\n\n const point = getActiveRulerPoint(event as MouseEvent);\n event.preventDefault();\n finishRulerDrag(point);\n };\n\n const handleWindowBlur = () => {\n if (!isRulerDraggingRef.current) return;\n\n finishRulerDrag();\n };\n\n const dragTargets = new Set<EventTarget>([window]);\n const frame = iframeRef.current;\n\n try {\n if (frame?.contentWindow) dragTargets.add(frame.contentWindow);\n if (frame?.contentDocument) dragTargets.add(frame.contentDocument);\n } catch {\n // Cross-origin frames cannot expose their document. Parent listeners still run.\n }\n\n dragTargets.forEach((target) => {\n target.addEventListener('mousedown', handleDragStart, true);\n target.addEventListener('mousemove', handlePointerMove, true);\n target.addEventListener('mouseup', handleDragEnd, true);\n });\n\n window.addEventListener('blur', handleWindowBlur);\n\n return () => {\n dragTargets.forEach((target) => {\n target.removeEventListener('mousedown', handleDragStart, true);\n target.removeEventListener('mousemove', handlePointerMove, true);\n target.removeEventListener('mouseup', handleDragEnd, true);\n });\n window.removeEventListener('blur', handleWindowBlur);\n };\n }, [\n finishRulerDrag,\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n startRulerDrag,\n ]);\n\n useEffect(() => {\n clearRulerMeasure();\n }, [clearRulerMeasure, size.height, size.width, targetSrc]);\n\n return {\n clearRulerMeasure,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerOverlayRef,\n };\n};\n","import type { ReviewRulerMeasure, ReviewRulerPoint } from '../types';\n\nexport const getRulerPointFromRect = (\n clientX: number,\n clientY: number,\n rect: DOMRect\n): ReviewRulerPoint => {\n const x = Math.min(Math.max(clientX - rect.left, 0), rect.width);\n const y = Math.min(Math.max(clientY - rect.top, 0), rect.height);\n\n return {\n x: Math.round(x),\n y: Math.round(y)\n };\n};\n\nexport const getRulerMeasure = (\n start: ReviewRulerPoint | null,\n end: ReviewRulerPoint | null\n): ReviewRulerMeasure | undefined => {\n if (!start || !end) return undefined;\n\n return {\n left: Math.min(start.x, end.x),\n top: Math.min(start.y, end.y),\n width: Math.abs(end.x - start.x),\n height: Math.abs(end.y - start.y)\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { DEFAULT_REVIEW_THEME } from '../constants';\nimport {\n getStoredFigmaToken,\n getStoredReviewTheme,\n getStoredReviewUserId,\n getSystemReviewTheme,\n normalizeReviewTheme,\n writeStoredFigmaToken,\n writeStoredReviewTheme,\n writeStoredReviewUserId,\n} from '../settings';\nimport type { ReviewShellTheme } from '../types';\n\ninterface UseReviewSettingsOptions {\n onCancelReviewMode: () => void | boolean;\n onCloseInitialPrompt: () => void;\n onCloseSitemap: () => void;\n onReloadTargetFrame: () => void;\n}\n\nexport const useReviewSettings = ({\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n onReloadTargetFrame,\n}: UseReviewSettingsOptions) => {\n const [figmaTokenDraft, setFigmaTokenDraft] = useState(getStoredFigmaToken);\n const [reviewUserId, setReviewUserId] = useState(getStoredReviewUserId);\n const [reviewUserIdDraft, setReviewUserIdDraft] = useState(\n getStoredReviewUserId\n );\n const [reviewTheme, setReviewTheme] = useState(getStoredReviewTheme);\n const [reviewThemeDraft, setReviewThemeDraft] =\n useState(getStoredReviewTheme);\n const [systemReviewTheme, setSystemReviewTheme] =\n useState(getSystemReviewTheme);\n const [figmaSettingsStatus, setFigmaSettingsStatus] = useState('');\n const [isFigmaSettingsOpen, setIsFigmaSettingsOpen] = useState(false);\n const [isFigmaTokenVisible, setIsFigmaTokenVisible] = useState(false);\n const [isFigmaTokenGuideOpen, setIsFigmaTokenGuideOpen] = useState(false);\n const effectiveReviewTheme =\n reviewTheme === 'system' ? systemReviewTheme : reviewTheme;\n\n const closeFigmaSettings = useCallback(() => {\n setIsFigmaSettingsOpen(false);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n }, []);\n\n const openFigmaSettings = useCallback(() => {\n onCancelReviewMode();\n onCloseSitemap();\n onCloseInitialPrompt();\n setFigmaTokenDraft(getStoredFigmaToken());\n setReviewUserIdDraft(getStoredReviewUserId());\n setReviewThemeDraft(reviewTheme);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n setIsFigmaSettingsOpen(true);\n }, [\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n reviewTheme,\n ]);\n\n const saveReviewSettings = useCallback(\n (token: string, userId: string, theme: ReviewShellTheme) => {\n const nextToken = token.trim();\n const nextUserId = userId.trim();\n const nextTheme = normalizeReviewTheme(theme);\n const shouldReload =\n nextToken !== getStoredFigmaToken() ||\n nextUserId !== getStoredReviewUserId();\n\n writeStoredFigmaToken(nextToken);\n writeStoredReviewUserId(nextUserId);\n writeStoredReviewTheme(nextTheme);\n setFigmaTokenDraft(nextToken);\n setReviewUserId(nextUserId);\n setReviewUserIdDraft(nextUserId);\n setReviewTheme(nextTheme);\n setReviewThemeDraft(nextTheme);\n setFigmaSettingsStatus(\n nextToken || nextUserId || nextTheme !== DEFAULT_REVIEW_THEME\n ? 'Saved'\n : 'Cleared'\n );\n\n if (shouldReload) {\n onReloadTargetFrame();\n }\n closeFigmaSettings();\n },\n [closeFigmaSettings, onReloadTargetFrame]\n );\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return undefined;\n\n const query = window.matchMedia('(prefers-color-scheme: light)');\n const syncSystemTheme = () => {\n setSystemReviewTheme(query.matches ? 'light' : 'dark');\n };\n\n syncSystemTheme();\n\n if (query.addEventListener) {\n query.addEventListener('change', syncSystemTheme);\n return () => query.removeEventListener('change', syncSystemTheme);\n }\n\n query.addListener(syncSystemTheme);\n return () => query.removeListener(syncSystemTheme);\n }, []);\n\n useEffect(() => {\n document.body.classList.toggle(\n 'df-review-theme-light',\n effectiveReviewTheme === 'light'\n );\n document.body.classList.toggle(\n 'df-review-theme-dark',\n effectiveReviewTheme === 'dark'\n );\n\n return () => {\n document.body.classList.remove(\n 'df-review-theme-light',\n 'df-review-theme-dark'\n );\n };\n }, [effectiveReviewTheme]);\n\n return {\n closeFigmaSettings,\n effectiveReviewTheme,\n figmaSettingsStatus,\n figmaTokenDraft,\n isFigmaSettingsOpen,\n isFigmaTokenGuideOpen,\n isFigmaTokenVisible,\n openFigmaSettings,\n reviewThemeDraft,\n reviewUserId,\n reviewUserIdDraft,\n saveReviewSettings,\n setFigmaSettingsStatus,\n setFigmaTokenDraft,\n setIsFigmaTokenGuideOpen,\n setIsFigmaTokenVisible,\n setReviewThemeDraft,\n setReviewUserIdDraft,\n };\n};\n","import { useCallback, useMemo, useState } from 'react';\nimport {\n getNumberedReviewItems,\n} from '../../core/review/scope';\nimport type {\n ReviewItem,\n ReviewItemScope,\n ReviewWorkflowStatus,\n ReviewViewportPreset,\n} from '../../types';\nimport { normalizeReviewItemStatus } from '../../status';\nimport {\n buildTargetSrc,\n getItemTarget,\n normalizeTarget,\n} from '../route';\nimport type {\n ReviewQaFilter,\n ReviewQaStatusFilter,\n ReviewShellPage,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n} from '../types';\nimport {\n findViewportPreset,\n getViewportPresetKind,\n} from '../viewport';\nimport type { SitemapQaCount } from '../sitemap/tree';\nimport {\n addSitemapQaCounts,\n createEmptySitemapQaCount,\n createSitemapViewportColumn,\n} from '../sitemap/tree';\n\nexport type SitemapItemsBySource = {\n local: ReviewItem[];\n remote: ReviewItem[];\n};\n\ninterface UseReviewShellDataOptions {\n activeRoute: string;\n pages: ReviewShellPage[];\n isAllQaVisible: boolean;\n isRemoteSource: boolean;\n reviewPathPrefix: string;\n reviewViewportPresets: ReviewViewportPreset[];\n selectedItemId: string | null;\n size: ReviewShellViewportPreset;\n target: string;\n viewportPresets: ReviewShellViewportPreset[];\n}\n\nconst SITEMAP_STATUS_DONE: ReviewWorkflowStatus = 'done';\n\nexport const useReviewShellData = ({\n activeRoute,\n isAllQaVisible,\n isRemoteSource,\n pages,\n reviewPathPrefix,\n reviewViewportPresets,\n selectedItemId,\n size,\n target,\n viewportPresets,\n}: UseReviewShellDataOptions) => {\n const [items, setItems] = useState<ReviewItem[]>([]);\n const [hiddenOverlayItemIds, setHiddenOverlayItemIds] = useState<Set<string>>(\n () => new Set()\n );\n const [qaFilter, setQaFilter] = useState<ReviewQaFilter>('all');\n const [qaStatusFilter, setQaStatusFilter] =\n useState<ReviewQaStatusFilter>('all');\n const [sitemapItems, setSitemapItems] = useState<SitemapItemsBySource>(() => ({\n local: [],\n remote: [],\n }));\n\n const targetSrc = useMemo(() => buildTargetSrc(target), [target]);\n const pageTargets = useMemo(\n () =>\n new Set(\n pages.map((page) => normalizeTarget(page.href, reviewPathPrefix))\n ),\n [pages, reviewPathPrefix]\n );\n const sitemapSourceItems = useMemo(\n () => (isRemoteSource ? sitemapItems.remote : sitemapItems.local),\n [isRemoteSource, sitemapItems]\n );\n const activeItems = useMemo(\n () => {\n const sourceItems = isAllQaVisible\n ? sitemapSourceItems\n : items.filter(\n (item) => getItemTarget(item, reviewPathPrefix) === activeRoute\n );\n\n return [...sourceItems].sort((a, b) =>\n b.createdAt.localeCompare(a.createdAt)\n );\n },\n [activeRoute, isAllQaVisible, items, reviewPathPrefix, sitemapSourceItems]\n );\n const numberedActiveItems = useMemo(\n () => getNumberedReviewItems(activeItems, reviewViewportPresets),\n [activeItems, reviewViewportPresets]\n );\n const scopeFilteredNumberedActiveItems = useMemo(\n () =>\n qaFilter === 'all'\n ? numberedActiveItems\n : numberedActiveItems.filter(\n (numberedItem) => numberedItem.scope === qaFilter\n ),\n [numberedActiveItems, qaFilter]\n );\n const statusFilteredNumberedActiveItems = useMemo(\n () =>\n qaStatusFilter === 'all'\n ? numberedActiveItems\n : numberedActiveItems.filter(\n (numberedItem) =>\n normalizeReviewItemStatus(numberedItem.item.status) ===\n qaStatusFilter\n ),\n [numberedActiveItems, qaStatusFilter]\n );\n const filteredNumberedActiveItems = useMemo(\n () =>\n qaStatusFilter === 'all'\n ? scopeFilteredNumberedActiveItems\n : scopeFilteredNumberedActiveItems.filter(\n (numberedItem) =>\n normalizeReviewItemStatus(numberedItem.item.status) ===\n qaStatusFilter\n ),\n [qaStatusFilter, scopeFilteredNumberedActiveItems]\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', statusFilteredNumberedActiveItems.length);\n statusFilteredNumberedActiveItems.forEach((numberedItem) => {\n counts.set(numberedItem.scope, (counts.get(numberedItem.scope) ?? 0) + 1);\n });\n return counts;\n }, [statusFilteredNumberedActiveItems]);\n const qaStatusFilterCounts = useMemo(() => {\n const counts = new Map<ReviewQaStatusFilter, number>();\n counts.set('all', scopeFilteredNumberedActiveItems.length);\n scopeFilteredNumberedActiveItems.forEach((numberedItem) => {\n const status = normalizeReviewItemStatus(numberedItem.item.status);\n counts.set(status, (counts.get(status) ?? 0) + 1);\n });\n return counts;\n }, [scopeFilteredNumberedActiveItems]);\n const getItemPreset = useCallback(\n (item: ReviewItem) =>\n findViewportPreset(\n viewportPresets,\n item.viewport?.width ?? 0,\n item.viewport?.height ?? 0\n ),\n [viewportPresets]\n );\n const getItemPresetScope = useCallback(\n (item: ReviewItem) => getViewportPresetKind(getItemPreset(item)),\n [getItemPreset]\n );\n const getItemPresetColumn = useCallback(\n (item: ReviewItem) => {\n const preset = getItemPreset(item);\n const presetIndex = Math.max(0, viewportPresets.indexOf(preset));\n\n return createSitemapViewportColumn(preset, presetIndex);\n },\n [getItemPreset, viewportPresets]\n );\n const getItemCountScope = useCallback(\n (item: ReviewItem): ReviewItemScope =>\n item.scope === 'dom' ? 'dom' : getItemPresetScope(item),\n [getItemPresetScope]\n );\n const activeRemainingItemCount = useMemo(\n () =>\n activeItems.filter(\n (item) => normalizeReviewItemStatus(item.status) !== SITEMAP_STATUS_DONE\n ).length,\n [activeItems]\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 currentCount =\n counts.get(pageTarget) ?? createEmptySitemapQaCount();\n const status = normalizeReviewItemStatus(item.status);\n const scope = getItemCountScope(item);\n const viewportColumn = getItemPresetColumn(item);\n const currentViewportCount = currentCount.viewport[\n viewportColumn.key\n ] ?? { total: 0, remaining: 0 };\n const isRemaining = status !== SITEMAP_STATUS_DONE;\n\n counts.set(pageTarget, {\n ...currentCount,\n total: currentCount.total + 1,\n remaining:\n isRemaining ? currentCount.remaining + 1 : currentCount.remaining,\n local: currentCount.local + (sourceKey === 'local' ? 1 : 0),\n remote: currentCount.remote + (sourceKey === 'remote' ? 1 : 0),\n status: {\n ...currentCount.status,\n [status]: currentCount.status[status] + 1,\n },\n scope: {\n ...currentCount.scope,\n [scope]: (currentCount.scope[scope] ?? 0) + 1,\n },\n viewport: {\n ...currentCount.viewport,\n [viewportColumn.key]: {\n total: currentViewportCount.total + 1,\n remaining: isRemaining\n ? currentViewportCount.remaining + 1\n : currentViewportCount.remaining,\n },\n },\n });\n });\n };\n\n addItems('local', sitemapItems.local);\n addItems('remote', sitemapItems.remote);\n\n return counts;\n }, [getItemCountScope, getItemPresetColumn, reviewPathPrefix, sitemapItems]);\n const allQaCount = useMemo(\n () =>\n Array.from(pageQaCounts.values()).reduce(\n addSitemapQaCounts,\n createEmptySitemapQaCount()\n ),\n [pageQaCounts]\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\n return {\n activeItems,\n activeRemainingItemCount,\n allQaCount,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIds,\n pageQaCounts,\n pageTargets,\n presetScopeCounts,\n qaFilter,\n qaFilterCounts,\n qaStatusFilter,\n qaStatusFilterCounts,\n selectedNumberedItem,\n setHiddenOverlayItemIds,\n setItems,\n setQaFilter,\n setQaStatusFilter,\n setSitemapItems,\n targetSrc,\n };\n};\n","import { useEffect } from 'react';\nimport type { ReviewMode } from '../../types';\nimport { isEditableEventTarget } from '../target/target';\nimport type { TargetOverlayKey } from '../types';\n\ninterface UseReviewShellHotkeysOptions {\n isFigmaSettingsOpen: boolean;\n isInitialPromptOpen: boolean;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n isSitemapOpen: boolean;\n mode: ReviewMode;\n onCancelReviewMode: () => boolean;\n onCloseFigmaSettings: () => void;\n onCloseInitialPrompt: () => void;\n onCloseRuler: () => boolean;\n onCloseSitemap: () => void;\n onSetReviewMode: (mode: ReviewMode) => void;\n onToggleRuler: () => void;\n onToggleTargetOverlay: (overlay: TargetOverlayKey) => void;\n}\n\nexport const useReviewShellHotkeys = ({\n isFigmaSettingsOpen,\n isInitialPromptOpen,\n isRulerAvailable,\n isRulerVisible,\n isSitemapOpen,\n mode,\n onCancelReviewMode,\n onCloseFigmaSettings,\n onCloseInitialPrompt,\n onCloseRuler,\n onCloseSitemap,\n onSetReviewMode,\n onToggleRuler,\n onToggleTargetOverlay,\n}: UseReviewShellHotkeysOptions) => {\n useEffect(() => {\n if (\n mode === 'idle' &&\n !isRulerVisible &&\n !isInitialPromptOpen &&\n !isSitemapOpen &&\n !isFigmaSettingsOpen\n ) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n\n if (mode !== 'idle' && onCancelReviewMode()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (onCloseRuler()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isInitialPromptOpen) {\n onCloseInitialPrompt();\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isSitemapOpen) {\n onCloseSitemap();\n return;\n }\n\n if (isFigmaSettingsOpen) {\n onCloseFigmaSettings();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [\n isFigmaSettingsOpen,\n isInitialPromptOpen,\n isRulerVisible,\n isSitemapOpen,\n mode,\n onCancelReviewMode,\n onCloseFigmaSettings,\n onCloseInitialPrompt,\n onCloseRuler,\n onCloseSitemap,\n ]);\n\n useEffect(() => {\n const handleHotkey = (event: KeyboardEvent) => {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {\n return;\n }\n if (isEditableEventTarget(event)) return;\n\n const actions: Record<string, () => void> = {\n r: () => {\n if (isRulerAvailable) onToggleRuler();\n },\n g: () => onToggleTargetOverlay('grid'),\n f: () => onToggleTargetOverlay('figma'),\n n: () => onSetReviewMode('note'),\n e: () => onSetReviewMode('element'),\n a: () => onSetReviewMode('area'),\n };\n const action = actions[event.key.toLowerCase()];\n if (!action) return;\n\n event.preventDefault();\n action();\n };\n\n window.addEventListener('keydown', handleHotkey);\n return () => window.removeEventListener('keydown', handleHotkey);\n }, [\n isRulerAvailable,\n onSetReviewMode,\n onToggleRuler,\n onToggleTargetOverlay,\n ]);\n};\n","import {\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n ReviewItem,\n ReviewMode,\n ReviewSource,\n WebReviewKitController,\n} from '../../types';\nimport { normalizeReviewShellAdapters } from '../adapters';\nimport {\n getInitialItemId,\n getInitialSource,\n getInitialTarget,\n} from '../route';\nimport type {\n ReviewShellAdapters,\n ReviewShellViewportPreset,\n TargetOverlayState,\n} from '../types';\nimport {\n DEFAULT_REVIEW_VIEWPORT_PRESETS,\n getInitialSize,\n getIsFigmaOverlayAvailable,\n toReviewViewportPresets,\n} from '../viewport';\n\ninterface UseReviewShellStateOptions {\n adapters: ReviewShellAdapters;\n presets: ReviewShellViewportPreset[];\n reviewPathPrefix: string;\n}\n\nexport const useReviewShellState = ({\n adapters,\n presets,\n reviewPathPrefix,\n}: UseReviewShellStateOptions) => {\n const viewportPresets =\n presets.length > 0 ? presets : DEFAULT_REVIEW_VIEWPORT_PRESETS;\n const reviewViewportPresets = useMemo(\n () => toReviewViewportPresets(viewportPresets),\n [viewportPresets]\n );\n const normalizedAdapters = useMemo(\n () => normalizeReviewShellAdapters(adapters),\n [adapters]\n );\n const localAdapterEntry = normalizedAdapters.local;\n const remoteAdapterEntry = normalizedAdapters.remote;\n const sourceEntries = normalizedAdapters.sources;\n const defaultSource = sourceEntries[0]?.label ?? 'local';\n const [source, setSource] = useState<ReviewSource>(() => {\n const initialSource = getInitialSource(remoteAdapterEntry?.label);\n return sourceEntries.some((entry) => entry.label === initialSource)\n ? initialSource\n : defaultSource;\n });\n const remoteSource = remoteAdapterEntry?.label ?? null;\n const activeAdapterEntry =\n sourceEntries.find((entry) => entry.label === source) ?? sourceEntries[0]!;\n const isRemoteSource = Boolean(\n remoteSource && activeAdapterEntry.label === remoteSource\n );\n const showSourceSelect = sourceEntries.length > 1;\n const canWriteArea = activeAdapterEntry.writeModes.includes('area');\n const canWriteDom = activeAdapterEntry.writeModes.includes('dom');\n const adapter = activeAdapterEntry.adapter;\n\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const frameScrollRef = useRef<HTMLDivElement | null>(null);\n const controllerRef = useRef<WebReviewKitController | null>(null);\n const cleanupTargetRef = useRef<(() => void) | null>(null);\n const pendingRestoreRef = useRef<ReviewItem | null>(null);\n const pendingInitialItemIdRef = useRef(getInitialItemId());\n const selectedItemIdRef = useRef(getInitialItemId());\n const hiddenOverlayItemIdListRef = useRef<string[]>([]);\n const [target, setTarget] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [draftTarget, setDraftTarget] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [activeRoute, setActiveRoute] = useState(() =>\n getInitialTarget(reviewPathPrefix)\n );\n const [size, setSize] = useState<ReviewShellViewportPreset>(() =>\n getInitialSize(viewportPresets)\n );\n const [mode, setMode] = useState<ReviewMode>('idle');\n const [targetOverlayState, setTargetOverlayState] =\n useState<TargetOverlayState>({\n grid: false,\n figma: false,\n });\n const [selectedItemId, setSelectedItemId] = useState(getInitialItemId());\n const [isListVisible, setIsListVisible] = useState(true);\n const [isSitemapOpen, setIsSitemapOpen] = useState(false);\n const [isInitialPromptOpen, setIsInitialPromptOpen] = useState(false);\n const [copyLabel, setCopyLabel] = useState('Copy URL');\n const [toastMessage, setToastMessage] = useState('');\n const [copiedPromptKey, setCopiedPromptKey] = useState<string | null>(null);\n const targetRef = useRef(target);\n const sizeRef = useRef(size);\n const isFigmaOverlayAvailable = getIsFigmaOverlayAvailable(size);\n\n return {\n activeAdapterEntry,\n activeRoute,\n adapter,\n canWriteArea,\n canWriteDom,\n cleanupTargetRef,\n controllerRef,\n copiedPromptKey,\n copyLabel,\n draftTarget,\n frameScrollRef,\n hiddenOverlayItemIdListRef,\n iframeRef,\n isFigmaOverlayAvailable,\n isInitialPromptOpen,\n isListVisible,\n isRemoteSource,\n isSitemapOpen,\n localAdapterEntry,\n mode,\n pendingInitialItemIdRef,\n pendingRestoreRef,\n remoteAdapterEntry,\n reviewViewportPresets,\n selectedItemId,\n selectedItemIdRef,\n setActiveRoute,\n setCopiedPromptKey,\n setCopyLabel,\n setDraftTarget,\n setIsInitialPromptOpen,\n setIsListVisible,\n setIsSitemapOpen,\n setMode,\n setSelectedItemId,\n setSize,\n setSource,\n setTarget,\n setTargetOverlayState,\n showSourceSelect,\n size,\n sizeRef,\n source,\n sourceEntries,\n target,\n targetOverlayState,\n targetRef,\n toastMessage,\n viewportPresets,\n setToastMessage,\n };\n};\n","import { REVIEW_WORKFLOW_STATUS_OPTIONS } from '../status';\nimport type {\n ReviewItem,\n ReviewSource,\n WebReviewKitAdapter,\n} from '../types';\nimport type {\n ReviewShellAdapter,\n ReviewShellAdapterMap,\n ReviewShellAdapters,\n ReviewShellStatusOption,\n ReviewShellSyncSubmissionInput,\n ReviewShellUpdateStatusInput,\n ReviewShellWriteMode,\n} from './types';\n\nconst ALL_REVIEW_WRITE_MODES: ReviewShellWriteMode[] = ['dom', 'note', 'area'];\n\nexport type NormalizedReviewShellAdapter = {\n label: ReviewSource;\n adapter: WebReviewKitAdapter;\n statusOptions: ReviewShellStatusOption[];\n updateStatus?: (input: ReviewShellUpdateStatusInput) => Promise<unknown>;\n syncSubmission?: (input: ReviewShellSyncSubmissionInput) => Promise<unknown>;\n writeModes: ReviewShellWriteMode[];\n canUpdate: boolean;\n canRemove: boolean;\n pageId?: string;\n};\n\nexport type NormalizedReviewShellAdapters = {\n local: NormalizedReviewShellAdapter | null;\n remote: NormalizedReviewShellAdapter | null;\n sources: NormalizedReviewShellAdapter[];\n};\n\nexport function normalizeReviewShellAdapters(\n adapters: ReviewShellAdapters\n): NormalizedReviewShellAdapters {\n if (Array.isArray(adapters)) {\n const normalized = adapters.map((adapter) => normalizeShellAdapter(adapter));\n const local = normalized.find((adapter) => adapter.label === 'local') ?? null;\n const remote =\n normalized.find((adapter) => adapter.label !== 'local') ?? null;\n\n if (normalized.length === 0 || (!local && !remote)) {\n throw new Error('ReviewShell requires at least one adapter.');\n }\n\n return {\n local,\n remote,\n sources: normalized,\n };\n }\n\n return normalizeLegacyAdapterMap(adapters);\n}\n\nfunction normalizeLegacyAdapterMap(\n adapters: ReviewShellAdapterMap\n): NormalizedReviewShellAdapters {\n const local = {\n label: 'local',\n adapter: adapters.local,\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n updateStatus: ({ id, status }) => adapters.local.update(id, { status }),\n syncSubmission: ({ id, patch }) => adapters.local.update(id, patch),\n writeModes: [...ALL_REVIEW_WRITE_MODES],\n canUpdate: true,\n canRemove: true,\n } satisfies NormalizedReviewShellAdapter;\n const remote = adapters.remote\n ? ({\n label: 'remote',\n adapter: adapters.remote,\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n updateStatus: ({ id, status }) =>\n adapters.remote?.update(id, { status }) ??\n Promise.reject(new Error('Remote adapter is not available.')),\n writeModes: [],\n canUpdate: true,\n canRemove: false,\n pageId: adapters.remotePageId,\n } satisfies NormalizedReviewShellAdapter)\n : null;\n\n return {\n local,\n remote,\n sources: remote ? [local, remote] : [local],\n };\n}\n\nfunction normalizeShellAdapter(\n adapterConfig: ReviewShellAdapter\n): NormalizedReviewShellAdapter {\n const statusOptions = [\n ...(adapterConfig.statusOptions ?? REVIEW_WORKFLOW_STATUS_OPTIONS),\n ];\n const updateAdapter = adapterConfig.update;\n const updateStatus: NormalizedReviewShellAdapter['updateStatus'] =\n adapterConfig.updateStatus\n ? adapterConfig.updateStatus\n : updateAdapter\n ? ({ id, status }) => updateAdapter(id, { status })\n : undefined;\n const writeModes = normalizeWriteModes(\n adapterConfig.create\n ? adapterConfig.canWrite ?? adapterConfig.label === 'local'\n : false\n );\n\n return {\n label: adapterConfig.label,\n pageId: adapterConfig.pageId,\n statusOptions,\n updateStatus,\n syncSubmission: adapterConfig.syncSubmission,\n writeModes,\n canUpdate: Boolean(updateAdapter),\n canRemove: Boolean(adapterConfig.remove),\n adapter: {\n get: adapterConfig.get,\n list: adapterConfig.list,\n create: async (item) => {\n if (!adapterConfig.create) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support create.`\n );\n }\n return adapterConfig.create(item);\n },\n update: async (id, patch) => {\n const nextStatus = patch.status;\n if (nextStatus && updateStatus) {\n const statusIndex = statusOptions.findIndex(\n (statusOption) => statusOption.value === nextStatus\n );\n const statusOption = statusOptions[statusIndex];\n\n if (statusOption) {\n const item = await adapterConfig.get(id);\n if (!item) throw new Error(`Review item not found: ${id}`);\n\n const updated = await updateStatus({\n id,\n item,\n status: nextStatus,\n statusOption,\n statusIndex,\n });\n return updated as ReviewItem;\n }\n }\n\n if (updateAdapter) {\n return updateAdapter(id, patch);\n }\n\n if (!adapterConfig.syncSubmission) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support update.`\n );\n }\n\n const item = await adapterConfig.get(id);\n if (!item) throw new Error(`Review item not found: ${id}`);\n\n await adapterConfig.syncSubmission({\n id,\n item,\n patch,\n });\n const updated = await adapterConfig.get(id);\n if (!updated) throw new Error(`Review item not found after update: ${id}`);\n return updated;\n },\n remove: async (id) => {\n if (!adapterConfig.remove) {\n throw new Error(\n `Review adapter \"${adapterConfig.label}\" does not support remove.`\n );\n }\n\n return adapterConfig.remove(id);\n },\n },\n };\n}\n\nfunction normalizeWriteModes(\n value: boolean | readonly ReviewShellWriteMode[] | undefined\n): ReviewShellWriteMode[] {\n if (value === true) return [...ALL_REVIEW_WRITE_MODES];\n if (Array.isArray(value)) {\n const modes = value.filter((mode) =>\n ALL_REVIEW_WRITE_MODES.includes(mode)\n );\n return Array.from(new Set(modes));\n }\n return [];\n}\n","import type {\n Dispatch,\n MutableRefObject,\n SetStateAction,\n} from 'react';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewSource,\n WebReviewKitAdapter,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { updateShellUrl } from '../route';\nimport type { ReviewShellViewportPreset } from '../types';\nimport type { SitemapItemsBySource } from '../hooks/use.review.shell.data';\n\ninterface ListReviewItemsOptions {\n activeRoute: string;\n adapter: WebReviewKitAdapter;\n isRemoteSource: boolean;\n pageId?: string;\n projectId: string;\n}\n\ninterface ListSitemapReviewItemsOptions {\n localAdapterEntry: NormalizedReviewShellAdapter | null;\n projectId: string;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n}\n\ninterface CopyCurrentReviewUrlOptions {\n onCopyLabelChange: Dispatch<SetStateAction<string>>;\n}\n\ninterface RefreshReviewItemsOptions extends ListReviewItemsOptions {\n onItemsChange: (items: ReviewItem[]) => void;\n}\n\ninterface RefreshSitemapReviewItemsOptions\n extends ListSitemapReviewItemsOptions {\n onSitemapItemsChange: (items: SitemapItemsBySource) => void;\n}\n\ninterface RefreshReviewDataOptions {\n onRefreshItems: () => Promise<ReviewItem[]>;\n onRefreshSitemapItems: () => Promise<void>;\n onReloadReviewKit: () => Promise<void>;\n}\n\ninterface UpdateReviewItemStatusOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n item: ReviewItem;\n nextStatus: ReviewItemStatus;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface UpdateReviewItemCommentOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n item: ReviewItem;\n comment: string;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface SubmitReviewItemOptions {\n localAdapterEntry: NormalizedReviewShellAdapter | null;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n selectedItemIdRef: MutableRefObject<string | null>;\n onClearSelectedItem: () => void;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface CopyReviewPromptOptions {\n key: string;\n toastMessage?: string;\n value: string;\n onCopiedPromptKeyChange: Dispatch<SetStateAction<string | null>>;\n onToast?: (message: string) => void;\n}\n\ninterface RemoveReviewItemOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n isRemoteSource: boolean;\n item: ReviewItem;\n selectedItemIdRef: MutableRefObject<string | null>;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n targetRef: MutableRefObject<string>;\n onClearSelectedItem: () => void;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\nconst writeClipboardText = async (value: string) => {\n try {\n await navigator.clipboard.writeText(value);\n return;\n } catch {\n const selection = document.getSelection();\n const activeElement = document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n const ranges = selection\n ? Array.from({ length: selection.rangeCount }, (_, index) =>\n selection.getRangeAt(index)\n )\n : [];\n const textarea = document.createElement('textarea');\n textarea.value = value;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '0';\n\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n const isCopied = document.execCommand('copy');\n textarea.remove();\n\n selection?.removeAllRanges();\n ranges.forEach((range) => selection?.addRange(range));\n activeElement?.focus();\n\n if (!isCopied) {\n throw new Error('Failed to copy to clipboard');\n }\n }\n};\n\nexport const listReviewItems = async ({\n activeRoute,\n adapter,\n isRemoteSource,\n pageId,\n projectId,\n}: ListReviewItemsOptions) =>\n adapter.list({\n projectId,\n pageId,\n routeKey: isRemoteSource ? activeRoute : undefined,\n });\n\nexport const listSitemapReviewItems = async ({\n localAdapterEntry,\n projectId,\n remoteAdapterEntry,\n}: ListSitemapReviewItemsOptions): Promise<SitemapItemsBySource> => {\n const [localResult, remoteResult] = await Promise.allSettled([\n localAdapterEntry\n ? localAdapterEntry.adapter.list({\n projectId,\n pageId: localAdapterEntry.pageId,\n })\n : Promise.resolve([]),\n remoteAdapterEntry\n ? remoteAdapterEntry.adapter.list({\n projectId,\n pageId: remoteAdapterEntry.pageId,\n source: remoteAdapterEntry.label,\n })\n : Promise.resolve([]),\n ]);\n\n return {\n local: localResult.status === 'fulfilled' ? localResult.value : [],\n remote: remoteResult.status === 'fulfilled' ? remoteResult.value : [],\n };\n};\n\nexport const refreshReviewItems = async ({\n onItemsChange,\n ...listOptions\n}: RefreshReviewItemsOptions) => {\n const nextItems = await listReviewItems(listOptions);\n onItemsChange(nextItems);\n return nextItems;\n};\n\nexport const refreshSitemapReviewItems = async ({\n onSitemapItemsChange,\n ...listOptions\n}: RefreshSitemapReviewItemsOptions) => {\n const sitemapItems = await listSitemapReviewItems(listOptions);\n onSitemapItemsChange(sitemapItems);\n};\n\nexport const copyCurrentReviewUrl = async ({\n onCopyLabelChange,\n}: CopyCurrentReviewUrlOptions) => {\n await writeClipboardText(window.location.href);\n onCopyLabelChange('Copied');\n window.setTimeout(() => onCopyLabelChange('Copy URL'), 1200);\n};\n\nexport const refreshReviewData = async ({\n onRefreshItems,\n onRefreshSitemapItems,\n onReloadReviewKit,\n}: RefreshReviewDataOptions) => {\n await onReloadReviewKit();\n await Promise.all([onRefreshItems(), onRefreshSitemapItems()]);\n};\n\nexport const updateReviewItemStatus = async ({\n activeAdapterEntry,\n item,\n nextStatus,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemStatusOptions) => {\n if (!activeAdapterEntry.updateStatus) return;\n\n const statusIndex = activeAdapterEntry.statusOptions.findIndex(\n (statusOption) => statusOption.value === nextStatus\n );\n const statusOption = activeAdapterEntry.statusOptions[statusIndex];\n if (!statusOption) return;\n\n await activeAdapterEntry.updateStatus({\n id: item.id,\n item,\n status: statusOption.value,\n statusOption,\n statusIndex,\n });\n await onRefreshReviewData();\n onToast?.('QA status updated');\n};\n\nexport const updateReviewItemComment = async ({\n activeAdapterEntry,\n item,\n comment,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemCommentOptions) => {\n const nextComment = comment.trim();\n if (!nextComment) throw new Error('Comment is required.');\n if (!activeAdapterEntry.canUpdate) {\n throw new Error(\n `Review adapter \"${activeAdapterEntry.label}\" does not support edit.`\n );\n }\n\n if (nextComment === item.comment.trim()) {\n onToast?.('No QA comment changes');\n return item;\n }\n\n const updated = await activeAdapterEntry.adapter.update(item.id, {\n comment: nextComment,\n });\n await onRefreshReviewData();\n onToast?.('QA comment updated');\n return updated;\n};\n\nexport const submitReviewItem = async ({\n localAdapterEntry,\n numberedItem,\n remoteAdapterEntry,\n selectedItemIdRef,\n onClearSelectedItem,\n onRefreshReviewData,\n onToast,\n}: SubmitReviewItemOptions) => {\n const { item } = numberedItem;\n const syncLocalSubmission = localAdapterEntry?.syncSubmission;\n if (\n !remoteAdapterEntry ||\n !localAdapterEntry ||\n !syncLocalSubmission ||\n item.submitStatus === 'submitted'\n ) {\n return;\n }\n\n await syncLocalSubmission({\n id: item.id,\n item,\n patch: {\n submitStatus: 'submitting',\n submitError: undefined,\n },\n });\n await onRefreshReviewData();\n\n let toastMessage: string;\n try {\n await remoteAdapterEntry.adapter.create({\n ...item,\n reviewNumber: undefined,\n externalIssueId: undefined,\n externalIssueUrl: undefined,\n submittedAt: undefined,\n submitStatus: 'submitted',\n submitError: undefined,\n });\n await localAdapterEntry.adapter.remove(item.id);\n if (selectedItemIdRef.current === item.id) {\n onClearSelectedItem();\n }\n toastMessage = 'Remote submitted';\n } catch (error) {\n await syncLocalSubmission({\n id: item.id,\n item,\n patch: {\n submitStatus: 'failed',\n submitError:\n error instanceof Error ? error.message : 'Failed to submit remote',\n },\n });\n toastMessage = 'Remote submit failed';\n }\n\n await onRefreshReviewData();\n onToast?.(toastMessage);\n};\n\nexport const copyReviewPrompt = async ({\n key,\n toastMessage = 'Copied',\n value,\n onCopiedPromptKeyChange,\n onToast,\n}: CopyReviewPromptOptions) => {\n if (!value) return;\n\n await writeClipboardText(value);\n onCopiedPromptKeyChange(key);\n onToast?.(toastMessage);\n window.setTimeout(() => {\n onCopiedPromptKeyChange((current) => (current === key ? null : current));\n }, 1200);\n};\n\nexport const removeReviewItem = async ({\n activeAdapterEntry,\n isRemoteSource,\n item,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n onClearSelectedItem,\n onRefreshReviewData,\n onToast,\n}: RemoveReviewItemOptions) => {\n if (\n !activeAdapterEntry.canRemove ||\n item.submitStatus === 'submitting' ||\n (!isRemoteSource && item.submitStatus === 'submitted')\n ) {\n return;\n }\n\n await activeAdapterEntry.adapter.remove(item.id);\n if (selectedItemIdRef.current === item.id) {\n onClearSelectedItem();\n updateShellUrl(targetRef.current, sizeRef.current, source);\n }\n await onRefreshReviewData();\n onToast?.('QA deleted');\n};\n","import type { CreateReviewPagesOptions, ReviewShellGlobEntries, ReviewShellPage } from './types';\n\nconst escapeRegExp = (value: string) =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst normalizePageHref = (value: string) => {\n const href = value || '/';\n return href.startsWith('/') ? href : `/${href}`;\n};\n\nconst sortReviewPages = (a: ReviewShellPage, b: ReviewShellPage) => {\n if (a.href === '/') return -1;\n if (b.href === '/') return 1;\n return a.href.localeCompare(b.href);\n};\n\nexport const createReviewPagesFromGlob = (\n entries: ReviewShellGlobEntries,\n options: CreateReviewPagesOptions = {}\n): ReviewShellPage[] => {\n const root = options.root ?? '/page';\n const rootPattern = root ? new RegExp(`^${escapeRegExp(root)}`) : null;\n\n return Object.keys(entries)\n .map((key) => {\n const withoutRoot = rootPattern ? key.replace(rootPattern, '') : key;\n const href = withoutRoot.replace(/index\\.(tsx|ts|jsx|js)$/, '');\n return normalizePageHref(href === '' ? '/' : href);\n })\n .filter((href) => !options.exclude?.(href))\n .sort((a, b) => sortReviewPages({ href: a }, { href: b }))\n .map((href) => ({ href }));\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from '../types';\n\ntype SupabaseRealtimeStatus =\n | 'SUBSCRIBED'\n | 'CHANNEL_ERROR'\n | 'TIMED_OUT'\n | 'CLOSED'\n | string;\n\ntype SupabaseRealtimeChannel = {\n topic?: string;\n on: (\n type: 'presence',\n filter: { event: 'sync' | 'join' | 'leave' },\n callback: () => void\n ) => SupabaseRealtimeChannel;\n subscribe: (\n callback: (status: SupabaseRealtimeStatus, error?: Error) => void\n ) => SupabaseRealtimeChannel;\n track: (payload: ReviewPresenceUser) => Promise<unknown>;\n untrack: () => Promise<unknown>;\n presenceState: () => Record<string, unknown[]>;\n teardown?: () => void;\n};\n\nexport type SupabasePresenceClient = {\n channel: (\n topic: string,\n options?: {\n config?: {\n private?: boolean;\n presence?: {\n key?: string;\n };\n };\n }\n ) => SupabaseRealtimeChannel;\n getChannels?: () => SupabaseRealtimeChannel[];\n removeChannel: (channel: SupabaseRealtimeChannel) => Promise<unknown>;\n};\n\nexport type SupabasePresenceAdapterOptions = {\n client: SupabasePresenceClient;\n channelPrefix?: string;\n private?: boolean;\n};\n\nconst normalizeTopicPart = (value: string) =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'default';\n\nconst getPresenceTopic = (channelPrefix: string, projectId: string) =>\n `${normalizeTopicPart(channelPrefix)}-${normalizeTopicPart(projectId)}`;\n\nconst PRESENCE_BRIDGE_KEY = '__dfReviewPresenceBridge';\n\ntype SupabasePresenceBridge = {\n channel: SupabaseRealtimeChannel;\n emit: () => void;\n getUsers: () => ReviewPresenceUser[];\n listeners: Set<() => void>;\n ready: Promise<void>;\n refCount: number;\n};\n\ntype SupabasePresenceBridgeChannel = SupabaseRealtimeChannel & {\n [PRESENCE_BRIDGE_KEY]?: SupabasePresenceBridge;\n};\n\nconst isReviewPresenceUser = (value: unknown): value is ReviewPresenceUser => {\n if (!value || typeof value !== 'object') return false;\n\n const candidate = value as Partial<ReviewPresenceUser>;\n return (\n typeof candidate.projectId === 'string' &&\n typeof candidate.sessionId === 'string' &&\n typeof candidate.userId === 'string' &&\n typeof candidate.updatedAt === 'string'\n );\n};\n\nconst flattenPresenceState = (\n state: Record<string, unknown[]>\n): ReviewPresenceUser[] =>\n Object.values(state).flat().filter(isReviewPresenceUser);\n\nconst dedupePresenceUsers = (users: ReviewPresenceUser[]) => {\n const userBySessionId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const currentUser = userBySessionId.get(user.sessionId);\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userBySessionId.set(user.sessionId, user);\n }\n });\n\n return Array.from(userBySessionId.values());\n};\n\nconst sortPresenceUsers = (\n users: ReviewPresenceUser[],\n selfSessionId: string\n) =>\n users.sort((a, b) => {\n if (a.sessionId === selfSessionId) return -1;\n if (b.sessionId === selfSessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n\nconst subscribeChannel = (channel: SupabaseRealtimeChannel) =>\n new Promise<void>((resolve, reject) => {\n channel.subscribe((status, error) => {\n if (status === 'SUBSCRIBED') {\n resolve();\n return;\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {\n reject(error ?? new Error(`Supabase presence ${status}`));\n }\n });\n });\n\nconst removeTopicChannels = async (\n client: SupabasePresenceClient,\n topic: string\n) => {\n const existingChannels = client.getChannels?.() ?? [];\n const normalizedTopic = `realtime:${topic}`;\n const topicChannels = existingChannels.filter(\n (channel) => channel.topic === topic || channel.topic === normalizedTopic\n );\n\n await Promise.allSettled(\n topicChannels.map(async (channel) => {\n const result = await client.removeChannel(channel);\n if (result !== 'ok') {\n channel.teardown?.();\n }\n })\n );\n};\n\nconst getTopicChannel = (\n client: SupabasePresenceClient,\n topic: string\n): SupabasePresenceBridgeChannel | undefined => {\n const normalizedTopic = `realtime:${topic}`;\n\n return client\n .getChannels?.()\n .find(\n (channel) =>\n channel.topic === topic || channel.topic === normalizedTopic\n ) as SupabasePresenceBridgeChannel | undefined;\n};\n\nconst createPresenceBridge = (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const channel = client.channel(topic, {\n config: {\n private: isPrivate,\n presence: {\n key: context.sessionId,\n },\n },\n }) as SupabasePresenceBridgeChannel;\n\n const bridge: SupabasePresenceBridge = {\n channel,\n listeners: new Set(),\n refCount: 0,\n getUsers: () =>\n dedupePresenceUsers(flattenPresenceState(channel.presenceState())),\n emit: () => {\n bridge.listeners.forEach((listener) => listener());\n },\n ready: Promise.resolve(),\n };\n\n channel[PRESENCE_BRIDGE_KEY] = bridge;\n channel\n .on('presence', { event: 'sync' }, bridge.emit)\n .on('presence', { event: 'join' }, bridge.emit)\n .on('presence', { event: 'leave' }, bridge.emit);\n\n bridge.ready = subscribeChannel(channel).catch((error) => {\n delete channel[PRESENCE_BRIDGE_KEY];\n throw error;\n });\n\n return bridge;\n};\n\nconst getPresenceBridge = async (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const existingChannel = getTopicChannel(client, topic);\n const existingBridge = existingChannel?.[PRESENCE_BRIDGE_KEY];\n\n if (existingBridge) return existingBridge;\n\n if (existingChannel) {\n await removeTopicChannels(client, topic);\n }\n\n return createPresenceBridge(client, topic, context, isPrivate);\n};\n\nexport const createSupabasePresenceAdapter = ({\n client,\n channelPrefix = 'review-presence',\n private: isPrivate = false,\n}: SupabasePresenceAdapterOptions): ReviewPresenceAdapter => ({\n label: 'supabase-presence',\n connect: async (context: ReviewPresenceContext) => {\n const topic = getPresenceTopic(channelPrefix, context.projectId);\n const bridge = await getPresenceBridge(client, topic, context, isPrivate);\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentState = context.initialState;\n bridge.refCount += 1;\n\n const getUsers = () =>\n sortPresenceUsers(\n [...bridge.getUsers()],\n context.sessionId\n );\n\n const emit = () => {\n const users = getUsers();\n listeners.forEach((listener) => listener(users));\n };\n\n const bridgeListener = () => emit();\n bridge.listeners.add(bridgeListener);\n\n await bridge.ready;\n await bridge.channel.track(currentState);\n bridge.emit();\n emit();\n\n return {\n update: async (state: Partial<ReviewPresenceState>) => {\n currentState = {\n ...currentState,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: new Date().toISOString(),\n };\n await bridge.channel.track(currentState);\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: async () => {\n listeners.clear();\n bridge.listeners.delete(bridgeListener);\n bridge.refCount = Math.max(0, bridge.refCount - 1);\n if (bridge.refCount > 0) return;\n\n delete (bridge.channel as SupabasePresenceBridgeChannel)[\n PRESENCE_BRIDGE_KEY\n ];\n await bridge.channel.untrack();\n await client.removeChannel(bridge.channel);\n },\n };\n },\n});\n"],"mappings":";;;;;;;;AAAA,OAAOA,YAAW;AAClB,SAAS,kBAAkB;;;ACD3B,IAAM,wBAAwB;AAEvB,SAAS,yBAAyB;AACvC,MAAI,CAAC,SAAS,eAAe,qBAAqB,GAAG;AACnD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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":["React","useCallback","useEffect","useMemo","useRef","useState","createElement","forwardRef","createElement","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","Map","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","jsx","jsxs","useMemo","jsx","jsxs","useMemo","useState","jsx","jsxs","error","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","toPascalCase","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","ReviewScopeIcon","Map","useCallback","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useCallback","useEffect","useMemo","useState","useState","useMemo","useCallback","useEffect","useCallback","useEffect","useState","useCallback","useEffect","useMemo","useRef","useState","useRef","useState","useMemo","useCallback","useEffect","frame","useState","useCallback","useEffect","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useMemo","useState","useState","useMemo","useCallback","useEffect","useEffect","useMemo","useRef","useState","statusOption","item","updated","useMemo","useState","useRef","statusOption","Fragment","jsx","jsxs","useRef","useState","useMemo","useCallback","refreshReviewData","useEffect","target","toastMessage","jsx","React"]}