From 9bf35e7fb72de22fe74e0ee88d2a1ca23bffc4a4 Mon Sep 17 00:00:00 2001 From: Huakun Shen Date: Thu, 13 Mar 2025 16:18:03 -0400 Subject: [PATCH] feat: add globe component --- packages/ui/package.json | 1 + .../ui/src/components/animation/Globe.svelte | 119 ++++++++++++++++++ packages/ui/src/components/animation/index.ts | 1 + pnpm-lock.yaml | 16 +++ 4 files changed, 137 insertions(+) create mode 100644 packages/ui/src/components/animation/Globe.svelte diff --git a/packages/ui/package.json b/packages/ui/package.json index f784146..b8f104b 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -84,6 +84,7 @@ "@shikijs/themes": "^2.3.2", "@std/semver": "npm:@jsr/std__semver@^1.0.3", "@tanstack/svelte-virtual": "^3.13.2", + "cobe": "^0.6.3", "dompurify": "^3.2.3", "fuse.js": "^7.1.0", "gsap": "^3.12.7", diff --git a/packages/ui/src/components/animation/Globe.svelte b/packages/ui/src/components/animation/Globe.svelte new file mode 100644 index 0000000..4f3d412 --- /dev/null +++ b/packages/ui/src/components/animation/Globe.svelte @@ -0,0 +1,119 @@ + + +
+ { + pointerInteracting = e.clientX - pointerInteractionMovement + canvas.style.cursor = "grabbing" + }} + onpointerup={() => { + pointerInteracting = null + canvas.style.cursor = "grab" + }} + onpointerout={() => { + pointerInteracting = null + canvas.style.cursor = "grab" + }} + onmousemove={(e) => { + if (pointerInteracting !== null) { + console.log("working") + const delta = e.clientX - pointerInteracting + pointerInteractionMovement = delta + x.set(delta / 200) + } + }} + > +
diff --git a/packages/ui/src/components/animation/index.ts b/packages/ui/src/components/animation/index.ts index 4beeff8..cde8b67 100644 --- a/packages/ui/src/components/animation/index.ts +++ b/packages/ui/src/components/animation/index.ts @@ -5,3 +5,4 @@ export { default as RetroGrid } from "./RetroGrid.svelte" export { default as AuroraText } from "./AuroraText.svelte" export { default as WordRotate } from "./WordRotate.svelte" export { default as MagicCard } from "./MagicCard.svelte" +export { default as Globe } from "./Globe.svelte" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc81812..0890ef9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1232,6 +1232,9 @@ importers: '@tanstack/svelte-virtual': specifier: ^3.13.2 version: 3.13.2(svelte@5.20.5) + cobe: + specifier: ^0.6.3 + version: 0.6.3 dompurify: specifier: ^3.2.3 version: 3.2.3 @@ -2602,6 +2605,7 @@ packages: '@faker-js/faker@9.5.1': resolution: {integrity: sha512-0fzMEDxkExR2cn731kpDaCCnBGBUOIXEi2S1N5l8Hltp6aPf4soTMJ+g4k8r2sI5oB+rpwIW8Uy/6jkwGpnWPg==} engines: {node: '>=18.0.0', npm: '>=9.0.0'} + deprecated: Please update to a newer version '@floating-ui/core@1.6.8': resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} @@ -6617,6 +6621,9 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + cobe@0.6.3: + resolution: {integrity: sha512-WHr7X4o1ym94GZ96h7b1pNemZJacbOzd02dZtnVwuC4oWBaLg96PBmp2rIS1SAhUDhhC/QyS9WEqkpZIs/ZBTg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -9875,6 +9882,9 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + phenomenon@1.6.0: + resolution: {integrity: sha512-7h9/fjPD3qNlgggzm88cY58l9sudZ6Ey+UmZsizfhtawO6E3srZQXywaNm2lBwT72TbpHYRPy7ytIHeBUD/G0A==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -19215,6 +19225,10 @@ snapshots: co@4.6.0: {} + cobe@0.6.3: + dependencies: + phenomenon: 1.6.0 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -23222,6 +23236,8 @@ snapshots: performance-now@2.1.0: {} + phenomenon@1.6.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {}