@wise/art 2.5.0 → 2.6.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 (38) hide show
  1. package/README.md +0 -1
  2. package/dist/common.d.ts +10 -9
  3. package/dist/common.d.ts.map +1 -0
  4. package/dist/flags/Flag.d.ts +13 -12
  5. package/dist/flags/Flag.d.ts.map +1 -0
  6. package/dist/flags/index.d.ts +3 -2
  7. package/dist/flags/index.d.ts.map +1 -0
  8. package/dist/illustrations/Illustration.d.ts +21 -20
  9. package/dist/illustrations/Illustration.d.ts.map +1 -0
  10. package/dist/illustrations/index.d.ts +5 -4
  11. package/dist/illustrations/index.d.ts.map +1 -0
  12. package/dist/illustrations/metadata.d.ts +69 -68
  13. package/dist/illustrations/metadata.d.ts.map +1 -0
  14. package/dist/index.d.ts +7 -6
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +161 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +159 -0
  19. package/dist/index.mjs.map +1 -0
  20. package/package.json +39 -21
  21. package/src/common.ts +11 -0
  22. package/src/flags/Flag.stories.tsx +19 -0
  23. package/src/flags/Flag.tsx +40 -0
  24. package/src/flags/index.ts +2 -0
  25. package/src/illustrations/Illustration.css +8 -0
  26. package/src/illustrations/Illustration.stories.tsx +33 -0
  27. package/src/illustrations/Illustration.tsx +95 -0
  28. package/src/illustrations/index.ts +5 -0
  29. package/src/illustrations/metadata.ts +141 -0
  30. package/src/index.ts +7 -0
  31. package/dist/flags/Flag.stories.d.ts +0 -6
  32. package/dist/illustrations/Illustration.stories.d.ts +0 -19
  33. package/dist/index.modern.mjs +0 -2
  34. package/dist/index.modern.mjs.map +0 -1
  35. package/dist/index.module.js +0 -2
  36. package/dist/index.module.js.map +0 -1
  37. package/dist/index.umd.js +0 -2
  38. package/dist/index.umd.js.map +0 -1
