Installation
Install the component
Run the following command to install the component and its dependencies:
npx @motion-core/cli add globeImport the component
Import the component into your Svelte file:
import { Globe } from "$lib/motion-core";import { Globe } from "$lib/motion-core";Usage
Props
2.000
25000
0.050
<script lang="ts">
import {
Globe,
type GlobeMarker,
type GlobeMarkerTooltipContext,
} from "motion-core";
import { cn } from "$lib/utils/cn";
import type { ComponentProps } from "svelte";
type Props = Partial<ComponentProps<typeof Globe>>;
let {
radius = 2,
pointCount = 25000,
pointSize = 0.05,
landPointColor = "#f77114",
autoRotate = true,
lockedPolarAngle = false,
}: Props = $props();
const locations: (GlobeMarker & { name: string })[] = [
{
name: "Warsaw",
location: [52.2297, 21.0122],
label: "Warsaw",
color: "#4fb7ff",
},
{
name: "New York",
location: [40.7128, -74.006],
label: "New York",
color: "#4fb7ff",
},
{
name: "Tokyo",
location: [35.6762, 139.6503],
label: "Tokyo",
color: "#4fb7ff",
},
];
let focusOn = $state<[number, number] | null>(null);
</script>
{#snippet markerTooltip(ctx: GlobeMarkerTooltipContext)}
<div
class="pointer-events-none relative rounded-xs bg-foreground px-1.5 py-0.75 font-mono text-[10px] font-medium tracking-wide whitespace-nowrap text-background uppercase"
>
{ctx.marker.label}
<span
class="absolute top-[calc(100%-1px)] left-1/2 h-0 w-0 -translate-x-1/2 border-x-[5px] border-t-[5px] border-x-transparent border-t-foreground"
></span>
</div>
{/snippet}
<Globe
class="h-full min-h-96 w-full"
markers={locations}
{markerTooltip}
{focusOn}
{radius}
{pointCount}
{pointSize}
{landPointColor}
autoRotate={autoRotate && !focusOn}
{lockedPolarAngle}
/>
<div
class="absolute bottom-4 left-1/2 z-10 flex w-fit -translate-x-1/2 justify-center gap-1 rounded-sm bg-background-inset p-1 inset-shadow"
>
<button
class={cn(
"gap-1.5 rounded-xs px-3 py-1 text-xs font-medium tracking-wide whitespace-nowrap uppercase transition-all duration-150 ease-out",
focusOn === null
? "text-card bg-background card dark:bg-background-muted dark:text-foreground"
: "text-foreground-muted hover:text-foreground",
)}
onclick={() => (focusOn = null)}
>
Auto Rotate
</button>
{#each locations as loc (loc.name)}
<button
class={cn(
"gap-1.5 rounded-xs px-3 py-1 text-xs font-medium tracking-wide whitespace-nowrap uppercase transition-colors duration-150 ease-out",
focusOn?.[0] === loc.location[0] && focusOn?.[1] === loc.location[1]
? "text-card bg-background card dark:bg-background-muted dark:text-foreground"
: "text-foreground-muted hover:text-foreground",
)}
onclick={() => (focusOn = loc.location)}
>
{loc.name}
</button>
{/each}
</div>
Props
Globe
| Prop | Type | Default |
|---|---|---|
radius | number | 2 |
fresnelConfig | FresnelConfig | Default Fresnel |
atmosphereConfig | AtmosphereConfig | Default Atmosphere |
pointCount | number | 15000 |
landPointColor | stringnumberreadonly [number, number, number]{ r: number; g: number; b: number } | "#f77114" |
pointSize | number | 0.05 |
autoRotate | boolean | true |
lockedPolarAngle | boolean | true |
markers | GlobeMarker[] | [] |
markerTooltip | Snippet<[GlobeMarkerTooltipContext]> | undefined |
focusOn | [number, number]null | null |
class | string | "" |
GlobeMarkerTooltipContext
| Key | Type | Default |
|---|---|---|
marker | GlobeMarker | - |
index | number | - |
visibility | number | - |
FresnelConfig
| Key | Type | Default |
|---|---|---|
color | stringnumberreadonly [number, number, number]{ r: number; g: number; b: number } | "#17181A" |
rimColor | stringnumberreadonly [number, number, number]{ r: number; g: number; b: number } | "#FF6900" |
rimPower | number | 6 |
rimIntensity | number | 1.5 |
AtmosphereConfig
| Key | Type | Default |
|---|---|---|
color | stringnumberreadonly [number, number, number]{ r: number; g: number; b: number } | "#FF6900" |
scale | number | 1.1 |
power | number | 12.0 |
coefficient | number | 0.9 |
intensity | number | 1.1 |
GlobeMarker
| Key | Type | Default |
|---|---|---|
location | [number, number] | - |
size | number | 0.05 |
color | string | "#ffffff" |
label | string | undefined |