Maintain a CSS Animation System

CSS Animation System

This document outlines the standardized animation and transition system implemented across our component library. The system provides a consistent approach to animations, transitions, and interactive states.

Table of Contents

Overview

The animation system is designed to provide:
  • Consistency: Standardized timing and easing functions across components
  • Maintainability: Centralized animation properties for easier updates
  • Performance: Specific property transitions instead of transition: all
  • Flexibility: Component-specific customizations through utility classes
  • Accessibility: Respect for user preferences like reduced motion
All animation styles are defined in /site/src/styles/animations.css.

CSS Custom Properties

The system defines the following CSS custom properties (variables) for consistent animation parameters:

Timing Durations

css
--transition-duration-fast: 0.1s;
--transition-duration-standard: 0.2s;  /* Most common in our codebase */
--transition-duration-slow: 0.3s;
--transition-duration-slower: 0.5s;

Timing Functions

css
--transition-timing-standard: ease-in-out;  /* Most common in our codebase */
--transition-timing-smooth: cubic-bezier(0.4, 0, 0.2, 1);
--transition-timing-bounce: cubic-bezier(0.175, 0.885, 0.32, 1.275);
--transition-timing-sharp: cubic-bezier(0.4, 0, 0.6, 1);

Transform Values

css
--transform-elevation-small: translateY(-2px);
--transform-elevation-medium: translateY(-4px);
--transform-elevation-large: translateY(-8px);

Color Mix Values

css
--color-mix-hover-light: 20%;  /* Standard lightening amount */
--color-mix-hover-medium: 40%;
--color-mix-hover-strong: 60%;

Utility Classes

The system provides utility classes for common transition patterns:

Transition Property Classes

  • .transition-all: Transitions all properties (use sparingly for performance)
  • .transition-colors: Transitions color-related properties
  • .transition-transform: Transitions transform properties
  • .transition-borders: Transitions border-related properties
  • .transition-opacity: Transitions opacity
  • .transition-shadow: Transitions box-shadow

Duration Modifiers

  • .transition-fast: Uses fast duration
  • .transition-slow: Uses slow duration
  • .transition-slower: Uses slower duration

Timing Function Modifiers

  • .transition-smooth: Uses smooth timing function
  • .transition-bounce: Uses bounce timing function
  • .transition-sharp: Uses sharp timing function

Hover Effect Classes

  • .hover-elevate: Standard elevation on hover
  • .hover-lighten: Standard background lightening on hover

Component-Specific Mixins

The system includes pre-defined mixins for common component patterns:

Card Hover Effect

css
.card-hover-effect {
  transition-property: transform, background-color;
  transition-duration: var(--transition-duration-standard);
  transition-timing-function: var(--transition-timing-standard);
}

.card-hover-effect:hover {
  transform: var(--transform-elevation-small);
  background: color-mix(
    in oklab,
    var(--clr-lossless-primary-glass),
    var(--clr-lossless-primary-dark) var(--color-mix-hover-light)
  );
}
css
.link-hover-effect {
  transition-property: color;
  transition-duration: var(--transition-duration-standard);
  transition-timing-function: var(--transition-timing-smooth);
}

.link-hover-effect:hover {
  color: var(--clr-lossless-accent--brightest);
}
css
.internal-link-hover-effect {
  border-bottom: 1px dashed var(--clr-lossless-accent--brightest);
  transition-property: border-bottom-style;
  transition-duration: var(--transition-duration-standard);
  transition-timing-function: var(--transition-timing-smooth);
}

.internal-link-hover-effect:hover {
  border-bottom-style: solid;
}

State Management

The system supports state-based animations using data attributes:
css
[data-state] {
  transition-property: color, background-color, border-color, transform, opacity;
  transition-duration: var(--transition-duration-standard);
  transition-timing-function: var(--transition-timing-standard);
}

[data-state="active"] {
  opacity: 1;
}

[data-state="hover"] {
  opacity: 0.9;
  cursor: pointer;
}

[data-state="focus"] {
  outline: 2px solid var(--clr-lossless-accent--brightest);
  outline-offset: 2px;
}

Starwind Integration

The system integrates with Starwind components through compatibility classes:
css
/* Compatibility variables */
--default-transition-duration: var(--transition-duration-standard);
--default-transition-timing-function: var(--transition-timing-standard);

/* Compatibility classes */
.starwind-transition {
  transition-property: color, background-color, border-color, transform, opacity;
  transition-duration: var(--transition-duration-standard);
  transition-timing-function: var(--transition-timing-standard);
}

.starwind-transition-colors {
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke,
    --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
  transition-timing-function: var(--transition-timing-standard);
  transition-duration: var(--transition-duration-standard);
}

Accessibility

The system respects user preferences for reduced motion:
css
@media (prefers-reduced-motion: reduce) {
  /* All transition classes */
  .transition-all,
  .transition-colors,
  /* ... other classes ... */ {
    transition-duration: 0.1s !important;
    transition-property: color, background-color !important;
    transform: none !important;
  }
}

Migration Guide

To migrate existing components to the new animation system:
  1. Replace hardcoded transitions with utility classes:
    Before:
    css
    .tool-card {
      transition: all 0.2s ease-in-out;
    }
    After:
    css
    .tool-card {
      /* Apply utility classes */
      transition-property: transform, background-color;
      transition-duration: var(--transition-duration-standard);
      transition-timing-function: var(--transition-timing-standard);
    }
    Or even better:
    css
    .tool-card {
      /* Use component-specific mixin */
      @apply card-hover-effect;
    }
  2. Replace hardcoded hover effects with utility classes:
    Before:
    css
    .tool-card:hover {
      background: color-mix(
        in oklab,
        var(--clr-lossless-primary-glass),
        var(--clr-lossless-primary-dark) 20%
      );
      transform: translateY(-2px);
    }
    After:
    html
    <div class="tool-card card-hover-effect">
      <!-- Content -->
    </div>
  3. For components with multiple transitions, combine utility classes:
    html
    <div class="tool-card transition-transform transition-colors hover-elevate hover-lighten">
      <!-- Content -->
    </div>

Examples

Card Component

html
<div class="tool-card card-hover-effect">
  <!-- Card content -->
</div>
html
<a href="/path" class="link-hover-effect">Link text</a>

Tag Component

html
<a href="/tag" class="tool-tag transition-colors hover-lighten">Tag name</a>

Starwind Component

html
<button class="starwind-transition-colors" data-state="inactive">
  <!-- Button content -->
</button>

Conclusion

By using this standardized animation system, we ensure consistent, performant, and accessible animations across our component library. The system is designed to be flexible enough to accommodate component-specific needs while maintaining a cohesive user experience.