@fuse_ui/avatar 0.0.1

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,49 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, signal, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
+
4
+ class FuseAvatarComponent {
5
+ // ─── Public @Input() API ────────────────────────────────────────────────────
6
+ src = input('', ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
7
+ alt = input('', ...(ngDevMode ? [{ debugName: "alt" }] : /* istanbul ignore next */ []));
8
+ name = input('', ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
9
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
10
+ shape = input('circle', ...(ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []));
11
+ status = input(null, ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
12
+ // ─── Internal signal state ──────────────────────────────────────────────────
13
+ hasError = signal(false, ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
14
+ // ─── Host classes ────────────────────────────────────────────────────────────
15
+ hostClasses = computed(() => [
16
+ 'fuse-avatar',
17
+ `fuse-avatar--${this.size()}`,
18
+ `fuse-avatar--${this.shape()}`,
19
+ ].join(' '), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
20
+ // ─── Derived values ─────────────────────────────────────────────────────────
21
+ initials = computed(() => {
22
+ const name = this.name();
23
+ if (!name)
24
+ return '';
25
+ return name
26
+ .trim()
27
+ .split(/\s+/)
28
+ .slice(0, 2)
29
+ .map(word => word[0]?.toUpperCase() ?? '')
30
+ .join('');
31
+ }, ...(ngDevMode ? [{ debugName: "initials" }] : /* istanbul ignore next */ []));
32
+ // ─── Event handlers ─────────────────────────────────────────────────────────
33
+ onImageError() {
34
+ this.hasError.set(true);
35
+ }
36
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuseAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuseAvatarComponent, isStandalone: true, selector: "fuse-avatar", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: "<!-- Image \u2014 shown only when src is set and no load error -->\n@if (src() && !hasError()) {\n <img\n class=\"fuse-avatar__img\"\n [src]=\"src()\"\n [alt]=\"alt()\"\n (error)=\"onImageError()\"\n />\n}\n\n<!-- Initials fallback \u2014 shown when no src, or on image error -->\n@if (!src() || hasError()) {\n <span class=\"fuse-avatar__initials\" aria-hidden=\"true\">\n {{ initials() }}\n </span>\n}\n\n<!-- Status indicator dot -->\n@if (status()) {\n <span\n class=\"fuse-avatar__status\"\n [class]=\"'fuse-avatar__status--' + status()\"\n [attr.aria-label]=\"status()\"\n ></span>\n}\n", styles: [":host{--fuse-avatar-size-xs: 24px;--fuse-avatar-size-sm: 32px;--fuse-avatar-size-md: 40px;--fuse-avatar-size-lg: 56px;--fuse-avatar-size-xl: 72px;--fuse-avatar-font-size-xs: .6rem;--fuse-avatar-font-size-sm: .75rem;--fuse-avatar-font-size-md: .9rem;--fuse-avatar-font-size-lg: 1.2rem;--fuse-avatar-font-size-xl: 1.6rem;--fuse-avatar-bg: var(--fuse-color-primary-subtle, #eef2ff);--fuse-avatar-text-color: var(--fuse-color-primary, #6366f1);--fuse-avatar-border-color: var(--fuse-color-border, #e2e8f0);--fuse-avatar-border-width: 2px;--fuse-avatar-radius-circle: 50%;--fuse-avatar-radius-square: var(--fuse-radius-md, 8px);--fuse-avatar-status-size: 10px;--fuse-avatar-status-border: 2px solid var(--fuse-color-surface, #ffffff);--fuse-avatar-status-online: var(--fuse-color-success, #22c55e);--fuse-avatar-status-offline: var(--fuse-color-border, #cbd5e1);--fuse-avatar-status-busy: var(--fuse-color-danger, #ef4444);--fuse-avatar-status-away: var(--fuse-color-warning, #f59e0b);display:inline-flex;position:relative;flex-shrink:0}.fuse-avatar{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;background-color:var(--fuse-avatar-bg);border:var(--fuse-avatar-border-width) solid transparent;font-weight:600;color:var(--fuse-avatar-text-color)}.fuse-avatar--xs{width:var(--fuse-avatar-size-xs);height:var(--fuse-avatar-size-xs);font-size:var(--fuse-avatar-font-size-xs);--fuse-avatar-status-size: 6px}.fuse-avatar--sm{width:var(--fuse-avatar-size-sm);height:var(--fuse-avatar-size-sm);font-size:var(--fuse-avatar-font-size-sm);--fuse-avatar-status-size: 8px}.fuse-avatar--md{width:var(--fuse-avatar-size-md);height:var(--fuse-avatar-size-md);font-size:var(--fuse-avatar-font-size-md)}.fuse-avatar--lg{width:var(--fuse-avatar-size-lg);height:var(--fuse-avatar-size-lg);font-size:var(--fuse-avatar-font-size-lg);--fuse-avatar-status-size: 13px}.fuse-avatar--xl{width:var(--fuse-avatar-size-xl);height:var(--fuse-avatar-size-xl);font-size:var(--fuse-avatar-font-size-xl);--fuse-avatar-status-size: 16px}.fuse-avatar--circle{border-radius:var(--fuse-avatar-radius-circle)}.fuse-avatar--square{border-radius:var(--fuse-avatar-radius-square)}.fuse-avatar__img{width:100%;height:100%;object-fit:cover;display:block}.fuse-avatar__initials{line-height:1;text-transform:uppercase;letter-spacing:.02em;-webkit-user-select:none;user-select:none}.fuse-avatar__status{position:absolute;bottom:0;right:0;width:var(--fuse-avatar-status-size);height:var(--fuse-avatar-status-size);border-radius:50%;border:var(--fuse-avatar-status-border)}.fuse-avatar__status--online{background-color:var(--fuse-avatar-status-online)}.fuse-avatar__status--offline{background-color:var(--fuse-avatar-status-offline)}.fuse-avatar__status--busy{background-color:var(--fuse-avatar-status-busy)}.fuse-avatar__status--away{background-color:var(--fuse-avatar-status-away)}:host-context(.ios){--fuse-avatar-radius-square: var(--fuse-radius-lg, 12px)}:host-context(.md){--fuse-avatar-radius-square: var(--fuse-radius-sm, 4px)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuseAvatarComponent, decorators: [{
40
+ type: Component,
41
+ args: [{ selector: 'fuse-avatar', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class]': 'hostClasses()' }, template: "<!-- Image \u2014 shown only when src is set and no load error -->\n@if (src() && !hasError()) {\n <img\n class=\"fuse-avatar__img\"\n [src]=\"src()\"\n [alt]=\"alt()\"\n (error)=\"onImageError()\"\n />\n}\n\n<!-- Initials fallback \u2014 shown when no src, or on image error -->\n@if (!src() || hasError()) {\n <span class=\"fuse-avatar__initials\" aria-hidden=\"true\">\n {{ initials() }}\n </span>\n}\n\n<!-- Status indicator dot -->\n@if (status()) {\n <span\n class=\"fuse-avatar__status\"\n [class]=\"'fuse-avatar__status--' + status()\"\n [attr.aria-label]=\"status()\"\n ></span>\n}\n", styles: [":host{--fuse-avatar-size-xs: 24px;--fuse-avatar-size-sm: 32px;--fuse-avatar-size-md: 40px;--fuse-avatar-size-lg: 56px;--fuse-avatar-size-xl: 72px;--fuse-avatar-font-size-xs: .6rem;--fuse-avatar-font-size-sm: .75rem;--fuse-avatar-font-size-md: .9rem;--fuse-avatar-font-size-lg: 1.2rem;--fuse-avatar-font-size-xl: 1.6rem;--fuse-avatar-bg: var(--fuse-color-primary-subtle, #eef2ff);--fuse-avatar-text-color: var(--fuse-color-primary, #6366f1);--fuse-avatar-border-color: var(--fuse-color-border, #e2e8f0);--fuse-avatar-border-width: 2px;--fuse-avatar-radius-circle: 50%;--fuse-avatar-radius-square: var(--fuse-radius-md, 8px);--fuse-avatar-status-size: 10px;--fuse-avatar-status-border: 2px solid var(--fuse-color-surface, #ffffff);--fuse-avatar-status-online: var(--fuse-color-success, #22c55e);--fuse-avatar-status-offline: var(--fuse-color-border, #cbd5e1);--fuse-avatar-status-busy: var(--fuse-color-danger, #ef4444);--fuse-avatar-status-away: var(--fuse-color-warning, #f59e0b);display:inline-flex;position:relative;flex-shrink:0}.fuse-avatar{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;background-color:var(--fuse-avatar-bg);border:var(--fuse-avatar-border-width) solid transparent;font-weight:600;color:var(--fuse-avatar-text-color)}.fuse-avatar--xs{width:var(--fuse-avatar-size-xs);height:var(--fuse-avatar-size-xs);font-size:var(--fuse-avatar-font-size-xs);--fuse-avatar-status-size: 6px}.fuse-avatar--sm{width:var(--fuse-avatar-size-sm);height:var(--fuse-avatar-size-sm);font-size:var(--fuse-avatar-font-size-sm);--fuse-avatar-status-size: 8px}.fuse-avatar--md{width:var(--fuse-avatar-size-md);height:var(--fuse-avatar-size-md);font-size:var(--fuse-avatar-font-size-md)}.fuse-avatar--lg{width:var(--fuse-avatar-size-lg);height:var(--fuse-avatar-size-lg);font-size:var(--fuse-avatar-font-size-lg);--fuse-avatar-status-size: 13px}.fuse-avatar--xl{width:var(--fuse-avatar-size-xl);height:var(--fuse-avatar-size-xl);font-size:var(--fuse-avatar-font-size-xl);--fuse-avatar-status-size: 16px}.fuse-avatar--circle{border-radius:var(--fuse-avatar-radius-circle)}.fuse-avatar--square{border-radius:var(--fuse-avatar-radius-square)}.fuse-avatar__img{width:100%;height:100%;object-fit:cover;display:block}.fuse-avatar__initials{line-height:1;text-transform:uppercase;letter-spacing:.02em;-webkit-user-select:none;user-select:none}.fuse-avatar__status{position:absolute;bottom:0;right:0;width:var(--fuse-avatar-status-size);height:var(--fuse-avatar-status-size);border-radius:50%;border:var(--fuse-avatar-status-border)}.fuse-avatar__status--online{background-color:var(--fuse-avatar-status-online)}.fuse-avatar__status--offline{background-color:var(--fuse-avatar-status-offline)}.fuse-avatar__status--busy{background-color:var(--fuse-avatar-status-busy)}.fuse-avatar__status--away{background-color:var(--fuse-avatar-status-away)}:host-context(.ios){--fuse-avatar-radius-square: var(--fuse-radius-lg, 12px)}:host-context(.md){--fuse-avatar-radius-square: var(--fuse-radius-sm, 4px)}\n"] }]
42
+ }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], alt: [{ type: i0.Input, args: [{ isSignal: true, alias: "alt", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }] } });
43
+
44
+ /**
45
+ * Generated bundle index. Do not edit.
46
+ */
47
+
48
+ export { FuseAvatarComponent };
49
+ //# sourceMappingURL=fuse_ui-avatar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuse_ui-avatar.mjs","sources":["../../../../packages/avatar/src/lib/avatar/fuse-avatar.component.ts","../../../../packages/avatar/src/lib/avatar/fuse-avatar.component.html","../../../../packages/avatar/src/fuse_ui-avatar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n} from '@angular/core';\n\n@Component({\n selector: 'fuse-avatar',\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './fuse-avatar.component.html',\n styleUrl: './fuse-avatar.component.scss',\n host: { '[class]': 'hostClasses()' },\n})\nexport class FuseAvatarComponent {\n // ─── Public @Input() API ────────────────────────────────────────────────────\n\n readonly src = input('');\n readonly alt = input('');\n readonly name = input('');\n readonly size = input<'xs' | 'sm' | 'md' | 'lg' | 'xl'>('md');\n readonly shape = input<'circle' | 'square'>('circle');\n readonly status = input<'online' | 'offline' | 'busy' | 'away' | null>(null);\n\n // ─── Internal signal state ──────────────────────────────────────────────────\n\n protected readonly hasError = signal(false);\n\n // ─── Host classes ────────────────────────────────────────────────────────────\n\n protected readonly hostClasses = computed(() =>\n [\n 'fuse-avatar',\n `fuse-avatar--${this.size()}`,\n `fuse-avatar--${this.shape()}`,\n ].join(' ')\n );\n\n // ─── Derived values ─────────────────────────────────────────────────────────\n\n protected readonly initials = computed(() => {\n const name = this.name();\n if (!name) return '';\n return name\n .trim()\n .split(/\\s+/)\n .slice(0, 2)\n .map(word => word[0]?.toUpperCase() ?? '')\n .join('');\n });\n\n // ─── Event handlers ─────────────────────────────────────────────────────────\n\n protected onImageError(): void {\n this.hasError.set(true);\n }\n}\n","<!-- Image — shown only when src is set and no load error -->\n@if (src() && !hasError()) {\n <img\n class=\"fuse-avatar__img\"\n [src]=\"src()\"\n [alt]=\"alt()\"\n (error)=\"onImageError()\"\n />\n}\n\n<!-- Initials fallback — shown when no src, or on image error -->\n@if (!src() || hasError()) {\n <span class=\"fuse-avatar__initials\" aria-hidden=\"true\">\n {{ initials() }}\n </span>\n}\n\n<!-- Status indicator dot -->\n@if (status()) {\n <span\n class=\"fuse-avatar__status\"\n [class]=\"'fuse-avatar__status--' + status()\"\n [attr.aria-label]=\"status()\"\n ></span>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MAiBa,mBAAmB,CAAA;;AAGrB,IAAA,GAAG,GAAG,KAAK,CAAC,EAAE,0EAAC;AACf,IAAA,GAAG,GAAG,KAAK,CAAC,EAAE,0EAAC;AACf,IAAA,IAAI,GAAG,KAAK,CAAC,EAAE,2EAAC;AAChB,IAAA,IAAI,GAAG,KAAK,CAAmC,IAAI,2EAAC;AACpD,IAAA,KAAK,GAAG,KAAK,CAAsB,QAAQ,4EAAC;AAC5C,IAAA,MAAM,GAAG,KAAK,CAAgD,IAAI,6EAAC;;AAIzD,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;;AAIxB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC;QACE,aAAa;AACb,QAAA,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE;AAC7B,QAAA,CAAA,aAAA,EAAgB,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;AAC/B,KAAA,CAAC,IAAI,CAAC,GAAG,CAAC,kFACZ;;AAIkB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;AACpB,QAAA,OAAO;AACJ,aAAA,IAAI;aACJ,KAAK,CAAC,KAAK;AACX,aAAA,KAAK,CAAC,CAAC,EAAE,CAAC;AACV,aAAA,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE;aACxC,IAAI,CAAC,EAAE,CAAC;AACb,IAAA,CAAC,+EAAC;;IAIQ,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;uGAzCW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,w0BCjBhC,gnBAyBA,EAAA,MAAA,EAAA,CAAA,u8FAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDRa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAT/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EACM,uBAAuB,CAAC,MAAM,EAAA,IAAA,EAGzC,EAAE,SAAS,EAAE,eAAe,EAAE,EAAA,QAAA,EAAA,gnBAAA,EAAA,MAAA,EAAA,CAAA,u8FAAA,CAAA,EAAA;;;AEftC;;AAEG;;;;"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@fuse_ui/avatar",
3
+ "version": "0.0.1",
4
+ "license": "MIT",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "keywords": [
9
+ "fuse-ui",
10
+ "angular",
11
+ "ionic",
12
+ "ionic8",
13
+ "angular18",
14
+ "angular19",
15
+ "angular20",
16
+ "angular21",
17
+ "ui-components",
18
+ "design-system",
19
+ "css-variables",
20
+ "signals",
21
+ "standalone",
22
+ "multi-theme",
23
+ "dark-mode",
24
+ "fluid-typography",
25
+ "animated"
26
+ ],
27
+ "peerDependencies": {
28
+ "@angular/core": ">=18.0.0",
29
+ "@angular/common": ">=18.0.0",
30
+ "rxjs": ">=7.4.0"
31
+ },
32
+ "peerDependenciesMeta": {
33
+ "@ionic/angular": {
34
+ "optional": true
35
+ }
36
+ },
37
+ "sideEffects": [
38
+ "*.css",
39
+ "**/*.scss"
40
+ ],
41
+ "engines": {
42
+ "node": ">=20.0.0"
43
+ },
44
+ "module": "fesm2022/fuse_ui-avatar.mjs",
45
+ "typings": "types/fuse_ui-avatar.d.ts",
46
+ "exports": {
47
+ "./package.json": {
48
+ "default": "./package.json"
49
+ },
50
+ ".": {
51
+ "types": "./types/fuse_ui-avatar.d.ts",
52
+ "default": "./fesm2022/fuse_ui-avatar.mjs"
53
+ }
54
+ },
55
+ "type": "module",
56
+ "dependencies": {
57
+ "tslib": "^2.3.0"
58
+ }
59
+ }
@@ -0,0 +1,18 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ declare class FuseAvatarComponent {
4
+ readonly src: _angular_core.InputSignal<string>;
5
+ readonly alt: _angular_core.InputSignal<string>;
6
+ readonly name: _angular_core.InputSignal<string>;
7
+ readonly size: _angular_core.InputSignal<"xs" | "sm" | "md" | "lg" | "xl">;
8
+ readonly shape: _angular_core.InputSignal<"circle" | "square">;
9
+ readonly status: _angular_core.InputSignal<"online" | "offline" | "busy" | "away" | null>;
10
+ protected readonly hasError: _angular_core.WritableSignal<boolean>;
11
+ protected readonly hostClasses: _angular_core.Signal<string>;
12
+ protected readonly initials: _angular_core.Signal<string>;
13
+ protected onImageError(): void;
14
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FuseAvatarComponent, never>;
15
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FuseAvatarComponent, "fuse-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
16
+ }
17
+
18
+ export { FuseAvatarComponent };