import type { Meta, StoryObj } from '@storybook/react-vite'; import { css } from 'styled-system/css'; const meta = { title: 'Foundations/Motion', parameters: { layout: 'padded' }, } satisfies Meta; export default meta; type Story = StoryObj; // ── Pre-declared css() calls — Panda CSS statically extracts these ───────────── // (dynamic template literals cannot be extracted; explicit literals are required) const durationBox: Record = { instant: css({ transitionDuration: 'instant', transitionProperty: 'background', transitionTimingFunction: 'standard', bg: 'neutral.3', }), fast: css({ transitionDuration: 'fast', transitionProperty: 'background', transitionTimingFunction: 'standard', bg: 'neutral.3', }), normal: css({ transitionDuration: 'normal', transitionProperty: 'background', transitionTimingFunction: 'standard', bg: 'neutral.3', }), slow: css({ transitionDuration: 'slow', transitionProperty: 'background', transitionTimingFunction: 'standard', bg: 'neutral.3', }), slower: css({ transitionDuration: 'slower', transitionProperty: 'background', transitionTimingFunction: 'standard', bg: 'neutral.3', }), }; const durationBoxHover: Record = { instant: css({ _hover: { bg: 'primary.9' } }), fast: css({ _hover: { bg: 'primary.9' } }), normal: css({ _hover: { bg: 'primary.9' } }), slow: css({ _hover: { bg: 'primary.9' } }), slower: css({ _hover: { bg: 'primary.9' } }), }; const easingBox: Record = { standard: css({ transitionTimingFunction: 'standard', transitionDuration: 'normal', transitionProperty: 'transform', bg: 'primary.subtle.bg', borderColor: 'primary.outline.border', }), standardDecelerate: css({ transitionTimingFunction: 'standardDecelerate', transitionDuration: 'normal', transitionProperty: 'transform', bg: 'primary.subtle.bg', borderColor: 'primary.outline.border', }), standardAccelerate: css({ transitionTimingFunction: 'standardAccelerate', transitionDuration: 'normal', transitionProperty: 'transform', bg: 'primary.subtle.bg', borderColor: 'primary.outline.border', }), emphasized: css({ transitionTimingFunction: 'emphasized', transitionDuration: 'normal', transitionProperty: 'transform', bg: 'primary.subtle.bg', borderColor: 'primary.outline.border', }), emphasizedDecelerate: css({ transitionTimingFunction: 'emphasizedDecelerate', transitionDuration: 'normal', transitionProperty: 'transform', bg: 'primary.subtle.bg', borderColor: 'primary.outline.border', }), emphasizedAccelerate: css({ transitionTimingFunction: 'emphasizedAccelerate', transitionDuration: 'normal', transitionProperty: 'transform', bg: 'primary.subtle.bg', borderColor: 'primary.outline.border', }), }; const easingBoxHover: Record = { standard: css({ _hover: { transform: 'translateX(40px)' } }), standardDecelerate: css({ _hover: { transform: 'translateX(40px)' } }), standardAccelerate: css({ _hover: { transform: 'translateX(40px)' } }), emphasized: css({ _hover: { transform: 'translateX(40px)' } }), emphasizedDecelerate: css({ _hover: { transform: 'translateX(40px)' } }), emphasizedAccelerate: css({ _hover: { transform: 'translateX(40px)' } }), }; // ── Data ──────────────────────────────────────────────────────────────────────── const DURATIONS: { token: string; value: string }[] = [ { token: 'instant', value: '0ms' }, { token: 'fast', value: '100ms' }, { token: 'normal', value: '200ms' }, { token: 'slow', value: '300ms' }, { token: 'slower', value: '500ms' }, ]; const EASINGS: { token: string }[] = [ { token: 'standard' }, { token: 'standardDecelerate' }, { token: 'standardAccelerate' }, { token: 'emphasized' }, { token: 'emphasizedDecelerate' }, { token: 'emphasizedAccelerate' }, ]; // ── Shared helpers ────────────────────────────────────────────────────────────── function SectionHeading({ title, description, }: { title: string; description: string; }) { return (

{title}

{description}

); } // ── Story 1: Duration Tokens ─────────────────────────────────────────────────── export const DurationTokens: Story = { name: '1 · Duration Tokens', render: () => (
{DURATIONS.map(({ token, value }) => (
{token} {value}
))}

Note: instant (0ms){' '} produces no visible transition.

), }; // ── Story 2: Easing Tokens ───────────────────────────────────────────────────── export const EasingTokens: Story = { name: '2 · Easing Tokens', render: () => (
{EASINGS.map(({ token }) => (
{token}
))}

All demos use{' '} normal (200ms). Hover each box to compare easing curves.

), };