@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.
Files changed (119) hide show
  1. package/README.md +47 -0
  2. package/dist/CheckMark-6516e382.js +39 -0
  3. package/dist/CheckMark-6516e382.js.map +1 -0
  4. package/dist/CheckMark-7e2e6863.esm.js +37 -0
  5. package/dist/CheckMark-7e2e6863.esm.js.map +1 -0
  6. package/dist/Confetti-71f18588.js +36 -0
  7. package/dist/Confetti-71f18588.js.map +1 -0
  8. package/dist/Confetti-f1f0c4a5.esm.js +34 -0
  9. package/dist/Confetti-f1f0c4a5.esm.js.map +1 -0
  10. package/dist/Flower-2325e8ba.js +29 -0
  11. package/dist/Flower-2325e8ba.js.map +1 -0
  12. package/dist/Flower-8a17d7a6.esm.js +27 -0
  13. package/dist/Flower-8a17d7a6.esm.js.map +1 -0
  14. package/dist/Globe-601b1eb5.esm.js +43 -0
  15. package/dist/Globe-601b1eb5.esm.js.map +1 -0
  16. package/dist/Globe-93237bd2.js +45 -0
  17. package/dist/Globe-93237bd2.js.map +1 -0
  18. package/dist/Graph-536a6847.js +33 -0
  19. package/dist/Graph-536a6847.js.map +1 -0
  20. package/dist/Graph-e766a791.esm.js +31 -0
  21. package/dist/Graph-e766a791.esm.js.map +1 -0
  22. package/dist/Illustration.css +19 -0
  23. package/dist/Jars-9afb6e8b.esm.js +50 -0
  24. package/dist/Jars-9afb6e8b.esm.js.map +1 -0
  25. package/dist/Jars-fcb1e2b1.js +52 -0
  26. package/dist/Jars-fcb1e2b1.js.map +1 -0
  27. package/dist/Lock-2365c3f9.esm.js +41 -0
  28. package/dist/Lock-2365c3f9.esm.js.map +1 -0
  29. package/dist/Lock-e5c89aa2.js +43 -0
  30. package/dist/Lock-e5c89aa2.js.map +1 -0
  31. package/dist/MagnifyingGlass-92351fd6.js +32 -0
  32. package/dist/MagnifyingGlass-92351fd6.js.map +1 -0
  33. package/dist/MagnifyingGlass-92fbedda.esm.js +30 -0
  34. package/dist/MagnifyingGlass-92fbedda.esm.js.map +1 -0
  35. package/dist/Marble-0f2d6f38.js +44 -0
  36. package/dist/Marble-0f2d6f38.js.map +1 -0
  37. package/dist/Marble-91d300a3.esm.js +42 -0
  38. package/dist/Marble-91d300a3.esm.js.map +1 -0
  39. package/dist/MarbleCard-690b2b8e.esm.js +45 -0
  40. package/dist/MarbleCard-690b2b8e.esm.js.map +1 -0
  41. package/dist/MarbleCard-ed7536dc.js +47 -0
  42. package/dist/MarbleCard-ed7536dc.js.map +1 -0
  43. package/dist/MultiCurrency-0456db19.js +63 -0
  44. package/dist/MultiCurrency-0456db19.js.map +1 -0
  45. package/dist/MultiCurrency-1b491db5.esm.js +61 -0
  46. package/dist/MultiCurrency-1b491db5.esm.js.map +1 -0
  47. package/dist/Plane-b6340ff4.js +39 -0
  48. package/dist/Plane-b6340ff4.js.map +1 -0
  49. package/dist/Plane-d631e81c.esm.js +37 -0
  50. package/dist/Plane-d631e81c.esm.js.map +1 -0
  51. package/dist/Scene-45fbe252.js +48 -0
  52. package/dist/Scene-45fbe252.js.map +1 -0
  53. package/dist/Scene-783029f4.esm.js +46 -0
  54. package/dist/Scene-783029f4.esm.js.map +1 -0
  55. package/dist/common.d.ts +5 -0
  56. package/dist/common.d.ts.map +1 -1
  57. package/dist/illustrations3d/Illustration3D.d.ts +11 -0
  58. package/dist/illustrations3d/Illustration3D.d.ts.map +1 -0
  59. package/dist/illustrations3d/Scene.d.ts +10 -0
  60. package/dist/illustrations3d/Scene.d.ts.map +1 -0
  61. package/dist/illustrations3d/index.d.ts +5 -0
  62. package/dist/illustrations3d/index.d.ts.map +1 -0
  63. package/dist/illustrations3d/models/CheckMark.d.ts +4 -0
  64. package/dist/illustrations3d/models/CheckMark.d.ts.map +1 -0
  65. package/dist/illustrations3d/models/Confetti.d.ts +4 -0
  66. package/dist/illustrations3d/models/Confetti.d.ts.map +1 -0
  67. package/dist/illustrations3d/models/Flower.d.ts +4 -0
  68. package/dist/illustrations3d/models/Flower.d.ts.map +1 -0
  69. package/dist/illustrations3d/models/Globe.d.ts +4 -0
  70. package/dist/illustrations3d/models/Globe.d.ts.map +1 -0
  71. package/dist/illustrations3d/models/Graph.d.ts +4 -0
  72. package/dist/illustrations3d/models/Graph.d.ts.map +1 -0
  73. package/dist/illustrations3d/models/Jars.d.ts +4 -0
  74. package/dist/illustrations3d/models/Jars.d.ts.map +1 -0
  75. package/dist/illustrations3d/models/Lock.d.ts +4 -0
  76. package/dist/illustrations3d/models/Lock.d.ts.map +1 -0
  77. package/dist/illustrations3d/models/MagnifyingGlass.d.ts +4 -0
  78. package/dist/illustrations3d/models/MagnifyingGlass.d.ts.map +1 -0
  79. package/dist/illustrations3d/models/Marble.d.ts +4 -0
  80. package/dist/illustrations3d/models/Marble.d.ts.map +1 -0
  81. package/dist/illustrations3d/models/MarbleCard.d.ts +4 -0
  82. package/dist/illustrations3d/models/MarbleCard.d.ts.map +1 -0
  83. package/dist/illustrations3d/models/MultiCurrency.d.ts +4 -0
  84. package/dist/illustrations3d/models/MultiCurrency.d.ts.map +1 -0
  85. package/dist/illustrations3d/models/Plane.d.ts +4 -0
  86. package/dist/illustrations3d/models/Plane.d.ts.map +1 -0
  87. package/dist/illustrations3d/utils.d.ts +9 -0
  88. package/dist/illustrations3d/utils.d.ts.map +1 -0
  89. package/dist/index-3b6277fc.esm.js +325 -0
  90. package/dist/index-3b6277fc.esm.js.map +1 -0
  91. package/dist/index-c17944c0.js +332 -0
  92. package/dist/index-c17944c0.js.map +1 -0
  93. package/dist/index.d.ts +3 -0
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.esm.js +4 -158
  96. package/dist/index.esm.js.map +1 -1
  97. package/dist/index.js +15 -155
  98. package/dist/index.js.map +1 -1
  99. package/package.json +10 -4
  100. package/src/common.ts +6 -0
  101. package/src/illustrations/Illustration.css +19 -0
  102. package/src/illustrations3d/Illustration3D.stories.tsx +88 -0
  103. package/src/illustrations3d/Illustration3D.tsx +133 -0
  104. package/src/illustrations3d/Scene.tsx +54 -0
  105. package/src/illustrations3d/index.ts +6 -0
  106. package/src/illustrations3d/models/CheckMark.tsx +30 -0
  107. package/src/illustrations3d/models/Confetti.tsx +29 -0
  108. package/src/illustrations3d/models/Flower.tsx +24 -0
  109. package/src/illustrations3d/models/Globe.tsx +41 -0
  110. package/src/illustrations3d/models/Graph.tsx +26 -0
  111. package/src/illustrations3d/models/Jars.tsx +47 -0
  112. package/src/illustrations3d/models/Lock.tsx +38 -0
  113. package/src/illustrations3d/models/MagnifyingGlass.tsx +30 -0
  114. package/src/illustrations3d/models/Marble.tsx +47 -0
  115. package/src/illustrations3d/models/MarbleCard.tsx +50 -0
  116. package/src/illustrations3d/models/MultiCurrency.tsx +58 -0
  117. package/src/illustrations3d/models/Plane.tsx +33 -0
  118. package/src/illustrations3d/utils.ts +68 -0
  119. package/src/index.ts +5 -0
