entity-react-modals 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ModalContext.tsx","../src/Modal.tsx","../src/ModalTrigger.tsx","../src/spring.ts","../src/animate.ts","../src/hooks/useEscapeKey.ts","../src/hooks/useClickOutside.ts","../src/ModalContent.tsx","../src/ModalClose.tsx","../src/ModalHeader.tsx","../src/ModalBody.tsx","../src/ModalFooter.tsx"],"names":["createContext","useContext","useState","useCallback","jsx","isValidElement","cloneElement","useEffect","useRef","createPortal"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext } from 'react';\nimport type { SpringPreset, SpringConfig } from './spring';\n\nexport interface ModalContextValue {\n open: boolean;\n onClose: () => void;\n onOpen: () => void;\n spring?: SpringPreset | SpringConfig;\n backdropColor?: string;\n backdropBlur?: number;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n animationDuration?: number;\n}\n\nexport const ModalContext = createContext<ModalContextValue | null>(null);\n\nexport function useModalContext() {\n const ctx = useContext(ModalContext);\n if (!ctx) throw new Error('Modal compound components must be used within <Modal>');\n return ctx;\n}\n","import { useState, useCallback, type ReactNode } from 'react';\nimport { ModalContext, type ModalContextValue } from './ModalContext';\nimport type { SpringPreset, SpringConfig } from './spring';\n\nexport interface ModalProps {\n children: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n spring?: SpringPreset | SpringConfig;\n backdropColor?: string;\n backdropBlur?: number;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n animationDuration?: number;\n}\n\nexport default function Modal({\n children,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n spring,\n backdropColor,\n backdropBlur,\n size,\n animationDuration,\n}: ModalProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const onClose = useCallback(() => {\n if (isControlled) {\n onOpenChange?.(false);\n } else {\n setInternalOpen(false);\n onOpenChange?.(false);\n }\n }, [isControlled, onOpenChange]);\n\n const onOpen = useCallback(() => {\n if (isControlled) {\n onOpenChange?.(true);\n } else {\n setInternalOpen(true);\n onOpenChange?.(true);\n }\n }, [isControlled, onOpenChange]);\n\n const value: ModalContextValue = {\n open,\n onClose,\n onOpen,\n spring,\n backdropColor,\n backdropBlur,\n size,\n animationDuration,\n };\n\n return <ModalContext.Provider value={value}>{children}</ModalContext.Provider>;\n}\n","import { cloneElement, isValidElement, type ReactNode } from 'react';\nimport { useModalContext } from './ModalContext';\n\nexport interface ModalTriggerProps {\n children: ReactNode;\n}\n\nexport default function ModalTrigger({ children }: ModalTriggerProps) {\n const { onOpen } = useModalContext();\n\n if (!isValidElement(children)) {\n return <button onClick={onOpen}>{children}</button>;\n }\n\n return cloneElement(children as React.ReactElement<Record<string, unknown>>, {\n onClick: (e: React.MouseEvent) => {\n onOpen();\n const existing = (children as React.ReactElement<Record<string, unknown>>).props.onClick;\n if (typeof existing === 'function') existing(e);\n },\n });\n}\n","export interface SpringConfig {\n stiffness: number;\n damping: number;\n mass: number;\n}\n\nexport type SpringPreset = 'default' | 'gentle' | 'wobbly' | 'stiff' | 'slow';\n\nconst PRESETS: Record<SpringPreset, SpringConfig> = {\n default: { stiffness: 100, damping: 10, mass: 1 },\n gentle: { stiffness: 100, damping: 20, mass: 1 },\n wobbly: { stiffness: 200, damping: 10, mass: 1 },\n stiff: { stiffness: 400, damping: 30, mass: 1 },\n slow: { stiffness: 50, damping: 20, mass: 1 },\n};\n\nconst VELOCITY_THRESHOLD = 0.001;\nconst DISPLACEMENT_THRESHOLD = 0.001;\nconst MAX_SIMULATION_STEPS = 1200;\nconst FIXED_DT = 1 / 120;\n\nexport function resolveSpringConfig(input?: SpringPreset | Partial<SpringConfig>): SpringConfig {\n if (!input) return PRESETS.default;\n if (typeof input === 'string') return PRESETS[input] ?? PRESETS.default;\n return { ...PRESETS.default, ...input };\n}\n\nfunction isAtRest(value: number, velocity: number, target: number): boolean {\n return (\n Math.abs(velocity) < VELOCITY_THRESHOLD &&\n Math.abs(value - target) < DISPLACEMENT_THRESHOLD\n );\n}\n\nexport interface GenerateOptions {\n maxDuration?: number;\n}\n\nexport function generateSpringKeyframes(\n from: number,\n to: number,\n config: SpringConfig,\n options?: GenerateOptions,\n): { keyframes: number[]; duration: number } {\n const { stiffness, damping, mass } = config;\n const maxSteps = options?.maxDuration\n ? Math.min(MAX_SIMULATION_STEPS, Math.ceil((options.maxDuration / 1000) / FIXED_DT))\n : MAX_SIMULATION_STEPS;\n\n let value = from;\n let velocity = 0;\n const positions: number[] = [from];\n let steps = 0;\n\n while (steps < maxSteps) {\n if (isAtRest(value, velocity, to)) {\n positions.push(to);\n break;\n }\n\n const displacement = value - to;\n const springForce = -stiffness * displacement;\n const dampingForce = -damping * velocity;\n const acceleration = (springForce + dampingForce) / mass;\n\n velocity += acceleration * FIXED_DT;\n value += velocity * FIXED_DT;\n positions.push(value);\n steps++;\n }\n\n if (steps >= maxSteps) {\n positions.push(to);\n }\n\n const duration = steps * FIXED_DT * 1000;\n return { keyframes: positions, duration };\n}\n\nexport interface WAAPIKeyframeOptions {\n maxDuration?: number;\n}\n\nexport function springToWAAPIKeyframes(\n fromValue: number,\n toValue: number,\n property: 'opacity' | 'transform',\n config: SpringConfig,\n options?: WAAPIKeyframeOptions,\n): { keyframes: Keyframe[]; duration: number } {\n const { keyframes: positions, duration } = generateSpringKeyframes(fromValue, toValue, config, options);\n\n const waapiKeyframes: Keyframe[] = positions.map((pos, i) => {\n const offset = i / (positions.length - 1);\n\n if (property === 'opacity') {\n return { opacity: String(pos), offset } as Keyframe;\n }\n\n const scale = 0.95 + 0.05 * pos;\n return {\n transform: `scale(${scale})`,\n opacity: String(pos),\n offset,\n } as Keyframe;\n });\n\n return { keyframes: waapiKeyframes, duration };\n}\n","import { resolveSpringConfig, springToWAAPIKeyframes, type SpringPreset, type SpringConfig } from './spring';\n\nfunction prefersReducedMotion(): boolean {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\nexport interface AnimateConfig {\n spring?: SpringPreset | SpringConfig;\n duration?: number;\n}\n\nconst EXIT_MAX_DURATION = 400;\n\nexport function animateIn(\n backdropEl: HTMLElement,\n panelEl: HTMLElement,\n config?: AnimateConfig,\n): Animation[] {\n if (prefersReducedMotion()) {\n backdropEl.style.opacity = '1';\n panelEl.style.opacity = '1';\n panelEl.style.transform = 'scale(1)';\n return [];\n }\n\n const springConfig = resolveSpringConfig(config?.spring);\n\n const { keyframes: backdropKF, duration: backdropDur } = springToWAAPIKeyframes(0, 1, 'opacity', {\n ...springConfig,\n stiffness: springConfig.stiffness * 0.8,\n });\n\n const { keyframes: panelKF, duration: panelDur } = springToWAAPIKeyframes(0, 1, 'transform', springConfig);\n\n const backdropAnim = backdropEl.animate(backdropKF, {\n duration: backdropDur,\n easing: 'linear',\n fill: 'forwards',\n });\n\n const panelAnim = panelEl.animate(panelKF, {\n duration: panelDur,\n easing: 'linear',\n fill: 'forwards',\n });\n\n return [backdropAnim, panelAnim];\n}\n\nexport function animateOut(\n backdropEl: HTMLElement,\n panelEl: HTMLElement,\n config?: AnimateConfig,\n): Promise<void> {\n if (prefersReducedMotion()) {\n return Promise.resolve();\n }\n\n const springConfig = resolveSpringConfig(config?.spring);\n const exitConfig = {\n stiffness: springConfig.stiffness * 2,\n damping: springConfig.damping * 1.5,\n mass: springConfig.mass,\n };\n\n const { keyframes: backdropKF, duration: backdropDur } = springToWAAPIKeyframes(1, 0, 'opacity', {\n ...exitConfig,\n stiffness: exitConfig.stiffness * 0.8,\n }, { maxDuration: EXIT_MAX_DURATION });\n\n const { keyframes: panelKF, duration: panelDur } = springToWAAPIKeyframes(1, 0, 'transform', exitConfig, {\n maxDuration: EXIT_MAX_DURATION,\n });\n\n const backdropAnim = backdropEl.animate(backdropKF, {\n duration: backdropDur,\n easing: 'linear',\n fill: 'forwards',\n });\n\n const panelAnim = panelEl.animate(panelKF, {\n duration: panelDur,\n easing: 'linear',\n fill: 'forwards',\n });\n\n return Promise.all([backdropAnim.finished, panelAnim.finished]).then(() => {});\n}\n","import { useEffect } from 'react';\n\nexport function useEscapeKey(enabled: boolean, onEscape: () => void) {\n useEffect(() => {\n if (!enabled) return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') onEscape();\n }\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enabled, onEscape]);\n}\n","import { useEffect, useRef, useCallback } from 'react';\n\nexport function useClickOutside(enabled: boolean, onClick: () => void) {\n const panelRef = useRef<HTMLDivElement>(null);\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (!enabled || !panelRef.current) return;\n if (!panelRef.current.contains(e.target as Node)) {\n onClick();\n }\n },\n [enabled, onClick],\n );\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [enabled, handleClick]);\n\n return panelRef;\n}\n","import { useState, useRef, useCallback, useEffect, type MutableRefObject, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useModalContext } from './ModalContext';\nimport { animateIn, animateOut } from './animate';\nimport { useEscapeKey } from './hooks/useEscapeKey';\nimport { useClickOutside } from './hooks/useClickOutside';\nimport type { SpringPreset, SpringConfig } from './spring';\n\nexport interface ModalContentProps {\n children: ReactNode;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n closeOnBackdropClick?: boolean;\n closeOnEscape?: boolean;\n backdropColor?: string;\n backdropBlur?: number;\n spring?: SpringPreset | SpringConfig;\n animationDuration?: number;\n}\n\nconst SIZE_MAP = {\n sm: '400px',\n md: '560px',\n lg: '720px',\n xl: '900px',\n};\n\nconst SAFETY_UNMOUNT_MS = 600;\n\nexport default function ModalContent({\n children,\n size: sizeProp,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n backdropColor,\n backdropBlur,\n spring,\n animationDuration,\n}: ModalContentProps) {\n const ctx = useModalContext();\n const size = sizeProp ?? ctx.size ?? 'md';\n const resolvedBackdropColor = backdropColor ?? ctx.backdropColor ?? 'rgba(0, 0, 0, 0.6)';\n const resolvedBackdropBlur = backdropBlur ?? ctx.backdropBlur ?? 4;\n const resolvedSpring = spring ?? ctx.spring;\n\n const [render, setRender] = useState(ctx.open);\n\n const backdropRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const animatingRef = useRef(false);\n const prevOpen = useRef(ctx.open);\n const safetyTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearSafetyTimer = useCallback(() => {\n if (safetyTimerRef.current !== null) {\n clearTimeout(safetyTimerRef.current);\n safetyTimerRef.current = null;\n }\n }, []);\n\n const handleClose = useCallback(() => {\n if (animatingRef.current) return;\n ctx.onClose();\n }, [ctx]);\n\n useEscapeKey(closeOnEscape && ctx.open, handleClose);\n const clickOutsideRef = useClickOutside(closeOnBackdropClick && ctx.open, handleClose);\n\n useEffect(() => {\n if (ctx.open && !prevOpen.current) {\n clearSafetyTimer();\n setRender(true);\n animatingRef.current = true;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (backdropRef.current && panelRef.current) {\n animateIn(backdropRef.current, panelRef.current, {\n spring: resolvedSpring,\n duration: animationDuration,\n });\n setTimeout(() => {\n animatingRef.current = false;\n }, 500);\n }\n });\n });\n } else if (!ctx.open && prevOpen.current) {\n animatingRef.current = true;\n\n if (backdropRef.current) {\n backdropRef.current.style.pointerEvents = 'none';\n }\n\n const unmount = () => {\n clearSafetyTimer();\n setRender(false);\n animatingRef.current = false;\n };\n\n safetyTimerRef.current = setTimeout(unmount, SAFETY_UNMOUNT_MS);\n\n if (backdropRef.current && panelRef.current) {\n animateOut(backdropRef.current, panelRef.current, {\n spring: resolvedSpring,\n duration: animationDuration,\n }).then(unmount);\n } else {\n unmount();\n }\n }\n prevOpen.current = ctx.open;\n\n return clearSafetyTimer;\n }, [ctx.open, resolvedSpring, animationDuration, clearSafetyTimer]);\n\n if (!render) return null;\n\n const setRefs = (el: HTMLDivElement | null) => {\n clickOutsideRef.current = el;\n (panelRef as MutableRefObject<HTMLDivElement | null>).current = el;\n };\n\n return createPortal(\n <div\n className=\"rm-backdrop\"\n ref={backdropRef}\n style={{\n background: resolvedBackdropColor,\n backdropFilter: `blur(${resolvedBackdropBlur}px)`,\n WebkitBackdropFilter: `blur(${resolvedBackdropBlur}px)`,\n }}\n >\n <div\n ref={setRefs}\n className={`rm-panel rm-panel--${size}`}\n role=\"dialog\"\n aria-modal=\"true\"\n style={{ maxWidth: SIZE_MAP[size] }}\n >\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n","import { type ReactNode } from 'react';\nimport { useModalContext } from './ModalContext';\n\nexport interface ModalCloseProps {\n children?: ReactNode;\n className?: string;\n}\n\nexport default function ModalClose({ children = '×', className }: ModalCloseProps) {\n const { onClose } = useModalContext();\n\n return (\n <button className={`rm-close ${className ?? ''}`} onClick={onClose} aria-label=\"Close\">\n {children}\n </button>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface ModalHeaderProps {\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalHeader({ children, className }: ModalHeaderProps) {\n return <div className={`rm-header ${className ?? ''}`}>{children}</div>;\n}\n","import type { ReactNode } from 'react';\n\nexport interface ModalBodyProps {\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalBody({ children, className }: ModalBodyProps) {\n return <div className={`rm-body ${className ?? ''}`}>{children}</div>;\n}\n","import type { ReactNode } from 'react';\n\nexport interface ModalFooterProps {\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalFooter({ children, className }: ModalFooterProps) {\n return <div className={`rm-footer ${className ?? ''}`}>{children}</div>;\n}\n"]}
1
+ {"version":3,"sources":["../src/inject.ts","../src/styles.ts","../src/ModalContext.tsx","../src/Modal.tsx","../src/ModalTrigger.tsx","../src/spring.ts","../src/animate.ts","../src/hooks/useEscapeKey.ts","../src/hooks/useClickOutside.ts","../src/ModalContent.tsx","../src/ModalClose.tsx","../src/ModalHeader.tsx","../src/ModalBody.tsx","../src/ModalFooter.tsx","../src/index.ts"],"names":["createContext","useContext","useState","useCallback","jsx","isValidElement","cloneElement","useEffect","useRef","createPortal"],"mappings":"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","file":"index.cjs","sourcesContent":["const INJECTED = '__ERM_INJECTED__';\n\nexport function injectStyles(css: string) {\n if (typeof document === 'undefined') return;\n if ((window as Record<string, unknown>)[INJECTED]) return;\n (window as Record<string, unknown>)[INJECTED] = true;\n\n const style = document.createElement('style');\n style.textContent = css;\n document.head.appendChild(style);\n}\n","export const styles = `\n:root {\n --rm-backdrop-bg: rgba(0, 0, 0, 0.6);\n --rm-panel-bg: #ffffff;\n --rm-panel-radius: 12px;\n --rm-panel-shadow: 0 20px 60px rgba(0, 0, 0, 0.15);\n --rm-close-color: #3b82f6;\n --rm-close-hover: #2563eb;\n --rm-header-border: #e2e8f0;\n --rm-footer-border: #e2e8f0;\n}\n\n.rm-backdrop {\n position: fixed;\n inset: 0;\n z-index: 9998;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n opacity: 0;\n}\n\n.rm-panel {\n position: relative;\n z-index: 9999;\n background: var(--rm-panel-bg);\n border-radius: var(--rm-panel-radius);\n box-shadow: var(--rm-panel-shadow);\n width: 100%;\n max-height: calc(100vh - 40px);\n opacity: 0;\n transform: scale(0.95);\n display: flex;\n flex-direction: column;\n}\n\n.rm-panel--sm { max-width: 400px; }\n.rm-panel--md { max-width: 560px; }\n.rm-panel--lg { max-width: 720px; }\n.rm-panel--xl { max-width: 900px; }\n\n.rm-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--rm-header-border);\n flex-shrink: 0;\n}\n\n.rm-header h2,\n.rm-header h3 {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n color: #1e293b;\n}\n\n.rm-body {\n padding: 20px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.rm-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 16px 20px;\n border-top: 1px solid var(--rm-footer-border);\n flex-shrink: 0;\n}\n\n.rm-close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--rm-close-color);\n font-size: 1.25rem;\n line-height: 1;\n cursor: pointer;\n transition: background-color 0.15s ease, color 0.15s ease;\n}\n\n.rm-close:hover {\n background: rgba(59, 130, 246, 0.1);\n color: var(--rm-close-hover);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .rm-backdrop,\n .rm-panel {\n transition: none !important;\n animation: none !important;\n }\n}\n`;\n","import { createContext, useContext } from 'react';\nimport type { SpringPreset, SpringConfig, AnimationVariant } from './spring';\n\nexport interface ModalContextValue {\n open: boolean;\n onClose: () => void;\n onOpen: () => void;\n spring?: SpringPreset | SpringConfig;\n animation?: AnimationVariant;\n backdropColor?: string;\n backdropBlur?: number;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n animationDuration?: number;\n}\n\nexport const ModalContext = createContext<ModalContextValue | null>(null);\n\nexport function useModalContext() {\n const ctx = useContext(ModalContext);\n if (!ctx) throw new Error('Modal compound components must be used within <Modal>');\n return ctx;\n}\n","import { useState, useCallback, type ReactNode } from 'react';\nimport { ModalContext, type ModalContextValue } from './ModalContext';\nimport type { SpringPreset, SpringConfig, AnimationVariant } from './spring';\n\nexport interface ModalProps {\n children: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n spring?: SpringPreset | SpringConfig;\n animation?: AnimationVariant;\n backdropColor?: string;\n backdropBlur?: number;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n animationDuration?: number;\n}\n\nexport default function Modal({\n children,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n spring,\n animation,\n backdropColor,\n backdropBlur,\n size,\n animationDuration,\n}: ModalProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const onClose = useCallback(() => {\n if (isControlled) {\n onOpenChange?.(false);\n } else {\n setInternalOpen(false);\n onOpenChange?.(false);\n }\n }, [isControlled, onOpenChange]);\n\n const onOpen = useCallback(() => {\n if (isControlled) {\n onOpenChange?.(true);\n } else {\n setInternalOpen(true);\n onOpenChange?.(true);\n }\n }, [isControlled, onOpenChange]);\n\n const value: ModalContextValue = {\n open,\n onClose,\n onOpen,\n spring,\n animation,\n backdropColor,\n backdropBlur,\n size,\n animationDuration,\n };\n\n return <ModalContext.Provider value={value}>{children}</ModalContext.Provider>;\n}\n","import { cloneElement, isValidElement, type ReactNode } from 'react';\nimport { useModalContext } from './ModalContext';\n\nexport interface ModalTriggerProps {\n children: ReactNode;\n}\n\nexport default function ModalTrigger({ children }: ModalTriggerProps) {\n const { onOpen } = useModalContext();\n\n if (!isValidElement(children)) {\n return <button onClick={onOpen}>{children}</button>;\n }\n\n return cloneElement(children as React.ReactElement<Record<string, unknown>>, {\n onClick: (e: React.MouseEvent) => {\n onOpen();\n const existing = (children as React.ReactElement<Record<string, unknown>>).props.onClick;\n if (typeof existing === 'function') existing(e);\n },\n });\n}\n","export interface SpringConfig {\n stiffness: number;\n damping: number;\n mass: number;\n}\n\nexport type SpringPreset = 'default' | 'gentle' | 'wobbly' | 'stiff' | 'slow';\n\nexport type AnimationVariant = 'scale' | 'slide-bottom' | 'slide-top' | 'slide-left' | 'slide-right' | 'fade' | 'none';\n\nconst PRESETS: Record<SpringPreset, SpringConfig> = {\n default: { stiffness: 100, damping: 10, mass: 1 },\n gentle: { stiffness: 100, damping: 20, mass: 1 },\n wobbly: { stiffness: 200, damping: 10, mass: 1 },\n stiff: { stiffness: 400, damping: 30, mass: 1 },\n slow: { stiffness: 50, damping: 20, mass: 1 },\n};\n\nconst VELOCITY_THRESHOLD = 0.001;\nconst DISPLACEMENT_THRESHOLD = 0.001;\nconst MAX_SIMULATION_STEPS = 1200;\nconst FIXED_DT = 1 / 120;\n\nexport function resolveSpringConfig(input?: SpringPreset | Partial<SpringConfig>): SpringConfig {\n if (!input) return PRESETS.default;\n if (typeof input === 'string') return PRESETS[input] ?? PRESETS.default;\n return { ...PRESETS.default, ...input };\n}\n\nfunction isAtRest(value: number, velocity: number, target: number): boolean {\n return (\n Math.abs(velocity) < VELOCITY_THRESHOLD &&\n Math.abs(value - target) < DISPLACEMENT_THRESHOLD\n );\n}\n\nexport interface GenerateOptions {\n maxDuration?: number;\n}\n\nexport function generateSpringKeyframes(\n from: number,\n to: number,\n config: SpringConfig,\n options?: GenerateOptions,\n): { keyframes: number[]; duration: number } {\n const { stiffness, damping, mass } = config;\n const maxSteps = options?.maxDuration\n ? Math.min(MAX_SIMULATION_STEPS, Math.ceil((options.maxDuration / 1000) / FIXED_DT))\n : MAX_SIMULATION_STEPS;\n\n let value = from;\n let velocity = 0;\n const positions: number[] = [from];\n let steps = 0;\n\n while (steps < maxSteps) {\n if (isAtRest(value, velocity, to)) {\n positions.push(to);\n break;\n }\n\n const displacement = value - to;\n const springForce = -stiffness * displacement;\n const dampingForce = -damping * velocity;\n const acceleration = (springForce + dampingForce) / mass;\n\n velocity += acceleration * FIXED_DT;\n value += velocity * FIXED_DT;\n positions.push(value);\n steps++;\n }\n\n if (steps >= maxSteps) {\n positions.push(to);\n }\n\n const duration = steps * FIXED_DT * 1000;\n return { keyframes: positions, duration };\n}\n\nexport interface WAAPIKeyframeOptions {\n maxDuration?: number;\n}\n\nfunction buildTransformKeyframes(\n positions: number[],\n variant: AnimationVariant,\n): Keyframe[] {\n return positions.map((pos, i) => {\n const offset = i / (positions.length - 1);\n\n switch (variant) {\n case 'fade':\n return { opacity: String(pos), offset } as Keyframe;\n\n case 'scale':\n return {\n transform: `scale(${0.95 + 0.05 * pos})`,\n opacity: String(pos),\n offset,\n } as Keyframe;\n\n case 'slide-bottom':\n return {\n transform: `translateY(${(1 - pos) * 100}%)`,\n opacity: String(pos),\n offset,\n } as Keyframe;\n\n case 'slide-top':\n return {\n transform: `translateY(${(pos - 1) * 100}%)`,\n opacity: String(pos),\n offset,\n } as Keyframe;\n\n case 'slide-left':\n return {\n transform: `translateX(${(pos - 1) * 100}%)`,\n opacity: String(pos),\n offset,\n } as Keyframe;\n\n case 'slide-right':\n return {\n transform: `translateX(${(1 - pos) * 100}%)`,\n opacity: String(pos),\n offset,\n } as Keyframe;\n\n default:\n return { opacity: String(pos), offset } as Keyframe;\n }\n });\n}\n\nexport function springToWAAPIKeyframes(\n fromValue: number,\n toValue: number,\n property: 'opacity' | 'transform',\n config: SpringConfig,\n options?: WAAPIKeyframeOptions & { variant?: AnimationVariant },\n): { keyframes: Keyframe[]; duration: number } {\n const { keyframes: positions, duration } = generateSpringKeyframes(fromValue, toValue, config, options);\n\n if (property === 'opacity') {\n const keyframes = positions.map((pos, i) => ({\n opacity: String(pos),\n offset: i / (positions.length - 1),\n })) as Keyframe[];\n return { keyframes, duration };\n }\n\n const variant = options?.variant ?? 'scale';\n return { keyframes: buildTransformKeyframes(positions, variant), duration };\n}\n","import { resolveSpringConfig, springToWAAPIKeyframes, type SpringPreset, type SpringConfig, type AnimationVariant } from './spring';\n\nfunction prefersReducedMotion(): boolean {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\nexport interface AnimateConfig {\n spring?: SpringPreset | SpringConfig;\n duration?: number;\n animation?: AnimationVariant;\n}\n\nconst EXIT_MAX_DURATION = 400;\n\nexport function animateIn(\n backdropEl: HTMLElement,\n panelEl: HTMLElement,\n config?: AnimateConfig,\n): Animation[] {\n const variant = config?.animation ?? 'scale';\n\n if (prefersReducedMotion() || variant === 'none') {\n backdropEl.style.opacity = '1';\n panelEl.style.opacity = '1';\n panelEl.style.transform = 'none';\n return [];\n }\n\n const springConfig = resolveSpringConfig(config?.spring);\n\n const { keyframes: backdropKF, duration: backdropDur } = springToWAAPIKeyframes(0, 1, 'opacity', {\n ...springConfig,\n stiffness: springConfig.stiffness * 0.8,\n });\n\n const { keyframes: panelKF, duration: panelDur } = springToWAAPIKeyframes(0, 1, 'transform', springConfig, { variant });\n\n const backdropAnim = backdropEl.animate(backdropKF, {\n duration: backdropDur,\n easing: 'linear',\n fill: 'forwards',\n });\n\n const panelAnim = panelEl.animate(panelKF, {\n duration: panelDur,\n easing: 'linear',\n fill: 'forwards',\n });\n\n return [backdropAnim, panelAnim];\n}\n\nexport function animateOut(\n backdropEl: HTMLElement,\n panelEl: HTMLElement,\n config?: AnimateConfig,\n): Promise<void> {\n const variant = config?.animation ?? 'scale';\n\n if (prefersReducedMotion() || variant === 'none') {\n return Promise.resolve();\n }\n\n const springConfig = resolveSpringConfig(config?.spring);\n const exitConfig = {\n stiffness: springConfig.stiffness * 2,\n damping: springConfig.damping * 1.5,\n mass: springConfig.mass,\n };\n\n const { keyframes: backdropKF, duration: backdropDur } = springToWAAPIKeyframes(1, 0, 'opacity', {\n ...exitConfig,\n stiffness: exitConfig.stiffness * 0.8,\n }, { maxDuration: EXIT_MAX_DURATION });\n\n const { keyframes: panelKF, duration: panelDur } = springToWAAPIKeyframes(1, 0, 'transform', exitConfig, {\n maxDuration: EXIT_MAX_DURATION,\n variant,\n });\n\n const backdropAnim = backdropEl.animate(backdropKF, {\n duration: backdropDur,\n easing: 'linear',\n fill: 'forwards',\n });\n\n const panelAnim = panelEl.animate(panelKF, {\n duration: panelDur,\n easing: 'linear',\n fill: 'forwards',\n });\n\n return Promise.all([backdropAnim.finished, panelAnim.finished]).then(() => {});\n}\n","import { useEffect } from 'react';\n\nexport function useEscapeKey(enabled: boolean, onEscape: () => void) {\n useEffect(() => {\n if (!enabled) return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') onEscape();\n }\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enabled, onEscape]);\n}\n","import { useEffect, useRef, useCallback } from 'react';\n\nexport function useClickOutside(enabled: boolean, onClick: () => void) {\n const panelRef = useRef<HTMLDivElement>(null);\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (!enabled || !panelRef.current) return;\n if (!panelRef.current.contains(e.target as Node)) {\n onClick();\n }\n },\n [enabled, onClick],\n );\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [enabled, handleClick]);\n\n return panelRef;\n}\n","import { useState, useRef, useCallback, useEffect, type MutableRefObject, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useModalContext } from './ModalContext';\nimport { animateIn, animateOut } from './animate';\nimport { useEscapeKey } from './hooks/useEscapeKey';\nimport { useClickOutside } from './hooks/useClickOutside';\nimport type { SpringPreset, SpringConfig, AnimationVariant } from './spring';\n\nexport interface ModalContentProps {\n children: ReactNode;\n className?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n animation?: AnimationVariant;\n closeOnBackdropClick?: boolean;\n closeOnEscape?: boolean;\n backdropColor?: string;\n backdropBlur?: number;\n spring?: SpringPreset | SpringConfig;\n animationDuration?: number;\n}\n\nconst SAFETY_UNMOUNT_MS = 600;\n\nexport default function ModalContent({\n children,\n className,\n size: sizeProp,\n animation: animationProp,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n backdropColor,\n backdropBlur,\n spring,\n animationDuration,\n}: ModalContentProps) {\n const ctx = useModalContext();\n const size = sizeProp ?? ctx.size ?? 'md';\n const resolvedAnimation = animationProp ?? ctx.animation ?? 'scale';\n const resolvedBackdropColor = backdropColor ?? ctx.backdropColor ?? 'rgba(0, 0, 0, 0.6)';\n const resolvedBackdropBlur = backdropBlur ?? ctx.backdropBlur ?? 4;\n const resolvedSpring = spring ?? ctx.spring;\n\n const [render, setRender] = useState(ctx.open);\n\n const backdropRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const animatingRef = useRef(false);\n const prevOpen = useRef(ctx.open);\n const safetyTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearSafetyTimer = useCallback(() => {\n if (safetyTimerRef.current !== null) {\n clearTimeout(safetyTimerRef.current);\n safetyTimerRef.current = null;\n }\n }, []);\n\n const handleClose = useCallback(() => {\n if (animatingRef.current) return;\n ctx.onClose();\n }, [ctx]);\n\n useEscapeKey(closeOnEscape && ctx.open, handleClose);\n const clickOutsideRef = useClickOutside(closeOnBackdropClick && ctx.open, handleClose);\n\n useEffect(() => {\n if (ctx.open && !prevOpen.current) {\n clearSafetyTimer();\n setRender(true);\n animatingRef.current = true;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (backdropRef.current && panelRef.current) {\n animateIn(backdropRef.current, panelRef.current, {\n spring: resolvedSpring,\n animation: resolvedAnimation,\n duration: animationDuration,\n });\n setTimeout(() => {\n animatingRef.current = false;\n }, 500);\n }\n });\n });\n } else if (!ctx.open && prevOpen.current) {\n animatingRef.current = true;\n\n if (backdropRef.current) {\n backdropRef.current.style.pointerEvents = 'none';\n }\n\n const unmount = () => {\n clearSafetyTimer();\n setRender(false);\n animatingRef.current = false;\n };\n\n safetyTimerRef.current = setTimeout(unmount, SAFETY_UNMOUNT_MS);\n\n if (backdropRef.current && panelRef.current) {\n animateOut(backdropRef.current, panelRef.current, {\n spring: resolvedSpring,\n animation: resolvedAnimation,\n duration: animationDuration,\n }).then(unmount);\n } else {\n unmount();\n }\n }\n prevOpen.current = ctx.open;\n\n return clearSafetyTimer;\n }, [ctx.open, resolvedSpring, resolvedAnimation, animationDuration, clearSafetyTimer]);\n\n if (!render) return null;\n\n const setRefs = (el: HTMLDivElement | null) => {\n clickOutsideRef.current = el;\n (panelRef as MutableRefObject<HTMLDivElement | null>).current = el;\n };\n\n return createPortal(\n <div\n className=\"rm-backdrop\"\n ref={backdropRef}\n style={{\n background: resolvedBackdropColor,\n backdropFilter: `blur(${resolvedBackdropBlur}px)`,\n WebkitBackdropFilter: `blur(${resolvedBackdropBlur}px)`,\n }}\n >\n <div\n ref={setRefs}\n className={`rm-panel rm-panel--${size}${className ? ` ${className}` : ''}`}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n","import { type ReactNode } from 'react';\nimport { useModalContext } from './ModalContext';\n\nexport interface ModalCloseProps {\n children?: ReactNode;\n className?: string;\n}\n\nexport default function ModalClose({ children = '×', className }: ModalCloseProps) {\n const { onClose } = useModalContext();\n\n return (\n <button className={`rm-close ${className ?? ''}`} onClick={onClose} aria-label=\"Close\">\n {children}\n </button>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface ModalHeaderProps {\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalHeader({ children, className }: ModalHeaderProps) {\n return <div className={`rm-header ${className ?? ''}`}>{children}</div>;\n}\n","import type { ReactNode } from 'react';\n\nexport interface ModalBodyProps {\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalBody({ children, className }: ModalBodyProps) {\n return <div className={`rm-body ${className ?? ''}`}>{children}</div>;\n}\n","import type { ReactNode } from 'react';\n\nexport interface ModalFooterProps {\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalFooter({ children, className }: ModalFooterProps) {\n return <div className={`rm-footer ${className ?? ''}`}>{children}</div>;\n}\n","import { injectStyles } from './inject';\nimport { styles } from './styles';\n\ninjectStyles(styles);\n\nexport { default as Modal } from './Modal';\nexport { default as ModalTrigger } from './ModalTrigger';\nexport { default as ModalContent } from './ModalContent';\nexport { default as ModalClose } from './ModalClose';\nexport { default as ModalHeader } from './ModalHeader';\nexport { default as ModalBody } from './ModalBody';\nexport { default as ModalFooter } from './ModalFooter';\n\nexport type { ModalProps } from './Modal';\nexport type { ModalTriggerProps } from './ModalTrigger';\nexport type { ModalContentProps } from './ModalContent';\nexport type { ModalCloseProps } from './ModalClose';\nexport type { ModalHeaderProps } from './ModalHeader';\nexport type { ModalBodyProps } from './ModalBody';\nexport type { ModalFooterProps } from './ModalFooter';\n\nexport type { SpringConfig, SpringPreset, AnimationVariant } from './spring';\n"]}
package/dist/index.d.cts CHANGED
@@ -7,6 +7,7 @@ interface SpringConfig {
7
7
  mass: number;
8
8
  }
