@wise/art 2.5.0 → 2.6.0-beta.2
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/README.md +0 -1
- package/dist/CheckMark-1d199954.js +39 -0
- package/dist/CheckMark-1d199954.js.map +1 -0
- package/dist/CheckMark-dfa7e17d.js +37 -0
- package/dist/CheckMark-dfa7e17d.js.map +1 -0
- package/dist/Confetti-3f6f42f8.js +36 -0
- package/dist/Confetti-3f6f42f8.js.map +1 -0
- package/dist/Confetti-a1500ca5.js +34 -0
- package/dist/Confetti-a1500ca5.js.map +1 -0
- package/dist/Flower-01a6ad2e.js +27 -0
- package/dist/Flower-01a6ad2e.js.map +1 -0
- package/dist/Flower-194046f6.js +29 -0
- package/dist/Flower-194046f6.js.map +1 -0
- package/dist/Globe-e0b92541.js +43 -0
- package/dist/Globe-e0b92541.js.map +1 -0
- package/dist/Globe-f9a29570.js +45 -0
- package/dist/Globe-f9a29570.js.map +1 -0
- package/dist/Graph-a5cabcf9.js +33 -0
- package/dist/Graph-a5cabcf9.js.map +1 -0
- package/dist/Graph-d719e9bc.js +31 -0
- package/dist/Graph-d719e9bc.js.map +1 -0
- package/dist/Illustration.css +19 -0
- package/dist/Jars-786486f1.js +50 -0
- package/dist/Jars-786486f1.js.map +1 -0
- package/dist/Jars-ce225524.js +52 -0
- package/dist/Jars-ce225524.js.map +1 -0
- package/dist/Lock-32a1942d.js +41 -0
- package/dist/Lock-32a1942d.js.map +1 -0
- package/dist/Lock-a8143e20.js +43 -0
- package/dist/Lock-a8143e20.js.map +1 -0
- package/dist/MagnifyingGlass-8d2fb672.js +32 -0
- package/dist/MagnifyingGlass-8d2fb672.js.map +1 -0
- package/dist/MagnifyingGlass-d6a087d9.js +30 -0
- package/dist/MagnifyingGlass-d6a087d9.js.map +1 -0
- package/dist/Marble-4abb104b.js +42 -0
- package/dist/Marble-4abb104b.js.map +1 -0
- package/dist/Marble-ce46aa0f.js +44 -0
- package/dist/Marble-ce46aa0f.js.map +1 -0
- package/dist/MarbleCard-56c75d72.js +47 -0
- package/dist/MarbleCard-56c75d72.js.map +1 -0
- package/dist/MarbleCard-877fd12e.js +45 -0
- package/dist/MarbleCard-877fd12e.js.map +1 -0
- package/dist/MultiCurrency-0e4db1a6.js +61 -0
- package/dist/MultiCurrency-0e4db1a6.js.map +1 -0
- package/dist/MultiCurrency-700fce5f.js +63 -0
- package/dist/MultiCurrency-700fce5f.js.map +1 -0
- package/dist/Plane-88c1d61e.js +37 -0
- package/dist/Plane-88c1d61e.js.map +1 -0
- package/dist/Plane-8eb0f41c.js +39 -0
- package/dist/Plane-8eb0f41c.js.map +1 -0
- package/dist/Scene-597f1100.js +50 -0
- package/dist/Scene-597f1100.js.map +1 -0
- package/dist/Scene-e2e3b7aa.js +48 -0
- package/dist/Scene-e2e3b7aa.js.map +1 -0
- package/dist/common.d.ts +15 -9
- package/dist/common.d.ts.map +1 -0
- package/dist/flags/Flag.d.ts +13 -12
- package/dist/flags/Flag.d.ts.map +1 -0
- package/dist/flags/index.d.ts +3 -2
- package/dist/flags/index.d.ts.map +1 -0
- package/dist/illustrations/Illustration.d.ts +21 -20
- package/dist/illustrations/Illustration.d.ts.map +1 -0
- package/dist/illustrations/index.d.ts +5 -4
- package/dist/illustrations/index.d.ts.map +1 -0
- package/dist/illustrations/metadata.d.ts +69 -68
- package/dist/illustrations/metadata.d.ts.map +1 -0
- package/dist/illustrations3d/Illustration3d.d.ts +11 -0
- package/dist/illustrations3d/Illustration3d.d.ts.map +1 -0
- package/dist/illustrations3d/Scene.d.ts +9 -0
- package/dist/illustrations3d/Scene.d.ts.map +1 -0
- package/dist/illustrations3d/index.d.ts +5 -0
- package/dist/illustrations3d/index.d.ts.map +1 -0
- package/dist/illustrations3d/models/CheckMark.d.ts +4 -0
- package/dist/illustrations3d/models/CheckMark.d.ts.map +1 -0
- package/dist/illustrations3d/models/Confetti.d.ts +4 -0
- package/dist/illustrations3d/models/Confetti.d.ts.map +1 -0
- package/dist/illustrations3d/models/Flower.d.ts +4 -0
- package/dist/illustrations3d/models/Flower.d.ts.map +1 -0
- package/dist/illustrations3d/models/Globe.d.ts +4 -0
- package/dist/illustrations3d/models/Globe.d.ts.map +1 -0
- package/dist/illustrations3d/models/Graph.d.ts +4 -0
- package/dist/illustrations3d/models/Graph.d.ts.map +1 -0
- package/dist/illustrations3d/models/Jars.d.ts +4 -0
- package/dist/illustrations3d/models/Jars.d.ts.map +1 -0
- package/dist/illustrations3d/models/Lock.d.ts +4 -0
- package/dist/illustrations3d/models/Lock.d.ts.map +1 -0
- package/dist/illustrations3d/models/MagnifyingGlass.d.ts +4 -0
- package/dist/illustrations3d/models/MagnifyingGlass.d.ts.map +1 -0
- package/dist/illustrations3d/models/Marble.d.ts +4 -0
- package/dist/illustrations3d/models/Marble.d.ts.map +1 -0
- package/dist/illustrations3d/models/MarbleCard.d.ts +4 -0
- package/dist/illustrations3d/models/MarbleCard.d.ts.map +1 -0
- package/dist/illustrations3d/models/MultiCurrency.d.ts +4 -0
- package/dist/illustrations3d/models/MultiCurrency.d.ts.map +1 -0
- package/dist/illustrations3d/models/Plane.d.ts +4 -0
- package/dist/illustrations3d/models/Plane.d.ts.map +1 -0
- package/dist/illustrations3d/utils.d.ts +9 -0
- package/dist/illustrations3d/utils.d.ts.map +1 -0
- package/dist/index-322e874c.js +332 -0
- package/dist/index-322e874c.js.map +1 -0
- package/dist/index-3bf9c1e9.js +325 -0
- package/dist/index-3bf9c1e9.js.map +1 -0
- package/dist/index.d.ts +10 -6
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +48 -24
- package/src/common.ts +17 -0
- package/src/flags/Flag.stories.tsx +19 -0
- package/src/flags/Flag.tsx +40 -0
- package/src/flags/index.ts +2 -0
- package/src/illustrations/Illustration.css +27 -0
- package/src/illustrations/Illustration.stories.tsx +33 -0
- package/src/illustrations/Illustration.tsx +95 -0
- package/src/illustrations/index.ts +5 -0
- package/src/illustrations/metadata.ts +141 -0
- package/src/illustrations3d/Illustration3d.stories.tsx +89 -0
- package/src/illustrations3d/Illustration3d.tsx +133 -0
- package/src/illustrations3d/Scene.tsx +54 -0
- package/src/illustrations3d/index.ts +6 -0
- package/src/illustrations3d/models/CheckMark.tsx +30 -0
- package/src/illustrations3d/models/Confetti.tsx +29 -0
- package/src/illustrations3d/models/Flower.tsx +25 -0
- package/src/illustrations3d/models/Globe.tsx +42 -0
- package/src/illustrations3d/models/Graph.tsx +27 -0
- package/src/illustrations3d/models/Jars.tsx +47 -0
- package/src/illustrations3d/models/Lock.tsx +38 -0
- package/src/illustrations3d/models/MagnifyingGlass.tsx +31 -0
- package/src/illustrations3d/models/Marble.tsx +57 -0
- package/src/illustrations3d/models/MarbleCard.tsx +62 -0
- package/src/illustrations3d/models/MultiCurrency.tsx +58 -0
- package/src/illustrations3d/models/Plane.tsx +33 -0
- package/src/illustrations3d/utils.ts +68 -0
- package/src/index.ts +12 -0
- package/dist/flags/Flag.stories.d.ts +0 -6
- package/dist/illustrations/Illustration.stories.d.ts +0 -19
- package/dist/index.modern.mjs +0 -2
- package/dist/index.modern.mjs.map +0 -1
- package/dist/index.module.js +0 -2
- package/dist/index.module.js.map +0 -1
- package/dist/index.umd.js +0 -2
- package/dist/index.umd.js.map +0 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
2
|
+
import React, { useEffect } from 'react';
|
|
3
|
+
|
|
4
|
+
import { Sizes } from '../common';
|
|
5
|
+
import { Assets } from '../illustrations/metadata';
|
|
6
|
+
|
|
7
|
+
import Illustration3d from './Illustration3d';
|
|
8
|
+
|
|
9
|
+
export default {
|
|
10
|
+
title: '3D Illustrations',
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const Confetti = () => {
|
|
14
|
+
return (
|
|
15
|
+
<>
|
|
16
|
+
<Illustration3d name={Assets.CONFETTI} size={Sizes.LARGE} />
|
|
17
|
+
</>
|
|
18
|
+
);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const Globe = () => {
|
|
22
|
+
return (
|
|
23
|
+
<>
|
|
24
|
+
<Illustration3d name={Assets.GLOBE} size={Sizes.LARGE} />
|
|
25
|
+
</>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const Lock = () => {
|
|
30
|
+
return <Illustration3d name={Assets.LOCK} size={Sizes.LARGE} />;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const CheckMark = () => {
|
|
34
|
+
return <Illustration3d name={Assets.CHECK_MARK} size={Sizes.LARGE} />;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const Flower = () => {
|
|
38
|
+
return <Illustration3d name={Assets.FLOWER} size={Sizes.LARGE} />;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const Plane = () => {
|
|
42
|
+
return <Illustration3d name={Assets.PLANE} size={Sizes.LARGE} />;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const Graph = () => {
|
|
46
|
+
return <Illustration3d name={Assets.GRAPH} size={Sizes.LARGE} />;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const Marble = () => {
|
|
50
|
+
return <Illustration3d name={Assets.MARBLE} size={Sizes.LARGE} />;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const MarbleCard = () => {
|
|
54
|
+
return <Illustration3d name={Assets.MARBLE_CARD} size={Sizes.LARGE} />;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const MagnifyingGlass = () => {
|
|
58
|
+
return <Illustration3d name={Assets.MAGNIFYING_GLASS} size={Sizes.LARGE} />;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const Jars = () => {
|
|
62
|
+
return <Illustration3d name={Assets.JARS} size={Sizes.LARGE} />;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const MultiCurrency = () => {
|
|
66
|
+
return <Illustration3d name={Assets.MULTI_CURRENCY} size={Sizes.LARGE} />;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const Fallback = () => {
|
|
70
|
+
// @ts-expect-error navigator has connection property
|
|
71
|
+
const originalNavigator = window.navigator.connection;
|
|
72
|
+
// mock slow internet connection
|
|
73
|
+
// @ts-expect-error navigator has connection property
|
|
74
|
+
window.navigator.connection = { effectiveType: 'slow-2g' };
|
|
75
|
+
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
// cleanup mock on unmount
|
|
78
|
+
// @ts-expect-error navigator has connection property
|
|
79
|
+
return () => (window.navigator.connection = originalNavigator);
|
|
80
|
+
}, [originalNavigator]);
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
<>
|
|
84
|
+
<Illustration3d name={Assets.LOCK} />
|
|
85
|
+
<br />
|
|
86
|
+
Mock slow internet connection so it fallback to static illustration
|
|
87
|
+
</>
|
|
88
|
+
);
|
|
89
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/* eslint-disable fp/no-mutation */
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import React, { lazy, Suspense, useEffect, useState, LazyExoticComponent } from 'react';
|
|
4
|
+
|
|
5
|
+
import { LargeSize, MediumSize, SmallSize, Sizes } from '../common';
|
|
6
|
+
|
|
7
|
+
import Illustration, { Assets } from './../illustrations';
|
|
8
|
+
import { useBattery, isConnectionSlow, isBatteryLow } from './utils';
|
|
9
|
+
|
|
10
|
+
export type Illustration3dNames =
|
|
11
|
+
| 'lock'
|
|
12
|
+
| 'globe'
|
|
13
|
+
| 'confetti'
|
|
14
|
+
| 'check-mark'
|
|
15
|
+
| 'flower'
|
|
16
|
+
| 'graph'
|
|
17
|
+
| 'jars'
|
|
18
|
+
| 'magnifying-glass'
|
|
19
|
+
| 'marble'
|
|
20
|
+
| 'marble-card'
|
|
21
|
+
| 'multi-currency'
|
|
22
|
+
| 'plane';
|
|
23
|
+
|
|
24
|
+
export type Props = {
|
|
25
|
+
name: Illustration3dNames;
|
|
26
|
+
size?: SmallSize | MediumSize | LargeSize;
|
|
27
|
+
className?: string;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
enum RenderMode {
|
|
31
|
+
INIT,
|
|
32
|
+
FALLBACK,
|
|
33
|
+
ASSET_3D,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const Illustration3d = ({ name, size = Sizes.MEDIUM, className }: Props) => {
|
|
37
|
+
const [renderMode, setRenderMode] = useState<RenderMode>(RenderMode.INIT);
|
|
38
|
+
const [inintrinsicSize, setInintrinsicSize] = useState<Props['size']>(size);
|
|
39
|
+
const batteryData = useBattery();
|
|
40
|
+
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
setRenderMode(
|
|
43
|
+
isConnectionSlow() || isBatteryLow(batteryData.level)
|
|
44
|
+
? RenderMode.FALLBACK
|
|
45
|
+
: RenderMode.ASSET_3D,
|
|
46
|
+
);
|
|
47
|
+
const isMobile: boolean =
|
|
48
|
+
(typeof window !== undefined && window?.matchMedia('(max-width: 575px)')?.matches) ?? false;
|
|
49
|
+
if (isMobile) {
|
|
50
|
+
setInintrinsicSize(Sizes.SMALL);
|
|
51
|
+
}
|
|
52
|
+
}, [batteryData]);
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<div
|
|
56
|
+
className={clsx(
|
|
57
|
+
'wds-illustration-3d',
|
|
58
|
+
`wds-illustration-3d-${name}`,
|
|
59
|
+
`wds-illustration-3d-${inintrinsicSize as string}`,
|
|
60
|
+
className,
|
|
61
|
+
)}
|
|
62
|
+
>
|
|
63
|
+
{renderMode === RenderMode.INIT ? null : renderMode === RenderMode.ASSET_3D ? (
|
|
64
|
+
<Suspense fallback={null}>{getModel({ name, size: inintrinsicSize })}</Suspense>
|
|
65
|
+
) : (
|
|
66
|
+
<Illustration name={name} size={size} alt="" />
|
|
67
|
+
)}
|
|
68
|
+
</div>
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
function getModel({ name, size }: Props) {
|
|
73
|
+
// @ts-expect-error unknown generic
|
|
74
|
+
let Model: LazyExoticComponent = <></>;
|
|
75
|
+
const Scene = lazy(() => import('./Scene'));
|
|
76
|
+
switch (name) {
|
|
77
|
+
case Assets.LOCK: {
|
|
78
|
+
Model = lazy(() => import('./models/Lock'));
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case Assets.GLOBE: {
|
|
82
|
+
Model = lazy(() => import('./models/Globe'));
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case Assets.CONFETTI: {
|
|
86
|
+
Model = lazy(() => import('./models/Confetti'));
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case Assets.CHECK_MARK: {
|
|
90
|
+
Model = lazy(() => import('./models/CheckMark'));
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
case Assets.FLOWER: {
|
|
94
|
+
Model = lazy(() => import('./models/Flower'));
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
case Assets.PLANE: {
|
|
98
|
+
Model = lazy(() => import('./models/Plane'));
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case Assets.GRAPH: {
|
|
102
|
+
Model = lazy(() => import('./models/Graph'));
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case Assets.MARBLE: {
|
|
106
|
+
Model = lazy(() => import('./models/Marble'));
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case Assets.MARBLE_CARD: {
|
|
110
|
+
Model = lazy(() => import('./models/MarbleCard'));
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case Assets.MAGNIFYING_GLASS: {
|
|
114
|
+
Model = lazy(() => import('./models/MagnifyingGlass'));
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case Assets.JARS: {
|
|
118
|
+
Model = lazy(() => import('./models/Jars'));
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case Assets.MULTI_CURRENCY: {
|
|
122
|
+
Model = lazy(() => import('./models/MultiCurrency'));
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return (
|
|
127
|
+
<Scene assetName={name} size={size}>
|
|
128
|
+
<Model />
|
|
129
|
+
</Scene>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export default Illustration3d;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* eslint-disable react/forbid-dom-props */
|
|
2
|
+
/* eslint-disable react/function-component-definition */
|
|
3
|
+
import { PerspectiveCamera } from '@react-three/drei';
|
|
4
|
+
import { Canvas } from '@react-three/fiber';
|
|
5
|
+
import React, { PropsWithChildren } from 'react';
|
|
6
|
+
import { PCFShadowMap, LinearToneMapping, SRGBColorSpace } from 'three';
|
|
7
|
+
|
|
8
|
+
import { ImageSizes, LargeSize, MediumSize, Sizes, SmallSize } from '../common';
|
|
9
|
+
import { Assets } from '../illustrations/metadata';
|
|
10
|
+
|
|
11
|
+
import type { Illustration3dNames } from './Illustration3d';
|
|
12
|
+
|
|
13
|
+
export type Props = PropsWithChildren<{
|
|
14
|
+
assetName: Illustration3dNames;
|
|
15
|
+
size?: SmallSize | MediumSize | LargeSize;
|
|
16
|
+
}>;
|
|
17
|
+
|
|
18
|
+
export default function Scene({ children, assetName, size = Sizes.MEDIUM }: Props) {
|
|
19
|
+
const castShadows: boolean = [
|
|
20
|
+
Assets.LOCK as string,
|
|
21
|
+
Assets.MULTI_CURRENCY as string,
|
|
22
|
+
Assets.MAGNIFYING_GLASS as string,
|
|
23
|
+
].includes(assetName);
|
|
24
|
+
return (
|
|
25
|
+
<Canvas
|
|
26
|
+
onCreated={({ gl }) => {
|
|
27
|
+
gl.setClearColor(0x000000, 0);
|
|
28
|
+
gl.setSize(ImageSizes[size], ImageSizes[size]);
|
|
29
|
+
gl.clearDepth();
|
|
30
|
+
}}
|
|
31
|
+
gl={{
|
|
32
|
+
alpha: true,
|
|
33
|
+
antialias: true,
|
|
34
|
+
pixelRatio: window.devicePixelRatio * 1,
|
|
35
|
+
toneMapping: LinearToneMapping,
|
|
36
|
+
outputColorSpace: SRGBColorSpace,
|
|
37
|
+
}}
|
|
38
|
+
shadows={{
|
|
39
|
+
type: PCFShadowMap,
|
|
40
|
+
enabled: castShadows,
|
|
41
|
+
}}
|
|
42
|
+
>
|
|
43
|
+
<PerspectiveCamera
|
|
44
|
+
makeDefault
|
|
45
|
+
far={1000000000000}
|
|
46
|
+
near={0.1}
|
|
47
|
+
fov={10.29}
|
|
48
|
+
aspect={window.innerWidth / window.innerHeight}
|
|
49
|
+
position={[0, 0, 100]}
|
|
50
|
+
/>
|
|
51
|
+
{children}
|
|
52
|
+
</Canvas>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useGLTF, useAnimations } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React, { useRef } from 'react';
|
|
4
|
+
import { ObjectLoader, LoopOnce } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const CheckMark = () => {
|
|
9
|
+
const modelRef = useRef();
|
|
10
|
+
const model = useGLTF(defineSrc('check-mark.gltf'));
|
|
11
|
+
const { animations, scene } = model;
|
|
12
|
+
|
|
13
|
+
const lights = useLoader(ObjectLoader, defineSrc('check-mark-light.json'));
|
|
14
|
+
|
|
15
|
+
const { mixer, clips } = useAnimations(animations, modelRef);
|
|
16
|
+
useFrame(() => {
|
|
17
|
+
model.materials['Standard'].map.offset.x += -0.0025;
|
|
18
|
+
|
|
19
|
+
mixer.clipAction(clips[0]).play().setLoop(LoopOnce, 1);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<>
|
|
24
|
+
<primitive ref={modelRef} scale={1.4} object={scene} />
|
|
25
|
+
<primitive object={lights} />
|
|
26
|
+
</>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default CheckMark;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useGLTF, useAnimations } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React, { useRef } from 'react';
|
|
4
|
+
import { ObjectLoader, LoopOnce } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const Confetti = () => {
|
|
9
|
+
const ref = useRef();
|
|
10
|
+
const model = useGLTF(defineSrc('confetti.gltf'));
|
|
11
|
+
|
|
12
|
+
const lights = useLoader(ObjectLoader, defineSrc('confetti-light.json'));
|
|
13
|
+
|
|
14
|
+
const { mixer, clips } = useAnimations(model.animations, ref);
|
|
15
|
+
useFrame(() => {
|
|
16
|
+
model.materials['Tapestry WebGL'].map.offset.x += -0.0015;
|
|
17
|
+
|
|
18
|
+
mixer.clipAction(clips[0]).play().setLoop(LoopOnce, 1);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<>
|
|
23
|
+
<primitive ref={ref} scale={1.5} position={[0, 1.5, 0]} object={model.scene} />
|
|
24
|
+
<primitive object={lights} />
|
|
25
|
+
</>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default Confetti;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ObjectLoader } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const Flower = () => {
|
|
9
|
+
const model = useGLTF(defineSrc('flower.gltf'));
|
|
10
|
+
|
|
11
|
+
const lights = useLoader(ObjectLoader, defineSrc('flower-light.json'));
|
|
12
|
+
|
|
13
|
+
useFrame(() => {
|
|
14
|
+
model.materials['Tapestry WebGL'].map.offset.x += -0.001;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<>
|
|
19
|
+
<primitive scale={1.3} position={[0, -9, 0]} object={model.scene} />
|
|
20
|
+
<primitive object={lights} />
|
|
21
|
+
</>
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default Flower;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { TextureLoader, ObjectLoader } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const Globe = () => {
|
|
9
|
+
const { scene } = useGLTF(defineSrc('globe.gltf'));
|
|
10
|
+
|
|
11
|
+
const lights = useLoader(ObjectLoader, defineSrc('globe-light.json'));
|
|
12
|
+
const wiseLogo = useLoader(TextureLoader, defineSrc('wise-flag-map-bump.jpg'));
|
|
13
|
+
const planet = scene.getObjectByName('Globe');
|
|
14
|
+
const orbit = scene.getObjectByName('Coins_Axis_Rotation_Animate');
|
|
15
|
+
|
|
16
|
+
scene.traverse((child) => {
|
|
17
|
+
if (child.name.startsWith('Coin_')) {
|
|
18
|
+
const mesh = child;
|
|
19
|
+
|
|
20
|
+
const material = mesh.material;
|
|
21
|
+
material.bumpMap = wiseLogo;
|
|
22
|
+
material.bumpMap.flipY = false;
|
|
23
|
+
mesh.castShadow = false;
|
|
24
|
+
mesh.receiveShadow = false;
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
useFrame(() => {
|
|
29
|
+
orbit.rotation.y += 0.002;
|
|
30
|
+
|
|
31
|
+
planet.material.map.offset.x += -0.0002;
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<>
|
|
36
|
+
<primitive position={[0, -10, 0]} scale={1.3} object={scene} />
|
|
37
|
+
<primitive object={lights} />
|
|
38
|
+
</>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export default Globe;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ObjectLoader } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const Graph = () => {
|
|
9
|
+
const model = useGLTF(defineSrc(`graph.gltf`));
|
|
10
|
+
|
|
11
|
+
const lights = useLoader(ObjectLoader, defineSrc('graph-light.json'));
|
|
12
|
+
|
|
13
|
+
useFrame(() => {
|
|
14
|
+
const { offset } = model.materials['Standard '].map;
|
|
15
|
+
offset.x += -0.0015;
|
|
16
|
+
offset.y += 0.0015;
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<>
|
|
21
|
+
<primitive scale={1.3} position={[0, -10, 0]} object={model.scene} />
|
|
22
|
+
<primitive object={lights} />
|
|
23
|
+
</>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default Graph;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { useGLTF, useAnimations } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React, { useRef } from 'react';
|
|
4
|
+
import { TextureLoader, ObjectLoader } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const Jars = () => {
|
|
9
|
+
const ref = useRef();
|
|
10
|
+
const model = useGLTF(defineSrc('jars.gltf'));
|
|
11
|
+
const lights = useLoader(ObjectLoader, defineSrc('jars-light.json'));
|
|
12
|
+
const wiseLogo = useLoader(TextureLoader, defineSrc('wise-flag-map-bump.jpg'));
|
|
13
|
+
const jars = [];
|
|
14
|
+
|
|
15
|
+
model.scene.traverse((child) => {
|
|
16
|
+
if (child.name.startsWith('Coin_')) {
|
|
17
|
+
child.material.bumpMap = wiseLogo;
|
|
18
|
+
|
|
19
|
+
child.material.bumpMap.flipY = false;
|
|
20
|
+
child.castShadow = false;
|
|
21
|
+
child.receiveShadow = false;
|
|
22
|
+
}
|
|
23
|
+
if (child.name.startsWith('Jar_')) {
|
|
24
|
+
jars.push(child);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const { mixer, clips } = useAnimations(model.animations, ref);
|
|
29
|
+
|
|
30
|
+
useFrame(() => {
|
|
31
|
+
mixer.clipAction(clips[0]).play();
|
|
32
|
+
|
|
33
|
+
jars.forEach((jar) => {
|
|
34
|
+
jar.material.map.offset.x += 0.001;
|
|
35
|
+
jar.material.map.offset.y += 0.0;
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<>
|
|
41
|
+
<primitive ref={ref} scale={1.3} position={[0, -10, 0]} object={model.scene} />
|
|
42
|
+
<primitive object={lights} />
|
|
43
|
+
</>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export default Jars;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useGLTF, useAnimations } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React, { useRef } from 'react';
|
|
4
|
+
import { LoopOnce, ObjectLoader } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const Lock = () => {
|
|
9
|
+
const ref = useRef();
|
|
10
|
+
const model = useGLTF(defineSrc('lock.gltf'));
|
|
11
|
+
|
|
12
|
+
const lights = useLoader(ObjectLoader, defineSrc('lock-light.json'));
|
|
13
|
+
|
|
14
|
+
model.scene.traverse((node) => {
|
|
15
|
+
if (node.isMesh) {
|
|
16
|
+
node.castShadow = true;
|
|
17
|
+
node.receiveShadow = true;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const { clips, mixer } = useAnimations(model.animations, ref);
|
|
22
|
+
let frame = 0;
|
|
23
|
+
useFrame(() => {
|
|
24
|
+
mixer.clipAction(clips[0]).play().setLoop(LoopOnce, 1);
|
|
25
|
+
model.scene.position.y = Math.sin(frame++ * 0.04) * 0.2;
|
|
26
|
+
|
|
27
|
+
model.materials.Standard.map.offset.x += -0.001;
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<>
|
|
32
|
+
<primitive ref={ref} scale={1.4} object={model.scene} />
|
|
33
|
+
<primitive object={lights} />
|
|
34
|
+
</>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default Lock;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ObjectLoader } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const MagnifyingGlass = () => {
|
|
9
|
+
const model = useGLTF(defineSrc(`magnifying-glass.gltf`));
|
|
10
|
+
|
|
11
|
+
const lights = useLoader(ObjectLoader, defineSrc('magnifying-glass-light.json'));
|
|
12
|
+
|
|
13
|
+
const lens = model.scene.getObjectByName('Optimised_lens');
|
|
14
|
+
|
|
15
|
+
useFrame(() => {
|
|
16
|
+
lens.material.transparent = true;
|
|
17
|
+
|
|
18
|
+
lens.material.opacity = 0.8;
|
|
19
|
+
|
|
20
|
+
model.materials['Tapestry WebGL'].map.offset.x += -0.0006;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<>
|
|
25
|
+
<primitive scale={1.5} position={[0, -12, 0]} object={model.scene} />
|
|
26
|
+
<primitive object={lights} />
|
|
27
|
+
</>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default MagnifyingGlass;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ObjectLoader } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const Marble = () => {
|
|
9
|
+
const model = useGLTF(defineSrc('marble.gltf'));
|
|
10
|
+
|
|
11
|
+
const lights = useLoader(ObjectLoader, defineSrc('marble-light.json'));
|
|
12
|
+
|
|
13
|
+
const sphere = model.scene.getObjectByName('Sphere1');
|
|
14
|
+
|
|
15
|
+
sphere.material.depthTest = true;
|
|
16
|
+
|
|
17
|
+
const stripeBottom = model.scene.getObjectByName('Strip_Center_Big_(4th_-_Bottom_Layer)');
|
|
18
|
+
|
|
19
|
+
stripeBottom.material.depthTest = false;
|
|
20
|
+
|
|
21
|
+
stripeBottom.renderOrder = 1;
|
|
22
|
+
|
|
23
|
+
const stripeLeft = model.scene.getObjectByName('Strip_Left_(3rd)');
|
|
24
|
+
|
|
25
|
+
stripeLeft.material.depthTest = false;
|
|
26
|
+
|
|
27
|
+
stripeLeft.renderOrder = 2;
|
|
28
|
+
|
|
29
|
+
const stripeRight = model.scene.getObjectByName('Strip_Left_(3rd)');
|
|
30
|
+
|
|
31
|
+
stripeRight.material.depthTest = false;
|
|
32
|
+
|
|
33
|
+
stripeRight.renderOrder = 3;
|
|
34
|
+
|
|
35
|
+
const stripeTop = model.scene.getObjectByName('Strip_Center_(1st_-_Top_Layer)');
|
|
36
|
+
|
|
37
|
+
stripeTop.material.depthTest = false;
|
|
38
|
+
|
|
39
|
+
stripeTop.renderOrder = 4;
|
|
40
|
+
|
|
41
|
+
const animatedMaps = [sphere, stripeTop, stripeBottom, stripeLeft, stripeRight].map(
|
|
42
|
+
(object) => object.material.map,
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
useFrame(() => {
|
|
46
|
+
animatedMaps.forEach((map) => (map.offset.y += -0.0015));
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<>
|
|
51
|
+
<primitive scale={1.4} position={[0, -11, 0]} object={model.scene} />
|
|
52
|
+
<primitive object={lights} />
|
|
53
|
+
</>
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export default Marble;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ObjectLoader } from 'three';
|
|
5
|
+
|
|
6
|
+
import { defineSrc } from '../utils';
|
|
7
|
+
|
|
8
|
+
const MarbleCard = () => {
|
|
9
|
+
const model = useGLTF(defineSrc('marble-card.gltf'));
|
|
10
|
+
|
|
11
|
+
const lights = useLoader(ObjectLoader, defineSrc('marble-card-light.json'));
|
|
12
|
+
const sphere = model.scene.getObjectByName('Sphere1');
|
|
13
|
+
|
|
14
|
+
sphere.material.depthTest = true;
|
|
15
|
+
|
|
16
|
+
const stripeBottom = model.scene.getObjectByName('Strip_Center_Big_(4th_-_Bottom_Layer)');
|
|
17
|
+
|
|
18
|
+
stripeBottom.material.depthTest = false;
|
|
19
|
+
|
|
20
|
+
stripeBottom.renderOrder = 1;
|
|
21
|
+
|
|
22
|
+
const stripeLeft = model.scene.getObjectByName('Strip_Left_(3rd)');
|
|
23
|
+
|
|
24
|
+
stripeLeft.material.depthTest = false;
|
|
25
|
+
|
|
26
|
+
stripeLeft.renderOrder = 2;
|
|
27
|
+
|
|
28
|
+
const stripeRight = model.scene.getObjectByName('Strip_Right_(2nd)');
|
|
29
|
+
|
|
30
|
+
stripeRight.material.depthTest = false;
|
|
31
|
+
|
|
32
|
+
stripeRight.renderOrder = 3;
|
|
33
|
+
|
|
34
|
+
const stripeTop = model.scene.getObjectByName('Strip_Center_(1st_-_Top_Layer)');
|
|
35
|
+
|
|
36
|
+
stripeTop.material.depthTest = false;
|
|
37
|
+
|
|
38
|
+
stripeTop.renderOrder = 4;
|
|
39
|
+
|
|
40
|
+
const card = model.scene.getObjectByName('Plane');
|
|
41
|
+
|
|
42
|
+
card.material.depthTest = false;
|
|
43
|
+
|
|
44
|
+
card.material.metalness = 0;
|
|
45
|
+
|
|
46
|
+
const animatedMaps = [sphere, stripeTop, stripeBottom, stripeLeft, stripeRight].map(
|
|
47
|
+
(object) => object.material.map,
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
useFrame(() => {
|
|
51
|
+
animatedMaps.forEach((map) => (map.offset.y += -0.0015));
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<>
|
|
56
|
+
<primitive scale={1.4} position={[0, -10, 0]} object={model.scene} />
|
|
57
|
+
<primitive object={lights} />
|
|
58
|
+
</>
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export default MarbleCard;
|