globe-kit 0.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/dist/icons.svg ADDED
@@ -0,0 +1,24 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg">
2
+ <symbol id="bluesky-icon" viewBox="0 0 16 17">
3
+ <g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
4
+ <defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
5
+ </symbol>
6
+ <symbol id="discord-icon" viewBox="0 0 20 19">
7
+ <path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
8
+ </symbol>
9
+ <symbol id="documentation-icon" viewBox="0 0 21 20">
10
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
11
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
12
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
13
+ </symbol>
14
+ <symbol id="github-icon" viewBox="0 0 19 19">
15
+ <path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
16
+ </symbol>
17
+ <symbol id="social-icon" viewBox="0 0 20 20">
18
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
19
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
20
+ </symbol>
21
+ <symbol id="x-icon" viewBox="0 0 19 19">
22
+ <path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
23
+ </symbol>
24
+ </svg>
@@ -0,0 +1,4 @@
1
+ /** Elastic ease-out for sprout effect */
2
+ export declare function elasticOut(t: number): number;
3
+ /** Compute entrance progress for a sprite */
4
+ export declare function getEntranceProgress(born: number, delay: number, duration: number): number;
@@ -0,0 +1,3 @@
1
+ import * as THREE from "three";
2
+ /** Returns 0 (back/edge) to 1 (facing camera) based on angle */
3
+ export declare function computeLimbFade(spriteWorldPos: THREE.Vector3, cameraPos: THREE.Vector3): number;
@@ -0,0 +1,2 @@
1
+ import { GlobeProps } from '../types';
2
+ export default function Globe<D = Record<string, unknown>>(props: GlobeProps<D>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { GlobeProps, GlobeTheme } from '../types';
2
+ type GlobeSceneProps<D> = GlobeProps<D> & {
3
+ resolvedTheme: GlobeTheme;
4
+ };
5
+ export default function GlobeScene<D = Record<string, unknown>>(props: GlobeSceneProps<D>): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,14 @@
1
+ interface GraticuleGridProps {
2
+ /** Grid cell size in degrees */
3
+ gridDeg: number;
4
+ /** How far above the globe surface (ratio). Default 0.08 */
5
+ elevation?: number;
6
+ /** Line color. Default "#585b70" */
7
+ color?: string;
8
+ }
9
+ /**
10
+ * A wireframe graticule (lat/lng grid) that floats above the globe.
11
+ * Rendered as THREE.Line objects in a Group.
12
+ */
13
+ export default function GraticuleGrid({ gridDeg, elevation, color, }: GraticuleGridProps): import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1,8 @@
1
+ import { GlobeTheme, InternalDatum, LabelConfig, CustomLabel } from '../types';
2
+ import * as THREE from "three";
3
+ export declare function generateLabelData(config: LabelConfig, customLabels?: CustomLabel[]): InternalDatum[];
4
+ export declare function useLabelMaterials(theme: GlobeTheme): {
5
+ ocean: (text: string) => THREE.SpriteMaterial;
6
+ continent: (text: string) => THREE.SpriteMaterial;
7
+ country: (text: string) => THREE.SpriteMaterial;
8
+ };
@@ -0,0 +1,8 @@
1
+ import { GlobeTheme } from '../types';
2
+ interface StarfieldProps {
3
+ count?: number;
4
+ theme: GlobeTheme;
5
+ }
6
+ /** Particle starfield background surrounding the globe scene */
7
+ export default function Starfield({ count, theme }: StarfieldProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,9 @@
1
+ /** Built-in label datasets for the globe */
2
+ export interface LabelEntry {
3
+ text: string;
4
+ lat: number;
5
+ lng: number;
6
+ }
7
+ export declare const OCEAN_LABELS: LabelEntry[];
8
+ export declare const CONTINENT_LABELS: LabelEntry[];
9
+ export declare const COUNTRY_LABELS: LabelEntry[];
@@ -0,0 +1,3 @@
1
+ export { default as Globe } from './components/Globe';
2
+ export type { GlobeProps, GlobeTheme, LabelConfig, CustomLabel, EntranceType, Accessor, } from './types';
3
+ export { themes } from './themes';
@@ -0,0 +1,2 @@
1
+ /** Snap items to a grid, one item per cell, with neighbor fallback */
2
+ export declare function snapToGrid<D>(items: D[], latFn: (d: D) => number, lngFn: (d: D) => number, idFn: (d: D) => string, gridDeg: number): Map<D, [number, number]>;
@@ -0,0 +1,8 @@
1
+ import { GlobeTheme } from '../types';
2
+ export declare const catppuccinMocha: GlobeTheme;
3
+ export declare const sepia: GlobeTheme;
4
+ export declare const ocean: GlobeTheme;
5
+ export declare const midnight: GlobeTheme;
6
+ export declare const aurora: GlobeTheme;
7
+ export declare const themes: Record<string, GlobeTheme>;
8
+ export declare function resolveTheme(theme: string | GlobeTheme | undefined): GlobeTheme;
@@ -0,0 +1,110 @@
1
+ import { ReactNode } from 'react';
2
+ import { Object3D } from 'three';
3
+ export interface GlobeTheme {
4
+ name: string;
5
+ globeTint: {
6
+ r: number;
7
+ g: number;
8
+ b: number;
9
+ };
10
+ atmosphere: string;
11
+ grid: string;
12
+ background: string;
13
+ text: string;
14
+ textSecondary: string;
15
+ accent: string;
16
+ frostedBg: string;
17
+ frostedBorder: string;
18
+ }
19
+ export interface LabelConfig {
20
+ continents?: boolean;
21
+ countries?: boolean;
22
+ oceans?: boolean;
23
+ coordinates?: boolean;
24
+ }
25
+ export interface CustomLabel {
26
+ text: string;
27
+ lat: number;
28
+ lng: number;
29
+ size?: "small" | "medium" | "large";
30
+ }
31
+ export type EntranceType = "sprout" | "fade" | "scatter" | "none";
32
+ /** A function, string key, or static value */
33
+ export type Accessor<D, V> = ((d: D) => V) | (keyof D & string) | V;
34
+ export interface GlobeProps<D = Record<string, unknown>> {
35
+ /** Data array — each item becomes one marker on the globe */
36
+ data: D[];
37
+ /** Latitude accessor */
38
+ lat: Accessor<D, number>;
39
+ /** Longitude accessor */
40
+ lng: Accessor<D, number>;
41
+ /** Icon accessor — returns emoji string, image URL, or Object3D */
42
+ icon?: Accessor<D, string | Object3D>;
43
+ /** Unique ID accessor — used for selection tracking */
44
+ id?: Accessor<D, string>;
45
+ /** Grid cell size in degrees. 0 = no grid, use exact coords. Default 5 */
46
+ gridSize?: number;
47
+ /** How high the grid lines float above the surface (ratio). Default 0.06 */
48
+ gridElevation?: number;
49
+ /** How high icons sit above the surface (ratio). Default 0.005 */
50
+ iconElevation?: number;
51
+ /** Icon size in world units. Default 7 */
52
+ iconSize?: number;
53
+ /** Min camera distance (max zoom in). Default 200 */
54
+ minDistance?: number;
55
+ /** Max camera distance (max zoom out). Default 500 */
56
+ maxDistance?: number;
57
+ /** Initial camera distance. Default 350 */
58
+ initialDistance?: number;
59
+ /** Auto-rotate. Default true */
60
+ autoRotate?: boolean;
61
+ /** Auto-rotate speed. Default 0.3 */
62
+ autoRotateSpeed?: number;
63
+ /** Rotate sensitivity. Default 0.25 */
64
+ rotateSpeed?: number;
65
+ /** Built-in theme name or custom theme object */
66
+ theme?: string | GlobeTheme;
67
+ /** Show starfield particles. Default true */
68
+ starfield?: boolean;
69
+ /** Number of stars. Default 2000 */
70
+ starfieldCount?: number;
71
+ /** Globe texture. Built-in name or URL. Default "blue-marble" */
72
+ globeImage?: string;
73
+ /** Enable bump map. Default true */
74
+ bumpMap?: boolean;
75
+ /** Atmosphere altitude ratio. Default 0.18 */
76
+ atmosphereAltitude?: number;
77
+ /** Which built-in label layers to show */
78
+ labels?: LabelConfig | boolean;
79
+ /** Additional custom labels */
80
+ customLabels?: CustomLabel[];
81
+ /** Entrance animation type. Default "sprout" */
82
+ entrance?: EntranceType;
83
+ /** Total entrance duration in seconds. Default 2.5 */
84
+ entranceDuration?: number;
85
+ /** Max stagger delay in seconds. Default 2.0 */
86
+ entranceStagger?: number;
87
+ /** Item click callback */
88
+ onClick?: (item: D, event: React.MouseEvent) => void;
89
+ /** Hover callback */
90
+ onHover?: (item: D | null) => void;
91
+ /** Controlled selected item ID — triggers fly-to */
92
+ selectedId?: string | null;
93
+ /** Hover tooltip renderer */
94
+ tooltip?: (item: D) => ReactNode;
95
+ /** Detail panel renderer */
96
+ detailPanel?: (item: D, onClose: () => void) => ReactNode;
97
+ /** Filter bar renderer */
98
+ filterBar?: () => ReactNode;
99
+ /** Header renderer */
100
+ header?: () => ReactNode;
101
+ }
102
+ export interface InternalDatum {
103
+ lat: number;
104
+ lng: number;
105
+ type: "item" | "ocean" | "continent" | "country" | "coordinate";
106
+ originalItem?: unknown;
107
+ label?: string;
108
+ icon?: string | Object3D;
109
+ id?: string;
110
+ }
@@ -0,0 +1,3 @@
1
+ import { Accessor } from '../types';
2
+ /** Resolve an Accessor<D,V> into a concrete value for a given datum */
3
+ export declare function resolve<D, V>(accessor: Accessor<D, V>, datum: D): V;
@@ -0,0 +1,6 @@
1
+ /** lat/lng to camera position using three-globe's convention */
2
+ export declare function latLngToCamera(lat: number, lng: number, radius: number): [number, number, number];
3
+ /** Smooth ease-in-out cubic */
4
+ export declare function easeInOutCubic(t: number): number;
5
+ /** Deterministic hash -> [0, 2*PI) for stagger phases */
6
+ export declare function hashPhase(str: string): number;
@@ -0,0 +1,4 @@
1
+ import { GlobeTheme } from '../types';
2
+ import * as THREE from "three";
3
+ /** Load earth satellite image, apply grayscale + theme tint */
4
+ export declare function loadTintedEarthTexture(theme: GlobeTheme): Promise<THREE.Texture>;
@@ -0,0 +1,10 @@
1
+ import * as THREE from "three";
2
+ /** Create a SpriteMaterial for an emoji character */
3
+ export declare function createEmojiMaterial(emoji: string, cache: Map<string, THREE.SpriteMaterial>): THREE.SpriteMaterial;
4
+ /** Create a SpriteMaterial for a text label */
5
+ export declare function createTextMaterial(text: string, opts: {
6
+ width: number;
7
+ height: number;
8
+ font: string;
9
+ color: string;
10
+ }, cache: Map<string, THREE.SpriteMaterial>): THREE.SpriteMaterial;
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "globe-kit",
3
+ "version": "0.1.0",
4
+ "description": "Drop any dataset onto a 3D globe — grid layout, entrance animations, themes, and full React customization. Built on r3f-globe.",
5
+ "type": "module",
6
+ "main": "./dist/globe-kit.umd.cjs",
7
+ "module": "./dist/globe-kit.js",
8
+ "types": "./dist/src/lib/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/globe-kit.js",
12
+ "require": "./dist/globe-kit.umd.cjs",
13
+ "types": "./dist/src/lib/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "dev": "vite",
23
+ "build": "tsc -b && vite build",
24
+ "prepublishOnly": "npm run build",
25
+ "lint": "eslint ."
26
+ },
27
+ "peerDependencies": {
28
+ "@react-three/drei": ">=9",
29
+ "@react-three/fiber": ">=8",
30
+ "react": ">=18",
31
+ "react-dom": ">=18",
32
+ "three": ">=0.160"
33
+ },
34
+ "dependencies": {
35
+ "r3f-globe": "^1.6.0",
36
+ "topojson-client": "^3.1.0"
37
+ },
38
+ "devDependencies": {
39
+ "@eslint/js": "^9.39.4",
40
+ "@react-three/drei": "^10.7.7",
41
+ "@react-three/fiber": "^9.5.0",
42
+ "@types/node": "^24.12.2",
43
+ "@types/react": "^19.2.14",
44
+ "@types/react-dom": "^19.2.3",
45
+ "@types/three": "^0.183.1",
46
+ "@types/topojson-client": "^3.1.5",
47
+ "@vitejs/plugin-react": "^6.0.1",
48
+ "eslint": "^9.39.4",
49
+ "eslint-plugin-react-hooks": "^7.0.1",
50
+ "eslint-plugin-react-refresh": "^0.5.2",
51
+ "globals": "^17.4.0",
52
+ "react": "^19.2.4",
53
+ "react-dom": "^19.2.4",
54
+ "three": "^0.183.2",
55
+ "typescript": "~6.0.2",
56
+ "typescript-eslint": "^8.58.0",
57
+ "vite": "^8.0.4",
58
+ "vite-plugin-dts": "^4.5.4"
59
+ },
60
+ "keywords": [
61
+ "globe",
62
+ "3d",
63
+ "react",
64
+ "three.js",
65
+ "r3f",
66
+ "data-visualization",
67
+ "map",
68
+ "earth",
69
+ "webgl"
70
+ ],
71
+ "author": "Andy8647",
72
+ "license": "MIT",
73
+ "repository": {
74
+ "type": "git",
75
+ "url": "git+https://github.com/Andy8647/globe-kit.git"
76
+ },
77
+ "homepage": "https://github.com/Andy8647/globe-kit#readme",
78
+ "bugs": {
79
+ "url": "https://github.com/Andy8647/globe-kit/issues"
80
+ }
81
+ }