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.
- package/README.md +195 -16
- package/dist/index.cjs +189 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +189 -29
- package/dist/index.js.map +1 -1
- package/dist/styles.css +7 -2
- package/package.json +2 -4
package/dist/index.cjs.map
CHANGED
|
@@ -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/
|
|
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
|
|
116
|
-
|
|
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
|
-
|
|
120
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 = "
|
|
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
|
-
|
|
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
|
|
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
|