Dotted Globe
NewInstallation
npx shadcn@latest add https://uibrik.com/r/dotted-globe.jsonAdd the cn helper
Imports
cnfrom@/lib/utils, whichshadcn initcreates. Add it by hand without shadcn.Copy the source into your project
components/uibrik/dotted-globe/dotted-globe.tsx"use client"; // A slowly turning globe drawn as dots of land, with arcs of light flying // between cities. Drag to spin it; it coasts and settles back to its own pace. // Drawn on a 2D canvas (no WebGL), sleeps while off screen, and holds still // for reduced motion. import { useEffect, useRef, useState, type RefObject } from "react"; import { cn } from "@/lib/utils"; // Generated from Natural Earth (land-50m, public domain): one bit per point of a // 16000-point Fibonacci sphere, set when that point is on land. Point i sits at // latitude asin(1 - (2i + 1) / 16000) and longitude i × the golden angle. const LAND_POINTS = 16000; const LAND = "AAAAAAAAABAAQkJIAAhLIQMkJIWEhIAEEBJCAkDAAZk6IQNgYAAMhJAjMjJADsTYgRk5MkNi7sjMGplpMfEtZv3Mpr3WNvf6Sttf+ztff+Xt//2Vt7/+9t732tv5/ztvf+ft/P+dt/v2Vv7+ylv5eztv9++tvN21s/L3Vsbu31t5Oysn5e+snJ2Xk3J3VmbOzUm5OSMr5+ak7JyR03JzRn7OzUmZOSMv5+aE7Jy70zNzQn7OzInZOTG3Z+bE/Jyb03NzRm7Pzen5OTU35+bk3J6b03NzSm7Ozcm5OTW35+bU3Jybk3Nzak7Ozek5OTWn5+b0nJyb03Nzam7Pyak5OTW35+bUnJybU3Nyam7Ozam5OTWn4+bUnJybUXNyakbGzak5OTGj5ubUnIybUXNyakbNzeg5OTOj5uTEjIqRkXN6akbFyYgZNSOj5+TEjIqREXNqTk7FyYkZNScmZtSEnIqTE3NqRkzMyYk5FSMmZtSEmIiRE3NqRkzOiQk5FSMmZtSUmJyTE3NqRk7MqAk5ESOmZtSEjJ6RUzJiRkzNiAkZPSOmZuSEmJoREzJqRkzN6AkZNSOmZNSEmJoREzJqRkzJ6Ak5NSOmZNSEmJLRUzJqTkzJqAk5JaemZNSEmJJRU3JqTkzJqSkxJaem5NSUmJJTUnJqSk3JKSkxJaem5JSUmJJTUGJKSknJKSkxJaek9NSUkpJTUGJKSknJKSklJaekxFSckpJTUGpKSknJKCglJaekxBSUkpJTUEoKSkmJKCklBaek1BSckgJTUEoKSkmpKCklBaeklBSckgJTUkoKSkmpKCklBaamlBSUkkJTUkoKSEmpoSElBaaklBSQmkJBUkoKTEmhKSA1BYaElFSQkkJBQEoqDAkpISA1hYaklBSQkkJBQGoqDAmpKSAlhYaA1BQQklJBQGoKCgGpKSAkhYaA1BQQglJBQEoKCwGpISAEhYKA1BQUglJCQGgKCQGpKSAUhYCA0BQWglpCQCgKCQGpKSAEpYCAUBQWAlJCQCgKSQEhICAEpYCAUBQSAlJQQAgKCQEhICQEpICAUBQSAkJAQQgKCQUhISQEpISCUBQSAkJCQQhoCQUhoCwEhISCUFASCkJCQShICQUhqCwEpISCUFASCkJAUQgICQUhoCwUpISCEFASCkJAUQgICQUhoCQUhICCEFASCkJAUSgoSQUBoCQUlYCCEFASigJAQSgoQAUBoCQVFYCCAFAQCgJAQSgqQAUBoCAVFICCUFQACgJAQSgqAAUBqAAVBICCQFQACgJAQagqAAWBqAAVBICiUFQACgJRASgoAAWBqAAVBKACUFQACgJRASoqAEWgqAAVBKICUFAACgJRESooAAWgqAAVFKICUFAACoBRASooBAWgoAgVFKIiVFCECkhRESooBgWkoAgUEIICUFQMCkhBESooBgXkqAgUEIICUFQMCkhBESogBkWkoAgUEIICUFAMCkhBESogBkWkoAgUEIICUECMCkhBESogBAWgoAgVkIIiUECICkhBESggRAWgoBAUkIICUEAMCkBBASggBAWggBAUkKICUEAICkBBASggBAWggBAUgIICUEAICkBBASggBQWggBAUgIIiUEAICkABASgCBQWggBAUgYICUAQKCkABISgKBUWgiBAUgIICUAQKCkARISgABUWgiBQUgCICUBQKCkARISgCBUWgKBQUgCIDUAQKikBRCSgCRUSgKBQUgCICcASKiEBRCCgCRQSgKBQQgaICUASKiEBRKCgCRQSgCBQRgaIQUASKiEBRKCICRUSgCBQRgaIQVASKiEARKCICRQGoCBQRgaJQRASKiFARKCICRQGoCBQRoSJQRASKglARKCICRaGoCBQBoSJQRASKglARKAICReCICBQBoSJQBASKgBARKAJCRaAICBQBoSJQBASKgBERKAJCRaAICBQBISJQBASKQBERKAJCRaAICBQBIyJQBASKQBEQKAJCRKAICBQBIyBQBISKQBEQKAJGQKAICBQBIiBQBISIQBEQKAJGQKAICBABIiBQAISAQAEQIABEQKAACBGBIiAQAIiAQAEQIAAEQIAACAGAAiAAAAiAAAEQAAAEQIAAEAAAAiAAAAiAAAEQAAAEQIAAEAAAAiAAAAiEAAEgAAAEQgAAEAAAAgAAAAgEAAAgAAAEAAAAEAAAAEAAAAgAAAAgAAAEAAAAEAgAAEAAAACAAAAgEAAAgAAAEAAAAEAgAACAAAAgAAAAgEAAAAAAAEAAAAAAgQAgAAAAgAAAAAAAAEAAAAAAgQAAAAAAgAAAAAAAAEAAAAAAAQAAAAAAgAAAAAACAAAAAAAAAQAAAAAAgAAAAAACAAAAAAAAAQAAAAQAAAAAAAACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAIASkRICCghISUgpISUgJASUlJCSkZJCSk9paWntLSWntPSWlpKS+9pKT0/p6f1/JSf3/N7fl7P7/v5Pb//9/X8vN6f//N7fn/v7/v9//////8="; export type GlobeMarker = { lat: number; lon: number }; export type DottedGlobeProps = { /** Cities the arcs fly between. */ markers?: readonly GlobeMarker[]; /** Turn speed in degrees per second. */ speed?: number;
Adds the files to
components/uibrik/dotted-globe. With the @uibrik namespace set up: npx shadcn@latest add @uibrik/dotted-globe.Props
DottedGlobe- speed
- Type number
- 6
- Turn speed.
- tilt
- Type number
- 18
- Tilt toward the viewer; positive shows more of the north.
- accent
- Type string
- "#3b82f6"
- Colour of the arcs and markers.
- arcs
- Type boolean
- true
- Fly arcs between the markers.
- arcEvery
- Type number
- 0.9
- Seconds between new arcs.
- dotSize
- Type number
- 1
- Size of each land dot.
- draggable
- Type boolean
- true
- Spin it by dragging; it coasts back to its own pace.
- markers
- Type { lat: number; lon: number }[]
- 9 world cities
- Cities the arcs fly between.
- startLon
- Type number
- 10
- Longitude facing the viewer at first.
- className
- Type string
- –
- Classes for the box. It is square and fills its width; arcs may rise about a sixth of its width past its edges.