@wise/art 2.5.0-beta.6 → 2.5.0-beta.7

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 CHANGED
@@ -77,12 +77,6 @@ in Angular HTML template file
77
77
  </wise-illustration>
78
78
  ```
79
79
 
80
- ## 3d Illustrations
81
-
82
- 3d illustrations work via `Illustration3d` React component. The component uses [three.js](https://threejs.org) framework to preview 3d models.
83
-
84
-
85
-
86
80
  ## Flags
87
81
 
88
82
  Flags generated from [wise-atoms SVGs](https://github.com/transferwise/wise-atoms/tree/main/flags) are accessible by either of these:
@@ -1 +1 @@
1
- {"version":3,"file":"index-2088095e.js","sources":["../src/common.ts","../src/illustrations/Illustration.tsx","../src/illustrations/metadata.ts","../src/illustrations3d/utils.ts","../src/illustrations3d/Illustration3d.tsx","../src/flags/Flag.tsx"],"sourcesContent":["export enum Sizes {\n SMALL = 'small',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n\nexport const ImageSizes = {\n [Sizes.SMALL]: 200,\n [Sizes.MEDIUM]: 300,\n [Sizes.LARGE]: 500,\n};\n\nexport type LargeSize = 'large';\nexport type MediumSize = 'medium';\nexport type SmallSize = 'small';\n\nexport type Descriptors = '1x' | '1.5x' | '2x' | '3x' | '4x';\n","import classNames from 'classnames';\nimport React, { forwardRef, ImgHTMLAttributes } from 'react';\n\nimport { LargeSize, MediumSize, SmallSize, Descriptors, Sizes } from './../common';\nimport { IllustrationNames } from './metadata';\n\n// Picking only a few props from Image element to avoid breaking change\n// as in future underlying element might change\ntype ImgProps = Pick<ImgHTMLAttributes<HTMLImageElement>, 'id' | 'className'>;\n\nexport type IllustrationSizes = LargeSize | MediumSize | SmallSize;\n\nexport type Props = {\n name: IllustrationNames;\n alt: string;\n size?: IllustrationSizes;\n loading?: 'eager' | 'lazy';\n disablePadding?: boolean;\n} & ImgProps;\n\nconst imageSizes = {\n [Sizes.SMALL]: 200,\n [Sizes.MEDIUM]: 300,\n [Sizes.LARGE]: 500,\n};\n\nconst Illustration = forwardRef<HTMLImageElement, Props>(\n (\n {\n id,\n name,\n alt,\n loading = 'eager',\n className,\n size = Sizes.MEDIUM,\n disablePadding = false,\n }: Props,\n ref,\n ) => {\n const { SMALL, MEDIUM } = Sizes;\n\n return name ? (\n <picture>\n {size === Sizes.LARGE || size === Sizes.MEDIUM ? (\n <>\n <source\n width={imageSizes[SMALL]}\n height={imageSizes[SMALL]}\n media=\"(max-width: 575px)\"\n srcSet={`${defineSrc(name, SMALL, '1x')}, ${defineSrc(name, SMALL, '2x')} 2x`}\n />\n {size !== Sizes.MEDIUM ? (\n <source\n width={imageSizes[MEDIUM]}\n height={imageSizes[MEDIUM]}\n media=\"(max-width: 992px)\"\n srcSet={`${defineSrc(name, MEDIUM, '1x')}, ${defineSrc(name, MEDIUM, '2x')} 2x`}\n />\n ) : null}\n </>\n ) : null}\n\n <img\n id={id}\n ref={ref}\n alt={alt ?? name.replace('-', ' ')}\n data-testid={`wds-${name}-illustration`}\n className={classNames(\n 'wds-illustration',\n `wds-illustration-${name}`,\n { 'wds-illustration-padding': !disablePadding },\n className,\n )}\n loading={loading}\n src={defineSrc(name, size, '1x')}\n srcSet={`${defineSrc(name, size, '2x')} 2x`}\n width={imageSizes[size]}\n height={imageSizes[size]}\n />\n </picture>\n ) : null;\n },\n);\n\nfunction defineSrc(illustration: string, size: IllustrationSizes, descriptor: Descriptors) {\n return `https://wise.com/web-art/assets/illustrations/${illustration}-${size}@${descriptor}.webp`;\n}\n\nexport default Illustration;\n","/*\n *\n * DON'T MODIFY THIS FILE IT'S AUTO GENERATED\n * See: `scripts/generate-i10s-metadata.mjs`\n *\n */\n\nexport enum Assets {\n BELL = 'bell',\n BRIEFCASE = 'briefcase',\n BUSINESS_CARD = 'business-card',\n CALENDAR = 'calendar',\n CHECK_MARK = 'check-mark',\n CLOSED_WINDOW = 'closed-window',\n COIN_PILE_DOWN = 'coin-pile-down',\n COIN_PILE_UP = 'coin-pile-up',\n CONFETTI = 'confetti',\n CONSTRUCTION_FENCE = 'construction-fence',\n CONVERT = 'convert',\n COOKIE = 'cookie',\n DIGITAL_CARD_2 = 'digital-card-2',\n DIGITAL_CARD = 'digital-card',\n DOCUMENTS = 'documents',\n DOOR = 'door',\n ECO_CARD = 'eco-card',\n ELECTRIC_PLUG = 'electric-plug',\n EMAIL_SUCCESS = 'email-success',\n EMAIL = 'email',\n EXCLAMATION_MARK = 'exclamation-mark',\n FLAG = 'flag',\n FLOWER = 'flower',\n GEAR = 'gear',\n GLOBE = 'globe',\n GRAPH = 'graph',\n HEART_2 = 'heart-2',\n HEART_3 = 'heart-3',\n HEART_4 = 'heart-4',\n HEART_5 = 'heart-5',\n HEART = 'heart',\n HOUSE = 'house',\n ID_CARD = 'id-card',\n INFINITE = 'infinite',\n INVITE_LETTER = 'invite-letter',\n JARS = 'jars',\n KEY = 'key',\n LIGHT_BULB = 'light-bulb',\n LOCK = 'lock',\n MAGNIFYING_GLASS = 'magnifying-glass',\n MAP = 'map',\n MARBLE_CARD_BUSINESS = 'marble-card-business',\n MARBLE_CARD = 'marble-card',\n MARBLE = 'marble',\n MEGAPHONE = 'megaphone',\n MULTI_CURRENCY = 'multi-currency',\n ONE_INVITE_LETTER_OPENED = 'one-invite-letter-opened',\n PALM_TREE = 'palm-tree',\n PERCENTAGE = 'percentage',\n PERSONAL_CARD = 'personal-card',\n PHONES = 'phones',\n PIE_CHART = 'pie-chart',\n PLANE_2 = 'plane-2',\n PLANE = 'plane',\n PUZZLE_PIECES = 'puzzle-pieces',\n QUESTION_MARK = 'question-mark',\n RECEIVE = 'receive',\n REMINDER_LETTER = 'reminder-letter',\n SAND_TIMER = 'sand-timer',\n SHOPPING_BAG = 'shopping-bag',\n SKIP_AUTHENTICATION = 'skip-authentication',\n SPEECH_BUBBLE = 'speech-bubble',\n TOOL = 'tool',\n TWO_INVITE_LETTERS_OPENED = 'two-invite-letters-opened',\n WALLET = 'wallet',\n}\n\nexport type IllustrationNames =\n | 'bell'\n | 'briefcase'\n | 'business-card'\n | 'calendar'\n | 'check-mark'\n | 'closed-window'\n | 'coin-pile-down'\n | 'coin-pile-up'\n | 'confetti'\n | 'construction-fence'\n | 'convert'\n | 'cookie'\n | 'digital-card-2'\n | 'digital-card'\n | 'documents'\n | 'door'\n | 'eco-card'\n | 'electric-plug'\n | 'email-success'\n | 'email'\n | 'exclamation-mark'\n | 'flag'\n | 'flower'\n | 'gear'\n | 'globe'\n | 'graph'\n | 'heart-2'\n | 'heart-3'\n | 'heart-4'\n | 'heart-5'\n | 'heart'\n | 'house'\n | 'id-card'\n | 'infinite'\n | 'invite-letter'\n | 'jars'\n | 'key'\n | 'light-bulb'\n | 'lock'\n | 'magnifying-glass'\n | 'map'\n | 'marble-card-business'\n | 'marble-card'\n | 'marble'\n | 'megaphone'\n | 'multi-currency'\n | 'one-invite-letter-opened'\n | 'palm-tree'\n | 'percentage'\n | 'personal-card'\n | 'phones'\n | 'pie-chart'\n | 'plane-2'\n | 'plane'\n | 'puzzle-pieces'\n | 'question-mark'\n | 'receive'\n | 'reminder-letter'\n | 'sand-timer'\n | 'shopping-bag'\n | 'skip-authentication'\n | 'speech-bubble'\n | 'tool'\n | 'two-invite-letters-opened'\n | 'wallet';\n","import { useState, useEffect } from 'react';\n\nimport { IllustrationNames } from '../illustrations/metadata';\n\nexport function useBattery() {\n const [batteryData, setBatteryData] = useState<{ level: number }>({ level: 1.0 });\n\n useEffect(() => {\n const getBatteryData = async () => {\n // @ts-expect-error .getBattery exists in Navigator interface\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const battery = await navigator.getBattery();\n\n setBatteryData({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n level: battery?.level,\n });\n };\n // Check if the browser supports the Battery API\n if ('getBattery' in navigator) {\n void getBatteryData();\n }\n }, []);\n\n return batteryData;\n}\n\nexport function isBatteryLow(batteryLevel: number): boolean {\n return batteryLevel < 0.2;\n}\n\nexport function isConnectionSlow(): boolean {\n // @ts-expect-error .connection prop exists in Navigator interface\n const { connection } = window.navigator;\n if (connection === undefined) {\n return false;\n }\n return (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n ['slow-2g', '2g'].includes(connection?.effectiveType as string) ||\n // @ts-expect-error Property 'connection' does exist on type 'Navigator'\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n navigator?.connection?.saveData === true\n );\n}\n\nexport function defineSrc(asset: string): string {\n return `https://wise.com/web-art/assets/illustrations3d/${asset}`;\n}\n\nconst illustration3dNames = [\n 'lock',\n 'globe',\n 'confetti',\n 'check-mark',\n 'flower',\n 'graph',\n 'jars',\n 'magnifying-glass',\n 'marble',\n 'marble-card',\n 'multi-currency',\n 'plane',\n];\n\nexport function is3dIllustrationSupported(asset: IllustrationNames): boolean {\n return illustration3dNames.includes(asset);\n}\n","/* eslint-disable fp/no-mutation */\n/* eslint-disable react/forbid-dom-props */\n/* eslint-disable react/destructuring-assignment */\n/* eslint-disable @typescript-eslint/restrict-template-expressions */\nimport classNames from 'classnames';\nimport React, { lazy, Suspense, useEffect, useState, LazyExoticComponent } from 'react';\n\nimport { LargeSize, MediumSize, SmallSize, Sizes } from '../common';\n\nimport Illustration, { Assets } from './../illustrations';\nimport { useBattery, isConnectionSlow, isBatteryLow } from './utils';\n\nexport type Illustration3dNames =\n | 'lock'\n | 'globe'\n | 'confetti'\n | 'check-mark'\n | 'flower'\n | 'graph'\n | 'jars'\n | 'magnifying-glass'\n | 'marble'\n | 'marble-card'\n | 'multi-currency'\n | 'plane';\n\nexport type Props = {\n name: Illustration3dNames;\n size?: SmallSize | MediumSize | LargeSize;\n className?: string;\n};\n\nenum RenderMode {\n INIT,\n FALLBACK,\n ASSET_3D,\n}\n\nconst Illustration3d = ({ name, size = Sizes.MEDIUM, className }: Props) => {\n const [renderMode, setRenderMode] = useState<RenderMode>(RenderMode.INIT);\n const [inintrinsicSize, setInintrinsicSize] = useState<Props['size']>(size);\n const batteryData = useBattery();\n\n useEffect(() => {\n setRenderMode(\n isConnectionSlow() || isBatteryLow(batteryData.level)\n ? RenderMode.FALLBACK\n : RenderMode.ASSET_3D,\n );\n const isMobile: boolean =\n (typeof window !== undefined && window?.matchMedia('(max-width: 575px)')?.matches) ?? false;\n if (isMobile) {\n setInintrinsicSize(Sizes.SMALL);\n }\n }, [batteryData]);\n\n return (\n <div\n className={classNames(\n 'wds-illustration-3d',\n `wds-illustration-3d-${name}`,\n `wds-illustration-3d-${inintrinsicSize}`,\n className,\n )}\n >\n {renderMode === RenderMode.INIT ? null : renderMode === RenderMode.ASSET_3D ? (\n <Suspense fallback={null}>{getModel({ name, size: inintrinsicSize })}</Suspense>\n ) : (\n <Illustration name={name} size={size} alt=\"\" />\n )}\n </div>\n );\n};\n\nfunction getModel({ name, size }: Props) {\n // @ts-expect-error unknown generic\n let Model: LazyExoticComponent = <></>;\n const Scene = lazy(() => import('./Scene'));\n switch (name) {\n case Assets.LOCK: {\n Model = lazy(() => import('./LockModel'));\n break;\n }\n case Assets.GLOBE: {\n Model = lazy(() => import('./GlobeModel'));\n break;\n }\n case Assets.CONFETTI: {\n Model = lazy(() => import('./ConfettiModel'));\n break;\n }\n case Assets.CHECK_MARK: {\n Model = lazy(() => import('./CheckMarkModel'));\n break;\n }\n case Assets.FLOWER: {\n Model = lazy(() => import('./FlowerModel'));\n break;\n }\n case Assets.PLANE: {\n Model = lazy(() => import('./PlaneModel'));\n break;\n }\n case Assets.GRAPH: {\n Model = lazy(() => import('./GraphModel'));\n break;\n }\n case Assets.MARBLE: {\n Model = lazy(() => import('./MarbleModel'));\n break;\n }\n case Assets.MARBLE_CARD: {\n Model = lazy(() => import('./MarbleCardModel'));\n break;\n }\n case Assets.MAGNIFYING_GLASS: {\n Model = lazy(() => import('./MagnifyingGlassModel'));\n break;\n }\n case Assets.JARS: {\n Model = lazy(() => import('./JarsModel'));\n break;\n }\n case Assets.MULTI_CURRENCY: {\n Model = lazy(() => import('./MultiCurrencyModel'));\n break;\n }\n }\n return (\n <Scene assetName={name} size={size}>\n <Model />\n </Scene>\n );\n}\n\nexport default Illustration3d;\n","import { useEffect, useState } from 'react';\n\nexport interface FlagProps {\n /**\n * Two-letter country code (ISO 3166-1 alpha-2) or three-letter currency code (ISO 4217).\n */\n code: string;\n\n /**\n * Width and height to reserve for the underlying image, in pixels. A detailed variant is shown from 150px and above.\n */\n intrinsicSize?: number;\n}\n\nconst unknownFlagName = 'wise';\n\nexport const Flag = ({ code, intrinsicSize = 64 }: FlagProps) => {\n const [fallback, setFallback] = useState<'simple' | 'unknown' | null>(null);\n useEffect(() => {\n setFallback(null);\n }, [code]);\n\n const detailed = intrinsicSize >= 150;\n const name =\n fallback !== 'unknown'\n ? `${code.toLowerCase()}${fallback == null && detailed ? '-detailed' : ''}`\n : unknownFlagName;\n\n return (\n <img\n src={`https://wise.com/web-art/assets/flags/${name}.svg`}\n alt=\"\"\n width={intrinsicSize}\n height={intrinsicSize}\n onError={() => {\n setFallback((prev) => (prev == null && detailed ? 'simple' : 'unknown'));\n }}\n />\n );\n};\n"],"names":["_ImageSizes","Sizes","ImageSizes","_imageSizes","Assets","SMALL","MEDIUM","LARGE","imageSizes","Illustration","forwardRef","ref","id","name","_ref","alt","loading","_ref$loading","className","size","_ref$size","disablePadding","_ref$disablePadding","React","createElement","Fragment","width","height","media","srcSet","defineSrc","replace","classNames","src","illustration","descriptor","RenderMode","code","intrinsicSize","_ref$intrinsicSize","_useState","useState","fallback","setFallback","useEffect","detailed","toLowerCase","onError","prev","INIT","renderMode","setRenderMode","_useState2","inintrinsicSize","setInintrinsicSize","batteryData","level","setBatteryData","navigator","getBattery","then","battery","e","Promise","reject","useBattery","_ref2","_window","_window$matchMedia","connection","undefined","window","includes","effectiveType","_navigator","_navigator$connection","saveData","FALLBACK","ASSET_3D","matchMedia","matches","Suspense","_ref3","Model","Scene","lazy","resolve","require","LOCK","GLOBE","CONFETTI","CHECK_MARK","FLOWER","PLANE","GRAPH","MARBLE","MARBLE_CARD","MAGNIFYING_GLASS","JARS","MULTI_CURRENCY","assetName","getModel","asset"],"mappings":"2HAAAA,EAAYC,0CAAAA,QAAZA,WAAA,GAAYA,EAAAA,QAAAA,QAAAA,QAAAA,MAIX,CAAA,IAHC,MAAA,QACAA,EAAA,OAAA,SACAA,EAAA,MAAA,QAGWC,ICNbC,ECOYC,EFDCF,IACVD,EAAAA,CAAAA,GAAAA,cAAMI,OAAQ,IACdJ,EAAAA,QAAAA,MAAMK,QAAS,IACfL,EAAAA,QAAAA,MAAMM,OAAQ,IAChBP,GCUKQ,IACHP,EAAAA,CAAAA,GAAAA,cAAMI,OAAQ,IAAGF,EACjBF,QAAKA,MAACK,QAAS,MACfL,QAAAA,MAAMM,OAAQ,IAChBJ,GAEKM,EAAeC,EAAAA,WACnB,SAUEC,EAAAA,GAREC,IAAAA,EAAAA,EAAAA,GACAC,EAAIC,EAAJD,KACAE,EAAAA,EAAAA,IACAC,EAAAA,EAAAA,QAAAA,OAAO,IAAAC,EAAG,QAAOA,EACjBC,EAAAA,EAAAA,UACAC,EAAAA,EAAAA,KAAAA,OAAI,IAAAC,EAAGnB,QAAAA,MAAMK,OACbe,EAAAA,EAAAA,EAAAA,eAAAA,cAAsBC,EAIhBjB,EAAkBJ,QAAAA,MAAlBI,MAAOC,EAAWL,QAAAA,MAAXK,OAEf,OAAOO,eACLU,EAAAA,QAAAC,cAAA,UAAA,KACGL,IAASlB,QAAKA,MAACM,OAASY,IAASlB,QAAKA,MAACK,oBACtCiB,EAAAA,QAAAC,cAAAD,EAAAA,QAAAE,SAAA,kBACEF,EAAAA,QACEC,cAAA,SAAA,CAAAE,MAAOlB,EAAWH,GAClBsB,OAAQnB,EAAWH,GACnBuB,MAAM,qBACNC,OAAWC,EAAUjB,EAAMR,EAAO,MAAK,KAAKyB,EAAUjB,EAAMR,EAAO,MAAW,QAE/Ec,IAASlB,QAAAA,MAAMK,oBACdiB,EAAA,QAAAC,cAAA,SAAA,CACEE,MAAOlB,EAAWF,GAClBqB,OAAQnB,EAAWF,GACnBsB,MAAM,qBACNC,OAAWC,EAAUjB,EAAMP,EAAQ,MAAUwB,KAAAA,EAAUjB,EAAMP,EAAQ,MAAK,QAE1E,MAEJ,kBAEJiB,+BACEX,GAAIA,EACJD,IAAKA,EACLI,IAAQ,MAAHA,EAAAA,EAAOF,EAAKkB,QAAQ,IAAK,KAC9B,cAAA,OAAoBlB,EAAoB,gBACxCK,UAAWc,EAAAA,QACT,mBACoBnB,oBAAAA,EACpB,CAAE,4BAA6BQ,GAC/BH,GAEFF,QAASA,EACTiB,IAAKH,EAAUjB,EAAMM,EAAM,MAC3BU,OAAWC,EAAUjB,EAAMM,EAAM,MAAW,MAC5CO,MAAOlB,EAAWW,GAClBQ,OAAQnB,EAAWW,MAGrB,IACN,GAGF,SAASW,EAAUI,EAAsBf,EAAyBgB,GAChE,MAAwDD,iDAAAA,MAAgBf,EAAI,IAAIgB,EAClF,OAAA,CCbC/B,QAlEDA,YAAA,GAAYA,EAAAA,QAAMA,SAANA,QAAMA,OAkEjB,CAAA,IAjEC,KAAA,OACAA,EAAA,UAAA,YACAA,EAAA,cAAA,gBACAA,EAAA,SAAA,WACAA,EAAA,WAAA,aACAA,EAAA,cAAA,gBACAA,EAAA,eAAA,iBACAA,EAAA,aAAA,eACAA,EAAA,SAAA,WACAA,EAAA,mBAAA,qBACAA,EAAA,QAAA,UACAA,EAAA,OAAA,SACAA,EAAA,eAAA,iBACAA,EAAA,aAAA,eACAA,EAAA,UAAA,YACAA,EAAA,KAAA,OACAA,EAAA,SAAA,WACAA,EAAA,cAAA,gBACAA,EAAA,cAAA,gBACAA,EAAA,MAAA,QACAA,EAAA,iBAAA,mBACAA,EAAA,KAAA,OACAA,EAAA,OAAA,SACAA,EAAA,KAAA,OACAA,EAAA,MAAA,QACAA,EAAA,MAAA,QACAA,EAAA,QAAA,UACAA,EAAA,QAAA,UACAA,EAAA,QAAA,UACAA,EAAA,QAAA,UACAA,EAAA,MAAA,QACAA,EAAA,MAAA,QACAA,EAAA,QAAA,UACAA,EAAA,SAAA,WACAA,EAAA,cAAA,gBACAA,EAAA,KAAA,OACAA,EAAA,IAAA,MACAA,EAAA,WAAA,aACAA,EAAA,KAAA,OACAA,EAAA,iBAAA,mBACAA,EAAA,IAAA,MACAA,EAAA,qBAAA,uBACAA,EAAA,YAAA,cACAA,EAAA,OAAA,SACAA,EAAA,UAAA,YACAA,EAAA,eAAA,iBACAA,EAAA,yBAAA,2BACAA,EAAA,UAAA,YACAA,EAAA,WAAA,aACAA,EAAA,cAAA,gBACAA,EAAA,OAAA,SACAA,EAAA,UAAA,YACAA,EAAA,QAAA,UACAA,EAAA,MAAA,QACAA,EAAA,cAAA,gBACAA,EAAA,cAAA,gBACAA,EAAA,QAAA,UACAA,EAAA,gBAAA,kBACAA,EAAA,WAAA,aACAA,EAAA,aAAA,eACAA,EAAA,oBAAA,sBACAA,EAAA,cAAA,gBACAA,EAAA,KAAA,OACAA,EAAA,0BAAA,4BACAA,EAAA,OAAA,SCtBF,IClBKgC,IDkBuB,CAC1B,OACA,QACA,WACA,aACA,SACA,QACA,OACA,mBACA,SACA,cACA,iBACA,UC9BF,SAAKA,GACHA,EAAAA,EAAA,KAAA,GAAA,OACAA,EAAAA,EAAA,SAAA,GAAA,WACAA,EAAAA,EAAA,SAAA,GAAA,UACD,CAJD,CAAKA,IAAAA,EAIJ,CAAA,iBCpBmB,SAAHtB,GAAMuB,IAAAA,EAAAA,EAAAA,KAAMC,EAAAA,EAAAA,cAAAA,OAAgB,IAAAC,EAAA,GAC3CA,EAAAC,EAAgCC,EAAAA,SAAsC,MAA/DC,EAAUC,EAAAA,GAAAA,EACjBC,EAAAA,GAAAA,EAAAA,UAAU,WACRD,EAAY,KACd,EAAG,CAACN,IAEJ,IAAMQ,EAAWP,GAAiB,IAC5BzB,EACS,YAAb6B,EACOL,EAAKS,eAA4B,MAAZJ,GAAoBG,EAAW,YAAc,IAXrD,oBActB,OACEtB,MAAAC,cAAA,MAAA,CACES,IAAG,yCAA2CpB,EAAI,OAClDE,IAAI,GACJW,MAAOY,EACPX,OAAQW,EACRS,QAAS,WACPJ,EAAY,SAACK,GAAI,OAAc,MAAJA,GAAYH,EAAW,SAAW,SAAS,EACxE,GAGN,gDDDuB,SAAoD/B,GAAA,MAAjDD,EAAAA,KAAMM,EAAAA,EAAAA,KAAAA,OAAOlB,IAAAA,EAAAA,QAAAA,MAAMK,OAAQY,EAAAA,EAAAA,EAAAA,UACnDsB,EAAoCC,EAAAA,SAAqBL,EAAWa,MAA7DC,EAAUV,EAAA,GAAEW,EACnBX,EAAA,GAAAY,EAA8CX,EAAAA,SAAwBtB,GAA/DkC,OAAiBC,EAAkBF,EAAA,GACpCG,aDpCN,IAAsCd,EAAAA,EAAAA,SAA4B,CAAEe,MAAO,IAApED,OAAaE,EAAcjB,EAAA,GAmBlC,OAjBAI,EAASA,UAAC,WAYJ,eAAgBc,sBAXA,oBAGIA,UAAUC,cAAYC,KAAA,SAAtCC,GAENJ,EAAe,CAEbD,MAAc,MAAPK,OAAO,EAAPA,EAASL,OACf,EAGL,CAFC,MAEDM,GAAA,OAAAC,QAAAC,OAAAF,EAAA,CAAA,GAGF,EAAG,KAGL,CCgBsBG,GAepB,OAbArB,EAASA,UAAC,WAAK,IAAAsB,EAAAC,EAAAC,MDVPC,ECWNlB,ODViBmB,KADXD,EAAeE,OAAOb,UAAtBW,cAMN,CAAC,UAAW,MAAMG,SAAmB,MAAVH,OAAU,EAAVA,EAAYI,iBAGH,KAApC,OAAAC,EAAAhB,YAAA,OAAAiB,EAAAD,EAAWL,iBAAX,EAAAM,EAAuBC,YCGcrB,EAAYC,MDjB7B,GCkBdpB,EAAWyC,SACXzC,EAAW0C,iBAGdZ,OAAkBI,WAALC,SAAwB,OAAVJ,EAAII,SAAwC,OAAlCH,EAAND,EAAQY,WAAW,4BAAb,EAANX,EAA0CY,cAE1E1B,EAAmBrD,QAAKA,MAACI,MAE7B,EAAG,CAACkD,iBAGFhC,UAAAC,cAAA,MAAA,CACEN,UAAWc,EAAAA,QACT,sBAAqB,uBACEnB,EAAI,uBACJwC,EACvBnC,IAGDgC,IAAed,EAAWa,KAAO,KAAOC,IAAed,EAAW0C,sBACjEvD,EAAA,QAAAC,cAACyD,EAAAA,SAAQ,CAACvC,SAAU,MAQ5B,SAAuCwC,GAAA,IAAfrE,EAAAqE,EAAJrE,KAAMM,EAAI+D,EAAJ/D,KAEpBgE,eAA6B5D,EAAA,QAAAC,cAAAD,UAAAE,SAAA,MAC3B2D,EAAQC,EAAAA,KAAK,WAAA,OAAYtB,QAAAuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAC,sBAAU,EAAA,GAC1C,OAAQ1E,GACN,oBAAY2E,KACVL,EAAQE,EAAIA,KAAC,WAAM,OAAAtB,QAAOuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAA,0BAAc,EAAA,GACxC,MAEF,KAAKnF,eAAOqF,MACVN,EAAQE,EAAIA,KAAC,WAAA,OAAYtB,QAACuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAA,2BAAe,EAAA,GACzC,MAEF,KAAWnF,eAACsF,SACVP,EAAQE,EAAAA,KAAK,WAAA,OAAYtB,QAAAuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAC,8BAAiB,EAAC,GAC5C,MAEF,KAAWnF,QAAAA,OAACuF,WACVR,EAAQE,EAAAA,KAAK,WAAM,OAAAtB,QAAAuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAO,+BAAkB,EAAC,GAC7C,MAEF,KAAKnF,QAAMA,OAACwF,OACVT,EAAQE,EAAAA,KAAK,WAAM,OAAAtB,QAAAuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAO,4BAAe,EAAC,GAC1C,MAEF,KAAKnF,QAAMA,OAACyF,MACVV,EAAQE,EAAAA,KAAK,WAAA,wDAAa,2BAAc,EAAC,GACzC,MAEF,KAAWjF,QAAAA,OAAC0F,MACVX,EAAQE,EAAIA,KAAC,WAAM,OAAAtB,QAAOuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAA,6BAAe,GACzC,MAEF,KAAKnF,QAAAA,OAAO2F,OACVZ,EAAQE,EAAIA,KAAC,WAAA,OAAYtB,QAACuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAA,8BAAgB,GAC1C,MAEF,KAAKnF,QAAAA,OAAO4F,YACVb,EAAQE,EAAIA,KAAC,WAAA,OAAYtB,QAACuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAA,kCAAoB,GAC9C,MAEF,KAAWnF,QAAAA,OAAC6F,iBACVd,EAAQE,EAAIA,KAAC,WAAM,OAAAtB,QAAOuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAA,uCAAyB,GACnD,MAEF,KAAWnF,QAAAA,OAAC8F,KACVf,EAAQE,EAAAA,KAAK,WAAM,OAAAtB,QAAAuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAO,0BAAc,EAAA,GACxC,MAEF,KAAKnF,eAAO+F,eACVhB,EAAQE,EAAAA,KAAK,WAAA,OAAYtB,QAAAuB,UAAA1B,KAAA,WAAA,OAAA2B,QAAC,mCAAuB,EAAA,gBAIrD,OACEhE,EAAA,QAAAC,cAAC4D,EAAK,CAACgB,UAAWvF,EAAMM,KAAMA,gBAC5BI,EAAAA,QAAAC,cAAC2D,EAAK,MAGZ,CAnEmCkB,CAAS,CAAExF,KAAAA,EAAMM,KAAMkC,kBAElD9B,EAAC,QAAAC,cAAAf,EAAa,CAAAI,KAAMA,EAAMM,KAAMA,EAAMJ,IAAI,KAIlD,yCD1BM,SAAoBuF,GACxB,MAAA,mDAA0DA,CAC5D,oCAiBM,SAAoCA,GACxC,SAA2B9B,SAAS8B,EACtC"}
1
+ {"version":3,"file":"index-2088095e.js","sources":["../src/common.ts","../src/illustrations/Illustration.tsx","../src/illustrations/metadata.ts","../src/illustrations3d/utils.ts","../src/illustrations3d/Illustration3d.tsx","../src/flags/Flag.tsx"],"sourcesContent":["export enum Sizes {\n SMALL = 'small',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n\nexport const ImageSizes = {\n [Sizes.SMALL]: 200,\n [Sizes.MEDIUM]: 300,\n [Sizes.LARGE]: 500,\n};\n\nexport type LargeSize = 'large';\nexport type MediumSize = 'medium';\nexport type SmallSize = 'small';\n\nexport type Descriptors = '1x' | '1.5x' | '2x' | '3x' | '4x';\n","import classNames from 'classnames';\nimport React, { forwardRef, ImgHTMLAttributes } from 'react';\n\nimport { LargeSize, MediumSize, SmallSize, Descriptors, Sizes } from './../common';\nimport { IllustrationNames } from './metadata';\n\n// Picking only a few props from Image element to avoid breaking change\n// as in future underlying element might change\ntype ImgProps = Pick<ImgHTMLAttributes<HTMLImageElement>, 'id' | 'className'>;\n\nexport type IllustrationSizes = LargeSize | MediumSize | SmallSize;\n\nexport type Props = {\n name: IllustrationNames;\n alt: string;\n size?: IllustrationSizes;\n loading?: 'eager' | 'lazy';\n disablePadding?: boolean;\n} & ImgProps;\n\nconst imageSizes = {\n [Sizes.SMALL]: 200,\n [Sizes.MEDIUM]: 300,\n [Sizes.LARGE]: 500,\n};\n\nconst Illustration = forwardRef<HTMLImageElement, Props>(\n (\n {\n id,\n name,\n alt,\n loading = 'eager',\n className,\n size = Sizes.MEDIUM,\n disablePadding = false,\n }: Props,\n ref,\n ) => {\n const { SMALL, MEDIUM } = Sizes;\n\n return name ? (\n <picture>\n {size === Sizes.LARGE || size === Sizes.MEDIUM ? (\n <>\n <source\n width={imageSizes[SMALL]}\n height={imageSizes[SMALL]}\n media=\"(max-width: 575px)\"\n srcSet={`${defineSrc(name, SMALL, '1x')}, ${defineSrc(name, SMALL, '2x')} 2x`}\n />\n {size !== Sizes.MEDIUM ? (\n <source\n width={imageSizes[MEDIUM]}\n height={imageSizes[MEDIUM]}\n media=\"(max-width: 992px)\"\n srcSet={`${defineSrc(name, MEDIUM, '1x')}, ${defineSrc(name, MEDIUM, '2x')} 2x`}\n />\n ) : null}\n </>\n ) : null}\n\n <img\n id={id}\n ref={ref}\n alt={alt ?? name.replace('-', ' ')}\n data-testid={`wds-${name}-illustration`}\n className={classNames(\n 'wds-illustration',\n `wds-illustration-${name}`,\n { 'wds-illustration-padding': !disablePadding },\n className,\n )}\n loading={loading}\n src={defineSrc(name, size, '1x')}\n srcSet={`${defineSrc(name, size, '2x')} 2x`}\n width={imageSizes[size]}\n height={imageSizes[size]}\n />\n </picture>\n ) : null;\n },\n);\n\nfunction defineSrc(illustration: string, size: IllustrationSizes, descriptor: Descriptors) {\n return `https://wise.com/web-art/assets/illustrations/${illustration}-${size}@${descriptor}.webp`;\n}\n\nexport default Illustration;\n","/*\n *\n * DON'T MODIFY THIS FILE IT'S AUTO GENERATED\n * See: `scripts/generate-i10s-metadata.mjs`\n *\n */\n\nexport enum Assets {\n BELL = 'bell',\n BRIEFCASE = 'briefcase',\n BUSINESS_CARD = 'business-card',\n CALENDAR = 'calendar',\n CHECK_MARK = 'check-mark',\n CLOSED_WINDOW = 'closed-window',\n COIN_PILE_DOWN = 'coin-pile-down',\n COIN_PILE_UP = 'coin-pile-up',\n CONFETTI = 'confetti',\n CONSTRUCTION_FENCE = 'construction-fence',\n CONVERT = 'convert',\n COOKIE = 'cookie',\n DIGITAL_CARD_2 = 'digital-card-2',\n DIGITAL_CARD = 'digital-card',\n DOCUMENTS = 'documents',\n DOOR = 'door',\n ECO_CARD = 'eco-card',\n ELECTRIC_PLUG = 'electric-plug',\n EMAIL_SUCCESS = 'email-success',\n EMAIL = 'email',\n EXCLAMATION_MARK = 'exclamation-mark',\n FLAG = 'flag',\n FLOWER = 'flower',\n GEAR = 'gear',\n GLOBE = 'globe',\n GRAPH = 'graph',\n HEART_2 = 'heart-2',\n HEART_3 = 'heart-3',\n HEART_4 = 'heart-4',\n HEART_5 = 'heart-5',\n HEART = 'heart',\n HOUSE = 'house',\n ID_CARD = 'id-card',\n INFINITE = 'infinite',\n INVITE_LETTER = 'invite-letter',\n JARS = 'jars',\n KEY = 'key',\n LIGHT_BULB = 'light-bulb',\n LOCK = 'lock',\n MAGNIFYING_GLASS = 'magnifying-glass',\n MAP = 'map',\n MARBLE_CARD_BUSINESS = 'marble-card-business',\n MARBLE_CARD = 'marble-card',\n MARBLE = 'marble',\n MEGAPHONE = 'megaphone',\n MULTI_CURRENCY = 'multi-currency',\n ONE_INVITE_LETTER_OPENED = 'one-invite-letter-opened',\n PALM_TREE = 'palm-tree',\n PERCENTAGE = 'percentage',\n PERSONAL_CARD = 'personal-card',\n PHONES = 'phones',\n PIE_CHART = 'pie-chart',\n PLANE_2 = 'plane-2',\n PLANE = 'plane',\n PUZZLE_PIECES = 'puzzle-pieces',\n QUESTION_MARK = 'question-mark',\n RECEIVE = 'receive',\n REMINDER_LETTER = 'reminder-letter',\n SAND_TIMER = 'sand-timer',\n SHOPPING_BAG = 'shopping-bag',\n SKIP_AUTHENTICATION = 'skip-authentication',\n SPEECH_BUBBLE = 'speech-bubble',\n TOOL = 'tool',\n TWO_INVITE_LETTERS_OPENED = 'two-invite-letters-opened',\n WALLET = 'wallet',\n}\n\nexport type IllustrationNames =\n | 'bell'\n | 'briefcase'\n | 'business-card'\n | 'calendar'\n | 'check-mark'\n | 'closed-window'\n | 'coin-pile-down'\n | 'coin-pile-up'\n | 'confetti'\n | 'construction-fence'\n | 'convert'\n | 'cookie'\n | 'digital-card-2'\n | 'digital-card'\n | 'documents'\n | 'door'\n | 'eco-card'\n | 'electric-plug'\n | 'email-success'\n | 'email'\n | 'exclamation-mark'\n | 'flag'\n | 'flower'\n | 'gear'\n | 'globe'\n | 'graph'\n | 'heart-2'\n | 'heart-3'\n | 'heart-4'\n | 'heart-5'\n | 'heart'\n | 'house'\n | 'id-card'\n | 'infinite'\n | 'invite-letter'\n | 'jars'\n | 'key'\n | 'light-bulb'\n | 'lock'\n | 'magnifying-glass'\n | 'map'\n | 'marble-card-business'\n | 'marble-card'\n | 'marble'\n | 'megaphone'\n | 'multi-currency'\n | 'one-invite-letter-opened'\n | 'palm-tree'\n | 'percentage'\n | 'personal-card'\n | 'phones'\n | 'pie-chart'\n | 'plane-2'\n | 'plane'\n | 'puzzle-pieces'\n | 'question-mark'\n | 'receive'\n | 'reminder-letter'\n | 'sand-timer'\n | 'shopping-bag'\n | 'skip-authentication'\n | 'speech-bubble'\n | 'tool'\n | 'two-invite-letters-opened'\n | 'wallet';\n","import { useState, useEffect } from 'react';\n\nimport { IllustrationNames } from '../illustrations/metadata';\n\nexport function useBattery() {\n const [batteryData, setBatteryData] = useState<{ level: number }>({ level: 1.0 });\n\n useEffect(() => {\n const getBatteryData = async () => {\n // @ts-expect-error .getBattery exists in Navigator interface\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const battery = await navigator.getBattery();\n\n setBatteryData({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n level: battery?.level,\n });\n };\n // Check if the browser supports the Battery API\n if ('getBattery' in navigator) {\n void getBatteryData();\n }\n }, []);\n\n return batteryData;\n}\n\nexport function isBatteryLow(batteryLevel: number): boolean {\n return batteryLevel < 0.2;\n}\n\nexport function isConnectionSlow(): boolean {\n // @ts-expect-error .connection prop exists in Navigator interface\n const { connection } = window.navigator;\n if (connection === undefined) {\n return false;\n }\n return (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n ['slow-2g', '2g'].includes(connection?.effectiveType as string) ||\n // @ts-expect-error Property 'connection' does exist on type 'Navigator'\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n navigator?.connection?.saveData === true\n );\n}\n\nexport function defineSrc(asset: string): string {\n return `https://wise.com/web-art/assets/illustrations3d/${asset}`;\n}\n\nconst illustration3dNames = [\n 'lock',\n 'globe',\n 'confetti',\n 'check-mark',\n 'flower',\n 'graph',\n 'jars',\n 'magnifying-glass',\n 'marble',\n 'marble-card',\n 'multi-currency',\n 'plane',\n];\n\nexport function is3dIllustrationSupported(asset: IllustrationNames): boolean {\n return illustration3dNames.includes(asset);\n}\n","/* eslint-disable fp/no-mutation */\nimport classNames from 'classnames';\nimport React, { lazy, Suspense, useEffect, useState, LazyExoticComponent } from 'react';\n\nimport { LargeSize, MediumSize, SmallSize, Sizes } from '../common';\n\nimport Illustration, { Assets } from './../illustrations';\nimport { useBattery, isConnectionSlow, isBatteryLow } from './utils';\n\nexport type Illustration3dNames =\n | 'lock'\n | 'globe'\n | 'confetti'\n | 'check-mark'\n | 'flower'\n | 'graph'\n | 'jars'\n | 'magnifying-glass'\n | 'marble'\n | 'marble-card'\n | 'multi-currency'\n | 'plane';\n\nexport type Props = {\n name: Illustration3dNames;\n size?: SmallSize | MediumSize | LargeSize;\n className?: string;\n};\n\nenum RenderMode {\n INIT,\n FALLBACK,\n ASSET_3D,\n}\n\nconst Illustration3d = ({ name, size = Sizes.MEDIUM, className }: Props) => {\n const [renderMode, setRenderMode] = useState<RenderMode>(RenderMode.INIT);\n const [inintrinsicSize, setInintrinsicSize] = useState<Props['size']>(size);\n const batteryData = useBattery();\n\n useEffect(() => {\n setRenderMode(\n isConnectionSlow() || isBatteryLow(batteryData.level)\n ? RenderMode.FALLBACK\n : RenderMode.ASSET_3D,\n );\n const isMobile: boolean =\n (typeof window !== undefined && window?.matchMedia('(max-width: 575px)')?.matches) ?? false;\n if (isMobile) {\n setInintrinsicSize(Sizes.SMALL);\n }\n }, [batteryData]);\n\n return (\n <div\n className={classNames(\n 'wds-illustration-3d',\n `wds-illustration-3d-${name}`,\n `wds-illustration-3d-${inintrinsicSize as string}`,\n className,\n )}\n >\n {renderMode === RenderMode.INIT ? null : renderMode === RenderMode.ASSET_3D ? (\n <Suspense fallback={null}>{getModel({ name, size: inintrinsicSize })}</Suspense>\n ) : (\n <Illustration name={name} size={size} alt=\"\" />\n )}\n </div>\n );\n};\n\nfunction getModel({ name, size }: Props) {\n // @ts-expect-error unknown generic\n let Model: LazyExoticComponent = <></>;\n const Scene = lazy(() => import('./Scene'));\n switch (name) {\n case Assets.LOCK: {\n Model = lazy(() => import('./LockModel'));\n break;\n }\n case Assets.GLOBE: {\n Model = lazy(() => import('./GlobeModel'));\n break;\n }\n case Assets.CONFETTI: {\n Model = lazy(() => import('./ConfettiModel'));\n break;\n }\n case Assets.CHECK_MARK: {\n Model = lazy(() => import('./CheckMarkModel'));\n break;\n }\n case Assets.FLOWER: {\n Model = lazy(() => import('./FlowerModel'));\n break;\n }\n case Assets.PLANE: {\n Model = lazy(() => import('./PlaneModel'));\n break;\n }\n case Assets.GRAPH: {\n Model = lazy(() => import('./GraphModel'));\n break;\n }\n case Assets.MARBLE: {\n Model = lazy(() => import('./MarbleModel'));\n break;\n }\n case Assets.MARBLE_CARD: {\n Model = lazy(() => import('./MarbleCardModel'));\n break;\n }\n case Assets.MAGNIFYING_GLASS: {\n Model = lazy(() => import('./MagnifyingGlassModel'));\n break;\n }\n case Assets.JARS: {\n Model = lazy(() => import('./JarsModel'));\n break;\n }\n case Assets.MULTI_CURRENCY: {\n Model = lazy(() => import('./MultiCurrencyModel'));\n break;\n }\n }\n return (\n <Scene assetName={name} size={size}>\n <Model />\n </Scene>\n );\n}\n\nexport default Illustration3d;\n","import { useEffect, useState } from 'react';\n\nexport interface FlagProps {\n /**\n * Two-letter country code (ISO 3166-1 alpha-2) or three-letter currency code (ISO 4217).\n */\n code: string;\n\n /**\n * Width and height to reserve for the underlying image, in pixels. A detailed variant is shown from 150px and above.\n */\n intrinsicSize?: number;\n}\n\nconst unknownFlagName = 'wise';\n\nexport const Flag = ({ code, intrinsicSize = 64 }: FlagProps) => {\n const [fallback, setFallback] = useState<'simple' | 'unknown' | null>(null);\n useEffect(() => {\n setFallback(null);\n }, [code]);\n\n const detailed = intrinsicSize >= 150;\n const name =\n fallback !== 'unknown'\n ? `${code.toLowerCase()}${fallback == null && detailed ? '-detailed' : ''}`\n : unknownFlagName;\n\n return (\n <img\n src={`https://wise.com/web-art/assets/flags/${name}.svg`}\n alt=\"\"\n width={intrinsicSize}\n height={intrinsicSize}\n onError={() => {\n setFallback((prev) => (prev == null && detailed ? 'simple' : 'unknown'));\n }}\n />\n );\n};\n"],"names":["_ImageSizes","Sizes","ImageSizes","_imageSizes","Assets","SMALL","MEDIUM","LARGE","imageSizes","Illustration","forwardRef","ref","id","name","_ref","alt","loading","_ref$loading","className","size","_ref$size","disablePadding","_ref$disablePadding","React","createElement","Fragment","width","height","media","srcSet","defineSrc","replace","classNames","src","illustration","descriptor","RenderMode","code","intrinsicSize","_ref$intrinsicSize","_useState","useState","fallback","setFallback","useEffect","detailed","toLowerCase","onError","prev","INIT","renderMode","setRenderMode","_useState2","inintrinsicSize","setInintrinsicSize","batteryData","level","setBatteryData","navigator","getBattery","then","battery","e","Promise","reject","useBattery","_ref2","_window","_window$matchMedia","connection","undefined","window","includes","effectiveType","_navigator","_navigator$connection","saveData","FALLBACK","ASSET_3D","matchMedia","matches","Suspense","_ref3","Model","Scene","lazy","resolve","require","LOCK","GLOBE","CONFETTI","CHECK_MARK","FLOWER","PLANE","GRAPH","MARBLE","MARBLE_CARD","MAGNIFYING_GLASS","JARS","MULTI_CURRENCY","assetName","getModel","asset"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index-b0658eec.js","sources":["../src/flags/Flag.tsx","../src/common.ts","../src/illustrations/Illustration.tsx","../src/illustrations/metadata.ts","../src/illustrations3d/utils.ts","../src/illustrations3d/Illustration3d.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport interface FlagProps {\n /**\n * Two-letter country code (ISO 3166-1 alpha-2) or three-letter currency code (ISO 4217).\n */\n code: string;\n\n /**\n * Width and height to reserve for the underlying image, in pixels. A detailed variant is shown from 150px and above.\n */\n intrinsicSize?: number;\n}\n\nconst unknownFlagName = 'wise';\n\nexport const Flag = ({ code, intrinsicSize = 64 }: FlagProps) => {\n const [fallback, setFallback] = useState<'simple' | 'unknown' | null>(null);\n useEffect(() => {\n setFallback(null);\n }, [code]);\n\n const detailed = intrinsicSize >= 150;\n const name =\n fallback !== 'unknown'\n ? `${code.toLowerCase()}${fallback == null && detailed ? '-detailed' : ''}`\n : unknownFlagName;\n\n return (\n <img\n src={`https://wise.com/web-art/assets/flags/${name}.svg`}\n alt=\"\"\n width={intrinsicSize}\n height={intrinsicSize}\n onError={() => {\n setFallback((prev) => (prev == null && detailed ? 'simple' : 'unknown'));\n }}\n />\n );\n};\n","export enum Sizes {\n SMALL = 'small',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n\nexport const ImageSizes = {\n [Sizes.SMALL]: 200,\n [Sizes.MEDIUM]: 300,\n [Sizes.LARGE]: 500,\n};\n\nexport type LargeSize = 'large';\nexport type MediumSize = 'medium';\nexport type SmallSize = 'small';\n\nexport type Descriptors = '1x' | '1.5x' | '2x' | '3x' | '4x';\n","import classNames from 'classnames';\nimport React, { forwardRef, ImgHTMLAttributes } from 'react';\n\nimport { LargeSize, MediumSize, SmallSize, Descriptors, Sizes } from './../common';\nimport { IllustrationNames } from './metadata';\n\n// Picking only a few props from Image element to avoid breaking change\n// as in future underlying element might change\ntype ImgProps = Pick<ImgHTMLAttributes<HTMLImageElement>, 'id' | 'className'>;\n\nexport type IllustrationSizes = LargeSize | MediumSize | SmallSize;\n\nexport type Props = {\n name: IllustrationNames;\n alt: string;\n size?: IllustrationSizes;\n loading?: 'eager' | 'lazy';\n disablePadding?: boolean;\n} & ImgProps;\n\nconst imageSizes = {\n [Sizes.SMALL]: 200,\n [Sizes.MEDIUM]: 300,\n [Sizes.LARGE]: 500,\n};\n\nconst Illustration = forwardRef<HTMLImageElement, Props>(\n (\n {\n id,\n name,\n alt,\n loading = 'eager',\n className,\n size = Sizes.MEDIUM,\n disablePadding = false,\n }: Props,\n ref,\n ) => {\n const { SMALL, MEDIUM } = Sizes;\n\n return name ? (\n <picture>\n {size === Sizes.LARGE || size === Sizes.MEDIUM ? (\n <>\n <source\n width={imageSizes[SMALL]}\n height={imageSizes[SMALL]}\n media=\"(max-width: 575px)\"\n srcSet={`${defineSrc(name, SMALL, '1x')}, ${defineSrc(name, SMALL, '2x')} 2x`}\n />\n {size !== Sizes.MEDIUM ? (\n <source\n width={imageSizes[MEDIUM]}\n height={imageSizes[MEDIUM]}\n media=\"(max-width: 992px)\"\n srcSet={`${defineSrc(name, MEDIUM, '1x')}, ${defineSrc(name, MEDIUM, '2x')} 2x`}\n />\n ) : null}\n </>\n ) : null}\n\n <img\n id={id}\n ref={ref}\n alt={alt ?? name.replace('-', ' ')}\n data-testid={`wds-${name}-illustration`}\n className={classNames(\n 'wds-illustration',\n `wds-illustration-${name}`,\n { 'wds-illustration-padding': !disablePadding },\n className,\n )}\n loading={loading}\n src={defineSrc(name, size, '1x')}\n srcSet={`${defineSrc(name, size, '2x')} 2x`}\n width={imageSizes[size]}\n height={imageSizes[size]}\n />\n </picture>\n ) : null;\n },\n);\n\nfunction defineSrc(illustration: string, size: IllustrationSizes, descriptor: Descriptors) {\n return `https://wise.com/web-art/assets/illustrations/${illustration}-${size}@${descriptor}.webp`;\n}\n\nexport default Illustration;\n","/*\n *\n * DON'T MODIFY THIS FILE IT'S AUTO GENERATED\n * See: `scripts/generate-i10s-metadata.mjs`\n *\n */\n\nexport enum Assets {\n BELL = 'bell',\n BRIEFCASE = 'briefcase',\n BUSINESS_CARD = 'business-card',\n CALENDAR = 'calendar',\n CHECK_MARK = 'check-mark',\n CLOSED_WINDOW = 'closed-window',\n COIN_PILE_DOWN = 'coin-pile-down',\n COIN_PILE_UP = 'coin-pile-up',\n CONFETTI = 'confetti',\n CONSTRUCTION_FENCE = 'construction-fence',\n CONVERT = 'convert',\n COOKIE = 'cookie',\n DIGITAL_CARD_2 = 'digital-card-2',\n DIGITAL_CARD = 'digital-card',\n DOCUMENTS = 'documents',\n DOOR = 'door',\n ECO_CARD = 'eco-card',\n ELECTRIC_PLUG = 'electric-plug',\n EMAIL_SUCCESS = 'email-success',\n EMAIL = 'email',\n EXCLAMATION_MARK = 'exclamation-mark',\n FLAG = 'flag',\n FLOWER = 'flower',\n GEAR = 'gear',\n GLOBE = 'globe',\n GRAPH = 'graph',\n HEART_2 = 'heart-2',\n HEART_3 = 'heart-3',\n HEART_4 = 'heart-4',\n HEART_5 = 'heart-5',\n HEART = 'heart',\n HOUSE = 'house',\n ID_CARD = 'id-card',\n INFINITE = 'infinite',\n INVITE_LETTER = 'invite-letter',\n JARS = 'jars',\n KEY = 'key',\n LIGHT_BULB = 'light-bulb',\n LOCK = 'lock',\n MAGNIFYING_GLASS = 'magnifying-glass',\n MAP = 'map',\n MARBLE_CARD_BUSINESS = 'marble-card-business',\n MARBLE_CARD = 'marble-card',\n MARBLE = 'marble',\n MEGAPHONE = 'megaphone',\n MULTI_CURRENCY = 'multi-currency',\n ONE_INVITE_LETTER_OPENED = 'one-invite-letter-opened',\n PALM_TREE = 'palm-tree',\n PERCENTAGE = 'percentage',\n PERSONAL_CARD = 'personal-card',\n PHONES = 'phones',\n PIE_CHART = 'pie-chart',\n PLANE_2 = 'plane-2',\n PLANE = 'plane',\n PUZZLE_PIECES = 'puzzle-pieces',\n QUESTION_MARK = 'question-mark',\n RECEIVE = 'receive',\n REMINDER_LETTER = 'reminder-letter',\n SAND_TIMER = 'sand-timer',\n SHOPPING_BAG = 'shopping-bag',\n SKIP_AUTHENTICATION = 'skip-authentication',\n SPEECH_BUBBLE = 'speech-bubble',\n TOOL = 'tool',\n TWO_INVITE_LETTERS_OPENED = 'two-invite-letters-opened',\n WALLET = 'wallet',\n}\n\nexport type IllustrationNames =\n | 'bell'\n | 'briefcase'\n | 'business-card'\n | 'calendar'\n | 'check-mark'\n | 'closed-window'\n | 'coin-pile-down'\n | 'coin-pile-up'\n | 'confetti'\n | 'construction-fence'\n | 'convert'\n | 'cookie'\n | 'digital-card-2'\n | 'digital-card'\n | 'documents'\n | 'door'\n | 'eco-card'\n | 'electric-plug'\n | 'email-success'\n | 'email'\n | 'exclamation-mark'\n | 'flag'\n | 'flower'\n | 'gear'\n | 'globe'\n | 'graph'\n | 'heart-2'\n | 'heart-3'\n | 'heart-4'\n | 'heart-5'\n | 'heart'\n | 'house'\n | 'id-card'\n | 'infinite'\n | 'invite-letter'\n | 'jars'\n | 'key'\n | 'light-bulb'\n | 'lock'\n | 'magnifying-glass'\n | 'map'\n | 'marble-card-business'\n | 'marble-card'\n | 'marble'\n | 'megaphone'\n | 'multi-currency'\n | 'one-invite-letter-opened'\n | 'palm-tree'\n | 'percentage'\n | 'personal-card'\n | 'phones'\n | 'pie-chart'\n | 'plane-2'\n | 'plane'\n | 'puzzle-pieces'\n | 'question-mark'\n | 'receive'\n | 'reminder-letter'\n | 'sand-timer'\n | 'shopping-bag'\n | 'skip-authentication'\n | 'speech-bubble'\n | 'tool'\n | 'two-invite-letters-opened'\n | 'wallet';\n","import { useState, useEffect } from 'react';\n\nimport { IllustrationNames } from '../illustrations/metadata';\n\nexport function useBattery() {\n const [batteryData, setBatteryData] = useState<{ level: number }>({ level: 1.0 });\n\n useEffect(() => {\n const getBatteryData = async () => {\n // @ts-expect-error .getBattery exists in Navigator interface\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const battery = await navigator.getBattery();\n\n setBatteryData({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n level: battery?.level,\n });\n };\n // Check if the browser supports the Battery API\n if ('getBattery' in navigator) {\n void getBatteryData();\n }\n }, []);\n\n return batteryData;\n}\n\nexport function isBatteryLow(batteryLevel: number): boolean {\n return batteryLevel < 0.2;\n}\n\nexport function isConnectionSlow(): boolean {\n // @ts-expect-error .connection prop exists in Navigator interface\n const { connection } = window.navigator;\n if (connection === undefined) {\n return false;\n }\n return (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n ['slow-2g', '2g'].includes(connection?.effectiveType as string) ||\n // @ts-expect-error Property 'connection' does exist on type 'Navigator'\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n navigator?.connection?.saveData === true\n );\n}\n\nexport function defineSrc(asset: string): string {\n return `https://wise.com/web-art/assets/illustrations3d/${asset}`;\n}\n\nconst illustration3dNames = [\n 'lock',\n 'globe',\n 'confetti',\n 'check-mark',\n 'flower',\n 'graph',\n 'jars',\n 'magnifying-glass',\n 'marble',\n 'marble-card',\n 'multi-currency',\n 'plane',\n];\n\nexport function is3dIllustrationSupported(asset: IllustrationNames): boolean {\n return illustration3dNames.includes(asset);\n}\n","/* eslint-disable fp/no-mutation */\n/* eslint-disable react/forbid-dom-props */\n/* eslint-disable react/destructuring-assignment */\n/* eslint-disable @typescript-eslint/restrict-template-expressions */\nimport classNames from 'classnames';\nimport React, { lazy, Suspense, useEffect, useState, LazyExoticComponent } from 'react';\n\nimport { LargeSize, MediumSize, SmallSize, Sizes } from '../common';\n\nimport Illustration, { Assets } from './../illustrations';\nimport { useBattery, isConnectionSlow, isBatteryLow } from './utils';\n\nexport type Illustration3dNames =\n | 'lock'\n | 'globe'\n | 'confetti'\n | 'check-mark'\n | 'flower'\n | 'graph'\n | 'jars'\n | 'magnifying-glass'\n | 'marble'\n | 'marble-card'\n | 'multi-currency'\n | 'plane';\n\nexport type Props = {\n name: Illustration3dNames;\n size?: SmallSize | MediumSize | LargeSize;\n className?: string;\n};\n\nenum RenderMode {\n INIT,\n FALLBACK,\n ASSET_3D,\n}\n\nconst Illustration3d = ({ name, size = Sizes.MEDIUM, className }: Props) => {\n const [renderMode, setRenderMode] = useState<RenderMode>(RenderMode.INIT);\n const [inintrinsicSize, setInintrinsicSize] = useState<Props['size']>(size);\n const batteryData = useBattery();\n\n useEffect(() => {\n setRenderMode(\n isConnectionSlow() || isBatteryLow(batteryData.level)\n ? RenderMode.FALLBACK\n : RenderMode.ASSET_3D,\n );\n const isMobile: boolean =\n (typeof window !== undefined && window?.matchMedia('(max-width: 575px)')?.matches) ?? false;\n if (isMobile) {\n setInintrinsicSize(Sizes.SMALL);\n }\n }, [batteryData]);\n\n return (\n <div\n className={classNames(\n 'wds-illustration-3d',\n `wds-illustration-3d-${name}`,\n `wds-illustration-3d-${inintrinsicSize}`,\n className,\n )}\n >\n {renderMode === RenderMode.INIT ? null : renderMode === RenderMode.ASSET_3D ? (\n <Suspense fallback={null}>{getModel({ name, size: inintrinsicSize })}</Suspense>\n ) : (\n <Illustration name={name} size={size} alt=\"\" />\n )}\n </div>\n );\n};\n\nfunction getModel({ name, size }: Props) {\n // @ts-expect-error unknown generic\n let Model: LazyExoticComponent = <></>;\n const Scene = lazy(() => import('./Scene'));\n switch (name) {\n case Assets.LOCK: {\n Model = lazy(() => import('./LockModel'));\n break;\n }\n case Assets.GLOBE: {\n Model = lazy(() => import('./GlobeModel'));\n break;\n }\n case Assets.CONFETTI: {\n Model = lazy(() => import('./ConfettiModel'));\n break;\n }\n case Assets.CHECK_MARK: {\n Model = lazy(() => import('./CheckMarkModel'));\n break;\n }\n case Assets.FLOWER: {\n Model = lazy(() => import('./FlowerModel'));\n break;\n }\n case Assets.PLANE: {\n Model = lazy(() => import('./PlaneModel'));\n break;\n }\n case Assets.GRAPH: {\n Model = lazy(() => import('./GraphModel'));\n break;\n }\n case Assets.MARBLE: {\n Model = lazy(() => import('./MarbleModel'));\n break;\n }\n case Assets.MARBLE_CARD: {\n Model = lazy(() => import('./MarbleCardModel'));\n break;\n }\n case Assets.MAGNIFYING_GLASS: {\n Model = lazy(() => import('./MagnifyingGlassModel'));\n break;\n }\n case Assets.JARS: {\n Model = lazy(() => import('./JarsModel'));\n break;\n }\n case Assets.MULTI_CURRENCY: {\n Model = lazy(() => import('./MultiCurrencyModel'));\n break;\n }\n }\n return (\n <Scene assetName={name} size={size}>\n <Model />\n </Scene>\n );\n}\n\nexport default Illustration3d;\n"],"names":["_ImageSizes","Sizes","Flag","_ref","code","intrinsicSize","_ref$intrinsicSize","_useState","useState","fallback","setFallback","useEffect","detailed","name","toLowerCase","React","createElement","src","alt","width","height","onError","prev","ImageSizes","_imageSizes","Assets","SMALL","MEDIUM","LARGE","imageSizes","Illustration","forwardRef","ref","id","loading","_ref$loading","className","size","_ref$size","disablePadding","_ref$disablePadding","Fragment","media","srcSet","defineSrc","replace","classNames","illustration","descriptor","asset","RenderMode","includes","Illustration3d","INIT","renderMode","setRenderMode","_useState2","inintrinsicSize","setInintrinsicSize","batteryData","level","setBatteryData","navigator","getBattery","then","battery","e","Promise","reject","useBattery","_ref2","_window","_window$matchMedia","connection","undefined","window","effectiveType","_navigator","_navigator$connection","saveData","FALLBACK","ASSET_3D","matchMedia","matches","Suspense","_ref3","Model","Scene","lazy","import","LOCK","GLOBE","CONFETTI","CHECK_MARK","FLOWER","PLANE","GRAPH","MARBLE","MARBLE_CARD","MAGNIFYING_GLASS","JARS","MULTI_CURRENCY","assetName","getModel"],"mappings":"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"}
1
+ {"version":3,"file":"index-b0658eec.js","sources":["../src/flags/Flag.tsx","../src/common.ts","../src/illustrations/Illustration.tsx","../src/illustrations/metadata.ts","../src/illustrations3d/utils.ts","../src/illustrations3d/Illustration3d.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport interface FlagProps {\n /**\n * Two-letter country code (ISO 3166-1 alpha-2) or three-letter currency code (ISO 4217).\n */\n code: string;\n\n /**\n * Width and height to reserve for the underlying image, in pixels. A detailed variant is shown from 150px and above.\n */\n intrinsicSize?: number;\n}\n\nconst unknownFlagName = 'wise';\n\nexport const Flag = ({ code, intrinsicSize = 64 }: FlagProps) => {\n const [fallback, setFallback] = useState<'simple' | 'unknown' | null>(null);\n useEffect(() => {\n setFallback(null);\n }, [code]);\n\n const detailed = intrinsicSize >= 150;\n const name =\n fallback !== 'unknown'\n ? `${code.toLowerCase()}${fallback == null && detailed ? '-detailed' : ''}`\n : unknownFlagName;\n\n return (\n <img\n src={`https://wise.com/web-art/assets/flags/${name}.svg`}\n alt=\"\"\n width={intrinsicSize}\n height={intrinsicSize}\n onError={() => {\n setFallback((prev) => (prev == null && detailed ? 'simple' : 'unknown'));\n }}\n />\n );\n};\n","export enum Sizes {\n SMALL = 'small',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n\nexport const ImageSizes = {\n [Sizes.SMALL]: 200,\n [Sizes.MEDIUM]: 300,\n [Sizes.LARGE]: 500,\n};\n\nexport type LargeSize = 'large';\nexport type MediumSize = 'medium';\nexport type SmallSize = 'small';\n\nexport type Descriptors = '1x' | '1.5x' | '2x' | '3x' | '4x';\n","import classNames from 'classnames';\nimport React, { forwardRef, ImgHTMLAttributes } from 'react';\n\nimport { LargeSize, MediumSize, SmallSize, Descriptors, Sizes } from './../common';\nimport { IllustrationNames } from './metadata';\n\n// Picking only a few props from Image element to avoid breaking change\n// as in future underlying element might change\ntype ImgProps = Pick<ImgHTMLAttributes<HTMLImageElement>, 'id' | 'className'>;\n\nexport type IllustrationSizes = LargeSize | MediumSize | SmallSize;\n\nexport type Props = {\n name: IllustrationNames;\n alt: string;\n size?: IllustrationSizes;\n loading?: 'eager' | 'lazy';\n disablePadding?: boolean;\n} & ImgProps;\n\nconst imageSizes = {\n [Sizes.SMALL]: 200,\n [Sizes.MEDIUM]: 300,\n [Sizes.LARGE]: 500,\n};\n\nconst Illustration = forwardRef<HTMLImageElement, Props>(\n (\n {\n id,\n name,\n alt,\n loading = 'eager',\n className,\n size = Sizes.MEDIUM,\n disablePadding = false,\n }: Props,\n ref,\n ) => {\n const { SMALL, MEDIUM } = Sizes;\n\n return name ? (\n <picture>\n {size === Sizes.LARGE || size === Sizes.MEDIUM ? (\n <>\n <source\n width={imageSizes[SMALL]}\n height={imageSizes[SMALL]}\n media=\"(max-width: 575px)\"\n srcSet={`${defineSrc(name, SMALL, '1x')}, ${defineSrc(name, SMALL, '2x')} 2x`}\n />\n {size !== Sizes.MEDIUM ? (\n <source\n width={imageSizes[MEDIUM]}\n height={imageSizes[MEDIUM]}\n media=\"(max-width: 992px)\"\n srcSet={`${defineSrc(name, MEDIUM, '1x')}, ${defineSrc(name, MEDIUM, '2x')} 2x`}\n />\n ) : null}\n </>\n ) : null}\n\n <img\n id={id}\n ref={ref}\n alt={alt ?? name.replace('-', ' ')}\n data-testid={`wds-${name}-illustration`}\n className={classNames(\n 'wds-illustration',\n `wds-illustration-${name}`,\n { 'wds-illustration-padding': !disablePadding },\n className,\n )}\n loading={loading}\n src={defineSrc(name, size, '1x')}\n srcSet={`${defineSrc(name, size, '2x')} 2x`}\n width={imageSizes[size]}\n height={imageSizes[size]}\n />\n </picture>\n ) : null;\n },\n);\n\nfunction defineSrc(illustration: string, size: IllustrationSizes, descriptor: Descriptors) {\n return `https://wise.com/web-art/assets/illustrations/${illustration}-${size}@${descriptor}.webp`;\n}\n\nexport default Illustration;\n","/*\n *\n * DON'T MODIFY THIS FILE IT'S AUTO GENERATED\n * See: `scripts/generate-i10s-metadata.mjs`\n *\n */\n\nexport enum Assets {\n BELL = 'bell',\n BRIEFCASE = 'briefcase',\n BUSINESS_CARD = 'business-card',\n CALENDAR = 'calendar',\n CHECK_MARK = 'check-mark',\n CLOSED_WINDOW = 'closed-window',\n COIN_PILE_DOWN = 'coin-pile-down',\n COIN_PILE_UP = 'coin-pile-up',\n CONFETTI = 'confetti',\n CONSTRUCTION_FENCE = 'construction-fence',\n CONVERT = 'convert',\n COOKIE = 'cookie',\n DIGITAL_CARD_2 = 'digital-card-2',\n DIGITAL_CARD = 'digital-card',\n DOCUMENTS = 'documents',\n DOOR = 'door',\n ECO_CARD = 'eco-card',\n ELECTRIC_PLUG = 'electric-plug',\n EMAIL_SUCCESS = 'email-success',\n EMAIL = 'email',\n EXCLAMATION_MARK = 'exclamation-mark',\n FLAG = 'flag',\n FLOWER = 'flower',\n GEAR = 'gear',\n GLOBE = 'globe',\n GRAPH = 'graph',\n HEART_2 = 'heart-2',\n HEART_3 = 'heart-3',\n HEART_4 = 'heart-4',\n HEART_5 = 'heart-5',\n HEART = 'heart',\n HOUSE = 'house',\n ID_CARD = 'id-card',\n INFINITE = 'infinite',\n INVITE_LETTER = 'invite-letter',\n JARS = 'jars',\n KEY = 'key',\n LIGHT_BULB = 'light-bulb',\n LOCK = 'lock',\n MAGNIFYING_GLASS = 'magnifying-glass',\n MAP = 'map',\n MARBLE_CARD_BUSINESS = 'marble-card-business',\n MARBLE_CARD = 'marble-card',\n MARBLE = 'marble',\n MEGAPHONE = 'megaphone',\n MULTI_CURRENCY = 'multi-currency',\n ONE_INVITE_LETTER_OPENED = 'one-invite-letter-opened',\n PALM_TREE = 'palm-tree',\n PERCENTAGE = 'percentage',\n PERSONAL_CARD = 'personal-card',\n PHONES = 'phones',\n PIE_CHART = 'pie-chart',\n PLANE_2 = 'plane-2',\n PLANE = 'plane',\n PUZZLE_PIECES = 'puzzle-pieces',\n QUESTION_MARK = 'question-mark',\n RECEIVE = 'receive',\n REMINDER_LETTER = 'reminder-letter',\n SAND_TIMER = 'sand-timer',\n SHOPPING_BAG = 'shopping-bag',\n SKIP_AUTHENTICATION = 'skip-authentication',\n SPEECH_BUBBLE = 'speech-bubble',\n TOOL = 'tool',\n TWO_INVITE_LETTERS_OPENED = 'two-invite-letters-opened',\n WALLET = 'wallet',\n}\n\nexport type IllustrationNames =\n | 'bell'\n | 'briefcase'\n | 'business-card'\n | 'calendar'\n | 'check-mark'\n | 'closed-window'\n | 'coin-pile-down'\n | 'coin-pile-up'\n | 'confetti'\n | 'construction-fence'\n | 'convert'\n | 'cookie'\n | 'digital-card-2'\n | 'digital-card'\n | 'documents'\n | 'door'\n | 'eco-card'\n | 'electric-plug'\n | 'email-success'\n | 'email'\n | 'exclamation-mark'\n | 'flag'\n | 'flower'\n | 'gear'\n | 'globe'\n | 'graph'\n | 'heart-2'\n | 'heart-3'\n | 'heart-4'\n | 'heart-5'\n | 'heart'\n | 'house'\n | 'id-card'\n | 'infinite'\n | 'invite-letter'\n | 'jars'\n | 'key'\n | 'light-bulb'\n | 'lock'\n | 'magnifying-glass'\n | 'map'\n | 'marble-card-business'\n | 'marble-card'\n | 'marble'\n | 'megaphone'\n | 'multi-currency'\n | 'one-invite-letter-opened'\n | 'palm-tree'\n | 'percentage'\n | 'personal-card'\n | 'phones'\n | 'pie-chart'\n | 'plane-2'\n | 'plane'\n | 'puzzle-pieces'\n | 'question-mark'\n | 'receive'\n | 'reminder-letter'\n | 'sand-timer'\n | 'shopping-bag'\n | 'skip-authentication'\n | 'speech-bubble'\n | 'tool'\n | 'two-invite-letters-opened'\n | 'wallet';\n","import { useState, useEffect } from 'react';\n\nimport { IllustrationNames } from '../illustrations/metadata';\n\nexport function useBattery() {\n const [batteryData, setBatteryData] = useState<{ level: number }>({ level: 1.0 });\n\n useEffect(() => {\n const getBatteryData = async () => {\n // @ts-expect-error .getBattery exists in Navigator interface\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const battery = await navigator.getBattery();\n\n setBatteryData({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n level: battery?.level,\n });\n };\n // Check if the browser supports the Battery API\n if ('getBattery' in navigator) {\n void getBatteryData();\n }\n }, []);\n\n return batteryData;\n}\n\nexport function isBatteryLow(batteryLevel: number): boolean {\n return batteryLevel < 0.2;\n}\n\nexport function isConnectionSlow(): boolean {\n // @ts-expect-error .connection prop exists in Navigator interface\n const { connection } = window.navigator;\n if (connection === undefined) {\n return false;\n }\n return (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n ['slow-2g', '2g'].includes(connection?.effectiveType as string) ||\n // @ts-expect-error Property 'connection' does exist on type 'Navigator'\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n navigator?.connection?.saveData === true\n );\n}\n\nexport function defineSrc(asset: string): string {\n return `https://wise.com/web-art/assets/illustrations3d/${asset}`;\n}\n\nconst illustration3dNames = [\n 'lock',\n 'globe',\n 'confetti',\n 'check-mark',\n 'flower',\n 'graph',\n 'jars',\n 'magnifying-glass',\n 'marble',\n 'marble-card',\n 'multi-currency',\n 'plane',\n];\n\nexport function is3dIllustrationSupported(asset: IllustrationNames): boolean {\n return illustration3dNames.includes(asset);\n}\n","/* eslint-disable fp/no-mutation */\nimport classNames from 'classnames';\nimport React, { lazy, Suspense, useEffect, useState, LazyExoticComponent } from 'react';\n\nimport { LargeSize, MediumSize, SmallSize, Sizes } from '../common';\n\nimport Illustration, { Assets } from './../illustrations';\nimport { useBattery, isConnectionSlow, isBatteryLow } from './utils';\n\nexport type Illustration3dNames =\n | 'lock'\n | 'globe'\n | 'confetti'\n | 'check-mark'\n | 'flower'\n | 'graph'\n | 'jars'\n | 'magnifying-glass'\n | 'marble'\n | 'marble-card'\n | 'multi-currency'\n | 'plane';\n\nexport type Props = {\n name: Illustration3dNames;\n size?: SmallSize | MediumSize | LargeSize;\n className?: string;\n};\n\nenum RenderMode {\n INIT,\n FALLBACK,\n ASSET_3D,\n}\n\nconst Illustration3d = ({ name, size = Sizes.MEDIUM, className }: Props) => {\n const [renderMode, setRenderMode] = useState<RenderMode>(RenderMode.INIT);\n const [inintrinsicSize, setInintrinsicSize] = useState<Props['size']>(size);\n const batteryData = useBattery();\n\n useEffect(() => {\n setRenderMode(\n isConnectionSlow() || isBatteryLow(batteryData.level)\n ? RenderMode.FALLBACK\n : RenderMode.ASSET_3D,\n );\n const isMobile: boolean =\n (typeof window !== undefined && window?.matchMedia('(max-width: 575px)')?.matches) ?? false;\n if (isMobile) {\n setInintrinsicSize(Sizes.SMALL);\n }\n }, [batteryData]);\n\n return (\n <div\n className={classNames(\n 'wds-illustration-3d',\n `wds-illustration-3d-${name}`,\n `wds-illustration-3d-${inintrinsicSize as string}`,\n className,\n )}\n >\n {renderMode === RenderMode.INIT ? null : renderMode === RenderMode.ASSET_3D ? (\n <Suspense fallback={null}>{getModel({ name, size: inintrinsicSize })}</Suspense>\n ) : (\n <Illustration name={name} size={size} alt=\"\" />\n )}\n </div>\n );\n};\n\nfunction getModel({ name, size }: Props) {\n // @ts-expect-error unknown generic\n let Model: LazyExoticComponent = <></>;\n const Scene = lazy(() => import('./Scene'));\n switch (name) {\n case Assets.LOCK: {\n Model = lazy(() => import('./LockModel'));\n break;\n }\n case Assets.GLOBE: {\n Model = lazy(() => import('./GlobeModel'));\n break;\n }\n case Assets.CONFETTI: {\n Model = lazy(() => import('./ConfettiModel'));\n break;\n }\n case Assets.CHECK_MARK: {\n Model = lazy(() => import('./CheckMarkModel'));\n break;\n }\n case Assets.FLOWER: {\n Model = lazy(() => import('./FlowerModel'));\n break;\n }\n case Assets.PLANE: {\n Model = lazy(() => import('./PlaneModel'));\n break;\n }\n case Assets.GRAPH: {\n Model = lazy(() => import('./GraphModel'));\n break;\n }\n case Assets.MARBLE: {\n Model = lazy(() => import('./MarbleModel'));\n break;\n }\n case Assets.MARBLE_CARD: {\n Model = lazy(() => import('./MarbleCardModel'));\n break;\n }\n case Assets.MAGNIFYING_GLASS: {\n Model = lazy(() => import('./MagnifyingGlassModel'));\n break;\n }\n case Assets.JARS: {\n Model = lazy(() => import('./JarsModel'));\n break;\n }\n case Assets.MULTI_CURRENCY: {\n Model = lazy(() => import('./MultiCurrencyModel'));\n break;\n }\n }\n return (\n <Scene assetName={name} size={size}>\n <Model />\n </Scene>\n );\n}\n\nexport default Illustration3d;\n"],"names":["_ImageSizes","Sizes","Flag","_ref","code","intrinsicSize","_ref$intrinsicSize","_useState","useState","fallback","setFallback","useEffect","detailed","name","toLowerCase","React","createElement","src","alt","width","height","onError","prev","ImageSizes","_imageSizes","Assets","SMALL","MEDIUM","LARGE","imageSizes","Illustration","forwardRef","ref","id","loading","_ref$loading","className","size","_ref$size","disablePadding","_ref$disablePadding","Fragment","media","srcSet","defineSrc","replace","classNames","illustration","descriptor","asset","RenderMode","includes","Illustration3d","INIT","renderMode","setRenderMode","_useState2","inintrinsicSize","setInintrinsicSize","batteryData","level","setBatteryData","navigator","getBattery","then","battery","e","Promise","reject","useBattery","_ref2","_window","_window$matchMedia","connection","undefined","window","effectiveType","_navigator","_navigator$connection","saveData","FALLBACK","ASSET_3D","matchMedia","matches","Suspense","_ref3","Model","Scene","lazy","import","LOCK","GLOBE","CONFETTI","CHECK_MARK","FLOWER","PLANE","GRAPH","MARBLE","MARBLE_CARD","MAGNIFYING_GLASS","JARS","MULTI_CURRENCY","assetName","getModel"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,6 @@ export { default as Illustration3d } from './illustrations3d';
4
4
  export { Assets } from './illustrations';
5
5
  export { Sizes } from './common';
6
6
  export type { FlagProps } from './flags';
7
- export type { Illustration3dNames, Illustration3dProps } from './illustrations3d';
8
7
  export type { IllustrationNames, IllustrationProps } from './illustrations';
8
+ export type { Illustration3dNames, Illustration3dProps } from './illustrations3d';
9
9
  export { is3dIllustrationSupported } from './illustrations3d';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wise/art",
3
- "version": "2.5.0-beta.6",
3
+ "version": "2.5.0-beta.7",
4
4
  "license": "MIT",
5
5
  "description": "React library for art elements in UI",
6
6
  "homepage": "https://github.com/transferwise/web-art#readme",
@@ -24,9 +24,8 @@
24
24
  "load-currency-flags": "copyfiles -u 3 node_modules/wise-atoms/flags/.metadata.json s3-bucket/flags && node ./scripts/generate-currency-flags.mjs",
25
25
  "transform-flags": "node ./scripts/transform-flags.mjs",
26
26
  "convert-flags-svg-to-png": "node ./scripts/convert-flags-svg-to-png.mjs",
27
- "convert-i10s-png-to-webp": "rm -rf s3-bucket/illustrations/ && copyfiles --f node_modules/wise-atoms/illustrations/**/*.png s3-bucket/illustrations && node ./scripts/convert-i10s-png-to-webp.mjs",
27
+ "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
28
  "generate-i10s-metadata": "node ./scripts/generate-i10s-metadata.mjs && eslint 'src/illustrations/metadata.ts' --fix",
29
- "load-3d-assets": "copyfiles -f src/gltf/*.json src/gltf/*.gltf src/gltf/*.jpg dist/gltf",
30
29
  "bundle": "rm -rf dist && microbundle --jsxFragment React.Fragment --jsx React.createElement --format es,cjs && cpx src/illustrations/Illustration.css dist/",
31
30
  "cleanup": "rm -rf temp",
32
31
  "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",
@@ -57,7 +56,7 @@
57
56
  "@types/jsdom": "^21.1.0",
58
57
  "@types/react": "^18.0.15",
59
58
  "@types/react-dom": "^18.0.6",
60
- "@types/three": "^0.155.1",
59
+ "@types/three": "^0.154.0",
61
60
  "classnames": "^2.3.1",
62
61
  "copyfiles": "^2.4.1",
63
62
  "cpx": "^1.5.0",