@wise/art 2.24.6 → 2.25.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 +2 -2
- package/dist/{CheckMark-BtQ62PMc.esm.js → CheckMark-C7SPkQjr.esm.js} +2 -2
- package/dist/{CheckMark-BtQ62PMc.esm.js.map → CheckMark-C7SPkQjr.esm.js.map} +1 -1
- package/dist/{CheckMark-cJyvL7T_.js → CheckMark-DbWrBNtH.js} +2 -2
- package/dist/{CheckMark-cJyvL7T_.js.map → CheckMark-DbWrBNtH.js.map} +1 -1
- package/dist/{Confetti-C40zBSVo.js → Confetti-BbPKLCpN.js} +2 -2
- package/dist/{Confetti-C40zBSVo.js.map → Confetti-BbPKLCpN.js.map} +1 -1
- package/dist/{Confetti-toiSCAzv.esm.js → Confetti-DPMBG56o.esm.js} +2 -2
- package/dist/{Confetti-toiSCAzv.esm.js.map → Confetti-DPMBG56o.esm.js.map} +1 -1
- package/dist/{Flower-DSs4bhC_.esm.js → Flower-Dhjb1Y6Z.esm.js} +2 -2
- package/dist/{Flower-DSs4bhC_.esm.js.map → Flower-Dhjb1Y6Z.esm.js.map} +1 -1
- package/dist/{Flower-3lV6PO6i.js → Flower-I053ey4H.js} +2 -2
- package/dist/{Flower-3lV6PO6i.js.map → Flower-I053ey4H.js.map} +1 -1
- package/dist/{Globe-Cv2CH4Ls.esm.js → Globe-CJDK9wR6.esm.js} +2 -2
- package/dist/{Globe-Cv2CH4Ls.esm.js.map → Globe-CJDK9wR6.esm.js.map} +1 -1
- package/dist/{Globe-BamoY0MH.js → Globe-DD_Ybugr.js} +2 -2
- package/dist/{Globe-BamoY0MH.js.map → Globe-DD_Ybugr.js.map} +1 -1
- package/dist/{Graph-BAkJZsOh.esm.js → Graph-D1M4JGez.esm.js} +2 -2
- package/dist/{Graph-BAkJZsOh.esm.js.map → Graph-D1M4JGez.esm.js.map} +1 -1
- package/dist/{Graph-CfDPRUXG.js → Graph-DrtwCTeB.js} +2 -2
- package/dist/{Graph-CfDPRUXG.js.map → Graph-DrtwCTeB.js.map} +1 -1
- package/dist/{Interest-DaRnXsAT.js → Interest-5AzhwfRZ.js} +2 -2
- package/dist/{Interest-DaRnXsAT.js.map → Interest-5AzhwfRZ.js.map} +1 -1
- package/dist/{Interest-BfKUEAGg.esm.js → Interest-d9YRzYsQ.esm.js} +2 -2
- package/dist/{Interest-BfKUEAGg.esm.js.map → Interest-d9YRzYsQ.esm.js.map} +1 -1
- package/dist/{Jars-DabN9mhk.esm.js → Jars-Bj5zryIy.esm.js} +2 -2
- package/dist/{Jars-DabN9mhk.esm.js.map → Jars-Bj5zryIy.esm.js.map} +1 -1
- package/dist/{Jars-Cf7IwTSO.js → Jars-DTpuM002.js} +2 -2
- package/dist/{Jars-Cf7IwTSO.js.map → Jars-DTpuM002.js.map} +1 -1
- package/dist/{Lock-DJ9PshsO.js → Lock-Ca-LEge7.js} +2 -2
- package/dist/{Lock-DJ9PshsO.js.map → Lock-Ca-LEge7.js.map} +1 -1
- package/dist/{Lock--uH5fhTv.esm.js → Lock-xy_KoW2g.esm.js} +2 -2
- package/dist/{Lock--uH5fhTv.esm.js.map → Lock-xy_KoW2g.esm.js.map} +1 -1
- package/dist/{MagnifyingGlass-D9sR6O8H.esm.js → MagnifyingGlass-CR0nvKTo.esm.js} +2 -2
- package/dist/{MagnifyingGlass-D9sR6O8H.esm.js.map → MagnifyingGlass-CR0nvKTo.esm.js.map} +1 -1
- package/dist/{MagnifyingGlass-BknYcSY6.js → MagnifyingGlass-DFASWsdn.js} +2 -2
- package/dist/{MagnifyingGlass-BknYcSY6.js.map → MagnifyingGlass-DFASWsdn.js.map} +1 -1
- package/dist/{Marble-izXyHYEg.js → Marble-BZIHD9uw.js} +2 -2
- package/dist/{Marble-izXyHYEg.js.map → Marble-BZIHD9uw.js.map} +1 -1
- package/dist/{Marble-B5fY-cxX.esm.js → Marble-Dn1NhVNa.esm.js} +2 -2
- package/dist/{Marble-B5fY-cxX.esm.js.map → Marble-Dn1NhVNa.esm.js.map} +1 -1
- package/dist/{MarbleCard-Ce25_axJ.esm.js → MarbleCard-CLq_nDBM.esm.js} +2 -2
- package/dist/{MarbleCard-Ce25_axJ.esm.js.map → MarbleCard-CLq_nDBM.esm.js.map} +1 -1
- package/dist/{MarbleCard-W3jCbP-I.js → MarbleCard-CtjGjEPp.js} +2 -2
- package/dist/{MarbleCard-W3jCbP-I.js.map → MarbleCard-CtjGjEPp.js.map} +1 -1
- package/dist/{MultiCurrency-BAow9cCQ.esm.js → MultiCurrency-B5HtZfTG.esm.js} +2 -2
- package/dist/{MultiCurrency-BAow9cCQ.esm.js.map → MultiCurrency-B5HtZfTG.esm.js.map} +1 -1
- package/dist/{MultiCurrency-xvG1foRM.js → MultiCurrency-Bh-7t3nH.js} +2 -2
- package/dist/{MultiCurrency-xvG1foRM.js.map → MultiCurrency-Bh-7t3nH.js.map} +1 -1
- package/dist/{Plane-BXQPImui.js → Plane-D-NW6i-O.js} +2 -2
- package/dist/{Plane-BXQPImui.js.map → Plane-D-NW6i-O.js.map} +1 -1
- package/dist/{Plane-bUZ-3ZDf.esm.js → Plane-aYcLKAhf.esm.js} +2 -2
- package/dist/{Plane-bUZ-3ZDf.esm.js.map → Plane-aYcLKAhf.esm.js.map} +1 -1
- package/dist/{Scene-K-_5SWQB.esm.js → Scene-ClmxQ_BP.esm.js} +2 -2
- package/dist/{Scene-K-_5SWQB.esm.js.map → Scene-ClmxQ_BP.esm.js.map} +1 -1
- package/dist/{Scene-D9b70d7t.js → Scene-DNB5gL2m.js} +2 -2
- package/dist/{Scene-D9b70d7t.js.map → Scene-DNB5gL2m.js.map} +1 -1
- package/dist/flags/Flag.d.ts +1 -1
- package/dist/flags/Flag.spec.d.ts +1 -1
- package/dist/illustrations/metadata.d.ts +38 -2
- package/dist/illustrations/metadata.d.ts.map +1 -1
- package/dist/{index-DragVnFs.esm.js → index-ApMK-TMV.esm.js} +56 -20
- package/dist/index-ApMK-TMV.esm.js.map +1 -0
- package/dist/{index-0zgfxQZX.js → index-CeTVmx_6.js} +56 -20
- package/dist/index-CeTVmx_6.js.map +1 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +62 -60
- package/src/flags/AllFlagsAndSizes.stories.tsx +131 -0
- package/src/flags/Flag.spec.tsx +13 -13
- package/src/flags/Flag.stories.tsx +5 -89
- package/src/flags/Flag.tsx +13 -13
- package/src/illustrations/Illustration.stories.tsx +42 -25
- package/src/illustrations/metadata.ts +2 -2
- package/dist/index-0zgfxQZX.js.map +0 -1
- package/dist/index-DragVnFs.esm.js.map +0 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as Assets, F as Flag, I as Illustration, a as Illustration3D, i as isIllustrationSupport3D } from './index-
|
|
1
|
+
export { A as Assets, F as Flag, I as Illustration, a as Illustration3D, i as isIllustrationSupport3D } from './index-ApMK-TMV.esm.js';
|
|
2
2
|
export { S as Sizes } from './common-DBpCdW70.esm.js';
|
|
3
3
|
import 'clsx';
|
|
4
4
|
import 'react';
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wise/art",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"packageManager": "pnpm@10.14.0+sha512.ad27a79641b49c3e481a16a805baa71817a04bbe06a38d17e60e2eaee83f6a146c6a688125f5792e48dd5ba30e7da52a5cda4c3992b9ccf333f9ce223af84748",
|
|
3
|
+
"version": "2.25.0",
|
|
5
4
|
"license": "MIT",
|
|
6
5
|
"description": "React library for art elements in UI",
|
|
7
6
|
"homepage": "https://github.com/transferwise/web-art#readme",
|
|
@@ -21,90 +20,66 @@
|
|
|
21
20
|
"src/",
|
|
22
21
|
"!**/*.tsbuildinfo"
|
|
23
22
|
],
|
|
24
|
-
"scripts": {
|
|
25
|
-
"setup": "pnpm install && pnpm build",
|
|
26
|
-
"load-3d-i10s": "rm -rf s3-bucket/illustrations3d/ && node ./scripts/load-3d-i10s.mjs && pnpm load-riv",
|
|
27
|
-
"load-riv": "copyfiles -u 1 assets/*.riv s3-bucket/illustrations3d/rive",
|
|
28
|
-
"load-i10s": "copyfiles -u 3 node_modules/wise-atoms/illustrations/**/*.png temp",
|
|
29
|
-
"load-flags": "rm -rf s3-bucket/flags/* && pnpm load-country-flags && pnpm load-currency-flags && pnpm transform-flags && pnpm convert-flags-svg-to-png",
|
|
30
|
-
"load-country-flags": "copyfiles -u 3 node_modules/wise-atoms/flags/*.svg s3-bucket/flags && node ./scripts/generate-country-flags.mjs",
|
|
31
|
-
"load-currency-flags": "copyfiles -u 3 node_modules/wise-atoms/flags/.metadata.json s3-bucket/flags && node ./scripts/generate-currency-flags.mjs",
|
|
32
|
-
"transform-flags": "node ./scripts/transform-flags.mjs",
|
|
33
|
-
"convert-flags-svg-to-png": "node ./scripts/convert-flags-svg-to-png.mjs",
|
|
34
|
-
"convert-i10s-png-to-webp": "rm -rf s3-bucket/illustrations/ && copyfiles --f node_modules/wise-atoms/illustrations/**/*.png s3-bucket/illustrations && node ./scripts/convert-png-to-webp.mjs",
|
|
35
|
-
"generate-i10s-metadata": "node ./scripts/generate-i10s-metadata.mjs && eslint 'src/illustrations/metadata.ts' --fix",
|
|
36
|
-
"generate-flags-metadata": "node ./scripts/generate-flags-metadata.mjs && eslint 'src/flags/metadata.ts' --fix",
|
|
37
|
-
"bundle": "rm -rf dist && rollup --config --sourcemap && pnpm build-styles",
|
|
38
|
-
"cleanup": "rm -rf temp",
|
|
39
|
-
"build": "NODE_ENV=web-art-prod pnpm load-i10s && pnpm load-3d-i10s && pnpm convert-i10s-png-to-webp && pnpm generate-i10s-metadata && pnpm load-flags && pnpm generate-flags-metadata && pnpm bundle && pnpm cleanup",
|
|
40
|
-
"start": "storybook dev -p 3001",
|
|
41
|
-
"dev": "NODE_ENV=web-art-dev pnpm start",
|
|
42
|
-
"test": "jest && release-to-github-with-changelog-pre-release-checks",
|
|
43
|
-
"test:watch": "jest --watch",
|
|
44
|
-
"lint": "eslint 'src/**/*.{js,ts,tsx}' 'scripts/*.{mjs,js,ts,tsx}'",
|
|
45
|
-
"lint-fix": "eslint 'src/**/*.{js,ts,tsx}' 'scripts/*.{mjs,js,ts,tsx}' --fix",
|
|
46
|
-
"build-docs": "storybook build -o docs && touch ./docs/.nojekyll",
|
|
47
|
-
"build-styles": "postcss src/index.css -o dist/Illustration.css"
|
|
48
|
-
},
|
|
49
23
|
"dependencies": {
|
|
50
|
-
"@babel/runtime": "^7.28.
|
|
24
|
+
"@babel/runtime": "^7.28.4",
|
|
51
25
|
"@react-three/drei": "9.122.0",
|
|
52
26
|
"@react-three/fiber": "8.18.0",
|
|
53
|
-
"@rive-app/react-webgl2": "^4.
|
|
27
|
+
"@rive-app/react-webgl2": "^4.25.0",
|
|
54
28
|
"@types/three": "0.164.0",
|
|
55
29
|
"clsx": "^2.1.1",
|
|
56
30
|
"three": "0.164.0"
|
|
57
31
|
},
|
|
58
32
|
"devDependencies": {
|
|
59
|
-
"@babel/core": "^7.28.
|
|
60
|
-
"@babel/plugin-transform-runtime": "^7.28.
|
|
61
|
-
"@babel/preset-env": "^7.28.
|
|
62
|
-
"@babel/preset-react": "^7.
|
|
63
|
-
"@babel/preset-typescript": "^7.
|
|
33
|
+
"@babel/core": "^7.28.5",
|
|
34
|
+
"@babel/plugin-transform-runtime": "^7.28.5",
|
|
35
|
+
"@babel/preset-env": "^7.28.5",
|
|
36
|
+
"@babel/preset-react": "^7.28.5",
|
|
37
|
+
"@babel/preset-typescript": "^7.28.5",
|
|
64
38
|
"@csstools/postcss-minify": "^2.0.4",
|
|
65
|
-
"@rollup/plugin-babel": "^6.0
|
|
66
|
-
"@rollup/plugin-typescript": "^12.
|
|
67
|
-
"@storybook/react-vite": "^
|
|
68
|
-
"@testing-library/jest-dom": "^6.
|
|
69
|
-
"@testing-library/react": "^16.3.
|
|
70
|
-
"@transferwise/neptune-css": "^14.
|
|
71
|
-
"@tsconfig/recommended": "^1.0.
|
|
39
|
+
"@rollup/plugin-babel": "^6.1.0",
|
|
40
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
41
|
+
"@storybook/react-vite": "^10.1.10",
|
|
42
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
43
|
+
"@testing-library/react": "^16.3.1",
|
|
44
|
+
"@transferwise/neptune-css": "^14.25.2",
|
|
45
|
+
"@tsconfig/recommended": "^1.0.13",
|
|
72
46
|
"@types/babel__core": "^7.20.5",
|
|
73
47
|
"@types/imagemin": "^9.0.1",
|
|
74
48
|
"@types/imagemin-webp": "^7.0.3",
|
|
75
49
|
"@types/jest": "^30.0.0",
|
|
76
|
-
"@types/jsdom": "^
|
|
50
|
+
"@types/jsdom": "^27.0.0",
|
|
77
51
|
"@types/react": "^18.3.23",
|
|
78
52
|
"@types/react-dom": "^18.3.7",
|
|
79
|
-
"@vitejs/plugin-react": "^
|
|
80
|
-
"@wise/eslint-config": "^13.
|
|
53
|
+
"@vitejs/plugin-react": "^5.1.2",
|
|
54
|
+
"@wise/eslint-config": "^13.3.0",
|
|
81
55
|
"babel-plugin-optimize-clsx": "^2.6.2",
|
|
82
56
|
"copyfiles": "^2.4.1",
|
|
83
|
-
"eslint": "^9.
|
|
84
|
-
"glob": "^
|
|
57
|
+
"eslint": "^9.39.2",
|
|
58
|
+
"glob": "^13.0.0",
|
|
85
59
|
"gltf-pipeline": "^4.3.0",
|
|
86
60
|
"imagemin": "^9.0.1",
|
|
87
61
|
"imagemin-webp": "^8.0.0",
|
|
88
|
-
"jest": "^30.0
|
|
89
|
-
"jest-environment-jsdom": "^30.0
|
|
90
|
-
"jsdom": "
|
|
62
|
+
"jest": "^30.2.0",
|
|
63
|
+
"jest-environment-jsdom": "^30.2.0",
|
|
64
|
+
"jsdom": "^27.3.0",
|
|
91
65
|
"postcss": "^8.5.6",
|
|
92
66
|
"postcss-cli": "^11.0.1",
|
|
93
67
|
"postcss-import": "^16.1.1",
|
|
94
|
-
"prettier": "^3.
|
|
68
|
+
"prettier": "^3.7.4",
|
|
95
69
|
"react": "^18.3.1",
|
|
96
70
|
"react-dom": "^18.3.1",
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
"@
|
|
71
|
+
"rollup": "^4.53.5",
|
|
72
|
+
"sharp": "^0.34.5",
|
|
73
|
+
"storybook": "^10.1.10",
|
|
74
|
+
"typescript": "^5.9.3",
|
|
75
|
+
"vite": "^7.3.0",
|
|
76
|
+
"wise-atoms": "git+https://github.com/transferwise/wise-atoms.git#8afba508f461e91d458d4312600cb279b3f47086",
|
|
77
|
+
"@storybook/addon-docs": "^10.1.10",
|
|
78
|
+
"@changesets/cli": "^2.29.8",
|
|
79
|
+
"@changesets/changelog-github": "0.5.2"
|
|
105
80
|
},
|
|
106
81
|
"peerDependencies": {
|
|
107
|
-
"@transferwise/neptune-css": "^14.
|
|
82
|
+
"@transferwise/neptune-css": "^14.25.2",
|
|
108
83
|
"react": ">=18",
|
|
109
84
|
"react-dom": ">=18"
|
|
110
85
|
},
|
|
@@ -114,5 +89,32 @@
|
|
|
114
89
|
"resolutions": {
|
|
115
90
|
"http-cache-semantics": "^4.1.1",
|
|
116
91
|
"semver-regex": "^4.0.5"
|
|
92
|
+
},
|
|
93
|
+
"scripts": {
|
|
94
|
+
"setup": "pnpm install && pnpm build",
|
|
95
|
+
"load-3d-i10s": "rm -rf s3-bucket/illustrations3d/ && node ./scripts/load-3d-i10s.mjs && pnpm load-riv",
|
|
96
|
+
"load-riv": "copyfiles -u 1 assets/*.riv s3-bucket/illustrations3d/rive",
|
|
97
|
+
"load-i10s": "copyfiles -u 3 node_modules/wise-atoms/illustrations/**/*.png temp",
|
|
98
|
+
"load-flags": "rm -rf s3-bucket/flags/* && pnpm load-country-flags && pnpm load-currency-flags && pnpm transform-flags && pnpm convert-flags-svg-to-png",
|
|
99
|
+
"load-country-flags": "copyfiles -u 3 node_modules/wise-atoms/flags/*.svg s3-bucket/flags && node ./scripts/generate-country-flags.mjs",
|
|
100
|
+
"load-currency-flags": "copyfiles -u 3 node_modules/wise-atoms/flags/.metadata.json s3-bucket/flags && node ./scripts/generate-currency-flags.mjs",
|
|
101
|
+
"transform-flags": "node ./scripts/transform-flags.mjs",
|
|
102
|
+
"convert-flags-svg-to-png": "node ./scripts/convert-flags-svg-to-png.mjs",
|
|
103
|
+
"convert-i10s-png-to-webp": "rm -rf s3-bucket/illustrations/ && copyfiles --f node_modules/wise-atoms/illustrations/**/*.png s3-bucket/illustrations && node ./scripts/convert-png-to-webp.mjs",
|
|
104
|
+
"generate-i10s-metadata": "node ./scripts/generate-i10s-metadata.mjs && eslint 'src/illustrations/metadata.ts' --fix",
|
|
105
|
+
"generate-flags-metadata": "node ./scripts/generate-flags-metadata.mjs && eslint 'src/flags/metadata.ts' --fix",
|
|
106
|
+
"bundle": "rm -rf dist && rollup --config --sourcemap && pnpm build-styles",
|
|
107
|
+
"cleanup": "rm -rf temp",
|
|
108
|
+
"build": "NODE_ENV=web-art-prod pnpm load-i10s && pnpm load-3d-i10s && pnpm convert-i10s-png-to-webp && pnpm generate-i10s-metadata && pnpm load-flags && pnpm generate-flags-metadata && pnpm bundle && pnpm cleanup",
|
|
109
|
+
"start": "storybook dev -p 3001",
|
|
110
|
+
"dev": "NODE_ENV=web-art-dev pnpm start",
|
|
111
|
+
"test": "jest",
|
|
112
|
+
"test:watch": "jest --watch",
|
|
113
|
+
"lint": "eslint 'src/**/*.{js,ts,tsx}' 'scripts/*.{mjs,js,ts,tsx}'",
|
|
114
|
+
"lint-fix": "eslint 'src/**/*.{js,ts,tsx}' 'scripts/*.{mjs,js,ts,tsx}' --fix",
|
|
115
|
+
"build-docs": "storybook build --stats-json -o docs && touch ./docs/.nojekyll",
|
|
116
|
+
"build-styles": "postcss src/index.css -o dist/Illustration.css",
|
|
117
|
+
"changeset": "changeset",
|
|
118
|
+
"release": "changeset publish"
|
|
117
119
|
}
|
|
118
|
-
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
|
|
3
|
+
import flagRawMetaData from '../../node_modules/wise-atoms/flags/.metadata.json';
|
|
4
|
+
import { Flag } from './Flag';
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof Flag> = {
|
|
7
|
+
component: Flag,
|
|
8
|
+
title: 'Flag/All Flags and Sizes',
|
|
9
|
+
};
|
|
10
|
+
export default meta;
|
|
11
|
+
|
|
12
|
+
type Story = StoryObj<typeof Flag>;
|
|
13
|
+
|
|
14
|
+
// Helper function to render all flags and sizes for a given region
|
|
15
|
+
const AllFlagsAndSizes = (region: string) => {
|
|
16
|
+
const regionFlags = Object.entries(flagRawMetaData)
|
|
17
|
+
.filter(([r]) => r === region)
|
|
18
|
+
.flatMap(([, flags]) => flags);
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<>
|
|
22
|
+
<div
|
|
23
|
+
style={{
|
|
24
|
+
display: 'flex',
|
|
25
|
+
flexDirection: 'column',
|
|
26
|
+
marginBottom: 'var(--padding-medium)',
|
|
27
|
+
}}
|
|
28
|
+
>
|
|
29
|
+
<span className="np-text-title-section">{region}</span>
|
|
30
|
+
<span className="np-text-body-large-bold">
|
|
31
|
+
Total number of flags in category: {regionFlags.length}
|
|
32
|
+
</span>
|
|
33
|
+
</div>
|
|
34
|
+
<div
|
|
35
|
+
style={{
|
|
36
|
+
display: 'grid',
|
|
37
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(350px, 1fr))',
|
|
38
|
+
gap: 'var(--padding-small)',
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
41
|
+
{regionFlags.map((flag) => {
|
|
42
|
+
const countryCode = flag.country[0]?.toUpperCase();
|
|
43
|
+
const currencyCode = flag.currency[0]?.toUpperCase();
|
|
44
|
+
const flagCode = countryCode ?? currencyCode;
|
|
45
|
+
|
|
46
|
+
// Covers cases where there's just a currency code and no country (e.g. Euro)
|
|
47
|
+
const flagName = countryCode
|
|
48
|
+
? flag.country.at(-1)
|
|
49
|
+
: flag.currency?.at(-1);
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<div
|
|
53
|
+
key={flagName}
|
|
54
|
+
style={{
|
|
55
|
+
display: 'grid',
|
|
56
|
+
gridTemplateColumns: 'minmax(auto, 1fr) auto 1fr',
|
|
57
|
+
gap: 'var(--padding-small)',
|
|
58
|
+
alignItems: 'center',
|
|
59
|
+
}}
|
|
60
|
+
>
|
|
61
|
+
<div
|
|
62
|
+
style={{
|
|
63
|
+
display: 'flex',
|
|
64
|
+
flexWrap: 'wrap',
|
|
65
|
+
flexDirection: 'column',
|
|
66
|
+
alignItems: 'flex-start',
|
|
67
|
+
gap: 'var(--padding-small)',
|
|
68
|
+
}}
|
|
69
|
+
>
|
|
70
|
+
{flagName}
|
|
71
|
+
<span>
|
|
72
|
+
{countryCode && (
|
|
73
|
+
<>
|
|
74
|
+
Country: <code>{countryCode}</code>
|
|
75
|
+
</>
|
|
76
|
+
)}
|
|
77
|
+
{currencyCode && countryCode && <br />}
|
|
78
|
+
{currencyCode && (
|
|
79
|
+
<>
|
|
80
|
+
Currency: <code>{currencyCode}</code>
|
|
81
|
+
</>
|
|
82
|
+
)}
|
|
83
|
+
</span>
|
|
84
|
+
{currencyCode && <span />}
|
|
85
|
+
</div>
|
|
86
|
+
<Flag code={flagCode} />
|
|
87
|
+
<Flag code={flagCode} intrinsicSize={150} />
|
|
88
|
+
</div>
|
|
89
|
+
);
|
|
90
|
+
})}
|
|
91
|
+
</div>
|
|
92
|
+
</>
|
|
93
|
+
);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// Stories for each region
|
|
97
|
+
export const Africa: Story = {
|
|
98
|
+
render: () => AllFlagsAndSizes('Africa'),
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export const Antarctic: Story = {
|
|
102
|
+
render: () => AllFlagsAndSizes('Antarctic'),
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const Asia: Story = {
|
|
106
|
+
render: () => AllFlagsAndSizes('Asia'),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export const CentralAmerica: Story = {
|
|
110
|
+
render: () => AllFlagsAndSizes('Central America'),
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export const Europe: Story = {
|
|
114
|
+
render: () => AllFlagsAndSizes('Europe'),
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export const NorthAmerica: Story = {
|
|
118
|
+
render: () => AllFlagsAndSizes('North America'),
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export const Oceania: Story = {
|
|
122
|
+
render: () => AllFlagsAndSizes('Oceania'),
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export const SouthAmerica: Story = {
|
|
126
|
+
render: () => AllFlagsAndSizes('South America'),
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export const Fallback: Story = {
|
|
130
|
+
render: () => AllFlagsAndSizes('Fallback'),
|
|
131
|
+
};
|
package/src/flags/Flag.spec.tsx
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
2
2
|
|
|
3
|
-
import { render
|
|
3
|
+
import { render } from '@testing-library/react';
|
|
4
4
|
|
|
5
|
-
import { Flag } from
|
|
5
|
+
import { Flag } from './Flag';
|
|
6
6
|
|
|
7
|
-
describe(
|
|
8
|
-
it(
|
|
7
|
+
describe('Flag', () => {
|
|
8
|
+
it('use default image when < 150px', () => {
|
|
9
9
|
const { container } = render(<Flag code="es" />);
|
|
10
10
|
|
|
11
11
|
// eslint-disable-next-line testing-library/no-container, testing-library/no-node-access
|
|
12
|
-
const flag = container.querySelector(
|
|
13
|
-
expect(flag?.src.includes(
|
|
12
|
+
const flag = container.querySelector('img');
|
|
13
|
+
expect(flag?.src.includes('detailed')).toBe(false);
|
|
14
14
|
});
|
|
15
15
|
|
|
16
|
-
it(
|
|
16
|
+
it('use detailed image when available and >= 150px', () => {
|
|
17
17
|
const { container } = render(<Flag code="es" intrinsicSize={150} />);
|
|
18
18
|
|
|
19
19
|
// eslint-disable-next-line testing-library/no-container, testing-library/no-node-access
|
|
20
|
-
const flag = container.querySelector(
|
|
21
|
-
expect(flag?.src.includes(
|
|
20
|
+
const flag = container.querySelector('img');
|
|
21
|
+
expect(flag?.src.includes('detailed')).toBe(true);
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
it("don't
|
|
24
|
+
it("don't try to use detailed image if not available", () => {
|
|
25
25
|
const { container } = render(<Flag code="fr" />);
|
|
26
26
|
|
|
27
27
|
// eslint-disable-next-line testing-library/no-container, testing-library/no-node-access
|
|
28
|
-
const flag = container.querySelector(
|
|
29
|
-
expect(flag?.src.includes(
|
|
28
|
+
const flag = container.querySelector('img');
|
|
29
|
+
expect(flag?.src.includes('detailed')).toBe(false);
|
|
30
30
|
});
|
|
31
31
|
});
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import { Flag } from "./Flag";
|
|
3
|
+
import { Flag } from './Flag';
|
|
5
4
|
|
|
6
5
|
const meta: Meta<typeof Flag> = {
|
|
7
6
|
component: Flag,
|
|
8
|
-
title:
|
|
7
|
+
title: 'Flag',
|
|
9
8
|
};
|
|
10
9
|
export default meta;
|
|
11
10
|
|
|
@@ -13,92 +12,9 @@ type Story = StoryObj<typeof Flag>;
|
|
|
13
12
|
|
|
14
13
|
export const Basic: Story = {
|
|
15
14
|
render: (args) => <Flag {...args} />,
|
|
16
|
-
tags: [
|
|
15
|
+
tags: ['autodocs'],
|
|
17
16
|
args: {
|
|
18
|
-
code:
|
|
17
|
+
code: 'GBP',
|
|
19
18
|
intrinsicSize: 64,
|
|
20
19
|
},
|
|
21
20
|
};
|
|
22
|
-
|
|
23
|
-
export const AllFlagsAndSizes = () => {
|
|
24
|
-
const regions = Object.entries(flagRawMetaData);
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<>
|
|
28
|
-
<span className="np-text-body-large-bold">
|
|
29
|
-
Total number of flags: {regions.flatMap(([_, flags]) => flags).length}
|
|
30
|
-
</span>
|
|
31
|
-
<div
|
|
32
|
-
style={{
|
|
33
|
-
display: "grid",
|
|
34
|
-
gap: "var(--padding-large)",
|
|
35
|
-
marginTop: "var(--padding-medium)",
|
|
36
|
-
}}
|
|
37
|
-
>
|
|
38
|
-
{regions.map(([region, flags]) => (
|
|
39
|
-
<div key={region}>
|
|
40
|
-
<span className="np-text-title-section">{region}</span>
|
|
41
|
-
<div
|
|
42
|
-
style={{
|
|
43
|
-
display: "grid",
|
|
44
|
-
gridTemplateColumns: "repeat(auto-fill, minmax(450px, 1fr))",
|
|
45
|
-
gap: "var(--padding-small)",
|
|
46
|
-
}}
|
|
47
|
-
>
|
|
48
|
-
{flags.map((flag) => {
|
|
49
|
-
const countryCode = flag.country[0]?.toUpperCase();
|
|
50
|
-
const currencyCode = flag.currency[0]?.toUpperCase();
|
|
51
|
-
const flagCode = countryCode ?? currencyCode;
|
|
52
|
-
|
|
53
|
-
// Covers cases where there's just a currency code and no country (e.g. Euro)
|
|
54
|
-
const flagName = countryCode
|
|
55
|
-
? flag.country.at(-1)
|
|
56
|
-
: flag.currency?.at(-1);
|
|
57
|
-
|
|
58
|
-
return (
|
|
59
|
-
<div
|
|
60
|
-
key={flagName}
|
|
61
|
-
style={{
|
|
62
|
-
display: "grid",
|
|
63
|
-
gridTemplateColumns: "minmax(auto, 1fr) auto 1fr",
|
|
64
|
-
gap: "var(--padding-small)",
|
|
65
|
-
alignItems: "center",
|
|
66
|
-
}}
|
|
67
|
-
>
|
|
68
|
-
<div
|
|
69
|
-
style={{
|
|
70
|
-
display: "flex",
|
|
71
|
-
flexWrap: "wrap",
|
|
72
|
-
flexDirection: "column",
|
|
73
|
-
alignItems: "flex-start",
|
|
74
|
-
gap: "var(--padding-small)",
|
|
75
|
-
}}
|
|
76
|
-
>
|
|
77
|
-
{flagName}
|
|
78
|
-
<span>
|
|
79
|
-
{countryCode && (
|
|
80
|
-
<>
|
|
81
|
-
Country: <code>{countryCode}</code>
|
|
82
|
-
</>
|
|
83
|
-
)}
|
|
84
|
-
{currencyCode && countryCode && <br />}
|
|
85
|
-
{currencyCode && (
|
|
86
|
-
<>
|
|
87
|
-
Currency: <code>{currencyCode}</code>
|
|
88
|
-
</>
|
|
89
|
-
)}
|
|
90
|
-
</span>
|
|
91
|
-
{currencyCode && <span />}
|
|
92
|
-
</div>
|
|
93
|
-
<Flag code={flagCode} />
|
|
94
|
-
<Flag code={flagCode} intrinsicSize={150} />
|
|
95
|
-
</div>
|
|
96
|
-
);
|
|
97
|
-
})}
|
|
98
|
-
</div>
|
|
99
|
-
</div>
|
|
100
|
-
))}
|
|
101
|
-
</div>
|
|
102
|
-
</>
|
|
103
|
-
);
|
|
104
|
-
};
|
package/src/flags/Flag.tsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { clsx } from
|
|
2
|
-
import { useEffect, useState } from
|
|
1
|
+
import { clsx } from 'clsx';
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
3
|
|
|
4
|
-
import { DETAILED_FLAG_CODES } from
|
|
4
|
+
import { DETAILED_FLAG_CODES } from './metadata';
|
|
5
5
|
|
|
6
6
|
export interface FlagProps {
|
|
7
7
|
/**
|
|
@@ -14,18 +14,18 @@ export interface FlagProps {
|
|
|
14
14
|
*/
|
|
15
15
|
intrinsicSize?: number;
|
|
16
16
|
className?: string;
|
|
17
|
-
loading?:
|
|
17
|
+
loading?: 'lazy' | 'eager';
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
const unknownFlagName =
|
|
20
|
+
const unknownFlagName = 'wise';
|
|
21
21
|
|
|
22
22
|
export const Flag = ({
|
|
23
23
|
code,
|
|
24
24
|
intrinsicSize = 64,
|
|
25
25
|
className = undefined,
|
|
26
|
-
loading =
|
|
26
|
+
loading = 'lazy',
|
|
27
27
|
}: FlagProps) => {
|
|
28
|
-
const [fallback, setFallback] = useState<
|
|
28
|
+
const [fallback, setFallback] = useState<'simple' | 'unknown' | null>(null);
|
|
29
29
|
useEffect(() => {
|
|
30
30
|
setFallback(null);
|
|
31
31
|
}, [code]);
|
|
@@ -33,21 +33,21 @@ export const Flag = ({
|
|
|
33
33
|
const detailed = intrinsicSize >= 150;
|
|
34
34
|
// Only get detailed svg if we know it exists, to avoid the performance hit of failing requests
|
|
35
35
|
const name =
|
|
36
|
-
fallback !==
|
|
36
|
+
fallback !== 'unknown'
|
|
37
37
|
? `${code.toLowerCase()}${
|
|
38
38
|
fallback == null &&
|
|
39
39
|
detailed &&
|
|
40
40
|
DETAILED_FLAG_CODES.includes(code.toLowerCase())
|
|
41
|
-
?
|
|
42
|
-
:
|
|
41
|
+
? '-detailed'
|
|
42
|
+
: ''
|
|
43
43
|
}`
|
|
44
44
|
: unknownFlagName;
|
|
45
45
|
|
|
46
46
|
return (
|
|
47
47
|
<img
|
|
48
|
-
className={clsx(
|
|
48
|
+
className={clsx('wds-flag', `wds-flag-${name}`, className)}
|
|
49
49
|
src={
|
|
50
|
-
process.env.NODE_ENV ===
|
|
50
|
+
process.env.NODE_ENV === 'web-art-dev'
|
|
51
51
|
? `${name}.svg`
|
|
52
52
|
: `https://wise.com/web-art/assets/flags/${name}.svg`
|
|
53
53
|
}
|
|
@@ -57,7 +57,7 @@ export const Flag = ({
|
|
|
57
57
|
height={intrinsicSize}
|
|
58
58
|
onError={() => {
|
|
59
59
|
setFallback((prev) =>
|
|
60
|
-
prev == null && detailed ?
|
|
60
|
+
prev == null && detailed ? 'simple' : 'unknown',
|
|
61
61
|
);
|
|
62
62
|
}}
|
|
63
63
|
/>
|
|
@@ -1,41 +1,58 @@
|
|
|
1
|
+
import type { StoryObj } from "@storybook/react-vite";
|
|
1
2
|
|
|
2
|
-
import type
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
import Illustration, { type Props as IllustrationProps } from './Illustration';
|
|
6
|
-
import { Assets, type IllustrationNames } from './metadata';
|
|
7
|
-
|
|
3
|
+
import Illustration, { type Props as IllustrationProps } from "./Illustration";
|
|
4
|
+
import { Assets, type IllustrationNames } from "./metadata";
|
|
8
5
|
|
|
9
6
|
export default {
|
|
10
7
|
component: Illustration,
|
|
11
|
-
title:
|
|
8
|
+
title: "Illustration",
|
|
12
9
|
};
|
|
13
10
|
|
|
14
11
|
type Story = StoryObj<typeof Illustration>;
|
|
15
12
|
|
|
16
|
-
export const
|
|
17
|
-
tags: [
|
|
18
|
-
render: function Render
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
13
|
+
export const Basic: Story = {
|
|
14
|
+
tags: ["autodocs"],
|
|
15
|
+
render: function Render({
|
|
16
|
+
name = Assets.CHECK_MARK,
|
|
17
|
+
...props
|
|
18
|
+
}: IllustrationProps) {
|
|
19
|
+
return <Illustration name={name} {...props} />;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
26
22
|
|
|
27
23
|
export const All = () => {
|
|
28
24
|
const assetNames = Object.values(Assets);
|
|
29
25
|
return (
|
|
30
26
|
<>
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
27
|
+
<span className="np-text-body-large-bold">
|
|
28
|
+
Total number of illustrations: {assetNames.length}
|
|
29
|
+
</span>
|
|
30
|
+
<div
|
|
31
|
+
style={{
|
|
32
|
+
display: "grid",
|
|
33
|
+
gridTemplateColumns: "repeat(auto-fill, minmax(250px, 1fr))",
|
|
34
|
+
gap: "var(--padding-small)",
|
|
35
|
+
}}
|
|
36
|
+
>
|
|
37
|
+
{Object.values(Assets).map((assetName) => (
|
|
38
|
+
<div
|
|
39
|
+
key={assetName}
|
|
40
|
+
style={{
|
|
41
|
+
display: "grid",
|
|
42
|
+
alignItems: "center",
|
|
43
|
+
justifyItems: "center",
|
|
44
|
+
}}
|
|
45
|
+
>
|
|
46
|
+
<Illustration
|
|
47
|
+
alt={assetName}
|
|
48
|
+
name={assetName as IllustrationNames}
|
|
49
|
+
/>
|
|
50
|
+
<span>
|
|
51
|
+
<code>{assetName}</code>
|
|
52
|
+
</span>
|
|
53
|
+
</div>
|
|
54
|
+
))}
|
|
55
|
+
</div>
|
|
38
56
|
</>
|
|
39
57
|
);
|
|
40
58
|
};
|
|
41
|
-
|