package/dist/index.js CHANGED
@@ -1,162 +1,22 @@
1
1
  'use strict';
2
2
 
3
- var react = require('react');
4
- var jsxRuntime = require('react/jsx-runtime');
5
- var clsx = require('clsx');
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
- const imageSizes = {
37
- [exports.Sizes.SMALL]: 200,
38
- [exports.Sizes.MEDIUM]: 300,
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
- function defineSrc(illustration, size, descriptor) {
82
- return `https://wise.com/web-art/assets/illustrations/${illustration}-${size}@${descriptor}.webp`;
83
- }
84
-
85
- /*
86
- *
87
- * DON'T MODIFY THIS FILE IT'S AUTO GENERATED
88
- * See: `scripts/generate-i10s-metadata.mjs`
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":["../src/flags/Flag.tsx","../src/common.ts","../src/illustrations/Illustration.tsx","../src/illustrations/metadata.ts"],"sourcesContent":[null,null,null,null],"names":["unknownFlagName","Flag","code","intrinsicSize","useEffect","setFallback","name","fallback","toLowerCase","detailed","_jsx","src","height","onError","Sizes","imageSizes","SMALL","MEDIUM","Illustration","forwardRef","id","alt","loading","className","size","disablePadding","ref","_jsxs","children","LARGE","_Fragment","width","media","srcSet","defineSrc","descriptor","Assets"],"mappings":"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"}
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.7.0",
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#bb7a63aa66453af9c77e754586381ac5b996a176"
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,6 @@
1
+ export { default } from './Illustration3D';
2
+ export type { Props as Illustration3DProps } from './Illustration3D';
3
+
4
+ export type { Illustration3DNames } from './Illustration3D';
5
+
6
+ export { isIllustrationSupport3D } from './utils';
@@ -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;