@designfever/web-review-kit 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-QFNYQCTA.js → chunk-6L2KJ7XL.js} +160 -116
- package/dist/chunk-6L2KJ7XL.js.map +1 -0
- package/dist/index.cjs +159 -115
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/react-shell.cjs +319 -170
- package/dist/react-shell.cjs.map +1 -1
- package/dist/react-shell.js +181 -76
- package/dist/react-shell.js.map +1 -1
- package/docs/adaptor.sample.ts +2 -0
- package/docs/installation.md +19 -0
- package/package.json +1 -1
- package/dist/chunk-QFNYQCTA.js.map +0 -1
package/dist/react-shell.cjs.map
CHANGED
|
@@ -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/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/status.ts","../src/react-shell/qa/item.status.actions.tsx","../src/react-shell/anchor.restore.ts","../src/react-shell/review/item.icons.tsx","../src/react-shell/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/route.ts","../src/adapters/local.ts","../src/core/geometry.ts","../src/core/dom.anchor.ts","../src/core/id.ts","../src/core/hotkey.ts","../src/core/location.ts","../src/core/review/scope.ts","../src/core/review/item.ts","../src/core/scroll.ts","../src/core/overlay.style.ts","../src/core/review/format.ts","../src/core/web.review.kit.view.ts","../src/core/web.review.kit.app.ts","../src/react-shell/target/target.ts","../src/react-shell/hooks/review.frame.navigation.ts","../src/react-shell/hooks/review.kit.target.ts","../src/react-shell/hooks/use.review.target.overlay.ts","../src/react-shell/hooks/use.review.target.sync.ts","../src/react-shell/hooks/use.review.presence.ts","../src/react-shell/presence/presence.ts","../src/react-shell/hooks/use.review.ruler.ts","../src/react-shell/hooks/use.review.ruler.drag.ts","../src/react-shell/ruler/ruler.ts","../src/react-shell/hooks/use.review.settings.ts","../src/react-shell/hooks/use.review.shell.data.ts","../src/react-shell/hooks/use.review.shell.hotkeys.ts","../src/react-shell/hooks/use.review.shell.state.ts","../src/react-shell/adapters.ts","../src/react-shell/review/shell.actions.ts","../src/react-shell/pages.ts","../src/react-shell/presence/supabase.ts"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ensureReviewShellStyle } from './react-shell/style';\nimport type { ReviewShellMountOptions } from './react-shell/types';\nimport { ReviewShell } from './react-shell/review/shell';\n\nexport { ReviewShell } from './react-shell/review/shell';\nexport type {\n CreateReviewPagesOptions,\n ReviewShellAdapter,\n ReviewShellAdapters,\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n 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  - 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  - https://lucide.dev/icons/circle-question-mark\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleQuestionMark = createLucideIcon('circle-question-mark', __iconNode);\n\nexport default CircleQuestionMark;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n];\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('copy', __iconNode);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'M10 14 21 3', key: 'gplh6r' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6', key: 'a6xqqp' }],\n];\n\n/**\n * @component @name ExternalLink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ExternalLink = createLucideIcon('external-link', __iconNode);\n\nexport default ExternalLink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49',\n key: 'ct8e1f',\n },\n ],\n ['path', { d: 'M14.084 14.158a3 3 0 0 1-4.242-4.242', key: '151rxh' }],\n [\n 'path',\n {\n d: 'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143',\n key: '13bj9a',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst EyeOff = createLucideIcon('eye-off', __iconNode);\n\nexport default EyeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n key: '1nclc0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Eye = createLucideIcon('eye', __iconNode);\n\nexport default Eye;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '9', cy: '12', r: '1', key: '1vctgf' }],\n ['circle', { cx: '9', cy: '5', r: '1', key: 'hp0tcf' }],\n ['circle', { cx: '9', cy: '19', r: '1', key: 'fkjjf6' }],\n ['circle', { cx: '15', cy: '12', r: '1', key: '1tmaij' }],\n ['circle', { cx: '15', cy: '5', r: '1', key: '19l28e' }],\n ['circle', { cx: '15', cy: '19', r: '1', key: 'f4zoj3' }],\n];\n\n/**\n * @component @name GripVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/grip-vertical\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GripVertical = createLucideIcon('grip-vertical', __iconNode);\n\nexport default GripVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '7', height: '7', x: '3', y: '3', rx: '1', key: '1g98yp' }],\n ['rect', { width: '7', height: '7', x: '14', y: '3', rx: '1', key: '6d4xhi' }],\n ['rect', { width: '7', height: '7', x: '14', y: '14', rx: '1', key: 'nxv5o0' }],\n ['rect', { width: '7', height: '7', x: '3', y: '14', rx: '1', key: '1bb6yr' }],\n];\n\n/**\n * @component @name LayoutGrid\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/layout-grid\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LayoutGrid = createLucideIcon('layout-grid', __iconNode);\n\nexport default LayoutGrid;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: '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  - 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  - https://lucide.dev/icons/list-filter\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ListFilter = createLucideIcon('list-filter', __iconNode);\n\nexport default ListFilter;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z',\n key: '169xi5',\n },\n ],\n ['path', { d: 'M15 5.764v15', key: '1pn4in' }],\n ['path', { d: 'M9 3.236v15', key: '1uimfh' }],\n];\n\n/**\n * @component @name Map\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/map\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Map = createLucideIcon('map', __iconNode);\n\nexport default Map;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'm21 3-7 7', key: '1l2asr' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M9 21H3v-6', key: 'wtvkvv' }],\n];\n\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize2 = createLucideIcon('maximize-2', __iconNode);\n\nexport default Maximize2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\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  - 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  - https://lucide.dev/icons/rectangle-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RectangleHorizontal = createLucideIcon('rectangle-horizontal', __iconNode);\n\nexport default RectangleHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z',\n key: 'icamh8',\n },\n ],\n ['path', { d: 'm14.5 12.5 2-2', key: 'inckbg' }],\n ['path', { d: 'm11.5 9.5 2-2', key: 'fmmyf7' }],\n ['path', { d: 'm8.5 6.5 2-2', key: 'vc6u1g' }],\n ['path', { d: 'm17.5 15.5 2-2', key: 'wo5hmg' }],\n];\n\n/**\n * @component @name Ruler\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/ruler\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ruler = createLucideIcon('ruler', __iconNode);\n\nexport default Ruler;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 7V5a2 2 0 0 1 2-2h2', key: 'aa7l1z' }],\n ['path', { d: 'M17 3h2a2 2 0 0 1 2 2v2', key: '4qcy5o' }],\n ['path', { d: 'M21 17v2a2 2 0 0 1-2 2h-2', key: '6vwrx8' }],\n ['path', { d: 'M7 21H5a2 2 0 0 1-2-2v-2', key: 'ioqczr' }],\n];\n\n/**\n * @component @name Scan\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/scan\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Scan = createLucideIcon('scan', __iconNode);\n\nexport default Scan;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '20', x: '5', y: '2', rx: '2', ry: '2', key: '1yt0o3' }],\n ['path', { d: 'M12 18h.01', key: 'mhygvu' }],\n];\n\n/**\n * @component @name Smartphone\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/smartphone\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Smartphone = createLucideIcon('smartphone', __iconNode);\n\nexport default Smartphone;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z',\n key: 'xwnzip',\n },\n ],\n ['path', { d: 'M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6', key: '14rsvq' }],\n];\n\n/**\n * @component @name SquareMousePointer\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/square-mouse-pointer\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareMousePointer = createLucideIcon('square-mouse-pointer', __iconNode);\n\nexport default SquareMousePointer;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z',\n key: '1dfntj',\n },\n ],\n ['path', { d: 'M15 3v5a1 1 0 0 0 1 1h5', key: '6s6qgf' }],\n];\n\n/**\n * @component @name StickyNote\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/sticky-note\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst StickyNote = createLucideIcon('sticky-note', __iconNode);\n\nexport default StickyNote;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v12', key: '1x0j5s' }],\n ['path', { d: 'm17 8-5-5-5 5', key: '7q97r8' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n];\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('upload', __iconNode);\n\nexport default Upload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","import 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 type { ReviewItemStatus, ReviewWorkflowStatus } from './types';\n\nexport const REVIEW_WORKFLOW_STATUS_OPTIONS: Array<{\n value: ReviewWorkflowStatus;\n label: string;\n}> = [\n { value: 'todo', label: 'Todo' },\n { value: 'doing', label: 'Doing' },\n { value: 'review', label: 'Review' },\n { value: 'hold', label: 'Hold' },\n { value: 'done', label: 'Done' },\n];\n\nexport function normalizeReviewItemStatus(\n status: ReviewItemStatus | undefined\n): ReviewWorkflowStatus {\n if (status === 'resolved') return 'done';\n if (status === 'open' || !status) return 'todo';\n return status;\n}\n\nexport function matchesReviewItemStatus(\n itemStatus: ReviewItemStatus | undefined,\n queryStatus: ReviewItemStatus\n) {\n return (\n normalizeReviewItemStatus(itemStatus) === normalizeReviewItemStatus(queryStatus)\n );\n}\n","import { normalizeReviewItemStatus } from '../../status';\nimport type { ReviewItem, ReviewItemStatus } from '../../types';\nimport type { ReviewShellStatusOption } from '../types';\n\ninterface QaItemStatusActionsProps {\n canUpdateStatus: boolean;\n item: ReviewItem;\n statusOptions: readonly ReviewShellStatusOption[];\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n}\n\nconst getStatusOption = (\n status: ReviewItemStatus,\n statusOptions: readonly ReviewShellStatusOption[]\n) => {\n const normalizedStatus = normalizeReviewItemStatus(status);\n return (\n statusOptions.find((statusOption) => statusOption.value === status) ??\n statusOptions.find(\n (statusOption) => statusOption.value === normalizedStatus\n ) ??\n statusOptions[0]\n );\n};\n\nexport const QaItemStatusActions = ({\n canUpdateStatus,\n item,\n statusOptions,\n onChangeItemStatus,\n}: QaItemStatusActionsProps) => {\n const currentStatusOption = getStatusOption(item.status, statusOptions);\n if (!currentStatusOption) return null;\n const statusClassName = `is-status-${normalizeReviewItemStatus(\n currentStatusOption.value\n )}`;\n\n return (\n <div\n className=\"df-review-item-status-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canUpdateStatus ? (\n <select\n aria-label=\"QA status\"\n className={`df-review-item-status-select ${statusClassName}`}\n value={currentStatusOption.value}\n onChange={(event) =>\n void onChangeItemStatus(\n item,\n event.currentTarget.value as ReviewItemStatus\n )\n }\n >\n {statusOptions.map((statusOption) => (\n <option key={statusOption.value} value={statusOption.value}>\n {statusOption.label}\n </option>\n ))}\n </select>\n ) : (\n <span className={`df-review-item-status-badge ${statusClassName}`}>\n {currentStatusOption.label}\n </span>\n )}\n </div>\n );\n};\n","import type { ReviewItem } from '../types';\n\nexport const isAnchorRestorableReviewItem = (item: ReviewItem) =>\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && item.selection));\n\nexport const queryReviewItemAnchorElement = (\n targetDocument: Document,\n item: ReviewItem\n) => {\n const anchor = item.anchor;\n if (!anchor || !isAnchorRestorableReviewItem(item)) return undefined;\n\n const expectedRect = getReviewItemExpectedDocumentRect(item);\n const candidates = [anchor, ...(anchor.candidates ?? [])].filter(\n (candidate) => Boolean(candidate.selector)\n );\n const matches: Array<{\n element: Element;\n score: number;\n }> = [];\n\n candidates.forEach((candidate, index) => {\n try {\n targetDocument.querySelectorAll(candidate.selector).forEach((element) => {\n if (!isScrollableReviewAnchorElement(element)) return;\n\n matches.push({\n element,\n score: getReviewAnchorMatchScore(\n element,\n expectedRect,\n candidate.textFingerprint ?? anchor.textFingerprint,\n index\n )\n });\n });\n } catch {\n return;\n }\n });\n\n return matches.sort((a, b) => a.score - b.score)[0]?.element;\n};\n\nexport const getReviewItemRestoreScrollPosition = (\n targetWindow: Window,\n targetDocument: Document,\n item: ReviewItem,\n anchorElement?: Element\n) => {\n if (anchorElement) {\n const rect = anchorElement.getBoundingClientRect();\n return clampDocumentScrollPosition(targetDocument, {\n left:\n targetWindow.scrollX +\n rect.left -\n Math.max(0, (targetWindow.innerWidth - rect.width) / 2),\n top:\n targetWindow.scrollY +\n rect.top -\n Math.max(0, (targetWindow.innerHeight - rect.height) / 2)\n });\n }\n\n return clampDocumentScrollPosition(targetDocument, {\n left: item.scroll?.x ?? 0,\n top: item.scroll?.y ?? 0\n });\n};\n\nexport const setDocumentScrollInstantly = (\n targetWindow: Window,\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = position.left;\n scrollElement.scrollTop = position.top;\n return;\n }\n\n targetWindow.scrollTo(position.left, position.top);\n};\n\nexport const getReviewItemExpectedDocumentRect = (item: ReviewItem) => {\n const scroll = item.scroll ?? { x: 0, y: 0 };\n const selection = item.selection?.viewport;\n if (\n selection &&\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n ) {\n return {\n left: scroll.x + selection.x,\n top: scroll.y + selection.y,\n width: selection.width,\n height: selection.height\n };\n }\n\n const marker = item.marker?.viewport;\n if (marker && typeof marker.x === 'number' && typeof marker.y === 'number') {\n return {\n left: scroll.x + marker.x,\n top: scroll.y + marker.y,\n width: 1,\n height: 1\n };\n }\n\n return undefined;\n};\n\nexport const getReviewAnchorMatchScore = (\n element: Element,\n expectedRect:\n | {\n left: number;\n top: number;\n width: number;\n height: number;\n }\n | undefined,\n textFingerprint: string | undefined,\n candidateIndex: number\n) => {\n const rect = getElementDocumentRect(element);\n let score = candidateIndex * 25;\n\n if (expectedRect) {\n score += Math.abs(rect.top - expectedRect.top);\n score += Math.abs(rect.left - expectedRect.left) * 0.25;\n score += Math.abs(rect.width - expectedRect.width) * 0.1;\n score += Math.abs(rect.height - expectedRect.height) * 0.1;\n }\n\n if (textFingerprint) {\n score +=\n (1 - getReviewTextFingerprintScore(textFingerprint, element)) * 100;\n }\n\n return score;\n};\n\nexport const getElementDocumentRect = (element: Element) => {\n const rect = element.getBoundingClientRect();\n const view = element.ownerDocument.defaultView;\n\n return {\n left: rect.left + (view?.scrollX ?? 0),\n top: rect.top + (view?.scrollY ?? 0),\n width: rect.width,\n height: rect.height\n };\n};\n\nconst clampDocumentScrollPosition = (\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement;\n const view = targetDocument.defaultView;\n const maxLeft = Math.max(\n 0,\n (scrollElement?.scrollWidth ?? 0) - (view?.innerWidth ?? 0)\n );\n const maxTop = Math.max(\n 0,\n (scrollElement?.scrollHeight ?? 0) - (view?.innerHeight ?? 0)\n );\n\n return {\n left: Math.min(Math.max(0, Math.round(position.left)), maxLeft),\n top: Math.min(Math.max(0, Math.round(position.top)), maxTop)\n };\n};\n\nexport const getReviewTextFingerprintScore = (expected: string, element: Element) => {\n const actual = element.textContent?.replace(/\\s+/g, ' ').trim();\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getReviewFingerprintTokens(expected);\n const actualTokens = new Set(getReviewFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return Math.min(Math.max(matches.length / expectedTokens.length, 0.25), 0.76);\n};\n\nexport const getReviewFingerprintTokens = (value: string) =>\n value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n\nexport const isScrollableReviewAnchorElement = (element: Element) => {\n const id = element.id.trim().toLowerCase();\n if (\n element === element.ownerDocument.body ||\n element === element.ownerDocument.documentElement ||\n ['app', 'main', 'page', 'root', '__next', '__nuxt'].includes(id)\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n const viewportHeight = element.ownerDocument.documentElement.clientHeight;\n const scrollHeight = element.ownerDocument.documentElement.scrollHeight;\n return !(\n scrollHeight > viewportHeight * 1.5 && rect.height > viewportHeight * 3\n );\n};\n","import {\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n Scan as ScanIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n StickyNote as StickyNoteIcon,\n} from 'lucide-react';\nimport type { ReviewItem, ReviewItemScope } from '../../types';\nimport { isAnchorRestorableReviewItem } from '../anchor.restore';\n\nexport const ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nexport const getReviewItemMode = (item: ReviewItem) =>\n isAnchorRestorableReviewItem(item) ? 'dom' : item.kind;\n\nexport const ReviewItemModeIcon = ({\n mode,\n}: {\n mode: ReturnType<typeof getReviewItemMode>;\n}) => {\n if (mode === 'area') return <ScanIcon aria-hidden=\"true\" />;\n if (mode === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <StickyNoteIcon aria-hidden=\"true\" />;\n};\n","import {\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 { ReviewItem } from './types';\n\nexport function getItemRouteKey(\n item: Pick<ReviewItem, 'routeKey' | 'normalizedPath'>\n) {\n return item.routeKey || normalizeRoutePath(item.normalizedPath);\n}\n\nexport function normalizeRoutePath(pathname: string) {\n const [pathWithoutQuery] = pathname.split(/[?#]/);\n const path = (pathWithoutQuery || '/').replace(/\\/index\\.html$/, '/');\n return path.startsWith('/') ? path : `/${path}`;\n}\n","import { getItemRouteKey } from '../route';\nimport { matchesReviewItemStatus } from '../status';\nimport type {\n LocalAdapterOptions,\n ReviewItem,\n WebReviewKitAdapter,\n} from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'df-web-review-kit:items';\n\nexport function localAdapter(\n options: LocalAdapterOptions = {}\n): WebReviewKitAdapter {\n const storageKey = options.storageKey ?? DEFAULT_STORAGE_KEY;\n\n const write = (items: ReviewItem[]) => {\n window.localStorage.setItem(storageKey, JSON.stringify(items));\n };\n\n const read = (): ReviewItem[] => {\n if (typeof window === 'undefined') return [];\n\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return [];\n\n try {\n const value = JSON.parse(raw);\n if (!Array.isArray(value)) return [];\n\n let changed = false;\n const items = value.flatMap((item) => {\n const normalized = normalizeStoredReviewItem(item);\n if (!normalized || normalized !== item) changed = true;\n return normalized ? [normalized] : [];\n });\n\n if (changed) write(items);\n return items;\n } catch {\n return [];\n }\n };\n\n return {\n async get(id) {\n return read().find((item) => item.id === id) ?? null;\n },\n\n async list(query) {\n return read().filter((item) => {\n if (item.projectId !== query.projectId) return false;\n const queryRouteKey = query.routeKey ?? query.normalizedPath;\n if (\n queryRouteKey &&\n getItemRouteKey(item) !== queryRouteKey\n ) {\n return false;\n }\n if (query.status && !matchesReviewItemStatus(item.status, query.status)) {\n return false;\n }\n return true;\n });\n },\n\n async create(item) {\n const items = read();\n items.unshift(item);\n write(items);\n return item;\n },\n\n async update(id, patch) {\n const items = read();\n const index = items.findIndex((item) => item.id === id);\n\n if (index < 0) {\n throw new Error(`Review item not found: ${id}`);\n }\n\n const next: ReviewItem = {\n ...items[index],\n ...patch,\n id,\n createdAt: items[index].createdAt,\n updatedAt: new Date().toISOString(),\n };\n\n items[index] = next;\n write(items);\n return next;\n },\n\n async remove(id) {\n write(read().filter((item) => item.id !== id));\n },\n };\n}\n\nfunction normalizeStoredReviewItem(value: unknown): ReviewItem | undefined {\n if (!value || typeof value !== 'object') return undefined;\n\n const raw = value as Omit<ReviewItem, 'kind'> & {\n kind?: string;\n reviewNumber?: unknown;\n screenshot?: unknown;\n };\n const kind =\n raw.kind === 'text' ? 'note' :\n raw.kind === 'capture' ? 'area' :\n raw.kind;\n\n if (kind !== 'note' && kind !== 'area') return undefined;\n\n const { screenshot: _screenshot, reviewNumber: _reviewNumber, ...item } = raw;\n\n if (\n kind === raw.kind &&\n _screenshot === undefined &&\n _reviewNumber === undefined\n ) {\n return raw as ReviewItem;\n }\n\n return {\n ...item,\n kind,\n } as ReviewItem;\n}\n","import type {\n RelativeSelection,\n ReviewPoint,\n ViewportSize,\n} from '../types';\n\n/** Rectangle expressed in the target viewport coordinate space. */\nexport interface ViewportSelection {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/** Same-origin target document plus its placement inside the host shell. */\nexport interface ReviewEnvironment {\n window: Window;\n document: Document;\n viewportRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n overlayRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n}\n\n/** Returns true when two viewport rectangles overlap. */\nexport function rectanglesIntersect(\n a: ViewportSelection,\n b: ViewportSelection\n) {\n return (\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top\n );\n}\n\n/** Converts a point into a 1x1 selection for shared selection handling. */\nexport function getPointSelection(point: ReviewPoint): ViewportSelection {\n return {\n left: point.x,\n top: point.y,\n width: 1,\n height: 1,\n };\n}\n\n/** Converts public API selection fields into internal viewport rectangle fields. */\nexport function toViewportSelection(\n selection: RelativeSelection\n): ViewportSelection {\n return {\n left: selection.x,\n top: selection.y,\n width: selection.width,\n height: selection.height,\n };\n}\n\n/** Rounds an internal viewport rectangle back to the public selection shape. */\nexport function toPublicSelection(\n selection: ViewportSelection\n): RelativeSelection {\n return {\n x: Math.round(selection.left),\n y: Math.round(selection.top),\n width: Math.round(selection.width),\n height: Math.round(selection.height),\n };\n}\n\n/** Finds the center point of either internal or public selection shapes. */\nexport function getSelectionCenter(\n selection: ViewportSelection | RelativeSelection\n): ReviewPoint {\n if ('left' in selection) {\n return {\n x: selection.left + selection.width / 2,\n y: selection.top + selection.height / 2,\n };\n }\n\n return {\n x: selection.x + selection.width / 2,\n y: selection.y + selection.height / 2,\n };\n}\n\n/** Runtime guard for legacy and current persisted selection values. */\nexport function isRelativeSelection(value: unknown): value is RelativeSelection {\n if (!value || typeof value !== 'object') return false;\n\n const selection = value as Partial<RelativeSelection>;\n return (\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n );\n}\n\n/** Reads the active target viewport size, falling back to the host window. */\nexport function getViewportSize(\n environment?: ReviewEnvironment\n): ViewportSize {\n const targetWindow = environment?.window ?? window;\n return {\n width: targetWindow.innerWidth,\n height: targetWindow.innerHeight,\n };\n}\n\n/** Returns whether a target-space point is currently visible in the target viewport. */\nexport function isPointInViewport(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return (\n point.x >= 0 &&\n point.y >= 0 &&\n point.x <= viewport.width &&\n point.y <= viewport.height\n );\n}\n\n/** Returns whether any part of a target-space selection is visible. */\nexport function isSelectionInViewport(\n selection: ViewportSelection,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return rectanglesIntersect(selection, {\n left: 0,\n top: 0,\n width: viewport.width,\n height: viewport.height,\n });\n}\n\n/** Clamps a target-space point to the visible target viewport. */\nexport function clampPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return {\n x: clamp(point.x, 0, viewport.width),\n y: clamp(point.y, 0, viewport.height),\n };\n}\n\n/** Places a popover inside the current overlay bounds near a host-space point. */\nexport function getPopoverPosition(\n point: ReviewPoint,\n environment?: ReviewEnvironment,\n options?: {\n width?: number;\n estimatedHeight?: number;\n offset?: number;\n }\n) {\n const bounds = getPopoverBounds(environment);\n const margin = 12;\n const width = Math.min(\n options?.width ?? 320,\n Math.max(240, bounds.width - margin * 2)\n );\n const estimatedHeight = options?.estimatedHeight ?? 178;\n const offset = options?.offset ?? 12;\n\n return {\n left: clamp(\n point.x + offset,\n bounds.left + margin,\n bounds.left + bounds.width - width - margin\n ),\n top: clamp(\n point.y + offset,\n bounds.top + margin,\n bounds.top + bounds.height - estimatedHeight - margin\n ),\n };\n}\n\n/** Places the area draft popover near the selected area edge. */\nexport function getAreaPopoverPosition(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n) {\n return getPopoverPosition(\n {\n x: selection.left + selection.width,\n y: selection.top,\n },\n environment,\n {\n width: 360,\n estimatedHeight: 206,\n }\n );\n}\n\n/** Uses overlay bounds when embedded in a shell, otherwise the host viewport. */\nexport function getPopoverBounds(environment?: ReviewEnvironment) {\n if (!environment) {\n return {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n\n return environment.overlayRect;\n}\n\n/** Converts a target-space point to the host shell coordinate space. */\nexport function toHostPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n if (!environment) return point;\n\n return {\n x: point.x + environment.viewportRect.left,\n y: point.y + environment.viewportRect.top,\n };\n}\n\n/** Converts a target-space rectangle to the host shell coordinate space. */\nexport function toHostSelection(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n): ViewportSelection {\n return {\n left: selection.left + environment.viewportRect.left,\n top: selection.top + environment.viewportRect.top,\n width: selection.width,\n height: selection.height,\n };\n}\n\n/** Converts a host-space point back into target viewport coordinates. */\nexport function toTargetPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n if (!environment) return point;\n\n return {\n x: point.x - environment.viewportRect.left,\n y: point.y - environment.viewportRect.top,\n };\n}\n\n/** Extracts a host pointer event position as a target-space point. */\nexport function toTargetPointFromHostEvent(\n event: Pick<PointerEvent, 'clientX' | 'clientY'>,\n environment?: ReviewEnvironment\n) {\n return toTargetPoint(\n {\n x: event.clientX,\n y: event.clientY,\n },\n environment\n );\n}\n\n/** Sizes and positions an overlay layer to cover the target viewport in host space. */\nexport function placeLayerOverTarget(\n layer: HTMLElement,\n environment: ReviewEnvironment\n) {\n layer.style.left = `${environment.viewportRect.left}px`;\n layer.style.top = `${environment.viewportRect.top}px`;\n layer.style.width = `${environment.viewportRect.width}px`;\n layer.style.height = `${environment.viewportRect.height}px`;\n layer.style.right = 'auto';\n layer.style.bottom = 'auto';\n}\n\n/** Clamps a value even when max is smaller than min. */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), Math.max(min, max));\n}\n\n/** Keeps persisted relative coordinates stable without excessive precision. */\nexport function roundRatio(value: number) {\n return Math.round(value * 10000) / 10000;\n}\n\n/** Rounds a point to pixel coordinates for persisted review data. */\nexport function roundPoint(point: ReviewPoint): ReviewPoint {\n return {\n x: Math.round(point.x),\n y: Math.round(point.y),\n };\n}\n","import type {\n DomAnchor,\n DomAnchorCandidate,\n DomSourceHint,\n RelativeSelection,\n ReviewPoint,\n} from '../types';\nimport {\n clamp,\n roundRatio,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\n\nconst COMMON_ANCHOR_ATTRIBUTES = [\n 'data-testid',\n 'data-test-id',\n 'data-cy',\n 'data-test',\n 'data-qa',\n 'data-section-id',\n 'data-component',\n];\n\nconst SEMANTIC_ANCHOR_ATTRIBUTES = [\n 'aria-label',\n 'title',\n 'name',\n 'href',\n];\n\n/** Resolves a DOM anchor from the center of a target-space selection. */\nexport function getDomAnchor(\n selection: ViewportSelection,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const x = selection.left + selection.width / 2;\n const y = selection.top + selection.height / 2;\n return getDomAnchorFromPoint({ x, y }, configuredAttribute, environment);\n}\n\n/** Builds the best DOM anchor candidate set from a target-space point. */\nexport function getDomAnchorFromPoint(\n point: ReviewPoint,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const target = environment.document.elementFromPoint(point.x, point.y);\n if (!target) return undefined;\n\n const candidates = createAnchorCandidates(target, configuredAttribute);\n const primary = candidates[0];\n if (!primary) return undefined;\n\n return {\n ...primary,\n candidates,\n htmlSnippet: getElementHtmlSnippet(\n getAnchorSourceElement(target, primary, configuredAttribute) ?? target\n ),\n source: getDomSourceHint(target),\n };\n}\n\n/** Reads the current target-space rectangle for a previously captured anchor. */\nexport function getElementViewportSelection(\n anchor: DomAnchor,\n environment: ReviewEnvironment\n): ViewportSelection | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return undefined;\n\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n}\n\n/** Stores a selection relative to an anchor so it can survive layout shifts. */\nexport function getRelativeSelection(\n selection: ViewportSelection,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): RelativeSelection | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((selection.left - rect.left) / rect.width),\n y: roundRatio((selection.top - rect.top) / rect.height),\n width: roundRatio(selection.width / rect.width),\n height: roundRatio(selection.height / rect.height),\n };\n}\n\n/** Stores a point relative to an anchor so marker positions can be rebound. */\nexport function getRelativePoint(\n point: ReviewPoint,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): ReviewPoint | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((point.x - rect.left) / rect.width),\n y: roundRatio((point.y - rect.top) / rect.height),\n };\n}\n\n/** Returns the primary anchor plus any fallback candidates without duplicates. */\nexport function getAnchorCandidates(anchor: DomAnchor) {\n return dedupeAnchorCandidates([\n anchor,\n ...(anchor.candidates ?? []),\n ]);\n}\n\n/** Finds the best current DOM element for a persisted anchor candidate set. */\nexport function resolveAnchorElement(\n anchor: DomAnchor,\n environment: ReviewEnvironment\n) {\n // Try every persisted candidate because IDs/classes can disappear between builds.\n const matches = getAnchorCandidates(anchor).flatMap((candidate) => {\n const match = queryBestAnchorCandidate(\n candidate,\n candidate.textFingerprint ?? anchor.textFingerprint,\n environment\n );\n\n if (!match) return [];\n\n const confidence = roundRatio(\n (candidate.confidence ?? 0.5) * match.score\n );\n\n return [{\n element: match.element,\n candidate,\n confidence,\n }];\n });\n\n return matches.sort((a, b) => b.confidence - a.confidence)[0];\n}\n\n/** CSS.escape wrapper with a small fallback for older browsers. */\nexport function cssEscape(value: string) {\n if ('CSS' in window && typeof window.CSS.escape === 'function') {\n return window.CSS.escape(value);\n }\n\n return value.replace(/[^a-zA-Z0-9_-]/g, '\\\\$&');\n}\n\nfunction getAnchorElement(\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n) {\n return typeof anchor === 'string'\n ? queryAnchorElement(anchor, environment)\n : resolveAnchorElement(anchor, environment)?.element;\n}\n\nfunction createAnchorCandidates(\n target: Element,\n configuredAttribute: string\n): DomAnchorCandidate[] {\n const targetCandidates: DomAnchorCandidate[] = [];\n\n // Prefer the deepest clicked element. Ancestor anchors are kept as fallbacks.\n const configuredAnchor = getExactAttributeAnchorCandidate(\n target,\n configuredAttribute,\n 0.98,\n 'configured-attribute'\n );\n if (configuredAnchor) targetCandidates.push(configuredAnchor);\n\n const targetAttributeAnchor = getAttributeAnchorCandidate(\n target,\n COMMON_ANCHOR_ATTRIBUTES.filter((name) => name !== configuredAttribute),\n 0.9\n );\n if (targetAttributeAnchor) targetCandidates.push(targetAttributeAnchor);\n\n if (isMeaningfulId(target.id)) {\n targetCandidates.push({\n selector: `#${cssEscape(target.id)}`,\n strategy: 'id',\n confidence: 0.94,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n const semanticAnchor = getAttributeAnchorCandidate(\n target,\n SEMANTIC_ANCHOR_ATTRIBUTES,\n 0.84\n );\n if (semanticAnchor) targetCandidates.push(semanticAnchor);\n\n const targetClassName = getMeaningfulClassName(target);\n if (targetClassName) {\n targetCandidates.push({\n selector: `${target.tagName.toLowerCase()}.${cssEscape(targetClassName)}`,\n strategy: 'class',\n confidence: 0.82,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n const scopedPath = getScopedDomPathCandidate(target, configuredAttribute);\n if (scopedPath) targetCandidates.push(scopedPath);\n\n const targetDomPath: DomAnchorCandidate = {\n selector: getDomPath(target),\n strategy: 'dom-path',\n confidence: targetCandidates.length > 0 ? 0.8 : 0.5,\n textFingerprint: getTextFingerprint(target),\n };\n\n const parentCandidates: DomAnchorCandidate[] = [];\n\n const parent = target.parentElement;\n const parentConfiguredAnchor = parent\n ? findClosestAttributeAnchor(parent, [configuredAttribute], 0.72, {\n strategy: 'configured-attribute',\n })\n : undefined;\n if (parentConfiguredAnchor) parentCandidates.push(parentConfiguredAnchor);\n\n const anchoredByAttribute = parent\n ? findClosestAttributeAnchor(\n parent,\n COMMON_ANCHOR_ATTRIBUTES.filter((name) => name !== configuredAttribute),\n 0.7\n )\n : undefined;\n if (anchoredByAttribute) parentCandidates.push(anchoredByAttribute);\n\n const anchoredById = parent\n ? findClosest(parent, (element) => isMeaningfulId(element.id))\n : undefined;\n if (anchoredById?.id) {\n parentCandidates.push({\n selector: `#${cssEscape(anchoredById.id)}`,\n strategy: 'id',\n confidence: 0.72,\n textFingerprint: getTextFingerprint(anchoredById),\n });\n }\n\n const anchoredByClass = parent\n ? findClosest(parent, (element) => Boolean(getMeaningfulClassName(element)))\n : undefined;\n const className = anchoredByClass\n ? getMeaningfulClassName(anchoredByClass)\n : undefined;\n\n if (anchoredByClass && className) {\n parentCandidates.push({\n selector: `${anchoredByClass.tagName.toLowerCase()}.${cssEscape(\n className\n )}`,\n strategy: 'class',\n confidence: 0.58,\n textFingerprint: getTextFingerprint(anchoredByClass),\n });\n }\n\n const candidates =\n targetCandidates.length > 0\n ? [...targetCandidates, targetDomPath, ...parentCandidates]\n : [...parentCandidates, targetDomPath];\n\n return dedupeAnchorCandidates(candidates);\n}\n\nfunction findClosestAttributeAnchor(\n target: Element,\n attributeNames: string[],\n confidence: number,\n options?: {\n strategy?: DomAnchorCandidate['strategy'];\n }\n): DomAnchorCandidate | undefined {\n for (const attributeName of attributeNames) {\n const selector = `[${attributeName}]`;\n const element = safeClosest(target, selector);\n if (!element) continue;\n\n const value = getStableAttributeValue(element, attributeName);\n if (!value) continue;\n\n return {\n selector: `[${attributeName}=\"${cssEscape(value)}\"]`,\n strategy: options?.strategy ?? 'attribute',\n confidence,\n textFingerprint: getTextFingerprint(element),\n };\n }\n\n return undefined;\n}\n\nfunction getExactAttributeAnchorCandidate(\n element: Element,\n attributeName: string,\n confidence: number,\n strategy: DomAnchorCandidate['strategy']\n): DomAnchorCandidate | undefined {\n const value = getStableAttributeValue(element, attributeName);\n if (!value) return undefined;\n\n return {\n selector: `[${attributeName}=\"${cssEscape(value)}\"]`,\n strategy,\n confidence,\n textFingerprint: getTextFingerprint(element),\n };\n}\n\nfunction getAttributeAnchorCandidate(\n element: Element,\n attributeNames: string[],\n confidence: number\n): DomAnchorCandidate | undefined {\n for (const attributeName of attributeNames) {\n const value = getStableAttributeValue(element, attributeName);\n if (!value) continue;\n\n return {\n selector: `${element.tagName.toLowerCase()}[${attributeName}=\"${cssEscape(\n value\n )}\"]`,\n strategy: 'attribute',\n confidence,\n textFingerprint: getTextFingerprint(element),\n };\n }\n\n return undefined;\n}\n\nfunction getScopedDomPathCandidate(\n target: Element,\n configuredAttribute: string\n): DomAnchorCandidate | undefined {\n const parent = target.parentElement;\n if (!parent) return undefined;\n\n const anchor = findStableAncestorSelector(parent, configuredAttribute);\n if (!anchor) return undefined;\n\n const selector = getDomPathBetween(anchor.element, target, anchor.selector);\n if (!selector) return undefined;\n\n return {\n selector,\n strategy: 'dom-path',\n confidence: anchor.confidence,\n textFingerprint: getTextFingerprint(target),\n };\n}\n\nfunction findStableAncestorSelector(\n start: Element,\n configuredAttribute: string\n) {\n let element: Element | null = start;\n const root = start.ownerDocument.documentElement;\n\n while (element && element !== root) {\n const configuredValue = getStableAttributeValue(element, configuredAttribute);\n if (configuredValue) {\n return {\n element,\n selector: `[${configuredAttribute}=\"${cssEscape(configuredValue)}\"]`,\n confidence: 0.88,\n };\n }\n\n const attributeAnchor = getAttributeAnchorCandidate(\n element,\n COMMON_ANCHOR_ATTRIBUTES.filter((name) => name !== configuredAttribute),\n 0.84\n );\n if (attributeAnchor) {\n return {\n element,\n selector: attributeAnchor.selector,\n confidence: 0.84,\n };\n }\n\n if (isMeaningfulId(element.id)) {\n return {\n element,\n selector: `#${cssEscape(element.id)}`,\n confidence: 0.82,\n };\n }\n\n const className = getMeaningfulClassName(element);\n if (className) {\n return {\n element,\n selector: `${element.tagName.toLowerCase()}.${cssEscape(className)}`,\n confidence: 0.76,\n };\n }\n\n element = element.parentElement;\n }\n\n return undefined;\n}\n\nfunction getAnchorSourceElement(\n target: Element,\n candidate: DomAnchorCandidate,\n configuredAttribute: string\n) {\n if (candidate.strategy === 'configured-attribute') {\n return target.closest(`[${configuredAttribute}]`);\n }\n\n if (candidate.strategy === 'dom-path') return target;\n\n try {\n return target.closest(candidate.selector);\n } catch {\n return target;\n }\n}\n\nfunction safeClosest(element: Element, selector: string) {\n try {\n return element.closest(selector);\n } catch {\n return null;\n }\n}\n\nfunction getElementHtmlSnippet(element: Element, maxLength = 1000) {\n const html = decodeHtmlEntities(element.outerHTML.replace(/\\s+/g, ' ').trim());\n if (html.length <= maxLength) return html;\n return `${html.slice(0, maxLength - 3)}...`;\n}\n\nfunction decodeHtmlEntities(value: string) {\n return value.replace(\n /&(#\\d+|#x[\\da-f]+|lt|gt|quot|apos|amp);/gi,\n (match, entity: string) => {\n const normalized = entity.toLowerCase();\n\n if (normalized === 'lt') return '<';\n if (normalized === 'gt') return '>';\n if (normalized === 'quot') return '\"';\n if (normalized === 'apos') return \"'\";\n if (normalized === 'amp') return '&';\n\n const codePoint = normalized.startsWith('#x')\n ? Number.parseInt(normalized.slice(2), 16)\n : Number.parseInt(normalized.slice(1), 10);\n\n return Number.isFinite(codePoint)\n ? String.fromCodePoint(codePoint)\n : match;\n }\n );\n}\n\nfunction getDomSourceHint(target: Element): DomSourceHint | undefined {\n const sourceElement = target.closest(\n [\n '[data-wrk-source-file]',\n '[data-wrk-source-component]',\n '[data-wrk-source-line]',\n '[data-wrk-source-column]',\n '[data-file]',\n '[data-component]',\n '[data-section-index]',\n '[data-section-id]',\n ].join(', ')\n );\n if (!sourceElement) return undefined;\n\n const source: DomSourceHint = {\n component: getSourceAttribute(\n sourceElement,\n 'data-wrk-source-component',\n 'data-component'\n ),\n file: getSourceAttribute(sourceElement, 'data-wrk-source-file', 'data-file'),\n line: getSourceAttribute(sourceElement, 'data-wrk-source-line'),\n column: getSourceAttribute(sourceElement, 'data-wrk-source-column'),\n sectionId: getSourceAttribute(sourceElement, 'data-section-id'),\n sectionIndex: getSourceAttribute(sourceElement, 'data-section-index'),\n };\n\n return Object.values(source).some(Boolean) ? source : undefined;\n}\n\nfunction getSourceAttribute(element: Element, ...names: string[]) {\n for (const name of names) {\n const value = element.getAttribute(name)?.trim();\n if (value) return value;\n }\n\n return undefined;\n}\n\nfunction dedupeAnchorCandidates(candidates: DomAnchorCandidate[]) {\n const seen = new Set<string>();\n\n return candidates.filter((candidate) => {\n const key = `${candidate.strategy}:${candidate.selector}`;\n if (seen.has(key)) return false;\n\n seen.add(key);\n return true;\n });\n}\n\nfunction queryBestAnchorCandidate(\n candidate: DomAnchorCandidate,\n textFingerprint: string | undefined,\n environment: ReviewEnvironment\n) {\n const elements = queryAnchorElements(candidate.selector, environment);\n if (elements.length === 0) return undefined;\n if (!textFingerprint) {\n return {\n element: elements[0],\n score: 1,\n };\n }\n\n // If a selector matches multiple nodes, text similarity keeps restore deterministic.\n return elements\n .map((element) => ({\n element,\n score: getTextFingerprintScore(\n textFingerprint,\n getTextFingerprint(element)\n ),\n }))\n .sort((a, b) => b.score - a.score)[0];\n}\n\nfunction queryAnchorElement(selector: string, environment: ReviewEnvironment) {\n return queryAnchorElements(selector, environment)[0];\n}\n\nfunction queryAnchorElements(selector: string, environment: ReviewEnvironment) {\n try {\n return Array.from(environment.document.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction findClosest(\n start: Element,\n predicate: (element: Element) => boolean\n) {\n let element: Element | null = start;\n const root = start.ownerDocument.documentElement;\n\n while (element && element !== root) {\n if (predicate(element)) return element;\n element = element.parentElement;\n }\n\n return undefined;\n}\n\nfunction getDomPath(element: Element) {\n const parts: string[] = [];\n let current: Element | null = element;\n const ownerDocument = element.ownerDocument;\n\n while (\n current &&\n current !== ownerDocument.body &&\n current !== ownerDocument.documentElement\n ) {\n const parent: Element | null = current.parentElement;\n const tag = current.tagName.toLowerCase();\n\n if (!parent) {\n parts.unshift(tag);\n break;\n }\n\n const currentTagName = current.tagName;\n const siblings: Element[] = Array.from(parent.children).filter(\n (child) => child.tagName === currentTagName\n );\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${tag}:nth-of-type(${index})`);\n current = parent;\n }\n\n return `body > ${parts.join(' > ')}`;\n}\n\nfunction getDomPathBetween(\n ancestor: Element,\n target: Element,\n ancestorSelector: string\n) {\n const parts: string[] = [];\n let current: Element | null = target;\n\n while (current && current !== ancestor) {\n parts.unshift(getDomPathPart(current));\n current = current.parentElement;\n }\n\n if (current !== ancestor || parts.length === 0) return undefined;\n\n return `${ancestorSelector} > ${parts.join(' > ')}`;\n}\n\nfunction getDomPathPart(element: Element) {\n const parent: Element | null = element.parentElement;\n const tag = element.tagName.toLowerCase();\n\n if (!parent) return tag;\n\n const currentTagName = element.tagName;\n const siblings: Element[] = Array.from(parent.children).filter(\n (child) => child.tagName === currentTagName\n );\n const index = siblings.indexOf(element) + 1;\n return `${tag}:nth-of-type(${index})`;\n}\n\nfunction getTextFingerprint(element: Element) {\n const text = element.textContent?.replace(/\\s+/g, ' ').trim();\n return text ? text.slice(0, 120) : undefined;\n}\n\nfunction getStableAttributeValue(element: Element, attributeName: string) {\n const value = element.getAttribute(attributeName)?.trim();\n if (!value || value.length > 160) return undefined;\n if (/^(true|false)$/i.test(value)) return undefined;\n if (/^\\d+$/.test(value) && value.length < 3) return undefined;\n\n return value;\n}\n\nfunction getTextFingerprintScore(expected?: string, actual?: string) {\n if (!expected) return 1;\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getFingerprintTokens(expected);\n const actualTokens = new Set(getFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return clamp(matches.length / expectedTokens.length, 0.25, 0.76);\n}\n\nfunction getFingerprintTokens(value: string) {\n return value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n}\n\nfunction isMeaningfulId(value: string) {\n const normalized = value.trim().toLowerCase();\n if (normalized.length <= 1) return false;\n\n return ![\n 'app',\n 'main',\n 'page',\n 'root',\n '__next',\n '__nuxt',\n ].includes(normalized);\n}\n\nfunction getMeaningfulClassName(element: Element) {\n return Array.from(element.classList).find((name) => isMeaningfulClass(name));\n}\n\nfunction isMeaningfulClass(value: string) {\n const normalized = value.trim();\n if (\n [\n 'absolute',\n 'block',\n 'contents',\n 'fixed',\n 'flex',\n 'grid',\n 'hidden',\n 'relative',\n 'sticky',\n ].includes(normalized)\n ) {\n return false;\n }\n\n return (\n normalized.length > 2 &&\n !normalized.includes(':') &&\n !/^(aspect|basis|bg|border|bottom|col|content|delay|duration|ease|font|from|gap|grow|h|inset|items|justify|leading|left|m|max-h|max-w|mb|ml|mr|mt|mx|my|min-h|min-w|object|opacity|order|origin|overflow|p|pb|pl|place|pointer|pr|pt|px|py|right|rotate|rounded|row|scale|self|shadow|shrink|text|to|top|tracking|transition|translate|via|w|z)-/.test(\n normalized\n ) &&\n !normalized.startsWith('mq-')\n );\n}\n","/** Creates a stable item id with crypto UUID when available. */\nexport function createId() {\n if ('randomUUID' in crypto) return crypto.randomUUID();\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n","/** Matches configured hotkeys while supporting common Korean keyboard aliases. */\nexport function isHotkey(event: KeyboardEvent, hotkey: string) {\n const parts = hotkey\n .split('+')\n .map((part) => part.trim().toLowerCase())\n .filter(Boolean);\n const key = parts.find(\n (part) => !['shift', 'ctrl', 'control', 'alt', 'meta', 'cmd'].includes(part)\n );\n\n if (!key) return false;\n if (parts.includes('shift') !== event.shiftKey) return false;\n if (\n (parts.includes('ctrl') || parts.includes('control')) !== event.ctrlKey\n ) {\n return false;\n }\n if (parts.includes('alt') !== event.altKey) return false;\n if ((parts.includes('meta') || parts.includes('cmd')) !== event.metaKey) {\n return false;\n }\n\n return isHotkeyKey(event, key);\n}\n\nfunction isHotkeyKey(event: KeyboardEvent, key: string) {\n const normalizedKey = key.toLowerCase();\n\n if (event.key.toLowerCase() === normalizedKey) return true;\n\n if (getHotkeyCode(normalizedKey) === event.code) return true;\n\n const aliases: Record<string, string[]> = {\n q: ['ㅂ', 'ㅃ'],\n };\n\n return aliases[normalizedKey]?.includes(event.key) ?? false;\n}\n\nfunction getHotkeyCode(key: string) {\n if (/^[a-z]$/.test(key)) return `Key${key.toUpperCase()}`;\n if (/^[0-9]$/.test(key)) return `Digit${key}`;\n return undefined;\n}\n","import { normalizeRoutePath } from '../route';\nimport type { ReviewEnvironment } from './geometry';\n\nconst INTERNAL_QUERY_PARAMS = ['__dfwr_target'];\n\n/** Returns the public target URL without review-only query params. */\nexport function getPageUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\n/** Mirrors page URL today, kept separate for future canonical/original URL support. */\nexport function getOriginalUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\n/** Returns the normalized route key used for adapter queries. */\nexport function getRouteKey(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n return normalizeRoutePath(location.pathname);\n}\n\n/** Alias for route key until route and path concepts diverge. */\nexport function getNormalizedPath(environment?: ReviewEnvironment) {\n return getRouteKey(environment);\n}\n\nfunction getPublicSearch(location: Location) {\n const params = new URLSearchParams(location.search);\n\n INTERNAL_QUERY_PARAMS.forEach((key) => params.delete(key));\n\n const value = params.toString();\n return value ? `?${value}` : '';\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemScope,\n ReviewViewportPreset,\n ViewportSize,\n} from '../../types';\n\n/** Default viewport presets used when a host project does not provide its own. */\nexport const DEFAULT_REVIEW_VIEWPORTS: ReviewViewportPreset[] = [\n { label: 'Mobile', width: 390, height: 720, scope: 'mobile' },\n { label: 'Tablet', width: 768, height: 1024, scope: 'tablet' },\n { label: 'Desktop', width: 1440, height: 900, scope: 'desktop' },\n { label: 'Wide', width: 1980, height: 1080, scope: 'wide' },\n];\n\nconst REVIEW_SCOPE_LABELS: Record<ReviewItemScope, string> = {\n mobile: 'Mobile',\n tablet: 'Tablet',\n desktop: 'Desktop',\n wide: 'Wide',\n dom: 'Element',\n};\n\nconst normalizeReviewItemScope = (value: unknown): ReviewItemScope | undefined => {\n if (value === 'element') return 'dom';\n if (\n value === 'mobile' ||\n value === 'tablet' ||\n value === 'desktop' ||\n value === 'wide' ||\n value === 'dom'\n ) {\n return value;\n }\n\n return undefined;\n};\n\nconst getViewportPresetDistance = (\n preset: ReviewViewportPreset,\n viewport: ViewportSize\n) =>\n Math.abs(preset.width - viewport.width) +\n Math.abs(preset.height - viewport.height);\n\nconst inferViewportScope = (\n preset: ReviewViewportPreset\n): Exclude<ReviewItemScope, 'dom'> => {\n if (preset.scope) return preset.scope;\n\n const label = preset.label.toLowerCase();\n\n if (label.includes('mobile') || label.includes('phone')) return 'mobile';\n if (label.includes('tablet') || label.includes('pad')) return 'tablet';\n if (\n label.includes('wide') ||\n label.includes('1980') ||\n label.includes('1940') ||\n label.includes('1920')\n ) {\n return 'wide';\n }\n if (label.includes('desktop')) return 'desktop';\n if (preset.width >= 1800) return 'wide';\n if (preset.width >= 1000) return 'desktop';\n if (preset.width >= 700) return 'tablet';\n return 'mobile';\n};\n\n/** Finds the nearest configured preset for a viewport size. */\nexport function findReviewViewportPreset(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const fallback = presets[0] ?? DEFAULT_REVIEW_VIEWPORTS[0];\n const exact = presets.find(\n (preset) =>\n preset.width === viewport.width && preset.height === viewport.height\n );\n\n if (exact) return exact;\n\n return presets.reduce((closest, preset) => {\n const closestDistance = getViewportPresetDistance(closest, viewport);\n const presetDistance = getViewportPresetDistance(preset, viewport);\n return presetDistance < closestDistance ? preset : closest;\n }, fallback);\n}\n\n/** Resolves a viewport size to the review scope used for item grouping. */\nexport function getReviewViewportScope(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): Exclude<ReviewItemScope, 'dom'> {\n return inferViewportScope(findReviewViewportPreset(viewport, presets));\n}\n\n/** Resolves an item's persisted scope, falling back to its captured viewport. */\nexport function getReviewItemScope(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): ReviewItemScope {\n const scope = normalizeReviewItemScope(item.scope);\n if (scope && scope !== 'dom') return scope;\n return getReviewViewportScope(item.viewport, presets);\n}\n\n/** Returns the display label for an item's resolved review scope. */\nexport function getReviewItemScopeLabel(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const scope = getReviewItemScope(item, presets);\n if (scope === 'dom') return REVIEW_SCOPE_LABELS.dom;\n\n const preset = findReviewViewportPreset(item.viewport, presets);\n return preset.label || REVIEW_SCOPE_LABELS[scope];\n}\n\n/** Adds scope-aware display labels to review items without mutating them. */\nexport function getNumberedReviewItems(\n items: ReviewItem[],\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): NumberedReviewItem[] {\n const draftLabels = new Map<string, string>();\n let nextDraftNumber = 1;\n\n [...items]\n .sort((a, b) => {\n const createdOrder = a.createdAt.localeCompare(b.createdAt);\n if (createdOrder !== 0) return createdOrder;\n return a.id.localeCompare(b.id);\n })\n .forEach((item) => {\n if (!getReviewItemNumber(item)) {\n draftLabels.set(item.id, `draft-${nextDraftNumber++}`);\n }\n });\n\n return items.map((item) => {\n const scope = getReviewItemScope(item, presets);\n const label = getReviewItemScopeLabel(item, presets);\n const number = getReviewItemNumber(item);\n\n return {\n item,\n scope,\n label,\n number,\n displayLabel: number ? `#${number}` : draftLabels.get(item.id) ?? 'draft',\n };\n });\n}\n\n/** Reads a persisted review number when present. */\nexport function getReviewItemNumber(item: Pick<ReviewItem, 'reviewNumber'>) {\n return normalizeReviewNumber(item.reviewNumber);\n}\n\n\nfunction normalizeReviewNumber(value: unknown) {\n if (typeof value !== 'number') return undefined;\n if (!Number.isInteger(value) || value < 1) return undefined;\n return value;\n}\n","import type {\n DomAnchor,\n RelativeSelection,\n ReviewItem,\n ReviewItemScope,\n ReviewMarker,\n ReviewSelection,\n} from '../../types';\nimport {\n getElementViewportSelection,\n getRelativePoint,\n resolveAnchorElement,\n} from '../dom.anchor';\nimport {\n getSelectionCenter,\n isRelativeSelection,\n isSelectionInViewport,\n roundPoint,\n toViewportSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from '../geometry';\n\n/** Rendering mode used by marker and highlight overlays. */\nexport type ReviewItemHighlightMode = 'note' | 'area' | 'dom';\n\n/** Target-space highlight rectangle plus whether it was rebound to an anchor. */\nexport interface ReviewItemHighlightSelection {\n viewport: ViewportSelection;\n isBound: boolean;\n}\n\n/** Resolves a review marker to its current viewport point, with scroll fallback. */\nexport function getBoundMarkerPoint(\n item: ReviewItem,\n environment: ReviewEnvironment\n) {\n const marker = getItemMarker(item);\n if (!marker) return undefined;\n\n // Prefer anchor-relative positions because absolute viewport points drift after layout changes.\n if (item.kind !== 'area' && item.anchor && marker.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: roundPoint({\n x: rect.left + rect.width * marker.relative.x,\n y: rect.top + rect.height * marker.relative.y,\n }),\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n\n return {\n viewport: roundPoint({\n x: marker.viewport.x + sourceScroll.x - environment.window.scrollX,\n y: marker.viewport.y + sourceScroll.y - environment.window.scrollY,\n }),\n isBound: false,\n confidence: 0,\n };\n}\n\n/** Chooses the best visible highlight selection for the current target viewport. */\nexport function getItemHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (item.kind === 'area') {\n return getVisibleHighlightSelection(\n [\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n if (isDomReviewItem(item)) {\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n}\n\n/** Maps an item to its overlay visual treatment. */\nexport function getReviewItemHighlightMode(\n item: ReviewItem\n): ReviewItemHighlightMode {\n if (isDomReviewItem(item)) return 'dom';\n if (item.kind === 'area') return 'area';\n return 'note';\n}\n\n/** Returns an explicit marker or derives one from the item's selection center. */\nexport function getItemMarker(item: ReviewItem): ReviewMarker | undefined {\n if (item.marker) return item.marker;\n\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n return {\n viewport: roundPoint(getSelectionCenter(selection.viewport)),\n relative: selection.relative\n ? roundPoint(getSelectionCenter(selection.relative))\n : undefined,\n };\n}\n\n/** Normalizes current and legacy selection shapes into ReviewSelection. */\nexport function getItemSelection(item: ReviewItem): ReviewSelection | undefined {\n const value = item.selection as ReviewSelection | RelativeSelection | undefined;\n if (!value) return undefined;\n\n if ('viewport' in value && isRelativeSelection(value.viewport)) {\n return value;\n }\n\n if (isRelativeSelection(value)) {\n return {\n viewport: value,\n };\n }\n\n return undefined;\n}\n\n/** Filters markers to the active viewport scope. */\nexport function shouldShowMarkerForScope(\n scope: ReviewItemScope,\n currentScope: ReviewItemScope\n) {\n return scope === currentScope;\n}\n\n/** Creates a marker at the selection center and stores an anchor-relative fallback. */\nexport function createSelectionCenterMarker(\n selection: ViewportSelection,\n anchor: DomAnchor | undefined,\n environment: ReviewEnvironment\n): ReviewMarker {\n const centerPoint = getSelectionCenter(selection);\n\n return {\n viewport: roundPoint(centerPoint),\n relative: anchor ? getRelativePoint(centerPoint, anchor, environment) : undefined,\n };\n}\n\nfunction getBoundSelection(item: ReviewItem, environment: ReviewEnvironment) {\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n // Rebuild the rectangle from the anchor when possible, then fall back to scroll offset.\n if (item.kind !== 'area' && item.anchor && selection.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: {\n left: rect.left + rect.width * selection.relative.x,\n top: rect.top + rect.height * selection.relative.y,\n width: rect.width * selection.relative.width,\n height: rect.height * selection.relative.height,\n },\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n const viewportSelection = toViewportSelection(selection.viewport);\n\n return {\n viewport: {\n left: viewportSelection.left + sourceScroll.x - environment.window.scrollX,\n top: viewportSelection.top + sourceScroll.y - environment.window.scrollY,\n width: viewportSelection.width,\n height: viewportSelection.height,\n },\n isBound: item.kind === 'area',\n confidence: 0,\n };\n}\n\nfunction getAnchorHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (!item.anchor) return undefined;\n\n const viewport = getElementViewportSelection(item.anchor, environment);\n if (!viewport) return undefined;\n\n return {\n viewport,\n isBound: true,\n };\n}\n\nfunction getPointHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n const point = getBoundMarkerPoint(item, environment);\n if (!point) return undefined;\n\n const size = 16;\n return {\n viewport: {\n left: point.viewport.x - size / 2,\n top: point.viewport.y - size / 2,\n width: size,\n height: size,\n },\n isBound: point.isBound,\n };\n}\n\nfunction getVisibleHighlightSelection(\n candidates: Array<ReviewItemHighlightSelection | undefined>,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n // Candidate order encodes item-type priority; this only discards offscreen options.\n return candidates.find(\n (candidate): candidate is ReviewItemHighlightSelection =>\n Boolean(candidate && isSelectionInViewport(candidate.viewport, environment))\n );\n}\n\nfunction isDomReviewItem(item: ReviewItem) {\n return (\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && getItemSelection(item)))\n );\n}\n","import type { ReviewEnvironment } from './geometry';\n\n/** Waits one target animation frame before reading/restoring overlay state. */\nexport function waitForNextFrame(environment?: ReviewEnvironment) {\n return new Promise<void>((resolve) => {\n (environment?.window ?? window).requestAnimationFrame(() => resolve());\n });\n}\n\n/** Temporarily disables smooth scroll so restore lands synchronously. */\nexport function runWithAutoScrollBehavior(\n targetDocument: Document,\n callback: () => void\n) {\n const elements = [\n targetDocument.documentElement,\n targetDocument.body,\n ].filter((element): element is HTMLElement => Boolean(element));\n const previousValues = elements.map((element) => element.style.scrollBehavior);\n\n elements.forEach((element) => {\n element.style.scrollBehavior = 'auto';\n });\n\n try {\n callback();\n } finally {\n elements.forEach((element, index) => {\n element.style.scrollBehavior = previousValues[index] ?? '';\n });\n }\n}\n\n/** Restores target document scroll without relying on smooth scrolling behavior. */\nexport function setDocumentScrollInstantly(\n environment: ReviewEnvironment,\n position: { x: number; y: number }\n) {\n const scrollElement = environment.document.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = Math.max(0, Math.round(position.x));\n scrollElement.scrollTop = Math.max(0, Math.round(position.y));\n return;\n }\n\n environment.window.scrollTo(\n Math.max(0, Math.round(position.x)),\n Math.max(0, Math.round(position.y))\n );\n}\n","/** Creates the shadow-root stylesheet for the standalone core overlay. */\nexport function createStyleElement() {\n const style = document.createElement('style');\n style.textContent = `\n :host {\n color-scheme: dark;\n --df-review-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --df-review-font-size-2xs: 10px;\n --df-review-font-size-xs: 11px;\n --df-review-font-size-sm: 12px;\n --df-review-font-size-md: 13px;\n --df-review-font-size-xl: 15px;\n --df-review-space-1: 4px;\n --df-review-space-1-5: 6px;\n --df-review-space-2: 8px;\n --df-review-space-2-5: 10px;\n --df-review-space-3: 12px;\n --df-review-space-3-5: 14px;\n --df-review-space-4: 16px;\n --df-review-control-height-sm: 32px;\n --df-review-control-height-md: 34px;\n --df-review-radius-xs: 3px;\n --df-review-radius-sm: 6px;\n --df-review-radius-md: 8px;\n --df-review-radius-pill: 999px;\n --df-review-color-canvas: #111820;\n --df-review-color-panel: #1f2428;\n --df-review-color-panel-strong: #15191d;\n --df-review-color-control: #2c3338;\n --df-review-color-control-hover: #3b444b;\n --df-review-color-border: rgba(255, 255, 255, 0.14);\n --df-review-color-border-strong: rgba(255, 255, 255, 0.18);\n --df-review-color-text: #f7f7f2;\n --df-review-color-text-muted: rgba(247, 247, 242, 0.62);\n --df-review-color-text-subtle: rgba(247, 247, 242, 0.46);\n --df-review-color-accent: #d7ff5f;\n --df-review-color-accent-contrast: #171b1e;\n --df-review-color-accent-soft: rgba(215, 255, 95, 0.16);\n --df-review-color-accent-ring: rgba(215, 255, 95, 0.6);\n --df-review-color-area: #63d7c7;\n --df-review-color-error: #ffb7a7;\n --df-review-shadow-panel: 0 18px 48px rgba(0, 0, 0, 0.34);\n --df-review-shadow-popover: 0 16px 38px rgba(0, 0, 0, 0.32);\n --df-review-shadow-highlight: 0 10px 30px rgba(0, 0, 0, 0.22);\n font-family: var(--df-review-font-sans);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .dfwr-shell {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 500;\n pointer-events: none;\n }\n\n .dfwr-shell.is-open {\n display: block;\n }\n\n .dfwr-shell.has-dismissible-draft {\n z-index: 900;\n }\n\n .dfwr-draft-cancel-layer {\n position: fixed;\n inset: 0;\n z-index: 2;\n pointer-events: auto;\n background: transparent;\n cursor: default;\n }\n\n .dfwr-panel {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 3;\n width: min(380px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-panel);\n }\n\n .dfwr-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n padding: 14px 14px 10px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n }\n\n .dfwr-title {\n font-size: 15px;\n font-weight: 700;\n line-height: 1.25;\n }\n\n .dfwr-meta {\n max-width: 292px;\n margin-top: 4px;\n overflow: hidden;\n color: rgba(247, 247, 242, 0.56);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dfwr-toolbar,\n .dfwr-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 14px;\n }\n\n .dfwr-body,\n .dfwr-list {\n padding: 0 14px 14px;\n }\n\n .dfwr-list {\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n padding-top: 12px;\n }\n\n .dfwr-button,\n .dfwr-icon-button {\n appearance: none;\n border: 1px solid var(--df-review-color-border-strong);\n background: var(--df-review-color-control);\n color: var(--df-review-color-text);\n cursor: pointer;\n font: inherit;\n }\n\n .dfwr-button {\n min-height: var(--df-review-control-height-md);\n padding: 0 12px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-sm);\n font-weight: 650;\n }\n\n .dfwr-button:hover,\n .dfwr-icon-button:hover,\n .dfwr-button.is-active {\n border-color: rgba(255, 255, 255, 0.4);\n background: var(--df-review-color-control-hover);\n }\n\n .dfwr-button.is-primary {\n border-color: var(--df-review-color-accent);\n background: var(--df-review-color-accent);\n color: var(--df-review-color-accent-contrast);\n }\n\n .dfwr-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: var(--df-review-control-height-sm);\n padding: 0 8px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-xs);\n font-weight: 700;\n line-height: 1;\n text-transform: uppercase;\n }\n\n .dfwr-marker-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n }\n\n .dfwr-area-preview-layer {\n position: fixed;\n inset: 0;\n z-index: 3;\n pointer-events: none;\n }\n\n .dfwr-selection-highlight {\n position: fixed;\n z-index: 1;\n border: 2px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.12),\n 0 10px 30px rgba(0, 0, 0, 0.22);\n animation: dfwr-selection-pulse 900ms ease 0s 2;\n }\n\n .dfwr-selection-highlight.is-draft {\n border-color: #63d7c7;\n background: rgba(99, 215, 199, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 10px 30px rgba(0, 0, 0, 0.2);\n animation: none;\n }\n\n .dfwr-dom-hover {\n position: fixed;\n z-index: 2;\n border: 1px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08);\n pointer-events: none;\n }\n\n .dfwr-dom-hover[hidden] {\n display: none;\n }\n\n .dfwr-bound-marker,\n .dfwr-item-scope {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n }\n\n .dfwr-bound-marker.is-scope-tablet,\n .dfwr-item-scope.is-scope-tablet {\n --dfwr-scope: #63d7c7;\n --dfwr-scope-rgb: 99, 215, 199;\n }\n\n .dfwr-bound-marker.is-scope-desktop,\n .dfwr-item-scope.is-scope-desktop {\n --dfwr-scope: #f3b75f;\n --dfwr-scope-rgb: 243, 183, 95;\n }\n\n .dfwr-bound-marker.is-scope-wide,\n .dfwr-item-scope.is-scope-wide {\n --dfwr-scope: #c99cff;\n --dfwr-scope-rgb: 201, 156, 255;\n }\n\n .dfwr-bound-marker.is-scope-dom,\n .dfwr-item-scope.is-scope-dom {\n --dfwr-scope: #ff8f61;\n --dfwr-scope-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight,\n .dfwr-item-target-label {\n --dfwr-item-color: #7cc7ff;\n --dfwr-item-color-rgb: 124, 199, 255;\n }\n\n .dfwr-item-target-highlight.is-mode-area,\n .dfwr-item-target-label.is-mode-area {\n --dfwr-item-color: #63d7c7;\n --dfwr-item-color-rgb: 99, 215, 199;\n }\n\n .dfwr-item-target-highlight.is-mode-dom,\n .dfwr-item-target-label.is-mode-dom {\n --dfwr-item-color: #ff8f61;\n --dfwr-item-color-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight {\n position: fixed;\n z-index: 2;\n border: 2px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: rgba(var(--dfwr-item-color-rgb), 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.78),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 12px 30px rgba(0, 0, 0, 0.24);\n pointer-events: none;\n }\n\n .dfwr-item-target-highlight.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-item-target-highlight.is-highlighted {\n border-width: 3px;\n background: rgba(var(--dfwr-item-color-rgb), 0.12);\n }\n\n .dfwr-item-target-highlight.is-highlighted::after {\n content: \"\";\n position: absolute;\n inset: -6px;\n border: 2px solid var(--dfwr-item-color);\n border-radius: var(--df-review-radius-md);\n opacity: 0;\n animation: dfwr-target-ring-blink 1000ms ease-in-out infinite;\n pointer-events: none;\n }\n\n .dfwr-item-target-label {\n position: fixed;\n z-index: 3;\n display: inline-flex;\n align-items: center;\n min-width: 24px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: var(--dfwr-item-color);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-item-color-rgb), 0.2),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n pointer-events: none;\n }\n\n .dfwr-item-target-label.is-highlighted {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker {\n position: fixed;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n min-width: 28px;\n height: 22px;\n padding: 0 6px;\n transform: translate(-50%, -50%);\n border: 1px solid var(--dfwr-scope);\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-panel);\n box-shadow: 0 0 0 4px rgba(var(--dfwr-scope-rgb), 0.18);\n color: var(--dfwr-scope);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n }\n\n .dfwr-bound-marker.is-highlighted {\n min-width: 32px;\n height: 26px;\n border-width: 2px;\n box-shadow:\n 0 0 0 5px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 12px 26px rgba(0, 0, 0, 0.34);\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-bound-marker.is-note-callout,\n .dfwr-bound-marker.is-note-callout.is-highlighted {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n min-width: 0;\n width: 0;\n height: 0;\n padding: 0;\n transform: none;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n color: var(--dfwr-scope);\n animation: none;\n overflow: visible;\n }\n\n .dfwr-bound-marker.is-note-callout::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n width: 8px;\n height: 8px;\n transform: translate(-50%, -50%);\n border: 2px solid #111820;\n border-radius: var(--df-review-radius-pill);\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 6px 16px rgba(0, 0, 0, 0.28);\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted::before {\n animation: dfwr-note-dot-pulse 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon {\n position: absolute;\n left: 0;\n top: 0;\n width: 31px;\n height: 2px;\n transform: rotate(-42deg);\n transform-origin: left center;\n border-radius: var(--df-review-radius-pill);\n background: currentColor;\n opacity: 1;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::after {\n display: none;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-number {\n position: absolute;\n left: 24px;\n top: -41px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-scope);\n border-radius: 4px;\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.18),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n text-align: center;\n line-height: 1;\n white-space: nowrap;\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-icon,\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-number {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-area-preview-layer .dfwr-bound-marker {\n border-color: #63d7c7;\n background: var(--df-review-color-panel);\n box-shadow:\n 0 0 0 5px rgba(99, 215, 199, 0.2),\n 0 12px 26px rgba(0, 0, 0, 0.3);\n color: #63d7c7;\n }\n\n .dfwr-bound-marker-icon {\n position: relative;\n display: inline-block;\n width: 10px;\n height: 10px;\n flex: 0 0 auto;\n }\n\n .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker-icon::after {\n content: \"\";\n position: absolute;\n display: block;\n }\n\n .dfwr-bound-marker-icon::before {\n inset: 1px 2px;\n border: 1.5px solid currentColor;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-mobile .dfwr-bound-marker-icon::before {\n inset: 0 2.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-tablet .dfwr-bound-marker-icon::before {\n inset: 0.5px 1.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::before {\n inset: 1px 0 3px;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::after {\n left: 3px;\n right: 3px;\n bottom: 0;\n height: 1.5px;\n background: currentColor;\n }\n\n .dfwr-bound-marker.is-scope-wide .dfwr-bound-marker-icon::before {\n inset: 2px 0;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-dom .dfwr-bound-marker-icon::before {\n inset: 2px;\n border-radius: 1px;\n transform: rotate(45deg);\n }\n\n .dfwr-bound-marker-number {\n min-width: 6px;\n text-align: center;\n line-height: 1;\n }\n\n .dfwr-note-draft {\n position: fixed;\n inset: 0;\n z-index: 4;\n pointer-events: none;\n }\n\n .dfwr-note-pin {\n appearance: none;\n position: fixed;\n z-index: 5;\n width: 18px;\n height: 18px;\n padding: 0;\n transform: translate(-50%, -50%);\n border: 2px solid #1f2428;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-accent);\n box-shadow:\n 0 0 0 4px rgba(215, 255, 95, 0.22),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n cursor: grab;\n pointer-events: auto;\n }\n\n .dfwr-note-pin:active {\n cursor: grabbing;\n }\n\n .dfwr-note-popover {\n position: fixed;\n z-index: 4;\n width: min(320px, calc(100vw - 24px));\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-note-popover.is-composer,\n .dfwr-area-draft.is-composer {\n max-height: min(360px, calc(100vh - 32px));\n overflow: auto;\n border-color: rgba(99, 215, 199, 0.56);\n }\n\n .dfwr-note-popover.is-dragging,\n .dfwr-area-draft.is-dragging {\n user-select: none;\n }\n\n .dfwr-draft-drag-handle {\n display: block;\n width: 42px;\n height: 6px;\n margin: 0 auto 10px;\n padding: 0;\n cursor: grab;\n pointer-events: auto;\n background: rgba(247, 247, 242, 0.28);\n border: 0;\n border-radius: 999px;\n }\n\n .dfwr-draft-drag-handle:hover,\n .dfwr-draft-drag-handle:focus-visible {\n background: rgba(215, 255, 95, 0.62);\n }\n\n .dfwr-draft-drag-handle:active {\n cursor: grabbing;\n }\n\n .dfwr-area-draft {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 4;\n width: min(360px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-note-popover .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-note-actions {\n justify-content: flex-end;\n }\n\n .dfwr-note-actions .dfwr-button:first-child {\n margin-right: auto;\n }\n\n .dfwr-area-draft .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-form {\n display: grid;\n gap: 10px;\n }\n\n .dfwr-textarea {\n width: 100%;\n min-height: 92px;\n resize: vertical;\n border: 1px solid rgba(255, 255, 255, 0.16);\n border-radius: var(--df-review-radius-sm);\n padding: 10px;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel-strong);\n font: inherit;\n font-size: var(--df-review-font-size-md);\n line-height: 1.45;\n }\n\n .dfwr-textarea:focus {\n outline: 2px solid var(--df-review-color-accent-ring);\n outline-offset: 1px;\n }\n\n .dfwr-adjust-panel {\n display: grid;\n gap: 4px;\n padding: 8px 10px;\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-radius: var(--df-review-radius-sm);\n background: rgba(255, 255, 255, 0.04);\n }\n\n .dfwr-adjust-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n min-width: 0;\n }\n\n .dfwr-adjust-panel-header .dfwr-adjust-help {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .dfwr-adjust-panel.is-active {\n border-color: rgba(215, 255, 95, 0.5);\n background: var(--df-review-color-accent-soft);\n }\n\n .dfwr-adjust-help,\n .dfwr-adjust-status {\n margin: 0;\n color: var(--df-review-color-text-muted);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n }\n\n .dfwr-adjust-status {\n color: var(--df-review-color-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n }\n\n .dfwr-adjust-toggle {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 30px;\n padding: 0;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: var(--df-review-radius-sm);\n background: rgba(255, 255, 255, 0.04);\n color: var(--df-review-color-text);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n font-weight: 800;\n line-height: 1;\n }\n\n .dfwr-adjust-toggle:hover,\n .dfwr-adjust-toggle:focus-visible,\n .dfwr-adjust-toggle.is-active {\n border-color: rgba(215, 255, 95, 0.68);\n background: var(--df-review-color-accent-soft);\n outline: none;\n }\n\n .dfwr-adjust-toggle svg {\n width: 18px;\n height: 18px;\n pointer-events: none;\n }\n\n .dfwr-adjust-hud {\n position: fixed;\n z-index: 5;\n display: inline-flex;\n align-items: center;\n min-height: 22px;\n padding: 0 8px;\n border: 1px solid rgba(99, 215, 199, 0.72);\n border-radius: var(--df-review-radius-sm);\n background: rgba(21, 25, 29, 0.92);\n box-shadow:\n 0 0 0 3px rgba(99, 215, 199, 0.14),\n 0 8px 18px rgba(0, 0, 0, 0.26);\n color: #63d7c7;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 1;\n pointer-events: none;\n white-space: nowrap;\n }\n\n .dfwr-adjust-hud[hidden] {\n display: none;\n }\n\n .dfwr-empty,\n .dfwr-error {\n margin: 0;\n color: rgba(247, 247, 242, 0.62);\n font-size: var(--df-review-font-size-sm);\n line-height: 1.45;\n }\n\n .dfwr-error {\n color: var(--df-review-color-error);\n }\n\n .dfwr-preview,\n .dfwr-thumb {\n display: block;\n width: 100%;\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-sm);\n object-fit: cover;\n background: var(--df-review-color-canvas);\n }\n\n .dfwr-preview {\n max-height: 180px;\n }\n\n .dfwr-thumb {\n max-height: 120px;\n margin-top: 10px;\n }\n\n .dfwr-list-heading {\n margin-bottom: 10px;\n color: rgba(247, 247, 242, 0.74);\n font-size: var(--df-review-font-size-sm);\n font-weight: 700;\n }\n\n .dfwr-item {\n display: flex;\n gap: 12px;\n justify-content: space-between;\n padding: 12px 0;\n border-top: 1px solid rgba(255, 255, 255, 0.08);\n cursor: pointer;\n }\n\n .dfwr-item:first-of-type {\n border-top: 0;\n }\n\n .dfwr-item:focus-visible {\n outline: 2px solid rgba(215, 255, 95, 0.72);\n outline-offset: 4px;\n }\n\n .dfwr-item-body {\n min-width: 0;\n flex: 1;\n }\n\n .dfwr-item-badges {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n }\n\n .dfwr-item-scope,\n .dfwr-item-kind {\n display: inline-flex;\n align-items: center;\n min-height: 20px;\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 1;\n letter-spacing: 0;\n text-transform: uppercase;\n }\n\n .dfwr-item-scope {\n border: 1px solid rgba(var(--dfwr-scope-rgb), 0.38);\n background: rgba(var(--dfwr-scope-rgb), 0.12);\n color: var(--dfwr-scope);\n }\n\n .dfwr-item-kind {\n border: 1px solid rgba(255, 255, 255, 0.12);\n background: rgba(255, 255, 255, 0.05);\n color: rgba(247, 247, 242, 0.64);\n }\n\n .dfwr-item-comment {\n margin: 4px 0;\n color: var(--df-review-color-text);\n font-size: var(--df-review-font-size-md);\n line-height: 1.42;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n .dfwr-item-date {\n color: rgba(247, 247, 242, 0.46);\n font-size: var(--df-review-font-size-xs);\n }\n\n .dfwr-item-actions {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex: 0 0 auto;\n }\n\n .dfwr-text-layer,\n .dfwr-element-layer,\n .dfwr-area-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: auto;\n }\n\n .dfwr-text-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-element-layer {\n cursor: cell;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-area-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.22);\n }\n\n .dfwr-area-box {\n position: fixed;\n z-index: 2;\n width: 0;\n height: 0;\n border: 1px solid #d7ff5f;\n background: rgba(215, 255, 95, 0.16);\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.18);\n }\n\n @keyframes dfwr-marker-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.92);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.1);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-note-dot-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.88);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.3);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-selected-blink {\n 0%,\n 100% {\n opacity: 0.78;\n }\n 50% {\n opacity: 1;\n }\n }\n\n @keyframes dfwr-target-ring-blink {\n 0%,\n 100% {\n opacity: 0;\n transform: scale(0.98);\n }\n 50% {\n opacity: 0.82;\n transform: scale(1);\n }\n }\n\n @keyframes dfwr-selection-pulse {\n 0% {\n opacity: 0.72;\n }\n 45% {\n opacity: 1;\n }\n 100% {\n opacity: 0.86;\n }\n }\n\n @media (max-width: 520px) {\n .dfwr-panel {\n right: 8px;\n top: 8px;\n width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n }\n }\n `;\n return style;\n}\n","import type {\n DomAnchor,\n RelativeSelection,\n ReviewItem,\n ReviewPoint,\n ViewportSize,\n} from '../../types';\nimport { getAnchorCandidates } from '../dom.anchor';\nimport type { AreaDraft, NoteDraft } from './draft';\nimport { getItemMarker, getItemSelection } from './item';\n\n/** Formats area draft metadata for compact debug display in the overlay UI. */\nexport function formatAreaDraftMeta(draft: AreaDraft) {\n const parts = [`viewport ${formatSize(draft.viewport)}`];\n\n if (draft.selection) {\n parts.push(`rect ${formatSelection(draft.selection.viewport)}`);\n }\n\n if (draft.marker) {\n parts.push(`point ${formatPoint(draft.marker.viewport)}`);\n }\n\n return parts.join(' / ');\n}\n\n/** Formats note draft metadata for compact debug display in the overlay UI. */\nexport function formatNoteDraftMeta(draft: NoteDraft) {\n const parts = [\n `viewport ${formatSize(draft.viewport)}`,\n `point ${formatPoint(draft.marker.viewport)}`,\n ];\n\n if (draft.anchor) {\n parts.push(formatAnchorMeta(draft.anchor));\n }\n\n return parts.join(' / ');\n}\n\n/** Formats persisted item metadata for list rows, marker titles, and overlays. */\nexport function formatItemMeta(item: ReviewItem) {\n const parts = [formatDate(item.createdAt)];\n const marker = getItemMarker(item);\n const selection = getItemSelection(item);\n\n if (item.viewport) {\n parts.push(`viewport ${formatSize(item.viewport)}`);\n }\n\n if (marker) {\n parts.push(`point ${formatPoint(marker.viewport)}`);\n }\n\n if (selection) {\n parts.push(`rect ${formatSelection(selection.viewport)}`);\n }\n\n if (item.anchor) {\n parts.push(formatAnchorMeta(item.anchor));\n }\n\n return parts.join(' / ');\n}\n\nfunction formatDate(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return date.toLocaleString(undefined, {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction formatSize(size: ViewportSize) {\n return `${Math.round(size.width)}x${Math.round(size.height)}`;\n}\n\nfunction formatPoint(point: ReviewPoint) {\n return `${Math.round(point.x)},${Math.round(point.y)}`;\n}\n\nfunction formatSelection(selection: RelativeSelection) {\n return [\n Math.round(selection.x),\n Math.round(selection.y),\n Math.round(selection.width),\n Math.round(selection.height),\n ].join(',');\n}\n\nfunction formatAnchorMeta(anchor: DomAnchor) {\n const parts = [`dom ${anchor.strategy}`];\n\n if (typeof anchor.confidence === 'number') {\n parts.push(`${Math.round(anchor.confidence * 100)}%`);\n }\n\n const candidates = getAnchorCandidates(anchor);\n if (candidates.length > 1) {\n parts.push(`${candidates.length} candidates`);\n }\n\n return parts.join(' ');\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemScope,\n ReviewMode,\n ReviewPoint,\n ViewportSize,\n WebReviewKitOptions,\n} from '../types';\nimport {\n getDomAnchorFromPoint,\n getElementViewportSelection,\n resolveAnchorElement,\n} from './dom.anchor';\nimport {\n clampPoint,\n clamp,\n getPopoverPosition,\n getViewportSize,\n isPointInViewport,\n placeLayerOverTarget,\n roundPoint,\n toHostPoint,\n toHostSelection,\n toTargetPoint,\n toTargetPointFromHostEvent,\n toViewportSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\nimport { getRouteKey } from './location';\nimport { createStyleElement } from './overlay.style';\nimport type { AreaDraft, NoteDraft } from './review/draft';\nimport { formatItemMeta, formatNoteDraftMeta } from './review/format';\nimport {\n getBoundMarkerPoint,\n getItemHighlightSelection,\n getReviewItemHighlightMode,\n shouldShowMarkerForScope,\n} from './review/item';\nimport {\n findReviewViewportPreset,\n getNumberedReviewItems,\n getReviewViewportScope,\n} from './review/scope';\n\n/** Minimal item payload collected by the view before the app fills persistence metadata. */\nexport type CreateReviewItemInput = Pick<ReviewItem, 'kind' | 'comment'> &\n Partial<\n Pick<ReviewItem, 'scope' | 'viewport' | 'anchor' | 'marker' | 'selection'>\n >;\n\nconst DEFAULT_ADJUSTMENT_LABEL = 'Responsive CSS px adjustments';\n\ninterface WebReviewKitViewState {\n isOpen: boolean;\n mode: ReviewMode;\n items: ReviewItem[];\n noteDraft?: NoteDraft;\n areaDraft?: AreaDraft;\n isSelectingArea: boolean;\n highlightedItemId?: string;\n}\n\ninterface WebReviewKitViewActions {\n close: () => void;\n render: () => void;\n reload: () => Promise<ReviewItem[]>;\n restoreItem: (item: ReviewItem) => Promise<void>;\n removeItem: (itemId: string) => Promise<void>;\n setModeState: (mode: ReviewMode) => void;\n clearDrafts: () => void;\n setNoteDraft: (draft?: NoteDraft) => void;\n setAreaDraft: (draft?: AreaDraft) => void;\n setSelectingArea: (isSelectingArea: boolean) => void;\n createItem: (input: CreateReviewItemInput) => Promise<void>;\n bindNoteDraftToPoint: (point: ReviewPoint, comment?: string) => Promise<void>;\n bindElementDraftToPoint: (\n point: ReviewPoint,\n comment?: string\n ) => Promise<void>;\n createAreaDraft: (selection: ViewportSelection) => Promise<void>;\n}\n\ninterface WebReviewKitViewConfig {\n options: WebReviewKitOptions;\n getState: () => WebReviewKitViewState;\n getEnvironment: () => ReviewEnvironment | undefined;\n actions: WebReviewKitViewActions;\n}\n\ntype DraftPreviewElement = HTMLElement | SVGElement;\n\ninterface DraftPreviewSnapshot {\n element: DraftPreviewElement;\n transform: string;\n transformOrigin: string;\n transition: string;\n willChange: string;\n baseTransform: string;\n}\n\n/** Vanilla DOM renderer for the core overlay, separate from React shell chrome. */\nexport class WebReviewKitView {\n private draftPreview?: DraftPreviewSnapshot;\n\n constructor(private readonly config: WebReviewKitViewConfig) {}\n\n clearDraftPreview() {\n this.restoreDraftPreview();\n }\n\n render(shadow: ShadowRoot, hiddenItemsStyle: HTMLStyleElement) {\n const state = this.state;\n this.syncDraftPreview(\n state.isOpen && state.mode === 'element' ? state.noteDraft : undefined\n );\n\n shadow.replaceChildren();\n shadow.append(createStyleElement());\n shadow.append(hiddenItemsStyle);\n\n const hasDismissableDraft = Boolean(state.noteDraft || state.areaDraft);\n const shell = document.createElement('div');\n shell.className = [\n 'dfwr-shell',\n state.isOpen ? 'is-open' : '',\n hasDismissableDraft ? 'has-dismissible-draft' : '',\n ]\n .filter(Boolean)\n .join(' ');\n shell.setAttribute('aria-hidden', state.isOpen ? 'false' : 'true');\n\n if (this.config.options.ui?.panel !== false) {\n // Standalone core usage gets a built-in panel; React shell disables this.\n const panel = document.createElement('div');\n panel.className = 'dfwr-panel';\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-label', 'Web review kit');\n\n panel.append(\n this.createHeader(),\n this.createToolbar(),\n this.createBody(),\n this.createList()\n );\n\n shell.append(panel);\n }\n\n shell.append(this.createMarkerLayer());\n if (state.isOpen && hasDismissableDraft) {\n shell.append(this.createDraftCancelLayer());\n }\n\n if (state.isOpen && (state.mode === 'note' || state.mode === 'element')) {\n shell.append(\n state.noteDraft\n ? this.createNotePopover(state.noteDraft)\n : state.mode === 'element'\n ? this.createElementLayer()\n : this.createNoteLayer()\n );\n }\n\n if (state.isOpen && state.mode === 'area' && !state.areaDraft) {\n shell.append(this.createAreaLayer());\n }\n\n if (\n state.isOpen &&\n state.mode === 'area' &&\n state.areaDraft &&\n this.config.options.ui?.panel === false\n ) {\n // Shell mode renders the draft form near the target because the side panel is React-owned.\n if (state.areaDraft.selection) {\n shell.append(this.createAreaDraftOverlay(state.areaDraft));\n }\n shell.append(this.createAreaDraftPopover(state.areaDraft));\n }\n\n shadow.append(shell);\n }\n\n private get state() {\n return this.config.getState();\n }\n\n private createDraftCancelLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-draft-cancel-layer';\n layer.setAttribute('aria-hidden', 'true');\n\n const cancel = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n this.config.actions.setModeState('idle');\n this.config.actions.clearDrafts();\n this.config.actions.setSelectingArea(false);\n this.config.actions.render();\n };\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n cancel(event);\n });\n layer.addEventListener('click', cancel);\n\n return layer;\n }\n\n private getDraftAdjustmentMetrics(draft: NoteDraft) {\n const adjustment = draft.adjustment;\n const x = adjustment?.x ?? 0;\n const y = adjustment?.y ?? 0;\n const scale = adjustment?.scale ?? 0;\n const {\n scale: viewportScale,\n designWidth,\n presetLabel,\n } = this.getDraftViewportScale(draft.viewport);\n const selection = draft.selection\n ? toViewportSelection(draft.selection.viewport)\n : undefined;\n const scaleCssDelta = scale * viewportScale;\n const scaleFactor =\n selection && selection.width > 0\n ? Math.max(\n 1 / selection.width,\n (selection.width + scaleCssDelta) / selection.width\n )\n : 1;\n\n return {\n x,\n y,\n scale,\n cssX: x * viewportScale,\n cssY: y * viewportScale,\n scaleFactor,\n viewportScale,\n designWidth,\n presetLabel,\n viewportWidth: draft.viewport.width,\n };\n }\n\n private hasDraftAdjustment(draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return metrics.x !== 0 || metrics.y !== 0 || metrics.scale !== 0;\n }\n\n private getAdjustedDraftPoint(point: ReviewPoint, draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return {\n x: point.x + metrics.cssX,\n y: point.y + metrics.cssY,\n };\n }\n\n private getAdjustedDraftSelection(\n selection: ViewportSelection,\n draft: NoteDraft\n ) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return {\n ...selection,\n left: selection.left + metrics.cssX,\n top: selection.top + metrics.cssY,\n width: selection.width * metrics.scaleFactor,\n height: selection.height * metrics.scaleFactor,\n };\n }\n\n private getDraftViewportScale(viewport: ViewportSize) {\n const preset = findReviewViewportPreset(\n viewport,\n this.config.options.viewports?.presets\n );\n const designWidth =\n typeof preset.designWidth === 'number' && preset.designWidth > 0\n ? preset.designWidth\n : viewport.width;\n const scale = designWidth > 0 ? viewport.width / designWidth : 1;\n\n return { scale, designWidth, presetLabel: preset.label };\n }\n\n private getDraftComposerWidth(environment: ReviewEnvironment) {\n const bounds = environment.overlayRect;\n const margin = 12;\n return Math.min(360, Math.max(240, bounds.width - margin * 2));\n }\n\n private getClampedComposerPosition(\n position: ReviewPoint,\n environment: ReviewEnvironment,\n size?: { width?: number; height?: number },\n bounds = environment.overlayRect\n ) {\n const margin = 12;\n const width = size?.width ?? this.getDraftComposerWidth(environment);\n const height = size?.height ?? 236;\n\n return {\n x: clamp(\n position.x,\n bounds.left + margin,\n bounds.left + bounds.width - width - margin\n ),\n y: clamp(\n position.y,\n bounds.top + margin,\n bounds.top + bounds.height - height - margin\n ),\n };\n }\n\n private getHostComposerBounds() {\n const root = document.documentElement;\n return {\n left: 0,\n top: 0,\n width: root.clientWidth || window.innerWidth,\n height: root.clientHeight || window.innerHeight,\n };\n }\n\n private getInitialDraftComposerPosition(\n selection: ViewportSelection | undefined,\n environment: ReviewEnvironment,\n size: { width: number; height?: number }\n ) {\n const bounds = this.getHostComposerBounds();\n const margin = 12;\n const gap = 20;\n\n if (!selection) {\n return this.getClampedComposerPosition(\n {\n x: environment.overlayRect.left + margin,\n y: environment.overlayRect.top + margin,\n },\n environment,\n size,\n bounds\n );\n }\n\n const preferredX = selection.left + selection.width + gap;\n const maxX = bounds.left + bounds.width - size.width - margin;\n const x =\n preferredX <= maxX\n ? preferredX\n : selection.left - size.width - gap;\n\n return this.getClampedComposerPosition(\n {\n x,\n y: selection.top,\n },\n environment,\n size,\n bounds\n );\n }\n\n private getDraftComposerPosition({\n selection,\n environment,\n composerPosition,\n estimatedHeight,\n }: {\n selection?: ViewportSelection;\n environment: ReviewEnvironment;\n composerPosition?: ReviewPoint;\n estimatedHeight?: number;\n }) {\n const width = this.getDraftComposerWidth(environment);\n\n if (composerPosition) {\n const clamped = this.getClampedComposerPosition(\n composerPosition,\n environment,\n { width, height: estimatedHeight },\n this.getHostComposerBounds()\n );\n return { width, left: clamped.x, top: clamped.y };\n }\n\n const position = this.getInitialDraftComposerPosition(selection, environment, {\n width,\n height: estimatedHeight,\n });\n\n return { width, left: position.x, top: position.y };\n }\n\n private getSelectionMqMetrics(\n selection: ViewportSelection,\n viewport: ViewportSize\n ) {\n const { scale } = this.getDraftViewportScale(viewport);\n const ratio = scale > 0 ? 1 / scale : 1;\n\n return {\n x: selection.left * ratio,\n y: selection.top * ratio,\n width: selection.width * ratio,\n height: selection.height * ratio,\n };\n }\n\n private formatSignedPx(value: number) {\n if (value === 0) return '+0px';\n return `${value > 0 ? '+' : ''}${value}px`;\n }\n\n private formatRoundedPx(value: number) {\n return `${Math.round(value)}px`;\n }\n\n private getAdjustmentLabel() {\n return (\n this.config.options.adjustmentLabel?.trim() || DEFAULT_ADJUSTMENT_LABEL\n );\n }\n\n private getSelectionMetricLines(\n selection: ViewportSelection | undefined,\n viewport: ViewportSize\n ) {\n if (!selection) return ['area', 'x none / y none', 'w none / h none'];\n\n const metrics = this.getSelectionMqMetrics(selection, viewport);\n return [\n 'area',\n `x ${this.formatRoundedPx(metrics.x)} / y ${this.formatRoundedPx(\n metrics.y\n )}`,\n `w ${this.formatRoundedPx(metrics.width)} / h ${this.formatRoundedPx(\n metrics.height\n )}`,\n ];\n }\n\n private getAreaDraftMetricSelection(draft: AreaDraft) {\n if (!draft.selection) return undefined;\n\n return toViewportSelection(draft.selection.viewport);\n }\n\n private formatDraftAdjustmentStatus(draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return [\n `x ${this.formatSignedPx(metrics.x)}`,\n `y ${this.formatSignedPx(metrics.y)}`,\n `scale ${this.formatSignedPx(metrics.scale)}`,\n ].join(' / ');\n }\n\n private getDraftAdjustmentMetricLines(draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return [\n `x ${this.formatSignedPx(metrics.x)} / y ${this.formatSignedPx(\n metrics.y\n )}`,\n `scale ${this.formatSignedPx(metrics.scale)}`,\n ];\n }\n\n private withDraftAdjustmentComment(comment: string, draft: NoteDraft) {\n if (!this.hasDraftAdjustment(draft)) return comment;\n\n const metrics = this.getDraftAdjustmentMetrics(draft);\n const adjustment = [\n `${this.getAdjustmentLabel()}: x ${this.formatSignedPx(\n metrics.x\n )}, y ${this.formatSignedPx(metrics.y)}, scale ${this.formatSignedPx(\n metrics.scale\n )}`,\n `(${metrics.presetLabel} viewport, ${Math.round(\n metrics.viewportWidth\n )}/design ${Math.round(metrics.designWidth)})`,\n ].join(' ');\n\n return `${comment.trim()}\\n${adjustment}`;\n }\n\n private getStyleableDraftElement(\n draft: NoteDraft,\n environment: ReviewEnvironment\n ): DraftPreviewElement | undefined {\n if (!draft.anchor) return undefined;\n\n const element = resolveAnchorElement(draft.anchor, environment)?.element;\n if (!element) return undefined;\n\n if ('style' in element) return element as DraftPreviewElement;\n\n return undefined;\n }\n\n private syncDraftPreview(draft?: NoteDraft) {\n const environment = this.config.getEnvironment();\n if (!draft || !environment || !this.hasDraftAdjustment(draft)) {\n this.restoreDraftPreview();\n return;\n }\n\n const element = this.getStyleableDraftElement(draft, environment);\n if (!element) {\n this.restoreDraftPreview();\n return;\n }\n\n if (this.draftPreview?.element !== element) {\n this.restoreDraftPreview();\n }\n\n if (!this.draftPreview) {\n const computedTransform =\n environment.window.getComputedStyle(element).transform;\n this.draftPreview = {\n element,\n transform: element.style.transform,\n transformOrigin: element.style.transformOrigin,\n transition: element.style.transition,\n willChange: element.style.willChange,\n baseTransform:\n element.style.transform ||\n (computedTransform && computedTransform !== 'none'\n ? computedTransform\n : ''),\n };\n }\n\n const metrics = this.getDraftAdjustmentMetrics(draft);\n const translate = `translate(${this.toCssNumber(metrics.cssX)}px, ${this.toCssNumber(\n metrics.cssY\n )}px)`;\n const scale =\n metrics.scaleFactor === 1\n ? ''\n : `scale(${this.toCssNumber(metrics.scaleFactor)})`;\n element.style.transition = 'none';\n element.style.willChange = 'transform';\n element.style.transformOrigin = 'top left';\n element.style.transform = [\n this.draftPreview.baseTransform,\n translate,\n scale,\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n private restoreDraftPreview() {\n if (!this.draftPreview) return;\n\n const { element, transform, transformOrigin, transition, willChange } =\n this.draftPreview;\n element.style.transform = transform;\n element.style.transformOrigin = transformOrigin;\n element.style.transition = transition;\n element.style.willChange = willChange;\n this.draftPreview = undefined;\n }\n\n private toCssNumber(value: number) {\n return Math.round(value * 1000) / 1000;\n }\n\n private createHeader() {\n const header = document.createElement('div');\n header.className = 'dfwr-header';\n\n const title = document.createElement('div');\n title.className = 'dfwr-title';\n title.textContent = 'Review Kit';\n\n const meta = document.createElement('div');\n meta.className = 'dfwr-meta';\n meta.textContent = getRouteKey(this.config.getEnvironment());\n\n const titleGroup = document.createElement('div');\n titleGroup.append(title, meta);\n\n const close = document.createElement('button');\n close.className = 'dfwr-icon-button';\n close.type = 'button';\n close.textContent = 'x';\n close.setAttribute('aria-label', 'Close');\n close.addEventListener('click', () => this.config.actions.close());\n\n header.append(titleGroup, close);\n return header;\n }\n\n private createToolbar() {\n const toolbar = document.createElement('div');\n toolbar.className = 'dfwr-toolbar';\n\n toolbar.append(\n this.createToolbarButton('Note', this.state.mode === 'note', () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(mode === 'note' ? 'idle' : 'note');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }),\n this.createToolbarButton('Element', this.state.mode === 'element', () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(\n mode === 'element' ? 'idle' : 'element'\n );\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }),\n this.createToolbarButton(\n this.state.isSelectingArea ? 'Selecting' : 'Area',\n this.state.mode === 'area',\n () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(mode === 'area' ? 'idle' : 'area');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }\n ),\n this.createToolbarButton('Refresh', false, () => {\n void this.config.actions.reload();\n })\n );\n\n return toolbar;\n }\n\n private createToolbarButton(\n label: string,\n active: boolean,\n onClick: () => void\n ) {\n const button = document.createElement('button');\n button.className = `dfwr-button${active ? ' is-active' : ''}`;\n button.type = 'button';\n button.textContent = label;\n button.addEventListener('click', onClick);\n return button;\n }\n\n private createBody() {\n const body = document.createElement('div');\n body.className = 'dfwr-body';\n const state = this.state;\n\n if (state.mode === 'idle') {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Add a note or mark an area.';\n body.append(empty);\n return body;\n }\n\n if (state.mode === 'note' || state.mode === 'element') {\n body.append(this.createNoteBody());\n return body;\n }\n\n body.append(this.createAreaForm());\n return body;\n }\n\n private createNoteBody() {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = this.state.noteDraft\n ? 'Write the note in the page box.'\n : this.state.mode === 'element'\n ? 'Click an element to add QA.'\n : 'Click on the page to place a note.';\n return empty;\n }\n\n private createNotePopover(draft: NoteDraft) {\n const environment = this.config.getEnvironment();\n const group = document.createElement('div');\n group.className = 'dfwr-note-draft';\n if (!environment) return group;\n\n const isElementDraft = this.state.mode === 'element' && Boolean(draft.selection);\n const hostPoint = toHostPoint(\n isElementDraft\n ? this.getAdjustedDraftPoint(draft.marker.viewport, draft)\n : draft.marker.viewport,\n environment\n );\n let selectionHighlight: HTMLDivElement | undefined;\n\n if (draft.selection) {\n const selection = toViewportSelection(draft.selection.viewport);\n selectionHighlight = this.createSelectionHighlight(\n isElementDraft\n ? this.getAdjustedDraftSelection(selection, draft)\n : selection,\n environment,\n true\n );\n group.append(selectionHighlight);\n }\n\n const pin = document.createElement('button');\n pin.className = 'dfwr-note-pin';\n pin.type = 'button';\n pin.setAttribute('aria-label', 'Move note point');\n pin.style.left = `${hostPoint.x}px`;\n pin.style.top = `${hostPoint.y}px`;\n\n const popover = document.createElement('div');\n const position = getPopoverPosition(hostPoint, environment);\n\n popover.className = `dfwr-note-popover${\n isElementDraft ? ' is-composer' : ''\n }`;\n if (isElementDraft) {\n const selection = draft.selection\n ? toHostSelection(\n this.getAdjustedDraftSelection(\n toViewportSelection(draft.selection.viewport),\n draft\n ),\n environment\n )\n : undefined;\n const composer = this.getDraftComposerPosition({\n selection,\n environment,\n composerPosition: draft.composerPosition,\n estimatedHeight: 252,\n });\n popover.style.left = `${composer.left}px`;\n popover.style.top = `${composer.top}px`;\n popover.style.width = `${composer.width}px`;\n } else {\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n }\n\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n\n const meta = isElementDraft ? undefined : document.createElement('div');\n if (meta) {\n meta.className = 'dfwr-item-date';\n meta.textContent = formatNoteDraftMeta(draft);\n }\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Review comment';\n textarea.rows = 4;\n textarea.value = draft.comment ?? '';\n textarea.addEventListener('input', () => {\n const noteDraft = this.state.noteDraft;\n if (!noteDraft) return;\n this.config.actions.setNoteDraft({\n ...noteDraft,\n comment: textarea.value,\n });\n });\n\n const saveDraft = () => {\n const comment = textarea.value.trim();\n if (!comment) return;\n const currentDraft = this.state.noteDraft ?? draft;\n void this.config.actions.createItem({\n kind: 'note',\n comment: this.withDraftAdjustmentComment(comment, currentDraft),\n viewport: currentDraft.viewport,\n anchor: currentDraft.anchor,\n marker: currentDraft.marker,\n selection: currentDraft.selection,\n });\n };\n\n const adjustmentHud = isElementDraft\n ? this.createAdjustmentHud(draft, environment)\n : undefined;\n if (adjustmentHud) {\n group.append(adjustmentHud);\n }\n\n const adjustmentControls = isElementDraft\n ? this.createAdjustmentControls({\n draft,\n hud: adjustmentHud,\n pin,\n popover,\n selectionHighlight,\n textarea,\n })\n : undefined;\n\n const actions = this.createFormActions('Save note', saveDraft);\n\n form.append(\n ...(meta ? [meta] : []),\n ...(adjustmentControls ? [adjustmentControls.panel] : []),\n textarea,\n actions\n );\n const dragHandle = isElementDraft\n ? this.createDraftDragHandle('Move DOM composer')\n : undefined;\n popover.append(...(dragHandle ? [dragHandle] : []), form);\n group.append(pin, popover);\n\n if (dragHandle) {\n this.attachDraftComposerDrag(popover, dragHandle, (composerPosition) => {\n const noteDraft = this.state.noteDraft ?? draft;\n this.config.actions.setNoteDraft({\n ...noteDraft,\n composerPosition,\n comment: textarea.value,\n });\n });\n }\n\n this.attachDraftPinDrag(\n pin,\n isElementDraft ? undefined : popover,\n meta,\n textarea\n );\n\n window.setTimeout(() => {\n if (draft.adjustment?.isActive) {\n adjustmentControls?.focusTarget.focus();\n return;\n }\n\n textarea.focus();\n }, 0);\n\n return group;\n }\n\n private createDraftDragHandle(label: string) {\n const handle = document.createElement('button');\n handle.className = 'dfwr-draft-drag-handle';\n handle.type = 'button';\n handle.setAttribute('aria-label', label);\n return handle;\n }\n\n private createIcon(paths: string[]) {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '2.4');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n\n paths.forEach((d) => {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('d', d);\n svg.append(path);\n });\n\n return svg;\n }\n\n private setAdjustmentToggleIcon(button: HTMLButtonElement, isActive: boolean) {\n const paths = isActive\n ? ['M20 6 9 17l-5-5']\n : [\n 'M12 2v20',\n 'M2 12h20',\n 'm9 5 3-3 3 3',\n 'm9 19 3 3 3-3',\n 'm5 9-3 3 3 3',\n 'm19 9 3 3-3 3',\n ];\n button.replaceChildren(this.createIcon(paths));\n }\n\n private attachDraftComposerDrag(\n popover: HTMLDivElement,\n handle: HTMLButtonElement,\n onMove: (position: ReviewPoint) => void\n ) {\n let isDragging = false;\n let offsetX = 0;\n let offsetY = 0;\n\n const movePopover = (event: PointerEvent) => {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const position = this.getClampedComposerPosition(\n {\n x: event.clientX - offsetX,\n y: event.clientY - offsetY,\n },\n environment,\n {\n width: popover.offsetWidth,\n height: popover.offsetHeight,\n },\n this.getHostComposerBounds()\n );\n\n popover.style.left = `${position.x}px`;\n popover.style.top = `${position.y}px`;\n onMove(position);\n };\n\n handle.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n\n const rect = popover.getBoundingClientRect();\n offsetX = event.clientX - rect.left;\n offsetY = event.clientY - rect.top;\n isDragging = true;\n\n event.preventDefault();\n event.stopPropagation();\n handle.setPointerCapture(event.pointerId);\n popover.classList.add('is-dragging');\n });\n\n handle.addEventListener('pointermove', (event) => {\n if (!isDragging || !handle.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n movePopover(event);\n });\n\n const stopDrag = (event: PointerEvent) => {\n if (!isDragging || !handle.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = false;\n handle.releasePointerCapture(event.pointerId);\n popover.classList.remove('is-dragging');\n movePopover(event);\n };\n\n handle.addEventListener('pointerup', stopDrag);\n handle.addEventListener('pointercancel', stopDrag);\n }\n\n private createAdjustmentControls({\n draft,\n hud,\n pin,\n popover,\n selectionHighlight,\n textarea,\n }: {\n draft: NoteDraft;\n hud?: HTMLDivElement;\n pin: HTMLButtonElement;\n popover: HTMLDivElement;\n selectionHighlight?: HTMLDivElement;\n textarea: HTMLTextAreaElement;\n }) {\n const panel = document.createElement('div');\n panel.className = 'dfwr-adjust-panel is-dom-adjust-panel';\n\n const header = document.createElement('div');\n header.className = 'dfwr-adjust-panel-header';\n const help = document.createElement('div');\n help.className = 'dfwr-adjust-help';\n help.textContent = this.getAdjustmentLabel();\n\n const adjust = document.createElement('button');\n adjust.className = 'dfwr-adjust-toggle';\n adjust.type = 'button';\n adjust.title = 'Adjust DOM element with keyboard arrows';\n adjust.setAttribute('aria-label', 'Adjust DOM element with keyboard arrows');\n\n const xyStatus = document.createElement('div');\n xyStatus.className = 'dfwr-adjust-status';\n\n const scaleStatus = document.createElement('div');\n scaleStatus.className = 'dfwr-adjust-status';\n\n const syncControls = (nextDraft: NoteDraft) => {\n const isActive = nextDraft.adjustment?.isActive === true;\n panel.classList.toggle('is-active', isActive);\n adjust.classList.toggle('is-active', isActive);\n adjust.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n this.setAdjustmentToggleIcon(adjust, isActive);\n adjust.title = isActive\n ? 'Finish DOM adjustment'\n : 'Adjust DOM element with keyboard arrows';\n adjust.setAttribute(\n 'aria-label',\n isActive\n ? 'Finish DOM adjustment'\n : 'Adjust DOM element with keyboard arrows'\n );\n const [xyLine, scaleLine] = this.getDraftAdjustmentMetricLines(nextDraft);\n xyStatus.textContent = xyLine;\n scaleStatus.textContent = scaleLine;\n this.syncDraftAdjustmentUi({\n draft: nextDraft,\n hud,\n pin,\n selectionHighlight,\n });\n };\n\n const updateDraft = (updater: (current: NoteDraft) => NoteDraft) => {\n const currentDraft = this.state.noteDraft ?? draft;\n const nextDraft = updater(currentDraft);\n this.config.actions.setNoteDraft({\n ...nextDraft,\n comment: textarea.value,\n });\n syncControls(nextDraft);\n };\n\n adjust.addEventListener('click', () => {\n updateDraft((currentDraft) => ({\n ...currentDraft,\n adjustment: {\n x: currentDraft.adjustment?.x ?? 0,\n y: currentDraft.adjustment?.y ?? 0,\n scale: currentDraft.adjustment?.scale ?? 0,\n isActive: currentDraft.adjustment?.isActive !== true,\n },\n }));\n adjust.focus();\n });\n\n popover.addEventListener('keydown', (event) => {\n const currentDraft = this.state.noteDraft ?? draft;\n if (currentDraft.adjustment?.isActive !== true) return;\n\n const keyDelta = this.getAdjustmentKeyDelta(event);\n if (!keyDelta) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n updateDraft((activeDraft) => ({\n ...activeDraft,\n adjustment: {\n x: (activeDraft.adjustment?.x ?? 0) + keyDelta.x,\n y: (activeDraft.adjustment?.y ?? 0) + keyDelta.y,\n scale: (activeDraft.adjustment?.scale ?? 0) + keyDelta.scale,\n isActive: true,\n },\n }));\n });\n\n header.append(help, adjust);\n panel.append(header, xyStatus, scaleStatus);\n syncControls(draft);\n\n return {\n panel,\n focusTarget: adjust,\n };\n }\n\n private getAdjustmentKeyDelta(event: KeyboardEvent) {\n const step = event.shiftKey ? 10 : 1;\n\n if (event.key === 'ArrowLeft') return { x: -step, y: 0, scale: 0 };\n if (event.key === 'ArrowRight') return { x: step, y: 0, scale: 0 };\n if (event.key === 'ArrowUp') return { x: 0, y: -step, scale: 0 };\n if (event.key === 'ArrowDown') return { x: 0, y: step, scale: 0 };\n if (event.key.toLowerCase() === 'w') return { x: 0, y: 0, scale: step };\n if (event.key.toLowerCase() === 's') return { x: 0, y: 0, scale: -step };\n\n return undefined;\n }\n\n private createAdjustmentHud(\n draft: NoteDraft,\n environment: ReviewEnvironment\n ) {\n const hud = document.createElement('div');\n hud.className = 'dfwr-adjust-hud';\n hud.setAttribute('aria-hidden', 'true');\n this.syncAdjustmentHud(hud, draft, environment);\n return hud;\n }\n\n private syncDraftAdjustmentUi({\n draft,\n hud,\n pin,\n selectionHighlight,\n }: {\n draft: NoteDraft;\n hud?: HTMLDivElement;\n pin: HTMLButtonElement;\n selectionHighlight?: HTMLDivElement;\n }) {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const hostPoint = toHostPoint(\n this.getAdjustedDraftPoint(draft.marker.viewport, draft),\n environment\n );\n pin.style.left = `${hostPoint.x}px`;\n pin.style.top = `${hostPoint.y}px`;\n\n if (draft.selection && selectionHighlight) {\n const rect = toHostSelection(\n this.getAdjustedDraftSelection(\n toViewportSelection(draft.selection.viewport),\n draft\n ),\n environment\n );\n selectionHighlight.style.left = `${rect.left}px`;\n selectionHighlight.style.top = `${rect.top}px`;\n selectionHighlight.style.width = `${rect.width}px`;\n selectionHighlight.style.height = `${rect.height}px`;\n }\n\n if (hud) {\n this.syncAdjustmentHud(hud, draft, environment);\n }\n\n this.syncDraftPreview(draft);\n }\n\n private syncAdjustmentHud(\n hud: HTMLDivElement,\n draft: NoteDraft,\n environment: ReviewEnvironment\n ) {\n if (!draft.selection) return;\n\n const rect = toHostSelection(\n this.getAdjustedDraftSelection(\n toViewportSelection(draft.selection.viewport),\n draft\n ),\n environment\n );\n const isVisible =\n draft.adjustment?.isActive === true || this.hasDraftAdjustment(draft);\n\n hud.hidden = !isVisible;\n hud.textContent = this.formatDraftAdjustmentStatus(draft);\n hud.style.left = `${Math.max(4, rect.left)}px`;\n hud.style.top = `${Math.max(4, rect.top - 28)}px`;\n }\n\n private createAreaForm() {\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n const areaDraft = this.state.areaDraft;\n\n if (!areaDraft) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Drag on the page to select an area.';\n form.append(empty);\n return form;\n }\n\n form.append(this.createAreaMetricsPanel(areaDraft));\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Area comment';\n textarea.rows = 4;\n textarea.value = areaDraft.comment ?? '';\n textarea.addEventListener('input', () => {\n const draft = this.state.areaDraft;\n if (!draft) return;\n this.config.actions.setAreaDraft({\n ...draft,\n comment: textarea.value,\n });\n });\n\n const actions = this.createFormActions('Save area', () => {\n const comment = textarea.value.trim();\n const draft = this.state.areaDraft;\n if (!comment || !draft) return;\n void this.config.actions.createItem({\n kind: 'area',\n comment,\n viewport: draft.viewport,\n anchor: draft.anchor,\n marker: draft.marker,\n selection: draft.selection,\n });\n });\n\n form.append(textarea, actions);\n return form;\n }\n\n private createAreaMetricsPanel(draft: AreaDraft) {\n const panel = document.createElement('div');\n panel.className = 'dfwr-adjust-panel is-area-metrics-panel';\n\n const help = document.createElement('div');\n help.className = 'dfwr-adjust-help';\n const [labelLine, xyLine, sizeLine] = this.getSelectionMetricLines(\n this.getAreaDraftMetricSelection(draft),\n draft.viewport\n );\n help.textContent = labelLine;\n\n const xyStatus = document.createElement('div');\n xyStatus.className = 'dfwr-adjust-status';\n xyStatus.textContent = xyLine;\n\n const sizeStatus = document.createElement('div');\n sizeStatus.className = 'dfwr-adjust-status';\n sizeStatus.textContent = sizeLine;\n\n panel.append(help, xyStatus, sizeStatus);\n return panel;\n }\n\n private createAreaDraftOverlay(draft: AreaDraft) {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-preview-layer';\n\n const environment = this.config.getEnvironment();\n if (!environment || !draft.selection) return layer;\n\n const selection = toViewportSelection(draft.selection.viewport);\n layer.append(this.createSelectionHighlight(selection, environment, true));\n\n if (draft.marker) {\n const hostPoint = toHostPoint(draft.marker.viewport, environment);\n layer.append(\n this.createMarkerElement(\n undefined,\n hostPoint,\n '•',\n getReviewViewportScope(\n draft.viewport,\n this.config.options.viewports?.presets\n ),\n true,\n true\n )\n );\n }\n\n return layer;\n }\n\n private createAreaDraftPopover(draft: AreaDraft) {\n const environment = this.config.getEnvironment();\n const popover = document.createElement('div');\n popover.className = 'dfwr-area-draft is-composer';\n if (environment && draft.selection) {\n const selection = toHostSelection(\n toViewportSelection(draft.selection.viewport),\n environment\n );\n const composer = this.getDraftComposerPosition({\n selection,\n environment,\n composerPosition: draft.composerPosition,\n estimatedHeight: 220,\n });\n popover.style.left = `${composer.left}px`;\n popover.style.top = `${composer.top}px`;\n popover.style.width = `${composer.width}px`;\n popover.style.right = 'auto';\n }\n const dragHandle = this.createDraftDragHandle('Move area composer');\n popover.append(dragHandle, this.createAreaForm());\n this.attachDraftComposerDrag(popover, dragHandle, (composerPosition) => {\n const areaDraft = this.state.areaDraft ?? draft;\n this.config.actions.setAreaDraft({\n ...areaDraft,\n composerPosition,\n });\n });\n return popover;\n }\n\n private createFormActions(\n saveLabel: string,\n onSave: () => void,\n options?: {\n beforeSave?: HTMLButtonElement[];\n className?: string;\n }\n ) {\n const actions = document.createElement('div');\n actions.className = ['dfwr-actions', options?.className]\n .filter(Boolean)\n .join(' ');\n\n const save = document.createElement('button');\n save.className = 'dfwr-button is-primary';\n save.type = 'button';\n save.textContent = saveLabel;\n save.addEventListener('click', onSave);\n\n const cancel = document.createElement('button');\n cancel.className = 'dfwr-button';\n cancel.type = 'button';\n cancel.textContent = 'Cancel';\n cancel.addEventListener('click', () => {\n this.config.actions.setModeState('idle');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n });\n\n if (options?.beforeSave?.length || options?.className) {\n actions.append(cancel, ...(options.beforeSave ?? []), save);\n return actions;\n }\n\n actions.append(save, cancel);\n return actions;\n }\n\n private createList() {\n const section = document.createElement('div');\n section.className = 'dfwr-list';\n const state = this.state;\n\n const heading = document.createElement('div');\n heading.className = 'dfwr-list-heading';\n heading.textContent = `Review items (${state.items.length})`;\n section.append(heading);\n\n if (state.items.length === 0) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'No review items on this page.';\n section.append(empty);\n return section;\n }\n\n for (const numberedItem of getNumberedReviewItems(\n state.items,\n this.config.options.viewports?.presets\n )) {\n section.append(this.createListItem(numberedItem));\n }\n\n return section;\n }\n\n private createListItem(numberedItem: NumberedReviewItem) {\n const { item } = numberedItem;\n const row = document.createElement('article');\n row.className = 'dfwr-item';\n row.tabIndex = 0;\n row.setAttribute('role', 'button');\n row.setAttribute(\n 'aria-label',\n `Restore review item: ${item.title ?? item.comment}`\n );\n row.addEventListener('click', () => {\n void this.config.actions.restoreItem(item);\n });\n row.addEventListener('keydown', (event) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n\n event.preventDefault();\n void this.config.actions.restoreItem(item);\n });\n\n const body = document.createElement('div');\n body.className = 'dfwr-item-body';\n\n const badges = document.createElement('div');\n badges.className = 'dfwr-item-badges';\n\n const scope = document.createElement('div');\n scope.className = `dfwr-item-scope is-scope-${numberedItem.scope}`;\n scope.textContent = numberedItem.displayLabel;\n\n const kind = document.createElement('div');\n kind.className = 'dfwr-item-kind';\n kind.textContent = item.kind;\n badges.append(scope, kind);\n\n const comment = document.createElement('p');\n comment.className = 'dfwr-item-comment';\n comment.textContent = item.comment;\n\n const date = document.createElement('time');\n date.className = 'dfwr-item-date';\n date.dateTime = item.createdAt;\n date.textContent = formatItemMeta(item);\n\n body.append(badges, comment, date);\n\n const actions = document.createElement('div');\n actions.className = 'dfwr-item-actions';\n actions.addEventListener('click', (event) => event.stopPropagation());\n actions.addEventListener('keydown', (event) => event.stopPropagation());\n\n const remove = document.createElement('button');\n remove.className = 'dfwr-icon-button';\n remove.type = 'button';\n remove.textContent = 'x';\n remove.setAttribute('aria-label', 'Delete');\n remove.addEventListener('click', (event) => {\n event.stopPropagation();\n void this.config.actions\n .removeItem(item.id)\n .then(() => this.config.actions.reload());\n });\n\n actions.append(remove);\n row.append(body, actions);\n return row;\n }\n\n private createMarkerLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-marker-layer';\n const environment = this.config.getEnvironment();\n if (!environment) return layer;\n\n const currentScope = getReviewViewportScope(\n getViewportSize(environment),\n this.config.options.viewports?.presets\n );\n\n getNumberedReviewItems(\n this.state.items,\n this.config.options.viewports?.presets\n ).forEach((numberedItem) => {\n const { item, scope, displayLabel } = numberedItem;\n if (!shouldShowMarkerForScope(scope, currentScope)) {\n return;\n }\n\n const isHighlighted = item.id === this.state.highlightedItemId;\n const highlightMode = getReviewItemHighlightMode(item);\n if (\n highlightMode !== 'note' &&\n (!this.state.highlightedItemId || isHighlighted)\n ) {\n const selection = getItemHighlightSelection(item, environment);\n if (selection) {\n layer.append(\n ...this.createItemHighlightElements(\n selection.viewport,\n environment,\n item,\n displayLabel,\n selection.isBound,\n isHighlighted\n )\n );\n return;\n }\n }\n\n const point = getBoundMarkerPoint(item, environment);\n if (!point || !isPointInViewport(point.viewport, environment)) {\n return;\n }\n\n const hostPoint = toHostPoint(point.viewport, environment);\n const marker = this.createMarkerElement(\n item.id,\n hostPoint,\n displayLabel,\n scope,\n point.isBound,\n isHighlighted,\n highlightMode === 'note' ? 'note' : 'default'\n );\n marker.title = `${displayLabel} / ${item.comment}\\n${formatItemMeta(item)}`;\n layer.append(marker);\n });\n\n return layer;\n }\n\n private createItemHighlightElements(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n item: ReviewItem,\n label: string,\n isBound: boolean,\n isHighlighted: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const mode = getReviewItemHighlightMode(item);\n const highlight = document.createElement('div');\n highlight.className = [\n 'dfwr-item-target-highlight',\n `is-mode-${mode}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n highlight.dataset.reviewItemId = item.id;\n\n const labelElement = document.createElement('div');\n labelElement.className = [\n 'dfwr-item-target-label',\n `is-mode-${mode}`,\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n labelElement.textContent = label;\n labelElement.style.left = `${Math.max(4, rect.left)}px`;\n labelElement.style.top = `${Math.max(4, rect.top - 24)}px`;\n labelElement.dataset.reviewItemId = item.id;\n\n return [highlight, labelElement];\n }\n\n private createSelectionHighlight(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n isDraft: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const highlight = document.createElement('div');\n highlight.className = `dfwr-selection-highlight${\n isDraft ? ' is-draft' : ''\n }`;\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n return highlight;\n }\n\n private createMarkerElement(\n itemId: string | undefined,\n hostPoint: ReviewPoint,\n label: string,\n scope: ReviewItemScope,\n isBound: boolean,\n isHighlighted: boolean,\n variant: 'default' | 'note' = 'default'\n ) {\n const isNoteCallout = variant === 'note';\n const marker = document.createElement('div');\n marker.className = [\n 'dfwr-bound-marker',\n isNoteCallout ? 'is-note-callout' : '',\n `is-scope-${scope}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n marker.style.left = `${hostPoint.x}px`;\n marker.style.top = `${hostPoint.y}px`;\n marker.dataset.scope = scope;\n if (itemId) {\n marker.dataset.reviewItemId = itemId;\n }\n\n const iconElement = document.createElement('span');\n iconElement.className = 'dfwr-bound-marker-icon';\n iconElement.setAttribute('aria-hidden', 'true');\n const labelElement = document.createElement('span');\n labelElement.className = 'dfwr-bound-marker-number';\n labelElement.textContent = label;\n marker.append(iconElement, labelElement);\n\n return marker;\n }\n\n private attachDraftPinDrag(\n pin: HTMLButtonElement,\n popover: HTMLDivElement | undefined,\n meta: HTMLDivElement | undefined,\n textarea: HTMLTextAreaElement\n ) {\n let isDragging = false;\n\n const moveDraftUi = (hostPoint: ReviewPoint) => {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const nextPoint = clampPoint(toTargetPoint(hostPoint, environment), environment);\n const nextHostPoint = toHostPoint(nextPoint, environment);\n\n pin.style.left = `${nextHostPoint.x}px`;\n pin.style.top = `${nextHostPoint.y}px`;\n if (popover) {\n const position = getPopoverPosition(nextHostPoint, environment);\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n }\n\n const noteDraft = this.state.noteDraft;\n if (!noteDraft) return;\n\n const nextDraft = {\n ...noteDraft,\n marker: {\n ...noteDraft.marker,\n viewport: roundPoint(nextPoint),\n },\n comment: textarea.value,\n };\n this.config.actions.setNoteDraft(nextDraft);\n if (meta) {\n meta.textContent = formatNoteDraftMeta(nextDraft);\n }\n };\n\n pin.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = true;\n pin.setPointerCapture(event.pointerId);\n });\n\n pin.addEventListener('pointermove', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n moveDraftUi({\n x: event.clientX,\n y: event.clientY,\n });\n });\n\n pin.addEventListener('pointerup', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = false;\n pin.releasePointerCapture(event.pointerId);\n\n const nextPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n void (this.state.mode === 'element'\n ? this.config.actions.bindElementDraftToPoint(nextPoint, textarea.value)\n : this.config.actions.bindNoteDraftToPoint(nextPoint, textarea.value));\n });\n }\n\n private createNoteLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-text-layer';\n const environment = this.config.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.config.actions.bindNoteDraftToPoint(\n toTargetPointFromHostEvent(event, this.config.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private createElementLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-element-layer';\n const environment = this.config.getEnvironment();\n const hover = document.createElement('div');\n hover.className = 'dfwr-dom-hover';\n hover.hidden = true;\n layer.append(hover);\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const updateHover = (point: ReviewPoint) => {\n const nextEnvironment = this.config.getEnvironment();\n if (!nextEnvironment) return;\n\n const anchor = getDomAnchorFromPoint(\n clampPoint(point, nextEnvironment),\n this.config.options.anchors?.attribute,\n nextEnvironment\n );\n const selection = anchor\n ? getElementViewportSelection(anchor, nextEnvironment)\n : undefined;\n\n if (!selection) {\n hover.hidden = true;\n return;\n }\n\n const rect = toHostSelection(selection, nextEnvironment);\n hover.hidden = false;\n hover.style.left = `${rect.left}px`;\n hover.style.top = `${rect.top}px`;\n hover.style.width = `${rect.width}px`;\n hover.style.height = `${rect.height}px`;\n };\n\n layer.addEventListener('pointermove', (event) => {\n updateHover(toTargetPointFromHostEvent(event, this.config.getEnvironment()));\n });\n\n layer.addEventListener('pointerleave', () => {\n hover.hidden = true;\n });\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.config.actions.bindElementDraftToPoint(\n toTargetPointFromHostEvent(event, this.config.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private createAreaLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-layer';\n const environment = this.config.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const box = document.createElement('div');\n box.className = 'dfwr-area-box';\n layer.append(box);\n\n let startX = 0;\n let startY = 0;\n let selection: ViewportSelection | undefined;\n\n const updateBox = (event: PointerEvent) => {\n const nextPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n const left = Math.min(startX, nextPoint.x);\n const top = Math.min(startY, nextPoint.y);\n const width = Math.abs(nextPoint.x - startX);\n const height = Math.abs(nextPoint.y - startY);\n const hostPoint = toHostPoint(\n { x: left, y: top },\n this.config.getEnvironment()\n );\n\n selection = { left, top, width, height };\n box.style.left = `${hostPoint.x}px`;\n box.style.top = `${hostPoint.y}px`;\n box.style.width = `${width}px`;\n box.style.height = `${height}px`;\n };\n\n layer.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n layer.setPointerCapture(event.pointerId);\n const startPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n startX = startPoint.x;\n startY = startPoint.y;\n updateBox(event);\n });\n\n layer.addEventListener('pointermove', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n updateBox(event);\n });\n\n layer.addEventListener('pointerup', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n layer.releasePointerCapture(event.pointerId);\n updateBox(event);\n\n if (!selection || selection.width < 8 || selection.height < 8) return;\n\n this.config.actions.setSelectingArea(true);\n this.config.actions.render();\n void this.config.actions.createAreaDraft(selection);\n });\n\n return layer;\n }\n}\n","import { localAdapter } from '../adapters/local';\nimport type {\n DomAnchor,\n ReviewItem,\n ReviewMarker,\n ReviewMode,\n ReviewPoint,\n ReviewSelection,\n WebReviewKitAdapter,\n WebReviewKitController,\n WebReviewKitOptions,\n} from '../types';\nimport {\n cssEscape,\n getDomAnchor,\n getDomAnchorFromPoint,\n getElementViewportSelection,\n getRelativePoint,\n getRelativeSelection,\n} from './dom.anchor';\nimport {\n createId,\n} from './id';\nimport {\n clampPoint,\n getPointSelection,\n getSelectionCenter,\n getViewportSize,\n roundPoint,\n toPublicSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\nimport { isHotkey } from './hotkey';\nimport {\n getOriginalUrl,\n getPageUrl,\n getRouteKey,\n} from './location';\nimport { getReviewViewportScope } from './review/scope';\nimport { createSelectionCenterMarker } from './review/item';\nimport type { AreaDraft, NoteDraft } from './review/draft';\nimport {\n runWithAutoScrollBehavior,\n setDocumentScrollInstantly,\n waitForNextFrame,\n} from './scroll';\nimport {\n WebReviewKitView,\n type CreateReviewItemInput,\n} from './web.review.kit.view';\n\nconst ROOT_ID = 'df-web-review-kit-root';\n\nfunction isEditableEventTarget(event: KeyboardEvent) {\n const path = event.composedPath?.() ?? [];\n const element = (path[0] ?? event.target) as HTMLElement | null;\n if (!element || typeof element.tagName !== 'string') return false;\n\n const tag = element.tagName;\n return (\n tag === 'INPUT' ||\n tag === 'TEXTAREA' ||\n tag === 'SELECT' ||\n element.isContentEditable === true\n );\n}\n\n/** Creates the vanilla runtime controller that mounts review overlays on a target page. */\nexport function createWebReviewKit(\n options: WebReviewKitOptions\n): WebReviewKitController {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return createNoopController();\n }\n\n const app = new WebReviewKitApp(options);\n app.mount();\n\n return {\n open: () => app.open(),\n close: () => app.close(),\n toggle: () => app.toggle(),\n setMode: (mode) => app.setMode(mode),\n getMode: () => app.getMode(),\n highlightItem: (itemId) => app.highlightItem(itemId),\n setHiddenItemIds: (itemIds) => app.setHiddenItemIds(itemIds),\n reload: () => app.reload(),\n getItems: () => app.getItems(),\n destroy: () => app.destroy(),\n };\n}\n\nclass WebReviewKitApp {\n private readonly adapter: WebReviewKitAdapter;\n private readonly hotkey: string;\n private readonly view: WebReviewKitView;\n private root?: HTMLDivElement;\n private shadow?: ShadowRoot;\n private isOpen = false;\n private mode: ReviewMode = 'idle';\n private items: ReviewItem[] = [];\n private noteDraft?: NoteDraft;\n private areaDraft?: AreaDraft;\n private isSelectingArea = false;\n private highlightedItemId?: string;\n private hiddenItemIds?: Set<string>;\n private renderFrame?: number;\n\n constructor(private readonly options: WebReviewKitOptions) {\n this.adapter = options.adapter ?? localAdapter();\n this.hotkey = options.hotkeys?.qa ?? 'Shift+Q';\n this.view = new WebReviewKitView({\n options,\n getState: () => ({\n isOpen: this.isOpen,\n mode: this.mode,\n items: this.items,\n noteDraft: this.noteDraft,\n areaDraft: this.areaDraft,\n isSelectingArea: this.isSelectingArea,\n highlightedItemId: this.highlightedItemId,\n }),\n getEnvironment: () => this.getEnvironment(),\n actions: {\n close: () => this.close(),\n render: () => this.render(),\n reload: () => this.reload(),\n restoreItem: (item) => this.restoreItem(item),\n removeItem: (itemId) => this.adapter.remove(itemId),\n setModeState: (mode) => this.setModeState(mode),\n clearDrafts: () => {\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n },\n setNoteDraft: (draft) => {\n this.noteDraft = draft;\n },\n setAreaDraft: (draft) => {\n this.areaDraft = draft;\n },\n setSelectingArea: (isSelectingArea) => {\n this.isSelectingArea = isSelectingArea;\n },\n createItem: (input) => this.createItem(input),\n bindNoteDraftToPoint: (point, comment) =>\n this.bindNoteDraftToPoint(point, comment),\n bindElementDraftToPoint: (point, comment) =>\n this.bindElementDraftToPoint(point, comment),\n createAreaDraft: (selection) => this.createAreaDraft(selection),\n },\n });\n }\n\n mount() {\n if (this.root) return;\n\n const existing = document.getElementById(ROOT_ID);\n if (existing) existing.remove();\n\n this.root = document.createElement('div');\n this.root.id = ROOT_ID;\n this.root.style.display = 'contents';\n\n this.shadow = this.root.attachShadow({ mode: 'open' });\n document.body.appendChild(this.root);\n document.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('scroll', this.handleViewportChange, true);\n window.addEventListener('resize', this.handleViewportChange);\n\n this.render();\n }\n\n destroy() {\n this.view.clearDraftPreview();\n document.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('scroll', this.handleViewportChange, true);\n window.removeEventListener('resize', this.handleViewportChange);\n if (this.renderFrame) {\n window.cancelAnimationFrame(this.renderFrame);\n this.renderFrame = undefined;\n }\n this.root?.remove();\n this.root = undefined;\n this.shadow = undefined;\n }\n\n open() {\n if (this.isOpen) return;\n\n this.isOpen = true;\n void this.reload();\n }\n\n close() {\n this.isOpen = false;\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n }\n\n toggle() {\n if (this.isOpen) {\n this.close();\n return;\n }\n\n this.open();\n }\n\n setMode(mode: ReviewMode) {\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.setModeState(this.mode === mode ? 'idle' : mode);\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.render();\n }\n\n getMode() {\n return this.mode;\n }\n\n getItems() {\n return this.items;\n }\n\n highlightItem(itemId?: string) {\n if (!itemId) {\n this.clearHighlightedItem();\n return;\n }\n\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.highlightedItemId = itemId;\n this.render();\n }\n\n setHiddenItemIds(itemIds?: string[]) {\n this.hiddenItemIds = itemIds ? new Set(itemIds) : undefined;\n this.updateHiddenItemsStyle();\n }\n\n private clearHighlightedItem() {\n if (!this.highlightedItemId) return;\n\n this.highlightedItemId = undefined;\n this.render();\n }\n\n private createHiddenItemsStyleElement() {\n const style = document.createElement('style');\n style.dataset.dfwrHiddenItems = 'true';\n style.textContent = this.getHiddenItemsCss();\n return style;\n }\n\n private updateHiddenItemsStyle() {\n if (!this.shadow) return;\n\n let style = this.shadow.querySelector<HTMLStyleElement>(\n 'style[data-dfwr-hidden-items=\"true\"]'\n );\n if (!style) {\n style = this.createHiddenItemsStyleElement();\n this.shadow.prepend(style);\n return;\n }\n\n style.textContent = this.getHiddenItemsCss();\n }\n\n private getHiddenItemsCss() {\n if (!this.hiddenItemIds?.size) return '';\n\n return Array.from(this.hiddenItemIds)\n .map(\n (itemId) =>\n `[data-review-item-id=\"${cssEscape(itemId)}\"] { display: none !important; }`\n )\n .join('\\n');\n }\n\n private setModeState(mode: ReviewMode) {\n if (this.mode === mode) return;\n\n this.mode = mode;\n this.options.onModeChange?.(mode);\n }\n\n private cancelMode() {\n if (\n this.mode === 'idle' &&\n !this.noteDraft &&\n !this.areaDraft &&\n !this.isSelectingArea\n ) {\n return false;\n }\n\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n return true;\n }\n\n private readonly handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.cancelMode()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isEditableEventTarget(event) || !isHotkey(event, this.hotkey)) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.toggle();\n };\n\n private readonly handleViewportChange = () => {\n if (!this.isOpen || this.renderFrame) return;\n\n this.renderFrame = window.requestAnimationFrame(() => {\n this.renderFrame = undefined;\n this.render();\n });\n };\n\n private getEnvironment(): ReviewEnvironment | undefined {\n const target =\n typeof this.options.target === 'function'\n ? this.options.target()\n : this.options.target;\n\n if (!target) {\n return {\n window,\n document,\n viewportRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n overlayRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n };\n }\n\n try {\n const rect = target.getViewportRect?.() ?? {\n left: 0,\n top: 0,\n width: target.window.innerWidth,\n height: target.window.innerHeight,\n };\n const overlayRect = target.getOverlayRect?.() ?? rect;\n\n return {\n window: target.window,\n document: target.document,\n viewportRect: {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n },\n overlayRect: {\n left: overlayRect.left,\n top: overlayRect.top,\n width: overlayRect.width,\n height: overlayRect.height,\n },\n };\n } catch {\n return undefined;\n }\n }\n\n async reload() {\n const environment = this.getEnvironment();\n if (!environment) return this.items;\n\n this.items = await this.adapter.list({\n projectId: this.options.projectId,\n routeKey: getRouteKey(environment),\n });\n this.options.onItemsChange?.(this.items);\n if (this.isOpen) {\n this.render();\n }\n return this.items;\n }\n\n private render() {\n if (!this.shadow) return;\n\n this.view.render(this.shadow, this.createHiddenItemsStyleElement());\n }\n\n private async bindNoteDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const selection = getPointSelection(nextPoint);\n const anchor = getDomAnchor(\n selection,\n this.options.anchors?.attribute,\n environment\n );\n const marker: ReviewMarker = {\n viewport: roundPoint(nextPoint),\n relative: anchor\n ? getRelativePoint(nextPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n comment,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private async bindElementDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const anchor = getDomAnchorFromPoint(\n nextPoint,\n this.options.anchors?.attribute,\n environment\n );\n const elementSelection = anchor\n ? getElementViewportSelection(anchor, environment)\n : undefined;\n const selection = elementSelection ?? getPointSelection(nextPoint);\n const markerPoint = elementSelection\n ? { x: selection.left, y: selection.top }\n : getSelectionCenter(selection);\n const reviewSelection = elementSelection\n ? {\n viewport: toPublicSelection(elementSelection),\n relative: getRelativeSelection(\n elementSelection,\n anchor as DomAnchor,\n environment\n ),\n }\n : undefined;\n const marker: ReviewMarker = {\n viewport: roundPoint(markerPoint),\n relative: anchor\n ? getRelativePoint(markerPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n selection: reviewSelection,\n comment,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private async createAreaDraft(selection: ViewportSelection) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n\n this.areaDraft = await this.withOverlayHidden(() => {\n const marker = createSelectionCenterMarker(\n selection,\n undefined,\n environment\n );\n const reviewSelection: ReviewSelection = {\n viewport: toPublicSelection(selection),\n };\n\n return {\n viewport,\n marker,\n selection: reviewSelection,\n };\n });\n this.isSelectingArea = false;\n this.setModeState('area');\n this.render();\n }\n\n private async withOverlayHidden<T>(callback: () => Promise<T> | T) {\n if (!this.root) return callback();\n\n const previousDisplay = this.root.style.display;\n this.root.style.display = 'none';\n\n try {\n // Hide our own overlay while sampling elementFromPoint so we anchor to the page.\n return await callback();\n } finally {\n this.root.style.display = previousDisplay;\n }\n }\n\n private async createItem(input: CreateReviewItemInput) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const now = new Date().toISOString();\n const routeKey = getRouteKey(environment);\n const viewport = input.viewport ?? getViewportSize(environment);\n const createdBy = this.options.userId?.trim();\n const item: ReviewItem = {\n id: createId(),\n projectId: this.options.projectId,\n routeKey,\n pageUrl: getPageUrl(environment),\n originalUrl: getOriginalUrl(environment),\n normalizedPath: routeKey,\n scope:\n input.scope ??\n getReviewViewportScope(viewport, this.options.viewports?.presets),\n kind: input.kind,\n title: input.comment.split('\\n')[0]?.slice(0, 80),\n comment: input.comment,\n createdBy: createdBy || undefined,\n status: 'todo',\n viewport,\n devicePixelRatio: environment.window.devicePixelRatio || 1,\n scroll: {\n x: environment.window.scrollX,\n y: environment.window.scrollY,\n },\n anchor: input.anchor,\n marker: input.marker,\n selection: input.selection,\n createdAt: now,\n updatedAt: now,\n };\n\n const createdItem = await this.adapter.create(item);\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.highlightItem(createdItem.id);\n await this.reload();\n await this.options.onCreateItem?.(createdItem);\n }\n\n private async restoreItem(item: ReviewItem) {\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n\n if (this.options.onRestoreItem) {\n await this.options.onRestoreItem(item);\n return;\n }\n\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const scroll = item.scroll;\n if (scroll) {\n runWithAutoScrollBehavior(environment.document, () => {\n setDocumentScrollInstantly(environment, scroll);\n });\n await waitForNextFrame(environment);\n }\n\n this.highlightItem(item.id);\n this.render();\n }\n}\n\nfunction createNoopController(): WebReviewKitController {\n return {\n open() {},\n close() {},\n toggle() {},\n setMode() {},\n getMode() {\n return 'idle';\n },\n highlightItem() {},\n setHiddenItemIds() {},\n async reload() {\n return [];\n },\n getItems() {\n return [];\n },\n destroy() {},\n };\n}\n","import type { TargetOverlayState } from '../types';\n\nexport const HIDE_SCROLLBAR_STYLE_ID = 'df-review-hide-scrollbar';\n\nexport const setTargetScrollbarHidden = (\n targetDocument: Document | null | undefined,\n hidden: boolean\n) => {\n if (!targetDocument) return;\n\n const existing = targetDocument.getElementById(HIDE_SCROLLBAR_STYLE_ID);\n if (hidden) {\n if (existing) return;\n const style = targetDocument.createElement('style');\n style.id = HIDE_SCROLLBAR_STYLE_ID;\n style.textContent =\n 'html{scrollbar-width:none}html::-webkit-scrollbar,body::-webkit-scrollbar{width:0;height:0;display:none}';\n targetDocument.head?.appendChild(style);\n } else {\n existing?.remove();\n }\n};\n\nexport const isEditableEventTarget = (event: KeyboardEvent) => {\n const path = event.composedPath?.() ?? [];\n const element = (path[0] ?? event.target) as HTMLElement | null;\n if (!element || typeof element.tagName !== 'string') return false;\n const tag = element.tagName;\n return (\n tag === 'INPUT' || tag === 'TEXTAREA' || element.isContentEditable === true\n );\n};\n\nexport const getTargetOverlayState = (\n targetDocument: Document | undefined\n): TargetOverlayState => ({\n grid: Boolean(\n targetDocument?.body.classList.contains('is-help') ||\n targetDocument?.querySelector('.helper.onShow')\n ),\n figma: Boolean(\n targetDocument?.querySelector(\n '.helper-figma-root, .helper-figma-loading-backdrop'\n )\n )\n});\n","import type { MutableRefObject } from 'react';\nimport {\n getFrameRouteTarget,\n normalizeTarget,\n} from '../route';\n\ninterface BindReviewFrameNavigationOptions {\n pageTargets: ReadonlySet<string>;\n reviewPathPrefix: string;\n targetDocument: Document;\n targetRef: MutableRefObject<string>;\n targetWindow: Window;\n onCancelReviewMode: () => boolean;\n onCloseRuler: () => boolean;\n onSyncShellTarget: (target: string) => void;\n onSyncTargetViewport: () => void;\n}\n\nexport const bindReviewFrameNavigation = ({\n pageTargets,\n reviewPathPrefix,\n targetDocument,\n targetRef,\n targetWindow,\n onCancelReviewMode,\n onCloseRuler,\n onSyncShellTarget,\n onSyncTargetViewport,\n}: BindReviewFrameNavigationOptions) => {\n const syncRouteFromFrame = () => {\n const nextTarget = getFrameRouteTarget(targetWindow, reviewPathPrefix);\n if (nextTarget !== targetRef.current && !pageTargets.has(nextTarget)) {\n return;\n }\n\n onSyncShellTarget(nextTarget);\n };\n\n const handleClick = (event: MouseEvent) => {\n if (event.defaultPrevented || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n const targetElement = event.target;\n if (!targetElement || !('closest' in targetElement)) return;\n\n const link = (targetElement as Element).closest('a[href]');\n const href = link?.getAttribute('href');\n const linkTarget = link?.getAttribute('target');\n if (!href || (linkTarget && linkTarget !== '_self')) return;\n\n const url = new URL(href, targetWindow.location.href);\n if (url.origin !== targetWindow.location.origin) return;\n\n const nextTarget = normalizeTarget(url.pathname, reviewPathPrefix);\n if (nextTarget === targetRef.current) return;\n\n event.preventDefault();\n onSyncShellTarget(nextTarget);\n };\n\n const handleFrameKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n if (!onCancelReviewMode() && !onCloseRuler()) return;\n\n event.preventDefault();\n event.stopPropagation();\n };\n\n const history = targetWindow.history;\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<History['pushState']>) => {\n originalPushState(...args);\n syncRouteFromFrame();\n };\n history.replaceState = (...args: Parameters<History['replaceState']>) => {\n originalReplaceState(...args);\n syncRouteFromFrame();\n };\n\n syncRouteFromFrame();\n targetWindow.addEventListener('popstate', syncRouteFromFrame);\n targetWindow.addEventListener('hashchange', syncRouteFromFrame);\n targetWindow.addEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.addEventListener('click', handleClick, true);\n targetWindow.addEventListener('scroll', onSyncTargetViewport, true);\n targetWindow.addEventListener('resize', onSyncTargetViewport);\n\n return () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n targetWindow.removeEventListener('popstate', syncRouteFromFrame);\n targetWindow.removeEventListener('hashchange', syncRouteFromFrame);\n targetWindow.removeEventListener('keydown', handleFrameKeyDown, true);\n targetDocument.removeEventListener('click', handleClick, true);\n targetWindow.removeEventListener('scroll', onSyncTargetViewport, true);\n targetWindow.removeEventListener('resize', onSyncTargetViewport);\n };\n};\n","import type { RefObject } from 'react';\nimport type { WebReviewKitTarget } from '../../types';\n\ninterface GetReviewKitTargetOptions {\n frameScrollRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n}\n\nexport const getReviewKitTarget = ({\n frameScrollRef,\n iframeRef,\n}: GetReviewKitTargetOptions): WebReviewKitTarget | undefined => {\n const frame = iframeRef.current;\n const frameWindow = frame?.contentWindow;\n const frameDocument = frame?.contentDocument;\n\n if (!frame || !frameWindow || !frameDocument) return undefined;\n\n return {\n window: frameWindow,\n document: frameDocument,\n getViewportRect: () => frame.getBoundingClientRect(),\n getOverlayRect: () => {\n const frameRect = frame.getBoundingClientRect();\n const scrollRect = frameScrollRef.current?.getBoundingClientRect();\n if (!scrollRect) return frameRect;\n\n const left = Math.max(frameRect.left, scrollRect.left);\n const top = Math.max(frameRect.top, scrollRect.top);\n const right = Math.min(\n frameRect.left + frameRect.width,\n scrollRect.left + scrollRect.width\n );\n const bottom = Math.min(\n frameRect.top + frameRect.height,\n scrollRect.top + scrollRect.height\n );\n\n return {\n left,\n top,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n };\n },\n };\n};\n","import { useCallback, useEffect, type RefObject } from 'react';\nimport { getTargetOverlayState } from '../target/target';\nimport type {\n TargetOverlayKey,\n TargetOverlayState,\n} from '../types';\n\ninterface UseReviewTargetOverlayOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isFigmaOverlayAvailable: boolean;\n targetOverlayState: TargetOverlayState;\n onTargetOverlayStateChange: (state: TargetOverlayState) => void;\n}\n\nexport const useReviewTargetOverlay = ({\n iframeRef,\n isFigmaOverlayAvailable,\n targetOverlayState,\n onTargetOverlayStateChange,\n}: UseReviewTargetOverlayOptions) => {\n const refreshTargetOverlayState = useCallback(() => {\n onTargetOverlayStateChange(\n getTargetOverlayState(iframeRef.current?.contentDocument ?? undefined)\n );\n }, [iframeRef, onTargetOverlayStateChange]);\n\n const dispatchTargetOverlayHotkey = useCallback(\n (overlay: TargetOverlayKey) => {\n const targetWindow = iframeRef.current?.contentWindow;\n if (!targetWindow) return false;\n\n const code = overlay === 'grid' ? 'KeyG' : 'KeyF';\n targetWindow.dispatchEvent(\n new KeyboardEvent('keydown', {\n bubbles: true,\n cancelable: true,\n code,\n key: code.replace('Key', '').toLowerCase(),\n shiftKey: true,\n })\n );\n window.setTimeout(refreshTargetOverlayState, 80);\n return true;\n },\n [iframeRef, refreshTargetOverlayState]\n );\n\n const toggleTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n if (overlay === 'figma' && !isFigmaOverlayAvailable) {\n refreshTargetOverlayState();\n return;\n }\n\n dispatchTargetOverlayHotkey(overlay);\n },\n [\n dispatchTargetOverlayHotkey,\n isFigmaOverlayAvailable,\n refreshTargetOverlayState,\n ]\n );\n\n const closeTargetOverlay = useCallback(\n (overlay: TargetOverlayKey) => {\n const currentState = getTargetOverlayState(\n iframeRef.current?.contentDocument ?? undefined\n );\n onTargetOverlayStateChange(currentState);\n if (!currentState[overlay]) return false;\n\n return dispatchTargetOverlayHotkey(overlay);\n },\n [dispatchTargetOverlayHotkey, iframeRef, onTargetOverlayStateChange]\n );\n\n useEffect(() => {\n if (isFigmaOverlayAvailable || !targetOverlayState.figma) return;\n closeTargetOverlay('figma');\n }, [closeTargetOverlay, isFigmaOverlayAvailable, targetOverlayState.figma]);\n\n return {\n closeTargetOverlay,\n refreshTargetOverlayState,\n toggleTargetOverlay,\n };\n};\n","import {\n useCallback,\n useEffect,\n type MutableRefObject,\n type RefObject,\n} from 'react';\nimport type { ReviewSource } from '../../types';\nimport {\n normalizeTarget,\n updateShellUrl,\n updateShellUrlForItem,\n} from '../route';\nimport { setTargetScrollbarHidden } from '../target/target';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface UseReviewTargetSyncOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n reviewPathPrefix: string;\n selectedItemIdRef: MutableRefObject<string | null>;\n size: ReviewShellViewportPreset;\n sizeRef: MutableRefObject<ReviewShellViewportPreset>;\n source: ReviewSource;\n target: string;\n targetRef: MutableRefObject<string>;\n onActiveRouteChange: (target: string) => void;\n onClearSelectedItem: () => void;\n onDraftTargetChange: (target: string) => void;\n onSyncTargetViewport: () => void;\n onTargetChange: (target: string) => void;\n}\n\nexport const useReviewTargetSync = ({\n iframeRef,\n reviewPathPrefix,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n target,\n targetRef,\n onActiveRouteChange,\n onClearSelectedItem,\n onDraftTargetChange,\n onSyncTargetViewport,\n onTargetChange,\n}: UseReviewTargetSyncOptions) => {\n const syncShellTarget = useCallback(\n (nextTarget: string) => {\n const normalizedTarget = normalizeTarget(nextTarget, reviewPathPrefix);\n\n if (normalizedTarget !== targetRef.current) {\n onClearSelectedItem();\n targetRef.current = normalizedTarget;\n onTargetChange(normalizedTarget);\n onDraftTargetChange(normalizedTarget);\n onActiveRouteChange(normalizedTarget);\n }\n\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n normalizedTarget,\n sizeRef.current,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(normalizedTarget, sizeRef.current, source);\n }\n },\n [\n onActiveRouteChange,\n onClearSelectedItem,\n onDraftTargetChange,\n onTargetChange,\n reviewPathPrefix,\n selectedItemIdRef,\n sizeRef,\n source,\n targetRef,\n ]\n );\n\n useEffect(() => {\n targetRef.current = target;\n onActiveRouteChange(target);\n }, [onActiveRouteChange, target, targetRef]);\n\n useEffect(() => {\n sizeRef.current = size;\n if (selectedItemIdRef.current) {\n updateShellUrlForItem(\n targetRef.current,\n size,\n selectedItemIdRef.current,\n source\n );\n } else {\n updateShellUrl(targetRef.current, size, source);\n }\n onSyncTargetViewport();\n setTargetScrollbarHidden(\n iframeRef.current?.contentDocument,\n getViewportPresetKind(size) === 'mobile'\n );\n }, [\n iframeRef,\n onSyncTargetViewport,\n selectedItemIdRef,\n size,\n sizeRef,\n source,\n targetRef,\n ]);\n\n return {\n syncShellTarget,\n };\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { NumberedReviewItem, ReviewMode, ReviewSource } from '../../types';\nimport {\n getReviewPresenceColor,\n getReviewPresenceDisplayName,\n getReviewPresenceSessionId,\n} from '../presence/presence';\nimport { normalizeTarget } from '../route';\nimport type {\n ReviewPresenceAdapter,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewShellViewportPreset,\n} from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface UseReviewPresenceOptions {\n activeRoute: string;\n mode: ReviewMode;\n presence?: ReviewPresenceAdapter;\n projectId: string;\n reviewPathPrefix: string;\n reviewUserId: string;\n selectedNumberedItem?: NumberedReviewItem;\n size: ReviewShellViewportPreset;\n source: ReviewSource;\n}\n\nconst getPresenceUserTarget = (\n user: ReviewPresenceUser,\n reviewPathPrefix: string\n) => normalizeTarget(user.target || user.routeKey, reviewPathPrefix);\n\nconst dedupePresenceUsersByPageAndId = (\n users: ReviewPresenceUser[],\n reviewPathPrefix: string\n) => {\n const userByPageAndId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const userId = user.userId.trim();\n if (!userId) return;\n\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const key = `${userTarget}::${userId}`;\n const currentUser = userByPageAndId.get(key);\n\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userByPageAndId.set(key, user);\n }\n });\n\n return Array.from(userByPageAndId.values());\n};\n\nexport const useReviewPresence = ({\n activeRoute,\n mode,\n presence,\n projectId,\n reviewPathPrefix,\n reviewUserId,\n selectedNumberedItem,\n size,\n source,\n}: UseReviewPresenceOptions) => {\n const presenceSessionRef = useRef<ReviewPresenceSession | null>(null);\n const [presenceUsers, setPresenceUsers] = useState<ReviewPresenceUser[]>([]);\n const [presenceSessionVersion, setPresenceSessionVersion] = useState(0);\n const presenceSessionId = useMemo(getReviewPresenceSessionId, []);\n const normalizedReviewUserId = reviewUserId.trim();\n const presenceDisplayName = getReviewPresenceDisplayName(\n normalizedReviewUserId\n );\n const presenceColor = getReviewPresenceColor(\n normalizedReviewUserId || presenceSessionId\n );\n const presenceViewport = useMemo(\n () => ({\n label: size.label,\n width: size.width,\n height: size.height,\n kind: getViewportPresetKind(size),\n }),\n [size]\n );\n const presenceStatus: ReviewPresenceStatus =\n mode === 'idle' ? 'reviewing' : 'editing';\n const visiblePresenceUsers = useMemo(\n () => {\n const projectPresenceUsers = presenceUsers.filter(\n (user) => user.projectId === projectId && user.userId.trim()\n );\n\n return dedupePresenceUsersByPageAndId(\n projectPresenceUsers,\n reviewPathPrefix\n );\n },\n [presenceUsers, projectId, reviewPathPrefix]\n );\n const currentPagePresenceUsers = useMemo(\n () =>\n visiblePresenceUsers.filter((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n\n return userTarget === activeRoute;\n }),\n [activeRoute, reviewPathPrefix, visiblePresenceUsers]\n );\n const pagePresenceUsers = useMemo(() => {\n const usersByTarget = new Map<string, ReviewPresenceUser[]>();\n\n visiblePresenceUsers.forEach((user) => {\n const userTarget = getPresenceUserTarget(user, reviewPathPrefix);\n const pageUsers = usersByTarget.get(userTarget) ?? [];\n\n pageUsers.push(user);\n usersByTarget.set(userTarget, pageUsers);\n });\n\n return usersByTarget;\n }, [reviewPathPrefix, visiblePresenceUsers]);\n\n const getCurrentPresenceState = useCallback(\n (): ReviewPresenceState => ({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n routeKey: activeRoute,\n target: activeRoute,\n source,\n viewport: presenceViewport,\n mode,\n selectedItemId: selectedNumberedItem?.item.id ?? null,\n selectedReviewNumber: selectedNumberedItem?.number ?? null,\n status: presenceStatus,\n updatedAt: new Date().toISOString(),\n }),\n [\n activeRoute,\n mode,\n normalizedReviewUserId,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n presenceStatus,\n presenceViewport,\n projectId,\n selectedNumberedItem,\n source,\n ]\n );\n const getCurrentPresenceStateRef = useRef(getCurrentPresenceState);\n getCurrentPresenceStateRef.current = getCurrentPresenceState;\n\n useEffect(() => {\n if (!presence || !normalizedReviewUserId) {\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n return undefined;\n }\n\n let isActive = true;\n let unsubscribe: (() => void) | undefined;\n const initialState = getCurrentPresenceStateRef.current();\n\n void Promise.resolve(\n presence.connect({\n projectId,\n sessionId: presenceSessionId,\n userId: normalizedReviewUserId,\n displayName: presenceDisplayName,\n color: presenceColor,\n initialState,\n })\n ).then((session) => {\n if (!isActive) {\n void session.disconnect();\n return;\n }\n\n presenceSessionRef.current = session;\n unsubscribe = session.subscribe(setPresenceUsers);\n setPresenceSessionVersion((current) => current + 1);\n void session.update(initialState);\n }).catch(() => {\n if (!isActive) return;\n\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n });\n\n return () => {\n isActive = false;\n unsubscribe?.();\n const session = presenceSessionRef.current;\n presenceSessionRef.current = null;\n setPresenceUsers([]);\n void session?.disconnect();\n };\n }, [\n normalizedReviewUserId,\n presence,\n presenceColor,\n presenceDisplayName,\n presenceSessionId,\n projectId,\n ]);\n\n useEffect(() => {\n const session = presenceSessionRef.current;\n if (!session || !normalizedReviewUserId) return;\n\n void session.update(getCurrentPresenceState());\n }, [\n getCurrentPresenceState,\n normalizedReviewUserId,\n presenceSessionVersion,\n ]);\n\n return {\n currentPagePresenceUsers,\n pagePresenceUsers,\n presenceSessionId,\n };\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from '../types';\n\nconst REVIEW_PRESENCE_SESSION_KEY = 'df-review-presence-session-id';\nconst DEFAULT_LOCAL_PRESENCE_CHANNEL = 'df-review-kit:presence';\nconst DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS = 5000;\nconst DEFAULT_LOCAL_PRESENCE_STALE_MS = 16000;\nconst PRESENCE_COLORS = [\n '#7cc7ff',\n '#63d7c7',\n '#f3b75f',\n '#c99cff',\n '#ff8f61',\n '#9cc76b',\n '#f278a6',\n '#79a7ff',\n];\n\ntype LocalPresenceMessage =\n | {\n type: 'request';\n sessionId: string;\n }\n | {\n type: 'update';\n sessionId: string;\n user: ReviewPresenceUser;\n }\n | {\n type: 'leave';\n sessionId: string;\n };\n\nexport type LocalPresenceAdapterOptions = {\n channelName?: string;\n heartbeatMs?: number;\n staleMs?: number;\n};\n\nconst createId = () => {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nconst hashString = (value: string) => {\n let hash = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(index);\n hash |= 0;\n }\n\n return Math.abs(hash);\n};\n\nexport const getReviewPresenceColor = (value: string) =>\n PRESENCE_COLORS[hashString(value || 'anonymous') % PRESENCE_COLORS.length];\n\nexport const getReviewPresenceDisplayName = (userId: string) =>\n userId.trim() || 'anonymous';\n\nexport const getReviewPresenceSessionId = () => {\n if (typeof window === 'undefined') return createId();\n\n try {\n const stored = window.sessionStorage.getItem(REVIEW_PRESENCE_SESSION_KEY);\n if (stored) return stored;\n\n const nextId = createId();\n window.sessionStorage.setItem(REVIEW_PRESENCE_SESSION_KEY, nextId);\n return nextId;\n } catch {\n return createId();\n }\n};\n\nconst getTimestamp = () => new Date().toISOString();\n\nconst normalizePresenceUser = (\n state: ReviewPresenceState\n): ReviewPresenceUser => ({\n ...state,\n displayName: getReviewPresenceDisplayName(state.displayName || state.userId),\n updatedAt: state.updatedAt || getTimestamp(),\n});\n\nexport const createLocalPresenceAdapter = (\n options: LocalPresenceAdapterOptions = {}\n): ReviewPresenceAdapter => ({\n label: 'local-presence',\n connect: (context: ReviewPresenceContext) => {\n const heartbeatMs =\n options.heartbeatMs ?? DEFAULT_LOCAL_PRESENCE_HEARTBEAT_MS;\n const staleMs = options.staleMs ?? DEFAULT_LOCAL_PRESENCE_STALE_MS;\n const users = new Map<string, ReviewPresenceUser>();\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentUser = normalizePresenceUser({\n ...context.initialState,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n\n const Channel =\n typeof BroadcastChannel === 'undefined' ? undefined : BroadcastChannel;\n const channel = Channel\n ? new Channel(options.channelName ?? DEFAULT_LOCAL_PRESENCE_CHANNEL)\n : null;\n\n const getUsers = () => {\n const now = Date.now();\n\n users.forEach((user, sessionId) => {\n if (now - Date.parse(user.updatedAt) > staleMs) {\n users.delete(sessionId);\n }\n });\n\n return Array.from(users.values()).sort((a, b) => {\n if (a.sessionId === context.sessionId) return -1;\n if (b.sessionId === context.sessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n };\n\n const emit = () => {\n const nextUsers = getUsers();\n listeners.forEach((listener) => listener(nextUsers));\n };\n\n const post = (message: LocalPresenceMessage) => {\n try {\n channel?.postMessage(message);\n } catch {\n return;\n }\n };\n\n const publish = () => {\n post({\n type: 'update',\n sessionId: context.sessionId,\n user: currentUser,\n });\n };\n\n if (channel) {\n channel.onmessage = (event: MessageEvent<LocalPresenceMessage>) => {\n const message = event.data;\n if (!message || message.sessionId === context.sessionId) return;\n\n if (message.type === 'request') {\n publish();\n return;\n }\n\n if (message.type === 'leave') {\n users.delete(message.sessionId);\n emit();\n return;\n }\n\n if (message.type === 'update' && message.user) {\n users.set(message.sessionId, normalizePresenceUser(message.user));\n emit();\n }\n };\n }\n\n const intervalId =\n typeof window === 'undefined'\n ? undefined\n : window.setInterval(() => {\n currentUser = {\n ...currentUser,\n updatedAt: getTimestamp(),\n };\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n }, heartbeatMs);\n\n emit();\n publish();\n post({\n type: 'request',\n sessionId: context.sessionId,\n });\n\n return {\n update: (state) => {\n currentUser = normalizePresenceUser({\n ...currentUser,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: getTimestamp(),\n });\n users.set(context.sessionId, currentUser);\n emit();\n publish();\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: () => {\n if (intervalId) {\n window.clearInterval(intervalId);\n }\n post({\n type: 'leave',\n sessionId: context.sessionId,\n });\n channel?.close();\n listeners.clear();\n users.clear();\n },\n };\n },\n});\n\nexport const createFallbackPresenceAdapter = (\n primaryAdapter: ReviewPresenceAdapter,\n fallbackAdapter: ReviewPresenceAdapter\n): ReviewPresenceAdapter => ({\n label: `${primaryAdapter.label}-with-${fallbackAdapter.label}-fallback`,\n connect: async (context: ReviewPresenceContext) => {\n try {\n return await primaryAdapter.connect(context);\n } catch (error) {\n if (typeof console !== 'undefined') {\n console.warn(\n `[df-review-kit] ${primaryAdapter.label} failed. Falling back to ${fallbackAdapter.label}.`,\n error\n );\n }\n return fallbackAdapter.connect(context);\n }\n },\n});\n","import {\n useCallback,\n useEffect,\n useState,\n type RefObject,\n} from 'react';\nimport type { ReviewRulerConfig } from '../../types';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { useReviewRulerDrag } from './use.review.ruler.drag';\n\ninterface UseReviewRulerOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n ruler?: ReviewRulerConfig;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onCancelReviewMode: () => void;\n onCloseTransientPanels: () => void;\n}\n\nexport const useReviewRuler = ({\n iframeRef,\n ruler,\n size,\n targetSrc,\n onCancelReviewMode,\n onCloseTransientPanels,\n}: UseReviewRulerOptions) => {\n const [isRulerVisible, setIsRulerVisible] = useState(false);\n const isRulerAvailable =\n ruler?.enabled !== false &&\n typeof size.designWidth === 'number' &&\n size.designWidth > 0;\n const rulerUnit = ruler?.unit ?? 'px';\n const rulerScaleX =\n isRulerAvailable && size.designWidth ? size.width / size.designWidth : 1;\n const rulerScaleY =\n size.designHeight && size.designHeight > 0\n ? size.height / size.designHeight\n : rulerScaleX;\n const {\n clearRulerMeasure,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerOverlayRef,\n } = useReviewRulerDrag({\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n size,\n targetSrc,\n });\n const rulerMeasureLabel = rulerMeasure\n ? `${Math.round(rulerMeasure.width / rulerScaleX)} × ${Math.round(\n rulerMeasure.height / rulerScaleY\n )} ${rulerUnit}`\n : '';\n\n const closeRuler = useCallback(() => {\n if (!isRulerVisible) return false;\n\n setIsRulerVisible(false);\n clearRulerMeasure();\n return true;\n }, [clearRulerMeasure, isRulerVisible]);\n\n const toggleRuler = useCallback(() => {\n if (!isRulerAvailable) return;\n\n onCancelReviewMode();\n onCloseTransientPanels();\n clearRulerMeasure();\n setIsRulerVisible((current) => !current);\n }, [\n clearRulerMeasure,\n isRulerAvailable,\n onCancelReviewMode,\n onCloseTransientPanels,\n ]);\n\n useEffect(() => {\n if (!isRulerVisible || isRulerAvailable) return;\n closeRuler();\n }, [closeRuler, isRulerAvailable, isRulerVisible]);\n\n return {\n closeRuler,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n toggleRuler,\n };\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from 'react';\nimport { getRulerMeasure, getRulerPointFromRect } from '../ruler/ruler';\nimport type { ReviewRulerPoint, ReviewShellViewportPreset } from '../types';\n\ninterface UseReviewRulerDragOptions {\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerAvailable: boolean;\n isRulerVisible: boolean;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n}\n\nexport const useReviewRulerDrag = ({\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n size,\n targetSrc,\n}: UseReviewRulerDragOptions) => {\n const rulerOverlayRef = useRef<HTMLDivElement | null>(null);\n const rulerDragRectRef = useRef<DOMRect | null>(null);\n const isRulerDraggingRef = useRef(false);\n const sizeRef = useRef(size);\n const [rulerStart, setRulerStart] = useState<ReviewRulerPoint | null>(null);\n const [rulerPoint, setRulerPoint] = useState<ReviewRulerPoint | null>(null);\n const [rulerHover, setRulerHover] = useState<ReviewRulerPoint | null>(null);\n const [isRulerDragging, setIsRulerDragging] = useState(false);\n\n const rulerMeasure = useMemo(\n () => getRulerMeasure(rulerStart, rulerPoint),\n [rulerPoint, rulerStart]\n );\n\n const clearRulerMeasure = useCallback(() => {\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setRulerStart(null);\n setRulerPoint(null);\n setRulerHover(null);\n setIsRulerDragging(false);\n }, []);\n\n const finishRulerDrag = useCallback((point?: ReviewRulerPoint) => {\n if (point) {\n setRulerPoint(point);\n }\n\n rulerDragRectRef.current = null;\n isRulerDraggingRef.current = false;\n setIsRulerDragging(false);\n }, []);\n\n const startRulerDrag = useCallback(\n (clientX: number, clientY: number, rect: DOMRect) => {\n const point = getRulerPointFromRect(clientX, clientY, rect);\n\n rulerDragRectRef.current = rect;\n isRulerDraggingRef.current = true;\n\n setRulerStart(point);\n setRulerPoint(point);\n setIsRulerDragging(true);\n },\n []\n );\n\n useEffect(() => {\n sizeRef.current = size;\n }, [size]);\n\n useEffect(() => {\n if (!isRulerVisible || !isRulerAvailable) return undefined;\n\n const getRulerEventClientPoint = (event: MouseEvent) => {\n const frame = iframeRef.current;\n let isFrameEvent = false;\n\n try {\n isFrameEvent =\n Boolean(frame?.contentWindow) && event.view === frame?.contentWindow;\n\n if (!isFrameEvent && frame?.contentDocument) {\n const targetDocument = (\n event.target as { ownerDocument?: Document } | null\n )?.ownerDocument;\n isFrameEvent = targetDocument === frame.contentDocument;\n }\n } catch {\n isFrameEvent = false;\n }\n\n if (isFrameEvent && frame) {\n const frameRect = frame.getBoundingClientRect();\n\n return {\n clientX: event.clientX + frameRect.left,\n clientY: event.clientY + frameRect.top,\n };\n }\n\n return {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n };\n\n const snapDesign = (screen: number, axis: 'x' | 'y') => {\n const current = sizeRef.current;\n const scaleX = current.designWidth\n ? current.width / current.designWidth\n : 1;\n const scale =\n axis === 'y'\n ? current.designHeight\n ? current.height / current.designHeight\n : scaleX\n : scaleX;\n return Math.round(Math.round(screen / scale) * scale);\n };\n\n const getActiveRulerPoint = (event: MouseEvent) => {\n const rect =\n rulerDragRectRef.current ??\n rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return undefined;\n\n const point = getRulerEventClientPoint(event);\n const snapped = getRulerPointFromRect(point.clientX, point.clientY, rect);\n\n return { x: snapDesign(snapped.x, 'x'), y: snapDesign(snapped.y, 'y') };\n };\n\n const getHoverRulerPoint = (event: MouseEvent) => {\n const rect = rulerOverlayRef.current?.getBoundingClientRect();\n if (!rect) return null;\n\n const { clientX, clientY } = getRulerEventClientPoint(event);\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n if (x < 0 || y < 0 || x > rect.width || y > rect.height) return null;\n\n return { x: snapDesign(x, 'x'), y: snapDesign(y, 'y') };\n };\n\n const handleDragStart: EventListener = (event) => {\n if (isRulerDraggingRef.current) return;\n\n const mouseEvent = event as MouseEvent;\n if (mouseEvent.button !== 0) return;\n\n const overlay = rulerOverlayRef.current;\n const target = mouseEvent.target;\n if (!overlay || !(target instanceof Node) || !overlay.contains(target)) {\n return;\n }\n\n event.preventDefault();\n startRulerDrag(\n mouseEvent.clientX,\n mouseEvent.clientY,\n overlay.getBoundingClientRect()\n );\n };\n\n const handlePointerMove: EventListener = (event) => {\n const mouseEvent = event as MouseEvent;\n\n if (isRulerDraggingRef.current) {\n const point = getActiveRulerPoint(mouseEvent);\n if (!point) return;\n\n mouseEvent.preventDefault();\n setRulerPoint(point);\n setRulerHover(point);\n return;\n }\n\n setRulerHover(getHoverRulerPoint(mouseEvent));\n };\n\n const handleDragEnd: EventListener = (event) => {\n if (!isRulerDraggingRef.current) return;\n\n const point = getActiveRulerPoint(event as MouseEvent);\n event.preventDefault();\n finishRulerDrag(point);\n };\n\n const handleWindowBlur = () => {\n if (!isRulerDraggingRef.current) return;\n\n finishRulerDrag();\n };\n\n const dragTargets = new Set<EventTarget>([window]);\n const frame = iframeRef.current;\n\n try {\n if (frame?.contentWindow) dragTargets.add(frame.contentWindow);\n if (frame?.contentDocument) dragTargets.add(frame.contentDocument);\n } catch {\n // Cross-origin frames cannot expose their document. Parent listeners still run.\n }\n\n dragTargets.forEach((target) => {\n target.addEventListener('mousedown', handleDragStart, true);\n target.addEventListener('mousemove', handlePointerMove, true);\n target.addEventListener('mouseup', handleDragEnd, true);\n });\n\n window.addEventListener('blur', handleWindowBlur);\n\n return () => {\n dragTargets.forEach((target) => {\n target.removeEventListener('mousedown', handleDragStart, true);\n target.removeEventListener('mousemove', handlePointerMove, true);\n target.removeEventListener('mouseup', handleDragEnd, true);\n });\n window.removeEventListener('blur', handleWindowBlur);\n };\n }, [\n finishRulerDrag,\n iframeRef,\n isRulerAvailable,\n isRulerVisible,\n startRulerDrag,\n ]);\n\n useEffect(() => {\n clearRulerMeasure();\n }, [clearRulerMeasure, size.height, size.width, targetSrc]);\n\n return {\n clearRulerMeasure,\n isRulerDragging,\n rulerHover,\n rulerMeasure,\n rulerOverlayRef,\n };\n};\n","import type { ReviewRulerMeasure, ReviewRulerPoint } from '../types';\n\nexport const getRulerPointFromRect = (\n clientX: number,\n clientY: number,\n rect: DOMRect\n): ReviewRulerPoint => {\n const x = Math.min(Math.max(clientX - rect.left, 0), rect.width);\n const y = Math.min(Math.max(clientY - rect.top, 0), rect.height);\n\n return {\n x: Math.round(x),\n y: Math.round(y)\n };\n};\n\nexport const getRulerMeasure = (\n start: ReviewRulerPoint | null,\n end: ReviewRulerPoint | null\n): ReviewRulerMeasure | undefined => {\n if (!start || !end) return undefined;\n\n return {\n left: Math.min(start.x, end.x),\n top: Math.min(start.y, end.y),\n width: Math.abs(end.x - start.x),\n height: Math.abs(end.y - start.y)\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { DEFAULT_REVIEW_THEME } from '../constants';\nimport {\n getStoredFigmaToken,\n getStoredReviewTheme,\n getStoredReviewUserId,\n getSystemReviewTheme,\n normalizeReviewTheme,\n writeStoredFigmaToken,\n writeStoredReviewTheme,\n writeStoredReviewUserId,\n} from '../settings';\nimport type { ReviewShellTheme } from '../types';\n\ninterface UseReviewSettingsOptions {\n onCancelReviewMode: () => void | boolean;\n onCloseInitialPrompt: () => void;\n onCloseSitemap: () => void;\n onReloadTargetFrame: () => void;\n}\n\nexport const useReviewSettings = ({\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n onReloadTargetFrame,\n}: UseReviewSettingsOptions) => {\n const [figmaTokenDraft, setFigmaTokenDraft] = useState(getStoredFigmaToken);\n const [reviewUserId, setReviewUserId] = useState(getStoredReviewUserId);\n const [reviewUserIdDraft, setReviewUserIdDraft] = useState(\n getStoredReviewUserId\n );\n const [reviewTheme, setReviewTheme] = useState(getStoredReviewTheme);\n const [reviewThemeDraft, setReviewThemeDraft] =\n useState(getStoredReviewTheme);\n const [systemReviewTheme, setSystemReviewTheme] =\n useState(getSystemReviewTheme);\n const [figmaSettingsStatus, setFigmaSettingsStatus] = useState('');\n const [isFigmaSettingsOpen, setIsFigmaSettingsOpen] = useState(false);\n const [isFigmaTokenVisible, setIsFigmaTokenVisible] = useState(false);\n const [isFigmaTokenGuideOpen, setIsFigmaTokenGuideOpen] = useState(false);\n const effectiveReviewTheme =\n reviewTheme === 'system' ? systemReviewTheme : reviewTheme;\n\n const closeFigmaSettings = useCallback(() => {\n setIsFigmaSettingsOpen(false);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n }, []);\n\n const openFigmaSettings = useCallback(() => {\n onCancelReviewMode();\n onCloseSitemap();\n onCloseInitialPrompt();\n setFigmaTokenDraft(getStoredFigmaToken());\n setReviewUserIdDraft(getStoredReviewUserId());\n setReviewThemeDraft(reviewTheme);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n setIsFigmaSettingsOpen(true);\n }, [\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n reviewTheme,\n ]);\n\n const saveReviewSettings = useCallback(\n (token: string, userId: string, theme: ReviewShellTheme) => {\n const nextToken = token.trim();\n const nextUserId = userId.trim();\n const nextTheme = normalizeReviewTheme(theme);\n const shouldReload =\n nextToken !== getStoredFigmaToken() ||\n nextUserId !== getStoredReviewUserId();\n\n writeStoredFigmaToken(nextToken);\n writeStoredReviewUserId(nextUserId);\n writeStoredReviewTheme(nextTheme);\n setFigmaTokenDraft(nextToken);\n setReviewUserId(nextUserId);\n setReviewUserIdDraft(nextUserId);\n setReviewTheme(nextTheme);\n setReviewThemeDraft(nextTheme);\n setFigmaSettingsStatus(\n nextToken || nextUserId || nextTheme !== DEFAULT_REVIEW_THEME\n ? 'Saved'\n : 'Cleared'\n );\n\n if (shouldReload) {\n onReloadTargetFrame();\n }\n closeFigmaSettings();\n },\n [closeFigmaSettings, onReloadTargetFrame]\n );\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return undefined;\n\n const query = window.matchMedia('(prefers-color-scheme: light)');\n const syncSystemTheme = () => {\n setSystemReviewTheme(query.matches ? 'light' : 'dark');\n };\n\n syncSystemTheme();\n\n if (query.addEventListener) {\n query.addEventListener('change', syncSystemTheme);\n return () => query.removeEventListener('change', syncSystemTheme);\n }\n\n query.addListener(syncSystemTheme);\n return () => query.removeListener(syncSystemTheme);\n }, []);\n\n useEffect(() => {\n document.body.classList.toggle(\n 'df-review-theme-light',\n effectiveReviewTheme === 'light'\n );\n document.body.classList.toggle(\n 'df-review-theme-dark',\n effectiveReviewTheme === 'dark'\n );\n\n return () => {\n document.body.classList.remove(\n 'df-review-theme-light',\n 'df-review-theme-dark'\n );\n };\n }, [effectiveReviewTheme]);\n\n return {\n closeFigmaSettings,\n effectiveReviewTheme,\n figmaSettingsStatus,\n figmaTokenDraft,\n isFigmaSettingsOpen,\n isFigmaTokenGuideOpen,\n isFigmaTokenVisible,\n openFigmaSettings,\n reviewThemeDraft,\n reviewUserId,\n reviewUserIdDraft,\n saveReviewSettings,\n setFigmaSettingsStatus,\n setFigmaTokenDraft,\n setIsFigmaTokenGuideOpen,\n setIsFigmaTokenVisible,\n setReviewThemeDraft,\n setReviewUserIdDraft,\n };\n};\n","import { useCallback, useMemo, useState } from 'react';\nimport {\n getNumberedReviewItems,\n} from '../../core/review/scope';\nimport type {\n ReviewItem,\n 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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,iBAAkB;AAClB,oBAA2B;;;ACD3B,IAAM,wBAAwB;AAEvB,SAAS,yBAAyB;AACvC,MAAI,CAAC,SAAS,eAAe,qBAAqB,GAAG;AACnD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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":["import_react","import_react","__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","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","error","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","toPascalCase","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","ReviewScopeIcon","Map","import_react","import_react","import_react","getSourceAttribute","getViewportPresetDistance","runWithAutoScrollBehavior","setDocumentScrollInstantly","runWithAutoScrollBehavior","setDocumentScrollInstantly","isEditableEventTarget","import_react","import_react","import_react","createId","import_react","import_react","frame","import_react","import_react","import_react","isEditableEventTarget","import_react","statusOption","item","updated","statusOption","import_jsx_runtime","refreshReviewData","target","toastMessage","import_jsx_runtime","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/status.ts","../src/react-shell/qa/item.status.actions.tsx","../src/react-shell/anchor.restore.ts","../src/react-shell/review/item.icons.tsx","../src/react-shell/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/target/target.ts","../src/react-shell/topbar.tsx","../src/react-shell/hooks/use.review.controller.ts","../src/react-shell/hooks/use.review.item.restore.ts","../src/react-shell/hooks/use.review.kit.lifecycle.ts","../src/route.ts","../src/adapters/local.ts","../src/core/geometry.ts","../src/core/dom.anchor.ts","../src/core/id.ts","../src/core/hotkey.ts","../src/core/location.ts","../src/core/review/scope.ts","../src/core/review/item.ts","../src/core/scroll.ts","../src/core/overlay.style.ts","../src/core/review/format.ts","../src/core/web.review.kit.view.ts","../src/core/web.review.kit.app.ts","../src/react-shell/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-surface: var(--df-review-color-surface);\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 position: relative;\n display: grid;\n align-content: start;\n min-height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\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: 3;\n min-height: 32px;\n border-bottom: 1px solid var(--df-review-line);\n padding: 0 10px;\n background: var(--df-review-panel);\n box-shadow:\n 0 -8px 0 0 var(--df-review-panel),\n 0 1px 0 var(--df-review-line);\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: 3;\n border-top: 1px solid var(--df-review-line);\n border-bottom: 0;\n background: var(--df-review-panel);\n box-shadow:\n 0 8px 0 0 var(--df-review-panel),\n 0 -1px 0 var(--df-review-line);\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 max-height: min(220px, calc(100vh - 96px));\n min-height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n padding-right: 2px;\n scrollbar-gutter: stable;\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 { setTargetFigmaOverlayLocked } from '../target/target';\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 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 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 useEffect(() => {\n const targetDocument = iframeRef.current?.contentDocument;\n setTargetFigmaOverlayLocked(targetDocument, mode === 'element');\n return () => {\n setTargetFigmaOverlayLocked(targetDocument, false);\n };\n }, [iframeRef, mode, 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\"] .helper-figma-root,\n html[${optionAttribute}=\"true\"] .helper-figma-root *,\n html[${optionAttribute}=\"true\"] .helper-figma-loading-backdrop,\n html[${optionAttribute}=\"true\"] .helper-figma-loading-backdrop * {\n pointer-events: none !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 setTargetFigmaOverlayLocked(\n iframeRef.current?.contentDocument,\n mode === 'element'\n );\n bindSourceOpenShortcut();\n }, [\n bindSourceOpenShortcut,\n iframeRef,\n initReviewKit,\n mode,\n refreshTargetFigmaConfig,\n ]);\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  - 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  - https://lucide.dev/icons/circle-question-mark\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleQuestionMark = createLucideIcon('circle-question-mark', __iconNode);\n\nexport default CircleQuestionMark;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n];\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('copy', __iconNode);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'M10 14 21 3', key: 'gplh6r' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6', key: 'a6xqqp' }],\n];\n\n/**\n * @component @name ExternalLink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ExternalLink = createLucideIcon('external-link', __iconNode);\n\nexport default ExternalLink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49',\n key: 'ct8e1f',\n },\n ],\n ['path', { d: 'M14.084 14.158a3 3 0 0 1-4.242-4.242', key: '151rxh' }],\n [\n 'path',\n {\n d: 'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143',\n key: '13bj9a',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst EyeOff = createLucideIcon('eye-off', __iconNode);\n\nexport default EyeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n key: '1nclc0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Eye = createLucideIcon('eye', __iconNode);\n\nexport default Eye;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '9', cy: '12', r: '1', key: '1vctgf' }],\n ['circle', { cx: '9', cy: '5', r: '1', key: 'hp0tcf' }],\n ['circle', { cx: '9', cy: '19', r: '1', key: 'fkjjf6' }],\n ['circle', { cx: '15', cy: '12', r: '1', key: '1tmaij' }],\n ['circle', { cx: '15', cy: '5', r: '1', key: '19l28e' }],\n ['circle', { cx: '15', cy: '19', r: '1', key: 'f4zoj3' }],\n];\n\n/**\n * @component @name GripVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/grip-vertical\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GripVertical = createLucideIcon('grip-vertical', __iconNode);\n\nexport default GripVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '7', height: '7', x: '3', y: '3', rx: '1', key: '1g98yp' }],\n ['rect', { width: '7', height: '7', x: '14', y: '3', rx: '1', key: '6d4xhi' }],\n ['rect', { width: '7', height: '7', x: '14', y: '14', rx: '1', key: 'nxv5o0' }],\n ['rect', { width: '7', height: '7', x: '3', y: '14', rx: '1', key: '1bb6yr' }],\n];\n\n/**\n * @component @name LayoutGrid\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/layout-grid\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LayoutGrid = createLucideIcon('layout-grid', __iconNode);\n\nexport default LayoutGrid;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: '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  - 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  - https://lucide.dev/icons/list-filter\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ListFilter = createLucideIcon('list-filter', __iconNode);\n\nexport default ListFilter;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z',\n key: '169xi5',\n },\n ],\n ['path', { d: 'M15 5.764v15', key: '1pn4in' }],\n ['path', { d: 'M9 3.236v15', key: '1uimfh' }],\n];\n\n/**\n * @component @name Map\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/map\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Map = createLucideIcon('map', __iconNode);\n\nexport default Map;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'm21 3-7 7', key: '1l2asr' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M9 21H3v-6', key: 'wtvkvv' }],\n];\n\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize2 = createLucideIcon('maximize-2', __iconNode);\n\nexport default Maximize2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\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  - 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  - https://lucide.dev/icons/rectangle-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RectangleHorizontal = createLucideIcon('rectangle-horizontal', __iconNode);\n\nexport default RectangleHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z',\n key: 'icamh8',\n },\n ],\n ['path', { d: 'm14.5 12.5 2-2', key: 'inckbg' }],\n ['path', { d: 'm11.5 9.5 2-2', key: 'fmmyf7' }],\n ['path', { d: 'm8.5 6.5 2-2', key: 'vc6u1g' }],\n ['path', { d: 'm17.5 15.5 2-2', key: 'wo5hmg' }],\n];\n\n/**\n * @component @name Ruler\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/ruler\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ruler = createLucideIcon('ruler', __iconNode);\n\nexport default Ruler;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 7V5a2 2 0 0 1 2-2h2', key: 'aa7l1z' }],\n ['path', { d: 'M17 3h2a2 2 0 0 1 2 2v2', key: '4qcy5o' }],\n ['path', { d: 'M21 17v2a2 2 0 0 1-2 2h-2', key: '6vwrx8' }],\n ['path', { d: 'M7 21H5a2 2 0 0 1-2-2v-2', key: 'ioqczr' }],\n];\n\n/**\n * @component @name Scan\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/scan\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Scan = createLucideIcon('scan', __iconNode);\n\nexport default Scan;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '20', x: '5', y: '2', rx: '2', ry: '2', key: '1yt0o3' }],\n ['path', { d: 'M12 18h.01', key: 'mhygvu' }],\n];\n\n/**\n * @component @name Smartphone\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/smartphone\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Smartphone = createLucideIcon('smartphone', __iconNode);\n\nexport default Smartphone;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z',\n key: 'xwnzip',\n },\n ],\n ['path', { d: 'M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6', key: '14rsvq' }],\n];\n\n/**\n * @component @name SquareMousePointer\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/square-mouse-pointer\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareMousePointer = createLucideIcon('square-mouse-pointer', __iconNode);\n\nexport default SquareMousePointer;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z',\n key: '1dfntj',\n },\n ],\n ['path', { d: 'M15 3v5a1 1 0 0 0 1 1h5', key: '6s6qgf' }],\n];\n\n/**\n * @component @name StickyNote\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/sticky-note\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst StickyNote = createLucideIcon('sticky-note', __iconNode);\n\nexport default StickyNote;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v12', key: '1x0j5s' }],\n ['path', { d: 'm17 8-5-5-5 5', key: '7q97r8' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n];\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('upload', __iconNode);\n\nexport default Upload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","import 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 type { ReviewItemStatus, ReviewWorkflowStatus } from './types';\n\nexport const REVIEW_WORKFLOW_STATUS_OPTIONS: Array<{\n value: ReviewWorkflowStatus;\n label: string;\n}> = [\n { value: 'todo', label: 'Todo' },\n { value: 'doing', label: 'Doing' },\n { value: 'review', label: 'Review' },\n { value: 'hold', label: 'Hold' },\n { value: 'done', label: 'Done' },\n];\n\nexport function normalizeReviewItemStatus(\n status: ReviewItemStatus | undefined\n): ReviewWorkflowStatus {\n if (status === 'resolved') return 'done';\n if (status === 'open' || !status) return 'todo';\n return status;\n}\n\nexport function matchesReviewItemStatus(\n itemStatus: ReviewItemStatus | undefined,\n queryStatus: ReviewItemStatus\n) {\n return (\n normalizeReviewItemStatus(itemStatus) === normalizeReviewItemStatus(queryStatus)\n );\n}\n","import { normalizeReviewItemStatus } from '../../status';\nimport type { ReviewItem, ReviewItemStatus } from '../../types';\nimport type { ReviewShellStatusOption } from '../types';\n\ninterface QaItemStatusActionsProps {\n canUpdateStatus: boolean;\n item: ReviewItem;\n statusOptions: readonly ReviewShellStatusOption[];\n onChangeItemStatus: (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => Promise<void>;\n}\n\nconst getStatusOption = (\n status: ReviewItemStatus,\n statusOptions: readonly ReviewShellStatusOption[]\n) => {\n const normalizedStatus = normalizeReviewItemStatus(status);\n return (\n statusOptions.find((statusOption) => statusOption.value === status) ??\n statusOptions.find(\n (statusOption) => statusOption.value === normalizedStatus\n ) ??\n statusOptions[0]\n );\n};\n\nexport const QaItemStatusActions = ({\n canUpdateStatus,\n item,\n statusOptions,\n onChangeItemStatus,\n}: QaItemStatusActionsProps) => {\n const currentStatusOption = getStatusOption(item.status, statusOptions);\n if (!currentStatusOption) return null;\n const statusClassName = `is-status-${normalizeReviewItemStatus(\n currentStatusOption.value\n )}`;\n\n return (\n <div\n className=\"df-review-item-status-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canUpdateStatus ? (\n <select\n aria-label=\"QA status\"\n className={`df-review-item-status-select ${statusClassName}`}\n value={currentStatusOption.value}\n onChange={(event) =>\n void onChangeItemStatus(\n item,\n event.currentTarget.value as ReviewItemStatus\n )\n }\n >\n {statusOptions.map((statusOption) => (\n <option key={statusOption.value} value={statusOption.value}>\n {statusOption.label}\n </option>\n ))}\n </select>\n ) : (\n <span className={`df-review-item-status-badge ${statusClassName}`}>\n {currentStatusOption.label}\n </span>\n )}\n </div>\n );\n};\n","import type { ReviewItem } from '../types';\n\nexport const isAnchorRestorableReviewItem = (item: ReviewItem) =>\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && item.selection));\n\nexport const queryReviewItemAnchorElement = (\n targetDocument: Document,\n item: ReviewItem\n) => {\n const anchor = item.anchor;\n if (!anchor || !isAnchorRestorableReviewItem(item)) return undefined;\n\n const expectedRect = getReviewItemExpectedDocumentRect(item);\n const candidates = [anchor, ...(anchor.candidates ?? [])].filter(\n (candidate) => Boolean(candidate.selector)\n );\n const matches: Array<{\n element: Element;\n score: number;\n }> = [];\n\n candidates.forEach((candidate, index) => {\n try {\n targetDocument.querySelectorAll(candidate.selector).forEach((element) => {\n if (!isScrollableReviewAnchorElement(element)) return;\n\n matches.push({\n element,\n score: getReviewAnchorMatchScore(\n element,\n expectedRect,\n candidate.textFingerprint ?? anchor.textFingerprint,\n index\n )\n });\n });\n } catch {\n return;\n }\n });\n\n return matches.sort((a, b) => a.score - b.score)[0]?.element;\n};\n\nexport const getReviewItemRestoreScrollPosition = (\n targetWindow: Window,\n targetDocument: Document,\n item: ReviewItem,\n anchorElement?: Element\n) => {\n if (anchorElement) {\n const rect = anchorElement.getBoundingClientRect();\n return clampDocumentScrollPosition(targetDocument, {\n left:\n targetWindow.scrollX +\n rect.left -\n Math.max(0, (targetWindow.innerWidth - rect.width) / 2),\n top:\n targetWindow.scrollY +\n rect.top -\n Math.max(0, (targetWindow.innerHeight - rect.height) / 2)\n });\n }\n\n return clampDocumentScrollPosition(targetDocument, {\n left: item.scroll?.x ?? 0,\n top: item.scroll?.y ?? 0\n });\n};\n\nexport const setDocumentScrollInstantly = (\n targetWindow: Window,\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = position.left;\n scrollElement.scrollTop = position.top;\n return;\n }\n\n targetWindow.scrollTo(position.left, position.top);\n};\n\nexport const getReviewItemExpectedDocumentRect = (item: ReviewItem) => {\n const scroll = item.scroll ?? { x: 0, y: 0 };\n const selection = item.selection?.viewport;\n if (\n selection &&\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n ) {\n return {\n left: scroll.x + selection.x,\n top: scroll.y + selection.y,\n width: selection.width,\n height: selection.height\n };\n }\n\n const marker = item.marker?.viewport;\n if (marker && typeof marker.x === 'number' && typeof marker.y === 'number') {\n return {\n left: scroll.x + marker.x,\n top: scroll.y + marker.y,\n width: 1,\n height: 1\n };\n }\n\n return undefined;\n};\n\nexport const getReviewAnchorMatchScore = (\n element: Element,\n expectedRect:\n | {\n left: number;\n top: number;\n width: number;\n height: number;\n }\n | undefined,\n textFingerprint: string | undefined,\n candidateIndex: number\n) => {\n const rect = getElementDocumentRect(element);\n let score = candidateIndex * 25;\n\n if (expectedRect) {\n score += Math.abs(rect.top - expectedRect.top);\n score += Math.abs(rect.left - expectedRect.left) * 0.25;\n score += Math.abs(rect.width - expectedRect.width) * 0.1;\n score += Math.abs(rect.height - expectedRect.height) * 0.1;\n }\n\n if (textFingerprint) {\n score +=\n (1 - getReviewTextFingerprintScore(textFingerprint, element)) * 100;\n }\n\n return score;\n};\n\nexport const getElementDocumentRect = (element: Element) => {\n const rect = element.getBoundingClientRect();\n const view = element.ownerDocument.defaultView;\n\n return {\n left: rect.left + (view?.scrollX ?? 0),\n top: rect.top + (view?.scrollY ?? 0),\n width: rect.width,\n height: rect.height\n };\n};\n\nconst clampDocumentScrollPosition = (\n targetDocument: Document,\n position: { left: number; top: number }\n) => {\n const scrollElement = targetDocument.scrollingElement;\n const view = targetDocument.defaultView;\n const maxLeft = Math.max(\n 0,\n (scrollElement?.scrollWidth ?? 0) - (view?.innerWidth ?? 0)\n );\n const maxTop = Math.max(\n 0,\n (scrollElement?.scrollHeight ?? 0) - (view?.innerHeight ?? 0)\n );\n\n return {\n left: Math.min(Math.max(0, Math.round(position.left)), maxLeft),\n top: Math.min(Math.max(0, Math.round(position.top)), maxTop)\n };\n};\n\nexport const getReviewTextFingerprintScore = (expected: string, element: Element) => {\n const actual = element.textContent?.replace(/\\s+/g, ' ').trim();\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getReviewFingerprintTokens(expected);\n const actualTokens = new Set(getReviewFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return Math.min(Math.max(matches.length / expectedTokens.length, 0.25), 0.76);\n};\n\nexport const getReviewFingerprintTokens = (value: string) =>\n value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n\nexport const isScrollableReviewAnchorElement = (element: Element) => {\n const id = element.id.trim().toLowerCase();\n if (\n element === element.ownerDocument.body ||\n element === element.ownerDocument.documentElement ||\n ['app', 'main', 'page', 'root', '__next', '__nuxt'].includes(id)\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n const viewportHeight = element.ownerDocument.documentElement.clientHeight;\n const scrollHeight = element.ownerDocument.documentElement.scrollHeight;\n return !(\n scrollHeight > viewportHeight * 1.5 && rect.height > viewportHeight * 3\n );\n};\n","import {\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n Scan as ScanIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n StickyNote as StickyNoteIcon,\n} from 'lucide-react';\nimport type { ReviewItem, ReviewItemScope } from '../../types';\nimport { isAnchorRestorableReviewItem } from '../anchor.restore';\n\nexport const ReviewScopeIcon = ({ scope }: { scope: ReviewItemScope }) => {\n if (scope === 'mobile') return <SmartphoneIcon aria-hidden=\"true\" />;\n if (scope === 'tablet') return <TabletIcon aria-hidden=\"true\" />;\n if (scope === 'wide') return <Maximize2Icon aria-hidden=\"true\" />;\n if (scope === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <MonitorIcon aria-hidden=\"true\" />;\n};\n\nexport const getReviewItemMode = (item: ReviewItem) =>\n isAnchorRestorableReviewItem(item) ? 'dom' : item.kind;\n\nexport const ReviewItemModeIcon = ({\n mode,\n}: {\n mode: ReturnType<typeof getReviewItemMode>;\n}) => {\n if (mode === 'area') return <ScanIcon aria-hidden=\"true\" />;\n if (mode === 'dom') return <SquareMousePointerIcon aria-hidden=\"true\" />;\n return <StickyNoteIcon aria-hidden=\"true\" />;\n};\n","import {\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 type { TargetOverlayState } from '../types';\n\nexport const HIDE_SCROLLBAR_STYLE_ID = 'df-review-hide-scrollbar';\nexport const FIGMA_POINTER_LOCK_STYLE_ID = 'df-review-figma-pointer-lock';\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 setTargetFigmaOverlayLocked = (\n targetDocument: Document | null | undefined,\n locked: boolean\n) => {\n if (!targetDocument) return;\n\n const existing = targetDocument.getElementById(FIGMA_POINTER_LOCK_STYLE_ID);\n if (locked) {\n if (existing) return;\n const style = targetDocument.createElement('style');\n style.id = FIGMA_POINTER_LOCK_STYLE_ID;\n style.textContent = [\n '.helper-figma-root,',\n '.helper-figma-root *,',\n '.helper-figma-loading-backdrop,',\n '.helper-figma-loading-backdrop * {',\n 'pointer-events: none !important;',\n '}',\n ].join('\\n');\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\nconst TRUE_STORAGE_VALUES = new Set([\n '1',\n 'true',\n 'on',\n 'show',\n 'shown',\n 'visible',\n 'enabled',\n 'yes',\n]);\n\nconst OVERLAY_STORAGE_KEYS = {\n grid: ['isHelp', 'df-review-grid-overlay', 'dfReviewGridOverlay'],\n figma: ['isFigmaHelp', 'df-review-figma-overlay', 'dfReviewFigmaOverlay'],\n} satisfies Record<keyof TargetOverlayState, string[]>;\n\nconst isStoredOverlayEnabled = (value: string | null | undefined) =>\n TRUE_STORAGE_VALUES.has(value?.trim().toLowerCase() ?? '');\n\nconst getCookieValue = (\n targetDocument: Document | undefined,\n name: string\n) => {\n const cookies = targetDocument?.cookie ? targetDocument.cookie.split(';') : [];\n const prefix = `${name}=`;\n const match = cookies\n .map((cookie) => cookie.trim())\n .find((cookie) => cookie.startsWith(prefix));\n\n return match ? decodeURIComponent(match.slice(prefix.length)) : null;\n};\n\nconst getStorageValue = (\n storage: Storage | undefined,\n key: string\n): string | null => {\n try {\n return storage?.getItem(key) ?? null;\n } catch {\n return null;\n }\n};\n\nconst getStoredOverlayState = (\n targetDocument: Document | undefined,\n overlay: keyof TargetOverlayState\n) => {\n const targetWindow = targetDocument?.defaultView;\n\n return OVERLAY_STORAGE_KEYS[overlay].some((key) => {\n if (isStoredOverlayEnabled(getCookieValue(targetDocument, key))) {\n return true;\n }\n\n return (\n isStoredOverlayEnabled(getStorageValue(targetWindow?.localStorage, key)) ||\n isStoredOverlayEnabled(getStorageValue(targetWindow?.sessionStorage, key))\n );\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 getStoredOverlayState(targetDocument, 'grid')\n ),\n figma: Boolean(\n targetDocument?.querySelector(\n '.helper-figma-root, .helper-figma-loading-backdrop'\n ) || getStoredOverlayState(targetDocument, 'figma')\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 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 { ReviewItem } from './types';\n\nexport function getItemRouteKey(\n item: Pick<ReviewItem, 'routeKey' | 'normalizedPath'>\n) {\n return item.routeKey || normalizeRoutePath(item.normalizedPath);\n}\n\nexport function normalizeRoutePath(pathname: string) {\n const [pathWithoutQuery] = pathname.split(/[?#]/);\n const path = (pathWithoutQuery || '/').replace(/\\/index\\.html$/, '/');\n return path.startsWith('/') ? path : `/${path}`;\n}\n","import { getItemRouteKey } from '../route';\nimport { matchesReviewItemStatus } from '../status';\nimport type {\n LocalAdapterOptions,\n ReviewItem,\n WebReviewKitAdapter,\n} from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'df-web-review-kit:items';\n\nexport function localAdapter(\n options: LocalAdapterOptions = {}\n): WebReviewKitAdapter {\n const storageKey = options.storageKey ?? DEFAULT_STORAGE_KEY;\n\n const write = (items: ReviewItem[]) => {\n window.localStorage.setItem(storageKey, JSON.stringify(items));\n };\n\n const read = (): ReviewItem[] => {\n if (typeof window === 'undefined') return [];\n\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return [];\n\n try {\n const value = JSON.parse(raw);\n if (!Array.isArray(value)) return [];\n\n let changed = false;\n const items = value.flatMap((item) => {\n const normalized = normalizeStoredReviewItem(item);\n if (!normalized || normalized !== item) changed = true;\n return normalized ? [normalized] : [];\n });\n\n if (changed) write(items);\n return items;\n } catch {\n return [];\n }\n };\n\n return {\n async get(id) {\n return read().find((item) => item.id === id) ?? null;\n },\n\n async list(query) {\n return read().filter((item) => {\n if (item.projectId !== query.projectId) return false;\n const queryRouteKey = query.routeKey ?? query.normalizedPath;\n if (\n queryRouteKey &&\n getItemRouteKey(item) !== queryRouteKey\n ) {\n return false;\n }\n if (query.status && !matchesReviewItemStatus(item.status, query.status)) {\n return false;\n }\n return true;\n });\n },\n\n async create(item) {\n const items = read();\n items.unshift(item);\n write(items);\n return item;\n },\n\n async update(id, patch) {\n const items = read();\n const index = items.findIndex((item) => item.id === id);\n\n if (index < 0) {\n throw new Error(`Review item not found: ${id}`);\n }\n\n const next: ReviewItem = {\n ...items[index],\n ...patch,\n id,\n createdAt: items[index].createdAt,\n updatedAt: new Date().toISOString(),\n };\n\n items[index] = next;\n write(items);\n return next;\n },\n\n async remove(id) {\n write(read().filter((item) => item.id !== id));\n },\n };\n}\n\nfunction normalizeStoredReviewItem(value: unknown): ReviewItem | undefined {\n if (!value || typeof value !== 'object') return undefined;\n\n const raw = value as Omit<ReviewItem, 'kind'> & {\n kind?: string;\n reviewNumber?: unknown;\n screenshot?: unknown;\n };\n const kind =\n raw.kind === 'text' ? 'note' :\n raw.kind === 'capture' ? 'area' :\n raw.kind;\n\n if (kind !== 'note' && kind !== 'area') return undefined;\n\n const { screenshot: _screenshot, reviewNumber: _reviewNumber, ...item } = raw;\n\n if (\n kind === raw.kind &&\n _screenshot === undefined &&\n _reviewNumber === undefined\n ) {\n return raw as ReviewItem;\n }\n\n return {\n ...item,\n kind,\n } as ReviewItem;\n}\n","import type {\n RelativeSelection,\n ReviewPoint,\n ViewportSize,\n} from '../types';\n\n/** Rectangle expressed in the target viewport coordinate space. */\nexport interface ViewportSelection {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/** Same-origin target document plus its placement inside the host shell. */\nexport interface ReviewEnvironment {\n window: Window;\n document: Document;\n viewportRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n overlayRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n}\n\n/** Returns true when two viewport rectangles overlap. */\nexport function rectanglesIntersect(\n a: ViewportSelection,\n b: ViewportSelection\n) {\n return (\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top\n );\n}\n\n/** Converts a point into a 1x1 selection for shared selection handling. */\nexport function getPointSelection(point: ReviewPoint): ViewportSelection {\n return {\n left: point.x,\n top: point.y,\n width: 1,\n height: 1,\n };\n}\n\n/** Converts public API selection fields into internal viewport rectangle fields. */\nexport function toViewportSelection(\n selection: RelativeSelection\n): ViewportSelection {\n return {\n left: selection.x,\n top: selection.y,\n width: selection.width,\n height: selection.height,\n };\n}\n\n/** Rounds an internal viewport rectangle back to the public selection shape. */\nexport function toPublicSelection(\n selection: ViewportSelection\n): RelativeSelection {\n return {\n x: Math.round(selection.left),\n y: Math.round(selection.top),\n width: Math.round(selection.width),\n height: Math.round(selection.height),\n };\n}\n\n/** Finds the center point of either internal or public selection shapes. */\nexport function getSelectionCenter(\n selection: ViewportSelection | RelativeSelection\n): ReviewPoint {\n if ('left' in selection) {\n return {\n x: selection.left + selection.width / 2,\n y: selection.top + selection.height / 2,\n };\n }\n\n return {\n x: selection.x + selection.width / 2,\n y: selection.y + selection.height / 2,\n };\n}\n\n/** Runtime guard for legacy and current persisted selection values. */\nexport function isRelativeSelection(value: unknown): value is RelativeSelection {\n if (!value || typeof value !== 'object') return false;\n\n const selection = value as Partial<RelativeSelection>;\n return (\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n );\n}\n\n/** Reads the active target viewport size, falling back to the host window. */\nexport function getViewportSize(\n environment?: ReviewEnvironment\n): ViewportSize {\n const targetWindow = environment?.window ?? window;\n return {\n width: targetWindow.innerWidth,\n height: targetWindow.innerHeight,\n };\n}\n\n/** Returns whether a target-space point is currently visible in the target viewport. */\nexport function isPointInViewport(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return (\n point.x >= 0 &&\n point.y >= 0 &&\n point.x <= viewport.width &&\n point.y <= viewport.height\n );\n}\n\n/** Returns whether any part of a target-space selection is visible. */\nexport function isSelectionInViewport(\n selection: ViewportSelection,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return rectanglesIntersect(selection, {\n left: 0,\n top: 0,\n width: viewport.width,\n height: viewport.height,\n });\n}\n\n/** Clamps a target-space point to the visible target viewport. */\nexport function clampPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return {\n x: clamp(point.x, 0, viewport.width),\n y: clamp(point.y, 0, viewport.height),\n };\n}\n\n/** Places a popover inside the current overlay bounds near a host-space point. */\nexport function getPopoverPosition(\n point: ReviewPoint,\n environment?: ReviewEnvironment,\n options?: {\n width?: number;\n estimatedHeight?: number;\n offset?: number;\n }\n) {\n const bounds = getPopoverBounds(environment);\n const margin = 12;\n const width = Math.min(\n options?.width ?? 320,\n Math.max(240, bounds.width - margin * 2)\n );\n const estimatedHeight = options?.estimatedHeight ?? 178;\n const offset = options?.offset ?? 12;\n\n return {\n left: clamp(\n point.x + offset,\n bounds.left + margin,\n bounds.left + bounds.width - width - margin\n ),\n top: clamp(\n point.y + offset,\n bounds.top + margin,\n bounds.top + bounds.height - estimatedHeight - margin\n ),\n };\n}\n\n/** Places the area draft popover near the selected area edge. */\nexport function getAreaPopoverPosition(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n) {\n return getPopoverPosition(\n {\n x: selection.left + selection.width,\n y: selection.top,\n },\n environment,\n {\n width: 360,\n estimatedHeight: 206,\n }\n );\n}\n\n/** Uses overlay bounds when embedded in a shell, otherwise the host viewport. */\nexport function getPopoverBounds(environment?: ReviewEnvironment) {\n if (!environment) {\n return {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n\n return environment.overlayRect;\n}\n\n/** Converts a target-space point to the host shell coordinate space. */\nexport function toHostPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n if (!environment) return point;\n\n return {\n x: point.x + environment.viewportRect.left,\n y: point.y + environment.viewportRect.top,\n };\n}\n\n/** Converts a target-space rectangle to the host shell coordinate space. */\nexport function toHostSelection(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n): ViewportSelection {\n return {\n left: selection.left + environment.viewportRect.left,\n top: selection.top + environment.viewportRect.top,\n width: selection.width,\n height: selection.height,\n };\n}\n\n/** Converts a host-space point back into target viewport coordinates. */\nexport function toTargetPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n if (!environment) return point;\n\n return {\n x: point.x - environment.viewportRect.left,\n y: point.y - environment.viewportRect.top,\n };\n}\n\n/** Extracts a host pointer event position as a target-space point. */\nexport function toTargetPointFromHostEvent(\n event: Pick<PointerEvent, 'clientX' | 'clientY'>,\n environment?: ReviewEnvironment\n) {\n return toTargetPoint(\n {\n x: event.clientX,\n y: event.clientY,\n },\n environment\n );\n}\n\n/** Sizes and positions an overlay layer to cover the target viewport in host space. */\nexport function placeLayerOverTarget(\n layer: HTMLElement,\n environment: ReviewEnvironment\n) {\n layer.style.left = `${environment.viewportRect.left}px`;\n layer.style.top = `${environment.viewportRect.top}px`;\n layer.style.width = `${environment.viewportRect.width}px`;\n layer.style.height = `${environment.viewportRect.height}px`;\n layer.style.right = 'auto';\n layer.style.bottom = 'auto';\n}\n\n/** Clamps a value even when max is smaller than min. */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), Math.max(min, max));\n}\n\n/** Keeps persisted relative coordinates stable without excessive precision. */\nexport function roundRatio(value: number) {\n return Math.round(value * 10000) / 10000;\n}\n\n/** Rounds a point to pixel coordinates for persisted review data. */\nexport function roundPoint(point: ReviewPoint): ReviewPoint {\n return {\n x: Math.round(point.x),\n y: Math.round(point.y),\n };\n}\n","import type {\n DomAnchor,\n DomAnchorCandidate,\n DomSourceHint,\n RelativeSelection,\n ReviewPoint,\n} from '../types';\nimport {\n clamp,\n roundRatio,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\n\nconst COMMON_ANCHOR_ATTRIBUTES = [\n 'data-testid',\n 'data-test-id',\n 'data-cy',\n 'data-test',\n 'data-qa',\n 'data-section-id',\n 'data-component',\n];\n\nconst SEMANTIC_ANCHOR_ATTRIBUTES = [\n 'aria-label',\n 'title',\n 'name',\n 'href',\n];\n\n/** Resolves a DOM anchor from the center of a target-space selection. */\nexport function getDomAnchor(\n selection: ViewportSelection,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const x = selection.left + selection.width / 2;\n const y = selection.top + selection.height / 2;\n return getDomAnchorFromPoint({ x, y }, configuredAttribute, environment);\n}\n\n/** Builds the best DOM anchor candidate set from a target-space point. */\nexport function getDomAnchorFromPoint(\n point: ReviewPoint,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const target = environment.document.elementFromPoint(point.x, point.y);\n if (!target) return undefined;\n\n const candidates = createAnchorCandidates(target, configuredAttribute);\n const primary = candidates[0];\n if (!primary) return undefined;\n\n return {\n ...primary,\n candidates,\n htmlSnippet: getElementHtmlSnippet(\n getAnchorSourceElement(target, primary, configuredAttribute) ?? target\n ),\n source: getDomSourceHint(target),\n };\n}\n\n/** Reads the current target-space rectangle for a previously captured anchor. */\nexport function getElementViewportSelection(\n anchor: DomAnchor,\n environment: ReviewEnvironment,\n preferredSelection?: ViewportSelection\n): ViewportSelection | undefined {\n const element = getAnchorElement(anchor, environment, preferredSelection);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return undefined;\n\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n}\n\n/** Stores a selection relative to an anchor so it can survive layout shifts. */\nexport function getRelativeSelection(\n selection: ViewportSelection,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): RelativeSelection | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((selection.left - rect.left) / rect.width),\n y: roundRatio((selection.top - rect.top) / rect.height),\n width: roundRatio(selection.width / rect.width),\n height: roundRatio(selection.height / rect.height),\n };\n}\n\n/** Stores a point relative to an anchor so marker positions can be rebound. */\nexport function getRelativePoint(\n point: ReviewPoint,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): ReviewPoint | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((point.x - rect.left) / rect.width),\n y: roundRatio((point.y - rect.top) / rect.height),\n };\n}\n\n/** Returns the primary anchor plus any fallback candidates without duplicates. */\nexport function getAnchorCandidates(anchor: DomAnchor) {\n return dedupeAnchorCandidates([\n anchor,\n ...(anchor.candidates ?? []),\n ]);\n}\n\n/** Finds the best current DOM element for a persisted anchor candidate set. */\nexport function resolveAnchorElement(\n anchor: DomAnchor,\n environment: ReviewEnvironment,\n preferredSelection?: ViewportSelection\n) {\n // Try every persisted candidate because IDs/classes can disappear between builds.\n const matches = getAnchorCandidates(anchor).flatMap((candidate) => {\n const textFingerprint = candidate.textFingerprint ?? anchor.textFingerprint;\n\n if (!preferredSelection) {\n const match = queryBestAnchorCandidate(\n candidate,\n textFingerprint,\n environment\n );\n\n if (!match) return [];\n\n const confidence = roundRatio(\n (candidate.confidence ?? 0.5) * match.score\n );\n\n return [{\n element: match.element,\n candidate,\n confidence,\n }];\n }\n\n return queryAnchorElements(candidate.selector, environment).map((element) => {\n const confidence = roundRatio(\n (candidate.confidence ?? 0.5) *\n getTextFingerprintScore(textFingerprint, getTextFingerprint(element)) *\n getSelectionMatchScore(element, preferredSelection)\n );\n\n return {\n element,\n candidate,\n confidence,\n };\n });\n });\n\n return matches.sort((a, b) => b.confidence - a.confidence)[0];\n}\n\n/** CSS.escape wrapper with a small fallback for older browsers. */\nexport function cssEscape(value: string) {\n if ('CSS' in window && typeof window.CSS.escape === 'function') {\n return window.CSS.escape(value);\n }\n\n return value.replace(/[^a-zA-Z0-9_-]/g, '\\\\$&');\n}\n\nfunction getAnchorElement(\n anchor: DomAnchor | string,\n environment: ReviewEnvironment,\n preferredSelection?: ViewportSelection\n) {\n return typeof anchor === 'string'\n ? queryAnchorElement(anchor, environment)\n : resolveAnchorElement(anchor, environment, preferredSelection)?.element;\n}\n\nfunction createAnchorCandidates(\n target: Element,\n configuredAttribute: string\n): DomAnchorCandidate[] {\n const targetCandidates: DomAnchorCandidate[] = [];\n\n // Prefer the deepest clicked element. Ancestor anchors are kept as fallbacks.\n const configuredAnchor = getExactAttributeAnchorCandidate(\n target,\n configuredAttribute,\n 0.98,\n 'configured-attribute'\n );\n if (configuredAnchor) targetCandidates.push(configuredAnchor);\n\n const targetAttributeAnchor = getAttributeAnchorCandidate(\n target,\n COMMON_ANCHOR_ATTRIBUTES.filter((name) => name !== configuredAttribute),\n 0.9\n );\n if (targetAttributeAnchor) targetCandidates.push(targetAttributeAnchor);\n\n if (isMeaningfulId(target.id)) {\n targetCandidates.push({\n selector: `#${cssEscape(target.id)}`,\n strategy: 'id',\n confidence: 0.94,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n const semanticAnchor = getAttributeAnchorCandidate(\n target,\n SEMANTIC_ANCHOR_ATTRIBUTES,\n 0.84\n );\n if (semanticAnchor) targetCandidates.push(semanticAnchor);\n\n const targetClassName = getMeaningfulClassName(target);\n if (targetClassName) {\n targetCandidates.push({\n selector: `${target.tagName.toLowerCase()}.${cssEscape(targetClassName)}`,\n strategy: 'class',\n confidence: 0.82,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n const scopedPath = getScopedDomPathCandidate(target, configuredAttribute);\n if (scopedPath) targetCandidates.push(scopedPath);\n\n const targetDomPath: DomAnchorCandidate = {\n selector: getDomPath(target),\n strategy: 'dom-path',\n confidence: targetCandidates.length > 0 ? 0.8 : 0.5,\n textFingerprint: getTextFingerprint(target),\n };\n\n const parentCandidates: DomAnchorCandidate[] = [];\n\n const parent = target.parentElement;\n const parentConfiguredAnchor = parent\n ? findClosestAttributeAnchor(parent, [configuredAttribute], 0.72, {\n strategy: 'configured-attribute',\n })\n : undefined;\n if (parentConfiguredAnchor) parentCandidates.push(parentConfiguredAnchor);\n\n const anchoredByAttribute = parent\n ? findClosestAttributeAnchor(\n parent,\n COMMON_ANCHOR_ATTRIBUTES.filter((name) => name !== configuredAttribute),\n 0.7\n )\n : undefined;\n if (anchoredByAttribute) parentCandidates.push(anchoredByAttribute);\n\n const anchoredById = parent\n ? findClosest(parent, (element) => isMeaningfulId(element.id))\n : undefined;\n if (anchoredById?.id) {\n parentCandidates.push({\n selector: `#${cssEscape(anchoredById.id)}`,\n strategy: 'id',\n confidence: 0.72,\n textFingerprint: getTextFingerprint(anchoredById),\n });\n }\n\n const anchoredByClass = parent\n ? findClosest(parent, (element) => Boolean(getMeaningfulClassName(element)))\n : undefined;\n const className = anchoredByClass\n ? getMeaningfulClassName(anchoredByClass)\n : undefined;\n\n if (anchoredByClass && className) {\n parentCandidates.push({\n selector: `${anchoredByClass.tagName.toLowerCase()}.${cssEscape(\n className\n )}`,\n strategy: 'class',\n confidence: 0.58,\n textFingerprint: getTextFingerprint(anchoredByClass),\n });\n }\n\n const candidates =\n targetCandidates.length > 0\n ? [...targetCandidates, targetDomPath, ...parentCandidates]\n : [...parentCandidates, targetDomPath];\n\n return dedupeAnchorCandidates(candidates);\n}\n\nfunction findClosestAttributeAnchor(\n target: Element,\n attributeNames: string[],\n confidence: number,\n options?: {\n strategy?: DomAnchorCandidate['strategy'];\n }\n): DomAnchorCandidate | undefined {\n for (const attributeName of attributeNames) {\n const selector = `[${attributeName}]`;\n const element = safeClosest(target, selector);\n if (!element) continue;\n\n const value = getStableAttributeValue(element, attributeName);\n if (!value) continue;\n\n return {\n selector: `[${attributeName}=\"${cssEscape(value)}\"]`,\n strategy: options?.strategy ?? 'attribute',\n confidence,\n textFingerprint: getTextFingerprint(element),\n };\n }\n\n return undefined;\n}\n\nfunction getExactAttributeAnchorCandidate(\n element: Element,\n attributeName: string,\n confidence: number,\n strategy: DomAnchorCandidate['strategy']\n): DomAnchorCandidate | undefined {\n const value = getStableAttributeValue(element, attributeName);\n if (!value) return undefined;\n\n return {\n selector: `[${attributeName}=\"${cssEscape(value)}\"]`,\n strategy,\n confidence,\n textFingerprint: getTextFingerprint(element),\n };\n}\n\nfunction getAttributeAnchorCandidate(\n element: Element,\n attributeNames: string[],\n confidence: number\n): DomAnchorCandidate | undefined {\n for (const attributeName of attributeNames) {\n const value = getStableAttributeValue(element, attributeName);\n if (!value) continue;\n\n return {\n selector: `${element.tagName.toLowerCase()}[${attributeName}=\"${cssEscape(\n value\n )}\"]`,\n strategy: 'attribute',\n confidence,\n textFingerprint: getTextFingerprint(element),\n };\n }\n\n return undefined;\n}\n\nfunction getScopedDomPathCandidate(\n target: Element,\n configuredAttribute: string\n): DomAnchorCandidate | undefined {\n const parent = target.parentElement;\n if (!parent) return undefined;\n\n const anchor = findStableAncestorSelector(parent, configuredAttribute);\n if (!anchor) return undefined;\n\n const selector = getDomPathBetween(anchor.element, target, anchor.selector);\n if (!selector) return undefined;\n\n return {\n selector,\n strategy: 'dom-path',\n confidence: anchor.confidence,\n textFingerprint: getTextFingerprint(target),\n };\n}\n\nfunction findStableAncestorSelector(\n start: Element,\n configuredAttribute: string\n) {\n let element: Element | null = start;\n const root = start.ownerDocument.documentElement;\n\n while (element && element !== root) {\n const configuredValue = getStableAttributeValue(element, configuredAttribute);\n if (configuredValue) {\n return {\n element,\n selector: `[${configuredAttribute}=\"${cssEscape(configuredValue)}\"]`,\n confidence: 0.88,\n };\n }\n\n const attributeAnchor = getAttributeAnchorCandidate(\n element,\n COMMON_ANCHOR_ATTRIBUTES.filter((name) => name !== configuredAttribute),\n 0.84\n );\n if (attributeAnchor) {\n return {\n element,\n selector: attributeAnchor.selector,\n confidence: 0.84,\n };\n }\n\n if (isMeaningfulId(element.id)) {\n return {\n element,\n selector: `#${cssEscape(element.id)}`,\n confidence: 0.82,\n };\n }\n\n const className = getMeaningfulClassName(element);\n if (className) {\n return {\n element,\n selector: `${element.tagName.toLowerCase()}.${cssEscape(className)}`,\n confidence: 0.76,\n };\n }\n\n element = element.parentElement;\n }\n\n return undefined;\n}\n\nfunction getAnchorSourceElement(\n target: Element,\n candidate: DomAnchorCandidate,\n configuredAttribute: string\n) {\n if (candidate.strategy === 'configured-attribute') {\n return target.closest(`[${configuredAttribute}]`);\n }\n\n if (candidate.strategy === 'dom-path') return target;\n\n try {\n return target.closest(candidate.selector);\n } catch {\n return target;\n }\n}\n\nfunction safeClosest(element: Element, selector: string) {\n try {\n return element.closest(selector);\n } catch {\n return null;\n }\n}\n\nfunction getElementHtmlSnippet(element: Element, maxLength = 1000) {\n const html = decodeHtmlEntities(element.outerHTML.replace(/\\s+/g, ' ').trim());\n if (html.length <= maxLength) return html;\n return `${html.slice(0, maxLength - 3)}...`;\n}\n\nfunction decodeHtmlEntities(value: string) {\n return value.replace(\n /&(#\\d+|#x[\\da-f]+|lt|gt|quot|apos|amp);/gi,\n (match, entity: string) => {\n const normalized = entity.toLowerCase();\n\n if (normalized === 'lt') return '<';\n if (normalized === 'gt') return '>';\n if (normalized === 'quot') return '\"';\n if (normalized === 'apos') return \"'\";\n if (normalized === 'amp') return '&';\n\n const codePoint = normalized.startsWith('#x')\n ? Number.parseInt(normalized.slice(2), 16)\n : Number.parseInt(normalized.slice(1), 10);\n\n return Number.isFinite(codePoint)\n ? String.fromCodePoint(codePoint)\n : match;\n }\n );\n}\n\nfunction getDomSourceHint(target: Element): DomSourceHint | undefined {\n const sourceElement = target.closest(\n [\n '[data-wrk-source-file]',\n '[data-wrk-source-component]',\n '[data-wrk-source-line]',\n '[data-wrk-source-column]',\n '[data-file]',\n '[data-component]',\n '[data-section-index]',\n '[data-section-id]',\n ].join(', ')\n );\n if (!sourceElement) return undefined;\n\n const source: DomSourceHint = {\n component: getSourceAttribute(\n sourceElement,\n 'data-wrk-source-component',\n 'data-component'\n ),\n file: getSourceAttribute(sourceElement, 'data-wrk-source-file', 'data-file'),\n line: getSourceAttribute(sourceElement, 'data-wrk-source-line'),\n column: getSourceAttribute(sourceElement, 'data-wrk-source-column'),\n sectionId: getSourceAttribute(sourceElement, 'data-section-id'),\n sectionIndex: getSourceAttribute(sourceElement, 'data-section-index'),\n };\n\n return Object.values(source).some(Boolean) ? source : undefined;\n}\n\nfunction getSourceAttribute(element: Element, ...names: string[]) {\n for (const name of names) {\n const value = element.getAttribute(name)?.trim();\n if (value) return value;\n }\n\n return undefined;\n}\n\nfunction dedupeAnchorCandidates(candidates: DomAnchorCandidate[]) {\n const seen = new Set<string>();\n\n return candidates.filter((candidate) => {\n const key = `${candidate.strategy}:${candidate.selector}`;\n if (seen.has(key)) return false;\n\n seen.add(key);\n return true;\n });\n}\n\nfunction queryBestAnchorCandidate(\n candidate: DomAnchorCandidate,\n textFingerprint: string | undefined,\n environment: ReviewEnvironment\n) {\n const elements = queryAnchorElements(candidate.selector, environment);\n if (elements.length === 0) return undefined;\n if (!textFingerprint) {\n return {\n element: elements[0],\n score: 1,\n };\n }\n\n // If a selector matches multiple nodes, text similarity keeps restore deterministic.\n return elements\n .map((element) => ({\n element,\n score: getTextFingerprintScore(\n textFingerprint,\n getTextFingerprint(element)\n ),\n }))\n .sort((a, b) => b.score - a.score)[0];\n}\n\nfunction queryAnchorElement(selector: string, environment: ReviewEnvironment) {\n return queryAnchorElements(selector, environment)[0];\n}\n\nfunction queryAnchorElements(selector: string, environment: ReviewEnvironment) {\n try {\n return Array.from(environment.document.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction findClosest(\n start: Element,\n predicate: (element: Element) => boolean\n) {\n let element: Element | null = start;\n const root = start.ownerDocument.documentElement;\n\n while (element && element !== root) {\n if (predicate(element)) return element;\n element = element.parentElement;\n }\n\n return undefined;\n}\n\nfunction getDomPath(element: Element) {\n const parts: string[] = [];\n let current: Element | null = element;\n const ownerDocument = element.ownerDocument;\n\n while (\n current &&\n current !== ownerDocument.body &&\n current !== ownerDocument.documentElement\n ) {\n const parent: Element | null = current.parentElement;\n const tag = current.tagName.toLowerCase();\n\n if (!parent) {\n parts.unshift(tag);\n break;\n }\n\n const currentTagName = current.tagName;\n const siblings: Element[] = Array.from(parent.children).filter(\n (child) => child.tagName === currentTagName\n );\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${tag}:nth-of-type(${index})`);\n current = parent;\n }\n\n return `body > ${parts.join(' > ')}`;\n}\n\nfunction getDomPathBetween(\n ancestor: Element,\n target: Element,\n ancestorSelector: string\n) {\n const parts: string[] = [];\n let current: Element | null = target;\n\n while (current && current !== ancestor) {\n parts.unshift(getDomPathPart(current));\n current = current.parentElement;\n }\n\n if (current !== ancestor || parts.length === 0) return undefined;\n\n return `${ancestorSelector} > ${parts.join(' > ')}`;\n}\n\nfunction getDomPathPart(element: Element) {\n const parent: Element | null = element.parentElement;\n const tag = element.tagName.toLowerCase();\n\n if (!parent) return tag;\n\n const currentTagName = element.tagName;\n const siblings: Element[] = Array.from(parent.children).filter(\n (child) => child.tagName === currentTagName\n );\n const index = siblings.indexOf(element) + 1;\n return `${tag}:nth-of-type(${index})`;\n}\n\nfunction getTextFingerprint(element: Element) {\n const text = element.textContent?.replace(/\\s+/g, ' ').trim();\n return text ? text.slice(0, 120) : undefined;\n}\n\nfunction getStableAttributeValue(element: Element, attributeName: string) {\n const value = element.getAttribute(attributeName)?.trim();\n if (!value || value.length > 160) return undefined;\n if (/^(true|false)$/i.test(value)) return undefined;\n if (/^\\d+$/.test(value) && value.length < 3) return undefined;\n\n return value;\n}\n\nfunction getTextFingerprintScore(expected?: string, actual?: string) {\n if (!expected) return 1;\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getFingerprintTokens(expected);\n const actualTokens = new Set(getFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return clamp(matches.length / expectedTokens.length, 0.25, 0.76);\n}\n\nfunction getSelectionMatchScore(\n element: Element,\n selection: ViewportSelection\n) {\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return 0.05;\n\n const overlapLeft = Math.max(rect.left, selection.left);\n const overlapTop = Math.max(rect.top, selection.top);\n const overlapRight = Math.min(rect.right, selection.left + selection.width);\n const overlapBottom = Math.min(rect.bottom, selection.top + selection.height);\n const overlapWidth = Math.max(0, overlapRight - overlapLeft);\n const overlapHeight = Math.max(0, overlapBottom - overlapTop);\n const overlapArea = overlapWidth * overlapHeight;\n\n if (overlapArea > 0) {\n const selectionArea = Math.max(1, selection.width * selection.height);\n const rectArea = Math.max(1, rect.width * rect.height);\n return 1 + overlapArea / Math.min(selectionArea, rectArea);\n }\n\n const rectCenterX = rect.left + rect.width / 2;\n const rectCenterY = rect.top + rect.height / 2;\n const selectionCenterX = selection.left + selection.width / 2;\n const selectionCenterY = selection.top + selection.height / 2;\n const distance = Math.hypot(\n rectCenterX - selectionCenterX,\n rectCenterY - selectionCenterY\n );\n const basis = Math.max(\n 1,\n rect.width,\n rect.height,\n selection.width,\n selection.height\n );\n\n return clamp(1 / (1 + distance / basis), 0.05, 0.95);\n}\n\nfunction getFingerprintTokens(value: string) {\n return value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n}\n\nfunction isMeaningfulId(value: string) {\n const normalized = value.trim().toLowerCase();\n if (normalized.length <= 1) return false;\n\n return ![\n 'app',\n 'main',\n 'page',\n 'root',\n '__next',\n '__nuxt',\n ].includes(normalized);\n}\n\nfunction getMeaningfulClassName(element: Element) {\n return Array.from(element.classList).find((name) => isMeaningfulClass(name));\n}\n\nfunction isMeaningfulClass(value: string) {\n const normalized = value.trim();\n if (\n [\n 'absolute',\n 'block',\n 'contents',\n 'fixed',\n 'flex',\n 'grid',\n 'hidden',\n 'relative',\n 'sticky',\n ].includes(normalized)\n ) {\n return false;\n }\n\n return (\n normalized.length > 2 &&\n !normalized.includes(':') &&\n !/^(aspect|basis|bg|border|bottom|col|content|delay|duration|ease|font|from|gap|grow|h|inset|items|justify|leading|left|m|max-h|max-w|mb|ml|mr|mt|mx|my|min-h|min-w|object|opacity|order|origin|overflow|p|pb|pl|place|pointer|pr|pt|px|py|right|rotate|rounded|row|scale|self|shadow|shrink|text|to|top|tracking|transition|translate|via|w|z)-/.test(\n normalized\n ) &&\n !normalized.startsWith('mq-')\n );\n}\n","/** Creates a stable item id with crypto UUID when available. */\nexport function createId() {\n if ('randomUUID' in crypto) return crypto.randomUUID();\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n","/** Matches configured hotkeys while supporting common Korean keyboard aliases. */\nexport function isHotkey(event: KeyboardEvent, hotkey: string) {\n const parts = hotkey\n .split('+')\n .map((part) => part.trim().toLowerCase())\n .filter(Boolean);\n const key = parts.find(\n (part) => !['shift', 'ctrl', 'control', 'alt', 'meta', 'cmd'].includes(part)\n );\n\n if (!key) return false;\n if (parts.includes('shift') !== event.shiftKey) return false;\n if (\n (parts.includes('ctrl') || parts.includes('control')) !== event.ctrlKey\n ) {\n return false;\n }\n if (parts.includes('alt') !== event.altKey) return false;\n if ((parts.includes('meta') || parts.includes('cmd')) !== event.metaKey) {\n return false;\n }\n\n return isHotkeyKey(event, key);\n}\n\nfunction isHotkeyKey(event: KeyboardEvent, key: string) {\n const normalizedKey = key.toLowerCase();\n\n if (event.key.toLowerCase() === normalizedKey) return true;\n\n if (getHotkeyCode(normalizedKey) === event.code) return true;\n\n const aliases: Record<string, string[]> = {\n q: ['ㅂ', 'ㅃ'],\n };\n\n return aliases[normalizedKey]?.includes(event.key) ?? false;\n}\n\nfunction getHotkeyCode(key: string) {\n if (/^[a-z]$/.test(key)) return `Key${key.toUpperCase()}`;\n if (/^[0-9]$/.test(key)) return `Digit${key}`;\n return undefined;\n}\n","import { normalizeRoutePath } from '../route';\nimport type { ReviewEnvironment } from './geometry';\n\nconst INTERNAL_QUERY_PARAMS = ['__dfwr_target'];\n\n/** Returns the public target URL without review-only query params. */\nexport function getPageUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\n/** Mirrors page URL today, kept separate for future canonical/original URL support. */\nexport function getOriginalUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\n/** Returns the normalized route key used for adapter queries. */\nexport function getRouteKey(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n return normalizeRoutePath(location.pathname);\n}\n\n/** Alias for route key until route and path concepts diverge. */\nexport function getNormalizedPath(environment?: ReviewEnvironment) {\n return getRouteKey(environment);\n}\n\nfunction getPublicSearch(location: Location) {\n const params = new URLSearchParams(location.search);\n\n INTERNAL_QUERY_PARAMS.forEach((key) => params.delete(key));\n\n const value = params.toString();\n return value ? `?${value}` : '';\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemScope,\n ReviewViewportPreset,\n ViewportSize,\n} from '../../types';\n\n/** Default viewport presets used when a host project does not provide its own. */\nexport const DEFAULT_REVIEW_VIEWPORTS: ReviewViewportPreset[] = [\n { label: 'Mobile', width: 390, height: 720, scope: 'mobile' },\n { label: 'Tablet', width: 768, height: 1024, scope: 'tablet' },\n { label: 'Desktop', width: 1440, height: 900, scope: 'desktop' },\n { label: 'Wide', width: 1980, height: 1080, scope: 'wide' },\n];\n\nconst REVIEW_SCOPE_LABELS: Record<ReviewItemScope, string> = {\n mobile: 'Mobile',\n tablet: 'Tablet',\n desktop: 'Desktop',\n wide: 'Wide',\n dom: 'Element',\n};\n\nconst normalizeReviewItemScope = (value: unknown): ReviewItemScope | undefined => {\n if (value === 'element') return 'dom';\n if (\n value === 'mobile' ||\n value === 'tablet' ||\n value === 'desktop' ||\n value === 'wide' ||\n value === 'dom'\n ) {\n return value;\n }\n\n return undefined;\n};\n\nconst getViewportPresetDistance = (\n preset: ReviewViewportPreset,\n viewport: ViewportSize\n) =>\n Math.abs(preset.width - viewport.width) +\n Math.abs(preset.height - viewport.height);\n\nconst inferViewportScope = (\n preset: ReviewViewportPreset\n): Exclude<ReviewItemScope, 'dom'> => {\n if (preset.scope) return preset.scope;\n\n const label = preset.label.toLowerCase();\n\n if (label.includes('mobile') || label.includes('phone')) return 'mobile';\n if (label.includes('tablet') || label.includes('pad')) return 'tablet';\n if (\n label.includes('wide') ||\n label.includes('1980') ||\n label.includes('1940') ||\n label.includes('1920')\n ) {\n return 'wide';\n }\n if (label.includes('desktop')) return 'desktop';\n if (preset.width >= 1800) return 'wide';\n if (preset.width >= 1000) return 'desktop';\n if (preset.width >= 700) return 'tablet';\n return 'mobile';\n};\n\n/** Finds the nearest configured preset for a viewport size. */\nexport function findReviewViewportPreset(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const fallback = presets[0] ?? DEFAULT_REVIEW_VIEWPORTS[0];\n const exact = presets.find(\n (preset) =>\n preset.width === viewport.width && preset.height === viewport.height\n );\n\n if (exact) return exact;\n\n return presets.reduce((closest, preset) => {\n const closestDistance = getViewportPresetDistance(closest, viewport);\n const presetDistance = getViewportPresetDistance(preset, viewport);\n return presetDistance < closestDistance ? preset : closest;\n }, fallback);\n}\n\n/** Resolves a viewport size to the review scope used for item grouping. */\nexport function getReviewViewportScope(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): Exclude<ReviewItemScope, 'dom'> {\n return inferViewportScope(findReviewViewportPreset(viewport, presets));\n}\n\n/** Resolves an item's persisted scope, falling back to its captured viewport. */\nexport function getReviewItemScope(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): ReviewItemScope {\n const scope = normalizeReviewItemScope(item.scope);\n if (scope && scope !== 'dom') return scope;\n return getReviewViewportScope(item.viewport, presets);\n}\n\n/** Returns the display label for an item's resolved review scope. */\nexport function getReviewItemScopeLabel(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const scope = getReviewItemScope(item, presets);\n if (scope === 'dom') return REVIEW_SCOPE_LABELS.dom;\n\n const preset = findReviewViewportPreset(item.viewport, presets);\n return preset.label || REVIEW_SCOPE_LABELS[scope];\n}\n\n/** Adds scope-aware display labels to review items without mutating them. */\nexport function getNumberedReviewItems(\n items: ReviewItem[],\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): NumberedReviewItem[] {\n const draftLabels = new Map<string, string>();\n let nextDraftNumber = 1;\n\n [...items]\n .sort((a, b) => {\n const createdOrder = a.createdAt.localeCompare(b.createdAt);\n if (createdOrder !== 0) return createdOrder;\n return a.id.localeCompare(b.id);\n })\n .forEach((item) => {\n if (!getReviewItemNumber(item)) {\n draftLabels.set(item.id, `draft-${nextDraftNumber++}`);\n }\n });\n\n return items.map((item) => {\n const scope = getReviewItemScope(item, presets);\n const label = getReviewItemScopeLabel(item, presets);\n const number = getReviewItemNumber(item);\n\n return {\n item,\n scope,\n label,\n number,\n displayLabel: number ? `#${number}` : draftLabels.get(item.id) ?? 'draft',\n };\n });\n}\n\n/** Reads a persisted review number when present. */\nexport function getReviewItemNumber(item: Pick<ReviewItem, 'reviewNumber'>) {\n return normalizeReviewNumber(item.reviewNumber);\n}\n\n\nfunction normalizeReviewNumber(value: unknown) {\n if (typeof value !== 'number') return undefined;\n if (!Number.isInteger(value) || value < 1) return undefined;\n return value;\n}\n","import type {\n DomAnchor,\n RelativeSelection,\n ReviewItem,\n ReviewItemScope,\n ReviewMarker,\n ReviewSelection,\n} from '../../types';\nimport {\n getElementViewportSelection,\n getRelativePoint,\n resolveAnchorElement,\n} from '../dom.anchor';\nimport {\n getSelectionCenter,\n isRelativeSelection,\n isSelectionInViewport,\n roundPoint,\n toViewportSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from '../geometry';\n\n/** Rendering mode used by marker and highlight overlays. */\nexport type ReviewItemHighlightMode = 'note' | 'area' | 'dom';\n\n/** Target-space highlight rectangle plus whether it was rebound to an anchor. */\nexport interface ReviewItemHighlightSelection {\n viewport: ViewportSelection;\n isBound: boolean;\n}\n\n/** Resolves a review marker to its current viewport point, with scroll fallback. */\nexport function getBoundMarkerPoint(\n item: ReviewItem,\n environment: ReviewEnvironment\n) {\n const marker = getItemMarker(item);\n if (!marker) return undefined;\n\n // Prefer anchor-relative positions because absolute viewport points drift after layout changes.\n if (item.kind !== 'area' && item.anchor && marker.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: roundPoint({\n x: rect.left + rect.width * marker.relative.x,\n y: rect.top + rect.height * marker.relative.y,\n }),\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n\n return {\n viewport: roundPoint({\n x: marker.viewport.x + sourceScroll.x - environment.window.scrollX,\n y: marker.viewport.y + sourceScroll.y - environment.window.scrollY,\n }),\n isBound: false,\n confidence: 0,\n };\n}\n\n/** Chooses the best visible highlight selection for the current target viewport. */\nexport function getItemHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (item.kind === 'area') {\n return getVisibleHighlightSelection(\n [\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n if (isDomReviewItem(item)) {\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n}\n\n/** Maps an item to its overlay visual treatment. */\nexport function getReviewItemHighlightMode(\n item: ReviewItem\n): ReviewItemHighlightMode {\n if (isDomReviewItem(item)) return 'dom';\n if (item.kind === 'area') return 'area';\n return 'note';\n}\n\n/** Returns an explicit marker or derives one from the item's selection center. */\nexport function getItemMarker(item: ReviewItem): ReviewMarker | undefined {\n if (item.marker) return item.marker;\n\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n return {\n viewport: roundPoint(getSelectionCenter(selection.viewport)),\n relative: selection.relative\n ? roundPoint(getSelectionCenter(selection.relative))\n : undefined,\n };\n}\n\n/** Normalizes current and legacy selection shapes into ReviewSelection. */\nexport function getItemSelection(item: ReviewItem): ReviewSelection | undefined {\n const value = item.selection as ReviewSelection | RelativeSelection | undefined;\n if (!value) return undefined;\n\n if ('viewport' in value && isRelativeSelection(value.viewport)) {\n return value;\n }\n\n if (isRelativeSelection(value)) {\n return {\n viewport: value,\n };\n }\n\n return undefined;\n}\n\n/** Filters markers to the active viewport scope. */\nexport function shouldShowMarkerForScope(\n scope: ReviewItemScope,\n currentScope: ReviewItemScope\n) {\n return scope === currentScope;\n}\n\n/** Creates a marker at the selection center and stores an anchor-relative fallback. */\nexport function createSelectionCenterMarker(\n selection: ViewportSelection,\n anchor: DomAnchor | undefined,\n environment: ReviewEnvironment\n): ReviewMarker {\n const centerPoint = getSelectionCenter(selection);\n\n return {\n viewport: roundPoint(centerPoint),\n relative: anchor ? getRelativePoint(centerPoint, anchor, environment) : undefined,\n };\n}\n\nfunction getBoundSelection(item: ReviewItem, environment: ReviewEnvironment) {\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n // Rebuild the rectangle from the anchor when possible, then fall back to scroll offset.\n if (item.kind !== 'area' && item.anchor && selection.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: {\n left: rect.left + rect.width * selection.relative.x,\n top: rect.top + rect.height * selection.relative.y,\n width: rect.width * selection.relative.width,\n height: rect.height * selection.relative.height,\n },\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n const viewportSelection = toViewportSelection(selection.viewport);\n\n return {\n viewport: {\n left: viewportSelection.left + sourceScroll.x - environment.window.scrollX,\n top: viewportSelection.top + sourceScroll.y - environment.window.scrollY,\n width: viewportSelection.width,\n height: viewportSelection.height,\n },\n isBound: item.kind === 'area',\n confidence: 0,\n };\n}\n\nfunction getAnchorHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (!item.anchor) return undefined;\n\n const viewport = getElementViewportSelection(item.anchor, environment);\n if (!viewport) return undefined;\n\n return {\n viewport,\n isBound: true,\n };\n}\n\nfunction getPointHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n const point = getBoundMarkerPoint(item, environment);\n if (!point) return undefined;\n\n const size = 16;\n return {\n viewport: {\n left: point.viewport.x - size / 2,\n top: point.viewport.y - size / 2,\n width: size,\n height: size,\n },\n isBound: point.isBound,\n };\n}\n\nfunction getVisibleHighlightSelection(\n candidates: Array<ReviewItemHighlightSelection | undefined>,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n // Candidate order encodes item-type priority; this only discards offscreen options.\n return candidates.find(\n (candidate): candidate is ReviewItemHighlightSelection =>\n Boolean(candidate && isSelectionInViewport(candidate.viewport, environment))\n );\n}\n\nfunction isDomReviewItem(item: ReviewItem) {\n return (\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && getItemSelection(item)))\n );\n}\n","import type { ReviewEnvironment } from './geometry';\n\n/** Waits one target animation frame before reading/restoring overlay state. */\nexport function waitForNextFrame(environment?: ReviewEnvironment) {\n return new Promise<void>((resolve) => {\n (environment?.window ?? window).requestAnimationFrame(() => resolve());\n });\n}\n\n/** Temporarily disables smooth scroll so restore lands synchronously. */\nexport function runWithAutoScrollBehavior(\n targetDocument: Document,\n callback: () => void\n) {\n const elements = [\n targetDocument.documentElement,\n targetDocument.body,\n ].filter((element): element is HTMLElement => Boolean(element));\n const previousValues = elements.map((element) => element.style.scrollBehavior);\n\n elements.forEach((element) => {\n element.style.scrollBehavior = 'auto';\n });\n\n try {\n callback();\n } finally {\n elements.forEach((element, index) => {\n element.style.scrollBehavior = previousValues[index] ?? '';\n });\n }\n}\n\n/** Restores target document scroll without relying on smooth scrolling behavior. */\nexport function setDocumentScrollInstantly(\n environment: ReviewEnvironment,\n position: { x: number; y: number }\n) {\n const scrollElement = environment.document.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = Math.max(0, Math.round(position.x));\n scrollElement.scrollTop = Math.max(0, Math.round(position.y));\n return;\n }\n\n environment.window.scrollTo(\n Math.max(0, Math.round(position.x)),\n Math.max(0, Math.round(position.y))\n );\n}\n","/** Creates the shadow-root stylesheet for the standalone core overlay. */\nexport function createStyleElement() {\n const style = document.createElement('style');\n style.textContent = `\n :host {\n color-scheme: dark;\n --df-review-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --df-review-font-size-2xs: 10px;\n --df-review-font-size-xs: 11px;\n --df-review-font-size-sm: 12px;\n --df-review-font-size-md: 13px;\n --df-review-font-size-xl: 15px;\n --df-review-space-1: 4px;\n --df-review-space-1-5: 6px;\n --df-review-space-2: 8px;\n --df-review-space-2-5: 10px;\n --df-review-space-3: 12px;\n --df-review-space-3-5: 14px;\n --df-review-space-4: 16px;\n --df-review-control-height-sm: 32px;\n --df-review-control-height-md: 34px;\n --df-review-radius-xs: 3px;\n --df-review-radius-sm: 6px;\n --df-review-radius-md: 8px;\n --df-review-radius-pill: 999px;\n --df-review-color-canvas: #111820;\n --df-review-color-panel: #1f2428;\n --df-review-color-panel-strong: #15191d;\n --df-review-color-control: #2c3338;\n --df-review-color-control-hover: #3b444b;\n --df-review-color-border: rgba(255, 255, 255, 0.14);\n --df-review-color-border-strong: rgba(255, 255, 255, 0.18);\n --df-review-color-text: #f7f7f2;\n --df-review-color-text-muted: rgba(247, 247, 242, 0.62);\n --df-review-color-text-subtle: rgba(247, 247, 242, 0.46);\n --df-review-color-accent: #d7ff5f;\n --df-review-color-accent-contrast: #171b1e;\n --df-review-color-accent-soft: rgba(215, 255, 95, 0.16);\n --df-review-color-accent-ring: rgba(215, 255, 95, 0.6);\n --df-review-color-area: #63d7c7;\n --df-review-color-error: #ffb7a7;\n --df-review-shadow-panel: 0 18px 48px rgba(0, 0, 0, 0.34);\n --df-review-shadow-popover: 0 16px 38px rgba(0, 0, 0, 0.32);\n --df-review-shadow-highlight: 0 10px 30px rgba(0, 0, 0, 0.22);\n font-family: var(--df-review-font-sans);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .dfwr-shell {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 500;\n pointer-events: none;\n }\n\n .dfwr-shell.is-open {\n display: block;\n }\n\n .dfwr-shell.has-dismissible-draft {\n z-index: 900;\n }\n\n .dfwr-draft-cancel-layer {\n position: fixed;\n inset: 0;\n z-index: 2;\n pointer-events: auto;\n background: transparent;\n cursor: default;\n }\n\n .dfwr-panel {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 3;\n width: min(380px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-panel);\n }\n\n .dfwr-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n padding: 14px 14px 10px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n }\n\n .dfwr-title {\n font-size: 15px;\n font-weight: 700;\n line-height: 1.25;\n }\n\n .dfwr-meta {\n max-width: 292px;\n margin-top: 4px;\n overflow: hidden;\n color: rgba(247, 247, 242, 0.56);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dfwr-toolbar,\n .dfwr-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 14px;\n }\n\n .dfwr-body,\n .dfwr-list {\n padding: 0 14px 14px;\n }\n\n .dfwr-list {\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n padding-top: 12px;\n }\n\n .dfwr-button,\n .dfwr-icon-button {\n appearance: none;\n border: 1px solid var(--df-review-color-border-strong);\n background: var(--df-review-color-control);\n color: var(--df-review-color-text);\n cursor: pointer;\n font: inherit;\n }\n\n .dfwr-button {\n min-height: var(--df-review-control-height-md);\n padding: 0 12px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-sm);\n font-weight: 650;\n }\n\n .dfwr-button:hover,\n .dfwr-icon-button:hover,\n .dfwr-button.is-active {\n border-color: rgba(255, 255, 255, 0.4);\n background: var(--df-review-color-control-hover);\n }\n\n .dfwr-button.is-primary {\n border-color: var(--df-review-color-accent);\n background: var(--df-review-color-accent);\n color: var(--df-review-color-accent-contrast);\n }\n\n .dfwr-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: var(--df-review-control-height-sm);\n padding: 0 8px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-xs);\n font-weight: 700;\n line-height: 1;\n text-transform: uppercase;\n }\n\n .dfwr-marker-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n }\n\n .dfwr-area-preview-layer {\n position: fixed;\n inset: 0;\n z-index: 3;\n pointer-events: none;\n }\n\n .dfwr-selection-highlight {\n position: fixed;\n z-index: 1;\n border: 2px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.12),\n 0 10px 30px rgba(0, 0, 0, 0.22);\n animation: dfwr-selection-pulse 900ms ease 0s 2;\n }\n\n .dfwr-selection-highlight.is-draft {\n border-color: #63d7c7;\n background: rgba(99, 215, 199, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 10px 30px rgba(0, 0, 0, 0.2);\n animation: none;\n }\n\n .dfwr-dom-hover {\n position: fixed;\n z-index: 2;\n border: 1px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08);\n pointer-events: none;\n }\n\n .dfwr-dom-hover[hidden] {\n display: none;\n }\n\n .dfwr-bound-marker,\n .dfwr-item-scope {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n }\n\n .dfwr-bound-marker.is-scope-tablet,\n .dfwr-item-scope.is-scope-tablet {\n --dfwr-scope: #63d7c7;\n --dfwr-scope-rgb: 99, 215, 199;\n }\n\n .dfwr-bound-marker.is-scope-desktop,\n .dfwr-item-scope.is-scope-desktop {\n --dfwr-scope: #f3b75f;\n --dfwr-scope-rgb: 243, 183, 95;\n }\n\n .dfwr-bound-marker.is-scope-wide,\n .dfwr-item-scope.is-scope-wide {\n --dfwr-scope: #c99cff;\n --dfwr-scope-rgb: 201, 156, 255;\n }\n\n .dfwr-bound-marker.is-scope-dom,\n .dfwr-item-scope.is-scope-dom {\n --dfwr-scope: #ff8f61;\n --dfwr-scope-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight,\n .dfwr-item-target-label {\n --dfwr-item-color: #7cc7ff;\n --dfwr-item-color-rgb: 124, 199, 255;\n }\n\n .dfwr-item-target-highlight.is-mode-area,\n .dfwr-item-target-label.is-mode-area {\n --dfwr-item-color: #63d7c7;\n --dfwr-item-color-rgb: 99, 215, 199;\n }\n\n .dfwr-item-target-highlight.is-mode-dom,\n .dfwr-item-target-label.is-mode-dom {\n --dfwr-item-color: #ff8f61;\n --dfwr-item-color-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight {\n position: fixed;\n z-index: 2;\n border: 2px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: rgba(var(--dfwr-item-color-rgb), 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.78),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 12px 30px rgba(0, 0, 0, 0.24);\n pointer-events: none;\n }\n\n .dfwr-item-target-highlight.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-item-target-highlight.is-highlighted {\n border-width: 3px;\n background: rgba(var(--dfwr-item-color-rgb), 0.12);\n }\n\n .dfwr-item-target-highlight.is-highlighted::after {\n content: \"\";\n position: absolute;\n inset: -6px;\n border: 2px solid var(--dfwr-item-color);\n border-radius: var(--df-review-radius-md);\n opacity: 0;\n animation: dfwr-target-ring-blink 1000ms ease-in-out infinite;\n pointer-events: none;\n }\n\n .dfwr-item-target-label {\n position: fixed;\n z-index: 3;\n display: inline-flex;\n align-items: center;\n min-width: 24px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: var(--dfwr-item-color);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-item-color-rgb), 0.2),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n pointer-events: none;\n }\n\n .dfwr-item-target-label.is-highlighted {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker {\n position: fixed;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n min-width: 28px;\n height: 22px;\n padding: 0 6px;\n transform: translate(-50%, -50%);\n border: 1px solid var(--dfwr-scope);\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-panel);\n box-shadow: 0 0 0 4px rgba(var(--dfwr-scope-rgb), 0.18);\n color: var(--dfwr-scope);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n }\n\n .dfwr-bound-marker.is-highlighted {\n min-width: 32px;\n height: 26px;\n border-width: 2px;\n box-shadow:\n 0 0 0 5px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 12px 26px rgba(0, 0, 0, 0.34);\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-bound-marker.is-note-callout,\n .dfwr-bound-marker.is-note-callout.is-highlighted {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n min-width: 0;\n width: 0;\n height: 0;\n padding: 0;\n transform: none;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n color: var(--dfwr-scope);\n animation: none;\n overflow: visible;\n }\n\n .dfwr-bound-marker.is-note-callout::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n width: 8px;\n height: 8px;\n transform: translate(-50%, -50%);\n border: 2px solid #111820;\n border-radius: var(--df-review-radius-pill);\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 6px 16px rgba(0, 0, 0, 0.28);\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted::before {\n animation: dfwr-note-dot-pulse 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon {\n position: absolute;\n left: 0;\n top: 0;\n width: 31px;\n height: 2px;\n transform: rotate(-42deg);\n transform-origin: left center;\n border-radius: var(--df-review-radius-pill);\n background: currentColor;\n opacity: 1;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::after {\n display: none;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-number {\n position: absolute;\n left: 24px;\n top: -41px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-scope);\n border-radius: 4px;\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.18),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n text-align: center;\n line-height: 1;\n white-space: nowrap;\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-icon,\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-number {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-area-preview-layer .dfwr-bound-marker {\n border-color: #63d7c7;\n background: var(--df-review-color-panel);\n box-shadow:\n 0 0 0 5px rgba(99, 215, 199, 0.2),\n 0 12px 26px rgba(0, 0, 0, 0.3);\n color: #63d7c7;\n }\n\n .dfwr-bound-marker-icon {\n position: relative;\n display: inline-block;\n width: 10px;\n height: 10px;\n flex: 0 0 auto;\n }\n\n .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker-icon::after {\n content: \"\";\n position: absolute;\n display: block;\n }\n\n .dfwr-bound-marker-icon::before {\n inset: 1px 2px;\n border: 1.5px solid currentColor;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-mobile .dfwr-bound-marker-icon::before {\n inset: 0 2.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-tablet .dfwr-bound-marker-icon::before {\n inset: 0.5px 1.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::before {\n inset: 1px 0 3px;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::after {\n left: 3px;\n right: 3px;\n bottom: 0;\n height: 1.5px;\n background: currentColor;\n }\n\n .dfwr-bound-marker.is-scope-wide .dfwr-bound-marker-icon::before {\n inset: 2px 0;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-dom .dfwr-bound-marker-icon::before {\n inset: 2px;\n border-radius: 1px;\n transform: rotate(45deg);\n }\n\n .dfwr-bound-marker-number {\n min-width: 6px;\n text-align: center;\n line-height: 1;\n }\n\n .dfwr-note-draft {\n position: fixed;\n inset: 0;\n z-index: 4;\n pointer-events: none;\n }\n\n .dfwr-note-pin {\n appearance: none;\n position: fixed;\n z-index: 5;\n width: 18px;\n height: 18px;\n padding: 0;\n transform: translate(-50%, -50%);\n border: 2px solid #1f2428;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-accent);\n box-shadow:\n 0 0 0 4px rgba(215, 255, 95, 0.22),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n cursor: grab;\n pointer-events: auto;\n }\n\n .dfwr-note-pin:active {\n cursor: grabbing;\n }\n\n .dfwr-note-popover {\n position: fixed;\n z-index: 4;\n width: min(320px, calc(100vw - 24px));\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-note-popover.is-composer,\n .dfwr-area-draft.is-composer {\n max-height: min(360px, calc(100vh - 32px));\n overflow: auto;\n border-color: rgba(99, 215, 199, 0.56);\n }\n\n .dfwr-note-popover.is-dragging,\n .dfwr-area-draft.is-dragging {\n user-select: none;\n }\n\n .dfwr-draft-drag-handle {\n display: block;\n width: 42px;\n height: 6px;\n margin: 0 auto 10px;\n padding: 0;\n cursor: grab;\n pointer-events: auto;\n background: rgba(247, 247, 242, 0.28);\n border: 0;\n border-radius: 999px;\n }\n\n .dfwr-draft-drag-handle:hover,\n .dfwr-draft-drag-handle:focus-visible {\n background: rgba(215, 255, 95, 0.62);\n }\n\n .dfwr-draft-drag-handle:active {\n cursor: grabbing;\n }\n\n .dfwr-area-draft {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 4;\n width: min(360px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-note-popover .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-note-actions {\n justify-content: flex-end;\n }\n\n .dfwr-note-actions .dfwr-button:first-child {\n margin-right: auto;\n }\n\n .dfwr-area-draft .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-form {\n display: grid;\n gap: 10px;\n }\n\n .dfwr-textarea {\n width: 100%;\n min-height: 92px;\n resize: vertical;\n border: 1px solid rgba(255, 255, 255, 0.16);\n border-radius: var(--df-review-radius-sm);\n padding: 10px;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel-strong);\n font: inherit;\n font-size: var(--df-review-font-size-md);\n line-height: 1.45;\n }\n\n .dfwr-textarea:focus {\n outline: 2px solid var(--df-review-color-accent-ring);\n outline-offset: 1px;\n }\n\n .dfwr-adjust-panel {\n display: grid;\n gap: 4px;\n padding: 8px 10px;\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-radius: var(--df-review-radius-sm);\n background: rgba(255, 255, 255, 0.04);\n }\n\n .dfwr-adjust-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n min-width: 0;\n }\n\n .dfwr-adjust-panel-header .dfwr-adjust-help {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .dfwr-adjust-panel.is-active {\n border-color: rgba(215, 255, 95, 0.5);\n background: var(--df-review-color-accent-soft);\n }\n\n .dfwr-adjust-help,\n .dfwr-adjust-status {\n margin: 0;\n color: var(--df-review-color-text-muted);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n }\n\n .dfwr-adjust-status {\n color: var(--df-review-color-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n }\n\n .dfwr-adjust-toggle {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 30px;\n padding: 0;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: var(--df-review-radius-sm);\n background: rgba(255, 255, 255, 0.04);\n color: var(--df-review-color-text);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n font-weight: 800;\n line-height: 1;\n }\n\n .dfwr-adjust-toggle:hover,\n .dfwr-adjust-toggle:focus-visible,\n .dfwr-adjust-toggle.is-active {\n border-color: rgba(215, 255, 95, 0.68);\n background: var(--df-review-color-accent-soft);\n outline: none;\n }\n\n .dfwr-adjust-toggle svg {\n width: 18px;\n height: 18px;\n pointer-events: none;\n }\n\n .dfwr-empty,\n .dfwr-error {\n margin: 0;\n color: rgba(247, 247, 242, 0.62);\n font-size: var(--df-review-font-size-sm);\n line-height: 1.45;\n }\n\n .dfwr-error {\n color: var(--df-review-color-error);\n }\n\n .dfwr-preview,\n .dfwr-thumb {\n display: block;\n width: 100%;\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-sm);\n object-fit: cover;\n background: var(--df-review-color-canvas);\n }\n\n .dfwr-preview {\n max-height: 180px;\n }\n\n .dfwr-thumb {\n max-height: 120px;\n margin-top: 10px;\n }\n\n .dfwr-list-heading {\n margin-bottom: 10px;\n color: rgba(247, 247, 242, 0.74);\n font-size: var(--df-review-font-size-sm);\n font-weight: 700;\n }\n\n .dfwr-item {\n display: flex;\n gap: 12px;\n justify-content: space-between;\n padding: 12px 0;\n border-top: 1px solid rgba(255, 255, 255, 0.08);\n cursor: pointer;\n }\n\n .dfwr-item:first-of-type {\n border-top: 0;\n }\n\n .dfwr-item:focus-visible {\n outline: 2px solid rgba(215, 255, 95, 0.72);\n outline-offset: 4px;\n }\n\n .dfwr-item-body {\n min-width: 0;\n flex: 1;\n }\n\n .dfwr-item-badges {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n }\n\n .dfwr-item-scope,\n .dfwr-item-kind {\n display: inline-flex;\n align-items: center;\n min-height: 20px;\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 1;\n letter-spacing: 0;\n text-transform: uppercase;\n }\n\n .dfwr-item-scope {\n border: 1px solid rgba(var(--dfwr-scope-rgb), 0.38);\n background: rgba(var(--dfwr-scope-rgb), 0.12);\n color: var(--dfwr-scope);\n }\n\n .dfwr-item-kind {\n border: 1px solid rgba(255, 255, 255, 0.12);\n background: rgba(255, 255, 255, 0.05);\n color: rgba(247, 247, 242, 0.64);\n }\n\n .dfwr-item-comment {\n margin: 4px 0;\n color: var(--df-review-color-text);\n font-size: var(--df-review-font-size-md);\n line-height: 1.42;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n .dfwr-item-date {\n color: rgba(247, 247, 242, 0.46);\n font-size: var(--df-review-font-size-xs);\n }\n\n .dfwr-item-actions {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex: 0 0 auto;\n }\n\n .dfwr-text-layer,\n .dfwr-element-layer,\n .dfwr-area-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: auto;\n }\n\n .dfwr-text-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-element-layer {\n cursor: cell;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-area-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.22);\n }\n\n .dfwr-area-box {\n position: fixed;\n z-index: 2;\n width: 0;\n height: 0;\n border: 1px solid #d7ff5f;\n background: rgba(215, 255, 95, 0.16);\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.18);\n }\n\n @keyframes dfwr-marker-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.92);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.1);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-note-dot-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.88);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.3);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-selected-blink {\n 0%,\n 100% {\n opacity: 0.78;\n }\n 50% {\n opacity: 1;\n }\n }\n\n @keyframes dfwr-target-ring-blink {\n 0%,\n 100% {\n opacity: 0;\n transform: scale(0.98);\n }\n 50% {\n opacity: 0.82;\n transform: scale(1);\n }\n }\n\n @keyframes dfwr-selection-pulse {\n 0% {\n opacity: 0.72;\n }\n 45% {\n opacity: 1;\n }\n 100% {\n opacity: 0.86;\n }\n }\n\n @media (max-width: 520px) {\n .dfwr-panel {\n right: 8px;\n top: 8px;\n width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n }\n }\n `;\n return style;\n}\n","import type {\n DomAnchor,\n RelativeSelection,\n ReviewItem,\n ReviewPoint,\n ViewportSize,\n} from '../../types';\nimport { getAnchorCandidates } from '../dom.anchor';\nimport type { AreaDraft, NoteDraft } from './draft';\nimport { getItemMarker, getItemSelection } from './item';\n\n/** Formats area draft metadata for compact debug display in the overlay UI. */\nexport function formatAreaDraftMeta(draft: AreaDraft) {\n const parts = [`viewport ${formatSize(draft.viewport)}`];\n\n if (draft.selection) {\n parts.push(`rect ${formatSelection(draft.selection.viewport)}`);\n }\n\n if (draft.marker) {\n parts.push(`point ${formatPoint(draft.marker.viewport)}`);\n }\n\n return parts.join(' / ');\n}\n\n/** Formats note draft metadata for compact debug display in the overlay UI. */\nexport function formatNoteDraftMeta(draft: NoteDraft) {\n const parts = [\n `viewport ${formatSize(draft.viewport)}`,\n `point ${formatPoint(draft.marker.viewport)}`,\n ];\n\n if (draft.anchor) {\n parts.push(formatAnchorMeta(draft.anchor));\n }\n\n return parts.join(' / ');\n}\n\n/** Formats persisted item metadata for list rows, marker titles, and overlays. */\nexport function formatItemMeta(item: ReviewItem) {\n const parts = [formatDate(item.createdAt)];\n const marker = getItemMarker(item);\n const selection = getItemSelection(item);\n\n if (item.viewport) {\n parts.push(`viewport ${formatSize(item.viewport)}`);\n }\n\n if (marker) {\n parts.push(`point ${formatPoint(marker.viewport)}`);\n }\n\n if (selection) {\n parts.push(`rect ${formatSelection(selection.viewport)}`);\n }\n\n if (item.anchor) {\n parts.push(formatAnchorMeta(item.anchor));\n }\n\n return parts.join(' / ');\n}\n\nfunction formatDate(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return date.toLocaleString(undefined, {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction formatSize(size: ViewportSize) {\n return `${Math.round(size.width)}x${Math.round(size.height)}`;\n}\n\nfunction formatPoint(point: ReviewPoint) {\n return `${Math.round(point.x)},${Math.round(point.y)}`;\n}\n\nfunction formatSelection(selection: RelativeSelection) {\n return [\n Math.round(selection.x),\n Math.round(selection.y),\n Math.round(selection.width),\n Math.round(selection.height),\n ].join(',');\n}\n\nfunction formatAnchorMeta(anchor: DomAnchor) {\n const parts = [`dom ${anchor.strategy}`];\n\n if (typeof anchor.confidence === 'number') {\n parts.push(`${Math.round(anchor.confidence * 100)}%`);\n }\n\n const candidates = getAnchorCandidates(anchor);\n if (candidates.length > 1) {\n parts.push(`${candidates.length} candidates`);\n }\n\n return parts.join(' ');\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemScope,\n ReviewMode,\n ReviewPoint,\n ViewportSize,\n WebReviewKitOptions,\n} from '../types';\nimport {\n getDomAnchorFromPoint,\n getElementViewportSelection,\n resolveAnchorElement,\n} from './dom.anchor';\nimport {\n clampPoint,\n clamp,\n getPopoverPosition,\n getViewportSize,\n isPointInViewport,\n placeLayerOverTarget,\n roundPoint,\n toHostPoint,\n toHostSelection,\n toTargetPoint,\n toTargetPointFromHostEvent,\n toViewportSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\nimport { getRouteKey } from './location';\nimport { createStyleElement } from './overlay.style';\nimport type { AreaDraft, NoteDraft } from './review/draft';\nimport { formatItemMeta, formatNoteDraftMeta } from './review/format';\nimport {\n getBoundMarkerPoint,\n getItemHighlightSelection,\n getReviewItemHighlightMode,\n shouldShowMarkerForScope,\n} from './review/item';\nimport {\n findReviewViewportPreset,\n getNumberedReviewItems,\n getReviewViewportScope,\n} from './review/scope';\n\n/** Minimal item payload collected by the view before the app fills persistence metadata. */\nexport type CreateReviewItemInput = Pick<ReviewItem, 'kind' | 'comment'> &\n Partial<\n Pick<ReviewItem, 'scope' | 'viewport' | 'anchor' | 'marker' | 'selection'>\n >;\n\nconst DEFAULT_ADJUSTMENT_LABEL = 'Responsive CSS px adjustments';\n\ninterface WebReviewKitViewState {\n isOpen: boolean;\n mode: ReviewMode;\n items: ReviewItem[];\n noteDraft?: NoteDraft;\n areaDraft?: AreaDraft;\n isSelectingArea: boolean;\n highlightedItemId?: string;\n}\n\ninterface WebReviewKitViewActions {\n close: () => void;\n render: () => void;\n reload: () => Promise<ReviewItem[]>;\n restoreItem: (item: ReviewItem) => Promise<void>;\n removeItem: (itemId: string) => Promise<void>;\n setModeState: (mode: ReviewMode) => void;\n clearDrafts: () => void;\n setNoteDraft: (draft?: NoteDraft) => void;\n setAreaDraft: (draft?: AreaDraft) => void;\n setSelectingArea: (isSelectingArea: boolean) => void;\n createItem: (input: CreateReviewItemInput) => Promise<void>;\n bindNoteDraftToPoint: (point: ReviewPoint, comment?: string) => Promise<void>;\n bindElementDraftToPoint: (\n point: ReviewPoint,\n comment?: string\n ) => Promise<void>;\n createAreaDraft: (selection: ViewportSelection) => Promise<void>;\n}\n\ninterface WebReviewKitViewConfig {\n options: WebReviewKitOptions;\n getState: () => WebReviewKitViewState;\n getEnvironment: () => ReviewEnvironment | undefined;\n actions: WebReviewKitViewActions;\n}\n\ntype DraftPreviewElement = HTMLElement | SVGElement;\n\ninterface DraftPreviewSnapshot {\n element: DraftPreviewElement;\n clone: DraftPreviewElement;\n visibility: string;\n}\n\n/** Vanilla DOM renderer for the core overlay, separate from React shell chrome. */\nexport class WebReviewKitView {\n private draftPreview?: DraftPreviewSnapshot;\n\n constructor(private readonly config: WebReviewKitViewConfig) {}\n\n clearDraftPreview() {\n this.restoreDraftPreview();\n }\n\n render(shadow: ShadowRoot, hiddenItemsStyle: HTMLStyleElement) {\n const state = this.state;\n this.syncDraftPreview(\n state.isOpen && state.mode === 'element' ? state.noteDraft : undefined\n );\n\n shadow.replaceChildren();\n shadow.append(createStyleElement());\n shadow.append(hiddenItemsStyle);\n\n const hasDismissableDraft = Boolean(state.noteDraft || state.areaDraft);\n const shell = document.createElement('div');\n shell.className = [\n 'dfwr-shell',\n state.isOpen ? 'is-open' : '',\n hasDismissableDraft ? 'has-dismissible-draft' : '',\n ]\n .filter(Boolean)\n .join(' ');\n shell.setAttribute('aria-hidden', state.isOpen ? 'false' : 'true');\n\n if (this.config.options.ui?.panel !== false) {\n // Standalone core usage gets a built-in panel; React shell disables this.\n const panel = document.createElement('div');\n panel.className = 'dfwr-panel';\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-label', 'Web review kit');\n\n panel.append(\n this.createHeader(),\n this.createToolbar(),\n this.createBody(),\n this.createList()\n );\n\n shell.append(panel);\n }\n\n shell.append(this.createMarkerLayer());\n if (state.isOpen && hasDismissableDraft) {\n shell.append(this.createDraftCancelLayer());\n }\n\n if (state.isOpen && (state.mode === 'note' || state.mode === 'element')) {\n shell.append(\n state.noteDraft\n ? this.createNotePopover(state.noteDraft)\n : state.mode === 'element'\n ? this.createElementLayer()\n : this.createNoteLayer()\n );\n }\n\n if (state.isOpen && state.mode === 'area' && !state.areaDraft) {\n shell.append(this.createAreaLayer());\n }\n\n if (\n state.isOpen &&\n state.mode === 'area' &&\n state.areaDraft &&\n this.config.options.ui?.panel === false\n ) {\n // Shell mode renders the draft form near the target because the side panel is React-owned.\n if (state.areaDraft.selection) {\n shell.append(this.createAreaDraftOverlay(state.areaDraft));\n }\n shell.append(this.createAreaDraftPopover(state.areaDraft));\n }\n\n shadow.append(shell);\n }\n\n private get state() {\n return this.config.getState();\n }\n\n private createDraftCancelLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-draft-cancel-layer';\n layer.setAttribute('aria-hidden', 'true');\n\n const cancel = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n this.config.actions.setModeState('idle');\n this.config.actions.clearDrafts();\n this.config.actions.setSelectingArea(false);\n this.config.actions.render();\n };\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n cancel(event);\n });\n\n return layer;\n }\n\n private getDraftAdjustmentMetrics(draft: NoteDraft) {\n const adjustment = draft.adjustment;\n const x = adjustment?.x ?? 0;\n const y = adjustment?.y ?? 0;\n const scale = adjustment?.scale ?? 0;\n const {\n scale: viewportScale,\n designWidth,\n presetLabel,\n } = this.getDraftViewportScale(draft.viewport);\n const selection = draft.selection\n ? toViewportSelection(draft.selection.viewport)\n : undefined;\n const scaleCssDelta = scale * viewportScale;\n const scaleFactor =\n selection && selection.width > 0\n ? Math.max(\n 1 / selection.width,\n (selection.width + scaleCssDelta) / selection.width\n )\n : 1;\n\n return {\n x,\n y,\n scale,\n cssX: x * viewportScale,\n cssY: y * viewportScale,\n scaleFactor,\n viewportScale,\n designWidth,\n presetLabel,\n viewportWidth: draft.viewport.width,\n };\n }\n\n private hasDraftAdjustment(draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return metrics.x !== 0 || metrics.y !== 0 || metrics.scale !== 0;\n }\n\n private getAdjustedDraftPoint(point: ReviewPoint, draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return {\n x: point.x + metrics.cssX,\n y: point.y + metrics.cssY,\n };\n }\n\n private getAdjustedDraftSelection(\n selection: ViewportSelection,\n draft: NoteDraft\n ) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return {\n ...selection,\n left: selection.left + metrics.cssX,\n top: selection.top + metrics.cssY,\n width: selection.width * metrics.scaleFactor,\n height: selection.height * metrics.scaleFactor,\n };\n }\n\n private getDraftViewportScale(viewport: ViewportSize) {\n const preset = findReviewViewportPreset(\n viewport,\n this.config.options.viewports?.presets\n );\n const designWidth =\n typeof preset.designWidth === 'number' && preset.designWidth > 0\n ? preset.designWidth\n : viewport.width;\n const scale = designWidth > 0 ? viewport.width / designWidth : 1;\n\n return { scale, designWidth, presetLabel: preset.label };\n }\n\n private getDraftComposerWidth(environment: ReviewEnvironment) {\n const bounds = environment.overlayRect;\n const margin = 12;\n return Math.min(360, Math.max(240, bounds.width - margin * 2));\n }\n\n private getClampedComposerPosition(\n position: ReviewPoint,\n environment: ReviewEnvironment,\n size?: { width?: number; height?: number },\n bounds = environment.overlayRect\n ) {\n const margin = 12;\n const width = size?.width ?? this.getDraftComposerWidth(environment);\n const height = size?.height ?? 236;\n\n return {\n x: clamp(\n position.x,\n bounds.left + margin,\n bounds.left + bounds.width - width - margin\n ),\n y: clamp(\n position.y,\n bounds.top + margin,\n bounds.top + bounds.height - height - margin\n ),\n };\n }\n\n private getHostComposerBounds() {\n const root = document.documentElement;\n return {\n left: 0,\n top: 0,\n width: root.clientWidth || window.innerWidth,\n height: root.clientHeight || window.innerHeight,\n };\n }\n\n private getInitialDraftComposerPosition(\n selection: ViewportSelection | undefined,\n environment: ReviewEnvironment,\n size: { width: number; height?: number }\n ) {\n const bounds = this.getHostComposerBounds();\n const margin = 12;\n const gap = 20;\n\n if (!selection) {\n return this.getClampedComposerPosition(\n {\n x: environment.overlayRect.left + margin,\n y: environment.overlayRect.top + margin,\n },\n environment,\n size,\n bounds\n );\n }\n\n const preferredX = selection.left + selection.width + gap;\n const maxX = bounds.left + bounds.width - size.width - margin;\n const x =\n preferredX <= maxX\n ? preferredX\n : selection.left - size.width - gap;\n\n return this.getClampedComposerPosition(\n {\n x,\n y: selection.top,\n },\n environment,\n size,\n bounds\n );\n }\n\n private getDraftComposerPosition({\n selection,\n environment,\n composerPosition,\n estimatedHeight,\n }: {\n selection?: ViewportSelection;\n environment: ReviewEnvironment;\n composerPosition?: ReviewPoint;\n estimatedHeight?: number;\n }) {\n const width = this.getDraftComposerWidth(environment);\n\n if (composerPosition) {\n const clamped = this.getClampedComposerPosition(\n composerPosition,\n environment,\n { width, height: estimatedHeight },\n this.getHostComposerBounds()\n );\n return { width, left: clamped.x, top: clamped.y };\n }\n\n const position = this.getInitialDraftComposerPosition(selection, environment, {\n width,\n height: estimatedHeight,\n });\n\n return { width, left: position.x, top: position.y };\n }\n\n private getSelectionMqMetrics(\n selection: ViewportSelection,\n viewport: ViewportSize\n ) {\n const { scale } = this.getDraftViewportScale(viewport);\n const ratio = scale > 0 ? 1 / scale : 1;\n\n return {\n x: selection.left * ratio,\n y: selection.top * ratio,\n width: selection.width * ratio,\n height: selection.height * ratio,\n };\n }\n\n private formatSignedPx(value: number) {\n if (value === 0) return '+0px';\n return `${value > 0 ? '+' : ''}${value}px`;\n }\n\n private formatRoundedPx(value: number) {\n return `${Math.round(value)}px`;\n }\n\n private getAdjustmentLabel() {\n return (\n this.config.options.adjustmentLabel?.trim() || DEFAULT_ADJUSTMENT_LABEL\n );\n }\n\n private getSelectionMetricLines(\n selection: ViewportSelection | undefined,\n viewport: ViewportSize\n ) {\n if (!selection) return ['area', 'x none / y none', 'w none / h none'];\n\n const metrics = this.getSelectionMqMetrics(selection, viewport);\n return [\n 'area',\n `x ${this.formatRoundedPx(metrics.x)} / y ${this.formatRoundedPx(\n metrics.y\n )}`,\n `w ${this.formatRoundedPx(metrics.width)} / h ${this.formatRoundedPx(\n metrics.height\n )}`,\n ];\n }\n\n private getAreaDraftMetricSelection(draft: AreaDraft) {\n if (!draft.selection) return undefined;\n\n return toViewportSelection(draft.selection.viewport);\n }\n\n private getDraftAdjustmentMetricLines(draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return [\n `x ${this.formatSignedPx(metrics.x)} / y ${this.formatSignedPx(\n metrics.y\n )}`,\n `scale ${this.formatSignedPx(metrics.scale)}`,\n ];\n }\n\n private withDraftAdjustmentComment(comment: string, draft: NoteDraft) {\n if (!this.hasDraftAdjustment(draft)) return comment;\n\n const trimmedComment = comment.trim();\n const metrics = this.getDraftAdjustmentMetrics(draft);\n const adjustment = [\n `${this.getAdjustmentLabel()}: x ${this.formatSignedPx(\n metrics.x\n )}, y ${this.formatSignedPx(metrics.y)}, scale ${this.formatSignedPx(\n metrics.scale\n )}`,\n `(${metrics.presetLabel} viewport, ${Math.round(\n metrics.viewportWidth\n )}/design ${Math.round(metrics.designWidth)})`,\n ].join(' ');\n\n return trimmedComment ? `${trimmedComment}\\n${adjustment}` : adjustment;\n }\n\n private getStyleableDraftElement(\n draft: NoteDraft,\n environment: ReviewEnvironment\n ): DraftPreviewElement | undefined {\n if (\n draft.previewElement &&\n draft.previewElement.ownerDocument === environment.document &&\n 'style' in draft.previewElement\n ) {\n return draft.previewElement;\n }\n\n if (!draft.anchor) return undefined;\n\n const preferredSelection = draft.selection\n ? toViewportSelection(draft.selection.viewport)\n : undefined;\n const element = resolveAnchorElement(\n draft.anchor,\n environment,\n preferredSelection\n )?.element;\n if (!element) return undefined;\n\n if ('style' in element) return element as DraftPreviewElement;\n\n return undefined;\n }\n\n private syncDraftPreview(draft?: NoteDraft) {\n const environment = this.config.getEnvironment();\n if (!draft || !environment || !this.hasDraftAdjustment(draft)) {\n this.restoreDraftPreview();\n return;\n }\n\n const element = this.getStyleableDraftElement(draft, environment);\n if (!element) {\n this.restoreDraftPreview();\n return;\n }\n\n if (this.draftPreview?.element !== element) {\n this.restoreDraftPreview();\n }\n\n if (!this.draftPreview) {\n const computedStyle = environment.window.getComputedStyle(element);\n const clone = element.cloneNode(true) as DraftPreviewElement;\n this.removeDuplicateIds(clone);\n this.copyComputedStyle(element, clone, environment);\n this.positionDraftPreviewClone(clone, element, computedStyle);\n environment.document.body?.appendChild(clone);\n this.draftPreview = {\n element,\n clone,\n visibility: element.style.visibility,\n };\n element.style.visibility = 'hidden';\n }\n\n const metrics = this.getDraftAdjustmentMetrics(draft);\n const translate = `translate(${this.toCssNumber(metrics.cssX)}px, ${this.toCssNumber(\n metrics.cssY\n )}px)`;\n const scale =\n metrics.scaleFactor === 1\n ? ''\n : `scale(${this.toCssNumber(metrics.scaleFactor)})`;\n this.draftPreview.clone.style.transform = [translate, scale]\n .filter(Boolean)\n .join(' ');\n }\n\n private restoreDraftPreview() {\n if (!this.draftPreview) return;\n\n const { element, clone, visibility } = this.draftPreview;\n clone.remove();\n element.style.visibility = visibility;\n this.draftPreview = undefined;\n }\n\n private positionDraftPreviewClone(\n clone: DraftPreviewElement,\n element: DraftPreviewElement,\n computedStyle: CSSStyleDeclaration\n ) {\n const rect = element.getBoundingClientRect();\n clone.setAttribute('data-dfwr-adjust-preview', 'true');\n clone.setAttribute('aria-hidden', 'true');\n clone.style.position = 'fixed';\n clone.style.left = `${this.toCssNumber(rect.left)}px`;\n clone.style.top = `${this.toCssNumber(rect.top)}px`;\n clone.style.right = 'auto';\n clone.style.bottom = 'auto';\n clone.style.width = `${this.toCssNumber(rect.width)}px`;\n clone.style.height = `${this.toCssNumber(rect.height)}px`;\n clone.style.maxWidth = 'none';\n clone.style.maxHeight = 'none';\n clone.style.margin = '0';\n clone.style.boxSizing = 'border-box';\n clone.style.display = this.getDraftPreviewDisplay(computedStyle.display);\n clone.style.zIndex = '2147483646';\n clone.style.pointerEvents = 'none';\n clone.style.transition = 'none';\n clone.style.willChange = 'transform';\n clone.style.transformOrigin = 'top left';\n clone.style.transform = 'none';\n }\n\n private getDraftPreviewDisplay(display: string) {\n if (display === 'inline' || display === 'contents') return 'inline-block';\n return display || 'block';\n }\n\n private copyComputedStyle(\n element: DraftPreviewElement,\n clone: DraftPreviewElement,\n environment: ReviewEnvironment\n ) {\n const computedStyle = environment.window.getComputedStyle(element);\n for (let index = 0; index < computedStyle.length; index += 1) {\n const property = computedStyle.item(index);\n clone.style.setProperty(\n property,\n computedStyle.getPropertyValue(property),\n computedStyle.getPropertyPriority(property)\n );\n }\n }\n\n private removeDuplicateIds(element: Element) {\n element.removeAttribute('id');\n element.querySelectorAll('[id]').forEach((child) => {\n child.removeAttribute('id');\n });\n }\n\n private toCssNumber(value: number) {\n return Math.round(value * 1000) / 1000;\n }\n\n private createHeader() {\n const header = document.createElement('div');\n header.className = 'dfwr-header';\n\n const title = document.createElement('div');\n title.className = 'dfwr-title';\n title.textContent = 'Review Kit';\n\n const meta = document.createElement('div');\n meta.className = 'dfwr-meta';\n meta.textContent = getRouteKey(this.config.getEnvironment());\n\n const titleGroup = document.createElement('div');\n titleGroup.append(title, meta);\n\n const close = document.createElement('button');\n close.className = 'dfwr-icon-button';\n close.type = 'button';\n close.textContent = 'x';\n close.setAttribute('aria-label', 'Close');\n close.addEventListener('click', () => this.config.actions.close());\n\n header.append(titleGroup, close);\n return header;\n }\n\n private createToolbar() {\n const toolbar = document.createElement('div');\n toolbar.className = 'dfwr-toolbar';\n\n toolbar.append(\n this.createToolbarButton('Note', this.state.mode === 'note', () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(mode === 'note' ? 'idle' : 'note');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }),\n this.createToolbarButton('Element', this.state.mode === 'element', () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(\n mode === 'element' ? 'idle' : 'element'\n );\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }),\n this.createToolbarButton(\n this.state.isSelectingArea ? 'Selecting' : 'Area',\n this.state.mode === 'area',\n () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(mode === 'area' ? 'idle' : 'area');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }\n ),\n this.createToolbarButton('Refresh', false, () => {\n void this.config.actions.reload();\n })\n );\n\n return toolbar;\n }\n\n private createToolbarButton(\n label: string,\n active: boolean,\n onClick: () => void\n ) {\n const button = document.createElement('button');\n button.className = `dfwr-button${active ? ' is-active' : ''}`;\n button.type = 'button';\n button.textContent = label;\n button.addEventListener('click', onClick);\n return button;\n }\n\n private createBody() {\n const body = document.createElement('div');\n body.className = 'dfwr-body';\n const state = this.state;\n\n if (state.mode === 'idle') {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Add a note or mark an area.';\n body.append(empty);\n return body;\n }\n\n if (state.mode === 'note' || state.mode === 'element') {\n body.append(this.createNoteBody());\n return body;\n }\n\n body.append(this.createAreaForm());\n return body;\n }\n\n private createNoteBody() {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = this.state.noteDraft\n ? 'Write the note in the page box.'\n : this.state.mode === 'element'\n ? 'Click an element to add QA.'\n : 'Click on the page to place a note.';\n return empty;\n }\n\n private createNotePopover(draft: NoteDraft) {\n const environment = this.config.getEnvironment();\n const group = document.createElement('div');\n group.className = 'dfwr-note-draft';\n if (!environment) return group;\n\n const isElementDraft = this.state.mode === 'element' && Boolean(draft.selection);\n const hostPoint = toHostPoint(\n isElementDraft\n ? this.getAdjustedDraftPoint(draft.marker.viewport, draft)\n : draft.marker.viewport,\n environment\n );\n let selectionHighlight: HTMLDivElement | undefined;\n\n if (draft.selection) {\n const selection = toViewportSelection(draft.selection.viewport);\n selectionHighlight = this.createSelectionHighlight(\n isElementDraft\n ? this.getAdjustedDraftSelection(selection, draft)\n : selection,\n environment,\n true\n );\n group.append(selectionHighlight);\n }\n\n const pin = document.createElement('button');\n pin.className = 'dfwr-note-pin';\n pin.type = 'button';\n pin.setAttribute('aria-label', 'Move note point');\n pin.style.left = `${hostPoint.x}px`;\n pin.style.top = `${hostPoint.y}px`;\n\n const popover = document.createElement('div');\n const position = getPopoverPosition(hostPoint, environment);\n\n popover.className = `dfwr-note-popover${\n isElementDraft ? ' is-composer' : ''\n }`;\n if (isElementDraft) {\n const selection = draft.selection\n ? toHostSelection(\n this.getAdjustedDraftSelection(\n toViewportSelection(draft.selection.viewport),\n draft\n ),\n environment\n )\n : undefined;\n const composer = this.getDraftComposerPosition({\n selection,\n environment,\n composerPosition: draft.composerPosition,\n estimatedHeight: 252,\n });\n popover.style.left = `${composer.left}px`;\n popover.style.top = `${composer.top}px`;\n popover.style.width = `${composer.width}px`;\n } else {\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n }\n\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n\n const meta = isElementDraft ? undefined : document.createElement('div');\n if (meta) {\n meta.className = 'dfwr-item-date';\n meta.textContent = formatNoteDraftMeta(draft);\n }\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Review comment';\n textarea.rows = 4;\n textarea.value = draft.comment ?? '';\n textarea.addEventListener('input', () => {\n const noteDraft = this.state.noteDraft;\n if (!noteDraft) return;\n this.config.actions.setNoteDraft({\n ...noteDraft,\n comment: textarea.value,\n });\n });\n\n const saveDraft = () => {\n const comment = textarea.value.trim();\n const currentDraft = this.state.noteDraft ?? draft;\n if (!comment && !this.hasDraftAdjustment(currentDraft)) return;\n void this.config.actions.createItem({\n kind: 'note',\n comment: this.withDraftAdjustmentComment(comment, currentDraft),\n viewport: currentDraft.viewport,\n anchor: currentDraft.anchor,\n marker: currentDraft.marker,\n selection: currentDraft.selection,\n });\n };\n\n const adjustmentControls = isElementDraft\n ? this.createAdjustmentControls({\n draft,\n pin,\n popover,\n selectionHighlight,\n textarea,\n })\n : undefined;\n\n const actions = this.createFormActions('Save note', saveDraft);\n\n form.append(\n ...(meta ? [meta] : []),\n ...(adjustmentControls ? [adjustmentControls.panel] : []),\n textarea,\n actions\n );\n const dragHandle = isElementDraft\n ? this.createDraftDragHandle('Move DOM composer')\n : undefined;\n popover.append(...(dragHandle ? [dragHandle] : []), form);\n group.append(pin, popover);\n\n if (dragHandle) {\n this.attachDraftComposerDrag(popover, dragHandle, (composerPosition) => {\n const noteDraft = this.state.noteDraft ?? draft;\n this.config.actions.setNoteDraft({\n ...noteDraft,\n composerPosition,\n comment: textarea.value,\n });\n });\n }\n\n this.attachDraftPinDrag(\n pin,\n isElementDraft ? undefined : popover,\n meta,\n textarea\n );\n\n window.setTimeout(() => {\n if (draft.adjustment?.isActive) {\n adjustmentControls?.focusTarget.focus();\n return;\n }\n\n textarea.focus();\n }, 0);\n\n return group;\n }\n\n private createDraftDragHandle(label: string) {\n const handle = document.createElement('button');\n handle.className = 'dfwr-draft-drag-handle';\n handle.type = 'button';\n handle.setAttribute('aria-label', label);\n return handle;\n }\n\n private createIcon(paths: string[]) {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '2.4');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n\n paths.forEach((d) => {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('d', d);\n svg.append(path);\n });\n\n return svg;\n }\n\n private setAdjustmentToggleIcon(button: HTMLButtonElement, isActive: boolean) {\n const paths = isActive\n ? ['M20 6 9 17l-5-5']\n : [\n 'M12 2v20',\n 'M2 12h20',\n 'm9 5 3-3 3 3',\n 'm9 19 3 3 3-3',\n 'm5 9-3 3 3 3',\n 'm19 9 3 3-3 3',\n ];\n button.replaceChildren(this.createIcon(paths));\n }\n\n private attachDraftComposerDrag(\n popover: HTMLDivElement,\n handle: HTMLButtonElement,\n onMove: (position: ReviewPoint) => void\n ) {\n let isDragging = false;\n let offsetX = 0;\n let offsetY = 0;\n\n const movePopover = (event: PointerEvent) => {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const position = this.getClampedComposerPosition(\n {\n x: event.clientX - offsetX,\n y: event.clientY - offsetY,\n },\n environment,\n {\n width: popover.offsetWidth,\n height: popover.offsetHeight,\n },\n this.getHostComposerBounds()\n );\n\n popover.style.left = `${position.x}px`;\n popover.style.top = `${position.y}px`;\n onMove(position);\n };\n\n handle.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n\n const rect = popover.getBoundingClientRect();\n offsetX = event.clientX - rect.left;\n offsetY = event.clientY - rect.top;\n isDragging = true;\n\n event.preventDefault();\n event.stopPropagation();\n handle.setPointerCapture(event.pointerId);\n popover.classList.add('is-dragging');\n });\n\n handle.addEventListener('pointermove', (event) => {\n if (!isDragging || !handle.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n movePopover(event);\n });\n\n const stopDrag = (event: PointerEvent) => {\n if (!isDragging || !handle.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = false;\n handle.releasePointerCapture(event.pointerId);\n popover.classList.remove('is-dragging');\n movePopover(event);\n };\n\n handle.addEventListener('pointerup', stopDrag);\n handle.addEventListener('pointercancel', stopDrag);\n }\n\n private createAdjustmentControls({\n draft,\n pin,\n popover,\n selectionHighlight,\n textarea,\n }: {\n draft: NoteDraft;\n pin: HTMLButtonElement;\n popover: HTMLDivElement;\n selectionHighlight?: HTMLDivElement;\n textarea: HTMLTextAreaElement;\n }) {\n const panel = document.createElement('div');\n panel.className = 'dfwr-adjust-panel is-dom-adjust-panel';\n\n const header = document.createElement('div');\n header.className = 'dfwr-adjust-panel-header';\n const help = document.createElement('div');\n help.className = 'dfwr-adjust-help';\n help.textContent = this.getAdjustmentLabel();\n\n const adjust = document.createElement('button');\n adjust.className = 'dfwr-adjust-toggle';\n adjust.type = 'button';\n adjust.title = 'Adjust DOM element with keyboard arrows';\n adjust.setAttribute('aria-label', 'Adjust DOM element with keyboard arrows');\n\n const xyStatus = document.createElement('div');\n xyStatus.className = 'dfwr-adjust-status';\n\n const scaleStatus = document.createElement('div');\n scaleStatus.className = 'dfwr-adjust-status';\n\n const syncControls = (nextDraft: NoteDraft) => {\n const isActive = nextDraft.adjustment?.isActive === true;\n panel.classList.toggle('is-active', isActive);\n adjust.classList.toggle('is-active', isActive);\n adjust.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n this.setAdjustmentToggleIcon(adjust, isActive);\n adjust.title = isActive\n ? 'Finish DOM adjustment'\n : 'Adjust DOM element with keyboard arrows';\n adjust.setAttribute(\n 'aria-label',\n isActive\n ? 'Finish DOM adjustment'\n : 'Adjust DOM element with keyboard arrows'\n );\n const [xyLine, scaleLine] = this.getDraftAdjustmentMetricLines(nextDraft);\n xyStatus.textContent = xyLine;\n scaleStatus.textContent = scaleLine;\n this.syncDraftAdjustmentUi({\n draft: nextDraft,\n pin,\n selectionHighlight,\n });\n };\n\n const updateDraft = (updater: (current: NoteDraft) => NoteDraft) => {\n const currentDraft = this.state.noteDraft ?? draft;\n const nextDraft = updater(currentDraft);\n this.config.actions.setNoteDraft({\n ...nextDraft,\n comment: textarea.value,\n });\n syncControls(nextDraft);\n };\n\n adjust.addEventListener('click', () => {\n updateDraft((currentDraft) => ({\n ...currentDraft,\n adjustment: {\n x: currentDraft.adjustment?.x ?? 0,\n y: currentDraft.adjustment?.y ?? 0,\n scale: currentDraft.adjustment?.scale ?? 0,\n isActive: currentDraft.adjustment?.isActive !== true,\n },\n }));\n adjust.focus();\n });\n\n popover.addEventListener('keydown', (event) => {\n const currentDraft = this.state.noteDraft ?? draft;\n if (currentDraft.adjustment?.isActive !== true) return;\n\n const keyDelta = this.getAdjustmentKeyDelta(event);\n if (!keyDelta) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n updateDraft((activeDraft) => ({\n ...activeDraft,\n adjustment: {\n x: (activeDraft.adjustment?.x ?? 0) + keyDelta.x,\n y: (activeDraft.adjustment?.y ?? 0) + keyDelta.y,\n scale: (activeDraft.adjustment?.scale ?? 0) + keyDelta.scale,\n isActive: true,\n },\n }));\n });\n\n header.append(help, adjust);\n panel.append(header, xyStatus, scaleStatus);\n syncControls(draft);\n\n return {\n panel,\n focusTarget: adjust,\n };\n }\n\n private getAdjustmentKeyDelta(event: KeyboardEvent) {\n const step = event.shiftKey ? 10 : 1;\n\n if (event.key === 'ArrowLeft') return { x: -step, y: 0, scale: 0 };\n if (event.key === 'ArrowRight') return { x: step, y: 0, scale: 0 };\n if (event.key === 'ArrowUp') return { x: 0, y: -step, scale: 0 };\n if (event.key === 'ArrowDown') return { x: 0, y: step, scale: 0 };\n if (event.key.toLowerCase() === 'w') return { x: 0, y: 0, scale: step };\n if (event.key.toLowerCase() === 's') return { x: 0, y: 0, scale: -step };\n\n return undefined;\n }\n\n private syncDraftAdjustmentUi({\n draft,\n pin,\n selectionHighlight,\n }: {\n draft: NoteDraft;\n pin: HTMLButtonElement;\n selectionHighlight?: HTMLDivElement;\n }) {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const hostPoint = toHostPoint(\n this.getAdjustedDraftPoint(draft.marker.viewport, draft),\n environment\n );\n pin.style.left = `${hostPoint.x}px`;\n pin.style.top = `${hostPoint.y}px`;\n\n if (draft.selection && selectionHighlight) {\n const rect = toHostSelection(\n this.getAdjustedDraftSelection(\n toViewportSelection(draft.selection.viewport),\n draft\n ),\n environment\n );\n selectionHighlight.style.left = `${rect.left}px`;\n selectionHighlight.style.top = `${rect.top}px`;\n selectionHighlight.style.width = `${rect.width}px`;\n selectionHighlight.style.height = `${rect.height}px`;\n }\n\n this.syncDraftPreview(draft);\n }\n\n private createAreaForm() {\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n const areaDraft = this.state.areaDraft;\n\n if (!areaDraft) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Drag on the page to select an area.';\n form.append(empty);\n return form;\n }\n\n form.append(this.createAreaMetricsPanel(areaDraft));\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Area comment';\n textarea.rows = 4;\n textarea.value = areaDraft.comment ?? '';\n textarea.addEventListener('input', () => {\n const draft = this.state.areaDraft;\n if (!draft) return;\n this.config.actions.setAreaDraft({\n ...draft,\n comment: textarea.value,\n });\n });\n\n const actions = this.createFormActions('Save area', () => {\n const comment = textarea.value.trim();\n const draft = this.state.areaDraft;\n if (!comment || !draft) return;\n void this.config.actions.createItem({\n kind: 'area',\n comment,\n viewport: draft.viewport,\n anchor: draft.anchor,\n marker: draft.marker,\n selection: draft.selection,\n });\n });\n\n form.append(textarea, actions);\n return form;\n }\n\n private createAreaMetricsPanel(draft: AreaDraft) {\n const panel = document.createElement('div');\n panel.className = 'dfwr-adjust-panel is-area-metrics-panel';\n\n const help = document.createElement('div');\n help.className = 'dfwr-adjust-help';\n const [labelLine, xyLine, sizeLine] = this.getSelectionMetricLines(\n this.getAreaDraftMetricSelection(draft),\n draft.viewport\n );\n help.textContent = labelLine;\n\n const xyStatus = document.createElement('div');\n xyStatus.className = 'dfwr-adjust-status';\n xyStatus.textContent = xyLine;\n\n const sizeStatus = document.createElement('div');\n sizeStatus.className = 'dfwr-adjust-status';\n sizeStatus.textContent = sizeLine;\n\n panel.append(help, xyStatus, sizeStatus);\n return panel;\n }\n\n private createAreaDraftOverlay(draft: AreaDraft) {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-preview-layer';\n\n const environment = this.config.getEnvironment();\n if (!environment || !draft.selection) return layer;\n\n const selection = toViewportSelection(draft.selection.viewport);\n layer.append(this.createSelectionHighlight(selection, environment, true));\n\n if (draft.marker) {\n const hostPoint = toHostPoint(draft.marker.viewport, environment);\n layer.append(\n this.createMarkerElement(\n undefined,\n hostPoint,\n '•',\n getReviewViewportScope(\n draft.viewport,\n this.config.options.viewports?.presets\n ),\n true,\n true\n )\n );\n }\n\n return layer;\n }\n\n private createAreaDraftPopover(draft: AreaDraft) {\n const environment = this.config.getEnvironment();\n const popover = document.createElement('div');\n popover.className = 'dfwr-area-draft is-composer';\n if (environment && draft.selection) {\n const selection = toHostSelection(\n toViewportSelection(draft.selection.viewport),\n environment\n );\n const composer = this.getDraftComposerPosition({\n selection,\n environment,\n composerPosition: draft.composerPosition,\n estimatedHeight: 220,\n });\n popover.style.left = `${composer.left}px`;\n popover.style.top = `${composer.top}px`;\n popover.style.width = `${composer.width}px`;\n popover.style.right = 'auto';\n }\n const dragHandle = this.createDraftDragHandle('Move area composer');\n popover.append(dragHandle, this.createAreaForm());\n this.attachDraftComposerDrag(popover, dragHandle, (composerPosition) => {\n const areaDraft = this.state.areaDraft ?? draft;\n this.config.actions.setAreaDraft({\n ...areaDraft,\n composerPosition,\n });\n });\n return popover;\n }\n\n private createFormActions(\n saveLabel: string,\n onSave: () => void,\n options?: {\n beforeSave?: HTMLButtonElement[];\n className?: string;\n }\n ) {\n const actions = document.createElement('div');\n actions.className = ['dfwr-actions', options?.className]\n .filter(Boolean)\n .join(' ');\n\n const save = document.createElement('button');\n save.className = 'dfwr-button is-primary';\n save.type = 'button';\n save.textContent = saveLabel;\n save.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n onSave();\n });\n\n const cancel = document.createElement('button');\n cancel.className = 'dfwr-button';\n cancel.type = 'button';\n cancel.textContent = 'Cancel';\n cancel.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.config.actions.setModeState('idle');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n });\n\n if (options?.beforeSave?.length || options?.className) {\n actions.append(cancel, ...(options.beforeSave ?? []), save);\n return actions;\n }\n\n actions.append(save, cancel);\n return actions;\n }\n\n private createList() {\n const section = document.createElement('div');\n section.className = 'dfwr-list';\n const state = this.state;\n\n const heading = document.createElement('div');\n heading.className = 'dfwr-list-heading';\n heading.textContent = `Review items (${state.items.length})`;\n section.append(heading);\n\n if (state.items.length === 0) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'No review items on this page.';\n section.append(empty);\n return section;\n }\n\n for (const numberedItem of getNumberedReviewItems(\n state.items,\n this.config.options.viewports?.presets\n )) {\n section.append(this.createListItem(numberedItem));\n }\n\n return section;\n }\n\n private createListItem(numberedItem: NumberedReviewItem) {\n const { item } = numberedItem;\n const row = document.createElement('article');\n row.className = 'dfwr-item';\n row.tabIndex = 0;\n row.setAttribute('role', 'button');\n row.setAttribute(\n 'aria-label',\n `Restore review item: ${item.title ?? item.comment}`\n );\n row.addEventListener('click', () => {\n void this.config.actions.restoreItem(item);\n });\n row.addEventListener('keydown', (event) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n\n event.preventDefault();\n void this.config.actions.restoreItem(item);\n });\n\n const body = document.createElement('div');\n body.className = 'dfwr-item-body';\n\n const badges = document.createElement('div');\n badges.className = 'dfwr-item-badges';\n\n const scope = document.createElement('div');\n scope.className = `dfwr-item-scope is-scope-${numberedItem.scope}`;\n scope.textContent = numberedItem.displayLabel;\n\n const kind = document.createElement('div');\n kind.className = 'dfwr-item-kind';\n kind.textContent = item.kind;\n badges.append(scope, kind);\n\n const comment = document.createElement('p');\n comment.className = 'dfwr-item-comment';\n comment.textContent = item.comment;\n\n const date = document.createElement('time');\n date.className = 'dfwr-item-date';\n date.dateTime = item.createdAt;\n date.textContent = formatItemMeta(item);\n\n body.append(badges, comment, date);\n\n const actions = document.createElement('div');\n actions.className = 'dfwr-item-actions';\n actions.addEventListener('click', (event) => event.stopPropagation());\n actions.addEventListener('keydown', (event) => event.stopPropagation());\n\n const remove = document.createElement('button');\n remove.className = 'dfwr-icon-button';\n remove.type = 'button';\n remove.textContent = 'x';\n remove.setAttribute('aria-label', 'Delete');\n remove.addEventListener('click', (event) => {\n event.stopPropagation();\n void this.config.actions\n .removeItem(item.id)\n .then(() => this.config.actions.reload());\n });\n\n actions.append(remove);\n row.append(body, actions);\n return row;\n }\n\n private createMarkerLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-marker-layer';\n const environment = this.config.getEnvironment();\n if (!environment) return layer;\n\n const currentScope = getReviewViewportScope(\n getViewportSize(environment),\n this.config.options.viewports?.presets\n );\n\n getNumberedReviewItems(\n this.state.items,\n this.config.options.viewports?.presets\n ).forEach((numberedItem) => {\n const { item, scope, displayLabel } = numberedItem;\n if (!shouldShowMarkerForScope(scope, currentScope)) {\n return;\n }\n\n const isHighlighted = item.id === this.state.highlightedItemId;\n const highlightMode = getReviewItemHighlightMode(item);\n if (\n highlightMode !== 'note' &&\n (!this.state.highlightedItemId || isHighlighted)\n ) {\n const selection = getItemHighlightSelection(item, environment);\n if (selection) {\n layer.append(\n ...this.createItemHighlightElements(\n selection.viewport,\n environment,\n item,\n displayLabel,\n selection.isBound,\n isHighlighted\n )\n );\n return;\n }\n }\n\n const point = getBoundMarkerPoint(item, environment);\n if (!point || !isPointInViewport(point.viewport, environment)) {\n return;\n }\n\n const hostPoint = toHostPoint(point.viewport, environment);\n const marker = this.createMarkerElement(\n item.id,\n hostPoint,\n displayLabel,\n scope,\n point.isBound,\n isHighlighted,\n highlightMode === 'note' ? 'note' : 'default'\n );\n marker.title = `${displayLabel} / ${item.comment}\\n${formatItemMeta(item)}`;\n layer.append(marker);\n });\n\n return layer;\n }\n\n private createItemHighlightElements(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n item: ReviewItem,\n label: string,\n isBound: boolean,\n isHighlighted: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const mode = getReviewItemHighlightMode(item);\n const highlight = document.createElement('div');\n highlight.className = [\n 'dfwr-item-target-highlight',\n `is-mode-${mode}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n highlight.dataset.reviewItemId = item.id;\n\n const labelElement = document.createElement('div');\n labelElement.className = [\n 'dfwr-item-target-label',\n `is-mode-${mode}`,\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n labelElement.textContent = label;\n labelElement.style.left = `${Math.max(4, rect.left)}px`;\n labelElement.style.top = `${Math.max(4, rect.top - 24)}px`;\n labelElement.dataset.reviewItemId = item.id;\n\n return [highlight, labelElement];\n }\n\n private createSelectionHighlight(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n isDraft: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const highlight = document.createElement('div');\n highlight.className = `dfwr-selection-highlight${\n isDraft ? ' is-draft' : ''\n }`;\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n return highlight;\n }\n\n private createMarkerElement(\n itemId: string | undefined,\n hostPoint: ReviewPoint,\n label: string,\n scope: ReviewItemScope,\n isBound: boolean,\n isHighlighted: boolean,\n variant: 'default' | 'note' = 'default'\n ) {\n const isNoteCallout = variant === 'note';\n const marker = document.createElement('div');\n marker.className = [\n 'dfwr-bound-marker',\n isNoteCallout ? 'is-note-callout' : '',\n `is-scope-${scope}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n marker.style.left = `${hostPoint.x}px`;\n marker.style.top = `${hostPoint.y}px`;\n marker.dataset.scope = scope;\n if (itemId) {\n marker.dataset.reviewItemId = itemId;\n }\n\n const iconElement = document.createElement('span');\n iconElement.className = 'dfwr-bound-marker-icon';\n iconElement.setAttribute('aria-hidden', 'true');\n const labelElement = document.createElement('span');\n labelElement.className = 'dfwr-bound-marker-number';\n labelElement.textContent = label;\n marker.append(iconElement, labelElement);\n\n return marker;\n }\n\n private attachDraftPinDrag(\n pin: HTMLButtonElement,\n popover: HTMLDivElement | undefined,\n meta: HTMLDivElement | undefined,\n textarea: HTMLTextAreaElement\n ) {\n let isDragging = false;\n\n const moveDraftUi = (hostPoint: ReviewPoint) => {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const nextPoint = clampPoint(toTargetPoint(hostPoint, environment), environment);\n const nextHostPoint = toHostPoint(nextPoint, environment);\n\n pin.style.left = `${nextHostPoint.x}px`;\n pin.style.top = `${nextHostPoint.y}px`;\n if (popover) {\n const position = getPopoverPosition(nextHostPoint, environment);\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n }\n\n const noteDraft = this.state.noteDraft;\n if (!noteDraft) return;\n\n const nextDraft = {\n ...noteDraft,\n marker: {\n ...noteDraft.marker,\n viewport: roundPoint(nextPoint),\n },\n comment: textarea.value,\n };\n this.config.actions.setNoteDraft(nextDraft);\n if (meta) {\n meta.textContent = formatNoteDraftMeta(nextDraft);\n }\n };\n\n pin.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = true;\n pin.setPointerCapture(event.pointerId);\n });\n\n pin.addEventListener('pointermove', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n moveDraftUi({\n x: event.clientX,\n y: event.clientY,\n });\n });\n\n pin.addEventListener('pointerup', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = false;\n pin.releasePointerCapture(event.pointerId);\n\n const nextPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n void (this.state.mode === 'element'\n ? this.config.actions.bindElementDraftToPoint(nextPoint, textarea.value)\n : this.config.actions.bindNoteDraftToPoint(nextPoint, textarea.value));\n });\n }\n\n private createNoteLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-text-layer';\n const environment = this.config.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.config.actions.bindNoteDraftToPoint(\n toTargetPointFromHostEvent(event, this.config.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private createElementLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-element-layer';\n const environment = this.config.getEnvironment();\n const hover = document.createElement('div');\n hover.className = 'dfwr-dom-hover';\n hover.hidden = true;\n layer.append(hover);\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const updateHover = (point: ReviewPoint) => {\n const nextEnvironment = this.config.getEnvironment();\n if (!nextEnvironment) return;\n\n const anchor = getDomAnchorFromPoint(\n clampPoint(point, nextEnvironment),\n this.config.options.anchors?.attribute,\n nextEnvironment\n );\n const selection = anchor\n ? getElementViewportSelection(anchor, nextEnvironment)\n : undefined;\n\n if (!selection) {\n hover.hidden = true;\n return;\n }\n\n const rect = toHostSelection(selection, nextEnvironment);\n hover.hidden = false;\n hover.style.left = `${rect.left}px`;\n hover.style.top = `${rect.top}px`;\n hover.style.width = `${rect.width}px`;\n hover.style.height = `${rect.height}px`;\n };\n\n layer.addEventListener('pointermove', (event) => {\n updateHover(toTargetPointFromHostEvent(event, this.config.getEnvironment()));\n });\n\n layer.addEventListener('pointerleave', () => {\n hover.hidden = true;\n });\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.config.actions.bindElementDraftToPoint(\n toTargetPointFromHostEvent(event, this.config.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private createAreaLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-layer';\n const environment = this.config.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const box = document.createElement('div');\n box.className = 'dfwr-area-box';\n layer.append(box);\n\n let startX = 0;\n let startY = 0;\n let selection: ViewportSelection | undefined;\n\n const updateBox = (event: PointerEvent) => {\n const nextPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n const left = Math.min(startX, nextPoint.x);\n const top = Math.min(startY, nextPoint.y);\n const width = Math.abs(nextPoint.x - startX);\n const height = Math.abs(nextPoint.y - startY);\n const hostPoint = toHostPoint(\n { x: left, y: top },\n this.config.getEnvironment()\n );\n\n selection = { left, top, width, height };\n box.style.left = `${hostPoint.x}px`;\n box.style.top = `${hostPoint.y}px`;\n box.style.width = `${width}px`;\n box.style.height = `${height}px`;\n };\n\n layer.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n layer.setPointerCapture(event.pointerId);\n const startPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n startX = startPoint.x;\n startY = startPoint.y;\n updateBox(event);\n });\n\n layer.addEventListener('pointermove', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n updateBox(event);\n });\n\n layer.addEventListener('pointerup', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n layer.releasePointerCapture(event.pointerId);\n updateBox(event);\n\n if (!selection || selection.width < 8 || selection.height < 8) return;\n\n this.config.actions.setSelectingArea(true);\n this.config.actions.render();\n void this.config.actions.createAreaDraft(selection);\n });\n\n return layer;\n }\n}\n","import { localAdapter } from '../adapters/local';\nimport type {\n DomAnchor,\n ReviewItem,\n ReviewMarker,\n ReviewMode,\n ReviewPoint,\n ReviewSelection,\n WebReviewKitAdapter,\n WebReviewKitController,\n WebReviewKitOptions,\n} from '../types';\nimport {\n cssEscape,\n getDomAnchor,\n getDomAnchorFromPoint,\n getElementViewportSelection,\n getRelativePoint,\n getRelativeSelection,\n} from './dom.anchor';\nimport {\n createId,\n} from './id';\nimport {\n clampPoint,\n getPointSelection,\n getSelectionCenter,\n getViewportSize,\n roundPoint,\n toPublicSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\nimport { isHotkey } from './hotkey';\nimport {\n getOriginalUrl,\n getPageUrl,\n getRouteKey,\n} from './location';\nimport { getReviewViewportScope } from './review/scope';\nimport { createSelectionCenterMarker } from './review/item';\nimport type {\n AreaDraft,\n NoteDraft,\n ReviewDraftPreviewElement,\n} from './review/draft';\nimport {\n runWithAutoScrollBehavior,\n setDocumentScrollInstantly,\n waitForNextFrame,\n} from './scroll';\nimport {\n WebReviewKitView,\n type CreateReviewItemInput,\n} from './web.review.kit.view';\n\nconst ROOT_ID = 'df-web-review-kit-root';\n\nfunction isEditableEventTarget(event: KeyboardEvent) {\n const path = event.composedPath?.() ?? [];\n const element = (path[0] ?? event.target) as HTMLElement | null;\n if (!element || typeof element.tagName !== 'string') return false;\n\n const tag = element.tagName;\n return (\n tag === 'INPUT' ||\n tag === 'TEXTAREA' ||\n tag === 'SELECT' ||\n element.isContentEditable === true\n );\n}\n\n/** Creates the vanilla runtime controller that mounts review overlays on a target page. */\nexport function createWebReviewKit(\n options: WebReviewKitOptions\n): WebReviewKitController {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return createNoopController();\n }\n\n const app = new WebReviewKitApp(options);\n app.mount();\n\n return {\n open: () => app.open(),\n close: () => app.close(),\n toggle: () => app.toggle(),\n setMode: (mode) => app.setMode(mode),\n getMode: () => app.getMode(),\n highlightItem: (itemId) => app.highlightItem(itemId),\n setHiddenItemIds: (itemIds) => app.setHiddenItemIds(itemIds),\n reload: () => app.reload(),\n getItems: () => app.getItems(),\n destroy: () => app.destroy(),\n };\n}\n\nclass WebReviewKitApp {\n private readonly adapter: WebReviewKitAdapter;\n private readonly hotkey: string;\n private readonly view: WebReviewKitView;\n private root?: HTMLDivElement;\n private shadow?: ShadowRoot;\n private isOpen = false;\n private mode: ReviewMode = 'idle';\n private items: ReviewItem[] = [];\n private noteDraft?: NoteDraft;\n private areaDraft?: AreaDraft;\n private isSelectingArea = false;\n private highlightedItemId?: string;\n private hiddenItemIds?: Set<string>;\n private renderFrame?: number;\n\n constructor(private readonly options: WebReviewKitOptions) {\n this.adapter = options.adapter ?? localAdapter();\n this.hotkey = options.hotkeys?.qa ?? 'Shift+Q';\n this.view = new WebReviewKitView({\n options,\n getState: () => ({\n isOpen: this.isOpen,\n mode: this.mode,\n items: this.items,\n noteDraft: this.noteDraft,\n areaDraft: this.areaDraft,\n isSelectingArea: this.isSelectingArea,\n highlightedItemId: this.highlightedItemId,\n }),\n getEnvironment: () => this.getEnvironment(),\n actions: {\n close: () => this.close(),\n render: () => this.render(),\n reload: () => this.reload(),\n restoreItem: (item) => this.restoreItem(item),\n removeItem: (itemId) => this.adapter.remove(itemId),\n setModeState: (mode) => this.setModeState(mode),\n clearDrafts: () => {\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n },\n setNoteDraft: (draft) => {\n this.noteDraft = draft;\n },\n setAreaDraft: (draft) => {\n this.areaDraft = draft;\n },\n setSelectingArea: (isSelectingArea) => {\n this.isSelectingArea = isSelectingArea;\n },\n createItem: (input) => this.createItem(input),\n bindNoteDraftToPoint: (point, comment) =>\n this.bindNoteDraftToPoint(point, comment),\n bindElementDraftToPoint: (point, comment) =>\n this.bindElementDraftToPoint(point, comment),\n createAreaDraft: (selection) => this.createAreaDraft(selection),\n },\n });\n }\n\n mount() {\n if (this.root) return;\n\n const existing = document.getElementById(ROOT_ID);\n if (existing) existing.remove();\n\n this.root = document.createElement('div');\n this.root.id = ROOT_ID;\n this.root.style.display = 'contents';\n\n this.shadow = this.root.attachShadow({ mode: 'open' });\n document.body.appendChild(this.root);\n document.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('scroll', this.handleViewportChange, true);\n window.addEventListener('resize', this.handleViewportChange);\n\n this.render();\n }\n\n destroy() {\n this.view.clearDraftPreview();\n document.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('scroll', this.handleViewportChange, true);\n window.removeEventListener('resize', this.handleViewportChange);\n if (this.renderFrame) {\n window.cancelAnimationFrame(this.renderFrame);\n this.renderFrame = undefined;\n }\n this.root?.remove();\n this.root = undefined;\n this.shadow = undefined;\n }\n\n open() {\n if (this.isOpen) return;\n\n this.isOpen = true;\n void this.reload();\n }\n\n close() {\n this.isOpen = false;\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n }\n\n toggle() {\n if (this.isOpen) {\n this.close();\n return;\n }\n\n this.open();\n }\n\n setMode(mode: ReviewMode) {\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.setModeState(this.mode === mode ? 'idle' : mode);\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.render();\n }\n\n getMode() {\n return this.mode;\n }\n\n getItems() {\n return this.items;\n }\n\n highlightItem(itemId?: string) {\n if (!itemId) {\n this.clearHighlightedItem();\n return;\n }\n\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.highlightedItemId = itemId;\n this.render();\n }\n\n setHiddenItemIds(itemIds?: string[]) {\n this.hiddenItemIds = itemIds ? new Set(itemIds) : undefined;\n this.updateHiddenItemsStyle();\n }\n\n private clearHighlightedItem() {\n if (!this.highlightedItemId) return;\n\n this.highlightedItemId = undefined;\n this.render();\n }\n\n private createHiddenItemsStyleElement() {\n const style = document.createElement('style');\n style.dataset.dfwrHiddenItems = 'true';\n style.textContent = this.getHiddenItemsCss();\n return style;\n }\n\n private updateHiddenItemsStyle() {\n if (!this.shadow) return;\n\n let style = this.shadow.querySelector<HTMLStyleElement>(\n 'style[data-dfwr-hidden-items=\"true\"]'\n );\n if (!style) {\n style = this.createHiddenItemsStyleElement();\n this.shadow.prepend(style);\n return;\n }\n\n style.textContent = this.getHiddenItemsCss();\n }\n\n private getHiddenItemsCss() {\n if (!this.hiddenItemIds?.size) return '';\n\n return Array.from(this.hiddenItemIds)\n .map(\n (itemId) =>\n `[data-review-item-id=\"${cssEscape(itemId)}\"] { display: none !important; }`\n )\n .join('\\n');\n }\n\n private setModeState(mode: ReviewMode) {\n if (this.mode === mode) return;\n\n this.mode = mode;\n this.options.onModeChange?.(mode);\n }\n\n private cancelMode() {\n if (\n this.mode === 'idle' &&\n !this.noteDraft &&\n !this.areaDraft &&\n !this.isSelectingArea\n ) {\n return false;\n }\n\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n return true;\n }\n\n private readonly handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.cancelMode()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isEditableEventTarget(event) || !isHotkey(event, this.hotkey)) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.toggle();\n };\n\n private readonly handleViewportChange = () => {\n if (!this.isOpen || this.renderFrame) return;\n\n this.renderFrame = window.requestAnimationFrame(() => {\n this.renderFrame = undefined;\n this.render();\n });\n };\n\n private getEnvironment(): ReviewEnvironment | undefined {\n const target =\n typeof this.options.target === 'function'\n ? this.options.target()\n : this.options.target;\n\n if (!target) {\n return {\n window,\n document,\n viewportRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n overlayRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n };\n }\n\n try {\n const rect = target.getViewportRect?.() ?? {\n left: 0,\n top: 0,\n width: target.window.innerWidth,\n height: target.window.innerHeight,\n };\n const overlayRect = target.getOverlayRect?.() ?? rect;\n\n return {\n window: target.window,\n document: target.document,\n viewportRect: {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n },\n overlayRect: {\n left: overlayRect.left,\n top: overlayRect.top,\n width: overlayRect.width,\n height: overlayRect.height,\n },\n };\n } catch {\n return undefined;\n }\n }\n\n async reload() {\n const environment = this.getEnvironment();\n if (!environment) return this.items;\n\n this.items = await this.adapter.list({\n projectId: this.options.projectId,\n routeKey: getRouteKey(environment),\n });\n this.options.onItemsChange?.(this.items);\n if (this.isOpen) {\n this.render();\n }\n return this.items;\n }\n\n private render() {\n if (!this.shadow) return;\n\n this.view.render(this.shadow, this.createHiddenItemsStyleElement());\n }\n\n private async bindNoteDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const selection = getPointSelection(nextPoint);\n const anchor = getDomAnchor(\n selection,\n this.options.anchors?.attribute,\n environment\n );\n const marker: ReviewMarker = {\n viewport: roundPoint(nextPoint),\n relative: anchor\n ? getRelativePoint(nextPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n comment,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private async bindElementDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const pointSelection = getPointSelection(nextPoint);\n const targetElement = environment.document.elementFromPoint(\n nextPoint.x,\n nextPoint.y\n );\n const previewElement =\n targetElement && 'style' in targetElement\n ? (targetElement as ReviewDraftPreviewElement)\n : undefined;\n const targetRect = targetElement?.getBoundingClientRect();\n const clickedSelection =\n targetRect && targetRect.width > 0 && targetRect.height > 0\n ? {\n left: targetRect.left,\n top: targetRect.top,\n width: targetRect.width,\n height: targetRect.height,\n }\n : undefined;\n const anchor = getDomAnchorFromPoint(\n nextPoint,\n this.options.anchors?.attribute,\n environment\n );\n const elementSelection = anchor\n ? (clickedSelection ??\n getElementViewportSelection(anchor, environment, pointSelection))\n : undefined;\n const selection = elementSelection ?? pointSelection;\n const markerPoint = elementSelection\n ? { x: selection.left, y: selection.top }\n : getSelectionCenter(selection);\n const reviewSelection = elementSelection\n ? {\n viewport: toPublicSelection(elementSelection),\n relative: getRelativeSelection(\n elementSelection,\n anchor as DomAnchor,\n environment\n ),\n }\n : undefined;\n const marker: ReviewMarker = {\n viewport: roundPoint(markerPoint),\n relative: anchor\n ? getRelativePoint(markerPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n selection: reviewSelection,\n comment,\n previewElement,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private async createAreaDraft(selection: ViewportSelection) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n\n this.areaDraft = await this.withOverlayHidden(() => {\n const marker = createSelectionCenterMarker(\n selection,\n undefined,\n environment\n );\n const reviewSelection: ReviewSelection = {\n viewport: toPublicSelection(selection),\n };\n\n return {\n viewport,\n marker,\n selection: reviewSelection,\n };\n });\n this.isSelectingArea = false;\n this.setModeState('area');\n this.render();\n }\n\n private async withOverlayHidden<T>(callback: () => Promise<T> | T) {\n if (!this.root) return callback();\n\n const previousDisplay = this.root.style.display;\n this.root.style.display = 'none';\n\n try {\n // Hide our own overlay while sampling elementFromPoint so we anchor to the page.\n return await callback();\n } finally {\n this.root.style.display = previousDisplay;\n }\n }\n\n private async createItem(input: CreateReviewItemInput) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const now = new Date().toISOString();\n const routeKey = getRouteKey(environment);\n const viewport = input.viewport ?? getViewportSize(environment);\n const createdBy = this.options.userId?.trim();\n const item: ReviewItem = {\n id: createId(),\n projectId: this.options.projectId,\n routeKey,\n pageUrl: getPageUrl(environment),\n originalUrl: getOriginalUrl(environment),\n normalizedPath: routeKey,\n scope:\n input.scope ??\n getReviewViewportScope(viewport, this.options.viewports?.presets),\n kind: input.kind,\n title: input.comment.split('\\n')[0]?.slice(0, 80),\n comment: input.comment,\n createdBy: createdBy || undefined,\n status: 'todo',\n viewport,\n devicePixelRatio: environment.window.devicePixelRatio || 1,\n scroll: {\n x: environment.window.scrollX,\n y: environment.window.scrollY,\n },\n anchor: input.anchor,\n marker: input.marker,\n selection: input.selection,\n createdAt: now,\n updatedAt: now,\n };\n\n const createdItem = await this.adapter.create(item);\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.highlightItem(createdItem.id);\n await this.reload();\n await this.options.onCreateItem?.(createdItem);\n }\n\n private async restoreItem(item: ReviewItem) {\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n\n if (this.options.onRestoreItem) {\n await this.options.onRestoreItem(item);\n return;\n }\n\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const scroll = item.scroll;\n if (scroll) {\n runWithAutoScrollBehavior(environment.document, () => {\n setDocumentScrollInstantly(environment, scroll);\n });\n await waitForNextFrame(environment);\n }\n\n this.highlightItem(item.id);\n this.render();\n }\n}\n\nfunction createNoopController(): WebReviewKitController {\n return {\n open() {},\n close() {},\n toggle() {},\n setMode() {},\n getMode() {\n return 'idle';\n },\n highlightItem() {},\n setHiddenItemIds() {},\n async reload() {\n return [];\n },\n getItems() {\n return [];\n },\n destroy() {},\n };\n}\n","import type { 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, useRef, 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\nconst TARGET_OVERLAY_REFRESH_DELAYS = [80, 240, 600];\n\nexport const useReviewTargetOverlay = ({\n iframeRef,\n isFigmaOverlayAvailable,\n targetOverlayState,\n onTargetOverlayStateChange,\n}: UseReviewTargetOverlayOptions) => {\n const refreshTimersRef = useRef<number[]>([]);\n\n const clearRefreshTimers = useCallback(() => {\n refreshTimersRef.current.forEach((timer) => window.clearTimeout(timer));\n refreshTimersRef.current = [];\n }, []);\n\n const updateTargetOverlayState = useCallback(() => {\n const state = getTargetOverlayState(\n iframeRef.current?.contentDocument ?? undefined\n );\n onTargetOverlayStateChange(state);\n return state;\n }, [iframeRef, onTargetOverlayStateChange]);\n\n const refreshTargetOverlayState = useCallback(() => {\n clearRefreshTimers();\n updateTargetOverlayState();\n refreshTimersRef.current = TARGET_OVERLAY_REFRESH_DELAYS.map((delay) =>\n window.setTimeout(updateTargetOverlayState, delay)\n );\n }, [clearRefreshTimers, updateTargetOverlayState]);\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 = updateTargetOverlayState();\n if (!currentState[overlay]) return false;\n\n return dispatchTargetOverlayHotkey(overlay);\n },\n [dispatchTargetOverlayHotkey, updateTargetOverlayState]\n );\n\n useEffect(() => {\n if (isFigmaOverlayAvailable || !targetOverlayState.figma) return;\n closeTargetOverlay('figma');\n }, [closeTargetOverlay, isFigmaOverlayAvailable, targetOverlayState.figma]);\n\n useEffect(() => clearRefreshTimers, [clearRefreshTimers]);\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,iBAAkB;AAClB,oBAA2B;;;ACD3B,IAAM,wBAAwB;AAEvB,SAAS,yBAAyB;AACvC,MAAI,CAAC,SAAS,eAAe,qBAAqB,GAAG;AACnD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["import_react","import_react","__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","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","error","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","toPascalCase","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","ReviewScopeIcon","Map","import_react","import_react","import_react","getSourceAttribute","getViewportPresetDistance","runWithAutoScrollBehavior","setDocumentScrollInstantly","isEditableEventTarget","runWithAutoScrollBehavior","setDocumentScrollInstantly","import_react","import_react","import_react","createId","import_react","import_react","frame","import_react","import_react","import_react","import_react","statusOption","item","updated","statusOption","import_jsx_runtime","refreshReviewData","target","toastMessage","import_jsx_runtime","React"]}
|