@toptal/picasso-avatar 3.0.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-package/src/Avatar/Avatar.d.ts +2 -3
- package/dist-package/src/Avatar/Avatar.d.ts.map +1 -1
- package/dist-package/src/Avatar/Avatar.js +2 -5
- package/dist-package/src/Avatar/Avatar.js.map +1 -1
- package/dist-package/src/Avatar/AvatarWrapper/AvatarWrapper.d.ts +1 -2
- package/dist-package/src/Avatar/AvatarWrapper/AvatarWrapper.d.ts.map +1 -1
- package/dist-package/src/Avatar/AvatarWrapper/AvatarWrapper.js +19 -4
- package/dist-package/src/Avatar/AvatarWrapper/AvatarWrapper.js.map +1 -1
- package/dist-package/src/Avatar/AvatarWrapper/styles.d.ts +3 -2
- package/dist-package/src/Avatar/AvatarWrapper/styles.d.ts.map +1 -1
- package/dist-package/src/Avatar/AvatarWrapper/styles.js +22 -26
- package/dist-package/src/Avatar/AvatarWrapper/styles.js.map +1 -1
- package/dist-package/src/Avatar/ImageAvatar/ImageAvatar.d.ts.map +1 -1
- package/dist-package/src/Avatar/ImageAvatar/ImageAvatar.js +2 -12
- package/dist-package/src/Avatar/ImageAvatar/ImageAvatar.js.map +1 -1
- package/dist-package/src/AvatarCompound/index.d.ts +1 -2
- package/dist-package/src/AvatarCompound/index.d.ts.map +1 -1
- package/dist-package/src/AvatarGroup/AvatarGroup.d.ts +3 -1
- package/dist-package/src/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist-package/src/AvatarGroup/AvatarGroup.js +3 -3
- package/dist-package/src/AvatarGroup/AvatarGroup.js.map +1 -1
- package/package.json +3 -3
- package/src/Avatar/Avatar.tsx +4 -6
- package/src/Avatar/AvatarWrapper/AvatarWrapper.tsx +52 -14
- package/src/Avatar/AvatarWrapper/styles.ts +24 -27
- package/src/Avatar/ImageAvatar/ImageAvatar.tsx +0 -25
- package/src/Avatar/story/ToptalLogo.example.tsx +35 -0
- package/src/Avatar/story/Variants.example.tsx +1 -10
- package/src/Avatar/story/index.jsx +5 -0
- package/src/Avatar/test.tsx +7 -2
- package/src/AvatarGroup/AvatarGroup.tsx +5 -1
|
@@ -10,8 +10,8 @@ export interface Props extends StandardProps, HTMLAttributes<HTMLDivElement> {
|
|
|
10
10
|
size?: SizeType<'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large'>;
|
|
11
11
|
/** Photo url */
|
|
12
12
|
src?: string;
|
|
13
|
-
/**
|
|
14
|
-
|
|
13
|
+
/** Displays Toptal logo */
|
|
14
|
+
showEmblem?: boolean;
|
|
15
15
|
/** Callback to show edit-on-click and receive event */
|
|
16
16
|
onEdit?: (event: React.MouseEvent) => void;
|
|
17
17
|
testIds?: {
|
|
@@ -26,7 +26,6 @@ export declare const Avatar: {
|
|
|
26
26
|
(props: Props): JSX.Element;
|
|
27
27
|
defaultProps: {
|
|
28
28
|
size: string;
|
|
29
|
-
variant: string;
|
|
30
29
|
};
|
|
31
30
|
displayName: string;
|
|
32
31
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/Avatar/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,KAAsB,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AASrE,MAAM,WAAW,KAAM,SAAQ,aAAa,EAAE,cAAc,CAAC,cAAc,CAAC;IAC1E,eAAe;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW;IACX,IAAI,CAAC,EAAE,QAAQ,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAA;IACpE,gBAAgB;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,
|
|
1
|
+
{"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/Avatar/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,KAAsB,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AASrE,MAAM,WAAW,KAAM,SAAQ,aAAa,EAAE,cAAc,CAAC,cAAc,CAAC;IAC1E,eAAe;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW;IACX,IAAI,CAAC,EAAE,QAAQ,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAA;IACpE,gBAAgB;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2BAA2B;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,uDAAuD;IACvD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IAC1C,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,aAAa,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;CACF;AAED,eAAO,MAAM,MAAM;YAAW,KAAK;;;;;CAqGlC,CAAA;AAQD,eAAe,MAAM,CAAA"}
|
|
@@ -17,7 +17,7 @@ import IconAvatar from './IconAvatar/IconAvatar';
|
|
|
17
17
|
import AvatarWrapper from './AvatarWrapper/AvatarWrapper';
|
|
18
18
|
import AvatarEditContainer from './AvatarEditContainer/AvatarEditContainer';
|
|
19
19
|
export const Avatar = (props) => {
|
|
20
|
-
const { alt, src, className, name, size, style,
|
|
20
|
+
const { alt, src, className, name, size, style, showEmblem, testIds, onEdit, 'data-private': dataPrivate } = props, rest = __rest(props, ["alt", "src", "className", "name", "size", "style", "showEmblem", "testIds", "onEdit", 'data-private']);
|
|
21
21
|
const renderAvatar = useCallback(() => {
|
|
22
22
|
if (src) {
|
|
23
23
|
return (React.createElement(ImageAvatar, { alt: alt, className: className, name: name,
|
|
@@ -51,9 +51,7 @@ export const Avatar = (props) => {
|
|
|
51
51
|
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
52
52
|
, Object.assign({
|
|
53
53
|
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
54
|
-
|
|
55
|
-
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
56
|
-
size: size, "data-testid": testIds === null || testIds === void 0 ? void 0 : testIds.wrapper }, rest), renderAvatar()));
|
|
54
|
+
size: size, showEmblem: showEmblem, "data-testid": testIds === null || testIds === void 0 ? void 0 : testIds.wrapper }, rest), renderAvatar()));
|
|
57
55
|
if (isEditable) {
|
|
58
56
|
return (React.createElement("div", { className: 'relative' },
|
|
59
57
|
avatar,
|
|
@@ -63,7 +61,6 @@ export const Avatar = (props) => {
|
|
|
63
61
|
};
|
|
64
62
|
Avatar.defaultProps = {
|
|
65
63
|
size: 'xsmall',
|
|
66
|
-
variant: 'square',
|
|
67
64
|
};
|
|
68
65
|
Avatar.displayName = 'Avatar';
|
|
69
66
|
export default Avatar;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sourceRoot":"","sources":["../../../src/Avatar/Avatar.tsx"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE9E,OAAO,WAAW,MAAM,2BAA2B,CAAA;AACnD,OAAO,UAAU,MAAM,yBAAyB,CAAA;AAChD,OAAO,UAAU,MAAM,yBAAyB,CAAA;AAChD,OAAO,aAAa,MAAM,+BAA+B,CAAA;AACzD,OAAO,mBAAmB,MAAM,2CAA2C,CAAA;AAwB3E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAY,EAAE,EAAE;IACrC,MAAM,EACJ,GAAG,EACH,GAAG,EACH,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,
|
|
1
|
+
{"version":3,"file":"Avatar.js","sourceRoot":"","sources":["../../../src/Avatar/Avatar.tsx"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE9E,OAAO,WAAW,MAAM,2BAA2B,CAAA;AACnD,OAAO,UAAU,MAAM,yBAAyB,CAAA;AAChD,OAAO,UAAU,MAAM,yBAAyB,CAAA;AAChD,OAAO,aAAa,MAAM,+BAA+B,CAAA;AACzD,OAAO,mBAAmB,MAAM,2CAA2C,CAAA;AAwB3E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAY,EAAE,EAAE;IACrC,MAAM,EACJ,GAAG,EACH,GAAG,EACH,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,UAAU,EACV,OAAO,EACP,MAAM,EACN,cAAc,EAAE,WAAW,KAEzB,KAAK,EADJ,IAAI,UACL,KAAK,EAZH,uGAYL,CAAQ,CAAA;IAET,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,IAAI,GAAG,EAAE;YACP,OAAO,CACL,oBAAC,WAAW,IACV,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI;gBACV,uEAAuE;gBACvE,IAAI,EAAE,IAAK,EACX,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,iBACC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,kBACb,WAAW,GACzB,CACH,CAAA;SACF;QAED,IAAI,IAAI,EAAE;YACR,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;YACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,qBAAqB,CAAA;YAE3D,OAAO,CACL,oBAAC,UAAU,IACT,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBACxC,uEAAuE;gBACvE,IAAI,EAAE,IAAK,iBACE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,kBACZ,WAAW,IAExB,QAAQ,CACE,CACd,CAAA;SACF;QAED,OAAO,CACL,oBAAC,UAAU,mBACI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAC1B,SAAS,EAAE,SAAS;YACpB,uEAAuE;YACvE,IAAI,EAAE,IAAK,GACX,CACH,CAAA;IACH,CAAC,EAAE;QACD,IAAI;QACJ,GAAG;QACH,SAAS;QACT,GAAG;QACH,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI;QACb,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK;QACd,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI;QACb,IAAI;QACJ,KAAK;QACL,WAAW;KACZ,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAElC,MAAM,MAAM,GAAG,CACb,oBAAC,aAAa;IACZ,uEAAuE;;QAAvE,uEAAuE;QACvE,IAAI,EAAE,IAAK,EACX,UAAU,EAAE,UAAU,iBACT,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,IACzB,IAAI,GAEP,YAAY,EAAE,CACD,CACjB,CAAA;IAED,IAAI,UAAU,EAAE;QACd,OAAO,CACL,6BAAK,SAAS,EAAC,UAAU;YACtB,MAAM;YACN,UAAU,IAAI,CACb,oBAAC,mBAAmB,mBACL,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,EACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,GACV,CACH,CACG,CACP,CAAA;KACF;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,YAAY,GAAG;IACpB,IAAI,EAAE,QAAQ;CACf,CAAA;AAED,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAA;AAE7B,eAAe,MAAM,CAAA"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import type { BaseProps, SizeType } from '@toptal/picasso-shared';
|
|
3
3
|
export declare type Size = SizeType<'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large'>;
|
|
4
|
-
export declare type Variant = 'square' | 'portrait' | 'landscape';
|
|
5
4
|
export interface Props extends BaseProps {
|
|
6
5
|
children: ReactNode;
|
|
7
6
|
size: Size;
|
|
8
|
-
|
|
7
|
+
showEmblem?: boolean;
|
|
9
8
|
}
|
|
10
9
|
declare const AvatarWrapper: (props: Props) => JSX.Element;
|
|
11
10
|
export default AvatarWrapper;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvatarWrapper.d.ts","sourceRoot":"","sources":["../../../../src/Avatar/AvatarWrapper/AvatarWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"AvatarWrapper.d.ts","sourceRoot":"","sources":["../../../../src/Avatar/AvatarWrapper/AvatarWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAMjE,oBAAY,IAAI,GAAG,QAAQ,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAA;AAEhF,MAAM,WAAW,KAAM,SAAQ,SAAS;IACtC,QAAQ,EAAE,SAAS,CAAA;IACnB,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAgCD,QAAA,MAAM,aAAa,UAAW,KAAK,gBAiClC,CAAA;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { twMerge } from '@toptal/picasso-tailwind-merge';
|
|
3
|
-
import {
|
|
2
|
+
import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge';
|
|
3
|
+
import { Logo } from '@toptal/picasso-logo';
|
|
4
|
+
import { avatarLogoClassesBySize, classBySize, clipClassBySize } from './styles';
|
|
5
|
+
const showLogo = (size, showEmblem) => {
|
|
6
|
+
const isTooSmall = ['xsmall', 'xxsmall'].includes(size);
|
|
7
|
+
if (isTooSmall || !showEmblem) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return true;
|
|
11
|
+
};
|
|
12
|
+
const AvatarLogo = ({ size }) => (React.createElement("div", { className: twJoin('flex absolute bottom-0', avatarLogoClassesBySize.root[size]), role: 'img', "aria-label": 'photo placeholder' },
|
|
13
|
+
React.createElement(Logo, { emblem: true, variant: 'blue',
|
|
14
|
+
// Necessary to decrease the default minWeight and minHeight so that the new width and height could apply
|
|
15
|
+
// eslint-disable-next-line no-inline-styles/no-inline-styles
|
|
16
|
+
style: { minWidth: '1px', minHeight: '1px' }, className: avatarLogoClassesBySize.logo[size] })));
|
|
4
17
|
const AvatarWrapper = (props) => {
|
|
5
|
-
const { children, className, style, 'data-testid': dataTestId, size,
|
|
6
|
-
return (React.createElement("div", {
|
|
18
|
+
const { children, className, style, 'data-testid': dataTestId, size, showEmblem = false, } = props;
|
|
19
|
+
return (React.createElement("div", { className: twJoin(`flex relative`, showLogo(size, showEmblem) && 'bg-white') },
|
|
20
|
+
React.createElement("div", { style: style, "data-testid": dataTestId, className: twMerge('relative bg-gray-500 text-[1rem] shrink-0 grow-0', classBySize[size], clipClassBySize[size], className) }, children),
|
|
21
|
+
showLogo(size, showEmblem) && React.createElement(AvatarLogo, { size: size })));
|
|
7
22
|
};
|
|
8
23
|
export default AvatarWrapper;
|
|
9
24
|
//# sourceMappingURL=AvatarWrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvatarWrapper.js","sourceRoot":"","sources":["../../../../src/Avatar/AvatarWrapper/AvatarWrapper.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"AvatarWrapper.js","sourceRoot":"","sources":["../../../../src/Avatar/AvatarWrapper/AvatarWrapper.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAE3C,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAUhF,MAAM,QAAQ,GAAG,CAAC,IAAU,EAAE,UAAoB,EAAW,EAAE;IAC7D,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAEvD,IAAI,UAAU,IAAI,CAAC,UAAU,EAAE;QAC7B,OAAO,KAAK,CAAA;KACb;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,EAAE,IAAI,EAAuB,EAAE,EAAE,CAAC,CACpD,6BACE,SAAS,EAAE,MAAM,CACf,wBAAwB,EACxB,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CACnC,EACD,IAAI,EAAC,KAAK,gBACC,mBAAmB;IAE9B,oBAAC,IAAI,IACH,MAAM,QACN,OAAO,EAAC,MAAM;QACd,yGAAyG;QACzG,6DAA6D;QAC7D,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAC5C,SAAS,EAAE,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,GAC7C,CACE,CACP,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,KAAY,EAAE,EAAE;IACrC,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,KAAK,EACL,aAAa,EAAE,UAAU,EACzB,IAAI,EACJ,UAAU,GAAG,KAAK,GACnB,GAAG,KAAK,CAAA;IAET,OAAO,CACL,6BACE,SAAS,EAAE,MAAM,CACf,eAAe,EACf,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,UAAU,CACzC;QAED,6BACE,KAAK,EAAE,KAAK,iBACC,UAAU,EACvB,SAAS,EAAE,OAAO,CAChB,kDAAkD,EAClD,WAAW,CAAC,IAAI,CAAC,EACjB,eAAe,CAAC,IAAI,CAAC,EACrB,SAAS,CACV,IAEA,QAAQ,CACL;QAEL,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,oBAAC,UAAU,IAAC,IAAI,EAAE,IAAI,GAAI,CACrD,CACP,CAAA;AACH,CAAC,CAAA;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { Size
|
|
2
|
-
export declare const
|
|
1
|
+
import type { Size } from './AvatarWrapper';
|
|
2
|
+
export declare const classBySize: Record<Size, string>;
|
|
3
3
|
export declare const clipClassBySize: Record<Size, string>;
|
|
4
|
+
export declare const avatarLogoClassesBySize: Record<string, Record<Size, string>>;
|
|
4
5
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/Avatar/AvatarWrapper/styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/Avatar/AvatarWrapper/styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAE3C,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAM5C,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAWhD,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAexE,CAAA"}
|
|
@@ -1,29 +1,9 @@
|
|
|
1
|
-
export const
|
|
2
|
-
xxsmall:
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
xsmall: {
|
|
8
|
-
square: 'w-[2.5em] h-[2.5em]',
|
|
9
|
-
portrait: 'w-[1.666666666em] h-[2.5em]',
|
|
10
|
-
landscape: 'w-[2.5em] h-[1.666666666em]',
|
|
11
|
-
},
|
|
12
|
-
small: {
|
|
13
|
-
square: 'w-[5em] h-[5em]',
|
|
14
|
-
portrait: 'w-[3.333333333em] h-[5em]',
|
|
15
|
-
landscape: 'w-[5em] h-[3.333333333em]',
|
|
16
|
-
},
|
|
17
|
-
medium: {
|
|
18
|
-
square: 'w-[7.5em] h-[7.5em]',
|
|
19
|
-
portrait: 'w-[5em] h-[7.5em]',
|
|
20
|
-
landscape: 'w-[7.5em] h-[5em]',
|
|
21
|
-
},
|
|
22
|
-
large: {
|
|
23
|
-
square: 'w-[10em] h-[10em]',
|
|
24
|
-
portrait: 'w-[7.5em] h-[10em]',
|
|
25
|
-
landscape: 'w-[10em] h-[7.5em]',
|
|
26
|
-
},
|
|
1
|
+
export const classBySize = {
|
|
2
|
+
xxsmall: 'w-[2em] h-[2em]',
|
|
3
|
+
xsmall: 'w-[2.5em] h-[2.5em]',
|
|
4
|
+
small: 'w-[5em] h-[5em]',
|
|
5
|
+
medium: 'w-[7.5em] h-[7.5em]',
|
|
6
|
+
large: 'w-[10em] h-[10em]',
|
|
27
7
|
};
|
|
28
8
|
export const clipClassBySize = {
|
|
29
9
|
xxsmall: '[clip-path:polygon(0_0,_100%_0,_100%_100%,_0.5em_100%,_0_calc(100%-0.5em))]',
|
|
@@ -32,4 +12,20 @@ export const clipClassBySize = {
|
|
|
32
12
|
medium: '[clip-path:polygon(0_0,_100%_0,_100%_100%,_1.5em_100%,_0_calc(100%-1.5em))]',
|
|
33
13
|
large: '[clip-path:polygon(0_0,_100%_0,_100%_100%,_1.5em_100%,_0_calc(100%-1.5em))]',
|
|
34
14
|
};
|
|
15
|
+
export const avatarLogoClassesBySize = {
|
|
16
|
+
root: {
|
|
17
|
+
xxsmall: '',
|
|
18
|
+
xsmall: '',
|
|
19
|
+
small: 'pl-[1px] pb-[1px]',
|
|
20
|
+
medium: 'pl-[2px] pb-[2px]',
|
|
21
|
+
large: 'pl-[3px] pb-[3px]',
|
|
22
|
+
},
|
|
23
|
+
logo: {
|
|
24
|
+
xxsmall: '',
|
|
25
|
+
xsmall: '',
|
|
26
|
+
small: 'w-[5.7px] h-[8px]',
|
|
27
|
+
medium: 'w-[8.54px] h-[12px]',
|
|
28
|
+
large: 'w-[7.12px] h-[10px]',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
35
31
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../src/Avatar/AvatarWrapper/styles.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../src/Avatar/AvatarWrapper/styles.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAyB;IAC/C,OAAO,EAAE,iBAAiB;IAC1B,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE,mBAAmB;CAC3B,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAyB;IACnD,OAAO,EACL,6EAA6E;IAC/E,MAAM,EACJ,6EAA6E;IAC/E,KAAK,EACH,yEAAyE;IAC3E,MAAM,EACJ,6EAA6E;IAC/E,KAAK,EACH,6EAA6E;CAChF,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAyC;IAC3E,IAAI,EAAE;QACJ,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,mBAAmB;QAC3B,KAAK,EAAE,mBAAmB;KAC3B;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,qBAAqB;QAC7B,KAAK,EAAE,qBAAqB;KAC7B;CACF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageAvatar.d.ts","sourceRoot":"","sources":["../../../../src/Avatar/ImageAvatar/ImageAvatar.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"ImageAvatar.d.ts","sourceRoot":"","sources":["../../../../src/Avatar/ImageAvatar/ImageAvatar.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAIjE,oBAAY,IAAI,GAAG,QAAQ,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAA;AAEhF,MAAM,WAAW,KAAM,SAAQ,SAAS;IACtC,IAAI,EAAE,IAAI,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,QAAA,MAAM,WAAW,UAAW,KAAK,gBA0BhC,CAAA;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Logo } from '@toptal/picasso-logo';
|
|
3
2
|
import { Image } from '@toptal/picasso-image';
|
|
4
3
|
import { twMerge } from '@toptal/picasso-tailwind-merge';
|
|
5
|
-
const AvatarLogo = ({ size }) => {
|
|
6
|
-
const isTooSmall = ['small', 'xsmall', 'xxsmall'].includes(size);
|
|
7
|
-
if (isTooSmall) {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
return (React.createElement("div", { className: 'flex absolute bottom-4 left-4', role: 'img', "aria-label": 'photo placeholder' },
|
|
11
|
-
React.createElement(Logo, { emblem: true, variant: 'white', className: 'w-[1.0625rem] h-6' })));
|
|
12
|
-
};
|
|
13
4
|
const ImageAvatar = (props) => {
|
|
14
|
-
const { alt, className, name,
|
|
5
|
+
const { alt, className, name, src, style, 'data-testid': dataTestId, 'data-private': dataPrivate, } = props;
|
|
15
6
|
return (React.createElement(React.Fragment, null,
|
|
16
|
-
React.createElement(Image, { alt: alt || name || '', className: twMerge('object-cover w-full h-full absolute left-0 top-0 [image-rendering:-webkit-optimize-contrast]', className), src: src, style: style, "data-testid": dataTestId, "data-private": dataPrivate })
|
|
17
|
-
React.createElement(AvatarLogo, { size: size })));
|
|
7
|
+
React.createElement(Image, { alt: alt || name || '', className: twMerge('object-cover w-full h-full absolute left-0 top-0 [image-rendering:-webkit-optimize-contrast]', className), src: src, style: style, "data-testid": dataTestId, "data-private": dataPrivate })));
|
|
18
8
|
};
|
|
19
9
|
export default ImageAvatar;
|
|
20
10
|
//# sourceMappingURL=ImageAvatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageAvatar.js","sourceRoot":"","sources":["../../../../src/Avatar/ImageAvatar/ImageAvatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ImageAvatar.js","sourceRoot":"","sources":["../../../../src/Avatar/ImageAvatar/ImageAvatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAWxD,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,EAAE;IACnC,MAAM,EACJ,GAAG,EACH,SAAS,EACT,IAAI,EACJ,GAAG,EACH,KAAK,EACL,aAAa,EAAE,UAAU,EACzB,cAAc,EAAE,WAAW,GAC5B,GAAG,KAAK,CAAA;IAET,OAAO,CACL;QACE,oBAAC,KAAK,IACJ,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,EACtB,SAAS,EAAE,OAAO,CAChB,8FAA8F,EAC9F,SAAS,CACV,EACD,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,iBACC,UAAU,kBACT,WAAW,GACzB,CACD,CACJ,CAAA;AACH,CAAC,CAAA;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -3,12 +3,11 @@ export declare const AvatarCompound: {
|
|
|
3
3
|
(props: import("../Avatar/Avatar").Props): JSX.Element;
|
|
4
4
|
defaultProps: {
|
|
5
5
|
size: string;
|
|
6
|
-
variant: string;
|
|
7
6
|
};
|
|
8
7
|
displayName: string;
|
|
9
8
|
} & {
|
|
10
9
|
Group: {
|
|
11
|
-
({ className, style, testIds, items, limit, size, }: import("../AvatarGroup/AvatarGroup").Props): JSX.Element | null;
|
|
10
|
+
({ className, style, testIds, items, limit, size, showEmblem, }: import("../AvatarGroup/AvatarGroup").Props): JSX.Element | null;
|
|
12
11
|
defaultProps: {
|
|
13
12
|
limit: number;
|
|
14
13
|
size: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/AvatarCompound/index.ts"],"names":[],"mappings":";AAGA,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/AvatarCompound/index.ts"],"names":[],"mappings":";AAGA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAEzB,CAAA"}
|
|
@@ -13,6 +13,8 @@ export interface Props extends Omit<BaseProps, 'data-testid'> {
|
|
|
13
13
|
limit?: number;
|
|
14
14
|
/** Size */
|
|
15
15
|
size?: SizeType<'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large'>;
|
|
16
|
+
/** Displays Toptal logo */
|
|
17
|
+
showEmblem?: boolean;
|
|
16
18
|
/** data-testid to all parts of component */
|
|
17
19
|
testIds?: {
|
|
18
20
|
container?: string;
|
|
@@ -20,7 +22,7 @@ export interface Props extends Omit<BaseProps, 'data-testid'> {
|
|
|
20
22
|
};
|
|
21
23
|
}
|
|
22
24
|
declare const AvatarGroup: {
|
|
23
|
-
({ className, style, testIds, items, limit, size, }: Props): JSX.Element | null;
|
|
25
|
+
({ className, style, testIds, items, limit, size, showEmblem, }: Props): JSX.Element | null;
|
|
24
26
|
defaultProps: {
|
|
25
27
|
limit: number;
|
|
26
28
|
size: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvatarGroup.d.ts","sourceRoot":"","sources":["../../../src/AvatarGroup/AvatarGroup.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AASjE,aAAK,QAAQ,GAAG;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,WAAW,KAAM,SAAQ,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;IAC3D,gCAAgC;IAChC,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW;IACX,IAAI,CAAC,EAAE,QAAQ,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAA;IACpE,4CAA4C;IAC5C,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,QAAA,MAAM,WAAW;
|
|
1
|
+
{"version":3,"file":"AvatarGroup.d.ts","sourceRoot":"","sources":["../../../src/AvatarGroup/AvatarGroup.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AASjE,aAAK,QAAQ,GAAG;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,WAAW,KAAM,SAAQ,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;IAC3D,gCAAgC;IAChC,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW;IACX,IAAI,CAAC,EAAE,QAAQ,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAA;IACpE,2BAA2B;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,4CAA4C;IAC5C,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,QAAA,MAAM,WAAW;qEAQd,KAAK;;;;;CAkDP,CAAA;AAOD,eAAe,WAAW,CAAA"}
|
|
@@ -4,7 +4,7 @@ import { twMerge } from '@toptal/picasso-tailwind-merge';
|
|
|
4
4
|
import { Avatar } from '../Avatar';
|
|
5
5
|
import AvatarWrapper from '../Avatar/AvatarWrapper/AvatarWrapper';
|
|
6
6
|
import TextAvatar from '../Avatar/TextAvatar/TextAvatar';
|
|
7
|
-
const AvatarGroup = ({ className, style, testIds, items, limit, size, }) => {
|
|
7
|
+
const AvatarGroup = ({ className, style, testIds, items, limit, size, showEmblem = false, }) => {
|
|
8
8
|
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
9
9
|
const isOverLimit = items.length > limit;
|
|
10
10
|
// we need to add +1 for the last item that is going to be transformed to numbered Avatar
|
|
@@ -19,10 +19,10 @@ const AvatarGroup = ({ className, style, testIds, items, limit, size, }) => {
|
|
|
19
19
|
return (React.createElement(Container, { className: twMerge('max-w-full overflow-x-auto', className), "data-testid": testIds === null || testIds === void 0 ? void 0 : testIds.container, flex: true, gap: 'xsmall', style: style },
|
|
20
20
|
avatarsToRender.map(({ alt, name, src, 'data-testid': avatarTestId }, index) => (React.createElement(Avatar, { alt: alt, key: `${name}-${alt}-${String(index)}`, name: name,
|
|
21
21
|
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
22
|
-
size: size, src: src, "data-testid": avatarTestId }))),
|
|
22
|
+
size: size, showEmblem: showEmblem, src: src, "data-testid": avatarTestId }))),
|
|
23
23
|
isOverLimit ? (
|
|
24
24
|
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
25
|
-
React.createElement(AvatarWrapper, { size: size
|
|
25
|
+
React.createElement(AvatarWrapper, { size: size },
|
|
26
26
|
React.createElement(TextAvatar, { "data-testid": testIds === null || testIds === void 0 ? void 0 : testIds.overLimit, size: size },
|
|
27
27
|
"+",
|
|
28
28
|
itemsOverLimit))) : null));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvatarGroup.js","sourceRoot":"","sources":["../../../src/AvatarGroup/AvatarGroup.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,aAAa,MAAM,uCAAuC,CAAA;AACjE,OAAO,UAAU,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"AvatarGroup.js","sourceRoot":"","sources":["../../../src/AvatarGroup/AvatarGroup.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,aAAa,MAAM,uCAAuC,CAAA;AACjE,OAAO,UAAU,MAAM,iCAAiC,CAAA;AAyBxD,MAAM,WAAW,GAAG,CAAC,EACnB,SAAS,EACT,KAAK,EACL,OAAO,EACP,KAAK,EACL,KAAK,EACL,IAAI,EACJ,UAAU,GAAG,KAAK,GACZ,EAAE,EAAE;IACV,uEAAuE;IACvE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,KAAM,CAAA;IACzC,yFAAyF;IACzF,uEAAuE;IACvE,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,KAAM,GAAG,CAAC,CAAA;IAChD,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE;IACH,uEAAuE;IACvE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAClD,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAC5B,CAAA;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACtB,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,CACL,oBAAC,SAAS,IACR,SAAS,EAAE,OAAO,CAAC,4BAA4B,EAAE,SAAS,CAAC,iBAC9C,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAC/B,IAAI,QACJ,GAAG,EAAC,QAAQ,EACZ,KAAK,EAAE,KAAK;QAEX,eAAe,CAAC,GAAG,CAClB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1D,oBAAC,MAAM,IACL,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EACtC,IAAI,EAAE,IAAI;YACV,uEAAuE;YACvE,IAAI,EAAE,IAAK,EACX,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,GAAG,iBACK,YAAY,GACzB,CACH,CACF;QACA,WAAW,CAAC,CAAC,CAAC;QACb,uEAAuE;QACvE,oBAAC,aAAa,IAAC,IAAI,EAAE,IAAK;YAExB,oBAAC,UAAU,mBAAc,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,IAAI,EAAE,IAAK;;gBACpD,cAAc,CACL,CACC,CACjB,CAAC,CAAC,CAAC,IAAI,CACE,CACb,CAAA;AACH,CAAC,CAAA;AAED,WAAW,CAAC,YAAY,GAAG;IACzB,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,QAAQ;CACf,CAAA;AAED,eAAe,WAAW,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toptal/picasso-avatar",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Toptal UI components library - Avatar",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"homepage": "https://github.com/toptal/picasso/tree/master/packages/picasso#readme",
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@toptal/picasso-container": "1.0.3",
|
|
26
|
-
"@toptal/picasso-icons": "1.
|
|
26
|
+
"@toptal/picasso-icons": "1.5.0",
|
|
27
27
|
"@toptal/picasso-image": "1.0.3",
|
|
28
|
-
"@toptal/picasso-logo": "1.0.
|
|
28
|
+
"@toptal/picasso-logo": "1.0.8",
|
|
29
29
|
"@toptal/picasso-shared": "15.0.0",
|
|
30
30
|
"@toptal/picasso-typography": "2.0.2",
|
|
31
31
|
"@toptal/picasso-utils": "1.0.3"
|
package/src/Avatar/Avatar.tsx
CHANGED
|
@@ -18,8 +18,8 @@ export interface Props extends StandardProps, HTMLAttributes<HTMLDivElement> {
|
|
|
18
18
|
size?: SizeType<'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large'>
|
|
19
19
|
/** Photo url */
|
|
20
20
|
src?: string
|
|
21
|
-
/**
|
|
22
|
-
|
|
21
|
+
/** Displays Toptal logo */
|
|
22
|
+
showEmblem?: boolean
|
|
23
23
|
/** Callback to show edit-on-click and receive event */
|
|
24
24
|
onEdit?: (event: React.MouseEvent) => void
|
|
25
25
|
testIds?: {
|
|
@@ -39,7 +39,7 @@ export const Avatar = (props: Props) => {
|
|
|
39
39
|
name,
|
|
40
40
|
size,
|
|
41
41
|
style,
|
|
42
|
-
|
|
42
|
+
showEmblem,
|
|
43
43
|
testIds,
|
|
44
44
|
onEdit,
|
|
45
45
|
'data-private': dataPrivate,
|
|
@@ -106,10 +106,9 @@ export const Avatar = (props: Props) => {
|
|
|
106
106
|
|
|
107
107
|
const avatar = (
|
|
108
108
|
<AvatarWrapper
|
|
109
|
-
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
110
|
-
variant={variant!}
|
|
111
109
|
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
112
110
|
size={size!}
|
|
111
|
+
showEmblem={showEmblem}
|
|
113
112
|
data-testid={testIds?.wrapper}
|
|
114
113
|
{...rest}
|
|
115
114
|
>
|
|
@@ -137,7 +136,6 @@ export const Avatar = (props: Props) => {
|
|
|
137
136
|
|
|
138
137
|
Avatar.defaultProps = {
|
|
139
138
|
size: 'xsmall',
|
|
140
|
-
variant: 'square',
|
|
141
139
|
}
|
|
142
140
|
|
|
143
141
|
Avatar.displayName = 'Avatar'
|
|
@@ -1,20 +1,49 @@
|
|
|
1
1
|
import type { ReactNode } from 'react'
|
|
2
2
|
import React from 'react'
|
|
3
3
|
import type { BaseProps, SizeType } from '@toptal/picasso-shared'
|
|
4
|
-
import { twMerge } from '@toptal/picasso-tailwind-merge'
|
|
4
|
+
import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge'
|
|
5
|
+
import { Logo } from '@toptal/picasso-logo'
|
|
5
6
|
|
|
6
|
-
import {
|
|
7
|
+
import { avatarLogoClassesBySize, classBySize, clipClassBySize } from './styles'
|
|
7
8
|
|
|
8
9
|
export type Size = SizeType<'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large'>
|
|
9
10
|
|
|
10
|
-
export type Variant = 'square' | 'portrait' | 'landscape'
|
|
11
|
-
|
|
12
11
|
export interface Props extends BaseProps {
|
|
13
12
|
children: ReactNode
|
|
14
13
|
size: Size
|
|
15
|
-
|
|
14
|
+
showEmblem?: boolean
|
|
16
15
|
}
|
|
17
16
|
|
|
17
|
+
const showLogo = (size: Size, showEmblem?: boolean): boolean => {
|
|
18
|
+
const isTooSmall = ['xsmall', 'xxsmall'].includes(size)
|
|
19
|
+
|
|
20
|
+
if (isTooSmall || !showEmblem) {
|
|
21
|
+
return false
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return true
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const AvatarLogo = ({ size }: Pick<Props, 'size'>) => (
|
|
28
|
+
<div
|
|
29
|
+
className={twJoin(
|
|
30
|
+
'flex absolute bottom-0',
|
|
31
|
+
avatarLogoClassesBySize.root[size]
|
|
32
|
+
)}
|
|
33
|
+
role='img'
|
|
34
|
+
aria-label='photo placeholder'
|
|
35
|
+
>
|
|
36
|
+
<Logo
|
|
37
|
+
emblem
|
|
38
|
+
variant='blue'
|
|
39
|
+
// Necessary to decrease the default minWeight and minHeight so that the new width and height could apply
|
|
40
|
+
// eslint-disable-next-line no-inline-styles/no-inline-styles
|
|
41
|
+
style={{ minWidth: '1px', minHeight: '1px' }}
|
|
42
|
+
className={avatarLogoClassesBySize.logo[size]}
|
|
43
|
+
/>
|
|
44
|
+
</div>
|
|
45
|
+
)
|
|
46
|
+
|
|
18
47
|
const AvatarWrapper = (props: Props) => {
|
|
19
48
|
const {
|
|
20
49
|
children,
|
|
@@ -22,21 +51,30 @@ const AvatarWrapper = (props: Props) => {
|
|
|
22
51
|
style,
|
|
23
52
|
'data-testid': dataTestId,
|
|
24
53
|
size,
|
|
25
|
-
|
|
54
|
+
showEmblem = false,
|
|
26
55
|
} = props
|
|
27
56
|
|
|
28
57
|
return (
|
|
29
58
|
<div
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
'relative bg-gray-500 text-[1rem] shrink-0 grow-0',
|
|
34
|
-
classBySizeAndVariant[size][variant],
|
|
35
|
-
clipClassBySize[size],
|
|
36
|
-
className
|
|
59
|
+
className={twJoin(
|
|
60
|
+
`flex relative`,
|
|
61
|
+
showLogo(size, showEmblem) && 'bg-white'
|
|
37
62
|
)}
|
|
38
63
|
>
|
|
39
|
-
|
|
64
|
+
<div
|
|
65
|
+
style={style}
|
|
66
|
+
data-testid={dataTestId}
|
|
67
|
+
className={twMerge(
|
|
68
|
+
'relative bg-gray-500 text-[1rem] shrink-0 grow-0',
|
|
69
|
+
classBySize[size],
|
|
70
|
+
clipClassBySize[size],
|
|
71
|
+
className
|
|
72
|
+
)}
|
|
73
|
+
>
|
|
74
|
+
{children}
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
{showLogo(size, showEmblem) && <AvatarLogo size={size} />}
|
|
40
78
|
</div>
|
|
41
79
|
)
|
|
42
80
|
}
|
|
@@ -1,31 +1,11 @@
|
|
|
1
|
-
import type { Size
|
|
1
|
+
import type { Size } from './AvatarWrapper'
|
|
2
2
|
|
|
3
|
-
export const
|
|
4
|
-
xxsmall:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
xsmall: {
|
|
10
|
-
square: 'w-[2.5em] h-[2.5em]',
|
|
11
|
-
portrait: 'w-[1.666666666em] h-[2.5em]',
|
|
12
|
-
landscape: 'w-[2.5em] h-[1.666666666em]',
|
|
13
|
-
},
|
|
14
|
-
small: {
|
|
15
|
-
square: 'w-[5em] h-[5em]',
|
|
16
|
-
portrait: 'w-[3.333333333em] h-[5em]',
|
|
17
|
-
landscape: 'w-[5em] h-[3.333333333em]',
|
|
18
|
-
},
|
|
19
|
-
medium: {
|
|
20
|
-
square: 'w-[7.5em] h-[7.5em]',
|
|
21
|
-
portrait: 'w-[5em] h-[7.5em]',
|
|
22
|
-
landscape: 'w-[7.5em] h-[5em]',
|
|
23
|
-
},
|
|
24
|
-
large: {
|
|
25
|
-
square: 'w-[10em] h-[10em]',
|
|
26
|
-
portrait: 'w-[7.5em] h-[10em]',
|
|
27
|
-
landscape: 'w-[10em] h-[7.5em]',
|
|
28
|
-
},
|
|
3
|
+
export const classBySize: Record<Size, string> = {
|
|
4
|
+
xxsmall: 'w-[2em] h-[2em]',
|
|
5
|
+
xsmall: 'w-[2.5em] h-[2.5em]',
|
|
6
|
+
small: 'w-[5em] h-[5em]',
|
|
7
|
+
medium: 'w-[7.5em] h-[7.5em]',
|
|
8
|
+
large: 'w-[10em] h-[10em]',
|
|
29
9
|
}
|
|
30
10
|
|
|
31
11
|
export const clipClassBySize: Record<Size, string> = {
|
|
@@ -40,3 +20,20 @@ export const clipClassBySize: Record<Size, string> = {
|
|
|
40
20
|
large:
|
|
41
21
|
'[clip-path:polygon(0_0,_100%_0,_100%_100%,_1.5em_100%,_0_calc(100%-1.5em))]',
|
|
42
22
|
}
|
|
23
|
+
|
|
24
|
+
export const avatarLogoClassesBySize: Record<string, Record<Size, string>> = {
|
|
25
|
+
root: {
|
|
26
|
+
xxsmall: '',
|
|
27
|
+
xsmall: '',
|
|
28
|
+
small: 'pl-[1px] pb-[1px]',
|
|
29
|
+
medium: 'pl-[2px] pb-[2px]',
|
|
30
|
+
large: 'pl-[3px] pb-[3px]',
|
|
31
|
+
},
|
|
32
|
+
logo: {
|
|
33
|
+
xxsmall: '',
|
|
34
|
+
xsmall: '',
|
|
35
|
+
small: 'w-[5.7px] h-[8px]',
|
|
36
|
+
medium: 'w-[8.54px] h-[12px]',
|
|
37
|
+
large: 'w-[7.12px] h-[10px]',
|
|
38
|
+
},
|
|
39
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import type { BaseProps, SizeType } from '@toptal/picasso-shared'
|
|
3
|
-
import { Logo } from '@toptal/picasso-logo'
|
|
4
3
|
import { Image } from '@toptal/picasso-image'
|
|
5
4
|
import { twMerge } from '@toptal/picasso-tailwind-merge'
|
|
6
5
|
|
|
@@ -13,34 +12,11 @@ export interface Props extends BaseProps {
|
|
|
13
12
|
name?: string
|
|
14
13
|
}
|
|
15
14
|
|
|
16
|
-
type LogoProps = {
|
|
17
|
-
size: Size
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const AvatarLogo = ({ size }: LogoProps) => {
|
|
21
|
-
const isTooSmall = ['small', 'xsmall', 'xxsmall'].includes(size)
|
|
22
|
-
|
|
23
|
-
if (isTooSmall) {
|
|
24
|
-
return null
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return (
|
|
28
|
-
<div
|
|
29
|
-
className='flex absolute bottom-4 left-4'
|
|
30
|
-
role='img'
|
|
31
|
-
aria-label='photo placeholder'
|
|
32
|
-
>
|
|
33
|
-
<Logo emblem variant='white' className='w-[1.0625rem] h-6' />
|
|
34
|
-
</div>
|
|
35
|
-
)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
15
|
const ImageAvatar = (props: Props) => {
|
|
39
16
|
const {
|
|
40
17
|
alt,
|
|
41
18
|
className,
|
|
42
19
|
name,
|
|
43
|
-
size,
|
|
44
20
|
src,
|
|
45
21
|
style,
|
|
46
22
|
'data-testid': dataTestId,
|
|
@@ -60,7 +36,6 @@ const ImageAvatar = (props: Props) => {
|
|
|
60
36
|
data-testid={dataTestId}
|
|
61
37
|
data-private={dataPrivate}
|
|
62
38
|
/>
|
|
63
|
-
<AvatarLogo size={size} />
|
|
64
39
|
</>
|
|
65
40
|
)
|
|
66
41
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { Avatar, Container } from '@toptal/picasso'
|
|
3
|
+
import { SPACING_4 } from '@toptal/picasso-utils'
|
|
4
|
+
|
|
5
|
+
const Example = () => (
|
|
6
|
+
<div>
|
|
7
|
+
<Container inline>
|
|
8
|
+
<Avatar size='xxsmall' showEmblem />
|
|
9
|
+
</Container>
|
|
10
|
+
|
|
11
|
+
<Container inline left={SPACING_4}>
|
|
12
|
+
<Avatar size='xsmall' showEmblem />
|
|
13
|
+
</Container>
|
|
14
|
+
|
|
15
|
+
<Container inline left={SPACING_4}>
|
|
16
|
+
<Avatar size='small' showEmblem />
|
|
17
|
+
</Container>
|
|
18
|
+
|
|
19
|
+
<Container inline left={SPACING_4}>
|
|
20
|
+
<Avatar size='medium' name='Jacqueline Roque' showEmblem />
|
|
21
|
+
</Container>
|
|
22
|
+
|
|
23
|
+
<Container inline left={SPACING_4}>
|
|
24
|
+
<Avatar
|
|
25
|
+
size='large'
|
|
26
|
+
alt='Jacqueline Roque. Pablo Picasso, 1954'
|
|
27
|
+
name='Jacqueline Roque'
|
|
28
|
+
src='./jacqueline-with-flowers-1954-square.jpg'
|
|
29
|
+
showEmblem
|
|
30
|
+
/>
|
|
31
|
+
</Container>
|
|
32
|
+
</div>
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
export default Example
|
|
@@ -20,20 +20,11 @@ const Example = () => (
|
|
|
20
20
|
</Container>
|
|
21
21
|
<Container inline left={SPACING_4}>
|
|
22
22
|
<Avatar
|
|
23
|
-
variant='portrait'
|
|
24
|
-
size='medium'
|
|
25
|
-
alt='Jacqueline Roque. Pablo Picasso, 1954'
|
|
26
|
-
name='Jacqueline Roque'
|
|
27
|
-
src='./jacqueline-with-flowers-1954-square.jpg'
|
|
28
|
-
/>
|
|
29
|
-
</Container>
|
|
30
|
-
<Container inline left={SPACING_4}>
|
|
31
|
-
<Avatar
|
|
32
|
-
variant='landscape'
|
|
33
23
|
size='medium'
|
|
34
24
|
alt='Jacqueline Roque. Pablo Picasso, 1954'
|
|
35
25
|
name='Jacqueline Roque'
|
|
36
26
|
src='./jacqueline-with-flowers-1954-square.jpg'
|
|
27
|
+
showEmblem
|
|
37
28
|
/>
|
|
38
29
|
</Container>
|
|
39
30
|
</div>
|
package/src/Avatar/test.tsx
CHANGED
|
@@ -6,7 +6,7 @@ import type { Props } from './Avatar'
|
|
|
6
6
|
import { Avatar } from './Avatar'
|
|
7
7
|
|
|
8
8
|
const renderAvatar = (props: OmitInternalProps<Props>) => {
|
|
9
|
-
const { alt, name, src, size, onEdit, testIds } = props
|
|
9
|
+
const { alt, name, src, size, showEmblem = false, onEdit, testIds } = props
|
|
10
10
|
|
|
11
11
|
return render(
|
|
12
12
|
<Avatar
|
|
@@ -14,6 +14,7 @@ const renderAvatar = (props: OmitInternalProps<Props>) => {
|
|
|
14
14
|
name={name}
|
|
15
15
|
src={src}
|
|
16
16
|
size={size}
|
|
17
|
+
showEmblem={showEmblem}
|
|
17
18
|
testIds={testIds}
|
|
18
19
|
onEdit={onEdit}
|
|
19
20
|
/>
|
|
@@ -50,7 +51,11 @@ describe('Avatar', () => {
|
|
|
50
51
|
})
|
|
51
52
|
|
|
52
53
|
it('renders with logo', () => {
|
|
53
|
-
const { getAllByRole } = renderAvatar({
|
|
54
|
+
const { getAllByRole } = renderAvatar({
|
|
55
|
+
src: 'foobar',
|
|
56
|
+
size: 'medium',
|
|
57
|
+
showEmblem: true,
|
|
58
|
+
})
|
|
54
59
|
|
|
55
60
|
expect(getAllByRole('img')).toHaveLength(2)
|
|
56
61
|
})
|
|
@@ -21,6 +21,8 @@ export interface Props extends Omit<BaseProps, 'data-testid'> {
|
|
|
21
21
|
limit?: number
|
|
22
22
|
/** Size */
|
|
23
23
|
size?: SizeType<'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large'>
|
|
24
|
+
/** Displays Toptal logo */
|
|
25
|
+
showEmblem?: boolean
|
|
24
26
|
/** data-testid to all parts of component */
|
|
25
27
|
testIds?: {
|
|
26
28
|
container?: string
|
|
@@ -35,6 +37,7 @@ const AvatarGroup = ({
|
|
|
35
37
|
items,
|
|
36
38
|
limit,
|
|
37
39
|
size,
|
|
40
|
+
showEmblem = false,
|
|
38
41
|
}: Props) => {
|
|
39
42
|
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
40
43
|
const isOverLimit = items.length > limit!
|
|
@@ -68,6 +71,7 @@ const AvatarGroup = ({
|
|
|
68
71
|
name={name}
|
|
69
72
|
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
70
73
|
size={size!}
|
|
74
|
+
showEmblem={showEmblem}
|
|
71
75
|
src={src}
|
|
72
76
|
data-testid={avatarTestId}
|
|
73
77
|
/>
|
|
@@ -75,7 +79,7 @@ const AvatarGroup = ({
|
|
|
75
79
|
)}
|
|
76
80
|
{isOverLimit ? (
|
|
77
81
|
/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
|
|
78
|
-
<AvatarWrapper size={size!}
|
|
82
|
+
<AvatarWrapper size={size!}>
|
|
79
83
|
{/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */}
|
|
80
84
|
<TextAvatar data-testid={testIds?.overLimit} size={size!}>
|
|
81
85
|
+{itemsOverLimit}
|