@transferwise/components 0.0.0-experimental-e5e0684 → 0.0.0-experimental-37d8e2c
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/build/avatar/Avatar.js +4 -1
- package/build/avatar/Avatar.js.map +1 -1
- package/build/avatar/Avatar.mjs +4 -1
- package/build/avatar/Avatar.mjs.map +1 -1
- package/build/avatar/colors/colors.js +1 -1
- package/build/avatar/colors/colors.js.map +1 -1
- package/build/avatar/colors/colors.mjs +1 -1
- package/build/avatar/colors/colors.mjs.map +1 -1
- package/build/avatarView/AvatarView.js +207 -0
- package/build/avatarView/AvatarView.js.map +1 -0
- package/build/avatarView/AvatarView.mjs +205 -0
- package/build/avatarView/AvatarView.mjs.map +1 -0
- package/build/avatarWrapper/AvatarWrapper.js +6 -9
- package/build/avatarWrapper/AvatarWrapper.js.map +1 -1
- package/build/avatarWrapper/AvatarWrapper.mjs +5 -8
- package/build/avatarWrapper/AvatarWrapper.mjs.map +1 -1
- package/build/badge/Badge.js +6 -1
- package/build/badge/Badge.js.map +1 -1
- package/build/badge/Badge.mjs +6 -1
- package/build/badge/Badge.mjs.map +1 -1
- package/build/circularButton/CircularButton.js +4 -7
- package/build/circularButton/CircularButton.js.map +1 -1
- package/build/circularButton/CircularButton.mjs +4 -7
- package/build/circularButton/CircularButton.mjs.map +1 -1
- package/build/common/circle/Circle.js +24 -1
- package/build/common/circle/Circle.js.map +1 -1
- package/build/common/circle/Circle.mjs +24 -1
- package/build/common/circle/Circle.mjs.map +1 -1
- package/build/common/initials.js +12 -0
- package/build/common/initials.js.map +1 -0
- package/build/common/initials.mjs +10 -0
- package/build/common/initials.mjs.map +1 -0
- package/build/common/notificationDot/NotificationDot.js +16 -0
- package/build/common/notificationDot/NotificationDot.js.map +1 -0
- package/build/common/notificationDot/NotificationDot.mjs +14 -0
- package/build/common/notificationDot/NotificationDot.mjs.map +1 -0
- package/build/display/Display.js +1 -1
- package/build/display/Display.js.map +1 -1
- package/build/display/Display.mjs +1 -1
- package/build/display/Display.mjs.map +1 -1
- package/build/index.js +6 -0
- package/build/index.js.map +1 -1
- package/build/index.mjs +3 -0
- package/build/index.mjs.map +1 -1
- package/build/main.css +82 -41
- package/build/statusIcon/StatusIcon.js +4 -2
- package/build/statusIcon/StatusIcon.js.map +1 -1
- package/build/statusIcon/StatusIcon.mjs +4 -2
- package/build/statusIcon/StatusIcon.mjs.map +1 -1
- package/build/styles/avatarGroup/AvatarGroup.css +28 -0
- package/build/styles/avatarView/AvatarView.css +22 -0
- package/build/styles/badge/Badge.css +5 -5
- package/build/styles/circularButton/CircularButton.css +0 -24
- package/build/styles/common/circle/Circle.css +17 -0
- package/build/styles/common/notificationDot/NotificationDot.css +10 -0
- package/build/styles/main.css +82 -41
- package/build/styles/statusIcon/StatusIcon.css +0 -12
- package/build/typeahead/util/highlight.js +14 -2
- package/build/typeahead/util/highlight.js.map +1 -1
- package/build/typeahead/util/highlight.mjs +15 -3
- package/build/typeahead/util/highlight.mjs.map +1 -1
- package/build/types/avatar/Avatar.d.ts +3 -0
- package/build/types/avatar/Avatar.d.ts.map +1 -1
- package/build/types/avatar/colors/colors.d.ts +1 -1
- package/build/types/avatar/colors/colors.d.ts.map +1 -1
- package/build/types/avatarGroup/AvatarGroup.d.ts +19 -0
- package/build/types/avatarGroup/AvatarGroup.d.ts.map +1 -0
- package/build/types/avatarGroup/index.d.ts +3 -0
- package/build/types/avatarGroup/index.d.ts.map +1 -0
- package/build/types/avatarView/AvatarView.d.ts +25 -0
- package/build/types/avatarView/AvatarView.d.ts.map +1 -0
- package/build/types/avatarView/index.d.ts +3 -0
- package/build/types/avatarView/index.d.ts.map +1 -0
- package/build/types/avatarWrapper/AvatarWrapper.d.ts +3 -0
- package/build/types/avatarWrapper/AvatarWrapper.d.ts.map +1 -1
- package/build/types/badge/Badge.d.ts +2 -1
- package/build/types/badge/Badge.d.ts.map +1 -1
- package/build/types/circularButton/CircularButton.d.ts.map +1 -1
- package/build/types/common/circle/Circle.d.ts +1 -1
- package/build/types/common/circle/Circle.d.ts.map +1 -1
- package/build/types/common/index.d.ts +1 -0
- package/build/types/common/initials.d.ts +2 -0
- package/build/types/common/initials.d.ts.map +1 -0
- package/build/types/common/notificationDot/NotificationDot.d.ts +8 -0
- package/build/types/common/notificationDot/NotificationDot.d.ts.map +1 -0
- package/build/types/index.d.ts +4 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/statusIcon/StatusIcon.d.ts +6 -2
- package/build/types/statusIcon/StatusIcon.d.ts.map +1 -1
- package/build/types/typeahead/util/highlight.d.ts +1 -1
- package/build/types/typeahead/util/highlight.d.ts.map +1 -1
- package/build/types/uploadInput/UploadInput.d.ts +0 -9
- package/build/types/uploadInput/UploadInput.d.ts.map +1 -1
- package/build/types/uploadInput/uploadItem/UploadItem.d.ts +1 -3
- package/build/types/uploadInput/uploadItem/UploadItem.d.ts.map +1 -1
- package/build/types/uploadInput/uploadItem/UploadItemLink.d.ts.map +1 -1
- package/build/uploadInput/UploadInput.js +51 -57
- package/build/uploadInput/UploadInput.js.map +1 -1
- package/build/uploadInput/UploadInput.mjs +51 -57
- package/build/uploadInput/UploadInput.mjs.map +1 -1
- package/build/uploadInput/uploadItem/UploadItem.js +3 -8
- package/build/uploadInput/uploadItem/UploadItem.js.map +1 -1
- package/build/uploadInput/uploadItem/UploadItem.mjs +3 -8
- package/build/uploadInput/uploadItem/UploadItem.mjs.map +1 -1
- package/build/uploadInput/uploadItem/UploadItemLink.js +0 -1
- package/build/uploadInput/uploadItem/UploadItemLink.js.map +1 -1
- package/build/uploadInput/uploadItem/UploadItemLink.mjs +0 -1
- package/build/uploadInput/uploadItem/UploadItemLink.mjs.map +1 -1
- package/package.json +3 -3
- package/src/avatar/Avatar.tsx +4 -1
- package/src/avatar/colors/colors.ts +4 -4
- package/src/avatarGroup/AvatarGroup.css +28 -0
- package/src/avatarGroup/AvatarGroup.less +32 -0
- package/src/avatarGroup/AvatarGroup.story.tsx +249 -0
- package/src/avatarGroup/AvatarGroup.tsx +78 -0
- package/src/avatarGroup/index.ts +2 -0
- package/src/avatarView/AvatarView.css +22 -0
- package/src/avatarView/AvatarView.less +24 -0
- package/src/avatarView/AvatarView.story.tsx +425 -0
- package/src/avatarView/AvatarView.tsx +217 -0
- package/src/avatarView/index.ts +2 -0
- package/src/avatarWrapper/AvatarWrapper.tsx +12 -16
- package/src/badge/Badge.css +5 -5
- package/src/badge/Badge.less +3 -3
- package/src/badge/Badge.tsx +10 -1
- package/src/circularButton/CircularButton.css +0 -24
- package/src/circularButton/CircularButton.less +15 -15
- package/src/circularButton/CircularButton.tsx +4 -5
- package/src/common/circle/Circle.css +17 -0
- package/src/common/circle/Circle.less +22 -0
- package/src/common/circle/Circle.tsx +33 -2
- package/src/common/index.js +1 -0
- package/src/common/initials.ts +13 -0
- package/src/common/notificationDot/NotificationDot.css +10 -0
- package/src/common/notificationDot/NotificationDot.less +7 -0
- package/src/common/notificationDot/NotificationDot.tsx +10 -0
- package/src/display/Display.tsx +1 -1
- package/src/index.ts +4 -0
- package/src/main.css +82 -41
- package/src/main.less +3 -0
- package/src/statusIcon/StatusIcon.css +0 -12
- package/src/statusIcon/StatusIcon.less +6 -6
- package/src/statusIcon/StatusIcon.story.tsx +32 -28
- package/src/statusIcon/StatusIcon.tsx +18 -4
- package/src/test-utils/avatar-img.webp +0 -0
- package/src/typeahead/typeaheadOption/TypeaheadOption.spec.js +7 -5
- package/src/typeahead/util/highlight.tsx +7 -2
- package/src/uploadInput/UploadInput.spec.tsx +6 -150
- package/src/uploadInput/UploadInput.tsx +60 -81
- package/src/uploadInput/uploadItem/UploadItem.tsx +6 -12
- package/src/uploadInput/uploadItem/UploadItemLink.tsx +1 -9
package/build/avatar/Avatar.js
CHANGED
|
@@ -19,6 +19,9 @@ const backwardsCompatibleSize = size => {
|
|
|
19
19
|
return size;
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
|
+
/**
|
|
23
|
+
* @deprecated Use `AvatarView` component instead
|
|
24
|
+
*/
|
|
22
25
|
const Avatar = ({
|
|
23
26
|
backgroundColor = null,
|
|
24
27
|
backgroundColorSeed = null,
|
|
@@ -30,7 +33,7 @@ const Avatar = ({
|
|
|
30
33
|
type = 'thumbnail',
|
|
31
34
|
'aria-label': ariaLabel
|
|
32
35
|
}) => {
|
|
33
|
-
const backgroundColorFromSeed = React.useMemo(() => !backgroundColor && backgroundColorSeed ?
|
|
36
|
+
const backgroundColorFromSeed = React.useMemo(() => !backgroundColor && backgroundColorSeed ? colors.getAvatarColorFromSeed(backgroundColorSeed) : undefined, [backgroundColor, backgroundColorSeed]);
|
|
34
37
|
const size = backwardsCompatibleSize(sizeFromProps);
|
|
35
38
|
return /*#__PURE__*/jsxRuntime.jsx(Circle, {
|
|
36
39
|
size: size,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sources":["../../src/avatar/Avatar.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useMemo } from 'react';\n\nimport { Theme } from '../common';\n\nimport { getAvatarColorFromSeed } from './colors';\nimport Circle from '../common/circle';\n\ntype NumericAvatarSize = 24 | 40 | 48 | 56 | 72;\n\ntype LegacyAvatarSize = 'sm' | 'md' | 'lg';\n\nexport type AvatarSize = NumericAvatarSize | LegacyAvatarSize;\n\nexport type AvatarTheme = 'light' | 'dark';\n\nexport type AvatarType = 'thumbnail' | 'icon' | 'emoji' | 'initials';\n\nexport interface AvatarProps {\n backgroundColor?: string;\n backgroundColorSeed?: string;\n children?: React.ReactNode;\n className?: string;\n outlined?: boolean;\n size?: AvatarSize;\n theme?: AvatarTheme;\n type?: AvatarType;\n 'aria-label'?: string;\n}\n\nconst backwardsCompatibleSize = (size: AvatarSize): NumericAvatarSize => {\n switch (size) {\n case 'sm':\n return 24;\n\n case 'md':\n return 48;\n\n case 'lg':\n return 72;\n\n default:\n return size;\n }\n};\n\nconst Avatar: React.FC<AvatarProps> = ({\n backgroundColor = null,\n backgroundColorSeed = null,\n children = null,\n className,\n outlined = false,\n size: sizeFromProps = 48,\n theme = Theme.LIGHT,\n type = 'thumbnail',\n 'aria-label': ariaLabel,\n}) => {\n const backgroundColorFromSeed = useMemo<string | undefined>(\n () =>\n !backgroundColor && backgroundColorSeed\n ?
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../src/avatar/Avatar.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useMemo } from 'react';\n\nimport { Theme } from '../common';\n\nimport { getAvatarColorFromSeed } from './colors';\nimport Circle from '../common/circle';\n\ntype NumericAvatarSize = 24 | 40 | 48 | 56 | 72;\n\ntype LegacyAvatarSize = 'sm' | 'md' | 'lg';\n\nexport type AvatarSize = NumericAvatarSize | LegacyAvatarSize;\n\nexport type AvatarTheme = 'light' | 'dark';\n\nexport type AvatarType = 'thumbnail' | 'icon' | 'emoji' | 'initials';\n\nexport interface AvatarProps {\n backgroundColor?: string;\n backgroundColorSeed?: string;\n children?: React.ReactNode;\n className?: string;\n outlined?: boolean;\n size?: AvatarSize;\n theme?: AvatarTheme;\n type?: AvatarType;\n 'aria-label'?: string;\n}\n\nconst backwardsCompatibleSize = (size: AvatarSize): NumericAvatarSize => {\n switch (size) {\n case 'sm':\n return 24;\n\n case 'md':\n return 48;\n\n case 'lg':\n return 72;\n\n default:\n return size;\n }\n};\n\n/**\n * @deprecated Use `AvatarView` component instead\n */\nconst Avatar: React.FC<AvatarProps> = ({\n backgroundColor = null,\n backgroundColorSeed = null,\n children = null,\n className,\n outlined = false,\n size: sizeFromProps = 48,\n theme = Theme.LIGHT,\n type = 'thumbnail',\n 'aria-label': ariaLabel,\n}) => {\n const backgroundColorFromSeed = useMemo<string | undefined>(\n () =>\n !backgroundColor && backgroundColorSeed\n ? getAvatarColorFromSeed(backgroundColorSeed)\n : undefined,\n [backgroundColor, backgroundColorSeed],\n );\n\n const size = backwardsCompatibleSize(sizeFromProps);\n\n return (\n <Circle\n size={size}\n fixedSize\n className={clsx('tw-avatar', className, `tw-avatar--${size}`, `tw-avatar--${type}`, {\n 'tw-avatar--outlined': outlined,\n 'tw-avatar--branded': Boolean(backgroundColorFromSeed),\n 'np-text-title-body': type === 'initials',\n })}\n aria-label={ariaLabel}\n >\n <Circle\n size={size}\n fixedSize\n className=\"tw-avatar__content\"\n style={{\n backgroundColor: backgroundColor || backgroundColorFromSeed,\n }}\n >\n {children}\n </Circle>\n </Circle>\n );\n};\n\nexport default Avatar;\n"],"names":["backwardsCompatibleSize","size","Avatar","backgroundColor","backgroundColorSeed","children","className","outlined","sizeFromProps","theme","Theme","LIGHT","type","ariaLabel","backgroundColorFromSeed","useMemo","getAvatarColorFromSeed","undefined","_jsx","Circle","fixedSize","clsx","Boolean","style"],"mappings":";;;;;;;;;AA8BA,MAAMA,uBAAuB,GAAIC,IAAgB,IAAuB;AACtE,EAAA,QAAQA,IAAI;AACV,IAAA,KAAK,IAAI;AACP,MAAA,OAAO,EAAE,CAAA;AAEX,IAAA,KAAK,IAAI;AACP,MAAA,OAAO,EAAE,CAAA;AAEX,IAAA,KAAK,IAAI;AACP,MAAA,OAAO,EAAE,CAAA;AAEX,IAAA;AACE,MAAA,OAAOA,IAAI,CAAA;AACf,GAAA;AACF,CAAC,CAAA;AAED;;AAEG;AACGC,MAAAA,MAAM,GAA0BA,CAAC;AACrCC,EAAAA,eAAe,GAAG,IAAI;AACtBC,EAAAA,mBAAmB,GAAG,IAAI;AAC1BC,EAAAA,QAAQ,GAAG,IAAI;EACfC,SAAS;AACTC,EAAAA,QAAQ,GAAG,KAAK;EAChBN,IAAI,EAAEO,aAAa,GAAG,EAAE;SACxBC,OAAK,GAAGC,WAAK,CAACC,KAAK;AACnBC,EAAAA,IAAI,GAAG,WAAW;AAClB,EAAA,YAAY,EAAEC,SAAAA;AAAS,CACxB,KAAI;EACH,MAAMC,uBAAuB,GAAGC,aAAO,CACrC,MACE,CAACZ,eAAe,IAAIC,mBAAmB,GACnCY,6BAAsB,CAACZ,mBAAmB,CAAC,GAC3Ca,SAAS,EACf,CAACd,eAAe,EAAEC,mBAAmB,CAAC,CACvC,CAAA;AAED,EAAA,MAAMH,IAAI,GAAGD,uBAAuB,CAACQ,aAAa,CAAC,CAAA;EAEnD,oBACEU,cAAA,CAACC,MAAM,EAAA;AACLlB,IAAAA,IAAI,EAAEA,IAAK;IACXmB,SAAS,EAAA,IAAA;AACTd,IAAAA,SAAS,EAAEe,SAAI,CAAC,WAAW,EAAEf,SAAS,EAAE,CAAcL,WAAAA,EAAAA,IAAI,CAAE,CAAA,EAAE,CAAcW,WAAAA,EAAAA,IAAI,EAAE,EAAE;AAClF,MAAA,qBAAqB,EAAEL,QAAQ;AAC/B,MAAA,oBAAoB,EAAEe,OAAO,CAACR,uBAAuB,CAAC;MACtD,oBAAoB,EAAEF,IAAI,KAAK,UAAA;AAChC,KAAA,CAAE;AACH,IAAA,YAAA,EAAYC,SAAU;IAAAR,QAAA,eAEtBa,cAAA,CAACC,MAAM,EAAA;AACLlB,MAAAA,IAAI,EAAEA,IAAK;MACXmB,SAAS,EAAA,IAAA;AACTd,MAAAA,SAAS,EAAC,oBAAoB;AAC9BiB,MAAAA,KAAK,EAAE;QACLpB,eAAe,EAAEA,eAAe,IAAIW,uBAAAA;OACpC;AAAAT,MAAAA,QAAA,EAEDA,QAAAA;KACK,CAAA;AACV,GAAQ,CAAC,CAAA;AAEb;;;;"}
|
package/build/avatar/Avatar.mjs
CHANGED
|
@@ -17,6 +17,9 @@ const backwardsCompatibleSize = size => {
|
|
|
17
17
|
return size;
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* @deprecated Use `AvatarView` component instead
|
|
22
|
+
*/
|
|
20
23
|
const Avatar = ({
|
|
21
24
|
backgroundColor = null,
|
|
22
25
|
backgroundColorSeed = null,
|
|
@@ -28,7 +31,7 @@ const Avatar = ({
|
|
|
28
31
|
type = 'thumbnail',
|
|
29
32
|
'aria-label': ariaLabel
|
|
30
33
|
}) => {
|
|
31
|
-
const backgroundColorFromSeed = useMemo(() => !backgroundColor && backgroundColorSeed ?
|
|
34
|
+
const backgroundColorFromSeed = useMemo(() => !backgroundColor && backgroundColorSeed ? getAvatarColorFromSeed(backgroundColorSeed) : undefined, [backgroundColor, backgroundColorSeed]);
|
|
32
35
|
const size = backwardsCompatibleSize(sizeFromProps);
|
|
33
36
|
return /*#__PURE__*/jsx(Circle, {
|
|
34
37
|
size: size,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.mjs","sources":["../../src/avatar/Avatar.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useMemo } from 'react';\n\nimport { Theme } from '../common';\n\nimport { getAvatarColorFromSeed } from './colors';\nimport Circle from '../common/circle';\n\ntype NumericAvatarSize = 24 | 40 | 48 | 56 | 72;\n\ntype LegacyAvatarSize = 'sm' | 'md' | 'lg';\n\nexport type AvatarSize = NumericAvatarSize | LegacyAvatarSize;\n\nexport type AvatarTheme = 'light' | 'dark';\n\nexport type AvatarType = 'thumbnail' | 'icon' | 'emoji' | 'initials';\n\nexport interface AvatarProps {\n backgroundColor?: string;\n backgroundColorSeed?: string;\n children?: React.ReactNode;\n className?: string;\n outlined?: boolean;\n size?: AvatarSize;\n theme?: AvatarTheme;\n type?: AvatarType;\n 'aria-label'?: string;\n}\n\nconst backwardsCompatibleSize = (size: AvatarSize): NumericAvatarSize => {\n switch (size) {\n case 'sm':\n return 24;\n\n case 'md':\n return 48;\n\n case 'lg':\n return 72;\n\n default:\n return size;\n }\n};\n\nconst Avatar: React.FC<AvatarProps> = ({\n backgroundColor = null,\n backgroundColorSeed = null,\n children = null,\n className,\n outlined = false,\n size: sizeFromProps = 48,\n theme = Theme.LIGHT,\n type = 'thumbnail',\n 'aria-label': ariaLabel,\n}) => {\n const backgroundColorFromSeed = useMemo<string | undefined>(\n () =>\n !backgroundColor && backgroundColorSeed\n ?
|
|
1
|
+
{"version":3,"file":"Avatar.mjs","sources":["../../src/avatar/Avatar.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useMemo } from 'react';\n\nimport { Theme } from '../common';\n\nimport { getAvatarColorFromSeed } from './colors';\nimport Circle from '../common/circle';\n\ntype NumericAvatarSize = 24 | 40 | 48 | 56 | 72;\n\ntype LegacyAvatarSize = 'sm' | 'md' | 'lg';\n\nexport type AvatarSize = NumericAvatarSize | LegacyAvatarSize;\n\nexport type AvatarTheme = 'light' | 'dark';\n\nexport type AvatarType = 'thumbnail' | 'icon' | 'emoji' | 'initials';\n\nexport interface AvatarProps {\n backgroundColor?: string;\n backgroundColorSeed?: string;\n children?: React.ReactNode;\n className?: string;\n outlined?: boolean;\n size?: AvatarSize;\n theme?: AvatarTheme;\n type?: AvatarType;\n 'aria-label'?: string;\n}\n\nconst backwardsCompatibleSize = (size: AvatarSize): NumericAvatarSize => {\n switch (size) {\n case 'sm':\n return 24;\n\n case 'md':\n return 48;\n\n case 'lg':\n return 72;\n\n default:\n return size;\n }\n};\n\n/**\n * @deprecated Use `AvatarView` component instead\n */\nconst Avatar: React.FC<AvatarProps> = ({\n backgroundColor = null,\n backgroundColorSeed = null,\n children = null,\n className,\n outlined = false,\n size: sizeFromProps = 48,\n theme = Theme.LIGHT,\n type = 'thumbnail',\n 'aria-label': ariaLabel,\n}) => {\n const backgroundColorFromSeed = useMemo<string | undefined>(\n () =>\n !backgroundColor && backgroundColorSeed\n ? getAvatarColorFromSeed(backgroundColorSeed)\n : undefined,\n [backgroundColor, backgroundColorSeed],\n );\n\n const size = backwardsCompatibleSize(sizeFromProps);\n\n return (\n <Circle\n size={size}\n fixedSize\n className={clsx('tw-avatar', className, `tw-avatar--${size}`, `tw-avatar--${type}`, {\n 'tw-avatar--outlined': outlined,\n 'tw-avatar--branded': Boolean(backgroundColorFromSeed),\n 'np-text-title-body': type === 'initials',\n })}\n aria-label={ariaLabel}\n >\n <Circle\n size={size}\n fixedSize\n className=\"tw-avatar__content\"\n style={{\n backgroundColor: backgroundColor || backgroundColorFromSeed,\n }}\n >\n {children}\n </Circle>\n </Circle>\n );\n};\n\nexport default Avatar;\n"],"names":["backwardsCompatibleSize","size","Avatar","backgroundColor","backgroundColorSeed","children","className","outlined","sizeFromProps","theme","Theme","LIGHT","type","ariaLabel","backgroundColorFromSeed","useMemo","getAvatarColorFromSeed","undefined","_jsx","Circle","fixedSize","clsx","Boolean","style"],"mappings":";;;;;;;AA8BA,MAAMA,uBAAuB,GAAIC,IAAgB,IAAuB;AACtE,EAAA,QAAQA,IAAI;AACV,IAAA,KAAK,IAAI;AACP,MAAA,OAAO,EAAE,CAAA;AAEX,IAAA,KAAK,IAAI;AACP,MAAA,OAAO,EAAE,CAAA;AAEX,IAAA,KAAK,IAAI;AACP,MAAA,OAAO,EAAE,CAAA;AAEX,IAAA;AACE,MAAA,OAAOA,IAAI,CAAA;AACf,GAAA;AACF,CAAC,CAAA;AAED;;AAEG;AACGC,MAAAA,MAAM,GAA0BA,CAAC;AACrCC,EAAAA,eAAe,GAAG,IAAI;AACtBC,EAAAA,mBAAmB,GAAG,IAAI;AAC1BC,EAAAA,QAAQ,GAAG,IAAI;EACfC,SAAS;AACTC,EAAAA,QAAQ,GAAG,KAAK;EAChBN,IAAI,EAAEO,aAAa,GAAG,EAAE;EACxBC,KAAK,GAAGC,KAAK,CAACC,KAAK;AACnBC,EAAAA,IAAI,GAAG,WAAW;AAClB,EAAA,YAAY,EAAEC,SAAAA;AAAS,CACxB,KAAI;EACH,MAAMC,uBAAuB,GAAGC,OAAO,CACrC,MACE,CAACZ,eAAe,IAAIC,mBAAmB,GACnCY,sBAAsB,CAACZ,mBAAmB,CAAC,GAC3Ca,SAAS,EACf,CAACd,eAAe,EAAEC,mBAAmB,CAAC,CACvC,CAAA;AAED,EAAA,MAAMH,IAAI,GAAGD,uBAAuB,CAACQ,aAAa,CAAC,CAAA;EAEnD,oBACEU,GAAA,CAACC,MAAM,EAAA;AACLlB,IAAAA,IAAI,EAAEA,IAAK;IACXmB,SAAS,EAAA,IAAA;AACTd,IAAAA,SAAS,EAAEe,IAAI,CAAC,WAAW,EAAEf,SAAS,EAAE,CAAcL,WAAAA,EAAAA,IAAI,CAAE,CAAA,EAAE,CAAcW,WAAAA,EAAAA,IAAI,EAAE,EAAE;AAClF,MAAA,qBAAqB,EAAEL,QAAQ;AAC/B,MAAA,oBAAoB,EAAEe,OAAO,CAACR,uBAAuB,CAAC;MACtD,oBAAoB,EAAEF,IAAI,KAAK,UAAA;AAChC,KAAA,CAAE;AACH,IAAA,YAAA,EAAYC,SAAU;IAAAR,QAAA,eAEtBa,GAAA,CAACC,MAAM,EAAA;AACLlB,MAAAA,IAAI,EAAEA,IAAK;MACXmB,SAAS,EAAA,IAAA;AACTd,MAAAA,SAAS,EAAC,oBAAoB;AAC9BiB,MAAAA,KAAK,EAAE;QACLpB,eAAe,EAAEA,eAAe,IAAIW,uBAAAA;OACpC;AAAAT,MAAAA,QAAA,EAEDA,QAAAA;KACK,CAAA;AACV,GAAQ,CAAC,CAAA;AAEb;;;;"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Changing this array will change the assignment between seeds.
|
|
6
6
|
* Do not change this array.
|
|
7
7
|
*/
|
|
8
|
-
const avatarColors = ['--color-bright-blue', '--color-bright-yellow', '--color-bright-pink', '--color-bright-orange'];
|
|
8
|
+
const avatarColors = ['var(--color-bright-blue)', 'var(--color-bright-yellow)', 'var(--color-bright-pink)', 'var(--color-bright-orange)'];
|
|
9
9
|
/*
|
|
10
10
|
* Takes in a "seed" string and spits out an index for the color we should use.
|
|
11
11
|
* This implementation has been synced across all three clients so that we consistently
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.js","sources":["../../../src/avatar/colors/colors.ts"],"sourcesContent":["/*\n * The colors we support generating an Avatar background color from a \"seed\" for.\n * Changing this array will change the assignment between seeds.\n * Do not change this array.\n */\nconst avatarColors = [\n '--color-bright-blue',\n '--color-bright-yellow',\n '--color-bright-pink',\n '--color-bright-orange',\n] as const;\n\n/*\n * Takes in a \"seed\" string and spits out an index for the color we should use.\n * This implementation has been synced across all three clients so that we consistently\n * generate branded avatar colors when rendering a list of Avatars.\n * Do not change this implementation.\n */\nconst hashSeed = (seed: string): number => {\n const base = 31;\n const modulo = avatarColors.length;\n\n let hashValue = 0;\n let basePow = 1;\n\n for (let i = 0; i < seed.length; i += 1) {\n hashValue = (hashValue + seed.charCodeAt(i) * basePow) % modulo;\n basePow = (basePow * base) % modulo;\n }\n\n return hashValue;\n};\n\nexport const getAvatarColorFromSeed = (seed: string): (typeof avatarColors)[number] => {\n return avatarColors[hashSeed(seed)];\n};\n"],"names":["avatarColors","hashSeed","seed","base","modulo","length","hashValue","basePow","i","charCodeAt","getAvatarColorFromSeed"],"mappings":";;AAAA;;;;AAIG;AACH,MAAMA,YAAY,GAAG,CACnB,
|
|
1
|
+
{"version":3,"file":"colors.js","sources":["../../../src/avatar/colors/colors.ts"],"sourcesContent":["/*\n * The colors we support generating an Avatar background color from a \"seed\" for.\n * Changing this array will change the assignment between seeds.\n * Do not change this array.\n */\nconst avatarColors = [\n 'var(--color-bright-blue)',\n 'var(--color-bright-yellow)',\n 'var(--color-bright-pink)',\n 'var(--color-bright-orange)',\n] as const;\n\n/*\n * Takes in a \"seed\" string and spits out an index for the color we should use.\n * This implementation has been synced across all three clients so that we consistently\n * generate branded avatar colors when rendering a list of Avatars.\n * Do not change this implementation.\n */\nconst hashSeed = (seed: string): number => {\n const base = 31;\n const modulo = avatarColors.length;\n\n let hashValue = 0;\n let basePow = 1;\n\n for (let i = 0; i < seed.length; i += 1) {\n hashValue = (hashValue + seed.charCodeAt(i) * basePow) % modulo;\n basePow = (basePow * base) % modulo;\n }\n\n return hashValue;\n};\n\nexport const getAvatarColorFromSeed = (seed: string): (typeof avatarColors)[number] => {\n return avatarColors[hashSeed(seed)];\n};\n"],"names":["avatarColors","hashSeed","seed","base","modulo","length","hashValue","basePow","i","charCodeAt","getAvatarColorFromSeed"],"mappings":";;AAAA;;;;AAIG;AACH,MAAMA,YAAY,GAAG,CACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,CACpB,CAAA;AAEV;;;;;AAKG;AACH,MAAMC,QAAQ,GAAIC,IAAY,IAAY;EACxC,MAAMC,IAAI,GAAG,EAAE,CAAA;AACf,EAAA,MAAMC,MAAM,GAAGJ,YAAY,CAACK,MAAM,CAAA;EAElC,IAAIC,SAAS,GAAG,CAAC,CAAA;EACjB,IAAIC,OAAO,GAAG,CAAC,CAAA;AAEf,EAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGN,IAAI,CAACG,MAAM,EAAEG,CAAC,IAAI,CAAC,EAAE;AACvCF,IAAAA,SAAS,GAAG,CAACA,SAAS,GAAGJ,IAAI,CAACO,UAAU,CAACD,CAAC,CAAC,GAAGD,OAAO,IAAIH,MAAM,CAAA;AAC/DG,IAAAA,OAAO,GAAIA,OAAO,GAAGJ,IAAI,GAAIC,MAAM,CAAA;AACrC,GAAA;AAEA,EAAA,OAAOE,SAAS,CAAA;AAClB,CAAC,CAAA;AAEYI,MAAAA,sBAAsB,GAAIR,IAAY,IAAmC;AACpF,EAAA,OAAOF,YAAY,CAACC,QAAQ,CAACC,IAAI,CAAC,CAAC,CAAA;AACrC;;;;"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Changing this array will change the assignment between seeds.
|
|
4
4
|
* Do not change this array.
|
|
5
5
|
*/
|
|
6
|
-
const avatarColors = ['--color-bright-blue', '--color-bright-yellow', '--color-bright-pink', '--color-bright-orange'];
|
|
6
|
+
const avatarColors = ['var(--color-bright-blue)', 'var(--color-bright-yellow)', 'var(--color-bright-pink)', 'var(--color-bright-orange)'];
|
|
7
7
|
/*
|
|
8
8
|
* Takes in a "seed" string and spits out an index for the color we should use.
|
|
9
9
|
* This implementation has been synced across all three clients so that we consistently
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.mjs","sources":["../../../src/avatar/colors/colors.ts"],"sourcesContent":["/*\n * The colors we support generating an Avatar background color from a \"seed\" for.\n * Changing this array will change the assignment between seeds.\n * Do not change this array.\n */\nconst avatarColors = [\n '--color-bright-blue',\n '--color-bright-yellow',\n '--color-bright-pink',\n '--color-bright-orange',\n] as const;\n\n/*\n * Takes in a \"seed\" string and spits out an index for the color we should use.\n * This implementation has been synced across all three clients so that we consistently\n * generate branded avatar colors when rendering a list of Avatars.\n * Do not change this implementation.\n */\nconst hashSeed = (seed: string): number => {\n const base = 31;\n const modulo = avatarColors.length;\n\n let hashValue = 0;\n let basePow = 1;\n\n for (let i = 0; i < seed.length; i += 1) {\n hashValue = (hashValue + seed.charCodeAt(i) * basePow) % modulo;\n basePow = (basePow * base) % modulo;\n }\n\n return hashValue;\n};\n\nexport const getAvatarColorFromSeed = (seed: string): (typeof avatarColors)[number] => {\n return avatarColors[hashSeed(seed)];\n};\n"],"names":["avatarColors","hashSeed","seed","base","modulo","length","hashValue","basePow","i","charCodeAt","getAvatarColorFromSeed"],"mappings":"AAAA;;;;AAIG;AACH,MAAMA,YAAY,GAAG,CACnB,
|
|
1
|
+
{"version":3,"file":"colors.mjs","sources":["../../../src/avatar/colors/colors.ts"],"sourcesContent":["/*\n * The colors we support generating an Avatar background color from a \"seed\" for.\n * Changing this array will change the assignment between seeds.\n * Do not change this array.\n */\nconst avatarColors = [\n 'var(--color-bright-blue)',\n 'var(--color-bright-yellow)',\n 'var(--color-bright-pink)',\n 'var(--color-bright-orange)',\n] as const;\n\n/*\n * Takes in a \"seed\" string and spits out an index for the color we should use.\n * This implementation has been synced across all three clients so that we consistently\n * generate branded avatar colors when rendering a list of Avatars.\n * Do not change this implementation.\n */\nconst hashSeed = (seed: string): number => {\n const base = 31;\n const modulo = avatarColors.length;\n\n let hashValue = 0;\n let basePow = 1;\n\n for (let i = 0; i < seed.length; i += 1) {\n hashValue = (hashValue + seed.charCodeAt(i) * basePow) % modulo;\n basePow = (basePow * base) % modulo;\n }\n\n return hashValue;\n};\n\nexport const getAvatarColorFromSeed = (seed: string): (typeof avatarColors)[number] => {\n return avatarColors[hashSeed(seed)];\n};\n"],"names":["avatarColors","hashSeed","seed","base","modulo","length","hashValue","basePow","i","charCodeAt","getAvatarColorFromSeed"],"mappings":"AAAA;;;;AAIG;AACH,MAAMA,YAAY,GAAG,CACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,CACpB,CAAA;AAEV;;;;;AAKG;AACH,MAAMC,QAAQ,GAAIC,IAAY,IAAY;EACxC,MAAMC,IAAI,GAAG,EAAE,CAAA;AACf,EAAA,MAAMC,MAAM,GAAGJ,YAAY,CAACK,MAAM,CAAA;EAElC,IAAIC,SAAS,GAAG,CAAC,CAAA;EACjB,IAAIC,OAAO,GAAG,CAAC,CAAA;AAEf,EAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGN,IAAI,CAACG,MAAM,EAAEG,CAAC,IAAI,CAAC,EAAE;AACvCF,IAAAA,SAAS,GAAG,CAACA,SAAS,GAAGJ,IAAI,CAACO,UAAU,CAACD,CAAC,CAAC,GAAGD,OAAO,IAAIH,MAAM,CAAA;AAC/DG,IAAAA,OAAO,GAAIA,OAAO,GAAGJ,IAAI,GAAIC,MAAM,CAAA;AACrC,GAAA;AAEA,EAAA,OAAOE,SAAS,CAAA;AAClB,CAAC,CAAA;AAEYI,MAAAA,sBAAsB,GAAIR,IAAY,IAAmC;AACpF,EAAA,OAAOF,YAAY,CAACC,QAAQ,CAACC,IAAI,CAAC,CAAC,CAAA;AACrC;;;;"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Badge = require('../badge/Badge.js');
|
|
4
|
+
var NotificationDot = require('../common/notificationDot/NotificationDot.js');
|
|
5
|
+
var StatusIcon = require('../statusIcon/StatusIcon.js');
|
|
6
|
+
var Circle = require('../common/circle/Circle.js');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var clsx = require('clsx');
|
|
9
|
+
var icons = require('@transferwise/icons');
|
|
10
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
11
|
+
var initials = require('../common/initials.js');
|
|
12
|
+
|
|
13
|
+
const AvatarViewDefaultSize = 48;
|
|
14
|
+
/** Non interactive avatar view has custom border width */
|
|
15
|
+
const mapNonInteractiveBorderWidth = {
|
|
16
|
+
16: 0.667,
|
|
17
|
+
24: 1,
|
|
18
|
+
32: 1,
|
|
19
|
+
40: 1.25,
|
|
20
|
+
48: 1.5,
|
|
21
|
+
56: 1.75,
|
|
22
|
+
72: 2.25
|
|
23
|
+
};
|
|
24
|
+
/** Selected state has custom border width */
|
|
25
|
+
const mapSelectedBorderWidth = {
|
|
26
|
+
16: 1,
|
|
27
|
+
24: 1,
|
|
28
|
+
32: 1,
|
|
29
|
+
40: 2,
|
|
30
|
+
48: 2,
|
|
31
|
+
56: 2,
|
|
32
|
+
72: 2
|
|
33
|
+
};
|
|
34
|
+
function AvatarView({
|
|
35
|
+
children = undefined,
|
|
36
|
+
size = AvatarViewDefaultSize,
|
|
37
|
+
selected,
|
|
38
|
+
notification,
|
|
39
|
+
badge,
|
|
40
|
+
entity,
|
|
41
|
+
action,
|
|
42
|
+
className,
|
|
43
|
+
style
|
|
44
|
+
}) {
|
|
45
|
+
return /*#__PURE__*/jsxRuntime.jsx(Interactive, {
|
|
46
|
+
...action,
|
|
47
|
+
className: clsx.clsx('np-avatar-view', {
|
|
48
|
+
'np-avatar-view-selected': selected
|
|
49
|
+
}, className),
|
|
50
|
+
children: /*#__PURE__*/jsxRuntime.jsx(Badges, {
|
|
51
|
+
asset: badge,
|
|
52
|
+
avatarProps: {
|
|
53
|
+
size,
|
|
54
|
+
notification,
|
|
55
|
+
selected
|
|
56
|
+
},
|
|
57
|
+
children: /*#__PURE__*/jsxRuntime.jsx(Circle, {
|
|
58
|
+
size: size,
|
|
59
|
+
fixedSize: true,
|
|
60
|
+
style: {
|
|
61
|
+
// @ts-expect-error CSS custom props allowed
|
|
62
|
+
'--avatar-view-selected-border-width': `${mapSelectedBorderWidth[size]}px`,
|
|
63
|
+
'--avatar-view-non-interactive-border-width': `${mapNonInteractiveBorderWidth[size]}px`,
|
|
64
|
+
...style
|
|
65
|
+
},
|
|
66
|
+
children: children === undefined ? /*#__PURE__*/jsxRuntime.jsx(Entity, {
|
|
67
|
+
...entity
|
|
68
|
+
}) : children
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function Interactive({
|
|
74
|
+
children,
|
|
75
|
+
onClick,
|
|
76
|
+
href,
|
|
77
|
+
target,
|
|
78
|
+
className,
|
|
79
|
+
'aria-label': ariaLabel,
|
|
80
|
+
'aria-labelledby': ariaLabelledby
|
|
81
|
+
}) {
|
|
82
|
+
const elementName = onClick ? 'button' : href ? 'a' : null;
|
|
83
|
+
if (elementName === null) {
|
|
84
|
+
// non interactive
|
|
85
|
+
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
86
|
+
className: className,
|
|
87
|
+
children: children
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
const a11yProps = {
|
|
91
|
+
ariaLabel,
|
|
92
|
+
ariaLabelledby
|
|
93
|
+
};
|
|
94
|
+
if (elementName === 'button') {
|
|
95
|
+
return /*#__PURE__*/jsxRuntime.jsx("button", {
|
|
96
|
+
type: "button",
|
|
97
|
+
className: clsx.clsx(className, 'np-avatar-view-interactive', 'btn-unstyled'),
|
|
98
|
+
onClick: onClick,
|
|
99
|
+
...a11yProps,
|
|
100
|
+
children: children
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (elementName === 'a') {
|
|
104
|
+
return (
|
|
105
|
+
/*#__PURE__*/
|
|
106
|
+
// eslint-disable-next-line react/jsx-no-target-blank
|
|
107
|
+
jsxRuntime.jsx("a", {
|
|
108
|
+
href: href,
|
|
109
|
+
target: target,
|
|
110
|
+
rel: target === '_blank' ? 'noreferrer' : undefined,
|
|
111
|
+
className: clsx.clsx(className, 'np-avatar-view-interactive', 'text-no-decoration'),
|
|
112
|
+
...a11yProps,
|
|
113
|
+
children: children
|
|
114
|
+
})
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const mapBadgeSize = {
|
|
119
|
+
16: 'sm',
|
|
120
|
+
24: 'sm',
|
|
121
|
+
32: 'sm',
|
|
122
|
+
40: 'sm',
|
|
123
|
+
48: 'sm',
|
|
124
|
+
56: 'lg',
|
|
125
|
+
72: 'lg'
|
|
126
|
+
};
|
|
127
|
+
/** AvatarView has a custom sizes for badge */
|
|
128
|
+
const mapNotificationSize = {
|
|
129
|
+
16: 6,
|
|
130
|
+
24: 8,
|
|
131
|
+
32: 10,
|
|
132
|
+
40: 10,
|
|
133
|
+
48: 14,
|
|
134
|
+
56: 16,
|
|
135
|
+
72: 20
|
|
136
|
+
};
|
|
137
|
+
function Badges({
|
|
138
|
+
children,
|
|
139
|
+
asset,
|
|
140
|
+
avatarProps
|
|
141
|
+
}) {
|
|
142
|
+
const {
|
|
143
|
+
size = AvatarViewDefaultSize,
|
|
144
|
+
selected,
|
|
145
|
+
notification
|
|
146
|
+
} = avatarProps;
|
|
147
|
+
if (asset || selected || notification) {
|
|
148
|
+
if (asset && size > 16) {
|
|
149
|
+
return /*#__PURE__*/jsxRuntime.jsx(Badge, {
|
|
150
|
+
badge: asset,
|
|
151
|
+
size: mapBadgeSize[size],
|
|
152
|
+
children: children
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (selected && size > 16) {
|
|
156
|
+
return /*#__PURE__*/jsxRuntime.jsx(Badge, {
|
|
157
|
+
badge: /*#__PURE__*/jsxRuntime.jsx(StatusIcon, {
|
|
158
|
+
sentiment: "positive",
|
|
159
|
+
size: mapBadgeSize[size]
|
|
160
|
+
}),
|
|
161
|
+
size: mapBadgeSize[size],
|
|
162
|
+
children: children
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
if (notification) {
|
|
166
|
+
return /*#__PURE__*/jsxRuntime.jsx(Badge, {
|
|
167
|
+
badge: /*#__PURE__*/jsxRuntime.jsx(NotificationDot
|
|
168
|
+
// @ts-expect-error CSS custom props allowed
|
|
169
|
+
, {
|
|
170
|
+
style: {
|
|
171
|
+
'--badge-notification-dot-size': `${mapNotificationSize[size]}px`
|
|
172
|
+
}
|
|
173
|
+
}),
|
|
174
|
+
position: "top-right",
|
|
175
|
+
size: mapBadgeSize[size],
|
|
176
|
+
children: children
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return children;
|
|
181
|
+
}
|
|
182
|
+
function Entity({
|
|
183
|
+
imageSrc = null,
|
|
184
|
+
name = null,
|
|
185
|
+
profileType = null
|
|
186
|
+
}) {
|
|
187
|
+
const [tryLoadImage, setTryLoadImage] = React.useState(true);
|
|
188
|
+
if (imageSrc && tryLoadImage) {
|
|
189
|
+
return /*#__PURE__*/jsxRuntime.jsx("img", {
|
|
190
|
+
src: imageSrc,
|
|
191
|
+
alt: "",
|
|
192
|
+
onError: () => setTryLoadImage(false)
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if (profileType) {
|
|
196
|
+
return profileType === 'business' ? /*#__PURE__*/jsxRuntime.jsx(icons.Briefcase, {}) : /*#__PURE__*/jsxRuntime.jsx(icons.Profile, {});
|
|
197
|
+
}
|
|
198
|
+
if (name) {
|
|
199
|
+
return /*#__PURE__*/jsxRuntime.jsx(jsxRuntime.Fragment, {
|
|
200
|
+
children: initials.getInitials(name)
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return /*#__PURE__*/jsxRuntime.jsx(icons.Profile, {});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
module.exports = AvatarView;
|
|
207
|
+
//# sourceMappingURL=AvatarView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarView.js","sources":["../../src/avatarView/AvatarView.tsx"],"sourcesContent":["import Badge from '../badge';\nimport { getInitials } from '../common';\nimport NotificationDot from '../common/notificationDot/NotificationDot';\nimport StatusIcon from '../statusIcon';\nimport Circle from '../common/circle';\nimport { HTMLAttributes, PropsWithChildren, useState } from 'react';\nimport { ActionOptions as ActionProps } from '../common/action/Action';\nimport { clsx } from 'clsx';\nimport { Briefcase, Profile } from '@transferwise/icons';\n\ntype InteractiveProps = Omit<ActionProps, 'text'> &\n Pick<HTMLAttributes<HTMLDivElement>, 'className' | 'aria-labelledby'>;\n\nconst AvatarViewDefaultSize = 48;\n\nexport type Props = PropsWithChildren<{\n size?: 16 | 24 | 32 | 40 | 48 | 56 | 72;\n /** adds prebuilt notification dot via Badge component */\n notification?: boolean;\n /** adds custom badge to avatar */\n badge?: React.ReactNode;\n entity?: EntityProps;\n /** changes background color to neutral and wraps component with button */\n action?: InteractiveProps;\n /** changes background color to neutral and adds predefined Badge */\n selected?: boolean;\n /** often use case to override `background-color` or `border` */\n style?: React.CSSProperties;\n}> &\n Pick<HTMLAttributes<HTMLDivElement>, 'className' | 'style'>;\n\n/** Non interactive avatar view has custom border width */\nconst mapNonInteractiveBorderWidth = {\n 16: 0.667,\n 24: 1,\n 32: 1,\n 40: 1.25,\n 48: 1.5,\n 56: 1.75,\n 72: 2.25,\n};\n\n/** Selected state has custom border width */\nconst mapSelectedBorderWidth = {\n 16: 1,\n 24: 1,\n 32: 1,\n 40: 2,\n 48: 2,\n 56: 2,\n 72: 2,\n};\n\nfunction AvatarView({\n children = undefined,\n size = AvatarViewDefaultSize,\n selected,\n notification,\n badge,\n entity,\n action,\n className,\n style,\n}: Props) {\n return (\n <Interactive\n {...action}\n className={clsx('np-avatar-view', { 'np-avatar-view-selected': selected }, className)}\n >\n <Badges asset={badge} avatarProps={{ size, notification, selected }}>\n <Circle\n size={size}\n fixedSize\n style={{\n // @ts-expect-error CSS custom props allowed\n '--avatar-view-selected-border-width': `${mapSelectedBorderWidth[size]}px`,\n '--avatar-view-non-interactive-border-width': `${mapNonInteractiveBorderWidth[size]}px`,\n ...style,\n }}\n >\n {children === undefined ? <Entity {...entity} /> : children}\n </Circle>\n </Badges>\n </Interactive>\n );\n}\n\nfunction Interactive({\n children,\n onClick,\n href,\n target,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n}: PropsWithChildren<InteractiveProps>) {\n const elementName: React.ElementType | null = onClick ? 'button' : href ? 'a' : null;\n if (elementName === null) {\n // non interactive\n return <div className={className}>{children}</div>;\n }\n const a11yProps = { ariaLabel, ariaLabelledby };\n if (elementName === 'button') {\n return (\n <button\n type=\"button\"\n className={clsx(className, 'np-avatar-view-interactive', 'btn-unstyled')}\n onClick={onClick}\n {...a11yProps}\n >\n {children}\n </button>\n );\n }\n if (elementName === 'a') {\n return (\n // eslint-disable-next-line react/jsx-no-target-blank\n <a\n href={href}\n target={target}\n rel={target === '_blank' ? 'noreferrer' : undefined}\n className={clsx(className, 'np-avatar-view-interactive', 'text-no-decoration')}\n {...a11yProps}\n >\n {children}\n </a>\n );\n }\n}\n\nconst mapBadgeSize = {\n 16: 'sm',\n 24: 'sm',\n 32: 'sm',\n 40: 'sm',\n 48: 'sm',\n 56: 'lg',\n 72: 'lg',\n};\n\n/** AvatarView has a custom sizes for badge */\nconst mapNotificationSize = {\n 16: 6,\n 24: 8,\n 32: 10,\n 40: 10,\n 48: 14,\n 56: 16,\n 72: 20,\n};\n\ntype BadgesProps = PropsWithChildren<{\n asset: React.ReactNode;\n avatarProps: Pick<Props, 'selected' | 'size' | 'notification'>;\n}>;\n\nfunction Badges({ children, asset, avatarProps }: BadgesProps) {\n const { size = AvatarViewDefaultSize, selected, notification } = avatarProps;\n if (asset || selected || notification) {\n if (asset && size > 16) {\n return (\n <Badge badge={asset} size={mapBadgeSize[size]}>\n {children}\n </Badge>\n );\n }\n if (selected && size > 16) {\n return (\n <Badge\n badge={<StatusIcon sentiment=\"positive\" size={mapBadgeSize[size]} />}\n size={mapBadgeSize[size]}\n >\n {children}\n </Badge>\n );\n }\n if (notification) {\n return (\n <Badge\n badge={\n <NotificationDot\n // @ts-expect-error CSS custom props allowed\n style={{ '--badge-notification-dot-size': `${mapNotificationSize[size]}px` }}\n />\n }\n position=\"top-right\"\n size={mapBadgeSize[size]}\n >\n {children}\n </Badge>\n );\n }\n }\n return children;\n}\n\nexport type EntityProps = {\n imageSrc?: string | null;\n name?: string | null;\n profileType?: 'personal' | 'business' | null;\n};\n\nfunction Entity({ imageSrc = null, name = null, profileType = null }: EntityProps) {\n const [tryLoadImage, setTryLoadImage] = useState(true);\n if (imageSrc && tryLoadImage) {\n return <img src={imageSrc} alt=\"\" onError={() => setTryLoadImage(false)} />;\n }\n if (profileType) {\n return profileType === 'business' ? <Briefcase /> : <Profile />;\n }\n if (name) {\n return <>{getInitials(name)}</>;\n }\n return <Profile />;\n}\n\nexport default AvatarView;\n"],"names":["AvatarViewDefaultSize","mapNonInteractiveBorderWidth","mapSelectedBorderWidth","AvatarView","children","undefined","size","selected","notification","badge","entity","action","className","style","_jsx","Interactive","clsx","Badges","asset","avatarProps","Circle","fixedSize","Entity","onClick","href","target","ariaLabel","ariaLabelledby","elementName","a11yProps","type","rel","mapBadgeSize","mapNotificationSize","Badge","StatusIcon","sentiment","NotificationDot","position","imageSrc","name","profileType","tryLoadImage","setTryLoadImage","useState","src","alt","onError","Briefcase","Profile","_Fragment","getInitials"],"mappings":"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"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import Badge from '../badge/Badge.mjs';
|
|
2
|
+
import NotificationDot from '../common/notificationDot/NotificationDot.mjs';
|
|
3
|
+
import StatusIcon from '../statusIcon/StatusIcon.mjs';
|
|
4
|
+
import Circle from '../common/circle/Circle.mjs';
|
|
5
|
+
import { useState } from 'react';
|
|
6
|
+
import { clsx } from 'clsx';
|
|
7
|
+
import { Briefcase, Profile } from '@transferwise/icons';
|
|
8
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
9
|
+
import { getInitials } from '../common/initials.mjs';
|
|
10
|
+
|
|
11
|
+
const AvatarViewDefaultSize = 48;
|
|
12
|
+
/** Non interactive avatar view has custom border width */
|
|
13
|
+
const mapNonInteractiveBorderWidth = {
|
|
14
|
+
16: 0.667,
|
|
15
|
+
24: 1,
|
|
16
|
+
32: 1,
|
|
17
|
+
40: 1.25,
|
|
18
|
+
48: 1.5,
|
|
19
|
+
56: 1.75,
|
|
20
|
+
72: 2.25
|
|
21
|
+
};
|
|
22
|
+
/** Selected state has custom border width */
|
|
23
|
+
const mapSelectedBorderWidth = {
|
|
24
|
+
16: 1,
|
|
25
|
+
24: 1,
|
|
26
|
+
32: 1,
|
|
27
|
+
40: 2,
|
|
28
|
+
48: 2,
|
|
29
|
+
56: 2,
|
|
30
|
+
72: 2
|
|
31
|
+
};
|
|
32
|
+
function AvatarView({
|
|
33
|
+
children = undefined,
|
|
34
|
+
size = AvatarViewDefaultSize,
|
|
35
|
+
selected,
|
|
36
|
+
notification,
|
|
37
|
+
badge,
|
|
38
|
+
entity,
|
|
39
|
+
action,
|
|
40
|
+
className,
|
|
41
|
+
style
|
|
42
|
+
}) {
|
|
43
|
+
return /*#__PURE__*/jsx(Interactive, {
|
|
44
|
+
...action,
|
|
45
|
+
className: clsx('np-avatar-view', {
|
|
46
|
+
'np-avatar-view-selected': selected
|
|
47
|
+
}, className),
|
|
48
|
+
children: /*#__PURE__*/jsx(Badges, {
|
|
49
|
+
asset: badge,
|
|
50
|
+
avatarProps: {
|
|
51
|
+
size,
|
|
52
|
+
notification,
|
|
53
|
+
selected
|
|
54
|
+
},
|
|
55
|
+
children: /*#__PURE__*/jsx(Circle, {
|
|
56
|
+
size: size,
|
|
57
|
+
fixedSize: true,
|
|
58
|
+
style: {
|
|
59
|
+
// @ts-expect-error CSS custom props allowed
|
|
60
|
+
'--avatar-view-selected-border-width': `${mapSelectedBorderWidth[size]}px`,
|
|
61
|
+
'--avatar-view-non-interactive-border-width': `${mapNonInteractiveBorderWidth[size]}px`,
|
|
62
|
+
...style
|
|
63
|
+
},
|
|
64
|
+
children: children === undefined ? /*#__PURE__*/jsx(Entity, {
|
|
65
|
+
...entity
|
|
66
|
+
}) : children
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function Interactive({
|
|
72
|
+
children,
|
|
73
|
+
onClick,
|
|
74
|
+
href,
|
|
75
|
+
target,
|
|
76
|
+
className,
|
|
77
|
+
'aria-label': ariaLabel,
|
|
78
|
+
'aria-labelledby': ariaLabelledby
|
|
79
|
+
}) {
|
|
80
|
+
const elementName = onClick ? 'button' : href ? 'a' : null;
|
|
81
|
+
if (elementName === null) {
|
|
82
|
+
// non interactive
|
|
83
|
+
return /*#__PURE__*/jsx("div", {
|
|
84
|
+
className: className,
|
|
85
|
+
children: children
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const a11yProps = {
|
|
89
|
+
ariaLabel,
|
|
90
|
+
ariaLabelledby
|
|
91
|
+
};
|
|
92
|
+
if (elementName === 'button') {
|
|
93
|
+
return /*#__PURE__*/jsx("button", {
|
|
94
|
+
type: "button",
|
|
95
|
+
className: clsx(className, 'np-avatar-view-interactive', 'btn-unstyled'),
|
|
96
|
+
onClick: onClick,
|
|
97
|
+
...a11yProps,
|
|
98
|
+
children: children
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (elementName === 'a') {
|
|
102
|
+
return (
|
|
103
|
+
/*#__PURE__*/
|
|
104
|
+
// eslint-disable-next-line react/jsx-no-target-blank
|
|
105
|
+
jsx("a", {
|
|
106
|
+
href: href,
|
|
107
|
+
target: target,
|
|
108
|
+
rel: target === '_blank' ? 'noreferrer' : undefined,
|
|
109
|
+
className: clsx(className, 'np-avatar-view-interactive', 'text-no-decoration'),
|
|
110
|
+
...a11yProps,
|
|
111
|
+
children: children
|
|
112
|
+
})
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const mapBadgeSize = {
|
|
117
|
+
16: 'sm',
|
|
118
|
+
24: 'sm',
|
|
119
|
+
32: 'sm',
|
|
120
|
+
40: 'sm',
|
|
121
|
+
48: 'sm',
|
|
122
|
+
56: 'lg',
|
|
123
|
+
72: 'lg'
|
|
124
|
+
};
|
|
125
|
+
/** AvatarView has a custom sizes for badge */
|
|
126
|
+
const mapNotificationSize = {
|
|
127
|
+
16: 6,
|
|
128
|
+
24: 8,
|
|
129
|
+
32: 10,
|
|
130
|
+
40: 10,
|
|
131
|
+
48: 14,
|
|
132
|
+
56: 16,
|
|
133
|
+
72: 20
|
|
134
|
+
};
|
|
135
|
+
function Badges({
|
|
136
|
+
children,
|
|
137
|
+
asset,
|
|
138
|
+
avatarProps
|
|
139
|
+
}) {
|
|
140
|
+
const {
|
|
141
|
+
size = AvatarViewDefaultSize,
|
|
142
|
+
selected,
|
|
143
|
+
notification
|
|
144
|
+
} = avatarProps;
|
|
145
|
+
if (asset || selected || notification) {
|
|
146
|
+
if (asset && size > 16) {
|
|
147
|
+
return /*#__PURE__*/jsx(Badge, {
|
|
148
|
+
badge: asset,
|
|
149
|
+
size: mapBadgeSize[size],
|
|
150
|
+
children: children
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (selected && size > 16) {
|
|
154
|
+
return /*#__PURE__*/jsx(Badge, {
|
|
155
|
+
badge: /*#__PURE__*/jsx(StatusIcon, {
|
|
156
|
+
sentiment: "positive",
|
|
157
|
+
size: mapBadgeSize[size]
|
|
158
|
+
}),
|
|
159
|
+
size: mapBadgeSize[size],
|
|
160
|
+
children: children
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (notification) {
|
|
164
|
+
return /*#__PURE__*/jsx(Badge, {
|
|
165
|
+
badge: /*#__PURE__*/jsx(NotificationDot
|
|
166
|
+
// @ts-expect-error CSS custom props allowed
|
|
167
|
+
, {
|
|
168
|
+
style: {
|
|
169
|
+
'--badge-notification-dot-size': `${mapNotificationSize[size]}px`
|
|
170
|
+
}
|
|
171
|
+
}),
|
|
172
|
+
position: "top-right",
|
|
173
|
+
size: mapBadgeSize[size],
|
|
174
|
+
children: children
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return children;
|
|
179
|
+
}
|
|
180
|
+
function Entity({
|
|
181
|
+
imageSrc = null,
|
|
182
|
+
name = null,
|
|
183
|
+
profileType = null
|
|
184
|
+
}) {
|
|
185
|
+
const [tryLoadImage, setTryLoadImage] = useState(true);
|
|
186
|
+
if (imageSrc && tryLoadImage) {
|
|
187
|
+
return /*#__PURE__*/jsx("img", {
|
|
188
|
+
src: imageSrc,
|
|
189
|
+
alt: "",
|
|
190
|
+
onError: () => setTryLoadImage(false)
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
if (profileType) {
|
|
194
|
+
return profileType === 'business' ? /*#__PURE__*/jsx(Briefcase, {}) : /*#__PURE__*/jsx(Profile, {});
|
|
195
|
+
}
|
|
196
|
+
if (name) {
|
|
197
|
+
return /*#__PURE__*/jsx(Fragment, {
|
|
198
|
+
children: getInitials(name)
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return /*#__PURE__*/jsx(Profile, {});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export { AvatarView as default };
|
|
205
|
+
//# sourceMappingURL=AvatarView.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarView.mjs","sources":["../../src/avatarView/AvatarView.tsx"],"sourcesContent":["import Badge from '../badge';\nimport { getInitials } from '../common';\nimport NotificationDot from '../common/notificationDot/NotificationDot';\nimport StatusIcon from '../statusIcon';\nimport Circle from '../common/circle';\nimport { HTMLAttributes, PropsWithChildren, useState } from 'react';\nimport { ActionOptions as ActionProps } from '../common/action/Action';\nimport { clsx } from 'clsx';\nimport { Briefcase, Profile } from '@transferwise/icons';\n\ntype InteractiveProps = Omit<ActionProps, 'text'> &\n Pick<HTMLAttributes<HTMLDivElement>, 'className' | 'aria-labelledby'>;\n\nconst AvatarViewDefaultSize = 48;\n\nexport type Props = PropsWithChildren<{\n size?: 16 | 24 | 32 | 40 | 48 | 56 | 72;\n /** adds prebuilt notification dot via Badge component */\n notification?: boolean;\n /** adds custom badge to avatar */\n badge?: React.ReactNode;\n entity?: EntityProps;\n /** changes background color to neutral and wraps component with button */\n action?: InteractiveProps;\n /** changes background color to neutral and adds predefined Badge */\n selected?: boolean;\n /** often use case to override `background-color` or `border` */\n style?: React.CSSProperties;\n}> &\n Pick<HTMLAttributes<HTMLDivElement>, 'className' | 'style'>;\n\n/** Non interactive avatar view has custom border width */\nconst mapNonInteractiveBorderWidth = {\n 16: 0.667,\n 24: 1,\n 32: 1,\n 40: 1.25,\n 48: 1.5,\n 56: 1.75,\n 72: 2.25,\n};\n\n/** Selected state has custom border width */\nconst mapSelectedBorderWidth = {\n 16: 1,\n 24: 1,\n 32: 1,\n 40: 2,\n 48: 2,\n 56: 2,\n 72: 2,\n};\n\nfunction AvatarView({\n children = undefined,\n size = AvatarViewDefaultSize,\n selected,\n notification,\n badge,\n entity,\n action,\n className,\n style,\n}: Props) {\n return (\n <Interactive\n {...action}\n className={clsx('np-avatar-view', { 'np-avatar-view-selected': selected }, className)}\n >\n <Badges asset={badge} avatarProps={{ size, notification, selected }}>\n <Circle\n size={size}\n fixedSize\n style={{\n // @ts-expect-error CSS custom props allowed\n '--avatar-view-selected-border-width': `${mapSelectedBorderWidth[size]}px`,\n '--avatar-view-non-interactive-border-width': `${mapNonInteractiveBorderWidth[size]}px`,\n ...style,\n }}\n >\n {children === undefined ? <Entity {...entity} /> : children}\n </Circle>\n </Badges>\n </Interactive>\n );\n}\n\nfunction Interactive({\n children,\n onClick,\n href,\n target,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n}: PropsWithChildren<InteractiveProps>) {\n const elementName: React.ElementType | null = onClick ? 'button' : href ? 'a' : null;\n if (elementName === null) {\n // non interactive\n return <div className={className}>{children}</div>;\n }\n const a11yProps = { ariaLabel, ariaLabelledby };\n if (elementName === 'button') {\n return (\n <button\n type=\"button\"\n className={clsx(className, 'np-avatar-view-interactive', 'btn-unstyled')}\n onClick={onClick}\n {...a11yProps}\n >\n {children}\n </button>\n );\n }\n if (elementName === 'a') {\n return (\n // eslint-disable-next-line react/jsx-no-target-blank\n <a\n href={href}\n target={target}\n rel={target === '_blank' ? 'noreferrer' : undefined}\n className={clsx(className, 'np-avatar-view-interactive', 'text-no-decoration')}\n {...a11yProps}\n >\n {children}\n </a>\n );\n }\n}\n\nconst mapBadgeSize = {\n 16: 'sm',\n 24: 'sm',\n 32: 'sm',\n 40: 'sm',\n 48: 'sm',\n 56: 'lg',\n 72: 'lg',\n};\n\n/** AvatarView has a custom sizes for badge */\nconst mapNotificationSize = {\n 16: 6,\n 24: 8,\n 32: 10,\n 40: 10,\n 48: 14,\n 56: 16,\n 72: 20,\n};\n\ntype BadgesProps = PropsWithChildren<{\n asset: React.ReactNode;\n avatarProps: Pick<Props, 'selected' | 'size' | 'notification'>;\n}>;\n\nfunction Badges({ children, asset, avatarProps }: BadgesProps) {\n const { size = AvatarViewDefaultSize, selected, notification } = avatarProps;\n if (asset || selected || notification) {\n if (asset && size > 16) {\n return (\n <Badge badge={asset} size={mapBadgeSize[size]}>\n {children}\n </Badge>\n );\n }\n if (selected && size > 16) {\n return (\n <Badge\n badge={<StatusIcon sentiment=\"positive\" size={mapBadgeSize[size]} />}\n size={mapBadgeSize[size]}\n >\n {children}\n </Badge>\n );\n }\n if (notification) {\n return (\n <Badge\n badge={\n <NotificationDot\n // @ts-expect-error CSS custom props allowed\n style={{ '--badge-notification-dot-size': `${mapNotificationSize[size]}px` }}\n />\n }\n position=\"top-right\"\n size={mapBadgeSize[size]}\n >\n {children}\n </Badge>\n );\n }\n }\n return children;\n}\n\nexport type EntityProps = {\n imageSrc?: string | null;\n name?: string | null;\n profileType?: 'personal' | 'business' | null;\n};\n\nfunction Entity({ imageSrc = null, name = null, profileType = null }: EntityProps) {\n const [tryLoadImage, setTryLoadImage] = useState(true);\n if (imageSrc && tryLoadImage) {\n return <img src={imageSrc} alt=\"\" onError={() => setTryLoadImage(false)} />;\n }\n if (profileType) {\n return profileType === 'business' ? <Briefcase /> : <Profile />;\n }\n if (name) {\n return <>{getInitials(name)}</>;\n }\n return <Profile />;\n}\n\nexport default AvatarView;\n"],"names":["AvatarViewDefaultSize","mapNonInteractiveBorderWidth","mapSelectedBorderWidth","AvatarView","children","undefined","size","selected","notification","badge","entity","action","className","style","_jsx","Interactive","clsx","Badges","asset","avatarProps","Circle","fixedSize","Entity","onClick","href","target","ariaLabel","ariaLabelledby","elementName","a11yProps","type","rel","mapBadgeSize","mapNotificationSize","Badge","StatusIcon","sentiment","NotificationDot","position","imageSrc","name","profileType","tryLoadImage","setTryLoadImage","useState","src","alt","onError","Briefcase","Profile","_Fragment","getInitials"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ var StatusIcon = require('../statusIcon/StatusIcon.js');
|
|
|
9
9
|
var jsxRuntime = require('react/jsx-runtime');
|
|
10
10
|
var profileType = require('../common/propsValues/profileType.js');
|
|
11
11
|
var size = require('../common/propsValues/size.js');
|
|
12
|
+
var initials = require('../common/initials.js');
|
|
12
13
|
|
|
13
14
|
const OptionalBadge = ({
|
|
14
15
|
url,
|
|
@@ -44,6 +45,9 @@ const OptionalBadge = ({
|
|
|
44
45
|
children: children
|
|
45
46
|
});
|
|
46
47
|
};
|
|
48
|
+
/**
|
|
49
|
+
* @deprecated Use `AvatarView` component instead
|
|
50
|
+
*/
|
|
47
51
|
const AvatarWrapper = ({
|
|
48
52
|
url,
|
|
49
53
|
'aria-label': ariaLabel,
|
|
@@ -94,9 +98,9 @@ const AvatarWrapper = ({
|
|
|
94
98
|
return {
|
|
95
99
|
type: avatarTypes.AvatarType.INITIALS,
|
|
96
100
|
children: /*#__PURE__*/jsxRuntime.jsx(jsxRuntime.Fragment, {
|
|
97
|
-
children: getInitials(name)
|
|
101
|
+
children: initials.getInitials(name)
|
|
98
102
|
}),
|
|
99
|
-
backgroundColorSeed:
|
|
103
|
+
backgroundColorSeed: name?.toString(),
|
|
100
104
|
...updatedAvatarProps
|
|
101
105
|
};
|
|
102
106
|
}
|
|
@@ -120,13 +124,6 @@ const AvatarWrapper = ({
|
|
|
120
124
|
})
|
|
121
125
|
});
|
|
122
126
|
};
|
|
123
|
-
function getInitials(name) {
|
|
124
|
-
const allInitials = name.split(' ').map(part => part[0]).join('').toUpperCase();
|
|
125
|
-
if (allInitials.length === 1) {
|
|
126
|
-
return allInitials[0];
|
|
127
|
-
}
|
|
128
|
-
return allInitials[0] + allInitials.slice(-1);
|
|
129
|
-
}
|
|
130
127
|
|
|
131
128
|
module.exports = AvatarWrapper;
|
|
132
129
|
//# sourceMappingURL=AvatarWrapper.js.map
|