@italia/avatar 0.1.0-alpha.2

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.
@@ -0,0 +1,711 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "readme": "",
4
+ "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "src/index.ts",
8
+ "declarations": [],
9
+ "exports": [
10
+ {
11
+ "kind": "js",
12
+ "name": "ItAvatar",
13
+ "declaration": {
14
+ "name": "ItAvatar",
15
+ "module": "./it-avatar.js"
16
+ }
17
+ },
18
+ {
19
+ "kind": "js",
20
+ "name": "*",
21
+ "declaration": {
22
+ "name": "*",
23
+ "module": "src/types.js"
24
+ }
25
+ }
26
+ ]
27
+ },
28
+ {
29
+ "kind": "javascript-module",
30
+ "path": "src/it-avatar.ts",
31
+ "declarations": [
32
+ {
33
+ "kind": "class",
34
+ "description": "",
35
+ "name": "ItAvatar",
36
+ "members": [
37
+ {
38
+ "kind": "field",
39
+ "name": "shadowRootOptions",
40
+ "type": {
41
+ "text": "object"
42
+ },
43
+ "static": true,
44
+ "default": "{ ...BaseLocalizedComponent.shadowRootOptions, delegatesFocus: true, }"
45
+ },
46
+ {
47
+ "kind": "field",
48
+ "name": "size",
49
+ "type": {
50
+ "text": "AvatarSize"
51
+ },
52
+ "default": "'md'",
53
+ "attribute": "size",
54
+ "reflects": true
55
+ },
56
+ {
57
+ "kind": "field",
58
+ "name": "variant",
59
+ "type": {
60
+ "text": "AvatarColor"
61
+ },
62
+ "default": "''",
63
+ "attribute": "variant",
64
+ "reflects": true
65
+ },
66
+ {
67
+ "kind": "field",
68
+ "name": "presence",
69
+ "type": {
70
+ "text": "AvatarPresence"
71
+ },
72
+ "default": "''",
73
+ "attribute": "presence",
74
+ "reflects": true
75
+ },
76
+ {
77
+ "kind": "field",
78
+ "name": "status",
79
+ "type": {
80
+ "text": "AvatarStatus"
81
+ },
82
+ "default": "''",
83
+ "attribute": "status",
84
+ "reflects": true
85
+ },
86
+ {
87
+ "kind": "field",
88
+ "name": "type",
89
+ "type": {
90
+ "text": "AvatarType"
91
+ },
92
+ "default": "''",
93
+ "attribute": "type",
94
+ "reflects": true
95
+ },
96
+ {
97
+ "kind": "field",
98
+ "name": "src",
99
+ "type": {
100
+ "text": "string"
101
+ },
102
+ "default": "''",
103
+ "attribute": "src",
104
+ "reflects": true
105
+ },
106
+ {
107
+ "kind": "field",
108
+ "name": "alt",
109
+ "type": {
110
+ "text": "string"
111
+ },
112
+ "default": "''",
113
+ "attribute": "alt",
114
+ "reflects": true
115
+ },
116
+ {
117
+ "kind": "field",
118
+ "name": "text",
119
+ "type": {
120
+ "text": "string"
121
+ },
122
+ "default": "''",
123
+ "attribute": "text",
124
+ "reflects": true
125
+ },
126
+ {
127
+ "kind": "field",
128
+ "name": "icon",
129
+ "type": {
130
+ "text": "string"
131
+ },
132
+ "default": "''",
133
+ "attribute": "icon",
134
+ "reflects": true
135
+ },
136
+ {
137
+ "kind": "field",
138
+ "name": "_imageLoadError",
139
+ "type": {
140
+ "text": "boolean"
141
+ },
142
+ "privacy": "private",
143
+ "default": "false"
144
+ },
145
+ {
146
+ "kind": "field",
147
+ "name": "href",
148
+ "type": {
149
+ "text": "string"
150
+ },
151
+ "default": "''",
152
+ "attribute": "href",
153
+ "reflects": true
154
+ },
155
+ {
156
+ "kind": "field",
157
+ "name": "avatarTitle",
158
+ "type": {
159
+ "text": "string"
160
+ },
161
+ "default": "''",
162
+ "attribute": "avatar-title",
163
+ "reflects": true
164
+ },
165
+ {
166
+ "kind": "field",
167
+ "name": "__hasExplicitSize",
168
+ "type": {
169
+ "text": "boolean"
170
+ },
171
+ "readonly": true
172
+ },
173
+ {
174
+ "kind": "field",
175
+ "name": "focusElement",
176
+ "type": {
177
+ "text": "HTMLElement | null"
178
+ },
179
+ "readonly": true
180
+ },
181
+ {
182
+ "kind": "method",
183
+ "name": "getAutoType",
184
+ "privacy": "private",
185
+ "return": {
186
+ "type": {
187
+ "text": "AvatarType"
188
+ }
189
+ }
190
+ },
191
+ {
192
+ "kind": "method",
193
+ "name": "getInitials",
194
+ "privacy": "private",
195
+ "return": {
196
+ "type": {
197
+ "text": "string"
198
+ }
199
+ }
200
+ },
201
+ {
202
+ "kind": "method",
203
+ "name": "getInitialsFromName",
204
+ "privacy": "private",
205
+ "return": {
206
+ "type": {
207
+ "text": "string"
208
+ }
209
+ },
210
+ "parameters": [
211
+ {
212
+ "name": "name",
213
+ "type": {
214
+ "text": "string"
215
+ }
216
+ }
217
+ ]
218
+ },
219
+ {
220
+ "kind": "method",
221
+ "name": "getAvatarWrapperClasses",
222
+ "privacy": "private"
223
+ },
224
+ {
225
+ "kind": "method",
226
+ "name": "getAvatarClasses",
227
+ "privacy": "private"
228
+ },
229
+ {
230
+ "kind": "method",
231
+ "name": "getPresenceClasses",
232
+ "privacy": "private"
233
+ },
234
+ {
235
+ "kind": "method",
236
+ "name": "getStatusClasses",
237
+ "privacy": "private"
238
+ },
239
+ {
240
+ "kind": "method",
241
+ "name": "renderPresence",
242
+ "privacy": "private"
243
+ },
244
+ {
245
+ "kind": "method",
246
+ "name": "renderStatus",
247
+ "privacy": "private"
248
+ },
249
+ {
250
+ "kind": "method",
251
+ "name": "renderImage",
252
+ "privacy": "private"
253
+ },
254
+ {
255
+ "kind": "field",
256
+ "name": "_onImageError",
257
+ "privacy": "private"
258
+ },
259
+ {
260
+ "kind": "method",
261
+ "name": "renderText",
262
+ "privacy": "private"
263
+ },
264
+ {
265
+ "kind": "method",
266
+ "name": "renderIcon",
267
+ "privacy": "private"
268
+ },
269
+ {
270
+ "kind": "method",
271
+ "name": "renderAvatarContent",
272
+ "privacy": "private"
273
+ },
274
+ {
275
+ "kind": "field",
276
+ "name": "hasExtraTextContent",
277
+ "type": {
278
+ "text": "boolean"
279
+ },
280
+ "privacy": "private",
281
+ "readonly": true
282
+ },
283
+ {
284
+ "kind": "field",
285
+ "name": "onExtraTextSlotChange",
286
+ "privacy": "private"
287
+ },
288
+ {
289
+ "kind": "method",
290
+ "name": "getWrapperClasses",
291
+ "privacy": "private"
292
+ }
293
+ ],
294
+ "attributes": [
295
+ {
296
+ "name": "size",
297
+ "type": {
298
+ "text": "AvatarSize"
299
+ },
300
+ "default": "'md'",
301
+ "fieldName": "size"
302
+ },
303
+ {
304
+ "name": "variant",
305
+ "type": {
306
+ "text": "AvatarColor"
307
+ },
308
+ "default": "''",
309
+ "fieldName": "variant"
310
+ },
311
+ {
312
+ "name": "presence",
313
+ "type": {
314
+ "text": "AvatarPresence"
315
+ },
316
+ "default": "''",
317
+ "fieldName": "presence"
318
+ },
319
+ {
320
+ "name": "status",
321
+ "type": {
322
+ "text": "AvatarStatus"
323
+ },
324
+ "default": "''",
325
+ "fieldName": "status"
326
+ },
327
+ {
328
+ "name": "type",
329
+ "type": {
330
+ "text": "AvatarType"
331
+ },
332
+ "default": "''",
333
+ "fieldName": "type"
334
+ },
335
+ {
336
+ "name": "src",
337
+ "type": {
338
+ "text": "string"
339
+ },
340
+ "default": "''",
341
+ "fieldName": "src"
342
+ },
343
+ {
344
+ "name": "alt",
345
+ "type": {
346
+ "text": "string"
347
+ },
348
+ "default": "''",
349
+ "fieldName": "alt"
350
+ },
351
+ {
352
+ "name": "text",
353
+ "type": {
354
+ "text": "string"
355
+ },
356
+ "default": "''",
357
+ "fieldName": "text"
358
+ },
359
+ {
360
+ "name": "icon",
361
+ "type": {
362
+ "text": "string"
363
+ },
364
+ "default": "''",
365
+ "fieldName": "icon"
366
+ },
367
+ {
368
+ "name": "href",
369
+ "type": {
370
+ "text": "string"
371
+ },
372
+ "default": "''",
373
+ "fieldName": "href"
374
+ },
375
+ {
376
+ "name": "avatar-title",
377
+ "type": {
378
+ "text": "string"
379
+ },
380
+ "default": "''",
381
+ "fieldName": "avatarTitle"
382
+ }
383
+ ],
384
+ "superclass": {
385
+ "name": "BaseLocalizedComponent",
386
+ "package": "@italia/globals"
387
+ },
388
+ "tagName": "it-avatar",
389
+ "customElement": true
390
+ }
391
+ ],
392
+ "exports": [
393
+ {
394
+ "kind": "js",
395
+ "name": "ItAvatar",
396
+ "declaration": {
397
+ "name": "ItAvatar",
398
+ "module": "src/it-avatar.ts"
399
+ }
400
+ },
401
+ {
402
+ "kind": "custom-element-definition",
403
+ "name": "it-avatar",
404
+ "declaration": {
405
+ "name": "ItAvatar",
406
+ "module": "src/it-avatar.ts"
407
+ }
408
+ }
409
+ ]
410
+ },
411
+ {
412
+ "kind": "javascript-module",
413
+ "path": "src/types.ts",
414
+ "declarations": [],
415
+ "exports": []
416
+ },
417
+ {
418
+ "kind": "javascript-module",
419
+ "path": "stories/avatar.stories.ts",
420
+ "declarations": [
421
+ {
422
+ "kind": "variable",
423
+ "name": "meta",
424
+ "default": "{ title: 'Componenti/Avatar', component: 'it-avatar', tags: ['autodocs', 'alpha', 'new'], args: { size: 'md', src: 'https://randomuser.me/api/portraits/men/43.jpg', alt: 'Mario Rossi', text: 'Mario Rossi', icon: '', href: '', avatarTitle: '', }, argTypes: { type: { control: 'select', description: \"Tipo di contenuto dell'avatar. Se vuoto, viene determinato automaticamente: src → image, icon → icon, altrimenti text.\", options: AVATAR_TYPES, }, size: { control: 'select', description: \"Dimensione dell'avatar.\", options: AVATAR_SIZES, table: { defaultValue: { summary: 'md' } }, }, variant: { control: 'select', description: \"Colore di sfondo dell'avatar per avatar con testo.\", options: AVATAR_COLORS, }, presence: { control: 'select', description: \"Indicatore di presenza dell'utente.\", options: AVATAR_PRESENCE, }, status: { control: 'select', description: \"Indicatore di stato dell'account utente.\", options: AVATAR_STATUS, }, src: { control: 'text', description: \"URL dell'immagine per avatar di tipo immagine.\", }, alt: { control: 'text', description: \"Testo alternativo per l'immagine dell'avatar.\", }, text: { control: 'text', description: \"Testo per generare le iniziali dell'avatar.\", }, icon: { control: 'text', description: \"Nome dell'icona per avatar di tipo icona.\", }, href: { control: 'text', description: \"URL del link se l'avatar deve essere cliccabile.\", }, avatarTitle: { control: 'text', description: 'Titolo per accessibilità e tooltip.', }, }, parameters: { docs: { description: { component: ` <Description>Rappresentazione grafica di un utente.</Description> L'elemento avatar è la rappresentazione grafica di un utente e può includere un'immagine, un testo, un'icona o essere utilizzato come link. Sono disponibili sei dimensioni: \\`xs\\`, \\`sm\\`, \\`md\\` (default), \\`lg\\`, \\`xl\\`, \\`xxl\\`. Per ottenere un elemento grafico non interattivo, non utilizzare l'attributo \\`href\\`. Ogni avatar può essere associato ad un'azione, utilizzando per esso l'attributo \\`href\\`. Per indicazioni su \"Come e Quando usarlo\" si fa riferimento alla [guida del design-system](https://designers.italia.it/design-system/componenti/avatar/). `, }, }, }, } satisfies Meta<AvatarProps>"
425
+ },
426
+ {
427
+ "kind": "variable",
428
+ "name": "EsempioInterattivo",
429
+ "type": {
430
+ "text": "Story"
431
+ },
432
+ "default": "{ ...meta, name: 'Esempio interattivo', args: { type: 'image', src: 'https://randomuser.me/api/portraits/men/43.jpg', alt: 'Mario Rossi', }, tags: ['!autodocs', '!dev'], parameters: { docs: { canvas: { sourceState: 'shown', }, }, }, render: (params) => renderComponent(params), }"
433
+ },
434
+ {
435
+ "kind": "variable",
436
+ "name": "PersonalizzazioneDegliStili",
437
+ "type": {
438
+ "text": "Story"
439
+ },
440
+ "default": "{ name: 'Personalizzazione degli stili', tags: ['!dev'], parameters: { viewMode: 'docs', docs: { canvas: { hidden: true, sourceState: 'none' }, description: { story: ` Per la personalizzazione degli stili si può usare il selettore \\`::part\\` passando il valore \\`avatar\\`. [Vedi qui la guida dettagliata](/docs/personalizzazione-degli-stili--documentazione#selettore-part). \\nAltri valori disponibili per il selettore part per i vari slot esposti dal componente sono: - \\`presence\\`: target dello slot dell'indicatore di presenza. - \\`status\\`: target dello slot dell'indicatore di stato. - \\`extra-text\\`: target dello slot dell'testo aggiuntivo. `, }, }, }, render: () => html`<div class=\"hide-preview\"></div>`, }"
441
+ },
442
+ {
443
+ "kind": "variable",
444
+ "name": "AvatarConImmagine",
445
+ "type": {
446
+ "text": "Story"
447
+ },
448
+ "default": "{ name: 'Avatar con immagine', args: { type: 'image', }, argTypes: { type: { table: { disable: true } }, text: { table: { disable: true } }, icon: { table: { disable: true } }, variant: { table: { disable: true } }, }, parameters: { docs: { description: { story: ` Il componente avatar ridimensiona automaticamente l'immagine adattandola al formato circolare e centrandola. Si consiglia in ogni caso di utilizzare immagini delle dimensioni corrette. <div class=\"callout callout-success\"><div class=\"callout-inner\"><div class=\"callout-title\"><span class=\"text\">Accessibilità delle immagini</span></div> <p>Per ragioni di accessibilità è importante indicare all'interno dell'avatar il nome dell'utente associato allo stesso.<br> Nel caso di avatar con immagine utilizzare l'attributo \\`alt\\` dell'immagine inserendo in esso il nome dell'utente.</p></div></div> `, }, }, }, render: () => html` <div class=\"d-flex align-items-center justify-content-around flex-wrap flex-sm-nowrap gap-4\"> ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/women/44.jpg', alt: 'Luisa Neri', size: 'xs', })} ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/women/44.jpg', alt: 'Luisa Neri', size: 'sm', })} ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/men/43.jpg', alt: 'Gioacchino Romani', size: 'md', })} ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/women/41.jpg', alt: 'Anna Barbieri', size: 'lg', })} ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/men/33.jpg', alt: 'Carlo Poli', size: 'xl', })} ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/women/90.jpg', alt: 'Giovanna Ferrero', size: 'xxl', })} </div> `, }"
449
+ },
450
+ {
451
+ "kind": "variable",
452
+ "name": "AvatarConTesto",
453
+ "type": {
454
+ "text": "Story"
455
+ },
456
+ "default": "{ name: 'Avatar con testo', args: { type: 'text', }, argTypes: { type: { table: { disable: true } }, src: { table: { disable: true } }, alt: { table: { disable: true } }, icon: { table: { disable: true } }, }, parameters: { docs: { description: { story: ` La versione con testo contiene le iniziali dell'utente (una sola nel caso delle dimensioni xs ed sm). Oltre ai colori di default è possibile utilizzare uno sfondo a scelta fra: - **Primario**: aggiungendo l'attributo \\`variant=\"primary\"\\` - **Secondario**: aggiungendo l'attributo \\`variant=\"secondary\"\\` In questi casi il testo sarà di colore bianco. Un avatar con testo conterrà uno \\`<span>\\` per soli screen reader con il nome dell'utente indicato per esteso: \\`<span class=\"visually-hidden\">Nome Utente</span>\\`. `, }, }, }, render: () => html` <div class=\"d-flex align-items-center justify-content-around flex-wrap flex-sm-nowrap mb-3 gap-4\"> ${renderComponent({ type: 'text', text: 'Mario Rossi', size: 'xs', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', size: 'sm', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', size: 'md', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', size: 'lg', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', size: 'xl', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', size: 'xxl', })} </div> <div class=\"d-flex align-items-center justify-content-around flex-wrap flex-sm-nowrap mb-3 gap-4\"> ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'primary', size: 'xs', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'primary', size: 'sm', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'primary', size: 'md', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'primary', size: 'lg', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'primary', size: 'xl', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'primary', size: 'xxl', })} </div> <div class=\"d-flex align-items-center justify-content-around flex-wrap flex-sm-nowrap gap-4\"> ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'secondary', size: 'xs', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'secondary', size: 'sm', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'secondary', size: 'md', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'secondary', size: 'lg', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'secondary', size: 'xl', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'secondary', size: 'xxl', })} </div> `, }"
457
+ },
458
+ {
459
+ "kind": "variable",
460
+ "name": "AvatarConIcona",
461
+ "type": {
462
+ "text": "Story"
463
+ },
464
+ "default": "{ name: 'Avatar con icona', args: { type: 'icon', }, argTypes: { type: { table: { disable: true } }, src: { table: { disable: true } }, alt: { table: { disable: true } }, text: { table: { disable: true } }, variant: { table: { disable: true } }, }, parameters: { docs: { description: { story: ` Per utilizzare un'icona all'interno di un avatar è sufficiente includere il nome dell'icona prescelta dalla [libreria icone](https://designers.italia.it/design-system/fondamenti/iconografia/) e indicarne il colore con una delle classi disponibili. Per gli avatar con icona inserire un testo alternativo: \\`<span class=\"visually-hidden\">Testo icona</span>\\` `, }, }, }, render: () => html` <div class=\"d-flex align-items-center justify-content-around flex-wrap flex-sm-nowrap gap-4\"> ${renderComponent({ type: 'icon', icon: 'it-user', avatarTitle: 'Cerca', size: 'xs', })} ${renderComponent({ type: 'icon', icon: 'it-user', avatarTitle: 'Cerca', size: 'sm', })} ${renderComponent({ type: 'icon', icon: 'it-user', avatarTitle: 'Cerca', size: 'md', })} ${renderComponent({ type: 'icon', icon: 'it-user', avatarTitle: 'Cerca', size: 'lg', })} ${renderComponent({ type: 'icon', icon: 'it-user', avatarTitle: 'Cerca', size: 'xl', })} ${renderComponent({ type: 'icon', icon: 'it-user', avatarTitle: 'Cerca', size: 'xxl', })} </div> `, }"
465
+ },
466
+ {
467
+ "kind": "variable",
468
+ "name": "AvatarLink",
469
+ "type": {
470
+ "text": "Story"
471
+ },
472
+ "default": "{ argTypes: { href: { table: { disable: true } }, }, parameters: { docs: { description: { story: ` Per associare un avatar ad un'azione o un link, utilizzare l'attributo \\`href\\` con relativo link o chiamata JavaScript. <div class=\"callout callout-warning\"><div class=\"callout-inner\"><div class=\"callout-title\"><span class=\"text\">Tooltip non ancora implementato</span></div> <p>La funzionalità tooltip per gli avatar con link è attualmente in fase di sviluppo. </p></div></div> `, }, }, }, render: () => html` <div> <div class=\"d-flex align-items-center gap-3 flex-wrap\"> ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/women/41.jpg', alt: 'Anna Barbieri', href: '#', avatarTitle: 'Anna Barbieri', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', href: '#', avatarTitle: 'Mario Rossi', })} ${renderComponent({ type: 'text', text: 'Mario Rossi', variant: 'primary', href: '#', avatarTitle: 'Mario Rossi', })} ${renderComponent({ type: 'icon', icon: 'it-user', href: '#', avatarTitle: 'Cerca', })} </div> </div> `, }"
473
+ },
474
+ {
475
+ "kind": "variable",
476
+ "name": "ComportamentoPresenzaUtente",
477
+ "type": {
478
+ "text": "Story"
479
+ },
480
+ "default": "{ name: 'Comportamento - Presenza utente', argTypes: { presence: { table: { disable: true } }, }, parameters: { docs: { description: { story: ` L'avatar supporta indicatori di presenza dell'utente attraverso l'attributo \\`presence\\`: - **Lo stato attivo** si ottiene aggiungendo l'attributo \\`presence=\"active\"\\` - **Lo stato non disponibile** si ottiene aggiungendo l'attributo \\`presence=\"busy\"\\` - **Lo stato invisibile** si ottiene aggiungendo l'attributo \\`presence=\"hidden\"\\` #### Personalizzazione con Slot L'esempio \"Presenza personalizzata con slot\" mostra come lo stesso componente possa essere adattato a stili o contenuti differenti tramite gli slot, per illustrare la flessibilità dell'approccio. <div class=\"callout callout-success\"><div class=\"callout-inner\"><div class=\"callout-title\"><span class=\"text\">Accessibilità</span></div> <p>Ricordarsi sempre di includere testo per screen reader con \\`<span class=\"visually-hidden\">\\` in caso di uso di personalizzazione.</p></div></div> È possibile personalizzare completamente l'indicatore di presenza usando il **\\`slot=\"presence\"\\`**: \\`\\`\\`html <it-avatar text=\"Nome Utente\" presence=\"active\"> <span slot=\"presence\" class=\"custom-presence-indicator\"> <it-icon name=\"it-check\"></it-icon> <span class=\"visually-hidden\">Utente online</span> </span> </it-avatar> \\`\\`\\` \\`\\`\\`css .custom-presence-indicator { position: absolute; bottom: 0; right: 0; /* altri stili personalizzati */ } \\`\\`\\` Le traduzioni dei nomi degli stati sono gestite automaticamente tramite il [sistema @italia/i18n](/docs/componenti-i18n--documentazione). `, }, }, }, render: () => html` <div style=\"display: flex; flex-direction: column; gap: 2rem;\"> <!-- Esempi standard --> <div> <h4>Presenza standard</h4> <div class=\"d-flex align-items-center gap-4 flex-wrap\"> <div class=\"text-center\"> ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/men/43.jpg', alt: 'Mario Rossi', presence: 'active', size: 'lg', })} <div class=\"mt-2\"><small>Attivo</small></div> </div> <div class=\"text-center\"> ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/women/41.jpg', alt: 'Luisa Neri', presence: 'busy', size: 'lg', })} <div class=\"mt-2\"><small>Non disponibile</small></div> </div> <div class=\"text-center\"> ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/men/33.jpg', alt: 'Gioacchino Romani', presence: 'hidden', size: 'lg', })} <div class=\"mt-2\"><small>Invisibile</small></div> </div> </div> </div> <!-- Esempi con slot personalizzati --> <div> <h4>Presenza personalizzata con slot</h4> <p> L'esempio \"Presenza personalizzata con slot\" mostra come lo stesso componente possa essere adattato a stili o contenuti differenti tramite gli slot, per illustrare la flessibilità dell'approccio. </p> <div class=\"d-flex align-items-center gap-4 flex-wrap\"> <div class=\"text-center\"> <it-avatar type=\"text\" text=\"Marco Bianchi\" variant=\"primary\" presence=\"active\" size=\"lg\"> <span slot=\"presence\" class=\"custom-presence custom-presence-success\"> <it-icon name=\"it-check\" size=\"xs\" color=\"white\"></it-icon> <span class=\"visually-hidden\">Utente online e disponibile</span> </span> </it-avatar> <div class=\"mt-2\"><small>Con icona check</small></div> </div> <div class=\"text-center\"> <it-avatar type=\"text\" text=\"Sara Verdi\" variant=\"secondary\" presence=\"busy\" size=\"lg\"> <span slot=\"presence\" class=\"custom-presence custom-presence-danger\"> ! <span class=\"visually-hidden\">Utente occupato, non disturbare</span> </span> </it-avatar> <div class=\"mt-2\"><small>Con testo custom</small></div> </div> </div> </div> </div> <style> /* Esempi di classi CSS per personalizzare gli slot presence */ .custom-presence { display: flex; align-items: center; justify-content: center; position: absolute; bottom: 0; right: 0; width: 20px; height: 20px; border: 2px solid white; border-radius: 50%; z-index: 10; } .custom-presence-success { background: #28a745; } .custom-presence-danger { background: #dc3545; font-size: 10px; font-weight: bold; color: white; } </style> `, }"
481
+ },
482
+ {
483
+ "kind": "variable",
484
+ "name": "ComportamentoStatusUtente",
485
+ "type": {
486
+ "text": "Story"
487
+ },
488
+ "default": "{ name: 'Comportamento - Status utente', argTypes: { status: { table: { disable: true } }, }, parameters: { docs: { description: { story: ` L'avatar supporta indicatori di stato dell'account attraverso l'attributo \\`status\\`: - **Lo stato approvato** si ottiene aggiungendo l'attributo \\`status=\"approved\"\\` - **Lo stato respinto** si ottiene aggiungendo l'attributo \\`status=\"declined\"\\` - **Lo stato notifica** si ottiene aggiungendo l'attributo \\`status=\"notify\"\\` #### Personalizzazione con Slot L'esempio \"Status personalizzato con slot\" mostra come lo stesso componente possa essere adattato a stili o contenuti differenti tramite gli slot, per illustrare la flessibilità dell'approccio. <div class=\"callout callout-success\"><div class=\"callout-inner\"><div class=\"callout-title\"><span class=\"text\">Accessibilità</span></div> <p>Ricordarsi sempre di includere testo per screen reader con \\`<span class=\"visually-hidden\">\\` in caso di uso di personalizzazione.</p></div></div> È possibile personalizzare completamente l'indicatore di stato usando il **\\`slot=\"status\"\\`**: \\`\\`\\`html <it-avatar text=\"Nome Utente\" status=\"approved\"> <span slot=\"status\" class=\"custom-status-indicator\"> <it-icon name=\"it-check-circle\"></it-icon> <span class=\"visually-hidden\">Account verificato</span> </span> </it-avatar> \\`\\`\\` \\`\\`\\`css .custom-status-indicator { position: absolute; top: -5px; right: -5px; /* altri stili personalizzati */ } \\`\\`\\` Le traduzioni sono gestite automaticamente tramite il [sistema @italia/i18n](/docs/componenti-i18n--documentazione). `, }, }, }, render: () => html` <div style=\"display: flex; flex-direction: column; gap: 2rem;\"> <!-- Esempi standard --> <div> <h4>Status standard</h4> <div class=\"d-flex align-items-center gap-4 flex-wrap\"> <div class=\"text-center\"> ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/men/43.jpg', alt: 'Mario Rossi', status: 'approved', size: 'lg', })} <div class=\"mt-2\"><small>Approvato</small></div> </div> <div class=\"text-center\"> ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/women/41.jpg', alt: 'Luisa Neri', status: 'declined', size: 'lg', })} <div class=\"mt-2\"><small>Respinto</small></div> </div> <div class=\"text-center\"> ${renderComponent({ type: 'image', src: 'https://randomuser.me/api/portraits/men/33.jpg', alt: 'Gioacchino Romani', status: 'notify', size: 'lg', })} <div class=\"mt-2\"><small>Notifica</small></div> </div> </div> </div> <!-- Esempi con slot personalizzati --> <div> <h4>Status personalizzato con slot</h4> <p> L'esempio \"Status personalizzato con slot\" mostra come lo stesso componente possa essere adattato a stili o contenuti differenti tramite gli slot, per illustrare la flessibilità dell'approccio. </p> <div class=\"d-flex align-items-center gap-4 flex-wrap\"> <div class=\"text-center\"> <it-avatar type=\"text\" text=\"Luigi Neri\" variant=\"primary\" status=\"approved\" size=\"lg\"> <span slot=\"status\" class=\"custom-status custom-status-success\"> <it-icon name=\"it-check-circle\" size=\"xs\" color=\"white\"></it-icon> <span class=\"visually-hidden\">Account verificato e approvato</span> </span> </it-avatar> <div class=\"mt-2\"><small>Verificato</small></div> </div> <div class=\"text-center\"> <it-avatar type=\"text\" text=\"Carla Blu\" variant=\"secondary\" status=\"declined\" size=\"lg\"> <span slot=\"status\" class=\"custom-status custom-status-danger\"> <it-icon name=\"it-close\" size=\"xs\" color=\"white\"></it-icon> <span class=\"visually-hidden\">Account sospeso o respinto</span> </span> </it-avatar> <div class=\"mt-2\"><small>Sospeso</small></div> </div> </div> </div> </div> <style> /* Esempi di classi CSS per personalizzare gli slot status */ .custom-status { display: flex; align-items: center; justify-content: center; position: absolute; top: -5px; right: -5px; width: 24px; height: 24px; border: 2px solid white; border-radius: 50%; z-index: 10; } .custom-status-success { background: #28a745; } .custom-status-danger { background: #dc3545; } </style> `, }"
489
+ },
490
+ {
491
+ "kind": "variable",
492
+ "name": "GruppiAvatarListe",
493
+ "type": {
494
+ "text": "Story"
495
+ },
496
+ "default": "{ name: 'Gruppi di avatar - Liste verticali', parameters: { docs: { description: { story: ` Utilizzando una lista di link con l’aggiunta della classe .avatar-group si ottiene una lista verticale con avatar affiancati da link e testi. È possibile utilizzare avatar di dimensione \\`sm\\` o \\`md\\` all'interno della lista. `, }, }, }, render: () => html` <div style=\"display: flex; gap: 3rem; flex-wrap: wrap;\"> <div style=\"flex: 1; min-width: 300px;\"> <h4>Lista Verticale - Dimensione SM</h4> <div class=\"link-list-wrapper\"> <ul class=\"link-list avatar-group\"> <li> <a class=\"list-item\" href=\"#\"> ${renderComponent({ size: 'sm', src: 'https://randomuser.me/api/portraits/men/43.jpg' })} <span>Mario Rossi</span> </a> </li> <li> <a class=\"list-item\" href=\"#\"> ${renderComponent({ size: 'sm', src: 'https://randomuser.me/api/portraits/women/44.jpg' })} <span>Anna Verdi</span> </a> </li> <li> <div class=\"list-item\"> ${renderComponent({ size: 'sm', text: 'Sara Ghione', variant: 'primary' })} <span>Sara Ghione</span> </div> </li> <li> <div class=\"list-item\"> ${renderComponent({ size: 'sm', icon: 'it-user', avatarTitle: 'Utente generico' })} <span>Antonio Esposito</span> </div> </li> </ul> </div> </div> <div style=\"flex: 1; min-width: 300px;\"> <h4>Lista Verticale - Dimensione MD</h4> <div class=\"link-list-wrapper\"> <ul class=\"link-list avatar-group\"> <li> <a class=\"list-item\" href=\"#\"> ${renderComponent({ src: 'https://randomuser.me/api/portraits/men/32.jpg' })} <span>Luca Bianchi</span> </a> </li> <li> <a class=\"list-item\" href=\"#\"> ${renderComponent({ src: 'https://randomuser.me/api/portraits/women/28.jpg' })} <span>Elena Rossi</span> </a> </li> <li> <div class=\"list-item\"> ${renderComponent({ text: 'Marco Neri', variant: 'secondary' })} <span>Marco Neri</span> </div> </li> <li> <div class=\"list-item\"> ${renderComponent({ icon: 'it-user', avatarTitle: 'Cerca' })} <span>Cerca utenti</span> </div> </li> </ul> </div> </div> </div> `, }"
497
+ },
498
+ {
499
+ "kind": "variable",
500
+ "name": "AvatarSovrapposti",
501
+ "type": {
502
+ "text": "Story"
503
+ },
504
+ "default": "{ name: 'Gruppi di avatar - Avatar Sovrapposti', parameters: { docs: { description: { story: ` Racchiudendo una serie di avatar in una lista di tipo <ul> con classe .avatar-group-stacked questi verranno visualizzati come una lista orizzontale in cui i singoli elementi sono parzialmente sovrapposti. In questo tipo di gruppo è possibile inserire dei Dropdown per racchiudere ulteriori elementi avatar. È possibile utilizzare avatar di dimensione \\`sm\\` o \\`md\\` all'interno della lista. Per mostrare ulteriori avatar in un menu a discesa, utilizzare \\`it-avatar\\` con \\`type=\"dropdown\"\\`. L'avatar dropdown eredita automaticamente la dimensione dal gruppo e può contenere una lista di avatar con nomi nel menu. <div class=\"callout callout-success\"><div class=\"callout-inner\"><div class=\"callout-title\"><span class=\"text\">Accessibilità del dropdown</span></div> <p>È fondamentale utilizzare l'attributo \\`it-aria-label\\` sul componente \\`it-dropdown\\` per fornire una descrizione significativa agli screen reader. Senza questo attributo, uno screen reader leggerebbe solo il testo del label (es. \"+4\") senza contesto, mentre con \\`it-aria-label=\"Altri utenti\"\\` fornisce una descrizione chiara e comprensibile.</p></div></div> `, }, }, }, render: () => html` <div style=\"display: flex; flex-direction: column; gap: 3rem; height: 300px;\"> <div> <ul class=\"avatar-group-stacked\"> <li> <it-avatar src=\"https://randomuser.me/api/portraits/women/44.jpg\" alt=\"Foto profilo\" href=\"#\"></it-avatar> </li> <li> <it-avatar src=\"https://randomuser.me/api/portraits/men/43.jpg\" alt=\"Foto profilo\" href=\"#\"></it-avatar> </li> <li> ${renderComponent({ type: 'text', text: 'Giulia Neri', variant: 'primary', href: '#', avatarTitle: 'Giulia Neri', slot: 'trigger', })} </li> <li><it-avatar text=\"Sandro Penna\" variant=\"secondary\" href=\"#\"></it-avatar></li> <li> <it-avatar type=\"dropdown\"> <it-dropdown label=\"4+\" slot=\"avatar-dropdown-content\" it-aria-label=\"Altri utenti\" variant=\"secondary\"> <it-dropdown-item href=\"#\"> <it-avatar src=\"https://randomuser.me/api/portraits/men/22.jpg\" alt=\"Foto profilo\"></it-avatar> <span>Roberto Milano</span> </it-dropdown-item> <it-dropdown-item href=\"#\"> <it-avatar text=\"Giuseppe Verde\" variant=\"primary\"></it-avatar> <span>Giuseppe Verde</span> </it-dropdown-item> <it-dropdown-item href=\"#\"> <it-avatar text=\"Laura Blu\" variant=\"secondary\"></it-avatar> <span>Laura Blu</span> </it-dropdown-item> <it-dropdown-item href=\"#\"> <it-avatar icon=\"it-user\" avatar-title=\"Altri utenti\"></it-avatar> <span>Altri utenti...</span> </it-dropdown-item> </it-dropdown> </it-avatar> </li> </ul> </div> <p style=\"margin-top: 0.75rem; font-size: 16px; variant: #666;\"> Clicca su \"+4\" per visualizzare gli utenti rimanenti </p> </div> `, }"
505
+ },
506
+ {
507
+ "kind": "variable",
508
+ "name": "AvatarSovrappostiSM",
509
+ "type": {
510
+ "text": "Story"
511
+ },
512
+ "default": "{ name: 'Gruppi di avatar - Avatar Sovrapposti Piccoli', render: () => html` <div style=\"display: flex; flex-direction: column; gap: 3rem;\"> <div> <ul class=\"avatar-group-stacked\"> <li> <it-avatar src=\"https://randomuser.me/api/portraits/women/44.jpg\" alt=\"Foto profilo\" size=\"sm\"></it-avatar> </li> <li> <it-avatar src=\"https://randomuser.me/api/portraits/men/43.jpg\" alt=\"Foto profilo\" size=\"sm\"></it-avatar> </li> <li> <it-avatar src=\"https://randomuser.me/api/portraits/women/41.jpg\" alt=\"Foto profilo\" size=\"sm\"></it-avatar> </li> <li><it-avatar text=\"Tommaso Sordi\" variant=\"primary\" size=\"sm\"></it-avatar></li> <li><it-avatar text=\"Barbara Tosi\" size=\"sm\"></it-avatar></li> <li><it-avatar text=\"Barbara Tosi\" variant=\"secondary\" size=\"sm\"></it-avatar></li> </ul> </div> </div> `, }"
513
+ },
514
+ {
515
+ "kind": "variable",
516
+ "name": "AvatarSovrappostiMD",
517
+ "type": {
518
+ "text": "Story"
519
+ },
520
+ "default": "{ name: 'Gruppi di avatar - Avatar Sovrapposti Medi', render: () => html` <div style=\"display: flex; flex-direction: column; gap: 3rem;\"> <div> <div> <ul class=\"avatar-group-stacked\"> <li> <it-avatar src=\"https://randomuser.me/api/portraits/women/44.jpg\" alt=\"Foto profilo\" href=\"#\"></it-avatar> </li> <li> <it-avatar src=\"https://randomuser.me/api/portraits/men/43.jpg\" alt=\"Foto profilo\" href=\"#\"></it-avatar> </li> <li> ${renderComponent({ type: 'text', text: 'Giulia Neri', variant: 'primary', href: '#', avatarTitle: 'Giulia Neri', slot: 'trigger', })} </li> <li><it-avatar text=\"Sandro Penna\" variant=\"secondary\" href=\"#\"></it-avatar></li> <li><it-avatar text=\"Sandro Penna\" href=\"#\"></it-avatar></li> </ul> </div> </div> </div> `, }"
521
+ },
522
+ {
523
+ "kind": "variable",
524
+ "name": "AvatarConTestoAggiuntivo",
525
+ "type": {
526
+ "text": "Story"
527
+ },
528
+ "default": "{ name: 'Avatar con testo aggiuntivo', parameters: { docs: { description: { story: ` Per ottenere una versione del componente con nome esteso ed eventuale testo accessorio, utilizza lo slot \\`extra-text\\`. Per il nome è possibile utilizzare i tag \\`<h3>\\` o \\`<h4>\\` tramite lo slot. Il testo esteso può essere contenuto in un \\`<p>\\` o in un tag \\`<time>\\` nel caso di date/orari. `, }, }, }, render: () => html` <div class=\"d-flex gap-4\"> <it-avatar type=\"image\" src=\"https://randomuser.me/api/portraits/men/43.jpg\" size=\"xl\" text=\"Mario Rossi\"> <div slot=\"extra-text\"> <h4>Mario Rossi</h4> <time>15 SET 2025</time> </div> </it-avatar> <it-avatar type=\"image\" src=\"https://randomuser.me/api/portraits/women/44.jpg\" size=\"xl\" text=\"Giulia Neri\"> <div slot=\"extra-text\"> <h4>Giulia Neri</h4> <p>LOREM IPSUM DOLOR</p> </div> </it-avatar> <it-avatar type=\"text\" text=\"Michele Dotti\" variant=\"primary\" size=\"xl\"> <div slot=\"extra-text\"> <h4>Michele Dotti</h4> <time>12 MAG 2025</time> </div> </it-avatar> </div> `, }"
529
+ },
530
+ {
531
+ "kind": "variable",
532
+ "name": "GruppiAvatarConTesto",
533
+ "type": {
534
+ "text": "Story"
535
+ },
536
+ "default": "{ name: 'Gruppi di avatar - Liste verticali con testo aggiuntivo', parameters: { docs: { description: { story: ` È possibile combinare le liste verticali con avatar che includono testo aggiuntivo tramite lo slot \\`extra-text\\`. Questo è particolarmente utile per creare liste di utenti con informazioni aggiuntive come ruoli, date o descrizioni. `, }, }, }, render: () => html` <div style=\"max-width: 400px;\"> <h4>Lista Team con Ruoli</h4> <div class=\"link-list-wrapper\"> <ul class=\"link-list avatar-group\"> <li> <div class=\"list-item\"> <it-avatar src=\"https://randomuser.me/api/portraits/men/43.jpg\" alt=\"Foto profilo\"> <div slot=\"extra-text\"> <h4>Mario Rossi</h4> <p>TEAM LEADER</p> </div> </it-avatar> </div> </li> <li> <div class=\"list-item\"> <it-avatar src=\"https://randomuser.me/api/portraits/women/44.jpg\" alt=\"Foto profilo\"> <div slot=\"extra-text\"> <h4>Giulia Neri</h4> <p>FRONTEND DEVELOPER</p> </div> </it-avatar> </div> </li> <li> <div class=\"list-item\"> <it-avatar text=\"Andrea Bianchi\" variant=\"primary\"> <div slot=\"extra-text\"> <h4>Andrea Bianchi</h4> <p>BACKEND DEVELOPER</p> </div> </it-avatar> </div> </li> <li> <div class=\"list-item\"> <it-avatar text=\"Sara Verde\" variant=\"secondary\"> <div slot=\"extra-text\"> <h4>Sara Verde</h4> <time>ULTIMO ACCESSO: 12 SET 2025</time> </div> </it-avatar> </div> </li> </ul> </div> </div> `, }"
537
+ }
538
+ ],
539
+ "exports": [
540
+ {
541
+ "kind": "js",
542
+ "name": "default",
543
+ "declaration": {
544
+ "name": "meta",
545
+ "module": "stories/avatar.stories.ts"
546
+ }
547
+ },
548
+ {
549
+ "kind": "js",
550
+ "name": "EsempioInterattivo",
551
+ "declaration": {
552
+ "name": "EsempioInterattivo",
553
+ "module": "stories/avatar.stories.ts"
554
+ }
555
+ },
556
+ {
557
+ "kind": "js",
558
+ "name": "PersonalizzazioneDegliStili",
559
+ "declaration": {
560
+ "name": "PersonalizzazioneDegliStili",
561
+ "module": "stories/avatar.stories.ts"
562
+ }
563
+ },
564
+ {
565
+ "kind": "js",
566
+ "name": "AvatarConImmagine",
567
+ "declaration": {
568
+ "name": "AvatarConImmagine",
569
+ "module": "stories/avatar.stories.ts"
570
+ }
571
+ },
572
+ {
573
+ "kind": "js",
574
+ "name": "AvatarConTesto",
575
+ "declaration": {
576
+ "name": "AvatarConTesto",
577
+ "module": "stories/avatar.stories.ts"
578
+ }
579
+ },
580
+ {
581
+ "kind": "js",
582
+ "name": "AvatarConIcona",
583
+ "declaration": {
584
+ "name": "AvatarConIcona",
585
+ "module": "stories/avatar.stories.ts"
586
+ }
587
+ },
588
+ {
589
+ "kind": "js",
590
+ "name": "AvatarLink",
591
+ "declaration": {
592
+ "name": "AvatarLink",
593
+ "module": "stories/avatar.stories.ts"
594
+ }
595
+ },
596
+ {
597
+ "kind": "js",
598
+ "name": "ComportamentoPresenzaUtente",
599
+ "declaration": {
600
+ "name": "ComportamentoPresenzaUtente",
601
+ "module": "stories/avatar.stories.ts"
602
+ }
603
+ },
604
+ {
605
+ "kind": "js",
606
+ "name": "ComportamentoStatusUtente",
607
+ "declaration": {
608
+ "name": "ComportamentoStatusUtente",
609
+ "module": "stories/avatar.stories.ts"
610
+ }
611
+ },
612
+ {
613
+ "kind": "js",
614
+ "name": "GruppiAvatarListe",
615
+ "declaration": {
616
+ "name": "GruppiAvatarListe",
617
+ "module": "stories/avatar.stories.ts"
618
+ }
619
+ },
620
+ {
621
+ "kind": "js",
622
+ "name": "AvatarSovrapposti",
623
+ "declaration": {
624
+ "name": "AvatarSovrapposti",
625
+ "module": "stories/avatar.stories.ts"
626
+ }
627
+ },
628
+ {
629
+ "kind": "js",
630
+ "name": "AvatarSovrappostiSM",
631
+ "declaration": {
632
+ "name": "AvatarSovrappostiSM",
633
+ "module": "stories/avatar.stories.ts"
634
+ }
635
+ },
636
+ {
637
+ "kind": "js",
638
+ "name": "AvatarSovrappostiMD",
639
+ "declaration": {
640
+ "name": "AvatarSovrappostiMD",
641
+ "module": "stories/avatar.stories.ts"
642
+ }
643
+ },
644
+ {
645
+ "kind": "js",
646
+ "name": "AvatarConTestoAggiuntivo",
647
+ "declaration": {
648
+ "name": "AvatarConTestoAggiuntivo",
649
+ "module": "stories/avatar.stories.ts"
650
+ }
651
+ },
652
+ {
653
+ "kind": "js",
654
+ "name": "GruppiAvatarConTesto",
655
+ "declaration": {
656
+ "name": "GruppiAvatarConTesto",
657
+ "module": "stories/avatar.stories.ts"
658
+ }
659
+ }
660
+ ]
661
+ },
662
+ {
663
+ "kind": "javascript-module",
664
+ "path": "src/locales/en.ts",
665
+ "declarations": [
666
+ {
667
+ "kind": "variable",
668
+ "name": "translation",
669
+ "type": {
670
+ "text": "DefaultTranslation"
671
+ },
672
+ "default": "{ $code: 'en', $name: 'English', $dir: 'ltr', // Presence translations avatar_presence_active: 'active', avatar_presence_busy: 'busy', avatar_presence_hidden: 'hidden', avatar_presence_label: 'Presence', // Status translations avatar_status_approved: 'approved', avatar_status_declined: 'declined', avatar_status_notify: 'notify', avatar_status_label: 'Status', }"
673
+ }
674
+ ],
675
+ "exports": [
676
+ {
677
+ "kind": "js",
678
+ "name": "default",
679
+ "declaration": {
680
+ "name": "translation",
681
+ "module": "src/locales/en.ts"
682
+ }
683
+ }
684
+ ]
685
+ },
686
+ {
687
+ "kind": "javascript-module",
688
+ "path": "src/locales/it.ts",
689
+ "declarations": [
690
+ {
691
+ "kind": "variable",
692
+ "name": "translation",
693
+ "type": {
694
+ "text": "DefaultTranslation"
695
+ },
696
+ "default": "{ $code: 'it', $name: 'Italiano', $dir: 'ltr', // Presence translations avatar_presence_active: 'attivo', avatar_presence_busy: 'non disponibile', avatar_presence_hidden: 'invisibile', avatar_presence_label: 'Presenza', // Status translations avatar_status_approved: 'approvato', avatar_status_declined: 'respinto', avatar_status_notify: 'notifica', avatar_status_label: 'Stato', }"
697
+ }
698
+ ],
699
+ "exports": [
700
+ {
701
+ "kind": "js",
702
+ "name": "default",
703
+ "declaration": {
704
+ "name": "translation",
705
+ "module": "src/locales/it.ts"
706
+ }
707
+ }
708
+ ]
709
+ }
710
+ ]
711
+ }