UNPKG

@sucoza/visual-regression-monitor-devtools-plugin

Version:

DevTools plugin for visual regression testing with screenshot capture, comparison, and Playwright integration

314 lines (248 loc) 9.22 kB
# Visual Regression Monitor DevTools Plugin A comprehensive TanStack DevTools plugin for visual regression testing with screenshot capture, comparison, and Playwright integration. ## Features ### 📸 Screenshot Capture - **Playwright Integration**: Seamless integration with Playwright MCP tools for browser automation - **Responsive Testing**: Capture screenshots across multiple viewport breakpoints - **Cross-Browser Support**: Test on Chromium, Firefox, and WebKit engines - **Element Targeting**: Capture specific page elements using CSS selectors - **Animation Capture**: Frame-by-frame recording of UI animations and transitions ### 🔍 Visual Comparison - **Advanced Diff Algorithm**: Pixel-by-pixel comparison with configurable sensitivity - **SSIM Analysis**: Structural Similarity Index for perceptually accurate comparisons - **Perceptual Hashing**: Fast similarity detection using image fingerprinting - **Threshold Configuration**: Customizable difference thresholds for pass/fail criteria - **Region Analysis**: Detailed breakdown of changed areas with severity levels ### 📱 Responsive Testing - **Breakpoint Management**: Predefined and custom viewport configurations - **Layout Shift Detection**: Automatic detection of significant layout changes - **Cross-Viewport Comparison**: Compare the same URL across different screen sizes - **Mobile/Desktop Testing**: Simulate different device types and orientations ### 📊 Timeline & Analytics - **Activity Timeline**: Chronological view of testing activities - **Test Suite Management**: Organize screenshots into logical test groups - **Statistics Dashboard**: Comprehensive metrics on test results and coverage - **Export/Import**: Configuration and results export for CI/CD integration ## Installation ```bash npm install @sucoza/visual-regression-monitor-devtools-plugin ``` ## Usage ### Basic Setup ```typescript import { PluginPanel } from '@sucoza/visual-regression-monitor-devtools-plugin'; // Use as a standalone component function DevTools() { return ( <div className="devtools-container"> <PluginPanel /> </div> ); } ``` ### With TanStack DevTools ```typescript import { createVisualRegressionDevToolsClient } from '@sucoza/visual-regression-monitor-devtools-plugin'; const client = createVisualRegressionDevToolsClient(); // Access plugin functionality const { screenshots, visualDiffs, settings } = client.getState(); ``` ### Hooks API ```typescript import { useScreenshots, useVisualDiff, useResponsiveTesting } from '@sucoza/visual-regression-monitor-devtools-plugin'; function MyComponent() { const { screenshots, actions } = useScreenshots(); const { visualDiffs, actions: diffActions } = useVisualDiff(); const { breakpoints, actions: responsiveActions } = useResponsiveTesting(); // Capture a screenshot const handleCapture = async () => { await actions.captureScreenshot({ url: 'https://example.com', name: 'Homepage', viewport: { width: 1920, height: 1080, deviceScaleFactor: 1, isMobile: false } }); }; // Compare screenshots const handleCompare = async () => { await diffActions.compareScreenshots(baselineId, comparisonId); }; // Responsive testing const handleResponsiveTesting = async () => { await responsiveActions.testUrlAcrossBreakpoints('https://example.com'); }; return ( <div> <button onClick={handleCapture}>Capture Screenshot</button> <button onClick={handleCompare}>Compare Screenshots</button> <button onClick={handleResponsiveTesting}>Test Responsive</button> </div> ); } ``` ## Configuration ### Screenshot Settings ```typescript const settings = { captureSettings: { fullPage: false, hideScrollbars: true, disableAnimations: false, waitForFonts: true, waitForImages: true, delay: 0, quality: 90, format: 'png' } }; ``` ### Responsive Breakpoints ```typescript const breakpoints = [ { name: 'Mobile', width: 375, height: 667, deviceScaleFactor: 2, isMobile: true }, { name: 'Tablet', width: 768, height: 1024, deviceScaleFactor: 1, isMobile: false }, { name: 'Desktop', width: 1920, height: 1080, deviceScaleFactor: 1, isMobile: false }, ]; ``` ### Diff Configuration ```typescript const diffOptions = { ignoreAntialiasing: true, ignoreColors: false, threshold: 0.2, regions: [ { x: 0, y: 0, width: 100, height: 100 } // Exclude specific regions ] }; ``` ## Playwright MCP Integration This plugin integrates with Playwright MCP (Model Context Protocol) tools for browser automation: ```typescript // Example MCP tool usage (handled internally by the plugin) // mcp__playwright__browser_navigate({ url: 'https://example.com' }) // mcp__playwright__browser_resize({ width: 1920, height: 1080 }) // mcp__playwright__browser_take_screenshot({ fullPage: true }) ``` ## API Reference ### Core Functions #### Screenshot Management - `captureScreenshot(request: CaptureRequest)`: Capture a single screenshot - `captureResponsiveScreenshots(url: string, viewports: Viewport[])`: Capture across multiple viewports - `captureAnimationFrames(url: string, selector: string, duration: number)`: Record animation frames #### Visual Comparison - `compareScreenshots(baselineId: string, comparisonId: string)`: Compare two screenshots - `batchCompareScreenshots(baselineId: string, comparisonIds: string[])`: Batch comparison - `calculateSimilarityScore(image1: ImageData, image2: ImageData)`: Calculate similarity #### State Management - `getState()`: Get current plugin state - `subscribe(callback: Function)`: Subscribe to state changes - `dispatch(action: DevToolsAction)`: Dispatch state updates ### Types ```typescript interface Screenshot { id: string; name: string; url: string; selector?: string; viewport: Viewport; browserEngine: BrowserEngine; timestamp: number; dataUrl: string; metadata: ScreenshotMetadata; tags?: string[]; } interface VisualDiff { id: string; baselineId: string; comparisonId: string; timestamp: number; status: 'passed' | 'failed' | 'pending'; differences: DiffRegion[]; metrics: DiffMetrics; threshold: number; } interface CaptureRequest { url: string; selector?: string; viewport?: Viewport; options?: Partial<CaptureSettings>; browserEngine?: BrowserEngine; name?: string; tags?: string[]; } ``` ## Example Application Run the example application to see the plugin in action: ```bash cd example npm install npm run dev ``` The example includes: - Plugin demonstration with all features - Different layout patterns for testing - Interactive controls for exploring functionality ## Development ### Build ```bash npm run build # Build for production npm run dev # Build in watch mode npm run typecheck # Type checking npm run lint # ESLint npm run format # Prettier ``` ### Testing ```bash npm test # Run tests npm run test:ui # Run tests with UI ``` ## Architecture The plugin follows TanStack DevTools patterns: - **Event-Driven Architecture**: Uses `@tanstack/devtools-event-client` for communication - **Zustand State Management**: Central state store with `useSyncExternalStore` - **Component Architecture**: Modular React components with hooks - **TypeScript**: Full type safety throughout the codebase - **Build System**: Rollup with dual CJS/ESM output ### Directory Structure ``` src/ ├── components/ # React UI components ├── PluginPanel.tsx # Main devtools panel ├── ScreenshotCapture.tsx # Screenshot interface ├── VisualDiff.tsx # Diff visualization ├── Timeline.tsx # Activity timeline ├── ComparisonView.tsx # Animation analysis └── Settings.tsx # Configuration ├── core/ # Business logic ├── devtools-client.ts # Event client integration ├── devtools-store.ts # Zustand store ├── screenshot-engine.ts # Playwright integration ├── diff-algorithm.ts # Visual comparison └── storage.ts # Persistence layer ├── hooks/ # Custom React hooks ├── useScreenshots.ts # Screenshot management ├── useVisualDiff.ts # Diff operations └── useResponsiveTesting.ts # Responsive testing ├── types/ # TypeScript definitions ├── utils/ # Utility functions ├── image-processing.ts # Image manipulation └── index.ts # General utilities └── index.ts # Main exports ``` ## Contributing 1. Fork the repository 2. Create a feature branch 3. Make your changes 4. Add tests for new functionality 5. Ensure all tests pass 6. Submit a pull request ## License MIT --- Part of the @sucoza TanStack DevTools ecosystem. ## Support - 📖 [Documentation](https://github.com/tanstack/devtools) - 🐛 [Bug Reports](https://github.com/tanstack/devtools/issues) - 💬 [Discussions](https://github.com/tanstack/devtools/discussions) - 📧 [Support](mailto:support@tanstack.com) --- Part of the @sucoza TanStack DevTools ecosystem.