@momentum-design/components 0.12.3 → 0.12.5
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/browser/index.js +320 -186
- package/dist/browser/index.js.map +4 -4
- package/dist/components/avatar/avatar.component.d.ts +215 -12
- package/dist/components/avatar/avatar.component.js +305 -31
- package/dist/components/avatar/avatar.constants.d.ts +10 -3
- package/dist/components/avatar/avatar.constants.js +13 -4
- package/dist/components/avatar/avatar.styles.d.ts +2 -2
- package/dist/components/avatar/avatar.styles.js +119 -10
- package/dist/components/avatar/avatar.types.d.ts +5 -1
- package/dist/components/avatar/avatar.utils.d.ts +5 -0
- package/dist/components/avatar/avatar.utils.js +27 -0
- package/dist/components/avatar/index.d.ts +3 -0
- package/dist/components/avatar/index.js +3 -0
- package/dist/custom-elements.json +171 -105
- package/dist/react/avatar/index.d.ts +30 -2
- package/dist/react/avatar/index.js +30 -2
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.js +1 -1
- package/package.json +1 -1
@@ -1,28 +1,231 @@
|
|
1
1
|
import { CSSResult } from 'lit';
|
2
|
+
import type { PropertyValues, TemplateResult } from 'lit';
|
2
3
|
import { Component } from '../../models';
|
3
|
-
import {
|
4
|
+
import type { IconNames } from '../icon/icon.types';
|
5
|
+
import type { PresenceType } from '../presence/presence.types';
|
6
|
+
import type { AvatarSize } from './avatar.types';
|
4
7
|
/**
|
5
|
-
*
|
8
|
+
* The `mdc-avatar` component is used to represent a person or a space.
|
9
|
+
* An avatar can be an icon, initials, counter and photo.
|
6
10
|
*
|
7
|
-
*
|
11
|
+
* To set the photo of an avatar,
|
12
|
+
* you need to set "src" attribute.
|
13
|
+
*
|
14
|
+
* While the avatar image is loading, as a placeholder,
|
15
|
+
* we will show the initials text.
|
16
|
+
* If the initials are not specified then,
|
17
|
+
* we will show `user-regular` icon as a placeholder.
|
18
|
+
*
|
19
|
+
* By default, if there are no attributes specified,
|
20
|
+
* then the default avatar will be an icon with `user-regular` name.
|
21
|
+
*
|
22
|
+
* The avatar component is non clickable and non interactive/focusable component.
|
23
|
+
* If the avatar is typing, then the loading indicator will be displayed.
|
24
|
+
* If the counter type avatar is set to a negative number, then we will display 0.
|
25
|
+
* The presence indicator will be hidden when the counter property is set.
|
26
|
+
*
|
27
|
+
* @dependency mdc-icon
|
28
|
+
* @dependency mdc-presence
|
29
|
+
* @dependency mdc-text
|
8
30
|
*
|
9
31
|
* @tagname mdc-avatar
|
32
|
+
*
|
33
|
+
* @cssproperty --mdc-avatar-default-background-color - Allows customization of the default background color.
|
34
|
+
* @cssproperty --mdc-avatar-default-foreground-color - Allows customization of the default foreground color.
|
35
|
+
* @cssproperty --mdc-avatar-loading-indicator-background-color -
|
36
|
+
* Allows customization of the loading indicator background color.
|
37
|
+
* @cssproperty --mdc-avatar-loading-indicator-foreground-color -
|
38
|
+
* Allows customization of the loading indicator foreground color.
|
39
|
+
* @cssproperty --mdc-avatar-loading-overlay-background-color -
|
40
|
+
* Allows customization of the loading overlay background color.
|
10
41
|
*/
|
11
42
|
declare class Avatar extends Component {
|
12
|
-
|
13
|
-
|
43
|
+
/**
|
44
|
+
* The src is the url which will be used to display the avatar.
|
45
|
+
* When the src is loading, we will display the initials as a placeholder.
|
46
|
+
*/
|
14
47
|
src?: string;
|
15
48
|
/**
|
16
|
-
*
|
49
|
+
* The initials to be displayed for the avatar.
|
50
|
+
*/
|
51
|
+
initials?: string;
|
52
|
+
/**
|
53
|
+
* The presence is the status which can be used to display the
|
54
|
+
* activity state of a user or a space within an avatar component.
|
55
|
+
*
|
56
|
+
* Acceptable values include:
|
57
|
+
* - `active`
|
58
|
+
* - `away`
|
59
|
+
* - `away-calling`
|
60
|
+
* - `busy`
|
61
|
+
* - `dnd`
|
62
|
+
* - `meeting`
|
63
|
+
* - `on-call`
|
64
|
+
* - `on-device`
|
65
|
+
* - `on-mobile`
|
66
|
+
* - `pause`
|
67
|
+
* - `pto`
|
68
|
+
* - `presenting`
|
69
|
+
* - `quiet`
|
70
|
+
* - `scheduled`
|
71
|
+
*/
|
72
|
+
presence?: PresenceType;
|
73
|
+
/**
|
74
|
+
* Acceptable values include:
|
75
|
+
* - xx_small
|
76
|
+
* - x_small
|
77
|
+
* - small
|
78
|
+
* - midsize
|
79
|
+
* - large
|
80
|
+
* - x_large
|
81
|
+
* - xx_large
|
82
|
+
*
|
83
|
+
* @default x_small
|
84
|
+
*/
|
85
|
+
size: AvatarSize;
|
86
|
+
/**
|
87
|
+
* Name of the icon to be displayed inside the Avatar.
|
88
|
+
* Must be a valid icon name.
|
89
|
+
*/
|
90
|
+
iconName?: IconNames;
|
91
|
+
/**
|
92
|
+
* The counter is the number which can be displayed on the avatar.
|
93
|
+
* The maximum number is 99 and if the give number is greater than 99,
|
94
|
+
* then the avatar will be displayed as `99+`.
|
95
|
+
* If the given number is a negative number,
|
96
|
+
* then the avatar will be displayed as `0`.
|
97
|
+
*/
|
98
|
+
counter?: number;
|
99
|
+
/**
|
100
|
+
* Represents the typing indicator when the user is typing.
|
101
|
+
* @default false
|
102
|
+
*/
|
103
|
+
isTyping: boolean;
|
104
|
+
/**
|
105
|
+
* @internal
|
106
|
+
*/
|
107
|
+
private isPhotoLoaded;
|
108
|
+
/**
|
109
|
+
* @internal
|
110
|
+
* The avatar presence will be hidden if the avatar type is COUNTER.
|
111
|
+
* If the presence is set, it will be rendered as a child of the avatar.
|
112
|
+
*
|
113
|
+
* @param type - The type of the avatar.
|
114
|
+
* @returns The presence template or an empty template.
|
115
|
+
*/
|
116
|
+
private getPresenceTemplateBasedOnType;
|
117
|
+
/**
|
118
|
+
* @internal
|
119
|
+
* Sets `isPhotoLoaded` to `true` when the avatar photo is loaded.
|
120
|
+
* This is used to hide the avatar photo initially and show it only when it is loaded.
|
121
|
+
*/
|
122
|
+
private handleOnLoad;
|
123
|
+
/**
|
124
|
+
* @internal
|
125
|
+
* Handles errors that occur during the image loading process.
|
126
|
+
* Sets `isPhotoLoaded` to `false` to indicate the failure and throws an error message.
|
127
|
+
* The error message suggests checking the `src` attribute.
|
128
|
+
*/
|
129
|
+
private handleOnError;
|
130
|
+
/**
|
131
|
+
* @internal
|
132
|
+
* Generates the photo template for the avatar component.
|
133
|
+
* Utilizes the `src` attribute to display an image.
|
134
|
+
* The photo remains hidden until it is fully loaded;
|
135
|
+
* upon successful loading, the `handleOnLoad` method sets `isPhotoLoaded` to true.
|
136
|
+
* In the event of a loading error, the `handleOnError` method sets `isPhotoLoaded` to false and raises an error.
|
137
|
+
*
|
138
|
+
* @returns The template result containing the avatar photo.
|
139
|
+
*/
|
140
|
+
private photoTemplate;
|
141
|
+
/**
|
142
|
+
* @internal
|
143
|
+
* Generates the icon template for the photo avatar component.
|
144
|
+
* Utilizes the `mdc-icon` component to display an icon.
|
145
|
+
* If the `iconName` property is not provided, it defaults to the `DEFAULTS.ICON_NAME`.
|
146
|
+
*
|
147
|
+
* @returns The template result containing the avatar icon.
|
148
|
+
*/
|
149
|
+
private iconTemplate;
|
150
|
+
/**
|
151
|
+
* @internal
|
152
|
+
* Generates the text template for the initials/counter avatar component.
|
153
|
+
* Utilizes the `mdc-text` component to display text.
|
154
|
+
*
|
155
|
+
* @param content - the text content to be displayed
|
156
|
+
* @returns The template result containing the avatar text.
|
157
|
+
*/
|
158
|
+
private textTemplate;
|
159
|
+
/**
|
160
|
+
* @internal
|
161
|
+
* Generates the text content for counter avatar by converting the given number to a string.
|
162
|
+
* If the counter exceeds the maximum limit of 99, it will return the maximum limit as a string
|
163
|
+
* followed by a '+' character.
|
164
|
+
*
|
165
|
+
* @param counter - the number to be converted to a string
|
166
|
+
* @returns the counter text
|
167
|
+
*/
|
168
|
+
private generateCounterText;
|
169
|
+
/**
|
170
|
+
* @internal
|
171
|
+
* Converts the given initials to uppercase and takes the first two characters.
|
172
|
+
* This is used to generate the text content for the initials avatar.
|
173
|
+
*
|
174
|
+
* @param initials - the string containing the initials
|
175
|
+
* @returns the first two uppercase characters of the given initials
|
176
|
+
*/
|
177
|
+
private generateInitialsText;
|
178
|
+
/**
|
179
|
+
* @internal
|
180
|
+
* Generates the text content based on the given type.
|
181
|
+
* If the type is TEXT, it will use the initials property and generate the first two uppercase characters.
|
182
|
+
* If the type is COUNTER, it uses the value of counter property and
|
183
|
+
* generate the string representation of the counter.
|
184
|
+
* The generated content is then passed to the `textTemplate` method to generate the final template.
|
185
|
+
*
|
186
|
+
* @param type - the type of the avatar
|
187
|
+
* @returns the template result containing the avatar text
|
188
|
+
*/
|
189
|
+
private generateTextContent;
|
190
|
+
/**
|
191
|
+
* @internal
|
192
|
+
* Returns the type of the avatar component based on the user-provided inputs.
|
193
|
+
*
|
194
|
+
* @returns the type of the avatar component
|
195
|
+
*/
|
196
|
+
private getTypeBasedOnInputs;
|
197
|
+
/**
|
198
|
+
* @internal
|
199
|
+
* Returns the template result based on the type of the avatar component.
|
200
|
+
* The type is determined by `getTypeBasedOnInputs` based on user's input.
|
201
|
+
* Based on the generated type, template result is generated.
|
202
|
+
*
|
203
|
+
* @param type - the type of the avatar component
|
204
|
+
* @returns the template result containing the avatar content
|
205
|
+
*/
|
206
|
+
private getTemplateBasedOnType;
|
207
|
+
/**
|
208
|
+
* @internal
|
209
|
+
* Represents the loading indicator for the avatar when typing.
|
210
|
+
* If the avatar is in typing state, this method returns a loading indicator
|
211
|
+
* comprising three small filled dots, scaled based on the avatar size.
|
212
|
+
*
|
213
|
+
* @returns The template result containing the loading indicator, or an empty template if not typing.
|
17
214
|
*/
|
18
|
-
|
215
|
+
private getLoadingContent;
|
19
216
|
/**
|
20
|
-
*
|
217
|
+
* @internal
|
218
|
+
* Generates the photo placeholder content for the avatar component.
|
219
|
+
* If the photo is not yet loaded, and the avatar type is PHOTO with initials provided,
|
220
|
+
* it generates and returns the initials as a placeholder text.
|
221
|
+
* If the photo is already loaded, it returns an empty template.
|
222
|
+
*
|
223
|
+
* @param type - The type of the avatar.
|
224
|
+
* @returns The template result containing the placeholder content or an empty template.
|
21
225
|
*/
|
22
|
-
private
|
23
|
-
|
24
|
-
|
25
|
-
render(): import("lit-html").TemplateResult<1>;
|
226
|
+
private getPhotoPlaceHolderContent;
|
227
|
+
update(changedProperties: PropertyValues): void;
|
228
|
+
render(): TemplateResult;
|
26
229
|
static styles: Array<CSSResult>;
|
27
230
|
}
|
28
231
|
export default Avatar;
|
@@ -7,78 +7,352 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
7
7
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
9
9
|
};
|
10
|
-
import { html } from 'lit';
|
11
|
-
import { property } from 'lit/decorators.js';
|
10
|
+
import { html, nothing } from 'lit';
|
11
|
+
import { property, state } from 'lit/decorators.js';
|
12
12
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
13
|
-
import styles from './avatar.styles';
|
14
13
|
import { Component } from '../../models';
|
15
|
-
import { DEFAULTS,
|
14
|
+
import { AVATAR_TYPE, DEFAULTS, MAX_COUNTER } from './avatar.constants';
|
15
|
+
import styles from './avatar.styles';
|
16
|
+
import { getAvatarIconSize, getAvatarTextFontSize } from './avatar.utils';
|
16
17
|
/**
|
17
|
-
*
|
18
|
+
* The `mdc-avatar` component is used to represent a person or a space.
|
19
|
+
* An avatar can be an icon, initials, counter and photo.
|
20
|
+
*
|
21
|
+
* To set the photo of an avatar,
|
22
|
+
* you need to set "src" attribute.
|
23
|
+
*
|
24
|
+
* While the avatar image is loading, as a placeholder,
|
25
|
+
* we will show the initials text.
|
26
|
+
* If the initials are not specified then,
|
27
|
+
* we will show `user-regular` icon as a placeholder.
|
28
|
+
*
|
29
|
+
* By default, if there are no attributes specified,
|
30
|
+
* then the default avatar will be an icon with `user-regular` name.
|
18
31
|
*
|
19
|
-
*
|
32
|
+
* The avatar component is non clickable and non interactive/focusable component.
|
33
|
+
* If the avatar is typing, then the loading indicator will be displayed.
|
34
|
+
* If the counter type avatar is set to a negative number, then we will display 0.
|
35
|
+
* The presence indicator will be hidden when the counter property is set.
|
36
|
+
*
|
37
|
+
* @dependency mdc-icon
|
38
|
+
* @dependency mdc-presence
|
39
|
+
* @dependency mdc-text
|
20
40
|
*
|
21
41
|
* @tagname mdc-avatar
|
42
|
+
*
|
43
|
+
* @cssproperty --mdc-avatar-default-background-color - Allows customization of the default background color.
|
44
|
+
* @cssproperty --mdc-avatar-default-foreground-color - Allows customization of the default foreground color.
|
45
|
+
* @cssproperty --mdc-avatar-loading-indicator-background-color -
|
46
|
+
* Allows customization of the loading indicator background color.
|
47
|
+
* @cssproperty --mdc-avatar-loading-indicator-foreground-color -
|
48
|
+
* Allows customization of the loading indicator foreground color.
|
49
|
+
* @cssproperty --mdc-avatar-loading-overlay-background-color -
|
50
|
+
* Allows customization of the loading overlay background color.
|
22
51
|
*/
|
23
52
|
class Avatar extends Component {
|
24
53
|
constructor() {
|
25
54
|
super(...arguments);
|
26
|
-
this.type = DEFAULTS.TYPE;
|
27
55
|
/**
|
28
|
-
*
|
56
|
+
* Acceptable values include:
|
57
|
+
* - xx_small
|
58
|
+
* - x_small
|
59
|
+
* - small
|
60
|
+
* - midsize
|
61
|
+
* - large
|
62
|
+
* - x_large
|
63
|
+
* - xx_large
|
64
|
+
*
|
65
|
+
* @default x_small
|
29
66
|
*/
|
30
67
|
this.size = DEFAULTS.SIZE;
|
68
|
+
/**
|
69
|
+
* Represents the typing indicator when the user is typing.
|
70
|
+
* @default false
|
71
|
+
*/
|
72
|
+
this.isTyping = false;
|
73
|
+
/**
|
74
|
+
* @internal
|
75
|
+
*/
|
76
|
+
this.isPhotoLoaded = false;
|
31
77
|
}
|
32
78
|
/**
|
33
|
-
*
|
79
|
+
* @internal
|
80
|
+
* The avatar presence will be hidden if the avatar type is COUNTER.
|
81
|
+
* If the presence is set, it will be rendered as a child of the avatar.
|
82
|
+
*
|
83
|
+
* @param type - The type of the avatar.
|
84
|
+
* @returns The presence template or an empty template.
|
34
85
|
*/
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
86
|
+
getPresenceTemplateBasedOnType(type) {
|
87
|
+
// avatar type of counter should not have presence
|
88
|
+
if (type === AVATAR_TYPE.COUNTER && (this.counter || this.counter === 0)) {
|
89
|
+
return nothing;
|
90
|
+
}
|
91
|
+
if (this.presence) {
|
92
|
+
return html `
|
93
|
+
<mdc-presence class="presence" type="${this.presence}" size="${this.size}"></mdc-presence>
|
94
|
+
`;
|
40
95
|
}
|
96
|
+
return nothing;
|
97
|
+
}
|
98
|
+
/**
|
99
|
+
* @internal
|
100
|
+
* Sets `isPhotoLoaded` to `true` when the avatar photo is loaded.
|
101
|
+
* This is used to hide the avatar photo initially and show it only when it is loaded.
|
102
|
+
*/
|
103
|
+
handleOnLoad() {
|
104
|
+
this.isPhotoLoaded = true;
|
41
105
|
}
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
106
|
+
/**
|
107
|
+
* @internal
|
108
|
+
* Handles errors that occur during the image loading process.
|
109
|
+
* Sets `isPhotoLoaded` to `false` to indicate the failure and throws an error message.
|
110
|
+
* The error message suggests checking the `src` attribute.
|
111
|
+
*/
|
112
|
+
handleOnError() {
|
113
|
+
this.isPhotoLoaded = false;
|
114
|
+
if (this.onerror) {
|
115
|
+
this.onerror('There was a problem while fetching the <img/>. Please check the src attribute and try again.');
|
46
116
|
}
|
47
117
|
}
|
118
|
+
/**
|
119
|
+
* @internal
|
120
|
+
* Generates the photo template for the avatar component.
|
121
|
+
* Utilizes the `src` attribute to display an image.
|
122
|
+
* The photo remains hidden until it is fully loaded;
|
123
|
+
* upon successful loading, the `handleOnLoad` method sets `isPhotoLoaded` to true.
|
124
|
+
* In the event of a loading error, the `handleOnError` method sets `isPhotoLoaded` to false and raises an error.
|
125
|
+
*
|
126
|
+
* @returns The template result containing the avatar photo.
|
127
|
+
*/
|
48
128
|
photoTemplate() {
|
49
129
|
return html `
|
50
130
|
<img
|
131
|
+
class="photo"
|
51
132
|
src="${ifDefined(this.src)}"
|
52
|
-
|
133
|
+
aria-hidden="true"
|
134
|
+
?hidden="${!this.isPhotoLoaded}"
|
135
|
+
@load="${this.handleOnLoad}"
|
136
|
+
@error="${this.handleOnError}"
|
53
137
|
/>
|
54
138
|
`;
|
55
139
|
}
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
140
|
+
/**
|
141
|
+
* @internal
|
142
|
+
* Generates the icon template for the photo avatar component.
|
143
|
+
* Utilizes the `mdc-icon` component to display an icon.
|
144
|
+
* If the `iconName` property is not provided, it defaults to the `DEFAULTS.ICON_NAME`.
|
145
|
+
*
|
146
|
+
* @returns The template result containing the avatar icon.
|
147
|
+
*/
|
148
|
+
iconTemplate() {
|
149
|
+
const name = this.iconName || DEFAULTS.ICON_NAME;
|
150
|
+
return html `
|
151
|
+
<mdc-icon
|
152
|
+
name="${ifDefined(name)}"
|
153
|
+
length-unit="rem"
|
154
|
+
size="${getAvatarIconSize(this.size)}"
|
155
|
+
></mdc-icon>
|
156
|
+
`;
|
157
|
+
}
|
158
|
+
/**
|
159
|
+
* @internal
|
160
|
+
* Generates the text template for the initials/counter avatar component.
|
161
|
+
* Utilizes the `mdc-text` component to display text.
|
162
|
+
*
|
163
|
+
* @param content - the text content to be displayed
|
164
|
+
* @returns The template result containing the avatar text.
|
165
|
+
*/
|
166
|
+
textTemplate(content) {
|
167
|
+
return html `
|
168
|
+
<mdc-text
|
169
|
+
type="${getAvatarTextFontSize(this.size)}"
|
170
|
+
tagname="span"
|
171
|
+
>
|
172
|
+
${content}
|
173
|
+
</mdc-text>
|
174
|
+
`;
|
175
|
+
}
|
176
|
+
/**
|
177
|
+
* @internal
|
178
|
+
* Generates the text content for counter avatar by converting the given number to a string.
|
179
|
+
* If the counter exceeds the maximum limit of 99, it will return the maximum limit as a string
|
180
|
+
* followed by a '+' character.
|
181
|
+
*
|
182
|
+
* @param counter - the number to be converted to a string
|
183
|
+
* @returns the counter text
|
184
|
+
*/
|
185
|
+
generateCounterText(counter) {
|
186
|
+
// If the consumer provides a negative number, we set it to 0.
|
187
|
+
if (counter < 0) {
|
188
|
+
return '0';
|
189
|
+
}
|
190
|
+
if (counter > MAX_COUNTER) {
|
191
|
+
return `${MAX_COUNTER}+`;
|
192
|
+
}
|
193
|
+
return counter.toString();
|
194
|
+
}
|
195
|
+
/**
|
196
|
+
* @internal
|
197
|
+
* Converts the given initials to uppercase and takes the first two characters.
|
198
|
+
* This is used to generate the text content for the initials avatar.
|
199
|
+
*
|
200
|
+
* @param initials - the string containing the initials
|
201
|
+
* @returns the first two uppercase characters of the given initials
|
202
|
+
*/
|
203
|
+
generateInitialsText(initials) {
|
204
|
+
return initials.toUpperCase().slice(0, 2);
|
205
|
+
}
|
206
|
+
/**
|
207
|
+
* @internal
|
208
|
+
* Generates the text content based on the given type.
|
209
|
+
* If the type is TEXT, it will use the initials property and generate the first two uppercase characters.
|
210
|
+
* If the type is COUNTER, it uses the value of counter property and
|
211
|
+
* generate the string representation of the counter.
|
212
|
+
* The generated content is then passed to the `textTemplate` method to generate the final template.
|
213
|
+
*
|
214
|
+
* @param type - the type of the avatar
|
215
|
+
* @returns the template result containing the avatar text
|
216
|
+
*/
|
217
|
+
generateTextContent(type) {
|
218
|
+
let content = '';
|
219
|
+
if (type === AVATAR_TYPE.TEXT && this.initials) {
|
220
|
+
content = this.generateInitialsText(this.initials);
|
60
221
|
}
|
61
|
-
|
62
|
-
content =
|
222
|
+
if (type === AVATAR_TYPE.COUNTER && (this.counter || this.counter === 0)) {
|
223
|
+
content = this.generateCounterText(this.counter);
|
63
224
|
}
|
64
|
-
return
|
225
|
+
return this.textTemplate(content);
|
226
|
+
}
|
227
|
+
/**
|
228
|
+
* @internal
|
229
|
+
* Returns the type of the avatar component based on the user-provided inputs.
|
230
|
+
*
|
231
|
+
* @returns the type of the avatar component
|
232
|
+
*/
|
233
|
+
getTypeBasedOnInputs() {
|
234
|
+
if (this.src) {
|
235
|
+
return AVATAR_TYPE.PHOTO;
|
236
|
+
}
|
237
|
+
if (this.iconName) {
|
238
|
+
return AVATAR_TYPE.ICON;
|
239
|
+
}
|
240
|
+
if (this.initials) {
|
241
|
+
return AVATAR_TYPE.TEXT;
|
242
|
+
}
|
243
|
+
if (this.counter || this.counter === 0) {
|
244
|
+
return AVATAR_TYPE.COUNTER;
|
245
|
+
}
|
246
|
+
return AVATAR_TYPE.ICON;
|
247
|
+
}
|
248
|
+
/**
|
249
|
+
* @internal
|
250
|
+
* Returns the template result based on the type of the avatar component.
|
251
|
+
* The type is determined by `getTypeBasedOnInputs` based on user's input.
|
252
|
+
* Based on the generated type, template result is generated.
|
253
|
+
*
|
254
|
+
* @param type - the type of the avatar component
|
255
|
+
* @returns the template result containing the avatar content
|
256
|
+
*/
|
257
|
+
getTemplateBasedOnType(type) {
|
258
|
+
switch (type) {
|
259
|
+
case AVATAR_TYPE.PHOTO:
|
260
|
+
return this.photoTemplate();
|
261
|
+
case AVATAR_TYPE.TEXT:
|
262
|
+
case AVATAR_TYPE.COUNTER:
|
263
|
+
return this.generateTextContent(type);
|
264
|
+
case AVATAR_TYPE.ICON:
|
265
|
+
default:
|
266
|
+
return this.iconTemplate();
|
267
|
+
}
|
268
|
+
}
|
269
|
+
/**
|
270
|
+
* @internal
|
271
|
+
* Represents the loading indicator for the avatar when typing.
|
272
|
+
* If the avatar is in typing state, this method returns a loading indicator
|
273
|
+
* comprising three small filled dots, scaled based on the avatar size.
|
274
|
+
*
|
275
|
+
* @returns The template result containing the loading indicator, or an empty template if not typing.
|
276
|
+
*/
|
277
|
+
getLoadingContent() {
|
278
|
+
if (!this.isTyping) {
|
279
|
+
return nothing;
|
280
|
+
}
|
281
|
+
return html `<div class="loading__wrapper"><div class="loader"></div></div>`;
|
282
|
+
}
|
283
|
+
/**
|
284
|
+
* @internal
|
285
|
+
* Generates the photo placeholder content for the avatar component.
|
286
|
+
* If the photo is not yet loaded, and the avatar type is PHOTO with initials provided,
|
287
|
+
* it generates and returns the initials as a placeholder text.
|
288
|
+
* If the photo is already loaded, it returns an empty template.
|
289
|
+
*
|
290
|
+
* @param type - The type of the avatar.
|
291
|
+
* @returns The template result containing the placeholder content or an empty template.
|
292
|
+
*/
|
293
|
+
getPhotoPlaceHolderContent(type) {
|
294
|
+
// if photo is already loaded then no need to show placeholder
|
295
|
+
if (this.isPhotoLoaded) {
|
296
|
+
return nothing;
|
297
|
+
}
|
298
|
+
if (type === AVATAR_TYPE.PHOTO) {
|
299
|
+
if (this.initials) {
|
300
|
+
return this.textTemplate(this.generateInitialsText(this.initials));
|
301
|
+
}
|
302
|
+
return this.iconTemplate();
|
303
|
+
}
|
304
|
+
return nothing;
|
305
|
+
}
|
306
|
+
update(changedProperties) {
|
307
|
+
super.update(changedProperties);
|
308
|
+
if (changedProperties.has('src') && !this.src) {
|
309
|
+
// Reset photo loaded if src is empty
|
310
|
+
this.isPhotoLoaded = false;
|
311
|
+
}
|
312
|
+
}
|
313
|
+
render() {
|
314
|
+
const type = this.getTypeBasedOnInputs();
|
315
|
+
return html `
|
316
|
+
<div class="content" aria-hidden="true">
|
317
|
+
${this.getPhotoPlaceHolderContent(type)}
|
318
|
+
${this.getTemplateBasedOnType(type)}
|
319
|
+
${this.getLoadingContent()}
|
320
|
+
${this.getPresenceTemplateBasedOnType(type)}
|
321
|
+
</div>
|
322
|
+
`;
|
65
323
|
}
|
66
324
|
}
|
67
325
|
Avatar.styles = [...Component.styles, ...styles];
|
68
326
|
__decorate([
|
69
|
-
property({ type: String
|
327
|
+
property({ type: String }),
|
70
328
|
__metadata("design:type", String)
|
71
|
-
], Avatar.prototype, "
|
329
|
+
], Avatar.prototype, "src", void 0);
|
72
330
|
__decorate([
|
73
331
|
property({ type: String }),
|
74
332
|
__metadata("design:type", String)
|
75
|
-
], Avatar.prototype, "
|
333
|
+
], Avatar.prototype, "initials", void 0);
|
76
334
|
__decorate([
|
77
335
|
property({ type: String }),
|
78
336
|
__metadata("design:type", String)
|
79
|
-
], Avatar.prototype, "
|
337
|
+
], Avatar.prototype, "presence", void 0);
|
338
|
+
__decorate([
|
339
|
+
property({ type: String, reflect: true }),
|
340
|
+
__metadata("design:type", String)
|
341
|
+
], Avatar.prototype, "size", void 0);
|
342
|
+
__decorate([
|
343
|
+
property({ type: String, attribute: 'icon-name' }),
|
344
|
+
__metadata("design:type", String)
|
345
|
+
], Avatar.prototype, "iconName", void 0);
|
80
346
|
__decorate([
|
81
347
|
property({ type: Number }),
|
82
348
|
__metadata("design:type", Number)
|
83
|
-
], Avatar.prototype, "
|
349
|
+
], Avatar.prototype, "counter", void 0);
|
350
|
+
__decorate([
|
351
|
+
property({ type: Boolean, attribute: 'is-typing' }),
|
352
|
+
__metadata("design:type", Object)
|
353
|
+
], Avatar.prototype, "isTyping", void 0);
|
354
|
+
__decorate([
|
355
|
+
state(),
|
356
|
+
__metadata("design:type", Object)
|
357
|
+
], Avatar.prototype, "isPhotoLoaded", void 0);
|
84
358
|
export default Avatar;
|
@@ -1,7 +1,14 @@
|
|
1
1
|
declare const TAG_NAME: "mdc-avatar";
|
2
|
-
declare const
|
2
|
+
declare const AVATAR_TYPE: {
|
3
|
+
readonly COUNTER: "counter";
|
4
|
+
readonly ICON: "icon";
|
5
|
+
readonly PHOTO: "photo";
|
6
|
+
readonly TEXT: "text";
|
7
|
+
};
|
8
|
+
declare const MAX_COUNTER = 99;
|
3
9
|
declare const DEFAULTS: {
|
4
10
|
readonly TYPE: "photo";
|
5
|
-
readonly SIZE:
|
11
|
+
readonly SIZE: "x_small";
|
12
|
+
readonly ICON_NAME: "user-regular";
|
6
13
|
};
|
7
|
-
export { TAG_NAME, DEFAULTS,
|
14
|
+
export { TAG_NAME, DEFAULTS, AVATAR_TYPE, MAX_COUNTER, };
|
@@ -1,8 +1,17 @@
|
|
1
1
|
import utils from '../../utils/tag-name';
|
2
|
+
import { SIZE as AVATAR_SIZE } from '../presence/presence.constants';
|
2
3
|
const TAG_NAME = utils.constructTagName('avatar');
|
3
|
-
const
|
4
|
+
const AVATAR_TYPE = {
|
5
|
+
COUNTER: 'counter',
|
6
|
+
ICON: 'icon',
|
7
|
+
PHOTO: 'photo',
|
8
|
+
TEXT: 'text',
|
9
|
+
};
|
10
|
+
const MAX_COUNTER = 99;
|
11
|
+
const ICON_NAME = 'user-regular';
|
4
12
|
const DEFAULTS = {
|
5
|
-
TYPE:
|
6
|
-
SIZE:
|
13
|
+
TYPE: AVATAR_TYPE.PHOTO,
|
14
|
+
SIZE: AVATAR_SIZE.X_SMALL,
|
15
|
+
ICON_NAME,
|
7
16
|
};
|
8
|
-
export { TAG_NAME, DEFAULTS,
|
17
|
+
export { TAG_NAME, DEFAULTS, AVATAR_TYPE, MAX_COUNTER, };
|
@@ -1,2 +1,2 @@
|
|
1
|
-
declare const
|
2
|
-
export default
|
1
|
+
declare const styles: import("lit").CSSResult[];
|
2
|
+
export default styles;
|