package/dist/index.mjs ADDED
@@ -0,0 +1,159 @@
1
+ import { useState, useEffect, forwardRef } from 'react';
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import { clsx } from 'clsx';
4
+
5
+ const unknownFlagName = 'wise';
6
+ const Flag = ({
7
+ code,
8
+ intrinsicSize = 64
9
+ }) => {
10
+ const [fallback, setFallback] = useState(null);
11
+ useEffect(() => {
12
+ setFallback(null);
13
+ }, [code]);
14
+ const detailed = intrinsicSize >= 150;
15
+ const name = fallback !== 'unknown' ? `${code.toLowerCase()}${fallback == null && detailed ? '-detailed' : ''}` : unknownFlagName;
16
+ return /*#__PURE__*/jsx("img", {
17
+ src: `https://wise.com/web-art/assets/flags/${name}.svg`,
18
+ alt: "",
19
+ width: intrinsicSize,
20
+ height: intrinsicSize,
21
+ onError: () => {
22
+ setFallback(prev => prev == null && detailed ? 'simple' : 'unknown');
23
+ }
24
+ });
25
+ };
26
+
27
+ var Sizes;
28
+ (function (Sizes) {
29
+ Sizes["SMALL"] = "small";
30
+ Sizes["MEDIUM"] = "medium";
31
+ Sizes["LARGE"] = "large";
32
+ })(Sizes || (Sizes = {}));
33
+
34
+ const imageSizes = {
35
+ [Sizes.SMALL]: 200,
36
+ [Sizes.MEDIUM]: 300,
37
+ [Sizes.LARGE]: 500
38
+ };
39
+ const Illustration = /*#__PURE__*/forwardRef(({
40
+ id,
41
+ name,
42
+ alt,
43
+ loading = 'eager',
44
+ className,
45
+ size = Sizes.MEDIUM,
46
+ disablePadding = false
47
+ }, ref) => {
48
+ const {
49
+ SMALL,
50
+ MEDIUM
51
+ } = Sizes;
52
+ return name ? /*#__PURE__*/jsxs("picture", {
53
+ children: [size === Sizes.LARGE || size === Sizes.MEDIUM ? /*#__PURE__*/jsxs(Fragment, {
54
+ children: [/*#__PURE__*/jsx("source", {
55
+ width: imageSizes[SMALL],
56
+ height: imageSizes[SMALL],
57
+ media: "(max-width: 575px)",
58
+ srcSet: `${defineSrc(name, SMALL, '1x')}, ${defineSrc(name, SMALL, '2x')} 2x`
59
+ }), size !== Sizes.MEDIUM ? /*#__PURE__*/jsx("source", {
60
+ width: imageSizes[MEDIUM],
61
+ height: imageSizes[MEDIUM],
62
+ media: "(max-width: 992px)",
63
+ srcSet: `${defineSrc(name, MEDIUM, '1x')}, ${defineSrc(name, MEDIUM, '2x')} 2x`
64
+ }) : null]
65
+ }) : null, /*#__PURE__*/jsx("img", {
66
+ id: id,
67
+ ref: ref,
68
+ alt: alt ?? name.replace('-', ' '),
69
+ "data-testid": `wds-${name}-illustration`,
70
+ className: clsx(`wds-illustration wds-illustration-${name}`, className, !disablePadding && 'wds-illustration-padding'),
71
+ loading: loading,
72
+ src: defineSrc(name, size, '1x'),
73
+ srcSet: `${defineSrc(name, size, '2x')} 2x`,
74
+ width: imageSizes[size],
75
+ height: imageSizes[size]
76
+ })]
77
+ }) : null;
78
+ });
79
+ function defineSrc(illustration, size, descriptor) {
80
+ return `https://wise.com/web-art/assets/illustrations/${illustration}-${size}@${descriptor}.webp`;
81
+ }
82
+
83
+ /*
84
+ *
85
+ * DON'T MODIFY THIS FILE IT'S AUTO GENERATED
86
+ * See: `scripts/generate-i10s-metadata.mjs`
87
+ *
88
+ */
89
+ var Assets;
90
+ (function (Assets) {
91
+ Assets["BELL"] = "bell";
92
+ Assets["BRIEFCASE"] = "briefcase";
93
+ Assets["BUSINESS_CARD"] = "business-card";
94
+ Assets["CALENDAR"] = "calendar";
95
+ Assets["CHECK_MARK"] = "check-mark";
96
+ Assets["CLOSED_WINDOW"] = "closed-window";
97
+ Assets["COIN_PILE_DOWN"] = "coin-pile-down";
98
+ Assets["COIN_PILE_UP"] = "coin-pile-up";
99
+ Assets["CONFETTI"] = "confetti";
100
+ Assets["CONSTRUCTION_FENCE"] = "construction-fence";
101
+ Assets["CONVERT"] = "convert";
102
+ Assets["COOKIE"] = "cookie";
103
+ Assets["DIGITAL_CARD_2"] = "digital-card-2";
104
+ Assets["DIGITAL_CARD"] = "digital-card";
105
+ Assets["DOCUMENTS"] = "documents";
106
+ Assets["DOOR"] = "door";
107
+ Assets["ECO_CARD"] = "eco-card";
108
+ Assets["ELECTRIC_PLUG"] = "electric-plug";
109
+ Assets["EMAIL_SUCCESS"] = "email-success";
110
+ Assets["EMAIL"] = "email";
111
+ Assets["EXCLAMATION_MARK"] = "exclamation-mark";
112
+ Assets["FLAG"] = "flag";
113
+ Assets["FLOWER"] = "flower";
114
+ Assets["GEAR"] = "gear";
115
+ Assets["GLOBE"] = "globe";
116
+ Assets["GRAPH"] = "graph";
117
+ Assets["HEART_2"] = "heart-2";
118
+ Assets["HEART_3"] = "heart-3";
119
+ Assets["HEART_4"] = "heart-4";
120
+ Assets["HEART_5"] = "heart-5";
121
+ Assets["HEART"] = "heart";
122
+ Assets["HOUSE"] = "house";
123
+ Assets["ID_CARD"] = "id-card";
124
+ Assets["INFINITE"] = "infinite";
125
+ Assets["INVITE_LETTER"] = "invite-letter";
126
+ Assets["JARS"] = "jars";
127
+ Assets["KEY"] = "key";
128
+ Assets["LIGHT_BULB"] = "light-bulb";
129
+ Assets["LOCK"] = "lock";
130
+ Assets["MAGNIFYING_GLASS"] = "magnifying-glass";
131
+ Assets["MAP"] = "map";
132
+ Assets["MARBLE_CARD_BUSINESS"] = "marble-card-business";
133
+ Assets["MARBLE_CARD"] = "marble-card";
134
+ Assets["MARBLE"] = "marble";
135
+ Assets["MEGAPHONE"] = "megaphone";
136
+ Assets["MULTI_CURRENCY"] = "multi-currency";
137
+ Assets["ONE_INVITE_LETTER_OPENED"] = "one-invite-letter-opened";
138
+ Assets["PALM_TREE"] = "palm-tree";
139
+ Assets["PERCENTAGE"] = "percentage";
140
+ Assets["PERSONAL_CARD"] = "personal-card";
141
+ Assets["PHONES"] = "phones";
142
+ Assets["PIE_CHART"] = "pie-chart";
143
+ Assets["PLANE_2"] = "plane-2";
144
+ Assets["PLANE"] = "plane";
145
+ Assets["PUZZLE_PIECES"] = "puzzle-pieces";
146
+ Assets["QUESTION_MARK"] = "question-mark";
147
+ Assets["RECEIVE"] = "receive";
148
+ Assets["REMINDER_LETTER"] = "reminder-letter";
149
+ Assets["SAND_TIMER"] = "sand-timer";
150
+ Assets["SHOPPING_BAG"] = "shopping-bag";
151
+ Assets["SKIP_AUTHENTICATION"] = "skip-authentication";
152
+ Assets["SPEECH_BUBBLE"] = "speech-bubble";
153
+ Assets["TOOL"] = "tool";
154
+ Assets["TWO_INVITE_LETTERS_OPENED"] = "two-invite-letters-opened";
155
+ Assets["WALLET"] = "wallet";
156
+ })(Assets || (Assets = {}));
157
+
158
+ export { Assets, Flag, Illustration, Sizes };
159
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wise/art",
3
- "version": "2.5.0",
3
+ "version": "2.6.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",
@@ -8,13 +8,22 @@
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/transferwise/web-art.git"
10
10
  },
