@designfever/web-review-kit 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react-shell.tsx","../src/react-shell/style/base.ts","../src/react-shell/style/sitemap.ts","../src/react-shell/style/modals.ts","../src/react-shell/style/toolbar.ts","../src/react-shell/style/qa-panel.ts","../src/react-shell/style/figma-images.ts","../src/react-shell/style/stage.ts","../src/react-shell/style/source-inspector.ts","../src/react-shell/style/section-outline.ts","../src/react-shell/style/ruler.ts","../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/chevron-down.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/chevron-right.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/code-xml.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/contrast.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/database.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/image.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/images.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/lock-open.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/lock.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/moon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/move-vertical.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/plus.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/search.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-check-big.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/square-dashed.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/sun.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/trash-2.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/type.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/review/df.logo.tsx","../src/react-shell/env.ts","../src/react-shell/constants.ts","../src/react-shell/route.ts","../src/react-shell/viewport.ts","../src/react-shell/prompt/modal.tsx","../src/react-shell/prompt/prompt.ts","../src/react-shell/prompt/initial.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/figma/figma-mark-icon.tsx","../src/react-shell/figma/images.panel.tsx","../src/react-shell/figma/image.overlay.controller.ts","../src/react-shell/figma/image.controller.ts","../src/react-shell/figma/image-panel.utils.ts","../src/react-shell/figma/layer-state-buttons.tsx","../src/react-shell/review/spinner.tsx","../src/react-shell/qa/item.edit.modal.tsx","../src/react-shell/qa/item.assignee.actions.tsx","../src/react-shell/qa/item.remote.actions.tsx","../src/react-shell/qa/item.status.actions.tsx","../src/react-shell/anchor.restore.ts","../src/react-shell/review/item.icons.tsx","../src/react-shell/qa/item.card.tsx","../src/react-shell/qa/panel.header.tsx","../src/react-shell/qa/panel.tsx","../src/react-shell/presence/overlay.tsx","../src/react-shell/source.hint.ts","../src/react-shell/source.open.ts","../src/react-shell/section.outline.ts","../src/react-shell/review/shell.helpers.ts","../src/react-shell/review/section.outline.panel.tsx","../src/react-shell/review/source.shortcut.style.ts","../src/react-shell/review/source.inspector.overlay.tsx","../src/react-shell/review/mode.toolbar.tsx","../src/react-shell/ruler/gutters.tsx","../src/react-shell/ruler/overlay.tsx","../src/react-shell/target/figma.image.overlay.ts","../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/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.figma.images.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/figma/dev-overlay.tsx","../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 { mountFigmaDevOverlay } from './react-shell/figma/dev-overlay';\nexport type {\n CreateReviewPagesOptions,\n ReviewShellAdapter,\n ReviewShellAdapters,\n ReviewShellAssigneeOption,\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewSourceEditor,\n ReviewSourceInspectorOptions,\n ReviewShellFigmaImagesOptions,\n ReviewShellGlobEntries,\n ReviewShellMountOptions,\n ReviewShellPage,\n ReviewShellProps,\n ReviewShellStatusOption,\n ReviewShellUpdateAssigneeInput,\n ReviewShellUpdateStatusInput,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n} from './react-shell/types';\nexport type {\n FigmaDevOverlayController,\n FigmaDevOverlayMountOptions,\n} from './react-shell/figma/dev-overlay';\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","import { reviewTypographyTokens } from '../../core/typography.tokens';\n\nexport const reviewShellBaseStyle = `\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 .df-review-spinner {\n display: inline-block;\n width: 22px;\n min-width: 22px;\n height: 22px;\n min-height: 22px;\n box-sizing: border-box;\n border: 3px solid color-mix(in srgb, var(--df-review-accent) 28%, transparent);\n border-top-color: var(--df-review-accent);\n border-radius: 50%;\n animation: df-review-spinner-spin 760ms linear infinite;\n will-change: transform;\n }\n\n @keyframes df-review-spinner-spin {\n to {\n transform: rotate(1turn);\n }\n }\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 ${reviewTypographyTokens}\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: 34px;\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 position: relative;\n display: grid;\n grid-template-columns: minmax(0, 1fr) 0 48px;\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) 48px;\n }\n\n\t .df-review-topbar {\n\t grid-column: 1;\n\t grid-row: 1;\n\t position: relative;\n\t z-index: 600;\n\t display: grid;\n\t gap: var(--df-review-space-2);\n\t container-type: inline-size;\n\t min-width: 0;\n\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t border-bottom: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-topbar), var(--df-review-panel));\n\t box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.025);\n\t }\n\n\t\t .df-review-address {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(160px, 1fr) auto;\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-actions {\n display: flex;\n align-items: stretch;\n gap: 4px;\n min-width: 0;\n }\n\n .df-review-address input {\n\t width: 100%;\n\t height: var(--df-review-control-height-md);\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-address a,\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 height: var(--df-review-control-height-md);\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: var(--df-review-font-weight-normal);\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\t .df-review-address a: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-address-icon-button {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n min-width: var(--df-review-control-height-md);\n padding: 0;\n text-decoration: none;\n }\n\n .df-review-address-icon-button svg {\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n }\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`;\n","export const reviewShellSitemapStyle = `\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 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 font-weight: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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-search {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 34px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: 0 10px;\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n color: var(--df-review-muted);\n }\n\n .df-review-sitemap-search:focus-within {\n border-color: var(--df-review-accent);\n color: var(--df-review-text);\n }\n\n .df-review-sitemap-search svg {\n width: 15px;\n min-width: 15px;\n height: 15px;\n }\n\n .df-review-sitemap-search input {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 30px;\n border: 0;\n padding: 0;\n outline: none;\n color: var(--df-review-text);\n background: transparent;\n appearance: none;\n font: inherit;\n font-size: var(--df-review-font-size-sm);\n }\n\n .df-review-sitemap-search input::-webkit-search-cancel-button {\n appearance: none;\n }\n\n .df-review-sitemap-search input::placeholder {\n color: var(--df-review-muted);\n }\n\n .df-review-sitemap-search-clear {\n display: grid;\n place-items: center;\n width: 34px;\n min-width: 34px;\n min-height: 34px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n background: var(--df-review-control);\n color: var(--df-review-muted);\n }\n\n .df-review-sitemap-search-clear:hover {\n border-color: var(--df-review-accent);\n color: var(--df-review-text);\n background: var(--df-review-control-hover);\n }\n\n .df-review-sitemap-search-clear svg {\n width: 15px;\n height: 15px;\n }\n\n .df-review-sitemap-search-count {\n flex: 0 0 auto;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n white-space: nowrap;\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: var(--df-review-font-weight-emphasis);\n }\n\n .df-review-sitemap-list {\n --df-review-sitemap-grid-template: minmax(190px, 1fr) 58px 70px 56px minmax(96px, 140px);\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: 6px;\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: 30px;\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: var(--df-review-font-weight-normal);\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: 34px;\n border: 0;\n border-radius: 0;\n padding: 0 8px;\n background: transparent;\n color: var(--df-review-text);\n text-align: left;\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.is-clickable {\n cursor: pointer;\n }\n\n .df-review-sitemap-row.is-clickable .df-review-sitemap-path,\n .df-review-sitemap-row.is-clickable .df-review-sitemap-cell,\n .df-review-sitemap-row.is-clickable .df-review-sitemap-page-label {\n cursor: pointer;\n }\n\n .df-review-sitemap-empty {\n display: flex;\n grid-column: 1 / -1;\n align-items: center;\n min-height: 58px;\n padding: 0 8px;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-sm);\n }\n\n .df-review-sitemap-row:not(.is-summary):hover,\n .df-review-sitemap-row.is-clickable:focus-visible,\n button.df-review-sitemap-row.is-summary:hover,\n .df-review-sitemap-row.is-active {\n background: var(--df-review-accent-soft);\n }\n\n .df-review-sitemap-row.is-clickable:focus-visible {\n outline: 1px solid var(--df-review-accent);\n outline-offset: -1px;\n }\n\n .df-review-sitemap-path {\n position: relative;\n display: inline-flex;\n align-items: center;\n align-self: stretch;\n gap: 6px;\n min-width: 0;\n padding-left: calc(var(--df-review-sitemap-depth, 0) * 18px);\n overflow-wrap: anywhere;\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-md);\n font-weight: var(--df-review-font-weight-normal);\n line-height: 1.35;\n }\n\n .df-review-sitemap-path::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: calc(var(--df-review-sitemap-depth, 0) * 18px);\n background-image: repeating-linear-gradient(\n to right,\n transparent 0,\n transparent 10px,\n var(--df-review-line-soft) 10px,\n var(--df-review-line-soft) 11px,\n transparent 11px,\n transparent 18px\n );\n opacity: 0.9;\n pointer-events: none;\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-toggle,\n .df-review-sitemap-tree-spacer {\n display: inline-grid;\n place-items: center;\n flex: 0 0 auto;\n width: 20px;\n min-width: 20px;\n height: 20px;\n }\n\n .df-review-sitemap-tree-toggle {\n border: 0;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n background: transparent;\n color: var(--df-review-muted);\n box-shadow: none;\n cursor: pointer;\n }\n\n .df-review-sitemap-tree-toggle:hover,\n .df-review-sitemap-tree-toggle:focus-visible {\n color: var(--df-review-text);\n background: var(--df-review-control-hover);\n }\n\n .df-review-sitemap-tree-toggle svg {\n width: 15px;\n height: 15px;\n }\n\n .df-review-sitemap-page-label {\n min-width: 0;\n min-height: 24px;\n border-radius: var(--df-review-radius-sm);\n padding: 0 5px;\n overflow: hidden;\n color: inherit;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\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: var(--df-review-font-weight-normal);\n line-height: 1;\n text-align: right;\n }\n\n .df-review-sitemap-cell.is-todo {\n color: var(--df-review-accent);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n .df-review-sitemap-cell.is-todo strong {\n font: inherit;\n }\n\n .df-review-sitemap-cell.is-zero {\n color: var(--df-review-muted);\n opacity: 0.45;\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: var(--df-review-font-weight-emphasis);\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 .df-review-sitemap-row.is-page:hover .df-review-sitemap-path,\n button.df-review-sitemap-row.is-summary: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`;\n","export const reviewShellModalStyle = `\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 font-weight: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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 display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\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 11px;\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: var(--df-review-font-weight-normal);\n\t\t }\n\n .df-review-settings-theme-option svg {\n width: 15px;\n height: 15px;\n flex: 0 0 auto;\n stroke-width: 2.2;\n }\n\n .df-review-settings-theme-option span {\n color: inherit;\n }\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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\t\t\t .df-review-prompt-dialog-narrow {\n\t\t\t width: min(440px, calc(100vw - 36px));\n\t\t\t }\n\n\t\t\t .df-review-prompt-dialog-narrow .df-review-prompt-block textarea {\n\t\t\t height: min(58vh, 540px);\n\t\t\t max-height: none;\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: var(--df-review-font-weight-normal);\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 font-weight: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header button svg {\n\t\t\t width: 15px;\n\t\t\t height: 15px;\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 .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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\n\t\t\t line-height: 1.5;\n\t\t\t white-space: pre-wrap;\n\t\t\t overflow-wrap: anywhere;\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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\n\t\t\t }\n\n\t\t\t .df-review-about-dialog {\n\t\t\t grid-template-rows: minmax(0, 1fr);\n\t\t\t width: min(600px, calc(100vw - 36px));\n\t\t\t }\n\n\t\t\t .df-review-about-close {\n\t\t\t position: absolute;\n\t\t\t top: 14px;\n\t\t\t right: 14px;\n\t\t\t z-index: 2;\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t width: 32px;\n\t\t\t height: 32px;\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 background: var(--df-review-control);\n\t\t\t color: var(--df-review-text);\n\t\t\t }\n\n\t\t\t .df-review-about-close svg {\n\t\t\t width: 15px;\n\t\t\t height: 15px;\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 .df-review-about-body {\n\t\t\t display: grid;\n\t\t\t align-content: start;\n\t\t\t gap: 22px;\n\t\t\t min-height: 0;\n\t\t\t overflow: auto;\n\t\t\t padding: 34px 32px;\n\t\t\t }\n\n\t\t\t .df-review-about-intro {\n\t\t\t display: grid;\n\t\t\t justify-items: start;\n\t\t\t gap: 8px;\n\t\t\t }\n\n\t\t\t .df-review-about-logo {\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t color: var(--df-review-text);\n\t\t\t }\n\n\t\t\t .df-review-about-logo svg {\n\t\t\t width: auto;\n\t\t\t height: 26px;\n\t\t\t fill: currentColor;\n\t\t\t }\n\n\t\t\t .df-review-about-intro 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 font-weight: var(--df-review-font-weight-emphasis);\n\t\t\t }\n\n\t\t\t .df-review-about-intro span {\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: var(--df-review-font-weight-normal);\n\t\t\t }\n\n\t\t\t .df-review-about-item {\n\t\t\t display: grid;\n\t\t\t gap: 5px;\n\t\t\t }\n\n\t\t\t .df-review-about-item 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: var(--df-review-font-weight-emphasis);\n\t\t\t }\n\n\t\t\t .df-review-about-item 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: var(--df-review-font-weight-normal);\n\t\t\t line-height: 1.6;\n\t\t\t }\n\n\n`;\n","export const reviewShellToolbarStyle = `\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 display: flex;\n\t align-items: center;\n\t gap: var(--df-review-space-1-5);\n\t height: var(--df-review-control-height-md);\n\t min-height: var(--df-review-control-height-md);\n\t padding: 0;\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 .df-review-overlays {\n display: flex;\n align-items: center;\n gap: 4px;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-mode {\n gap: 3px;\n padding: 3px;\n }\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: var(--df-review-font-weight-normal);\n\t line-height: 1;\n\t\t user-select: none;\n\t }\n\n .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-md);\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: var(--df-review-font-weight-normal);\n\t line-height: 1;\n\t }\n\n .df-review-preset-select {\n -webkit-appearance: none;\n appearance: none;\n display: none;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n min-width: 154px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-md);\n padding: 0 42px 0 14px;\n color: var(--df-review-text);\n background-color: var(--df-review-control);\n background-image: url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m6 9 6 6 6-6' stroke='%23d7deea' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n background-position: right 14px center;\n background-repeat: no-repeat;\n background-size: 18px 18px;\n box-shadow: var(--df-review-shadow-control);\n font-size: var(--df-review-font-size-sm);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n\t .df-review-presets button {\n\t display: inline-flex;\n\t align-items: center;\n gap: 7px;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\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: var(--df-review-font-weight-normal);\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 font-weight: var(--df-review-font-weight-normal);\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: var(--df-review-control-height-md);\n\t min-width: var(--df-review-control-height-md);\n\t height: var(--df-review-control-height-md);\n\t min-height: var(--df-review-control-height-md);\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 {\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n }\n\n .df-review-overlay-button:hover,\n .df-review-overlay-button:focus-visible {\n border-color: var(--df-review-accent);\n background: var(--df-review-control-hover);\n color: var(--df-review-text);\n outline: 0;\n }\n\n .df-review-overlay-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-mode-button {\n width: calc(var(--df-review-control-height-md) - 6px);\n min-width: calc(var(--df-review-control-height-md) - 6px);\n height: calc(var(--df-review-control-height-md) - 6px);\n min-height: calc(var(--df-review-control-height-md) - 6px);\n }\n\n .df-review-overlays-menu {\n position: relative;\n display: none;\n flex: 0 0 auto;\n }\n\n .df-review-overlays-menu summary {\n display: grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n min-width: var(--df-review-control-height-md);\n height: var(--df-review-control-height-md);\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-md);\n padding: 0;\n color: var(--df-review-muted);\n background: var(--df-review-card);\n box-shadow: var(--df-review-shadow-control);\n cursor: pointer;\n }\n\n .df-review-overlays-menu summary::-webkit-details-marker {\n display: none;\n }\n\n .df-review-overlays-menu summary::marker {\n content: '';\n }\n\n .df-review-overlays-menu summary:hover,\n .df-review-overlays-menu[open] summary {\n border-color: var(--df-review-accent);\n background: var(--df-review-control-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-overlays-menu summary svg {\n width: 20px;\n height: 20px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n }\n\n .df-review-overlays-popover {\n position: absolute;\n top: calc(100% + 6px);\n right: 0;\n z-index: 700;\n display: none;\n align-items: center;\n gap: var(--df-review-space-1-5);\n min-height: var(--df-review-control-height-md);\n padding: 0;\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-modal);\n }\n\n .df-review-overlays-menu[open] .df-review-overlays-popover {\n display: flex;\n }\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 .df-review-overlay-button .df-review-figma-mark-icon {\n fill: currentColor;\n stroke: none;\n }\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: row;\n\t align-items: center;\n\t justify-content: space-between;\n\t }\n\n\t .df-review-tool-controls {\n\t flex: 1 1 auto;\n\t width: auto;\n min-width: 0;\n flex-wrap: nowrap;\n\t }\n\n\t .df-review-presets {\n\t display: none;\n\t }\n\n .df-review-preset-select {\n display: block;\n flex: 0 1 150px;\n min-width: 128px;\n width: clamp(128px, 20vw, 150px);\n\t }\n\n .df-review-tool-divider,\n .df-review-active-size {\n display: none;\n }\n\n\t\t }\n\n\t\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: 640;\n\t display: flex;\n\t flex-direction: column;\n\t align-items: stretch;\n\t justify-content: flex-start;\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 position: relative;\n flex: 0 0 48px;\n display: grid;\n place-items: center;\n width: 100%;\n min-height: 48px;\n border: 0;\n\t border-radius: 0;\n\t padding: 0;\n\t background: transparent;\n\t color: var(--df-review-muted);\n transition: color 140ms ease, background 140ms ease;\n\t }\n\n\t .df-review-side-toggle:hover {\n\t color: var(--df-review-text);\n\t }\n\n .df-review-side-toggle.is-active {\n color: var(--df-review-accent);\n }\n\n .df-review-side-toggle.is-active::after {\n position: absolute;\n top: 9px;\n right: 0;\n bottom: 9px;\n width: 3px;\n border-radius: 3px 0 0 3px;\n background: var(--df-review-accent);\n content: '';\n }\n\n .df-review-side-toggle:focus-visible {\n outline: 0;\n color: var(--df-review-text);\n }\n\n .df-review-side-toggle:focus-visible span {\n border-radius: 6px;\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 3px;\n }\n\n .df-review-side-toggle span {\n display: grid;\n place-items: center;\n\t width: 30px;\n\t height: 30px;\n\t line-height: 1;\n\t }\n\n\t .df-review-side-toggle svg {\n\t width: 22px;\n\t height: 22px;\n\t fill: none;\n\t stroke: currentColor;\n\t stroke-linecap: round;\n\t stroke-width: 1.55;\n\t }\n\n .df-review-side-toggle svg.df-review-brand-icon {\n width: auto;\n height: 16px;\n stroke: none;\n fill: currentColor;\n }\n\n .df-review-side-actions {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n width: 100%;\n margin-top: auto;\n }\n\n .df-review-side-divider {\n height: 1px;\n margin: 4px 12px;\n background: var(--df-review-line);\n }\n\n .df-review-presence-overlay {\n position: relative;\n margin-top: auto;\n }\n\n .df-review-side-actions .df-review-presence-overlay {\n margin-top: 0;\n }\n\n .df-review-presence-button {\n position: relative;\n display: grid;\n place-items: center;\n width: 100%;\n min-height: 48px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n }\n\n .df-review-presence-button:hover,\n .df-review-presence-button[aria-expanded=\"true\"] {\n color: var(--df-review-text);\n }\n\n .df-review-presence-button:focus-visible {\n outline: 0;\n }\n\n .df-review-presence-button:focus-visible svg {\n border-radius: 6px;\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 3px;\n }\n\n .df-review-presence-button svg {\n width: 22px;\n height: 22px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.55;\n }\n\n .df-review-presence-badge {\n position: absolute;\n top: 6px;\n right: 6px;\n display: grid;\n place-items: center;\n min-width: 17px;\n height: 17px;\n border: 1px solid var(--df-review-side-rail);\n border-radius: var(--df-review-radius-pill);\n padding: 0 4px;\n color: #17202c;\n background: var(--df-review-accent);\n font-size: var(--df-review-font-size-3xs);\n font-weight: var(--df-review-font-weight-emphasis);\n line-height: 1;\n pointer-events: none;\n }\n\n .df-review-presence-list {\n position: absolute;\n right: calc(100% + 8px);\n bottom: 8px;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 5px;\n width: max-content;\n min-width: 0;\n max-width: 220px;\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 width: fit-content;\n max-width: 180px;\n min-width: 0;\n min-height: 22px;\n justify-content: flex-end;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-pill);\n padding: 0 9px;\n color: var(--df-review-text);\n background: var(--df-review-control);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .df-review-presence-chip span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n text-align: right;\n white-space: nowrap;\n }\n\n .df-review-presence-chip.is-self {\n color: var(--df-review-accent);\n border-color: var(--df-review-accent-hover);\n background: linear-gradient(\n var(--df-review-accent-soft),\n var(--df-review-accent-soft)\n ),\n var(--df-review-control);\n }\n\n`;\n","export const reviewShellQaPanelStyle = `\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) auto;\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 .df-review-qa-draft-host {\n position: relative;\n z-index: 2;\n display: none;\n justify-self: end;\n width: calc(100% - var(--df-review-space-4));\n margin: 0 var(--df-review-space-2) var(--df-review-space-2) auto;\n min-width: 0;\n }\n\n .df-review-qa-draft-host[data-has-draft-composer=\"true\"] {\n display: block;\n }\n\n .df-review-qa-panel[data-has-draft-composer=\"true\"] .df-review-panel-body {\n opacity: 0.36;\n pointer-events: none;\n }\n\n\t .df-review-shell:not(.is-list-visible) .df-review-qa-panel,\n .df-review-qa-panel[aria-hidden=\"true\"] {\n\t visibility: hidden;\n\t border-left: 0;\n pointer-events: none;\n\t }\n\n .df-review-source-tree-panel {\n grid-column: 2;\n grid-row: 1 / span 3;\n position: relative;\n z-index: 600;\n display: grid;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n border-left: 1px solid var(--df-review-line-soft);\n background:\n linear-gradient(180deg, var(--df-review-panel), var(--df-review-bg));\n }\n\n .df-review-shell:not(.is-list-visible) .df-review-source-tree-panel,\n .df-review-source-tree-panel[aria-hidden=\"true\"] {\n visibility: hidden;\n border-left: 0;\n pointer-events: none;\n }\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:\n var(--df-review-control-height-md)\n var(--df-review-control-height-md);\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: var(--df-review-font-weight-normal);\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-height: var(--df-review-control-height-md);\n min-width: 0;\n }\n\n\t\t\t .df-review-list-title {\n\t\t\t display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n\t\t\t align-items: center;\n\t\t\t gap: 8px;\n min-height: var(--df-review-control-height-md);\n\t\t min-width: 0;\n\t\t }\n\n .df-review-list-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n\t\t .df-review-list-meta span {\n\t\t min-width: 0;\n\t\t overflow: hidden;\n\t\t color: #fff;\n\t\t text-overflow: ellipsis;\n\t\t white-space: nowrap;\n\t\t }\n\n\t\t\t .df-review-list-meta strong {\n\t\t\t flex: 0 0 auto;\n\t\t\t color: #fff;\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-variant-numeric: tabular-nums;\n font-weight: var(--df-review-font-weight-normal);\n\t\t\t }\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 height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\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: var(--df-review-font-weight-normal);\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-source-refresh {\n position: relative;\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: var(--df-review-control-height-md);\n\t\t min-width: var(--df-review-control-height-md);\n\t\t height: var(--df-review-control-height-md);\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: 16px;\n\t\t height: 16px;\n\t\t }\n\n\t\t\t .df-review-filter-tabs {\n display: flex;\n align-items: center;\n justify-self: end;\n gap: 2px;\n height: 26px;\n min-height: 26px;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\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: 0;\n background: transparent;\n color: var(--df-review-subtle);\n opacity: 0.3;\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 color: var(--df-review-text);\n opacity: 1;\n\t\t }\n\n\t\t .df-review-filter-tab.is-active {\n\t\t box-shadow: none;\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: 14px;\n\t\t\t\t height: 14px;\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: 1.9;\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: var(--df-review-font-weight-emphasis);\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\t .df-review-empty {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t gap: var(--df-review-space-2);\n\t\t margin: 0;\n\t\t padding: var(--df-review-space-5) var(--df-review-space-4);\n\t\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\t line-height: 1.45;\n\t\t }\n\n .df-review-empty.is-loading {\n border-style: solid;\n color: var(--df-review-text);\n }\n\n .df-review-empty .df-review-spinner,\n .df-review-item-saving .df-review-spinner,\n .df-review-edit-actions .df-review-spinner {\n flex: none;\n width: 12px;\n min-width: 12px;\n height: 12px;\n min-height: 12px;\n border-width: 2px;\n }\n\n .df-review-item-card.is-dim {\n opacity: 0.4;\n }\n\n\t .df-review-item-card.is-dim:hover {\n\t opacity: 0.72;\n\t }\n\n .df-review-item-card.is-mutating {\n pointer-events: auto;\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 .df-review-item-main p {\n margin: 0;\n }\n\n .df-review-item-main strong {\n overflow-wrap: anywhere;\n font-size: var(--df-review-font-size-md);\n font-weight: var(--df-review-font-weight-normal);\n line-height: 1.35;\n }\n\n .df-review-item-title {\n padding-top: 4px;\n }\n\n .df-review-item-comment {\n padding: 0;\n color: var(--df-review-muted);\n overflow-wrap: anywhere;\n font-size: var(--df-review-font-size-sm);\n line-height: 1.45;\n white-space: pre-wrap;\n }\n\n .df-review-item-comment.is-primary {\n padding: 5px 0;\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-md);\n line-height: 1.35;\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\t .df-review-item-error {\n\t color: var(--df-review-danger) !important;\n\t overflow-wrap: anywhere;\n\t }\n\n .df-review-item-saving {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--df-review-accent);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\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-assignee-badge,\n .df-review-item-assignee-select,\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: var(--df-review-font-weight-emphasis);\n line-height: 1;\n text-transform: uppercase;\n }\n\n .df-review-item-id {\n appearance: none;\n border-color: var(--df-review-line);\n background: rgba(255, 255, 255, 0.03);\n color: var(--df-review-text);\n cursor: copy;\n font-family: inherit;\n }\n\n .df-review-item-id:hover,\n .df-review-item-id:focus-visible,\n .df-review-item-id.is-copied {\n border-color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n color: var(--df-review-accent);\n outline: none;\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: var(--df-review-font-weight-normal);\n text-transform: none;\n }\n\n .df-review-item-assignee-badge,\n .df-review-item-assignee-select {\n min-height: 30px;\n min-width: 96px;\n max-width: 132px;\n border-radius: var(--df-review-radius-sm);\n border-color: rgba(255, 255, 255, 0.16);\n padding: 0 10px;\n color: var(--df-review-text);\n background: var(--df-review-control);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n text-transform: none;\n }\n\n .df-review-item-assignee-select {\n cursor: pointer;\n outline: 0;\n }\n\n\t .df-review-item-assignee-select:focus-visible {\n\t border-color: var(--df-review-accent);\n\t box-shadow: 0 0 0 2px var(--df-review-accent-soft);\n\t }\n\n .df-review-item-assignee-select:disabled {\n cursor: wait;\n opacity: 0.62;\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: var(--df-review-font-weight-normal);\n text-transform: none;\n }\n\n\t .df-review-item-status-select:focus-visible {\n\t border-color: var(--df-review-accent);\n\t box-shadow: 0 0 0 2px var(--df-review-accent-soft);\n\t }\n\n .df-review-item-status-select:disabled {\n cursor: wait;\n opacity: 0.62;\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-assignee-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\t .df-review-item-workflow-actions {\n\t\t\t\t display: inline-flex;\n\t\t\t\t grid-column: 1;\n\t\t\t\t align-items: center;\n\t\t\t\t gap: 6px;\n\t\t\t\t min-width: 0;\n\t\t\t\t flex-wrap: wrap;\n\t\t\t cursor: auto;\n\t\t\t\t }\n\n\t\t\t\t .df-review-item-status-actions,\n\t\t\t\t .df-review-item-assignee-actions {\n\t\t\t\t display: inline-flex;\n\t\t\t\t align-items: center;\n\t\t\t\t min-width: 0;\n\t\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 .df-review-item-action-button.is-copied {\n border-color: rgba(124, 199, 255, 0.42);\n color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n }\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: var(--df-review-font-weight-normal);\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\t .df-review-item-action-button:disabled {\n\t cursor: default;\n\t opacity: 0.45;\n\t }\n\n .df-review-source-refresh.is-loading svg {\n animation: df-review-spinner-spin 760ms linear infinite;\n }\n\n .df-review-source-refresh:disabled {\n cursor: wait;\n opacity: 0.7;\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`;\n","export const reviewShellFigmaImagesStyle = `\n .df-review-figma-images-panel {\n grid-column: 2;\n grid-row: 1 / span 3;\n position: relative;\n z-index: 600;\n display: grid;\n grid-template-rows: auto auto auto auto auto minmax(0, 1fr);\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n border-left: 1px solid var(--df-review-line-soft);\n background:\n linear-gradient(180deg, var(--df-review-panel), var(--df-review-bg));\n }\n\n .df-review-shell:not(.is-list-visible) .df-review-figma-images-panel,\n .df-review-figma-images-panel[aria-hidden=\"true\"] {\n visibility: hidden;\n border-left: 0;\n pointer-events: none;\n }\n\n .df-review-figma-images-header {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 8px;\n min-height: var(--df-review-control-height-md);\n min-width: 0;\n }\n\n .df-review-figma-images-title {\n display: grid;\n min-width: 0;\n }\n\n .df-review-figma-images-title strong {\n overflow: hidden;\n color: var(--df-review-text);\n font-size: inherit;\n font-weight: var(--df-review-font-weight-emphasis);\n line-height: 1;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-figma-image-form {\n display: grid;\n grid-template-rows:\n var(--df-review-control-height-md)\n var(--df-review-control-height-md);\n align-items: center;\n gap: var(--df-review-space-2);\n padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-card);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-sm);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n .df-review-figma-image-form input {\n width: 100%;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n min-width: 0;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0 10px;\n color: var(--df-review-text);\n background: var(--df-review-bg);\n box-shadow: var(--df-review-shadow-control);\n font-size: var(--df-review-font-size-sm);\n }\n\n .df-review-figma-image-form input:focus {\n border-color: var(--df-review-accent);\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 1px;\n }\n\n .df-review-figma-image-url-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) var(--df-review-control-height-md);\n align-items: center;\n gap: var(--df-review-space-1-5);\n min-width: 0;\n }\n\n .df-review-figma-image-header-button {\n display: inline-grid;\n place-items: center;\n justify-self: end;\n width: 26px;\n min-width: 26px;\n height: 26px;\n min-height: 26px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n box-shadow: none;\n cursor: pointer;\n }\n\n .df-review-figma-image-header-button:hover,\n .df-review-figma-image-header-button:focus-visible {\n color: var(--df-review-text);\n opacity: 1;\n outline: 0;\n }\n\n .df-review-figma-image-header-button:disabled {\n cursor: default;\n opacity: 0.36;\n }\n\n .df-review-figma-image-header-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 .df-review-figma-image-url-row button,\n .df-review-figma-image-icon-button {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n min-width: var(--df-review-control-height-md);\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\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 box-shadow: var(--df-review-shadow-control);\n text-decoration: none;\n }\n\n .df-review-figma-image-url-row button:hover,\n .df-review-figma-image-icon-button:hover {\n border-color: var(--df-review-accent);\n color: var(--df-review-text);\n background: var(--df-review-control-hover);\n }\n\n .df-review-figma-image-url-row button:disabled,\n .df-review-figma-image-icon-button:disabled {\n cursor: default;\n opacity: 0.42;\n }\n\n .df-review-figma-image-url-row button svg,\n .df-review-figma-image-icon-button svg {\n width: 15px;\n height: 15px;\n }\n\n .df-review-figma-image-icon-button.is-danger: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-figma-image-icon-button.is-active {\n border-color: var(--df-review-accent);\n 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 }\n\n .df-review-figma-image-selected-controls {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: center;\n gap: var(--df-review-space-1);\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: color-mix(in srgb, var(--df-review-card) 82%, transparent);\n }\n\n .df-review-figma-image-selected-numbers {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(54px, 64px) var(--df-review-control-height-sm);\n justify-self: stretch;\n gap: var(--df-review-space-1);\n min-width: 0;\n }\n\n .df-review-figma-image-selected-link {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-sm);\n min-width: var(--df-review-control-height-sm);\n height: var(--df-review-control-height-sm);\n min-height: var(--df-review-control-height-sm);\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 box-shadow: var(--df-review-shadow-control);\n text-decoration: none;\n }\n\n .df-review-figma-image-selected-link:hover,\n .df-review-figma-image-selected-link:focus-visible {\n border-color: var(--df-review-accent);\n color: var(--df-review-text);\n background: var(--df-review-control-hover);\n outline: none;\n }\n\n .df-review-figma-image-selected-link:disabled {\n cursor: default;\n opacity: 0.42;\n }\n\n .df-review-figma-image-selected-link svg {\n width: 13px;\n height: 13px;\n }\n\n .df-review-figma-image-number-control {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n align-items: center;\n gap: 4px;\n min-width: 0;\n height: var(--df-review-control-height-sm);\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0 5px;\n color: var(--df-review-muted);\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-variant-numeric: tabular-nums;\n }\n\n .df-review-figma-image-number-control svg {\n width: 13px;\n height: 13px;\n color: var(--df-review-subtle);\n }\n\n .df-review-figma-image-number-control span {\n color: var(--df-review-subtle);\n font-size: var(--df-review-font-size-2xs);\n line-height: 1;\n }\n\n .df-review-figma-image-number-control input {\n width: 100%;\n min-width: 0;\n border: 0;\n padding: 0;\n color: var(--df-review-text);\n background: transparent;\n font-size: var(--df-review-font-size-xs);\n font-variant-numeric: tabular-nums;\n outline: none;\n }\n\n .df-review-figma-image-number-control input:disabled {\n color: var(--df-review-subtle);\n }\n\n .df-review-figma-image-number-control:focus-within {\n border-color: var(--df-review-accent);\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 1px;\n }\n\n .df-review-figma-image-opacity-control {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) 26px;\n align-items: center;\n gap: 6px;\n min-width: 0;\n height: var(--df-review-control-height-sm);\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0 6px;\n color: var(--df-review-muted);\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-variant-numeric: tabular-nums;\n }\n\n .df-review-figma-image-opacity-control span {\n color: var(--df-review-subtle);\n font-size: var(--df-review-font-size-2xs);\n line-height: 1;\n }\n\n .df-review-figma-image-opacity-control strong {\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 500;\n line-height: 1;\n text-align: right;\n }\n\n .df-review-figma-image-opacity-slider {\n --df-review-figma-opacity-thumb-size: 12px;\n --df-review-figma-opacity-thumb-radius: 6px;\n position: relative;\n display: grid;\n align-items: center;\n min-width: 0;\n height: 20px;\n cursor: pointer;\n touch-action: none;\n }\n\n .df-review-figma-image-opacity-slider::before {\n content: \"\";\n position: absolute;\n top: 50%;\n right: var(--df-review-figma-opacity-thumb-radius);\n left: var(--df-review-figma-opacity-thumb-radius);\n height: 4px;\n border-radius: 999px;\n background: linear-gradient(\n 90deg,\n var(--df-review-accent) 0 var(--df-review-figma-opacity-value),\n var(--df-review-line) var(--df-review-figma-opacity-value) 100%\n );\n transform: translateY(-50%);\n pointer-events: none;\n }\n\n .df-review-figma-image-opacity-slider::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: clamp(\n var(--df-review-figma-opacity-thumb-radius),\n var(--df-review-figma-opacity-left, var(--df-review-figma-opacity-value)),\n calc(100% - var(--df-review-figma-opacity-thumb-radius))\n );\n z-index: 2;\n box-sizing: border-box;\n width: var(--df-review-figma-opacity-thumb-size);\n height: var(--df-review-figma-opacity-thumb-size);\n border: 1px solid var(--df-review-accent);\n border-radius: 50%;\n background: var(--df-review-text);\n box-shadow: 0 0 0 2px var(--df-review-bg);\n transform: translate(-50%, -50%);\n pointer-events: none;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"] {\n -webkit-appearance: none;\n appearance: none;\n position: absolute;\n inset: 0;\n z-index: 3;\n width: 100%;\n min-width: 0;\n height: 100%;\n border: 0;\n margin: 0;\n padding: 0;\n background: transparent;\n outline: none;\n opacity: 0;\n cursor: pointer;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]::-webkit-slider-runnable-track {\n height: 4px;\n border-radius: 999px;\n background: transparent;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: var(--df-review-figma-opacity-thumb-size);\n height: var(--df-review-figma-opacity-thumb-size);\n margin-top: -4px;\n border: 0;\n border-radius: 50%;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]::-moz-range-track {\n height: 4px;\n border-radius: 999px;\n background: transparent;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]::-moz-range-thumb {\n width: var(--df-review-figma-opacity-thumb-size);\n height: var(--df-review-figma-opacity-thumb-size);\n border: 0;\n border-radius: 50%;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]:disabled {\n cursor: default;\n }\n\n .df-review-figma-image-opacity-control:focus-within {\n border-color: var(--df-review-accent);\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 1px;\n }\n\n .df-review-figma-image-status {\n margin: 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 color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n overflow-wrap: anywhere;\n }\n\n .df-review-figma-image-status.is-error {\n color: var(--df-review-danger);\n }\n\n .df-review-figma-image-list {\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 .df-review-figma-image-card {\n position: relative;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-areas: \"state main actions\";\n align-items: center;\n gap: var(--df-review-space-1-5);\n min-height: 76px;\n min-width: 0;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: var(--df-review-space-4) var(--df-review-space-2);\n background: var(--df-review-card);\n cursor: pointer;\n transition: border-color 140ms ease, box-shadow 140ms ease;\n }\n\n .df-review-figma-image-card:hover {\n border-color: var(--df-review-line);\n }\n\n .df-review-figma-image-card.is-dragging {\n opacity: 0.58;\n }\n\n .df-review-figma-image-card.is-drop-target {\n border-color: var(--df-review-line-soft);\n box-shadow: none;\n }\n\n .df-review-figma-image-card.is-drop-before::before,\n .df-review-figma-image-card.is-drop-after::after {\n content: \"\";\n position: absolute;\n z-index: 2;\n right: 6px;\n left: 6px;\n height: 2px;\n border-radius: 999px;\n background: var(--df-review-accent);\n box-shadow: 0 0 0 2px rgba(124, 199, 255, 0.16);\n pointer-events: none;\n }\n\n .df-review-figma-image-card.is-drop-before::before {\n top: -6px;\n }\n\n .df-review-figma-image-card.is-drop-after::after {\n bottom: -6px;\n }\n\n .df-review-figma-image-card.is-active {\n border-color: var(--df-review-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover), 0 0 0 3px rgba(124, 199, 255, 0.12);\n }\n\n .df-review-figma-image-card.is-editing {\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-areas: \"state main\";\n }\n\n .df-review-figma-image-card.is-status {\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-areas: \"state main\";\n cursor: default;\n }\n\n .df-review-figma-image-spinner {\n grid-area: state;\n }\n\n .df-review-figma-image-layer-state {\n grid-area: state;\n display: grid;\n grid-template-columns: repeat(3, 22px);\n align-items: center;\n gap: 2px;\n min-width: 0;\n height: var(--df-review-control-height-sm);\n }\n\n .df-review-figma-image-state-button {\n display: inline-grid;\n place-items: center;\n width: 22px;\n min-width: 22px;\n height: 22px;\n min-height: 22px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-subtle);\n background: transparent;\n box-shadow: none;\n opacity: 0.62;\n }\n\n .df-review-figma-image-state-button:hover,\n .df-review-figma-image-state-button:focus-visible {\n color: var(--df-review-text);\n opacity: 1;\n outline: none;\n }\n\n .df-review-figma-image-state-button.is-active {\n color: var(--df-review-accent);\n opacity: 1;\n }\n\n .df-review-figma-image-state-button svg {\n width: 13px;\n height: 13px;\n }\n\n .df-review-figma-image-card-main {\n grid-area: main;\n display: grid;\n gap: 3px;\n min-width: 0;\n }\n\n .df-review-figma-image-label-input {\n width: 100%;\n min-width: 0;\n height: 24px;\n border: 1px solid transparent;\n border-radius: 2px;\n padding: 0 4px;\n color: var(--df-review-text);\n background: transparent;\n box-shadow: none;\n font-size: var(--df-review-font-size-sm);\n font-weight: 500;\n line-height: 1.28;\n }\n\n .df-review-figma-image-label-input:focus {\n border-color: var(--df-review-accent);\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 1px;\n }\n\n .df-review-figma-image-label-input:disabled {\n color: var(--df-review-subtle);\n }\n\n .df-review-figma-image-card-main small {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-figma-image-card-main strong,\n .df-review-figma-image-card-main small {\n user-drag: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-drag: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n }\n\n .df-review-figma-image-card-main strong {\n min-width: 0;\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-sm);\n font-weight: 500;\n line-height: 1.28;\n overflow-wrap: anywhere;\n white-space: normal;\n }\n\n .df-review-figma-image-card-main small {\n color: var(--df-review-subtle);\n font-size: var(--df-review-font-size-2xs);\n line-height: 1.2;\n }\n\n .df-review-figma-image-card-actions {\n grid-area: actions;\n display: grid;\n grid-template-columns: repeat(2, 22px);\n gap: 2px;\n }\n\n .df-review-figma-image-card-actions .df-review-figma-image-icon-button {\n width: 22px;\n min-width: 22px;\n height: 22px;\n min-height: 22px;\n border: 0;\n border-radius: 0;\n color: var(--df-review-subtle);\n background: transparent;\n box-shadow: none;\n opacity: 0;\n pointer-events: none;\n transition: opacity 120ms ease, color 120ms ease;\n }\n\n .df-review-figma-image-card:hover .df-review-figma-image-card-actions .df-review-figma-image-icon-button,\n .df-review-figma-image-card:focus-within .df-review-figma-image-card-actions .df-review-figma-image-icon-button {\n opacity: 0.62;\n pointer-events: auto;\n }\n\n .df-review-figma-image-card-actions .df-review-figma-image-icon-button:hover,\n .df-review-figma-image-card-actions .df-review-figma-image-icon-button:focus-visible {\n color: var(--df-review-text);\n background: transparent;\n opacity: 1;\n outline: none;\n }\n\n .df-review-figma-image-card.is-editing .df-review-figma-image-card-actions {\n display: none;\n }\n\n .df-review-figma-image-preview-dialog {\n grid-template-rows: auto minmax(0, 1fr);\n width: min(600px, calc(100vw - 36px));\n max-height: min(760px, calc(100vh - 36px));\n }\n\n .df-review-figma-image-preview-header {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto var(--df-review-control-height-md);\n align-items: center;\n gap: var(--df-review-space-2);\n min-width: 0;\n padding: 16px 18px 14px;\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-card);\n }\n\n .df-review-figma-image-preview-header input {\n width: 100%;\n height: var(--df-review-control-height-md);\n min-width: 0;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0 10px;\n color: var(--df-review-text);\n background: var(--df-review-bg);\n box-shadow: var(--df-review-shadow-control);\n font-size: var(--df-review-font-size-sm);\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .df-review-figma-image-preview-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: var(--df-review-control-height-md);\n min-width: 0;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 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-sm);\n font-weight: 500;\n line-height: 1;\n text-decoration: none;\n white-space: nowrap;\n }\n\n .df-review-figma-image-preview-link:hover,\n .df-review-figma-image-preview-link:focus-visible {\n border-color: var(--df-review-accent);\n background: var(--df-review-control-hover);\n outline: none;\n }\n\n .df-review-figma-image-preview-link svg {\n width: 14px;\n height: 14px;\n flex: 0 0 auto;\n }\n\n .df-review-figma-image-preview-close {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n min-width: var(--df-review-control-height-md);\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-text);\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n }\n\n .df-review-figma-image-preview-close:hover,\n .df-review-figma-image-preview-close:focus-visible {\n border-color: var(--df-review-accent);\n background: var(--df-review-control-hover);\n outline: none;\n }\n\n .df-review-figma-image-preview-close svg {\n width: 15px;\n height: 15px;\n }\n\n .df-review-figma-image-preview-scroll {\n min-height: 0;\n overflow: auto;\n padding: 16px;\n background: var(--df-review-bg);\n }\n\n .df-review-figma-image-preview-scroll img {\n display: block;\n width: auto;\n max-width: 100%;\n height: auto;\n margin: 0 auto;\n object-fit: contain;\n object-position: top center;\n }\n\n @media (max-width: 460px) {\n .df-review-figma-image-preview-header {\n grid-template-columns:\n minmax(0, 1fr)\n var(--df-review-control-height-md)\n var(--df-review-control-height-md);\n gap: var(--df-review-space-1-5);\n padding-left: 14px;\n padding-right: 14px;\n }\n\n .df-review-figma-image-preview-link {\n width: var(--df-review-control-height-md);\n padding: 0;\n }\n\n .df-review-figma-image-preview-link span {\n display: none;\n }\n }\n\n @media (hover: none) {\n .df-review-figma-image-card.is-active .df-review-figma-image-card-actions .df-review-figma-image-icon-button {\n opacity: 0.62;\n pointer-events: auto;\n }\n }\n`;\n","export const reviewShellStageStyle = `\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`;\n","export const reviewShellSourceInspectorStyle = `\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-data: #f3b75f;\n --df-review-source-popover-data-muted: rgba(243, 183, 95, 0.78);\n --df-review-source-popover-data-subtle: rgba(243, 183, 95, 0.62);\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: 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: var(--df-review-font-size-xl);\n font-weight: var(--df-review-font-weight-normal);\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 border: 0;\n border-top: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n padding: 9px 30px 9px 8px;\n color: var(--df-review-source-popover-text);\n background: transparent;\n text-align: left;\n }\n\n .df-review-source-candidate + .df-review-source-candidate {\n border-top-color: var(--df-review-source-popover-line);\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: 1px;\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: var(--df-review-font-weight-emphasis);\n line-height: 1.2;\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.24;\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 line-height: 1.2;\n }\n\n .df-review-source-candidate.is-data .df-review-source-candidate-main strong {\n color: var(--df-review-source-popover-data);\n }\n\n .df-review-source-candidate.is-data .df-review-source-candidate-main span {\n color: var(--df-review-source-popover-data-muted);\n }\n\n .df-review-source-candidate.is-data .df-review-source-candidate-main small {\n color: var(--df-review-source-popover-data-subtle);\n }\n\n`;\n","export const reviewShellSectionOutlineStyle = `\n .df-review-section-outline {\n position: relative;\n z-index: 1;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n border: 0;\n border-radius: 0;\n color: var(--df-review-text);\n background: transparent;\n box-shadow: none;\n overflow: hidden;\n }\n\n .df-review-section-outline-head {\n display: grid;\n grid-template-rows:\n var(--df-review-control-height-md)\n var(--df-review-control-height-md);\n align-items: center;\n gap: var(--df-review-space-2);\n min-width: 0;\n padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-card);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-sm);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n .df-review-section-outline-summary {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 8px;\n min-height: var(--df-review-control-height-md);\n min-width: 0;\n }\n\n .df-review-section-outline-summary span {\n display: inline-flex;\n align-items: baseline;\n gap: 6px;\n min-width: 0;\n }\n\n .df-review-section-outline-head strong {\n overflow: hidden;\n color: var(--df-review-text);\n font-size: inherit;\n font-weight: var(--df-review-font-weight-emphasis);\n line-height: 1;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-section-outline-head small {\n flex: 0 0 auto;\n overflow: hidden;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-section-outline-meta-controls {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n height: 26px;\n min-height: 26px;\n min-width: 0;\n border: 0;\n border-radius: 0;\n padding: 0;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-section-outline-meta-toggle {\n display: inline-grid;\n place-items: center;\n width: 26px;\n min-width: 26px;\n height: 26px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-subtle);\n background: transparent;\n box-shadow: none;\n cursor: pointer;\n opacity: 0.3;\n }\n\n .df-review-section-outline-meta-toggle:hover,\n .df-review-section-outline-meta-toggle:focus-visible,\n .df-review-section-outline-meta-toggle.is-active {\n color: var(--df-review-text);\n opacity: 1;\n outline: 0;\n }\n\n .df-review-section-outline-meta-toggle.is-active {\n box-shadow: none;\n color: var(--df-review-accent);\n }\n\n .df-review-section-outline-meta-toggle 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 .df-review-section-outline-filter {\n display: grid;\n grid-template-columns: 18px minmax(0, 1fr) auto;\n align-items: center;\n align-self: stretch;\n gap: 8px;\n min-width: 0;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: 0 7px 0 11px;\n color: var(--df-review-muted);\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n }\n\n .df-review-section-outline-filter:focus-within {\n border-color: var(--df-review-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n }\n\n .df-review-section-outline-filter 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 }\n\n .df-review-section-outline-filter input {\n width: 100%;\n min-width: 0;\n height: 100%;\n border: 0;\n padding: 0;\n color: var(--df-review-text);\n background: transparent;\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n outline: 0;\n -webkit-appearance: none;\n appearance: none;\n }\n\n .df-review-section-outline-filter input::placeholder {\n color: var(--df-review-subtle);\n }\n\n .df-review-section-outline-filter input::-webkit-search-cancel-button,\n .df-review-section-outline-filter input::-webkit-search-decoration {\n display: none;\n -webkit-appearance: none;\n appearance: none;\n }\n\n .df-review-section-outline-filter-clear {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n height: var(--df-review-control-height-md);\n border: 0;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n cursor: pointer;\n }\n\n .df-review-section-outline-filter-clear:hover,\n .df-review-section-outline-filter-clear:focus-visible {\n color: var(--df-review-text);\n background: var(--df-review-accent-soft);\n outline: 0;\n }\n\n .df-review-section-outline-list {\n display: grid;\n align-content: start;\n gap: var(--df-review-space-2);\n min-height: 0;\n overflow-y: auto;\n padding: var(--df-review-space-2) var(--df-review-space-2) var(--df-review-space-3);\n scrollbar-gutter: stable;\n }\n\n .df-review-section-outline-item {\n display: grid;\n --df-review-section-outline-name-color: var(--df-review-text);\n }\n\n /* Each root renders as a card so the tree scans like the QA list. */\n .df-review-section-outline-item.is-depth-1 {\n padding: var(--df-review-space-1);\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-lg);\n background: var(--df-review-card);\n }\n\n .df-review-section-outline-entry-body {\n display: grid;\n border: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n transition: border-color 140ms ease, background 140ms ease;\n }\n\n .df-review-section-outline-entry-body:hover {\n border-color: rgba(124, 199, 255, 0.2);\n background: var(--df-review-accent-soft);\n }\n\n\n .df-review-section-outline-row {\n display: grid;\n grid-template-columns: 18px minmax(0, 1fr) auto;\n align-items: center;\n gap: 7px;\n border-radius: var(--df-review-radius-sm);\n min-height: 42px;\n padding: 6px 7px 6px 6px;\n }\n\n .df-review-section-outline-toggle {\n display: grid;\n place-items: center;\n width: 18px;\n height: 18px;\n border: 0;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n }\n\n .df-review-section-outline-toggle:hover {\n color: var(--df-review-text);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-section-outline-toggle svg {\n width: 13px;\n height: 13px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2.4;\n transition: transform 120ms ease;\n }\n\n .df-review-section-outline-toggle.is-collapsed svg {\n transform: rotate(-90deg);\n }\n\n .df-review-section-outline-toggle.is-placeholder {\n pointer-events: none;\n }\n\n .df-review-section-outline-name {\n display: grid;\n gap: 2px;\n min-width: 0;\n overflow: hidden;\n border: 0;\n padding: 0;\n color: var(--df-review-text);\n background: transparent;\n font-size: var(--df-review-font-size-sm);\n font-weight: var(--df-review-font-weight-normal);\n text-align: left;\n white-space: normal;\n cursor: pointer;\n }\n\n .df-review-section-outline-name span,\n .df-review-section-outline-name small {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-section-outline-name span {\n color: var(--df-review-section-outline-name-color);\n }\n\n .df-review-section-outline-name small {\n color: var(--df-review-muted);\n font-family: var(--df-review-font-mono);\n font-size: var(--df-review-font-size-2xs);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n .df-review-section-outline-name:hover {\n color: var(--df-review-accent);\n }\n\n .df-review-section-outline-meta {\n position: relative;\n display: grid;\n gap: 3px;\n min-width: 0;\n padding: 8px 6px 7px;\n }\n\n .df-review-section-outline-meta::before {\n position: absolute;\n top: 0;\n left: 29px;\n right: 8px;\n height: 1px;\n background: var(--df-review-line-soft);\n content: '';\n }\n\n .df-review-section-outline-meta-row {\n display: grid;\n grid-template-columns: 52px minmax(0, 1fr);\n align-items: start;\n gap: 6px;\n min-width: 0;\n color: var(--df-review-muted);\n font-family: var(--df-review-font-mono);\n font-size: var(--df-review-font-size-2xs);\n line-height: 1.35;\n }\n\n .df-review-section-outline-meta-row b {\n color: var(--df-review-subtle);\n font-weight: var(--df-review-font-weight-emphasis);\n }\n\n .df-review-section-outline-meta-row code {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--df-review-muted);\n font-family: inherit;\n }\n\n .df-review-section-outline-meta-row.is-text code {\n color: var(--df-review-text);\n }\n\n .df-review-section-outline-meta-row.is-media code {\n color: var(--df-review-accent);\n }\n\n .df-review-section-outline-media-link {\n display: block;\n min-width: 0;\n color: var(--df-review-accent);\n text-decoration: none;\n }\n\n .df-review-section-outline-media-link:hover,\n .df-review-section-outline-media-link:focus-visible {\n color: var(--df-review-text);\n outline: 0;\n }\n\n .df-review-section-outline-meta-row.is-class code {\n color: var(--df-review-source-popover-data-subtle);\n }\n\n .df-review-section-outline-meta-row.is-class {\n align-items: center;\n }\n\n .df-review-section-outline-class-tags {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 3px;\n min-width: 0;\n }\n\n .df-review-section-outline-class-tags code {\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n min-height: 20px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-pill);\n padding: 0 6px;\n background: var(--df-review-control);\n line-height: 1;\n }\n\n .df-review-section-outline-links {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 1px;\n }\n\n .df-review-section-outline-divider {\n display: block;\n width: 1px;\n height: 14px;\n margin: 0 2px;\n overflow: hidden;\n background: var(--df-review-line-soft);\n color: var(--df-review-subtle);\n font-size: var(--df-review-font-size-xs);\n line-height: 1;\n text-indent: -999px;\n user-select: none;\n }\n\n .df-review-section-outline-link {\n display: inline-grid;\n place-items: center;\n width: 24px;\n height: 24px;\n border: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n cursor: pointer;\n transition: border-color 140ms ease, background 140ms ease,\n color 140ms ease, opacity 140ms ease;\n }\n\n .df-review-section-outline-link.is-dom-select {\n width: 24px;\n min-width: 24px;\n padding: 0;\n }\n\n .df-review-section-outline-link.is-dom-select svg {\n width: 16px;\n height: 16px;\n }\n\n .df-review-section-outline-link: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-section-outline-link 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 .df-review-section-outline-link:disabled {\n color: var(--df-review-subtle);\n cursor: not-allowed;\n opacity: 0.42;\n }\n\n .df-review-section-outline-link:disabled:hover {\n border-color: transparent;\n color: var(--df-review-subtle);\n background: transparent;\n }\n\n .df-review-section-outline-children {\n display: grid;\n margin-left: 16px;\n border-left: 1px solid var(--df-review-line-soft);\n }\n\n .df-review-section-outline-item.is-depth-1\n > .df-review-section-outline-children {\n border-left-color: var(--df-review-accent);\n }\n\n .df-review-section-outline-item.is-depth-2 {\n --df-review-section-outline-name-color: var(--df-review-accent);\n }\n\n .df-review-section-outline-item.is-depth-2\n > .df-review-section-outline-children {\n border-left-color: var(--df-review-area);\n }\n\n .df-review-section-outline-item.is-depth-3 {\n --df-review-section-outline-name-color: var(--df-review-area);\n }\n\n .df-review-section-outline-item.is-depth-3\n > .df-review-section-outline-children {\n border-left-color: var(--df-review-note);\n }\n\n .df-review-section-outline-item.is-depth-4 {\n --df-review-section-outline-name-color: var(--df-review-note);\n }\n\n .df-review-section-outline-item.is-depth-4\n > .df-review-section-outline-children {\n border-left-color: var(--df-review-purple);\n }\n\n .df-review-section-outline-item.is-depth-5 {\n --df-review-section-outline-name-color: var(--df-review-purple);\n }\n\n .df-review-section-outline-empty {\n padding: 14px 12px 16px;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n`;\n","export const reviewShellRulerStyle = `\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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-emphasis);\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 48px;\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) 48px;\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: nowrap;\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\t .df-review-panel-body {\n\t\t min-height: 0;\n\t\t }\n\t }\n\n @media (hover: none) and (pointer: coarse) {\n .df-review-edit-textarea textarea,\n .df-review-preset-select,\n .df-review-prompt-block textarea {\n font-size: var(--df-review-font-size-xl);\n }\n }\n`;\n","import { reviewShellBaseStyle } from './style/base';\nimport { reviewShellSitemapStyle } from './style/sitemap';\nimport { reviewShellModalStyle } from './style/modals';\nimport { reviewShellToolbarStyle } from './style/toolbar';\nimport { reviewShellQaPanelStyle } from './style/qa-panel';\nimport { reviewShellFigmaImagesStyle } from './style/figma-images';\nimport { reviewShellStageStyle } from './style/stage';\nimport { reviewShellSourceInspectorStyle } from './style/source-inspector';\nimport { reviewShellSectionOutlineStyle } from './style/section-outline';\nimport { reviewShellRulerStyle } from './style/ruler';\n\nconst 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 reviewShellBaseStyle,\n reviewShellSitemapStyle,\n reviewShellModalStyle,\n reviewShellToolbarStyle,\n reviewShellQaPanelStyle,\n reviewShellFigmaImagesStyle,\n reviewShellStageStyle,\n reviewShellSourceInspectorStyle,\n reviewShellSectionOutlineStyle,\n reviewShellRulerStyle\n ].join('\\n\\n');\n document.head.append(style);\n }\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n Bot as BotIcon,\n Images as ComponentTreeIcon,\n SquareCheckBig as QaListIcon,\n Settings as SettingsIcon,\n} from 'lucide-react';\nimport { DfLogoIcon } from './df.logo';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewMode,\n ReviewSource,\n} from '../../types';\n\nimport type {\n ReviewShellProps,\n} from '../types';\nimport { resolveReviewSourceOptions } from '../env';\nimport {\n DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n} from '../../figma/image.types';\nimport {\n DEFAULT_INITIAL_REVIEW_PROMPT,\n} from '../constants';\nimport {\n DEFAULT_REVIEW_PATH_PREFIX,\n getInitialItemId,\n getItemFrameTarget,\n getItemTarget,\n getShellUrlForItem,\n getTargetRouteKey,\n normalizeTarget,\n parseReviewAddressInput,\n updateShellUrl,\n} from '../route';\nimport {\n DEFAULT_REVIEW_VIEWPORT_PRESETS,\n findViewportPreset,\n getRestoredSize,\n} from '../viewport';\nimport {\n InitialPromptModal,\n PromptModal,\n ReviewSettingsModal,\n SitemapModal,\n} from '../shell.modals';\nimport { buildReviewItemPrompt } from '../prompt/prompt';\nimport {\n getReviewFigmaImageStore,\n getTargetFigmaFrameConfig,\n type ReviewFigmaFrameConfig,\n} from '../figma';\nimport { FigmaRailIcon } from '../figma/figma-mark-icon';\nimport { FigmaImagesPanel } from '../figma/images.panel';\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 GetSourceCandidatesOptions,\n type SourceOpenOptions,\n} from '../source.open';\nimport {\n getSectionOutline,\n type GetSectionOutlineOptions,\n type SectionOutlineEntry,\n} from '../section.outline';\nimport { SectionOutlinePanel } from './section.outline.panel';\nimport { createSourceShortcutStyle } from './source.shortcut.style';\nimport {\n SourceInspectorOverlay,\n type SourceInspectorCandidate,\n type SourceInspectorRect,\n type SourceInspectorState,\n} from './source.inspector.overlay';\nimport { ReviewTargetFrame } from '../target/frame';\nimport { createReviewTargetFigmaImageOverlays } from '../target/figma.image.overlay';\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 { useReviewFigmaImages } from '../hooks/use.review.figma.images';\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 getInitialReviewSidePanel,\n getStoredReviewSidePanel,\n getStoredSourceTreeFilter,\n getStoredSourceTreeMetaVisibility,\n type StoredReviewSidePanel,\n type StoredSourceTreeMetaVisibility,\n writeStoredReviewSidePanel,\n writeStoredReviewSidePanelVisible,\n writeStoredSourceTreeFilter,\n writeStoredSourceTreeMetaVisibility,\n} from '../settings';\nimport {\n copyCurrentReviewUrl,\n copyReviewPrompt,\n removeReviewItem,\n refreshReviewItems,\n refreshSitemapReviewItems,\n refreshReviewData as refreshReviewDataAction,\n submitReviewItem,\n updateReviewItemAssignee,\n updateReviewItemDetails,\n updateReviewItemStatus,\n} from './shell.actions';\nimport {\n centerFrameScrollOnElement,\n filterSectionOutlineEntries,\n getDefaultCollapsedSectionOutlineIds,\n getReviewModeWriteMode,\n getSectionOutlineEntryCount,\n getSectionOutlineFilterTerms,\n scrollElementInTarget,\n waitForFrame,\n waitForMs,\n} from './shell.helpers';\n\ntype ReviewSidePanel = StoredReviewSidePanel;\ntype SourceTreeMetaVisibilityKey = keyof StoredSourceTreeMetaVisibility;\n\nconst SOURCE_PANEL_MAX_WIDTH = 440;\nconst SOURCE_PANEL_MIN_WIDTH = 240;\nconst SOURCE_PANEL_MAX_HEIGHT = 260;\nconst SOURCE_TREE_PANEL_CLOSE_DELAY_MS = 180;\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 figmaImages,\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 [sectionOutline, setSectionOutline] = useState<\n SectionOutlineEntry[] | null\n >(null);\n const [sectionOutlineFilter, setSectionOutlineFilter] = useState(() =>\n getStoredSourceTreeFilter()\n );\n const [sectionOutlineMetaVisibility, setSectionOutlineMetaVisibility] =\n useState(() => getStoredSourceTreeMetaVisibility());\n const isSectionOutlineBoxMetaVisible = sectionOutlineMetaVisibility.box;\n const isSectionOutlineFontMetaVisible = sectionOutlineMetaVisibility.font;\n const isSectionOutlineMediaMetaVisible = sectionOutlineMetaVisibility.media;\n const isSectionOutlineClassMetaVisible =\n sectionOutlineMetaVisibility.className;\n const [collapsedSectionOutlineIds, setCollapsedSectionOutlineIds] = useState<\n Set<string>\n >(() => new Set());\n const [isAllQaVisible, setIsAllQaVisible] = useState(false);\n const [isInitialPromptScriptOpen, setIsInitialPromptScriptOpen] =\n useState(false);\n const resolvedReviewSourceOptions = useMemo(\n () => resolveReviewSourceOptions({ sourceInspector, sourceRoot }),\n [sourceInspector, sourceRoot]\n );\n const resolvedSourceInspector = resolvedReviewSourceOptions.sourceInspector;\n const resolvedSourceRoot = resolvedReviewSourceOptions.sourceRoot;\n const sourceOpenOptions = useMemo<SourceOpenOptions>(\n () => ({\n ...resolvedSourceInspector,\n sourceRoot: resolvedSourceRoot,\n }),\n [resolvedSourceInspector, resolvedSourceRoot]\n );\n const sourceCandidateOptions = useMemo<GetSourceCandidatesOptions>(\n () => ({\n ignore: resolvedSourceInspector?.ignore,\n includePlacer: resolvedSourceInspector?.includePlacer,\n }),\n [resolvedSourceInspector]\n );\n const sectionOutlineOptions = useMemo<GetSectionOutlineOptions>(\n () => ({\n includePlacer: resolvedSourceInspector?.includePlacer,\n ignore: resolvedSourceInspector?.ignore,\n maxDepth: resolvedSourceInspector?.maxDepth,\n }),\n [resolvedSourceInspector]\n );\n const isSourceInspectorEnabled = resolvedSourceInspector?.enabled !== false;\n const [sidePanel, setSidePanel] = useState<ReviewSidePanel>(() => {\n const initialSidePanel = getInitialReviewSidePanel();\n if (initialSidePanel) return initialSidePanel;\n if (getInitialItemId()) return 'qa';\n return isSourceInspectorEnabled ? getStoredReviewSidePanel() : 'qa';\n });\n const figmaImageStore = useMemo(\n () => getReviewFigmaImageStore(figmaImages),\n [figmaImages]\n );\n const isFigmaImageManagementEnabled = Boolean(figmaImageStore);\n const figmaImageFormat =\n figmaImages?.imageFormat ?? DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT;\n const isSourceTreeHoverOutlineEnabled =\n resolvedSourceInspector?.hoverOutline !== false;\n const isQaPanelVisible = isListVisible && sidePanel === 'qa';\n const isSourceTreePanelVisible =\n isSourceInspectorEnabled && isListVisible && sidePanel === 'source';\n const isFigmaImagesPanelVisible =\n isFigmaImageManagementEnabled &&\n isListVisible &&\n sidePanel === 'figma-images';\n\n useEffect(() => {\n if (isSourceInspectorEnabled || sidePanel !== 'source') return;\n setSidePanel('qa');\n }, [isSourceInspectorEnabled, sidePanel]);\n\n useEffect(() => {\n if (isFigmaImageManagementEnabled || sidePanel !== 'figma-images') return;\n setSidePanel('qa');\n }, [isFigmaImageManagementEnabled, sidePanel]);\n\n useEffect(() => {\n writeStoredReviewSidePanel(sidePanel);\n }, [sidePanel]);\n\n useEffect(() => {\n writeStoredReviewSidePanelVisible(isListVisible);\n }, [isListVisible]);\n\n const updateSectionOutlineFilter = useCallback((nextFilter: string) => {\n setSectionOutlineFilter(nextFilter);\n writeStoredSourceTreeFilter(nextFilter);\n }, []);\n\n const updateSectionOutlineMetaVisibility = useCallback(\n (key: SourceTreeMetaVisibilityKey) => {\n setSectionOutlineMetaVisibility((current) => {\n const next = { ...current, [key]: !current[key] };\n writeStoredSourceTreeMetaVisibility(next);\n return next;\n });\n },\n []\n );\n\n const sectionOutlineFilterTerms = useMemo(\n () => getSectionOutlineFilterTerms(sectionOutlineFilter),\n [sectionOutlineFilter]\n );\n const filteredSectionOutline = useMemo(\n () =>\n sectionOutline\n ? filterSectionOutlineEntries(sectionOutline, sectionOutlineFilterTerms)\n : [],\n [sectionOutline, sectionOutlineFilterTerms]\n );\n const sectionOutlineTotalCount = useMemo(\n () => getSectionOutlineEntryCount(sectionOutline ?? []),\n [sectionOutline]\n );\n const filteredSectionOutlineCount = useMemo(\n () => getSectionOutlineEntryCount(filteredSectionOutline),\n [filteredSectionOutline]\n );\n const isSectionOutlineFiltering = sectionOutlineFilterTerms.length > 0;\n const {\n activeItems,\n activeRemainingItemCount,\n allQaCount,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIds,\n items,\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 itemRefreshIdRef = useRef(0);\n const [isItemsLoading, setIsItemsLoading] = useState(false);\n const [mutatingItemIds, setMutatingItemIds] = useState<Set<string>>(\n () => new Set()\n );\n const {\n addImage: addFigmaImage,\n deleteImage: deleteFigmaImage,\n error: figmaImageError,\n imageOverlayStates: figmaImageOverlayStates,\n images: figmaImageList,\n isAnyImageOverlayVisible: isAnyFigmaImageOverlayVisible,\n isLoading: isFigmaImageLoading,\n isMutating: isFigmaImageMutating,\n refreshImages: refreshFigmaImages,\n reorderImages: reorderFigmaImages,\n selectedImageId: selectedFigmaImageId,\n setImageOverlayOffsetY: setFigmaImageOverlayOffsetY,\n setImageOverlayOpacity: setFigmaImageOverlayOpacity,\n setSelectedImageId: setSelectedFigmaImageId,\n target: figmaImageTarget,\n toggleAllImageOverlayVisible: toggleAllFigmaImageOverlayVisible,\n toggleImageOverlayLocked: toggleFigmaImageOverlayLocked,\n toggleImageOverlayMode: toggleFigmaImageOverlayMode,\n toggleImageOverlayVisible: toggleFigmaImageOverlayVisible,\n updateImage: updateFigmaImage,\n } = useReviewFigmaImages({\n imageFormat: figmaImageFormat,\n pageUrl: target,\n projectId,\n store: figmaImageStore,\n viewport: size,\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 isFigmaOverlayAvailable =\n !isFigmaImageManagementEnabled &&\n isViewportFigmaOverlayAvailable &&\n Boolean(targetFigmaConfig);\n const [editingItem, setEditingItem] = useState<ReviewItem | null>(null);\n const initialPromptText = initialPrompt.trim();\n const refreshItems = useCallback(\n async () => {\n const requestId = ++itemRefreshIdRef.current;\n setIsItemsLoading(true);\n\n try {\n return await refreshReviewItems({\n activeRoute,\n adapter,\n isRemoteSource,\n pageId: activeAdapterEntry.pageId,\n projectId,\n onItemsChange: setItems,\n });\n } finally {\n if (itemRefreshIdRef.current === requestId) {\n setIsItemsLoading(false);\n }\n }\n },\n [\n activeAdapterEntry.pageId,\n activeRoute,\n adapter,\n isRemoteSource,\n projectId,\n setItems,\n ]\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 fields: activeAdapterEntry.fields,\n assigneeTitle: activeAdapterEntry.assigneeTitle,\n assigneeOptions: activeAdapterEntry.assigneeOptions,\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 useEffect(() => {\n const itemId = pendingInitialItemIdRef.current;\n if (!itemId) return;\n\n const item = items.find(\n (candidate) =>\n candidate.id === itemId || candidate.externalIssueId === itemId\n );\n if (!item) return;\n\n restoreReviewItem(item);\n }, [items, pendingInitialItemIdRef, restoreReviewItem]);\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 normalizedRoute = getTargetRouteKey(\n normalizedTarget,\n reviewPathPrefix\n );\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 const isCurrentTarget =\n targetRef.current === normalizedTarget &&\n source === nextSource &&\n sizeRef.current.width === nextSize.width &&\n sizeRef.current.height === nextSize.height;\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(normalizedRoute);\n setDraftTarget(normalizedTarget);\n setSize(nextSize);\n setTarget(normalizedTarget);\n updateShellUrl(normalizedTarget, nextSize, nextSource);\n if (isCurrentTarget) reloadTargetFrame();\n };\n\n const selectPage = (href: string) => {\n const normalizedTarget = normalizeTarget(href, reviewPathPrefix);\n const normalizedRoute = getTargetRouteKey(\n normalizedTarget,\n reviewPathPrefix\n );\n clearSelectedItem();\n setIsAllQaVisible(false);\n targetRef.current = normalizedTarget;\n setActiveRoute(normalizedRoute);\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 (writeMode && mode !== nextMode) {\n setSidePanel('qa');\n setIsListVisible(true);\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 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 useEffect(() => {\n clearSourceInspector();\n setCollapsedSectionOutlineIds(new Set());\n setSectionOutline(null);\n }, [clearSourceInspector, targetSrc]);\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, sourceCandidateOptions).map(\n (candidate) => ({\n ...candidate,\n openUrl: getSourceOpenUrl(candidate.source, {\n ...sourceOpenOptions,\n omitPosition: !candidate.usesPosition,\n }),\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 sourceCandidateOptions,\n sourceOpenOptions,\n ]\n );\n\n const showSourceOutlineForTarget = useCallback(\n (target: EventTarget | null) => {\n const firstCandidate = getSourceCandidates(\n target,\n sourceCandidateOptions\n )[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, sourceCandidateOptions]\n );\n\n const showSourceOutlineForElement = useCallback(\n (element: Element) => {\n if (!isSourceTreeHoverOutlineEnabled) return;\n\n const rect = getSourceInspectorRect(element);\n\n if (!rect) {\n setSourceInspectorState((current) =>\n current?.isPinned ? current : null\n );\n return;\n }\n\n setSourceInspectorState((current) =>\n current?.isPinned\n ? current\n : {\n candidates: [],\n isPinned: false,\n panelLeft: 0,\n panelMaxWidth: SOURCE_PANEL_MAX_WIDTH,\n panelRight: null,\n panelTop: 0,\n rect,\n }\n );\n },\n [getSourceInspectorRect, isSourceTreeHoverOutlineEnabled]\n );\n\n const clearSourceOutlineHover = useCallback(() => {\n setSourceInspectorState((current) => (current?.isPinned ? current : null));\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 getCurrentSectionOutline = useCallback(\n (): SectionOutlineEntry[] | null => {\n let frameDocument: Document | null = null;\n try {\n frameDocument = iframeRef.current?.contentDocument ?? null;\n } catch {\n frameDocument = null;\n }\n if (!frameDocument || frameDocument.readyState !== 'complete') {\n return null;\n }\n return getSectionOutline(frameDocument, sectionOutlineOptions);\n },\n [iframeRef, sectionOutlineOptions]\n );\n\n const setSectionOutlineWithDefaultCollapse = useCallback(\n (nextSectionOutline: SectionOutlineEntry[]) => {\n setSectionOutline(nextSectionOutline);\n setCollapsedSectionOutlineIds(\n getDefaultCollapsedSectionOutlineIds(nextSectionOutline)\n );\n },\n []\n );\n\n useEffect(() => {\n if (sidePanel !== 'source' || !isListVisible) return undefined;\n\n const refreshSectionOutline = () => {\n const nextSectionOutline = getCurrentSectionOutline();\n if (!nextSectionOutline) return;\n setSectionOutlineWithDefaultCollapse(nextSectionOutline);\n };\n\n const animationFrame = window.requestAnimationFrame(refreshSectionOutline);\n const firstTimeout = window.setTimeout(refreshSectionOutline, 120);\n const secondTimeout = window.setTimeout(refreshSectionOutline, 500);\n\n return () => {\n window.cancelAnimationFrame(animationFrame);\n window.clearTimeout(firstTimeout);\n window.clearTimeout(secondTimeout);\n };\n }, [\n getCurrentSectionOutline,\n isListVisible,\n setSectionOutlineWithDefaultCollapse,\n sidePanel,\n targetSrc,\n ]);\n\n const toggleQaPanel = useCallback(() => {\n setSidePanel('qa');\n setIsListVisible((current) => (sidePanel === 'qa' ? !current : true));\n }, [setIsListVisible, sidePanel]);\n\n const toggleSourceTreePanel = useCallback(() => {\n if (!isSourceInspectorEnabled) return;\n\n if (sidePanel === 'source' && isListVisible) {\n setIsListVisible(false);\n return;\n }\n\n setSidePanel('source');\n const nextSectionOutline = getCurrentSectionOutline();\n if (nextSectionOutline) {\n setSectionOutlineWithDefaultCollapse(nextSectionOutline);\n }\n setIsListVisible(true);\n }, [\n getCurrentSectionOutline,\n isListVisible,\n isSourceInspectorEnabled,\n setSectionOutlineWithDefaultCollapse,\n setIsListVisible,\n sidePanel,\n ]);\n\n const toggleFigmaImagesPanel = useCallback(() => {\n if (!isFigmaImageManagementEnabled) return;\n\n if (sidePanel === 'figma-images' && isListVisible) {\n setIsListVisible(false);\n return;\n }\n\n setSidePanel('figma-images');\n setIsListVisible(true);\n }, [\n isFigmaImageManagementEnabled,\n isListVisible,\n setIsListVisible,\n sidePanel,\n ]);\n\n const toggleSectionOutlineEntry = useCallback((entryId: string) => {\n setCollapsedSectionOutlineIds((current) => {\n const next = new Set(current);\n if (next.has(entryId)) {\n next.delete(entryId);\n } else {\n next.add(entryId);\n }\n return next;\n });\n }, []);\n\n const scrollToSection = useCallback((entry: SectionOutlineEntry) => {\n scrollElementInTarget(entry.element, 'start');\n centerFrameScrollOnElement(\n frameScrollRef.current,\n iframeRef.current,\n entry.element\n );\n }, [frameScrollRef, iframeRef]);\n\n const openSectionSource = useCallback(\n (entry: SectionOutlineEntry) => {\n const didOpen = openSourceInEditor(entry.source, {\n ...sourceOpenOptions,\n omitPosition: true,\n });\n showToast(didOpen ? 'Source opened' : 'Source root required');\n },\n [showToast, sourceOpenOptions]\n );\n\n const openSectionData = useCallback(\n (entry: SectionOutlineEntry) => {\n const didOpen = openSourceInEditor(entry.data, sourceOpenOptions);\n showToast(didOpen ? 'Data opened' : 'Data hint not found');\n },\n [showToast, sourceOpenOptions]\n );\n\n const startSectionDomReview = useCallback(\n (entry: SectionOutlineEntry) => {\n if (!canWriteDom) {\n showToast('DOM QA unavailable');\n return;\n }\n\n const rect = entry.element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n showToast('Component has no visible area here');\n return;\n }\n\n clearSourceInspector();\n setSidePanel('qa');\n setIsListVisible(true);\n\n let targetWindow: Window | null = null;\n try {\n targetWindow =\n entry.element.ownerDocument.defaultView ??\n iframeRef.current?.contentWindow ??\n null;\n } catch {\n targetWindow = null;\n }\n\n void waitForMs(SOURCE_TREE_PANEL_CLOSE_DELAY_MS)\n .then(async () => {\n initReviewKit();\n await waitForFrame(targetWindow);\n const controller = controllerRef.current;\n if (!controller) {\n showToast('DOM QA unavailable');\n return;\n }\n\n scrollElementInTarget(entry.element, 'center');\n await waitForFrame(targetWindow);\n centerFrameScrollOnElement(\n frameScrollRef.current,\n iframeRef.current,\n entry.element\n );\n await waitForFrame(targetWindow);\n await controller.startElementReview(entry.element);\n await waitForFrame(targetWindow);\n setMode(controller.getMode());\n })\n .catch(() => {\n setMode(controllerRef.current?.getMode() ?? 'idle');\n });\n },\n [\n canWriteDom,\n clearSourceInspector,\n controllerRef,\n frameScrollRef,\n iframeRef,\n initReviewKit,\n setIsListVisible,\n setMode,\n showToast,\n ]\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 = createSourceShortcutStyle(\n optionAttribute,\n fontOverlayAttribute,\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 // 팝업이 고정된 동안에는 마우스 이동으로 target 을 다시 추적하지 않는다.\n // (닫기/다른 곳 클릭 전까지 고정 유지)\n if (isSourcePanelPinned) return;\n\n lastSourceTarget = event.target;\n const candidates = getSourceCandidates(event.target, sourceCandidateOptions);\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 // 팝업 고정 중에는 Option 키(반복 입력 포함)로 다시 추적하지 않는다.\n if (isSourcePanelPinned) 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 sourceCandidateOptions,\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 if (sidePanel === 'source' && isListVisible) {\n const nextSectionOutline = getCurrentSectionOutline();\n if (nextSectionOutline) {\n setSectionOutlineWithDefaultCollapse(nextSectionOutline);\n }\n }\n }, [\n bindSourceOpenShortcut,\n getCurrentSectionOutline,\n iframeRef,\n initReviewKit,\n isListVisible,\n mode,\n refreshTargetFigmaConfig,\n setSectionOutlineWithDefaultCollapse,\n sidePanel,\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 withItemMutation = async <T,>(\n itemId: string,\n action: () => Promise<T>\n ) => {\n setMutatingItemIds((currentIds) => {\n const nextIds = new Set(currentIds);\n nextIds.add(itemId);\n return nextIds;\n });\n\n try {\n return await action();\n } finally {\n setMutatingItemIds((currentIds) => {\n const nextIds = new Set(currentIds);\n nextIds.delete(itemId);\n return nextIds;\n });\n }\n };\n const showItemMutationError = (error: unknown, fallback: string) => {\n showToast(\n error instanceof Error && error.message ? error.message : fallback\n );\n };\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 = async (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => {\n try {\n await withItemMutation(item.id, () =>\n updateReviewItemStatus({\n activeAdapterEntry,\n item,\n nextStatus,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n })\n );\n } catch (error) {\n showItemMutationError(error, 'QA status update failed');\n }\n };\n\n const changeItemAssignee = async (\n item: ReviewItem,\n assigneeId: string | null\n ) => {\n try {\n await withItemMutation(item.id, () =>\n updateReviewItemAssignee({\n activeAdapterEntry,\n item,\n assigneeId,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n })\n );\n } catch (error) {\n showItemMutationError(error, 'QA assignee update failed');\n }\n };\n\n const saveItemDetails = async (\n item: ReviewItem,\n patch: Pick<ReviewItem, 'comment'> & Partial<Pick<ReviewItem, 'title'>>\n ) => {\n try {\n await withItemMutation(item.id, () =>\n updateReviewItemDetails({\n activeAdapterEntry,\n fields: activeAdapterEntry.fields,\n item,\n ...patch,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n })\n );\n setEditingItem(null);\n } catch (error) {\n showItemMutationError(error, 'QA update failed');\n throw error;\n }\n };\n\n const submitItem = async (numberedItem: NumberedReviewItem) => {\n try {\n await withItemMutation(numberedItem.item.id, () =>\n submitReviewItem({\n localAdapterEntry,\n numberedItem,\n remoteAdapterEntry,\n selectedItemIdRef,\n onClearSelectedItem: clearSelectedItem,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n })\n );\n } catch (error) {\n showItemMutationError(error, 'QA submit failed');\n }\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 copyItemLabel = (numberedItem: NumberedReviewItem) =>\n copyPrompt(\n numberedItem.displayLabel,\n `label:${numberedItem.item.id}`,\n 'QA number copied'\n );\n\n const copyItemLink = (numberedItem: NumberedReviewItem) => {\n const { item } = numberedItem;\n return copyPrompt(\n getShellUrlForItem(\n getItemFrameTarget(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 copyRemoteIssuePath = (item: ReviewItem) => {\n const path = getUrlPathWithoutOrigin(item.externalIssueUrl);\n if (!path) {\n showToast('QA link not found');\n return Promise.resolve();\n }\n\n return copyPrompt(path, `remote-link:${item.id}`, 'QA path copied');\n };\n\n const removeItem = async (item: ReviewItem) => {\n try {\n await withItemMutation(item.id, () =>\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 } catch (error) {\n showItemMutationError(error, 'QA delete failed');\n }\n };\n\n const figmaImageOverlays = createReviewTargetFigmaImageOverlays({\n imageOverlayStates: figmaImageOverlayStates,\n images: figmaImageList,\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 figmaOverlayUnavailableMessage={\n isFigmaImageManagementEnabled\n ? 'No Figma images on this viewport.'\n : undefined\n }\n isFigmaOverlayActive={\n isFigmaImageManagementEnabled\n ? isAnyFigmaImageOverlayVisible\n : targetOverlayState.figma\n }\n isFigmaOverlayAvailable={\n isFigmaImageManagementEnabled\n ? figmaImageList.length > 0\n : isFigmaOverlayAvailable\n }\n onDraftTargetChange={setDraftTarget}\n onApplyTarget={applyTarget}\n onOpenSitemap={() => setIsSitemapOpen(true)}\n onCopyCurrentUrl={() => void copyCurrentUrl()}\n onSizeChange={setSize}\n onToggleFigmaOverlay={\n isFigmaImageManagementEnabled\n ? toggleAllFigmaImageOverlayVisible\n : () => toggleTargetOverlay('figma')\n }\n onToggleRuler={toggleRuler}\n onToggleTargetOverlay={toggleTargetOverlay}\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 && <PromptModal onClose={closePromptModal} />}\n\n {isInitialPromptScriptOpen && (\n <InitialPromptModal\n initialPromptText={initialPromptText}\n copiedPromptKey={copiedPromptKey}\n onClose={() => setIsInitialPromptScriptOpen(false)}\n onCopyPrompt={(text, key) => void copyPrompt(text, key)}\n />\n )}\n\n {editingItem && (\n <QaItemEditModal\n fields={activeAdapterEntry.fields}\n item={editingItem}\n onClose={() => setEditingItem(null)}\n onSave={saveItemDetails}\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={isQaPanelVisible ? 'Hide QA list' : 'Show QA list'}\n aria-pressed={isQaPanelVisible}\n className={`df-review-side-toggle${\n isQaPanelVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={toggleQaPanel}\n title=\"QA\"\n >\n <span aria-hidden=\"true\">\n <QaListIcon />\n </span>\n </button>\n {isSourceInspectorEnabled && (\n <button\n aria-controls=\"df-review-section-outline\"\n aria-label={\n isSourceTreePanelVisible\n ? 'Hide source tree'\n : 'Show source tree'\n }\n aria-pressed={isSourceTreePanelVisible}\n className={`df-review-side-toggle${\n isSourceTreePanelVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={toggleSourceTreePanel}\n title=\"Source Tree\"\n >\n <span aria-hidden=\"true\">\n <ComponentTreeIcon />\n </span>\n </button>\n )}\n {isFigmaImageManagementEnabled && (\n <button\n aria-label={\n isFigmaImagesPanelVisible\n ? 'Hide Figma images'\n : 'Show Figma images'\n }\n aria-pressed={isFigmaImagesPanelVisible}\n className={`df-review-side-toggle${\n isFigmaImagesPanelVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={toggleFigmaImagesPanel}\n title=\"Figma Images\"\n >\n <span aria-hidden=\"true\">\n <FigmaRailIcon />\n </span>\n </button>\n )}\n <div className=\"df-review-side-actions\">\n <button\n aria-label=\"Open initial prompt\"\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={() => setIsInitialPromptScriptOpen(true)}\n title=\"Initial prompt\"\n >\n <span aria-hidden=\"true\">\n <BotIcon />\n </span>\n </button>\n <button\n aria-label=\"Open settings\"\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={openFigmaSettings}\n title=\"Settings\"\n >\n <span aria-hidden=\"true\">\n <SettingsIcon />\n </span>\n </button>\n {currentPagePresenceUsers.length > 0 && (\n <PresenceOverlay\n presenceSessionId={presenceSessionId}\n users={currentPagePresenceUsers}\n />\n )}\n <span className=\"df-review-side-divider\" aria-hidden=\"true\" />\n <button\n aria-label=\"Open about\"\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={() => {\n setIsInitialPromptOpen(true);\n }}\n title=\"About\"\n >\n <span aria-hidden=\"true\">\n <DfLogoIcon />\n </span>\n </button>\n </div>\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={isQaPanelVisible}\n isAllQaVisible={isAllQaVisible}\n isLoading={isItemsLoading}\n isRemoteSource={isRemoteSource}\n mutatingItemIds={mutatingItemIds}\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 fields={activeAdapterEntry.fields}\n assigneeTitle={activeAdapterEntry.assigneeTitle}\n onChangeItemStatus={changeItemStatus}\n onClearSelectedItem={clearSelectedReviewItem}\n onChangeItemAssignee={changeItemAssignee}\n onChangeReviewSource={changeReviewSource}\n onCopyItemLabel={(numberedItem) => void copyItemLabel(numberedItem)}\n onCopyItemLink={(numberedItem) => void copyItemLink(numberedItem)}\n onCopyItemPrompt={(numberedItem) => void copyItemPrompt(numberedItem)}\n onCopyRemoteIssuePath={copyRemoteIssuePath}\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 {isFigmaImageManagementEnabled && (\n <FigmaImagesPanel\n error={figmaImageError}\n imageOverlayStates={figmaImageOverlayStates}\n images={figmaImageList}\n isListVisible={isFigmaImagesPanelVisible}\n isLoading={isFigmaImageLoading}\n isMutating={isFigmaImageMutating}\n selectedImageId={selectedFigmaImageId}\n onAddImage={addFigmaImage}\n onDeleteImage={deleteFigmaImage}\n onRefreshImages={refreshFigmaImages}\n onReorderImages={reorderFigmaImages}\n onSelectImage={setSelectedFigmaImageId}\n onSetImageOverlayOffsetY={setFigmaImageOverlayOffsetY}\n onSetImageOverlayOpacity={setFigmaImageOverlayOpacity}\n onToggleImageOverlayLocked={toggleFigmaImageOverlayLocked}\n onToggleImageOverlayMode={toggleFigmaImageOverlayMode}\n onToggleImageOverlayVisible={toggleFigmaImageOverlayVisible}\n onUpdateImage={updateFigmaImage}\n />\n )}\n\n {isSourceInspectorEnabled && (\n <SectionOutlinePanel\n isPanelVisible={isSourceTreePanelVisible}\n isFiltering={isSectionOutlineFiltering}\n filteredCount={filteredSectionOutlineCount}\n totalCount={sectionOutlineTotalCount}\n rootCount={sectionOutline?.length ?? 0}\n filter={sectionOutlineFilter}\n entries={filteredSectionOutline}\n collapsedIds={collapsedSectionOutlineIds}\n canWriteDom={canWriteDom}\n isBoxMetaVisible={isSectionOutlineBoxMetaVisible}\n isFontMetaVisible={isSectionOutlineFontMetaVisible}\n isMediaMetaVisible={isSectionOutlineMediaMetaVisible}\n isClassMetaVisible={isSectionOutlineClassMetaVisible}\n onToggleMeta={updateSectionOutlineMetaVisibility}\n onFilterChange={updateSectionOutlineFilter}\n onToggleEntry={toggleSectionOutlineEntry}\n onScrollToSection={scrollToSection}\n onOpenData={openSectionData}\n onOpenSource={openSectionSource}\n onStartDomReview={startSectionDomReview}\n onHoverElement={showSourceOutlineForElement}\n onClearHover={clearSourceOutlineHover}\n />\n )}\n\n <ReviewTargetFrame\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n figmaImageOverlays={figmaImageOverlays}\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 onSetFigmaImageOverlayOffsetY={setFigmaImageOverlayOffsetY}\n onSetReviewMode={setReviewMode}\n />\n\n <SourceInspectorOverlay\n state={sourceInspectorState}\n interactionRef={sourceInspectorInteractionRef}\n onClear={clearSourceInspector}\n onOpenCandidate={openSourceCandidate}\n />\n </div>\n );\n};\n\nfunction getUrlPathWithoutOrigin(value: string | undefined) {\n const trimmed = value?.trim();\n if (!trimmed) return null;\n\n try {\n const url = new URL(trimmed, window.location.origin);\n return `${url.pathname}${url.search}${url.hash}`;\n } catch {\n return trimmed;\n }\n}\n","/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n","/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n","import { CamelToPascal } from '../utility-types';\nimport { toCamelCase } from './toCamelCase';\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n\n return false;\n};\n","'use client';\n\nimport { createContext, createElement, type ReactNode, useContext, useMemo } from 'react';\nimport { LucideProps } from './types';\n\ntype LucideConfig = {\n size: number;\n color: string;\n strokeWidth: number;\n absoluteStrokeWidth: boolean;\n className: string;\n};\n\nconst LucideContext = createContext<LucideProps>({});\n\ntype LucideProviderProps = {\n children: ReactNode;\n} & Partial<LucideConfig>;\n\nexport function LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n}: LucideProviderProps) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className],\n );\n\n return createElement(LucideContext.Provider, { value }, children);\n}\n\nexport const useLucideContext = () => useContext(LucideContext);\n","'use client';\n\nimport { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\nimport { useLucideContext } from './context';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n { color, size, strokeWidth, absoluteStrokeWidth, className = '', children, iconNode, ...rest },\n ref,\n ) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = 'currentColor',\n className: contextClass = '',\n } = useLucideContext() ?? {};\n\n const calculatedStrokeWidth =\n absoluteStrokeWidth ?? contextAbsoluteStrokeWidth\n ? (Number(strokeWidth ?? contextStrokeWidth) * 24) / Number(size ?? contextSize)\n : strokeWidth ?? contextStrokeWidth;\n\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses('lucide', contextClass, className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 8V4H8', key: 'hb8ula' }],\n ['rect', { width: '16', height: '12', x: '4', y: '8', rx: '2', key: 'enze0r' }],\n ['path', { d: 'M2 14h2', key: 'vft8re' }],\n ['path', { d: 'M20 14h2', key: '4cs60a' }],\n ['path', { d: 'M15 13v2', key: '1xurst' }],\n ['path', { d: 'M9 13v2', key: 'rq6x2g' }],\n];\n\n/**\n * @component @name Bot\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgOFY0SDgiIC8+CiAgPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjEyIiB4PSI0IiB5PSI4IiByeD0iMiIgLz4KICA8cGF0aCBkPSJNMiAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0xNSAxM3YyIiAvPgogIDxwYXRoIGQ9Ik05IDEzdjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/bot\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Bot = createLucideIcon('bot', __iconNode);\n\nexport default Bot;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }]];\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\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 ChevronDown = createLucideIcon('chevron-down', __iconNode);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }]];\n\n/**\n * @component @name ChevronRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\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 ChevronRight = createLucideIcon('chevron-right', __iconNode);\n\nexport default ChevronRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3', key: '1u773s' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n];\n\n/**\n * @component @name CircleQuestionMark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMiIC8+CiAgPHBhdGggZD0iTTEyIDE3aC4wMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/circle-question-mark\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleQuestionMark = createLucideIcon('circle-question-mark', __iconNode);\n\nexport default CircleQuestionMark;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm18 16 4-4-4-4', key: '1inbqp' }],\n ['path', { d: 'm6 8-4 4 4 4', key: '15zrgr' }],\n ['path', { d: 'm14.5 4-5 16', key: 'e7oirm' }],\n];\n\n/**\n * @component @name CodeXml\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTggMTYgNC00LTQtNCIgLz4KICA8cGF0aCBkPSJtNiA4LTQgNCA0IDQiIC8+CiAgPHBhdGggZD0ibTE0LjUgNC01IDE2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/code-xml\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 CodeXml = createLucideIcon('code-xml', __iconNode);\n\nexport default CodeXml;\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: 'M12 18a6 6 0 0 0 0-12v12z', key: 'j4l70d' }],\n];\n\n/**\n * @component @name Contrast\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNMTIgMThhNiA2IDAgMCAwIDAtMTJ2MTJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/contrast\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 Contrast = createLucideIcon('contrast', __iconNode);\n\nexport default Contrast;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n];\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHg9IjgiIHk9IjgiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('copy', __iconNode);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['ellipse', { cx: '12', cy: '5', rx: '9', ry: '3', key: 'msslwz' }],\n ['path', { d: 'M3 5V19A9 3 0 0 0 21 19V5', key: '1wlel7' }],\n ['path', { d: 'M3 12A9 3 0 0 0 21 12', key: 'mv7ke4' }],\n];\n\n/**\n * @component @name Database\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8ZWxsaXBzZSBjeD0iMTIiIGN5PSI1IiByeD0iOSIgcnk9IjMiIC8+CiAgPHBhdGggZD0iTTMgNVYxOUE5IDMgMCAwIDAgMjEgMTlWNSIgLz4KICA8cGF0aCBkPSJNMyAxMkE5IDMgMCAwIDAgMjEgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/database\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 Database = createLucideIcon('database', __iconNode);\n\nexport default Database;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'M10 14 21 3', key: 'gplh6r' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6', key: 'a6xqqp' }],\n];\n\n/**\n * @component @name ExternalLink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0iTTEwIDE0IDIxIDMiIC8+CiAgPHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ExternalLink = createLucideIcon('external-link', __iconNode);\n\nexport default ExternalLink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49',\n key: 'ct8e1f',\n },\n ],\n ['path', { d: 'M14.084 14.158a3 3 0 0 1-4.242-4.242', key: '151rxh' }],\n [\n 'path',\n {\n d: 'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143',\n key: '13bj9a',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNzMzIDUuMDc2YTEwLjc0NCAxMC43NDQgMCAwIDEgMTEuMjA1IDYuNTc1IDEgMSAwIDAgMSAwIC42OTYgMTAuNzQ3IDEwLjc0NyAwIDAgMS0xLjQ0NCAyLjQ5IiAvPgogIDxwYXRoIGQ9Ik0xNC4wODQgMTQuMTU4YTMgMyAwIDAgMS00LjI0Mi00LjI0MiIgLz4KICA8cGF0aCBkPSJNMTcuNDc5IDE3LjQ5OWExMC43NSAxMC43NSAwIDAgMS0xNS40MTctNS4xNTEgMSAxIDAgMCAxIDAtLjY5NiAxMC43NSAxMC43NSAwIDAgMSA0LjQ0Ni01LjE0MyIgLz4KICA8cGF0aCBkPSJtMiAyIDIwIDIwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst EyeOff = createLucideIcon('eye-off', __iconNode);\n\nexport default EyeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n key: '1nclc0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi4wNjIgMTIuMzQ4YTEgMSAwIDAgMSAwLS42OTYgMTAuNzUgMTAuNzUgMCAwIDEgMTkuODc2IDAgMSAxIDAgMCAxIDAgLjY5NiAxMC43NSAxMC43NSAwIDAgMS0xOS44NzYgMCIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Eye = createLucideIcon('eye', __iconNode);\n\nexport default Eye;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm22 11-1.296-1.296a2.4 2.4 0 0 0-3.408 0L11 16', key: '9kzy35' }],\n ['path', { d: 'M4 8a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2', key: '1t0f0t' }],\n ['circle', { cx: '13', cy: '7', r: '1', fill: 'currentColor', key: '1obus6' }],\n ['rect', { x: '8', y: '2', width: '14', height: '14', rx: '2', key: '1gvhby' }],\n];\n\n/**\n * @component @name Images\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjIgMTEtMS4yOTYtMS4yOTZhMi40IDIuNCAwIDAgMC0zLjQwOCAwTDExIDE2IiAvPgogIDxwYXRoIGQ9Ik00IDhhMiAyIDAgMCAwLTIgMnYxMGEyIDIgMCAwIDAgMiAyaDEwYTIgMiAwIDAgMCAyLTIiIC8+CiAgPGNpcmNsZSBjeD0iMTMiIGN5PSI3IiByPSIxIiBmaWxsPSJjdXJyZW50Q29sb3IiIC8+CiAgPHJlY3QgeD0iOCIgeT0iMiIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiByeD0iMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/images\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 Images = createLucideIcon('images', __iconNode);\n\nexport default Images;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '7', height: '7', x: '3', y: '3', rx: '1', key: '1g98yp' }],\n ['rect', { width: '7', height: '7', x: '14', y: '3', rx: '1', key: '6d4xhi' }],\n ['rect', { width: '7', height: '7', x: '14', y: '14', rx: '1', key: 'nxv5o0' }],\n ['rect', { width: '7', height: '7', x: '3', y: '14', rx: '1', key: '1bb6yr' }],\n];\n\n/**\n * @component @name LayoutGrid\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIzIiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIxNCIgeT0iMyIgcng9IjEiIC8+CiAgPHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iNyIgeD0iMTQiIHk9IjE0IiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIxNCIgcng9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/layout-grid\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LayoutGrid = createLucideIcon('layout-grid', __iconNode);\n\nexport default LayoutGrid;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M9 17H7A5 5 0 0 1 7 7h2', key: '8i5ue5' }],\n ['path', { d: 'M15 7h2a5 5 0 1 1 0 10h-2', key: '1b9ql8' }],\n ['line', { x1: '8', x2: '16', y1: '12', y2: '12', key: '1jonct' }],\n];\n\n/**\n * @component @name Link2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOSAxN0g3QTUgNSAwIDAgMSA3IDdoMiIgLz4KICA8cGF0aCBkPSJNMTUgN2gyYTUgNSAwIDEgMSAwIDEwaC0yIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIxMiIgeTI9IjEyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/link-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Link2 = createLucideIcon('link-2', __iconNode);\n\nexport default Link2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M2 5h20', key: '1fs1ex' }],\n ['path', { d: 'M6 12h12', key: '8npq4p' }],\n ['path', { d: 'M9 19h6', key: '456am0' }],\n];\n\n/**\n * @component @name ListFilter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMiA1aDIwIiAvPgogIDxwYXRoIGQ9Ik02IDEyaDEyIiAvPgogIDxwYXRoIGQ9Ik05IDE5aDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/list-filter\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ListFilter = createLucideIcon('list-filter', __iconNode);\n\nexport default ListFilter;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '11', x: '3', y: '11', rx: '2', ry: '2', key: '1w4ew1' }],\n ['path', { d: 'M7 11V7a5 5 0 0 1 9.9-1', key: '1mm8w8' }],\n];\n\n/**\n * @component @name LockOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTEiIHg9IjMiIHk9IjExIiByeD0iMiIgcnk9IjIiIC8+CiAgPHBhdGggZD0iTTcgMTFWN2E1IDUgMCAwIDEgOS45LTEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/lock-open\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 LockOpen = createLucideIcon('lock-open', __iconNode);\n\nexport default LockOpen;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '11', x: '3', y: '11', rx: '2', ry: '2', key: '1w4ew1' }],\n ['path', { d: 'M7 11V7a5 5 0 0 1 10 0v4', key: 'fwvmzm' }],\n];\n\n/**\n * @component @name Lock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTEiIHg9IjMiIHk9IjExIiByeD0iMiIgcnk9IjIiIC8+CiAgPHBhdGggZD0iTTcgMTFWN2E1IDUgMCAwIDEgMTAgMHY0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/lock\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 Lock = createLucideIcon('lock', __iconNode);\n\nexport default Lock;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z',\n key: '169xi5',\n },\n ],\n ['path', { d: 'M15 5.764v15', key: '1pn4in' }],\n ['path', { d: 'M9 3.236v15', key: '1uimfh' }],\n];\n\n/**\n * @component @name Map\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQuMTA2IDUuNTUzYTIgMiAwIDAgMCAxLjc4OCAwbDMuNjU5LTEuODNBMSAxIDAgMCAxIDIxIDQuNjE5djEyLjc2NGExIDEgMCAwIDEtLjU1My44OTRsLTQuNTUzIDIuMjc3YTIgMiAwIDAgMS0xLjc4OCAwbC00LjIxMi0yLjEwNmEyIDIgMCAwIDAtMS43ODggMGwtMy42NTkgMS44M0ExIDEgMCAwIDEgMyAxOS4zODFWNi42MThhMSAxIDAgMCAxIC41NTMtLjg5NGw0LjU1My0yLjI3N2EyIDIgMCAwIDEgMS43ODggMHoiIC8+CiAgPHBhdGggZD0iTTE1IDUuNzY0djE1IiAvPgogIDxwYXRoIGQ9Ik05IDMuMjM2djE1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/map\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Map = createLucideIcon('map', __iconNode);\n\nexport default Map;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'm21 3-7 7', key: '1l2asr' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M9 21H3v-6', key: 'wtvkvv' }],\n];\n\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0ibTIxIDMtNyA3IiAvPgogIDxwYXRoIGQ9Im0zIDIxIDctNyIgLz4KICA8cGF0aCBkPSJNOSAyMUgzdi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize2 = createLucideIcon('maximize-2', __iconNode);\n\nexport default Maximize2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/moon\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 Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 2v20', key: 't6zp3m' }],\n ['path', { d: 'm8 18 4 4 4-4', key: 'bh5tu3' }],\n ['path', { d: 'm8 6 4-4 4 4', key: 'ybng9g' }],\n];\n\n/**\n * @component @name MoveVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMnYyMCIgLz4KICA8cGF0aCBkPSJtOCAxOCA0IDQgNC00IiAvPgogIDxwYXRoIGQ9Im04IDYgNC00IDQgNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/move-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 MoveVertical = createLucideIcon('move-vertical', __iconNode);\n\nexport default MoveVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n key: '1a8usu',\n },\n ],\n ['path', { d: 'm15 5 4 4', key: '1mk7zo' }],\n];\n\n/**\n * @component @name Pencil\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KICA8cGF0aCBkPSJtMTUgNSA0IDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/pencil\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pencil = createLucideIcon('pencil', __iconNode);\n\nexport default Pencil;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'M12 5v14', key: 's699le' }],\n];\n\n/**\n * @component @name Plus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/plus\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 Plus = createLucideIcon('plus', __iconNode);\n\nexport default Plus;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '12', x: '2', y: '6', rx: '2', key: '9lu3g6' }],\n];\n\n/**\n * @component @name RectangleHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTIiIHg9IjIiIHk9IjYiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rectangle-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RectangleHorizontal = createLucideIcon('rectangle-horizontal', __iconNode);\n\nexport default RectangleHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z',\n key: 'icamh8',\n },\n ],\n ['path', { d: 'm14.5 12.5 2-2', key: 'inckbg' }],\n ['path', { d: 'm11.5 9.5 2-2', key: 'fmmyf7' }],\n ['path', { d: 'm8.5 6.5 2-2', key: 'vc6u1g' }],\n ['path', { d: 'm17.5 15.5 2-2', key: 'wo5hmg' }],\n];\n\n/**\n * @component @name Ruler\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMyAxNS4zYTIuNCAyLjQgMCAwIDEgMCAzLjRsLTIuNiAyLjZhMi40IDIuNCAwIDAgMS0zLjQgMEwyLjcgOC43YTIuNDEgMi40MSAwIDAgMSAwLTMuNGwyLjYtMi42YTIuNDEgMi40MSAwIDAgMSAzLjQgMFoiIC8+CiAgPHBhdGggZD0ibTE0LjUgMTIuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTExLjUgOS41IDItMiIgLz4KICA8cGF0aCBkPSJtOC41IDYuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTE3LjUgMTUuNSAyLTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/ruler\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ruler = createLucideIcon('ruler', __iconNode);\n\nexport default Ruler;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 7V5a2 2 0 0 1 2-2h2', key: 'aa7l1z' }],\n ['path', { d: 'M17 3h2a2 2 0 0 1 2 2v2', key: '4qcy5o' }],\n ['path', { d: 'M21 17v2a2 2 0 0 1-2 2h-2', key: '6vwrx8' }],\n ['path', { d: 'M7 21H5a2 2 0 0 1-2-2v-2', key: 'ioqczr' }],\n];\n\n/**\n * @component @name Scan\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiAvPgogIDxwYXRoIGQ9Ik0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiAvPgogIDxwYXRoIGQ9Ik0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIC8+CiAgPHBhdGggZD0iTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/scan\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Scan = createLucideIcon('scan', __iconNode);\n\nexport default Scan;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm21 21-4.34-4.34', key: '14j7rj' }],\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n];\n\n/**\n * @component @name Search\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMjEtNC4zNC00LjM0IiAvPgogIDxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/search\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 Search = createLucideIcon('search', __iconNode);\n\nexport default Search;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '20', x: '5', y: '2', rx: '2', ry: '2', key: '1yt0o3' }],\n ['path', { d: 'M12 18h.01', key: 'mhygvu' }],\n];\n\n/**\n * @component @name Smartphone\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMjAiIHg9IjUiIHk9IjIiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNMTIgMThoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/smartphone\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Smartphone = createLucideIcon('smartphone', __iconNode);\n\nexport default Smartphone;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n { d: 'M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344', key: '2acyp4' },\n ],\n ['path', { d: 'm9 11 3 3L22 4', key: '1pflzl' }],\n];\n\n/**\n * @component @name SquareCheckBig\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTAuNjU2VjE5YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxMi4zNDQiIC8+CiAgPHBhdGggZD0ibTkgMTEgMyAzTDIyIDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/square-check-big\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 SquareCheckBig = createLucideIcon('square-check-big', __iconNode);\n\nexport default SquareCheckBig;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 3a2 2 0 0 0-2 2', key: 'y57alp' }],\n ['path', { d: 'M19 3a2 2 0 0 1 2 2', key: '18rm91' }],\n ['path', { d: 'M21 19a2 2 0 0 1-2 2', key: '1j7049' }],\n ['path', { d: 'M5 21a2 2 0 0 1-2-2', key: 'sbafld' }],\n ['path', { d: 'M9 3h1', key: '1yesri' }],\n ['path', { d: 'M9 21h1', key: '15o7lz' }],\n ['path', { d: 'M14 3h1', key: '1ec4yj' }],\n ['path', { d: 'M14 21h1', key: 'v9vybs' }],\n ['path', { d: 'M3 9v1', key: '1r0deq' }],\n ['path', { d: 'M21 9v1', key: 'mxsmne' }],\n ['path', { d: 'M3 14v1', key: 'vnatye' }],\n ['path', { d: 'M21 14v1', key: '169vum' }],\n];\n\n/**\n * @component @name SquareDashed\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAzYTIgMiAwIDAgMC0yIDIiIC8+CiAgPHBhdGggZD0iTTE5IDNhMiAyIDAgMCAxIDIgMiIgLz4KICA8cGF0aCBkPSJNMjEgMTlhMiAyIDAgMCAxLTIgMiIgLz4KICA8cGF0aCBkPSJNNSAyMWEyIDIgMCAwIDEtMi0yIiAvPgogIDxwYXRoIGQ9Ik05IDNoMSIgLz4KICA8cGF0aCBkPSJNOSAyMWgxIiAvPgogIDxwYXRoIGQ9Ik0xNCAzaDEiIC8+CiAgPHBhdGggZD0iTTE0IDIxaDEiIC8+CiAgPHBhdGggZD0iTTMgOXYxIiAvPgogIDxwYXRoIGQ9Ik0yMSA5djEiIC8+CiAgPHBhdGggZD0iTTMgMTR2MSIgLz4KICA8cGF0aCBkPSJNMjEgMTR2MSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/square-dashed\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 SquareDashed = createLucideIcon('square-dashed', __iconNode);\n\nexport default SquareDashed;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z',\n key: 'xwnzip',\n },\n ],\n ['path', { d: 'M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6', key: '14rsvq' }],\n];\n\n/**\n * @component @name SquareMousePointer\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuMDM0IDEyLjY4MWEuNDk4LjQ5OCAwIDAgMSAuNjQ3LS42NDdsOSAzLjVhLjUuNSAwIDAgMS0uMDMzLjk0M2wtMy40NDQgMS4wNjhhMSAxIDAgMCAwLS42Ni42NmwtMS4wNjcgMy40NDNhLjUuNSAwIDAgMS0uOTQzLjAzM3oiIC8+CiAgPHBhdGggZD0iTTIxIDExVjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/square-mouse-pointer\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareMousePointer = createLucideIcon('square-mouse-pointer', __iconNode);\n\nexport default SquareMousePointer;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z',\n key: '1dfntj',\n },\n ],\n ['path', { d: 'M15 3v5a1 1 0 0 0 1 1h5', key: '6s6qgf' }],\n];\n\n/**\n * @component @name StickyNote\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgOWEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTUgM0g1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yeiIgLz4KICA8cGF0aCBkPSJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/sticky-note\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst StickyNote = createLucideIcon('sticky-note', __iconNode);\n\nexport default StickyNote;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xMiAydjIiIC8+CiAgPHBhdGggZD0iTTEyIDIwdjIiIC8+CiAgPHBhdGggZD0ibTQuOTMgNC45MyAxLjQxIDEuNDEiIC8+CiAgPHBhdGggZD0ibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJNMiAxMmgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxMmgyIiAvPgogIDxwYXRoIGQ9Im02LjM0IDE3LjY2LTEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJtMTkuMDcgNC45My0xLjQxIDEuNDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sun\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 Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10 11v6', key: 'nco0om' }],\n ['path', { d: 'M14 11v6', key: 'outv1u' }],\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6', key: 'miytrc' }],\n ['path', { d: 'M3 6h18', key: 'd0wm0j' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2', key: 'e791ji' }],\n];\n\n/**\n * @component @name Trash2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTQgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2IiAvPgogIDxwYXRoIGQ9Ik0zIDZoMTgiIC8+CiAgPHBhdGggZD0iTTggNlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/trash-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 Trash2 = createLucideIcon('trash-2', __iconNode);\n\nexport default Trash2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 4v16', key: '1654pz' }],\n ['path', { d: 'M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2', key: 'e0r10z' }],\n ['path', { d: 'M9 20h6', key: 's66wpe' }],\n];\n\n/**\n * @component @name Type\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNHYxNiIgLz4KICA8cGF0aCBkPSJNNCA3VjVhMSAxIDAgMCAxIDEtMWgxNGExIDEgMCAwIDEgMSAxdjIiIC8+CiAgPHBhdGggZD0iTTkgMjBoNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/type\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 Type = createLucideIcon('type', __iconNode);\n\nexport default Type;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v12', key: '1x0j5s' }],\n ['path', { d: 'm17 8-5-5-5 5', key: '7q97r8' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n];\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxMiIgLz4KICA8cGF0aCBkPSJtMTcgOC01LTUtNSA1IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('upload', __iconNode);\n\nexport default Upload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","/** Designfever brand mark, used as the About / help entry in the side rail. */\nexport const DfLogoIcon = () => (\n <svg\n className=\"df-review-brand-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 54.062 38.381\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect\n width=\"4.787\"\n height=\"4.787\"\n transform=\"translate(49.276)\"\n fill=\"currentColor\"\n />\n <path\n d=\"M25.337,12.329a15.036,15.036,0,1,0,0,21.866v4.186h4.787V0H25.337V12.329ZM15.033,33.5A10.236,10.236,0,1,1,25.27,23.265,10.249,10.249,0,0,1,15.033,33.5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M72.092,0H67.3V38.314h4.792V23.939H86.5V19.152H72.092Z\"\n transform=\"translate(-32.436)\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import type {\n ReviewShellProps,\n ReviewSourceEditor,\n ReviewSourceInspectorOptions,\n} from './types';\n\ntype ReviewRuntimeEnv = Record<string, unknown>;\n\ndeclare const __DF_WRK_REVIEW_SOURCE_ROOT__: string | undefined;\ndeclare const __DF_WRK_REVIEW_SOURCE_EDITOR__: string | undefined;\ndeclare const __DF_WRK_REVIEW_SOURCE_URL_TEMPLATE__: string | undefined;\n\nconst REVIEW_SOURCE_EDITORS: readonly ReviewSourceEditor[] = [\n 'vscode',\n 'cursor',\n 'webstorm',\n 'custom',\n];\n\nconst getInjectedSourceRoot = () =>\n typeof __DF_WRK_REVIEW_SOURCE_ROOT__ === 'undefined'\n ? undefined\n : __DF_WRK_REVIEW_SOURCE_ROOT__;\n\nconst getInjectedSourceEditor = () =>\n typeof __DF_WRK_REVIEW_SOURCE_EDITOR__ === 'undefined'\n ? undefined\n : __DF_WRK_REVIEW_SOURCE_EDITOR__;\n\nconst getInjectedSourceUrlTemplate = () =>\n typeof __DF_WRK_REVIEW_SOURCE_URL_TEMPLATE__ === 'undefined'\n ? undefined\n : __DF_WRK_REVIEW_SOURCE_URL_TEMPLATE__;\n\nconst getRuntimeEnv = (): ReviewRuntimeEnv => ({\n VITE_REVIEW_SOURCE_EDITOR: getInjectedSourceEditor(),\n VITE_REVIEW_SOURCE_ROOT: getInjectedSourceRoot(),\n VITE_REVIEW_SOURCE_URL_TEMPLATE: getInjectedSourceUrlTemplate(),\n});\n\nconst getEnvString = (env: ReviewRuntimeEnv, key: string) => {\n const value = env[key];\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n};\n\nconst getEnvSourceEditor = (\n env: ReviewRuntimeEnv\n): ReviewSourceEditor | undefined => {\n const value = getEnvString(env, 'VITE_REVIEW_SOURCE_EDITOR');\n return REVIEW_SOURCE_EDITORS.includes(value as ReviewSourceEditor)\n ? (value as ReviewSourceEditor)\n : undefined;\n};\n\nexport const resolveReviewSourceOptions = ({\n sourceInspector,\n sourceRoot,\n}: Pick<ReviewShellProps, 'sourceInspector' | 'sourceRoot'>) => {\n const env = getRuntimeEnv();\n const envSourceRoot = getEnvString(env, 'VITE_REVIEW_SOURCE_ROOT');\n const envSourceEditor = getEnvSourceEditor(env);\n const envUrlTemplate = getEnvString(env, 'VITE_REVIEW_SOURCE_URL_TEMPLATE');\n\n const resolvedSourceInspector: ReviewSourceInspectorOptions | undefined =\n sourceInspector || envSourceEditor || envUrlTemplate\n ? {\n ...sourceInspector,\n ...(envSourceEditor ? { editor: envSourceEditor } : {}),\n ...(envUrlTemplate ? { urlTemplate: envUrlTemplate } : {}),\n }\n : sourceInspector;\n\n return {\n sourceInspector: resolvedSourceInspector,\n sourceRoot: envSourceRoot ?? sourceRoot,\n };\n};\n","import type { ReviewItemScope } from '../types';\nimport type { ReviewQaFilter, ReviewShellTheme } from './types';\n\nexport const REVIEW_QA_FILTERS: Array<{\n key: ReviewQaFilter;\n label: string;\n scope?: ReviewItemScope;\n}> = [\n { key: 'all', label: 'All' },\n { key: 'mobile', label: 'Mobile', scope: 'mobile' },\n { key: 'tablet', label: 'Tablet', scope: 'tablet' },\n { key: 'desktop', label: 'Desktop', scope: 'desktop' },\n { key: 'wide', label: 'Wide', scope: 'wide' },\n];\n\nexport const FIGMA_OVERLAY_UNAVAILABLE_MESSAGE =\n '피그마 오버레이 디버깅이 안되는 해상도';\nexport const FIGMA_TOKEN_STORAGE_KEY = 'figma-token';\nexport const REVIEW_USER_ID_STORAGE_KEY = 'user-id';\nexport const REVIEW_THEME_STORAGE_KEY = 'df-review-theme';\nexport const REVIEW_SIDE_PANEL_STORAGE_KEY = 'df-review-side-panel';\nexport const REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY =\n 'df-review-side-panel-visible';\nexport const REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY =\n 'df-review-source-tree-filter';\nexport const REVIEW_SOURCE_TREE_META_STORAGE_KEY =\n 'df-review-source-tree-meta-visibility';\nexport const REVIEW_QA_STATUS_FILTER_STORAGE_KEY =\n 'df-review-qa-status-filter';\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\nconst 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 { hash, path, search } = splitTarget(raw);\n const normalized = path.startsWith('/') ? path : `/${path}`;\n const reviewPrefix = normalizeReviewPathPrefix(reviewPathPrefix);\n\n const normalizedPath = normalized === reviewPrefix ||\n normalized.startsWith(`${reviewPrefix}/`)\n ? '/'\n : normalized;\n\n return `${normalizedPath}${search}${hash}`;\n};\n\nexport const getTargetRouteKey = (\n value: string,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n const { path } = splitTarget(normalizeTarget(value, reviewPathPrefix));\n return path || '/';\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(\n `${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`,\n reviewPathPrefix\n ),\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 getFrameRouteTarget = (\n targetWindow: Window,\n reviewPathPrefix: string\n) => {\n return normalizeTarget(targetWindow.location.pathname, reviewPathPrefix);\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 url.searchParams.delete('panel');\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 url.searchParams.set('panel', 'qa');\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 getTargetRouteKey(item.routeKey, reviewPathPrefix);\n if (item.normalizedPath) {\n return getTargetRouteKey(item.normalizedPath, reviewPathPrefix);\n }\n\n try {\n return getTargetRouteKey(new URL(item.pageUrl).pathname, reviewPathPrefix);\n } catch {\n return '/';\n }\n};\n\nexport const getItemFrameTarget = (\n item: ReviewItem,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n const routeTarget = getItemTarget(item, reviewPathPrefix);\n const originalTarget = getItemUrlTarget(item.originalUrl, reviewPathPrefix);\n if (\n originalTarget &&\n getTargetRouteKey(originalTarget, reviewPathPrefix) === routeTarget\n ) {\n return originalTarget;\n }\n\n const pageTarget = getItemUrlTarget(item.pageUrl, reviewPathPrefix);\n if (\n pageTarget &&\n getTargetRouteKey(pageTarget, reviewPathPrefix) === routeTarget\n ) {\n return pageTarget;\n }\n\n return routeTarget;\n};\n\nfunction splitTarget(value: string) {\n const hashIndex = value.indexOf('#');\n const beforeHash = hashIndex >= 0 ? value.slice(0, hashIndex) : value;\n const hash = hashIndex >= 0 ? value.slice(hashIndex) : '';\n const searchIndex = beforeHash.indexOf('?');\n const path = searchIndex >= 0\n ? beforeHash.slice(0, searchIndex)\n : beforeHash;\n const search = searchIndex >= 0 ? beforeHash.slice(searchIndex) : '';\n\n return {\n hash,\n path: path || '/',\n search,\n };\n}\n\nfunction getItemUrlTarget(\n value: string | undefined,\n reviewPathPrefix: string\n) {\n if (!value) return null;\n if (typeof window === 'undefined') return null;\n\n try {\n const url = new URL(value, window.location.origin);\n if (url.origin !== window.location.origin) return null;\n return normalizeTarget(\n `${url.pathname}${url.search}${url.hash}`,\n reviewPathPrefix\n );\n } catch {\n return null;\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\nconst getFallbackPreset = (presets: ReviewShellViewportPreset[]) =>\n presets[0] ?? DEFAULT_REVIEW_VIEWPORT_PRESETS[0];\n\nconst 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 { X as XIcon } from 'lucide-react';\nimport { DfLogoIcon } from '../review/df.logo';\n\ninterface PromptModalProps {\n onClose: () => 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 = ({ onClose }: 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 df-review-about-dialog\">\n <button\n aria-label=\"Close help\"\n className=\"df-review-about-close\"\n type=\"button\"\n onClick={onClose}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n <div className=\"df-review-about-body\">\n <div className=\"df-review-about-intro\">\n <span className=\"df-review-about-logo\" aria-hidden=\"true\">\n <DfLogoIcon />\n </span>\n <strong>Review shell help</strong>\n <span>Program overview and setup notes</span>\n </div>\n {ABOUT_SECTIONS.map((section) => (\n <div className=\"df-review-about-item\" key={section.title}>\n <strong>{section.title}</strong>\n <p>{section.body}</p>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\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\nconst getItemAssigneeLabel = (item: ReviewItem) =>\n item.assigneeName || item.assigneeId || '(none)';\n\nconst formatPromptViewport = (item: ReviewItem) =>\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(\n item.viewport?.height ?? 0\n )}`;\n\nconst formatPromptPoint = (point: { x: number; y: number } | undefined) =>\n point ? `x=${Math.round(point.x)}, y=${Math.round(point.y)}` : '(none)';\n\nconst 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\nconst 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\nconst 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\nconst 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 `Title: ${item.title?.trim() || '(none)'}`,\n `Assignee: ${getItemAssigneeLabel(item)}`,\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 comment:',\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","import { Copy as CopyIcon, X as XIcon } from 'lucide-react';\nimport { getPromptLengthLabel } from './prompt';\n\ninterface InitialPromptModalProps {\n initialPromptText: string;\n copiedPromptKey: string | null;\n onClose: () => void;\n onCopyPrompt: (text: string, key: string) => void;\n}\n\nexport const InitialPromptModal = ({\n initialPromptText,\n copiedPromptKey,\n onClose,\n onCopyPrompt,\n}: InitialPromptModalProps) => {\n return (\n <div\n aria-label=\"Initial prompt\"\n aria-modal=\"true\"\n className=\"df-review-prompt-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close initial prompt\"\n className=\"df-review-prompt-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-prompt-dialog df-review-prompt-dialog-narrow\">\n <div className=\"df-review-prompt-header\">\n <div>\n <strong>Initial Prompt</strong>\n <span>AI handoff script for coding agents</span>\n </div>\n <button\n aria-label=\"Close initial prompt\"\n type=\"button\"\n onClick={onClose}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-prompt-body\">\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 QA handoff 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_QA_STATUS_FILTER_STORAGE_KEY,\n REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY,\n REVIEW_SOURCE_TREE_META_STORAGE_KEY,\n REVIEW_SIDE_PANEL_STORAGE_KEY,\n REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from './constants';\nimport type { ReviewQaStatusFilter } from './types';\n\nexport type StoredReviewSidePanel = 'qa' | 'source' | 'figma-images';\nexport interface StoredSourceTreeMetaVisibility {\n box: boolean;\n font: boolean;\n media: boolean;\n className: boolean;\n}\n\nconst DEFAULT_SOURCE_TREE_META_VISIBILITY: StoredSourceTreeMetaVisibility = {\n box: true,\n font: true,\n media: true,\n className: false,\n};\nconst REVIEW_QA_STATUS_FILTER_VALUES = new Set([\n 'all',\n 'todo',\n 'doing',\n 'review',\n 'hold',\n 'done',\n]);\n\nexport const normalizeReviewTheme = (value: string | null): ReviewShellTheme =>\n value === 'light' || value === 'system' || value === 'dark'\n ? value\n : DEFAULT_REVIEW_THEME;\n\nconst normalizeReviewSidePanel = (\n value: string | null\n): StoredReviewSidePanel | null => {\n if (value === 'qa' || value === 'source' || value === 'figma-images') {\n return value;\n }\n return null;\n};\n\nconst normalizeStoredReviewSidePanel = (\n value: string | null\n): StoredReviewSidePanel => normalizeReviewSidePanel(value) ?? 'qa';\n\nconst normalizeStoredReviewQaStatusFilter = (\n value: string | null\n): ReviewQaStatusFilter =>\n value && REVIEW_QA_STATUS_FILTER_VALUES.has(value)\n ? (value as ReviewQaStatusFilter)\n : 'all';\n\nconst normalizeStoredSourceTreeMetaVisibility = (\n value: unknown\n): StoredSourceTreeMetaVisibility => {\n if (!value || typeof value !== 'object') {\n return DEFAULT_SOURCE_TREE_META_VISIBILITY;\n }\n\n const metaVisibility = value as Partial<\n Record<keyof StoredSourceTreeMetaVisibility, unknown>\n >;\n\n return {\n box:\n typeof metaVisibility.box === 'boolean'\n ? metaVisibility.box\n : DEFAULT_SOURCE_TREE_META_VISIBILITY.box,\n font:\n typeof metaVisibility.font === 'boolean'\n ? metaVisibility.font\n : DEFAULT_SOURCE_TREE_META_VISIBILITY.font,\n media:\n typeof metaVisibility.media === 'boolean'\n ? metaVisibility.media\n : DEFAULT_SOURCE_TREE_META_VISIBILITY.media,\n className:\n typeof metaVisibility.className === 'boolean'\n ? metaVisibility.className\n : DEFAULT_SOURCE_TREE_META_VISIBILITY.className,\n };\n};\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 getStoredReviewSidePanel = () => {\n if (typeof window === 'undefined') return 'qa';\n\n try {\n return normalizeStoredReviewSidePanel(\n window.localStorage.getItem(REVIEW_SIDE_PANEL_STORAGE_KEY)\n );\n } catch {\n return 'qa';\n }\n};\n\nexport const getInitialReviewSidePanel = () => {\n if (typeof window === 'undefined') return null;\n\n try {\n return normalizeReviewSidePanel(\n new URLSearchParams(window.location.search).get('panel')\n );\n } catch {\n return null;\n }\n};\n\nexport const writeStoredReviewSidePanel = (\n sidePanel: StoredReviewSidePanel\n) => {\n if (typeof window === 'undefined') return;\n\n try {\n window.localStorage.setItem(\n REVIEW_SIDE_PANEL_STORAGE_KEY,\n normalizeStoredReviewSidePanel(sidePanel)\n );\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewSidePanelVisible = () => {\n if (typeof window === 'undefined') return true;\n\n try {\n const value = window.localStorage.getItem(\n REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY\n );\n return value === null ? true : value === 'true';\n } catch {\n return true;\n }\n};\n\nexport const writeStoredReviewSidePanelVisible = (isVisible: boolean) => {\n if (typeof window === 'undefined') return;\n\n try {\n window.localStorage.setItem(\n REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY,\n isVisible ? 'true' : 'false'\n );\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewQaStatusFilter = () => {\n if (typeof window === 'undefined') return 'all';\n\n try {\n return normalizeStoredReviewQaStatusFilter(\n window.localStorage.getItem(REVIEW_QA_STATUS_FILTER_STORAGE_KEY)\n );\n } catch {\n return 'all';\n }\n};\n\nexport const writeStoredReviewQaStatusFilter = (\n filter: ReviewQaStatusFilter\n) => {\n if (typeof window === 'undefined') return;\n\n try {\n const normalizedFilter = normalizeStoredReviewQaStatusFilter(filter);\n if (normalizedFilter === 'all') {\n window.localStorage.removeItem(REVIEW_QA_STATUS_FILTER_STORAGE_KEY);\n } else {\n window.localStorage.setItem(\n REVIEW_QA_STATUS_FILTER_STORAGE_KEY,\n normalizedFilter\n );\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredSourceTreeFilter = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return (\n window.localStorage.getItem(REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY) ?? ''\n );\n } catch {\n return '';\n }\n};\n\nexport const writeStoredSourceTreeFilter = (filter: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (filter) {\n window.localStorage.setItem(REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY, filter);\n } else {\n window.localStorage.removeItem(REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredSourceTreeMetaVisibility = () => {\n if (typeof window === 'undefined') return DEFAULT_SOURCE_TREE_META_VISIBILITY;\n\n try {\n const value = window.localStorage.getItem(\n REVIEW_SOURCE_TREE_META_STORAGE_KEY\n );\n if (!value) return DEFAULT_SOURCE_TREE_META_VISIBILITY;\n return normalizeStoredSourceTreeMetaVisibility(JSON.parse(value));\n } catch {\n return DEFAULT_SOURCE_TREE_META_VISIBILITY;\n }\n};\n\nexport const writeStoredSourceTreeMetaVisibility = (\n metaVisibility: StoredSourceTreeMetaVisibility\n) => {\n if (typeof window === 'undefined') return;\n\n try {\n window.localStorage.setItem(\n REVIEW_SOURCE_TREE_META_STORAGE_KEY,\n JSON.stringify(normalizeStoredSourceTreeMetaVisibility(metaVisibility))\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 Monitor as MonitorIcon,\n Moon as MoonIcon,\n Sun as SunIcon,\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\nconst getReviewThemeIcon = (theme: ReviewShellTheme) => {\n if (theme === 'light') return SunIcon;\n if (theme === 'system') return MonitorIcon;\n return MoonIcon;\n};\n\ninterface ReviewSettingsModalProps {\n figmaTokenDraft: string;\n reviewUserIdDraft: string;\n reviewThemeDraft: ReviewShellTheme;\n figmaSettingsStatus: string;\n isFigmaTokenVisible: boolean;\n isFigmaTokenGuideOpen: boolean;\n onClose: () => void;\n onFigmaTokenDraftChange: (value: string) => void;\n onReviewUserIdDraftChange: (value: string) => void;\n onReviewThemeDraftChange: (value: ReviewShellTheme) => void;\n onClearStatus: () => void;\n onToggleFigmaTokenVisible: () => void;\n onToggleFigmaTokenGuide: () => void;\n onSave: (\n figmaToken: string,\n reviewUserId: string,\n reviewTheme: ReviewShellTheme\n ) => void;\n}\n\nexport const ReviewSettingsModal = ({\n figmaTokenDraft,\n reviewUserIdDraft,\n reviewThemeDraft,\n figmaSettingsStatus,\n isFigmaTokenVisible,\n isFigmaTokenGuideOpen,\n onClose,\n onFigmaTokenDraftChange,\n onReviewUserIdDraftChange,\n onReviewThemeDraftChange,\n onClearStatus,\n onToggleFigmaTokenVisible,\n onToggleFigmaTokenGuide,\n onSave,\n}: ReviewSettingsModalProps) => {\n return (\n <div\n aria-label=\"Review settings\"\n aria-modal=\"true\"\n className=\"df-review-settings-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close settings\"\n className=\"df-review-settings-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <form\n className=\"df-review-settings-dialog\"\n onSubmit={(event) => {\n event.preventDefault();\n onSave(figmaTokenDraft, reviewUserIdDraft, reviewThemeDraft);\n }}\n >\n <div className=\"df-review-settings-header\">\n <div 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 const ThemeIcon = getReviewThemeIcon(option.value);\n\n return (\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(\n normalizeReviewTheme(option.value)\n );\n onClearStatus();\n }}\n >\n <ThemeIcon aria-hidden=\"true\" />\n <span>{option.label}</span>\n </button>\n );\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 {\n ChevronDown as ChevronDownIcon,\n ChevronRight as ChevronRightIcon,\n Search as SearchIcon,\n X as XIcon,\n} from 'lucide-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 getCountCellClassName = (\n status: 'todo' | 'review' | 'hold',\n count: number\n) =>\n [\n 'df-review-sitemap-cell',\n `is-${status}`,\n count === 0 ? 'is-zero' : '',\n ]\n .filter(Boolean)\n .join(' ');\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: 'page',\n direction: 'asc',\n });\n const [collapsedFolderHrefs, setCollapsedFolderHrefs] = useState<Set<string>>(\n () => new Set()\n );\n const [searchQuery, setSearchQuery] = useState('');\n const trimmedSearchQuery = searchQuery.trim();\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 collapsedFolderHrefs,\n searchQuery: trimmedSearchQuery,\n sortKey: sort.key,\n sortDirection: sort.direction,\n }\n );\n const matchingPageCount = sitemapRows.filter((row) => row.isPage).length;\n const gridStyle = {\n '--df-review-sitemap-grid-template': 'minmax(190px, 1fr) 58px 70px 56px minmax(96px, 140px)',\n } as CSSProperties;\n const sortHeaders: SortHeader[] = [\n { key: 'page', label: 'Path', className: 'is-page' },\n { key: 'todo', label: 'Todo' },\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 const toggleFolder = (href: string) => {\n setCollapsedFolderHrefs((currentHrefs) => {\n const nextHrefs = new Set(currentHrefs);\n if (nextHrefs.has(href)) {\n nextHrefs.delete(href);\n } else {\n nextHrefs.add(href);\n }\n return nextHrefs;\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.status.todo} todo ·{' '}\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-controls\">\n <label className=\"df-review-sitemap-search\">\n <SearchIcon aria-hidden=\"true\" />\n <input\n aria-label=\"Search sitemap\"\n autoComplete=\"off\"\n placeholder=\"Search pages\"\n type=\"search\"\n value={searchQuery}\n onChange={(event) => setSearchQuery(event.currentTarget.value)}\n />\n </label>\n {trimmedSearchQuery && (\n <button\n aria-label=\"Clear sitemap search\"\n className=\"df-review-sitemap-search-clear\"\n type=\"button\"\n onClick={() => setSearchQuery('')}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n <span className=\"df-review-sitemap-search-count\">\n {trimmedSearchQuery\n ? `${matchingPageCount} matches`\n : `${pages.length} pages`}\n </span>\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 selectRowPage = () => {\n if (row.isPage) onSelectPage(row.href);\n };\n const rowClassName = [\n 'df-review-sitemap-row',\n row.isPage ? 'is-page' : 'is-folder',\n row.isActive ? 'is-active' : '',\n row.isPage ? 'is-clickable' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const rowContent = (\n <SitemapRowContent\n depth={row.depth}\n hasChildren={row.hasChildren}\n isExpanded={row.isExpanded}\n isPage={row.isPage}\n label={row.label}\n qaCount={row.qaCount}\n users={row.users}\n onToggleFolder={() => toggleFolder(row.href)}\n />\n );\n\n return (\n <div\n key={row.href}\n aria-label={\n row.isPage\n ? `${row.href} / ${row.qaCount.status.todo} todo / ${row.qaCount.status.review} review / ${row.qaCount.status.hold} hold / ${row.users.length} online`\n : `${row.href} group / ${row.qaCount.status.todo} todo / ${row.qaCount.status.review} review / ${row.qaCount.status.hold} hold / ${row.users.length} online`\n }\n className={rowClassName}\n role={row.isPage ? 'button' : 'row'}\n tabIndex={row.isPage ? 0 : undefined}\n onClick={row.isPage ? selectRowPage : undefined}\n onKeyDown={\n row.isPage\n ? (event) => {\n if (event.currentTarget !== event.target) return;\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n selectRowPage();\n }\n : undefined\n }\n >\n {rowContent}\n </div>\n );\n })}\n {sitemapRows.length === 0 && (\n <div className=\"df-review-sitemap-empty\" role=\"status\">\n No matching pages\n </div>\n )}\n <button\n aria-label={`All QA / ${allQaCount.status.todo} todo / ${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 depth={0}\n hasChildren={false}\n isExpanded={false}\n isPage={false}\n label=\"All QA\"\n qaCount={allQaCount}\n users={allQaUsers}\n />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nconst SitemapRowContent = ({\n depth,\n hasChildren,\n isExpanded,\n isPage,\n label,\n qaCount,\n users,\n onToggleFolder,\n}: {\n depth: number;\n hasChildren: boolean;\n isExpanded: boolean;\n isPage: boolean;\n label: string;\n qaCount: SitemapQaCount;\n users: ReviewPresenceUser[];\n onToggleFolder?: () => void;\n}) => (\n <>\n <span\n className=\"df-review-sitemap-path\"\n style={{ '--df-review-sitemap-depth': depth } as CSSProperties}\n >\n {hasChildren ? (\n <button\n aria-expanded={isExpanded}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${label}`}\n className=\"df-review-sitemap-tree-toggle\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onToggleFolder?.();\n }}\n >\n {isExpanded ? (\n <ChevronDownIcon aria-hidden=\"true\" />\n ) : (\n <ChevronRightIcon aria-hidden=\"true\" />\n )}\n </button>\n ) : (\n <span className=\"df-review-sitemap-tree-spacer\" aria-hidden=\"true\" />\n )}\n {isPage ? (\n <span className=\"df-review-sitemap-page-label\">\n {label}\n </span>\n ) : (\n <span className=\"df-review-sitemap-label\">{label}</span>\n )}\n </span>\n <span className={getCountCellClassName('todo', qaCount.status.todo)}>\n <strong>{qaCount.status.todo}</strong>\n </span>\n <span className={getCountCellClassName('review', qaCount.status.review)}>\n {qaCount.status.review}\n </span>\n <span className={getCountCellClassName('hold', qaCount.status.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\ntype SitemapTreeRow = {\n href: string;\n label: string;\n depth: number;\n hasChildren: boolean;\n isExpanded: boolean;\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 | 'todo'\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 collapsedFolderHrefs?: ReadonlySet<string>;\n searchQuery?: string;\n sortKey?: SitemapSortKey;\n sortDirection?: SitemapSortDirection;\n } = {}\n) => {\n const collapsedFolderHrefs =\n options.collapsedFolderHrefs ?? new Set<string>();\n const searchQuery = normalizeSitemapSearchQuery(options.searchQuery);\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 === 'todo') return summary.count.status.todo;\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 const summaryMatchesSearch = (summary: SitemapTreeSummary): boolean => {\n if (!searchQuery) return true;\n if (sitemapNodeMatchesSearch(summary.node, searchQuery, getPageTarget)) {\n return true;\n }\n\n return summary.children.some(summaryMatchesSearch);\n };\n\n const rows: SitemapTreeRow[] = [];\n\n const appendSummaryRows = (\n summary: SitemapTreeSummary,\n depth: number\n ) => {\n const { node } = summary;\n const rowCount = node.isPage ? summary.directCount : summary.count;\n const rowUsers = node.isPage ? summary.directUsers : summary.users;\n const nodeMatchesSearch =\n Boolean(searchQuery) &&\n sitemapNodeMatchesSearch(node, searchQuery, getPageTarget);\n const visibleChildren = sortSummaries(\n summary.children.filter(\n (child) =>\n !searchQuery || nodeMatchesSearch || summaryMatchesSearch(child)\n )\n );\n const hasChildren = visibleChildren.length > 0;\n const isExpanded =\n hasChildren &&\n (Boolean(searchQuery) || !collapsedFolderHrefs.has(node.href));\n\n if (node.isPage || hasChildren || depth > 0) {\n const pageTarget = node.isPage ? getPageTarget(node.href) : null;\n\n rows.push({\n href: node.href,\n label: node.label,\n depth,\n hasChildren,\n isExpanded,\n isPage: node.isPage,\n isActive: pageTarget === activeRoute,\n qaCount: rowCount,\n users: rowUsers,\n });\n }\n\n if (!isExpanded) return;\n\n visibleChildren.forEach((child) => {\n appendSummaryRows(child, depth + 1);\n });\n };\n\n if (\n root.isPage &&\n (!searchQuery || sitemapNodeMatchesSearch(root, searchQuery, getPageTarget))\n ) {\n const directCount = getDirectCount(root);\n const directUsers = getDirectUsers(root);\n\n rows.push({\n href: root.href,\n label: root.label,\n depth: 0,\n hasChildren: false,\n isExpanded: false,\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())\n .map(createNodeSummary)\n .filter(summaryMatchesSearch)\n );\n\n rootSummaries.forEach((summary) => {\n appendSummaryRows(summary, 0);\n });\n\n return rows;\n};\n\nfunction normalizeSitemapSearchQuery(value: string | undefined) {\n return value?.trim().toLowerCase() ?? '';\n}\n\nfunction sitemapNodeMatchesSearch(\n node: SitemapTreeNode,\n searchQuery: string,\n getPageTarget: (href: string) => string\n) {\n return [\n node.href,\n node.label,\n normalizeSitemapHref(node.href),\n node.isPage ? getPageTarget(node.href) : '',\n ]\n .join(' ')\n .toLowerCase()\n .includes(searchQuery);\n}\n","import type { ReviewShellFigmaImagesOptions } from './types';\n\nexport type ReviewFigmaFrameConfig = {\n desktopNodeId?: string;\n mobileNodeId?: string;\n};\n\ntype ReviewFigmaWindow = Window & {\n __figma?: ReviewFigmaFrameConfig;\n};\n\nexport function getReviewFigmaImageStore(\n options: ReviewShellFigmaImagesOptions | null | undefined\n) {\n if (!options || options.enabled === false) return null;\n return options.store ?? null;\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\nfunction normalizeFigmaNodeValue(value: unknown) {\n return typeof value === 'string' ? value.trim() || undefined : undefined;\n}\n","export function FigmaMarkIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"df-review-figma-mark-icon\"\n viewBox=\"0 0 24 24\"\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}\n\nexport function FigmaRailIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"df-review-figma-rail-icon\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 8H8.5a3 3 0 1 1 0-6H12v6Z\" />\n <path d=\"M12 14H8.5a3 3 0 1 1 0-6H12v6Z\" />\n <path d=\"M12 17.5A3.5 3.5 0 1 1 8.5 14H12v3.5Z\" />\n <path d=\"M12 2h3.5a3 3 0 1 1 0 6H12V2Z\" />\n <circle cx=\"15.5\" cy=\"11\" r=\"3\" />\n </svg>\n );\n}\n","import {\n type CSSProperties,\n type MouseEvent,\n type PointerEvent,\n useRef,\n useState,\n} from 'react';\nimport {\n ExternalLink as ExternalLinkIcon,\n MoveVertical as OffsetYIcon,\n Pencil as PencilIcon,\n Plus as PlusIcon,\n RefreshCw as RefreshCwIcon,\n Trash2 as TrashIcon,\n X as XIcon,\n} from 'lucide-react';\nimport type { ReviewFigmaImage } from '../../figma/image.types';\nimport type {\n ReviewFigmaImageOverlayItemState,\n} from './image.overlay.controller';\nimport {\n DEFAULT_FIGMA_IMAGE_LAYER_STATE,\n formatFigmaImageDate,\n getFigmaImageLabel,\n getFigmaImageLayerStatusLabel,\n getPointerFigmaImageTargetId,\n getReorderedFigmaImageIds,\n getSnappedOpacityPercent,\n isInteractiveFigmaImageTarget,\n} from './image-panel.utils';\nimport { FigmaImageLayerStateButtons } from './layer-state-buttons';\nimport { ReviewSpinner } from '../review/spinner';\n\nconst FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS = 6;\n\ninterface FigmaImagesPanelProps {\n error: string;\n images: ReviewFigmaImage[];\n imageOverlayStates: Record<string, ReviewFigmaImageOverlayItemState>;\n isListVisible: boolean;\n isLoading: boolean;\n isMutating: boolean;\n selectedImageId: string | null;\n onAddImage: (\n figmaUrl: string,\n label?: string\n ) => Promise<ReviewFigmaImage | null>;\n onDeleteImage: (id: string) => Promise<void>;\n onRefreshImages: () => Promise<ReviewFigmaImage[]>;\n onReorderImages: (imageIds: string[]) => Promise<void>;\n onSelectImage: (id: string) => void;\n onSetImageOverlayOffsetY: (id: string, offsetY: number) => void;\n onSetImageOverlayOpacity: (id: string, opacity: number) => void;\n onToggleImageOverlayLocked: (id: string) => void;\n onToggleImageOverlayMode: (id: string) => void;\n onToggleImageOverlayVisible: (id: string) => void;\n onUpdateImage: (\n id: string,\n patch: { label?: string }\n ) => Promise<ReviewFigmaImage | null>;\n}\n\nexport const FigmaImagesPanel = ({\n error,\n images,\n imageOverlayStates,\n isListVisible,\n isLoading,\n isMutating,\n selectedImageId,\n onAddImage,\n onDeleteImage,\n onRefreshImages,\n onReorderImages,\n onSelectImage,\n onSetImageOverlayOffsetY,\n onSetImageOverlayOpacity,\n onToggleImageOverlayLocked,\n onToggleImageOverlayMode,\n onToggleImageOverlayVisible,\n onUpdateImage,\n}: FigmaImagesPanelProps) => {\n const [figmaUrlDraft, setFigmaUrlDraft] = useState('');\n const [editingImageId, setEditingImageId] = useState<string | null>(null);\n const [editingLabelDraft, setEditingLabelDraft] = useState('');\n const [draggingImageId, setDraggingImageId] = useState<string | null>(null);\n const [dragOverImageId, setDragOverImageId] = useState<string | null>(null);\n const [previewImageId, setPreviewImageId] = useState<string | null>(null);\n const pointerDragImageIdRef = useRef<string | null>(null);\n const pointerDragTargetIdRef = useRef<string | null>(null);\n const pointerDragStartRef = useRef<{ x: number; y: number } | null>(null);\n const pointerDragDidMoveRef = useRef(false);\n const opacityDragPointerIdRef = useRef<number | null>(null);\n const labelEditCancelRef = useRef(false);\n const labelInputFocusedImageIdRef = useRef<string | null>(null);\n const labelEditFinishedImageIdRef = useRef<string | null>(null);\n const [offsetYDraftByImageId, setOffsetYDraftByImageId] = useState<\n Record<string, string>\n >({});\n const selectedImageIndex = selectedImageId\n ? images.findIndex((image) => image.id === selectedImageId)\n : -1;\n const selectedImage =\n selectedImageIndex >= 0 ? images[selectedImageIndex] : null;\n const previewImage = previewImageId\n ? images.find((image) => image.id === previewImageId) ?? null\n : null;\n const selectedImageLabel = selectedImage\n ? getFigmaImageLabel(selectedImage, selectedImageIndex)\n : 'Select layer';\n const selectedOverlayState = selectedImage\n ? imageOverlayStates[selectedImage.id] ?? DEFAULT_FIGMA_IMAGE_LAYER_STATE\n : DEFAULT_FIGMA_IMAGE_LAYER_STATE;\n const selectedOpacityPercent = selectedImage\n ? getSnappedOpacityPercent(selectedOverlayState.opacity)\n : 0;\n const selectedOpacityThumbOffset =\n FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS *\n (1 - (selectedOpacityPercent / 100) * 2);\n const selectedOffsetYDraft = selectedImage\n ? offsetYDraftByImageId[selectedImage.id] ??\n String(selectedOverlayState.offsetY)\n : '';\n const statusText = error\n ? error\n : '';\n const progressText = isMutating ? 'Saving...' : isLoading ? 'Loading...' : '';\n const draggingImageIndex = draggingImageId\n ? images.findIndex((image) => image.id === draggingImageId)\n : -1;\n const finishEditingImageLabel = (\n imageId: string,\n currentLabel: string\n ) => {\n if (labelEditFinishedImageIdRef.current === imageId) return;\n\n labelEditFinishedImageIdRef.current = imageId;\n labelInputFocusedImageIdRef.current = null;\n const nextLabel = editingLabelDraft;\n setEditingImageId(null);\n setEditingLabelDraft('');\n if (nextLabel === currentLabel) return;\n\n void onUpdateImage(imageId, {\n label: nextLabel,\n });\n };\n const updateSelectedImageOpacity = (value: string) => {\n if (!selectedImage) return;\n const opacityPercent = Math.max(\n 0,\n Math.min(100, Math.round(Number(value) / 10) * 10)\n );\n if (Number.isFinite(opacityPercent)) {\n onSetImageOverlayOpacity(selectedImage.id, opacityPercent / 100);\n }\n };\n const updateSelectedImageOpacityFromClientX = (\n clientX: number,\n sliderElement: HTMLDivElement\n ) => {\n if (!selectedImage) return;\n\n const rect = sliderElement.getBoundingClientRect();\n if (rect.width <= 0) return;\n\n const trackStart = rect.left + FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS;\n const trackWidth = Math.max(\n 1,\n rect.width - FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS * 2\n );\n const endpointInset = FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS * 2;\n const rawPercent = ((clientX - trackStart) / trackWidth) * 100;\n let opacityPercent = Math.max(\n 0,\n Math.min(100, Math.round(rawPercent / 10) * 10)\n );\n if (clientX <= rect.left + endpointInset) {\n opacityPercent = 0;\n } else if (clientX >= rect.right - endpointInset) {\n opacityPercent = 100;\n }\n onSetImageOverlayOpacity(selectedImage.id, opacityPercent / 100);\n };\n const updateSelectedImageOpacityFromPointer = (\n event: PointerEvent<HTMLDivElement>\n ) => {\n updateSelectedImageOpacityFromClientX(event.clientX, event.currentTarget);\n };\n const updateSelectedImageOpacityFromMouse = (\n event: MouseEvent<HTMLDivElement>\n ) => {\n updateSelectedImageOpacityFromClientX(event.clientX, event.currentTarget);\n };\n\n return (\n <aside\n className=\"df-review-figma-images-panel\"\n aria-hidden={!isListVisible}\n onPointerDownCapture={(event) => {\n if (\n !editingImageId ||\n (event.target instanceof Element &&\n event.target.closest('.df-review-figma-image-label-input'))\n ) {\n return;\n }\n\n const editingImage = images.find((image) => image.id === editingImageId);\n if (!editingImage) return;\n finishEditingImageLabel(editingImage.id, editingImage.label ?? '');\n }}\n >\n <form\n className=\"df-review-figma-image-form\"\n onSubmit={(event) => {\n event.preventDefault();\n void onAddImage(figmaUrlDraft).then((image) => {\n if (!image) return;\n setFigmaUrlDraft('');\n });\n }}\n >\n <div className=\"df-review-figma-images-header\">\n <div className=\"df-review-figma-images-title\">\n <strong>Figma</strong>\n </div>\n <button\n aria-label=\"Refresh Figma images\"\n className=\"df-review-figma-image-header-button\"\n disabled={isLoading || isMutating}\n title=\"Refresh\"\n type=\"button\"\n onClick={() => void onRefreshImages()}\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-figma-image-url-row\">\n <input\n aria-label=\"Figma URL\"\n autoComplete=\"off\"\n placeholder=\"Figma URL\"\n required\n spellCheck={false}\n value={figmaUrlDraft}\n onChange={(event) => setFigmaUrlDraft(event.currentTarget.value)}\n />\n <button\n aria-label=\"Add Figma image\"\n disabled={isMutating || figmaUrlDraft.trim().length === 0}\n type=\"submit\"\n >\n <PlusIcon aria-hidden=\"true\" />\n </button>\n </div>\n </form>\n\n <div\n aria-label=\"Selected Figma image layer controls\"\n className=\"df-review-figma-image-selected-controls\"\n >\n <div className=\"df-review-figma-image-selected-numbers\">\n <label className=\"df-review-figma-image-opacity-control\">\n <span>Opacity</span>\n <div\n className=\"df-review-figma-image-opacity-slider\"\n style={{\n '--df-review-figma-opacity-value': `${selectedOpacityPercent}%`,\n '--df-review-figma-opacity-left': `calc(${selectedOpacityPercent}% + ${selectedOpacityThumbOffset}px)`,\n } as CSSProperties}\n onPointerCancel={() => {\n opacityDragPointerIdRef.current = null;\n }}\n onPointerDown={(event) => {\n if (!selectedImage) return;\n\n opacityDragPointerIdRef.current = event.pointerId;\n event.currentTarget.setPointerCapture(event.pointerId);\n event.currentTarget.querySelector('input')?.focus();\n updateSelectedImageOpacityFromPointer(event);\n }}\n onPointerMove={(event) => {\n if (opacityDragPointerIdRef.current !== event.pointerId) return;\n\n updateSelectedImageOpacityFromPointer(event);\n }}\n onPointerUp={(event) => {\n if (opacityDragPointerIdRef.current !== event.pointerId) return;\n\n updateSelectedImageOpacityFromPointer(event);\n opacityDragPointerIdRef.current = null;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n }}\n onMouseDown={updateSelectedImageOpacityFromMouse}\n onMouseMove={(event) => {\n if (event.buttons !== 1) return;\n\n updateSelectedImageOpacityFromMouse(event);\n }}\n onMouseUp={updateSelectedImageOpacityFromMouse}\n onClick={updateSelectedImageOpacityFromMouse}\n >\n <input\n aria-label={`${selectedImageLabel} overlay opacity`}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={selectedOpacityPercent}\n disabled={!selectedImage}\n max=\"100\"\n min=\"0\"\n step=\"10\"\n type=\"range\"\n value={selectedOpacityPercent}\n onChange={(event) =>\n updateSelectedImageOpacity(event.currentTarget.value)\n }\n onInput={(event) =>\n updateSelectedImageOpacity(event.currentTarget.value)\n }\n />\n </div>\n <strong>{selectedOpacityPercent}</strong>\n </label>\n <label className=\"df-review-figma-image-number-control\">\n <OffsetYIcon aria-hidden=\"true\" />\n <input\n aria-label={`${selectedImageLabel} overlay Y offset`}\n disabled={!selectedImage}\n inputMode=\"numeric\"\n step=\"1\"\n type=\"number\"\n value={selectedOffsetYDraft}\n onBlur={() => {\n if (!selectedImage) return;\n setOffsetYDraftByImageId((currentDrafts) => {\n const nextDrafts = { ...currentDrafts };\n delete nextDrafts[selectedImage.id];\n return nextDrafts;\n });\n }}\n onChange={(event) => {\n if (!selectedImage) return;\n const value = event.currentTarget.value;\n const offsetY = Number(value);\n setOffsetYDraftByImageId((currentDrafts) => ({\n ...currentDrafts,\n [selectedImage.id]: value,\n }));\n if (value.trim() !== '' && Number.isFinite(offsetY)) {\n onSetImageOverlayOffsetY(selectedImage.id, offsetY);\n }\n }}\n />\n </label>\n {selectedImage ? (\n <button\n aria-label={`Preview ${selectedImageLabel} Figma image`}\n className=\"df-review-figma-image-selected-link\"\n title=\"Preview Figma image\"\n type=\"button\"\n onClick={() => setPreviewImageId(selectedImage.id)}\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </button>\n ) : (\n <button\n aria-label=\"Open Figma node\"\n className=\"df-review-figma-image-selected-link\"\n disabled\n title=\"Open Figma node\"\n type=\"button\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n\n {statusText && (\n <p\n className={`df-review-figma-image-status${\n error ? ' is-error' : ''\n }`}\n >\n {statusText}\n </p>\n )}\n\n <div className=\"df-review-figma-image-list\">\n {progressText && (\n <div\n aria-live=\"polite\"\n className=\"df-review-figma-image-card is-status\"\n role=\"status\"\n >\n <ReviewSpinner className=\"df-review-figma-image-spinner\" />\n <div className=\"df-review-figma-image-card-main\">\n <strong>{progressText}</strong>\n </div>\n </div>\n )}\n {images.length === 0 && !isLoading && !isMutating && (\n <p className=\"df-review-empty\">No Figma images on this viewport.</p>\n )}\n {images.map((image, index) => {\n const imageLabel = getFigmaImageLabel(image, index);\n const overlayState =\n imageOverlayStates[image.id] ?? DEFAULT_FIGMA_IMAGE_LAYER_STATE;\n const isDragging = draggingImageId === image.id;\n const isDropTarget =\n dragOverImageId === image.id && draggingImageId !== image.id;\n const isDropBefore = isDropTarget && draggingImageIndex > index;\n const isDropAfter =\n isDropTarget && draggingImageIndex >= 0 && draggingImageIndex < index;\n\n return (\n <article\n data-figma-image-id={image.id}\n className={`df-review-figma-image-card${\n image.id === selectedImageId ? ' is-active' : ''\n }${editingImageId === image.id ? ' is-editing' : ''}${\n isDragging ? ' is-dragging' : ''\n }${isDropTarget ? ' is-drop-target' : ''}${\n isDropBefore ? ' is-drop-before' : ''\n }${isDropAfter ? ' is-drop-after' : ''}`}\n key={image.id}\n onClick={() => {\n if (pointerDragDidMoveRef.current) {\n pointerDragDidMoveRef.current = false;\n return;\n }\n onSelectImage(image.id);\n }}\n onPointerCancel={() => {\n pointerDragImageIdRef.current = null;\n pointerDragTargetIdRef.current = null;\n pointerDragStartRef.current = null;\n setDraggingImageId(null);\n setDragOverImageId(null);\n }}\n onPointerDown={(event: PointerEvent<HTMLElement>) => {\n if (\n event.button !== 0 ||\n isMutating ||\n editingImageId === image.id ||\n isInteractiveFigmaImageTarget(event.target)\n ) {\n return;\n }\n\n pointerDragImageIdRef.current = image.id;\n pointerDragTargetIdRef.current = null;\n pointerDragStartRef.current = {\n x: event.clientX,\n y: event.clientY,\n };\n pointerDragDidMoveRef.current = false;\n event.currentTarget.setPointerCapture(event.pointerId);\n }}\n onPointerMove={(event) => {\n const sourceImageId = pointerDragImageIdRef.current;\n const dragStart = pointerDragStartRef.current;\n if (!sourceImageId || !dragStart) return;\n\n const hasMoved =\n Math.abs(event.clientX - dragStart.x) +\n Math.abs(event.clientY - dragStart.y) >\n 6;\n if (!hasMoved) return;\n\n pointerDragDidMoveRef.current = true;\n setDraggingImageId(sourceImageId);\n const targetImageId = getPointerFigmaImageTargetId(event);\n pointerDragTargetIdRef.current =\n targetImageId && targetImageId !== sourceImageId\n ? targetImageId\n : null;\n setDragOverImageId(pointerDragTargetIdRef.current);\n }}\n onPointerUp={(event) => {\n const sourceImageId = pointerDragImageIdRef.current;\n const targetImageId = pointerDragTargetIdRef.current;\n pointerDragImageIdRef.current = null;\n pointerDragTargetIdRef.current = null;\n pointerDragStartRef.current = null;\n setDraggingImageId(null);\n setDragOverImageId(null);\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n if (\n !sourceImageId ||\n !targetImageId ||\n sourceImageId === targetImageId\n ) {\n return;\n }\n\n const nextImageIds = getReorderedFigmaImageIds(\n images,\n sourceImageId,\n targetImageId\n );\n void onReorderImages(nextImageIds);\n }}\n >\n <FigmaImageLayerStateButtons\n imageLabel={imageLabel}\n overlayState={overlayState}\n title={getFigmaImageLayerStatusLabel(overlayState)}\n onSelect={() => onSelectImage(image.id)}\n onToggleLocked={() => onToggleImageOverlayLocked(image.id)}\n onToggleMode={() => onToggleImageOverlayMode(image.id)}\n onToggleVisible={() => onToggleImageOverlayVisible(image.id)}\n />\n <div className=\"df-review-figma-image-card-main\">\n {editingImageId === image.id ? (\n <input\n aria-label=\"Selected Figma image label\"\n autoComplete=\"off\"\n autoFocus\n className=\"df-review-figma-image-label-input\"\n disabled={isMutating}\n placeholder=\"Label\"\n ref={(element) => {\n if (\n !element ||\n labelInputFocusedImageIdRef.current === image.id\n ) {\n return;\n }\n\n labelInputFocusedImageIdRef.current = image.id;\n element.focus();\n element.select();\n }}\n spellCheck={false}\n value={editingLabelDraft}\n onBlur={() => {\n if (labelEditCancelRef.current) {\n labelEditCancelRef.current = false;\n labelInputFocusedImageIdRef.current = null;\n labelEditFinishedImageIdRef.current = image.id;\n setEditingImageId(null);\n setEditingLabelDraft('');\n return;\n }\n\n finishEditingImageLabel(image.id, image.label ?? '');\n }}\n onChange={(event) =>\n setEditingLabelDraft(event.currentTarget.value)\n }\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.currentTarget.blur();\n return;\n }\n\n if (event.key === 'Escape') {\n labelEditCancelRef.current = true;\n event.currentTarget.blur();\n }\n }}\n />\n ) : (\n <strong>{imageLabel}</strong>\n )}\n <small>{formatFigmaImageDate(image.updatedAt)}</small>\n </div>\n <div className=\"df-review-figma-image-card-actions\">\n <button\n aria-label={`Edit ${imageLabel} label`}\n className=\"df-review-figma-image-icon-button\"\n disabled={isMutating}\n title=\"Edit label\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onSelectImage(image.id);\n labelEditCancelRef.current = false;\n labelInputFocusedImageIdRef.current = null;\n labelEditFinishedImageIdRef.current = null;\n setEditingImageId(image.id);\n setEditingLabelDraft(image.label ?? '');\n }}\n >\n <PencilIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Delete Figma image\"\n className=\"df-review-figma-image-icon-button is-danger\"\n disabled={isMutating}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n void onDeleteImage(image.id);\n }}\n >\n <TrashIcon aria-hidden=\"true\" />\n </button>\n </div>\n </article>\n );\n })}\n </div>\n {previewImage && (\n <FigmaImagePreviewModal\n image={previewImage}\n label={getFigmaImageLabel(previewImage, images.indexOf(previewImage))}\n onClose={() => setPreviewImageId(null)}\n />\n )}\n </aside>\n );\n};\n\ninterface FigmaImagePreviewModalProps {\n image: ReviewFigmaImage;\n label: string;\n onClose: () => void;\n}\n\nconst FigmaImagePreviewModal = ({\n image,\n label,\n onClose,\n}: FigmaImagePreviewModalProps) => {\n return (\n <div\n aria-label={`${label} Figma image preview`}\n aria-modal=\"true\"\n className=\"df-review-prompt-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close Figma image preview\"\n className=\"df-review-prompt-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-prompt-dialog df-review-figma-image-preview-dialog\">\n <div className=\"df-review-figma-image-preview-header\">\n <input\n aria-label=\"Figma URL\"\n readOnly\n spellCheck={false}\n value={image.figmaUrl}\n />\n <a\n aria-label={`Open ${label} Figma node`}\n className=\"df-review-figma-image-preview-link\"\n href={image.figmaUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span>Open Figma</span>\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n <button\n aria-label=\"Close Figma image preview\"\n className=\"df-review-figma-image-preview-close\"\n type=\"button\"\n onClick={onClose}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-figma-image-preview-scroll\">\n <img alt={label} src={image.imageUrl} />\n </div>\n </div>\n </div>\n );\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type {\n ReviewFigmaImage,\n ReviewFigmaRouteTarget,\n} from '../../figma/image.types';\nimport { createReviewFigmaImageTargetKey } from './image.controller';\n\nexport const DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY = 0.48;\nconst REVIEW_FIGMA_IMAGE_OVERLAY_STORAGE_KEY_PREFIX =\n 'df-review-figma-image-overlay-state:';\nconst REVIEW_FIGMA_IMAGE_OVERLAY_STORAGE_VERSION = 2;\nconst DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_MODE = 'normal';\n\nexport type ReviewFigmaImageOverlayMode = 'normal' | 'invert';\n\nexport type ReviewFigmaImageOverlayItemState = {\n isVisible: boolean;\n opacity: number;\n isLocked: boolean;\n mode: ReviewFigmaImageOverlayMode;\n offsetY: number;\n};\n\nexport type ReviewFigmaImageOverlayState = {\n selectedImageId: string | null;\n imageStates: Record<string, ReviewFigmaImageOverlayItemState>;\n lastVisibleImageIds: string[];\n};\n\ntype StoredReviewFigmaImageOverlayState = Partial<\n ReviewFigmaImageOverlayState & ReviewFigmaImageOverlayItemState\n> & {\n version?: number;\n};\n\ninterface UseReviewFigmaImageOverlayControllerOptions {\n images: ReviewFigmaImage[];\n isLoading: boolean;\n target: ReviewFigmaRouteTarget;\n}\n\ntype ReviewFigmaImageOverlayStateContainer = {\n state: ReviewFigmaImageOverlayState;\n storageKey: string;\n};\n\nexport const useReviewFigmaImageOverlayController = ({\n images,\n isLoading,\n target,\n}: UseReviewFigmaImageOverlayControllerOptions) => {\n const storageKey = useMemo(\n () => createReviewFigmaImageOverlayStorageKey(target),\n [target]\n );\n const [stateContainer, setStateContainer] =\n useState<ReviewFigmaImageOverlayStateContainer>(() => ({\n state: readStoredReviewFigmaImageOverlayState(storageKey),\n storageKey,\n }));\n const state =\n stateContainer.storageKey === storageKey\n ? stateContainer.state\n : DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n const updateState = useCallback(\n (\n updater: (\n currentState: ReviewFigmaImageOverlayState\n ) => ReviewFigmaImageOverlayState\n ) => {\n setStateContainer((currentContainer) => {\n const currentState =\n currentContainer.storageKey === storageKey\n ? currentContainer.state\n : readStoredReviewFigmaImageOverlayState(storageKey);\n\n return {\n state: updater(currentState),\n storageKey,\n };\n });\n },\n [storageKey]\n );\n\n useEffect(() => {\n setStateContainer({\n state: readStoredReviewFigmaImageOverlayState(storageKey),\n storageKey,\n });\n }, [storageKey]);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleStorage = (event: StorageEvent) => {\n if (\n event.storageArea !== window.localStorage ||\n (event.key !== storageKey && event.key !== null)\n ) {\n return;\n }\n\n setStateContainer({\n state: readStoredReviewFigmaImageOverlayState(storageKey),\n storageKey,\n });\n };\n\n window.addEventListener('storage', handleStorage);\n return () => window.removeEventListener('storage', handleStorage);\n }, [storageKey]);\n\n useEffect(() => {\n if (isLoading) return;\n\n updateState((currentState) => {\n const nextImageIds = new Set(images.map((image) => image.id));\n const selectedImageId =\n currentState.selectedImageId &&\n nextImageIds.has(currentState.selectedImageId)\n ? currentState.selectedImageId\n : images[0]?.id ?? null;\n const imageStates = Object.fromEntries(\n Object.entries(currentState.imageStates).filter(([imageId]) =>\n nextImageIds.has(imageId)\n )\n );\n const lastVisibleImageIds = currentState.lastVisibleImageIds.filter(\n (imageId) => nextImageIds.has(imageId)\n );\n\n if (\n selectedImageId === currentState.selectedImageId &&\n imageStates === currentState.imageStates &&\n lastVisibleImageIds.length === currentState.lastVisibleImageIds.length\n ) {\n return currentState;\n }\n\n return {\n ...currentState,\n selectedImageId,\n imageStates,\n lastVisibleImageIds,\n };\n });\n }, [images, isLoading, updateState]);\n\n useEffect(() => {\n if (stateContainer.storageKey !== storageKey) return;\n writeStoredReviewFigmaImageOverlayState(storageKey, stateContainer.state);\n }, [stateContainer, storageKey]);\n\n const selectedImage = useMemo(\n () => images.find((image) => image.id === state.selectedImageId) ?? null,\n [images, state.selectedImageId]\n );\n const selectedImageOverlayState = getReviewFigmaImageOverlayItemState(\n state,\n state.selectedImageId\n );\n const imageOverlayStates = useMemo(\n () =>\n Object.fromEntries(\n images.map((image) => [\n image.id,\n getReviewFigmaImageOverlayItemState(state, image.id),\n ])\n ),\n [images, state]\n );\n const isAnyImageOverlayVisible = useMemo(\n () =>\n images.some(\n (image) => imageOverlayStates[image.id]?.isVisible === true\n ),\n [imageOverlayStates, images]\n );\n\n const setSelectedImageId = useCallback((selectedImageId: string | null) => {\n updateState((currentState) => ({\n ...currentState,\n selectedImageId,\n }));\n }, [updateState]);\n\n const updateImageOverlayState = useCallback(\n (\n imageId: string,\n updater: (\n itemState: ReviewFigmaImageOverlayItemState\n ) => ReviewFigmaImageOverlayItemState\n ) => {\n updateState((currentState) => ({\n ...currentState,\n selectedImageId: imageId,\n imageStates: updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n imageId,\n updater\n ),\n }));\n },\n [updateState]\n );\n\n const showImage = useCallback((selectedImageId: string) => {\n updateState((currentState) => ({\n ...currentState,\n selectedImageId,\n imageStates: updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n selectedImageId,\n (itemState) => ({\n ...itemState,\n isVisible: true,\n })\n ),\n }));\n }, [updateState]);\n\n const toggleImageOverlayVisible = useCallback(\n (imageId: string) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n isVisible: !itemState.isVisible,\n }));\n },\n [updateImageOverlayState]\n );\n\n const toggleAllImageOverlayVisible = useCallback(() => {\n updateState((currentState) => {\n if (images.length === 0) return currentState;\n\n const imageIds = images.map((image) => image.id);\n const imageIdSet = new Set(imageIds);\n const visibleImageIds = imageIds.filter(\n (imageId) =>\n getReviewFigmaImageOverlayItemState(currentState, imageId).isVisible\n );\n let imageStates = currentState.imageStates;\n\n if (visibleImageIds.length > 0) {\n imageIds.forEach((imageId) => {\n imageStates = updateReviewFigmaImageOverlayItemState(\n imageStates,\n imageId,\n (itemState) => ({\n ...itemState,\n isVisible: false,\n })\n );\n });\n\n return {\n ...currentState,\n imageStates,\n lastVisibleImageIds: visibleImageIds,\n };\n }\n\n const restoreImageIds = currentState.lastVisibleImageIds.filter(\n (imageId) => imageIdSet.has(imageId)\n );\n const fallbackImageId =\n currentState.selectedImageId && imageIdSet.has(currentState.selectedImageId)\n ? currentState.selectedImageId\n : images[0]?.id ?? null;\n const nextVisibleImageIds =\n restoreImageIds.length > 0\n ? restoreImageIds\n : fallbackImageId\n ? [fallbackImageId]\n : [];\n const nextVisibleImageIdSet = new Set(nextVisibleImageIds);\n\n imageIds.forEach((imageId) => {\n imageStates = updateReviewFigmaImageOverlayItemState(\n imageStates,\n imageId,\n (itemState) => ({\n ...itemState,\n isVisible: nextVisibleImageIdSet.has(imageId),\n })\n );\n });\n\n return {\n ...currentState,\n selectedImageId:\n currentState.selectedImageId ?? nextVisibleImageIds[0] ?? null,\n imageStates,\n lastVisibleImageIds: nextVisibleImageIds,\n };\n });\n }, [images, updateState]);\n\n const setImageOverlayOpacity = useCallback(\n (imageId: string, opacity: number) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n opacity: clampReviewFigmaImageOverlayOpacity(opacity),\n }));\n },\n [updateImageOverlayState]\n );\n\n const toggleImageOverlayLocked = useCallback(\n (imageId: string) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n isLocked: !itemState.isLocked,\n }));\n },\n [updateImageOverlayState]\n );\n\n const toggleImageOverlayMode = useCallback(\n (imageId: string) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n mode: itemState.mode === 'invert' ? 'normal' : 'invert',\n }));\n },\n [updateImageOverlayState]\n );\n\n const setImageOverlayOffsetY = useCallback(\n (imageId: string, offsetY: number) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n offsetY: normalizeReviewFigmaImageOverlayOffsetY(offsetY),\n }));\n },\n [updateImageOverlayState]\n );\n\n const toggleOverlayVisible = useCallback(() => {\n updateState((currentState) => {\n if (!currentState.selectedImageId && images[0]) {\n return {\n ...currentState,\n selectedImageId: images[0].id,\n imageStates: updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n images[0].id,\n (itemState) => ({\n ...itemState,\n isVisible: true,\n })\n ),\n };\n }\n\n if (!currentState.selectedImageId) return currentState;\n\n return {\n ...currentState,\n imageStates: updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n currentState.selectedImageId,\n (itemState) => ({\n ...itemState,\n isVisible: !itemState.isVisible,\n })\n ),\n };\n });\n }, [images, updateState]);\n\n const setOverlayOpacity = useCallback((opacity: number) => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n opacity: clampReviewFigmaImageOverlayOpacity(opacity),\n })\n ),\n }));\n }, [updateState]);\n\n const setOverlayLocked = useCallback((isLocked: boolean) => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n isLocked,\n })\n ),\n }));\n }, [updateState]);\n\n const toggleOverlayLocked = useCallback(() => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n isLocked: !itemState.isLocked,\n })\n ),\n }));\n }, [updateState]);\n\n const setOverlayMode = useCallback((mode: ReviewFigmaImageOverlayMode) => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n mode: normalizeReviewFigmaImageOverlayMode(mode),\n })\n ),\n }));\n }, [updateState]);\n\n const toggleOverlayMode = useCallback(() => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n mode: itemState.mode === 'invert' ? 'normal' : 'invert',\n })\n ),\n }));\n }, [updateState]);\n\n const setOverlayOffsetY = useCallback((offsetY: number) => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n offsetY: normalizeReviewFigmaImageOverlayOffsetY(offsetY),\n })\n ),\n }));\n }, [updateState]);\n\n const resetOverlay = useCallback(() => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: currentState.selectedImageId\n ? updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n currentState.selectedImageId,\n () => DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE\n )\n : currentState.imageStates,\n }));\n }, [updateState]);\n\n return {\n imageOverlayStates,\n isAnyImageOverlayVisible,\n isOverlayVisible: selectedImageOverlayState.isVisible,\n overlayMode: selectedImageOverlayState.mode,\n overlayOffsetY: selectedImageOverlayState.offsetY,\n overlayOpacity: selectedImageOverlayState.opacity,\n isOverlayLocked: selectedImageOverlayState.isLocked,\n resetOverlay,\n selectedImage,\n selectedImageId: state.selectedImageId,\n setOverlayLocked,\n setOverlayMode,\n setOverlayOffsetY,\n setOverlayOpacity,\n setSelectedImageId,\n showImage,\n state,\n target,\n toggleImageOverlayLocked,\n toggleImageOverlayMode,\n toggleImageOverlayVisible,\n toggleAllImageOverlayVisible,\n setImageOverlayOffsetY,\n setImageOverlayOpacity,\n toggleOverlayLocked,\n toggleOverlayMode,\n toggleOverlayVisible,\n };\n};\n\nfunction createReviewFigmaImageOverlayStorageKey(\n target: ReviewFigmaRouteTarget\n) {\n return `${REVIEW_FIGMA_IMAGE_OVERLAY_STORAGE_KEY_PREFIX}${createReviewFigmaImageTargetKey(target)}`;\n}\n\nfunction readStoredReviewFigmaImageOverlayState(storageKey: string) {\n if (typeof window === 'undefined') {\n return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n }\n\n try {\n const value = window.localStorage.getItem(storageKey);\n if (!value) return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n\n return normalizeReviewFigmaImageOverlayState(JSON.parse(value));\n } catch {\n return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n }\n}\n\nfunction writeStoredReviewFigmaImageOverlayState(\n storageKey: string,\n state: ReviewFigmaImageOverlayState\n) {\n if (typeof window === 'undefined') return;\n if (isDefaultReviewFigmaImageOverlayState(state)) {\n try {\n window.localStorage.removeItem(storageKey);\n } catch {\n return;\n }\n return;\n }\n\n try {\n window.localStorage.setItem(\n storageKey,\n JSON.stringify({\n version: REVIEW_FIGMA_IMAGE_OVERLAY_STORAGE_VERSION,\n ...state,\n } satisfies StoredReviewFigmaImageOverlayState)\n );\n } catch {\n return;\n }\n}\n\nconst DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE: ReviewFigmaImageOverlayState = {\n selectedImageId: null,\n imageStates: {},\n lastVisibleImageIds: [],\n};\n\nconst DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE: ReviewFigmaImageOverlayItemState = {\n isVisible: false,\n opacity: DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY,\n isLocked: false,\n mode: DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_MODE,\n offsetY: 0,\n};\n\nfunction normalizeReviewFigmaImageOverlayState(\n value: unknown\n): ReviewFigmaImageOverlayState {\n if (!value || typeof value !== 'object') {\n return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n }\n\n const state = value as StoredReviewFigmaImageOverlayState;\n const selectedImageId =\n typeof state.selectedImageId === 'string' ? state.selectedImageId : null;\n const lastVisibleImageIds = Array.isArray(state.lastVisibleImageIds)\n ? state.lastVisibleImageIds.filter(\n (imageId): imageId is string => typeof imageId === 'string'\n )\n : [];\n const imageStates = normalizeReviewFigmaImageOverlayItemStateRecord(\n state.imageStates\n );\n if (Object.keys(imageStates).length === 0 && selectedImageId) {\n imageStates[selectedImageId] = normalizeReviewFigmaImageOverlayItemState(\n state\n );\n }\n\n return {\n selectedImageId,\n imageStates,\n lastVisibleImageIds,\n };\n}\n\nfunction normalizeReviewFigmaImageOverlayItemStateRecord(value: unknown) {\n if (!value || typeof value !== 'object') return {};\n\n return Object.fromEntries(\n Object.entries(value).flatMap(([imageId, itemState]) => {\n if (!imageId || typeof itemState !== 'object') return [];\n return [\n [\n imageId,\n normalizeReviewFigmaImageOverlayItemState(\n itemState as Partial<ReviewFigmaImageOverlayItemState>\n ),\n ],\n ];\n })\n );\n}\n\nfunction normalizeReviewFigmaImageOverlayItemState(\n value: Partial<ReviewFigmaImageOverlayItemState>\n): ReviewFigmaImageOverlayItemState {\n return {\n isVisible: value.isVisible === true,\n opacity: clampReviewFigmaImageOverlayOpacity(\n typeof value.opacity === 'number'\n ? value.opacity\n : DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY\n ),\n isLocked: value.isLocked === true,\n mode: normalizeReviewFigmaImageOverlayMode(value.mode),\n offsetY: normalizeReviewFigmaImageOverlayOffsetY(value.offsetY),\n };\n}\n\nfunction normalizeReviewFigmaImageOverlayMode(\n value: unknown\n): ReviewFigmaImageOverlayMode {\n return value === 'invert' ? 'invert' : DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_MODE;\n}\n\nfunction normalizeReviewFigmaImageOverlayOffsetY(value: unknown) {\n if (typeof value !== 'number' || !Number.isFinite(value)) return 0;\n return Math.round(value);\n}\n\nfunction clampReviewFigmaImageOverlayOpacity(value: number) {\n if (!Number.isFinite(value)) return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction isDefaultReviewFigmaImageOverlayState(\n state: ReviewFigmaImageOverlayState\n) {\n return (\n state.selectedImageId === null &&\n Object.keys(state.imageStates).length === 0 &&\n state.lastVisibleImageIds.length === 0\n );\n}\n\nfunction getReviewFigmaImageOverlayItemState(\n state: ReviewFigmaImageOverlayState,\n imageId: string | null\n) {\n return imageId\n ? (state.imageStates[imageId] ??\n DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE)\n : DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE;\n}\n\nfunction updateSelectedReviewFigmaImageOverlayItemState(\n state: ReviewFigmaImageOverlayState,\n updater: (\n itemState: ReviewFigmaImageOverlayItemState\n ) => ReviewFigmaImageOverlayItemState\n) {\n return state.selectedImageId\n ? updateReviewFigmaImageOverlayItemState(\n state.imageStates,\n state.selectedImageId,\n updater\n )\n : state.imageStates;\n}\n\nfunction updateReviewFigmaImageOverlayItemState(\n imageStates: Record<string, ReviewFigmaImageOverlayItemState>,\n imageId: string,\n updater: (\n itemState: ReviewFigmaImageOverlayItemState\n ) => ReviewFigmaImageOverlayItemState\n) {\n return {\n ...imageStates,\n [imageId]: updater(\n imageStates[imageId] ?? DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE\n ),\n };\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n ReviewFigmaImage,\n ReviewFigmaImageFormat,\n ReviewFigmaImageStore,\n ReviewFigmaRouteTarget,\n} from '../../figma/image.types';\nimport {\n DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n} from '../../figma/image.types';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface CreateReviewFigmaRouteTargetOptions {\n pageUrl: string;\n projectId: string;\n viewport: ReviewShellViewportPreset;\n}\n\ninterface UseReviewFigmaImageStoreControllerOptions {\n imageFormat?: ReviewFigmaImageFormat;\n store: ReviewFigmaImageStore | null;\n target: ReviewFigmaRouteTarget;\n}\n\ntype ReviewFigmaImageListState = {\n images: ReviewFigmaImage[];\n targetKey: string;\n};\n\nexport const createReviewFigmaRouteTarget = ({\n pageUrl,\n projectId,\n viewport,\n}: CreateReviewFigmaRouteTargetOptions): ReviewFigmaRouteTarget => ({\n type: 'route',\n projectId,\n pageUrl,\n viewport: {\n label: viewport.label,\n width: viewport.width,\n height: viewport.height,\n scope: getViewportPresetKind(viewport),\n },\n});\n\nexport const useReviewFigmaImageStoreController = ({\n imageFormat = DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n store,\n target,\n}: UseReviewFigmaImageStoreControllerOptions) => {\n const targetKey = useMemo(\n () => createReviewFigmaImageTargetKey(target),\n [target]\n );\n const requestIdRef = useRef(0);\n const [imageList, setImageList] = useState<ReviewFigmaImageListState>(() => ({\n images: [],\n targetKey,\n }));\n const [isLoading, setIsLoading] = useState(Boolean(store));\n const [isMutating, setIsMutating] = useState(false);\n const [error, setError] = useState('');\n const images = imageList.targetKey === targetKey ? imageList.images : [];\n\n const refreshImages = useCallback(async () => {\n const requestId = requestIdRef.current + 1;\n requestIdRef.current = requestId;\n\n if (!store) {\n setImageList({ images: [], targetKey });\n setIsLoading(false);\n setError('');\n return [];\n }\n\n setIsLoading(true);\n\n try {\n const nextImages = sortReviewFigmaImages(await store.listImages(target));\n if (requestId !== requestIdRef.current) return nextImages;\n\n setImageList({ images: nextImages, targetKey });\n setError('');\n return nextImages;\n } catch (refreshError) {\n if (requestId === requestIdRef.current) {\n setError(getReviewFigmaImageErrorMessage(refreshError));\n }\n return [];\n } finally {\n if (requestId === requestIdRef.current) setIsLoading(false);\n }\n }, [store, target, targetKey]);\n\n useEffect(() => {\n void refreshImages();\n }, [refreshImages]);\n\n const addImage = useCallback(\n async (figmaUrl: string, label?: string) => {\n const trimmedUrl = figmaUrl.trim();\n if (!store || !trimmedUrl) return null;\n\n setIsMutating(true);\n\n try {\n let image = await store.addImage({\n target,\n figmaUrl: trimmedUrl,\n imageFormat,\n label: label?.trim() || undefined,\n order: getNewReviewFigmaImageOrder(images),\n });\n const uniqueLabel = getUniqueReviewFigmaImageLabel(\n getReviewFigmaImageComparableLabel(image),\n images\n );\n if (uniqueLabel !== getReviewFigmaImageComparableLabel(image)) {\n image = await store.updateImage(image.id, { label: uniqueLabel });\n }\n setImageList((currentList) => ({\n images: sortReviewFigmaImages([\n ...(currentList.targetKey === targetKey ? currentList.images : [])\n .filter((currentImage) => currentImage.id !== image.id),\n image,\n ]),\n targetKey,\n }));\n setError('');\n return image;\n } catch (addError) {\n setError(getReviewFigmaImageErrorMessage(addError));\n return null;\n } finally {\n setIsMutating(false);\n }\n },\n [imageFormat, images, store, target, targetKey]\n );\n\n const deleteImage = useCallback(\n async (id: string) => {\n if (!store) return;\n\n const previousImageList = imageList;\n setImageList({\n images: images.filter((image) => image.id !== id),\n targetKey,\n });\n setIsMutating(true);\n\n try {\n await store.deleteImage(id);\n setError('');\n } catch (deleteError) {\n setImageList(previousImageList);\n setError(getReviewFigmaImageErrorMessage(deleteError));\n } finally {\n setIsMutating(false);\n }\n },\n [imageList, images, store, targetKey]\n );\n\n const updateImage = useCallback(\n async (id: string, patch: { label?: string }) => {\n if (!store) return null;\n\n const previousImageList = imageList;\n setIsMutating(true);\n\n try {\n const image = await store.updateImage(id, patch);\n setImageList((currentList) => ({\n images: sortReviewFigmaImages([\n ...(currentList.targetKey === targetKey ? currentList.images : images)\n .filter((currentImage) => currentImage.id !== image.id),\n image,\n ]),\n targetKey,\n }));\n setError('');\n return image;\n } catch (updateError) {\n setImageList(previousImageList);\n setError(getReviewFigmaImageErrorMessage(updateError));\n return null;\n } finally {\n setIsMutating(false);\n }\n },\n [imageList, images, store, targetKey]\n );\n\n const reorderImages = useCallback(\n async (imageIds: string[]) => {\n if (!store) return;\n\n const currentImageIds = images.map((image) => image.id);\n const nextImageIdSet = new Set(imageIds);\n const hasSameIds =\n imageIds.length === currentImageIds.length &&\n nextImageIdSet.size === currentImageIds.length &&\n currentImageIds.every((imageId) => nextImageIdSet.has(imageId));\n const hasSameOrder =\n hasSameIds &&\n imageIds.every((imageId, index) => imageId === currentImageIds[index]);\n if (!hasSameIds || hasSameOrder) return;\n\n const previousImages = images;\n const imageById = new Map(images.map((image) => [image.id, image]));\n const optimisticImages = imageIds.flatMap((imageId, order) => {\n const image = imageById.get(imageId);\n return image ? [{ ...image, order }] : [];\n });\n\n setImageList({ images: optimisticImages, targetKey });\n setIsMutating(true);\n\n try {\n const savedImages = await store.reorderImages({\n target,\n imageIds,\n });\n setImageList({ images: sortReviewFigmaImages(savedImages), targetKey });\n setError('');\n } catch (reorderError) {\n setImageList({ images: previousImages, targetKey });\n setError(getReviewFigmaImageErrorMessage(reorderError));\n } finally {\n setIsMutating(false);\n }\n },\n [images, store, target, targetKey]\n );\n\n const moveImage = useCallback(\n async (id: string, direction: 'up' | 'down') => {\n const currentIndex = images.findIndex((image) => image.id === id);\n const nextIndex = direction === 'up' ? currentIndex - 1 : currentIndex + 1;\n if (currentIndex < 0 || nextIndex < 0 || nextIndex >= images.length) {\n return;\n }\n\n const reorderedImages = [...images];\n const [image] = reorderedImages.splice(currentIndex, 1);\n reorderedImages.splice(nextIndex, 0, image);\n await reorderImages(reorderedImages.map((nextImage) => nextImage.id));\n },\n [images, reorderImages]\n );\n\n return {\n addImage,\n deleteImage,\n error,\n images,\n isLoading: isLoading || imageList.targetKey !== targetKey,\n isMutating,\n moveImage,\n refreshImages,\n reorderImages,\n updateImage,\n };\n};\n\nfunction sortReviewFigmaImages(images: ReviewFigmaImage[]) {\n return [...images].sort((a, b) => {\n if (a.order !== b.order) return a.order - b.order;\n return a.createdAt.localeCompare(b.createdAt);\n });\n}\n\nfunction getNewReviewFigmaImageOrder(images: ReviewFigmaImage[]) {\n return images.length\n ? Math.min(...images.map((image) => image.order)) - 1\n : 0;\n}\n\nexport function createReviewFigmaImageTargetKey(target: ReviewFigmaRouteTarget) {\n return [\n target.projectId,\n target.pageUrl,\n target.viewport?.scope ?? '',\n target.viewport?.label ?? '',\n target.viewport?.width ?? '',\n target.viewport?.height ?? '',\n target.slot ?? '',\n ].join('|');\n}\n\nfunction getReviewFigmaImageComparableLabel(image: ReviewFigmaImage) {\n return image.label?.trim() || image.nodeId;\n}\n\nfunction getUniqueReviewFigmaImageLabel(\n label: string,\n images: readonly ReviewFigmaImage[]\n) {\n const trimmedLabel = label.trim();\n if (!trimmedLabel) return trimmedLabel;\n\n const existingLabels = new Set(\n images.map(getReviewFigmaImageComparableLabel).filter(Boolean)\n );\n if (!existingLabels.has(trimmedLabel)) return trimmedLabel;\n\n for (let index = 2; index < Number.MAX_SAFE_INTEGER; index += 1) {\n const candidate = `${trimmedLabel}-${index}`;\n if (!existingLabels.has(candidate)) return candidate;\n }\n\n return trimmedLabel;\n}\n\nfunction getReviewFigmaImageErrorMessage(error: unknown) {\n return error instanceof Error ? error.message : 'Figma image request failed.';\n}\n","// Pure helpers for the Figma images panel (labels, opacity snapping, reorder,\n// pointer hit-testing, date formatting). Kept out of images.panel.tsx so the\n// component file stays focused on rendering and interaction state.\nimport type { PointerEvent } from 'react';\nimport type { ReviewFigmaImage } from '../../figma/image.types';\nimport type { ReviewFigmaImageOverlayItemState } from './image.overlay.controller';\nimport { DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY } from './image.overlay.controller';\n\nexport const DEFAULT_FIGMA_IMAGE_LAYER_STATE: ReviewFigmaImageOverlayItemState = {\n isLocked: false,\n isVisible: false,\n mode: 'normal',\n offsetY: 0,\n opacity: DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY,\n};\n\nexport function getFigmaImageLabel(image: ReviewFigmaImage, index: number) {\n return image.label?.trim() || `Image ${index + 1}`;\n}\n\nexport function getSnappedOpacityPercent(opacity: number) {\n const opacityPercent = Math.round(opacity * 100);\n if (!Number.isFinite(opacityPercent)) return 0;\n return Math.max(0, Math.min(100, Math.round(opacityPercent / 10) * 10));\n}\n\nexport function getFigmaImageLayerStatusLabel(\n overlayState: ReviewFigmaImageOverlayItemState\n) {\n return [\n overlayState.isVisible ? 'Visible' : 'Hidden',\n overlayState.mode === 'invert' ? 'Invert' : '',\n overlayState.isLocked ? 'Locked' : '',\n ]\n .filter(Boolean)\n .join(' / ');\n}\n\nexport function getReorderedFigmaImageIds(\n images: ReviewFigmaImage[],\n draggedImageId: string,\n dropTargetImageId: string\n) {\n const currentImageIds = images.map((image) => image.id);\n const draggedIndex = currentImageIds.indexOf(draggedImageId);\n const dropTargetIndex = currentImageIds.indexOf(dropTargetImageId);\n if (draggedIndex < 0 || dropTargetIndex < 0) return currentImageIds;\n\n const nextImageIds = [...currentImageIds];\n const [imageId] = nextImageIds.splice(draggedIndex, 1);\n nextImageIds.splice(dropTargetIndex, 0, imageId);\n return nextImageIds;\n}\n\nexport function isInteractiveFigmaImageTarget(target: EventTarget | null) {\n return (\n target instanceof Element &&\n Boolean(\n target.closest('button, a, input, textarea, select, [contenteditable=\"true\"]')\n )\n );\n}\n\nexport function getPointerFigmaImageTargetId(event: PointerEvent<HTMLElement>) {\n const element = document.elementFromPoint(event.clientX, event.clientY);\n const targetCard = element?.closest<HTMLElement>(\n '.df-review-figma-image-card[data-figma-image-id]'\n );\n return targetCard?.dataset.figmaImageId ?? null;\n}\n\nexport function formatFigmaImageDate(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","import {\n Contrast as InvertIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n Lock as LockIcon,\n Unlock as UnlockIcon,\n} from 'lucide-react';\nimport type { ReviewFigmaImageOverlayItemState } from './image.overlay.controller';\n\ninterface FigmaImageLayerStateButtonsProps {\n imageLabel: string;\n overlayState: ReviewFigmaImageOverlayItemState;\n title?: string;\n onSelect?: () => void;\n onToggleLocked: () => void;\n onToggleMode: () => void;\n onToggleVisible: () => void;\n}\n\nexport const FigmaImageLayerStateButtons = ({\n imageLabel,\n overlayState,\n title,\n onSelect,\n onToggleLocked,\n onToggleMode,\n onToggleVisible,\n}: FigmaImageLayerStateButtonsProps) => {\n const handleAction = (action: () => void) => {\n onSelect?.();\n action();\n };\n\n return (\n <div\n aria-label={`${imageLabel} overlay state`}\n className=\"df-review-figma-image-layer-state\"\n title={title}\n >\n <button\n aria-label={\n overlayState.isVisible\n ? `Hide ${imageLabel} overlay`\n : `Show ${imageLabel} overlay`\n }\n aria-pressed={overlayState.isVisible}\n className={`df-review-figma-image-state-button${\n overlayState.isVisible ? ' is-active' : ''\n }`}\n title={overlayState.isVisible ? 'Hide overlay' : 'Show overlay'}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n handleAction(onToggleVisible);\n }}\n >\n {overlayState.isVisible ? (\n <EyeIcon aria-hidden=\"true\" />\n ) : (\n <EyeOffIcon aria-hidden=\"true\" />\n )}\n </button>\n <button\n aria-label={\n overlayState.isLocked\n ? `Unlock ${imageLabel} overlay`\n : `Lock ${imageLabel} overlay`\n }\n aria-pressed={overlayState.isLocked}\n className={`df-review-figma-image-state-button${\n overlayState.isLocked ? ' is-active' : ''\n }`}\n title={overlayState.isLocked ? 'Unlock' : 'Lock'}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n handleAction(onToggleLocked);\n }}\n >\n {overlayState.isLocked ? (\n <LockIcon aria-hidden=\"true\" />\n ) : (\n <UnlockIcon aria-hidden=\"true\" />\n )}\n </button>\n <button\n aria-label={\n overlayState.mode === 'invert'\n ? `Disable ${imageLabel} invert`\n : `Enable ${imageLabel} invert`\n }\n aria-pressed={overlayState.mode === 'invert'}\n className={`df-review-figma-image-state-button${\n overlayState.mode === 'invert' ? ' is-active' : ''\n }`}\n title=\"Invert\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n handleAction(onToggleMode);\n }}\n >\n <InvertIcon aria-hidden=\"true\" />\n </button>\n </div>\n );\n};\n","type ReviewSpinnerProps = {\n className?: string;\n label?: string;\n};\n\nexport const ReviewSpinner = ({ className, label }: ReviewSpinnerProps) => (\n <span\n aria-hidden={label ? undefined : true}\n aria-label={label}\n className={`df-review-spinner${className ? ` ${className}` : ''}`}\n role={label ? 'status' : undefined}\n />\n);\n","import { useEffect, useState } from 'react';\nimport type { ReviewFieldsConfig, ReviewItem } from '../../types';\n\ninterface QaItemEditModalProps {\n fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n item: ReviewItem;\n onClose: () => void;\n onSave: (\n item: ReviewItem,\n patch: Pick<ReviewItem, 'comment'> & Partial<Pick<ReviewItem, 'title'>>\n ) => Promise<void>;\n}\n\nexport const QaItemEditModal = ({\n fields,\n item,\n onClose,\n onSave,\n}: QaItemEditModalProps) => {\n const [titleDraft, setTitleDraft] = useState(item.title ?? '');\n const [commentDraft, setCommentDraft] = useState(item.comment);\n const [error, setError] = useState('');\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setTitleDraft(item.title ?? '');\n setCommentDraft(item.comment);\n setError('');\n setIsSaving(false);\n }, [item.id, item.title, item.comment]);\n\n const saveDetails = async () => {\n const nextTitle = titleDraft.trim();\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, {\n ...(fields.title ? { title: nextTitle || undefined } : {}),\n comment: nextComment,\n });\n } catch (error) {\n setError(\n error instanceof Error ? error.message : 'Failed to update QA.'\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 saveDetails();\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</strong>\n <span>\n {fields.title\n ? 'Update the title and comment.'\n : 'Update the comment.'}\n </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 {fields.title && (\n <label className=\"df-review-settings-field\">\n <span>Title</span>\n <div className=\"df-review-settings-text-input\">\n <input\n autoFocus\n value={titleDraft}\n onChange={(event) => {\n setTitleDraft(event.target.value);\n if (error) setError('');\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onClose();\n }\n }}\n />\n </div>\n </label>\n )}\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={!fields.title}\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 saveDetails();\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 && (\n <span className=\"df-review-spinner\" aria-hidden=\"true\" />\n )}\n {isSaving ? 'Saving...' : 'Save'}\n </button>\n </footer>\n </div>\n </form>\n </div>\n );\n};\n","import type { ReviewItem } from '../../types';\nimport type { ReviewShellAssigneeOption } from '../types';\n\ninterface QaItemAssigneeActionsProps {\n assigneeOptions: readonly ReviewShellAssigneeOption[];\n assigneeTitle: string;\n canUpdateAssignee: boolean;\n isDisabled?: boolean;\n item: ReviewItem;\n onChangeItemAssignee: (\n item: ReviewItem,\n assigneeId: string | null\n ) => Promise<void>;\n}\n\nconst getAssigneeLabel = (\n item: ReviewItem,\n assigneeOptions: readonly ReviewShellAssigneeOption[]\n) =>\n item.assigneeName ||\n assigneeOptions.find(\n (assigneeOption) => assigneeOption.value === item.assigneeId\n )?.label ||\n item.assigneeId ||\n '';\n\nexport const QaItemAssigneeActions = ({\n assigneeOptions,\n assigneeTitle,\n canUpdateAssignee,\n isDisabled = false,\n item,\n onChangeItemAssignee,\n}: QaItemAssigneeActionsProps) => {\n const assigneeId = item.assigneeId ?? '';\n const currentLabel = getAssigneeLabel(item, assigneeOptions);\n const hasUnknownAssignee =\n Boolean(assigneeId) &&\n !assigneeOptions.some(\n (assigneeOption) => assigneeOption.value === assigneeId\n );\n\n if (!canUpdateAssignee && !currentLabel) return null;\n\n return (\n <div\n className=\"df-review-item-assignee-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canUpdateAssignee ? (\n <select\n aria-label={`QA ${assigneeTitle}`}\n className=\"df-review-item-assignee-select\"\n disabled={isDisabled}\n value={assigneeId}\n onChange={(event) =>\n void onChangeItemAssignee(item, event.currentTarget.value || null)\n }\n >\n <option value=\"\">{assigneeTitle}</option>\n {hasUnknownAssignee && (\n <option value={assigneeId}>{currentLabel}</option>\n )}\n {assigneeOptions.map((assigneeOption) => (\n <option key={assigneeOption.value} value={assigneeOption.value}>\n {assigneeOption.label}\n </option>\n ))}\n </select>\n ) : (\n <span className=\"df-review-item-assignee-badge\">{currentLabel}</span>\n )}\n </div>\n );\n};\n","import {\n Copy as CopyIcon,\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 isRemoteIssueCopied: boolean;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n onCopyRemoteIssuePath: (item: ReviewItem) => Promise<void>;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n}\n\nexport const QaItemRemoteActions = ({\n isRemoteSource,\n isSubmitted,\n isSubmitting,\n item,\n isRemoteIssueCopied,\n numberedItem,\n remoteAdapterEntry,\n onCopyRemoteIssuePath,\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 <>\n <button\n aria-label={\n isRemoteIssueCopied\n ? 'Copied remote QA path'\n : 'Copy remote QA path'\n }\n className={`df-review-item-action-button df-review-item-remote-copy${\n isRemoteIssueCopied ? ' is-copied' : ''\n }`}\n title={\n isRemoteIssueCopied\n ? 'Copied remote QA path'\n : 'Copy remote QA path'\n }\n type=\"button\"\n onClick={() => void onCopyRemoteIssuePath(item)}\n >\n <CopyIcon aria-hidden=\"true\" />\n </button>\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 title=\"Open remote issue\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n </>\n )}\n </div>\n );\n};\n","import { normalizeReviewItemStatus } from '../../status';\nimport type { ReviewItem, ReviewItemStatus } from '../../types';\nimport type { ReviewShellStatusOption } from '../types';\n\ninterface QaItemStatusActionsProps {\n canUpdateStatus: boolean;\n isDisabled?: 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 isDisabled = false,\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 disabled={isDisabled}\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\nconst 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\nconst 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\nconst 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\nconst 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\nconst getReviewFingerprintTokens = (value: string) =>\n value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n\nconst 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 ReviewFieldsConfig,\n ReviewItem,\n ReviewItemStatus,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { getItemTitle } from '../prompt/prompt';\nimport { QaItemAssigneeActions } from './item.assignee.actions';\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 fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n assigneeTitle: string;\n currentPresetScope: ReviewShellViewportKind;\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n isOverlayVisible: boolean;\n isMutating: 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 onChangeItemAssignee: (\n item: ReviewItem,\n assigneeId: string | null\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onRemoveItem: (item: ReviewItem) => Promise<void>;\n onCopyItemLabel: (numberedItem: NumberedReviewItem) => void;\n onCopyItemLink: (numberedItem: NumberedReviewItem) => void;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onCopyRemoteIssuePath: (item: ReviewItem) => Promise<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 fields,\n assigneeTitle,\n currentPresetScope,\n getItemPresetScope,\n isOverlayVisible,\n isMutating,\n isRemoteSource,\n numberedItem,\n remoteAdapterEntry,\n copiedPromptKey,\n selectedItemId,\n onChangeItemStatus,\n onChangeItemAssignee,\n onClearSelectedItem,\n onRemoveItem,\n onCopyItemLabel,\n onCopyItemLink,\n onCopyItemPrompt,\n onCopyRemoteIssuePath,\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 !isMutating &&\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 labelCopyKey = `label:${item.id}`;\n const linkCopyKey = `link:${item.id}`;\n const remoteIssueCopyKey = `remote-link:${item.id}`;\n const isPromptCopied = copiedPromptKey === promptCopyKey;\n const isLabelCopied = copiedPromptKey === labelCopyKey;\n const isLinkCopied = copiedPromptKey === linkCopyKey;\n const isRemoteIssueCopied = copiedPromptKey === remoteIssueCopyKey;\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 canUpdateAssignee =\n Boolean(activeAdapterEntry.updateAssignee) &&\n activeAdapterEntry.assigneeOptions.length > 0 &&\n !isSubmitting;\n const canEditItem =\n activeAdapterEntry.canUpdate && !isSubmitting && !isMutating;\n const itemTitle = fields.title ? item.title?.trim() : '';\n const itemMeta = [formatItemCardDate(item.createdAt), itemAuthor]\n .filter(Boolean)\n .join(' | ');\n\n return (\n <article\n aria-busy={isMutating ? 'true' : 'false'}\n className={`df-review-item-card${isActive ? ' is-active' : ''}${\n getItemPresetScope(item) !== currentPresetScope ? ' is-dim' : ''\n }${isOverlayVisible ? '' : ' is-overlay-hidden'}${\n isMutating ? ' is-mutating' : ''\n }`}\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 <button\n aria-label={\n isLabelCopied ? 'Copied QA number' : 'Copy QA number'\n }\n className={`df-review-item-id${\n isLabelCopied ? ' is-copied' : ''\n }`}\n title={isLabelCopied ? 'Copied QA number' : 'Copy QA number'}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onCopyItemLabel(numberedItem);\n }}\n >\n {numberedItem.displayLabel}\n </button>\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 {itemTitle && (\n <strong className=\"df-review-item-title\">{itemTitle}</strong>\n )}\n <p\n className={`df-review-item-comment${\n itemTitle ? '' : ' is-primary'\n }`}\n >\n {itemComment}\n </p>\n <small className=\"df-review-item-meta\">{itemMeta}</small>\n {isMutating && (\n <small className=\"df-review-item-saving\" aria-live=\"polite\">\n <span className=\"df-review-spinner\" aria-hidden=\"true\" />\n Saving QA...\n </small>\n )}\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\"\n className=\"df-review-item-edit\"\n title=\"Edit QA\"\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 <div className=\"df-review-item-workflow-actions\">\n <QaItemStatusActions\n canUpdateStatus={canUpdateStatus}\n isDisabled={isMutating}\n item={item}\n statusOptions={statusOptions}\n onChangeItemStatus={onChangeItemStatus}\n />\n <QaItemAssigneeActions\n assigneeOptions={activeAdapterEntry.assigneeOptions}\n assigneeTitle={assigneeTitle}\n canUpdateAssignee={canUpdateAssignee}\n isDisabled={isMutating}\n item={item}\n onChangeItemAssignee={onChangeItemAssignee}\n />\n </div>\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 || isMutating}\n item={item}\n isRemoteIssueCopied={isRemoteIssueCopied}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n onCopyRemoteIssuePath={onCopyRemoteIssuePath}\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 isLoading: 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 isLoading,\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 const displayLabel = getQaSourceDisplayLabel(label);\n\n return (\n <div className=\"df-review-list-header\">\n <div className=\"df-review-list-title\">\n <span className=\"df-review-list-meta\">\n <span>\n {isAllQaVisible\n ? `${displayLabel} QA · All pages`\n : `${displayLabel} QA`}\n </span>\n <strong\n title={`${activeRemainingItemCount} remaining of ${activeItemCount}`}\n >\n {!hasActiveFilter\n ? `${activeRemainingItemCount}/${activeItemCount}`\n : `${filteredItemCount}/${activeItemCount}`}\n </strong>\n </span>\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-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 aria-busy={isLoading ? 'true' : 'false'}\n className={`df-review-source-refresh${\n isLoading ? ' is-loading' : ''\n }`}\n disabled={isLoading}\n type=\"button\"\n onClick={() => void onRefreshReviewData()}\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n </div>\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 getQaSourceDisplayLabel(label: ReviewSource) {\n return label === 'local' ? 'Local' : label;\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 ReviewFieldsConfig,\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 fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n assigneeTitle: string;\n currentPresetScope: ReviewShellViewportKind;\n filteredNumberedActiveItems: NumberedReviewItem[];\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n hiddenOverlayItemIds: ReadonlySet<string>;\n isAllQaVisible: boolean;\n isListVisible: boolean;\n isLoading: boolean;\n isRemoteSource: boolean;\n mutatingItemIds: ReadonlySet<string>;\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 onChangeItemAssignee: (\n item: ReviewItem,\n assigneeId: string | null\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onChangeReviewSource: (nextSource: ReviewSource) => void;\n onCopyItemLabel: (numberedItem: NumberedReviewItem) => void;\n onCopyItemLink: (numberedItem: NumberedReviewItem) => void;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onCopyRemoteIssuePath: (item: ReviewItem) => Promise<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 fields,\n assigneeTitle,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIds,\n isAllQaVisible,\n isListVisible,\n isLoading,\n isRemoteSource,\n mutatingItemIds,\n copiedPromptKey,\n qaFilter,\n qaFilterCounts,\n qaStatusFilter,\n qaStatusFilterCounts,\n remoteAdapterEntry,\n selectedItemId,\n showSourceSelect,\n source,\n sourceEntries,\n onChangeItemStatus,\n onChangeItemAssignee,\n onClearSelectedItem,\n onChangeReviewSource,\n onCopyItemLabel,\n onCopyItemLink,\n onCopyItemPrompt,\n onCopyRemoteIssuePath,\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 isLoading={isLoading}\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\n className={`df-review-empty${isLoading ? ' is-loading' : ''}`}\n >\n {isLoading && (\n <span className=\"df-review-spinner\" aria-hidden=\"true\" />\n )}\n <span>\n {isLoading\n ? `Loading ${activeAdapterEntry.label} QA...`\n : emptyMessage}\n </span>\n </p>\n )}\n {activeItems.length > 0 &&\n filteredNumberedActiveItems.length === 0 && (\n <p className=\"df-review-empty\">No QA in this filter.</p>\n )}\n {filteredNumberedActiveItems.map((numberedItem) => {\n const { item } = numberedItem;\n\n return (\n <QaItemCard\n key={item.id}\n activeAdapterEntry={activeAdapterEntry}\n fields={fields}\n assigneeTitle={assigneeTitle}\n currentPresetScope={currentPresetScope}\n getItemPresetScope={getItemPresetScope}\n isOverlayVisible={!hiddenOverlayItemIds.has(item.id)}\n isMutating={mutatingItemIds.has(item.id)}\n isRemoteSource={isRemoteSource}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n copiedPromptKey={copiedPromptKey}\n selectedItemId={selectedItemId}\n onChangeItemAssignee={onChangeItemAssignee}\n onChangeItemStatus={onChangeItemStatus}\n onClearSelectedItem={onClearSelectedItem}\n onCopyItemLabel={onCopyItemLabel}\n onCopyItemLink={onCopyItemLink}\n onCopyItemPrompt={onCopyItemPrompt}\n onCopyRemoteIssuePath={onCopyRemoteIssuePath}\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 <div className=\"df-review-qa-draft-host\" />\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 getPresenceName = (user: ReviewPresenceUser) =>\n user.displayName || user.userId;\n\nconst PresenceUserIcon = () => (\n <svg aria-hidden=\"true\" viewBox=\"0 0 30 30\">\n <circle\n cx=\"15\"\n cy=\"15\"\n r=\"12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.6\"\n />\n <circle cx=\"15\" cy=\"10.5\" r=\"3.4\" fill=\"currentColor\" stroke=\"none\" />\n <path\n d=\"M7.8 22.1c.9-4.1 3.4-6.1 7.2-6.1s6.3 2 7.2 6.1c-1.7 1.5-4.1 2.4-7.2 2.4s-5.5-.9-7.2-2.4z\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n);\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 return (\n <div\n aria-label={`Review presence, ${users.length} online`}\n className={`df-review-presence-overlay${\n isExpanded ? ' is-expanded' : ''\n }`}\n >\n <button\n aria-label={`Show online reviewers, ${users.length} online`}\n aria-expanded={isExpanded}\n className=\"df-review-presence-button\"\n type=\"button\"\n onClick={() => setIsExpanded((current) => !current)}\n >\n <PresenceUserIcon />\n <span className=\"df-review-presence-badge\">{users.length}</span>\n </button>\n {isExpanded && (\n <div className=\"df-review-presence-list\" role=\"list\">\n {users.map((user) => (\n <span\n key={user.sessionId}\n className={`df-review-presence-chip${\n user.sessionId === presenceSessionId ? ' is-self' : ''\n }`}\n role=\"listitem\"\n style={\n {\n '--df-review-presence-color': user.color,\n } as CSSProperties\n }\n title={getPresenceName(user)}\n >\n <span>{getPresenceName(user)}</span>\n </span>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import type { DomSourceHint } from '../types';\n\nexport type SourceIgnorePattern = string | RegExp;\n\nexport type GetSourceCandidatesOptions = {\n includePlacer?: boolean;\n ignore?: readonly SourceIgnorePattern[];\n};\n\nexport const matchesIgnore = (\n file: string,\n patterns: readonly SourceIgnorePattern[]\n) => {\n const normalized = file.replace(/\\\\/g, '/');\n return patterns.some((pattern) =>\n typeof pattern === 'string'\n ? normalized.includes(pattern)\n : pattern.test(normalized)\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\nexport function getDataHintFromElement(\n element: Element\n): DomSourceHint | undefined {\n const file = getSourceAttribute(element, 'data-wrk-data-file');\n if (!file) return undefined;\n\n return {\n component: undefined,\n file,\n line: getSourceAttribute(element, 'data-wrk-data-line'),\n column: undefined,\n sectionId: undefined,\n sectionIndex: undefined,\n };\n}\n\nexport function getSourceHintFromElement(\n element: Element\n): 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\nexport function 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\nexport function 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\nexport function getSourceFileCompareKey(file: string | undefined) {\n return file?.trim().replace(/\\\\/g, '/') ?? '';\n}\n\nexport function addSourceFileCompareKey(seen: Set<string>, key: string) {\n if (!key || hasEquivalentSourceFileKey(seen, key)) return false;\n seen.add(key);\n return true;\n}\n\nexport function hasEquivalentSourceFileKey(seen: Set<string>, key: string) {\n for (const seenKey of seen) {\n if (isEquivalentSourceFileKey(seenKey, key)) return true;\n }\n return false;\n}\n\nfunction isEquivalentSourceFileKey(a: string, b: string) {\n return a === b || a.endsWith(`/${b}`) || b.endsWith(`/${a}`);\n}\n\nexport function isCoreOutlineNode(label: string, file: string | undefined) {\n const text = `${label} ${file ?? ''}`.toLowerCase();\n return (\n text.includes('core.section') ||\n text.includes('core.content') ||\n text.includes('core.column') ||\n ['coresection', 'corecontent', 'corecolumn'].includes(label.toLowerCase())\n );\n}\n","import type { DomSourceHint } from '../types';\nimport type { ReviewSourceInspectorOptions } from './types';\nimport {\n addSourceFileCompareKey,\n getComponentNameFromSourceFile,\n getDataHintFromElement,\n getDisplaySourcePath,\n getSourceFileCompareKey,\n getSourceHintFromElement,\n isCoreOutlineNode,\n matchesIgnore,\n type GetSourceCandidatesOptions,\n} from './source.hint';\n\nexport type { GetSourceCandidatesOptions } from './source.hint';\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 kind: 'source' | 'data';\n usesPosition: boolean;\n source: DomSourceHint;\n};\n\nexport const getSourceCandidates = (\n target: EventTarget | null,\n options?: GetSourceCandidatesOptions\n): SourceCandidate[] => {\n const startElement = getEventElement(target);\n if (!startElement) return [];\n\n const candidates: SourceCandidate[] = [];\n const seen = new Set<string>();\n const add = (\n element: Element,\n source: DomSourceHint | undefined,\n depth: number,\n kind: SourceCandidate['kind']\n ) => {\n if (!source?.file) return;\n // 같은 파일은 1개만(가장 안쪽=클릭에 가까운 것). 중첩 primitive 의 줄 단위 중복을 막는다.\n const key = getSourceFileCompareKey(source.file);\n if (!addSourceFileCompareKey(seen, key)) return;\n candidates.push(createSourceCandidate(element, source, depth, kind));\n };\n\n // 클릭 지점에서 부모로 거슬러 올라가며 수집\n let element: Element | null = startElement;\n let depth = 0;\n while (element && element.nodeType === 1) {\n add(element, getSourceHintFromElement(element), depth, 'source');\n // page data 파일 출처(__wrkDataFile)는 별도 후보로. 라인이 있으므로 depth 0 으로 위치 유지.\n add(element, getDataHintFromElement(element), 0, 'data');\n if (element === element.ownerDocument.documentElement) break;\n element = element.parentElement;\n depth += 1;\n }\n\n // 인프라/래퍼 파일 숨김. 전부 걸러지면 빈 후보 대신 원본을 그대로 노출.\n const ignore = options?.ignore;\n const visible = candidates.filter(\n (candidate) =>\n !isCoreOutlineNode(candidate.label, candidate.source.file) &&\n !(ignore?.length && matchesIgnore(candidate.source.file ?? '', ignore))\n );\n return visible.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 createSourceCandidate(\n element: Element,\n source: DomSourceHint,\n depth: number,\n kind: SourceCandidate['kind']\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: `${kind}:${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 kind,\n usesPosition: confidence >= 0.72 && Boolean(line),\n source,\n };\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 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 type { DomSourceHint } from '../types';\nimport {\n addSourceFileCompareKey,\n getComponentNameFromSourceFile,\n getDataHintFromElement,\n getDisplaySourcePath,\n getSourceFileCompareKey,\n getSourceHintFromElement,\n hasEquivalentSourceFileKey,\n isCoreOutlineNode,\n matchesIgnore,\n type GetSourceCandidatesOptions,\n} from './source.hint';\n\nconst SECTION_OUTLINE_ROOT_SELECTOR = [\n '[data-wrk-source-component]',\n 'header[data-wrk-source-file]',\n 'footer[data-wrk-source-file]',\n '[role=\"banner\"][data-wrk-source-file]',\n '[role=\"contentinfo\"][data-wrk-source-file]',\n].join(', ');\n\nexport type SectionOutlineEntry = {\n id: string;\n label: string;\n filePath: string;\n depth: number;\n element: Element;\n source: DomSourceHint | undefined;\n data: DomSourceHint | undefined;\n metadata: SectionOutlineMetadata;\n children: SectionOutlineEntry[];\n};\n\ntype SectionOutlineRect = {\n top: number;\n left: number;\n width: number;\n height: number;\n};\n\ntype SectionOutlineMetadata = {\n rect: SectionOutlineRect;\n textValue?: string;\n fontLabel?: string;\n mediaItems?: SectionOutlineMediaItem[];\n classNames?: string[];\n};\n\ntype SectionOutlineMediaItem = {\n type: 'image' | 'video';\n url: string;\n variant: 'desktop' | 'mobile' | 'media';\n};\n\nexport type GetSectionOutlineOptions = GetSourceCandidatesOptions & {\n maxDepth?: number;\n};\n\n/**\n * 섹션 래퍼와 frame landmark(header/footer)를 루트로 source tree를 만든다.\n * Placer 계열 primitive는 기본으로 숨기고, includePlacer 옵션에서만 표시한다.\n */\nexport const getSectionOutline = (\n root: ParentNode,\n options?: GetSectionOutlineOptions\n): SectionOutlineEntry[] => {\n const maxDepth = options?.maxDepth ?? 9;\n return getSectionOutlineRoots(root, options).map((element, index) => {\n const source = getSourceHintFromElement(element);\n const label = getOutlineLabel(element, source, 'section');\n const seen = new Set<string>();\n if (source?.file) {\n addSourceFileCompareKey(seen, getOutlineSourceKey(source));\n }\n return createSectionOutlineEntry({\n id: `${label}-${index}`,\n label,\n depth: 1,\n filePath: getDisplaySourcePath(source?.file) ?? label,\n element,\n source,\n data: getDataHintFromElement(element),\n children: getSectionOutlineChildren(\n element,\n 2,\n maxDepth,\n seen,\n options\n ),\n });\n });\n};\n\nfunction getSectionOutlineRoots(\n root: ParentNode,\n options: GetSectionOutlineOptions | undefined\n) {\n return Array.from(root.querySelectorAll(SECTION_OUTLINE_ROOT_SELECTOR)).filter(\n (element) => {\n const source = getSourceHintFromElement(element);\n const label = getOutlineLabel(element, source, '');\n return !isSkippedOutlineNode(label, source?.file, options);\n }\n );\n}\n\nfunction getSectionOutlineChildren(\n parent: Element,\n depth: number,\n maxDepth: number,\n seen: Set<string>,\n options: GetSectionOutlineOptions | undefined\n): SectionOutlineEntry[] {\n if (depth > maxDepth) return [];\n\n const entries: SectionOutlineEntry[] = [];\n for (const child of Array.from(parent.children)) {\n const source = getSourceHintFromElement(child);\n const label = getOutlineLabel(child, source, child.tagName.toLowerCase());\n const sourceKey = source?.file ? getOutlineSourceKey(source) : '';\n const isNewSource =\n Boolean(sourceKey) && !hasEquivalentSourceFileKey(seen, sourceKey);\n\n if (shouldStopOutlineBranch(label, source?.file, options)) continue;\n\n if (isHiddenOutlineNode(label, source?.file, options)) {\n entries.push(\n ...getSectionOutlineChildren(child, depth, maxDepth, seen, options)\n );\n continue;\n }\n\n if (source?.file && isNewSource) {\n const childSeen = new Set(seen);\n addSourceFileCompareKey(childSeen, sourceKey);\n entries.push(createSectionOutlineEntry({\n id: `${sourceKey}-${getElementOutlinePath(child)}-${entries.length}`,\n label,\n depth,\n filePath: getDisplaySourcePath(source.file) ?? source.file,\n element: child,\n source,\n data: getDataHintFromElement(child),\n children: getSectionOutlineChildren(\n child,\n depth + 1,\n maxDepth,\n childSeen,\n options\n ),\n }));\n continue;\n }\n\n entries.push(\n ...getSectionOutlineChildren(child, depth, maxDepth, seen, options)\n );\n }\n\n return entries;\n}\n\nfunction getElementOutlinePath(element: Element) {\n const indices: number[] = [];\n let current: Element | null = element;\n\n while (current?.parentElement) {\n indices.unshift(Array.from(current.parentElement.children).indexOf(current));\n current = current.parentElement;\n }\n\n return indices.join('-');\n}\n\nfunction createSectionOutlineEntry(\n entry: Omit<SectionOutlineEntry, 'metadata'>\n): SectionOutlineEntry {\n return {\n ...entry,\n metadata: getSectionOutlineMetadata(entry.element, entry.label, entry.source),\n };\n}\n\nconst truncateOutlineValue = (value: string, maxLength: number) =>\n value.length > maxLength ? `${value.slice(0, maxLength - 1)}…` : value;\n\nconst normalizeOutlineValue = (value: string | null | undefined) =>\n value?.replace(/\\s+/g, ' ').trim() ?? '';\n\nfunction getSectionOutlineMetadata(\n element: Element,\n label: string,\n source: DomSourceHint | undefined\n): SectionOutlineMetadata {\n const textElement = getPlacerTextElement(element, label, source?.file);\n\n return {\n rect: getSectionOutlineRect(element),\n textValue: textElement\n ? truncateOutlineValue(\n normalizeOutlineValue(textElement.textContent),\n 180\n )\n : undefined,\n fontLabel: textElement ? getFontLabel(textElement) : undefined,\n mediaItems: getPlacerMediaItems(element, label, source?.file),\n classNames: getElementClassNames(element),\n };\n}\n\nfunction getSectionOutlineRect(element: Element): SectionOutlineRect {\n const rect = element.getBoundingClientRect();\n return {\n top: Math.round(rect.top),\n left: Math.round(rect.left),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n };\n}\n\nfunction getElementClassNames(element: Element) {\n const classNames = Array.from(element.classList).filter(Boolean);\n return classNames.length > 0 ? classNames : undefined;\n}\n\nfunction getPlacerTextElement(\n element: Element,\n label: string,\n file: string | undefined\n) {\n if (!isPlacerTextOutlineNode(label, file) && !element.hasAttribute('data-font')) {\n return null;\n }\n\n return element.hasAttribute('data-font')\n ? element\n : element.querySelector('[data-font]');\n}\n\nfunction isPlacerTextOutlineNode(label: string, file: string | undefined) {\n return `${label} ${file ?? ''}`.toLowerCase().includes('placertext');\n}\n\nfunction getFontLabel(element: Element) {\n const dataFont = element.getAttribute('data-font');\n if (dataFont) {\n return dataFont\n .replace(/\\bs\\b/g, 'sb')\n .replace(/\\bsemibold\\b/g, 'sb')\n .replace(/\\bregular\\b/g, 'r');\n }\n\n const style = window.getComputedStyle(element);\n return `${Math.round(parseFloat(style.fontSize))}px ${style.fontWeight}`;\n}\n\nfunction getPlacerMediaItems(\n element: Element,\n label: string,\n file: string | undefined\n) {\n if (!isPlacerMediaOutlineNode(label, file)) return undefined;\n\n const mediaItems: SectionOutlineMediaItem[] = [];\n const seen = new Set<string>();\n const addMediaItem = (\n target: Element,\n type: SectionOutlineMediaItem['type'],\n url: string | null | undefined\n ) => {\n const normalizedUrl = normalizeOutlineValue(url);\n if (!normalizedUrl) return;\n\n const variant = getPlacerMediaVariant(target, element);\n const key = `${variant}:${type}:${normalizedUrl}`;\n if (seen.has(key)) return;\n seen.add(key);\n mediaItems.push({ type, url: normalizedUrl, variant });\n };\n\n if (element instanceof HTMLVideoElement) {\n addMediaItem(element, 'video', getVideoElementUrl(element));\n addMediaItem(element, 'image', element.getAttribute('poster'));\n }\n if (element instanceof HTMLImageElement) {\n addMediaItem(element, 'image', getMediaElementUrl(element));\n }\n if (element instanceof HTMLSourceElement) {\n addMediaItem(element, 'video', getSourceElementUrl(element));\n }\n\n Array.from(element.querySelectorAll('video')).forEach((video) => {\n addMediaItem(video, 'video', getVideoElementUrl(video));\n addMediaItem(video, 'image', video.getAttribute('poster'));\n });\n Array.from(element.querySelectorAll('source')).forEach((source) => {\n addMediaItem(source, 'video', getSourceElementUrl(source));\n });\n Array.from(element.querySelectorAll('img')).forEach((img) => {\n addMediaItem(img, 'image', getMediaElementUrl(img));\n });\n\n return mediaItems.length > 0 ? mediaItems : undefined;\n}\n\nfunction isPlacerMediaOutlineNode(label: string, file: string | undefined) {\n return `${label} ${file ?? ''}`.toLowerCase().includes('placermedia');\n}\n\nfunction getPlacerMediaVariant(\n target: Element,\n root: Element\n): SectionOutlineMediaItem['variant'] {\n let current: Element | null = target;\n while (current) {\n if (current.classList.contains('d-block-pc')) return 'desktop';\n if (current.classList.contains('d-block-m')) return 'mobile';\n if (current === root) break;\n current = current.parentElement;\n }\n\n return 'media';\n}\n\nfunction getVideoElementUrl(video: HTMLVideoElement) {\n return (\n video.currentSrc ||\n video.getAttribute('src') ||\n video.querySelector('source')?.getAttribute('src') ||\n video.getAttribute('poster') ||\n video.src\n );\n}\n\nfunction getSourceElementUrl(source: HTMLSourceElement) {\n return source.getAttribute('src') || source.src;\n}\n\nfunction getMediaElementUrl(img: HTMLImageElement) {\n return img.currentSrc || img.getAttribute('src') || img.src;\n}\n\nfunction getOutlineSourceKey(source: DomSourceHint) {\n return getSourceFileCompareKey(source.file);\n}\n\nfunction getOutlineLabel(\n element: Element,\n source: DomSourceHint | undefined,\n fallback: string\n) {\n return (\n source?.component?.trim() ||\n getComponentNameFromSourceFile(source?.file) ||\n element.id.trim() ||\n fallback\n );\n}\n\nfunction isHiddenOutlineNode(\n label: string,\n file: string | undefined,\n options: GetSourceCandidatesOptions | undefined\n) {\n const ignore = options?.ignore;\n const isIgnoredSource =\n file && ignore?.length ? matchesIgnore(file, ignore) : false;\n return isCoreOutlineNode(label, file) || isIgnoredSource;\n}\n\nfunction shouldStopOutlineBranch(\n label: string,\n file: string | undefined,\n options: GetSourceCandidatesOptions | undefined\n) {\n return !options?.includePlacer && isPlacerOutlineNode(label, file);\n}\n\nfunction isSkippedOutlineNode(\n label: string,\n file: string | undefined,\n options: GetSourceCandidatesOptions | undefined\n) {\n return (\n shouldStopOutlineBranch(label, file, options) ||\n isHiddenOutlineNode(label, file, options)\n );\n}\n\nfunction isPlacerOutlineNode(label: string, file: string | undefined) {\n return `${label} ${file ?? ''}`.toLowerCase().includes('placer');\n}\n","import { clamp } from '../../core/geometry';\nimport { runWithAutoScrollBehavior } from '../../core/scroll';\nimport type { ReviewMode } from '../../types';\nimport type { ReviewShellWriteMode } from '../types';\nimport type { SectionOutlineEntry } from '../section.outline';\n\nexport const getReviewModeWriteMode = (\n mode: ReviewMode\n): ReviewShellWriteMode | null => {\n if (mode === 'element') return 'dom';\n if (mode === 'note' || mode === 'area') return mode;\n return null;\n};\n\nexport const waitForFrame = (targetWindow: Window | null | undefined) =>\n new Promise<void>((resolve) => {\n (targetWindow ?? window).requestAnimationFrame(() => resolve());\n });\n\nexport const waitForMs = (ms: number) =>\n new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n\nconst getScrollElement = (targetDocument: Document) =>\n targetDocument.scrollingElement as HTMLElement | null;\n\nexport const scrollElementInTarget = (\n element: Element,\n block: 'center' | 'start'\n) => {\n const targetWindow = element.ownerDocument.defaultView;\n if (!targetWindow) return;\n\n const targetDocument = element.ownerDocument;\n const scrollElement = getScrollElement(targetDocument);\n const rect = element.getBoundingClientRect();\n const currentLeft = scrollElement?.scrollLeft ?? targetWindow.scrollX;\n const currentTop = scrollElement?.scrollTop ?? targetWindow.scrollY;\n const clientWidth = scrollElement?.clientWidth ?? targetWindow.innerWidth;\n const clientHeight = scrollElement?.clientHeight ?? targetWindow.innerHeight;\n const scrollWidth =\n scrollElement?.scrollWidth ?? targetDocument.documentElement.scrollWidth;\n const scrollHeight =\n scrollElement?.scrollHeight ??\n targetDocument.documentElement.scrollHeight;\n const nextLeft = clamp(\n currentLeft + rect.left + rect.width / 2 - clientWidth / 2,\n 0,\n Math.max(0, scrollWidth - clientWidth)\n );\n const nextTop =\n block === 'center'\n ? clamp(\n currentTop + rect.top + rect.height / 2 - clientHeight / 2,\n 0,\n Math.max(0, scrollHeight - clientHeight)\n )\n : clamp(\n currentTop + rect.top,\n 0,\n Math.max(0, scrollHeight - clientHeight)\n );\n\n runWithAutoScrollBehavior(targetDocument, () => {\n if (scrollElement) {\n scrollElement.scrollLeft = Math.round(nextLeft);\n scrollElement.scrollTop = Math.round(nextTop);\n return;\n }\n\n targetWindow.scrollTo(Math.round(nextLeft), Math.round(nextTop));\n });\n};\n\nexport const centerFrameScrollOnElement = (\n frameScroll: HTMLDivElement | null,\n frame: HTMLIFrameElement | null,\n element: Element\n) => {\n if (!frameScroll || !frame) return;\n\n const frameScrollRect = frameScroll.getBoundingClientRect();\n const frameRect = frame.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n const elementHostCenterX =\n frameRect.left + elementRect.left + elementRect.width / 2;\n const elementHostCenterY =\n frameRect.top + elementRect.top + elementRect.height / 2;\n const visibleCenterX = frameScrollRect.left + frameScrollRect.width / 2;\n const visibleCenterY = frameScrollRect.top + frameScrollRect.height / 2;\n const nextLeft = clamp(\n frameScroll.scrollLeft + elementHostCenterX - visibleCenterX,\n 0,\n Math.max(0, frameScroll.scrollWidth - frameScroll.clientWidth)\n );\n const nextTop = clamp(\n frameScroll.scrollTop + elementHostCenterY - visibleCenterY,\n 0,\n Math.max(0, frameScroll.scrollHeight - frameScroll.clientHeight)\n );\n const previousScrollBehavior = frameScroll.style.scrollBehavior;\n\n frameScroll.style.scrollBehavior = 'auto';\n frameScroll.scrollLeft = Math.round(nextLeft);\n frameScroll.scrollTop = Math.round(nextTop);\n frameScroll.style.scrollBehavior = previousScrollBehavior;\n};\n\nexport const getSectionOutlineFilterTerms = (value: string) =>\n value\n .trim()\n .toLowerCase()\n .split(/\\s+/)\n .filter(Boolean);\n\nexport const getSectionOutlineEntryCount = (\n entries: SectionOutlineEntry[]\n): number =>\n entries.reduce(\n (count, entry) => count + 1 + getSectionOutlineEntryCount(entry.children),\n 0\n );\n\nexport const getDefaultCollapsedSectionOutlineIds = (\n entries: SectionOutlineEntry[]\n) => {\n const collapsedIds = new Set<string>();\n const visit = (entry: SectionOutlineEntry) => {\n if (entry.children.length > 0) {\n collapsedIds.add(entry.id);\n }\n entry.children.forEach(visit);\n };\n\n entries.forEach(visit);\n return collapsedIds;\n};\n\nexport const getLiveSectionOutlineRect = (entry: SectionOutlineEntry) => {\n if (!entry.element.isConnected) return entry.metadata.rect;\n\n const rect = entry.element.getBoundingClientRect();\n return {\n top: Math.round(rect.top),\n left: Math.round(rect.left),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n };\n};\n\nconst matchesSectionOutlineFilter = (\n entry: SectionOutlineEntry,\n terms: string[]\n) => {\n if (terms.length === 0) return true;\n\n const text = [\n entry.label,\n entry.filePath,\n entry.source?.file,\n entry.data?.file,\n entry.metadata.textValue,\n entry.metadata.fontLabel,\n entry.metadata.mediaItems\n ?.map((mediaItem) => `${mediaItem.variant} ${mediaItem.type} ${mediaItem.url}`)\n .join(' '),\n entry.metadata.classNames?.join(' '),\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n\n return terms.every((term) => text.includes(term));\n};\n\nexport const filterSectionOutlineEntries = (\n entries: SectionOutlineEntry[],\n terms: string[]\n): SectionOutlineEntry[] => {\n if (terms.length === 0) return entries;\n\n return entries.flatMap((entry) => {\n const children = filterSectionOutlineEntries(entry.children, terms);\n if (!matchesSectionOutlineFilter(entry, terms) && children.length === 0) {\n return [];\n }\n\n return [{ ...entry, children }];\n });\n};\n","import React from 'react';\nimport {\n ChevronDown as ChevronDownIcon,\n Code2 as Code2Icon,\n Database as DatabaseIcon,\n Image as ImageIcon,\n Search as SearchIcon,\n SquareDashed as SquareDashedIcon,\n SquareMousePointer as SquareMousePointerIcon,\n Type as TypeIcon,\n X as XIcon,\n} from 'lucide-react';\nimport type { SectionOutlineEntry } from '../section.outline';\nimport type { StoredSourceTreeMetaVisibility } from '../settings';\nimport { getLiveSectionOutlineRect } from './shell.helpers';\n\ntype SourceTreeMetaVisibilityKey = keyof StoredSourceTreeMetaVisibility;\n\ntype SectionOutlinePanelProps = {\n isPanelVisible: boolean;\n isFiltering: boolean;\n filteredCount: number;\n totalCount: number;\n rootCount: number;\n filter: string;\n entries: SectionOutlineEntry[];\n collapsedIds: Set<string>;\n canWriteDom: boolean;\n isBoxMetaVisible: boolean;\n isFontMetaVisible: boolean;\n isMediaMetaVisible: boolean;\n isClassMetaVisible: boolean;\n onToggleMeta: (key: SourceTreeMetaVisibilityKey) => void;\n onFilterChange: (value: string) => void;\n onToggleEntry: (entryId: string) => void;\n onScrollToSection: (entry: SectionOutlineEntry) => void;\n onOpenData: (entry: SectionOutlineEntry) => void;\n onOpenSource: (entry: SectionOutlineEntry) => void;\n onStartDomReview: (entry: SectionOutlineEntry) => void;\n onHoverElement: (element: Element) => void;\n onClearHover: () => void;\n};\n\nexport const SectionOutlinePanel = ({\n isPanelVisible,\n isFiltering,\n filteredCount,\n totalCount,\n rootCount,\n filter,\n entries,\n collapsedIds,\n canWriteDom,\n isBoxMetaVisible,\n isFontMetaVisible,\n isMediaMetaVisible,\n isClassMetaVisible,\n onToggleMeta,\n onFilterChange,\n onToggleEntry,\n onScrollToSection,\n onOpenData,\n onOpenSource,\n onStartDomReview,\n onHoverElement,\n onClearHover,\n}: SectionOutlinePanelProps) => {\n const renderMeta = (entry: SectionOutlineEntry) => {\n const { metadata } = entry;\n const rows: React.ReactNode[] = [];\n const metaPaddingLeft = 29;\n const rect = getLiveSectionOutlineRect(entry);\n\n if (isBoxMetaVisible) {\n rows.push(\n <span className=\"df-review-section-outline-meta-row\" key=\"box\">\n <b>box</b>\n <code>\n top {rect.top} / left {rect.left} / width {rect.width} / height{' '}\n {rect.height}\n </code>\n </span>\n );\n }\n\n if (metadata.textValue) {\n rows.push(\n <span\n className=\"df-review-section-outline-meta-row is-text\"\n key=\"text\"\n >\n <b>text</b>\n <code>{metadata.textValue}</code>\n </span>\n );\n }\n\n if (isFontMetaVisible && metadata.fontLabel) {\n rows.push(\n <span className=\"df-review-section-outline-meta-row\" key=\"font\">\n <b>font</b>\n <code>{metadata.fontLabel}</code>\n </span>\n );\n }\n\n if (isMediaMetaVisible && metadata.mediaItems?.length) {\n metadata.mediaItems.forEach((mediaItem) => {\n const mediaKey = `${mediaItem.variant}:${mediaItem.type}:${mediaItem.url}`;\n const mediaLabel =\n mediaItem.variant === 'media' ? mediaItem.type : mediaItem.variant;\n rows.push(\n <span\n className=\"df-review-section-outline-meta-row is-media\"\n key={mediaKey}\n >\n <b>{mediaLabel}</b>\n <a\n className=\"df-review-section-outline-media-link\"\n href={mediaItem.url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n title={`${mediaLabel} ${mediaItem.type}`}\n >\n <code>{mediaItem.url}</code>\n </a>\n </span>\n );\n });\n }\n\n if (isClassMetaVisible && metadata.classNames?.length) {\n rows.push(\n <span className=\"df-review-section-outline-meta-row is-class\" key=\"class\">\n <b>class</b>\n <span className=\"df-review-section-outline-class-tags\">\n {metadata.classNames.map((className) => (\n <code key={className}>{className}</code>\n ))}\n </span>\n </span>\n );\n }\n\n if (rows.length === 0) return null;\n\n return (\n <div\n className=\"df-review-section-outline-meta\"\n style={{ paddingLeft: `${metaPaddingLeft}px` }}\n >\n {rows}\n </div>\n );\n };\n\n const renderEntry = (entry: SectionOutlineEntry): React.ReactNode => {\n const hasChildren = entry.children.length > 0;\n const isCollapsed = !isFiltering && collapsedIds.has(entry.id);\n const liveRect = getLiveSectionOutlineRect(entry);\n const isZeroArea = liveRect.width <= 0 || liveRect.height <= 0;\n\n return (\n <div\n className={`df-review-section-outline-item is-depth-${entry.depth}`}\n key={entry.id}\n >\n <div\n className=\"df-review-section-outline-entry-body\"\n onMouseEnter={() => onHoverElement(entry.element)}\n onMouseLeave={onClearHover}\n onMouseOver={() => onHoverElement(entry.element)}\n onMouseOut={(event) => {\n if (\n event.relatedTarget instanceof Node &&\n event.currentTarget.contains(event.relatedTarget)\n ) {\n return;\n }\n onClearHover();\n }}\n onPointerEnter={() => onHoverElement(entry.element)}\n onPointerLeave={onClearHover}\n >\n <div\n className=\"df-review-section-outline-row\"\n style={{ paddingLeft: '6px' }}\n >\n {hasChildren ? (\n <button\n aria-label={\n isCollapsed\n ? `Expand ${entry.label}`\n : `Collapse ${entry.label}`\n }\n aria-expanded={!isCollapsed}\n className={`df-review-section-outline-toggle${\n isCollapsed ? ' is-collapsed' : ''\n }`}\n type=\"button\"\n onClick={() => onToggleEntry(entry.id)}\n >\n <ChevronDownIcon aria-hidden=\"true\" />\n </button>\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"df-review-section-outline-toggle is-placeholder\"\n />\n )}\n <button\n className=\"df-review-section-outline-name\"\n title={entry.filePath}\n type=\"button\"\n onClick={() => onScrollToSection(entry)}\n >\n <span>{entry.label}</span>\n <small>{entry.filePath}</small>\n </button>\n <span className=\"df-review-section-outline-links\">\n <button\n aria-label={`Open ${entry.label} data`}\n className=\"df-review-section-outline-link\"\n title=\"Open data\"\n type=\"button\"\n disabled={!entry.data?.file}\n onClick={() => onOpenData(entry)}\n >\n <DatabaseIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label={`Open ${entry.label} source`}\n className=\"df-review-section-outline-link\"\n title=\"Open source\"\n type=\"button\"\n disabled={!entry.source?.file}\n onClick={() => onOpenSource(entry)}\n >\n <Code2Icon aria-hidden=\"true\" />\n </button>\n <span\n aria-hidden=\"true\"\n className=\"df-review-section-outline-divider\"\n >\n |\n </span>\n <button\n aria-label={`Start DOM QA for ${entry.label}`}\n className=\"df-review-section-outline-link is-dom-select\"\n title={isZeroArea ? 'No visible area' : 'DOM select'}\n type=\"button\"\n disabled={!canWriteDom || isZeroArea}\n onClick={() => onStartDomReview(entry)}\n >\n <SquareMousePointerIcon aria-hidden=\"true\" />\n </button>\n </span>\n </div>\n {renderMeta(entry)}\n </div>\n {hasChildren && !isCollapsed && (\n <div className=\"df-review-section-outline-children\">\n {entry.children.map(renderEntry)}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <aside\n className=\"df-review-source-tree-panel\"\n aria-hidden={!isPanelVisible}\n >\n <div id=\"df-review-section-outline\" className=\"df-review-section-outline\">\n <div className=\"df-review-section-outline-head\">\n <div className=\"df-review-section-outline-summary\">\n <span>\n <strong>Component</strong>\n <small>\n {isFiltering\n ? `${filteredCount} / ${totalCount} results`\n : `${rootCount} ${rootCount === 1 ? 'root' : 'roots'}`}\n </small>\n </span>\n <div className=\"df-review-section-outline-meta-controls\">\n <button\n aria-label=\"Toggle source tree box metadata\"\n aria-pressed={isBoxMetaVisible}\n className={`df-review-section-outline-meta-toggle${\n isBoxMetaVisible ? ' is-active' : ''\n }`}\n title=\"top / left / width / height\"\n type=\"button\"\n onClick={() => onToggleMeta('box')}\n >\n <SquareDashedIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Toggle source tree font metadata\"\n aria-pressed={isFontMetaVisible}\n className={`df-review-section-outline-meta-toggle${\n isFontMetaVisible ? ' is-active' : ''\n }`}\n title=\"font size / weight\"\n type=\"button\"\n onClick={() => onToggleMeta('font')}\n >\n <TypeIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Toggle source tree media metadata\"\n aria-pressed={isMediaMetaVisible}\n className={`df-review-section-outline-meta-toggle${\n isMediaMetaVisible ? ' is-active' : ''\n }`}\n title=\"media urls\"\n type=\"button\"\n onClick={() => onToggleMeta('media')}\n >\n <ImageIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Toggle source tree class metadata\"\n aria-pressed={isClassMetaVisible}\n className={`df-review-section-outline-meta-toggle${\n isClassMetaVisible ? ' is-active' : ''\n }`}\n title=\"class names\"\n type=\"button\"\n onClick={() => onToggleMeta('className')}\n >\n <Code2Icon aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n <div className=\"df-review-section-outline-filter\">\n <SearchIcon aria-hidden=\"true\" />\n <input\n aria-label=\"Filter source tree\"\n type=\"text\"\n value={filter}\n placeholder=\"Filter\"\n autoComplete=\"off\"\n enterKeyHint=\"search\"\n spellCheck={false}\n onChange={(event) => onFilterChange(event.currentTarget.value)}\n />\n {filter && (\n <button\n aria-label=\"Clear source tree filter\"\n className=\"df-review-section-outline-filter-clear\"\n type=\"button\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onFilterChange('')}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n {entries.length > 0 ? (\n <div className=\"df-review-section-outline-list\">\n {entries.map(renderEntry)}\n </div>\n ) : (\n <div className=\"df-review-section-outline-empty\">\n {isFiltering ? 'No source matches' : 'No sections found'}\n </div>\n )}\n </div>\n </aside>\n );\n};\n","// Source-select 단축키(Alt) 활성 시 target iframe 문서에 주입되는 CSS.\n// crosshair 커서, \"Source select\" 안내 배지, data-font 힌트 오버레이 스타일을 담는다.\n// 셸 문서가 아니라 iframe 내부에 주입되므로 모든 규칙에 !important 를 붙여 페이지 스타일을 덮는다.\nexport function createSourceShortcutStyle(\n optionAttribute: string,\n fontOverlayAttribute: string,\n): string {\n return `\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: 500 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: 500 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","import React from 'react';\nimport type { SourceCandidate } from '../source.open';\n\nexport type SourceInspectorRect = {\n height: number;\n left: number;\n top: number;\n width: number;\n};\n\nexport type SourceInspectorCandidate = SourceCandidate & {\n openUrl: string | null;\n};\n\nexport type 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\ntype SourceInspectorOverlayProps = {\n state: SourceInspectorState | null;\n interactionRef: React.MutableRefObject<boolean>;\n onClear: () => void;\n onOpenCandidate: (candidate: SourceInspectorCandidate) => void;\n};\n\nexport const SourceInspectorOverlay = ({\n state,\n interactionRef,\n onClear,\n onOpenCandidate,\n}: SourceInspectorOverlayProps) => {\n if (!state) return null;\n\n return (\n <>\n <div\n className={`df-review-source-outline${\n state.isPinned ? ' is-pinned' : ''\n }`}\n style={{\n height: `${state.rect.height}px`,\n left: `${state.rect.left}px`,\n top: `${state.rect.top}px`,\n width: `${state.rect.width}px`,\n }}\n />\n {state.candidates.length > 0 && (\n <div\n className={`df-review-source-popover${\n state.isPinned ? ' is-pinned' : ''\n }`}\n style={{\n left:\n state.panelRight === null\n ? `${state.panelLeft}px`\n : undefined,\n maxWidth: `${state.panelMaxWidth}px`,\n right:\n state.panelRight === null\n ? undefined\n : `${state.panelRight}px`,\n top: `${state.panelTop}px`,\n }}\n onPointerDown={() => {\n interactionRef.current = true;\n }}\n onPointerEnter={() => {\n interactionRef.current = true;\n }}\n onPointerLeave={() => {\n interactionRef.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={onClear}\n >\n ×\n </button>\n </div>\n <div className=\"df-review-source-candidate-list\">\n {state.candidates.map((candidate) => (\n <button\n key={candidate.id}\n className={`df-review-source-candidate is-${candidate.kind}`}\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onOpenCandidate(candidate);\n }}\n >\n <span className=\"df-review-source-candidate-main\">\n <strong>{candidate.label}</strong>\n <span>{candidate.filePath}</span>\n <small>{candidate.positionLabel || '-:-'}</small>\n </span>\n </button>\n ))}\n </div>\n </div>\n )}\n </>\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 { useCallback, useEffect, useRef, type RefObject } from 'react';\nimport type { ReviewFigmaImage } from '../../figma/image.types';\nimport type { ReviewFigmaImageOverlayItemState } from '../figma/image.overlay.controller';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\nconst TARGET_FIGMA_IMAGE_ROOT_ID = 'df-review-figma-image-target-root';\nconst TARGET_FIGMA_IMAGE_STYLE_ID = 'df-review-figma-image-target-style';\nconst TARGET_FIGMA_IMAGE_ID_ATTRIBUTE = 'data-df-review-figma-image-id';\nconst targetFigmaImageDragStates = new WeakMap<\n HTMLElement,\n {\n overlayId: string;\n pointerId: number;\n startClientY: number;\n startOffsetY: number;\n }\n>();\n\nexport type ReviewTargetFigmaImageOverlay = {\n id: string;\n imageUrl: string;\n isLocked?: boolean;\n label?: string;\n mode?: 'normal' | 'invert';\n offsetY?: number;\n opacity: number;\n zIndex: number;\n};\n\nexport function createReviewTargetFigmaImageOverlays({\n imageOverlayStates,\n images,\n}: {\n imageOverlayStates: Record<string, ReviewFigmaImageOverlayItemState>;\n images: ReviewFigmaImage[];\n}): ReviewTargetFigmaImageOverlay[] {\n return images.flatMap((image, index) => {\n const overlayState = imageOverlayStates[image.id];\n if (!overlayState?.isVisible) return [];\n\n return [\n {\n id: image.id,\n imageUrl: image.imageUrl,\n isLocked: overlayState.isLocked,\n label: image.label ?? image.nodeId,\n mode: overlayState.mode,\n offsetY: overlayState.offsetY,\n opacity: overlayState.opacity,\n zIndex: images.length - index,\n },\n ];\n });\n}\n\ninterface UseTargetFigmaImageOverlaysOptions {\n figmaImageOverlays: ReviewTargetFigmaImageOverlay[];\n iframeRef: RefObject<HTMLIFrameElement | null>;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onSetOverlayOffsetY?: (id: string, offsetY: number) => void;\n}\n\nexport const useTargetFigmaImageOverlays = ({\n figmaImageOverlays,\n iframeRef,\n onSetOverlayOffsetY,\n size,\n targetSrc,\n}: UseTargetFigmaImageOverlaysOptions) => {\n const targetDocumentRef = useRef<Document | null>(null);\n const overlaySignature = createTargetFigmaImageOverlaySignature(\n figmaImageOverlays\n );\n\n const syncTargetFigmaImageOverlays = useCallback(() => {\n let targetDocument: Document | null | undefined;\n\n try {\n targetDocument = iframeRef.current?.contentDocument;\n } catch {\n targetDocument = null;\n }\n\n if (!targetDocument?.body) return;\n if (\n targetDocumentRef.current &&\n targetDocumentRef.current !== targetDocument\n ) {\n removeTargetFigmaImageOverlays(targetDocumentRef.current);\n }\n\n targetDocumentRef.current = targetDocument;\n renderTargetFigmaImageOverlays({\n onSetOverlayOffsetY,\n overlays: figmaImageOverlays,\n size,\n targetDocument,\n });\n }, [\n iframeRef,\n onSetOverlayOffsetY,\n overlaySignature,\n size,\n targetSrc,\n ]);\n\n useEffect(() => {\n syncTargetFigmaImageOverlays();\n }, [syncTargetFigmaImageOverlays]);\n\n useEffect(() => {\n return () => {\n if (!targetDocumentRef.current) return;\n removeTargetFigmaImageOverlays(targetDocumentRef.current);\n targetDocumentRef.current = null;\n };\n }, []);\n\n return syncTargetFigmaImageOverlays;\n};\n\nexport function renderTargetFigmaImageOverlays({\n onSetOverlayOffsetY,\n overlays,\n size,\n targetDocument,\n}: {\n onSetOverlayOffsetY?: (id: string, offsetY: number) => void;\n overlays: ReviewTargetFigmaImageOverlay[];\n size: ReviewShellViewportPreset;\n targetDocument: Document;\n}) {\n if (overlays.length === 0) {\n removeTargetFigmaImageOverlays(targetDocument);\n return;\n }\n\n const isMobileViewport = getViewportPresetKind(size) === 'mobile';\n const fixedOverlayWidth = getTargetFigmaImageFixedWidth(size);\n const root = ensureTargetFigmaImageRoot(targetDocument);\n const existingElements = new Map(\n Array.from(\n root.querySelectorAll<HTMLElement>(\n `[${TARGET_FIGMA_IMAGE_ID_ATTRIBUTE}]`\n )\n ).flatMap((element) => {\n const id = element.getAttribute(TARGET_FIGMA_IMAGE_ID_ATTRIBUTE);\n return id ? [[id, element] as const] : [];\n })\n );\n const nextIds = new Set(overlays.map((overlay) => overlay.id));\n\n existingElements.forEach((element, id) => {\n if (!nextIds.has(id)) element.remove();\n });\n\n overlays.forEach((overlay) => {\n let element = existingElements.get(overlay.id);\n let image = element?.querySelector('img') ?? null;\n\n if (!element) {\n element = targetDocument.createElement('div');\n element.className = 'df-review-figma-image-target-overlay';\n element.setAttribute(TARGET_FIGMA_IMAGE_ID_ATTRIBUTE, overlay.id);\n image = targetDocument.createElement('img');\n image.alt = '';\n image.draggable = false;\n element.appendChild(image);\n }\n\n if (image && image.getAttribute('src') !== overlay.imageUrl) {\n image.setAttribute('src', overlay.imageUrl);\n }\n\n element.setAttribute('aria-label', overlay.label ?? 'Figma image overlay');\n element.setAttribute('role', 'img');\n element.dataset.viewport = isMobileViewport ? 'mobile' : 'fixed';\n element.style.filter = overlay.mode === 'invert' ? 'invert(1)' : '';\n element.style.left = isMobileViewport ? '0' : '50%';\n element.style.opacity = String(overlay.opacity);\n element.style.pointerEvents =\n overlay.isLocked || !onSetOverlayOffsetY ? 'none' : 'auto';\n element.style.top = `${normalizeTargetFigmaImageOffsetY(\n overlay.offsetY\n )}px`;\n element.style.transform = isMobileViewport ? 'none' : 'translateX(-50%)';\n element.style.width = isMobileViewport ? '100%' : `${fixedOverlayWidth}px`;\n element.style.zIndex = String(overlay.zIndex);\n attachTargetFigmaImageDrag({\n element,\n onSetOverlayOffsetY,\n overlay,\n });\n\n root.appendChild(element);\n });\n}\n\nfunction attachTargetFigmaImageDrag({\n element,\n onSetOverlayOffsetY,\n overlay,\n}: {\n element: HTMLElement;\n onSetOverlayOffsetY?: (id: string, offsetY: number) => void;\n overlay: ReviewTargetFigmaImageOverlay;\n}) {\n if (overlay.isLocked || !onSetOverlayOffsetY) {\n targetFigmaImageDragStates.delete(element);\n element.classList.remove('is-dragging');\n element.onpointerdown = null;\n element.onpointermove = null;\n element.onpointerup = null;\n element.onpointercancel = null;\n return;\n }\n\n element.onpointerdown = (event) => {\n if (event.button !== 0) return;\n\n event.preventDefault();\n event.stopPropagation();\n element.setPointerCapture(event.pointerId);\n element.classList.add('is-dragging');\n targetFigmaImageDragStates.set(element, {\n overlayId: overlay.id,\n pointerId: event.pointerId,\n startClientY: event.clientY,\n startOffsetY: normalizeTargetFigmaImageOffsetY(overlay.offsetY),\n });\n };\n\n element.onpointermove = (event) => {\n const dragState = targetFigmaImageDragStates.get(element);\n if (!dragState || dragState.pointerId !== event.pointerId) return;\n\n event.preventDefault();\n event.stopPropagation();\n const nextOffsetY = Math.round(\n dragState.startOffsetY + event.clientY - dragState.startClientY\n );\n element.style.top = `${nextOffsetY}px`;\n onSetOverlayOffsetY(dragState.overlayId, nextOffsetY);\n };\n\n const stopDrag = (event: PointerEvent) => {\n const dragState = targetFigmaImageDragStates.get(element);\n if (!dragState || dragState.pointerId !== event.pointerId) return;\n\n event.preventDefault();\n event.stopPropagation();\n if (element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n element.classList.remove('is-dragging');\n targetFigmaImageDragStates.delete(element);\n };\n\n element.onpointerup = stopDrag;\n element.onpointercancel = stopDrag;\n}\n\nfunction ensureTargetFigmaImageRoot(targetDocument: Document) {\n ensureTargetFigmaImageStyle(targetDocument);\n\n const [existingRoot, ...duplicateRoots] = Array.from(\n targetDocument.querySelectorAll<HTMLElement>(\n `#${TARGET_FIGMA_IMAGE_ROOT_ID}`\n )\n );\n duplicateRoots.forEach((root) => root.remove());\n if (existingRoot) return existingRoot;\n\n const root = targetDocument.createElement('div');\n root.id = TARGET_FIGMA_IMAGE_ROOT_ID;\n root.setAttribute('aria-hidden', 'true');\n targetDocument.body.appendChild(root);\n return root;\n}\n\nfunction ensureTargetFigmaImageStyle(targetDocument: Document) {\n if (targetDocument.getElementById(TARGET_FIGMA_IMAGE_STYLE_ID)) return;\n\n const style = targetDocument.createElement('style');\n style.id = TARGET_FIGMA_IMAGE_STYLE_ID;\n style.textContent = `\n #${TARGET_FIGMA_IMAGE_ROOT_ID} {\n position: absolute;\n left: 0;\n top: 0;\n z-index: 2147483000;\n width: 100%;\n height: 0;\n overflow: visible;\n pointer-events: none;\n }\n\n #${TARGET_FIGMA_IMAGE_ROOT_ID} .df-review-figma-image-target-overlay {\n position: absolute;\n display: block;\n cursor: grab;\n user-select: none;\n -webkit-user-select: none;\n touch-action: none;\n will-change: opacity, top, transform;\n }\n\n #${TARGET_FIGMA_IMAGE_ROOT_ID} .df-review-figma-image-target-overlay.is-dragging {\n cursor: grabbing;\n }\n\n #${TARGET_FIGMA_IMAGE_ROOT_ID} .df-review-figma-image-target-overlay img {\n display: block;\n width: 100%;\n max-width: none;\n height: auto;\n pointer-events: none;\n user-select: none;\n -webkit-user-drag: none;\n -webkit-user-select: none;\n }\n `;\n targetDocument.head?.appendChild(style);\n}\n\nexport function removeTargetFigmaImageOverlays(targetDocument: Document) {\n targetDocument\n .querySelectorAll(`#${TARGET_FIGMA_IMAGE_ROOT_ID}`)\n .forEach((element) => element.remove());\n targetDocument\n .querySelectorAll(`#${TARGET_FIGMA_IMAGE_STYLE_ID}`)\n .forEach((element) => element.remove());\n}\n\nfunction createTargetFigmaImageOverlaySignature(\n overlays: ReviewTargetFigmaImageOverlay[]\n) {\n return overlays\n .map((overlay) =>\n [\n overlay.id,\n overlay.imageUrl,\n overlay.label ?? '',\n overlay.isLocked ? 'locked' : 'unlocked',\n overlay.mode ?? '',\n overlay.offsetY ?? 0,\n overlay.opacity,\n overlay.zIndex,\n ].join(':')\n )\n .join('|');\n}\n\nfunction getTargetFigmaImageFixedWidth(size: ReviewShellViewportPreset) {\n const width = size.designWidth ?? size.width;\n return Math.max(1, Math.round(width));\n}\n\nfunction normalizeTargetFigmaImageOffsetY(value: unknown) {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n","import type { RefObject } from 'react';\nimport type { ReviewMode } from '../../types';\nimport type {\n ReviewRulerMeasure,\n ReviewRulerPoint,\n ReviewShellViewportPreset,\n} from '../types';\nimport { ReviewModeToolbar } from '../review/mode.toolbar';\nimport { RulerGutters } from '../ruler/gutters';\nimport { RulerOverlay } from '../ruler/overlay';\nimport {\n useTargetFigmaImageOverlays,\n type ReviewTargetFigmaImageOverlay,\n} from './figma.image.overlay';\n\ninterface ReviewTargetFrameProps {\n canWriteArea: boolean;\n canWriteDom: boolean;\n figmaImageOverlays: ReviewTargetFigmaImageOverlay[];\n frameScrollRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerAvailable: boolean;\n isRulerDragging: boolean;\n isRulerVisible: boolean;\n mode: ReviewMode;\n rulerHover: ReviewRulerPoint | null;\n rulerMeasure: ReviewRulerMeasure | undefined;\n rulerMeasureLabel: string;\n rulerOverlayRef: RefObject<HTMLDivElement | null>;\n rulerScaleX: number;\n rulerScaleY: number;\n rulerUnit: string;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onLoadTarget: () => void;\n onSetFigmaImageOverlayOffsetY?: (id: string, offsetY: number) => void;\n onSetReviewMode: (mode: ReviewMode) => void;\n}\n\nexport const ReviewTargetFrame = ({\n canWriteArea,\n canWriteDom,\n figmaImageOverlays,\n frameScrollRef,\n iframeRef,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n mode,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n size,\n targetSrc,\n onLoadTarget,\n onSetFigmaImageOverlayOffsetY,\n onSetReviewMode,\n}: ReviewTargetFrameProps) => {\n const showRuler = isRulerVisible && isRulerAvailable;\n const syncTargetFigmaImageOverlays = useTargetFigmaImageOverlays({\n figmaImageOverlays,\n iframeRef,\n onSetOverlayOffsetY: onSetFigmaImageOverlayOffsetY,\n size,\n targetSrc,\n });\n const handleLoadTarget = () => {\n onLoadTarget();\n syncTargetFigmaImageOverlays();\n window.requestAnimationFrame(syncTargetFigmaImageOverlays);\n };\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={handleLoadTarget}\n />\n {showRuler && (\n <RulerOverlay\n iframeRef={iframeRef}\n isRulerDragging={isRulerDragging}\n rulerHover={rulerHover}\n rulerMeasure={rulerMeasure}\n rulerMeasureLabel={rulerMeasureLabel}\n rulerOverlayRef={rulerOverlayRef}\n size={size}\n />\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"df-review-frame-actions\">\n <ReviewModeToolbar\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n mode={mode}\n onSetReviewMode={onSetReviewMode}\n />\n </div>\n </div>\n </main>\n );\n};\n","import type { TargetOverlayState } from '../types';\n\nconst HIDE_SCROLLBAR_STYLE_ID = 'df-review-hide-scrollbar';\nconst 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 Copy as CopyIcon,\n ExternalLink as ExternalLinkIcon,\n LayoutGrid as LayoutGridIcon,\n Map as MapIcon,\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n RefreshCw as RefreshCwIcon,\n Ruler as RulerIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n} from 'lucide-react';\nimport type { ChangeEvent } from 'react';\nimport type { ReviewItemScope } from '../index';\nimport { FIGMA_OVERLAY_UNAVAILABLE_MESSAGE } from './constants';\nimport { FigmaMarkIcon } from './figma/figma-mark-icon';\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 figmaOverlayUnavailableMessage?: string;\n isFigmaOverlayActive: boolean;\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 onToggleFigmaOverlay: () => void;\n onToggleTargetOverlay: (key: TargetOverlayKey) => 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\nconst getPresetSelectValue = (preset: ReviewShellViewportPreset) =>\n `${preset.label}:${preset.width}x${preset.height}`;\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\nexport const ReviewTopbar = ({\n draftTarget,\n copyLabel,\n viewportPresets,\n size,\n presetScopeCounts,\n isRulerAvailable,\n isRulerVisible,\n targetOverlayState,\n figmaOverlayUnavailableMessage = FIGMA_OVERLAY_UNAVAILABLE_MESSAGE,\n isFigmaOverlayActive,\n isFigmaOverlayAvailable,\n onDraftTargetChange,\n onApplyTarget,\n onOpenSitemap,\n onCopyCurrentUrl,\n onSizeChange,\n onToggleRuler,\n onToggleFigmaOverlay,\n onToggleTargetOverlay,\n}: ReviewTopbarProps) => {\n const selectedPresetValue = getPresetSelectValue(size);\n const targetHref = getTargetOpenHref(draftTarget);\n const handlePresetSelectChange = (event: ChangeEvent<HTMLSelectElement>) => {\n const nextPreset = viewportPresets.find(\n (preset) => getPresetSelectValue(preset) === event.currentTarget.value\n );\n if (nextPreset) onSizeChange(nextPreset);\n };\n\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 <div className=\"df-review-address-actions\">\n <button\n aria-label=\"Refresh target\"\n className=\"df-review-address-icon-button\"\n title=\"Refresh target\"\n type=\"submit\"\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label={copyLabel}\n className=\"df-review-address-icon-button\"\n title={copyLabel}\n type=\"button\"\n onClick={onCopyCurrentUrl}\n >\n <CopyIcon aria-hidden=\"true\" />\n </button>\n <a\n aria-label=\"Open target page\"\n className=\"df-review-address-icon-button\"\n href={targetHref}\n rel=\"noreferrer\"\n target=\"_blank\"\n title=\"Open target page\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n </div>\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 <select\n aria-label=\"Viewport preset\"\n className=\"df-review-preset-select\"\n value={selectedPresetValue}\n onChange={handlePresetSelectChange}\n >\n {viewportPresets.map((preset) => {\n const scope = getViewportPresetKind(preset);\n const count = presetScopeCounts.get(scope) ?? 0;\n\n return (\n <option\n key={getPresetSelectValue(preset)}\n value={getPresetSelectValue(preset)}\n >\n {`${preset.label} (${count})`}\n </option>\n );\n })}\n </select>\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 ? isFigmaOverlayActive\n ? 'Hide Figma overlays'\n : 'Show Figma overlays'\n : figmaOverlayUnavailableMessage\n }\n className={`df-review-overlay-button is-figma${\n isFigmaOverlayActive ? ' is-active' : ''\n }${isFigmaOverlayAvailable ? '' : ' is-disabled'}`}\n disabled={!isFigmaOverlayAvailable}\n type=\"button\"\n onClick={onToggleFigmaOverlay}\n >\n <FigmaMarkIcon />\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 ReviewAssigneeOption,\n ReviewFieldsConfig,\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 fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n assigneeTitle: string;\n assigneeOptions: readonly ReviewAssigneeOption[];\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 fields,\n assigneeTitle,\n assigneeOptions,\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 fields,\n assigneeTitle,\n assigneeOptions,\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 getItemFrameTarget,\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;\nconst RESTORE_SCROLL_RECHECK_DELAYS_MS = [120, 360] as const;\n\nconst waitForNextAnimationFrame = (targetWindow: Window) =>\n new Promise<void>((resolve) => {\n targetWindow.requestAnimationFrame(() => resolve());\n });\n\nconst waitForTargetTimeout = (targetWindow: Window, ms: number) =>\n new Promise<void>((resolve) => {\n targetWindow.setTimeout(resolve, ms);\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 const applyScrollPosition = () => {\n if (!isCurrentRestore()) return false;\n const currentAnchorElement =\n queryReviewItemAnchorElement(targetDocument, item) ?? anchorElement;\n\n runWithAutoScrollBehavior(targetDocument, () => {\n setDocumentScrollInstantly(\n targetWindow,\n targetDocument,\n getReviewItemRestoreScrollPosition(\n targetWindow,\n targetDocument,\n item,\n currentAnchorElement\n )\n );\n });\n onSyncTargetViewport();\n return true;\n };\n\n if (!applyScrollPosition()) return false;\n controllerRef.current?.highlightItem(item.id);\n\n for (const delay of RESTORE_SCROLL_RECHECK_DELAYS_MS) {\n await waitForTargetTimeout(targetWindow, delay);\n if (!applyScrollPosition()) return false;\n controllerRef.current?.highlightItem(item.id);\n }\n\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 nextRoute = getItemTarget(item, reviewPathPrefix);\n const nextTarget = getItemFrameTarget(item, reviewPathPrefix);\n const nextSize = getRestoredSize(item, viewportPresets);\n\n pendingInitialItemIdRef.current = null;\n pendingRestoreRef.current = item;\n selectedItemIdRef.current = item.id;\n onSelectedItemIdChange(item.id);\n onActiveRouteChange(nextRoute);\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 pendingInitialItemIdRef,\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 try {\n const item = await adapter.get(itemId);\n if (item && pendingInitialItemIdRef.current === itemId) {\n restoreReviewItem(item);\n }\n } catch {\n /* retry when the list response arrives */\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 ReviewAssigneeOption,\n ReviewFieldsConfig,\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 fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n assigneeTitle: string;\n assigneeOptions: readonly ReviewAssigneeOption[];\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 fields,\n assigneeTitle,\n assigneeOptions,\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 fields,\n assigneeTitle,\n assigneeOptions,\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 fields,\n assigneeTitle,\n assigneeOptions,\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 { MutableRefObject } from 'react';\nimport {\n getFrameRouteTarget,\n getTargetRouteKey,\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 const nextRouteKey = getTargetRouteKey(nextTarget, reviewPathPrefix);\n const currentRouteKey = getTargetRouteKey(\n targetRef.current,\n reviewPathPrefix\n );\n if (nextRouteKey === currentRouteKey) return;\n if (!pageTargets.has(nextRouteKey)) {\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(\n `${url.pathname}${url.search}${url.hash}`,\n reviewPathPrefix\n );\n const nextRouteKey = getTargetRouteKey(nextTarget, reviewPathPrefix);\n const currentRouteKey = getTargetRouteKey(\n targetRef.current,\n reviewPathPrefix\n );\n if (nextRouteKey === currentRouteKey) return;\n if (!pageTargets.has(nextRouteKey)) 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 getComposerHost: () =>\n document.querySelector<HTMLElement>('.df-review-qa-draft-host'),\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 getTargetRouteKey,\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 const nextRouteKey = getTargetRouteKey(\n normalizedTarget,\n reviewPathPrefix\n );\n\n if (normalizedTarget !== targetRef.current) {\n onClearSelectedItem();\n targetRef.current = normalizedTarget;\n onTargetChange(normalizedTarget);\n onDraftTargetChange(normalizedTarget);\n onActiveRouteChange(nextRouteKey);\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(getTargetRouteKey(target, reviewPathPrefix));\n }, [onActiveRouteChange, reviewPathPrefix, 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 { getTargetRouteKey } 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) => getTargetRouteKey(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, useMemo } from 'react';\nimport type {\n ReviewFigmaImageFormat,\n ReviewFigmaImageStore,\n ReviewFigmaRouteTarget,\n} from '../../figma/image.types';\nimport {\n DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n} from '../../figma/image.types';\nimport type { ReviewShellViewportPreset } from '../types';\nimport {\n createReviewFigmaRouteTarget,\n useReviewFigmaImageStoreController,\n} from '../figma/image.controller';\nimport { useReviewFigmaImageOverlayController } from '../figma/image.overlay.controller';\n\ninterface UseReviewFigmaImagesOptions {\n imageFormat?: ReviewFigmaImageFormat;\n pageUrl: string;\n projectId: string;\n store: ReviewFigmaImageStore | null;\n viewport: ReviewShellViewportPreset;\n}\n\nexport const useReviewFigmaImages = ({\n imageFormat = DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n pageUrl,\n projectId,\n store,\n viewport,\n}: UseReviewFigmaImagesOptions) => {\n const target = useMemo<ReviewFigmaRouteTarget>(\n () =>\n createReviewFigmaRouteTarget({\n pageUrl,\n projectId,\n viewport,\n }),\n [\n pageUrl,\n projectId,\n viewport.height,\n viewport.label,\n viewport.width,\n viewport.kind,\n ]\n );\n const {\n addImage: addStoreImage,\n deleteImage,\n error,\n images,\n isLoading,\n isMutating,\n moveImage,\n refreshImages,\n reorderImages,\n updateImage,\n } = useReviewFigmaImageStoreController({\n imageFormat,\n store,\n target,\n });\n const {\n imageOverlayStates,\n isAnyImageOverlayVisible,\n isOverlayLocked,\n isOverlayVisible,\n overlayMode,\n overlayOffsetY,\n overlayOpacity,\n resetOverlay,\n selectedImage,\n selectedImageId,\n setOverlayLocked,\n setOverlayMode,\n setOverlayOffsetY,\n setOverlayOpacity,\n setSelectedImageId,\n showImage,\n setImageOverlayOffsetY,\n setImageOverlayOpacity,\n state: overlayState,\n toggleImageOverlayLocked,\n toggleImageOverlayMode,\n toggleImageOverlayVisible,\n toggleAllImageOverlayVisible,\n toggleOverlayLocked,\n toggleOverlayMode,\n toggleOverlayVisible,\n } = useReviewFigmaImageOverlayController({\n images,\n isLoading,\n target,\n });\n\n const addImage = useCallback(\n async (figmaUrl: string, label?: string) => {\n const image = await addStoreImage(figmaUrl, label);\n if (image) showImage(image.id);\n return image;\n },\n [addStoreImage, showImage]\n );\n\n return {\n addImage,\n deleteImage,\n error,\n images,\n imageOverlayStates,\n isAnyImageOverlayVisible,\n isLoading,\n isMutating,\n isOverlayLocked,\n isOverlayVisible,\n moveImage,\n overlayMode,\n overlayOffsetY,\n overlayOpacity,\n overlayState,\n refreshImages,\n resetOverlay,\n reorderImages,\n selectedImage,\n selectedImageId,\n setOverlayLocked,\n setOverlayMode,\n setOverlayOffsetY,\n setOverlayOpacity,\n setSelectedImageId,\n setImageOverlayOffsetY,\n setImageOverlayOpacity,\n target,\n toggleImageOverlayLocked,\n toggleImageOverlayMode,\n toggleImageOverlayVisible,\n toggleAllImageOverlayVisible,\n toggleOverlayLocked,\n toggleOverlayMode,\n toggleOverlayVisible,\n updateImage,\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 = nextToken !== getStoredFigmaToken();\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 {\n getStoredReviewQaStatusFilter,\n writeStoredReviewQaStatusFilter,\n} from '../settings';\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, setQaStatusFilterState] =\n useState<ReviewQaStatusFilter>(getStoredReviewQaStatusFilter);\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 () => {\n const nextHiddenItemIds = new Set(hiddenOverlayItemIds);\n\n if (qaStatusFilter !== 'all') {\n activeItems.forEach((item) => {\n if (normalizeReviewItemStatus(item.status) !== qaStatusFilter) {\n nextHiddenItemIds.add(item.id);\n }\n });\n }\n\n return Array.from(nextHiddenItemIds);\n },\n [activeItems, hiddenOverlayItemIds, qaStatusFilter]\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 setQaStatusFilter = useCallback((filter: ReviewQaStatusFilter) => {\n setQaStatusFilterState(filter);\n writeStoredReviewQaStatusFilter(filter);\n }, []);\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 items,\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 getTargetRouteKey,\n getInitialItemId,\n getInitialSource,\n getInitialTarget,\n} from '../route';\nimport {\n getInitialReviewSidePanel,\n getStoredReviewSidePanelVisible,\n} from '../settings';\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 initialItemId = getInitialItemId();\n const initialSidePanel = getInitialReviewSidePanel();\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(initialItemId);\n const selectedItemIdRef = useRef(initialItemId);\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 getTargetRouteKey(getInitialTarget(reviewPathPrefix), 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(initialItemId);\n const [isListVisible, setIsListVisible] = useState(\n () =>\n Boolean(initialItemId || initialSidePanel) ||\n getStoredReviewSidePanelVisible()\n );\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 ReviewFieldsConfig,\n ReviewSource,\n WebReviewKitAdapter,\n} from '../types';\nimport type {\n ReviewShellAdapter,\n ReviewShellAdapterMap,\n ReviewShellAdapters,\n ReviewShellAssigneeOption,\n ReviewShellStatusOption,\n ReviewShellSyncSubmissionInput,\n ReviewShellUpdateAssigneeInput,\n ReviewShellUpdateStatusInput,\n ReviewShellWriteMode,\n} from './types';\n\nconst ALL_REVIEW_WRITE_MODES: ReviewShellWriteMode[] = ['dom', 'note', 'area'];\nconst DEFAULT_ASSIGNEE_TITLE = 'Assignee';\n\nexport type NormalizedReviewShellAdapter = {\n label: ReviewSource;\n adapter: WebReviewKitAdapter;\n fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n statusOptions: ReviewShellStatusOption[];\n assigneeTitle: string;\n assigneeOptions: ReviewShellAssigneeOption[];\n updateStatus?: (input: ReviewShellUpdateStatusInput) => Promise<unknown>;\n updateAssignee?: (input: ReviewShellUpdateAssigneeInput) => 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 fields: { title: false },\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n assigneeTitle: DEFAULT_ASSIGNEE_TITLE,\n assigneeOptions: [],\n updateStatus: ({ id, status }) => adapters.local.update(id, { status }),\n updateAssignee: ({ id, assigneeId, assigneeName }) =>\n adapters.local.update(id, { assigneeId, assigneeName }),\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 fields: { title: false },\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n assigneeTitle: DEFAULT_ASSIGNEE_TITLE,\n assigneeOptions: [],\n updateStatus: ({ id, status }) =>\n adapters.remote?.update(id, { status }) ??\n Promise.reject(new Error('Remote adapter is not available.')),\n updateAssignee: ({ id, assigneeId, assigneeName }) =>\n adapters.remote?.update(id, { assigneeId, assigneeName }) ??\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 fields = {\n title: adapterConfig.fields?.title === true,\n };\n const assigneeTitle =\n adapterConfig.assigneeTitle?.trim() || DEFAULT_ASSIGNEE_TITLE;\n const assigneeOptions = [...(adapterConfig.assigneeOptions ?? [])];\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 updateAssignee: NormalizedReviewShellAdapter['updateAssignee'] =\n adapterConfig.updateAssignee\n ? adapterConfig.updateAssignee\n : updateAdapter\n ? ({ id, assigneeId, assigneeName, assigneeOption }) =>\n updateAdapter(id, {\n assigneeId,\n assigneeName: assigneeName ?? assigneeOption?.label,\n })\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 fields,\n statusOptions,\n assigneeTitle,\n assigneeOptions,\n updateStatus,\n updateAssignee,\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 ReviewFieldsConfig,\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 UpdateReviewItemAssigneeOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n item: ReviewItem;\n assigneeId: string | null;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface UpdateReviewItemDetailsOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n item: ReviewItem;\n title?: string;\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 writeClipboardTextFallback = (value: string) => {\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\nconst writeClipboardText = async (value: string) => {\n try {\n writeClipboardTextFallback(value);\n return;\n } catch (error) {\n if (!navigator.clipboard?.writeText) {\n throw error;\n }\n await navigator.clipboard.writeText(value);\n }\n};\n\nconst 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\nconst 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 updateReviewItemAssignee = async ({\n activeAdapterEntry,\n item,\n assigneeId,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemAssigneeOptions) => {\n if (!activeAdapterEntry.updateAssignee) return;\n\n const assigneeIndex = activeAdapterEntry.assigneeOptions.findIndex(\n (assigneeOption) => assigneeOption.value === assigneeId\n );\n const assigneeOption = activeAdapterEntry.assigneeOptions[assigneeIndex];\n const nextAssigneeId =\n assigneeOption?.value ??\n (assigneeId && item.assigneeId === assigneeId ? assigneeId : null);\n const nextAssigneeName =\n assigneeOption?.label ??\n (nextAssigneeId ? item.assigneeName : undefined);\n\n if ((item.assigneeId ?? null) === nextAssigneeId) {\n onToast?.('No QA assignee changes');\n return item;\n }\n\n const updated = await activeAdapterEntry.updateAssignee({\n id: item.id,\n item,\n assigneeId: nextAssigneeId,\n assigneeName: nextAssigneeName,\n assigneeOption,\n assigneeIndex,\n });\n await onRefreshReviewData();\n onToast?.('QA assignee updated');\n return updated as ReviewItem;\n};\n\nexport const updateReviewItemDetails = async ({\n activeAdapterEntry,\n fields,\n item,\n title,\n comment,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemDetailsOptions) => {\n const nextTitle = title?.trim() || undefined;\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 const isTitleUnchanged =\n !fields.title || nextTitle === (item.title?.trim() || undefined);\n const isUnchanged = isTitleUnchanged && nextComment === item.comment.trim();\n\n if (isUnchanged) {\n onToast?.('No QA changes');\n return item;\n }\n\n const updated = await activeAdapterEntry.adapter.update(item.id, {\n ...(fields.title ? { title: nextTitle } : {}),\n comment: nextComment,\n });\n await onRefreshReviewData();\n onToast?.('QA 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 React, {\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport {\n MoveVertical as OffsetYIcon,\n} from 'lucide-react';\nimport {\n DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n} from '../../figma/image.types';\nimport { normalizeTarget } from '../route';\nimport type {\n ReviewShellFigmaImagesOptions,\n ReviewShellViewportPreset,\n} from '../types';\nimport { DEFAULT_REVIEW_VIEWPORT_PRESETS } from '../viewport';\nimport {\n getReviewFigmaImageStore,\n} from '../figma';\nimport { useReviewFigmaImages } from '../hooks/use.review.figma.images';\nimport {\n createReviewTargetFigmaImageOverlays,\n removeTargetFigmaImageOverlays,\n renderTargetFigmaImageOverlays,\n} from '../target/figma.image.overlay';\nimport {\n DEFAULT_FIGMA_IMAGE_LAYER_STATE,\n formatFigmaImageDate,\n getFigmaImageLabel,\n getFigmaImageLayerStatusLabel,\n getSnappedOpacityPercent,\n} from './image-panel.utils';\nimport { FigmaMarkIcon } from './figma-mark-icon';\nimport { FigmaImageLayerStateButtons } from './layer-state-buttons';\n\nconst FIGMA_DEV_OVERLAY_ROOT_ID = 'df-review-figma-dev-overlay-root';\nconst FIGMA_DEV_OVERLAY_MOUNT_ID = 'df-review-figma-dev-overlay-mount';\n\ntype FigmaDevViewportMatch = {\n label: 'Mobile' | 'Full width';\n preset: ReviewShellViewportPreset;\n rangeLabel: string;\n};\n\ntype FigmaDevViewportBoundaries = {\n fullWidthRangeLabel: string;\n maxPreset: ReviewShellViewportPreset;\n minPreset: ReviewShellViewportPreset;\n mobileRangeLabel: string;\n};\n\nexport interface FigmaDevOverlayMountOptions {\n rootId?: string;\n projectId: string;\n presets?: ReviewShellViewportPreset[];\n reviewPathPrefix?: string;\n figmaImages?: ReviewShellFigmaImagesOptions;\n pageUrl?: string | (() => string);\n}\n\nexport interface FigmaDevOverlayController {\n destroy(): void;\n}\n\nexport const mountFigmaDevOverlay = (\n options: FigmaDevOverlayMountOptions\n): FigmaDevOverlayController => {\n if (typeof document === 'undefined' || !document.body) {\n return { destroy: () => undefined };\n }\n\n const rootId = options.rootId ?? FIGMA_DEV_OVERLAY_ROOT_ID;\n document.getElementById(rootId)?.remove();\n\n const host = document.createElement('div');\n host.id = rootId;\n host.style.display = 'contents';\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = figmaDevOverlayStyle;\n const mountNode = document.createElement('div');\n mountNode.id = FIGMA_DEV_OVERLAY_MOUNT_ID;\n shadow.append(style, mountNode);\n document.body.appendChild(host);\n\n const root: Root = createRoot(mountNode);\n root.render(\n <React.StrictMode>\n <FigmaDevOverlayWidget {...options} />\n </React.StrictMode>\n );\n\n return {\n destroy() {\n root.unmount();\n host.remove();\n removeTargetFigmaImageOverlays(document);\n },\n };\n};\n\nconst FigmaDevOverlayWidget = ({\n figmaImages,\n pageUrl,\n presets = DEFAULT_REVIEW_VIEWPORT_PRESETS,\n projectId,\n reviewPathPrefix,\n}: FigmaDevOverlayMountOptions) => {\n const figmaImageStore = getReviewFigmaImageStore(figmaImages);\n const viewport = useCurrentViewport();\n const currentPageUrl = useCurrentPageUrl(pageUrl, reviewPathPrefix);\n const viewportBoundaries = useMemo(\n () => getFigmaDevViewportBoundaries(presets),\n [presets]\n );\n const matchedViewportMatch = useMemo(\n () => findBoundaryFigmaDevViewportMatch(presets, viewport.width),\n [presets, viewport.width]\n );\n const matchedViewport = matchedViewportMatch?.preset ?? null;\n const activeViewport =\n matchedViewport ??\n viewportBoundaries?.minPreset ??\n presets[0] ??\n DEFAULT_REVIEW_VIEWPORT_PRESETS[0];\n const {\n error,\n images,\n imageOverlayStates,\n isAnyImageOverlayVisible,\n isLoading,\n selectedImageId,\n setImageOverlayOffsetY,\n setImageOverlayOpacity,\n setSelectedImageId,\n toggleImageOverlayLocked,\n toggleImageOverlayMode,\n toggleImageOverlayVisible,\n } = useReviewFigmaImages({\n imageFormat: figmaImages?.imageFormat ?? DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n pageUrl: currentPageUrl,\n projectId,\n store: matchedViewport ? figmaImageStore : null,\n viewport: activeViewport,\n });\n const [isPanelOpen, setIsPanelOpen] = useState(false);\n const [isWidgetVisible, setIsWidgetVisible] = useState(false);\n const [offsetYDraftByImageId, setOffsetYDraftByImageId] = useState<\n Record<string, string>\n >({});\n const selectedImage = selectedImageId\n ? images.find((image) => image.id === selectedImageId) ?? null\n : null;\n const selectedImageIndex = selectedImage ? images.indexOf(selectedImage) : -1;\n const selectedImageLabel = selectedImage\n ? getFigmaImageLabel(selectedImage, selectedImageIndex)\n : 'Figma layer';\n const selectedOverlayState = selectedImage\n ? imageOverlayStates[selectedImage.id] ?? DEFAULT_FIGMA_IMAGE_LAYER_STATE\n : DEFAULT_FIGMA_IMAGE_LAYER_STATE;\n const selectedOpacityPercent = selectedImage\n ? getSnappedOpacityPercent(selectedOverlayState.opacity)\n : 0;\n const selectedOffsetYDraft = selectedImage\n ? offsetYDraftByImageId[selectedImage.id] ??\n String(selectedOverlayState.offsetY)\n : '';\n const figmaImageOverlays = useMemo(\n () =>\n createReviewTargetFigmaImageOverlays({\n imageOverlayStates,\n images,\n }),\n [imageOverlayStates, images]\n );\n\n useEffect(() => {\n if (!isWidgetVisible || !matchedViewport) {\n removeTargetFigmaImageOverlays(document);\n return;\n }\n\n renderTargetFigmaImageOverlays({\n onSetOverlayOffsetY: setImageOverlayOffsetY,\n overlays: figmaImageOverlays,\n size: matchedViewport,\n targetDocument: document,\n });\n }, [\n figmaImageOverlays,\n isWidgetVisible,\n matchedViewport,\n setImageOverlayOffsetY,\n ]);\n\n useEffect(\n () => () => {\n removeTargetFigmaImageOverlays(document);\n },\n []\n );\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n !event.shiftKey ||\n event.metaKey ||\n event.ctrlKey ||\n event.altKey ||\n (event.code !== 'KeyF' && event.key.toLowerCase() !== 'f') ||\n isEditableFigmaDevOverlayEventTarget(event)\n ) {\n return;\n }\n\n event.preventDefault();\n setIsPanelOpen(false);\n setIsWidgetVisible((currentVisible) => !currentVisible);\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n return () => document.removeEventListener('keydown', handleKeyDown, true);\n }, []);\n\n if (!figmaImageStore) return null;\n if (!isWidgetVisible) return null;\n\n const updateSelectedImageOpacity = (value: string) => {\n if (!selectedImage) return;\n const opacityPercent = Math.max(\n 0,\n Math.min(100, Math.round(Number(value) / 10) * 10)\n );\n if (Number.isFinite(opacityPercent)) {\n setImageOverlayOpacity(selectedImage.id, opacityPercent / 100);\n }\n };\n\n return (\n <aside\n aria-label=\"Figma overlay\"\n className={`df-review-figma-dev-widget${\n isPanelOpen ? ' is-open' : ''\n }${isAnyImageOverlayVisible ? ' is-active' : ''}`}\n >\n {isPanelOpen && (\n <div className=\"df-review-figma-dev-panel\">\n <div className=\"df-review-figma-dev-panel-header\">\n <strong>Figma</strong>\n <span>\n {matchedViewportMatch\n ? `${matchedViewportMatch.label} · ${matchedViewportMatch.rangeLabel}`\n : `${viewport.width}px`}\n </span>\n </div>\n {selectedImage && (\n <div className=\"df-review-figma-dev-selected-controls\">\n <label className=\"df-review-figma-dev-opacity-control\">\n <span>Opacity</span>\n <input\n aria-label={`${selectedImageLabel} overlay opacity`}\n max=\"100\"\n min=\"0\"\n step=\"10\"\n type=\"range\"\n value={selectedOpacityPercent}\n onChange={(event) =>\n updateSelectedImageOpacity(event.currentTarget.value)\n }\n onInput={(event) =>\n updateSelectedImageOpacity(event.currentTarget.value)\n }\n />\n <strong>{selectedOpacityPercent}</strong>\n </label>\n <label className=\"df-review-figma-dev-y-control\">\n <OffsetYIcon aria-hidden=\"true\" />\n <input\n aria-label={`${selectedImageLabel} overlay Y offset`}\n inputMode=\"numeric\"\n step=\"1\"\n type=\"number\"\n value={selectedOffsetYDraft}\n onBlur={() => {\n setOffsetYDraftByImageId((currentDrafts) => {\n const nextDrafts = { ...currentDrafts };\n delete nextDrafts[selectedImage.id];\n return nextDrafts;\n });\n }}\n onChange={(event) => {\n const value = event.currentTarget.value;\n const offsetY = Number(value);\n setOffsetYDraftByImageId((currentDrafts) => ({\n ...currentDrafts,\n [selectedImage.id]: value,\n }));\n if (value.trim() !== '' && Number.isFinite(offsetY)) {\n setImageOverlayOffsetY(selectedImage.id, offsetY);\n }\n }}\n />\n </label>\n </div>\n )}\n {error && <p className=\"df-review-figma-dev-status\">{error}</p>}\n {!matchedViewport ? (\n <p className=\"df-review-figma-dev-empty\">\n No Figma layers for this viewport.\n {viewportBoundaries\n ? ` Mobile ${viewportBoundaries.mobileRangeLabel} / Full width ${viewportBoundaries.fullWidthRangeLabel}`\n : ''}\n </p>\n ) : isLoading ? (\n <p className=\"df-review-figma-dev-status\">Loading...</p>\n ) : images.length === 0 ? (\n <p className=\"df-review-figma-dev-empty\">\n No Figma layers for this viewport.\n </p>\n ) : (\n <div className=\"df-review-figma-dev-list\">\n {images.map((image, index) => {\n const imageLabel = getFigmaImageLabel(image, index);\n const overlayState =\n imageOverlayStates[image.id] ??\n DEFAULT_FIGMA_IMAGE_LAYER_STATE;\n\n return (\n <article\n className={`df-review-figma-dev-row${\n image.id === selectedImageId ? ' is-active' : ''\n }`}\n key={image.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => setSelectedImageId(image.id)}\n onKeyDown={(event) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n setSelectedImageId(image.id);\n }}\n >\n <FigmaImageLayerStateButtons\n imageLabel={imageLabel}\n overlayState={overlayState}\n title={getFigmaImageLayerStatusLabel(overlayState)}\n onSelect={() => setSelectedImageId(image.id)}\n onToggleLocked={() =>\n toggleImageOverlayLocked(image.id)\n }\n onToggleMode={() => toggleImageOverlayMode(image.id)}\n onToggleVisible={() =>\n toggleImageOverlayVisible(image.id)\n }\n />\n <span className=\"df-review-figma-dev-row-main\">\n <strong>{imageLabel}</strong>\n <small>{formatFigmaImageDate(image.updatedAt)}</small>\n </span>\n </article>\n );\n })}\n </div>\n )}\n </div>\n )}\n <div className=\"df-review-figma-dev-bar\">\n <button\n aria-expanded={isPanelOpen}\n aria-label={isPanelOpen ? 'Hide Figma layer controls' : 'Show Figma layer controls'}\n className=\"df-review-figma-dev-button is-figma\"\n title={isPanelOpen ? 'Hide layers' : 'Show layers'}\n type=\"button\"\n onClick={() => setIsPanelOpen((isOpen) => !isOpen)}\n >\n <FigmaMarkIcon />\n <span className=\"df-review-figma-dev-button-count\">\n {images.length}\n </span>\n </button>\n </div>\n </aside>\n );\n};\n\nfunction useCurrentPageUrl(\n pageUrl: FigmaDevOverlayMountOptions['pageUrl'],\n reviewPathPrefix: string | undefined\n) {\n const [currentPageUrl, setCurrentPageUrl] = useState(() =>\n getFigmaDevOverlayPageUrl(pageUrl, reviewPathPrefix)\n );\n\n useEffect(() => {\n const updatePageUrl = () => {\n setCurrentPageUrl(getFigmaDevOverlayPageUrl(pageUrl, reviewPathPrefix));\n };\n\n window.addEventListener('popstate', updatePageUrl);\n window.addEventListener('hashchange', updatePageUrl);\n return () => {\n window.removeEventListener('popstate', updatePageUrl);\n window.removeEventListener('hashchange', updatePageUrl);\n };\n }, [pageUrl, reviewPathPrefix]);\n\n return currentPageUrl;\n}\n\nfunction isEditableFigmaDevOverlayEventTarget(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 tagName = element.tagName;\n return (\n tagName === 'INPUT' ||\n tagName === 'TEXTAREA' ||\n tagName === 'SELECT' ||\n element.isContentEditable === true\n );\n}\n\nfunction useCurrentViewport() {\n const [viewport, setViewport] = useState(getCurrentViewportSize);\n\n useEffect(() => {\n const updateViewport = () => setViewport(getCurrentViewportSize());\n\n window.addEventListener('resize', updateViewport);\n window.addEventListener('orientationchange', updateViewport);\n window.visualViewport?.addEventListener('resize', updateViewport);\n return () => {\n window.removeEventListener('resize', updateViewport);\n window.removeEventListener('orientationchange', updateViewport);\n window.visualViewport?.removeEventListener('resize', updateViewport);\n };\n }, []);\n\n return viewport;\n}\n\nfunction getCurrentViewportSize() {\n return {\n height: Math.round(window.innerHeight),\n width: Math.round(window.innerWidth),\n };\n}\n\nfunction getFigmaDevOverlayPageUrl(\n pageUrl: FigmaDevOverlayMountOptions['pageUrl'],\n reviewPathPrefix: string | undefined\n) {\n if (typeof pageUrl === 'function') return pageUrl();\n if (typeof pageUrl === 'string') return pageUrl;\n\n return normalizeTarget(\n `${window.location.pathname}${window.location.search}${window.location.hash}`,\n reviewPathPrefix\n );\n}\n\nfunction findBoundaryFigmaDevViewportMatch(\n presets: ReviewShellViewportPreset[],\n width: number\n): FigmaDevViewportMatch | null {\n const boundaries = getFigmaDevViewportBoundaries(presets);\n if (!boundaries) return null;\n\n if (width <= boundaries.minPreset.width) {\n return {\n label: 'Mobile',\n preset: boundaries.minPreset,\n rangeLabel: boundaries.mobileRangeLabel,\n };\n }\n\n if (width >= boundaries.maxPreset.width) {\n return {\n label: 'Full width',\n preset: boundaries.maxPreset,\n rangeLabel: boundaries.fullWidthRangeLabel,\n };\n }\n\n return null;\n}\n\nfunction getFigmaDevViewportBoundaries(\n presets: ReviewShellViewportPreset[]\n): FigmaDevViewportBoundaries | null {\n if (presets.length === 0) return null;\n\n const sortedPresets = [...presets].sort((a, b) => a.width - b.width);\n const minPreset = sortedPresets[0];\n const maxPreset = sortedPresets[sortedPresets.length - 1];\n\n return {\n fullWidthRangeLabel: `>= ${maxPreset.width}px`,\n maxPreset,\n minPreset,\n mobileRangeLabel: `<= ${minPreset.width}px`,\n };\n}\n\nconst figmaDevOverlayStyle = `\n :host {\n all: initial;\n color-scheme: dark;\n font-family:\n Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,\n \"Segoe UI\", sans-serif;\n --df-review-figma-dev-bg: rgba(15, 18, 24, 0.94);\n --df-review-figma-dev-panel: rgba(19, 24, 33, 0.96);\n --df-review-figma-dev-control: #202938;\n --df-review-figma-dev-control-hover: #273345;\n --df-review-figma-dev-border: rgba(226, 233, 245, 0.16);\n --df-review-figma-dev-border-soft: rgba(226, 233, 245, 0.09);\n --df-review-figma-dev-text: #edf3fb;\n --df-review-figma-dev-muted: rgba(237, 243, 251, 0.58);\n --df-review-figma-dev-subtle: rgba(237, 243, 251, 0.42);\n --df-review-figma-dev-accent: #7cc7ff;\n --df-review-figma-dev-accent-soft: rgba(124, 199, 255, 0.16);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .df-review-figma-dev-widget {\n position: fixed;\n right: calc(16px + env(safe-area-inset-right));\n bottom: calc(16px + env(safe-area-inset-bottom));\n z-index: 2147483200;\n display: grid;\n justify-items: end;\n gap: 8px;\n color: var(--df-review-figma-dev-text);\n font-size: 13px;\n line-height: 1.25;\n pointer-events: none;\n }\n\n .df-review-figma-dev-panel,\n .df-review-figma-dev-bar {\n pointer-events: auto;\n }\n\n .df-review-figma-dev-panel {\n display: grid;\n gap: 8px;\n width: min(360px, calc(100vw - 32px - env(safe-area-inset-left) - env(safe-area-inset-right)));\n max-height: min(460px, calc(100vh - 96px - env(safe-area-inset-top) - env(safe-area-inset-bottom)));\n overflow: hidden;\n border: 1px solid var(--df-review-figma-dev-border);\n border-radius: 8px;\n padding: 10px;\n background: var(--df-review-figma-dev-panel);\n box-shadow: 0 18px 48px rgba(0, 0, 0, 0.34);\n backdrop-filter: blur(14px);\n -webkit-backdrop-filter: blur(14px);\n }\n\n .df-review-figma-dev-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n min-width: 0;\n }\n\n .df-review-figma-dev-panel-header strong {\n font-size: 14px;\n font-weight: 700;\n }\n\n .df-review-figma-dev-panel-header span,\n .df-review-figma-dev-status,\n .df-review-figma-dev-empty {\n color: var(--df-review-figma-dev-muted);\n font-size: 12px;\n }\n\n .df-review-figma-dev-selected-controls {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 84px;\n gap: 8px;\n }\n\n .df-review-figma-dev-opacity-control,\n .df-review-figma-dev-y-control {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n height: 36px;\n border: 1px solid var(--df-review-figma-dev-border);\n border-radius: 8px;\n padding: 0 10px;\n background: var(--df-review-figma-dev-control);\n }\n\n .df-review-figma-dev-opacity-control span {\n color: var(--df-review-figma-dev-muted);\n font-size: 12px;\n }\n\n .df-review-figma-dev-opacity-control strong {\n min-width: 24px;\n text-align: right;\n font-size: 13px;\n }\n\n .df-review-figma-dev-opacity-control input[type=\"range\"] {\n flex: 1;\n min-width: 0;\n height: 24px;\n accent-color: var(--df-review-figma-dev-accent);\n }\n\n .df-review-figma-dev-y-control svg {\n width: 15px;\n height: 15px;\n color: var(--df-review-figma-dev-muted);\n }\n\n .df-review-figma-dev-y-control input {\n width: 100%;\n min-width: 0;\n border: 0;\n padding: 0;\n color: var(--df-review-figma-dev-text);\n background: transparent;\n font: inherit;\n outline: none;\n }\n\n .df-review-figma-dev-status,\n .df-review-figma-dev-empty {\n margin: 0;\n border: 1px dashed var(--df-review-figma-dev-border);\n border-radius: 8px;\n padding: 12px;\n }\n\n .df-review-figma-dev-list {\n display: grid;\n gap: 6px;\n min-height: 0;\n overflow: auto;\n }\n\n .df-review-figma-dev-row {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n align-items: center;\n gap: 8px;\n width: 100%;\n min-width: 0;\n border: 1px solid var(--df-review-figma-dev-border-soft);\n border-radius: 8px;\n padding: 12px 10px;\n color: var(--df-review-figma-dev-text);\n background: rgba(237, 243, 251, 0.035);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -webkit-user-drag: none;\n }\n\n .df-review-figma-dev-row:hover,\n .df-review-figma-dev-row:focus-visible {\n border-color: var(--df-review-figma-dev-border);\n outline: none;\n }\n\n .df-review-figma-dev-row.is-active {\n border-color: var(--df-review-figma-dev-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-figma-dev-accent-soft);\n }\n\n .df-review-figma-dev-row-main {\n display: grid;\n gap: 2px;\n min-width: 0;\n }\n\n .df-review-figma-dev-row-main strong {\n color: var(--df-review-figma-dev-text);\n font-size: 13px;\n font-weight: 700;\n white-space: normal;\n word-break: break-word;\n }\n\n .df-review-figma-dev-row-main small {\n color: var(--df-review-figma-dev-muted);\n font-size: 12px;\n }\n\n .df-review-figma-image-layer-state {\n display: grid;\n grid-template-columns: repeat(3, 22px);\n align-items: center;\n gap: 2px;\n min-width: 0;\n height: 24px;\n }\n\n .df-review-figma-image-state-button {\n display: inline-grid;\n place-items: center;\n width: 22px;\n min-width: 22px;\n height: 22px;\n min-height: 22px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-figma-dev-subtle);\n background: transparent;\n box-shadow: none;\n opacity: 0.68;\n cursor: pointer;\n }\n\n .df-review-figma-image-state-button:hover,\n .df-review-figma-image-state-button:focus-visible {\n color: var(--df-review-figma-dev-text);\n opacity: 1;\n outline: none;\n }\n\n .df-review-figma-image-state-button.is-active {\n color: var(--df-review-figma-dev-accent);\n opacity: 1;\n }\n\n .df-review-figma-image-state-button svg {\n width: 13px;\n height: 13px;\n }\n\n .df-review-figma-dev-bar {\n display: inline-flex;\n align-items: center;\n pointer-events: auto;\n }\n\n .df-review-figma-dev-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--df-review-figma-dev-border);\n border-radius: 8px;\n padding: 0;\n color: var(--df-review-figma-dev-muted);\n background: var(--df-review-figma-dev-control);\n box-shadow: 0 10px 24px rgba(0, 0, 0, 0.26);\n cursor: pointer;\n }\n\n .df-review-figma-dev-button:hover,\n .df-review-figma-dev-button:focus-visible,\n .df-review-figma-dev-widget.is-active .df-review-figma-dev-button.is-figma {\n color: var(--df-review-figma-dev-accent);\n border-color: rgba(124, 199, 255, 0.5);\n outline: none;\n }\n\n .df-review-figma-dev-button:disabled {\n color: var(--df-review-figma-dev-subtle);\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .df-review-figma-dev-button svg {\n width: 17px;\n height: 17px;\n }\n\n .df-review-figma-dev-button .df-review-figma-mark-icon {\n width: 17px;\n height: 17px;\n fill: currentColor;\n }\n\n .df-review-figma-dev-button.is-figma {\n width: 38px;\n height: 38px;\n }\n\n .df-review-figma-dev-button-count {\n position: absolute;\n right: -3px;\n top: -4px;\n display: inline-grid;\n place-items: center;\n min-width: 15px;\n height: 15px;\n border: 1px solid rgba(15, 18, 24, 0.86);\n border-radius: 4px;\n padding: 0 3px;\n color: currentColor;\n background: rgba(15, 18, 24, 0.92);\n font-size: 10px;\n font-weight: 700;\n line-height: 1;\n }\n\n .df-review-figma-dev-button.is-figma:disabled .df-review-figma-dev-button-count {\n color: var(--df-review-figma-dev-subtle);\n }\n\n @media (max-width: 420px) {\n .df-review-figma-dev-widget {\n right: calc(10px + env(safe-area-inset-right));\n bottom: calc(10px + env(safe-area-inset-bottom));\n }\n\n .df-review-figma-dev-selected-controls {\n grid-template-columns: 1fr;\n }\n }\n`;\n","import type { CreateReviewPagesOptions, ReviewShellGlobEntries, ReviewShellPage } from './types';\n\nconst escapeRegExp = (value: string) =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst normalizePageHref = (value: string) => {\n const href = value || '/';\n return href.startsWith('/') ? href : `/${href}`;\n};\n\nconst sortReviewPages = (a: ReviewShellPage, b: ReviewShellPage) => {\n if (a.href === '/') return -1;\n if (b.href === '/') return 1;\n return a.href.localeCompare(b.href);\n};\n\nexport const createReviewPagesFromGlob = (\n entries: ReviewShellGlobEntries,\n options: CreateReviewPagesOptions = {}\n): ReviewShellPage[] => {\n const root = options.root ?? '/page';\n const rootPattern = root ? new RegExp(`^${escapeRegExp(root)}`) : null;\n\n return Object.keys(entries)\n .map((key) => {\n const withoutRoot = rootPattern ? key.replace(rootPattern, '') : key;\n const href = withoutRoot.replace(/index\\.(tsx|ts|jsx|js)$/, '');\n return normalizePageHref(href === '' ? '/' : href);\n })\n .filter((href) => !options.exclude?.(href))\n .sort((a, b) => sortReviewPages({ href: a }, { href: b }))\n .map((href) => ({ href }));\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from '../types';\n\ntype SupabaseRealtimeStatus =\n | 'SUBSCRIBED'\n | 'CHANNEL_ERROR'\n | 'TIMED_OUT'\n | 'CLOSED'\n | string;\n\ntype SupabaseRealtimeChannel = {\n topic?: string;\n on: (\n type: 'presence',\n filter: { event: 'sync' | 'join' | 'leave' },\n callback: () => void\n ) => SupabaseRealtimeChannel;\n subscribe: (\n callback: (status: SupabaseRealtimeStatus, error?: Error) => void\n ) => SupabaseRealtimeChannel;\n track: (payload: ReviewPresenceUser) => Promise<unknown>;\n untrack: () => Promise<unknown>;\n presenceState: () => Record<string, unknown[]>;\n teardown?: () => void;\n};\n\nexport type SupabasePresenceClient = {\n channel: (\n topic: string,\n options?: {\n config?: {\n private?: boolean;\n presence?: {\n key?: string;\n };\n };\n }\n ) => SupabaseRealtimeChannel;\n getChannels?: () => SupabaseRealtimeChannel[];\n removeChannel: (channel: SupabaseRealtimeChannel) => Promise<unknown>;\n};\n\nexport type SupabasePresenceAdapterOptions = {\n client: SupabasePresenceClient;\n channelPrefix?: string;\n private?: boolean;\n};\n\nconst normalizeTopicPart = (value: string) =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'default';\n\nconst getPresenceTopic = (channelPrefix: string, projectId: string) =>\n `${normalizeTopicPart(channelPrefix)}-${normalizeTopicPart(projectId)}`;\n\nconst PRESENCE_BRIDGE_KEY = '__dfReviewPresenceBridge';\n\ntype SupabasePresenceBridge = {\n channel: SupabaseRealtimeChannel;\n emit: () => void;\n getUsers: () => ReviewPresenceUser[];\n listeners: Set<() => void>;\n ready: Promise<void>;\n refCount: number;\n};\n\ntype SupabasePresenceBridgeChannel = SupabaseRealtimeChannel & {\n [PRESENCE_BRIDGE_KEY]?: SupabasePresenceBridge;\n};\n\nconst isReviewPresenceUser = (value: unknown): value is ReviewPresenceUser => {\n if (!value || typeof value !== 'object') return false;\n\n const candidate = value as Partial<ReviewPresenceUser>;\n return (\n typeof candidate.projectId === 'string' &&\n typeof candidate.sessionId === 'string' &&\n typeof candidate.userId === 'string' &&\n typeof candidate.updatedAt === 'string'\n );\n};\n\nconst flattenPresenceState = (\n state: Record<string, unknown[]>\n): ReviewPresenceUser[] =>\n Object.values(state).flat().filter(isReviewPresenceUser);\n\nconst dedupePresenceUsers = (users: ReviewPresenceUser[]) => {\n const userBySessionId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const currentUser = userBySessionId.get(user.sessionId);\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userBySessionId.set(user.sessionId, user);\n }\n });\n\n return Array.from(userBySessionId.values());\n};\n\nconst sortPresenceUsers = (\n users: ReviewPresenceUser[],\n selfSessionId: string\n) =>\n users.sort((a, b) => {\n if (a.sessionId === selfSessionId) return -1;\n if (b.sessionId === selfSessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n\nconst subscribeChannel = (channel: SupabaseRealtimeChannel) =>\n new Promise<void>((resolve, reject) => {\n channel.subscribe((status, error) => {\n if (status === 'SUBSCRIBED') {\n resolve();\n return;\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {\n reject(error ?? new Error(`Supabase presence ${status}`));\n }\n });\n });\n\nconst removeTopicChannels = async (\n client: SupabasePresenceClient,\n topic: string\n) => {\n const existingChannels = client.getChannels?.() ?? [];\n const normalizedTopic = `realtime:${topic}`;\n const topicChannels = existingChannels.filter(\n (channel) => channel.topic === topic || channel.topic === normalizedTopic\n );\n\n await Promise.allSettled(\n topicChannels.map(async (channel) => {\n const result = await client.removeChannel(channel);\n if (result !== 'ok') {\n channel.teardown?.();\n }\n })\n );\n};\n\nconst getTopicChannel = (\n client: SupabasePresenceClient,\n topic: string\n): SupabasePresenceBridgeChannel | undefined => {\n const normalizedTopic = `realtime:${topic}`;\n\n return client\n .getChannels?.()\n .find(\n (channel) =>\n channel.topic === topic || channel.topic === normalizedTopic\n ) as SupabasePresenceBridgeChannel | undefined;\n};\n\nconst createPresenceBridge = (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const channel = client.channel(topic, {\n config: {\n private: isPrivate,\n presence: {\n key: context.sessionId,\n },\n },\n }) as SupabasePresenceBridgeChannel;\n\n const bridge: SupabasePresenceBridge = {\n channel,\n listeners: new Set(),\n refCount: 0,\n getUsers: () =>\n dedupePresenceUsers(flattenPresenceState(channel.presenceState())),\n emit: () => {\n bridge.listeners.forEach((listener) => listener());\n },\n ready: Promise.resolve(),\n };\n\n channel[PRESENCE_BRIDGE_KEY] = bridge;\n channel\n .on('presence', { event: 'sync' }, bridge.emit)\n .on('presence', { event: 'join' }, bridge.emit)\n .on('presence', { event: 'leave' }, bridge.emit);\n\n bridge.ready = subscribeChannel(channel).catch((error) => {\n delete channel[PRESENCE_BRIDGE_KEY];\n throw error;\n });\n\n return bridge;\n};\n\nconst getPresenceBridge = async (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const existingChannel = getTopicChannel(client, topic);\n const existingBridge = existingChannel?.[PRESENCE_BRIDGE_KEY];\n\n if (existingBridge) return existingBridge;\n\n if (existingChannel) {\n await removeTopicChannels(client, topic);\n }\n\n return createPresenceBridge(client, topic, context, isPrivate);\n};\n\nexport const createSupabasePresenceAdapter = ({\n client,\n channelPrefix = 'review-presence',\n private: isPrivate = false,\n}: SupabasePresenceAdapterOptions): ReviewPresenceAdapter => ({\n label: 'supabase-presence',\n connect: async (context: ReviewPresenceContext) => {\n const topic = getPresenceTopic(channelPrefix, context.projectId);\n const bridge = await getPresenceBridge(client, topic, context, isPrivate);\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentState = context.initialState;\n bridge.refCount += 1;\n\n const getUsers = () =>\n sortPresenceUsers(\n [...bridge.getUsers()],\n context.sessionId\n );\n\n const emit = () => {\n const users = getUsers();\n listeners.forEach((listener) => listener(users));\n };\n\n const bridgeListener = () => emit();\n bridge.listeners.add(bridgeListener);\n\n await bridge.ready;\n await bridge.channel.track(currentState);\n bridge.emit();\n emit();\n\n return {\n update: async (state: Partial<ReviewPresenceState>) => {\n currentState = {\n ...currentState,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: new Date().toISOString(),\n };\n await bridge.channel.track(currentState);\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: async () => {\n listeners.clear();\n bridge.listeners.delete(bridgeListener);\n bridge.refCount = Math.max(0, bridge.refCount - 1);\n if (bridge.refCount > 0) return;\n\n delete (bridge.channel as SupabasePresenceBridgeChannel)[\n PRESENCE_BRIDGE_KEY\n ];\n await bridge.channel.untrack();\n await client.removeChannel(bridge.channel);\n },\n };\n },\n});\n"],"mappings":";;;;;;;;;;;;AAAA,OAAOA,YAAW;AAClB,SAAS,cAAAC,mBAAkB;;;ACCpB,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OA+D7B,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACjEtB,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAhC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACA9B,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAhC,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAhC,IAAM,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACApC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACA9B,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAxC,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAvC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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":["React","createRoot","useCallback","useEffect","useMemo","useRef","useState","createElement","forwardRef","createElement","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__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","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","jsx","jsxs","jsx","jsxs","jsx","jsxs","useMemo","jsx","jsxs","useMemo","jsx","jsxs","useRef","useState","useCallback","useEffect","useMemo","useState","useMemo","useState","useMemo","useState","image","useMemo","useState","useCallback","useEffect","jsx","jsxs","jsx","jsx","jsxs","useState","useRef","useEffect","useState","jsx","jsxs","error","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","toPascalCase","element","depth","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useCallback","useEffect","useRef","useRef","useCallback","useEffect","root","jsx","jsxs","jsx","jsxs","ReviewScopeIcon","Map","useCallback","useCallback","runWithAutoScrollBehavior","useCallback","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useRef","useRef","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useCallback","useEffect","useMemo","useRef","useState","useRef","useState","useMemo","useCallback","useEffect","useCallback","useEffect","useState","useCallback","useEffect","useMemo","useRef","useState","useRef","useState","useMemo","useCallback","useEffect","frame","useState","useCallback","useEffect","useCallback","useMemo","useMemo","useCallback","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useMemo","useState","useState","useMemo","useCallback","useEffect","useEffect","useMemo","useRef","useState","statusOption","item","updated","useMemo","useState","useRef","statusOption","assigneeOption","jsx","jsxs","useRef","useState","useMemo","useEffect","useCallback","refreshReviewData","target","toastMessage","useEffect","useMemo","useState","jsx","jsxs","useMemo","useState","useEffect","jsx","createRoot","React"]}
1
+ {"version":3,"sources":["../src/react-shell.tsx","../src/react-shell/style/base.ts","../src/react-shell/style/sitemap.ts","../src/react-shell/style/modals.ts","../src/react-shell/style/toolbar.ts","../src/react-shell/style/qa-panel.ts","../src/react-shell/style/figma-images.ts","../src/react-shell/style/stage.ts","../src/react-shell/style/source-inspector.ts","../src/react-shell/style/section-outline.ts","../src/react-shell/style/ruler.ts","../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/chevron-down.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/chevron-right.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/code-xml.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/contrast.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/database.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/image.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/images.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/lock-open.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/lock.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/moon.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/move-vertical.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/plus.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/search.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-check-big.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/square-dashed.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/sun.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/trash-2.ts","../node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/src/icons/type.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/review/df.logo.tsx","../src/react-shell/env.ts","../src/react-shell/constants.ts","../src/react-shell/route.ts","../src/react-shell/viewport.ts","../src/react-shell/prompt/modal.tsx","../src/react-shell/prompt/prompt.ts","../src/react-shell/prompt/initial.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/figma/figma-mark-icon.tsx","../src/react-shell/figma/images.panel.tsx","../src/react-shell/figma/image.overlay.controller.ts","../src/react-shell/figma/image.controller.ts","../src/react-shell/figma/image-panel.utils.ts","../src/react-shell/figma/layer-state-buttons.tsx","../src/react-shell/review/spinner.tsx","../src/react-shell/qa/item.edit.modal.tsx","../src/react-shell/qa/item.assignee.actions.tsx","../src/react-shell/qa/item.remote.actions.tsx","../src/react-shell/qa/item.status.actions.tsx","../src/react-shell/anchor.restore.ts","../src/react-shell/review/item.icons.tsx","../src/react-shell/qa/item.card.tsx","../src/react-shell/qa/panel.header.tsx","../src/react-shell/qa/panel.tsx","../src/react-shell/presence/overlay.tsx","../src/react-shell/source.hint.ts","../src/react-shell/source.open.ts","../src/react-shell/section.outline.ts","../src/react-shell/review/shell.helpers.ts","../src/react-shell/review/section.outline.panel.tsx","../src/react-shell/review/source.shortcut.style.ts","../src/react-shell/review/source.inspector.overlay.tsx","../src/react-shell/review/mode.toolbar.tsx","../src/react-shell/ruler/gutters.tsx","../src/react-shell/ruler/overlay.tsx","../src/react-shell/target/figma.image.overlay.ts","../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/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.figma.images.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/figma/dev-overlay.tsx","../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 { mountFigmaDevOverlay } from './react-shell/figma/dev-overlay';\nexport type {\n CreateReviewPagesOptions,\n ReviewShellAdapter,\n ReviewShellAdapters,\n ReviewShellAssigneeOption,\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceSession,\n ReviewPresenceState,\n ReviewPresenceStatus,\n ReviewPresenceUser,\n ReviewSourceEditor,\n ReviewSourceInspectorOptions,\n ReviewShellFigmaImagesOptions,\n ReviewShellGlobEntries,\n ReviewShellMountOptions,\n ReviewShellPage,\n ReviewShellProps,\n ReviewShellStatusOption,\n ReviewShellUpdateAssigneeInput,\n ReviewShellUpdateStatusInput,\n ReviewShellViewportKind,\n ReviewShellViewportPreset,\n} from './react-shell/types';\nexport type {\n FigmaDevOverlayController,\n FigmaDevOverlayMountOptions,\n} from './react-shell/figma/dev-overlay';\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","import { reviewTypographyTokens } from '../../core/typography.tokens';\n\nexport const reviewShellBaseStyle = `\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 .df-review-spinner {\n display: inline-block;\n width: 22px;\n min-width: 22px;\n height: 22px;\n min-height: 22px;\n box-sizing: border-box;\n border: 3px solid color-mix(in srgb, var(--df-review-accent) 28%, transparent);\n border-top-color: var(--df-review-accent);\n border-radius: 50%;\n animation: df-review-spinner-spin 760ms linear infinite;\n will-change: transform;\n }\n\n @keyframes df-review-spinner-spin {\n to {\n transform: rotate(1turn);\n }\n }\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 ${reviewTypographyTokens}\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: 34px;\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 position: relative;\n display: grid;\n grid-template-columns: minmax(0, 1fr) 0 48px;\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) 48px;\n }\n\n\t .df-review-topbar {\n\t grid-column: 1;\n\t grid-row: 1;\n\t position: relative;\n\t z-index: 600;\n\t display: grid;\n\t gap: var(--df-review-space-2);\n\t container-type: inline-size;\n\t min-width: 0;\n\t padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n\t border-bottom: 1px solid var(--df-review-line-soft);\n\t background:\n\t linear-gradient(180deg, var(--df-review-topbar), var(--df-review-panel));\n\t box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.025);\n\t }\n\n\t\t .df-review-address {\n\t\t display: grid;\n\t\t grid-template-columns: auto minmax(160px, 1fr) auto;\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-actions {\n display: flex;\n align-items: stretch;\n gap: 4px;\n min-width: 0;\n }\n\n .df-review-address input {\n\t width: 100%;\n\t height: var(--df-review-control-height-md);\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-address a,\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 height: var(--df-review-control-height-md);\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: var(--df-review-font-weight-normal);\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\t .df-review-address a: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-address-icon-button {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n min-width: var(--df-review-control-height-md);\n padding: 0;\n text-decoration: none;\n }\n\n .df-review-address-icon-button svg {\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n }\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`;\n","export const reviewShellSitemapStyle = `\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 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 font-weight: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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-search {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 34px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: 0 10px;\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n color: var(--df-review-muted);\n }\n\n .df-review-sitemap-search:focus-within {\n border-color: var(--df-review-accent);\n color: var(--df-review-text);\n }\n\n .df-review-sitemap-search svg {\n width: 15px;\n min-width: 15px;\n height: 15px;\n }\n\n .df-review-sitemap-search input {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 30px;\n border: 0;\n padding: 0;\n outline: none;\n color: var(--df-review-text);\n background: transparent;\n appearance: none;\n font: inherit;\n font-size: var(--df-review-font-size-sm);\n }\n\n .df-review-sitemap-search input::-webkit-search-cancel-button {\n appearance: none;\n }\n\n .df-review-sitemap-search input::placeholder {\n color: var(--df-review-muted);\n }\n\n .df-review-sitemap-search-clear {\n display: grid;\n place-items: center;\n width: 34px;\n min-width: 34px;\n min-height: 34px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n background: var(--df-review-control);\n color: var(--df-review-muted);\n }\n\n .df-review-sitemap-search-clear:hover {\n border-color: var(--df-review-accent);\n color: var(--df-review-text);\n background: var(--df-review-control-hover);\n }\n\n .df-review-sitemap-search-clear svg {\n width: 15px;\n height: 15px;\n }\n\n .df-review-sitemap-search-count {\n flex: 0 0 auto;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n white-space: nowrap;\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: var(--df-review-font-weight-emphasis);\n }\n\n .df-review-sitemap-list {\n --df-review-sitemap-grid-template: minmax(190px, 1fr) 58px 70px 56px minmax(96px, 140px);\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: 6px;\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: 30px;\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: var(--df-review-font-weight-normal);\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: 34px;\n border: 0;\n border-radius: 0;\n padding: 0 8px;\n background: transparent;\n color: var(--df-review-text);\n text-align: left;\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.is-clickable {\n cursor: pointer;\n }\n\n .df-review-sitemap-row.is-clickable .df-review-sitemap-path,\n .df-review-sitemap-row.is-clickable .df-review-sitemap-cell,\n .df-review-sitemap-row.is-clickable .df-review-sitemap-page-label {\n cursor: pointer;\n }\n\n .df-review-sitemap-empty {\n display: flex;\n grid-column: 1 / -1;\n align-items: center;\n min-height: 58px;\n padding: 0 8px;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-sm);\n }\n\n .df-review-sitemap-row:not(.is-summary):hover,\n .df-review-sitemap-row.is-clickable:focus-visible,\n button.df-review-sitemap-row.is-summary:hover,\n .df-review-sitemap-row.is-active {\n background: var(--df-review-accent-soft);\n }\n\n .df-review-sitemap-row.is-clickable:focus-visible {\n outline: 1px solid var(--df-review-accent);\n outline-offset: -1px;\n }\n\n .df-review-sitemap-path {\n position: relative;\n display: inline-flex;\n align-items: center;\n align-self: stretch;\n gap: 6px;\n min-width: 0;\n padding-left: calc(var(--df-review-sitemap-depth, 0) * 18px);\n overflow-wrap: anywhere;\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-md);\n font-weight: var(--df-review-font-weight-normal);\n line-height: 1.35;\n }\n\n .df-review-sitemap-path::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: calc(var(--df-review-sitemap-depth, 0) * 18px);\n background-image: repeating-linear-gradient(\n to right,\n transparent 0,\n transparent 10px,\n var(--df-review-line-soft) 10px,\n var(--df-review-line-soft) 11px,\n transparent 11px,\n transparent 18px\n );\n opacity: 0.9;\n pointer-events: none;\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-toggle,\n .df-review-sitemap-tree-spacer {\n display: inline-grid;\n place-items: center;\n flex: 0 0 auto;\n width: 20px;\n min-width: 20px;\n height: 20px;\n }\n\n .df-review-sitemap-tree-toggle {\n border: 0;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n background: transparent;\n color: var(--df-review-muted);\n box-shadow: none;\n cursor: pointer;\n }\n\n .df-review-sitemap-tree-toggle:hover,\n .df-review-sitemap-tree-toggle:focus-visible {\n color: var(--df-review-text);\n background: var(--df-review-control-hover);\n }\n\n .df-review-sitemap-tree-toggle svg {\n width: 15px;\n height: 15px;\n }\n\n .df-review-sitemap-page-label {\n min-width: 0;\n min-height: 24px;\n border-radius: var(--df-review-radius-sm);\n padding: 0 5px;\n overflow: hidden;\n color: inherit;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\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: var(--df-review-font-weight-normal);\n line-height: 1;\n text-align: right;\n }\n\n .df-review-sitemap-cell.is-todo {\n color: var(--df-review-accent);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n .df-review-sitemap-cell.is-todo strong {\n font: inherit;\n }\n\n .df-review-sitemap-cell.is-zero {\n color: var(--df-review-muted);\n opacity: 0.45;\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: var(--df-review-font-weight-emphasis);\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 .df-review-sitemap-row.is-page:hover .df-review-sitemap-path,\n button.df-review-sitemap-row.is-summary: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`;\n","export const reviewShellModalStyle = `\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 font-weight: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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 display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\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 11px;\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: var(--df-review-font-weight-normal);\n\t\t }\n\n .df-review-settings-theme-option svg {\n width: 15px;\n height: 15px;\n flex: 0 0 auto;\n stroke-width: 2.2;\n }\n\n .df-review-settings-theme-option span {\n color: inherit;\n }\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\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\t\t\t .df-review-prompt-dialog-narrow {\n\t\t\t width: min(440px, calc(100vw - 36px));\n\t\t\t }\n\n\t\t\t .df-review-prompt-dialog-narrow .df-review-prompt-block textarea {\n\t\t\t height: min(58vh, 540px);\n\t\t\t max-height: none;\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: var(--df-review-font-weight-normal);\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 font-weight: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\n\t\t\t }\n\n\t\t\t .df-review-prompt-header button svg {\n\t\t\t width: 15px;\n\t\t\t height: 15px;\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 .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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\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: var(--df-review-font-weight-normal);\n\t\t\t line-height: 1.5;\n\t\t\t white-space: pre-wrap;\n\t\t\t overflow-wrap: anywhere;\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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-normal);\n\t\t\t }\n\n\t\t\t .df-review-about-dialog {\n\t\t\t grid-template-rows: minmax(0, 1fr);\n\t\t\t width: min(600px, calc(100vw - 36px));\n\t\t\t }\n\n\t\t\t .df-review-about-close {\n\t\t\t position: absolute;\n\t\t\t top: 14px;\n\t\t\t right: 14px;\n\t\t\t z-index: 2;\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t width: 32px;\n\t\t\t height: 32px;\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 background: var(--df-review-control);\n\t\t\t color: var(--df-review-text);\n\t\t\t }\n\n\t\t\t .df-review-about-close svg {\n\t\t\t width: 15px;\n\t\t\t height: 15px;\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 .df-review-about-body {\n\t\t\t display: grid;\n\t\t\t align-content: start;\n\t\t\t gap: 22px;\n\t\t\t min-height: 0;\n\t\t\t overflow: auto;\n\t\t\t padding: 34px 32px;\n\t\t\t }\n\n\t\t\t .df-review-about-intro {\n\t\t\t display: grid;\n\t\t\t justify-items: start;\n\t\t\t gap: 8px;\n\t\t\t }\n\n\t\t\t .df-review-about-logo {\n\t\t\t display: grid;\n\t\t\t place-items: center;\n\t\t\t color: var(--df-review-text);\n\t\t\t }\n\n\t\t\t .df-review-about-logo svg {\n\t\t\t width: auto;\n\t\t\t height: 26px;\n\t\t\t fill: currentColor;\n\t\t\t }\n\n\t\t\t .df-review-about-intro 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 font-weight: var(--df-review-font-weight-emphasis);\n\t\t\t }\n\n\t\t\t .df-review-about-intro span {\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: var(--df-review-font-weight-normal);\n\t\t\t }\n\n\t\t\t .df-review-about-item {\n\t\t\t display: grid;\n\t\t\t gap: 5px;\n\t\t\t }\n\n\t\t\t .df-review-about-item 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: var(--df-review-font-weight-emphasis);\n\t\t\t }\n\n\t\t\t .df-review-about-item 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: var(--df-review-font-weight-normal);\n\t\t\t line-height: 1.6;\n\t\t\t }\n\n\n`;\n","export const reviewShellToolbarStyle = `\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 display: flex;\n\t align-items: center;\n\t gap: var(--df-review-space-1-5);\n\t height: var(--df-review-control-height-md);\n\t min-height: var(--df-review-control-height-md);\n\t padding: 0;\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 .df-review-overlays {\n display: flex;\n align-items: center;\n gap: 4px;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-mode {\n gap: 3px;\n padding: 3px;\n }\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: var(--df-review-font-weight-normal);\n\t line-height: 1;\n\t\t user-select: none;\n\t }\n\n .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-md);\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: var(--df-review-font-weight-normal);\n\t line-height: 1;\n\t }\n\n .df-review-preset-select {\n -webkit-appearance: none;\n appearance: none;\n display: none;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n min-width: 154px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-md);\n padding: 0 42px 0 14px;\n color: var(--df-review-text);\n background-color: var(--df-review-control);\n background-image: url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m6 9 6 6 6-6' stroke='%23d7deea' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n background-position: right 14px center;\n background-repeat: no-repeat;\n background-size: 18px 18px;\n box-shadow: var(--df-review-shadow-control);\n font-size: var(--df-review-font-size-sm);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n\t .df-review-presets button {\n\t display: inline-flex;\n\t align-items: center;\n gap: 7px;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\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: var(--df-review-font-weight-normal);\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 font-weight: var(--df-review-font-weight-normal);\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: var(--df-review-control-height-md);\n\t min-width: var(--df-review-control-height-md);\n\t height: var(--df-review-control-height-md);\n\t min-height: var(--df-review-control-height-md);\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 {\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n }\n\n .df-review-overlay-button:hover,\n .df-review-overlay-button:focus-visible {\n border-color: var(--df-review-accent);\n background: var(--df-review-control-hover);\n color: var(--df-review-text);\n outline: 0;\n }\n\n .df-review-overlay-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-mode-button {\n width: calc(var(--df-review-control-height-md) - 6px);\n min-width: calc(var(--df-review-control-height-md) - 6px);\n height: calc(var(--df-review-control-height-md) - 6px);\n min-height: calc(var(--df-review-control-height-md) - 6px);\n }\n\n .df-review-overlays-menu {\n position: relative;\n display: none;\n flex: 0 0 auto;\n }\n\n .df-review-overlays-menu summary {\n display: grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n min-width: var(--df-review-control-height-md);\n height: var(--df-review-control-height-md);\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-md);\n padding: 0;\n color: var(--df-review-muted);\n background: var(--df-review-card);\n box-shadow: var(--df-review-shadow-control);\n cursor: pointer;\n }\n\n .df-review-overlays-menu summary::-webkit-details-marker {\n display: none;\n }\n\n .df-review-overlays-menu summary::marker {\n content: '';\n }\n\n .df-review-overlays-menu summary:hover,\n .df-review-overlays-menu[open] summary {\n border-color: var(--df-review-accent);\n background: var(--df-review-control-hover);\n color: var(--df-review-accent);\n }\n\n .df-review-overlays-menu summary svg {\n width: 20px;\n height: 20px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.9;\n }\n\n .df-review-overlays-popover {\n position: absolute;\n top: calc(100% + 6px);\n right: 0;\n z-index: 700;\n display: none;\n align-items: center;\n gap: var(--df-review-space-1-5);\n min-height: var(--df-review-control-height-md);\n padding: 0;\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-modal);\n }\n\n .df-review-overlays-menu[open] .df-review-overlays-popover {\n display: flex;\n }\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 .df-review-overlay-button .df-review-figma-mark-icon {\n fill: currentColor;\n stroke: none;\n }\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: row;\n\t align-items: center;\n\t justify-content: space-between;\n\t }\n\n\t .df-review-tool-controls {\n\t flex: 1 1 auto;\n\t width: auto;\n min-width: 0;\n flex-wrap: nowrap;\n\t }\n\n\t .df-review-presets {\n\t display: none;\n\t }\n\n .df-review-preset-select {\n display: block;\n flex: 0 1 150px;\n min-width: 128px;\n width: clamp(128px, 20vw, 150px);\n\t }\n\n .df-review-tool-divider,\n .df-review-active-size {\n display: none;\n }\n\n\t\t }\n\n\t\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: 640;\n\t display: flex;\n\t flex-direction: column;\n\t align-items: stretch;\n\t justify-content: flex-start;\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 position: relative;\n flex: 0 0 48px;\n display: grid;\n place-items: center;\n width: 100%;\n min-height: 48px;\n border: 0;\n\t border-radius: 0;\n\t padding: 0;\n\t background: transparent;\n\t color: var(--df-review-muted);\n transition: color 140ms ease, background 140ms ease;\n\t }\n\n\t .df-review-side-toggle:hover {\n\t color: var(--df-review-text);\n\t }\n\n .df-review-side-toggle.is-active {\n color: var(--df-review-accent);\n }\n\n .df-review-side-toggle.is-active::after {\n position: absolute;\n top: 9px;\n right: 0;\n bottom: 9px;\n width: 3px;\n border-radius: 3px 0 0 3px;\n background: var(--df-review-accent);\n content: '';\n }\n\n .df-review-side-toggle:focus-visible {\n outline: 0;\n color: var(--df-review-text);\n }\n\n .df-review-side-toggle:focus-visible span {\n border-radius: 6px;\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 3px;\n }\n\n .df-review-side-toggle span {\n display: grid;\n place-items: center;\n\t width: 30px;\n\t height: 30px;\n\t line-height: 1;\n\t }\n\n\t .df-review-side-toggle svg {\n\t width: 22px;\n\t height: 22px;\n\t fill: none;\n\t stroke: currentColor;\n\t stroke-linecap: round;\n\t stroke-width: 1.55;\n\t }\n\n .df-review-side-toggle svg.df-review-brand-icon {\n width: auto;\n height: 16px;\n stroke: none;\n fill: currentColor;\n }\n\n .df-review-side-actions {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n width: 100%;\n margin-top: auto;\n }\n\n .df-review-side-divider {\n height: 1px;\n margin: 4px 12px;\n background: var(--df-review-line);\n }\n\n .df-review-presence-overlay {\n position: relative;\n margin-top: auto;\n }\n\n .df-review-side-actions .df-review-presence-overlay {\n margin-top: 0;\n }\n\n .df-review-presence-button {\n position: relative;\n display: grid;\n place-items: center;\n width: 100%;\n min-height: 48px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n }\n\n .df-review-presence-button:hover,\n .df-review-presence-button[aria-expanded=\"true\"] {\n color: var(--df-review-text);\n }\n\n .df-review-presence-button:focus-visible {\n outline: 0;\n }\n\n .df-review-presence-button:focus-visible svg {\n border-radius: 6px;\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 3px;\n }\n\n .df-review-presence-button svg {\n width: 22px;\n height: 22px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.55;\n }\n\n .df-review-presence-badge {\n position: absolute;\n top: 6px;\n right: 6px;\n display: grid;\n place-items: center;\n min-width: 17px;\n height: 17px;\n border: 1px solid var(--df-review-side-rail);\n border-radius: var(--df-review-radius-pill);\n padding: 0 4px;\n color: #17202c;\n background: var(--df-review-accent);\n font-size: var(--df-review-font-size-3xs);\n font-weight: var(--df-review-font-weight-emphasis);\n line-height: 1;\n pointer-events: none;\n }\n\n .df-review-presence-list {\n position: absolute;\n right: calc(100% + 8px);\n bottom: 8px;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 5px;\n width: max-content;\n min-width: 0;\n max-width: 220px;\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 width: fit-content;\n max-width: 180px;\n min-width: 0;\n min-height: 22px;\n justify-content: flex-end;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-pill);\n padding: 0 9px;\n color: var(--df-review-text);\n background: var(--df-review-control);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .df-review-presence-chip span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n text-align: right;\n white-space: nowrap;\n }\n\n .df-review-presence-chip.is-self {\n color: var(--df-review-accent);\n border-color: var(--df-review-accent-hover);\n background: linear-gradient(\n var(--df-review-accent-soft),\n var(--df-review-accent-soft)\n ),\n var(--df-review-control);\n }\n\n`;\n","export const reviewShellQaPanelStyle = `\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) auto;\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 .df-review-qa-draft-host {\n position: relative;\n z-index: 2;\n display: none;\n justify-self: end;\n width: calc(100% - var(--df-review-space-4));\n margin: 0 var(--df-review-space-2) var(--df-review-space-2) auto;\n min-width: 0;\n }\n\n .df-review-qa-draft-host[data-has-draft-composer=\"true\"] {\n display: block;\n }\n\n .df-review-qa-panel[data-has-draft-composer=\"true\"] .df-review-panel-body {\n opacity: 0.36;\n pointer-events: none;\n }\n\n\t .df-review-shell:not(.is-list-visible) .df-review-qa-panel,\n .df-review-qa-panel[aria-hidden=\"true\"] {\n\t visibility: hidden;\n\t border-left: 0;\n pointer-events: none;\n\t }\n\n .df-review-source-tree-panel {\n grid-column: 2;\n grid-row: 1 / span 3;\n position: relative;\n z-index: 600;\n display: grid;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n border-left: 1px solid var(--df-review-line-soft);\n background:\n linear-gradient(180deg, var(--df-review-panel), var(--df-review-bg));\n }\n\n .df-review-shell:not(.is-list-visible) .df-review-source-tree-panel,\n .df-review-source-tree-panel[aria-hidden=\"true\"] {\n visibility: hidden;\n border-left: 0;\n pointer-events: none;\n }\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:\n var(--df-review-control-height-md)\n var(--df-review-control-height-md);\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: var(--df-review-font-weight-normal);\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-height: var(--df-review-control-height-md);\n min-width: 0;\n }\n\n\t\t\t .df-review-list-title {\n\t\t\t display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n\t\t\t align-items: center;\n\t\t\t gap: 8px;\n min-height: var(--df-review-control-height-md);\n\t\t min-width: 0;\n\t\t }\n\n .df-review-list-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n\t\t .df-review-list-meta span {\n\t\t min-width: 0;\n\t\t overflow: hidden;\n\t\t color: #fff;\n\t\t text-overflow: ellipsis;\n\t\t white-space: nowrap;\n\t\t }\n\n\t\t\t .df-review-list-meta strong {\n\t\t\t flex: 0 0 auto;\n\t\t\t color: #fff;\n\t\t\t font-size: var(--df-review-font-size-xs);\n\t\t\t font-variant-numeric: tabular-nums;\n font-weight: var(--df-review-font-weight-normal);\n\t\t\t }\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 height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\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: var(--df-review-font-weight-normal);\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-source-refresh {\n position: relative;\n\t\t display: inline-grid;\n\t\t place-items: center;\n\t\t width: var(--df-review-control-height-md);\n\t\t min-width: var(--df-review-control-height-md);\n\t\t height: var(--df-review-control-height-md);\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: 16px;\n\t\t height: 16px;\n\t\t }\n\n\t\t\t .df-review-filter-tabs {\n display: flex;\n align-items: center;\n justify-self: end;\n gap: 2px;\n height: 26px;\n min-height: 26px;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\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: 0;\n background: transparent;\n color: var(--df-review-subtle);\n opacity: 0.3;\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 color: var(--df-review-text);\n opacity: 1;\n\t\t }\n\n\t\t .df-review-filter-tab.is-active {\n\t\t box-shadow: none;\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: 14px;\n\t\t\t\t height: 14px;\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: 1.9;\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: var(--df-review-font-weight-emphasis);\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\t .df-review-empty {\n\t\t display: flex;\n\t\t align-items: center;\n\t\t gap: var(--df-review-space-2);\n\t\t margin: 0;\n\t\t padding: var(--df-review-space-5) var(--df-review-space-4);\n\t\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\t line-height: 1.45;\n\t\t }\n\n .df-review-empty.is-loading {\n border-style: solid;\n color: var(--df-review-text);\n }\n\n .df-review-empty .df-review-spinner,\n .df-review-item-saving .df-review-spinner,\n .df-review-edit-actions .df-review-spinner {\n flex: none;\n width: 12px;\n min-width: 12px;\n height: 12px;\n min-height: 12px;\n border-width: 2px;\n }\n\n .df-review-item-card.is-dim {\n opacity: 0.4;\n }\n\n\t .df-review-item-card.is-dim:hover {\n\t opacity: 0.72;\n\t }\n\n .df-review-item-card.is-mutating {\n pointer-events: auto;\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 .df-review-item-main p {\n margin: 0;\n }\n\n .df-review-item-main strong {\n overflow-wrap: anywhere;\n font-size: var(--df-review-font-size-md);\n font-weight: var(--df-review-font-weight-normal);\n line-height: 1.35;\n }\n\n .df-review-item-title {\n padding-top: 4px;\n }\n\n .df-review-item-comment {\n padding: 0;\n color: var(--df-review-muted);\n overflow-wrap: anywhere;\n font-size: var(--df-review-font-size-sm);\n line-height: 1.45;\n white-space: pre-wrap;\n }\n\n .df-review-item-comment.is-primary {\n padding: 5px 0;\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-md);\n line-height: 1.35;\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\t .df-review-item-error {\n\t color: var(--df-review-danger) !important;\n\t overflow-wrap: anywhere;\n\t }\n\n .df-review-item-saving {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--df-review-accent);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\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-assignee-badge,\n .df-review-item-assignee-select,\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: var(--df-review-font-weight-emphasis);\n line-height: 1;\n text-transform: uppercase;\n }\n\n .df-review-item-id {\n appearance: none;\n border-color: var(--df-review-line);\n background: rgba(255, 255, 255, 0.03);\n color: var(--df-review-text);\n cursor: copy;\n font-family: inherit;\n }\n\n .df-review-item-id:hover,\n .df-review-item-id:focus-visible,\n .df-review-item-id.is-copied {\n border-color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n color: var(--df-review-accent);\n outline: none;\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: var(--df-review-font-weight-normal);\n text-transform: none;\n }\n\n .df-review-item-assignee-badge,\n .df-review-item-assignee-select {\n min-height: 30px;\n min-width: 96px;\n max-width: 132px;\n border-radius: var(--df-review-radius-sm);\n border-color: rgba(255, 255, 255, 0.16);\n padding: 0 10px;\n color: var(--df-review-text);\n background: var(--df-review-control);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n text-transform: none;\n }\n\n .df-review-item-assignee-select {\n cursor: pointer;\n outline: 0;\n }\n\n\t .df-review-item-assignee-select:focus-visible {\n\t border-color: var(--df-review-accent);\n\t box-shadow: 0 0 0 2px var(--df-review-accent-soft);\n\t }\n\n .df-review-item-assignee-select:disabled {\n cursor: wait;\n opacity: 0.62;\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: var(--df-review-font-weight-normal);\n text-transform: none;\n }\n\n\t .df-review-item-status-select:focus-visible {\n\t border-color: var(--df-review-accent);\n\t box-shadow: 0 0 0 2px var(--df-review-accent-soft);\n\t }\n\n .df-review-item-status-select:disabled {\n cursor: wait;\n opacity: 0.62;\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-assignee-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\t .df-review-item-workflow-actions {\n\t\t\t\t display: inline-flex;\n\t\t\t\t grid-column: 1;\n\t\t\t\t align-items: center;\n\t\t\t\t gap: 6px;\n\t\t\t\t min-width: 0;\n\t\t\t\t flex-wrap: wrap;\n\t\t\t cursor: auto;\n\t\t\t\t }\n\n\t\t\t\t .df-review-item-status-actions,\n\t\t\t\t .df-review-item-assignee-actions {\n\t\t\t\t display: inline-flex;\n\t\t\t\t align-items: center;\n\t\t\t\t min-width: 0;\n\t\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 .df-review-item-action-button.is-copied {\n border-color: rgba(124, 199, 255, 0.42);\n color: var(--df-review-accent);\n background: var(--df-review-accent-soft);\n }\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: var(--df-review-font-weight-normal);\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\t .df-review-item-action-button:disabled {\n\t cursor: default;\n\t opacity: 0.45;\n\t }\n\n .df-review-source-refresh.is-loading svg {\n animation: df-review-spinner-spin 760ms linear infinite;\n }\n\n .df-review-source-refresh:disabled {\n cursor: wait;\n opacity: 0.7;\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`;\n","export const reviewShellFigmaImagesStyle = `\n .df-review-figma-images-panel {\n grid-column: 2;\n grid-row: 1 / span 3;\n position: relative;\n z-index: 600;\n display: grid;\n grid-template-rows: auto auto auto auto auto minmax(0, 1fr);\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n border-left: 1px solid var(--df-review-line-soft);\n background:\n linear-gradient(180deg, var(--df-review-panel), var(--df-review-bg));\n }\n\n .df-review-shell:not(.is-list-visible) .df-review-figma-images-panel,\n .df-review-figma-images-panel[aria-hidden=\"true\"] {\n visibility: hidden;\n border-left: 0;\n pointer-events: none;\n }\n\n .df-review-figma-images-header {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 8px;\n min-height: var(--df-review-control-height-md);\n min-width: 0;\n }\n\n .df-review-figma-images-title {\n display: grid;\n min-width: 0;\n }\n\n .df-review-figma-images-title strong {\n overflow: hidden;\n color: var(--df-review-text);\n font-size: inherit;\n font-weight: var(--df-review-font-weight-emphasis);\n line-height: 1;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-figma-image-form {\n display: grid;\n grid-template-rows:\n var(--df-review-control-height-md)\n var(--df-review-control-height-md);\n align-items: center;\n gap: var(--df-review-space-2);\n padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-card);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-sm);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n .df-review-figma-image-form input {\n width: 100%;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n min-width: 0;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0 10px;\n color: var(--df-review-text);\n background: var(--df-review-bg);\n box-shadow: var(--df-review-shadow-control);\n font-size: var(--df-review-font-size-sm);\n }\n\n .df-review-figma-image-form input:focus {\n border-color: var(--df-review-accent);\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 1px;\n }\n\n .df-review-figma-image-url-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) var(--df-review-control-height-md);\n align-items: center;\n gap: var(--df-review-space-1-5);\n min-width: 0;\n }\n\n .df-review-figma-image-header-button {\n display: inline-grid;\n place-items: center;\n justify-self: end;\n width: 26px;\n min-width: 26px;\n height: 26px;\n min-height: 26px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n box-shadow: none;\n cursor: pointer;\n }\n\n .df-review-figma-image-header-button:hover,\n .df-review-figma-image-header-button:focus-visible {\n color: var(--df-review-text);\n opacity: 1;\n outline: 0;\n }\n\n .df-review-figma-image-header-button:disabled {\n cursor: default;\n opacity: 0.36;\n }\n\n .df-review-figma-image-header-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 .df-review-figma-image-url-row button,\n .df-review-figma-image-icon-button {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n min-width: var(--df-review-control-height-md);\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\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 box-shadow: var(--df-review-shadow-control);\n text-decoration: none;\n }\n\n .df-review-figma-image-url-row button:hover,\n .df-review-figma-image-icon-button:hover {\n border-color: var(--df-review-accent);\n color: var(--df-review-text);\n background: var(--df-review-control-hover);\n }\n\n .df-review-figma-image-url-row button:disabled,\n .df-review-figma-image-icon-button:disabled {\n cursor: default;\n opacity: 0.42;\n }\n\n .df-review-figma-image-url-row button svg,\n .df-review-figma-image-icon-button svg {\n width: 15px;\n height: 15px;\n }\n\n .df-review-figma-image-icon-button.is-danger: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-figma-image-icon-button.is-active {\n border-color: var(--df-review-accent);\n 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 }\n\n .df-review-figma-image-selected-controls {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: center;\n gap: var(--df-review-space-1);\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: color-mix(in srgb, var(--df-review-card) 82%, transparent);\n }\n\n .df-review-figma-image-selected-numbers {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(54px, 64px) var(--df-review-control-height-sm);\n justify-self: stretch;\n gap: var(--df-review-space-1);\n min-width: 0;\n }\n\n .df-review-figma-image-selected-link {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-sm);\n min-width: var(--df-review-control-height-sm);\n height: var(--df-review-control-height-sm);\n min-height: var(--df-review-control-height-sm);\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 box-shadow: var(--df-review-shadow-control);\n text-decoration: none;\n }\n\n .df-review-figma-image-selected-link:hover,\n .df-review-figma-image-selected-link:focus-visible {\n border-color: var(--df-review-accent);\n color: var(--df-review-text);\n background: var(--df-review-control-hover);\n outline: none;\n }\n\n .df-review-figma-image-selected-link:disabled {\n cursor: default;\n opacity: 0.42;\n }\n\n .df-review-figma-image-selected-link svg {\n width: 13px;\n height: 13px;\n }\n\n .df-review-figma-image-number-control {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n align-items: center;\n gap: 4px;\n min-width: 0;\n height: var(--df-review-control-height-sm);\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0 5px;\n color: var(--df-review-muted);\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-variant-numeric: tabular-nums;\n }\n\n .df-review-figma-image-number-control svg {\n width: 13px;\n height: 13px;\n color: var(--df-review-subtle);\n }\n\n .df-review-figma-image-number-control span {\n color: var(--df-review-subtle);\n font-size: var(--df-review-font-size-2xs);\n line-height: 1;\n }\n\n .df-review-figma-image-number-control input {\n width: 100%;\n min-width: 0;\n border: 0;\n padding: 0;\n color: var(--df-review-text);\n background: transparent;\n font-size: var(--df-review-font-size-xs);\n font-variant-numeric: tabular-nums;\n outline: none;\n }\n\n .df-review-figma-image-number-control input:disabled {\n color: var(--df-review-subtle);\n }\n\n .df-review-figma-image-number-control:focus-within {\n border-color: var(--df-review-accent);\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 1px;\n }\n\n .df-review-figma-image-opacity-control {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) 26px;\n align-items: center;\n gap: 6px;\n min-width: 0;\n height: var(--df-review-control-height-sm);\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0 6px;\n color: var(--df-review-muted);\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-variant-numeric: tabular-nums;\n }\n\n .df-review-figma-image-opacity-control span {\n color: var(--df-review-subtle);\n font-size: var(--df-review-font-size-2xs);\n line-height: 1;\n }\n\n .df-review-figma-image-opacity-control strong {\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-xs);\n font-weight: 500;\n line-height: 1;\n text-align: right;\n }\n\n .df-review-figma-image-opacity-slider {\n --df-review-figma-opacity-thumb-size: 12px;\n --df-review-figma-opacity-thumb-radius: 6px;\n position: relative;\n display: grid;\n align-items: center;\n min-width: 0;\n height: 20px;\n cursor: pointer;\n touch-action: none;\n }\n\n .df-review-figma-image-opacity-slider::before {\n content: \"\";\n position: absolute;\n top: 50%;\n right: var(--df-review-figma-opacity-thumb-radius);\n left: var(--df-review-figma-opacity-thumb-radius);\n height: 4px;\n border-radius: 999px;\n background: linear-gradient(\n 90deg,\n var(--df-review-accent) 0 var(--df-review-figma-opacity-value),\n var(--df-review-line) var(--df-review-figma-opacity-value) 100%\n );\n transform: translateY(-50%);\n pointer-events: none;\n }\n\n .df-review-figma-image-opacity-slider::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: clamp(\n var(--df-review-figma-opacity-thumb-radius),\n var(--df-review-figma-opacity-left, var(--df-review-figma-opacity-value)),\n calc(100% - var(--df-review-figma-opacity-thumb-radius))\n );\n z-index: 2;\n box-sizing: border-box;\n width: var(--df-review-figma-opacity-thumb-size);\n height: var(--df-review-figma-opacity-thumb-size);\n border: 1px solid var(--df-review-accent);\n border-radius: 50%;\n background: var(--df-review-text);\n box-shadow: 0 0 0 2px var(--df-review-bg);\n transform: translate(-50%, -50%);\n pointer-events: none;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"] {\n -webkit-appearance: none;\n appearance: none;\n position: absolute;\n inset: 0;\n z-index: 3;\n width: 100%;\n min-width: 0;\n height: 100%;\n border: 0;\n margin: 0;\n padding: 0;\n background: transparent;\n outline: none;\n opacity: 0;\n cursor: pointer;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]::-webkit-slider-runnable-track {\n height: 4px;\n border-radius: 999px;\n background: transparent;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: var(--df-review-figma-opacity-thumb-size);\n height: var(--df-review-figma-opacity-thumb-size);\n margin-top: -4px;\n border: 0;\n border-radius: 50%;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]::-moz-range-track {\n height: 4px;\n border-radius: 999px;\n background: transparent;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]::-moz-range-thumb {\n width: var(--df-review-figma-opacity-thumb-size);\n height: var(--df-review-figma-opacity-thumb-size);\n border: 0;\n border-radius: 50%;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-figma-image-opacity-slider input[type=\"range\"]:disabled {\n cursor: default;\n }\n\n .df-review-figma-image-opacity-control:focus-within {\n border-color: var(--df-review-accent);\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 1px;\n }\n\n .df-review-figma-image-status {\n margin: 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 color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n overflow-wrap: anywhere;\n }\n\n .df-review-figma-image-status.is-error {\n color: var(--df-review-danger);\n }\n\n .df-review-figma-image-list {\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 .df-review-figma-image-card {\n position: relative;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-areas: \"state main actions\";\n align-items: center;\n gap: var(--df-review-space-1-5);\n min-height: 76px;\n min-width: 0;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: var(--df-review-space-4) var(--df-review-space-2);\n background: var(--df-review-card);\n cursor: pointer;\n transition: border-color 140ms ease, box-shadow 140ms ease;\n }\n\n .df-review-figma-image-card:hover {\n border-color: var(--df-review-line);\n }\n\n .df-review-figma-image-card.is-dragging {\n opacity: 0.58;\n }\n\n .df-review-figma-image-card.is-drop-target {\n border-color: var(--df-review-line-soft);\n box-shadow: none;\n }\n\n .df-review-figma-image-card.is-drop-before::before,\n .df-review-figma-image-card.is-drop-after::after {\n content: \"\";\n position: absolute;\n z-index: 2;\n right: 6px;\n left: 6px;\n height: 2px;\n border-radius: 999px;\n background: var(--df-review-accent);\n box-shadow: 0 0 0 2px rgba(124, 199, 255, 0.16);\n pointer-events: none;\n }\n\n .df-review-figma-image-card.is-drop-before::before {\n top: -6px;\n }\n\n .df-review-figma-image-card.is-drop-after::after {\n bottom: -6px;\n }\n\n .df-review-figma-image-card.is-active {\n border-color: var(--df-review-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover), 0 0 0 3px rgba(124, 199, 255, 0.12);\n }\n\n .df-review-figma-image-card.is-editing {\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-areas: \"state main\";\n }\n\n .df-review-figma-image-card.is-status {\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-areas: \"state main\";\n cursor: default;\n }\n\n .df-review-figma-image-spinner {\n grid-area: state;\n }\n\n .df-review-figma-image-layer-state {\n grid-area: state;\n display: grid;\n grid-template-columns: repeat(3, 22px);\n align-items: center;\n gap: 2px;\n min-width: 0;\n height: var(--df-review-control-height-sm);\n }\n\n .df-review-figma-image-state-button {\n display: inline-grid;\n place-items: center;\n width: 22px;\n min-width: 22px;\n height: 22px;\n min-height: 22px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-subtle);\n background: transparent;\n box-shadow: none;\n opacity: 0.62;\n }\n\n .df-review-figma-image-state-button:hover,\n .df-review-figma-image-state-button:focus-visible {\n color: var(--df-review-text);\n opacity: 1;\n outline: none;\n }\n\n .df-review-figma-image-state-button.is-active {\n color: var(--df-review-accent);\n opacity: 1;\n }\n\n .df-review-figma-image-state-button svg {\n width: 13px;\n height: 13px;\n }\n\n .df-review-figma-image-card-main {\n grid-area: main;\n display: grid;\n gap: 3px;\n min-width: 0;\n }\n\n .df-review-figma-image-label-input {\n width: 100%;\n min-width: 0;\n height: 24px;\n border: 1px solid transparent;\n border-radius: 2px;\n padding: 0 4px;\n color: var(--df-review-text);\n background: transparent;\n box-shadow: none;\n font-size: var(--df-review-font-size-sm);\n font-weight: 500;\n line-height: 1.28;\n }\n\n .df-review-figma-image-label-input:focus {\n border-color: var(--df-review-accent);\n outline: 2px solid var(--df-review-focus-ring);\n outline-offset: 1px;\n }\n\n .df-review-figma-image-label-input:disabled {\n color: var(--df-review-subtle);\n }\n\n .df-review-figma-image-card-main small {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-figma-image-card-main strong,\n .df-review-figma-image-card-main small {\n user-drag: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-drag: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n }\n\n .df-review-figma-image-card-main strong {\n min-width: 0;\n color: var(--df-review-text);\n font-size: var(--df-review-font-size-sm);\n font-weight: 500;\n line-height: 1.28;\n overflow-wrap: anywhere;\n white-space: normal;\n }\n\n .df-review-figma-image-card-main small {\n color: var(--df-review-subtle);\n font-size: var(--df-review-font-size-2xs);\n line-height: 1.2;\n }\n\n .df-review-figma-image-card-actions {\n grid-area: actions;\n display: grid;\n grid-template-columns: repeat(2, 22px);\n gap: 2px;\n }\n\n .df-review-figma-image-card-actions .df-review-figma-image-icon-button {\n width: 22px;\n min-width: 22px;\n height: 22px;\n min-height: 22px;\n border: 0;\n border-radius: 0;\n color: var(--df-review-subtle);\n background: transparent;\n box-shadow: none;\n opacity: 0;\n pointer-events: none;\n transition: opacity 120ms ease, color 120ms ease;\n }\n\n .df-review-figma-image-card:hover .df-review-figma-image-card-actions .df-review-figma-image-icon-button,\n .df-review-figma-image-card:focus-within .df-review-figma-image-card-actions .df-review-figma-image-icon-button {\n opacity: 0.62;\n pointer-events: auto;\n }\n\n .df-review-figma-image-card-actions .df-review-figma-image-icon-button:hover,\n .df-review-figma-image-card-actions .df-review-figma-image-icon-button:focus-visible {\n color: var(--df-review-text);\n background: transparent;\n opacity: 1;\n outline: none;\n }\n\n .df-review-figma-image-card.is-editing .df-review-figma-image-card-actions {\n display: none;\n }\n\n .df-review-figma-image-preview-dialog {\n grid-template-rows: auto minmax(0, 1fr);\n width: min(600px, calc(100vw - 36px));\n max-height: min(760px, calc(100vh - 36px));\n }\n\n .df-review-figma-image-preview-header {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto var(--df-review-control-height-md);\n align-items: center;\n gap: var(--df-review-space-2);\n min-width: 0;\n padding: 16px 18px 14px;\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-card);\n }\n\n .df-review-figma-image-preview-header input {\n width: 100%;\n height: var(--df-review-control-height-md);\n min-width: 0;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0 10px;\n color: var(--df-review-text);\n background: var(--df-review-bg);\n box-shadow: var(--df-review-shadow-control);\n font-size: var(--df-review-font-size-sm);\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .df-review-figma-image-preview-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: var(--df-review-control-height-md);\n min-width: 0;\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 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-sm);\n font-weight: 500;\n line-height: 1;\n text-decoration: none;\n white-space: nowrap;\n }\n\n .df-review-figma-image-preview-link:hover,\n .df-review-figma-image-preview-link:focus-visible {\n border-color: var(--df-review-accent);\n background: var(--df-review-control-hover);\n outline: none;\n }\n\n .df-review-figma-image-preview-link svg {\n width: 14px;\n height: 14px;\n flex: 0 0 auto;\n }\n\n .df-review-figma-image-preview-close {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n min-width: var(--df-review-control-height-md);\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n border: 1px solid var(--df-review-line);\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-text);\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n }\n\n .df-review-figma-image-preview-close:hover,\n .df-review-figma-image-preview-close:focus-visible {\n border-color: var(--df-review-accent);\n background: var(--df-review-control-hover);\n outline: none;\n }\n\n .df-review-figma-image-preview-close svg {\n width: 15px;\n height: 15px;\n }\n\n .df-review-figma-image-preview-scroll {\n min-height: 0;\n overflow: auto;\n padding: 16px;\n background: var(--df-review-bg);\n }\n\n .df-review-figma-image-preview-scroll img {\n display: block;\n width: auto;\n max-width: 100%;\n height: auto;\n margin: 0 auto;\n object-fit: contain;\n object-position: top center;\n }\n\n @media (max-width: 460px) {\n .df-review-figma-image-preview-header {\n grid-template-columns:\n minmax(0, 1fr)\n var(--df-review-control-height-md)\n var(--df-review-control-height-md);\n gap: var(--df-review-space-1-5);\n padding-left: 14px;\n padding-right: 14px;\n }\n\n .df-review-figma-image-preview-link {\n width: var(--df-review-control-height-md);\n padding: 0;\n }\n\n .df-review-figma-image-preview-link span {\n display: none;\n }\n }\n\n @media (hover: none) {\n .df-review-figma-image-card.is-active .df-review-figma-image-card-actions .df-review-figma-image-icon-button {\n opacity: 0.62;\n pointer-events: auto;\n }\n }\n`;\n","export const reviewShellStageStyle = `\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`;\n","export const reviewShellSourceInspectorStyle = `\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-data: #f3b75f;\n --df-review-source-popover-data-muted: rgba(243, 183, 95, 0.78);\n --df-review-source-popover-data-subtle: rgba(243, 183, 95, 0.62);\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: 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: var(--df-review-font-size-xl);\n font-weight: var(--df-review-font-weight-normal);\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 border: 0;\n border-top: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n padding: 9px 30px 9px 8px;\n color: var(--df-review-source-popover-text);\n background: transparent;\n text-align: left;\n }\n\n .df-review-source-candidate + .df-review-source-candidate {\n border-top-color: var(--df-review-source-popover-line);\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: 1px;\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: var(--df-review-font-weight-emphasis);\n line-height: 1.2;\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.24;\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 line-height: 1.2;\n }\n\n .df-review-source-candidate.is-data .df-review-source-candidate-main strong {\n color: var(--df-review-source-popover-data);\n }\n\n .df-review-source-candidate.is-data .df-review-source-candidate-main span {\n color: var(--df-review-source-popover-data-muted);\n }\n\n .df-review-source-candidate.is-data .df-review-source-candidate-main small {\n color: var(--df-review-source-popover-data-subtle);\n }\n\n`;\n","export const reviewShellSectionOutlineStyle = `\n .df-review-section-outline {\n position: relative;\n z-index: 1;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n border: 0;\n border-radius: 0;\n color: var(--df-review-text);\n background: transparent;\n box-shadow: none;\n overflow: hidden;\n }\n\n .df-review-section-outline-head {\n display: grid;\n grid-template-rows:\n var(--df-review-control-height-md)\n var(--df-review-control-height-md);\n align-items: center;\n gap: var(--df-review-space-2);\n min-width: 0;\n padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);\n border-bottom: 1px solid var(--df-review-line-soft);\n background: var(--df-review-card);\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-sm);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n .df-review-section-outline-summary {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 8px;\n min-height: var(--df-review-control-height-md);\n min-width: 0;\n }\n\n .df-review-section-outline-summary span {\n display: inline-flex;\n align-items: baseline;\n gap: 6px;\n min-width: 0;\n }\n\n .df-review-section-outline-head strong {\n overflow: hidden;\n color: var(--df-review-text);\n font-size: inherit;\n font-weight: var(--df-review-font-weight-emphasis);\n line-height: 1;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-section-outline-head small {\n flex: 0 0 auto;\n overflow: hidden;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-section-outline-meta-controls {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n height: 26px;\n min-height: 26px;\n min-width: 0;\n border: 0;\n border-radius: 0;\n padding: 0;\n background: transparent;\n box-shadow: none;\n }\n\n .df-review-section-outline-meta-toggle {\n display: inline-grid;\n place-items: center;\n width: 26px;\n min-width: 26px;\n height: 26px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-subtle);\n background: transparent;\n box-shadow: none;\n cursor: pointer;\n opacity: 0.3;\n }\n\n .df-review-section-outline-meta-toggle:hover,\n .df-review-section-outline-meta-toggle:focus-visible,\n .df-review-section-outline-meta-toggle.is-active {\n color: var(--df-review-text);\n opacity: 1;\n outline: 0;\n }\n\n .df-review-section-outline-meta-toggle.is-active {\n box-shadow: none;\n color: var(--df-review-accent);\n }\n\n .df-review-section-outline-meta-toggle 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 .df-review-section-outline-filter {\n display: grid;\n grid-template-columns: 18px minmax(0, 1fr) auto;\n align-items: center;\n align-self: stretch;\n gap: 8px;\n min-width: 0;\n height: var(--df-review-control-height-md);\n min-height: var(--df-review-control-height-md);\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-sm);\n padding: 0 7px 0 11px;\n color: var(--df-review-muted);\n background: var(--df-review-control);\n box-shadow: var(--df-review-shadow-control);\n }\n\n .df-review-section-outline-filter:focus-within {\n border-color: var(--df-review-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);\n }\n\n .df-review-section-outline-filter 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 }\n\n .df-review-section-outline-filter input {\n width: 100%;\n min-width: 0;\n height: 100%;\n border: 0;\n padding: 0;\n color: var(--df-review-text);\n background: transparent;\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n outline: 0;\n -webkit-appearance: none;\n appearance: none;\n }\n\n .df-review-section-outline-filter input::placeholder {\n color: var(--df-review-subtle);\n }\n\n .df-review-section-outline-filter input::-webkit-search-cancel-button,\n .df-review-section-outline-filter input::-webkit-search-decoration {\n display: none;\n -webkit-appearance: none;\n appearance: none;\n }\n\n .df-review-section-outline-filter-clear {\n display: inline-grid;\n place-items: center;\n width: var(--df-review-control-height-md);\n height: var(--df-review-control-height-md);\n border: 0;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n cursor: pointer;\n }\n\n .df-review-section-outline-filter-clear:hover,\n .df-review-section-outline-filter-clear:focus-visible {\n color: var(--df-review-text);\n background: var(--df-review-accent-soft);\n outline: 0;\n }\n\n .df-review-section-outline-list {\n display: grid;\n align-content: start;\n gap: var(--df-review-space-2);\n min-height: 0;\n overflow-y: auto;\n padding: var(--df-review-space-2) var(--df-review-space-2) var(--df-review-space-3);\n scrollbar-gutter: stable;\n }\n\n .df-review-section-outline-item {\n display: grid;\n --df-review-section-outline-name-color: var(--df-review-text);\n }\n\n /* Each root renders as a card so the tree scans like the QA list. */\n .df-review-section-outline-item.is-depth-1 {\n padding: var(--df-review-space-1);\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-lg);\n background: var(--df-review-card);\n }\n\n .df-review-section-outline-entry-body {\n display: grid;\n border: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n transition: border-color 140ms ease, background 140ms ease;\n }\n\n .df-review-section-outline-entry-body:hover {\n border-color: rgba(124, 199, 255, 0.2);\n background: var(--df-review-accent-soft);\n }\n\n\n .df-review-section-outline-row {\n display: grid;\n grid-template-columns: 18px minmax(0, 1fr) auto;\n align-items: center;\n gap: 7px;\n border-radius: var(--df-review-radius-sm);\n min-height: 42px;\n padding: 6px 7px 6px 6px;\n }\n\n .df-review-section-outline-toggle {\n display: grid;\n place-items: center;\n width: 18px;\n height: 18px;\n border: 0;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n }\n\n .df-review-section-outline-toggle:hover {\n color: var(--df-review-text);\n background: var(--df-review-accent-soft);\n }\n\n .df-review-section-outline-toggle svg {\n width: 13px;\n height: 13px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2.4;\n transition: transform 120ms ease;\n }\n\n .df-review-section-outline-toggle.is-collapsed svg {\n transform: rotate(-90deg);\n }\n\n .df-review-section-outline-toggle.is-placeholder {\n pointer-events: none;\n }\n\n .df-review-section-outline-name {\n display: grid;\n gap: 2px;\n min-width: 0;\n overflow: hidden;\n border: 0;\n padding: 0;\n color: var(--df-review-text);\n background: transparent;\n font-size: var(--df-review-font-size-sm);\n font-weight: var(--df-review-font-weight-normal);\n text-align: left;\n white-space: normal;\n cursor: pointer;\n }\n\n .df-review-section-outline-name span,\n .df-review-section-outline-name small {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .df-review-section-outline-name span {\n color: var(--df-review-section-outline-name-color);\n }\n\n .df-review-section-outline-name small {\n color: var(--df-review-muted);\n font-family: var(--df-review-font-mono);\n font-size: var(--df-review-font-size-2xs);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n .df-review-section-outline-name:hover {\n color: var(--df-review-accent);\n }\n\n .df-review-section-outline-meta {\n position: relative;\n display: grid;\n gap: 3px;\n min-width: 0;\n padding: 8px 6px 7px;\n }\n\n .df-review-section-outline-meta::before {\n position: absolute;\n top: 0;\n left: 29px;\n right: 8px;\n height: 1px;\n background: var(--df-review-line-soft);\n content: '';\n }\n\n .df-review-section-outline-meta-row {\n display: grid;\n grid-template-columns: 52px minmax(0, 1fr);\n align-items: start;\n gap: 6px;\n min-width: 0;\n color: var(--df-review-muted);\n font-family: var(--df-review-font-mono);\n font-size: var(--df-review-font-size-2xs);\n line-height: 1.35;\n }\n\n .df-review-section-outline-meta-row b {\n color: var(--df-review-subtle);\n font-weight: var(--df-review-font-weight-emphasis);\n }\n\n .df-review-section-outline-meta-row code {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--df-review-muted);\n font-family: inherit;\n }\n\n .df-review-section-outline-meta-row.is-text code {\n color: var(--df-review-text);\n }\n\n .df-review-section-outline-meta-row.is-media code {\n color: var(--df-review-accent);\n }\n\n .df-review-section-outline-media-link {\n display: block;\n min-width: 0;\n color: var(--df-review-accent);\n text-decoration: none;\n }\n\n .df-review-section-outline-media-link:hover,\n .df-review-section-outline-media-link:focus-visible {\n color: var(--df-review-text);\n outline: 0;\n }\n\n .df-review-section-outline-meta-row.is-class code {\n color: var(--df-review-source-popover-data-subtle);\n }\n\n .df-review-section-outline-meta-row.is-class {\n align-items: center;\n }\n\n .df-review-section-outline-class-tags {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 3px;\n min-width: 0;\n }\n\n .df-review-section-outline-class-tags code {\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n min-height: 20px;\n border: 1px solid var(--df-review-line-soft);\n border-radius: var(--df-review-radius-pill);\n padding: 0 6px;\n background: var(--df-review-control);\n line-height: 1;\n }\n\n .df-review-section-outline-links {\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n gap: 1px;\n }\n\n .df-review-section-outline-divider {\n display: block;\n width: 1px;\n height: 14px;\n margin: 0 2px;\n overflow: hidden;\n background: var(--df-review-line-soft);\n color: var(--df-review-subtle);\n font-size: var(--df-review-font-size-xs);\n line-height: 1;\n text-indent: -999px;\n user-select: none;\n }\n\n .df-review-section-outline-link {\n display: inline-grid;\n place-items: center;\n width: 24px;\n height: 24px;\n border: 1px solid transparent;\n border-radius: var(--df-review-radius-sm);\n padding: 0;\n color: var(--df-review-muted);\n background: transparent;\n cursor: pointer;\n transition: border-color 140ms ease, background 140ms ease,\n color 140ms ease, opacity 140ms ease;\n }\n\n .df-review-section-outline-link.is-dom-select {\n width: 24px;\n min-width: 24px;\n padding: 0;\n }\n\n .df-review-section-outline-link.is-dom-select svg {\n width: 16px;\n height: 16px;\n }\n\n .df-review-section-outline-link: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-section-outline-link 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 .df-review-section-outline-link:disabled {\n color: var(--df-review-subtle);\n cursor: not-allowed;\n opacity: 0.42;\n }\n\n .df-review-section-outline-link:disabled:hover {\n border-color: transparent;\n color: var(--df-review-subtle);\n background: transparent;\n }\n\n .df-review-section-outline-children {\n display: grid;\n margin-left: 16px;\n border-left: 1px solid var(--df-review-line-soft);\n }\n\n .df-review-section-outline-item.is-depth-1\n > .df-review-section-outline-children {\n border-left-color: var(--df-review-accent);\n }\n\n .df-review-section-outline-item.is-depth-2 {\n --df-review-section-outline-name-color: var(--df-review-accent);\n }\n\n .df-review-section-outline-item.is-depth-2\n > .df-review-section-outline-children {\n border-left-color: var(--df-review-area);\n }\n\n .df-review-section-outline-item.is-depth-3 {\n --df-review-section-outline-name-color: var(--df-review-area);\n }\n\n .df-review-section-outline-item.is-depth-3\n > .df-review-section-outline-children {\n border-left-color: var(--df-review-note);\n }\n\n .df-review-section-outline-item.is-depth-4 {\n --df-review-section-outline-name-color: var(--df-review-note);\n }\n\n .df-review-section-outline-item.is-depth-4\n > .df-review-section-outline-children {\n border-left-color: var(--df-review-purple);\n }\n\n .df-review-section-outline-item.is-depth-5 {\n --df-review-section-outline-name-color: var(--df-review-purple);\n }\n\n .df-review-section-outline-empty {\n padding: 14px 12px 16px;\n color: var(--df-review-muted);\n font-size: var(--df-review-font-size-xs);\n font-weight: var(--df-review-font-weight-normal);\n }\n\n`;\n","export const reviewShellRulerStyle = `\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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-emphasis);\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: var(--df-review-font-weight-emphasis);\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 48px;\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) 48px;\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: nowrap;\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\t .df-review-panel-body {\n\t\t min-height: 0;\n\t\t }\n\t }\n\n @media (hover: none) and (pointer: coarse) {\n .df-review-edit-textarea textarea,\n .df-review-preset-select,\n .df-review-prompt-block textarea {\n font-size: var(--df-review-font-size-xl);\n }\n }\n`;\n","import { reviewShellBaseStyle } from './style/base';\nimport { reviewShellSitemapStyle } from './style/sitemap';\nimport { reviewShellModalStyle } from './style/modals';\nimport { reviewShellToolbarStyle } from './style/toolbar';\nimport { reviewShellQaPanelStyle } from './style/qa-panel';\nimport { reviewShellFigmaImagesStyle } from './style/figma-images';\nimport { reviewShellStageStyle } from './style/stage';\nimport { reviewShellSourceInspectorStyle } from './style/source-inspector';\nimport { reviewShellSectionOutlineStyle } from './style/section-outline';\nimport { reviewShellRulerStyle } from './style/ruler';\n\nconst 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 reviewShellBaseStyle,\n reviewShellSitemapStyle,\n reviewShellModalStyle,\n reviewShellToolbarStyle,\n reviewShellQaPanelStyle,\n reviewShellFigmaImagesStyle,\n reviewShellStageStyle,\n reviewShellSourceInspectorStyle,\n reviewShellSectionOutlineStyle,\n reviewShellRulerStyle\n ].join('\\n\\n');\n document.head.append(style);\n }\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n Bot as BotIcon,\n Images as ComponentTreeIcon,\n SquareCheckBig as QaListIcon,\n Settings as SettingsIcon,\n} from 'lucide-react';\nimport { DfLogoIcon } from './df.logo';\nimport type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemStatus,\n ReviewMode,\n ReviewSource,\n} from '../../types';\n\nimport type {\n ReviewShellProps,\n} from '../types';\nimport { resolveReviewSourceOptions } from '../env';\nimport {\n DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n} from '../../figma/image.types';\nimport {\n DEFAULT_INITIAL_REVIEW_PROMPT,\n} from '../constants';\nimport {\n DEFAULT_REVIEW_PATH_PREFIX,\n getInitialItemId,\n getItemFrameTarget,\n getItemTarget,\n getShellUrlForItem,\n getTargetRouteKey,\n normalizeTarget,\n parseReviewAddressInput,\n updateShellUrl,\n} from '../route';\nimport {\n DEFAULT_REVIEW_VIEWPORT_PRESETS,\n findViewportPreset,\n getRestoredSize,\n} from '../viewport';\nimport {\n InitialPromptModal,\n PromptModal,\n ReviewSettingsModal,\n SitemapModal,\n} from '../shell.modals';\nimport { buildReviewItemPrompt } from '../prompt/prompt';\nimport {\n getReviewFigmaImageStore,\n getTargetFigmaFrameConfig,\n type ReviewFigmaFrameConfig,\n} from '../figma';\nimport { FigmaRailIcon } from '../figma/figma-mark-icon';\nimport { FigmaImagesPanel } from '../figma/images.panel';\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 GetSourceCandidatesOptions,\n type SourceOpenOptions,\n} from '../source.open';\nimport {\n getSectionOutline,\n type GetSectionOutlineOptions,\n type SectionOutlineEntry,\n} from '../section.outline';\nimport { SectionOutlinePanel } from './section.outline.panel';\nimport { createSourceShortcutStyle } from './source.shortcut.style';\nimport {\n SourceInspectorOverlay,\n type SourceInspectorCandidate,\n type SourceInspectorRect,\n type SourceInspectorState,\n} from './source.inspector.overlay';\nimport { ReviewTargetFrame } from '../target/frame';\nimport { createReviewTargetFigmaImageOverlays } from '../target/figma.image.overlay';\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 { useReviewFigmaImages } from '../hooks/use.review.figma.images';\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 getInitialReviewSidePanel,\n getStoredReviewSidePanel,\n getStoredSourceTreeFilter,\n getStoredSourceTreeMetaVisibility,\n type StoredReviewSidePanel,\n type StoredSourceTreeMetaVisibility,\n writeStoredReviewSidePanel,\n writeStoredReviewSidePanelVisible,\n writeStoredSourceTreeFilter,\n writeStoredSourceTreeMetaVisibility,\n} from '../settings';\nimport {\n copyCurrentReviewUrl,\n copyReviewPrompt,\n removeReviewItem,\n refreshReviewItems,\n refreshSitemapReviewItems,\n refreshReviewData as refreshReviewDataAction,\n submitReviewItem,\n updateReviewItemAssignee,\n updateReviewItemDetails,\n updateReviewItemStatus,\n} from './shell.actions';\nimport {\n centerFrameScrollOnElement,\n filterSectionOutlineEntries,\n getDefaultCollapsedSectionOutlineIds,\n getReviewModeWriteMode,\n getSectionOutlineEntryCount,\n getSectionOutlineFilterTerms,\n scrollElementInTarget,\n waitForFrame,\n waitForMs,\n} from './shell.helpers';\n\ntype ReviewSidePanel = StoredReviewSidePanel;\ntype SourceTreeMetaVisibilityKey = keyof StoredSourceTreeMetaVisibility;\n\nconst SOURCE_PANEL_MAX_WIDTH = 440;\nconst SOURCE_PANEL_MIN_WIDTH = 240;\nconst SOURCE_PANEL_MAX_HEIGHT = 260;\nconst SOURCE_TREE_PANEL_CLOSE_DELAY_MS = 180;\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 figmaImages,\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 sectionOutlineCountRef = useRef(0);\n const [sourceInspectorState, setSourceInspectorState] =\n useState<SourceInspectorState | null>(null);\n const [sectionOutline, setSectionOutline] = useState<\n SectionOutlineEntry[] | null\n >(null);\n const [targetFrameLoadVersion, setTargetFrameLoadVersion] = useState(0);\n const [sectionOutlineFilter, setSectionOutlineFilter] = useState(() =>\n getStoredSourceTreeFilter()\n );\n const [sectionOutlineMetaVisibility, setSectionOutlineMetaVisibility] =\n useState(() => getStoredSourceTreeMetaVisibility());\n const isSectionOutlineBoxMetaVisible = sectionOutlineMetaVisibility.box;\n const isSectionOutlineFontMetaVisible = sectionOutlineMetaVisibility.font;\n const isSectionOutlineMediaMetaVisible = sectionOutlineMetaVisibility.media;\n const isSectionOutlineClassMetaVisible =\n sectionOutlineMetaVisibility.className;\n const [collapsedSectionOutlineIds, setCollapsedSectionOutlineIds] = useState<\n Set<string>\n >(() => new Set());\n const [isAllQaVisible, setIsAllQaVisible] = useState(false);\n const [isInitialPromptScriptOpen, setIsInitialPromptScriptOpen] =\n useState(false);\n const resolvedReviewSourceOptions = useMemo(\n () => resolveReviewSourceOptions({ sourceInspector, sourceRoot }),\n [sourceInspector, sourceRoot]\n );\n const resolvedSourceInspector = resolvedReviewSourceOptions.sourceInspector;\n const resolvedSourceRoot = resolvedReviewSourceOptions.sourceRoot;\n const sourceOpenOptions = useMemo<SourceOpenOptions>(\n () => ({\n ...resolvedSourceInspector,\n sourceRoot: resolvedSourceRoot,\n }),\n [resolvedSourceInspector, resolvedSourceRoot]\n );\n const sourceCandidateOptions = useMemo<GetSourceCandidatesOptions>(\n () => ({\n ignore: resolvedSourceInspector?.ignore,\n includePlacer: resolvedSourceInspector?.includePlacer,\n }),\n [resolvedSourceInspector]\n );\n const sectionOutlineOptions = useMemo<GetSectionOutlineOptions>(\n () => ({\n includePlacer: resolvedSourceInspector?.includePlacer,\n ignore: resolvedSourceInspector?.ignore,\n maxDepth: resolvedSourceInspector?.maxDepth,\n }),\n [resolvedSourceInspector]\n );\n const isSourceInspectorEnabled = resolvedSourceInspector?.enabled !== false;\n const [sidePanel, setSidePanel] = useState<ReviewSidePanel>(() => {\n const initialSidePanel = getInitialReviewSidePanel();\n if (initialSidePanel) return initialSidePanel;\n if (getInitialItemId()) return 'qa';\n return isSourceInspectorEnabled ? getStoredReviewSidePanel() : 'qa';\n });\n const figmaImageStore = useMemo(\n () => getReviewFigmaImageStore(figmaImages),\n [figmaImages]\n );\n const isFigmaImageManagementEnabled = Boolean(figmaImageStore);\n const figmaImageFormat =\n figmaImages?.imageFormat ?? DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT;\n const isSourceTreeHoverOutlineEnabled =\n resolvedSourceInspector?.hoverOutline !== false;\n const isQaPanelVisible = isListVisible && sidePanel === 'qa';\n const isSourceTreePanelVisible =\n isSourceInspectorEnabled && isListVisible && sidePanel === 'source';\n const isFigmaImagesPanelVisible =\n isFigmaImageManagementEnabled &&\n isListVisible &&\n sidePanel === 'figma-images';\n\n useEffect(() => {\n if (isSourceInspectorEnabled || sidePanel !== 'source') return;\n setSidePanel('qa');\n }, [isSourceInspectorEnabled, sidePanel]);\n\n useEffect(() => {\n if (isFigmaImageManagementEnabled || sidePanel !== 'figma-images') return;\n setSidePanel('qa');\n }, [isFigmaImageManagementEnabled, sidePanel]);\n\n useEffect(() => {\n writeStoredReviewSidePanel(sidePanel);\n }, [sidePanel]);\n\n useEffect(() => {\n writeStoredReviewSidePanelVisible(isListVisible);\n }, [isListVisible]);\n\n const updateSectionOutlineFilter = useCallback((nextFilter: string) => {\n setSectionOutlineFilter(nextFilter);\n writeStoredSourceTreeFilter(nextFilter);\n }, []);\n\n const updateSectionOutlineMetaVisibility = useCallback(\n (key: SourceTreeMetaVisibilityKey) => {\n setSectionOutlineMetaVisibility((current) => {\n const next = { ...current, [key]: !current[key] };\n writeStoredSourceTreeMetaVisibility(next);\n return next;\n });\n },\n []\n );\n\n const sectionOutlineFilterTerms = useMemo(\n () => getSectionOutlineFilterTerms(sectionOutlineFilter),\n [sectionOutlineFilter]\n );\n const filteredSectionOutline = useMemo(\n () =>\n sectionOutline\n ? filterSectionOutlineEntries(sectionOutline, sectionOutlineFilterTerms)\n : [],\n [sectionOutline, sectionOutlineFilterTerms]\n );\n const sectionOutlineTotalCount = useMemo(\n () => getSectionOutlineEntryCount(sectionOutline ?? []),\n [sectionOutline]\n );\n const filteredSectionOutlineCount = useMemo(\n () => getSectionOutlineEntryCount(filteredSectionOutline),\n [filteredSectionOutline]\n );\n const isSectionOutlineFiltering = sectionOutlineFilterTerms.length > 0;\n\n useEffect(() => {\n sectionOutlineCountRef.current = sectionOutlineTotalCount;\n }, [sectionOutlineTotalCount]);\n const {\n activeItems,\n activeRemainingItemCount,\n allQaCount,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIdList,\n hiddenOverlayItemIds,\n items,\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 itemRefreshIdRef = useRef(0);\n const [isItemsLoading, setIsItemsLoading] = useState(false);\n const [mutatingItemIds, setMutatingItemIds] = useState<Set<string>>(\n () => new Set()\n );\n const {\n addImage: addFigmaImage,\n deleteImage: deleteFigmaImage,\n error: figmaImageError,\n imageOverlayStates: figmaImageOverlayStates,\n images: figmaImageList,\n isAnyImageOverlayVisible: isAnyFigmaImageOverlayVisible,\n isLoading: isFigmaImageLoading,\n isMutating: isFigmaImageMutating,\n refreshImages: refreshFigmaImages,\n reorderImages: reorderFigmaImages,\n selectedImageId: selectedFigmaImageId,\n setImageOverlayOffsetY: setFigmaImageOverlayOffsetY,\n setImageOverlayOpacity: setFigmaImageOverlayOpacity,\n setSelectedImageId: setSelectedFigmaImageId,\n target: figmaImageTarget,\n toggleAllImageOverlayVisible: toggleAllFigmaImageOverlayVisible,\n toggleImageOverlayLocked: toggleFigmaImageOverlayLocked,\n toggleImageOverlayMode: toggleFigmaImageOverlayMode,\n toggleImageOverlayVisible: toggleFigmaImageOverlayVisible,\n updateImage: updateFigmaImage,\n } = useReviewFigmaImages({\n imageFormat: figmaImageFormat,\n pageUrl: target,\n projectId,\n store: figmaImageStore,\n viewport: size,\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 isFigmaOverlayAvailable =\n !isFigmaImageManagementEnabled &&\n isViewportFigmaOverlayAvailable &&\n Boolean(targetFigmaConfig);\n const [editingItem, setEditingItem] = useState<ReviewItem | null>(null);\n const initialPromptText = initialPrompt.trim();\n const refreshItems = useCallback(\n async () => {\n const requestId = ++itemRefreshIdRef.current;\n setIsItemsLoading(true);\n\n try {\n return await refreshReviewItems({\n activeRoute,\n adapter,\n isRemoteSource,\n pageId: activeAdapterEntry.pageId,\n projectId,\n onItemsChange: setItems,\n });\n } finally {\n if (itemRefreshIdRef.current === requestId) {\n setIsItemsLoading(false);\n }\n }\n },\n [\n activeAdapterEntry.pageId,\n activeRoute,\n adapter,\n isRemoteSource,\n projectId,\n setItems,\n ]\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 defaultReviewUserId: activeAdapterEntry.defaultUserId,\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 fields: activeAdapterEntry.fields,\n assigneeTitle: activeAdapterEntry.assigneeTitle,\n assigneeOptions: activeAdapterEntry.assigneeOptions,\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 useEffect(() => {\n const itemId = pendingInitialItemIdRef.current;\n if (!itemId) return;\n\n const item = items.find(\n (candidate) =>\n candidate.id === itemId || candidate.externalIssueId === itemId\n );\n if (!item) return;\n\n restoreReviewItem(item);\n }, [items, pendingInitialItemIdRef, restoreReviewItem]);\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 normalizedRoute = getTargetRouteKey(\n normalizedTarget,\n reviewPathPrefix\n );\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 const isCurrentTarget =\n targetRef.current === normalizedTarget &&\n source === nextSource &&\n sizeRef.current.width === nextSize.width &&\n sizeRef.current.height === nextSize.height;\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(normalizedRoute);\n setDraftTarget(normalizedTarget);\n setSize(nextSize);\n setTarget(normalizedTarget);\n updateShellUrl(normalizedTarget, nextSize, nextSource);\n if (isCurrentTarget) reloadTargetFrame();\n };\n\n const selectPage = (href: string) => {\n const normalizedTarget = normalizeTarget(href, reviewPathPrefix);\n const normalizedRoute = getTargetRouteKey(\n normalizedTarget,\n reviewPathPrefix\n );\n clearSelectedItem();\n setIsAllQaVisible(false);\n targetRef.current = normalizedTarget;\n setActiveRoute(normalizedRoute);\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 (writeMode && mode !== nextMode) {\n setSidePanel('qa');\n setIsListVisible(true);\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 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 useEffect(() => {\n clearSourceInspector();\n setCollapsedSectionOutlineIds(new Set());\n setSectionOutline(null);\n }, [clearSourceInspector, targetSrc]);\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, sourceCandidateOptions).map(\n (candidate) => ({\n ...candidate,\n openUrl: getSourceOpenUrl(candidate.source, {\n ...sourceOpenOptions,\n omitPosition: !candidate.usesPosition,\n }),\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 sourceCandidateOptions,\n sourceOpenOptions,\n ]\n );\n\n const showSourceOutlineForTarget = useCallback(\n (target: EventTarget | null) => {\n const firstCandidate = getSourceCandidates(\n target,\n sourceCandidateOptions\n )[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, sourceCandidateOptions]\n );\n\n const showSourceOutlineForElement = useCallback(\n (element: Element) => {\n if (!isSourceTreeHoverOutlineEnabled) return;\n\n const rect = getSourceInspectorRect(element);\n\n if (!rect) {\n setSourceInspectorState((current) =>\n current?.isPinned ? current : null\n );\n return;\n }\n\n setSourceInspectorState((current) =>\n current?.isPinned\n ? current\n : {\n candidates: [],\n isPinned: false,\n panelLeft: 0,\n panelMaxWidth: SOURCE_PANEL_MAX_WIDTH,\n panelRight: null,\n panelTop: 0,\n rect,\n }\n );\n },\n [getSourceInspectorRect, isSourceTreeHoverOutlineEnabled]\n );\n\n const clearSourceOutlineHover = useCallback(() => {\n setSourceInspectorState((current) => (current?.isPinned ? current : null));\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 getCurrentSectionOutline = useCallback(\n (): SectionOutlineEntry[] | null => {\n let frameDocument: Document | null = null;\n try {\n frameDocument = iframeRef.current?.contentDocument ?? null;\n } catch {\n frameDocument = null;\n }\n if (!frameDocument || frameDocument.readyState !== 'complete') {\n return null;\n }\n return getSectionOutline(frameDocument, sectionOutlineOptions);\n },\n [iframeRef, sectionOutlineOptions]\n );\n\n const setSectionOutlineWithDefaultCollapse = useCallback(\n (nextSectionOutline: SectionOutlineEntry[]) => {\n setSectionOutline(nextSectionOutline);\n sectionOutlineCountRef.current =\n getSectionOutlineEntryCount(nextSectionOutline);\n setCollapsedSectionOutlineIds(\n getDefaultCollapsedSectionOutlineIds(nextSectionOutline)\n );\n },\n []\n );\n\n const refreshCurrentSectionOutline = useCallback(\n (resetCollapse = false) => {\n const nextSectionOutline = getCurrentSectionOutline();\n if (!nextSectionOutline) return false;\n\n setSectionOutline(nextSectionOutline);\n const nextCount = getSectionOutlineEntryCount(nextSectionOutline);\n const shouldResetCollapse = resetCollapse ||\n sectionOutlineCountRef.current === 0;\n sectionOutlineCountRef.current = nextCount;\n\n if (shouldResetCollapse) {\n setCollapsedSectionOutlineIds(\n getDefaultCollapsedSectionOutlineIds(nextSectionOutline)\n );\n }\n\n return true;\n },\n [getCurrentSectionOutline]\n );\n\n useEffect(() => {\n if (sidePanel !== 'source' || !isListVisible) return undefined;\n\n const refreshSectionOutline = () => {\n refreshCurrentSectionOutline(true);\n };\n\n const animationFrame = window.requestAnimationFrame(refreshSectionOutline);\n const firstTimeout = window.setTimeout(refreshSectionOutline, 120);\n const secondTimeout = window.setTimeout(refreshSectionOutline, 500);\n const thirdTimeout = window.setTimeout(refreshSectionOutline, 1200);\n\n return () => {\n window.cancelAnimationFrame(animationFrame);\n window.clearTimeout(firstTimeout);\n window.clearTimeout(secondTimeout);\n window.clearTimeout(thirdTimeout);\n };\n }, [\n isListVisible,\n refreshCurrentSectionOutline,\n sidePanel,\n targetFrameLoadVersion,\n targetSrc,\n ]);\n\n useEffect(() => {\n if (sidePanel !== 'source' || !isListVisible) return undefined;\n\n const frameDocument = iframeRef.current?.contentDocument;\n const body = frameDocument?.body;\n if (!body) return undefined;\n\n let refreshTimeout: number | null = null;\n const scheduleRefresh = () => {\n if (refreshTimeout) window.clearTimeout(refreshTimeout);\n refreshTimeout = window.setTimeout(() => {\n refreshTimeout = null;\n refreshCurrentSectionOutline(false);\n }, 80);\n };\n\n const observer = new MutationObserver(scheduleRefresh);\n observer.observe(body, { childList: true, subtree: true });\n scheduleRefresh();\n\n return () => {\n if (refreshTimeout) window.clearTimeout(refreshTimeout);\n observer.disconnect();\n };\n }, [\n iframeRef,\n isListVisible,\n refreshCurrentSectionOutline,\n sidePanel,\n targetFrameLoadVersion,\n targetSrc,\n ]);\n\n const toggleQaPanel = useCallback(() => {\n setSidePanel('qa');\n setIsListVisible((current) => (sidePanel === 'qa' ? !current : true));\n }, [setIsListVisible, sidePanel]);\n\n const toggleSourceTreePanel = useCallback(() => {\n if (!isSourceInspectorEnabled) return;\n\n if (sidePanel === 'source' && isListVisible) {\n setIsListVisible(false);\n return;\n }\n\n setSidePanel('source');\n refreshCurrentSectionOutline(true);\n setIsListVisible(true);\n }, [\n isListVisible,\n isSourceInspectorEnabled,\n refreshCurrentSectionOutline,\n setIsListVisible,\n sidePanel,\n ]);\n\n const toggleFigmaImagesPanel = useCallback(() => {\n if (!isFigmaImageManagementEnabled) return;\n\n if (sidePanel === 'figma-images' && isListVisible) {\n setIsListVisible(false);\n return;\n }\n\n setSidePanel('figma-images');\n setIsListVisible(true);\n }, [\n isFigmaImageManagementEnabled,\n isListVisible,\n setIsListVisible,\n sidePanel,\n ]);\n\n const toggleSectionOutlineEntry = useCallback((entryId: string) => {\n setCollapsedSectionOutlineIds((current) => {\n const next = new Set(current);\n if (next.has(entryId)) {\n next.delete(entryId);\n } else {\n next.add(entryId);\n }\n return next;\n });\n }, []);\n\n const scrollToSection = useCallback((entry: SectionOutlineEntry) => {\n scrollElementInTarget(entry.element, 'start');\n centerFrameScrollOnElement(\n frameScrollRef.current,\n iframeRef.current,\n entry.element\n );\n }, [frameScrollRef, iframeRef]);\n\n const openSectionSource = useCallback(\n (entry: SectionOutlineEntry) => {\n const didOpen = openSourceInEditor(entry.source, {\n ...sourceOpenOptions,\n omitPosition: true,\n });\n showToast(didOpen ? 'Source opened' : 'Source root required');\n },\n [showToast, sourceOpenOptions]\n );\n\n const openSectionData = useCallback(\n (entry: SectionOutlineEntry) => {\n const didOpen = openSourceInEditor(entry.data, sourceOpenOptions);\n showToast(didOpen ? 'Data opened' : 'Data hint not found');\n },\n [showToast, sourceOpenOptions]\n );\n\n const startSectionDomReview = useCallback(\n (entry: SectionOutlineEntry) => {\n if (!canWriteDom) {\n showToast('DOM QA unavailable');\n return;\n }\n\n const rect = entry.element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n showToast('Component has no visible area here');\n return;\n }\n\n clearSourceInspector();\n setSidePanel('qa');\n setIsListVisible(true);\n\n let targetWindow: Window | null = null;\n try {\n targetWindow =\n entry.element.ownerDocument.defaultView ??\n iframeRef.current?.contentWindow ??\n null;\n } catch {\n targetWindow = null;\n }\n\n void waitForMs(SOURCE_TREE_PANEL_CLOSE_DELAY_MS)\n .then(async () => {\n initReviewKit();\n await waitForFrame(targetWindow);\n const controller = controllerRef.current;\n if (!controller) {\n showToast('DOM QA unavailable');\n return;\n }\n\n scrollElementInTarget(entry.element, 'center');\n await waitForFrame(targetWindow);\n centerFrameScrollOnElement(\n frameScrollRef.current,\n iframeRef.current,\n entry.element\n );\n await waitForFrame(targetWindow);\n await controller.startElementReview(entry.element);\n await waitForFrame(targetWindow);\n setMode(controller.getMode());\n })\n .catch(() => {\n setMode(controllerRef.current?.getMode() ?? 'idle');\n });\n },\n [\n canWriteDom,\n clearSourceInspector,\n controllerRef,\n frameScrollRef,\n iframeRef,\n initReviewKit,\n setIsListVisible,\n setMode,\n showToast,\n ]\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 = createSourceShortcutStyle(\n optionAttribute,\n fontOverlayAttribute,\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 // 팝업이 고정된 동안에는 마우스 이동으로 target 을 다시 추적하지 않는다.\n // (닫기/다른 곳 클릭 전까지 고정 유지)\n if (isSourcePanelPinned) return;\n\n lastSourceTarget = event.target;\n const candidates = getSourceCandidates(event.target, sourceCandidateOptions);\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 // 팝업 고정 중에는 Option 키(반복 입력 포함)로 다시 추적하지 않는다.\n if (isSourcePanelPinned) 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 sourceCandidateOptions,\n showSourceOutlineForTarget,\n showSourceInspectorForTarget,\n ]);\n\n useEffect(() => {\n return cleanupSourceOpenShortcut;\n }, [cleanupSourceOpenShortcut]);\n\n const loadTargetFrame = useCallback(() => {\n setTargetFrameLoadVersion((currentVersion) => currentVersion + 1);\n initReviewKit();\n refreshTargetFigmaConfig();\n setTargetFigmaOverlayLocked(\n iframeRef.current?.contentDocument,\n mode === 'element'\n );\n bindSourceOpenShortcut();\n if (sidePanel === 'source' && isListVisible) {\n refreshCurrentSectionOutline(true);\n }\n }, [\n bindSourceOpenShortcut,\n iframeRef,\n initReviewKit,\n isListVisible,\n mode,\n refreshTargetFigmaConfig,\n refreshCurrentSectionOutline,\n sidePanel,\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 withItemMutation = async <T,>(\n itemId: string,\n action: () => Promise<T>\n ) => {\n setMutatingItemIds((currentIds) => {\n const nextIds = new Set(currentIds);\n nextIds.add(itemId);\n return nextIds;\n });\n\n try {\n return await action();\n } finally {\n setMutatingItemIds((currentIds) => {\n const nextIds = new Set(currentIds);\n nextIds.delete(itemId);\n return nextIds;\n });\n }\n };\n const showItemMutationError = (error: unknown, fallback: string) => {\n showToast(\n error instanceof Error && error.message ? error.message : fallback\n );\n };\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 = async (\n item: ReviewItem,\n nextStatus: ReviewItemStatus\n ) => {\n try {\n await withItemMutation(item.id, () =>\n updateReviewItemStatus({\n activeAdapterEntry,\n item,\n nextStatus,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n })\n );\n } catch (error) {\n showItemMutationError(error, 'QA status update failed');\n }\n };\n\n const changeItemAssignee = async (\n item: ReviewItem,\n assigneeId: string | null\n ) => {\n try {\n await withItemMutation(item.id, () =>\n updateReviewItemAssignee({\n activeAdapterEntry,\n item,\n assigneeId,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n })\n );\n } catch (error) {\n showItemMutationError(error, 'QA assignee update failed');\n }\n };\n\n const saveItemDetails = async (\n item: ReviewItem,\n patch: Pick<ReviewItem, 'comment'> & Partial<Pick<ReviewItem, 'title'>>\n ) => {\n try {\n await withItemMutation(item.id, () =>\n updateReviewItemDetails({\n activeAdapterEntry,\n fields: activeAdapterEntry.fields,\n item,\n ...patch,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n })\n );\n setEditingItem(null);\n } catch (error) {\n showItemMutationError(error, 'QA update failed');\n throw error;\n }\n };\n\n const submitItem = async (numberedItem: NumberedReviewItem) => {\n try {\n await withItemMutation(numberedItem.item.id, () =>\n submitReviewItem({\n localAdapterEntry,\n numberedItem,\n remoteAdapterEntry,\n selectedItemIdRef,\n onClearSelectedItem: clearSelectedItem,\n onRefreshReviewData: refreshReviewData,\n onToast: showToast,\n })\n );\n } catch (error) {\n showItemMutationError(error, 'QA submit failed');\n }\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 copyItemLabel = (numberedItem: NumberedReviewItem) =>\n copyPrompt(\n numberedItem.displayLabel,\n `label:${numberedItem.item.id}`,\n 'QA number copied'\n );\n\n const copyItemLink = (numberedItem: NumberedReviewItem) => {\n const { item } = numberedItem;\n return copyPrompt(\n getShellUrlForItem(\n getItemFrameTarget(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 copyRemoteIssuePath = (item: ReviewItem) => {\n const path = getUrlPathWithoutOrigin(item.externalIssueUrl);\n if (!path) {\n showToast('QA link not found');\n return Promise.resolve();\n }\n\n return copyPrompt(path, `remote-link:${item.id}`, 'QA path copied');\n };\n\n const removeItem = async (item: ReviewItem) => {\n try {\n await withItemMutation(item.id, () =>\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 } catch (error) {\n showItemMutationError(error, 'QA delete failed');\n }\n };\n\n const figmaImageOverlays = createReviewTargetFigmaImageOverlays({\n imageOverlayStates: figmaImageOverlayStates,\n images: figmaImageList,\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 figmaOverlayUnavailableMessage={\n isFigmaImageManagementEnabled\n ? 'No Figma images on this viewport.'\n : undefined\n }\n isFigmaOverlayActive={\n isFigmaImageManagementEnabled\n ? isAnyFigmaImageOverlayVisible\n : targetOverlayState.figma\n }\n isFigmaOverlayAvailable={\n isFigmaImageManagementEnabled\n ? figmaImageList.length > 0\n : isFigmaOverlayAvailable\n }\n onDraftTargetChange={setDraftTarget}\n onApplyTarget={applyTarget}\n onOpenSitemap={() => setIsSitemapOpen(true)}\n onCopyCurrentUrl={() => void copyCurrentUrl()}\n onSizeChange={setSize}\n onToggleFigmaOverlay={\n isFigmaImageManagementEnabled\n ? toggleAllFigmaImageOverlayVisible\n : () => toggleTargetOverlay('figma')\n }\n onToggleRuler={toggleRuler}\n onToggleTargetOverlay={toggleTargetOverlay}\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 && <PromptModal onClose={closePromptModal} />}\n\n {isInitialPromptScriptOpen && (\n <InitialPromptModal\n initialPromptText={initialPromptText}\n copiedPromptKey={copiedPromptKey}\n onClose={() => setIsInitialPromptScriptOpen(false)}\n onCopyPrompt={(text, key) => void copyPrompt(text, key)}\n />\n )}\n\n {editingItem && (\n <QaItemEditModal\n fields={activeAdapterEntry.fields}\n item={editingItem}\n onClose={() => setEditingItem(null)}\n onSave={saveItemDetails}\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={isQaPanelVisible ? 'Hide QA list' : 'Show QA list'}\n aria-pressed={isQaPanelVisible}\n className={`df-review-side-toggle${\n isQaPanelVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={toggleQaPanel}\n title=\"QA\"\n >\n <span aria-hidden=\"true\">\n <QaListIcon />\n </span>\n </button>\n {isSourceInspectorEnabled && (\n <button\n aria-controls=\"df-review-section-outline\"\n aria-label={\n isSourceTreePanelVisible\n ? 'Hide source tree'\n : 'Show source tree'\n }\n aria-pressed={isSourceTreePanelVisible}\n className={`df-review-side-toggle${\n isSourceTreePanelVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={toggleSourceTreePanel}\n title=\"Source Tree\"\n >\n <span aria-hidden=\"true\">\n <ComponentTreeIcon />\n </span>\n </button>\n )}\n {isFigmaImageManagementEnabled && (\n <button\n aria-label={\n isFigmaImagesPanelVisible\n ? 'Hide Figma images'\n : 'Show Figma images'\n }\n aria-pressed={isFigmaImagesPanelVisible}\n className={`df-review-side-toggle${\n isFigmaImagesPanelVisible ? ' is-active' : ''\n }`}\n type=\"button\"\n onClick={toggleFigmaImagesPanel}\n title=\"Figma Images\"\n >\n <span aria-hidden=\"true\">\n <FigmaRailIcon />\n </span>\n </button>\n )}\n <div className=\"df-review-side-actions\">\n <button\n aria-label=\"Open initial prompt\"\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={() => setIsInitialPromptScriptOpen(true)}\n title=\"Initial prompt\"\n >\n <span aria-hidden=\"true\">\n <BotIcon />\n </span>\n </button>\n <button\n aria-label=\"Open settings\"\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={openFigmaSettings}\n title=\"Settings\"\n >\n <span aria-hidden=\"true\">\n <SettingsIcon />\n </span>\n </button>\n {currentPagePresenceUsers.length > 0 && (\n <PresenceOverlay\n presenceSessionId={presenceSessionId}\n users={currentPagePresenceUsers}\n />\n )}\n <span className=\"df-review-side-divider\" aria-hidden=\"true\" />\n <button\n aria-label=\"Open about\"\n className=\"df-review-side-toggle\"\n type=\"button\"\n onClick={() => {\n setIsInitialPromptOpen(true);\n }}\n title=\"About\"\n >\n <span aria-hidden=\"true\">\n <DfLogoIcon />\n </span>\n </button>\n </div>\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={isQaPanelVisible}\n isAllQaVisible={isAllQaVisible}\n isLoading={isItemsLoading}\n isRemoteSource={isRemoteSource}\n mutatingItemIds={mutatingItemIds}\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 fields={activeAdapterEntry.fields}\n assigneeTitle={activeAdapterEntry.assigneeTitle}\n onChangeItemStatus={changeItemStatus}\n onClearSelectedItem={clearSelectedReviewItem}\n onChangeItemAssignee={changeItemAssignee}\n onChangeReviewSource={changeReviewSource}\n onCopyItemLabel={(numberedItem) => void copyItemLabel(numberedItem)}\n onCopyItemLink={(numberedItem) => void copyItemLink(numberedItem)}\n onCopyItemPrompt={(numberedItem) => void copyItemPrompt(numberedItem)}\n onCopyRemoteIssuePath={copyRemoteIssuePath}\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 {isFigmaImageManagementEnabled && (\n <FigmaImagesPanel\n error={figmaImageError}\n imageOverlayStates={figmaImageOverlayStates}\n images={figmaImageList}\n isListVisible={isFigmaImagesPanelVisible}\n isLoading={isFigmaImageLoading}\n isMutating={isFigmaImageMutating}\n selectedImageId={selectedFigmaImageId}\n onAddImage={addFigmaImage}\n onDeleteImage={deleteFigmaImage}\n onRefreshImages={refreshFigmaImages}\n onReorderImages={reorderFigmaImages}\n onSelectImage={setSelectedFigmaImageId}\n onSetImageOverlayOffsetY={setFigmaImageOverlayOffsetY}\n onSetImageOverlayOpacity={setFigmaImageOverlayOpacity}\n onToggleImageOverlayLocked={toggleFigmaImageOverlayLocked}\n onToggleImageOverlayMode={toggleFigmaImageOverlayMode}\n onToggleImageOverlayVisible={toggleFigmaImageOverlayVisible}\n onUpdateImage={updateFigmaImage}\n />\n )}\n\n {isSourceInspectorEnabled && (\n <SectionOutlinePanel\n isPanelVisible={isSourceTreePanelVisible}\n isFiltering={isSectionOutlineFiltering}\n filteredCount={filteredSectionOutlineCount}\n totalCount={sectionOutlineTotalCount}\n rootCount={sectionOutline?.length ?? 0}\n filter={sectionOutlineFilter}\n entries={filteredSectionOutline}\n collapsedIds={collapsedSectionOutlineIds}\n canWriteDom={canWriteDom}\n isBoxMetaVisible={isSectionOutlineBoxMetaVisible}\n isFontMetaVisible={isSectionOutlineFontMetaVisible}\n isMediaMetaVisible={isSectionOutlineMediaMetaVisible}\n isClassMetaVisible={isSectionOutlineClassMetaVisible}\n onToggleMeta={updateSectionOutlineMetaVisibility}\n onFilterChange={updateSectionOutlineFilter}\n onToggleEntry={toggleSectionOutlineEntry}\n onScrollToSection={scrollToSection}\n onOpenData={openSectionData}\n onOpenSource={openSectionSource}\n onStartDomReview={startSectionDomReview}\n onHoverElement={showSourceOutlineForElement}\n onClearHover={clearSourceOutlineHover}\n />\n )}\n\n <ReviewTargetFrame\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n figmaImageOverlays={figmaImageOverlays}\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 onSetFigmaImageOverlayOffsetY={setFigmaImageOverlayOffsetY}\n onSetReviewMode={setReviewMode}\n />\n\n <SourceInspectorOverlay\n state={sourceInspectorState}\n interactionRef={sourceInspectorInteractionRef}\n onClear={clearSourceInspector}\n onOpenCandidate={openSourceCandidate}\n />\n </div>\n );\n};\n\nfunction getUrlPathWithoutOrigin(value: string | undefined) {\n const trimmed = value?.trim();\n if (!trimmed) return null;\n\n try {\n const url = new URL(trimmed, window.location.origin);\n return `${url.pathname}${url.search}${url.hash}`;\n } catch {\n return trimmed;\n }\n}\n","/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n","/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n","import { CamelToPascal } from '../utility-types';\nimport { toCamelCase } from './toCamelCase';\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n\n return false;\n};\n","'use client';\n\nimport { createContext, createElement, type ReactNode, useContext, useMemo } from 'react';\nimport { LucideProps } from './types';\n\ntype LucideConfig = {\n size: number;\n color: string;\n strokeWidth: number;\n absoluteStrokeWidth: boolean;\n className: string;\n};\n\nconst LucideContext = createContext<LucideProps>({});\n\ntype LucideProviderProps = {\n children: ReactNode;\n} & Partial<LucideConfig>;\n\nexport function LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n}: LucideProviderProps) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className,\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className],\n );\n\n return createElement(LucideContext.Provider, { value }, children);\n}\n\nexport const useLucideContext = () => useContext(LucideContext);\n","'use client';\n\nimport { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\nimport { useLucideContext } from './context';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n { color, size, strokeWidth, absoluteStrokeWidth, className = '', children, iconNode, ...rest },\n ref,\n ) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = 'currentColor',\n className: contextClass = '',\n } = useLucideContext() ?? {};\n\n const calculatedStrokeWidth =\n absoluteStrokeWidth ?? contextAbsoluteStrokeWidth\n ? (Number(strokeWidth ?? contextStrokeWidth) * 24) / Number(size ?? contextSize)\n : strokeWidth ?? contextStrokeWidth;\n\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses('lucide', contextClass, className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 8V4H8', key: 'hb8ula' }],\n ['rect', { width: '16', height: '12', x: '4', y: '8', rx: '2', key: 'enze0r' }],\n ['path', { d: 'M2 14h2', key: 'vft8re' }],\n ['path', { d: 'M20 14h2', key: '4cs60a' }],\n ['path', { d: 'M15 13v2', key: '1xurst' }],\n ['path', { d: 'M9 13v2', key: 'rq6x2g' }],\n];\n\n/**\n * @component @name Bot\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgOFY0SDgiIC8+CiAgPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjEyIiB4PSI0IiB5PSI4IiByeD0iMiIgLz4KICA8cGF0aCBkPSJNMiAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0xNSAxM3YyIiAvPgogIDxwYXRoIGQ9Ik05IDEzdjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/bot\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Bot = createLucideIcon('bot', __iconNode);\n\nexport default Bot;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }]];\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\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 ChevronDown = createLucideIcon('chevron-down', __iconNode);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }]];\n\n/**\n * @component @name ChevronRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\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 ChevronRight = createLucideIcon('chevron-right', __iconNode);\n\nexport default ChevronRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3', key: '1u773s' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n];\n\n/**\n * @component @name CircleQuestionMark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMiIC8+CiAgPHBhdGggZD0iTTEyIDE3aC4wMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/circle-question-mark\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleQuestionMark = createLucideIcon('circle-question-mark', __iconNode);\n\nexport default CircleQuestionMark;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm18 16 4-4-4-4', key: '1inbqp' }],\n ['path', { d: 'm6 8-4 4 4 4', key: '15zrgr' }],\n ['path', { d: 'm14.5 4-5 16', key: 'e7oirm' }],\n];\n\n/**\n * @component @name CodeXml\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTggMTYgNC00LTQtNCIgLz4KICA8cGF0aCBkPSJtNiA4LTQgNCA0IDQiIC8+CiAgPHBhdGggZD0ibTE0LjUgNC01IDE2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/code-xml\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 CodeXml = createLucideIcon('code-xml', __iconNode);\n\nexport default CodeXml;\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: 'M12 18a6 6 0 0 0 0-12v12z', key: 'j4l70d' }],\n];\n\n/**\n * @component @name Contrast\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNMTIgMThhNiA2IDAgMCAwIDAtMTJ2MTJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/contrast\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 Contrast = createLucideIcon('contrast', __iconNode);\n\nexport default Contrast;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n];\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHg9IjgiIHk9IjgiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('copy', __iconNode);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['ellipse', { cx: '12', cy: '5', rx: '9', ry: '3', key: 'msslwz' }],\n ['path', { d: 'M3 5V19A9 3 0 0 0 21 19V5', key: '1wlel7' }],\n ['path', { d: 'M3 12A9 3 0 0 0 21 12', key: 'mv7ke4' }],\n];\n\n/**\n * @component @name Database\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8ZWxsaXBzZSBjeD0iMTIiIGN5PSI1IiByeD0iOSIgcnk9IjMiIC8+CiAgPHBhdGggZD0iTTMgNVYxOUE5IDMgMCAwIDAgMjEgMTlWNSIgLz4KICA8cGF0aCBkPSJNMyAxMkE5IDMgMCAwIDAgMjEgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/database\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 Database = createLucideIcon('database', __iconNode);\n\nexport default Database;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'M10 14 21 3', key: 'gplh6r' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6', key: 'a6xqqp' }],\n];\n\n/**\n * @component @name ExternalLink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0iTTEwIDE0IDIxIDMiIC8+CiAgPHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ExternalLink = createLucideIcon('external-link', __iconNode);\n\nexport default ExternalLink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49',\n key: 'ct8e1f',\n },\n ],\n ['path', { d: 'M14.084 14.158a3 3 0 0 1-4.242-4.242', key: '151rxh' }],\n [\n 'path',\n {\n d: 'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143',\n key: '13bj9a',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNzMzIDUuMDc2YTEwLjc0NCAxMC43NDQgMCAwIDEgMTEuMjA1IDYuNTc1IDEgMSAwIDAgMSAwIC42OTYgMTAuNzQ3IDEwLjc0NyAwIDAgMS0xLjQ0NCAyLjQ5IiAvPgogIDxwYXRoIGQ9Ik0xNC4wODQgMTQuMTU4YTMgMyAwIDAgMS00LjI0Mi00LjI0MiIgLz4KICA8cGF0aCBkPSJNMTcuNDc5IDE3LjQ5OWExMC43NSAxMC43NSAwIDAgMS0xNS40MTctNS4xNTEgMSAxIDAgMCAxIDAtLjY5NiAxMC43NSAxMC43NSAwIDAgMSA0LjQ0Ni01LjE0MyIgLz4KICA8cGF0aCBkPSJtMiAyIDIwIDIwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst EyeOff = createLucideIcon('eye-off', __iconNode);\n\nexport default EyeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n key: '1nclc0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi4wNjIgMTIuMzQ4YTEgMSAwIDAgMSAwLS42OTYgMTAuNzUgMTAuNzUgMCAwIDEgMTkuODc2IDAgMSAxIDAgMCAxIDAgLjY5NiAxMC43NSAxMC43NSAwIDAgMS0xOS44NzYgMCIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Eye = createLucideIcon('eye', __iconNode);\n\nexport default Eye;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm22 11-1.296-1.296a2.4 2.4 0 0 0-3.408 0L11 16', key: '9kzy35' }],\n ['path', { d: 'M4 8a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2', key: '1t0f0t' }],\n ['circle', { cx: '13', cy: '7', r: '1', fill: 'currentColor', key: '1obus6' }],\n ['rect', { x: '8', y: '2', width: '14', height: '14', rx: '2', key: '1gvhby' }],\n];\n\n/**\n * @component @name Images\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjIgMTEtMS4yOTYtMS4yOTZhMi40IDIuNCAwIDAgMC0zLjQwOCAwTDExIDE2IiAvPgogIDxwYXRoIGQ9Ik00IDhhMiAyIDAgMCAwLTIgMnYxMGEyIDIgMCAwIDAgMiAyaDEwYTIgMiAwIDAgMCAyLTIiIC8+CiAgPGNpcmNsZSBjeD0iMTMiIGN5PSI3IiByPSIxIiBmaWxsPSJjdXJyZW50Q29sb3IiIC8+CiAgPHJlY3QgeD0iOCIgeT0iMiIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiByeD0iMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/images\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 Images = createLucideIcon('images', __iconNode);\n\nexport default Images;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '7', height: '7', x: '3', y: '3', rx: '1', key: '1g98yp' }],\n ['rect', { width: '7', height: '7', x: '14', y: '3', rx: '1', key: '6d4xhi' }],\n ['rect', { width: '7', height: '7', x: '14', y: '14', rx: '1', key: 'nxv5o0' }],\n ['rect', { width: '7', height: '7', x: '3', y: '14', rx: '1', key: '1bb6yr' }],\n];\n\n/**\n * @component @name LayoutGrid\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIzIiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIxNCIgeT0iMyIgcng9IjEiIC8+CiAgPHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iNyIgeD0iMTQiIHk9IjE0IiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI3IiB4PSIzIiB5PSIxNCIgcng9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/layout-grid\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LayoutGrid = createLucideIcon('layout-grid', __iconNode);\n\nexport default LayoutGrid;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M9 17H7A5 5 0 0 1 7 7h2', key: '8i5ue5' }],\n ['path', { d: 'M15 7h2a5 5 0 1 1 0 10h-2', key: '1b9ql8' }],\n ['line', { x1: '8', x2: '16', y1: '12', y2: '12', key: '1jonct' }],\n];\n\n/**\n * @component @name Link2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOSAxN0g3QTUgNSAwIDAgMSA3IDdoMiIgLz4KICA8cGF0aCBkPSJNMTUgN2gyYTUgNSAwIDEgMSAwIDEwaC0yIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIxMiIgeTI9IjEyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/link-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Link2 = createLucideIcon('link-2', __iconNode);\n\nexport default Link2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M2 5h20', key: '1fs1ex' }],\n ['path', { d: 'M6 12h12', key: '8npq4p' }],\n ['path', { d: 'M9 19h6', key: '456am0' }],\n];\n\n/**\n * @component @name ListFilter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMiA1aDIwIiAvPgogIDxwYXRoIGQ9Ik02IDEyaDEyIiAvPgogIDxwYXRoIGQ9Ik05IDE5aDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/list-filter\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ListFilter = createLucideIcon('list-filter', __iconNode);\n\nexport default ListFilter;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '11', x: '3', y: '11', rx: '2', ry: '2', key: '1w4ew1' }],\n ['path', { d: 'M7 11V7a5 5 0 0 1 9.9-1', key: '1mm8w8' }],\n];\n\n/**\n * @component @name LockOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTEiIHg9IjMiIHk9IjExIiByeD0iMiIgcnk9IjIiIC8+CiAgPHBhdGggZD0iTTcgMTFWN2E1IDUgMCAwIDEgOS45LTEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/lock-open\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 LockOpen = createLucideIcon('lock-open', __iconNode);\n\nexport default LockOpen;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '11', x: '3', y: '11', rx: '2', ry: '2', key: '1w4ew1' }],\n ['path', { d: 'M7 11V7a5 5 0 0 1 10 0v4', key: 'fwvmzm' }],\n];\n\n/**\n * @component @name Lock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTEiIHg9IjMiIHk9IjExIiByeD0iMiIgcnk9IjIiIC8+CiAgPHBhdGggZD0iTTcgMTFWN2E1IDUgMCAwIDEgMTAgMHY0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/lock\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 Lock = createLucideIcon('lock', __iconNode);\n\nexport default Lock;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z',\n key: '169xi5',\n },\n ],\n ['path', { d: 'M15 5.764v15', key: '1pn4in' }],\n ['path', { d: 'M9 3.236v15', key: '1uimfh' }],\n];\n\n/**\n * @component @name Map\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQuMTA2IDUuNTUzYTIgMiAwIDAgMCAxLjc4OCAwbDMuNjU5LTEuODNBMSAxIDAgMCAxIDIxIDQuNjE5djEyLjc2NGExIDEgMCAwIDEtLjU1My44OTRsLTQuNTUzIDIuMjc3YTIgMiAwIDAgMS0xLjc4OCAwbC00LjIxMi0yLjEwNmEyIDIgMCAwIDAtMS43ODggMGwtMy42NTkgMS44M0ExIDEgMCAwIDEgMyAxOS4zODFWNi42MThhMSAxIDAgMCAxIC41NTMtLjg5NGw0LjU1My0yLjI3N2EyIDIgMCAwIDEgMS43ODggMHoiIC8+CiAgPHBhdGggZD0iTTE1IDUuNzY0djE1IiAvPgogIDxwYXRoIGQ9Ik05IDMuMjM2djE1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/map\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Map = createLucideIcon('map', __iconNode);\n\nexport default Map;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'm21 3-7 7', key: '1l2asr' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M9 21H3v-6', key: 'wtvkvv' }],\n];\n\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0ibTIxIDMtNyA3IiAvPgogIDxwYXRoIGQ9Im0zIDIxIDctNyIgLz4KICA8cGF0aCBkPSJNOSAyMUgzdi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize2 = createLucideIcon('maximize-2', __iconNode);\n\nexport default Maximize2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '14', x: '2', y: '3', rx: '2', key: '48i651' }],\n ['line', { x1: '8', x2: '16', y1: '21', y2: '21', key: '1svkeh' }],\n ['line', { x1: '12', x2: '12', y1: '17', y2: '21', key: 'vw1qmm' }],\n];\n\n/**\n * @component @name Monitor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHg9IjIiIHk9IjMiIHJ4PSIyIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIyMSIgeTI9IjIxIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTciIHkyPSIyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/monitor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Monitor = createLucideIcon('monitor', __iconNode);\n\nexport default Monitor;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/moon\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 Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 2v20', key: 't6zp3m' }],\n ['path', { d: 'm8 18 4 4 4-4', key: 'bh5tu3' }],\n ['path', { d: 'm8 6 4-4 4 4', key: 'ybng9g' }],\n];\n\n/**\n * @component @name MoveVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMnYyMCIgLz4KICA8cGF0aCBkPSJtOCAxOCA0IDQgNC00IiAvPgogIDxwYXRoIGQ9Im04IDYgNC00IDQgNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/move-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 MoveVertical = createLucideIcon('move-vertical', __iconNode);\n\nexport default MoveVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n key: '1a8usu',\n },\n ],\n ['path', { d: 'm15 5 4 4', key: '1mk7zo' }],\n];\n\n/**\n * @component @name Pencil\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KICA8cGF0aCBkPSJtMTUgNSA0IDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/pencil\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pencil = createLucideIcon('pencil', __iconNode);\n\nexport default Pencil;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'M12 5v14', key: 's699le' }],\n];\n\n/**\n * @component @name Plus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/plus\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 Plus = createLucideIcon('plus', __iconNode);\n\nexport default Plus;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '20', height: '12', x: '2', y: '6', rx: '2', key: '9lu3g6' }],\n];\n\n/**\n * @component @name RectangleHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTIiIHg9IjIiIHk9IjYiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rectangle-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RectangleHorizontal = createLucideIcon('rectangle-horizontal', __iconNode);\n\nexport default RectangleHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z',\n key: 'icamh8',\n },\n ],\n ['path', { d: 'm14.5 12.5 2-2', key: 'inckbg' }],\n ['path', { d: 'm11.5 9.5 2-2', key: 'fmmyf7' }],\n ['path', { d: 'm8.5 6.5 2-2', key: 'vc6u1g' }],\n ['path', { d: 'm17.5 15.5 2-2', key: 'wo5hmg' }],\n];\n\n/**\n * @component @name Ruler\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMyAxNS4zYTIuNCAyLjQgMCAwIDEgMCAzLjRsLTIuNiAyLjZhMi40IDIuNCAwIDAgMS0zLjQgMEwyLjcgOC43YTIuNDEgMi40MSAwIDAgMSAwLTMuNGwyLjYtMi42YTIuNDEgMi40MSAwIDAgMSAzLjQgMFoiIC8+CiAgPHBhdGggZD0ibTE0LjUgMTIuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTExLjUgOS41IDItMiIgLz4KICA8cGF0aCBkPSJtOC41IDYuNSAyLTIiIC8+CiAgPHBhdGggZD0ibTE3LjUgMTUuNSAyLTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/ruler\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ruler = createLucideIcon('ruler', __iconNode);\n\nexport default Ruler;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 7V5a2 2 0 0 1 2-2h2', key: 'aa7l1z' }],\n ['path', { d: 'M17 3h2a2 2 0 0 1 2 2v2', key: '4qcy5o' }],\n ['path', { d: 'M21 17v2a2 2 0 0 1-2 2h-2', key: '6vwrx8' }],\n ['path', { d: 'M7 21H5a2 2 0 0 1-2-2v-2', key: 'ioqczr' }],\n];\n\n/**\n * @component @name Scan\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiAvPgogIDxwYXRoIGQ9Ik0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiAvPgogIDxwYXRoIGQ9Ik0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIC8+CiAgPHBhdGggZD0iTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/scan\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Scan = createLucideIcon('scan', __iconNode);\n\nexport default Scan;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm21 21-4.34-4.34', key: '14j7rj' }],\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n];\n\n/**\n * @component @name Search\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMjEtNC4zNC00LjM0IiAvPgogIDxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/search\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 Search = createLucideIcon('search', __iconNode);\n\nexport default Search;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '14', height: '20', x: '5', y: '2', rx: '2', ry: '2', key: '1yt0o3' }],\n ['path', { d: 'M12 18h.01', key: 'mhygvu' }],\n];\n\n/**\n * @component @name Smartphone\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMjAiIHg9IjUiIHk9IjIiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNMTIgMThoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/smartphone\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Smartphone = createLucideIcon('smartphone', __iconNode);\n\nexport default Smartphone;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n { d: 'M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344', key: '2acyp4' },\n ],\n ['path', { d: 'm9 11 3 3L22 4', key: '1pflzl' }],\n];\n\n/**\n * @component @name SquareCheckBig\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTAuNjU2VjE5YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxMi4zNDQiIC8+CiAgPHBhdGggZD0ibTkgMTEgMyAzTDIyIDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/square-check-big\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 SquareCheckBig = createLucideIcon('square-check-big', __iconNode);\n\nexport default SquareCheckBig;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 3a2 2 0 0 0-2 2', key: 'y57alp' }],\n ['path', { d: 'M19 3a2 2 0 0 1 2 2', key: '18rm91' }],\n ['path', { d: 'M21 19a2 2 0 0 1-2 2', key: '1j7049' }],\n ['path', { d: 'M5 21a2 2 0 0 1-2-2', key: 'sbafld' }],\n ['path', { d: 'M9 3h1', key: '1yesri' }],\n ['path', { d: 'M9 21h1', key: '15o7lz' }],\n ['path', { d: 'M14 3h1', key: '1ec4yj' }],\n ['path', { d: 'M14 21h1', key: 'v9vybs' }],\n ['path', { d: 'M3 9v1', key: '1r0deq' }],\n ['path', { d: 'M21 9v1', key: 'mxsmne' }],\n ['path', { d: 'M3 14v1', key: 'vnatye' }],\n ['path', { d: 'M21 14v1', key: '169vum' }],\n];\n\n/**\n * @component @name SquareDashed\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAzYTIgMiAwIDAgMC0yIDIiIC8+CiAgPHBhdGggZD0iTTE5IDNhMiAyIDAgMCAxIDIgMiIgLz4KICA8cGF0aCBkPSJNMjEgMTlhMiAyIDAgMCAxLTIgMiIgLz4KICA8cGF0aCBkPSJNNSAyMWEyIDIgMCAwIDEtMi0yIiAvPgogIDxwYXRoIGQ9Ik05IDNoMSIgLz4KICA8cGF0aCBkPSJNOSAyMWgxIiAvPgogIDxwYXRoIGQ9Ik0xNCAzaDEiIC8+CiAgPHBhdGggZD0iTTE0IDIxaDEiIC8+CiAgPHBhdGggZD0iTTMgOXYxIiAvPgogIDxwYXRoIGQ9Ik0yMSA5djEiIC8+CiAgPHBhdGggZD0iTTMgMTR2MSIgLz4KICA8cGF0aCBkPSJNMjEgMTR2MSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/square-dashed\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 SquareDashed = createLucideIcon('square-dashed', __iconNode);\n\nexport default SquareDashed;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z',\n key: 'xwnzip',\n },\n ],\n ['path', { d: 'M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6', key: '14rsvq' }],\n];\n\n/**\n * @component @name SquareMousePointer\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuMDM0IDEyLjY4MWEuNDk4LjQ5OCAwIDAgMSAuNjQ3LS42NDdsOSAzLjVhLjUuNSAwIDAgMS0uMDMzLjk0M2wtMy40NDQgMS4wNjhhMSAxIDAgMCAwLS42Ni42NmwtMS4wNjcgMy40NDNhLjUuNSAwIDAgMS0uOTQzLjAzM3oiIC8+CiAgPHBhdGggZD0iTTIxIDExVjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/square-mouse-pointer\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareMousePointer = createLucideIcon('square-mouse-pointer', __iconNode);\n\nexport default SquareMousePointer;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z',\n key: '1dfntj',\n },\n ],\n ['path', { d: 'M15 3v5a1 1 0 0 0 1 1h5', key: '6s6qgf' }],\n];\n\n/**\n * @component @name StickyNote\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgOWEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTUgM0g1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yeiIgLz4KICA8cGF0aCBkPSJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/sticky-note\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst StickyNote = createLucideIcon('sticky-note', __iconNode);\n\nexport default StickyNote;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xMiAydjIiIC8+CiAgPHBhdGggZD0iTTEyIDIwdjIiIC8+CiAgPHBhdGggZD0ibTQuOTMgNC45MyAxLjQxIDEuNDEiIC8+CiAgPHBhdGggZD0ibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJNMiAxMmgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxMmgyIiAvPgogIDxwYXRoIGQ9Im02LjM0IDE3LjY2LTEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJtMTkuMDcgNC45My0xLjQxIDEuNDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sun\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 Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10 11v6', key: 'nco0om' }],\n ['path', { d: 'M14 11v6', key: 'outv1u' }],\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6', key: 'miytrc' }],\n ['path', { d: 'M3 6h18', key: 'd0wm0j' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2', key: 'e791ji' }],\n];\n\n/**\n * @component @name Trash2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTQgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2IiAvPgogIDxwYXRoIGQ9Ik0zIDZoMTgiIC8+CiAgPHBhdGggZD0iTTggNlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/trash-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 Trash2 = createLucideIcon('trash-2', __iconNode);\n\nexport default Trash2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 4v16', key: '1654pz' }],\n ['path', { d: 'M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2', key: 'e0r10z' }],\n ['path', { d: 'M9 20h6', key: 's66wpe' }],\n];\n\n/**\n * @component @name Type\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNHYxNiIgLz4KICA8cGF0aCBkPSJNNCA3VjVhMSAxIDAgMCAxIDEtMWgxNGExIDEgMCAwIDEgMSAxdjIiIC8+CiAgPHBhdGggZD0iTTkgMjBoNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/type\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 Type = createLucideIcon('type', __iconNode);\n\nexport default Type;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v12', key: '1x0j5s' }],\n ['path', { d: 'm17 8-5-5-5 5', key: '7q97r8' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n];\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxMiIgLz4KICA8cGF0aCBkPSJtMTcgOC01LTUtNSA1IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('upload', __iconNode);\n\nexport default Upload;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","/** Designfever brand mark, used as the About / help entry in the side rail. */\nexport const DfLogoIcon = () => (\n <svg\n className=\"df-review-brand-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 54.062 38.381\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect\n width=\"4.787\"\n height=\"4.787\"\n transform=\"translate(49.276)\"\n fill=\"currentColor\"\n />\n <path\n d=\"M25.337,12.329a15.036,15.036,0,1,0,0,21.866v4.186h4.787V0H25.337V12.329ZM15.033,33.5A10.236,10.236,0,1,1,25.27,23.265,10.249,10.249,0,0,1,15.033,33.5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M72.092,0H67.3V38.314h4.792V23.939H86.5V19.152H72.092Z\"\n transform=\"translate(-32.436)\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import type {\n ReviewShellProps,\n ReviewSourceEditor,\n ReviewSourceInspectorOptions,\n} from './types';\n\ntype ReviewRuntimeEnv = Record<string, unknown>;\n\ndeclare const __DF_WRK_REVIEW_SOURCE_ROOT__: string | undefined;\ndeclare const __DF_WRK_REVIEW_SOURCE_EDITOR__: string | undefined;\ndeclare const __DF_WRK_REVIEW_SOURCE_URL_TEMPLATE__: string | undefined;\n\nconst REVIEW_SOURCE_EDITORS: readonly ReviewSourceEditor[] = [\n 'vscode',\n 'cursor',\n 'webstorm',\n 'custom',\n];\n\nconst getInjectedSourceRoot = () =>\n typeof __DF_WRK_REVIEW_SOURCE_ROOT__ === 'undefined'\n ? undefined\n : __DF_WRK_REVIEW_SOURCE_ROOT__;\n\nconst getInjectedSourceEditor = () =>\n typeof __DF_WRK_REVIEW_SOURCE_EDITOR__ === 'undefined'\n ? undefined\n : __DF_WRK_REVIEW_SOURCE_EDITOR__;\n\nconst getInjectedSourceUrlTemplate = () =>\n typeof __DF_WRK_REVIEW_SOURCE_URL_TEMPLATE__ === 'undefined'\n ? undefined\n : __DF_WRK_REVIEW_SOURCE_URL_TEMPLATE__;\n\nconst getRuntimeEnv = (): ReviewRuntimeEnv => ({\n VITE_REVIEW_SOURCE_EDITOR: getInjectedSourceEditor(),\n VITE_REVIEW_SOURCE_ROOT: getInjectedSourceRoot(),\n VITE_REVIEW_SOURCE_URL_TEMPLATE: getInjectedSourceUrlTemplate(),\n});\n\nconst getEnvString = (env: ReviewRuntimeEnv, key: string) => {\n const value = env[key];\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n};\n\nconst getEnvSourceEditor = (\n env: ReviewRuntimeEnv\n): ReviewSourceEditor | undefined => {\n const value = getEnvString(env, 'VITE_REVIEW_SOURCE_EDITOR');\n return REVIEW_SOURCE_EDITORS.includes(value as ReviewSourceEditor)\n ? (value as ReviewSourceEditor)\n : undefined;\n};\n\nexport const resolveReviewSourceOptions = ({\n sourceInspector,\n sourceRoot,\n}: Pick<ReviewShellProps, 'sourceInspector' | 'sourceRoot'>) => {\n const env = getRuntimeEnv();\n const envSourceRoot = getEnvString(env, 'VITE_REVIEW_SOURCE_ROOT');\n const envSourceEditor = getEnvSourceEditor(env);\n const envUrlTemplate = getEnvString(env, 'VITE_REVIEW_SOURCE_URL_TEMPLATE');\n\n const resolvedSourceInspector: ReviewSourceInspectorOptions | undefined =\n sourceInspector || envSourceEditor || envUrlTemplate\n ? {\n ...sourceInspector,\n ...(envSourceEditor ? { editor: envSourceEditor } : {}),\n ...(envUrlTemplate ? { urlTemplate: envUrlTemplate } : {}),\n }\n : sourceInspector;\n\n return {\n sourceInspector: resolvedSourceInspector,\n sourceRoot: envSourceRoot ?? sourceRoot,\n };\n};\n","import type { ReviewItemScope } from '../types';\nimport type { ReviewQaFilter, ReviewShellTheme } from './types';\n\nexport const REVIEW_QA_FILTERS: Array<{\n key: ReviewQaFilter;\n label: string;\n scope?: ReviewItemScope;\n}> = [\n { key: 'all', label: 'All' },\n { key: 'mobile', label: 'Mobile', scope: 'mobile' },\n { key: 'tablet', label: 'Tablet', scope: 'tablet' },\n { key: 'desktop', label: 'Desktop', scope: 'desktop' },\n { key: 'wide', label: 'Wide', scope: 'wide' },\n];\n\nexport const FIGMA_OVERLAY_UNAVAILABLE_MESSAGE =\n '피그마 오버레이 디버깅이 안되는 해상도';\nexport const FIGMA_TOKEN_STORAGE_KEY = 'figma-token';\nexport const REVIEW_USER_ID_STORAGE_KEY = 'user-id';\nexport const REVIEW_THEME_STORAGE_KEY = 'df-review-theme';\nexport const REVIEW_SIDE_PANEL_STORAGE_KEY = 'df-review-side-panel';\nexport const REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY =\n 'df-review-side-panel-visible';\nexport const REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY =\n 'df-review-source-tree-filter';\nexport const REVIEW_SOURCE_TREE_META_STORAGE_KEY =\n 'df-review-source-tree-meta-visibility';\nexport const REVIEW_QA_STATUS_FILTER_STORAGE_KEY =\n 'df-review-qa-status-filter';\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\nconst 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 { hash, path, search } = splitTarget(raw);\n const normalized = path.startsWith('/') ? path : `/${path}`;\n const reviewPrefix = normalizeReviewPathPrefix(reviewPathPrefix);\n\n const normalizedPath = normalized === reviewPrefix ||\n normalized.startsWith(`${reviewPrefix}/`)\n ? '/'\n : normalized;\n\n return `${normalizedPath}${search}${hash}`;\n};\n\nexport const getTargetRouteKey = (\n value: string,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n const { path } = splitTarget(normalizeTarget(value, reviewPathPrefix));\n return path || '/';\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(\n `${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`,\n reviewPathPrefix\n ),\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 getFrameRouteTarget = (\n targetWindow: Window,\n reviewPathPrefix: string\n) => {\n return normalizeTarget(\n `${targetWindow.location.pathname}${targetWindow.location.search}${targetWindow.location.hash}`,\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 url.searchParams.delete('panel');\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 url.searchParams.set('panel', 'qa');\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 getTargetRouteKey(item.routeKey, reviewPathPrefix);\n if (item.normalizedPath) {\n return getTargetRouteKey(item.normalizedPath, reviewPathPrefix);\n }\n\n try {\n return getTargetRouteKey(new URL(item.pageUrl).pathname, reviewPathPrefix);\n } catch {\n return '/';\n }\n};\n\nexport const getItemFrameTarget = (\n item: ReviewItem,\n reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX\n) => {\n const routeTarget = getItemTarget(item, reviewPathPrefix);\n const originalTarget = getItemUrlTarget(item.originalUrl, reviewPathPrefix);\n if (\n originalTarget &&\n getTargetRouteKey(originalTarget, reviewPathPrefix) === routeTarget\n ) {\n return originalTarget;\n }\n\n const pageTarget = getItemUrlTarget(item.pageUrl, reviewPathPrefix);\n if (\n pageTarget &&\n getTargetRouteKey(pageTarget, reviewPathPrefix) === routeTarget\n ) {\n return pageTarget;\n }\n\n return routeTarget;\n};\n\nfunction splitTarget(value: string) {\n const hashIndex = value.indexOf('#');\n const beforeHash = hashIndex >= 0 ? value.slice(0, hashIndex) : value;\n const hash = hashIndex >= 0 ? value.slice(hashIndex) : '';\n const searchIndex = beforeHash.indexOf('?');\n const path = searchIndex >= 0\n ? beforeHash.slice(0, searchIndex)\n : beforeHash;\n const search = searchIndex >= 0 ? beforeHash.slice(searchIndex) : '';\n\n return {\n hash,\n path: path || '/',\n search,\n };\n}\n\nfunction getItemUrlTarget(\n value: string | undefined,\n reviewPathPrefix: string\n) {\n if (!value) return null;\n if (typeof window === 'undefined') return null;\n\n try {\n const url = new URL(value, window.location.origin);\n if (url.origin !== window.location.origin) return null;\n return normalizeTarget(\n `${url.pathname}${url.search}${url.hash}`,\n reviewPathPrefix\n );\n } catch {\n return null;\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\nconst getFallbackPreset = (presets: ReviewShellViewportPreset[]) =>\n presets[0] ?? DEFAULT_REVIEW_VIEWPORT_PRESETS[0];\n\nconst 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 { X as XIcon } from 'lucide-react';\nimport { DfLogoIcon } from '../review/df.logo';\n\ninterface PromptModalProps {\n onClose: () => 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 'Project owners can set FIGMA_TOKEN on the server. Reviewers who cannot change env can add a browser-local Figma token in Settings; it is stored as figma-token and used only as an image-store fallback.',\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 = ({ onClose }: 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 df-review-about-dialog\">\n <button\n aria-label=\"Close help\"\n className=\"df-review-about-close\"\n type=\"button\"\n onClick={onClose}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n <div className=\"df-review-about-body\">\n <div className=\"df-review-about-intro\">\n <span className=\"df-review-about-logo\" aria-hidden=\"true\">\n <DfLogoIcon />\n </span>\n <strong>Review shell help</strong>\n <span>Program overview and setup notes</span>\n </div>\n {ABOUT_SECTIONS.map((section) => (\n <div className=\"df-review-about-item\" key={section.title}>\n <strong>{section.title}</strong>\n <p>{section.body}</p>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\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\nconst getItemAssigneeLabel = (item: ReviewItem) =>\n item.assigneeName || item.assigneeId || '(none)';\n\nconst formatPromptViewport = (item: ReviewItem) =>\n `${Math.round(item.viewport?.width ?? 0)}x${Math.round(\n item.viewport?.height ?? 0\n )}`;\n\nconst formatPromptPoint = (point: { x: number; y: number } | undefined) =>\n point ? `x=${Math.round(point.x)}, y=${Math.round(point.y)}` : '(none)';\n\nconst 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\nconst 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\nconst 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\nconst 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 `Title: ${item.title?.trim() || '(none)'}`,\n `Assignee: ${getItemAssigneeLabel(item)}`,\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 comment:',\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","import { Copy as CopyIcon, X as XIcon } from 'lucide-react';\nimport { getPromptLengthLabel } from './prompt';\n\ninterface InitialPromptModalProps {\n initialPromptText: string;\n copiedPromptKey: string | null;\n onClose: () => void;\n onCopyPrompt: (text: string, key: string) => void;\n}\n\nexport const InitialPromptModal = ({\n initialPromptText,\n copiedPromptKey,\n onClose,\n onCopyPrompt,\n}: InitialPromptModalProps) => {\n return (\n <div\n aria-label=\"Initial prompt\"\n aria-modal=\"true\"\n className=\"df-review-prompt-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close initial prompt\"\n className=\"df-review-prompt-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-prompt-dialog df-review-prompt-dialog-narrow\">\n <div className=\"df-review-prompt-header\">\n <div>\n <strong>Initial Prompt</strong>\n <span>AI handoff script for coding agents</span>\n </div>\n <button\n aria-label=\"Close initial prompt\"\n type=\"button\"\n onClick={onClose}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-prompt-body\">\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 QA handoff 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_QA_STATUS_FILTER_STORAGE_KEY,\n REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY,\n REVIEW_SOURCE_TREE_META_STORAGE_KEY,\n REVIEW_SIDE_PANEL_STORAGE_KEY,\n REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY,\n REVIEW_THEME_STORAGE_KEY,\n REVIEW_USER_ID_STORAGE_KEY,\n} from './constants';\nimport type { ReviewQaStatusFilter } from './types';\n\nexport type StoredReviewSidePanel = 'qa' | 'source' | 'figma-images';\nexport interface StoredSourceTreeMetaVisibility {\n box: boolean;\n font: boolean;\n media: boolean;\n className: boolean;\n}\n\nconst DEFAULT_SOURCE_TREE_META_VISIBILITY: StoredSourceTreeMetaVisibility = {\n box: true,\n font: true,\n media: true,\n className: false,\n};\nconst REVIEW_QA_STATUS_FILTER_VALUES = new Set([\n 'all',\n 'todo',\n 'doing',\n 'review',\n 'hold',\n 'done',\n]);\n\nexport const normalizeReviewTheme = (value: string | null): ReviewShellTheme =>\n value === 'light' || value === 'system' || value === 'dark'\n ? value\n : DEFAULT_REVIEW_THEME;\n\nconst normalizeReviewSidePanel = (\n value: string | null\n): StoredReviewSidePanel | null => {\n if (value === 'qa' || value === 'source' || value === 'figma-images') {\n return value;\n }\n return null;\n};\n\nconst normalizeStoredReviewSidePanel = (\n value: string | null\n): StoredReviewSidePanel => normalizeReviewSidePanel(value) ?? 'qa';\n\nconst normalizeStoredReviewQaStatusFilter = (\n value: string | null\n): ReviewQaStatusFilter =>\n value && REVIEW_QA_STATUS_FILTER_VALUES.has(value)\n ? (value as ReviewQaStatusFilter)\n : 'all';\n\nconst normalizeStoredSourceTreeMetaVisibility = (\n value: unknown\n): StoredSourceTreeMetaVisibility => {\n if (!value || typeof value !== 'object') {\n return DEFAULT_SOURCE_TREE_META_VISIBILITY;\n }\n\n const metaVisibility = value as Partial<\n Record<keyof StoredSourceTreeMetaVisibility, unknown>\n >;\n\n return {\n box:\n typeof metaVisibility.box === 'boolean'\n ? metaVisibility.box\n : DEFAULT_SOURCE_TREE_META_VISIBILITY.box,\n font:\n typeof metaVisibility.font === 'boolean'\n ? metaVisibility.font\n : DEFAULT_SOURCE_TREE_META_VISIBILITY.font,\n media:\n typeof metaVisibility.media === 'boolean'\n ? metaVisibility.media\n : DEFAULT_SOURCE_TREE_META_VISIBILITY.media,\n className:\n typeof metaVisibility.className === 'boolean'\n ? metaVisibility.className\n : DEFAULT_SOURCE_TREE_META_VISIBILITY.className,\n };\n};\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 = (fallback = '') => {\n const normalizedFallback = fallback.trim();\n if (typeof window === 'undefined') return normalizedFallback;\n\n try {\n return (\n window.localStorage.getItem(REVIEW_USER_ID_STORAGE_KEY)?.trim() ||\n normalizedFallback\n );\n } catch {\n return normalizedFallback;\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 getStoredReviewSidePanel = () => {\n if (typeof window === 'undefined') return 'qa';\n\n try {\n return normalizeStoredReviewSidePanel(\n window.localStorage.getItem(REVIEW_SIDE_PANEL_STORAGE_KEY)\n );\n } catch {\n return 'qa';\n }\n};\n\nexport const getInitialReviewSidePanel = () => {\n if (typeof window === 'undefined') return null;\n\n try {\n return normalizeReviewSidePanel(\n new URLSearchParams(window.location.search).get('panel')\n );\n } catch {\n return null;\n }\n};\n\nexport const writeStoredReviewSidePanel = (\n sidePanel: StoredReviewSidePanel\n) => {\n if (typeof window === 'undefined') return;\n\n try {\n window.localStorage.setItem(\n REVIEW_SIDE_PANEL_STORAGE_KEY,\n normalizeStoredReviewSidePanel(sidePanel)\n );\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewSidePanelVisible = () => {\n if (typeof window === 'undefined') return true;\n\n try {\n const value = window.localStorage.getItem(\n REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY\n );\n return value === null ? true : value === 'true';\n } catch {\n return true;\n }\n};\n\nexport const writeStoredReviewSidePanelVisible = (isVisible: boolean) => {\n if (typeof window === 'undefined') return;\n\n try {\n window.localStorage.setItem(\n REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY,\n isVisible ? 'true' : 'false'\n );\n } catch {\n return;\n }\n};\n\nexport const getStoredReviewQaStatusFilter = () => {\n if (typeof window === 'undefined') return 'all';\n\n try {\n return normalizeStoredReviewQaStatusFilter(\n window.localStorage.getItem(REVIEW_QA_STATUS_FILTER_STORAGE_KEY)\n );\n } catch {\n return 'all';\n }\n};\n\nexport const writeStoredReviewQaStatusFilter = (\n filter: ReviewQaStatusFilter\n) => {\n if (typeof window === 'undefined') return;\n\n try {\n const normalizedFilter = normalizeStoredReviewQaStatusFilter(filter);\n if (normalizedFilter === 'all') {\n window.localStorage.removeItem(REVIEW_QA_STATUS_FILTER_STORAGE_KEY);\n } else {\n window.localStorage.setItem(\n REVIEW_QA_STATUS_FILTER_STORAGE_KEY,\n normalizedFilter\n );\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredSourceTreeFilter = () => {\n if (typeof window === 'undefined') return '';\n\n try {\n return (\n window.localStorage.getItem(REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY) ?? ''\n );\n } catch {\n return '';\n }\n};\n\nexport const writeStoredSourceTreeFilter = (filter: string) => {\n if (typeof window === 'undefined') return;\n\n try {\n if (filter) {\n window.localStorage.setItem(REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY, filter);\n } else {\n window.localStorage.removeItem(REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY);\n }\n } catch {\n return;\n }\n};\n\nexport const getStoredSourceTreeMetaVisibility = () => {\n if (typeof window === 'undefined') return DEFAULT_SOURCE_TREE_META_VISIBILITY;\n\n try {\n const value = window.localStorage.getItem(\n REVIEW_SOURCE_TREE_META_STORAGE_KEY\n );\n if (!value) return DEFAULT_SOURCE_TREE_META_VISIBILITY;\n return normalizeStoredSourceTreeMetaVisibility(JSON.parse(value));\n } catch {\n return DEFAULT_SOURCE_TREE_META_VISIBILITY;\n }\n};\n\nexport const writeStoredSourceTreeMetaVisibility = (\n metaVisibility: StoredSourceTreeMetaVisibility\n) => {\n if (typeof window === 'undefined') return;\n\n try {\n window.localStorage.setItem(\n REVIEW_SOURCE_TREE_META_STORAGE_KEY,\n JSON.stringify(normalizeStoredSourceTreeMetaVisibility(metaVisibility))\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 Monitor as MonitorIcon,\n Moon as MoonIcon,\n Sun as SunIcon,\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\nconst getReviewThemeIcon = (theme: ReviewShellTheme) => {\n if (theme === 'light') return SunIcon;\n if (theme === 'system') return MonitorIcon;\n return MoonIcon;\n};\n\ninterface ReviewSettingsModalProps {\n figmaTokenDraft: string;\n reviewUserIdDraft: string;\n reviewThemeDraft: ReviewShellTheme;\n figmaSettingsStatus: string;\n isFigmaTokenVisible: boolean;\n isFigmaTokenGuideOpen: boolean;\n onClose: () => void;\n onFigmaTokenDraftChange: (value: string) => void;\n onReviewUserIdDraftChange: (value: string) => void;\n onReviewThemeDraftChange: (value: ReviewShellTheme) => void;\n onClearStatus: () => void;\n onToggleFigmaTokenVisible: () => void;\n onToggleFigmaTokenGuide: () => void;\n onSave: (\n figmaToken: string,\n reviewUserId: string,\n reviewTheme: ReviewShellTheme\n ) => void;\n}\n\nexport const ReviewSettingsModal = ({\n figmaTokenDraft,\n reviewUserIdDraft,\n reviewThemeDraft,\n figmaSettingsStatus,\n isFigmaTokenVisible,\n isFigmaTokenGuideOpen,\n onClose,\n onFigmaTokenDraftChange,\n onReviewUserIdDraftChange,\n onReviewThemeDraftChange,\n onClearStatus,\n onToggleFigmaTokenVisible,\n onToggleFigmaTokenGuide,\n onSave,\n}: ReviewSettingsModalProps) => {\n return (\n <div\n aria-label=\"Review settings\"\n aria-modal=\"true\"\n className=\"df-review-settings-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close settings\"\n className=\"df-review-settings-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <form\n className=\"df-review-settings-dialog\"\n onSubmit={(event) => {\n event.preventDefault();\n onSave(figmaTokenDraft, reviewUserIdDraft, reviewThemeDraft);\n }}\n >\n <div className=\"df-review-settings-header\">\n <div 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 const ThemeIcon = getReviewThemeIcon(option.value);\n\n return (\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(\n normalizeReviewTheme(option.value)\n );\n onClearStatus();\n }}\n >\n <ThemeIcon aria-hidden=\"true\" />\n <span>{option.label}</span>\n </button>\n );\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 {\n ChevronDown as ChevronDownIcon,\n ChevronRight as ChevronRightIcon,\n Search as SearchIcon,\n X as XIcon,\n} from 'lucide-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 getCountCellClassName = (\n status: 'todo' | 'review' | 'hold',\n count: number\n) =>\n [\n 'df-review-sitemap-cell',\n `is-${status}`,\n count === 0 ? 'is-zero' : '',\n ]\n .filter(Boolean)\n .join(' ');\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: 'page',\n direction: 'asc',\n });\n const [collapsedFolderHrefs, setCollapsedFolderHrefs] = useState<Set<string>>(\n () => new Set()\n );\n const [searchQuery, setSearchQuery] = useState('');\n const trimmedSearchQuery = searchQuery.trim();\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 collapsedFolderHrefs,\n searchQuery: trimmedSearchQuery,\n sortKey: sort.key,\n sortDirection: sort.direction,\n }\n );\n const matchingPageCount = sitemapRows.filter((row) => row.isPage).length;\n const gridStyle = {\n '--df-review-sitemap-grid-template': 'minmax(190px, 1fr) 58px 70px 56px minmax(96px, 140px)',\n } as CSSProperties;\n const sortHeaders: SortHeader[] = [\n { key: 'page', label: 'Path', className: 'is-page' },\n { key: 'todo', label: 'Todo' },\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 const toggleFolder = (href: string) => {\n setCollapsedFolderHrefs((currentHrefs) => {\n const nextHrefs = new Set(currentHrefs);\n if (nextHrefs.has(href)) {\n nextHrefs.delete(href);\n } else {\n nextHrefs.add(href);\n }\n return nextHrefs;\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.status.todo} todo ·{' '}\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-controls\">\n <label className=\"df-review-sitemap-search\">\n <SearchIcon aria-hidden=\"true\" />\n <input\n aria-label=\"Search sitemap\"\n autoComplete=\"off\"\n placeholder=\"Search pages\"\n type=\"search\"\n value={searchQuery}\n onChange={(event) => setSearchQuery(event.currentTarget.value)}\n />\n </label>\n {trimmedSearchQuery && (\n <button\n aria-label=\"Clear sitemap search\"\n className=\"df-review-sitemap-search-clear\"\n type=\"button\"\n onClick={() => setSearchQuery('')}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n <span className=\"df-review-sitemap-search-count\">\n {trimmedSearchQuery\n ? `${matchingPageCount} matches`\n : `${pages.length} pages`}\n </span>\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 selectRowPage = () => {\n if (row.isPage) onSelectPage(row.href);\n };\n const rowClassName = [\n 'df-review-sitemap-row',\n row.isPage ? 'is-page' : 'is-folder',\n row.isActive ? 'is-active' : '',\n row.isPage ? 'is-clickable' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const rowContent = (\n <SitemapRowContent\n depth={row.depth}\n hasChildren={row.hasChildren}\n isExpanded={row.isExpanded}\n isPage={row.isPage}\n label={row.label}\n qaCount={row.qaCount}\n users={row.users}\n onToggleFolder={() => toggleFolder(row.href)}\n />\n );\n\n return (\n <div\n key={row.href}\n aria-label={\n row.isPage\n ? `${row.href} / ${row.qaCount.status.todo} todo / ${row.qaCount.status.review} review / ${row.qaCount.status.hold} hold / ${row.users.length} online`\n : `${row.href} group / ${row.qaCount.status.todo} todo / ${row.qaCount.status.review} review / ${row.qaCount.status.hold} hold / ${row.users.length} online`\n }\n className={rowClassName}\n role={row.isPage ? 'button' : 'row'}\n tabIndex={row.isPage ? 0 : undefined}\n onClick={row.isPage ? selectRowPage : undefined}\n onKeyDown={\n row.isPage\n ? (event) => {\n if (event.currentTarget !== event.target) return;\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n selectRowPage();\n }\n : undefined\n }\n >\n {rowContent}\n </div>\n );\n })}\n {sitemapRows.length === 0 && (\n <div className=\"df-review-sitemap-empty\" role=\"status\">\n No matching pages\n </div>\n )}\n <button\n aria-label={`All QA / ${allQaCount.status.todo} todo / ${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 depth={0}\n hasChildren={false}\n isExpanded={false}\n isPage={false}\n label=\"All QA\"\n qaCount={allQaCount}\n users={allQaUsers}\n />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nconst SitemapRowContent = ({\n depth,\n hasChildren,\n isExpanded,\n isPage,\n label,\n qaCount,\n users,\n onToggleFolder,\n}: {\n depth: number;\n hasChildren: boolean;\n isExpanded: boolean;\n isPage: boolean;\n label: string;\n qaCount: SitemapQaCount;\n users: ReviewPresenceUser[];\n onToggleFolder?: () => void;\n}) => (\n <>\n <span\n className=\"df-review-sitemap-path\"\n style={{ '--df-review-sitemap-depth': depth } as CSSProperties}\n >\n {hasChildren ? (\n <button\n aria-expanded={isExpanded}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${label}`}\n className=\"df-review-sitemap-tree-toggle\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onToggleFolder?.();\n }}\n >\n {isExpanded ? (\n <ChevronDownIcon aria-hidden=\"true\" />\n ) : (\n <ChevronRightIcon aria-hidden=\"true\" />\n )}\n </button>\n ) : (\n <span className=\"df-review-sitemap-tree-spacer\" aria-hidden=\"true\" />\n )}\n {isPage ? (\n <span className=\"df-review-sitemap-page-label\">\n {label}\n </span>\n ) : (\n <span className=\"df-review-sitemap-label\">{label}</span>\n )}\n </span>\n <span className={getCountCellClassName('todo', qaCount.status.todo)}>\n <strong>{qaCount.status.todo}</strong>\n </span>\n <span className={getCountCellClassName('review', qaCount.status.review)}>\n {qaCount.status.review}\n </span>\n <span className={getCountCellClassName('hold', qaCount.status.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\ntype SitemapTreeRow = {\n href: string;\n label: string;\n depth: number;\n hasChildren: boolean;\n isExpanded: boolean;\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 | 'todo'\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 collapsedFolderHrefs?: ReadonlySet<string>;\n searchQuery?: string;\n sortKey?: SitemapSortKey;\n sortDirection?: SitemapSortDirection;\n } = {}\n) => {\n const collapsedFolderHrefs =\n options.collapsedFolderHrefs ?? new Set<string>();\n const searchQuery = normalizeSitemapSearchQuery(options.searchQuery);\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 === 'todo') return summary.count.status.todo;\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 const summaryMatchesSearch = (summary: SitemapTreeSummary): boolean => {\n if (!searchQuery) return true;\n if (sitemapNodeMatchesSearch(summary.node, searchQuery, getPageTarget)) {\n return true;\n }\n\n return summary.children.some(summaryMatchesSearch);\n };\n\n const rows: SitemapTreeRow[] = [];\n\n const appendSummaryRows = (\n summary: SitemapTreeSummary,\n depth: number\n ) => {\n const { node } = summary;\n const rowCount = node.isPage ? summary.directCount : summary.count;\n const rowUsers = node.isPage ? summary.directUsers : summary.users;\n const nodeMatchesSearch =\n Boolean(searchQuery) &&\n sitemapNodeMatchesSearch(node, searchQuery, getPageTarget);\n const visibleChildren = sortSummaries(\n summary.children.filter(\n (child) =>\n !searchQuery || nodeMatchesSearch || summaryMatchesSearch(child)\n )\n );\n const hasChildren = visibleChildren.length > 0;\n const isExpanded =\n hasChildren &&\n (Boolean(searchQuery) || !collapsedFolderHrefs.has(node.href));\n\n if (node.isPage || hasChildren || depth > 0) {\n const pageTarget = node.isPage ? getPageTarget(node.href) : null;\n\n rows.push({\n href: node.href,\n label: node.label,\n depth,\n hasChildren,\n isExpanded,\n isPage: node.isPage,\n isActive: pageTarget === activeRoute,\n qaCount: rowCount,\n users: rowUsers,\n });\n }\n\n if (!isExpanded) return;\n\n visibleChildren.forEach((child) => {\n appendSummaryRows(child, depth + 1);\n });\n };\n\n if (\n root.isPage &&\n (!searchQuery || sitemapNodeMatchesSearch(root, searchQuery, getPageTarget))\n ) {\n const directCount = getDirectCount(root);\n const directUsers = getDirectUsers(root);\n\n rows.push({\n href: root.href,\n label: root.label,\n depth: 0,\n hasChildren: false,\n isExpanded: false,\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())\n .map(createNodeSummary)\n .filter(summaryMatchesSearch)\n );\n\n rootSummaries.forEach((summary) => {\n appendSummaryRows(summary, 0);\n });\n\n return rows;\n};\n\nfunction normalizeSitemapSearchQuery(value: string | undefined) {\n return value?.trim().toLowerCase() ?? '';\n}\n\nfunction sitemapNodeMatchesSearch(\n node: SitemapTreeNode,\n searchQuery: string,\n getPageTarget: (href: string) => string\n) {\n return [\n node.href,\n node.label,\n normalizeSitemapHref(node.href),\n node.isPage ? getPageTarget(node.href) : '',\n ]\n .join(' ')\n .toLowerCase()\n .includes(searchQuery);\n}\n","import type { ReviewShellFigmaImagesOptions } from './types';\n\nexport type ReviewFigmaFrameConfig = {\n desktopNodeId?: string;\n mobileNodeId?: string;\n};\n\ntype ReviewFigmaWindow = Window & {\n __figma?: ReviewFigmaFrameConfig;\n};\n\nexport function getReviewFigmaImageStore(\n options: ReviewShellFigmaImagesOptions | null | undefined\n) {\n if (!options || options.enabled === false) return null;\n return options.store ?? null;\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\nfunction normalizeFigmaNodeValue(value: unknown) {\n return typeof value === 'string' ? value.trim() || undefined : undefined;\n}\n","export function FigmaMarkIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"df-review-figma-mark-icon\"\n viewBox=\"0 0 24 24\"\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}\n\nexport function FigmaRailIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"df-review-figma-rail-icon\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 8H8.5a3 3 0 1 1 0-6H12v6Z\" />\n <path d=\"M12 14H8.5a3 3 0 1 1 0-6H12v6Z\" />\n <path d=\"M12 17.5A3.5 3.5 0 1 1 8.5 14H12v3.5Z\" />\n <path d=\"M12 2h3.5a3 3 0 1 1 0 6H12V2Z\" />\n <circle cx=\"15.5\" cy=\"11\" r=\"3\" />\n </svg>\n );\n}\n","import {\n type CSSProperties,\n type MouseEvent,\n type PointerEvent,\n useRef,\n useState,\n} from 'react';\nimport {\n ExternalLink as ExternalLinkIcon,\n MoveVertical as OffsetYIcon,\n Pencil as PencilIcon,\n Plus as PlusIcon,\n RefreshCw as RefreshCwIcon,\n Trash2 as TrashIcon,\n X as XIcon,\n} from 'lucide-react';\nimport type { ReviewFigmaImage } from '../../figma/image.types';\nimport type {\n ReviewFigmaImageOverlayItemState,\n} from './image.overlay.controller';\nimport {\n DEFAULT_FIGMA_IMAGE_LAYER_STATE,\n formatFigmaImageDate,\n getFigmaImageLabel,\n getFigmaImageLayerStatusLabel,\n getPointerFigmaImageTargetId,\n getReorderedFigmaImageIds,\n getSnappedOpacityPercent,\n isInteractiveFigmaImageTarget,\n} from './image-panel.utils';\nimport { FigmaImageLayerStateButtons } from './layer-state-buttons';\nimport { ReviewSpinner } from '../review/spinner';\n\nconst FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS = 6;\n\ninterface FigmaImagesPanelProps {\n error: string;\n images: ReviewFigmaImage[];\n imageOverlayStates: Record<string, ReviewFigmaImageOverlayItemState>;\n isListVisible: boolean;\n isLoading: boolean;\n isMutating: boolean;\n selectedImageId: string | null;\n onAddImage: (\n figmaUrl: string,\n label?: string\n ) => Promise<ReviewFigmaImage | null>;\n onDeleteImage: (id: string) => Promise<void>;\n onRefreshImages: () => Promise<ReviewFigmaImage[]>;\n onReorderImages: (imageIds: string[]) => Promise<void>;\n onSelectImage: (id: string) => void;\n onSetImageOverlayOffsetY: (id: string, offsetY: number) => void;\n onSetImageOverlayOpacity: (id: string, opacity: number) => void;\n onToggleImageOverlayLocked: (id: string) => void;\n onToggleImageOverlayMode: (id: string) => void;\n onToggleImageOverlayVisible: (id: string) => void;\n onUpdateImage: (\n id: string,\n patch: { label?: string }\n ) => Promise<ReviewFigmaImage | null>;\n}\n\nexport const FigmaImagesPanel = ({\n error,\n images,\n imageOverlayStates,\n isListVisible,\n isLoading,\n isMutating,\n selectedImageId,\n onAddImage,\n onDeleteImage,\n onRefreshImages,\n onReorderImages,\n onSelectImage,\n onSetImageOverlayOffsetY,\n onSetImageOverlayOpacity,\n onToggleImageOverlayLocked,\n onToggleImageOverlayMode,\n onToggleImageOverlayVisible,\n onUpdateImage,\n}: FigmaImagesPanelProps) => {\n const [figmaUrlDraft, setFigmaUrlDraft] = useState('');\n const [editingImageId, setEditingImageId] = useState<string | null>(null);\n const [editingLabelDraft, setEditingLabelDraft] = useState('');\n const [draggingImageId, setDraggingImageId] = useState<string | null>(null);\n const [dragOverImageId, setDragOverImageId] = useState<string | null>(null);\n const [previewImageId, setPreviewImageId] = useState<string | null>(null);\n const pointerDragImageIdRef = useRef<string | null>(null);\n const pointerDragTargetIdRef = useRef<string | null>(null);\n const pointerDragStartRef = useRef<{ x: number; y: number } | null>(null);\n const pointerDragDidMoveRef = useRef(false);\n const opacityDragPointerIdRef = useRef<number | null>(null);\n const labelEditCancelRef = useRef(false);\n const labelInputFocusedImageIdRef = useRef<string | null>(null);\n const labelEditFinishedImageIdRef = useRef<string | null>(null);\n const [offsetYDraftByImageId, setOffsetYDraftByImageId] = useState<\n Record<string, string>\n >({});\n const selectedImageIndex = selectedImageId\n ? images.findIndex((image) => image.id === selectedImageId)\n : -1;\n const selectedImage =\n selectedImageIndex >= 0 ? images[selectedImageIndex] : null;\n const previewImage = previewImageId\n ? images.find((image) => image.id === previewImageId) ?? null\n : null;\n const selectedImageLabel = selectedImage\n ? getFigmaImageLabel(selectedImage, selectedImageIndex)\n : 'Select layer';\n const selectedOverlayState = selectedImage\n ? imageOverlayStates[selectedImage.id] ?? DEFAULT_FIGMA_IMAGE_LAYER_STATE\n : DEFAULT_FIGMA_IMAGE_LAYER_STATE;\n const selectedOpacityPercent = selectedImage\n ? getSnappedOpacityPercent(selectedOverlayState.opacity)\n : 0;\n const selectedOpacityThumbOffset =\n FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS *\n (1 - (selectedOpacityPercent / 100) * 2);\n const selectedOffsetYDraft = selectedImage\n ? offsetYDraftByImageId[selectedImage.id] ??\n String(selectedOverlayState.offsetY)\n : '';\n const statusText = error\n ? error\n : '';\n const progressText = isMutating ? 'Saving...' : isLoading ? 'Loading...' : '';\n const draggingImageIndex = draggingImageId\n ? images.findIndex((image) => image.id === draggingImageId)\n : -1;\n const finishEditingImageLabel = (\n imageId: string,\n currentLabel: string\n ) => {\n if (labelEditFinishedImageIdRef.current === imageId) return;\n\n labelEditFinishedImageIdRef.current = imageId;\n labelInputFocusedImageIdRef.current = null;\n const nextLabel = editingLabelDraft;\n setEditingImageId(null);\n setEditingLabelDraft('');\n if (nextLabel === currentLabel) return;\n\n void onUpdateImage(imageId, {\n label: nextLabel,\n });\n };\n const updateSelectedImageOpacity = (value: string) => {\n if (!selectedImage) return;\n const opacityPercent = Math.max(\n 0,\n Math.min(100, Math.round(Number(value) / 10) * 10)\n );\n if (Number.isFinite(opacityPercent)) {\n onSetImageOverlayOpacity(selectedImage.id, opacityPercent / 100);\n }\n };\n const updateSelectedImageOpacityFromClientX = (\n clientX: number,\n sliderElement: HTMLDivElement\n ) => {\n if (!selectedImage) return;\n\n const rect = sliderElement.getBoundingClientRect();\n if (rect.width <= 0) return;\n\n const trackStart = rect.left + FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS;\n const trackWidth = Math.max(\n 1,\n rect.width - FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS * 2\n );\n const endpointInset = FIGMA_IMAGE_OPACITY_SLIDER_THUMB_RADIUS * 2;\n const rawPercent = ((clientX - trackStart) / trackWidth) * 100;\n let opacityPercent = Math.max(\n 0,\n Math.min(100, Math.round(rawPercent / 10) * 10)\n );\n if (clientX <= rect.left + endpointInset) {\n opacityPercent = 0;\n } else if (clientX >= rect.right - endpointInset) {\n opacityPercent = 100;\n }\n onSetImageOverlayOpacity(selectedImage.id, opacityPercent / 100);\n };\n const updateSelectedImageOpacityFromPointer = (\n event: PointerEvent<HTMLDivElement>\n ) => {\n updateSelectedImageOpacityFromClientX(event.clientX, event.currentTarget);\n };\n const updateSelectedImageOpacityFromMouse = (\n event: MouseEvent<HTMLDivElement>\n ) => {\n updateSelectedImageOpacityFromClientX(event.clientX, event.currentTarget);\n };\n\n return (\n <aside\n className=\"df-review-figma-images-panel\"\n aria-hidden={!isListVisible}\n onPointerDownCapture={(event) => {\n if (\n !editingImageId ||\n (event.target instanceof Element &&\n event.target.closest('.df-review-figma-image-label-input'))\n ) {\n return;\n }\n\n const editingImage = images.find((image) => image.id === editingImageId);\n if (!editingImage) return;\n finishEditingImageLabel(editingImage.id, editingImage.label ?? '');\n }}\n >\n <form\n className=\"df-review-figma-image-form\"\n onSubmit={(event) => {\n event.preventDefault();\n void onAddImage(figmaUrlDraft).then((image) => {\n if (!image) return;\n setFigmaUrlDraft('');\n });\n }}\n >\n <div className=\"df-review-figma-images-header\">\n <div className=\"df-review-figma-images-title\">\n <strong>Figma</strong>\n </div>\n <button\n aria-label=\"Refresh Figma images\"\n className=\"df-review-figma-image-header-button\"\n disabled={isLoading || isMutating}\n title=\"Refresh\"\n type=\"button\"\n onClick={() => void onRefreshImages()}\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-figma-image-url-row\">\n <input\n aria-label=\"Figma URL\"\n autoComplete=\"off\"\n placeholder=\"Figma URL\"\n required\n spellCheck={false}\n value={figmaUrlDraft}\n onChange={(event) => setFigmaUrlDraft(event.currentTarget.value)}\n />\n <button\n aria-label=\"Add Figma image\"\n disabled={isMutating || figmaUrlDraft.trim().length === 0}\n type=\"submit\"\n >\n <PlusIcon aria-hidden=\"true\" />\n </button>\n </div>\n </form>\n\n <div\n aria-label=\"Selected Figma image layer controls\"\n className=\"df-review-figma-image-selected-controls\"\n >\n <div className=\"df-review-figma-image-selected-numbers\">\n <label className=\"df-review-figma-image-opacity-control\">\n <span>Opacity</span>\n <div\n className=\"df-review-figma-image-opacity-slider\"\n style={{\n '--df-review-figma-opacity-value': `${selectedOpacityPercent}%`,\n '--df-review-figma-opacity-left': `calc(${selectedOpacityPercent}% + ${selectedOpacityThumbOffset}px)`,\n } as CSSProperties}\n onPointerCancel={() => {\n opacityDragPointerIdRef.current = null;\n }}\n onPointerDown={(event) => {\n if (!selectedImage) return;\n\n opacityDragPointerIdRef.current = event.pointerId;\n event.currentTarget.setPointerCapture(event.pointerId);\n event.currentTarget.querySelector('input')?.focus();\n updateSelectedImageOpacityFromPointer(event);\n }}\n onPointerMove={(event) => {\n if (opacityDragPointerIdRef.current !== event.pointerId) return;\n\n updateSelectedImageOpacityFromPointer(event);\n }}\n onPointerUp={(event) => {\n if (opacityDragPointerIdRef.current !== event.pointerId) return;\n\n updateSelectedImageOpacityFromPointer(event);\n opacityDragPointerIdRef.current = null;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n }}\n onMouseDown={updateSelectedImageOpacityFromMouse}\n onMouseMove={(event) => {\n if (event.buttons !== 1) return;\n\n updateSelectedImageOpacityFromMouse(event);\n }}\n onMouseUp={updateSelectedImageOpacityFromMouse}\n onClick={updateSelectedImageOpacityFromMouse}\n >\n <input\n aria-label={`${selectedImageLabel} overlay opacity`}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={selectedOpacityPercent}\n disabled={!selectedImage}\n max=\"100\"\n min=\"0\"\n step=\"10\"\n type=\"range\"\n value={selectedOpacityPercent}\n onChange={(event) =>\n updateSelectedImageOpacity(event.currentTarget.value)\n }\n onInput={(event) =>\n updateSelectedImageOpacity(event.currentTarget.value)\n }\n />\n </div>\n <strong>{selectedOpacityPercent}</strong>\n </label>\n <label className=\"df-review-figma-image-number-control\">\n <OffsetYIcon aria-hidden=\"true\" />\n <input\n aria-label={`${selectedImageLabel} overlay Y offset`}\n disabled={!selectedImage}\n inputMode=\"numeric\"\n step=\"1\"\n type=\"number\"\n value={selectedOffsetYDraft}\n onBlur={() => {\n if (!selectedImage) return;\n setOffsetYDraftByImageId((currentDrafts) => {\n const nextDrafts = { ...currentDrafts };\n delete nextDrafts[selectedImage.id];\n return nextDrafts;\n });\n }}\n onChange={(event) => {\n if (!selectedImage) return;\n const value = event.currentTarget.value;\n const offsetY = Number(value);\n setOffsetYDraftByImageId((currentDrafts) => ({\n ...currentDrafts,\n [selectedImage.id]: value,\n }));\n if (value.trim() !== '' && Number.isFinite(offsetY)) {\n onSetImageOverlayOffsetY(selectedImage.id, offsetY);\n }\n }}\n />\n </label>\n {selectedImage ? (\n <button\n aria-label={`Preview ${selectedImageLabel} Figma image`}\n className=\"df-review-figma-image-selected-link\"\n title=\"Preview Figma image\"\n type=\"button\"\n onClick={() => setPreviewImageId(selectedImage.id)}\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </button>\n ) : (\n <button\n aria-label=\"Open Figma node\"\n className=\"df-review-figma-image-selected-link\"\n disabled\n title=\"Open Figma node\"\n type=\"button\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n\n {statusText && (\n <p\n className={`df-review-figma-image-status${\n error ? ' is-error' : ''\n }`}\n >\n {statusText}\n </p>\n )}\n\n <div className=\"df-review-figma-image-list\">\n {progressText && (\n <div\n aria-live=\"polite\"\n className=\"df-review-figma-image-card is-status\"\n role=\"status\"\n >\n <ReviewSpinner className=\"df-review-figma-image-spinner\" />\n <div className=\"df-review-figma-image-card-main\">\n <strong>{progressText}</strong>\n </div>\n </div>\n )}\n {images.length === 0 && !isLoading && !isMutating && (\n <p className=\"df-review-empty\">No Figma images on this viewport.</p>\n )}\n {images.map((image, index) => {\n const imageLabel = getFigmaImageLabel(image, index);\n const overlayState =\n imageOverlayStates[image.id] ?? DEFAULT_FIGMA_IMAGE_LAYER_STATE;\n const isDragging = draggingImageId === image.id;\n const isDropTarget =\n dragOverImageId === image.id && draggingImageId !== image.id;\n const isDropBefore = isDropTarget && draggingImageIndex > index;\n const isDropAfter =\n isDropTarget && draggingImageIndex >= 0 && draggingImageIndex < index;\n\n return (\n <article\n data-figma-image-id={image.id}\n className={`df-review-figma-image-card${\n image.id === selectedImageId ? ' is-active' : ''\n }${editingImageId === image.id ? ' is-editing' : ''}${\n isDragging ? ' is-dragging' : ''\n }${isDropTarget ? ' is-drop-target' : ''}${\n isDropBefore ? ' is-drop-before' : ''\n }${isDropAfter ? ' is-drop-after' : ''}`}\n key={image.id}\n onClick={() => {\n if (pointerDragDidMoveRef.current) {\n pointerDragDidMoveRef.current = false;\n return;\n }\n onSelectImage(image.id);\n }}\n onPointerCancel={() => {\n pointerDragImageIdRef.current = null;\n pointerDragTargetIdRef.current = null;\n pointerDragStartRef.current = null;\n setDraggingImageId(null);\n setDragOverImageId(null);\n }}\n onPointerDown={(event: PointerEvent<HTMLElement>) => {\n if (\n event.button !== 0 ||\n isMutating ||\n editingImageId === image.id ||\n isInteractiveFigmaImageTarget(event.target)\n ) {\n return;\n }\n\n pointerDragImageIdRef.current = image.id;\n pointerDragTargetIdRef.current = null;\n pointerDragStartRef.current = {\n x: event.clientX,\n y: event.clientY,\n };\n pointerDragDidMoveRef.current = false;\n event.currentTarget.setPointerCapture(event.pointerId);\n }}\n onPointerMove={(event) => {\n const sourceImageId = pointerDragImageIdRef.current;\n const dragStart = pointerDragStartRef.current;\n if (!sourceImageId || !dragStart) return;\n\n const hasMoved =\n Math.abs(event.clientX - dragStart.x) +\n Math.abs(event.clientY - dragStart.y) >\n 6;\n if (!hasMoved) return;\n\n pointerDragDidMoveRef.current = true;\n setDraggingImageId(sourceImageId);\n const targetImageId = getPointerFigmaImageTargetId(event);\n pointerDragTargetIdRef.current =\n targetImageId && targetImageId !== sourceImageId\n ? targetImageId\n : null;\n setDragOverImageId(pointerDragTargetIdRef.current);\n }}\n onPointerUp={(event) => {\n const sourceImageId = pointerDragImageIdRef.current;\n const targetImageId = pointerDragTargetIdRef.current;\n pointerDragImageIdRef.current = null;\n pointerDragTargetIdRef.current = null;\n pointerDragStartRef.current = null;\n setDraggingImageId(null);\n setDragOverImageId(null);\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n if (\n !sourceImageId ||\n !targetImageId ||\n sourceImageId === targetImageId\n ) {\n return;\n }\n\n const nextImageIds = getReorderedFigmaImageIds(\n images,\n sourceImageId,\n targetImageId\n );\n void onReorderImages(nextImageIds);\n }}\n >\n <FigmaImageLayerStateButtons\n imageLabel={imageLabel}\n overlayState={overlayState}\n title={getFigmaImageLayerStatusLabel(overlayState)}\n onSelect={() => onSelectImage(image.id)}\n onToggleLocked={() => onToggleImageOverlayLocked(image.id)}\n onToggleMode={() => onToggleImageOverlayMode(image.id)}\n onToggleVisible={() => onToggleImageOverlayVisible(image.id)}\n />\n <div className=\"df-review-figma-image-card-main\">\n {editingImageId === image.id ? (\n <input\n aria-label=\"Selected Figma image label\"\n autoComplete=\"off\"\n autoFocus\n className=\"df-review-figma-image-label-input\"\n disabled={isMutating}\n placeholder=\"Label\"\n ref={(element) => {\n if (\n !element ||\n labelInputFocusedImageIdRef.current === image.id\n ) {\n return;\n }\n\n labelInputFocusedImageIdRef.current = image.id;\n element.focus();\n element.select();\n }}\n spellCheck={false}\n value={editingLabelDraft}\n onBlur={() => {\n if (labelEditCancelRef.current) {\n labelEditCancelRef.current = false;\n labelInputFocusedImageIdRef.current = null;\n labelEditFinishedImageIdRef.current = image.id;\n setEditingImageId(null);\n setEditingLabelDraft('');\n return;\n }\n\n finishEditingImageLabel(image.id, image.label ?? '');\n }}\n onChange={(event) =>\n setEditingLabelDraft(event.currentTarget.value)\n }\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.currentTarget.blur();\n return;\n }\n\n if (event.key === 'Escape') {\n labelEditCancelRef.current = true;\n event.currentTarget.blur();\n }\n }}\n />\n ) : (\n <strong>{imageLabel}</strong>\n )}\n <small>{formatFigmaImageDate(image.updatedAt)}</small>\n </div>\n <div className=\"df-review-figma-image-card-actions\">\n <button\n aria-label={`Edit ${imageLabel} label`}\n className=\"df-review-figma-image-icon-button\"\n disabled={isMutating}\n title=\"Edit label\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onSelectImage(image.id);\n labelEditCancelRef.current = false;\n labelInputFocusedImageIdRef.current = null;\n labelEditFinishedImageIdRef.current = null;\n setEditingImageId(image.id);\n setEditingLabelDraft(image.label ?? '');\n }}\n >\n <PencilIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Delete Figma image\"\n className=\"df-review-figma-image-icon-button is-danger\"\n disabled={isMutating}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n void onDeleteImage(image.id);\n }}\n >\n <TrashIcon aria-hidden=\"true\" />\n </button>\n </div>\n </article>\n );\n })}\n </div>\n {previewImage && (\n <FigmaImagePreviewModal\n image={previewImage}\n label={getFigmaImageLabel(previewImage, images.indexOf(previewImage))}\n onClose={() => setPreviewImageId(null)}\n />\n )}\n </aside>\n );\n};\n\ninterface FigmaImagePreviewModalProps {\n image: ReviewFigmaImage;\n label: string;\n onClose: () => void;\n}\n\nconst FigmaImagePreviewModal = ({\n image,\n label,\n onClose,\n}: FigmaImagePreviewModalProps) => {\n return (\n <div\n aria-label={`${label} Figma image preview`}\n aria-modal=\"true\"\n className=\"df-review-prompt-modal\"\n role=\"dialog\"\n >\n <button\n aria-label=\"Close Figma image preview\"\n className=\"df-review-prompt-backdrop\"\n type=\"button\"\n onClick={onClose}\n />\n <div className=\"df-review-prompt-dialog df-review-figma-image-preview-dialog\">\n <div className=\"df-review-figma-image-preview-header\">\n <input\n aria-label=\"Figma URL\"\n readOnly\n spellCheck={false}\n value={image.figmaUrl}\n />\n <a\n aria-label={`Open ${label} Figma node`}\n className=\"df-review-figma-image-preview-link\"\n href={image.figmaUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span>Open Figma</span>\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n <button\n aria-label=\"Close Figma image preview\"\n className=\"df-review-figma-image-preview-close\"\n type=\"button\"\n onClick={onClose}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n </div>\n <div className=\"df-review-figma-image-preview-scroll\">\n <img alt={label} src={image.imageUrl} />\n </div>\n </div>\n </div>\n );\n};\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type {\n ReviewFigmaImage,\n ReviewFigmaRouteTarget,\n} from '../../figma/image.types';\nimport { createReviewFigmaImageTargetKey } from './image.controller';\n\nexport const DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY = 0.48;\nconst REVIEW_FIGMA_IMAGE_OVERLAY_STORAGE_KEY_PREFIX =\n 'df-review-figma-image-overlay-state:';\nconst REVIEW_FIGMA_IMAGE_OVERLAY_STORAGE_VERSION = 2;\nconst DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_MODE = 'normal';\n\nexport type ReviewFigmaImageOverlayMode = 'normal' | 'invert';\n\nexport type ReviewFigmaImageOverlayItemState = {\n isVisible: boolean;\n opacity: number;\n isLocked: boolean;\n mode: ReviewFigmaImageOverlayMode;\n offsetY: number;\n};\n\nexport type ReviewFigmaImageOverlayState = {\n selectedImageId: string | null;\n imageStates: Record<string, ReviewFigmaImageOverlayItemState>;\n lastVisibleImageIds: string[];\n};\n\ntype StoredReviewFigmaImageOverlayState = Partial<\n ReviewFigmaImageOverlayState & ReviewFigmaImageOverlayItemState\n> & {\n version?: number;\n};\n\ninterface UseReviewFigmaImageOverlayControllerOptions {\n images: ReviewFigmaImage[];\n isLoading: boolean;\n target: ReviewFigmaRouteTarget;\n}\n\ntype ReviewFigmaImageOverlayStateContainer = {\n state: ReviewFigmaImageOverlayState;\n storageKey: string;\n};\n\nexport const useReviewFigmaImageOverlayController = ({\n images,\n isLoading,\n target,\n}: UseReviewFigmaImageOverlayControllerOptions) => {\n const storageKey = useMemo(\n () => createReviewFigmaImageOverlayStorageKey(target),\n [target]\n );\n const [stateContainer, setStateContainer] =\n useState<ReviewFigmaImageOverlayStateContainer>(() => ({\n state: readStoredReviewFigmaImageOverlayState(storageKey),\n storageKey,\n }));\n const state =\n stateContainer.storageKey === storageKey\n ? stateContainer.state\n : DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n const updateState = useCallback(\n (\n updater: (\n currentState: ReviewFigmaImageOverlayState\n ) => ReviewFigmaImageOverlayState\n ) => {\n setStateContainer((currentContainer) => {\n const currentState =\n currentContainer.storageKey === storageKey\n ? currentContainer.state\n : readStoredReviewFigmaImageOverlayState(storageKey);\n\n return {\n state: updater(currentState),\n storageKey,\n };\n });\n },\n [storageKey]\n );\n\n useEffect(() => {\n setStateContainer({\n state: readStoredReviewFigmaImageOverlayState(storageKey),\n storageKey,\n });\n }, [storageKey]);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleStorage = (event: StorageEvent) => {\n if (\n event.storageArea !== window.localStorage ||\n (event.key !== storageKey && event.key !== null)\n ) {\n return;\n }\n\n setStateContainer({\n state: readStoredReviewFigmaImageOverlayState(storageKey),\n storageKey,\n });\n };\n\n window.addEventListener('storage', handleStorage);\n return () => window.removeEventListener('storage', handleStorage);\n }, [storageKey]);\n\n useEffect(() => {\n if (isLoading) return;\n\n updateState((currentState) => {\n const nextImageIds = new Set(images.map((image) => image.id));\n const selectedImageId =\n currentState.selectedImageId &&\n nextImageIds.has(currentState.selectedImageId)\n ? currentState.selectedImageId\n : images[0]?.id ?? null;\n const imageStates = Object.fromEntries(\n Object.entries(currentState.imageStates).filter(([imageId]) =>\n nextImageIds.has(imageId)\n )\n );\n const lastVisibleImageIds = currentState.lastVisibleImageIds.filter(\n (imageId) => nextImageIds.has(imageId)\n );\n\n if (\n selectedImageId === currentState.selectedImageId &&\n imageStates === currentState.imageStates &&\n lastVisibleImageIds.length === currentState.lastVisibleImageIds.length\n ) {\n return currentState;\n }\n\n return {\n ...currentState,\n selectedImageId,\n imageStates,\n lastVisibleImageIds,\n };\n });\n }, [images, isLoading, updateState]);\n\n useEffect(() => {\n if (stateContainer.storageKey !== storageKey) return;\n writeStoredReviewFigmaImageOverlayState(storageKey, stateContainer.state);\n }, [stateContainer, storageKey]);\n\n const selectedImage = useMemo(\n () => images.find((image) => image.id === state.selectedImageId) ?? null,\n [images, state.selectedImageId]\n );\n const selectedImageOverlayState = getReviewFigmaImageOverlayItemState(\n state,\n state.selectedImageId\n );\n const imageOverlayStates = useMemo(\n () =>\n Object.fromEntries(\n images.map((image) => [\n image.id,\n getReviewFigmaImageOverlayItemState(state, image.id),\n ])\n ),\n [images, state]\n );\n const isAnyImageOverlayVisible = useMemo(\n () =>\n images.some(\n (image) => imageOverlayStates[image.id]?.isVisible === true\n ),\n [imageOverlayStates, images]\n );\n\n const setSelectedImageId = useCallback((selectedImageId: string | null) => {\n updateState((currentState) => ({\n ...currentState,\n selectedImageId,\n }));\n }, [updateState]);\n\n const updateImageOverlayState = useCallback(\n (\n imageId: string,\n updater: (\n itemState: ReviewFigmaImageOverlayItemState\n ) => ReviewFigmaImageOverlayItemState\n ) => {\n updateState((currentState) => ({\n ...currentState,\n selectedImageId: imageId,\n imageStates: updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n imageId,\n updater\n ),\n }));\n },\n [updateState]\n );\n\n const showImage = useCallback((selectedImageId: string) => {\n updateState((currentState) => ({\n ...currentState,\n selectedImageId,\n imageStates: updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n selectedImageId,\n (itemState) => ({\n ...itemState,\n isVisible: true,\n })\n ),\n }));\n }, [updateState]);\n\n const toggleImageOverlayVisible = useCallback(\n (imageId: string) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n isVisible: !itemState.isVisible,\n }));\n },\n [updateImageOverlayState]\n );\n\n const toggleAllImageOverlayVisible = useCallback(() => {\n updateState((currentState) => {\n if (images.length === 0) return currentState;\n\n const imageIds = images.map((image) => image.id);\n const imageIdSet = new Set(imageIds);\n const visibleImageIds = imageIds.filter(\n (imageId) =>\n getReviewFigmaImageOverlayItemState(currentState, imageId).isVisible\n );\n let imageStates = currentState.imageStates;\n\n if (visibleImageIds.length > 0) {\n imageIds.forEach((imageId) => {\n imageStates = updateReviewFigmaImageOverlayItemState(\n imageStates,\n imageId,\n (itemState) => ({\n ...itemState,\n isVisible: false,\n })\n );\n });\n\n return {\n ...currentState,\n imageStates,\n lastVisibleImageIds: visibleImageIds,\n };\n }\n\n const restoreImageIds = currentState.lastVisibleImageIds.filter(\n (imageId) => imageIdSet.has(imageId)\n );\n const fallbackImageId =\n currentState.selectedImageId && imageIdSet.has(currentState.selectedImageId)\n ? currentState.selectedImageId\n : images[0]?.id ?? null;\n const nextVisibleImageIds =\n restoreImageIds.length > 0\n ? restoreImageIds\n : fallbackImageId\n ? [fallbackImageId]\n : [];\n const nextVisibleImageIdSet = new Set(nextVisibleImageIds);\n\n imageIds.forEach((imageId) => {\n imageStates = updateReviewFigmaImageOverlayItemState(\n imageStates,\n imageId,\n (itemState) => ({\n ...itemState,\n isVisible: nextVisibleImageIdSet.has(imageId),\n })\n );\n });\n\n return {\n ...currentState,\n selectedImageId:\n currentState.selectedImageId ?? nextVisibleImageIds[0] ?? null,\n imageStates,\n lastVisibleImageIds: nextVisibleImageIds,\n };\n });\n }, [images, updateState]);\n\n const setImageOverlayOpacity = useCallback(\n (imageId: string, opacity: number) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n opacity: clampReviewFigmaImageOverlayOpacity(opacity),\n }));\n },\n [updateImageOverlayState]\n );\n\n const toggleImageOverlayLocked = useCallback(\n (imageId: string) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n isLocked: !itemState.isLocked,\n }));\n },\n [updateImageOverlayState]\n );\n\n const toggleImageOverlayMode = useCallback(\n (imageId: string) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n mode: itemState.mode === 'invert' ? 'normal' : 'invert',\n }));\n },\n [updateImageOverlayState]\n );\n\n const setImageOverlayOffsetY = useCallback(\n (imageId: string, offsetY: number) => {\n updateImageOverlayState(imageId, (itemState) => ({\n ...itemState,\n offsetY: normalizeReviewFigmaImageOverlayOffsetY(offsetY),\n }));\n },\n [updateImageOverlayState]\n );\n\n const toggleOverlayVisible = useCallback(() => {\n updateState((currentState) => {\n if (!currentState.selectedImageId && images[0]) {\n return {\n ...currentState,\n selectedImageId: images[0].id,\n imageStates: updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n images[0].id,\n (itemState) => ({\n ...itemState,\n isVisible: true,\n })\n ),\n };\n }\n\n if (!currentState.selectedImageId) return currentState;\n\n return {\n ...currentState,\n imageStates: updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n currentState.selectedImageId,\n (itemState) => ({\n ...itemState,\n isVisible: !itemState.isVisible,\n })\n ),\n };\n });\n }, [images, updateState]);\n\n const setOverlayOpacity = useCallback((opacity: number) => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n opacity: clampReviewFigmaImageOverlayOpacity(opacity),\n })\n ),\n }));\n }, [updateState]);\n\n const setOverlayLocked = useCallback((isLocked: boolean) => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n isLocked,\n })\n ),\n }));\n }, [updateState]);\n\n const toggleOverlayLocked = useCallback(() => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n isLocked: !itemState.isLocked,\n })\n ),\n }));\n }, [updateState]);\n\n const setOverlayMode = useCallback((mode: ReviewFigmaImageOverlayMode) => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n mode: normalizeReviewFigmaImageOverlayMode(mode),\n })\n ),\n }));\n }, [updateState]);\n\n const toggleOverlayMode = useCallback(() => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n mode: itemState.mode === 'invert' ? 'normal' : 'invert',\n })\n ),\n }));\n }, [updateState]);\n\n const setOverlayOffsetY = useCallback((offsetY: number) => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: updateSelectedReviewFigmaImageOverlayItemState(\n currentState,\n (itemState) => ({\n ...itemState,\n offsetY: normalizeReviewFigmaImageOverlayOffsetY(offsetY),\n })\n ),\n }));\n }, [updateState]);\n\n const resetOverlay = useCallback(() => {\n updateState((currentState) => ({\n ...currentState,\n imageStates: currentState.selectedImageId\n ? updateReviewFigmaImageOverlayItemState(\n currentState.imageStates,\n currentState.selectedImageId,\n () => DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE\n )\n : currentState.imageStates,\n }));\n }, [updateState]);\n\n return {\n imageOverlayStates,\n isAnyImageOverlayVisible,\n isOverlayVisible: selectedImageOverlayState.isVisible,\n overlayMode: selectedImageOverlayState.mode,\n overlayOffsetY: selectedImageOverlayState.offsetY,\n overlayOpacity: selectedImageOverlayState.opacity,\n isOverlayLocked: selectedImageOverlayState.isLocked,\n resetOverlay,\n selectedImage,\n selectedImageId: state.selectedImageId,\n setOverlayLocked,\n setOverlayMode,\n setOverlayOffsetY,\n setOverlayOpacity,\n setSelectedImageId,\n showImage,\n state,\n target,\n toggleImageOverlayLocked,\n toggleImageOverlayMode,\n toggleImageOverlayVisible,\n toggleAllImageOverlayVisible,\n setImageOverlayOffsetY,\n setImageOverlayOpacity,\n toggleOverlayLocked,\n toggleOverlayMode,\n toggleOverlayVisible,\n };\n};\n\nfunction createReviewFigmaImageOverlayStorageKey(\n target: ReviewFigmaRouteTarget\n) {\n return `${REVIEW_FIGMA_IMAGE_OVERLAY_STORAGE_KEY_PREFIX}${createReviewFigmaImageTargetKey(target)}`;\n}\n\nfunction readStoredReviewFigmaImageOverlayState(storageKey: string) {\n if (typeof window === 'undefined') {\n return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n }\n\n try {\n const value = window.localStorage.getItem(storageKey);\n if (!value) return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n\n return normalizeReviewFigmaImageOverlayState(JSON.parse(value));\n } catch {\n return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n }\n}\n\nfunction writeStoredReviewFigmaImageOverlayState(\n storageKey: string,\n state: ReviewFigmaImageOverlayState\n) {\n if (typeof window === 'undefined') return;\n if (isDefaultReviewFigmaImageOverlayState(state)) {\n try {\n window.localStorage.removeItem(storageKey);\n } catch {\n return;\n }\n return;\n }\n\n try {\n window.localStorage.setItem(\n storageKey,\n JSON.stringify({\n version: REVIEW_FIGMA_IMAGE_OVERLAY_STORAGE_VERSION,\n ...state,\n } satisfies StoredReviewFigmaImageOverlayState)\n );\n } catch {\n return;\n }\n}\n\nconst DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE: ReviewFigmaImageOverlayState = {\n selectedImageId: null,\n imageStates: {},\n lastVisibleImageIds: [],\n};\n\nconst DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE: ReviewFigmaImageOverlayItemState = {\n isVisible: false,\n opacity: DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY,\n isLocked: false,\n mode: DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_MODE,\n offsetY: 0,\n};\n\nfunction normalizeReviewFigmaImageOverlayState(\n value: unknown\n): ReviewFigmaImageOverlayState {\n if (!value || typeof value !== 'object') {\n return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_STATE;\n }\n\n const state = value as StoredReviewFigmaImageOverlayState;\n const selectedImageId =\n typeof state.selectedImageId === 'string' ? state.selectedImageId : null;\n const lastVisibleImageIds = Array.isArray(state.lastVisibleImageIds)\n ? state.lastVisibleImageIds.filter(\n (imageId): imageId is string => typeof imageId === 'string'\n )\n : [];\n const imageStates = normalizeReviewFigmaImageOverlayItemStateRecord(\n state.imageStates\n );\n if (Object.keys(imageStates).length === 0 && selectedImageId) {\n imageStates[selectedImageId] = normalizeReviewFigmaImageOverlayItemState(\n state\n );\n }\n\n return {\n selectedImageId,\n imageStates,\n lastVisibleImageIds,\n };\n}\n\nfunction normalizeReviewFigmaImageOverlayItemStateRecord(value: unknown) {\n if (!value || typeof value !== 'object') return {};\n\n return Object.fromEntries(\n Object.entries(value).flatMap(([imageId, itemState]) => {\n if (!imageId || typeof itemState !== 'object') return [];\n return [\n [\n imageId,\n normalizeReviewFigmaImageOverlayItemState(\n itemState as Partial<ReviewFigmaImageOverlayItemState>\n ),\n ],\n ];\n })\n );\n}\n\nfunction normalizeReviewFigmaImageOverlayItemState(\n value: Partial<ReviewFigmaImageOverlayItemState>\n): ReviewFigmaImageOverlayItemState {\n return {\n isVisible: value.isVisible === true,\n opacity: clampReviewFigmaImageOverlayOpacity(\n typeof value.opacity === 'number'\n ? value.opacity\n : DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY\n ),\n isLocked: value.isLocked === true,\n mode: normalizeReviewFigmaImageOverlayMode(value.mode),\n offsetY: normalizeReviewFigmaImageOverlayOffsetY(value.offsetY),\n };\n}\n\nfunction normalizeReviewFigmaImageOverlayMode(\n value: unknown\n): ReviewFigmaImageOverlayMode {\n return value === 'invert' ? 'invert' : DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_MODE;\n}\n\nfunction normalizeReviewFigmaImageOverlayOffsetY(value: unknown) {\n if (typeof value !== 'number' || !Number.isFinite(value)) return 0;\n return Math.round(value);\n}\n\nfunction clampReviewFigmaImageOverlayOpacity(value: number) {\n if (!Number.isFinite(value)) return DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction isDefaultReviewFigmaImageOverlayState(\n state: ReviewFigmaImageOverlayState\n) {\n return (\n state.selectedImageId === null &&\n Object.keys(state.imageStates).length === 0 &&\n state.lastVisibleImageIds.length === 0\n );\n}\n\nfunction getReviewFigmaImageOverlayItemState(\n state: ReviewFigmaImageOverlayState,\n imageId: string | null\n) {\n return imageId\n ? (state.imageStates[imageId] ??\n DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE)\n : DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE;\n}\n\nfunction updateSelectedReviewFigmaImageOverlayItemState(\n state: ReviewFigmaImageOverlayState,\n updater: (\n itemState: ReviewFigmaImageOverlayItemState\n ) => ReviewFigmaImageOverlayItemState\n) {\n return state.selectedImageId\n ? updateReviewFigmaImageOverlayItemState(\n state.imageStates,\n state.selectedImageId,\n updater\n )\n : state.imageStates;\n}\n\nfunction updateReviewFigmaImageOverlayItemState(\n imageStates: Record<string, ReviewFigmaImageOverlayItemState>,\n imageId: string,\n updater: (\n itemState: ReviewFigmaImageOverlayItemState\n ) => ReviewFigmaImageOverlayItemState\n) {\n return {\n ...imageStates,\n [imageId]: updater(\n imageStates[imageId] ?? DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_ITEM_STATE\n ),\n };\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n ReviewFigmaImage,\n ReviewFigmaImageFormat,\n ReviewFigmaImageStore,\n ReviewFigmaRouteTarget,\n} from '../../figma/image.types';\nimport {\n DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n} from '../../figma/image.types';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\ninterface CreateReviewFigmaRouteTargetOptions {\n pageUrl: string;\n projectId: string;\n viewport: ReviewShellViewportPreset;\n}\n\ninterface UseReviewFigmaImageStoreControllerOptions {\n imageFormat?: ReviewFigmaImageFormat;\n store: ReviewFigmaImageStore | null;\n target: ReviewFigmaRouteTarget;\n}\n\ntype ReviewFigmaImageListState = {\n images: ReviewFigmaImage[];\n targetKey: string;\n};\n\nexport const createReviewFigmaRouteTarget = ({\n pageUrl,\n projectId,\n viewport,\n}: CreateReviewFigmaRouteTargetOptions): ReviewFigmaRouteTarget => ({\n type: 'route',\n projectId,\n pageUrl,\n viewport: {\n label: viewport.label,\n width: viewport.width,\n height: viewport.height,\n scope: getViewportPresetKind(viewport),\n },\n});\n\nexport const useReviewFigmaImageStoreController = ({\n imageFormat = DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n store,\n target,\n}: UseReviewFigmaImageStoreControllerOptions) => {\n const targetKey = useMemo(\n () => createReviewFigmaImageTargetKey(target),\n [target]\n );\n const requestIdRef = useRef(0);\n const [imageList, setImageList] = useState<ReviewFigmaImageListState>(() => ({\n images: [],\n targetKey,\n }));\n const [isLoading, setIsLoading] = useState(Boolean(store));\n const [isMutating, setIsMutating] = useState(false);\n const [error, setError] = useState('');\n const images = imageList.targetKey === targetKey ? imageList.images : [];\n\n const refreshImages = useCallback(async () => {\n const requestId = requestIdRef.current + 1;\n requestIdRef.current = requestId;\n\n if (!store) {\n setImageList({ images: [], targetKey });\n setIsLoading(false);\n setError('');\n return [];\n }\n\n setIsLoading(true);\n\n try {\n const nextImages = sortReviewFigmaImages(await store.listImages(target));\n if (requestId !== requestIdRef.current) return nextImages;\n\n setImageList({ images: nextImages, targetKey });\n setError('');\n return nextImages;\n } catch (refreshError) {\n if (requestId === requestIdRef.current) {\n setError(getReviewFigmaImageErrorMessage(refreshError));\n }\n return [];\n } finally {\n if (requestId === requestIdRef.current) setIsLoading(false);\n }\n }, [store, target, targetKey]);\n\n useEffect(() => {\n void refreshImages();\n }, [refreshImages]);\n\n const addImage = useCallback(\n async (figmaUrl: string, label?: string) => {\n const trimmedUrl = figmaUrl.trim();\n if (!store || !trimmedUrl) return null;\n\n setIsMutating(true);\n\n try {\n let image = await store.addImage({\n target,\n figmaUrl: trimmedUrl,\n imageFormat,\n label: label?.trim() || undefined,\n order: getNewReviewFigmaImageOrder(images),\n });\n const uniqueLabel = getUniqueReviewFigmaImageLabel(\n getReviewFigmaImageComparableLabel(image),\n images\n );\n if (uniqueLabel !== getReviewFigmaImageComparableLabel(image)) {\n image = await store.updateImage(image.id, { label: uniqueLabel });\n }\n setImageList((currentList) => ({\n images: sortReviewFigmaImages([\n ...(currentList.targetKey === targetKey ? currentList.images : [])\n .filter((currentImage) => currentImage.id !== image.id),\n image,\n ]),\n targetKey,\n }));\n setError('');\n return image;\n } catch (addError) {\n setError(getReviewFigmaImageErrorMessage(addError));\n return null;\n } finally {\n setIsMutating(false);\n }\n },\n [imageFormat, images, store, target, targetKey]\n );\n\n const deleteImage = useCallback(\n async (id: string) => {\n if (!store) return;\n\n const previousImageList = imageList;\n setImageList({\n images: images.filter((image) => image.id !== id),\n targetKey,\n });\n setIsMutating(true);\n\n try {\n await store.deleteImage(id);\n setError('');\n } catch (deleteError) {\n setImageList(previousImageList);\n setError(getReviewFigmaImageErrorMessage(deleteError));\n } finally {\n setIsMutating(false);\n }\n },\n [imageList, images, store, targetKey]\n );\n\n const updateImage = useCallback(\n async (id: string, patch: { label?: string }) => {\n if (!store) return null;\n\n const previousImageList = imageList;\n setIsMutating(true);\n\n try {\n const image = await store.updateImage(id, patch);\n setImageList((currentList) => ({\n images: sortReviewFigmaImages([\n ...(currentList.targetKey === targetKey ? currentList.images : images)\n .filter((currentImage) => currentImage.id !== image.id),\n image,\n ]),\n targetKey,\n }));\n setError('');\n return image;\n } catch (updateError) {\n setImageList(previousImageList);\n setError(getReviewFigmaImageErrorMessage(updateError));\n return null;\n } finally {\n setIsMutating(false);\n }\n },\n [imageList, images, store, targetKey]\n );\n\n const reorderImages = useCallback(\n async (imageIds: string[]) => {\n if (!store) return;\n\n const currentImageIds = images.map((image) => image.id);\n const nextImageIdSet = new Set(imageIds);\n const hasSameIds =\n imageIds.length === currentImageIds.length &&\n nextImageIdSet.size === currentImageIds.length &&\n currentImageIds.every((imageId) => nextImageIdSet.has(imageId));\n const hasSameOrder =\n hasSameIds &&\n imageIds.every((imageId, index) => imageId === currentImageIds[index]);\n if (!hasSameIds || hasSameOrder) return;\n\n const previousImages = images;\n const imageById = new Map(images.map((image) => [image.id, image]));\n const optimisticImages = imageIds.flatMap((imageId, order) => {\n const image = imageById.get(imageId);\n return image ? [{ ...image, order }] : [];\n });\n\n setImageList({ images: optimisticImages, targetKey });\n setIsMutating(true);\n\n try {\n const savedImages = await store.reorderImages({\n target,\n imageIds,\n });\n setImageList({ images: sortReviewFigmaImages(savedImages), targetKey });\n setError('');\n } catch (reorderError) {\n setImageList({ images: previousImages, targetKey });\n setError(getReviewFigmaImageErrorMessage(reorderError));\n } finally {\n setIsMutating(false);\n }\n },\n [images, store, target, targetKey]\n );\n\n const moveImage = useCallback(\n async (id: string, direction: 'up' | 'down') => {\n const currentIndex = images.findIndex((image) => image.id === id);\n const nextIndex = direction === 'up' ? currentIndex - 1 : currentIndex + 1;\n if (currentIndex < 0 || nextIndex < 0 || nextIndex >= images.length) {\n return;\n }\n\n const reorderedImages = [...images];\n const [image] = reorderedImages.splice(currentIndex, 1);\n reorderedImages.splice(nextIndex, 0, image);\n await reorderImages(reorderedImages.map((nextImage) => nextImage.id));\n },\n [images, reorderImages]\n );\n\n return {\n addImage,\n deleteImage,\n error,\n images,\n isLoading: isLoading || imageList.targetKey !== targetKey,\n isMutating,\n moveImage,\n refreshImages,\n reorderImages,\n updateImage,\n };\n};\n\nfunction sortReviewFigmaImages(images: ReviewFigmaImage[]) {\n return [...images].sort((a, b) => {\n if (a.order !== b.order) return a.order - b.order;\n return a.createdAt.localeCompare(b.createdAt);\n });\n}\n\nfunction getNewReviewFigmaImageOrder(images: ReviewFigmaImage[]) {\n return images.length\n ? Math.min(...images.map((image) => image.order)) - 1\n : 0;\n}\n\nexport function createReviewFigmaImageTargetKey(target: ReviewFigmaRouteTarget) {\n return [\n target.projectId,\n target.pageUrl,\n target.viewport?.scope ?? '',\n target.viewport?.label ?? '',\n target.viewport?.width ?? '',\n target.viewport?.height ?? '',\n target.slot ?? '',\n ].join('|');\n}\n\nfunction getReviewFigmaImageComparableLabel(image: ReviewFigmaImage) {\n return image.label?.trim() || image.nodeId;\n}\n\nfunction getUniqueReviewFigmaImageLabel(\n label: string,\n images: readonly ReviewFigmaImage[]\n) {\n const trimmedLabel = label.trim();\n if (!trimmedLabel) return trimmedLabel;\n\n const existingLabels = new Set(\n images.map(getReviewFigmaImageComparableLabel).filter(Boolean)\n );\n if (!existingLabels.has(trimmedLabel)) return trimmedLabel;\n\n for (let index = 2; index < Number.MAX_SAFE_INTEGER; index += 1) {\n const candidate = `${trimmedLabel}-${index}`;\n if (!existingLabels.has(candidate)) return candidate;\n }\n\n return trimmedLabel;\n}\n\nfunction getReviewFigmaImageErrorMessage(error: unknown) {\n return error instanceof Error ? error.message : 'Figma image request failed.';\n}\n","// Pure helpers for the Figma images panel (labels, opacity snapping, reorder,\n// pointer hit-testing, date formatting). Kept out of images.panel.tsx so the\n// component file stays focused on rendering and interaction state.\nimport type { PointerEvent } from 'react';\nimport type { ReviewFigmaImage } from '../../figma/image.types';\nimport type { ReviewFigmaImageOverlayItemState } from './image.overlay.controller';\nimport { DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY } from './image.overlay.controller';\n\nexport const DEFAULT_FIGMA_IMAGE_LAYER_STATE: ReviewFigmaImageOverlayItemState = {\n isLocked: false,\n isVisible: false,\n mode: 'normal',\n offsetY: 0,\n opacity: DEFAULT_REVIEW_FIGMA_IMAGE_OVERLAY_OPACITY,\n};\n\nexport function getFigmaImageLabel(image: ReviewFigmaImage, index: number) {\n return image.label?.trim() || `Image ${index + 1}`;\n}\n\nexport function getSnappedOpacityPercent(opacity: number) {\n const opacityPercent = Math.round(opacity * 100);\n if (!Number.isFinite(opacityPercent)) return 0;\n return Math.max(0, Math.min(100, Math.round(opacityPercent / 10) * 10));\n}\n\nexport function getFigmaImageLayerStatusLabel(\n overlayState: ReviewFigmaImageOverlayItemState\n) {\n return [\n overlayState.isVisible ? 'Visible' : 'Hidden',\n overlayState.mode === 'invert' ? 'Invert' : '',\n overlayState.isLocked ? 'Locked' : '',\n ]\n .filter(Boolean)\n .join(' / ');\n}\n\nexport function getReorderedFigmaImageIds(\n images: ReviewFigmaImage[],\n draggedImageId: string,\n dropTargetImageId: string\n) {\n const currentImageIds = images.map((image) => image.id);\n const draggedIndex = currentImageIds.indexOf(draggedImageId);\n const dropTargetIndex = currentImageIds.indexOf(dropTargetImageId);\n if (draggedIndex < 0 || dropTargetIndex < 0) return currentImageIds;\n\n const nextImageIds = [...currentImageIds];\n const [imageId] = nextImageIds.splice(draggedIndex, 1);\n nextImageIds.splice(dropTargetIndex, 0, imageId);\n return nextImageIds;\n}\n\nexport function isInteractiveFigmaImageTarget(target: EventTarget | null) {\n return (\n target instanceof Element &&\n Boolean(\n target.closest('button, a, input, textarea, select, [contenteditable=\"true\"]')\n )\n );\n}\n\nexport function getPointerFigmaImageTargetId(event: PointerEvent<HTMLElement>) {\n const element = document.elementFromPoint(event.clientX, event.clientY);\n const targetCard = element?.closest<HTMLElement>(\n '.df-review-figma-image-card[data-figma-image-id]'\n );\n return targetCard?.dataset.figmaImageId ?? null;\n}\n\nexport function formatFigmaImageDate(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","import {\n Contrast as InvertIcon,\n Eye as EyeIcon,\n EyeOff as EyeOffIcon,\n Lock as LockIcon,\n Unlock as UnlockIcon,\n} from 'lucide-react';\nimport type { ReviewFigmaImageOverlayItemState } from './image.overlay.controller';\n\ninterface FigmaImageLayerStateButtonsProps {\n imageLabel: string;\n overlayState: ReviewFigmaImageOverlayItemState;\n title?: string;\n onSelect?: () => void;\n onToggleLocked: () => void;\n onToggleMode: () => void;\n onToggleVisible: () => void;\n}\n\nexport const FigmaImageLayerStateButtons = ({\n imageLabel,\n overlayState,\n title,\n onSelect,\n onToggleLocked,\n onToggleMode,\n onToggleVisible,\n}: FigmaImageLayerStateButtonsProps) => {\n const handleAction = (action: () => void) => {\n onSelect?.();\n action();\n };\n\n return (\n <div\n aria-label={`${imageLabel} overlay state`}\n className=\"df-review-figma-image-layer-state\"\n title={title}\n >\n <button\n aria-label={\n overlayState.isVisible\n ? `Hide ${imageLabel} overlay`\n : `Show ${imageLabel} overlay`\n }\n aria-pressed={overlayState.isVisible}\n className={`df-review-figma-image-state-button${\n overlayState.isVisible ? ' is-active' : ''\n }`}\n title={overlayState.isVisible ? 'Hide overlay' : 'Show overlay'}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n handleAction(onToggleVisible);\n }}\n >\n {overlayState.isVisible ? (\n <EyeIcon aria-hidden=\"true\" />\n ) : (\n <EyeOffIcon aria-hidden=\"true\" />\n )}\n </button>\n <button\n aria-label={\n overlayState.isLocked\n ? `Unlock ${imageLabel} overlay`\n : `Lock ${imageLabel} overlay`\n }\n aria-pressed={overlayState.isLocked}\n className={`df-review-figma-image-state-button${\n overlayState.isLocked ? ' is-active' : ''\n }`}\n title={overlayState.isLocked ? 'Unlock' : 'Lock'}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n handleAction(onToggleLocked);\n }}\n >\n {overlayState.isLocked ? (\n <LockIcon aria-hidden=\"true\" />\n ) : (\n <UnlockIcon aria-hidden=\"true\" />\n )}\n </button>\n <button\n aria-label={\n overlayState.mode === 'invert'\n ? `Disable ${imageLabel} invert`\n : `Enable ${imageLabel} invert`\n }\n aria-pressed={overlayState.mode === 'invert'}\n className={`df-review-figma-image-state-button${\n overlayState.mode === 'invert' ? ' is-active' : ''\n }`}\n title=\"Invert\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n handleAction(onToggleMode);\n }}\n >\n <InvertIcon aria-hidden=\"true\" />\n </button>\n </div>\n );\n};\n","type ReviewSpinnerProps = {\n className?: string;\n label?: string;\n};\n\nexport const ReviewSpinner = ({ className, label }: ReviewSpinnerProps) => (\n <span\n aria-hidden={label ? undefined : true}\n aria-label={label}\n className={`df-review-spinner${className ? ` ${className}` : ''}`}\n role={label ? 'status' : undefined}\n />\n);\n","import { useEffect, useState } from 'react';\nimport type { ReviewFieldsConfig, ReviewItem } from '../../types';\n\ninterface QaItemEditModalProps {\n fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n item: ReviewItem;\n onClose: () => void;\n onSave: (\n item: ReviewItem,\n patch: Pick<ReviewItem, 'comment'> & Partial<Pick<ReviewItem, 'title'>>\n ) => Promise<void>;\n}\n\nexport const QaItemEditModal = ({\n fields,\n item,\n onClose,\n onSave,\n}: QaItemEditModalProps) => {\n const [titleDraft, setTitleDraft] = useState(item.title ?? '');\n const [commentDraft, setCommentDraft] = useState(item.comment);\n const [error, setError] = useState('');\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setTitleDraft(item.title ?? '');\n setCommentDraft(item.comment);\n setError('');\n setIsSaving(false);\n }, [item.id, item.title, item.comment]);\n\n const saveDetails = async () => {\n const nextTitle = titleDraft.trim();\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, {\n ...(fields.title ? { title: nextTitle || undefined } : {}),\n comment: nextComment,\n });\n } catch (error) {\n setError(\n error instanceof Error ? error.message : 'Failed to update QA.'\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 saveDetails();\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</strong>\n <span>\n {fields.title\n ? 'Update the title and comment.'\n : 'Update the comment.'}\n </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 {fields.title && (\n <label className=\"df-review-settings-field\">\n <span>Title</span>\n <div className=\"df-review-settings-text-input\">\n <input\n autoFocus\n value={titleDraft}\n onChange={(event) => {\n setTitleDraft(event.target.value);\n if (error) setError('');\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onClose();\n }\n }}\n />\n </div>\n </label>\n )}\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={!fields.title}\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 saveDetails();\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 && (\n <span className=\"df-review-spinner\" aria-hidden=\"true\" />\n )}\n {isSaving ? 'Saving...' : 'Save'}\n </button>\n </footer>\n </div>\n </form>\n </div>\n );\n};\n","import type { ReviewItem } from '../../types';\nimport type { ReviewShellAssigneeOption } from '../types';\n\ninterface QaItemAssigneeActionsProps {\n assigneeOptions: readonly ReviewShellAssigneeOption[];\n assigneeTitle: string;\n canUpdateAssignee: boolean;\n isDisabled?: boolean;\n item: ReviewItem;\n onChangeItemAssignee: (\n item: ReviewItem,\n assigneeId: string | null\n ) => Promise<void>;\n}\n\nconst getAssigneeLabel = (\n item: ReviewItem,\n assigneeOptions: readonly ReviewShellAssigneeOption[]\n) =>\n item.assigneeName ||\n assigneeOptions.find(\n (assigneeOption) => assigneeOption.value === item.assigneeId\n )?.label ||\n item.assigneeId ||\n '';\n\nexport const QaItemAssigneeActions = ({\n assigneeOptions,\n assigneeTitle,\n canUpdateAssignee,\n isDisabled = false,\n item,\n onChangeItemAssignee,\n}: QaItemAssigneeActionsProps) => {\n const assigneeId = item.assigneeId ?? '';\n const currentLabel = getAssigneeLabel(item, assigneeOptions);\n const hasUnknownAssignee =\n Boolean(assigneeId) &&\n !assigneeOptions.some(\n (assigneeOption) => assigneeOption.value === assigneeId\n );\n\n if (!canUpdateAssignee && !currentLabel) return null;\n\n return (\n <div\n className=\"df-review-item-assignee-actions\"\n onClick={(event) => event.stopPropagation()}\n >\n {canUpdateAssignee ? (\n <select\n aria-label={`QA ${assigneeTitle}`}\n className=\"df-review-item-assignee-select\"\n disabled={isDisabled}\n value={assigneeId}\n onChange={(event) =>\n void onChangeItemAssignee(item, event.currentTarget.value || null)\n }\n >\n <option value=\"\">{assigneeTitle}</option>\n {hasUnknownAssignee && (\n <option value={assigneeId}>{currentLabel}</option>\n )}\n {assigneeOptions.map((assigneeOption) => (\n <option key={assigneeOption.value} value={assigneeOption.value}>\n {assigneeOption.label}\n </option>\n ))}\n </select>\n ) : (\n <span className=\"df-review-item-assignee-badge\">{currentLabel}</span>\n )}\n </div>\n );\n};\n","import {\n Copy as CopyIcon,\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 isRemoteIssueCopied: boolean;\n numberedItem: NumberedReviewItem;\n remoteAdapterEntry: NormalizedReviewShellAdapter | null;\n onCopyRemoteIssuePath: (item: ReviewItem) => Promise<void>;\n onSubmitItem: (numberedItem: NumberedReviewItem) => Promise<void>;\n}\n\nexport const QaItemRemoteActions = ({\n isRemoteSource,\n isSubmitted,\n isSubmitting,\n item,\n isRemoteIssueCopied,\n numberedItem,\n remoteAdapterEntry,\n onCopyRemoteIssuePath,\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 <>\n <button\n aria-label={\n isRemoteIssueCopied\n ? 'Copied remote QA path'\n : 'Copy remote QA path'\n }\n className={`df-review-item-action-button df-review-item-remote-copy${\n isRemoteIssueCopied ? ' is-copied' : ''\n }`}\n title={\n isRemoteIssueCopied\n ? 'Copied remote QA path'\n : 'Copy remote QA path'\n }\n type=\"button\"\n onClick={() => void onCopyRemoteIssuePath(item)}\n >\n <CopyIcon aria-hidden=\"true\" />\n </button>\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 title=\"Open remote issue\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n </>\n )}\n </div>\n );\n};\n","import { normalizeReviewItemStatus } from '../../status';\nimport type { ReviewItem, ReviewItemStatus } from '../../types';\nimport type { ReviewShellStatusOption } from '../types';\n\ninterface QaItemStatusActionsProps {\n canUpdateStatus: boolean;\n isDisabled?: 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 isDisabled = false,\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 disabled={isDisabled}\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\nconst 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\nconst 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\nconst 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\nconst 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\nconst getReviewFingerprintTokens = (value: string) =>\n value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n\nconst 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 ReviewFieldsConfig,\n ReviewItem,\n ReviewItemStatus,\n} from '../../types';\nimport type { NormalizedReviewShellAdapter } from '../adapters';\nimport { getItemTitle } from '../prompt/prompt';\nimport { QaItemAssigneeActions } from './item.assignee.actions';\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 fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n assigneeTitle: string;\n currentPresetScope: ReviewShellViewportKind;\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n isOverlayVisible: boolean;\n isMutating: 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 onChangeItemAssignee: (\n item: ReviewItem,\n assigneeId: string | null\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onRemoveItem: (item: ReviewItem) => Promise<void>;\n onCopyItemLabel: (numberedItem: NumberedReviewItem) => void;\n onCopyItemLink: (numberedItem: NumberedReviewItem) => void;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onCopyRemoteIssuePath: (item: ReviewItem) => Promise<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 fields,\n assigneeTitle,\n currentPresetScope,\n getItemPresetScope,\n isOverlayVisible,\n isMutating,\n isRemoteSource,\n numberedItem,\n remoteAdapterEntry,\n copiedPromptKey,\n selectedItemId,\n onChangeItemStatus,\n onChangeItemAssignee,\n onClearSelectedItem,\n onRemoveItem,\n onCopyItemLabel,\n onCopyItemLink,\n onCopyItemPrompt,\n onCopyRemoteIssuePath,\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 !isMutating &&\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 labelCopyKey = `label:${item.id}`;\n const linkCopyKey = `link:${item.id}`;\n const remoteIssueCopyKey = `remote-link:${item.id}`;\n const isPromptCopied = copiedPromptKey === promptCopyKey;\n const isLabelCopied = copiedPromptKey === labelCopyKey;\n const isLinkCopied = copiedPromptKey === linkCopyKey;\n const isRemoteIssueCopied = copiedPromptKey === remoteIssueCopyKey;\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 canUpdateAssignee =\n Boolean(activeAdapterEntry.updateAssignee) &&\n activeAdapterEntry.assigneeOptions.length > 0 &&\n !isSubmitting;\n const canEditItem =\n activeAdapterEntry.canUpdate && !isSubmitting && !isMutating;\n const itemTitle = fields.title ? item.title?.trim() : '';\n const itemMeta = [formatItemCardDate(item.createdAt), itemAuthor]\n .filter(Boolean)\n .join(' | ');\n\n return (\n <article\n aria-busy={isMutating ? 'true' : 'false'}\n className={`df-review-item-card${isActive ? ' is-active' : ''}${\n getItemPresetScope(item) !== currentPresetScope ? ' is-dim' : ''\n }${isOverlayVisible ? '' : ' is-overlay-hidden'}${\n isMutating ? ' is-mutating' : ''\n }`}\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 <button\n aria-label={\n isLabelCopied ? 'Copied QA number' : 'Copy QA number'\n }\n className={`df-review-item-id${\n isLabelCopied ? ' is-copied' : ''\n }`}\n title={isLabelCopied ? 'Copied QA number' : 'Copy QA number'}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onCopyItemLabel(numberedItem);\n }}\n >\n {numberedItem.displayLabel}\n </button>\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 {itemTitle && (\n <strong className=\"df-review-item-title\">{itemTitle}</strong>\n )}\n <p\n className={`df-review-item-comment${\n itemTitle ? '' : ' is-primary'\n }`}\n >\n {itemComment}\n </p>\n <small className=\"df-review-item-meta\">{itemMeta}</small>\n {isMutating && (\n <small className=\"df-review-item-saving\" aria-live=\"polite\">\n <span className=\"df-review-spinner\" aria-hidden=\"true\" />\n Saving QA...\n </small>\n )}\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\"\n className=\"df-review-item-edit\"\n title=\"Edit QA\"\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 <div className=\"df-review-item-workflow-actions\">\n <QaItemStatusActions\n canUpdateStatus={canUpdateStatus}\n isDisabled={isMutating}\n item={item}\n statusOptions={statusOptions}\n onChangeItemStatus={onChangeItemStatus}\n />\n <QaItemAssigneeActions\n assigneeOptions={activeAdapterEntry.assigneeOptions}\n assigneeTitle={assigneeTitle}\n canUpdateAssignee={canUpdateAssignee}\n isDisabled={isMutating}\n item={item}\n onChangeItemAssignee={onChangeItemAssignee}\n />\n </div>\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 || isMutating}\n item={item}\n isRemoteIssueCopied={isRemoteIssueCopied}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n onCopyRemoteIssuePath={onCopyRemoteIssuePath}\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 isLoading: 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 isLoading,\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 const displayLabel = getQaSourceDisplayLabel(label);\n\n return (\n <div className=\"df-review-list-header\">\n <div className=\"df-review-list-title\">\n <span className=\"df-review-list-meta\">\n <span>\n {isAllQaVisible\n ? `${displayLabel} QA · All pages`\n : `${displayLabel} QA`}\n </span>\n <strong\n title={`${activeRemainingItemCount} remaining of ${activeItemCount}`}\n >\n {!hasActiveFilter\n ? `${activeRemainingItemCount}/${activeItemCount}`\n : `${filteredItemCount}/${activeItemCount}`}\n </strong>\n </span>\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-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 aria-busy={isLoading ? 'true' : 'false'}\n className={`df-review-source-refresh${\n isLoading ? ' is-loading' : ''\n }`}\n disabled={isLoading}\n type=\"button\"\n onClick={() => void onRefreshReviewData()}\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n </div>\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 getQaSourceDisplayLabel(label: ReviewSource) {\n return label === 'local' ? 'Local' : label;\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 ReviewFieldsConfig,\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 fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n assigneeTitle: string;\n currentPresetScope: ReviewShellViewportKind;\n filteredNumberedActiveItems: NumberedReviewItem[];\n getItemPresetScope: (item: ReviewItem) => ReviewShellViewportKind;\n hiddenOverlayItemIds: ReadonlySet<string>;\n isAllQaVisible: boolean;\n isListVisible: boolean;\n isLoading: boolean;\n isRemoteSource: boolean;\n mutatingItemIds: ReadonlySet<string>;\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 onChangeItemAssignee: (\n item: ReviewItem,\n assigneeId: string | null\n ) => Promise<void>;\n onClearSelectedItem: () => void;\n onChangeReviewSource: (nextSource: ReviewSource) => void;\n onCopyItemLabel: (numberedItem: NumberedReviewItem) => void;\n onCopyItemLink: (numberedItem: NumberedReviewItem) => void;\n onCopyItemPrompt: (numberedItem: NumberedReviewItem) => void;\n onCopyRemoteIssuePath: (item: ReviewItem) => Promise<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 fields,\n assigneeTitle,\n currentPresetScope,\n filteredNumberedActiveItems,\n getItemPresetScope,\n hiddenOverlayItemIds,\n isAllQaVisible,\n isListVisible,\n isLoading,\n isRemoteSource,\n mutatingItemIds,\n copiedPromptKey,\n qaFilter,\n qaFilterCounts,\n qaStatusFilter,\n qaStatusFilterCounts,\n remoteAdapterEntry,\n selectedItemId,\n showSourceSelect,\n source,\n sourceEntries,\n onChangeItemStatus,\n onChangeItemAssignee,\n onClearSelectedItem,\n onChangeReviewSource,\n onCopyItemLabel,\n onCopyItemLink,\n onCopyItemPrompt,\n onCopyRemoteIssuePath,\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 isLoading={isLoading}\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\n className={`df-review-empty${isLoading ? ' is-loading' : ''}`}\n >\n {isLoading && (\n <span className=\"df-review-spinner\" aria-hidden=\"true\" />\n )}\n <span>\n {isLoading\n ? `Loading ${activeAdapterEntry.label} QA...`\n : emptyMessage}\n </span>\n </p>\n )}\n {activeItems.length > 0 &&\n filteredNumberedActiveItems.length === 0 && (\n <p className=\"df-review-empty\">No QA in this filter.</p>\n )}\n {filteredNumberedActiveItems.map((numberedItem) => {\n const { item } = numberedItem;\n\n return (\n <QaItemCard\n key={item.id}\n activeAdapterEntry={activeAdapterEntry}\n fields={fields}\n assigneeTitle={assigneeTitle}\n currentPresetScope={currentPresetScope}\n getItemPresetScope={getItemPresetScope}\n isOverlayVisible={!hiddenOverlayItemIds.has(item.id)}\n isMutating={mutatingItemIds.has(item.id)}\n isRemoteSource={isRemoteSource}\n numberedItem={numberedItem}\n remoteAdapterEntry={remoteAdapterEntry}\n copiedPromptKey={copiedPromptKey}\n selectedItemId={selectedItemId}\n onChangeItemAssignee={onChangeItemAssignee}\n onChangeItemStatus={onChangeItemStatus}\n onClearSelectedItem={onClearSelectedItem}\n onCopyItemLabel={onCopyItemLabel}\n onCopyItemLink={onCopyItemLink}\n onCopyItemPrompt={onCopyItemPrompt}\n onCopyRemoteIssuePath={onCopyRemoteIssuePath}\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 <div className=\"df-review-qa-draft-host\" />\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 getPresenceName = (user: ReviewPresenceUser) =>\n user.displayName || user.userId;\n\nconst PresenceUserIcon = () => (\n <svg aria-hidden=\"true\" viewBox=\"0 0 30 30\">\n <circle\n cx=\"15\"\n cy=\"15\"\n r=\"12.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.6\"\n />\n <circle cx=\"15\" cy=\"10.5\" r=\"3.4\" fill=\"currentColor\" stroke=\"none\" />\n <path\n d=\"M7.8 22.1c.9-4.1 3.4-6.1 7.2-6.1s6.3 2 7.2 6.1c-1.7 1.5-4.1 2.4-7.2 2.4s-5.5-.9-7.2-2.4z\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n);\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 return (\n <div\n aria-label={`Review presence, ${users.length} online`}\n className={`df-review-presence-overlay${\n isExpanded ? ' is-expanded' : ''\n }`}\n >\n <button\n aria-label={`Show online reviewers, ${users.length} online`}\n aria-expanded={isExpanded}\n className=\"df-review-presence-button\"\n type=\"button\"\n onClick={() => setIsExpanded((current) => !current)}\n >\n <PresenceUserIcon />\n <span className=\"df-review-presence-badge\">{users.length}</span>\n </button>\n {isExpanded && (\n <div className=\"df-review-presence-list\" role=\"list\">\n {users.map((user) => (\n <span\n key={user.sessionId}\n className={`df-review-presence-chip${\n user.sessionId === presenceSessionId ? ' is-self' : ''\n }`}\n role=\"listitem\"\n style={\n {\n '--df-review-presence-color': user.color,\n } as CSSProperties\n }\n title={getPresenceName(user)}\n >\n <span>{getPresenceName(user)}</span>\n </span>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import type { DomSourceHint } from '../types';\n\nexport type SourceIgnorePattern = string | RegExp;\n\nexport type GetSourceCandidatesOptions = {\n includePlacer?: boolean;\n ignore?: readonly SourceIgnorePattern[];\n};\n\nexport const matchesIgnore = (\n file: string,\n patterns: readonly SourceIgnorePattern[]\n) => {\n const normalized = file.replace(/\\\\/g, '/');\n return patterns.some((pattern) =>\n typeof pattern === 'string'\n ? normalized.includes(pattern)\n : pattern.test(normalized)\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\nexport function getDataHintFromElement(\n element: Element\n): DomSourceHint | undefined {\n const file = getSourceAttribute(element, 'data-wrk-data-file');\n if (!file) return undefined;\n\n return {\n component: undefined,\n file,\n line: getSourceAttribute(element, 'data-wrk-data-line'),\n column: undefined,\n sectionId: undefined,\n sectionIndex: undefined,\n };\n}\n\nexport function getSourceHintFromElement(\n element: Element\n): 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\nexport function 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\nexport function 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\nexport function getSourceFileCompareKey(file: string | undefined) {\n return file?.trim().replace(/\\\\/g, '/') ?? '';\n}\n\nexport function addSourceFileCompareKey(seen: Set<string>, key: string) {\n if (!key || hasEquivalentSourceFileKey(seen, key)) return false;\n seen.add(key);\n return true;\n}\n\nexport function hasEquivalentSourceFileKey(seen: Set<string>, key: string) {\n for (const seenKey of seen) {\n if (isEquivalentSourceFileKey(seenKey, key)) return true;\n }\n return false;\n}\n\nfunction isEquivalentSourceFileKey(a: string, b: string) {\n return a === b || a.endsWith(`/${b}`) || b.endsWith(`/${a}`);\n}\n\nexport function isCoreOutlineNode(label: string, file: string | undefined) {\n const text = `${label} ${file ?? ''}`.toLowerCase();\n return (\n text.includes('core.section') ||\n text.includes('core.content') ||\n text.includes('core.column') ||\n ['coresection', 'corecontent', 'corecolumn'].includes(label.toLowerCase())\n );\n}\n","import type { DomSourceHint } from '../types';\nimport type { ReviewSourceInspectorOptions } from './types';\nimport {\n addSourceFileCompareKey,\n getComponentNameFromSourceFile,\n getDataHintFromElement,\n getDisplaySourcePath,\n getSourceFileCompareKey,\n getSourceHintFromElement,\n isCoreOutlineNode,\n matchesIgnore,\n type GetSourceCandidatesOptions,\n} from './source.hint';\n\nexport type { GetSourceCandidatesOptions } from './source.hint';\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 kind: 'source' | 'data';\n usesPosition: boolean;\n source: DomSourceHint;\n};\n\nexport const getSourceCandidates = (\n target: EventTarget | null,\n options?: GetSourceCandidatesOptions\n): SourceCandidate[] => {\n const startElement = getEventElement(target);\n if (!startElement) return [];\n\n const candidates: SourceCandidate[] = [];\n const seen = new Set<string>();\n const add = (\n element: Element,\n source: DomSourceHint | undefined,\n depth: number,\n kind: SourceCandidate['kind']\n ) => {\n if (!source?.file) return;\n // 같은 파일은 1개만(가장 안쪽=클릭에 가까운 것). 중첩 primitive 의 줄 단위 중복을 막는다.\n const key = getSourceFileCompareKey(source.file);\n if (!addSourceFileCompareKey(seen, key)) return;\n candidates.push(createSourceCandidate(element, source, depth, kind));\n };\n\n // 클릭 지점에서 부모로 거슬러 올라가며 수집\n let element: Element | null = startElement;\n let depth = 0;\n while (element && element.nodeType === 1) {\n add(element, getSourceHintFromElement(element), depth, 'source');\n // page data 파일 출처(__wrkDataFile)는 별도 후보로. 라인이 있으므로 depth 0 으로 위치 유지.\n add(element, getDataHintFromElement(element), 0, 'data');\n if (element === element.ownerDocument.documentElement) break;\n element = element.parentElement;\n depth += 1;\n }\n\n // 인프라/래퍼 파일 숨김. 전부 걸러지면 빈 후보 대신 원본을 그대로 노출.\n const ignore = options?.ignore;\n const visible = candidates.filter(\n (candidate) =>\n !isCoreOutlineNode(candidate.label, candidate.source.file) &&\n !(ignore?.length && matchesIgnore(candidate.source.file ?? '', ignore))\n );\n return visible.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 createSourceCandidate(\n element: Element,\n source: DomSourceHint,\n depth: number,\n kind: SourceCandidate['kind']\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: `${kind}:${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 kind,\n usesPosition: confidence >= 0.72 && Boolean(line),\n source,\n };\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 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 type { DomSourceHint } from '../types';\nimport {\n addSourceFileCompareKey,\n getComponentNameFromSourceFile,\n getDataHintFromElement,\n getDisplaySourcePath,\n getSourceFileCompareKey,\n getSourceHintFromElement,\n hasEquivalentSourceFileKey,\n isCoreOutlineNode,\n matchesIgnore,\n type GetSourceCandidatesOptions,\n} from './source.hint';\n\nconst SECTION_OUTLINE_ROOT_SELECTOR = [\n '[data-wrk-source-component]',\n 'header[data-wrk-source-file]',\n 'footer[data-wrk-source-file]',\n '[role=\"banner\"][data-wrk-source-file]',\n '[role=\"contentinfo\"][data-wrk-source-file]',\n].join(', ');\n\nexport type SectionOutlineEntry = {\n id: string;\n label: string;\n filePath: string;\n depth: number;\n element: Element;\n source: DomSourceHint | undefined;\n data: DomSourceHint | undefined;\n metadata: SectionOutlineMetadata;\n children: SectionOutlineEntry[];\n};\n\ntype SectionOutlineRect = {\n top: number;\n left: number;\n width: number;\n height: number;\n};\n\ntype SectionOutlineMetadata = {\n rect: SectionOutlineRect;\n textValue?: string;\n fontLabel?: string;\n mediaItems?: SectionOutlineMediaItem[];\n classNames?: string[];\n};\n\ntype SectionOutlineMediaItem = {\n type: 'image' | 'video';\n url: string;\n variant: 'desktop' | 'mobile' | 'media';\n};\n\nexport type GetSectionOutlineOptions = GetSourceCandidatesOptions & {\n maxDepth?: number;\n};\n\n/**\n * 섹션 래퍼와 frame landmark(header/footer)를 루트로 source tree를 만든다.\n * Placer 계열 primitive는 기본으로 숨기고, includePlacer 옵션에서만 표시한다.\n */\nexport const getSectionOutline = (\n root: ParentNode,\n options?: GetSectionOutlineOptions\n): SectionOutlineEntry[] => {\n const maxDepth = options?.maxDepth ?? 9;\n return getSectionOutlineRoots(root, options).map((element, index) => {\n const source = getSourceHintFromElement(element);\n const label = getOutlineLabel(element, source, 'section');\n const seen = new Set<string>();\n if (source?.file) {\n addSourceFileCompareKey(seen, getOutlineSourceKey(source));\n }\n return createSectionOutlineEntry({\n id: `${label}-${index}`,\n label,\n depth: 1,\n filePath: getDisplaySourcePath(source?.file) ?? label,\n element,\n source,\n data: getDataHintFromElement(element),\n children: getSectionOutlineChildren(\n element,\n 2,\n maxDepth,\n seen,\n options\n ),\n });\n });\n};\n\nfunction getSectionOutlineRoots(\n root: ParentNode,\n options: GetSectionOutlineOptions | undefined\n) {\n return Array.from(root.querySelectorAll(SECTION_OUTLINE_ROOT_SELECTOR)).filter(\n (element) => {\n const source = getSourceHintFromElement(element);\n const label = getOutlineLabel(element, source, '');\n return !isSkippedOutlineNode(label, source?.file, options);\n }\n );\n}\n\nfunction getSectionOutlineChildren(\n parent: Element,\n depth: number,\n maxDepth: number,\n seen: Set<string>,\n options: GetSectionOutlineOptions | undefined\n): SectionOutlineEntry[] {\n if (depth > maxDepth) return [];\n\n const entries: SectionOutlineEntry[] = [];\n for (const child of Array.from(parent.children)) {\n const source = getSourceHintFromElement(child);\n const label = getOutlineLabel(child, source, child.tagName.toLowerCase());\n const sourceKey = source?.file ? getOutlineSourceKey(source) : '';\n const isNewSource =\n Boolean(sourceKey) && !hasEquivalentSourceFileKey(seen, sourceKey);\n\n if (shouldStopOutlineBranch(label, source?.file, options)) continue;\n\n if (isHiddenOutlineNode(label, source?.file, options)) {\n entries.push(\n ...getSectionOutlineChildren(child, depth, maxDepth, seen, options)\n );\n continue;\n }\n\n if (source?.file && isNewSource) {\n const childSeen = new Set(seen);\n addSourceFileCompareKey(childSeen, sourceKey);\n entries.push(createSectionOutlineEntry({\n id: `${sourceKey}-${getElementOutlinePath(child)}-${entries.length}`,\n label,\n depth,\n filePath: getDisplaySourcePath(source.file) ?? source.file,\n element: child,\n source,\n data: getDataHintFromElement(child),\n children: getSectionOutlineChildren(\n child,\n depth + 1,\n maxDepth,\n childSeen,\n options\n ),\n }));\n continue;\n }\n\n entries.push(\n ...getSectionOutlineChildren(child, depth, maxDepth, seen, options)\n );\n }\n\n return entries;\n}\n\nfunction getElementOutlinePath(element: Element) {\n const indices: number[] = [];\n let current: Element | null = element;\n\n while (current?.parentElement) {\n indices.unshift(Array.from(current.parentElement.children).indexOf(current));\n current = current.parentElement;\n }\n\n return indices.join('-');\n}\n\nfunction createSectionOutlineEntry(\n entry: Omit<SectionOutlineEntry, 'metadata'>\n): SectionOutlineEntry {\n return {\n ...entry,\n metadata: getSectionOutlineMetadata(entry.element, entry.label, entry.source),\n };\n}\n\nconst truncateOutlineValue = (value: string, maxLength: number) =>\n value.length > maxLength ? `${value.slice(0, maxLength - 1)}…` : value;\n\nconst normalizeOutlineValue = (value: string | null | undefined) =>\n value?.replace(/\\s+/g, ' ').trim() ?? '';\n\nfunction getSectionOutlineMetadata(\n element: Element,\n label: string,\n source: DomSourceHint | undefined\n): SectionOutlineMetadata {\n const textElement = getPlacerTextElement(element, label, source?.file);\n\n return {\n rect: getSectionOutlineRect(element),\n textValue: textElement\n ? truncateOutlineValue(\n normalizeOutlineValue(textElement.textContent),\n 180\n )\n : undefined,\n fontLabel: textElement ? getFontLabel(textElement) : undefined,\n mediaItems: getPlacerMediaItems(element, label, source?.file),\n classNames: getElementClassNames(element),\n };\n}\n\nfunction getSectionOutlineRect(element: Element): SectionOutlineRect {\n const rect = element.getBoundingClientRect();\n return {\n top: Math.round(rect.top),\n left: Math.round(rect.left),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n };\n}\n\nfunction getElementClassNames(element: Element) {\n const classNames = Array.from(element.classList).filter(Boolean);\n return classNames.length > 0 ? classNames : undefined;\n}\n\nfunction getPlacerTextElement(\n element: Element,\n label: string,\n file: string | undefined\n) {\n if (!isPlacerTextOutlineNode(label, file) && !element.hasAttribute('data-font')) {\n return null;\n }\n\n return element.hasAttribute('data-font')\n ? element\n : element.querySelector('[data-font]');\n}\n\nfunction isPlacerTextOutlineNode(label: string, file: string | undefined) {\n return `${label} ${file ?? ''}`.toLowerCase().includes('placertext');\n}\n\nfunction getFontLabel(element: Element) {\n const dataFont = element.getAttribute('data-font');\n if (dataFont) {\n return dataFont\n .replace(/\\bs\\b/g, 'sb')\n .replace(/\\bsemibold\\b/g, 'sb')\n .replace(/\\bregular\\b/g, 'r');\n }\n\n const style = window.getComputedStyle(element);\n return `${Math.round(parseFloat(style.fontSize))}px ${style.fontWeight}`;\n}\n\nfunction getPlacerMediaItems(\n element: Element,\n label: string,\n file: string | undefined\n) {\n if (!isPlacerMediaOutlineNode(label, file)) return undefined;\n\n const mediaItems: SectionOutlineMediaItem[] = [];\n const seen = new Set<string>();\n const addMediaItem = (\n target: Element,\n type: SectionOutlineMediaItem['type'],\n url: string | null | undefined\n ) => {\n const normalizedUrl = normalizeOutlineValue(url);\n if (!normalizedUrl) return;\n\n const variant = getPlacerMediaVariant(target, element);\n const key = `${variant}:${type}:${normalizedUrl}`;\n if (seen.has(key)) return;\n seen.add(key);\n mediaItems.push({ type, url: normalizedUrl, variant });\n };\n\n if (element instanceof HTMLVideoElement) {\n addMediaItem(element, 'video', getVideoElementUrl(element));\n addMediaItem(element, 'image', element.getAttribute('poster'));\n }\n if (element instanceof HTMLImageElement) {\n addMediaItem(element, 'image', getMediaElementUrl(element));\n }\n if (element instanceof HTMLSourceElement) {\n addMediaItem(element, 'video', getSourceElementUrl(element));\n }\n\n Array.from(element.querySelectorAll('video')).forEach((video) => {\n addMediaItem(video, 'video', getVideoElementUrl(video));\n addMediaItem(video, 'image', video.getAttribute('poster'));\n });\n Array.from(element.querySelectorAll('source')).forEach((source) => {\n addMediaItem(source, 'video', getSourceElementUrl(source));\n });\n Array.from(element.querySelectorAll('img')).forEach((img) => {\n addMediaItem(img, 'image', getMediaElementUrl(img));\n });\n\n return mediaItems.length > 0 ? mediaItems : undefined;\n}\n\nfunction isPlacerMediaOutlineNode(label: string, file: string | undefined) {\n return `${label} ${file ?? ''}`.toLowerCase().includes('placermedia');\n}\n\nfunction getPlacerMediaVariant(\n target: Element,\n root: Element\n): SectionOutlineMediaItem['variant'] {\n let current: Element | null = target;\n while (current) {\n if (current.classList.contains('d-block-pc')) return 'desktop';\n if (current.classList.contains('d-block-m')) return 'mobile';\n if (current === root) break;\n current = current.parentElement;\n }\n\n return 'media';\n}\n\nfunction getVideoElementUrl(video: HTMLVideoElement) {\n return (\n video.currentSrc ||\n video.getAttribute('src') ||\n video.querySelector('source')?.getAttribute('src') ||\n video.getAttribute('poster') ||\n video.src\n );\n}\n\nfunction getSourceElementUrl(source: HTMLSourceElement) {\n return source.getAttribute('src') || source.src;\n}\n\nfunction getMediaElementUrl(img: HTMLImageElement) {\n return img.currentSrc || img.getAttribute('src') || img.src;\n}\n\nfunction getOutlineSourceKey(source: DomSourceHint) {\n return getSourceFileCompareKey(source.file);\n}\n\nfunction getOutlineLabel(\n element: Element,\n source: DomSourceHint | undefined,\n fallback: string\n) {\n return (\n source?.component?.trim() ||\n getComponentNameFromSourceFile(source?.file) ||\n element.id.trim() ||\n fallback\n );\n}\n\nfunction isHiddenOutlineNode(\n label: string,\n file: string | undefined,\n options: GetSourceCandidatesOptions | undefined\n) {\n const ignore = options?.ignore;\n const isIgnoredSource =\n file && ignore?.length ? matchesIgnore(file, ignore) : false;\n return isCoreOutlineNode(label, file) || isIgnoredSource;\n}\n\nfunction shouldStopOutlineBranch(\n label: string,\n file: string | undefined,\n options: GetSourceCandidatesOptions | undefined\n) {\n return !options?.includePlacer && isPlacerOutlineNode(label, file);\n}\n\nfunction isSkippedOutlineNode(\n label: string,\n file: string | undefined,\n options: GetSourceCandidatesOptions | undefined\n) {\n return (\n shouldStopOutlineBranch(label, file, options) ||\n isHiddenOutlineNode(label, file, options)\n );\n}\n\nfunction isPlacerOutlineNode(label: string, file: string | undefined) {\n return `${label} ${file ?? ''}`.toLowerCase().includes('placer');\n}\n","import { clamp } from '../../core/geometry';\nimport { runWithAutoScrollBehavior } from '../../core/scroll';\nimport type { ReviewMode } from '../../types';\nimport type { ReviewShellWriteMode } from '../types';\nimport type { SectionOutlineEntry } from '../section.outline';\n\nexport const getReviewModeWriteMode = (\n mode: ReviewMode\n): ReviewShellWriteMode | null => {\n if (mode === 'element') return 'dom';\n if (mode === 'note' || mode === 'area') return mode;\n return null;\n};\n\nexport const waitForFrame = (targetWindow: Window | null | undefined) =>\n new Promise<void>((resolve) => {\n (targetWindow ?? window).requestAnimationFrame(() => resolve());\n });\n\nexport const waitForMs = (ms: number) =>\n new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n\nconst getScrollElement = (targetDocument: Document) =>\n targetDocument.scrollingElement as HTMLElement | null;\n\nexport const scrollElementInTarget = (\n element: Element,\n block: 'center' | 'start'\n) => {\n const targetWindow = element.ownerDocument.defaultView;\n if (!targetWindow) return;\n\n const targetDocument = element.ownerDocument;\n const scrollElement = getScrollElement(targetDocument);\n const rect = element.getBoundingClientRect();\n const currentLeft = scrollElement?.scrollLeft ?? targetWindow.scrollX;\n const currentTop = scrollElement?.scrollTop ?? targetWindow.scrollY;\n const clientWidth = scrollElement?.clientWidth ?? targetWindow.innerWidth;\n const clientHeight = scrollElement?.clientHeight ?? targetWindow.innerHeight;\n const scrollWidth =\n scrollElement?.scrollWidth ?? targetDocument.documentElement.scrollWidth;\n const scrollHeight =\n scrollElement?.scrollHeight ??\n targetDocument.documentElement.scrollHeight;\n const nextLeft = clamp(\n currentLeft + rect.left + rect.width / 2 - clientWidth / 2,\n 0,\n Math.max(0, scrollWidth - clientWidth)\n );\n const nextTop =\n block === 'center'\n ? clamp(\n currentTop + rect.top + rect.height / 2 - clientHeight / 2,\n 0,\n Math.max(0, scrollHeight - clientHeight)\n )\n : clamp(\n currentTop + rect.top,\n 0,\n Math.max(0, scrollHeight - clientHeight)\n );\n\n runWithAutoScrollBehavior(targetDocument, () => {\n if (scrollElement) {\n scrollElement.scrollLeft = Math.round(nextLeft);\n scrollElement.scrollTop = Math.round(nextTop);\n return;\n }\n\n targetWindow.scrollTo(Math.round(nextLeft), Math.round(nextTop));\n });\n};\n\nexport const centerFrameScrollOnElement = (\n frameScroll: HTMLDivElement | null,\n frame: HTMLIFrameElement | null,\n element: Element\n) => {\n if (!frameScroll || !frame) return;\n\n const frameScrollRect = frameScroll.getBoundingClientRect();\n const frameRect = frame.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n const elementHostCenterX =\n frameRect.left + elementRect.left + elementRect.width / 2;\n const elementHostCenterY =\n frameRect.top + elementRect.top + elementRect.height / 2;\n const visibleCenterX = frameScrollRect.left + frameScrollRect.width / 2;\n const visibleCenterY = frameScrollRect.top + frameScrollRect.height / 2;\n const nextLeft = clamp(\n frameScroll.scrollLeft + elementHostCenterX - visibleCenterX,\n 0,\n Math.max(0, frameScroll.scrollWidth - frameScroll.clientWidth)\n );\n const nextTop = clamp(\n frameScroll.scrollTop + elementHostCenterY - visibleCenterY,\n 0,\n Math.max(0, frameScroll.scrollHeight - frameScroll.clientHeight)\n );\n const previousScrollBehavior = frameScroll.style.scrollBehavior;\n\n frameScroll.style.scrollBehavior = 'auto';\n frameScroll.scrollLeft = Math.round(nextLeft);\n frameScroll.scrollTop = Math.round(nextTop);\n frameScroll.style.scrollBehavior = previousScrollBehavior;\n};\n\nexport const getSectionOutlineFilterTerms = (value: string) =>\n value\n .trim()\n .toLowerCase()\n .split(/\\s+/)\n .filter(Boolean);\n\nexport const getSectionOutlineEntryCount = (\n entries: SectionOutlineEntry[]\n): number =>\n entries.reduce(\n (count, entry) => count + 1 + getSectionOutlineEntryCount(entry.children),\n 0\n );\n\nexport const getDefaultCollapsedSectionOutlineIds = (\n entries: SectionOutlineEntry[]\n) => {\n const collapsedIds = new Set<string>();\n const visit = (entry: SectionOutlineEntry) => {\n if (entry.children.length > 0) {\n collapsedIds.add(entry.id);\n }\n entry.children.forEach(visit);\n };\n\n entries.forEach(visit);\n return collapsedIds;\n};\n\nexport const getLiveSectionOutlineRect = (entry: SectionOutlineEntry) => {\n if (!entry.element.isConnected) return entry.metadata.rect;\n\n const rect = entry.element.getBoundingClientRect();\n return {\n top: Math.round(rect.top),\n left: Math.round(rect.left),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n };\n};\n\nconst matchesSectionOutlineFilter = (\n entry: SectionOutlineEntry,\n terms: string[]\n) => {\n if (terms.length === 0) return true;\n\n const text = [\n entry.label,\n entry.filePath,\n entry.source?.file,\n entry.data?.file,\n entry.metadata.textValue,\n entry.metadata.fontLabel,\n entry.metadata.mediaItems\n ?.map((mediaItem) => `${mediaItem.variant} ${mediaItem.type} ${mediaItem.url}`)\n .join(' '),\n entry.metadata.classNames?.join(' '),\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n\n return terms.every((term) => text.includes(term));\n};\n\nexport const filterSectionOutlineEntries = (\n entries: SectionOutlineEntry[],\n terms: string[]\n): SectionOutlineEntry[] => {\n if (terms.length === 0) return entries;\n\n return entries.flatMap((entry) => {\n const children = filterSectionOutlineEntries(entry.children, terms);\n if (!matchesSectionOutlineFilter(entry, terms) && children.length === 0) {\n return [];\n }\n\n return [{ ...entry, children }];\n });\n};\n","import React from 'react';\nimport {\n ChevronDown as ChevronDownIcon,\n Code2 as Code2Icon,\n Database as DatabaseIcon,\n Image as ImageIcon,\n Search as SearchIcon,\n SquareDashed as SquareDashedIcon,\n SquareMousePointer as SquareMousePointerIcon,\n Type as TypeIcon,\n X as XIcon,\n} from 'lucide-react';\nimport type { SectionOutlineEntry } from '../section.outline';\nimport type { StoredSourceTreeMetaVisibility } from '../settings';\nimport { getLiveSectionOutlineRect } from './shell.helpers';\n\ntype SourceTreeMetaVisibilityKey = keyof StoredSourceTreeMetaVisibility;\n\ntype SectionOutlinePanelProps = {\n isPanelVisible: boolean;\n isFiltering: boolean;\n filteredCount: number;\n totalCount: number;\n rootCount: number;\n filter: string;\n entries: SectionOutlineEntry[];\n collapsedIds: Set<string>;\n canWriteDom: boolean;\n isBoxMetaVisible: boolean;\n isFontMetaVisible: boolean;\n isMediaMetaVisible: boolean;\n isClassMetaVisible: boolean;\n onToggleMeta: (key: SourceTreeMetaVisibilityKey) => void;\n onFilterChange: (value: string) => void;\n onToggleEntry: (entryId: string) => void;\n onScrollToSection: (entry: SectionOutlineEntry) => void;\n onOpenData: (entry: SectionOutlineEntry) => void;\n onOpenSource: (entry: SectionOutlineEntry) => void;\n onStartDomReview: (entry: SectionOutlineEntry) => void;\n onHoverElement: (element: Element) => void;\n onClearHover: () => void;\n};\n\nexport const SectionOutlinePanel = ({\n isPanelVisible,\n isFiltering,\n filteredCount,\n totalCount,\n rootCount,\n filter,\n entries,\n collapsedIds,\n canWriteDom,\n isBoxMetaVisible,\n isFontMetaVisible,\n isMediaMetaVisible,\n isClassMetaVisible,\n onToggleMeta,\n onFilterChange,\n onToggleEntry,\n onScrollToSection,\n onOpenData,\n onOpenSource,\n onStartDomReview,\n onHoverElement,\n onClearHover,\n}: SectionOutlinePanelProps) => {\n const renderMeta = (entry: SectionOutlineEntry) => {\n const { metadata } = entry;\n const rows: React.ReactNode[] = [];\n const metaPaddingLeft = 29;\n const rect = getLiveSectionOutlineRect(entry);\n\n if (isBoxMetaVisible) {\n rows.push(\n <span className=\"df-review-section-outline-meta-row\" key=\"box\">\n <b>box</b>\n <code>\n top {rect.top} / left {rect.left} / width {rect.width} / height{' '}\n {rect.height}\n </code>\n </span>\n );\n }\n\n if (metadata.textValue) {\n rows.push(\n <span\n className=\"df-review-section-outline-meta-row is-text\"\n key=\"text\"\n >\n <b>text</b>\n <code>{metadata.textValue}</code>\n </span>\n );\n }\n\n if (isFontMetaVisible && metadata.fontLabel) {\n rows.push(\n <span className=\"df-review-section-outline-meta-row\" key=\"font\">\n <b>font</b>\n <code>{metadata.fontLabel}</code>\n </span>\n );\n }\n\n if (isMediaMetaVisible && metadata.mediaItems?.length) {\n metadata.mediaItems.forEach((mediaItem) => {\n const mediaKey = `${mediaItem.variant}:${mediaItem.type}:${mediaItem.url}`;\n const mediaLabel =\n mediaItem.variant === 'media' ? mediaItem.type : mediaItem.variant;\n rows.push(\n <span\n className=\"df-review-section-outline-meta-row is-media\"\n key={mediaKey}\n >\n <b>{mediaLabel}</b>\n <a\n className=\"df-review-section-outline-media-link\"\n href={mediaItem.url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n title={`${mediaLabel} ${mediaItem.type}`}\n >\n <code>{mediaItem.url}</code>\n </a>\n </span>\n );\n });\n }\n\n if (isClassMetaVisible && metadata.classNames?.length) {\n rows.push(\n <span className=\"df-review-section-outline-meta-row is-class\" key=\"class\">\n <b>class</b>\n <span className=\"df-review-section-outline-class-tags\">\n {metadata.classNames.map((className) => (\n <code key={className}>{className}</code>\n ))}\n </span>\n </span>\n );\n }\n\n if (rows.length === 0) return null;\n\n return (\n <div\n className=\"df-review-section-outline-meta\"\n style={{ paddingLeft: `${metaPaddingLeft}px` }}\n >\n {rows}\n </div>\n );\n };\n\n const renderEntry = (entry: SectionOutlineEntry): React.ReactNode => {\n const hasChildren = entry.children.length > 0;\n const isCollapsed = !isFiltering && collapsedIds.has(entry.id);\n const liveRect = getLiveSectionOutlineRect(entry);\n const isZeroArea = liveRect.width <= 0 || liveRect.height <= 0;\n\n return (\n <div\n className={`df-review-section-outline-item is-depth-${entry.depth}`}\n key={entry.id}\n >\n <div\n className=\"df-review-section-outline-entry-body\"\n onMouseEnter={() => onHoverElement(entry.element)}\n onMouseLeave={onClearHover}\n onMouseOver={() => onHoverElement(entry.element)}\n onMouseOut={(event) => {\n if (\n event.relatedTarget instanceof Node &&\n event.currentTarget.contains(event.relatedTarget)\n ) {\n return;\n }\n onClearHover();\n }}\n onPointerEnter={() => onHoverElement(entry.element)}\n onPointerLeave={onClearHover}\n >\n <div\n className=\"df-review-section-outline-row\"\n style={{ paddingLeft: '6px' }}\n >\n {hasChildren ? (\n <button\n aria-label={\n isCollapsed\n ? `Expand ${entry.label}`\n : `Collapse ${entry.label}`\n }\n aria-expanded={!isCollapsed}\n className={`df-review-section-outline-toggle${\n isCollapsed ? ' is-collapsed' : ''\n }`}\n type=\"button\"\n onClick={() => onToggleEntry(entry.id)}\n >\n <ChevronDownIcon aria-hidden=\"true\" />\n </button>\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"df-review-section-outline-toggle is-placeholder\"\n />\n )}\n <button\n className=\"df-review-section-outline-name\"\n title={entry.filePath}\n type=\"button\"\n onClick={() => onScrollToSection(entry)}\n >\n <span>{entry.label}</span>\n <small>{entry.filePath}</small>\n </button>\n <span className=\"df-review-section-outline-links\">\n <button\n aria-label={`Open ${entry.label} data`}\n className=\"df-review-section-outline-link\"\n title=\"Open data\"\n type=\"button\"\n disabled={!entry.data?.file}\n onClick={() => onOpenData(entry)}\n >\n <DatabaseIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label={`Open ${entry.label} source`}\n className=\"df-review-section-outline-link\"\n title=\"Open source\"\n type=\"button\"\n disabled={!entry.source?.file}\n onClick={() => onOpenSource(entry)}\n >\n <Code2Icon aria-hidden=\"true\" />\n </button>\n <span\n aria-hidden=\"true\"\n className=\"df-review-section-outline-divider\"\n >\n |\n </span>\n <button\n aria-label={`Start DOM QA for ${entry.label}`}\n className=\"df-review-section-outline-link is-dom-select\"\n title={isZeroArea ? 'No visible area' : 'DOM select'}\n type=\"button\"\n disabled={!canWriteDom || isZeroArea}\n onClick={() => onStartDomReview(entry)}\n >\n <SquareMousePointerIcon aria-hidden=\"true\" />\n </button>\n </span>\n </div>\n {renderMeta(entry)}\n </div>\n {hasChildren && !isCollapsed && (\n <div className=\"df-review-section-outline-children\">\n {entry.children.map(renderEntry)}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <aside\n className=\"df-review-source-tree-panel\"\n aria-hidden={!isPanelVisible}\n >\n <div id=\"df-review-section-outline\" className=\"df-review-section-outline\">\n <div className=\"df-review-section-outline-head\">\n <div className=\"df-review-section-outline-summary\">\n <span>\n <strong>Component</strong>\n <small>\n {isFiltering\n ? `${filteredCount} / ${totalCount} results`\n : `${rootCount} ${rootCount === 1 ? 'root' : 'roots'}`}\n </small>\n </span>\n <div className=\"df-review-section-outline-meta-controls\">\n <button\n aria-label=\"Toggle source tree box metadata\"\n aria-pressed={isBoxMetaVisible}\n className={`df-review-section-outline-meta-toggle${\n isBoxMetaVisible ? ' is-active' : ''\n }`}\n title=\"top / left / width / height\"\n type=\"button\"\n onClick={() => onToggleMeta('box')}\n >\n <SquareDashedIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Toggle source tree font metadata\"\n aria-pressed={isFontMetaVisible}\n className={`df-review-section-outline-meta-toggle${\n isFontMetaVisible ? ' is-active' : ''\n }`}\n title=\"font size / weight\"\n type=\"button\"\n onClick={() => onToggleMeta('font')}\n >\n <TypeIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Toggle source tree media metadata\"\n aria-pressed={isMediaMetaVisible}\n className={`df-review-section-outline-meta-toggle${\n isMediaMetaVisible ? ' is-active' : ''\n }`}\n title=\"media urls\"\n type=\"button\"\n onClick={() => onToggleMeta('media')}\n >\n <ImageIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label=\"Toggle source tree class metadata\"\n aria-pressed={isClassMetaVisible}\n className={`df-review-section-outline-meta-toggle${\n isClassMetaVisible ? ' is-active' : ''\n }`}\n title=\"class names\"\n type=\"button\"\n onClick={() => onToggleMeta('className')}\n >\n <Code2Icon aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n <div className=\"df-review-section-outline-filter\">\n <SearchIcon aria-hidden=\"true\" />\n <input\n aria-label=\"Filter source tree\"\n type=\"text\"\n value={filter}\n placeholder=\"Filter\"\n autoComplete=\"off\"\n enterKeyHint=\"search\"\n spellCheck={false}\n onChange={(event) => onFilterChange(event.currentTarget.value)}\n />\n {filter && (\n <button\n aria-label=\"Clear source tree filter\"\n className=\"df-review-section-outline-filter-clear\"\n type=\"button\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onFilterChange('')}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n {entries.length > 0 ? (\n <div className=\"df-review-section-outline-list\">\n {entries.map(renderEntry)}\n </div>\n ) : (\n <div className=\"df-review-section-outline-empty\">\n {isFiltering ? 'No source matches' : 'No sections found'}\n </div>\n )}\n </div>\n </aside>\n );\n};\n","// Source-select 단축키(Alt) 활성 시 target iframe 문서에 주입되는 CSS.\n// crosshair 커서, \"Source select\" 안내 배지, data-font 힌트 오버레이 스타일을 담는다.\n// 셸 문서가 아니라 iframe 내부에 주입되므로 모든 규칙에 !important 를 붙여 페이지 스타일을 덮는다.\nexport function createSourceShortcutStyle(\n optionAttribute: string,\n fontOverlayAttribute: string,\n): string {\n return `\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: 500 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: 500 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","import React from 'react';\nimport type { SourceCandidate } from '../source.open';\n\nexport type SourceInspectorRect = {\n height: number;\n left: number;\n top: number;\n width: number;\n};\n\nexport type SourceInspectorCandidate = SourceCandidate & {\n openUrl: string | null;\n};\n\nexport type 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\ntype SourceInspectorOverlayProps = {\n state: SourceInspectorState | null;\n interactionRef: React.MutableRefObject<boolean>;\n onClear: () => void;\n onOpenCandidate: (candidate: SourceInspectorCandidate) => void;\n};\n\nexport const SourceInspectorOverlay = ({\n state,\n interactionRef,\n onClear,\n onOpenCandidate,\n}: SourceInspectorOverlayProps) => {\n if (!state) return null;\n\n return (\n <>\n <div\n className={`df-review-source-outline${\n state.isPinned ? ' is-pinned' : ''\n }`}\n style={{\n height: `${state.rect.height}px`,\n left: `${state.rect.left}px`,\n top: `${state.rect.top}px`,\n width: `${state.rect.width}px`,\n }}\n />\n {state.candidates.length > 0 && (\n <div\n className={`df-review-source-popover${\n state.isPinned ? ' is-pinned' : ''\n }`}\n style={{\n left:\n state.panelRight === null\n ? `${state.panelLeft}px`\n : undefined,\n maxWidth: `${state.panelMaxWidth}px`,\n right:\n state.panelRight === null\n ? undefined\n : `${state.panelRight}px`,\n top: `${state.panelTop}px`,\n }}\n onPointerDown={() => {\n interactionRef.current = true;\n }}\n onPointerEnter={() => {\n interactionRef.current = true;\n }}\n onPointerLeave={() => {\n interactionRef.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={onClear}\n >\n ×\n </button>\n </div>\n <div className=\"df-review-source-candidate-list\">\n {state.candidates.map((candidate) => (\n <button\n key={candidate.id}\n className={`df-review-source-candidate is-${candidate.kind}`}\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onOpenCandidate(candidate);\n }}\n >\n <span className=\"df-review-source-candidate-main\">\n <strong>{candidate.label}</strong>\n <span>{candidate.filePath}</span>\n <small>{candidate.positionLabel || '-:-'}</small>\n </span>\n </button>\n ))}\n </div>\n </div>\n )}\n </>\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 { useCallback, useEffect, useRef, type RefObject } from 'react';\nimport type { ReviewFigmaImage } from '../../figma/image.types';\nimport type { ReviewFigmaImageOverlayItemState } from '../figma/image.overlay.controller';\nimport type { ReviewShellViewportPreset } from '../types';\nimport { getViewportPresetKind } from '../viewport';\n\nconst TARGET_FIGMA_IMAGE_ROOT_ID = 'df-review-figma-image-target-root';\nconst TARGET_FIGMA_IMAGE_STYLE_ID = 'df-review-figma-image-target-style';\nconst TARGET_FIGMA_IMAGE_ID_ATTRIBUTE = 'data-df-review-figma-image-id';\nconst targetFigmaImageDragStates = new WeakMap<\n HTMLElement,\n {\n overlayId: string;\n pointerId: number;\n startClientY: number;\n startOffsetY: number;\n }\n>();\n\nexport type ReviewTargetFigmaImageOverlay = {\n id: string;\n imageUrl: string;\n isLocked?: boolean;\n label?: string;\n mode?: 'normal' | 'invert';\n offsetY?: number;\n opacity: number;\n zIndex: number;\n};\n\nexport function createReviewTargetFigmaImageOverlays({\n imageOverlayStates,\n images,\n}: {\n imageOverlayStates: Record<string, ReviewFigmaImageOverlayItemState>;\n images: ReviewFigmaImage[];\n}): ReviewTargetFigmaImageOverlay[] {\n return images.flatMap((image, index) => {\n const overlayState = imageOverlayStates[image.id];\n if (!overlayState?.isVisible) return [];\n\n return [\n {\n id: image.id,\n imageUrl: image.imageUrl,\n isLocked: overlayState.isLocked,\n label: image.label ?? image.nodeId,\n mode: overlayState.mode,\n offsetY: overlayState.offsetY,\n opacity: overlayState.opacity,\n zIndex: images.length - index,\n },\n ];\n });\n}\n\ninterface UseTargetFigmaImageOverlaysOptions {\n figmaImageOverlays: ReviewTargetFigmaImageOverlay[];\n iframeRef: RefObject<HTMLIFrameElement | null>;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onSetOverlayOffsetY?: (id: string, offsetY: number) => void;\n}\n\nexport const useTargetFigmaImageOverlays = ({\n figmaImageOverlays,\n iframeRef,\n onSetOverlayOffsetY,\n size,\n targetSrc,\n}: UseTargetFigmaImageOverlaysOptions) => {\n const targetDocumentRef = useRef<Document | null>(null);\n const overlaySignature = createTargetFigmaImageOverlaySignature(\n figmaImageOverlays\n );\n\n const syncTargetFigmaImageOverlays = useCallback(() => {\n let targetDocument: Document | null | undefined;\n\n try {\n targetDocument = iframeRef.current?.contentDocument;\n } catch {\n targetDocument = null;\n }\n\n if (!targetDocument?.body) return;\n if (\n targetDocumentRef.current &&\n targetDocumentRef.current !== targetDocument\n ) {\n removeTargetFigmaImageOverlays(targetDocumentRef.current);\n }\n\n targetDocumentRef.current = targetDocument;\n renderTargetFigmaImageOverlays({\n onSetOverlayOffsetY,\n overlays: figmaImageOverlays,\n size,\n targetDocument,\n });\n }, [\n iframeRef,\n onSetOverlayOffsetY,\n overlaySignature,\n size,\n targetSrc,\n ]);\n\n useEffect(() => {\n syncTargetFigmaImageOverlays();\n }, [syncTargetFigmaImageOverlays]);\n\n useEffect(() => {\n return () => {\n if (!targetDocumentRef.current) return;\n removeTargetFigmaImageOverlays(targetDocumentRef.current);\n targetDocumentRef.current = null;\n };\n }, []);\n\n return syncTargetFigmaImageOverlays;\n};\n\nexport function renderTargetFigmaImageOverlays({\n onSetOverlayOffsetY,\n overlays,\n size,\n targetDocument,\n}: {\n onSetOverlayOffsetY?: (id: string, offsetY: number) => void;\n overlays: ReviewTargetFigmaImageOverlay[];\n size: ReviewShellViewportPreset;\n targetDocument: Document;\n}) {\n if (overlays.length === 0) {\n removeTargetFigmaImageOverlays(targetDocument);\n return;\n }\n\n const isMobileViewport = getViewportPresetKind(size) === 'mobile';\n const fixedOverlayWidth = getTargetFigmaImageFixedWidth(size);\n const root = ensureTargetFigmaImageRoot(targetDocument);\n const existingElements = new Map(\n Array.from(\n root.querySelectorAll<HTMLElement>(\n `[${TARGET_FIGMA_IMAGE_ID_ATTRIBUTE}]`\n )\n ).flatMap((element) => {\n const id = element.getAttribute(TARGET_FIGMA_IMAGE_ID_ATTRIBUTE);\n return id ? [[id, element] as const] : [];\n })\n );\n const nextIds = new Set(overlays.map((overlay) => overlay.id));\n\n existingElements.forEach((element, id) => {\n if (!nextIds.has(id)) element.remove();\n });\n\n overlays.forEach((overlay) => {\n let element = existingElements.get(overlay.id);\n let image = element?.querySelector('img') ?? null;\n\n if (!element) {\n element = targetDocument.createElement('div');\n element.className = 'df-review-figma-image-target-overlay';\n element.setAttribute(TARGET_FIGMA_IMAGE_ID_ATTRIBUTE, overlay.id);\n image = targetDocument.createElement('img');\n image.alt = '';\n image.draggable = false;\n element.appendChild(image);\n }\n\n if (image && image.getAttribute('src') !== overlay.imageUrl) {\n image.setAttribute('src', overlay.imageUrl);\n }\n\n element.setAttribute('aria-label', overlay.label ?? 'Figma image overlay');\n element.setAttribute('role', 'img');\n element.dataset.viewport = isMobileViewport ? 'mobile' : 'fixed';\n element.style.filter = overlay.mode === 'invert' ? 'invert(1)' : '';\n element.style.left = isMobileViewport ? '0' : '50%';\n element.style.opacity = String(overlay.opacity);\n element.style.pointerEvents =\n overlay.isLocked || !onSetOverlayOffsetY ? 'none' : 'auto';\n element.style.top = `${normalizeTargetFigmaImageOffsetY(\n overlay.offsetY\n )}px`;\n element.style.transform = isMobileViewport ? 'none' : 'translateX(-50%)';\n element.style.width = isMobileViewport ? '100%' : `${fixedOverlayWidth}px`;\n element.style.zIndex = String(overlay.zIndex);\n attachTargetFigmaImageDrag({\n element,\n onSetOverlayOffsetY,\n overlay,\n });\n\n root.appendChild(element);\n });\n}\n\nfunction attachTargetFigmaImageDrag({\n element,\n onSetOverlayOffsetY,\n overlay,\n}: {\n element: HTMLElement;\n onSetOverlayOffsetY?: (id: string, offsetY: number) => void;\n overlay: ReviewTargetFigmaImageOverlay;\n}) {\n if (overlay.isLocked || !onSetOverlayOffsetY) {\n targetFigmaImageDragStates.delete(element);\n element.classList.remove('is-dragging');\n element.onpointerdown = null;\n element.onpointermove = null;\n element.onpointerup = null;\n element.onpointercancel = null;\n return;\n }\n\n element.onpointerdown = (event) => {\n if (event.button !== 0) return;\n\n event.preventDefault();\n event.stopPropagation();\n element.setPointerCapture(event.pointerId);\n element.classList.add('is-dragging');\n targetFigmaImageDragStates.set(element, {\n overlayId: overlay.id,\n pointerId: event.pointerId,\n startClientY: event.clientY,\n startOffsetY: normalizeTargetFigmaImageOffsetY(overlay.offsetY),\n });\n };\n\n element.onpointermove = (event) => {\n const dragState = targetFigmaImageDragStates.get(element);\n if (!dragState || dragState.pointerId !== event.pointerId) return;\n\n event.preventDefault();\n event.stopPropagation();\n const nextOffsetY = Math.round(\n dragState.startOffsetY + event.clientY - dragState.startClientY\n );\n element.style.top = `${nextOffsetY}px`;\n onSetOverlayOffsetY(dragState.overlayId, nextOffsetY);\n };\n\n const stopDrag = (event: PointerEvent) => {\n const dragState = targetFigmaImageDragStates.get(element);\n if (!dragState || dragState.pointerId !== event.pointerId) return;\n\n event.preventDefault();\n event.stopPropagation();\n if (element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n element.classList.remove('is-dragging');\n targetFigmaImageDragStates.delete(element);\n };\n\n element.onpointerup = stopDrag;\n element.onpointercancel = stopDrag;\n}\n\nfunction ensureTargetFigmaImageRoot(targetDocument: Document) {\n ensureTargetFigmaImageStyle(targetDocument);\n\n const [existingRoot, ...duplicateRoots] = Array.from(\n targetDocument.querySelectorAll<HTMLElement>(\n `#${TARGET_FIGMA_IMAGE_ROOT_ID}`\n )\n );\n duplicateRoots.forEach((root) => root.remove());\n if (existingRoot) return existingRoot;\n\n const root = targetDocument.createElement('div');\n root.id = TARGET_FIGMA_IMAGE_ROOT_ID;\n root.setAttribute('aria-hidden', 'true');\n targetDocument.body.appendChild(root);\n return root;\n}\n\nfunction ensureTargetFigmaImageStyle(targetDocument: Document) {\n if (targetDocument.getElementById(TARGET_FIGMA_IMAGE_STYLE_ID)) return;\n\n const style = targetDocument.createElement('style');\n style.id = TARGET_FIGMA_IMAGE_STYLE_ID;\n style.textContent = `\n #${TARGET_FIGMA_IMAGE_ROOT_ID} {\n position: absolute;\n left: 0;\n top: 0;\n z-index: 2147483000;\n width: 100%;\n height: 0;\n overflow: visible;\n pointer-events: none;\n }\n\n #${TARGET_FIGMA_IMAGE_ROOT_ID} .df-review-figma-image-target-overlay {\n position: absolute;\n display: block;\n cursor: grab;\n user-select: none;\n -webkit-user-select: none;\n touch-action: none;\n will-change: opacity, top, transform;\n }\n\n #${TARGET_FIGMA_IMAGE_ROOT_ID} .df-review-figma-image-target-overlay.is-dragging {\n cursor: grabbing;\n }\n\n #${TARGET_FIGMA_IMAGE_ROOT_ID} .df-review-figma-image-target-overlay img {\n display: block;\n width: 100%;\n max-width: none;\n height: auto;\n pointer-events: none;\n user-select: none;\n -webkit-user-drag: none;\n -webkit-user-select: none;\n }\n `;\n targetDocument.head?.appendChild(style);\n}\n\nexport function removeTargetFigmaImageOverlays(targetDocument: Document) {\n targetDocument\n .querySelectorAll(`#${TARGET_FIGMA_IMAGE_ROOT_ID}`)\n .forEach((element) => element.remove());\n targetDocument\n .querySelectorAll(`#${TARGET_FIGMA_IMAGE_STYLE_ID}`)\n .forEach((element) => element.remove());\n}\n\nfunction createTargetFigmaImageOverlaySignature(\n overlays: ReviewTargetFigmaImageOverlay[]\n) {\n return overlays\n .map((overlay) =>\n [\n overlay.id,\n overlay.imageUrl,\n overlay.label ?? '',\n overlay.isLocked ? 'locked' : 'unlocked',\n overlay.mode ?? '',\n overlay.offsetY ?? 0,\n overlay.opacity,\n overlay.zIndex,\n ].join(':')\n )\n .join('|');\n}\n\nfunction getTargetFigmaImageFixedWidth(size: ReviewShellViewportPreset) {\n const width = size.designWidth ?? size.width;\n return Math.max(1, Math.round(width));\n}\n\nfunction normalizeTargetFigmaImageOffsetY(value: unknown) {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n","import type { RefObject } from 'react';\nimport type { ReviewMode } from '../../types';\nimport type {\n ReviewRulerMeasure,\n ReviewRulerPoint,\n ReviewShellViewportPreset,\n} from '../types';\nimport { ReviewModeToolbar } from '../review/mode.toolbar';\nimport { RulerGutters } from '../ruler/gutters';\nimport { RulerOverlay } from '../ruler/overlay';\nimport {\n useTargetFigmaImageOverlays,\n type ReviewTargetFigmaImageOverlay,\n} from './figma.image.overlay';\n\ninterface ReviewTargetFrameProps {\n canWriteArea: boolean;\n canWriteDom: boolean;\n figmaImageOverlays: ReviewTargetFigmaImageOverlay[];\n frameScrollRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n isRulerAvailable: boolean;\n isRulerDragging: boolean;\n isRulerVisible: boolean;\n mode: ReviewMode;\n rulerHover: ReviewRulerPoint | null;\n rulerMeasure: ReviewRulerMeasure | undefined;\n rulerMeasureLabel: string;\n rulerOverlayRef: RefObject<HTMLDivElement | null>;\n rulerScaleX: number;\n rulerScaleY: number;\n rulerUnit: string;\n size: ReviewShellViewportPreset;\n targetSrc: string;\n onLoadTarget: () => void;\n onSetFigmaImageOverlayOffsetY?: (id: string, offsetY: number) => void;\n onSetReviewMode: (mode: ReviewMode) => void;\n}\n\nexport const ReviewTargetFrame = ({\n canWriteArea,\n canWriteDom,\n figmaImageOverlays,\n frameScrollRef,\n iframeRef,\n isRulerAvailable,\n isRulerDragging,\n isRulerVisible,\n mode,\n rulerHover,\n rulerMeasure,\n rulerMeasureLabel,\n rulerOverlayRef,\n rulerScaleX,\n rulerScaleY,\n rulerUnit,\n size,\n targetSrc,\n onLoadTarget,\n onSetFigmaImageOverlayOffsetY,\n onSetReviewMode,\n}: ReviewTargetFrameProps) => {\n const showRuler = isRulerVisible && isRulerAvailable;\n const syncTargetFigmaImageOverlays = useTargetFigmaImageOverlays({\n figmaImageOverlays,\n iframeRef,\n onSetOverlayOffsetY: onSetFigmaImageOverlayOffsetY,\n size,\n targetSrc,\n });\n const handleLoadTarget = () => {\n onLoadTarget();\n syncTargetFigmaImageOverlays();\n window.requestAnimationFrame(syncTargetFigmaImageOverlays);\n };\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={handleLoadTarget}\n />\n {showRuler && (\n <RulerOverlay\n iframeRef={iframeRef}\n isRulerDragging={isRulerDragging}\n rulerHover={rulerHover}\n rulerMeasure={rulerMeasure}\n rulerMeasureLabel={rulerMeasureLabel}\n rulerOverlayRef={rulerOverlayRef}\n size={size}\n />\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"df-review-frame-actions\">\n <ReviewModeToolbar\n canWriteArea={canWriteArea}\n canWriteDom={canWriteDom}\n mode={mode}\n onSetReviewMode={onSetReviewMode}\n />\n </div>\n </div>\n </main>\n );\n};\n","import type { TargetOverlayState } from '../types';\n\nconst HIDE_SCROLLBAR_STYLE_ID = 'df-review-hide-scrollbar';\nconst 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 Copy as CopyIcon,\n ExternalLink as ExternalLinkIcon,\n LayoutGrid as LayoutGridIcon,\n Map as MapIcon,\n Maximize2 as Maximize2Icon,\n Monitor as MonitorIcon,\n RectangleHorizontal as TabletIcon,\n RefreshCw as RefreshCwIcon,\n Ruler as RulerIcon,\n Smartphone as SmartphoneIcon,\n SquareMousePointer as SquareMousePointerIcon,\n} from 'lucide-react';\nimport type { ChangeEvent } from 'react';\nimport type { ReviewItemScope } from '../index';\nimport { FIGMA_OVERLAY_UNAVAILABLE_MESSAGE } from './constants';\nimport { FigmaMarkIcon } from './figma/figma-mark-icon';\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 figmaOverlayUnavailableMessage?: string;\n isFigmaOverlayActive: boolean;\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 onToggleFigmaOverlay: () => void;\n onToggleTargetOverlay: (key: TargetOverlayKey) => 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\nconst getPresetSelectValue = (preset: ReviewShellViewportPreset) =>\n `${preset.label}:${preset.width}x${preset.height}`;\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\nexport const ReviewTopbar = ({\n draftTarget,\n copyLabel,\n viewportPresets,\n size,\n presetScopeCounts,\n isRulerAvailable,\n isRulerVisible,\n targetOverlayState,\n figmaOverlayUnavailableMessage = FIGMA_OVERLAY_UNAVAILABLE_MESSAGE,\n isFigmaOverlayActive,\n isFigmaOverlayAvailable,\n onDraftTargetChange,\n onApplyTarget,\n onOpenSitemap,\n onCopyCurrentUrl,\n onSizeChange,\n onToggleRuler,\n onToggleFigmaOverlay,\n onToggleTargetOverlay,\n}: ReviewTopbarProps) => {\n const selectedPresetValue = getPresetSelectValue(size);\n const targetHref = getTargetOpenHref(draftTarget);\n const handlePresetSelectChange = (event: ChangeEvent<HTMLSelectElement>) => {\n const nextPreset = viewportPresets.find(\n (preset) => getPresetSelectValue(preset) === event.currentTarget.value\n );\n if (nextPreset) onSizeChange(nextPreset);\n };\n\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 <div className=\"df-review-address-actions\">\n <button\n aria-label=\"Refresh target\"\n className=\"df-review-address-icon-button\"\n title=\"Refresh target\"\n type=\"submit\"\n >\n <RefreshCwIcon aria-hidden=\"true\" />\n </button>\n <button\n aria-label={copyLabel}\n className=\"df-review-address-icon-button\"\n title={copyLabel}\n type=\"button\"\n onClick={onCopyCurrentUrl}\n >\n <CopyIcon aria-hidden=\"true\" />\n </button>\n <a\n aria-label=\"Open target page\"\n className=\"df-review-address-icon-button\"\n href={targetHref}\n rel=\"noreferrer\"\n target=\"_blank\"\n title=\"Open target page\"\n >\n <ExternalLinkIcon aria-hidden=\"true\" />\n </a>\n </div>\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 <select\n aria-label=\"Viewport preset\"\n className=\"df-review-preset-select\"\n value={selectedPresetValue}\n onChange={handlePresetSelectChange}\n >\n {viewportPresets.map((preset) => {\n const scope = getViewportPresetKind(preset);\n const count = presetScopeCounts.get(scope) ?? 0;\n\n return (\n <option\n key={getPresetSelectValue(preset)}\n value={getPresetSelectValue(preset)}\n >\n {`${preset.label} (${count})`}\n </option>\n );\n })}\n </select>\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 ? isFigmaOverlayActive\n ? 'Hide Figma overlays'\n : 'Show Figma overlays'\n : figmaOverlayUnavailableMessage\n }\n className={`df-review-overlay-button is-figma${\n isFigmaOverlayActive ? ' is-active' : ''\n }${isFigmaOverlayAvailable ? '' : ' is-disabled'}`}\n disabled={!isFigmaOverlayAvailable}\n type=\"button\"\n onClick={onToggleFigmaOverlay}\n >\n <FigmaMarkIcon />\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 ReviewAssigneeOption,\n ReviewFieldsConfig,\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 fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n assigneeTitle: string;\n assigneeOptions: readonly ReviewAssigneeOption[];\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 fields,\n assigneeTitle,\n assigneeOptions,\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 fields,\n assigneeTitle,\n assigneeOptions,\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 getItemFrameTarget,\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;\nconst RESTORE_SCROLL_RECHECK_DELAYS_MS = [120, 360] as const;\n\nconst waitForNextAnimationFrame = (targetWindow: Window) =>\n new Promise<void>((resolve) => {\n targetWindow.requestAnimationFrame(() => resolve());\n });\n\nconst waitForTargetTimeout = (targetWindow: Window, ms: number) =>\n new Promise<void>((resolve) => {\n targetWindow.setTimeout(resolve, ms);\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 const applyScrollPosition = () => {\n if (!isCurrentRestore()) return false;\n const currentAnchorElement =\n queryReviewItemAnchorElement(targetDocument, item) ?? anchorElement;\n\n runWithAutoScrollBehavior(targetDocument, () => {\n setDocumentScrollInstantly(\n targetWindow,\n targetDocument,\n getReviewItemRestoreScrollPosition(\n targetWindow,\n targetDocument,\n item,\n currentAnchorElement\n )\n );\n });\n onSyncTargetViewport();\n return true;\n };\n\n if (!applyScrollPosition()) return false;\n controllerRef.current?.highlightItem(item.id);\n\n for (const delay of RESTORE_SCROLL_RECHECK_DELAYS_MS) {\n await waitForTargetTimeout(targetWindow, delay);\n if (!applyScrollPosition()) return false;\n controllerRef.current?.highlightItem(item.id);\n }\n\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 nextRoute = getItemTarget(item, reviewPathPrefix);\n const nextTarget = getItemFrameTarget(item, reviewPathPrefix);\n const nextSize = getRestoredSize(item, viewportPresets);\n\n pendingInitialItemIdRef.current = null;\n pendingRestoreRef.current = item;\n selectedItemIdRef.current = item.id;\n onSelectedItemIdChange(item.id);\n onActiveRouteChange(nextRoute);\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 pendingInitialItemIdRef,\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 try {\n const item = await adapter.get(itemId);\n if (item && pendingInitialItemIdRef.current === itemId) {\n restoreReviewItem(item);\n }\n } catch {\n /* retry when the list response arrives */\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 ReviewAssigneeOption,\n ReviewFieldsConfig,\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 fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n assigneeTitle: string;\n assigneeOptions: readonly ReviewAssigneeOption[];\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 fields,\n assigneeTitle,\n assigneeOptions,\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 fields,\n assigneeTitle,\n assigneeOptions,\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 fields,\n assigneeTitle,\n assigneeOptions,\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 { MutableRefObject } from 'react';\nimport {\n getFrameRouteTarget,\n getTargetRouteKey,\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 const nextRouteKey = getTargetRouteKey(nextTarget, reviewPathPrefix);\n const currentRouteKey = getTargetRouteKey(\n targetRef.current,\n reviewPathPrefix\n );\n if (nextRouteKey === currentRouteKey) return;\n if (!pageTargets.has(nextRouteKey)) {\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(\n `${url.pathname}${url.search}${url.hash}`,\n reviewPathPrefix\n );\n const nextRouteKey = getTargetRouteKey(nextTarget, reviewPathPrefix);\n const currentRouteKey = getTargetRouteKey(\n targetRef.current,\n reviewPathPrefix\n );\n if (nextRouteKey === currentRouteKey) return;\n if (!pageTargets.has(nextRouteKey)) 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 getComposerHost: () =>\n document.querySelector<HTMLElement>('.df-review-qa-draft-host'),\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 getTargetRouteKey,\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 const nextRouteKey = getTargetRouteKey(\n normalizedTarget,\n reviewPathPrefix\n );\n\n if (normalizedTarget !== targetRef.current) {\n onClearSelectedItem();\n targetRef.current = normalizedTarget;\n onTargetChange(normalizedTarget);\n onDraftTargetChange(normalizedTarget);\n onActiveRouteChange(nextRouteKey);\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(getTargetRouteKey(target, reviewPathPrefix));\n }, [onActiveRouteChange, reviewPathPrefix, 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 { getTargetRouteKey } 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) => getTargetRouteKey(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, useMemo } from 'react';\nimport type {\n ReviewFigmaImageFormat,\n ReviewFigmaImageStore,\n ReviewFigmaRouteTarget,\n} from '../../figma/image.types';\nimport {\n DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n} from '../../figma/image.types';\nimport type { ReviewShellViewportPreset } from '../types';\nimport {\n createReviewFigmaRouteTarget,\n useReviewFigmaImageStoreController,\n} from '../figma/image.controller';\nimport { useReviewFigmaImageOverlayController } from '../figma/image.overlay.controller';\n\ninterface UseReviewFigmaImagesOptions {\n imageFormat?: ReviewFigmaImageFormat;\n pageUrl: string;\n projectId: string;\n store: ReviewFigmaImageStore | null;\n viewport: ReviewShellViewportPreset;\n}\n\nexport const useReviewFigmaImages = ({\n imageFormat = DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n pageUrl,\n projectId,\n store,\n viewport,\n}: UseReviewFigmaImagesOptions) => {\n const target = useMemo<ReviewFigmaRouteTarget>(\n () =>\n createReviewFigmaRouteTarget({\n pageUrl,\n projectId,\n viewport,\n }),\n [\n pageUrl,\n projectId,\n viewport.height,\n viewport.label,\n viewport.width,\n viewport.kind,\n ]\n );\n const {\n addImage: addStoreImage,\n deleteImage,\n error,\n images,\n isLoading,\n isMutating,\n moveImage,\n refreshImages,\n reorderImages,\n updateImage,\n } = useReviewFigmaImageStoreController({\n imageFormat,\n store,\n target,\n });\n const {\n imageOverlayStates,\n isAnyImageOverlayVisible,\n isOverlayLocked,\n isOverlayVisible,\n overlayMode,\n overlayOffsetY,\n overlayOpacity,\n resetOverlay,\n selectedImage,\n selectedImageId,\n setOverlayLocked,\n setOverlayMode,\n setOverlayOffsetY,\n setOverlayOpacity,\n setSelectedImageId,\n showImage,\n setImageOverlayOffsetY,\n setImageOverlayOpacity,\n state: overlayState,\n toggleImageOverlayLocked,\n toggleImageOverlayMode,\n toggleImageOverlayVisible,\n toggleAllImageOverlayVisible,\n toggleOverlayLocked,\n toggleOverlayMode,\n toggleOverlayVisible,\n } = useReviewFigmaImageOverlayController({\n images,\n isLoading,\n target,\n });\n\n const addImage = useCallback(\n async (figmaUrl: string, label?: string) => {\n const image = await addStoreImage(figmaUrl, label);\n if (image) showImage(image.id);\n return image;\n },\n [addStoreImage, showImage]\n );\n\n return {\n addImage,\n deleteImage,\n error,\n images,\n imageOverlayStates,\n isAnyImageOverlayVisible,\n isLoading,\n isMutating,\n isOverlayLocked,\n isOverlayVisible,\n moveImage,\n overlayMode,\n overlayOffsetY,\n overlayOpacity,\n overlayState,\n refreshImages,\n resetOverlay,\n reorderImages,\n selectedImage,\n selectedImageId,\n setOverlayLocked,\n setOverlayMode,\n setOverlayOffsetY,\n setOverlayOpacity,\n setSelectedImageId,\n setImageOverlayOffsetY,\n setImageOverlayOpacity,\n target,\n toggleImageOverlayLocked,\n toggleImageOverlayMode,\n toggleImageOverlayVisible,\n toggleAllImageOverlayVisible,\n toggleOverlayLocked,\n toggleOverlayMode,\n toggleOverlayVisible,\n updateImage,\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 defaultReviewUserId?: string;\n onCancelReviewMode: () => void | boolean;\n onCloseInitialPrompt: () => void;\n onCloseSitemap: () => void;\n onReloadTargetFrame: () => void;\n}\n\nexport const useReviewSettings = ({\n defaultReviewUserId = '',\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n onReloadTargetFrame,\n}: UseReviewSettingsOptions) => {\n const [figmaTokenDraft, setFigmaTokenDraft] = useState(getStoredFigmaToken);\n const [reviewUserId, setReviewUserId] = useState(() =>\n getStoredReviewUserId(defaultReviewUserId)\n );\n const [reviewUserIdDraft, setReviewUserIdDraft] = useState(\n () => getStoredReviewUserId(defaultReviewUserId)\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(defaultReviewUserId));\n setReviewThemeDraft(reviewTheme);\n setFigmaSettingsStatus('');\n setIsFigmaTokenVisible(false);\n setIsFigmaTokenGuideOpen(false);\n setIsFigmaSettingsOpen(true);\n }, [\n onCancelReviewMode,\n onCloseInitialPrompt,\n onCloseSitemap,\n defaultReviewUserId,\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 = nextToken !== getStoredFigmaToken();\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 (getStoredReviewUserId()) return;\n\n const nextDefaultUserId = defaultReviewUserId.trim();\n setReviewUserId(nextDefaultUserId);\n setReviewUserIdDraft(nextDefaultUserId);\n }, [defaultReviewUserId]);\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 {\n getStoredReviewQaStatusFilter,\n writeStoredReviewQaStatusFilter,\n} from '../settings';\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, setQaStatusFilterState] =\n useState<ReviewQaStatusFilter>(getStoredReviewQaStatusFilter);\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 () => {\n const nextHiddenItemIds = new Set(hiddenOverlayItemIds);\n\n if (qaStatusFilter !== 'all') {\n activeItems.forEach((item) => {\n if (normalizeReviewItemStatus(item.status) !== qaStatusFilter) {\n nextHiddenItemIds.add(item.id);\n }\n });\n }\n\n return Array.from(nextHiddenItemIds);\n },\n [activeItems, hiddenOverlayItemIds, qaStatusFilter]\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 setQaStatusFilter = useCallback((filter: ReviewQaStatusFilter) => {\n setQaStatusFilterState(filter);\n writeStoredReviewQaStatusFilter(filter);\n }, []);\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 items,\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 getTargetRouteKey,\n getInitialItemId,\n getInitialSource,\n getInitialTarget,\n} from '../route';\nimport {\n getInitialReviewSidePanel,\n getStoredReviewSidePanelVisible,\n} from '../settings';\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 initialItemId = getInitialItemId();\n const initialSidePanel = getInitialReviewSidePanel();\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(initialItemId);\n const selectedItemIdRef = useRef(initialItemId);\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 getTargetRouteKey(getInitialTarget(reviewPathPrefix), 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(initialItemId);\n const [isListVisible, setIsListVisible] = useState(\n () =>\n Boolean(initialItemId || initialSidePanel) ||\n getStoredReviewSidePanelVisible()\n );\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 ReviewFieldsConfig,\n ReviewSource,\n WebReviewKitAdapter,\n} from '../types';\nimport type {\n ReviewShellAdapter,\n ReviewShellAdapterMap,\n ReviewShellAdapters,\n ReviewShellAssigneeOption,\n ReviewShellStatusOption,\n ReviewShellSyncSubmissionInput,\n ReviewShellUpdateAssigneeInput,\n ReviewShellUpdateStatusInput,\n ReviewShellWriteMode,\n} from './types';\n\nconst ALL_REVIEW_WRITE_MODES: ReviewShellWriteMode[] = ['dom', 'note', 'area'];\nconst DEFAULT_ASSIGNEE_TITLE = 'Assignee';\n\nexport type NormalizedReviewShellAdapter = {\n label: ReviewSource;\n adapter: WebReviewKitAdapter;\n fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n statusOptions: ReviewShellStatusOption[];\n assigneeTitle: string;\n assigneeOptions: ReviewShellAssigneeOption[];\n defaultUserId: string;\n updateStatus?: (input: ReviewShellUpdateStatusInput) => Promise<unknown>;\n updateAssignee?: (input: ReviewShellUpdateAssigneeInput) => 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 fields: { title: false },\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n assigneeTitle: DEFAULT_ASSIGNEE_TITLE,\n assigneeOptions: [],\n defaultUserId: adapters.defaultUserId?.trim() ?? '',\n updateStatus: ({ id, status }) => adapters.local.update(id, { status }),\n updateAssignee: ({ id, assigneeId, assigneeName }) =>\n adapters.local.update(id, { assigneeId, assigneeName }),\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 fields: { title: false },\n statusOptions: [...REVIEW_WORKFLOW_STATUS_OPTIONS],\n assigneeTitle: DEFAULT_ASSIGNEE_TITLE,\n assigneeOptions: [],\n defaultUserId: adapters.defaultUserId?.trim() ?? '',\n updateStatus: ({ id, status }) =>\n adapters.remote?.update(id, { status }) ??\n Promise.reject(new Error('Remote adapter is not available.')),\n updateAssignee: ({ id, assigneeId, assigneeName }) =>\n adapters.remote?.update(id, { assigneeId, assigneeName }) ??\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 fields = {\n title: adapterConfig.fields?.title === true,\n };\n const assigneeTitle =\n adapterConfig.assigneeTitle?.trim() || DEFAULT_ASSIGNEE_TITLE;\n const assigneeOptions = [...(adapterConfig.assigneeOptions ?? [])];\n const defaultUserId = adapterConfig.defaultUserId?.trim() ?? '';\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 updateAssignee: NormalizedReviewShellAdapter['updateAssignee'] =\n adapterConfig.updateAssignee\n ? adapterConfig.updateAssignee\n : updateAdapter\n ? ({ id, assigneeId, assigneeName, assigneeOption }) =>\n updateAdapter(id, {\n assigneeId,\n assigneeName: assigneeName ?? assigneeOption?.label,\n })\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 fields,\n statusOptions,\n assigneeTitle,\n assigneeOptions,\n defaultUserId,\n updateStatus,\n updateAssignee,\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 ReviewFieldsConfig,\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 UpdateReviewItemAssigneeOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n item: ReviewItem;\n assigneeId: string | null;\n onRefreshReviewData: () => Promise<void>;\n onToast?: (message: string) => void;\n}\n\ninterface UpdateReviewItemDetailsOptions {\n activeAdapterEntry: NormalizedReviewShellAdapter;\n fields: Required<Pick<ReviewFieldsConfig, 'title'>>;\n item: ReviewItem;\n title?: string;\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 writeClipboardTextFallback = (value: string) => {\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\nconst writeClipboardText = async (value: string) => {\n try {\n writeClipboardTextFallback(value);\n return;\n } catch (error) {\n if (!navigator.clipboard?.writeText) {\n throw error;\n }\n await navigator.clipboard.writeText(value);\n }\n};\n\nconst 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\nconst 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 updateReviewItemAssignee = async ({\n activeAdapterEntry,\n item,\n assigneeId,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemAssigneeOptions) => {\n if (!activeAdapterEntry.updateAssignee) return;\n\n const assigneeIndex = activeAdapterEntry.assigneeOptions.findIndex(\n (assigneeOption) => assigneeOption.value === assigneeId\n );\n const assigneeOption = activeAdapterEntry.assigneeOptions[assigneeIndex];\n const nextAssigneeId =\n assigneeOption?.value ??\n (assigneeId && item.assigneeId === assigneeId ? assigneeId : null);\n const nextAssigneeName =\n assigneeOption?.label ??\n (nextAssigneeId ? item.assigneeName : undefined);\n\n if ((item.assigneeId ?? null) === nextAssigneeId) {\n onToast?.('No QA assignee changes');\n return item;\n }\n\n const updated = await activeAdapterEntry.updateAssignee({\n id: item.id,\n item,\n assigneeId: nextAssigneeId,\n assigneeName: nextAssigneeName,\n assigneeOption,\n assigneeIndex,\n });\n await onRefreshReviewData();\n onToast?.('QA assignee updated');\n return updated as ReviewItem;\n};\n\nexport const updateReviewItemDetails = async ({\n activeAdapterEntry,\n fields,\n item,\n title,\n comment,\n onRefreshReviewData,\n onToast,\n}: UpdateReviewItemDetailsOptions) => {\n const nextTitle = title?.trim() || undefined;\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 const isTitleUnchanged =\n !fields.title || nextTitle === (item.title?.trim() || undefined);\n const isUnchanged = isTitleUnchanged && nextComment === item.comment.trim();\n\n if (isUnchanged) {\n onToast?.('No QA changes');\n return item;\n }\n\n const updated = await activeAdapterEntry.adapter.update(item.id, {\n ...(fields.title ? { title: nextTitle } : {}),\n comment: nextComment,\n });\n await onRefreshReviewData();\n onToast?.('QA 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 React, {\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport {\n MoveVertical as OffsetYIcon,\n} from 'lucide-react';\nimport {\n DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n} from '../../figma/image.types';\nimport { normalizeTarget } from '../route';\nimport type {\n ReviewShellFigmaImagesOptions,\n ReviewShellViewportPreset,\n} from '../types';\nimport { DEFAULT_REVIEW_VIEWPORT_PRESETS } from '../viewport';\nimport {\n getReviewFigmaImageStore,\n} from '../figma';\nimport { useReviewFigmaImages } from '../hooks/use.review.figma.images';\nimport {\n createReviewTargetFigmaImageOverlays,\n removeTargetFigmaImageOverlays,\n renderTargetFigmaImageOverlays,\n} from '../target/figma.image.overlay';\nimport {\n DEFAULT_FIGMA_IMAGE_LAYER_STATE,\n formatFigmaImageDate,\n getFigmaImageLabel,\n getFigmaImageLayerStatusLabel,\n getSnappedOpacityPercent,\n} from './image-panel.utils';\nimport { FigmaMarkIcon } from './figma-mark-icon';\nimport { FigmaImageLayerStateButtons } from './layer-state-buttons';\n\nconst FIGMA_DEV_OVERLAY_ROOT_ID = 'df-review-figma-dev-overlay-root';\nconst FIGMA_DEV_OVERLAY_MOUNT_ID = 'df-review-figma-dev-overlay-mount';\n\ntype FigmaDevViewportMatch = {\n label: 'Mobile' | 'Full width';\n preset: ReviewShellViewportPreset;\n rangeLabel: string;\n};\n\ntype FigmaDevViewportBoundaries = {\n fullWidthRangeLabel: string;\n maxPreset: ReviewShellViewportPreset;\n minPreset: ReviewShellViewportPreset;\n mobileRangeLabel: string;\n};\n\nexport interface FigmaDevOverlayMountOptions {\n rootId?: string;\n projectId: string;\n presets?: ReviewShellViewportPreset[];\n reviewPathPrefix?: string;\n figmaImages?: ReviewShellFigmaImagesOptions;\n pageUrl?: string | (() => string);\n}\n\nexport interface FigmaDevOverlayController {\n destroy(): void;\n}\n\nexport const mountFigmaDevOverlay = (\n options: FigmaDevOverlayMountOptions\n): FigmaDevOverlayController => {\n if (typeof document === 'undefined' || !document.body) {\n return { destroy: () => undefined };\n }\n\n const rootId = options.rootId ?? FIGMA_DEV_OVERLAY_ROOT_ID;\n document.getElementById(rootId)?.remove();\n\n const host = document.createElement('div');\n host.id = rootId;\n host.style.display = 'contents';\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = figmaDevOverlayStyle;\n const mountNode = document.createElement('div');\n mountNode.id = FIGMA_DEV_OVERLAY_MOUNT_ID;\n shadow.append(style, mountNode);\n document.body.appendChild(host);\n\n const root: Root = createRoot(mountNode);\n root.render(\n <React.StrictMode>\n <FigmaDevOverlayWidget {...options} />\n </React.StrictMode>\n );\n\n return {\n destroy() {\n root.unmount();\n host.remove();\n removeTargetFigmaImageOverlays(document);\n },\n };\n};\n\nconst FigmaDevOverlayWidget = ({\n figmaImages,\n pageUrl,\n presets = DEFAULT_REVIEW_VIEWPORT_PRESETS,\n projectId,\n reviewPathPrefix,\n}: FigmaDevOverlayMountOptions) => {\n const figmaImageStore = getReviewFigmaImageStore(figmaImages);\n const viewport = useCurrentViewport();\n const currentPageUrl = useCurrentPageUrl(pageUrl, reviewPathPrefix);\n const viewportBoundaries = useMemo(\n () => getFigmaDevViewportBoundaries(presets),\n [presets]\n );\n const matchedViewportMatch = useMemo(\n () => findBoundaryFigmaDevViewportMatch(presets, viewport.width),\n [presets, viewport.width]\n );\n const matchedViewport = matchedViewportMatch?.preset ?? null;\n const activeViewport =\n matchedViewport ??\n viewportBoundaries?.minPreset ??\n presets[0] ??\n DEFAULT_REVIEW_VIEWPORT_PRESETS[0];\n const {\n error,\n images,\n imageOverlayStates,\n isAnyImageOverlayVisible,\n isLoading,\n selectedImageId,\n setImageOverlayOffsetY,\n setImageOverlayOpacity,\n setSelectedImageId,\n toggleImageOverlayLocked,\n toggleImageOverlayMode,\n toggleImageOverlayVisible,\n } = useReviewFigmaImages({\n imageFormat: figmaImages?.imageFormat ?? DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,\n pageUrl: currentPageUrl,\n projectId,\n store: matchedViewport ? figmaImageStore : null,\n viewport: activeViewport,\n });\n const [isPanelOpen, setIsPanelOpen] = useState(false);\n const [isWidgetVisible, setIsWidgetVisible] = useState(false);\n const [offsetYDraftByImageId, setOffsetYDraftByImageId] = useState<\n Record<string, string>\n >({});\n const selectedImage = selectedImageId\n ? images.find((image) => image.id === selectedImageId) ?? null\n : null;\n const selectedImageIndex = selectedImage ? images.indexOf(selectedImage) : -1;\n const selectedImageLabel = selectedImage\n ? getFigmaImageLabel(selectedImage, selectedImageIndex)\n : 'Figma layer';\n const selectedOverlayState = selectedImage\n ? imageOverlayStates[selectedImage.id] ?? DEFAULT_FIGMA_IMAGE_LAYER_STATE\n : DEFAULT_FIGMA_IMAGE_LAYER_STATE;\n const selectedOpacityPercent = selectedImage\n ? getSnappedOpacityPercent(selectedOverlayState.opacity)\n : 0;\n const selectedOffsetYDraft = selectedImage\n ? offsetYDraftByImageId[selectedImage.id] ??\n String(selectedOverlayState.offsetY)\n : '';\n const figmaImageOverlays = useMemo(\n () =>\n createReviewTargetFigmaImageOverlays({\n imageOverlayStates,\n images,\n }),\n [imageOverlayStates, images]\n );\n\n useEffect(() => {\n if (!isWidgetVisible || !matchedViewport) {\n removeTargetFigmaImageOverlays(document);\n return;\n }\n\n renderTargetFigmaImageOverlays({\n onSetOverlayOffsetY: setImageOverlayOffsetY,\n overlays: figmaImageOverlays,\n size: matchedViewport,\n targetDocument: document,\n });\n }, [\n figmaImageOverlays,\n isWidgetVisible,\n matchedViewport,\n setImageOverlayOffsetY,\n ]);\n\n useEffect(\n () => () => {\n removeTargetFigmaImageOverlays(document);\n },\n []\n );\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n !event.shiftKey ||\n event.metaKey ||\n event.ctrlKey ||\n event.altKey ||\n (event.code !== 'KeyF' && event.key.toLowerCase() !== 'f') ||\n isEditableFigmaDevOverlayEventTarget(event)\n ) {\n return;\n }\n\n event.preventDefault();\n setIsPanelOpen(false);\n setIsWidgetVisible((currentVisible) => !currentVisible);\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n return () => document.removeEventListener('keydown', handleKeyDown, true);\n }, []);\n\n if (!figmaImageStore) return null;\n if (!isWidgetVisible) return null;\n\n const updateSelectedImageOpacity = (value: string) => {\n if (!selectedImage) return;\n const opacityPercent = Math.max(\n 0,\n Math.min(100, Math.round(Number(value) / 10) * 10)\n );\n if (Number.isFinite(opacityPercent)) {\n setImageOverlayOpacity(selectedImage.id, opacityPercent / 100);\n }\n };\n\n return (\n <aside\n aria-label=\"Figma overlay\"\n className={`df-review-figma-dev-widget${\n isPanelOpen ? ' is-open' : ''\n }${isAnyImageOverlayVisible ? ' is-active' : ''}`}\n >\n {isPanelOpen && (\n <div className=\"df-review-figma-dev-panel\">\n <div className=\"df-review-figma-dev-panel-header\">\n <strong>Figma</strong>\n <span>\n {matchedViewportMatch\n ? `${matchedViewportMatch.label} · ${matchedViewportMatch.rangeLabel}`\n : `${viewport.width}px`}\n </span>\n </div>\n {selectedImage && (\n <div className=\"df-review-figma-dev-selected-controls\">\n <label className=\"df-review-figma-dev-opacity-control\">\n <span>Opacity</span>\n <input\n aria-label={`${selectedImageLabel} overlay opacity`}\n max=\"100\"\n min=\"0\"\n step=\"10\"\n type=\"range\"\n value={selectedOpacityPercent}\n onChange={(event) =>\n updateSelectedImageOpacity(event.currentTarget.value)\n }\n onInput={(event) =>\n updateSelectedImageOpacity(event.currentTarget.value)\n }\n />\n <strong>{selectedOpacityPercent}</strong>\n </label>\n <label className=\"df-review-figma-dev-y-control\">\n <OffsetYIcon aria-hidden=\"true\" />\n <input\n aria-label={`${selectedImageLabel} overlay Y offset`}\n inputMode=\"numeric\"\n step=\"1\"\n type=\"number\"\n value={selectedOffsetYDraft}\n onBlur={() => {\n setOffsetYDraftByImageId((currentDrafts) => {\n const nextDrafts = { ...currentDrafts };\n delete nextDrafts[selectedImage.id];\n return nextDrafts;\n });\n }}\n onChange={(event) => {\n const value = event.currentTarget.value;\n const offsetY = Number(value);\n setOffsetYDraftByImageId((currentDrafts) => ({\n ...currentDrafts,\n [selectedImage.id]: value,\n }));\n if (value.trim() !== '' && Number.isFinite(offsetY)) {\n setImageOverlayOffsetY(selectedImage.id, offsetY);\n }\n }}\n />\n </label>\n </div>\n )}\n {error && <p className=\"df-review-figma-dev-status\">{error}</p>}\n {!matchedViewport ? (\n <p className=\"df-review-figma-dev-empty\">\n No Figma layers for this viewport.\n {viewportBoundaries\n ? ` Mobile ${viewportBoundaries.mobileRangeLabel} / Full width ${viewportBoundaries.fullWidthRangeLabel}`\n : ''}\n </p>\n ) : isLoading ? (\n <p className=\"df-review-figma-dev-status\">Loading...</p>\n ) : images.length === 0 ? (\n <p className=\"df-review-figma-dev-empty\">\n No Figma layers for this viewport.\n </p>\n ) : (\n <div className=\"df-review-figma-dev-list\">\n {images.map((image, index) => {\n const imageLabel = getFigmaImageLabel(image, index);\n const overlayState =\n imageOverlayStates[image.id] ??\n DEFAULT_FIGMA_IMAGE_LAYER_STATE;\n\n return (\n <article\n className={`df-review-figma-dev-row${\n image.id === selectedImageId ? ' is-active' : ''\n }`}\n key={image.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => setSelectedImageId(image.id)}\n onKeyDown={(event) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n setSelectedImageId(image.id);\n }}\n >\n <FigmaImageLayerStateButtons\n imageLabel={imageLabel}\n overlayState={overlayState}\n title={getFigmaImageLayerStatusLabel(overlayState)}\n onSelect={() => setSelectedImageId(image.id)}\n onToggleLocked={() =>\n toggleImageOverlayLocked(image.id)\n }\n onToggleMode={() => toggleImageOverlayMode(image.id)}\n onToggleVisible={() =>\n toggleImageOverlayVisible(image.id)\n }\n />\n <span className=\"df-review-figma-dev-row-main\">\n <strong>{imageLabel}</strong>\n <small>{formatFigmaImageDate(image.updatedAt)}</small>\n </span>\n </article>\n );\n })}\n </div>\n )}\n </div>\n )}\n <div className=\"df-review-figma-dev-bar\">\n <button\n aria-expanded={isPanelOpen}\n aria-label={isPanelOpen ? 'Hide Figma layer controls' : 'Show Figma layer controls'}\n className=\"df-review-figma-dev-button is-figma\"\n title={isPanelOpen ? 'Hide layers' : 'Show layers'}\n type=\"button\"\n onClick={() => setIsPanelOpen((isOpen) => !isOpen)}\n >\n <FigmaMarkIcon />\n <span className=\"df-review-figma-dev-button-count\">\n {images.length}\n </span>\n </button>\n </div>\n </aside>\n );\n};\n\nfunction useCurrentPageUrl(\n pageUrl: FigmaDevOverlayMountOptions['pageUrl'],\n reviewPathPrefix: string | undefined\n) {\n const [currentPageUrl, setCurrentPageUrl] = useState(() =>\n getFigmaDevOverlayPageUrl(pageUrl, reviewPathPrefix)\n );\n\n useEffect(() => {\n const updatePageUrl = () => {\n setCurrentPageUrl(getFigmaDevOverlayPageUrl(pageUrl, reviewPathPrefix));\n };\n\n window.addEventListener('popstate', updatePageUrl);\n window.addEventListener('hashchange', updatePageUrl);\n return () => {\n window.removeEventListener('popstate', updatePageUrl);\n window.removeEventListener('hashchange', updatePageUrl);\n };\n }, [pageUrl, reviewPathPrefix]);\n\n return currentPageUrl;\n}\n\nfunction isEditableFigmaDevOverlayEventTarget(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 tagName = element.tagName;\n return (\n tagName === 'INPUT' ||\n tagName === 'TEXTAREA' ||\n tagName === 'SELECT' ||\n element.isContentEditable === true\n );\n}\n\nfunction useCurrentViewport() {\n const [viewport, setViewport] = useState(getCurrentViewportSize);\n\n useEffect(() => {\n const updateViewport = () => setViewport(getCurrentViewportSize());\n\n window.addEventListener('resize', updateViewport);\n window.addEventListener('orientationchange', updateViewport);\n window.visualViewport?.addEventListener('resize', updateViewport);\n return () => {\n window.removeEventListener('resize', updateViewport);\n window.removeEventListener('orientationchange', updateViewport);\n window.visualViewport?.removeEventListener('resize', updateViewport);\n };\n }, []);\n\n return viewport;\n}\n\nfunction getCurrentViewportSize() {\n return {\n height: Math.round(window.innerHeight),\n width: Math.round(window.innerWidth),\n };\n}\n\nfunction getFigmaDevOverlayPageUrl(\n pageUrl: FigmaDevOverlayMountOptions['pageUrl'],\n reviewPathPrefix: string | undefined\n) {\n if (typeof pageUrl === 'function') return pageUrl();\n if (typeof pageUrl === 'string') return pageUrl;\n\n return normalizeTarget(\n `${window.location.pathname}${window.location.search}${window.location.hash}`,\n reviewPathPrefix\n );\n}\n\nfunction findBoundaryFigmaDevViewportMatch(\n presets: ReviewShellViewportPreset[],\n width: number\n): FigmaDevViewportMatch | null {\n const boundaries = getFigmaDevViewportBoundaries(presets);\n if (!boundaries) return null;\n\n if (width <= boundaries.minPreset.width) {\n return {\n label: 'Mobile',\n preset: boundaries.minPreset,\n rangeLabel: boundaries.mobileRangeLabel,\n };\n }\n\n if (width >= boundaries.maxPreset.width) {\n return {\n label: 'Full width',\n preset: boundaries.maxPreset,\n rangeLabel: boundaries.fullWidthRangeLabel,\n };\n }\n\n return null;\n}\n\nfunction getFigmaDevViewportBoundaries(\n presets: ReviewShellViewportPreset[]\n): FigmaDevViewportBoundaries | null {\n if (presets.length === 0) return null;\n\n const sortedPresets = [...presets].sort((a, b) => a.width - b.width);\n const minPreset = sortedPresets[0];\n const maxPreset = sortedPresets[sortedPresets.length - 1];\n\n return {\n fullWidthRangeLabel: `>= ${maxPreset.width}px`,\n maxPreset,\n minPreset,\n mobileRangeLabel: `<= ${minPreset.width}px`,\n };\n}\n\nconst figmaDevOverlayStyle = `\n :host {\n all: initial;\n color-scheme: dark;\n font-family:\n Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,\n \"Segoe UI\", sans-serif;\n --df-review-figma-dev-bg: rgba(15, 18, 24, 0.94);\n --df-review-figma-dev-panel: rgba(19, 24, 33, 0.96);\n --df-review-figma-dev-control: #202938;\n --df-review-figma-dev-control-hover: #273345;\n --df-review-figma-dev-border: rgba(226, 233, 245, 0.16);\n --df-review-figma-dev-border-soft: rgba(226, 233, 245, 0.09);\n --df-review-figma-dev-text: #edf3fb;\n --df-review-figma-dev-muted: rgba(237, 243, 251, 0.58);\n --df-review-figma-dev-subtle: rgba(237, 243, 251, 0.42);\n --df-review-figma-dev-accent: #7cc7ff;\n --df-review-figma-dev-accent-soft: rgba(124, 199, 255, 0.16);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .df-review-figma-dev-widget {\n position: fixed;\n right: calc(16px + env(safe-area-inset-right));\n bottom: calc(16px + env(safe-area-inset-bottom));\n z-index: 2147483200;\n display: grid;\n justify-items: end;\n gap: 8px;\n color: var(--df-review-figma-dev-text);\n font-size: 13px;\n line-height: 1.25;\n pointer-events: none;\n }\n\n .df-review-figma-dev-panel,\n .df-review-figma-dev-bar {\n pointer-events: auto;\n }\n\n .df-review-figma-dev-panel {\n display: grid;\n gap: 8px;\n width: min(360px, calc(100vw - 32px - env(safe-area-inset-left) - env(safe-area-inset-right)));\n max-height: min(460px, calc(100vh - 96px - env(safe-area-inset-top) - env(safe-area-inset-bottom)));\n overflow: hidden;\n border: 1px solid var(--df-review-figma-dev-border);\n border-radius: 8px;\n padding: 10px;\n background: var(--df-review-figma-dev-panel);\n box-shadow: 0 18px 48px rgba(0, 0, 0, 0.34);\n backdrop-filter: blur(14px);\n -webkit-backdrop-filter: blur(14px);\n }\n\n .df-review-figma-dev-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n min-width: 0;\n }\n\n .df-review-figma-dev-panel-header strong {\n font-size: 14px;\n font-weight: 700;\n }\n\n .df-review-figma-dev-panel-header span,\n .df-review-figma-dev-status,\n .df-review-figma-dev-empty {\n color: var(--df-review-figma-dev-muted);\n font-size: 12px;\n }\n\n .df-review-figma-dev-selected-controls {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 84px;\n gap: 8px;\n }\n\n .df-review-figma-dev-opacity-control,\n .df-review-figma-dev-y-control {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n height: 36px;\n border: 1px solid var(--df-review-figma-dev-border);\n border-radius: 8px;\n padding: 0 10px;\n background: var(--df-review-figma-dev-control);\n }\n\n .df-review-figma-dev-opacity-control span {\n color: var(--df-review-figma-dev-muted);\n font-size: 12px;\n }\n\n .df-review-figma-dev-opacity-control strong {\n min-width: 24px;\n text-align: right;\n font-size: 13px;\n }\n\n .df-review-figma-dev-opacity-control input[type=\"range\"] {\n flex: 1;\n min-width: 0;\n height: 24px;\n accent-color: var(--df-review-figma-dev-accent);\n }\n\n .df-review-figma-dev-y-control svg {\n width: 15px;\n height: 15px;\n color: var(--df-review-figma-dev-muted);\n }\n\n .df-review-figma-dev-y-control input {\n width: 100%;\n min-width: 0;\n border: 0;\n padding: 0;\n color: var(--df-review-figma-dev-text);\n background: transparent;\n font: inherit;\n outline: none;\n }\n\n .df-review-figma-dev-status,\n .df-review-figma-dev-empty {\n margin: 0;\n border: 1px dashed var(--df-review-figma-dev-border);\n border-radius: 8px;\n padding: 12px;\n }\n\n .df-review-figma-dev-list {\n display: grid;\n gap: 6px;\n min-height: 0;\n overflow: auto;\n }\n\n .df-review-figma-dev-row {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n align-items: center;\n gap: 8px;\n width: 100%;\n min-width: 0;\n border: 1px solid var(--df-review-figma-dev-border-soft);\n border-radius: 8px;\n padding: 12px 10px;\n color: var(--df-review-figma-dev-text);\n background: rgba(237, 243, 251, 0.035);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -webkit-user-drag: none;\n }\n\n .df-review-figma-dev-row:hover,\n .df-review-figma-dev-row:focus-visible {\n border-color: var(--df-review-figma-dev-border);\n outline: none;\n }\n\n .df-review-figma-dev-row.is-active {\n border-color: var(--df-review-figma-dev-accent);\n box-shadow: inset 0 0 0 1px var(--df-review-figma-dev-accent-soft);\n }\n\n .df-review-figma-dev-row-main {\n display: grid;\n gap: 2px;\n min-width: 0;\n }\n\n .df-review-figma-dev-row-main strong {\n color: var(--df-review-figma-dev-text);\n font-size: 13px;\n font-weight: 700;\n white-space: normal;\n word-break: break-word;\n }\n\n .df-review-figma-dev-row-main small {\n color: var(--df-review-figma-dev-muted);\n font-size: 12px;\n }\n\n .df-review-figma-image-layer-state {\n display: grid;\n grid-template-columns: repeat(3, 22px);\n align-items: center;\n gap: 2px;\n min-width: 0;\n height: 24px;\n }\n\n .df-review-figma-image-state-button {\n display: inline-grid;\n place-items: center;\n width: 22px;\n min-width: 22px;\n height: 22px;\n min-height: 22px;\n border: 0;\n border-radius: 0;\n padding: 0;\n color: var(--df-review-figma-dev-subtle);\n background: transparent;\n box-shadow: none;\n opacity: 0.68;\n cursor: pointer;\n }\n\n .df-review-figma-image-state-button:hover,\n .df-review-figma-image-state-button:focus-visible {\n color: var(--df-review-figma-dev-text);\n opacity: 1;\n outline: none;\n }\n\n .df-review-figma-image-state-button.is-active {\n color: var(--df-review-figma-dev-accent);\n opacity: 1;\n }\n\n .df-review-figma-image-state-button svg {\n width: 13px;\n height: 13px;\n }\n\n .df-review-figma-dev-bar {\n display: inline-flex;\n align-items: center;\n pointer-events: auto;\n }\n\n .df-review-figma-dev-button {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--df-review-figma-dev-border);\n border-radius: 8px;\n padding: 0;\n color: var(--df-review-figma-dev-muted);\n background: var(--df-review-figma-dev-control);\n box-shadow: 0 10px 24px rgba(0, 0, 0, 0.26);\n cursor: pointer;\n }\n\n .df-review-figma-dev-button:hover,\n .df-review-figma-dev-button:focus-visible,\n .df-review-figma-dev-widget.is-active .df-review-figma-dev-button.is-figma {\n color: var(--df-review-figma-dev-accent);\n border-color: rgba(124, 199, 255, 0.5);\n outline: none;\n }\n\n .df-review-figma-dev-button:disabled {\n color: var(--df-review-figma-dev-subtle);\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .df-review-figma-dev-button svg {\n width: 17px;\n height: 17px;\n }\n\n .df-review-figma-dev-button .df-review-figma-mark-icon {\n width: 17px;\n height: 17px;\n fill: currentColor;\n }\n\n .df-review-figma-dev-button.is-figma {\n width: 38px;\n height: 38px;\n }\n\n .df-review-figma-dev-button-count {\n position: absolute;\n right: -3px;\n top: -4px;\n display: inline-grid;\n place-items: center;\n min-width: 15px;\n height: 15px;\n border: 1px solid rgba(15, 18, 24, 0.86);\n border-radius: 4px;\n padding: 0 3px;\n color: currentColor;\n background: rgba(15, 18, 24, 0.92);\n font-size: 10px;\n font-weight: 700;\n line-height: 1;\n }\n\n .df-review-figma-dev-button.is-figma:disabled .df-review-figma-dev-button-count {\n color: var(--df-review-figma-dev-subtle);\n }\n\n @media (max-width: 420px) {\n .df-review-figma-dev-widget {\n right: calc(10px + env(safe-area-inset-right));\n bottom: calc(10px + env(safe-area-inset-bottom));\n }\n\n .df-review-figma-dev-selected-controls {\n grid-template-columns: 1fr;\n }\n }\n`;\n","import type { CreateReviewPagesOptions, ReviewShellGlobEntries, ReviewShellPage } from './types';\n\nconst escapeRegExp = (value: string) =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst normalizePageHref = (value: string) => {\n const href = value || '/';\n return href.startsWith('/') ? href : `/${href}`;\n};\n\nconst sortReviewPages = (a: ReviewShellPage, b: ReviewShellPage) => {\n if (a.href === '/') return -1;\n if (b.href === '/') return 1;\n return a.href.localeCompare(b.href);\n};\n\nexport const createReviewPagesFromGlob = (\n entries: ReviewShellGlobEntries,\n options: CreateReviewPagesOptions = {}\n): ReviewShellPage[] => {\n const root = options.root ?? '/page';\n const rootPattern = root ? new RegExp(`^${escapeRegExp(root)}`) : null;\n\n return Object.keys(entries)\n .map((key) => {\n const withoutRoot = rootPattern ? key.replace(rootPattern, '') : key;\n const href = withoutRoot.replace(/index\\.(tsx|ts|jsx|js)$/, '');\n return normalizePageHref(href === '' ? '/' : href);\n })\n .filter((href) => !options.exclude?.(href))\n .sort((a, b) => sortReviewPages({ href: a }, { href: b }))\n .map((href) => ({ href }));\n};\n","import type {\n ReviewPresenceAdapter,\n ReviewPresenceContext,\n ReviewPresenceState,\n ReviewPresenceUser,\n} from '../types';\n\ntype SupabaseRealtimeStatus =\n | 'SUBSCRIBED'\n | 'CHANNEL_ERROR'\n | 'TIMED_OUT'\n | 'CLOSED'\n | string;\n\ntype SupabaseRealtimeChannel = {\n topic?: string;\n on: (\n type: 'presence',\n filter: { event: 'sync' | 'join' | 'leave' },\n callback: () => void\n ) => SupabaseRealtimeChannel;\n subscribe: (\n callback: (status: SupabaseRealtimeStatus, error?: Error) => void\n ) => SupabaseRealtimeChannel;\n track: (payload: ReviewPresenceUser) => Promise<unknown>;\n untrack: () => Promise<unknown>;\n presenceState: () => Record<string, unknown[]>;\n teardown?: () => void;\n};\n\nexport type SupabasePresenceClient = {\n channel: (\n topic: string,\n options?: {\n config?: {\n private?: boolean;\n presence?: {\n key?: string;\n };\n };\n }\n ) => SupabaseRealtimeChannel;\n getChannels?: () => SupabaseRealtimeChannel[];\n removeChannel: (channel: SupabaseRealtimeChannel) => Promise<unknown>;\n};\n\nexport type SupabasePresenceAdapterOptions = {\n client: SupabasePresenceClient;\n channelPrefix?: string;\n private?: boolean;\n};\n\nconst normalizeTopicPart = (value: string) =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'default';\n\nconst getPresenceTopic = (channelPrefix: string, projectId: string) =>\n `${normalizeTopicPart(channelPrefix)}-${normalizeTopicPart(projectId)}`;\n\nconst PRESENCE_BRIDGE_KEY = '__dfReviewPresenceBridge';\n\ntype SupabasePresenceBridge = {\n channel: SupabaseRealtimeChannel;\n emit: () => void;\n getUsers: () => ReviewPresenceUser[];\n listeners: Set<() => void>;\n ready: Promise<void>;\n refCount: number;\n};\n\ntype SupabasePresenceBridgeChannel = SupabaseRealtimeChannel & {\n [PRESENCE_BRIDGE_KEY]?: SupabasePresenceBridge;\n};\n\nconst isReviewPresenceUser = (value: unknown): value is ReviewPresenceUser => {\n if (!value || typeof value !== 'object') return false;\n\n const candidate = value as Partial<ReviewPresenceUser>;\n return (\n typeof candidate.projectId === 'string' &&\n typeof candidate.sessionId === 'string' &&\n typeof candidate.userId === 'string' &&\n typeof candidate.updatedAt === 'string'\n );\n};\n\nconst flattenPresenceState = (\n state: Record<string, unknown[]>\n): ReviewPresenceUser[] =>\n Object.values(state).flat().filter(isReviewPresenceUser);\n\nconst dedupePresenceUsers = (users: ReviewPresenceUser[]) => {\n const userBySessionId = new Map<string, ReviewPresenceUser>();\n\n users.forEach((user) => {\n const currentUser = userBySessionId.get(user.sessionId);\n if (\n !currentUser ||\n Date.parse(user.updatedAt) >= Date.parse(currentUser.updatedAt)\n ) {\n userBySessionId.set(user.sessionId, user);\n }\n });\n\n return Array.from(userBySessionId.values());\n};\n\nconst sortPresenceUsers = (\n users: ReviewPresenceUser[],\n selfSessionId: string\n) =>\n users.sort((a, b) => {\n if (a.sessionId === selfSessionId) return -1;\n if (b.sessionId === selfSessionId) return 1;\n return a.displayName.localeCompare(b.displayName);\n });\n\nconst subscribeChannel = (channel: SupabaseRealtimeChannel) =>\n new Promise<void>((resolve, reject) => {\n channel.subscribe((status, error) => {\n if (status === 'SUBSCRIBED') {\n resolve();\n return;\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {\n reject(error ?? new Error(`Supabase presence ${status}`));\n }\n });\n });\n\nconst removeTopicChannels = async (\n client: SupabasePresenceClient,\n topic: string\n) => {\n const existingChannels = client.getChannels?.() ?? [];\n const normalizedTopic = `realtime:${topic}`;\n const topicChannels = existingChannels.filter(\n (channel) => channel.topic === topic || channel.topic === normalizedTopic\n );\n\n await Promise.allSettled(\n topicChannels.map(async (channel) => {\n const result = await client.removeChannel(channel);\n if (result !== 'ok') {\n channel.teardown?.();\n }\n })\n );\n};\n\nconst getTopicChannel = (\n client: SupabasePresenceClient,\n topic: string\n): SupabasePresenceBridgeChannel | undefined => {\n const normalizedTopic = `realtime:${topic}`;\n\n return client\n .getChannels?.()\n .find(\n (channel) =>\n channel.topic === topic || channel.topic === normalizedTopic\n ) as SupabasePresenceBridgeChannel | undefined;\n};\n\nconst createPresenceBridge = (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const channel = client.channel(topic, {\n config: {\n private: isPrivate,\n presence: {\n key: context.sessionId,\n },\n },\n }) as SupabasePresenceBridgeChannel;\n\n const bridge: SupabasePresenceBridge = {\n channel,\n listeners: new Set(),\n refCount: 0,\n getUsers: () =>\n dedupePresenceUsers(flattenPresenceState(channel.presenceState())),\n emit: () => {\n bridge.listeners.forEach((listener) => listener());\n },\n ready: Promise.resolve(),\n };\n\n channel[PRESENCE_BRIDGE_KEY] = bridge;\n channel\n .on('presence', { event: 'sync' }, bridge.emit)\n .on('presence', { event: 'join' }, bridge.emit)\n .on('presence', { event: 'leave' }, bridge.emit);\n\n bridge.ready = subscribeChannel(channel).catch((error) => {\n delete channel[PRESENCE_BRIDGE_KEY];\n throw error;\n });\n\n return bridge;\n};\n\nconst getPresenceBridge = async (\n client: SupabasePresenceClient,\n topic: string,\n context: ReviewPresenceContext,\n isPrivate: boolean\n) => {\n const existingChannel = getTopicChannel(client, topic);\n const existingBridge = existingChannel?.[PRESENCE_BRIDGE_KEY];\n\n if (existingBridge) return existingBridge;\n\n if (existingChannel) {\n await removeTopicChannels(client, topic);\n }\n\n return createPresenceBridge(client, topic, context, isPrivate);\n};\n\nexport const createSupabasePresenceAdapter = ({\n client,\n channelPrefix = 'review-presence',\n private: isPrivate = false,\n}: SupabasePresenceAdapterOptions): ReviewPresenceAdapter => ({\n label: 'supabase-presence',\n connect: async (context: ReviewPresenceContext) => {\n const topic = getPresenceTopic(channelPrefix, context.projectId);\n const bridge = await getPresenceBridge(client, topic, context, isPrivate);\n const listeners = new Set<(users: ReviewPresenceUser[]) => void>();\n let currentState = context.initialState;\n bridge.refCount += 1;\n\n const getUsers = () =>\n sortPresenceUsers(\n [...bridge.getUsers()],\n context.sessionId\n );\n\n const emit = () => {\n const users = getUsers();\n listeners.forEach((listener) => listener(users));\n };\n\n const bridgeListener = () => emit();\n bridge.listeners.add(bridgeListener);\n\n await bridge.ready;\n await bridge.channel.track(currentState);\n bridge.emit();\n emit();\n\n return {\n update: async (state: Partial<ReviewPresenceState>) => {\n currentState = {\n ...currentState,\n ...state,\n sessionId: context.sessionId,\n userId: context.userId,\n displayName: context.displayName,\n color: context.color,\n updatedAt: new Date().toISOString(),\n };\n await bridge.channel.track(currentState);\n },\n subscribe: (callback) => {\n listeners.add(callback);\n callback(getUsers());\n\n return () => {\n listeners.delete(callback);\n };\n },\n disconnect: async () => {\n listeners.clear();\n bridge.listeners.delete(bridgeListener);\n bridge.refCount = Math.max(0, bridge.refCount - 1);\n if (bridge.refCount > 0) return;\n\n delete (bridge.channel as SupabasePresenceBridgeChannel)[\n PRESENCE_BRIDGE_KEY\n ];\n await bridge.channel.untrack();\n await client.removeChannel(bridge.channel);\n },\n };\n },\n});\n"],"mappings":";;;;;;;;;;;;AAAA,OAAOA,YAAW;AAClB,SAAS,cAAAC,mBAAkB;;;ACCpB,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OA+D7B,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACjEtB,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAhC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACA9B,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAhC,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAhC,IAAM,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACApC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACA9B,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAxC,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAvC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["React","createRoot","useCallback","useEffect","useMemo","useRef","useState","createElement","forwardRef","createElement","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__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","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","jsx","jsxs","jsx","jsxs","jsx","jsxs","useMemo","jsx","jsxs","useMemo","jsx","jsxs","useRef","useState","useCallback","useEffect","useMemo","useState","useMemo","useState","useMemo","useState","image","useMemo","useState","useCallback","useEffect","jsx","jsxs","jsx","jsx","jsxs","useState","useRef","useEffect","useState","jsx","jsxs","error","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","toPascalCase","element","depth","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useCallback","useEffect","useRef","useRef","useCallback","useEffect","root","jsx","jsxs","jsx","jsxs","ReviewScopeIcon","Map","useCallback","useCallback","runWithAutoScrollBehavior","useCallback","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useRef","useRef","useCallback","useEffect","useCallback","useEffect","useCallback","useEffect","useCallback","useCallback","useEffect","useMemo","useRef","useState","useRef","useState","useMemo","useCallback","useEffect","useCallback","useEffect","useState","useCallback","useEffect","useMemo","useRef","useState","useRef","useState","useMemo","useCallback","useEffect","frame","useState","useCallback","useEffect","useCallback","useMemo","useMemo","useCallback","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useMemo","useState","useState","useMemo","useCallback","useEffect","useEffect","useMemo","useRef","useState","statusOption","item","updated","useMemo","useState","useRef","statusOption","assigneeOption","jsx","jsxs","useRef","useState","useMemo","useEffect","useCallback","refreshReviewData","target","toastMessage","useEffect","useMemo","useState","jsx","jsxs","useMemo","useState","useEffect","jsx","createRoot","React"]}