{"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 {ChangeDetectionStrategy, Component, input, model} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {TuiHovered} from '@taiga-ui/cdk/directives/hovered';\nimport {tuiZonefree} from '@taiga-ui/cdk/observables';\nimport {type TuiSizeXL} from '@taiga-ui/core/types';\nimport {map, take, timer} 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\n@Component({\n    selector: 'tui-arc-chart',\n    imports: [TuiHovered],\n    templateUrl: './arc-chart.template.html',\n    styleUrl: './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    protected readonly initialized = toSignal(\n        timer(0).pipe(\n            tuiZonefree(),\n            take(1),\n            map(() => true),\n        ),\n        {initialValue: false},\n    );\n\n    public readonly value = input<readonly number[]>([]);\n    public readonly size = input<TuiSizeXL>('m');\n    public readonly max = input(100);\n    public readonly minLabel = input('0%');\n    public readonly maxLabel = input('100%');\n\n    public readonly activeItemIndex = model(Number.NaN);\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 onHovered(hovered: boolean, index: number): void {\n        this.activeItemIndex.set(hovered ? index : Number.NaN);\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) *\n            (1 - Math.min((this.value()[index] || 0) / this.max(), 1))\n        );\n    }\n}\n","@let data = value();\n@let min = minLabel();\n@let max = maxLabel();\n@for (_ of '-'.repeat(data.length); track $index) {\n    <svg\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.inset-block-start.rem]=\"getInset($index)\"\n        [style.inset-inline.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            (tuiHoveredChange)=\"onHovered($event, $index)\"\n        />\n    </svg>\n}\n<div class=\"t-content\">\n    <div class=\"t-wrapper\">\n        <ng-content />\n    </div>\n</div>\n<div class=\"t-percent\">\n    <span>{{ min }}</span>\n    <span>{{ max }}</span>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}