11
- "source": "src/index.ts",
12
- "main": "dist/index.js",
13
- "module": "./dist/index.module.js",
14
- "unpkg": "./dist/index.umd.js",
15
- "types": "dist/index.d.ts",
11
+ "author": "Wise Payments Ltd.",
12
+ "sideEffects": false,
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.mjs",
17
+ "require": "./dist/index.js"
18
+ },
19
+ "./dist/Illustration.css": "./dist/Illustration.css"
20
+ },
21
+ "main": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
16
23
  "files": [
17
- "dist"
24
+ "dist/",
25
+ "src/",
26
+ "!**/*.tsbuildinfo"
18
27
  ],
19
28
  "scripts": {
20
29
  "setup": "yarn && yarn build",
@@ -26,44 +35,51 @@
26
35
  "convert-flags-svg-to-png": "node ./scripts/convert-flags-svg-to-png.mjs",
27
36
  "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",
28
37
  "generate-i10s-metadata": "node ./scripts/generate-i10s-metadata.mjs && eslint 'src/illustrations/metadata.ts' --fix",
29
- "bundle": "rm -rf dist && microbundle --jsxFragment React.Fragment --jsx React.createElement && cpx src/illustrations/Illustration.css dist/",
38
+ "bundle": "rm -rf dist && rollup --config --sourcemap && cpx src/illustrations/Illustration.css dist/",
30
39
  "cleanup": "rm -rf temp",
31
40
  "build": "yarn load-i10s && yarn convert-i10s-png-to-webp && yarn generate-i10s-metadata && yarn load-flags && yarn bundle && yarn cleanup",
32
41
  "start": "storybook dev -p 3001",
33
42
  "dev": "yarn start",
34
43
  "test": "release-to-github-with-changelog-pre-release-checks",
35
44
  "lint-fix": "eslint 'src/**/*.{js,ts,tsx}' 'scripts/*.{mjs,js,ts,tsx}' --fix",
36
- "build-docs": "storybook build -o docs",
37
- "deploy-docs": "deploy-to-github-pages -d docs -m main"
45
+ "build-docs": "storybook build -o docs && touch ./docs/.nojekyll"
46
+ },
47
+ "dependencies": {
48
+ "@babel/runtime": "^7.22.15",
49
+ "clsx": "^2.0.0"
38
50
  },
