or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

build-management.mdconfiguration.mdindex.mdstorybook-integration.mdvisual-test-modes.md
tile.json

visual-test-modes.mddocs/

Visual Test Modes

Predefined visual testing configurations for different themes, viewports, and layout options to ensure comprehensive visual coverage.

Capabilities

Base Modes

Standard visual testing modes with light and dark theme support.

/**
 * Base visual testing modes for theme variations
 * Object with Light and Dark mode configurations
 */
declare const baseModes: {
  Light: { theme: 'light'; viewport: 'default' };
  Dark: { theme: 'dark'; viewport: 'default' };
};

The baseModes object contains:

  • Light: Light theme with default viewport
  • Dark: Dark theme with default viewport

Usage Example:

// Apply base modes to all stories
export default {
  title: 'Components/Button',
  component: Button,
  parameters: {
    chromatic: {
      modes: {
        light: baseModes.find(mode => mode.name === 'light'),
        dark: baseModes.find(mode => mode.name === 'dark'),
      },
    },
  },
};

Panel Modes

Advanced visual testing modes including 2-up panel layouts for side-by-side comparisons.

/**
 * Panel-specific visual testing modes
 * Object with disabled states and 2-up layout configurations
 */
declare const panelModes: {
  Light: { disabled: true };
  Dark: { disabled: true };
  'Right 2-up': { theme: 'right'; viewport: 'default' };
  'Bottom 2-up': { theme: 'bottom'; viewport: 'default' };
};

The panelModes object contains:

  • Light: Disabled interaction state
  • Dark: Disabled interaction state
  • Right 2-up: Right theme layout with default viewport
  • Bottom 2-up: Bottom theme layout with default viewport

Panel Mode Configurations:

interface PanelModeConfig extends VisualTestMode {
  /** Panel layout type */
  layout?: 'right-2up' | 'bottom-2up';
  /** Whether interactions are disabled */
  disabled?: boolean;
  /** Multiple viewport configurations for 2-up layouts */
  viewports?: ViewportConfig[];
  /** Multiple theme configurations for 2-up layouts */
  themes?: string[];
}

Usage Examples:

// Use panel modes for complex component testing
export const ComplexComponent = {
  parameters: {
    chromatic: {
      modes: {
        'light-disabled': {
          theme: 'light',
          disabled: true,
        },
        'right-2up': {
          layout: 'right-2up',
          themes: ['light', 'dark'],
          viewport: { width: 1200, height: 800 },
        },
        'bottom-2up': {
          layout: 'bottom-2up',
          viewports: [
            { width: 375, height: 667 }, // Mobile
            { width: 1200, height: 800 }, // Desktop
          ],
        },
      },
    },
  },
};

Custom Mode Creation

Create custom visual testing modes for specific testing scenarios.

/**
 * Create a custom visual test mode
 * @param config - Mode configuration object
 * @returns Configured visual test mode
 */
function createVisualTestMode(config: VisualTestModeConfig): VisualTestMode;

interface VisualTestModeConfig {
  /** Unique mode name */
  name: string;
  /** Viewport configuration */
  viewport?: ViewportConfig;
  /** Theme identifier */
  theme?: string;
  /** CSS media query for responsive testing */
  mediaQuery?: string;
  /** Animation pause settings */
  pauseAnimationAtEnd?: boolean;
  /** Delay before capturing screenshot */
  delay?: number;
  /** Custom CSS to inject */
  css?: string;
  /** Custom JavaScript to execute */
  javascript?: string;
  /** Additional parameters */
  [key: string]: any;
}

Usage Examples:

// Custom responsive testing modes
const customModes = {
  mobile: {
    name: 'mobile',
    viewport: { width: 375, height: 667 },
    theme: 'light',
  },
  tablet: {
    name: 'tablet', 
    viewport: { width: 768, height: 1024 },
    theme: 'light',
  },
  desktop: {
    name: 'desktop',
    viewport: { width: 1200, height: 800 },
    theme: 'light',
  },
  'dark-mobile': {
    name: 'dark-mobile',
    viewport: { width: 375, height: 667 },
    theme: 'dark',
  },
};

// Animation-specific modes
const animationModes = {
  'animation-start': {
    name: 'animation-start',
    delay: 0,
    pauseAnimationAtEnd: false,
  },
  'animation-end': {
    name: 'animation-end',
    delay: 2000,
    pauseAnimationAtEnd: true,
  },
};

// Apply custom modes to stories
export const ResponsiveComponent = {
  parameters: {
    chromatic: {
      modes: customModes,
    },
  },
};

export const AnimatedComponent = {
  parameters: {
    chromatic: {
      modes: animationModes,
    },
  },
};

Mode Utilities

Helper functions for working with visual test modes.

/**
 * Merge multiple mode configurations
 * @param modes - Array of mode objects to merge
 * @returns Combined mode configuration
 */
function mergeModes(...modes: Record<string, VisualTestMode>[]): Record<string, VisualTestMode>;

/**
 * Filter modes by criteria
 * @param modes - Modes object to filter
 * @param criteria - Filter function
 * @returns Filtered modes object
 */
function filterModes(
  modes: Record<string, VisualTestMode>,
  criteria: (mode: VisualTestMode) => boolean
): Record<string, VisualTestMode>;

/**
 * Get viewport dimensions for a mode
 * @param mode - Visual test mode
 * @returns Viewport configuration or default
 */
function getViewport(mode: VisualTestMode): ViewportConfig;

Usage Examples:

import { mergeModes, filterModes } from '@chromatic-com/storybook';

// Merge base modes with custom modes
const allModes = mergeModes(
  { light: baseModes[0], dark: baseModes[1] },
  customModes,
  animationModes
);

// Filter modes by viewport width
const mobileOnlyModes = filterModes(allModes, (mode) => {
  const viewport = getViewport(mode);
  return viewport.width <= 768;
});

// Use filtered modes
export const MobileComponent = {
  parameters: {
    chromatic: {
      modes: mobileOnlyModes,
    },
  },
};

Global Mode Configuration

Configure modes globally for all stories in your Storybook.

/**
 * Global mode configuration interface
 */
interface GlobalModeConfig {
  /** Default modes applied to all stories */
  default?: Record<string, VisualTestMode>;
  /** Modes applied only to specific story kinds */
  perKind?: Record<string, Record<string, VisualTestMode>>;
  /** Modes excluded from specific stories */
  exclude?: Record<string, string[]>;
}

Usage Example:

// .storybook/main.ts
export default {
  parameters: {
    chromatic: {
      modes: {
        // Apply to all stories by default
        light: { theme: 'light' },
        dark: { theme: 'dark' },
        mobile: { 
          viewport: { width: 375, height: 667 },
          theme: 'light' 
        },
      },
    },
  },
};

// Override for specific story kinds
export default {
  title: 'Components/Complex',
  parameters: {
    chromatic: {
      modes: {
        // Inherit global modes and add specific ones
        ...globalModes,
        'high-contrast': {
          theme: 'high-contrast',
          css: 'filter: contrast(2);',
        },
      },
    },
  },
};