aliaset
Version:
twind monorepo
51 lines (44 loc) • 1.25 kB
text/typescript
import type { CSSObject, CSSProperties, StringLike } from './types'
import { css } from './css'
export interface AnimationFunction {
(animation: string | CSSProperties, waypoints: StringLike): StringLike
}
export type Animation = AnimationFunction & {
[label: string]: AnimationFunction
}
/**
* @group Class Name Generators
*/
export const animation = /* #__PURE__ */ new Proxy(
function animation(animation: string | CSSProperties, waypoints: StringLike): StringLike {
return animation$('animation', animation, waypoints)
} as Animation,
{
get(target, name) {
if (name in target) return target[name as string]
return function namedAnimation(
animation: string | CSSProperties,
waypoints: StringLike,
): StringLike {
return animation$(name as string, animation, waypoints)
}
},
},
)
function animation$(
label: string,
animation: string | CSSProperties,
waypoints: StringLike,
): StringLike {
return {
toString() {
return css({
label,
'@layer components': {
...(typeof animation == 'object' ? animation : { animation }),
animationName: '' + waypoints,
},
} as CSSObject)
},
} as StringLike
}