39
51
  "devDependencies": {
40
- "@babel/preset-env": "^7.22.14",
41
- "@babel/preset-react": "^7.22.5",
42
- "@babel/preset-typescript": "^7.22.11",
52
+ "@babel/core": "^7.22.15",
53
+ "@babel/plugin-transform-runtime": "^7.22.15",
54
+ "@babel/preset-env": "^7.22.15",
55
+ "@babel/preset-react": "^7.22.15",
56
+ "@babel/preset-typescript": "^7.22.15",
57
+ "@rollup/plugin-babel": "^6.0.3",
58
+ "@rollup/plugin-typescript": "^11.1.3",
43
59
  "@storybook/addon-essentials": "^7.4.0",
44
60
  "@storybook/react": "^7.4.0",
45
61
  "@storybook/react-vite": "^7.4.0",
46
62
  "@transferwise/eslint-config": "^8.0.0",
63
+ "@tsconfig/recommended": "^1.0.2",
64
+ "@types/babel__core": "^7.20.1",
47
65
  "@types/glob": "^8.1.0",
48
66
  "@types/imagemin": "^8.0.1",
49
67
  "@types/imagemin-webp": "^7.0.0",
50
- "@types/jest": "^28.1.6",
68
+ "@types/jest": "^28.1.8",
51
69
  "@types/jsdom": "^21.1.2",
52
70
  "@types/react": "^18.2.21",
53
71
  "@types/react-dom": "^18.2.7",
54
- "classnames": "^2.3.2",
72
+ "babel-plugin-optimize-clsx": "^2.6.2",
55
73
  "copyfiles": "^2.4.1",
56
74
  "cpx": "^1.5.0",
57
- "deploy-to-github-pages": "^1.0.1",
58
75
  "eslint": "^8.48.0",
59
- "glob": "^8.0.3",
76
+ "glob": "^8.1.0",
60
77
  "imagemin": "^8.0.1",
61
78
  "imagemin-webp": "^7.0.0",
62
79
  "jest": "^28.1.3",
63
80
  "jest-environment-jsdom": "^28.1.3",
64
- "jsdom": "~21.1.1",
65
- "microbundle": "^0.15.1",
66
- "prettier": "^2.7.1",
81
+ "jsdom": "~21.1.2",
82
+ "prettier": "^2.8.8",
67
83
  "react": "^18.2.0",
68
84
  "react-dom": "^18.2.0",
69
85
  "release-to-github-with-changelog": "^1.2.4",
@@ -75,12 +91,14 @@
75
91
  "wise-atoms": "git+ssh://git@github.com:transferwise/wise-atoms.git#bb7a63aa66453af9c77e754586381ac5b996a176"
76
92
  },
77
93
  "peerDependencies": {
78
- "classnames": "^2.3",
79
94
  "react": ">=17",
80
95
  "react-dom": ">=17"
81
96
  },
82
97
  "prettier": "@transferwise/eslint-config/.prettierrc.js",
83
98
  "publishConfig": {
84
99
  "access": "public"
100
+ },
101
+ "resolutions": {
102
+ "jackspeak": "2.1.1"
85
103
  }
86
104
  }
