diff --git a/.github/workflows/sdk-e2e.yml b/.github/workflows/sdk-e2e.yml index 6960189..b23dba7 100644 --- a/.github/workflows/sdk-e2e.yml +++ b/.github/workflows/sdk-e2e.yml @@ -269,7 +269,7 @@ jobs: id: playwright-cache with: path: ~/.cache/ms-playwright - key: playwright-${{ steps.playwright-version.outputs.version }}-chromium + key: playwright-${{ steps.playwright-version.outputs.version }}-ember-chromium-v2 - name: Install Playwright browsers if: steps.playwright-cache.outputs.cache-hit != 'true' diff --git a/package-lock.json b/package-lock.json index ff642f1..b81704a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@vizzly-testing/cli", - "version": "0.23.1", + "version": "0.23.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@vizzly-testing/cli", - "version": "0.23.1", + "version": "0.23.2", "license": "MIT", "dependencies": { "@vizzly-testing/honeydiff": "^0.9.0", @@ -35,7 +35,7 @@ "@tanstack/react-query": "^5.90.11", "@types/node": "^25.0.2", "@vitejs/plugin-react": "^5.0.3", - "@vizzly-testing/observatory": "^0.3.0", + "@vizzly-testing/observatory": "^0.3.3", "autoprefixer": "^10.4.21", "babel-plugin-transform-remove-console": "^6.9.4", "postcss": "^8.5.6", @@ -195,6 +195,7 @@ "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", @@ -3464,6 +3465,7 @@ "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -3506,9 +3508,9 @@ } }, "node_modules/@vizzly-testing/observatory": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@vizzly-testing/observatory/-/observatory-0.3.0.tgz", - "integrity": "sha512-1kFOE2KXoRgT75elhq+qS5DHZ6wrE4ZXXi29iOKiwCUyb7crSqOAR0YEvaulXcT1OScOkHDlgApAvC/kz8rFFQ==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@vizzly-testing/observatory/-/observatory-0.3.3.tgz", + "integrity": "sha512-5I6Q5x3KmT+hnMMQtNHDSLNLEtAZXh6F1ftcA6K1mWfsy2rxnk4FY68dBiPl4ucoyxeKaYhSois0QEG4kK14Sg==", "dev": true, "license": "MIT", "dependencies": { @@ -3923,6 +3925,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -6629,6 +6632,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -6866,6 +6870,7 @@ "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6876,6 +6881,7 @@ "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -7724,7 +7730,8 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/tapable": { "version": "2.3.0", @@ -7813,6 +7820,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7982,6 +7990,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8127,6 +8136,7 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -8220,6 +8230,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8287,6 +8298,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 718f25a..4453c58 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "@tanstack/react-query": "^5.90.11", "@types/node": "^25.0.2", "@vitejs/plugin-react": "^5.0.3", - "@vizzly-testing/observatory": "^0.3.0", + "@vizzly-testing/observatory": "^0.3.3", "autoprefixer": "^10.4.21", "babel-plugin-transform-remove-console": "^6.9.4", "postcss": "^8.5.6", diff --git a/src/reporter/src/components/comparison/fullscreen-viewer.jsx b/src/reporter/src/components/comparison/fullscreen-viewer.jsx index 1838416..dfe3395 100644 --- a/src/reporter/src/components/comparison/fullscreen-viewer.jsx +++ b/src/reporter/src/components/comparison/fullscreen-viewer.jsx @@ -19,6 +19,7 @@ import { DocumentMagnifyingGlassIcon, InformationCircleIcon, ListBulletIcon, + MapPinIcon, } from '@heroicons/react/24/outline'; import { ApprovalButtonGroup, @@ -101,6 +102,7 @@ function FullscreenViewerInner({ let [showInspector, setShowInspector] = useState(false); let [queueFilter, setQueueFilter] = useState('needs-review'); let [_showBaseline, setShowBaseline] = useState(true); + let [showRegions, setShowRegions] = useState(false); let { zoom, setZoom } = useZoom('fit'); let { isActive: isReviewMode } = useReviewMode(); @@ -111,7 +113,7 @@ function FullscreenViewerInner({ // Toggle inspector (closes other panels) let toggleInspector = useCallback(() => { setShowInspector(prev => !prev); - }, []); + }, [setShowInspector]); // Transform comparisons for queue display // Map CLI status to Observatory result format @@ -291,7 +293,7 @@ function FullscreenViewerInner({ setViewMode(current => current === VIEW_MODES.OVERLAY ? VIEW_MODES.TOGGLE : VIEW_MODES.OVERLAY ); - }, []); + }, [setViewMode]); // Toggle handler for 'd' - toggles diff overlay or baseline/current let handleDiffToggle = useCallback(() => { @@ -300,7 +302,7 @@ function FullscreenViewerInner({ } else { setShowDiffOverlay(prev => !prev); } - }, [viewMode]); + }, [viewMode, setShowBaseline, setShowDiffOverlay]); // Review mode shortcuts let reviewModeShortcuts = useMemo( @@ -320,6 +322,7 @@ function FullscreenViewerInner({ onReject, cycleViewMode, handleDiffToggle, + setViewMode, ] ); @@ -352,12 +355,25 @@ function FullscreenViewerInner({ toggleInspector(); } break; + case 'g': + if (!e.metaKey && !e.ctrlKey) { + e.preventDefault(); + setShowRegions(prev => !prev); + } + break; } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); - }, [canNavigate, handlePrevious, handleNext, onClose, toggleInspector]); + }, [ + canNavigate, + handlePrevious, + handleNext, + onClose, + toggleInspector, + setShowRegions, + ]); // Scroll active queue item into view useEffect(() => { @@ -381,7 +397,7 @@ function FullscreenViewerInner({ behavior: 'smooth', }); } - }, []); + }, [activeQueueItemRef.current]); if (!comparison) { return ( @@ -523,6 +539,20 @@ function FullscreenViewerInner({ + {/* Regions toggle - only show if comparison has regions */} + {comparison?.confirmedRegions?.length > 0 && ( + + )} + + {/* Regions toggle - mobile */} + {comparison?.confirmedRegions?.length > 0 && ( + + )} + {canDelete && onDelete && (