Standardized CSS Animation System for Component Interactions
Summary
Implemented a comprehensive, standardized CSS animation system for component interactions, focusing on hover effects, transitions, and interactive states across the component library.
Why Care
This standardization dramatically improves UI consistency, maintainability, and performance by replacing scattered, inconsistent animation implementations with a unified system. The new approach ensures predictable user interactions, reduces code duplication, respects accessibility preferences, and makes future UI enhancements more straightforward.
Implementation
Changes Made
- Enhanced
/site/src/styles/animations.css
with a comprehensive animation system:- Added CSS custom properties for standardized timing and effects
- Created utility classes for common transition patterns
- Implemented component-specific animation mixins
- Added state management standardization
- Integrated with Starwind components
- Added accessibility support for reduced motion preferences
- Updated the following components to use the new animation system:
/site/src/components/tool-components/TagChip.astro
/site/src/components/tool-components/TagCloud.astro
/site/src/components/tool-components/ToolCard.astro
/site/src/components/tool-components/TagColumn.astro
- Created comprehensive documentation:
/content/specs/CSS-Animation-System.md
Technical Details
CSS Custom Properties
css
/* In /site/src/styles/animations.css */
:root {
/* Timing durations */
--transition-duration-fast: 0.1s;
--transition-duration-standard: 0.2s;
--transition-duration-slow: 0.3s;
--transition-duration-slower: 0.5s;
/* Timing functions */
--transition-timing-standard: ease-in-out;
--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 */
--transform-elevation-small: translateY(-2px);
--transform-elevation-medium: translateY(-4px);
--transform-elevation-large: translateY(-8px);
/* Color mix values */
--color-mix-hover-subtle: 5%;
--color-mix-hover-light: 20%;
--color-mix-hover-medium: 40%;
--color-mix-hover-strong: 60%;
}
Utility Classes
css
/* In /site/src/styles/animations.css */
.transition-colors {
transition-property: color, background-color, border-color;
transition-duration: var(--transition-duration-standard);
transition-timing-function: var(--transition-timing-standard);
}
.hover-elevate-grow {
transition-property: transform;
transition-duration: var(--transition-duration-standard);
transition-timing-function: var(--transition-timing-standard);
}
.hover-elevate-grow:hover {
transform: translateY(-2px) scale(1.05);
}
Component-Specific Mixins
css
/* In /site/src/styles/animations.css */
.card-hover-effect {
transition-property: transform, background-color, box-shadow;
transition-duration: var(--transition-duration-standard);
transition-timing-function: var(--transition-timing-standard);
}
.card-hover-effect:hover {
transform: var(--transform-elevation-medium);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
background: color-mix(
in oklab,
var(--clr-lossless-primary-glass),
var(--clr-lossless-primary-dark) var(--color-mix-hover-light)
);
}
Accessibility Support
css
/* In /site/src/styles/animations.css */
@media (prefers-reduced-motion: reduce) {
.transition-all,
.transition-colors,
.transition-transform,
.transition-borders,
.transition-opacity,
.transition-shadow,
.hover-elevate,
.hover-lighten,
.card-hover-effect,
.link-hover-effect,
.internal-link-hover-effect,
[data-state],
.starwind-transition,
.starwind-transition-colors,
.hover-grow,
.hover-elevate-grow,
.hover-lighten-subtle {
transition-duration: 0.1s !important;
transition-property: color, background-color !important;
transform: none !important;
}
}
Text Handling Improvements
html
<!-- In /site/src/components/tool-components/ToolCard.astro -->
<h4><span class="text-wrapper">{displayTitle}</span></h4>
<style>
.text-wrapper {
display: inline-block;
width: 100%;
white-space: normal;
word-wrap: break-word;
word-break: break-word;
overflow-wrap: break-word;
hyphens: auto;
}
</style>
Integration Points
- The animation system integrates with the existing Starwind component library through compatibility variables and classes
- All component hover effects now use the standardized utility classes and mixins
- The system respects user accessibility preferences through the
prefers-reduced-motion
media query - Text handling improvements ensure consistent display regardless of content formatting in Markdown frontmatter
Documentation
- Created comprehensive documentation in
/content/specs/CSS-Animation-System.md
covering:- Overview of the animation system
- CSS custom properties
- Utility classes
- Component-specific mixins
- State management
- Starwind integration
- Accessibility considerations
- Migration guide
- Examples
- Key benefits documented:
- Consistency across components
- Improved maintainability
- Better performance through specific property transitions
- Enhanced accessibility
- Flexibility for component-specific customizations