9
9
  type SpringPreset = 'default' | 'gentle' | 'wobbly' | 'stiff' | 'slow';
10
+ type AnimationVariant = 'scale' | 'slide-bottom' | 'slide-top' | 'slide-left' | 'slide-right' | 'fade' | 'none';
10
11
 
11
12
  interface ModalProps {
12
13
  children: ReactNode;
@@ -14,12 +15,13 @@ interface ModalProps {
14
15
  defaultOpen?: boolean;
15
16
  onOpenChange?: (open: boolean) => void;
16
17
  spring?: SpringPreset | SpringConfig;
18
+ animation?: AnimationVariant;
17
19
  backdropColor?: string;
18
20
  backdropBlur?: number;
19
21
  size?: 'sm' | 'md' | 'lg' | 'xl';
20
22
  animationDuration?: number;
21
23
  }
22
- declare function Modal({ children, open: controlledOpen, defaultOpen, onOpenChange, spring, backdropColor, backdropBlur, size, animationDuration, }: ModalProps): react.JSX.Element;
24
+ declare function Modal({ children, open: controlledOpen, defaultOpen, onOpenChange, spring, animation, backdropColor, backdropBlur, size, animationDuration, }: ModalProps): react.JSX.Element;
23
25
 
24
26
  interface ModalTriggerProps {
25
27
  children: ReactNode;
@@ -28,7 +30,9 @@ declare function ModalTrigger({ children }: ModalTriggerProps): react.JSX.Elemen
28
30
 
29
31
  interface ModalContentProps {
30
32
  children: ReactNode;
33
+ className?: string;
31
34
  size?: 'sm' | 'md' | 'lg' | 'xl';
35
+ animation?: AnimationVariant;
32
36
  closeOnBackdropClick?: boolean;
33
37
  closeOnEscape?: boolean;
34
38
  backdropColor?: string;
@@ -36,7 +40,7 @@ interface ModalContentProps {
36
40
  spring?: SpringPreset | SpringConfig;
37
41
  animationDuration?: number;
38
42
  }
39
- declare function ModalContent({ children, size: sizeProp, closeOnBackdropClick, closeOnEscape, backdropColor, backdropBlur, spring, animationDuration, }: ModalContentProps): react.ReactPortal | null;
43
+ declare function ModalContent({ children, className, size: sizeProp, animation: animationProp, closeOnBackdropClick, closeOnEscape, backdropColor, backdropBlur, spring, animationDuration, }: ModalContentProps): react.ReactPortal | null;
40
44
 
41
45
  interface ModalCloseProps {
42
46
  children?: ReactNode;
@@ -62,4 +66,4 @@ interface ModalFooterProps {
62
66
  }
63
67
  declare function ModalFooter({ children, className }: ModalFooterProps): react.JSX.Element;
64
68
 
65
- export { Modal, ModalBody, type ModalBodyProps, ModalClose, type ModalCloseProps, ModalContent, type ModalContentProps, ModalFooter, type ModalFooterProps, ModalHeader, type ModalHeaderProps, type ModalProps, ModalTrigger, type ModalTriggerProps, type SpringConfig, type SpringPreset };
69
+ export { type AnimationVariant, Modal, ModalBody, type ModalBodyProps, ModalClose, type ModalCloseProps, ModalContent, type ModalContentProps, ModalFooter, type ModalFooterProps, ModalHeader, type ModalHeaderProps, type ModalProps, ModalTrigger, type ModalTriggerProps, type SpringConfig, type SpringPreset };
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ interface SpringConfig {
7
7
  mass: number;
8
8
  }
9
9
  type SpringPreset = 'default' | 'gentle' | 'wobbly' | 'stiff' | 'slow';
10
+ type AnimationVariant = 'scale' | 'slide-bottom' | 'slide-top' | 'slide-left' | 'slide-right' | 'fade' | 'none';
10
11
 
11
12
  interface ModalProps {
12
13
  children: ReactNode;
@@ -14,12 +15,13 @@ interface ModalProps {
14
15
  defaultOpen?: boolean;
15
16
  onOpenChange?: (open: boolean) => void;
16
17
  spring?: SpringPreset | SpringConfig;
18
+ animation?: AnimationVariant;
17
19
  backdropColor?: string;
18
20
  backdropBlur?: number;
19
21
  size?: 'sm' | 'md' | 'lg' | 'xl';
20
22
  animationDuration?: number;
21
23
  }
22
- declare function Modal({ children, open: controlledOpen, defaultOpen, onOpenChange, spring, backdropColor, backdropBlur, size, animationDuration, }: ModalProps): react.JSX.Element;
24
+ declare function Modal({ children, open: controlledOpen, defaultOpen, onOpenChange, spring, animation, backdropColor, backdropBlur, size, animationDuration, }: ModalProps): react.JSX.Element;
23
25
 
24
26
  interface ModalTriggerProps {
25
27
  children: ReactNode;
@@ -28,7 +30,9 @@ declare function ModalTrigger({ children }: ModalTriggerProps): react.JSX.Elemen
28
30
 
29
31
  interface ModalContentProps {
30
32
  children: ReactNode;
33
+ className?: string;
31
34
  size?: 'sm' | 'md' | 'lg' | 'xl';
35
+ animation?: AnimationVariant;
32
36
  closeOnBackdropClick?: boolean;
33
37
  closeOnEscape?: boolean;
34
38
  backdropColor?: string;
@@ -36,7 +40,7 @@ interface ModalContentProps {
36
40
  spring?: SpringPreset | SpringConfig;
37
41
  animationDuration?: number;
38
42
  }
39
- declare function ModalContent({ children, size: sizeProp, closeOnBackdropClick, closeOnEscape, backdropColor, backdropBlur, spring, animationDuration, }: ModalContentProps): react.ReactPortal | null;
43
+ declare function ModalContent({ children, className, size: sizeProp, animation: animationProp, closeOnBackdropClick, closeOnEscape, backdropColor, backdropBlur, spring, animationDuration, }: ModalContentProps): react.ReactPortal | null;
40
44
 
41
45
  interface ModalCloseProps {
42
46
  children?: ReactNode;
@@ -62,4 +66,4 @@ interface ModalFooterProps {
62
66
  }
63
67
  declare function ModalFooter({ children, className }: ModalFooterProps): react.JSX.Element;
64
68
 
65
- export { Modal, ModalBody, type ModalBodyProps, ModalClose, type ModalCloseProps, ModalContent, type ModalContentProps, ModalFooter, type ModalFooterProps, ModalHeader, type ModalHeaderProps, type ModalProps, ModalTrigger, type ModalTriggerProps, type SpringConfig, type SpringPreset };
69
+ export { type AnimationVariant, Modal, ModalBody, type ModalBodyProps, ModalClose, type ModalCloseProps, ModalContent, type ModalContentProps, ModalFooter, type ModalFooterProps, ModalHeader, type ModalHeaderProps, type ModalProps, ModalTrigger, type ModalTriggerProps, type SpringConfig, type SpringPreset };
package/dist/index.js CHANGED
@@ -2,7 +2,124 @@ import { createContext, useState, useCallback, isValidElement, cloneElement, use
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
  import { createPortal } from 'react-dom';
4
4
 
5
- // src/Modal.tsx
5
+ // src/inject.ts
6
+ var INJECTED = "__ERM_INJECTED__";
7
+ function injectStyles(css) {
8
+ if (typeof document === "undefined") return;
9
+ if (window[INJECTED]) return;
10
+ window[INJECTED] = true;
11
+ const style = document.createElement("style");
12
+ style.textContent = css;
13
+ document.head.appendChild(style);
14
+ }
15
+
16
+ // src/styles.ts
17
+ var styles = `
18
+ :root {
19
+ --rm-backdrop-bg: rgba(0, 0, 0, 0.6);
20
+ --rm-panel-bg: #ffffff;
21
+ --rm-panel-radius: 12px;
22
+ --rm-panel-shadow: 0 20px 60px rgba(0, 0, 0, 0.15);
23
+ --rm-close-color: #3b82f6;
24
+ --rm-close-hover: #2563eb;
25
+ --rm-header-border: #e2e8f0;
26
+ --rm-footer-border: #e2e8f0;
27
+ }
28
+
29
+ .rm-backdrop {
30
+ position: fixed;
31
+ inset: 0;
32
+ z-index: 9998;
33
+ display: flex;
34
+ align-items: center;
35
+ justify-content: center;
36
+ padding: 20px;
37
+ opacity: 0;
38
+ }
39
+
40
+ .rm-panel {
41
+ position: relative;
42
+ z-index: 9999;
43
+ background: var(--rm-panel-bg);
44
+ border-radius: var(--rm-panel-radius);
45
+ box-shadow: var(--rm-panel-shadow);
46
+ width: 100%;
47
+ max-height: calc(100vh - 40px);
48
+ opacity: 0;
49
+ transform: scale(0.95);
50
+ display: flex;
51
+ flex-direction: column;
52
+ }
53
+
54
+ .rm-panel--sm { max-width: 400px; }
55
+ .rm-panel--md { max-width: 560px; }
56
+ .rm-panel--lg { max-width: 720px; }
57
+ .rm-panel--xl { max-width: 900px; }
58
+
59
+ .rm-header {
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: space-between;
63
+ padding: 16px 20px;
64
+ border-bottom: 1px solid var(--rm-header-border);
65
+ flex-shrink: 0;
66
+ }
67
+
68
+ .rm-header h2,
69
+ .rm-header h3 {
70
+ margin: 0;
71
+ font-size: 1.125rem;
72
+ font-weight: 600;
73
+ color: #1e293b;
74
+ }
75
+
76
+ .rm-body {
77
+ padding: 20px;
78
+ overflow-y: auto;
79
+ flex: 1;
80
+ min-height: 0;
81
+ }
82
+
83
+ .rm-footer {
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: flex-end;
87
+ gap: 8px;
88
+ padding: 16px 20px;
89
+ border-top: 1px solid var(--rm-footer-border);
90
+ flex-shrink: 0;
91
+ }
92
+
93
+ .rm-close {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ width: 28px;
98
+ height: 28px;
99
+ padding: 0;
100
+ border: none;
101
+ border-radius: 6px;
102
+ background: transparent;
103
+ color: var(--rm-close-color);
104
+ font-size: 1.25rem;
105
+ line-height: 1;
106
+ cursor: pointer;
107
+ transition: background-color 0.15s ease, color 0.15s ease;
108
+ }
109
+
110
+ .rm-close:hover {
111
+ background: rgba(59, 130, 246, 0.1);
112
+ color: var(--rm-close-hover);
113
+ }
114
+
115
+ @media (prefers-reduced-motion: reduce) {
116
+ .rm-backdrop,
117
+ .rm-panel {
118
+ transition: none !important;
119
+ animation: none !important;
120
+ }
121
+ }
122
+ `;
6
123
  var ModalContext = createContext(null);
7
124
  function useModalContext() {
8
125
  const ctx = useContext(ModalContext);
@@ -15,6 +132,7 @@ function Modal({
15
132
  defaultOpen = false,
16
133
  onOpenChange,
17
134
  spring,
135
+ animation,
18
136
  backdropColor,
19
137
  backdropBlur,
20
138
  size,
@@ -44,6 +162,7 @@ function Modal({
44
162
  onClose,
45
163
  onOpen,
46
164
  spring,
165
+ animation,
47
166
  backdropColor,
48
167
  backdropBlur,
49
168
  size,
@@ -112,21 +231,58 @@ function generateSpringKeyframes(from, to, config, options) {
112
231
  const duration = steps * FIXED_DT * 1e3;
113
232
  return { keyframes: positions, duration };
114
233
  }
115
- function springToWAAPIKeyframes(fromValue, toValue, property, config, options) {
116
- const { keyframes: positions, duration } = generateSpringKeyframes(fromValue, toValue, config, options);
117
- const waapiKeyframes = positions.map((pos, i) => {
234
+ function buildTransformKeyframes(positions, variant) {
235
+ return positions.map((pos, i) => {
118
236
  const offset = i / (positions.length - 1);
119
- if (property === "opacity") {
120
- return { opacity: String(pos), offset };
237
+ switch (variant) {
238
+ case "fade":
239
+ return { opacity: String(pos), offset };
240
+ case "scale":
241
+ return {
242
+ transform: `scale(${0.95 + 0.05 * pos})`,
243
+ opacity: String(pos),
244
+ offset
245
+ };
246
+ case "slide-bottom":
247
+ return {
248
+ transform: `translateY(${(1 - pos) * 100}%)`,
249
+ opacity: String(pos),
250
+ offset
251
+ };
252
+ case "slide-top":
253
+ return {
254
+ transform: `translateY(${(pos - 1) * 100}%)`,
255
+ opacity: String(pos),
256
+ offset
257
+ };
258
+ case "slide-left":
259
+ return {
260
+ transform: `translateX(${(pos - 1) * 100}%)`,
261
+ opacity: String(pos),
262
+ offset
263
+ };
264
+ case "slide-right":
265
+ return {
266
+ transform: `translateX(${(1 - pos) * 100}%)`,
267
+ opacity: String(pos),
268
+ offset
269
+ };
270
+ default:
271
+ return { opacity: String(pos), offset };
121
272
  }
122
- const scale = 0.95 + 0.05 * pos;
123
- return {
124
- transform: `scale(${scale})`,
125
- opacity: String(pos),
126
- offset
127
- };
128
273
  });
129
- return { keyframes: waapiKeyframes, duration };
274
+ }
275
+ function springToWAAPIKeyframes(fromValue, toValue, property, config, options) {
276
+ const { keyframes: positions, duration } = generateSpringKeyframes(fromValue, toValue, config, options);
277
+ if (property === "opacity") {
278
+ const keyframes = positions.map((pos, i) => ({
279
+ opacity: String(pos),
280
+ offset: i / (positions.length - 1)
281
+ }));
282
+ return { keyframes, duration };
283
+ }
284
+ const variant = options?.variant ?? "scale";
285
+ return { keyframes: buildTransformKeyframes(positions, variant), duration };
130
286
  }
131
287
 
132
288
  // src/animate.ts
@@ -135,10 +291,11 @@ function prefersReducedMotion() {
135
291
  }
136
292
  var EXIT_MAX_DURATION = 400;
137
293
  function animateIn(backdropEl, panelEl, config) {
138
- if (prefersReducedMotion()) {
294
+ const variant = config?.animation ?? "scale";
295
+ if (prefersReducedMotion() || variant === "none") {
139
296
  backdropEl.style.opacity = "1";
140
297
  panelEl.style.opacity = "1";
141
- panelEl.style.transform = "scale(1)";
298
+ panelEl.style.transform = "none";
142
299
  return [];
143
300
  }
144
301
  const springConfig = resolveSpringConfig(config?.spring);
@@ -146,7 +303,7 @@ function animateIn(backdropEl, panelEl, config) {
146
303
  ...springConfig,
147
304
  stiffness: springConfig.stiffness * 0.8
148
305
  });
149
- const { keyframes: panelKF, duration: panelDur } = springToWAAPIKeyframes(0, 1, "transform", springConfig);
306
+ const { keyframes: panelKF, duration: panelDur } = springToWAAPIKeyframes(0, 1, "transform", springConfig, { variant });
150
307
  const backdropAnim = backdropEl.animate(backdropKF, {
151
308
  duration: backdropDur,
152
309
  easing: "linear",
@@ -160,7 +317,8 @@ function animateIn(backdropEl, panelEl, config) {
160
317
  return [backdropAnim, panelAnim];
161
318
  }
162
319
  function animateOut(backdropEl, panelEl, config) {
163
- if (prefersReducedMotion()) {
320
+ const variant = config?.animation ?? "scale";
321
+ if (prefersReducedMotion() || variant === "none") {
164
322
  return Promise.resolve();
165
323
  }
166
324
  const springConfig = resolveSpringConfig(config?.spring);
@@ -174,7 +332,8 @@ function animateOut(backdropEl, panelEl, config) {
174
332
  stiffness: exitConfig.stiffness * 0.8
175
333
  }, { maxDuration: EXIT_MAX_DURATION });
176
334
  const { keyframes: panelKF, duration: panelDur } = springToWAAPIKeyframes(1, 0, "transform", exitConfig, {
177
- maxDuration: EXIT_MAX_DURATION
335
+ maxDuration: EXIT_MAX_DURATION,
336
+ variant
178
337
  });
179
338
  const backdropAnim = backdropEl.animate(backdropKF, {
180
339
  duration: backdropDur,
@@ -217,16 +376,12 @@ function useClickOutside(enabled, onClick) {
217
376
  }, [enabled, handleClick]);
218
377
  return panelRef;
219
378
  }
220
- var SIZE_MAP = {
221
- sm: "400px",
222
- md: "560px",
223
- lg: "720px",
224
- xl: "900px"
225
- };
226
379
  var SAFETY_UNMOUNT_MS = 600;
227
380
  function ModalContent({
228
381
  children,
382
+ className,
229
383
  size: sizeProp,
384
+ animation: animationProp,
230
385
  closeOnBackdropClick = true,
231
386
  closeOnEscape = true,
232
387
  backdropColor,
@@ -236,6 +391,7 @@ function ModalContent({
236
391
  }) {
237
392
  const ctx = useModalContext();
238
393
  const size = sizeProp ?? ctx.size ?? "md";
394
+ const resolvedAnimation = animationProp ?? ctx.animation ?? "scale";
239
395
  const resolvedBackdropColor = backdropColor ?? ctx.backdropColor ?? "rgba(0, 0, 0, 0.6)";
240
396
  const resolvedBackdropBlur = backdropBlur ?? ctx.backdropBlur ?? 4;
241
397
  const resolvedSpring = spring ?? ctx.spring;
@@ -266,7 +422,8 @@ function ModalContent({
266
422
  requestAnimationFrame(() => {
267
423
  if (backdropRef.current && panelRef.current) {
268
424
  animateIn(backdropRef.current, panelRef.current, {
269
- spring: resolvedSpring});
425
+ spring: resolvedSpring,
426
+ animation: resolvedAnimation});
270
427
  setTimeout(() => {
271
428
  animatingRef.current = false;
272
429
  }, 500);
@@ -286,14 +443,15 @@ function ModalContent({
286
443
  safetyTimerRef.current = setTimeout(unmount, SAFETY_UNMOUNT_MS);
287
444
  if (backdropRef.current && panelRef.current) {
288
445
  animateOut(backdropRef.current, panelRef.current, {
289
- spring: resolvedSpring}).then(unmount);
446
+ spring: resolvedSpring,
447
+ animation: resolvedAnimation}).then(unmount);
290
448
  } else {
291
449
  unmount();
292
450
  }
293
451
  }
294
452
  prevOpen.current = ctx.open;
295
453
  return clearSafetyTimer;
296
- }, [ctx.open, resolvedSpring, animationDuration, clearSafetyTimer]);
454
+ }, [ctx.open, resolvedSpring, resolvedAnimation, animationDuration, clearSafetyTimer]);
297
455
  if (!render) return null;
298
456
  const setRefs = (el) => {
299
457
  clickOutsideRef.current = el;
@@ -314,10 +472,9 @@ function ModalContent({
314
472
  "div",
315
473
  {
316
474
  ref: setRefs,
317
- className: `rm-panel rm-panel--${size}`,
475
+ className: `rm-panel rm-panel--${size}${className ? ` ${className}` : ""}`,
318
476
  role: "dialog",
319
477
  "aria-modal": "true",
320
- style: { maxWidth: SIZE_MAP[size] },
321
478
  children
322
479
  }
323
480
  )
@@ -340,6 +497,9 @@ function ModalFooter({ children, className }) {
340
497
  return /* @__PURE__ */ jsx("div", { className: `rm-footer ${className ?? ""}`, children });
341
498
  }
342
499
 
500
+ // src/index.ts
501
+ injectStyles(styles);
502
+
343
503
  export { Modal, ModalBody, ModalClose, ModalContent, ModalFooter, ModalHeader, ModalTrigger };
344
504
  //# sourceMappingURL=index.js.map
345
505
  //# sourceMappingURL=index.js.map