package/src/common.ts ADDED
@@ -0,0 +1,11 @@
1
+ export enum Sizes {
2
+ SMALL = 'small',
3
+ MEDIUM = 'medium',
4
+ LARGE = 'large',
5
+ }
6
+
7
+ export type LargeSize = 'large';
8
+ export type MediumSize = 'medium';
9
+ export type SmallSize = 'small';
10
+
11
+ export type Descriptors = '1x' | '1.5x' | '2x' | '3x' | '4x';
@@ -0,0 +1,19 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+
3
+ import { Flag } from './Flag';
4
+
5
+ const meta: Meta<typeof Flag> = {
6
+ component: Flag,
7
+ title: 'Flag',
8
+ };
9
+ export default meta;
10
+
11
+ type Story = StoryObj<typeof Flag>;
12
+
13
+ export const Basic: Story = {
14
+ render: (args) => <Flag {...args} />,
15
+ args: {
16
+ code: 'GBP',
17
+ intrinsicSize: 64,
18
+ },
19
+ };
@@ -0,0 +1,40 @@
1
+ import { useEffect, useState } from 'react';
2
+
3
+ export interface FlagProps {
4
+ /**
5
+ * Two-letter country code (ISO 3166-1 alpha-2) or three-letter currency code (ISO 4217).
6
+ */
7
+ code: string;
8
+
9
+ /**
10
+ * Width and height to reserve for the underlying image, in pixels. A detailed variant is shown from 150px and above.
11
+ */
12
+ intrinsicSize?: number;
13
+ }
14
+
15
+ const unknownFlagName = 'wise';
16
+
17
+ export const Flag = ({ code, intrinsicSize = 64 }: FlagProps) => {
18
+ const [fallback, setFallback] = useState<'simple' | 'unknown' | null>(null);
19
+ useEffect(() => {
20
+ setFallback(null);
21
+ }, [code]);
22
+
23
+ const detailed = intrinsicSize >= 150;
24
+ const name =
25
+ fallback !== 'unknown'
26
+ ? `${code.toLowerCase()}${fallback == null && detailed ? '-detailed' : ''}`
27
+ : unknownFlagName;
28
+
29
+ return (
30
+ <img
31
+ src={`https://wise.com/web-art/assets/flags/${name}.svg`}
32
+ alt=""
33
+ width={intrinsicSize}
34
+ height={intrinsicSize}
35
+ onError={() => {
36
+ setFallback((prev) => (prev == null && detailed ? 'simple' : 'unknown'));
37
+ }}
38
+ />
39
+ );
40
+ };
@@ -0,0 +1,2 @@
1
+ export { Flag } from './Flag';
2
+ export type { FlagProps } from './Flag';
@@ -0,0 +1,8 @@
1
+ /* Prevent image overflow viewport or container element */
2
+ img.wds-illustration {
3
+ max-width: 100%;
4
+ }
5
+
6
+ .wds-illustration-padding {
7
+ padding: 24px;
8
+ }
@@ -0,0 +1,33 @@
1
+ /* eslint-disable react/forbid-dom-props */
2
+ import React from 'react';
3
+
4
+ import Illustration, { Props as IllustrationProps } from './Illustration';
5
+ import { Assets, IllustrationNames } from './metadata';
6
+
7
+ export default {
8
+ component: Illustration,
9
+ title: 'Illustration',
10
+ };
11
+
12
+ export const All = () => {
13
+ const assetNames = Object.values(Assets);
14
+ return (
15
+ <>
16
+ <div>Total number of illustrations: {assetNames.length}</div>
17
+ {Object.values(Assets).map((assetName) => (
18
+ <p key={assetName}>
19
+ Asset: <code>{assetName}</code>
20
+ <Illustration alt={assetName} key={assetName} name={assetName as IllustrationNames} />
21
+ </p>
22
+ ))}
23
+ </>
24
+ );
25
+ };
26
+
27
+ export const Individual = ({ name = Assets.CHECK_MARK, ...props }: IllustrationProps) => {
28
+ return (
29
+ <>
30
+ <Illustration name={name} {...props} />
31
+ </>
32
+ );
33
+ };
@@ -0,0 +1,95 @@
1
+ import { clsx } from 'clsx';
2
+ import { forwardRef } from 'react';
3
+
4
+ import {
5
+ type LargeSize,
6
+ type MediumSize,
7
+ type SmallSize,
8
+ type Descriptors,
9
+ Sizes,
10
+ } from './../common';
11
+ import type { IllustrationNames } from './metadata';
12
+
13
+ // Picking only a few props from Image element to avoid breaking change
14
+ // as in future underlying element might change
15
+ type ImgProps = Pick<React.ImgHTMLAttributes<HTMLImageElement>, 'id' | 'className'>;
16
+
17
+ export type IllustrationSizes = LargeSize | MediumSize | SmallSize;
18
+
19
+ export type Props = {
20
+ name: IllustrationNames;
21
+ alt: string;
22
+ size?: IllustrationSizes;
23
+ loading?: 'eager' | 'lazy';
24
+ disablePadding?: boolean;
25
+ } & ImgProps;
26
+
27
+ const imageSizes = {
28
+ [Sizes.SMALL]: 200,
29
+ [Sizes.MEDIUM]: 300,
30
+ [Sizes.LARGE]: 500,
31
+ };
32
+
33
+ const Illustration = forwardRef<HTMLImageElement, Props>(
34
+ (
35
+ {
36
+ id,
37
+ name,
38
+ alt,
39
+ loading = 'eager',
40
+ className,
41
+ size = Sizes.MEDIUM,
42
+ disablePadding = false,
43
+ }: Props,
44
+ ref,
45
+ ) => {
46
+ const { SMALL, MEDIUM } = Sizes;
47
+
48
+ return name ? (
49
+ <picture>
50
+ {size === Sizes.LARGE || size === Sizes.MEDIUM ? (
51
+ <>
52
+ <source
53
+ width={imageSizes[SMALL]}
54
+ height={imageSizes[SMALL]}
55
+ media="(max-width: 575px)"
56
+ srcSet={`${defineSrc(name, SMALL, '1x')}, ${defineSrc(name, SMALL, '2x')} 2x`}
57
+ />
58
+ {size !== Sizes.MEDIUM ? (
59
+ <source
60
+ width={imageSizes[MEDIUM]}
61
+ height={imageSizes[MEDIUM]}
62
+ media="(max-width: 992px)"
63
+ srcSet={`${defineSrc(name, MEDIUM, '1x')}, ${defineSrc(name, MEDIUM, '2x')} 2x`}
64
+ />
65
+ ) : null}
66
+ </>
67
+ ) : null}
68
+
69
+ <img
70
+ id={id}
71
+ ref={ref}
72
+ alt={alt ?? name.replace('-', ' ')}
73
+ data-testid={`wds-${name}-illustration`}
74
+ className={clsx(
75
+ 'wds-illustration',
76
+ `wds-illustration-${name}`,
77
+ { 'wds-illustration-padding': !disablePadding },
78
+ className,
79
+ )}
80
+ loading={loading}
81
+ src={defineSrc(name, size, '1x')}
82
+ srcSet={`${defineSrc(name, size, '2x')} 2x`}
83
+ width={imageSizes[size]}
84
+ height={imageSizes[size]}
85
+ />
86
+ </picture>
87
+ ) : null;
88
+ },
89
+ );
90
+
91
+ function defineSrc(illustration: string, size: IllustrationSizes, descriptor: Descriptors) {
92
+ return `https://wise.com/web-art/assets/illustrations/${illustration}-${size}@${descriptor}.webp`;
93
+ }
94
+
95
+ export default Illustration;
@@ -0,0 +1,5 @@
1
+ export { default } from './Illustration';
2
+ export type { Props as IllustrationProps } from './Illustration';
3
+
4
+ export { Assets } from './metadata';
5
+ export type { IllustrationNames } from './metadata';
@@ -0,0 +1,141 @@
1
+ /*
2
+ *
3
+ * DON'T MODIFY THIS FILE IT'S AUTO GENERATED
4
+ * See: `scripts/generate-i10s-metadata.mjs`
5
+ *
6
+ */
7
+
8
+ export enum Assets {
9
+ BELL = 'bell',
10
+ BRIEFCASE = 'briefcase',
11
+ BUSINESS_CARD = 'business-card',
12
+ CALENDAR = 'calendar',
13
+ CHECK_MARK = 'check-mark',
14
+ CLOSED_WINDOW = 'closed-window',
15
+ COIN_PILE_DOWN = 'coin-pile-down',
16
+ COIN_PILE_UP = 'coin-pile-up',
17
+ CONFETTI = 'confetti',
18
+ CONSTRUCTION_FENCE = 'construction-fence',
19
+ CONVERT = 'convert',
20
+ COOKIE = 'cookie',
21
+ DIGITAL_CARD_2 = 'digital-card-2',
22
+ DIGITAL_CARD = 'digital-card',
23
+ DOCUMENTS = 'documents',
24
+ DOOR = 'door',
25
+ ECO_CARD = 'eco-card',
26
+ ELECTRIC_PLUG = 'electric-plug',
27
+ EMAIL_SUCCESS = 'email-success',
28
+ EMAIL = 'email',
29
+ EXCLAMATION_MARK = 'exclamation-mark',
30
+ FLAG = 'flag',
31
+ FLOWER = 'flower',
32
+ GEAR = 'gear',
33
+ GLOBE = 'globe',
34
+ GRAPH = 'graph',
35
+ HEART_2 = 'heart-2',
36
+ HEART_3 = 'heart-3',
37
+ HEART_4 = 'heart-4',
38
+ HEART_5 = 'heart-5',
39
+ HEART = 'heart',
40
+ HOUSE = 'house',
41
+ ID_CARD = 'id-card',
42
+ INFINITE = 'infinite',
43
+ INVITE_LETTER = 'invite-letter',
44
+ JARS = 'jars',
45
+ KEY = 'key',
46
+ LIGHT_BULB = 'light-bulb',
47
+ LOCK = 'lock',
48
+ MAGNIFYING_GLASS = 'magnifying-glass',
49
+ MAP = 'map',
50
+ MARBLE_CARD_BUSINESS = 'marble-card-business',
51
+ MARBLE_CARD = 'marble-card',
52
+ MARBLE = 'marble',
53
+ MEGAPHONE = 'megaphone',
54
+ MULTI_CURRENCY = 'multi-currency',
55
+ ONE_INVITE_LETTER_OPENED = 'one-invite-letter-opened',
56
+ PALM_TREE = 'palm-tree',
57
+ PERCENTAGE = 'percentage',
58
+ PERSONAL_CARD = 'personal-card',
59
+ PHONES = 'phones',
60
+ PIE_CHART = 'pie-chart',
61
+ PLANE_2 = 'plane-2',
62
+ PLANE = 'plane',
63
+ PUZZLE_PIECES = 'puzzle-pieces',
64
+ QUESTION_MARK = 'question-mark',
65
+ RECEIVE = 'receive',
66
+ REMINDER_LETTER = 'reminder-letter',
67
+ SAND_TIMER = 'sand-timer',
68
+ SHOPPING_BAG = 'shopping-bag',
69
+ SKIP_AUTHENTICATION = 'skip-authentication',
70
+ SPEECH_BUBBLE = 'speech-bubble',
71
+ TOOL = 'tool',
72
+ TWO_INVITE_LETTERS_OPENED = 'two-invite-letters-opened',
73
+ WALLET = 'wallet',
74
+ }
75
+
76
+ export type IllustrationNames =
77
+ | 'bell'
78
+ | 'briefcase'
79
+ | 'business-card'
80
+ | 'calendar'
81
+ | 'check-mark'
82
+ | 'closed-window'
83
+ | 'coin-pile-down'
84
+ | 'coin-pile-up'
85
+ | 'confetti'
86
+ | 'construction-fence'
87
+ | 'convert'
88
+ | 'cookie'
89
+ | 'digital-card-2'
90
+ | 'digital-card'
91
+ | 'documents'
92
+ | 'door'
93
+ | 'eco-card'
94
+ | 'electric-plug'
95
+ | 'email-success'
96
+ | 'email'
97
+ | 'exclamation-mark'
98
+ | 'flag'
99
+ | 'flower'
100
+ | 'gear'
101
+ | 'globe'
102
+ | 'graph'
103
+ | 'heart-2'
104
+ | 'heart-3'
105
+ | 'heart-4'
106
+ | 'heart-5'
107
+ | 'heart'
108
+ | 'house'
109
+ | 'id-card'
110
+ | 'infinite'
111
+ | 'invite-letter'
112
+ | 'jars'
113
+ | 'key'
114
+ | 'light-bulb'
115
+ | 'lock'
116
+ | 'magnifying-glass'
117
+ | 'map'
118
+ | 'marble-card-business'
119
+ | 'marble-card'
120
+ | 'marble'
121
+ | 'megaphone'
122
+ | 'multi-currency'
123
+ | 'one-invite-letter-opened'
124
+ | 'palm-tree'
125
+ | 'percentage'
126
+ | 'personal-card'
127
+ | 'phones'
128
+ | 'pie-chart'
129
+ | 'plane-2'
130
+ | 'plane'
131
+ | 'puzzle-pieces'
132
+ | 'question-mark'
133
+ | 'receive'
134
+ | 'reminder-letter'
135
+ | 'sand-timer'
136
+ | 'shopping-bag'
137
+ | 'skip-authentication'
138
+ | 'speech-bubble'
139
+ | 'tool'
140
+ | 'two-invite-letters-opened'
141
+ | 'wallet';
package/src/index.ts ADDED
@@ -0,0 +1,7 @@
1
+ export { Flag } from './flags';
2
+ export { default as Illustration } from './illustrations';
3
+ export { Assets } from './illustrations';
4
+ export { Sizes } from './common';
5
+
6
+ export type { FlagProps } from './flags';
7
+ export type { IllustrationNames, IllustrationProps } from './illustrations';
@@ -1,6 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { Flag } from './Flag';
3
- declare const meta: Meta<typeof Flag>;
4
- export default meta;
5
- type Story = StoryObj<typeof Flag>;
6
- export declare const Basic: Story;