@wise/art 2.7.0 → 2.8.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/README.md +47 -0
- 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 +4 -158
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +15 -155
- package/dist/index.js.map +1 -1
- package/package.json +10 -4
- 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.js
CHANGED
|
@@ -1,162 +1,22 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
var index = require('./index-c17944c0.js');
|
|
4
|
+
require('react');
|
|
5
|
+
require('react/jsx-runtime');
|
|
6
|
+
require('clsx');
|
|
6
7
|
|
|
7
|
-
const unknownFlagName = 'wise';
|
|
8
|
-
const Flag = ({
|
|
9
|
-
code,
|
|
10
|
-
intrinsicSize = 64
|
|
11
|
-
}) => {
|
|
12
|
-
const [fallback, setFallback] = react.useState(null);
|
|
13
|
-
react.useEffect(() => {
|
|
14
|
-
setFallback(null);
|
|
15
|
-
}, [code]);
|
|
16
|
-
const detailed = intrinsicSize >= 150;
|
|
17
|
-
const name = fallback !== 'unknown' ? `${code.toLowerCase()}${fallback == null && detailed ? '-detailed' : ''}` : unknownFlagName;
|
|
18
|
-
return /*#__PURE__*/jsxRuntime.jsx("img", {
|
|
19
|
-
src: `https://wise.com/web-art/assets/flags/${name}.svg`,
|
|
20
|
-
alt: "",
|
|
21
|
-
width: intrinsicSize,
|
|
22
|
-
height: intrinsicSize,
|
|
23
|
-
onError: () => {
|
|
24
|
-
setFallback(prev => prev == null && detailed ? 'simple' : 'unknown');
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
};
|
|
28
8
|
|
|
29
|
-
exports.Sizes = void 0;
|
|
30
|
-
(function (Sizes) {
|
|
31
|
-
Sizes["SMALL"] = "small";
|
|
32
|
-
Sizes["MEDIUM"] = "medium";
|
|
33
|
-
Sizes["LARGE"] = "large";
|
|
34
|
-
})(exports.Sizes || (exports.Sizes = {}));
|
|
35
9
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
[exports.Sizes.LARGE]: 500
|
|
40
|
-
};
|
|
41
|
-
const Illustration = /*#__PURE__*/react.forwardRef(({
|
|
42
|
-
id,
|
|
43
|
-
name,
|
|
44
|
-
alt,
|
|
45
|
-
loading = 'eager',
|
|
46
|
-
className,
|
|
47
|
-
size = exports.Sizes.MEDIUM,
|
|
48
|
-
disablePadding = false
|
|
49
|
-
}, ref) => {
|
|
50
|
-
const {
|
|
51
|
-
SMALL,
|
|
52
|
-
MEDIUM
|
|
53
|
-
} = exports.Sizes;
|
|
54
|
-
return name ? /*#__PURE__*/jsxRuntime.jsxs("picture", {
|
|
55
|
-
children: [size === exports.Sizes.LARGE || size === exports.Sizes.MEDIUM ? /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
56
|
-
children: [/*#__PURE__*/jsxRuntime.jsx("source", {
|
|
57
|
-
width: imageSizes[SMALL],
|
|
58
|
-
height: imageSizes[SMALL],
|
|
59
|
-
media: "(max-width: 575px)",
|
|
60
|
-
srcSet: `${defineSrc(name, SMALL, '1x')}, ${defineSrc(name, SMALL, '2x')} 2x`
|
|
61
|
-
}), size !== exports.Sizes.MEDIUM ? /*#__PURE__*/jsxRuntime.jsx("source", {
|
|
62
|
-
width: imageSizes[MEDIUM],
|
|
63
|
-
height: imageSizes[MEDIUM],
|
|
64
|
-
media: "(max-width: 992px)",
|
|
65
|
-
srcSet: `${defineSrc(name, MEDIUM, '1x')}, ${defineSrc(name, MEDIUM, '2x')} 2x`
|
|
66
|
-
}) : null]
|
|
67
|
-
}) : null, /*#__PURE__*/jsxRuntime.jsx("img", {
|
|
68
|
-
id: id,
|
|
69
|
-
ref: ref,
|
|
70
|
-
alt: alt ?? name.replace('-', ' '),
|
|
71
|
-
"data-testid": `wds-${name}-illustration`,
|
|
72
|
-
className: clsx.clsx(`wds-illustration wds-illustration-${name}`, className, !disablePadding && 'wds-illustration-padding'),
|
|
73
|
-
loading: loading,
|
|
74
|
-
src: defineSrc(name, size, '1x'),
|
|
75
|
-
srcSet: `${defineSrc(name, size, '2x')} 2x`,
|
|
76
|
-
width: imageSizes[size],
|
|
77
|
-
height: imageSizes[size]
|
|
78
|
-
})]
|
|
79
|
-
}) : null;
|
|
10
|
+
Object.defineProperty(exports, 'Assets', {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () { return index.Assets; }
|
|
80
13
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
*
|
|
90
|
-
*/
|
|
91
|
-
exports.Assets = void 0;
|
|
92
|
-
(function (Assets) {
|
|
93
|
-
Assets["BELL"] = "bell";
|
|
94
|
-
Assets["BRIEFCASE"] = "briefcase";
|
|
95
|
-
Assets["BUSINESS_CARD"] = "business-card";
|
|
96
|
-
Assets["CALENDAR"] = "calendar";
|
|
97
|
-
Assets["CHECK_MARK"] = "check-mark";
|
|
98
|
-
Assets["CLOSED_WINDOW"] = "closed-window";
|
|
99
|
-
Assets["COIN_PILE_DOWN"] = "coin-pile-down";
|
|
100
|
-
Assets["COIN_PILE_UP"] = "coin-pile-up";
|
|
101
|
-
Assets["CONFETTI"] = "confetti";
|
|
102
|
-
Assets["CONSTRUCTION_FENCE"] = "construction-fence";
|
|
103
|
-
Assets["CONVERT"] = "convert";
|
|
104
|
-
Assets["COOKIE"] = "cookie";
|
|
105
|
-
Assets["DIGITAL_CARD_2"] = "digital-card-2";
|
|
106
|
-
Assets["DIGITAL_CARD"] = "digital-card";
|
|
107
|
-
Assets["DOCUMENTS"] = "documents";
|
|
108
|
-
Assets["DOOR"] = "door";
|
|
109
|
-
Assets["ECO_CARD"] = "eco-card";
|
|
110
|
-
Assets["ELECTRIC_PLUG"] = "electric-plug";
|
|
111
|
-
Assets["EMAIL_SUCCESS"] = "email-success";
|
|
112
|
-
Assets["EMAIL"] = "email";
|
|
113
|
-
Assets["EXCLAMATION_MARK"] = "exclamation-mark";
|
|
114
|
-
Assets["FLAG"] = "flag";
|
|
115
|
-
Assets["FLOWER"] = "flower";
|
|
116
|
-
Assets["GEAR"] = "gear";
|
|
117
|
-
Assets["GLOBE"] = "globe";
|
|
118
|
-
Assets["GRAPH"] = "graph";
|
|
119
|
-
Assets["HEART_2"] = "heart-2";
|
|
120
|
-
Assets["HEART_3"] = "heart-3";
|
|
121
|
-
Assets["HEART_4"] = "heart-4";
|
|
122
|
-
Assets["HEART_5"] = "heart-5";
|
|
123
|
-
Assets["HEART"] = "heart";
|
|
124
|
-
Assets["HOUSE"] = "house";
|
|
125
|
-
Assets["ID_CARD"] = "id-card";
|
|
126
|
-
Assets["INFINITE"] = "infinite";
|
|
127
|
-
Assets["INVITE_LETTER"] = "invite-letter";
|
|
128
|
-
Assets["JARS"] = "jars";
|
|
129
|
-
Assets["KEY"] = "key";
|
|
130
|
-
Assets["LIGHT_BULB"] = "light-bulb";
|
|
131
|
-
Assets["LOCK"] = "lock";
|
|
132
|
-
Assets["MAGNIFYING_GLASS"] = "magnifying-glass";
|
|
133
|
-
Assets["MAP"] = "map";
|
|
134
|
-
Assets["MARBLE_CARD_BUSINESS"] = "marble-card-business";
|
|
135
|
-
Assets["MARBLE_CARD"] = "marble-card";
|
|
136
|
-
Assets["MARBLE"] = "marble";
|
|
137
|
-
Assets["MEGAPHONE"] = "megaphone";
|
|
138
|
-
Assets["MULTI_CURRENCY"] = "multi-currency";
|
|
139
|
-
Assets["ONE_INVITE_LETTER_OPENED"] = "one-invite-letter-opened";
|
|
140
|
-
Assets["PALM_TREE"] = "palm-tree";
|
|
141
|
-
Assets["PERCENTAGE"] = "percentage";
|
|
142
|
-
Assets["PERSONAL_CARD"] = "personal-card";
|
|
143
|
-
Assets["PHONES"] = "phones";
|
|
144
|
-
Assets["PIE_CHART"] = "pie-chart";
|
|
145
|
-
Assets["PLANE_2"] = "plane-2";
|
|
146
|
-
Assets["PLANE"] = "plane";
|
|
147
|
-
Assets["PUZZLE_PIECES"] = "puzzle-pieces";
|
|
148
|
-
Assets["QUESTION_MARK"] = "question-mark";
|
|
149
|
-
Assets["RECEIVE"] = "receive";
|
|
150
|
-
Assets["REMINDER_LETTER"] = "reminder-letter";
|
|
151
|
-
Assets["SAND_TIMER"] = "sand-timer";
|
|
152
|
-
Assets["SHOPPING_BAG"] = "shopping-bag";
|
|
153
|
-
Assets["SKIP_AUTHENTICATION"] = "skip-authentication";
|
|
154
|
-
Assets["SPEECH_BUBBLE"] = "speech-bubble";
|
|
155
|
-
Assets["TOOL"] = "tool";
|
|
156
|
-
Assets["TWO_INVITE_LETTERS_OPENED"] = "two-invite-letters-opened";
|
|
157
|
-
Assets["WALLET"] = "wallet";
|
|
158
|
-
})(exports.Assets || (exports.Assets = {}));
|
|
159
|
-
|
|
160
|
-
exports.Flag = Flag;
|
|
161
|
-
exports.Illustration = Illustration;
|
|
14
|
+
exports.Flag = index.Flag;
|
|
15
|
+
exports.Illustration = index.Illustration;
|
|
16
|
+
exports.Illustration3D = index.Illustration3D;
|
|
17
|
+
Object.defineProperty(exports, 'Sizes', {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return index.Sizes; }
|
|
20
|
+
});
|
|
21
|
+
exports.isIllustrationSupport3D = index.isIllustrationSupport3D;
|
|
162
22
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wise/art",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "React library for art elements in UI",
|
|
6
6
|
"homepage": "https://github.com/transferwise/web-art#readme",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
],
|
|
23
23
|
"scripts": {
|
|
24
24
|
"setup": "yarn && yarn build",
|
|
25
|
+
"load-3d-i10s": "node ./scripts/load-3d-i10s.mjs",
|
|
25
26
|
"load-i10s": "copyfiles -u 3 node_modules/wise-atoms/illustrations/**/*.png temp",
|
|
26
27
|
"load-flags": "yarn load-country-flags && yarn load-currency-flags && yarn transform-flags && yarn convert-flags-svg-to-png",
|
|
27
28
|
"load-country-flags": "copyfiles -u 3 node_modules/wise-atoms/flags/*.svg s3-bucket/flags && node ./scripts/generate-country-flags.mjs",
|
|
@@ -32,7 +33,7 @@
|
|
|
32
33
|
"generate-i10s-metadata": "node ./scripts/generate-i10s-metadata.mjs && eslint 'src/illustrations/metadata.ts' --fix",
|
|
33
34
|
"bundle": "rm -rf dist && rollup --config --sourcemap && cpx src/illustrations/Illustration.css dist/",
|
|
34
35
|
"cleanup": "rm -rf temp",
|
|
35
|
-
"build": "yarn load-i10s && yarn convert-i10s-png-to-webp && yarn generate-i10s-metadata && yarn load-flags && yarn bundle && yarn cleanup",
|
|
36
|
+
"build": "yarn load-i10s && yarn load-3d-i10s && yarn convert-i10s-png-to-webp && yarn generate-i10s-metadata && yarn load-flags && yarn bundle && yarn cleanup",
|
|
36
37
|
"start": "storybook dev -p 3001",
|
|
37
38
|
"dev": "yarn start",
|
|
38
39
|
"test": "release-to-github-with-changelog-pre-release-checks",
|
|
@@ -41,7 +42,10 @@
|
|
|
41
42
|
},
|
|
42
43
|
"dependencies": {
|
|
43
44
|
"@babel/runtime": "^7.22.15",
|
|
44
|
-
"clsx": "^2.0.0"
|
|
45
|
+
"clsx": "^2.0.0",
|
|
46
|
+
"three": "^0.154.0",
|
|
47
|
+
"@react-three/fiber": "^8.13.5",
|
|
48
|
+
"@react-three/drei": "^9.78.2"
|
|
45
49
|
},
|
|
46
50
|
"devDependencies": {
|
|
47
51
|
"@babel/core": "^7.22.15",
|
|
@@ -64,6 +68,7 @@
|
|
|
64
68
|
"@types/jsdom": "^21.1.2",
|
|
65
69
|
"@types/react": "^18.2.21",
|
|
66
70
|
"@types/react-dom": "^18.2.7",
|
|
71
|
+
"@types/three": "^0.154.0",
|
|
67
72
|
"babel-plugin-optimize-clsx": "^2.6.2",
|
|
68
73
|
"copyfiles": "^2.4.1",
|
|
69
74
|
"cpx": "^1.5.0",
|
|
@@ -71,6 +76,7 @@
|
|
|
71
76
|
"glob": "^8.1.0",
|
|
72
77
|
"imagemin": "^8.0.1",
|
|
73
78
|
"imagemin-webp": "^7.0.0",
|
|
79
|
+
"gltf-pipeline": "^4.1.0",
|
|
74
80
|
"jest": "^28.1.3",
|
|
75
81
|
"jest-environment-jsdom": "^28.1.3",
|
|
76
82
|
"jsdom": "~21.1.2",
|
|
@@ -83,7 +89,7 @@
|
|
|
83
89
|
"ts-node": "10.9.1",
|
|
84
90
|
"typescript": "^4.9.5",
|
|
85
91
|
"vite": "^4.4.9",
|
|
86
|
-
"wise-atoms": "git+ssh://git@github.com:transferwise/wise-atoms.git#
|
|
92
|
+
"wise-atoms": "git+ssh://git@github.com:transferwise/wise-atoms.git#c2683d557cf6f7b4f6226ea8f0e67bc797e7fb2e"
|
|
87
93
|
},
|
|
88
94
|
"peerDependencies": {
|
|
89
95
|
"react": ">=17",
|
package/src/common.ts
CHANGED
|
@@ -4,6 +4,12 @@ export enum Sizes {
|
|
|
4
4
|
LARGE = 'large',
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
+
export const ImageSizes = {
|
|
8
|
+
[Sizes.SMALL]: 200,
|
|
9
|
+
[Sizes.MEDIUM]: 300,
|
|
10
|
+
[Sizes.LARGE]: 500,
|
|
11
|
+
};
|
|
12
|
+
|
|
7
13
|
export type LargeSize = 'large';
|
|
8
14
|
export type MediumSize = 'medium';
|
|
9
15
|
export type SmallSize = 'small';
|
|
@@ -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;
|