@wise/art 2.6.0 → 2.7.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/dist/CheckMark-6516e382.js +39 -0
- package/dist/CheckMark-6516e382.js.map +1 -0
- package/dist/CheckMark-7e2e6863.esm.js +37 -0
- package/dist/CheckMark-7e2e6863.esm.js.map +1 -0
- package/dist/Confetti-71f18588.js +36 -0
- package/dist/Confetti-71f18588.js.map +1 -0
- package/dist/Confetti-f1f0c4a5.esm.js +34 -0
- package/dist/Confetti-f1f0c4a5.esm.js.map +1 -0
- package/dist/Flower-2325e8ba.js +29 -0
- package/dist/Flower-2325e8ba.js.map +1 -0
- package/dist/Flower-8a17d7a6.esm.js +27 -0
- package/dist/Flower-8a17d7a6.esm.js.map +1 -0
- package/dist/Globe-601b1eb5.esm.js +43 -0
- package/dist/Globe-601b1eb5.esm.js.map +1 -0
- package/dist/Globe-93237bd2.js +45 -0
- package/dist/Globe-93237bd2.js.map +1 -0
- package/dist/Graph-536a6847.js +33 -0
- package/dist/Graph-536a6847.js.map +1 -0
- package/dist/Graph-e766a791.esm.js +31 -0
- package/dist/Graph-e766a791.esm.js.map +1 -0
- package/dist/Illustration.css +19 -0
- package/dist/Jars-9afb6e8b.esm.js +50 -0
- package/dist/Jars-9afb6e8b.esm.js.map +1 -0
- package/dist/Jars-fcb1e2b1.js +52 -0
- package/dist/Jars-fcb1e2b1.js.map +1 -0
- package/dist/Lock-2365c3f9.esm.js +41 -0
- package/dist/Lock-2365c3f9.esm.js.map +1 -0
- package/dist/Lock-e5c89aa2.js +43 -0
- package/dist/Lock-e5c89aa2.js.map +1 -0
- package/dist/MagnifyingGlass-92351fd6.js +32 -0
- package/dist/MagnifyingGlass-92351fd6.js.map +1 -0
- package/dist/MagnifyingGlass-92fbedda.esm.js +30 -0
- package/dist/MagnifyingGlass-92fbedda.esm.js.map +1 -0
- package/dist/Marble-0f2d6f38.js +44 -0
- package/dist/Marble-0f2d6f38.js.map +1 -0
- package/dist/Marble-91d300a3.esm.js +42 -0
- package/dist/Marble-91d300a3.esm.js.map +1 -0
- package/dist/MarbleCard-690b2b8e.esm.js +45 -0
- package/dist/MarbleCard-690b2b8e.esm.js.map +1 -0
- package/dist/MarbleCard-ed7536dc.js +47 -0
- package/dist/MarbleCard-ed7536dc.js.map +1 -0
- package/dist/MultiCurrency-0456db19.js +63 -0
- package/dist/MultiCurrency-0456db19.js.map +1 -0
- package/dist/MultiCurrency-1b491db5.esm.js +61 -0
- package/dist/MultiCurrency-1b491db5.esm.js.map +1 -0
- package/dist/Plane-b6340ff4.js +39 -0
- package/dist/Plane-b6340ff4.js.map +1 -0
- package/dist/Plane-d631e81c.esm.js +37 -0
- package/dist/Plane-d631e81c.esm.js.map +1 -0
- package/dist/Scene-45fbe252.js +48 -0
- package/dist/Scene-45fbe252.js.map +1 -0
- package/dist/Scene-783029f4.esm.js +46 -0
- package/dist/Scene-783029f4.esm.js.map +1 -0
- package/dist/common.d.ts +5 -0
- package/dist/common.d.ts.map +1 -1
- package/dist/illustrations3d/Illustration3D.d.ts +11 -0
- package/dist/illustrations3d/Illustration3D.d.ts.map +1 -0
- package/dist/illustrations3d/Scene.d.ts +10 -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-3b6277fc.esm.js +325 -0
- package/dist/index-3b6277fc.esm.js.map +1 -0
- package/dist/index-c17944c0.js +332 -0
- package/dist/index-c17944c0.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +5 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +15 -155
- package/dist/index.js.map +1 -1
- package/package.json +15 -14
- package/src/common.ts +6 -0
- package/src/illustrations/Illustration.css +19 -0
- package/src/illustrations3d/Illustration3D.stories.tsx +88 -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 +24 -0
- package/src/illustrations3d/models/Globe.tsx +41 -0
- package/src/illustrations3d/models/Graph.tsx +26 -0
- package/src/illustrations3d/models/Jars.tsx +47 -0
- package/src/illustrations3d/models/Lock.tsx +38 -0
- package/src/illustrations3d/models/MagnifyingGlass.tsx +30 -0
- package/src/illustrations3d/models/Marble.tsx +47 -0
- package/src/illustrations3d/models/MarbleCard.tsx +50 -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 +5 -0
- package/dist/index.mjs +0 -159
- package/dist/index.mjs.map +0 -1
|
@@ -6,3 +6,22 @@ img.wds-illustration {
|
|
|
6
6
|
.wds-illustration-padding {
|
|
7
7
|
padding: 24px;
|
|
8
8
|
}
|
|
9
|
+
|
|
10
|
+
.wds-illustration-3d {
|
|
11
|
+
display: inline-flex;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.wds-illustration-3d-small {
|
|
15
|
+
width: 200px;
|
|
16
|
+
height: 200px;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.wds-illustration-3d-medium {
|
|
20
|
+
width: 300px;
|
|
21
|
+
height: 300px;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.wds-illustration-3d-large {
|
|
25
|
+
width: 500px;
|
|
26
|
+
height: 500px;
|
|
27
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
<p>Mock slow internet connection so it fallback to static illustration</p>
|
|
86
|
+
</>
|
|
87
|
+
);
|
|
88
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/* eslint-disable fp/no-mutation */
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { lazy, Suspense, useEffect, useState, LazyExoticComponent } from 'react';
|
|
4
|
+
|
|
5
|
+
import { LargeSize, MediumSize, SmallSize, Sizes } from '../common';
|
|
6
|
+
import Illustration, { Assets } from '../illustrations';
|
|
7
|
+
|
|
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
|
+
import { PerspectiveCamera } from '@react-three/drei';
|
|
2
|
+
import { Canvas } from '@react-three/fiber';
|
|
3
|
+
import type { PropsWithChildren } from 'react';
|
|
4
|
+
import { PCFShadowMap, LinearToneMapping, SRGBColorSpace } from 'three';
|
|
5
|
+
|
|
6
|
+
import { ImageSizes, LargeSize, MediumSize, Sizes, SmallSize } from '../common';
|
|
7
|
+
import { Assets } from '../illustrations/metadata';
|
|
8
|
+
|
|
9
|
+
import type { Illustration3DNames } from './Illustration3D';
|
|
10
|
+
|
|
11
|
+
export type Props = PropsWithChildren<{
|
|
12
|
+
assetName: Illustration3DNames;
|
|
13
|
+
size?: SmallSize | MediumSize | LargeSize;
|
|
14
|
+
}>;
|
|
15
|
+
|
|
16
|
+
const Scene = ({ children, assetName, size = Sizes.MEDIUM }: Props) => {
|
|
17
|
+
const castShadows: boolean = [
|
|
18
|
+
Assets.LOCK as string,
|
|
19
|
+
Assets.MULTI_CURRENCY as string,
|
|
20
|
+
Assets.MAGNIFYING_GLASS as string,
|
|
21
|
+
].includes(assetName);
|
|
22
|
+
return (
|
|
23
|
+
<Canvas
|
|
24
|
+
onCreated={({ gl }) => {
|
|
25
|
+
gl.setClearColor(0x000000, 0);
|
|
26
|
+
gl.setSize(ImageSizes[size], ImageSizes[size]);
|
|
27
|
+
gl.clearDepth();
|
|
28
|
+
}}
|
|
29
|
+
gl={{
|
|
30
|
+
alpha: true,
|
|
31
|
+
antialias: true,
|
|
32
|
+
pixelRatio: window.devicePixelRatio * 1,
|
|
33
|
+
toneMapping: LinearToneMapping,
|
|
34
|
+
outputColorSpace: SRGBColorSpace,
|
|
35
|
+
}}
|
|
36
|
+
shadows={{
|
|
37
|
+
type: PCFShadowMap,
|
|
38
|
+
enabled: castShadows,
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
41
|
+
<PerspectiveCamera
|
|
42
|
+
makeDefault
|
|
43
|
+
far={1000000000000}
|
|
44
|
+
near={0.1}
|
|
45
|
+
fov={10.29}
|
|
46
|
+
aspect={window.innerWidth / window.innerHeight}
|
|
47
|
+
position={[0, 0, 100]}
|
|
48
|
+
/>
|
|
49
|
+
{children}
|
|
50
|
+
</Canvas>
|
|
51
|
+
);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export default Scene;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useGLTF, useAnimations } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import { 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 { 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,24 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import { ObjectLoader } from 'three';
|
|
4
|
+
|
|
5
|
+
import { defineSrc } from '../utils';
|
|
6
|
+
|
|
7
|
+
const Flower = () => {
|
|
8
|
+
const model = useGLTF(defineSrc('flower.gltf'));
|
|
9
|
+
|
|
10
|
+
const lights = useLoader(ObjectLoader, defineSrc('flower-light.json'));
|
|
11
|
+
|
|
12
|
+
useFrame(() => {
|
|
13
|
+
model.materials['Tapestry WebGL'].map.offset.x += -0.001;
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<>
|
|
18
|
+
<primitive scale={1.3} position={[0, -9, 0]} object={model.scene} />
|
|
19
|
+
<primitive object={lights} />
|
|
20
|
+
</>
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default Flower;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import { TextureLoader, ObjectLoader } from 'three';
|
|
4
|
+
|
|
5
|
+
import { defineSrc } from '../utils';
|
|
6
|
+
|
|
7
|
+
const Globe = () => {
|
|
8
|
+
const { scene } = useGLTF(defineSrc('globe.gltf'));
|
|
9
|
+
|
|
10
|
+
const lights = useLoader(ObjectLoader, defineSrc('globe-light.json'));
|
|
11
|
+
const wiseLogo = useLoader(TextureLoader, defineSrc('wise-flag-map-bump.jpg'));
|
|
12
|
+
const planet = scene.getObjectByName('Globe');
|
|
13
|
+
const orbit = scene.getObjectByName('Coins_Axis_Rotation_Animate');
|
|
14
|
+
|
|
15
|
+
scene.traverse((child) => {
|
|
16
|
+
if (child.name.startsWith('Coin_')) {
|
|
17
|
+
const mesh = child;
|
|
18
|
+
|
|
19
|
+
const material = mesh.material;
|
|
20
|
+
material.bumpMap = wiseLogo;
|
|
21
|
+
material.bumpMap.flipY = false;
|
|
22
|
+
mesh.castShadow = false;
|
|
23
|
+
mesh.receiveShadow = false;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
useFrame(() => {
|
|
28
|
+
orbit.rotation.y += 0.002;
|
|
29
|
+
|
|
30
|
+
planet.material.map.offset.x += -0.0002;
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<>
|
|
35
|
+
<primitive position={[0, -10, 0]} scale={1.3} object={scene} />
|
|
36
|
+
<primitive object={lights} />
|
|
37
|
+
</>
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export default Globe;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import { ObjectLoader } from 'three';
|
|
4
|
+
|
|
5
|
+
import { defineSrc } from '../utils';
|
|
6
|
+
|
|
7
|
+
const Graph = () => {
|
|
8
|
+
const model = useGLTF(defineSrc(`graph.gltf`));
|
|
9
|
+
|
|
10
|
+
const lights = useLoader(ObjectLoader, defineSrc('graph-light.json'));
|
|
11
|
+
|
|
12
|
+
useFrame(() => {
|
|
13
|
+
const { offset } = model.materials['Standard '].map;
|
|
14
|
+
offset.x += -0.0015;
|
|
15
|
+
offset.y += 0.0015;
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<>
|
|
20
|
+
<primitive scale={1.3} position={[0, -10, 0]} object={model.scene} />
|
|
21
|
+
<primitive object={lights} />
|
|
22
|
+
</>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
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 { 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 { 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,30 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import { ObjectLoader } from 'three';
|
|
4
|
+
|
|
5
|
+
import { defineSrc } from '../utils';
|
|
6
|
+
|
|
7
|
+
const MagnifyingGlass = () => {
|
|
8
|
+
const model = useGLTF(defineSrc(`magnifying-glass.gltf`));
|
|
9
|
+
|
|
10
|
+
const lights = useLoader(ObjectLoader, defineSrc('magnifying-glass-light.json'));
|
|
11
|
+
|
|
12
|
+
const lens = model.scene.getObjectByName('Optimised_lens');
|
|
13
|
+
|
|
14
|
+
useFrame(() => {
|
|
15
|
+
lens.material.transparent = true;
|
|
16
|
+
|
|
17
|
+
lens.material.opacity = 0.8;
|
|
18
|
+
|
|
19
|
+
model.materials['Tapestry WebGL'].map.offset.x += -0.0006;
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<>
|
|
24
|
+
<primitive scale={1.5} position={[0, -12, 0]} object={model.scene} />
|
|
25
|
+
<primitive object={lights} />
|
|
26
|
+
</>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default MagnifyingGlass;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import { ObjectLoader } from 'three';
|
|
4
|
+
|
|
5
|
+
import { defineSrc } from '../utils';
|
|
6
|
+
|
|
7
|
+
const Marble = () => {
|
|
8
|
+
const model = useGLTF(defineSrc('marble.gltf'));
|
|
9
|
+
|
|
10
|
+
const lights = useLoader(ObjectLoader, defineSrc('marble-light.json'));
|
|
11
|
+
|
|
12
|
+
const sphere = model.scene.getObjectByName('Sphere1');
|
|
13
|
+
sphere.material.depthTest = true;
|
|
14
|
+
|
|
15
|
+
const stripeBottom = model.scene.getObjectByName('Strip_Center_Big_(4th_-_Bottom_Layer)');
|
|
16
|
+
stripeBottom.material.depthTest = false;
|
|
17
|
+
stripeBottom.renderOrder = 1;
|
|
18
|
+
|
|
19
|
+
const stripeLeft = model.scene.getObjectByName('Strip_Left_(3rd)');
|
|
20
|
+
stripeLeft.material.depthTest = false;
|
|
21
|
+
stripeLeft.renderOrder = 2;
|
|
22
|
+
|
|
23
|
+
const stripeRight = model.scene.getObjectByName('Strip_Left_(3rd)');
|
|
24
|
+
stripeRight.material.depthTest = false;
|
|
25
|
+
stripeRight.renderOrder = 3;
|
|
26
|
+
|
|
27
|
+
const stripeTop = model.scene.getObjectByName('Strip_Center_(1st_-_Top_Layer)');
|
|
28
|
+
stripeTop.material.depthTest = false;
|
|
29
|
+
stripeTop.renderOrder = 4;
|
|
30
|
+
|
|
31
|
+
const animatedMaps = [sphere, stripeTop, stripeBottom, stripeLeft, stripeRight].map(
|
|
32
|
+
(object) => object.material.map,
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
useFrame(() => {
|
|
36
|
+
animatedMaps.forEach((map) => (map.offset.y += -0.0015));
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<>
|
|
41
|
+
<primitive scale={1.4} position={[0, -11, 0]} object={model.scene} />
|
|
42
|
+
<primitive object={lights} />
|
|
43
|
+
</>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export default Marble;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useGLTF } from '@react-three/drei';
|
|
2
|
+
import { useFrame, useLoader } from '@react-three/fiber';
|
|
3
|
+
import { ObjectLoader } from 'three';
|
|
4
|
+
|
|
5
|
+
import { defineSrc } from '../utils';
|
|
6
|
+
|
|
7
|
+
const MarbleCard = () => {
|
|
8
|
+
const model = useGLTF(defineSrc('marble-card.gltf'));
|
|
9
|
+
|
|
10
|
+
const lights = useLoader(ObjectLoader, defineSrc('marble-card-light.json'));
|
|
11
|
+
const sphere = model.scene.getObjectByName('Sphere1');
|
|
12
|
+
sphere.material.depthTest = true;
|
|
13
|
+
|
|
14
|
+
const stripeBottom = model.scene.getObjectByName('Strip_Center_Big_(4th_-_Bottom_Layer)');
|
|
15
|
+
stripeBottom.material.depthTest = false;
|
|
16
|
+
stripeBottom.renderOrder = 1;
|
|
17
|
+
|
|
18
|
+
const stripeLeft = model.scene.getObjectByName('Strip_Left_(3rd)');
|
|
19
|
+
stripeLeft.material.depthTest = false;
|
|
20
|
+
stripeLeft.renderOrder = 2;
|
|
21
|
+
|
|
22
|
+
const stripeRight = model.scene.getObjectByName('Strip_Right_(2nd)');
|
|
23
|
+
stripeRight.material.depthTest = false;
|
|
24
|
+
stripeRight.renderOrder = 3;
|
|
25
|
+
|
|
26
|
+
const stripeTop = model.scene.getObjectByName('Strip_Center_(1st_-_Top_Layer)');
|
|
27
|
+
stripeTop.material.depthTest = false;
|
|
28
|
+
stripeTop.renderOrder = 4;
|
|
29
|
+
|
|
30
|
+
const card = model.scene.getObjectByName('Plane');
|
|
31
|
+
card.material.depthTest = false;
|
|
32
|
+
card.material.metalness = 0;
|
|
33
|
+
|
|
34
|
+
const animatedMaps = [sphere, stripeTop, stripeBottom, stripeLeft, stripeRight].map(
|
|
35
|
+
(object) => object.material.map,
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
useFrame(() => {
|
|
39
|
+
animatedMaps.forEach((map) => (map.offset.y += -0.0015));
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<>
|
|
44
|
+
<primitive scale={1.4} position={[0, -10, 0]} object={model.scene} />
|
|
45
|
+
<primitive object={lights} />
|
|
46
|
+
</>
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export default MarbleCard;
|