@fluentui/react-avatar 9.2.10 → 9.2.11
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/CHANGELOG.json +72 -1
- package/CHANGELOG.md +18 -2
- package/lib/components/Avatar/Avatar.js.map +1 -1
- package/lib/components/Avatar/renderAvatar.js +10 -5
- package/lib/components/Avatar/renderAvatar.js.map +1 -1
- package/lib/components/Avatar/useAvatar.js +17 -32
- package/lib/components/Avatar/useAvatar.js.map +1 -1
- package/lib/components/Avatar/useAvatarStyles.js +405 -424
- package/lib/components/Avatar/useAvatarStyles.js.map +1 -1
- package/lib/components/AvatarGroup/AvatarGroup.js +0 -1
- package/lib/components/AvatarGroup/AvatarGroup.js.map +1 -1
- package/lib/components/AvatarGroup/renderAvatarGroup.js +2 -2
- package/lib/components/AvatarGroup/renderAvatarGroup.js.map +1 -1
- package/lib/components/AvatarGroup/useAvatarGroup.js +0 -1
- package/lib/components/AvatarGroup/useAvatarGroup.js.map +1 -1
- package/lib/components/AvatarGroup/useAvatarGroupContextValues.js.map +1 -1
- package/lib/components/AvatarGroup/useAvatarGroupStyles.js +10 -13
- package/lib/components/AvatarGroup/useAvatarGroupStyles.js.map +1 -1
- package/lib/components/AvatarGroupItem/AvatarGroupItem.js +0 -1
- package/lib/components/AvatarGroupItem/AvatarGroupItem.js.map +1 -1
- package/lib/components/AvatarGroupItem/renderAvatarGroupItem.js +6 -4
- package/lib/components/AvatarGroupItem/renderAvatarGroupItem.js.map +1 -1
- package/lib/components/AvatarGroupItem/useAvatarGroupItem.js +2 -5
- package/lib/components/AvatarGroupItem/useAvatarGroupItem.js.map +1 -1
- package/lib/components/AvatarGroupItem/useAvatarGroupItemStyles.js +99 -124
- package/lib/components/AvatarGroupItem/useAvatarGroupItemStyles.js.map +1 -1
- package/lib/components/AvatarGroupPopover/AvatarGroupPopover.js +0 -1
- package/lib/components/AvatarGroupPopover/AvatarGroupPopover.js.map +1 -1
- package/lib/components/AvatarGroupPopover/renderAvatarGroupPopover.js +10 -6
- package/lib/components/AvatarGroupPopover/renderAvatarGroupPopover.js.map +1 -1
- package/lib/components/AvatarGroupPopover/useAvatarGroupPopover.js +0 -7
- package/lib/components/AvatarGroupPopover/useAvatarGroupPopover.js.map +1 -1
- package/lib/components/AvatarGroupPopover/useAvatarGroupPopoverContextValues.js.map +1 -1
- package/lib/components/AvatarGroupPopover/useAvatarGroupPopoverStyles.js +166 -176
- package/lib/components/AvatarGroupPopover/useAvatarGroupPopoverStyles.js.map +1 -1
- package/lib/contexts/AvatarContext.js +0 -3
- package/lib/contexts/AvatarContext.js.map +1 -1
- package/lib/contexts/AvatarGroupContext.js +0 -1
- package/lib/contexts/AvatarGroupContext.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/utils/getInitials.js +2 -17
- package/lib/utils/getInitials.js.map +1 -1
- package/lib/utils/partitionAvatarGroupItems.js +0 -3
- package/lib/utils/partitionAvatarGroupItems.js.map +1 -1
- package/lib-commonjs/Avatar.js +0 -2
- package/lib-commonjs/Avatar.js.map +1 -1
- package/lib-commonjs/AvatarGroup.js +0 -2
- package/lib-commonjs/AvatarGroup.js.map +1 -1
- package/lib-commonjs/AvatarGroupItem.js +0 -2
- package/lib-commonjs/AvatarGroupItem.js.map +1 -1
- package/lib-commonjs/AvatarGroupPopover.js +0 -2
- package/lib-commonjs/AvatarGroupPopover.js.map +1 -1
- package/lib-commonjs/components/Avatar/Avatar.js +0 -5
- package/lib-commonjs/components/Avatar/Avatar.js.map +1 -1
- package/lib-commonjs/components/Avatar/Avatar.types.js.map +1 -1
- package/lib-commonjs/components/Avatar/index.js +0 -6
- package/lib-commonjs/components/Avatar/index.js.map +1 -1
- package/lib-commonjs/components/Avatar/renderAvatar.js +10 -9
- package/lib-commonjs/components/Avatar/renderAvatar.js.map +1 -1
- package/lib-commonjs/components/Avatar/useAvatar.js +17 -42
- package/lib-commonjs/components/Avatar/useAvatar.js.map +1 -1
- package/lib-commonjs/components/Avatar/useAvatarStyles.js +405 -428
- package/lib-commonjs/components/Avatar/useAvatarStyles.js.map +1 -1
- package/lib-commonjs/components/AvatarGroup/AvatarGroup.js +0 -7
- package/lib-commonjs/components/AvatarGroup/AvatarGroup.js.map +1 -1
- package/lib-commonjs/components/AvatarGroup/AvatarGroup.types.js.map +1 -1
- package/lib-commonjs/components/AvatarGroup/index.js +0 -7
- package/lib-commonjs/components/AvatarGroup/index.js.map +1 -1
- package/lib-commonjs/components/AvatarGroup/renderAvatarGroup.js +2 -7
- package/lib-commonjs/components/AvatarGroup/renderAvatarGroup.js.map +1 -1
- package/lib-commonjs/components/AvatarGroup/useAvatarGroup.js +0 -4
- package/lib-commonjs/components/AvatarGroup/useAvatarGroup.js.map +1 -1
- package/lib-commonjs/components/AvatarGroup/useAvatarGroupContextValues.js +0 -2
- package/lib-commonjs/components/AvatarGroup/useAvatarGroupContextValues.js.map +1 -1
- package/lib-commonjs/components/AvatarGroup/useAvatarGroupStyles.js +10 -18
- package/lib-commonjs/components/AvatarGroup/useAvatarGroupStyles.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupItem/AvatarGroupItem.js +0 -6
- package/lib-commonjs/components/AvatarGroupItem/AvatarGroupItem.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupItem/AvatarGroupItem.types.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupItem/index.js +0 -6
- package/lib-commonjs/components/AvatarGroupItem/index.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupItem/renderAvatarGroupItem.js +6 -8
- package/lib-commonjs/components/AvatarGroupItem/renderAvatarGroupItem.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupItem/useAvatarGroupItem.js +2 -12
- package/lib-commonjs/components/AvatarGroupItem/useAvatarGroupItem.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupItem/useAvatarGroupItemStyles.js +91 -123
- package/lib-commonjs/components/AvatarGroupItem/useAvatarGroupItemStyles.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupPopover/AvatarGroupPopover.js +0 -7
- package/lib-commonjs/components/AvatarGroupPopover/AvatarGroupPopover.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupPopover/AvatarGroupPopover.types.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupPopover/index.js +0 -6
- package/lib-commonjs/components/AvatarGroupPopover/index.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupPopover/renderAvatarGroupPopover.js +10 -12
- package/lib-commonjs/components/AvatarGroupPopover/renderAvatarGroupPopover.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupPopover/useAvatarGroupPopover.js +0 -16
- package/lib-commonjs/components/AvatarGroupPopover/useAvatarGroupPopover.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupPopover/useAvatarGroupPopoverContextValues.js +0 -2
- package/lib-commonjs/components/AvatarGroupPopover/useAvatarGroupPopoverContextValues.js.map +1 -1
- package/lib-commonjs/components/AvatarGroupPopover/useAvatarGroupPopoverStyles.js +166 -183
- package/lib-commonjs/components/AvatarGroupPopover/useAvatarGroupPopoverStyles.js.map +1 -1
- package/lib-commonjs/contexts/AvatarContext.js +0 -6
- package/lib-commonjs/contexts/AvatarContext.js.map +1 -1
- package/lib-commonjs/contexts/AvatarGroupContext.js +0 -5
- package/lib-commonjs/contexts/AvatarGroupContext.js.map +1 -1
- package/lib-commonjs/contexts/index.js +0 -3
- package/lib-commonjs/contexts/index.js.map +1 -1
- package/lib-commonjs/index.js +0 -12
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/utils/getInitials.js +3 -19
- package/lib-commonjs/utils/getInitials.js.map +1 -1
- package/lib-commonjs/utils/index.js +0 -4
- package/lib-commonjs/utils/index.js.map +1 -1
- package/lib-commonjs/utils/partitionAvatarGroupItems.js +0 -5
- package/lib-commonjs/utils/partitionAvatarGroupItems.js.map +1 -1
- package/package.json +10 -10
package/lib/utils/getInitials.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Regular expressions matching characters to ignore when calculating the initials.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
/**
|
|
6
5
|
* Regular expression matching characters within various types of enclosures, including the enclosures themselves
|
|
7
6
|
* so for example, (xyz) [xyz] {xyz} all would be ignored
|
|
@@ -11,16 +10,13 @@ const UNWANTED_ENCLOSURES_REGEX = /[\(\[\{][^\)\]\}]*[\)\]\}]/g;
|
|
|
11
10
|
* Regular expression matching special ASCII characters except space, plus some unicode special characters.
|
|
12
11
|
* Applies after unwanted enclosures have been removed
|
|
13
12
|
*/
|
|
14
|
-
|
|
15
13
|
const UNWANTED_CHARS_REGEX = /[\0-\u001F\!-/:-@\[-`\{-\u00BF\u0250-\u036F\uD800-\uFFFF]/g;
|
|
16
14
|
/**
|
|
17
15
|
* Regular expression matching phone numbers. Applied after chars matching UNWANTED_CHARS_REGEX have been removed
|
|
18
16
|
* and number has been trimmed for whitespaces
|
|
19
17
|
*/
|
|
20
|
-
|
|
21
18
|
const PHONENUMBER_REGEX = /^\d+[\d\s]*(:?ext|x|)\s*\d+$/i;
|
|
22
19
|
/** Regular expression matching one or more spaces. */
|
|
23
|
-
|
|
24
20
|
const MULTIPLE_WHITESPACES_REGEX = /\s+/g;
|
|
25
21
|
/**
|
|
26
22
|
* Regular expression matching languages for which we currently don't support initials.
|
|
@@ -31,17 +27,13 @@ const MULTIPLE_WHITESPACES_REGEX = /\s+/g;
|
|
|
31
27
|
* CJK Unified Ideographs Extension B
|
|
32
28
|
*/
|
|
33
29
|
// eslint-disable-next-line @fluentui/max-len
|
|
34
|
-
|
|
35
30
|
const UNSUPPORTED_TEXT_REGEX = /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\u1100-\u11FF\u3130-\u318F\uA960-\uA97F\uAC00-\uD7AF\uD7B0-\uD7FF\u3040-\u309F\u30A0-\u30FF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF]|[\uD840-\uD869][\uDC00-\uDED6]/;
|
|
36
|
-
|
|
37
31
|
function getInitialsLatin(displayName, isRtl, firstInitialOnly) {
|
|
38
32
|
let initials = '';
|
|
39
33
|
const splits = displayName.split(' ');
|
|
40
|
-
|
|
41
34
|
if (splits.length !== 0) {
|
|
42
35
|
initials += splits[0].charAt(0).toUpperCase();
|
|
43
36
|
}
|
|
44
|
-
|
|
45
37
|
if (!firstInitialOnly) {
|
|
46
38
|
if (splits.length === 2) {
|
|
47
39
|
initials += splits[1].charAt(0).toUpperCase();
|
|
@@ -49,14 +41,11 @@ function getInitialsLatin(displayName, isRtl, firstInitialOnly) {
|
|
|
49
41
|
initials += splits[2].charAt(0).toUpperCase();
|
|
50
42
|
}
|
|
51
43
|
}
|
|
52
|
-
|
|
53
44
|
if (isRtl && initials.length > 1) {
|
|
54
45
|
return initials.charAt(1) + initials.charAt(0);
|
|
55
46
|
}
|
|
56
|
-
|
|
57
47
|
return initials;
|
|
58
48
|
}
|
|
59
|
-
|
|
60
49
|
function cleanupDisplayName(displayName) {
|
|
61
50
|
displayName = displayName.replace(UNWANTED_ENCLOSURES_REGEX, '');
|
|
62
51
|
displayName = displayName.replace(UNWANTED_CHARS_REGEX, '');
|
|
@@ -76,19 +65,15 @@ function cleanupDisplayName(displayName) {
|
|
|
76
65
|
*
|
|
77
66
|
* @internal
|
|
78
67
|
*/
|
|
79
|
-
|
|
80
|
-
|
|
81
68
|
export function getInitials(displayName, isRtl, options) {
|
|
82
69
|
if (!displayName) {
|
|
83
70
|
return '';
|
|
84
71
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
72
|
+
displayName = cleanupDisplayName(displayName);
|
|
73
|
+
// For names containing CJK characters, and phone numbers, we don't display initials
|
|
88
74
|
if (UNSUPPORTED_TEXT_REGEX.test(displayName) || !(options === null || options === void 0 ? void 0 : options.allowPhoneInitials) && PHONENUMBER_REGEX.test(displayName)) {
|
|
89
75
|
return '';
|
|
90
76
|
}
|
|
91
|
-
|
|
92
77
|
return getInitialsLatin(displayName, isRtl, options === null || options === void 0 ? void 0 : options.firstInitialOnly);
|
|
93
78
|
}
|
|
94
79
|
//# sourceMappingURL=getInitials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"mappings":"AAAA;;;AAIA;;;;AAIA,MAAMA,yBAAyB,GAAW,6BAA6B;AAEvE;;;;AAIA,MAAMC,oBAAoB,GAAW,4DAA4D;AAEjG;;;;AAIA,MAAMC,iBAAiB,GAAW,+BAA+B;AAEjE;AACA,MAAMC,0BAA0B,GAAW,MAAM;AAEjD;;;;;;;;AAQA;AACA,MAAMC,sBAAsB,GAAW,4MAA4M;AAEnP,SAASC,gBAAgB,CAACC,WAAmB,EAAEC,KAAc,EAAEC,gBAA0B;EACvF,IAAIC,QAAQ,GAAG,EAAE;EAEjB,MAAMC,MAAM,GAAaJ,WAAW,CAACK,KAAK,CAAC,GAAG,CAAC;EAC/C,IAAID,MAAM,CAACE,MAAM,KAAK,CAAC,EAAE;IACvBH,QAAQ,IAAIC,MAAM,CAAC,CAAC,CAAC,CAACG,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,EAAE;;EAG/C,IAAI,CAACN,gBAAgB,EAAE;IACrB,IAAIE,MAAM,CAACE,MAAM,KAAK,CAAC,EAAE;MACvBH,QAAQ,IAAIC,MAAM,CAAC,CAAC,CAAC,CAACG,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,EAAE;KAC9C,MAAM,IAAIJ,MAAM,CAACE,MAAM,KAAK,CAAC,EAAE;MAC9BH,QAAQ,IAAIC,MAAM,CAAC,CAAC,CAAC,CAACG,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,EAAE;;;EAIjD,IAAIP,KAAK,IAAIE,QAAQ,CAACG,MAAM,GAAG,CAAC,EAAE;IAChC,OAAOH,QAAQ,CAACI,MAAM,CAAC,CAAC,CAAC,GAAGJ,QAAQ,CAACI,MAAM,CAAC,CAAC,CAAC;;EAGhD,OAAOJ,QAAQ;AACjB;AAEA,SAASM,kBAAkB,CAACT,WAAmB;EAC7CA,WAAW,GAAGA,WAAW,CAACU,OAAO,CAAChB,yBAAyB,EAAE,EAAE,CAAC;EAChEM,WAAW,GAAGA,WAAW,CAACU,OAAO,CAACf,oBAAoB,EAAE,EAAE,CAAC;EAC3DK,WAAW,GAAGA,WAAW,CAACU,OAAO,CAACb,0BAA0B,EAAE,GAAG,CAAC;EAClEG,WAAW,GAAGA,WAAW,CAACW,IAAI,EAAE;EAEhC,OAAOX,WAAW;AACpB;AAEA;;;;;;;;;;;;AAYA,OAAM,SAAUY,WAAW,CACzBZ,WAAsC,EACtCC,KAAc,EACdY,OAMC;EAED,IAAI,CAACb,WAAW,EAAE;IAChB,OAAO,EAAE;;EAGXA,WAAW,GAAGS,kBAAkB,CAACT,WAAW,CAAC;EAE7C;EACA,IACEF,sBAAsB,CAACgB,IAAI,CAACd,WAAW,CAAC,IACvC,EAACa,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE,kBAAkB,KAAInB,iBAAiB,CAACkB,IAAI,CAACd,WAAW,CAAE,EACrE;IACA,OAAO,EAAE;;EAGX,OAAOD,gBAAgB,CAACC,WAAW,EAAEC,KAAK,EAAEY,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEX,gBAAgB,CAAC;AACxE","names":["UNWANTED_ENCLOSURES_REGEX","UNWANTED_CHARS_REGEX","PHONENUMBER_REGEX","MULTIPLE_WHITESPACES_REGEX","UNSUPPORTED_TEXT_REGEX","getInitialsLatin","displayName","isRtl","firstInitialOnly","initials","splits","split","length","charAt","toUpperCase","cleanupDisplayName","replace","trim","getInitials","options","test","allowPhoneInitials"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/utils/getInitials.ts"],"sourcesContent":["/**\n * Regular expressions matching characters to ignore when calculating the initials.\n */\n\n/**\n * Regular expression matching characters within various types of enclosures, including the enclosures themselves\n * so for example, (xyz) [xyz] {xyz} all would be ignored\n */\nconst UNWANTED_ENCLOSURES_REGEX: RegExp = /[\\(\\[\\{][^\\)\\]\\}]*[\\)\\]\\}]/g;\n\n/**\n * Regular expression matching special ASCII characters except space, plus some unicode special characters.\n * Applies after unwanted enclosures have been removed\n */\nconst UNWANTED_CHARS_REGEX: RegExp = /[\\0-\\u001F\\!-/:-@\\[-`\\{-\\u00BF\\u0250-\\u036F\\uD800-\\uFFFF]/g;\n\n/**\n * Regular expression matching phone numbers. Applied after chars matching UNWANTED_CHARS_REGEX have been removed\n * and number has been trimmed for whitespaces\n */\nconst PHONENUMBER_REGEX: RegExp = /^\\d+[\\d\\s]*(:?ext|x|)\\s*\\d+$/i;\n\n/** Regular expression matching one or more spaces. */\nconst MULTIPLE_WHITESPACES_REGEX: RegExp = /\\s+/g;\n\n/**\n * Regular expression matching languages for which we currently don't support initials.\n * Arabic: Arabic, Arabic Supplement, Arabic Extended-A.\n * Korean: Hangul Jamo, Hangul Compatibility Jamo, Hangul Jamo Extended-A, Hangul Syllables, Hangul Jamo Extended-B.\n * Japanese: Hiragana, Katakana.\n * CJK: CJK Unified Ideographs Extension A, CJK Unified Ideographs, CJK Compatibility Ideographs,\n * CJK Unified Ideographs Extension B\n */\n// eslint-disable-next-line @fluentui/max-len\nconst UNSUPPORTED_TEXT_REGEX: RegExp = /[\\u0600-\\u06FF\\u0750-\\u077F\\u08A0-\\u08FF\\u1100-\\u11FF\\u3130-\\u318F\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3040-\\u309F\\u30A0-\\u30FF\\u3400-\\u4DBF\\u4E00-\\u9FFF\\uF900-\\uFAFF]|[\\uD840-\\uD869][\\uDC00-\\uDED6]/;\n\nfunction getInitialsLatin(displayName: string, isRtl: boolean, firstInitialOnly?: boolean): string {\n let initials = '';\n\n const splits: string[] = displayName.split(' ');\n if (splits.length !== 0) {\n initials += splits[0].charAt(0).toUpperCase();\n }\n\n if (!firstInitialOnly) {\n if (splits.length === 2) {\n initials += splits[1].charAt(0).toUpperCase();\n } else if (splits.length === 3) {\n initials += splits[2].charAt(0).toUpperCase();\n }\n }\n\n if (isRtl && initials.length > 1) {\n return initials.charAt(1) + initials.charAt(0);\n }\n\n return initials;\n}\n\nfunction cleanupDisplayName(displayName: string): string {\n displayName = displayName.replace(UNWANTED_ENCLOSURES_REGEX, '');\n displayName = displayName.replace(UNWANTED_CHARS_REGEX, '');\n displayName = displayName.replace(MULTIPLE_WHITESPACES_REGEX, ' ');\n displayName = displayName.trim();\n\n return displayName;\n}\n\n/**\n * Get (up to 2 characters) initials based on display name of the persona.\n *\n * @param displayName - The full name of the person or entity\n * @param isRtl - Whether the display is in RTL\n * @param options - Extra options to control the behavior of getInitials\n *\n * @returns The 1 or 2 character initials based on the name. Or an empty string if no initials\n * could be derived from the name.\n *\n * @internal\n */\nexport function getInitials(\n displayName: string | undefined | null,\n isRtl: boolean,\n options?: {\n /** Should initials be generated from phone numbers (default false) */\n allowPhoneInitials?: boolean;\n\n /** Returns only the first initial */\n firstInitialOnly?: boolean;\n },\n): string {\n if (!displayName) {\n return '';\n }\n\n displayName = cleanupDisplayName(displayName);\n\n // For names containing CJK characters, and phone numbers, we don't display initials\n if (\n UNSUPPORTED_TEXT_REGEX.test(displayName) ||\n (!options?.allowPhoneInitials && PHONENUMBER_REGEX.test(displayName))\n ) {\n return '';\n }\n\n return getInitialsLatin(displayName, isRtl, options?.firstInitialOnly);\n}\n"]}
|
|
@@ -7,19 +7,16 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export const partitionAvatarGroupItems = options => {
|
|
9
9
|
var _a;
|
|
10
|
-
|
|
11
10
|
const {
|
|
12
11
|
items
|
|
13
12
|
} = options;
|
|
14
13
|
const isPie = options.layout === 'pie';
|
|
15
|
-
|
|
16
14
|
if (isPie) {
|
|
17
15
|
return {
|
|
18
16
|
inlineItems: items.slice(0, 3),
|
|
19
17
|
overflowItems: items.length > 0 ? items : undefined
|
|
20
18
|
};
|
|
21
19
|
}
|
|
22
|
-
|
|
23
20
|
const maxInlineItems = (_a = options.maxInlineItems) !== null && _a !== void 0 ? _a : 5;
|
|
24
21
|
const inlineCount = -(maxInlineItems - (items.length > maxInlineItems ? 1 : 0));
|
|
25
22
|
const overflowItems = items.slice(0, inlineCount);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"mappings":"AAWA;;;;;;;AAOA,OAAO,MAAMA,yBAAyB,GACpCC,OAA4C,IACZ;;EAChC,MAAM;IAAEC;EAAK,CAAE,GAAGD,OAAO;EACzB,MAAME,KAAK,GAAGF,OAAO,CAACG,MAAM,KAAK,KAAK;EAEtC,IAAID,KAAK,EAAE;IACT,OAAO;MACLE,WAAW,EAAEH,KAAK,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;MAC9BC,aAAa,EAAEL,KAAK,CAACM,MAAM,GAAG,CAAC,GAAGN,KAAK,GAAGO;KAC3C;;EAGH,MAAMC,cAAc,GAAG,aAAO,CAACA,cAAc,mCAAI,CAAC;EAClD,MAAMC,WAAW,GAAG,EAAED,cAAc,IAAIR,KAAK,CAACM,MAAM,GAAGE,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;EAC/E,MAAMH,aAAa,GAAGL,KAAK,CAACI,KAAK,CAAC,CAAC,EAAEK,WAAW,CAAC;EAEjD,OAAO;IACLN,WAAW,EAAEH,KAAK,CAACI,KAAK,CAACK,WAAW,CAAC;IACrCJ,aAAa,EAAEA,aAAa,CAACC,MAAM,GAAG,CAAC,GAAGD,aAAa,GAAGE;GAC3D;AACH,CAAC","names":["partitionAvatarGroupItems","options","items","isPie","layout","inlineItems","slice","overflowItems","length","undefined","maxInlineItems","inlineCount"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/utils/partitionAvatarGroupItems.ts"],"sourcesContent":["export type PartitionAvatarGroupItemsOptions<T> = {\n items: readonly T[];\n layout?: 'spread' | 'stack' | 'pie';\n maxInlineItems?: number;\n};\n\nexport type PartitionAvatarGroupItems<T> = {\n inlineItems: readonly T[];\n overflowItems?: readonly T[];\n};\n\n/**\n * Get the inline items and overflowing items based on the array of AvatarGroupItems needed for AvatarGroup.\n *\n * @param options - Configure the partition options\n *\n * @returns Two arrays split into inline items and overflow items based on maxInlineItems.\n */\nexport const partitionAvatarGroupItems = <T>(\n options: PartitionAvatarGroupItemsOptions<T>,\n): PartitionAvatarGroupItems<T> => {\n const { items } = options;\n const isPie = options.layout === 'pie';\n\n if (isPie) {\n return {\n inlineItems: items.slice(0, 3),\n overflowItems: items.length > 0 ? items : undefined,\n };\n }\n\n const maxInlineItems = options.maxInlineItems ?? 5;\n const inlineCount = -(maxInlineItems - (items.length > maxInlineItems ? 1 : 0));\n const overflowItems = items.slice(0, inlineCount);\n\n return {\n inlineItems: items.slice(inlineCount),\n overflowItems: overflowItems.length > 0 ? overflowItems : undefined,\n };\n};\n"]}
|
package/lib-commonjs/Avatar.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["packages/react-components/react-avatar/src/Avatar.ts"],"
|
|
1
|
+
{"version":3,"mappings":";;;;;;AAAAA","names":["tslib_1"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/Avatar.ts"],"sourcesContent":["export * from './components/Avatar/index';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["packages/react-components/react-avatar/src/AvatarGroup.ts"],"
|
|
1
|
+
{"version":3,"mappings":";;;;;;AAAAA","names":["tslib_1"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/AvatarGroup.ts"],"sourcesContent":["export * from './components/AvatarGroup/index';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["packages/react-components/react-avatar/src/AvatarGroupItem.ts"],"
|
|
1
|
+
{"version":3,"mappings":";;;;;;AAAAA","names":["tslib_1"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/AvatarGroupItem.ts"],"sourcesContent":["export * from './components/AvatarGroupItem/index';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["packages/react-components/react-avatar/src/AvatarGroupPopover.ts"],"
|
|
1
|
+
{"version":3,"mappings":";;;;;;AAAAA","names":["tslib_1"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/AvatarGroupPopover.ts"],"sourcesContent":["export * from './components/AvatarGroupPopover/index';\n"]}
|
|
@@ -4,15 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.Avatar = void 0;
|
|
7
|
-
|
|
8
7
|
const React = /*#__PURE__*/require("react");
|
|
9
|
-
|
|
10
8
|
const renderAvatar_1 = /*#__PURE__*/require("./renderAvatar");
|
|
11
|
-
|
|
12
9
|
const useAvatar_1 = /*#__PURE__*/require("./useAvatar");
|
|
13
|
-
|
|
14
10
|
const useAvatarStyles_1 = /*#__PURE__*/require("./useAvatarStyles");
|
|
15
|
-
|
|
16
11
|
exports.Avatar = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
17
12
|
const state = useAvatar_1.useAvatar_unstable(props, ref);
|
|
18
13
|
useAvatarStyles_1.useAvatarStyles_unstable(state);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"mappings":";;;;;;AAAA;AACA;AACA;AACA;AAIaA,cAAM,gBAAqCC,KAAK,CAACC,UAAU,CAAC,CAACC,KAAK,EAAEC,GAAG,KAAI;EACtF,MAAMC,KAAK,GAAGC,8BAAkB,CAACH,KAAK,EAAEC,GAAG,CAAC;EAE5CG,0CAAwB,CAACF,KAAK,CAAC;EAE/B,OAAOG,oCAAqB,CAACH,KAAK,CAAC;AACrC,CAAC,CAAC;AAEFL,cAAM,CAACS,WAAW,GAAG,QAAQ","names":["exports","React","forwardRef","props","ref","state","useAvatar_1","useAvatarStyles_1","renderAvatar_1","displayName"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/components/Avatar/Avatar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { renderAvatar_unstable } from './renderAvatar';\nimport { useAvatar_unstable } from './useAvatar';\nimport { useAvatarStyles_unstable } from './useAvatarStyles';\nimport type { AvatarProps } from './Avatar.types';\nimport type { ForwardRefComponent } from '@fluentui/react-utilities';\n\nexport const Avatar: ForwardRefComponent<AvatarProps> = React.forwardRef((props, ref) => {\n const state = useAvatar_unstable(props, ref);\n\n useAvatarStyles_unstable(state);\n\n return renderAvatar_unstable(state);\n});\n\nAvatar.displayName = 'Avatar';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"mappings":"","names":[],"sourceRoot":"../src/","sources":[],"sourcesContent":[]}
|
|
@@ -3,16 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
7
6
|
const tslib_1 = /*#__PURE__*/require("tslib");
|
|
8
|
-
|
|
9
7
|
tslib_1.__exportStar(require("./Avatar.types"), exports);
|
|
10
|
-
|
|
11
8
|
tslib_1.__exportStar(require("./Avatar"), exports);
|
|
12
|
-
|
|
13
9
|
tslib_1.__exportStar(require("./renderAvatar"), exports);
|
|
14
|
-
|
|
15
10
|
tslib_1.__exportStar(require("./useAvatar"), exports);
|
|
16
|
-
|
|
17
11
|
tslib_1.__exportStar(require("./useAvatarStyles"), exports);
|
|
18
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["packages/react-components/react-avatar/src/components/Avatar/index.ts"],"
|
|
1
|
+
{"version":3,"mappings":";;;;;;AAAAA;AACAA;AACAA;AACAA;AACAA","names":["tslib_1"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/components/Avatar/index.ts"],"sourcesContent":["export * from './Avatar.types';\nexport * from './Avatar';\nexport * from './renderAvatar';\nexport * from './useAvatar';\nexport * from './useAvatarStyles';\n"]}
|
|
@@ -4,23 +4,24 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.renderAvatar_unstable = void 0;
|
|
7
|
-
|
|
8
7
|
const React = /*#__PURE__*/require("react");
|
|
9
|
-
|
|
10
8
|
const react_utilities_1 = /*#__PURE__*/require("@fluentui/react-utilities");
|
|
11
|
-
|
|
12
9
|
const renderAvatar_unstable = state => {
|
|
13
10
|
const {
|
|
14
11
|
slots,
|
|
15
12
|
slotProps
|
|
16
13
|
} = react_utilities_1.getSlots(state);
|
|
17
|
-
return React.createElement(slots.root, {
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
}), slots.
|
|
14
|
+
return React.createElement(slots.root, {
|
|
15
|
+
...slotProps.root
|
|
16
|
+
}, slots.initials && React.createElement(slots.initials, {
|
|
17
|
+
...slotProps.initials
|
|
18
|
+
}), slots.icon && React.createElement(slots.icon, {
|
|
19
|
+
...slotProps.icon
|
|
20
|
+
}), slots.image && React.createElement(slots.image, {
|
|
21
|
+
...slotProps.image
|
|
22
|
+
}), slots.badge && React.createElement(slots.badge, {
|
|
23
|
+
...slotProps.badge
|
|
22
24
|
}), state.activeAriaLabelElement);
|
|
23
25
|
};
|
|
24
|
-
|
|
25
26
|
exports.renderAvatar_unstable = renderAvatar_unstable;
|
|
26
27
|
//# sourceMappingURL=renderAvatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"mappings":";;;;;;AAAA;AACA;AAGO,MAAMA,qBAAqB,GAAIC,KAAkB,IAAI;EAC1D,MAAM;IAAEC,KAAK;IAAEC;EAAS,CAAE,GAAGC,0BAAQ,CAAcH,KAAK,CAAC;EAEzD,OACEI,oBAACH,KAAK,CAACI,IAAI;IAAA,GAAKH,SAAS,CAACG;EAAI,GAC3BJ,KAAK,CAACK,QAAQ,IAAIF,oBAACH,KAAK,CAACK,QAAQ;IAAA,GAAKJ,SAAS,CAACI;EAAQ,EAAI,EAC5DL,KAAK,CAACM,IAAI,IAAIH,oBAACH,KAAK,CAACM,IAAI;IAAA,GAAKL,SAAS,CAACK;EAAI,EAAI,EAChDN,KAAK,CAACO,KAAK,IAAIJ,oBAACH,KAAK,CAACO,KAAK;IAAA,GAAKN,SAAS,CAACM;EAAK,EAAI,EACnDP,KAAK,CAACQ,KAAK,IAAIL,oBAACH,KAAK,CAACQ,KAAK;IAAA,GAAKP,SAAS,CAACO;EAAK,EAAI,EACnDT,KAAK,CAACU,sBAAsB,CAClB;AAEjB,CAAC;AAZYC,6BAAqB","names":["renderAvatar_unstable","state","slots","slotProps","react_utilities_1","React","root","initials","icon","image","badge","activeAriaLabelElement","exports"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/components/Avatar/renderAvatar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { getSlots } from '@fluentui/react-utilities';\nimport type { AvatarSlots, AvatarState } from './Avatar.types';\n\nexport const renderAvatar_unstable = (state: AvatarState) => {\n const { slots, slotProps } = getSlots<AvatarSlots>(state);\n\n return (\n <slots.root {...slotProps.root}>\n {slots.initials && <slots.initials {...slotProps.initials} />}\n {slots.icon && <slots.icon {...slotProps.icon} />}\n {slots.image && <slots.image {...slotProps.image} />}\n {slots.badge && <slots.badge {...slotProps.badge} />}\n {state.activeAriaLabelElement}\n </slots.root>\n );\n};\n"]}
|
|
@@ -4,29 +4,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.useAvatar_unstable = exports.DEFAULT_STRINGS = void 0;
|
|
7
|
-
|
|
8
7
|
const React = /*#__PURE__*/require("react");
|
|
9
|
-
|
|
10
8
|
const react_utilities_1 = /*#__PURE__*/require("@fluentui/react-utilities");
|
|
11
|
-
|
|
12
9
|
const index_1 = /*#__PURE__*/require("../../utils/index");
|
|
13
|
-
|
|
14
10
|
const react_icons_1 = /*#__PURE__*/require("@fluentui/react-icons");
|
|
15
|
-
|
|
16
11
|
const react_badge_1 = /*#__PURE__*/require("@fluentui/react-badge");
|
|
17
|
-
|
|
18
12
|
const react_shared_contexts_1 = /*#__PURE__*/require("@fluentui/react-shared-contexts");
|
|
19
|
-
|
|
20
13
|
const AvatarContext_1 = /*#__PURE__*/require("../../contexts/AvatarContext");
|
|
21
|
-
|
|
22
14
|
exports.DEFAULT_STRINGS = {
|
|
23
15
|
active: 'active',
|
|
24
16
|
inactive: 'inactive'
|
|
25
17
|
};
|
|
26
|
-
|
|
27
18
|
const useAvatar_unstable = (props, ref) => {
|
|
28
19
|
var _a;
|
|
29
|
-
|
|
30
20
|
const {
|
|
31
21
|
dir
|
|
32
22
|
} = react_shared_contexts_1.useFluent_unstable();
|
|
@@ -43,12 +33,11 @@ const useAvatar_unstable = (props, ref) => {
|
|
|
43
33
|
} = props;
|
|
44
34
|
let {
|
|
45
35
|
color = 'neutral'
|
|
46
|
-
} = props;
|
|
47
|
-
|
|
36
|
+
} = props;
|
|
37
|
+
// Resolve 'colorful' to a specific color name
|
|
48
38
|
if (color === 'colorful') {
|
|
49
39
|
color = avatarColors[getHashCode((_a = idForColor !== null && idForColor !== void 0 ? idForColor : name) !== null && _a !== void 0 ? _a : '') % avatarColors.length];
|
|
50
40
|
}
|
|
51
|
-
|
|
52
41
|
const baseId = react_utilities_1.useId('avatar-');
|
|
53
42
|
const root = react_utilities_1.getNativeElementProps('span', {
|
|
54
43
|
role: 'img',
|
|
@@ -56,9 +45,7 @@ const useAvatar_unstable = (props, ref) => {
|
|
|
56
45
|
// aria-label and/or aria-labelledby are resolved below
|
|
57
46
|
...props,
|
|
58
47
|
ref
|
|
59
|
-
},
|
|
60
|
-
/* excludedPropNames: */
|
|
61
|
-
['name']);
|
|
48
|
+
}, /* excludedPropNames: */['name']);
|
|
62
49
|
const [imageHidden, setImageHidden] = React.useState(undefined);
|
|
63
50
|
const image = react_utilities_1.resolveShorthand(props.image, {
|
|
64
51
|
defaultProps: {
|
|
@@ -67,14 +54,13 @@ const useAvatar_unstable = (props, ref) => {
|
|
|
67
54
|
'aria-hidden': true,
|
|
68
55
|
hidden: imageHidden
|
|
69
56
|
}
|
|
70
|
-
});
|
|
71
|
-
|
|
57
|
+
});
|
|
58
|
+
// Hide the image if it fails to load and restore it on a successful load
|
|
72
59
|
if (image) {
|
|
73
60
|
image.onError = react_utilities_1.mergeCallbacks(image.onError, () => setImageHidden(true));
|
|
74
61
|
image.onLoad = react_utilities_1.mergeCallbacks(image.onLoad, () => setImageHidden(undefined));
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
62
|
+
}
|
|
63
|
+
// Resolve the initials slot, defaulted to getInitials.
|
|
78
64
|
let initials = react_utilities_1.resolveShorthand(props.initials, {
|
|
79
65
|
required: true,
|
|
80
66
|
defaultProps: {
|
|
@@ -83,15 +69,13 @@ const useAvatar_unstable = (props, ref) => {
|
|
|
83
69
|
}),
|
|
84
70
|
id: baseId + '__initials'
|
|
85
71
|
}
|
|
86
|
-
});
|
|
87
|
-
|
|
72
|
+
});
|
|
73
|
+
// Don't render the initials slot if it's empty
|
|
88
74
|
if (!(initials === null || initials === void 0 ? void 0 : initials.children)) {
|
|
89
75
|
initials = undefined;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
76
|
+
}
|
|
77
|
+
// Render the icon slot *only if* there aren't any initials or image to display
|
|
93
78
|
let icon = undefined;
|
|
94
|
-
|
|
95
79
|
if (!initials && (!image || imageHidden)) {
|
|
96
80
|
icon = react_utilities_1.resolveShorthand(props.icon, {
|
|
97
81
|
required: true,
|
|
@@ -101,31 +85,28 @@ const useAvatar_unstable = (props, ref) => {
|
|
|
101
85
|
}
|
|
102
86
|
});
|
|
103
87
|
}
|
|
104
|
-
|
|
105
88
|
const badge = react_utilities_1.resolveShorthand(props.badge, {
|
|
106
89
|
defaultProps: {
|
|
107
90
|
size: getBadgeSize(size),
|
|
108
91
|
id: baseId + '__badge'
|
|
109
92
|
}
|
|
110
93
|
});
|
|
111
|
-
let activeAriaLabelElement;
|
|
112
|
-
|
|
94
|
+
let activeAriaLabelElement;
|
|
95
|
+
// Resolve aria-label and/or aria-labelledby if not provided by the user
|
|
113
96
|
if (!root['aria-label'] && !root['aria-labelledby']) {
|
|
114
97
|
if (name) {
|
|
115
|
-
root['aria-label'] = name;
|
|
116
|
-
|
|
98
|
+
root['aria-label'] = name;
|
|
99
|
+
// Include the badge in labelledby if it exists
|
|
117
100
|
if (badge) {
|
|
118
101
|
root['aria-labelledby'] = root.id + ' ' + badge.id;
|
|
119
102
|
}
|
|
120
103
|
} else if (initials) {
|
|
121
104
|
// root's aria-label should be the name, but fall back to being labelledby the initials if name is missing
|
|
122
105
|
root['aria-labelledby'] = initials.id + (badge ? ' ' + badge.id : '');
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
106
|
+
}
|
|
107
|
+
// Add the active state to the aria label
|
|
126
108
|
if (active === 'active' || active === 'inactive') {
|
|
127
109
|
const activeText = exports.DEFAULT_STRINGS[active];
|
|
128
|
-
|
|
129
110
|
if (root['aria-labelledby']) {
|
|
130
111
|
// If using aria-labelledby, render a hidden span and append it to the labelledby
|
|
131
112
|
const activeId = baseId + '__active';
|
|
@@ -140,7 +121,6 @@ const useAvatar_unstable = (props, ref) => {
|
|
|
140
121
|
}
|
|
141
122
|
}
|
|
142
123
|
}
|
|
143
|
-
|
|
144
124
|
return {
|
|
145
125
|
size,
|
|
146
126
|
shape,
|
|
@@ -162,9 +142,7 @@ const useAvatar_unstable = (props, ref) => {
|
|
|
162
142
|
badge
|
|
163
143
|
};
|
|
164
144
|
};
|
|
165
|
-
|
|
166
145
|
exports.useAvatar_unstable = useAvatar_unstable;
|
|
167
|
-
|
|
168
146
|
const getBadgeSize = size => {
|
|
169
147
|
if (size >= 96) {
|
|
170
148
|
return 'extra-large';
|
|
@@ -180,12 +158,9 @@ const getBadgeSize = size => {
|
|
|
180
158
|
return 'tiny';
|
|
181
159
|
}
|
|
182
160
|
};
|
|
183
|
-
|
|
184
161
|
const avatarColors = ['dark-red', 'cranberry', 'red', 'pumpkin', 'peach', 'marigold', 'gold', 'brass', 'brown', 'forest', 'seafoam', 'dark-green', 'light-teal', 'teal', 'steel', 'blue', 'royal-blue', 'cornflower', 'navy', 'lavender', 'purple', 'grape', 'lilac', 'pink', 'magenta', 'plum', 'beige', 'mink', 'platinum', 'anchor'];
|
|
185
|
-
|
|
186
162
|
const getHashCode = str => {
|
|
187
163
|
let hashCode = 0;
|
|
188
|
-
|
|
189
164
|
for (let len = str.length - 1; len >= 0; len--) {
|
|
190
165
|
const ch = str.charCodeAt(len);
|
|
191
166
|
const shift = len % 8;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["packages/react-components/react-avatar/src/components/Avatar/useAvatar.tsx"],"names":[],"mappings":";;;;;;;AAAA,MAAA,KAAA,gBAAA,OAAA,CAAA,OAAA,CAAA;;AACA,MAAA,iBAAA,gBAAA,OAAA,CAAA,2BAAA,CAAA;;AACA,MAAA,OAAA,gBAAA,OAAA,CAAA,mBAAA,CAAA;;AAEA,MAAA,aAAA,gBAAA,OAAA,CAAA,uBAAA,CAAA;;AACA,MAAA,aAAA,gBAAA,OAAA,CAAA,uBAAA,CAAA;;AACA,MAAA,uBAAA,gBAAA,OAAA,CAAA,iCAAA,CAAA;;AACA,MAAA,eAAA,gBAAA,OAAA,CAAA,8BAAA,CAAA;;AAEa,OAAA,CAAA,eAAA,GAAkB;EAC7B,MAAM,EAAE,QADqB;EAE7B,QAAQ,EAAE;AAFmB,CAAlB;;AAKN,MAAM,kBAAkB,GAAG,CAAC,KAAD,EAAqB,GAArB,KAAiE;;;EACjG,MAAM;IAAE;EAAF,IAAU,uBAAA,CAAA,kBAAA,EAAhB;EACA,MAAM;IAAE,IAAI,EAAE;EAAR,IAAwB,eAAA,CAAA,gBAAA,EAA9B;EACA,MAAM;IACJ,IADI;IAEJ,IAAI,GAAG,WAAW,KAAA,IAAX,IAAA,WAAW,KAAA,KAAA,CAAX,GAAA,WAAA,GAAgB,EAFnB;IAGJ,KAAK,GAAG,UAHJ;IAIJ,MAAM,GAAG,OAJL;IAKJ,gBAAgB,GAAG,MALf;IAMJ;EANI,IAOF,KAPJ;EAQA,IAAI;IAAE,KAAK,GAAG;EAAV,IAAwB,KAA5B,CAXiG,CAajG;;EACA,IAAI,KAAK,KAAK,UAAd,EAA0B;IACxB,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAA,EAAA,GAAA,UAAU,KAAA,IAAV,IAAA,UAAU,KAAA,KAAA,CAAV,GAAA,UAAA,GAAc,IAAd,MAAkB,IAAlB,IAAkB,EAAA,KAAA,KAAA,CAAlB,GAAkB,EAAlB,GAAsB,EAAvB,CAAX,GAAwC,YAAY,CAAC,MAAtD,CAApB;EACD;;EAED,MAAM,MAAM,GAAG,iBAAA,CAAA,KAAA,CAAM,SAAN,CAAf;EAEA,MAAM,IAAI,GAAwB,iBAAA,CAAA,qBAAA,CAChC,MADgC,EAEhC;IACE,IAAI,EAAE,KADR;IAEE,EAAE,EAAE,MAFN;IAGE;IACA,GAAG,KAJL;IAKE;EALF,CAFgC;EAShC;EAAyB,CAAC,MAAD,CATO,CAAlC;EAYA,MAAM,CAAC,WAAD,EAAc,cAAd,IAAgC,KAAK,CAAC,QAAN,CAAiC,SAAjC,CAAtC;EACA,MAAM,KAAK,GAAyB,iBAAA,CAAA,gBAAA,CAAiB,KAAK,CAAC,KAAvB,EAA8B;IAChE,YAAY,EAAE;MACZ,GAAG,EAAE,EADO;MAEZ,IAAI,EAAE,cAFM;MAGZ,eAAe,IAHH;MAIZ,MAAM,EAAE;IAJI;EADkD,CAA9B,CAApC,CAjCiG,CA0CjG;;EACA,IAAI,KAAJ,EAAW;IACT,KAAK,CAAC,OAAN,GAAgB,iBAAA,CAAA,cAAA,CAAe,KAAK,CAAC,OAArB,EAA8B,MAAM,cAAc,CAAC,IAAD,CAAlD,CAAhB;IACA,KAAK,CAAC,MAAN,GAAe,iBAAA,CAAA,cAAA,CAAe,KAAK,CAAC,MAArB,EAA6B,MAAM,cAAc,CAAC,SAAD,CAAjD,CAAf;EACD,CA9CgG,CAgDjG;;;EACA,IAAI,QAAQ,GAA4B,iBAAA,CAAA,gBAAA,CAAiB,KAAK,CAAC,QAAvB,EAAiC;IACvE,QAAQ,EAAE,IAD6D;IAEvE,YAAY,EAAE;MACZ,QAAQ,EAAE,OAAA,CAAA,WAAA,CAAY,IAAZ,EAAkB,GAAG,KAAK,KAA1B,EAAiC;QAAE,gBAAgB,EAAE,IAAI,IAAI;MAA5B,CAAjC,CADE;MAEZ,EAAE,EAAE,MAAM,GAAG;IAFD;EAFyD,CAAjC,CAAxC,CAjDiG,CAyDjG;;EACA,IAAI,EAAC,QAAQ,KAAA,IAAR,IAAA,QAAQ,KAAA,KAAA,CAAR,GAAQ,KAAA,CAAR,GAAA,QAAQ,CAAE,QAAX,CAAJ,EAAyB;IACvB,QAAQ,GAAG,SAAX;EACD,CA5DgG,CA8DjG;;;EACA,IAAI,IAAI,GAAwB,SAAhC;;EACA,IAAI,CAAC,QAAD,KAAc,CAAC,KAAD,IAAU,WAAxB,CAAJ,EAA0C;IACxC,IAAI,GAAG,iBAAA,CAAA,gBAAA,CAAiB,KAAK,CAAC,IAAvB,EAA6B;MAClC,QAAQ,EAAE,IADwB;MAElC,YAAY,EAAE;QACZ,QAAQ,EAAE,KAAA,CAAA,aAAA,CAAC,aAAA,CAAA,aAAD,EAAc,IAAd,CADE;QAEZ,eAAe;MAFH;IAFoB,CAA7B,CAAP;EAOD;;EAED,MAAM,KAAK,GAAyB,iBAAA,CAAA,gBAAA,CAAiB,KAAK,CAAC,KAAvB,EAA8B;IAChE,YAAY,EAAE;MACZ,IAAI,EAAE,YAAY,CAAC,IAAD,CADN;MAEZ,EAAE,EAAE,MAAM,GAAG;IAFD;EADkD,CAA9B,CAApC;EAOA,IAAI,sBAAJ,CAjFiG,CAmFjG;;EACA,IAAI,CAAC,IAAI,CAAC,YAAD,CAAL,IAAuB,CAAC,IAAI,CAAC,iBAAD,CAAhC,EAAqD;IACnD,IAAI,IAAJ,EAAU;MACR,IAAI,CAAC,YAAD,CAAJ,GAAqB,IAArB,CADQ,CAGR;;MACA,IAAI,KAAJ,EAAW;QACT,IAAI,CAAC,iBAAD,CAAJ,GAA0B,IAAI,CAAC,EAAL,GAAU,GAAV,GAAgB,KAAK,CAAC,EAAhD;MACD;IACF,CAPD,MAOO,IAAI,QAAJ,EAAc;MACnB;MACA,IAAI,CAAC,iBAAD,CAAJ,GAA0B,QAAQ,CAAC,EAAT,IAAe,KAAK,GAAG,MAAM,KAAK,CAAC,EAAf,GAAoB,EAAxC,CAA1B;IACD,CAXkD,CAanD;;;IACA,IAAI,MAAM,KAAK,QAAX,IAAuB,MAAM,KAAK,UAAtC,EAAkD;MAChD,MAAM,UAAU,GAAG,OAAA,CAAA,eAAA,CAAgB,MAAhB,CAAnB;;MACA,IAAI,IAAI,CAAC,iBAAD,CAAR,EAA6B;QAC3B;QACA,MAAM,QAAQ,GAAG,MAAM,GAAG,UAA1B;QACA,IAAI,CAAC,iBAAD,CAAJ,IAA2B,MAAM,QAAjC;QACA,sBAAsB,GACpB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;UAAM,MAAM,EAAA,IAAZ;UAAa,EAAE,EAAE;QAAjB,CAAA,EACG,UADH,CADF;MAKD,CATD,MASO,IAAI,IAAI,CAAC,YAAD,CAAR,EAAwB;QAC7B;QACA,IAAI,CAAC,YAAD,CAAJ,IAAsB,MAAM,UAA5B;MACD;IACF;EACF;;EAED,OAAO;IACL,IADK;IAEL,KAFK;IAGL,MAHK;IAIL,gBAJK;IAKL,sBALK;IAML,KANK;IAQL,UAAU,EAAE;MACV,IAAI,EAAE,MADI;MAEV,QAAQ,EAAE,MAFA;MAGV,IAAI,EAAE,MAHI;MAIV,KAAK,EAAE,KAJG;MAKV,KAAK,EAAE,aAAA,CAAA;IALG,CARP;IAgBL,IAhBK;IAiBL,QAjBK;IAkBL,IAlBK;IAmBL,KAnBK;IAoBL;EApBK,CAAP;AAsBD,CA1IM;;AAAM,OAAA,CAAA,kBAAA,GAAkB,kBAAlB;;AA4Ib,MAAM,YAAY,GAAI,IAAD,IAA8B;EACjD,IAAI,IAAI,IAAI,EAAZ,EAAgB;IACd,OAAO,aAAP;EACD,CAFD,MAEO,IAAI,IAAI,IAAI,EAAZ,EAAgB;IACrB,OAAO,OAAP;EACD,CAFM,MAEA,IAAI,IAAI,IAAI,EAAZ,EAAgB;IACrB,OAAO,QAAP;EACD,CAFM,MAEA,IAAI,IAAI,IAAI,EAAZ,EAAgB;IACrB,OAAO,OAAP;EACD,CAFM,MAEA,IAAI,IAAI,IAAI,EAAZ,EAAgB;IACrB,OAAO,aAAP;EACD,CAFM,MAEA;IACL,OAAO,MAAP;EACD;AACF,CAdD;;AAgBA,MAAM,YAAY,GAAuB,CACvC,UADuC,EAEvC,WAFuC,EAGvC,KAHuC,EAIvC,SAJuC,EAKvC,OALuC,EAMvC,UANuC,EAOvC,MAPuC,EAQvC,OARuC,EASvC,OATuC,EAUvC,QAVuC,EAWvC,SAXuC,EAYvC,YAZuC,EAavC,YAbuC,EAcvC,MAduC,EAevC,OAfuC,EAgBvC,MAhBuC,EAiBvC,YAjBuC,EAkBvC,YAlBuC,EAmBvC,MAnBuC,EAoBvC,UApBuC,EAqBvC,QArBuC,EAsBvC,OAtBuC,EAuBvC,OAvBuC,EAwBvC,MAxBuC,EAyBvC,SAzBuC,EA0BvC,MA1BuC,EA2BvC,OA3BuC,EA4BvC,MA5BuC,EA6BvC,UA7BuC,EA8BvC,QA9BuC,CAAzC;;AAiCA,MAAM,WAAW,GAAI,GAAD,IAAwB;EAC1C,IAAI,QAAQ,GAAG,CAAf;;EACA,KAAK,IAAI,GAAG,GAAW,GAAG,CAAC,MAAJ,GAAa,CAApC,EAAuC,GAAG,IAAI,CAA9C,EAAiD,GAAG,EAApD,EAAwD;IACtD,MAAM,EAAE,GAAG,GAAG,CAAC,UAAJ,CAAe,GAAf,CAAX;IACA,MAAM,KAAK,GAAG,GAAG,GAAG,CAApB;IACA,QAAQ,IAAI,CAAC,EAAE,IAAI,KAAP,KAAiB,EAAE,IAAK,IAAI,KAA5B,CAAZ,CAHsD,CAGL;EAClD;;EAED,OAAO,QAAP;AACD,CATD","sourcesContent":["import * as React from 'react';\nimport { getNativeElementProps, mergeCallbacks, resolveShorthand, useId } from '@fluentui/react-utilities';\nimport { getInitials } from '../../utils/index';\nimport type { AvatarNamedColor, AvatarProps, AvatarState } from './Avatar.types';\nimport { PersonRegular } from '@fluentui/react-icons';\nimport { PresenceBadge } from '@fluentui/react-badge';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { useAvatarContext } from '../../contexts/AvatarContext';\n\nexport const DEFAULT_STRINGS = {\n active: 'active',\n inactive: 'inactive',\n};\n\nexport const useAvatar_unstable = (props: AvatarProps, ref: React.Ref<HTMLElement>): AvatarState => {\n const { dir } = useFluent();\n const { size: contextSize } = useAvatarContext();\n const {\n name,\n size = contextSize ?? (32 as const),\n shape = 'circular',\n active = 'unset',\n activeAppearance = 'ring',\n idForColor,\n } = props;\n let { color = 'neutral' } = props;\n\n // Resolve 'colorful' to a specific color name\n if (color === 'colorful') {\n color = avatarColors[getHashCode(idForColor ?? name ?? '') % avatarColors.length];\n }\n\n const baseId = useId('avatar-');\n\n const root: AvatarState['root'] = getNativeElementProps(\n 'span',\n {\n role: 'img',\n id: baseId,\n // aria-label and/or aria-labelledby are resolved below\n ...props,\n ref,\n },\n /* excludedPropNames: */ ['name'],\n );\n\n const [imageHidden, setImageHidden] = React.useState<true | undefined>(undefined);\n const image: AvatarState['image'] = resolveShorthand(props.image, {\n defaultProps: {\n alt: '',\n role: 'presentation',\n 'aria-hidden': true,\n hidden: imageHidden,\n },\n });\n\n // Hide the image if it fails to load and restore it on a successful load\n if (image) {\n image.onError = mergeCallbacks(image.onError, () => setImageHidden(true));\n image.onLoad = mergeCallbacks(image.onLoad, () => setImageHidden(undefined));\n }\n\n // Resolve the initials slot, defaulted to getInitials.\n let initials: AvatarState['initials'] = resolveShorthand(props.initials, {\n required: true,\n defaultProps: {\n children: getInitials(name, dir === 'rtl', { firstInitialOnly: size <= 16 }),\n id: baseId + '__initials',\n },\n });\n\n // Don't render the initials slot if it's empty\n if (!initials?.children) {\n initials = undefined;\n }\n\n // Render the icon slot *only if* there aren't any initials or image to display\n let icon: AvatarState['icon'] = undefined;\n if (!initials && (!image || imageHidden)) {\n icon = resolveShorthand(props.icon, {\n required: true,\n defaultProps: {\n children: <PersonRegular />,\n 'aria-hidden': true,\n },\n });\n }\n\n const badge: AvatarState['badge'] = resolveShorthand(props.badge, {\n defaultProps: {\n size: getBadgeSize(size),\n id: baseId + '__badge',\n },\n });\n\n let activeAriaLabelElement: AvatarState['activeAriaLabelElement'];\n\n // Resolve aria-label and/or aria-labelledby if not provided by the user\n if (!root['aria-label'] && !root['aria-labelledby']) {\n if (name) {\n root['aria-label'] = name;\n\n // Include the badge in labelledby if it exists\n if (badge) {\n root['aria-labelledby'] = root.id + ' ' + badge.id;\n }\n } else if (initials) {\n // root's aria-label should be the name, but fall back to being labelledby the initials if name is missing\n root['aria-labelledby'] = initials.id + (badge ? ' ' + badge.id : '');\n }\n\n // Add the active state to the aria label\n if (active === 'active' || active === 'inactive') {\n const activeText = DEFAULT_STRINGS[active];\n if (root['aria-labelledby']) {\n // If using aria-labelledby, render a hidden span and append it to the labelledby\n const activeId = baseId + '__active';\n root['aria-labelledby'] += ' ' + activeId;\n activeAriaLabelElement = (\n <span hidden id={activeId}>\n {activeText}\n </span>\n );\n } else if (root['aria-label']) {\n // Otherwise, just append it to the aria-label\n root['aria-label'] += ' ' + activeText;\n }\n }\n }\n\n return {\n size,\n shape,\n active,\n activeAppearance,\n activeAriaLabelElement,\n color,\n\n components: {\n root: 'span',\n initials: 'span',\n icon: 'span',\n image: 'img',\n badge: PresenceBadge,\n },\n\n root,\n initials,\n icon,\n image,\n badge,\n };\n};\n\nconst getBadgeSize = (size: AvatarState['size']) => {\n if (size >= 96) {\n return 'extra-large';\n } else if (size >= 64) {\n return 'large';\n } else if (size >= 56) {\n return 'medium';\n } else if (size >= 40) {\n return 'small';\n } else if (size >= 28) {\n return 'extra-small';\n } else {\n return 'tiny';\n }\n};\n\nconst avatarColors: AvatarNamedColor[] = [\n 'dark-red',\n 'cranberry',\n 'red',\n 'pumpkin',\n 'peach',\n 'marigold',\n 'gold',\n 'brass',\n 'brown',\n 'forest',\n 'seafoam',\n 'dark-green',\n 'light-teal',\n 'teal',\n 'steel',\n 'blue',\n 'royal-blue',\n 'cornflower',\n 'navy',\n 'lavender',\n 'purple',\n 'grape',\n 'lilac',\n 'pink',\n 'magenta',\n 'plum',\n 'beige',\n 'mink',\n 'platinum',\n 'anchor',\n];\n\nconst getHashCode = (str: string): number => {\n let hashCode = 0;\n for (let len: number = str.length - 1; len >= 0; len--) {\n const ch = str.charCodeAt(len);\n const shift = len % 8;\n hashCode ^= (ch << shift) + (ch >> (8 - shift)); // eslint-disable-line no-bitwise\n }\n\n return hashCode;\n};\n"],"sourceRoot":"../src/"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["exports","active","inactive","useAvatar_unstable","props","ref","dir","react_shared_contexts_1","size","contextSize","AvatarContext_1","name","shape","activeAppearance","idForColor","color","avatarColors","getHashCode","length","baseId","react_utilities_1","root","role","id","imageHidden","setImageHidden","React","useState","undefined","image","defaultProps","alt","hidden","onError","onLoad","initials","required","children","index_1","firstInitialOnly","icon","react_icons_1","badge","getBadgeSize","activeAriaLabelElement","activeText","activeId","components","react_badge_1","str","hashCode","len","ch","charCodeAt","shift"],"sourceRoot":"../src/","sources":["packages/react-components/react-avatar/src/components/Avatar/useAvatar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { getNativeElementProps, mergeCallbacks, resolveShorthand, useId } from '@fluentui/react-utilities';\nimport { getInitials } from '../../utils/index';\nimport type { AvatarNamedColor, AvatarProps, AvatarState } from './Avatar.types';\nimport { PersonRegular } from '@fluentui/react-icons';\nimport { PresenceBadge } from '@fluentui/react-badge';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { useAvatarContext } from '../../contexts/AvatarContext';\n\nexport const DEFAULT_STRINGS = {\n active: 'active',\n inactive: 'inactive',\n};\n\nexport const useAvatar_unstable = (props: AvatarProps, ref: React.Ref<HTMLElement>): AvatarState => {\n const { dir } = useFluent();\n const { size: contextSize } = useAvatarContext();\n const {\n name,\n size = contextSize ?? (32 as const),\n shape = 'circular',\n active = 'unset',\n activeAppearance = 'ring',\n idForColor,\n } = props;\n let { color = 'neutral' } = props;\n\n // Resolve 'colorful' to a specific color name\n if (color === 'colorful') {\n color = avatarColors[getHashCode(idForColor ?? name ?? '') % avatarColors.length];\n }\n\n const baseId = useId('avatar-');\n\n const root: AvatarState['root'] = getNativeElementProps(\n 'span',\n {\n role: 'img',\n id: baseId,\n // aria-label and/or aria-labelledby are resolved below\n ...props,\n ref,\n },\n /* excludedPropNames: */ ['name'],\n );\n\n const [imageHidden, setImageHidden] = React.useState<true | undefined>(undefined);\n const image: AvatarState['image'] = resolveShorthand(props.image, {\n defaultProps: {\n alt: '',\n role: 'presentation',\n 'aria-hidden': true,\n hidden: imageHidden,\n },\n });\n\n // Hide the image if it fails to load and restore it on a successful load\n if (image) {\n image.onError = mergeCallbacks(image.onError, () => setImageHidden(true));\n image.onLoad = mergeCallbacks(image.onLoad, () => setImageHidden(undefined));\n }\n\n // Resolve the initials slot, defaulted to getInitials.\n let initials: AvatarState['initials'] = resolveShorthand(props.initials, {\n required: true,\n defaultProps: {\n children: getInitials(name, dir === 'rtl', { firstInitialOnly: size <= 16 }),\n id: baseId + '__initials',\n },\n });\n\n // Don't render the initials slot if it's empty\n if (!initials?.children) {\n initials = undefined;\n }\n\n // Render the icon slot *only if* there aren't any initials or image to display\n let icon: AvatarState['icon'] = undefined;\n if (!initials && (!image || imageHidden)) {\n icon = resolveShorthand(props.icon, {\n required: true,\n defaultProps: {\n children: <PersonRegular />,\n 'aria-hidden': true,\n },\n });\n }\n\n const badge: AvatarState['badge'] = resolveShorthand(props.badge, {\n defaultProps: {\n size: getBadgeSize(size),\n id: baseId + '__badge',\n },\n });\n\n let activeAriaLabelElement: AvatarState['activeAriaLabelElement'];\n\n // Resolve aria-label and/or aria-labelledby if not provided by the user\n if (!root['aria-label'] && !root['aria-labelledby']) {\n if (name) {\n root['aria-label'] = name;\n\n // Include the badge in labelledby if it exists\n if (badge) {\n root['aria-labelledby'] = root.id + ' ' + badge.id;\n }\n } else if (initials) {\n // root's aria-label should be the name, but fall back to being labelledby the initials if name is missing\n root['aria-labelledby'] = initials.id + (badge ? ' ' + badge.id : '');\n }\n\n // Add the active state to the aria label\n if (active === 'active' || active === 'inactive') {\n const activeText = DEFAULT_STRINGS[active];\n if (root['aria-labelledby']) {\n // If using aria-labelledby, render a hidden span and append it to the labelledby\n const activeId = baseId + '__active';\n root['aria-labelledby'] += ' ' + activeId;\n activeAriaLabelElement = (\n <span hidden id={activeId}>\n {activeText}\n </span>\n );\n } else if (root['aria-label']) {\n // Otherwise, just append it to the aria-label\n root['aria-label'] += ' ' + activeText;\n }\n }\n }\n\n return {\n size,\n shape,\n active,\n activeAppearance,\n activeAriaLabelElement,\n color,\n\n components: {\n root: 'span',\n initials: 'span',\n icon: 'span',\n image: 'img',\n badge: PresenceBadge,\n },\n\n root,\n initials,\n icon,\n image,\n badge,\n };\n};\n\nconst getBadgeSize = (size: AvatarState['size']) => {\n if (size >= 96) {\n return 'extra-large';\n } else if (size >= 64) {\n return 'large';\n } else if (size >= 56) {\n return 'medium';\n } else if (size >= 40) {\n return 'small';\n } else if (size >= 28) {\n return 'extra-small';\n } else {\n return 'tiny';\n }\n};\n\nconst avatarColors: AvatarNamedColor[] = [\n 'dark-red',\n 'cranberry',\n 'red',\n 'pumpkin',\n 'peach',\n 'marigold',\n 'gold',\n 'brass',\n 'brown',\n 'forest',\n 'seafoam',\n 'dark-green',\n 'light-teal',\n 'teal',\n 'steel',\n 'blue',\n 'royal-blue',\n 'cornflower',\n 'navy',\n 'lavender',\n 'purple',\n 'grape',\n 'lilac',\n 'pink',\n 'magenta',\n 'plum',\n 'beige',\n 'mink',\n 'platinum',\n 'anchor',\n];\n\nconst getHashCode = (str: string): number => {\n let hashCode = 0;\n for (let len: number = str.length - 1; len >= 0; len--) {\n const ch = str.charCodeAt(len);\n const shift = len % 8;\n hashCode ^= (ch << shift) + (ch >> (8 - shift)); // eslint-disable-line no-bitwise\n }\n\n return hashCode;\n};\n"]}
|