{"version":3,"file":"taiga-ui-addon-charts-components-arc-chart.mjs","sources":["../../../projects/addon-charts/components/arc-chart/arc-chart.component.ts","../../../projects/addon-charts/components/arc-chart/arc-chart.template.html","../../../projects/addon-charts/components/arc-chart/taiga-ui-addon-charts-components-arc-chart.ts"],"sourcesContent":["import {\n    ChangeDetectionStrategy,\n    Component,\n    type ElementRef,\n    Input,\n    Output,\n    type QueryList,\n    signal,\n    ViewChildren,\n} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {TuiRepeatTimes} from '@taiga-ui/cdk/directives/repeat-times';\nimport {tuiTypedFromEvent, tuiZonefree} from '@taiga-ui/cdk/observables';\nimport {type TuiSizeXL} from '@taiga-ui/core/types';\nimport {\n    map,\n    merge,\n    type Observable,\n    ReplaySubject,\n    startWith,\n    switchMap,\n    tap,\n    timer,\n} from 'rxjs';\n\nconst ARC = 0.76; // 3/4 with 1% safety offset\nconst SIZE = {m: 9, l: 11, xl: 16} as const;\nconst WIDTH = {m: 0.25, l: 0.375, xl: 0.5625} as const;\nconst GAP = {m: 0.125, l: 0.1875, xl: 0.25} as const;\n\nfunction arcsToIndex(arcs: QueryList<ElementRef<SVGElement>>): Array<Observable<number>> {\n    return arcs.map(({nativeElement}, index) =>\n        merge(\n            tuiTypedFromEvent(nativeElement, 'mouseenter').pipe(map(() => index)),\n            tuiTypedFromEvent(nativeElement, 'mouseleave').pipe(map(() => NaN)),\n        ),\n    );\n}\n\n@Component({\n    standalone: true,\n    selector: 'tui-arc-chart',\n    imports: [TuiRepeatTimes],\n    templateUrl: './arc-chart.template.html',\n    styleUrls: ['./arc-chart.style.less'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {\n        '[attr.data-size]': 'size',\n        '[style.width.rem]': 'width',\n        '[style.height.rem]': 'width',\n        '[style.strokeWidth.rem]': 'strokeWidth',\n    },\n})\nexport class TuiArcChart {\n    private readonly arcs$ = new ReplaySubject<QueryList<ElementRef<SVGElement>>>(1);\n\n    protected initialized = signal(false);\n\n    protected readonly $ = timer(0)\n        .pipe(tuiZonefree(), takeUntilDestroyed())\n        .subscribe(() => this.initialized.set(true));\n\n    @Input()\n    public value: readonly number[] = [];\n\n    @Input()\n    public size: TuiSizeXL = 'm';\n\n    @Input()\n    public max = 100;\n\n    @Input()\n    public minLabel = '0%';\n\n    @Input()\n    public maxLabel = '100%';\n\n    @Input()\n    public activeItemIndex = NaN;\n\n    @Output()\n    public readonly activeItemIndexChange = this.arcs$.pipe(\n        switchMap((arcs) =>\n            arcs.changes.pipe(\n                startWith(null),\n                switchMap(() => merge(...arcsToIndex(arcs))),\n            ),\n        ),\n        tap((index) => {\n            this.activeItemIndex = index;\n        }),\n    );\n\n    @ViewChildren('arc')\n    protected set arcs(arcs: QueryList<ElementRef<SVGElement>>) {\n        this.arcs$.next(arcs);\n    }\n\n    protected get width(): number {\n        return SIZE[this.size];\n    }\n\n    protected get strokeWidth(): number {\n        return WIDTH[this.size];\n    }\n\n    protected isInactive(index: number): boolean {\n        return !Number.isNaN(this.activeItemIndex) && index !== this.activeItemIndex;\n    }\n\n    protected getInset(index: number): number {\n        return this.strokeWidth / 2 + index * (this.strokeWidth + GAP[this.size]);\n    }\n\n    protected getDiameter(index: number): number {\n        return SIZE[this.size] - 2 * this.getInset(index);\n    }\n\n    protected getLength(index: number): number {\n        return Math.PI * this.getDiameter(index) * ARC;\n    }\n\n    protected getOffset(index: number): number {\n        return (\n            this.getLength(index) * (1 - Math.min((this.value[index] || 0) / this.max, 1))\n        );\n    }\n}\n","<svg\n    *tuiRepeatTimes=\"let index of value.length\"\n    focusable=\"false\"\n    viewBox=\"-100 -100 200 200\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    class=\"t-svg\"\n    [style.height.rem]=\"getDiameter(index)\"\n    [style.left.rem]=\"getInset(index)\"\n    [style.right.rem]=\"getInset(index)\"\n    [style.top.rem]=\"getInset(index)\"\n>\n    <path\n        d=\"M -70 70 A 100 100 0 1 1 70 70\"\n        vector-effect=\"non-scaling-stroke\"\n    />\n    <path\n        #arc\n        d=\"M -70 70 A 100 100 0 1 1 70 70\"\n        vector-effect=\"non-scaling-stroke\"\n        class=\"t-value\"\n        [class.t-value_inactive]=\"isInactive(index)\"\n        [style.stroke]=\"'var(--tui-chart-categorical-' + index.toString().padStart(2, '0') + ')'\"\n        [style.strokeDasharray.em]=\"getLength(index)\"\n        [style.strokeDashoffset.em]=\"initialized() ? getOffset(index) : getLength(index)\"\n    />\n</svg>\n<div class=\"t-content\">\n    <div class=\"t-wrapper\">\n        <ng-content />\n    </div>\n</div>\n<div class=\"t-percent\">\n    <span>{{ minLabel }}</span>\n    <span>{{ maxLabel }}</span>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}