goobs-frontend
Version:
A comprehensive React-based libary for building modern web applications
133 lines (118 loc) • 2.8 kB
text/typescript
// --------------------------------------------------------------------------
// FADE THEME SYSTEM
// --------------------------------------------------------------------------
import React from 'react'
//
export interface FadeTheme {
container: {
opacity: number
transition: string
}
visible: {
opacity: number
}
hidden: {
opacity: number
}
}
export interface FadeStyles {
// Theme selection
theme?: 'light' | 'dark' | 'sacred'
// Animation properties
in?: boolean
timeout?: number
appear?: boolean
enter?: boolean
exit?: boolean
// Custom transition
transition?: string
transitionDuration?: string
transitionDelay?: string
transitionTimingFunction?: string
// States
disabled?: boolean
}
export const fadeThemes: Record<'light' | 'dark' | 'sacred', FadeTheme> = {
light: {
container: {
opacity: 1,
transition: 'opacity 0.3s ease',
},
visible: {
opacity: 1,
},
hidden: {
opacity: 0,
},
},
dark: {
container: {
opacity: 1,
transition: 'opacity 0.3s ease',
},
visible: {
opacity: 1,
},
hidden: {
opacity: 0,
},
},
sacred: {
container: {
opacity: 1,
transition: 'opacity 0.5s cubic-bezier(0.4, 0, 0.2, 1)',
},
visible: {
opacity: 1,
},
hidden: {
opacity: 0,
},
},
}
// Helper function to get computed theme with custom style overrides
export const getFadeTheme = (styles?: FadeStyles): FadeTheme => {
const theme = styles?.theme || 'light'
const baseTheme = fadeThemes[theme]
if (!styles) {
return baseTheme
}
const duration = styles.timeout
? `${styles.timeout}ms`
: styles.transitionDuration || baseTheme.container.transition.split(' ')[1]
const timingFunction =
styles.transitionTimingFunction ||
baseTheme.container.transition.split(' ').slice(2).join(' ')
return {
container: {
opacity: baseTheme.container.opacity,
transition: styles.transition || `opacity ${duration} ${timingFunction}`,
},
visible: {
opacity: baseTheme.visible.opacity,
},
hidden: {
opacity: baseTheme.hidden.opacity,
},
}
}
// Main style generator function
export const getFadeStyles = (styles?: FadeStyles, isDisabled?: boolean) => {
const themeConfig = getFadeTheme(styles)
const isVisible = styles?.in !== false
const containerStyle: React.CSSProperties = {
opacity: isVisible
? themeConfig.visible.opacity
: themeConfig.hidden.opacity,
transition: themeConfig.container.transition,
transitionDelay: styles?.transitionDelay,
// State-based styling
...(isDisabled && {
transition: 'none',
opacity: 0.6,
}),
}
return {
container: containerStyle,
}
}