{"version":3,"file":"seniorsistemas-angular-components-thumbnail.mjs","sources":["../../projects/angular-components/thumbnail/src/lib/thumbnail/thumbnail.service.ts","../../projects/angular-components/thumbnail/src/lib/thumbnail/thumbnail.component.ts","../../projects/angular-components/thumbnail/src/lib/thumbnail/thumbnail.component.html","../../projects/angular-components/thumbnail/src/lib/thumbnail/thumbnail.module.ts","../../projects/angular-components/thumbnail/src/seniorsistemas-angular-components-thumbnail.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\n\n@Injectable()\nexport class ThumbnailService {\n    public getBinaryFile(img: HTMLImageElement) {\n        return new Promise(resolve => {\n            const getOrientation = this.getOrientation.bind(this);\n\n            let http: XMLHttpRequest | null = new XMLHttpRequest();\n            http.addEventListener(\"load\", () => {\n                if (http?.readyState === 4 && (http.status == 200 || http.status === 0)) {\n                    const orientation = getOrientation(http.response);\n                    http = null;\n                    resolve(orientation);\n                }\n            });\n\n            http.addEventListener(\"error\", () => {\n                http = null;\n                throw new Error(\"Não foi possível carregar a imagem\");\n            });\n\n            http.open(\"GET\", img.src, true);\n            http.responseType = \"arraybuffer\";\n            http.send(null);\n        });\n    }\n\n    /**\n     * Retorna a tag da orientação EXIF {-1} Não definido, {-2} Não é formato JPEG, {1, 2, 3, 4, 5, 6, 7, 8} valores da orientação.\n     */\n    private getOrientation(file: ArrayBuffer): number {\n        const view = new DataView(file);\n\n        if (view.getUint16(0, false) != 0xffd8) return -2; // not jpeg\n\n        const length = view.byteLength;\n        let offset = 2;\n\n        while (offset < length) {\n            const marker = view.getUint16(offset, false);\n            offset += 2;\n\n            if (marker == 0xffe1) {\n                if (view.getUint32((offset += 2), false) != 0x45786966) {\n                    return -1; // not defined\n                }\n                const little = view.getUint16((offset += 6), false) == 0x4949;\n                offset += view.getUint32(offset + 4, little);\n                const tags = view.getUint16(offset, little);\n                offset += 2;\n\n                for (let i = 0; i < tags; i++)\n                    if (view.getUint16(offset + i * 12, little) == 0x0112) return view.getUint16(offset + i * 12 + 8, little);\n            // tslint:disable-next-line: no-bitwise\n            } else if ((marker & 0xff00) != 0xff00) break;\n            else offset += view.getUint16(offset, false);\n        }\n        return -1; // not defined\n    }\n}\n","import { AfterViewInit, Component, ElementRef, Input, OnDestroy, ViewChild, inject } from '@angular/core';\n\nimport { from, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport { ThumbnailSize } from './thumbnail-size';\nimport { ThumbnailService } from './thumbnail.service';\n\n/**\n * @description Componente de miniatura de imagem com suporte a imagem de fallback,\n * ícone de ação sobrepôsto, orientação automática e diferentes tamanhos predefinidos.\n *\n * @example\n * ```html\n * <s-thumbnail\n *   [imageSource]=\"urlDaImagem\"\n *   size=\"large\"\n *   iconClass=\"fas fa-user\" />\n * ```\n *\n * @category Data\n */\n@Component({\n    selector: 's-thumbnail',\n    templateUrl: './thumbnail.component.html',\n    styleUrls: ['./thumbnail.component.scss'],\n})\nexport class ThumbnailComponent implements AfterViewInit, OnDestroy {\n    private readonly thumbnailService = inject(ThumbnailService);\n\n    public static nextId = 0;\n    public fallback = false;\n    public orientation = 0;\n\n    @ViewChild('img', { static: false })\n    public imgEl: ElementRef | null = null;\n\n    /** @description Identificador único do componente no DOM. Gerado automaticamente se não informado. */\n    @Input()\n    public id = `s-thumbnail-${ThumbnailComponent.nextId++}`;\n\n    /** @description Tamanho da miniatura: `'small'`, `'medium'`, `'large'`, etc. @default 'medium' */\n    @Input()\n    public size: ThumbnailSize = 'medium';\n\n    /** @description URL da imagem principal. */\n    @Input()\n    public imageSource?: string;\n\n    /** @description URL da imagem de fallback exibida quando a principal falha ao carregar. */\n    @Input()\n    public imageFallback?: string;\n\n    /** @description Texto alternativo (atributo `alt`) da imagem. */\n    @Input()\n    public imageAlt?: string;\n\n    /** @description Classe do ícone exibido quando não há imagem disponível. @default 'far fa-image' */\n    @Input()\n    public iconClass = 'far fa-image';\n\n    /** @description Habilita a exibição de um botão de ação sobrepôsto. @default false */\n    @Input()\n    public hasAction = false;\n\n    /** @description Classe do ícone do botão de ação. @default 'fas fa-camera' */\n    @Input()\n    public actionIconClass = 'fas fa-camera';\n\n    /** @description Aplica estilo de tile ao thumbnail. @default false */\n    @Input()\n    public isTile = false;\n\n    /** @description Aplica estilo de marca ao thumbnail. @default false */\n    @Input()\n    public isBrand = false;\n\n    private ngUnsubscribe = new Subject<void>();\n\n    public ngOnDestroy(): void {\n        this.ngUnsubscribe.next();\n        this.ngUnsubscribe.complete();\n    }\n\n    public ngAfterViewInit(): void {\n        if (this.imgEl) {\n            this.imgEl.nativeElement.addEventListener('load', () => {\n                from(this.thumbnailService.getBinaryFile(this.imgEl?.nativeElement))\n                    .pipe(takeUntil(this.ngUnsubscribe))\n                    .subscribe((value: unknown) => {\n                        if (typeof value === 'number') {\n                            this.orientation = value;\n                        } else {\n                            console.error('Valor retornado não é um número:', value);\n                        }\n                    });\n            });\n        }\n    }\n}\n\n","<div\n    [id]=\"id\"\n    class=\"thumbnail-container thumbnail-container--{{ size }}\"\n    [ngClass]=\"{\n        'thumbnail-container--with-action': hasAction,\n        'thumbnail-container--brand': isBrand,\n    }\"\n>\n    @if (imageSource || imageFallback) {\n        <div\n            [id]=\"id + '-image-container'\"\n            class=\"image-container\"\n            [ngClass]=\"{\n                'image-container--rounded': !isBrand,\n            }\"\n        >\n            @if (!fallback) {\n                <img\n                    #img\n                    [id]=\"id + '-image'\"\n                    (error)=\"fallback = true\"\n                    [src]=\"imageSource\"\n                    [alt]=\"imageAlt\"\n                    [ngClass]=\"{\n                        smallThumbnail: isTile,\n                        'exif-orientation-2': orientation === 2,\n                        'exif-orientation-3': orientation === 3,\n                        'exif-orientation-4': orientation === 4,\n                        'exif-orientation-5': orientation === 5,\n                        'exif-orientation-6': orientation === 6,\n                        'exif-orientation-7': orientation === 7,\n                        'exif-orientation-8': orientation === 8,\n                    }\"\n                />\n            }\n\n            @if (fallback && imageFallback) {\n                <img\n                    #img\n                    [id]=\"id + '-image-fallback'\"\n                    (error)=\"imageFallback = undefined\"\n                    [src]=\"imageFallback\"\n                    [alt]=\"imageAlt\"\n                    [ngClass]=\"{\n                        smallThumbnail: isTile,\n                        'exif-orientation-2': orientation === 2,\n                        'exif-orientation-3': orientation === 3,\n                        'exif-orientation-4': orientation === 4,\n                        'exif-orientation-5': orientation === 5,\n                        'exif-orientation-6': orientation === 6,\n                        'exif-orientation-7': orientation === 7,\n                        'exif-orientation-8': orientation === 8,\n                    }\"\n                />\n            }\n\n            @if (fallback && !imageFallback) {\n                <i class=\"fallback-img-color far fa-image\"> </i>\n            }\n        </div>\n    }\n\n    @if (hasAction) {\n        <div\n            [id]=\"id + '-action-icon-container'\"\n            class=\"action-icon-container action-icon-container--{{ size }}\"\n        >\n            <span\n                [id]=\"id + '-action-icon'\"\n                [class]=\"actionIconClass\"\n                aria-hidden=\"true\"\n            >\n            </span>\n        </div>\n    }\n\n    @if (!imageSource && !imageFallback) {\n        <div\n            [id]=\"id + '-icon-container'\"\n            class=\"icon-container icon-container--{{ size }}\"\n            [ngClass]=\"{ 'image-container--rounded': !isBrand }\"\n        >\n            <span\n                [id]=\"id + '-icon'\"\n                [class]=\"iconClass\"\n                aria-hidden=\"true\"\n            >\n            </span>\n        </div>\n    }\n\n    <ng-content></ng-content>\n</div>\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { ThumbnailComponent } from \"./thumbnail.component\";\nimport { ThumbnailService } from \"./thumbnail.service\";\n\n@NgModule({\n    imports: [CommonModule],\n    declarations: [ThumbnailComponent],\n    exports: [ThumbnailComponent],\n    providers: [ThumbnailService],\n})\nexport class ThumbnailModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}