import React from "react"; export interface AnimatedOceanWavesProps { /** Height of the ocean container (CSS value, e.g. '5%', '80px') */ height?: string; /** Background color or gradient for the ocean container */ oceanBackground?: string; /** Wave SVG url (default is the blue wave) */ waveImageUrl?: string; /** Wave animation duration in seconds */ waveDuration?: number; /** Offset between the two wave layers (in px, for parallax effect) */ waveOffset?: number; /** Opacity of the front/back wave layers */ frontWaveOpacity?: number; backWaveOpacity?: number; /** Additional container className */ className?: string; /** Additional inline style for the outer container */ style?: React.CSSProperties; /** Z-index of the ocean (allows layering) */ zIndex?: number; } const DEFAULT_WAVE_IMAGE = "https://s3-us-west-2.amazonaws.com/s.cdpn.io/85486/wave.svg"; export const AnimatedOceanWaves: React.FC = ({ height = "5%", oceanBackground, waveImageUrl = DEFAULT_WAVE_IMAGE, waveDuration = 7, waveOffset = 23, // offset in px between the two layers frontWaveOpacity = 1, backWaveOpacity = 1, className = "", style, zIndex = 1 }) => { // Inline styles for container and waves const oceanStyles: React.CSSProperties = { height, width: "100%", position: "absolute", left: 0, bottom: 0, background: oceanBackground, zIndex, ...style, }; const waveStyles: React.CSSProperties = { // String concatenation for background image URL background: "url(" + waveImageUrl + ") repeat-x", position: "absolute", top: 0, width: "6400px", height: "198px", // String concatenation for animation property animation: "waveAnim " + waveDuration + "s cubic-bezier(0.36, 0.45, 0.63, 0.53) infinite", transform: "translate3d(0, 0, 0)", opacity: frontWaveOpacity, pointerEvents: "none" }; const backWaveStyles: React.CSSProperties = { ...waveStyles, top: -waveOffset, opacity: backWaveOpacity, // String concatenation for combined animation property animation: "waveAnim " + waveDuration + "s cubic-bezier(0.36, 0.45, 0.63, 0.53) -" + (waveDuration * 0.018) + "s infinite, " + "swellAnim " + waveDuration + "s ease -" + (waveDuration * 0.18) + "s infinite" }; return ( ); }; export default AnimatedOceanWaves;