Map Animated Circle
terrae/animated-circleFreeComponent
Animated circle with drawing and fill effects.
Install it
npx shadcn@latest add https://www.terrae.dev/animated-circle.jsonSource
1"use client"23import { useEffect, useRef, useState } from "react"4import type mapboxgl from "mapbox-gl"56import { useMap } from "./hooks"7import type { MapCoordinates, MapPath } from "./types"89type AnimationMode = "draw" | "fill"1011type MapAnimatedCircleProps = {12 id: string13 center: MapCoordinates14 radius: number15 strokeColor?: string16 strokeWidth?: number17 strokeOpacity?: number18 strokeDashArray?: number[]19 fillColor?: string20 fillOpacity?: number21 duration?: number22 fillDuration?: number23 autoStart?: boolean24 loop?: boolean25 loopDelay?: number26 animationMode?: AnimationMode27 segments?: number28 onDrawComplete?: () => void29 onFillComplete?: () => void30 onComplete?: () => void31}3233const DEFAULT_STROKE_COLOR = "#3b82f6"34const DEFAULT_STROKE_WIDTH = 235const DEFAULT_STROKE_OPACITY = 136const DEFAULT_FILL_COLOR = "#3b82f6"37const DEFAULT_FILL_OPACITY = 0.338const DEFAULT_DURATION = 200039const DEFAULT_FILL_DURATION = 100040const DEFAULT_AUTO_START = true41const DEFAULT_LOOP = false42const DEFAULT_LOOP_DELAY = 100043const DEFAULT_ANIMATION_MODE: AnimationMode = "draw"44const DEFAULT_SEGMENTS = 6445const EARTH_RADIUS_METERS = 6371008.84647const generateCircleCoordinates = (center: MapCoordinates, radiusMeters: number, segments: number): MapPath => {48 const [lng, lat] = center49 const coordinates: MapPath = []5051 const latRadians = (lat * Math.PI) / 18052 const lngRadians = (lng * Math.PI) / 18053 const angularDistance = radiusMeters / EARTH_RADIUS_METERS5455 for (let i = 0; i <= segments; i++) {56 const bearing = (2 * Math.PI * i) / segments5758 const pointLat = Math.asin(59 Math.sin(latRadians) * Math.cos(angularDistance) +60 Math.cos(latRadians) * Math.sin(angularDistance) * Math.cos(bearing)61 )6263 const pointLng =64 lngRadians +65 Math.atan2(66 Math.sin(bearing) * Math.sin(angularDistance) * Math.cos(latRadians),67 Math.cos(angularDistance) - Math.sin(latRadians) * Math.sin(pointLat)68 )6970 coordinates.push([(pointLng * 180) / Math.PI, (pointLat * 180) / Math.PI])71 }7273 return coordinates74}7576export const MapAnimatedCircle = ({77 id,78 center,79 radius,80 strokeColor = DEFAULT_STROKE_COLOR,81 strokeWidth = DEFAULT_STROKE_WIDTH,82 strokeOpacity = DEFAULT_STROKE_OPACITY,83 strokeDashArray,84 fillColor = DEFAULT_FILL_COLOR,85 fillOpacity = DEFAULT_FILL_OPACITY,86 duration = DEFAULT_DURATION,87 fillDuration = DEFAULT_FILL_DURATION,88 autoStart = DEFAULT_AUTO_START,89 loop = DEFAULT_LOOP,90// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from terrae
All 40 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Map Animated Footprintanimated-footprint | terrae | Components | Free | 2 deps | |
| Map Animated Polygonanimated-polygon | terrae | Components | Free | 1 dep | |
| Map Animated Pulseanimated-pulse | terrae | Components | Free | 1 dep | |
| Map Arc Animatedarc-animated | terrae | Components | Free | 1 dep | |
| Map Blur Areablur-area | terrae | Components | Free | 1 dep | |
| Map Camera Followcamera-follow | terrae | Components | Free | 1 dep | |
| Map Choroplethchoropleth | terrae | Components | Free | 1 dep | |
| Map Circlecircle | terrae | Components | Free | 1 dep |
