@ojiepermana/angular-chart 22.0.27

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.
Files changed (32) hide show
  1. package/README.md +249 -0
  2. package/fesm2022/ojiepermana-angular-chart-area.mjs +266 -0
  3. package/fesm2022/ojiepermana-angular-chart-area.mjs.map +1 -0
  4. package/fesm2022/ojiepermana-angular-chart-bar.mjs +674 -0
  5. package/fesm2022/ojiepermana-angular-chart-bar.mjs.map +1 -0
  6. package/fesm2022/ojiepermana-angular-chart-core.mjs +764 -0
  7. package/fesm2022/ojiepermana-angular-chart-core.mjs.map +1 -0
  8. package/fesm2022/ojiepermana-angular-chart-line.mjs +281 -0
  9. package/fesm2022/ojiepermana-angular-chart-line.mjs.map +1 -0
  10. package/fesm2022/ojiepermana-angular-chart-pie.mjs +248 -0
  11. package/fesm2022/ojiepermana-angular-chart-pie.mjs.map +1 -0
  12. package/fesm2022/ojiepermana-angular-chart-primitives.mjs +1186 -0
  13. package/fesm2022/ojiepermana-angular-chart-primitives.mjs.map +1 -0
  14. package/fesm2022/ojiepermana-angular-chart-radar.mjs +329 -0
  15. package/fesm2022/ojiepermana-angular-chart-radar.mjs.map +1 -0
  16. package/fesm2022/ojiepermana-angular-chart-radial.mjs +255 -0
  17. package/fesm2022/ojiepermana-angular-chart-radial.mjs.map +1 -0
  18. package/fesm2022/ojiepermana-angular-chart-scatter.mjs +253 -0
  19. package/fesm2022/ojiepermana-angular-chart-scatter.mjs.map +1 -0
  20. package/fesm2022/ojiepermana-angular-chart.mjs +20 -0
  21. package/fesm2022/ojiepermana-angular-chart.mjs.map +1 -0
  22. package/package.json +76 -0
  23. package/types/ojiepermana-angular-chart-area.d.ts +58 -0
  24. package/types/ojiepermana-angular-chart-bar.d.ts +171 -0
  25. package/types/ojiepermana-angular-chart-core.d.ts +369 -0
  26. package/types/ojiepermana-angular-chart-line.d.ts +57 -0
  27. package/types/ojiepermana-angular-chart-pie.d.ts +93 -0
  28. package/types/ojiepermana-angular-chart-primitives.d.ts +265 -0
  29. package/types/ojiepermana-angular-chart-radar.d.ts +89 -0
  30. package/types/ojiepermana-angular-chart-radial.d.ts +86 -0
  31. package/types/ojiepermana-angular-chart-scatter.d.ts +95 -0
  32. package/types/ojiepermana-angular-chart.d.ts +2 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ojiepermana-angular-chart-primitives.mjs","sources":["../../../library/chart/primitives/chart-axis-x.ts","../../../library/chart/primitives/chart-axis-y.ts","../../../library/chart/primitives/chart-grid.ts","../../../library/chart/primitives/chart-crosshair.ts","../../../library/chart/primitives/chart-brush.ts","../../../library/chart/primitives/chart-pointer-tracker.ts","../../../library/chart/primitives/chart-tooltip.ts","../../../library/chart/primitives/chart-legend.ts","../../../library/chart/primitives/chart-zoom-controls.ts","../../../library/chart/primitives/pie-center.ts","../../../library/chart/primitives/radial-center.ts","../../../library/chart/primitives/ojiepermana-angular-chart-primitives.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { CartesianContext } from '@ojiepermana/angular-chart/core';\nimport { bandTicks, linearTicks, type ChartTick } from '@ojiepermana/angular-chart/core';\n\n/**\n * X axis for a cartesian chart. Reads scales from `CartesianContext`.\n *\n * Renders as `<svg:g>` — must be placed inside the owning chart's SVG.\n */\n@Component({\n selector: 'svg:g[ChartAxisX]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'chart-axis chart-axis-x text-muted-foreground',\n '[attr.transform]': 'transform()',\n },\n template: `\n <svg:line class=\"stroke-border\" [attr.x1]=\"0\" [attr.x2]=\"innerWidth()\" y1=\"0\" y2=\"0\" />\n @for (t of ticks(); track t.value) {\n <svg:g [attr.transform]=\"'translate(' + t.offset + ',0)'\">\n @if (tickLine()) {\n <svg:line class=\"stroke-border\" y1=\"0\" y2=\"6\" />\n }\n <svg:text\n class=\"fill-current\"\n y=\"18\"\n text-anchor=\"middle\"\n style=\"font-size: var(--text-xs); font-family: var(--font-sans)\">\n {{ t.label }}\n </svg:text>\n </svg:g>\n }\n `,\n})\nexport class ChartAxisX {\n private readonly ctx = inject(CartesianContext);\n\n /** Approximate tick count for linear (value) scales. */\n readonly tickCount = input<number>(5);\n /** Show 6-px tick marks between the axis line and the labels. */\n readonly tickLine = input<boolean>(true);\n /** Formatter for numeric tick labels. */\n readonly tickFormat = input<(value: number) => string>((v) => String(v));\n\n protected readonly innerWidth = this.ctx.innerWidth;\n protected readonly transform = computed(() => `translate(0,${this.ctx.innerHeight()})`);\n\n protected readonly ticks = computed<ChartTick[]>(() => {\n const horizontal = this.ctx.orientation() === 'horizontal';\n if (horizontal) {\n const scale = this.ctx.valueScale();\n return scale ? linearTicks(scale, this.tickCount(), this.tickFormat()) : [];\n }\n const scale = this.ctx.categoryScale();\n return scale ? bandTicks(scale) : [];\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { CartesianContext } from '@ojiepermana/angular-chart/core';\nimport { bandTicks, linearTicks, type ChartTick } from '@ojiepermana/angular-chart/core';\n\n/**\n * Y axis for a cartesian chart. Reads scales from `CartesianContext`.\n *\n * Renders as `<svg:g>` — must be placed inside the owning chart's SVG.\n */\n@Component({\n selector: 'svg:g[ChartAxisY]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'chart-axis chart-axis-y text-muted-foreground',\n },\n template: `\n <svg:line class=\"stroke-border\" x1=\"0\" x2=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerHeight()\" />\n @for (t of ticks(); track t.value) {\n <svg:g [attr.transform]=\"'translate(0,' + t.offset + ')'\">\n @if (tickLine()) {\n <svg:line class=\"stroke-border\" x1=\"-6\" x2=\"0\" />\n }\n <svg:text\n class=\"fill-current\"\n x=\"-8\"\n dy=\"0.32em\"\n text-anchor=\"end\"\n style=\"font-size: var(--text-xs); font-family: var(--font-sans)\">\n {{ t.label }}\n </svg:text>\n </svg:g>\n }\n `,\n})\nexport class ChartAxisY {\n private readonly ctx = inject(CartesianContext);\n\n readonly tickCount = input<number>(5);\n readonly tickLine = input<boolean>(true);\n readonly tickFormat = input<(value: number) => string>((v) => String(v));\n\n protected readonly innerHeight = this.ctx.innerHeight;\n\n protected readonly ticks = computed<ChartTick[]>(() => {\n const horizontal = this.ctx.orientation() === 'horizontal';\n if (horizontal) {\n const scale = this.ctx.categoryScale();\n return scale ? bandTicks(scale) : [];\n }\n const scale = this.ctx.valueScale();\n return scale ? linearTicks(scale, this.tickCount(), this.tickFormat()) : [];\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { CartesianContext } from '@ojiepermana/angular-chart/core';\nimport { linearTicks } from '@ojiepermana/angular-chart/core';\n\n/**\n * Horizontal / vertical grid lines for the cartesian plotting area.\n *\n * Reads tick positions from `CartesianContext.valueScale`. Direction of the\n * grid lines follows `orientation`:\n * - vertical → horizontal grid lines (one per y-tick)\n * - horizontal → vertical grid lines (one per x-tick)\n */\n@Component({\n selector: 'svg:g[ChartGrid]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'chart-grid text-border',\n },\n template: `\n @for (t of ticks(); track t.value) {\n <svg:line\n class=\"stroke-border\"\n stroke-dasharray=\"3 3\"\n [attr.x1]=\"line(t.offset).x1\"\n [attr.x2]=\"line(t.offset).x2\"\n [attr.y1]=\"line(t.offset).y1\"\n [attr.y2]=\"line(t.offset).y2\" />\n }\n `,\n})\nexport class ChartGrid {\n private readonly ctx = inject(CartesianContext);\n\n readonly tickCount = input<number>(5);\n\n protected readonly ticks = computed(() => {\n const scale = this.ctx.valueScale();\n return scale ? linearTicks(scale, this.tickCount()) : [];\n });\n\n protected readonly line = (offset: number) => {\n if (this.ctx.orientation() === 'vertical') {\n return { x1: 0, x2: this.ctx.innerWidth(), y1: offset, y2: offset };\n }\n return { x1: offset, x2: offset, y1: 0, y2: this.ctx.innerHeight() };\n };\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { ChartContext } from '@ojiepermana/angular-chart/core';\nimport { CartesianContext } from '@ojiepermana/angular-chart/core';\n\n/**\n * Crosshair primitive — a line drawn through the currently active data point\n * perpendicular to the categorical axis. Reads `activePoint` from\n * `ChartContext` and the scales from `CartesianContext`.\n *\n * Place inside a cartesian chart's SVG inner group.\n */\n@Component({\n selector: 'svg:g[ChartCrosshair]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'chart-crosshair' },\n template: `\n @if (line(); as l) {\n <svg:line\n class=\"stroke-border\"\n stroke-dasharray=\"3 3\"\n [attr.x1]=\"l.x1\"\n [attr.x2]=\"l.x2\"\n [attr.y1]=\"l.y1\"\n [attr.y2]=\"l.y2\" />\n }\n `,\n})\nexport class ChartCrosshair {\n private readonly root = inject(ChartContext);\n private readonly cart = inject(CartesianContext);\n\n protected readonly line = computed(() => {\n const active = this.root.activePoint();\n const scale = this.cart.categoryScale();\n const categories = this.cart.categories();\n if (!active || !scale || active.index < 0 || active.index >= categories.length) {\n return null;\n }\n const base = scale(categories[active.index]) ?? 0;\n const pos = base + scale.bandwidth() / 2;\n if (this.cart.orientation() === 'vertical') {\n return { x1: pos, x2: pos, y1: 0, y2: this.cart.innerHeight() };\n }\n return { x1: 0, x2: this.cart.innerWidth(), y1: pos, y2: pos };\n });\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, computed, inject, signal, viewChild } from '@angular/core';\nimport { CartesianContext } from '@ojiepermana/angular-chart/core';\nimport { CategoricalViewportContext } from '@ojiepermana/angular-chart/core';\nimport { ScatterViewportContext } from '@ojiepermana/angular-chart/core';\nimport {\n indexRangeSize,\n normalizeIndexRange,\n normalizeNumericDomain,\n panIndexRange,\n panNumericDomain,\n zoomIndexRange,\n zoomNumericDomain,\n type ChartIndexRange,\n type NumericDomain,\n} from '@ojiepermana/angular-chart/core';\nimport { nearestCategoryIndex } from '@ojiepermana/angular-chart/core';\n\ntype BrushMode = 'category-brush' | 'category-pan' | 'scatter-brush' | 'scatter-pan' | null;\n\ninterface LocalPoint {\n readonly x: number;\n readonly y: number;\n}\n\ninterface ScatterBrushState {\n readonly start: LocalPoint;\n readonly current: LocalPoint;\n}\n\ninterface ScatterPanState {\n readonly start: LocalPoint;\n readonly xDomain: NumericDomain;\n readonly yDomain: NumericDomain;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction sameDomain(a: NumericDomain, b: NumericDomain): boolean {\n return Math.abs(a[0] - b[0]) < 1e-9 && Math.abs(a[1] - b[1]) < 1e-9;\n}\n\n@Component({\n selector: 'svg:g[ChartBrush]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'chart-brush',\n '(window:pointermove)': 'onPointerMove($event)',\n '(window:pointerup)': 'onPointerUp($event)',\n '(window:pointercancel)': 'onPointerCancel($event)',\n },\n template: `\n <svg:rect\n #hitbox\n class=\"fill-transparent touch-none\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"width()\"\n [attr.height]=\"height()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerCancel($event)\"\n (wheel)=\"onWheel($event)\"\n (dblclick)=\"resetZoom()\" />\n\n @if (categoryPreview(); as rect) {\n <svg:rect\n class=\"fill-foreground/10 stroke-foreground/30\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n stroke-dasharray=\"4 3\" />\n }\n\n @if (scatterPreviewRect(); as rect) {\n <svg:rect\n class=\"fill-foreground/10 stroke-foreground/30\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n stroke-dasharray=\"4 3\" />\n }\n `,\n})\nexport class ChartBrush {\n private readonly hitbox = viewChild.required<ElementRef<SVGRectElement>>('hitbox');\n private readonly cart = inject(CartesianContext, { optional: true });\n private readonly categorical = inject(CategoricalViewportContext, { optional: true });\n private readonly scatter = inject(ScatterViewportContext, { optional: true });\n\n private readonly mode = signal<BrushMode>(null);\n private readonly activePointerId = signal<number | null>(null);\n private readonly categoryStartIndex = signal<number | null>(null);\n private readonly categoryPanStart = signal<{ coord: number; range: ChartIndexRange | null } | null>(null);\n private readonly scatterBrush = signal<ScatterBrushState | null>(null);\n private readonly scatterPan = signal<ScatterPanState | null>(null);\n\n protected readonly width = computed(() => this.scatter?.innerWidth() ?? this.cart?.innerWidth() ?? 0);\n protected readonly height = computed(() => this.scatter?.innerHeight() ?? this.cart?.innerHeight() ?? 0);\n\n protected readonly categoryPreview = computed(() => {\n const cart = this.cart;\n const viewport = this.categorical;\n const range = viewport?.brushRange();\n const scale = cart?.categoryScale();\n const categories = cart?.categories() ?? [];\n if (!cart || !viewport || !range || !scale || categories.length === 0) {\n return null;\n }\n\n const visibleStart = viewport.zoomRange()?.startIndex ?? 0;\n const startVisible = range.startIndex - visibleStart;\n const endVisible = range.endIndex - visibleStart;\n if (startVisible < 0 || endVisible >= categories.length) {\n return null;\n }\n\n const first = scale(categories[startVisible]) ?? 0;\n const last = (scale(categories[endVisible]) ?? 0) + scale.bandwidth();\n if (cart.orientation() === 'vertical') {\n return { x: Math.min(first, last), y: 0, width: Math.abs(last - first), height: cart.innerHeight() };\n }\n return { x: 0, y: Math.min(first, last), width: cart.innerWidth(), height: Math.abs(last - first) };\n });\n\n protected readonly scatterPreviewRect = computed(() => {\n const preview = this.scatterBrush();\n if (!preview) {\n return null;\n }\n return {\n x: Math.min(preview.start.x, preview.current.x),\n y: Math.min(preview.start.y, preview.current.y),\n width: Math.abs(preview.current.x - preview.start.x),\n height: Math.abs(preview.current.y - preview.start.y),\n };\n });\n\n protected onPointerDown(event: PointerEvent): void {\n if (this.activePointerId() != null) {\n return;\n }\n const local = this.localPoint(event);\n if (!local) {\n return;\n }\n\n if (this.scatter) {\n if (!this.scatter.fullXDomain() || !this.scatter.fullYDomain()) {\n return;\n }\n event.preventDefault();\n this.activePointerId.set(event.pointerId);\n this.hitbox().nativeElement.setPointerCapture(event.pointerId);\n this.onScatterPointerDown(event, local);\n return;\n }\n if (!this.cart || !this.categorical) {\n return;\n }\n\n const index = nearestCategoryIndex(\n {\n categoryScale: this.cart.categoryScale,\n categories: this.cart.categories,\n orientation: this.cart.orientation,\n },\n local.x,\n local.y,\n );\n if (index < 0) {\n return;\n }\n\n event.preventDefault();\n this.activePointerId.set(event.pointerId);\n this.hitbox().nativeElement.setPointerCapture(event.pointerId);\n\n const visibleStart = this.categorical.zoomRange()?.startIndex ?? 0;\n const absoluteIndex = visibleStart + index;\n if (event.pointerType === 'touch' && this.categorical.hasZoom()) {\n this.mode.set('category-pan');\n this.categoryPanStart.set({ coord: this.pointerAxis(local), range: this.categorical.zoomRange() });\n return;\n }\n\n this.mode.set('category-brush');\n this.categoryStartIndex.set(absoluteIndex);\n this.categorical.brushRange.set({ startIndex: absoluteIndex, endIndex: absoluteIndex });\n }\n\n protected onPointerMove(event: PointerEvent): void {\n if (this.activePointerId() !== event.pointerId) {\n return;\n }\n const local = this.localPoint(event);\n if (!local) {\n return;\n }\n\n if (this.mode() === 'category-brush' && this.cart && this.categorical) {\n const startIndex = this.categoryStartIndex();\n if (startIndex == null) {\n return;\n }\n const index = nearestCategoryIndex(\n {\n categoryScale: this.cart.categoryScale,\n categories: this.cart.categories,\n orientation: this.cart.orientation,\n },\n local.x,\n local.y,\n );\n if (index < 0) {\n return;\n }\n const visibleStart = this.categorical.zoomRange()?.startIndex ?? 0;\n this.categorical.brushRange.set(\n normalizeIndexRange(startIndex, visibleStart + index, this.categorical.dataCount()),\n );\n return;\n }\n\n if (this.mode() === 'category-pan' && this.cart && this.categorical) {\n const pan = this.categoryPanStart();\n if (!pan) {\n return;\n }\n const scale = this.cart.categoryScale();\n const step = scale?.step?.() ?? scale?.bandwidth() ?? 0;\n if (step <= 0) {\n return;\n }\n const deltaSteps = Math.round((pan.coord - this.pointerAxis(local)) / step);\n this.categorical.zoomRange.set(panIndexRange(pan.range, this.categorical.dataCount(), deltaSteps));\n return;\n }\n\n if (this.mode() === 'scatter-brush') {\n const preview = this.scatterBrush();\n if (!preview) {\n return;\n }\n this.scatterBrush.set({ start: preview.start, current: local });\n return;\n }\n\n if (this.mode() === 'scatter-pan' && this.scatter) {\n const pan = this.scatterPan();\n const xScale = this.scatter.xScale();\n const yScale = this.scatter.yScale();\n const fullX = this.scatter.fullXDomain();\n const fullY = this.scatter.fullYDomain();\n if (!pan || !xScale || !yScale || !fullX || !fullY) {\n return;\n }\n const deltaX = xScale.invert(pan.start.x) - xScale.invert(local.x);\n const deltaY = yScale.invert(pan.start.y) - yScale.invert(local.y);\n this.scatter.zoomXDomain.set(panNumericDomain(pan.xDomain, fullX, deltaX));\n this.scatter.zoomYDomain.set(panNumericDomain(pan.yDomain, fullY, deltaY));\n }\n }\n\n protected onPointerUp(event?: PointerEvent): void {\n if (event && this.activePointerId() !== event.pointerId) {\n return;\n }\n if (this.mode() === 'category-brush' && this.categorical) {\n const range = this.categorical.brushRange();\n if (range && indexRangeSize(range, this.categorical.dataCount()) > 1) {\n this.categorical.zoomRange.set(range);\n }\n this.categorical.brushRange.set(null);\n }\n\n if (this.mode() === 'scatter-brush' && this.scatter) {\n const preview = this.scatterBrush();\n const xScale = this.scatter.xScale();\n const yScale = this.scatter.yScale();\n const fullX = this.scatter.fullXDomain();\n const fullY = this.scatter.fullYDomain();\n if (preview && xScale && yScale && fullX && fullY) {\n const width = Math.abs(preview.current.x - preview.start.x);\n const height = Math.abs(preview.current.y - preview.start.y);\n if (width >= 6 && height >= 6) {\n const nextX = normalizeNumericDomain(xScale.invert(preview.start.x), xScale.invert(preview.current.x));\n const nextY = normalizeNumericDomain(yScale.invert(preview.start.y), yScale.invert(preview.current.y));\n this.scatter.zoomXDomain.set(sameDomain(nextX, fullX) ? null : nextX);\n this.scatter.zoomYDomain.set(sameDomain(nextY, fullY) ? null : nextY);\n }\n }\n this.scatterBrush.set(null);\n }\n\n this.mode.set(null);\n this.categoryStartIndex.set(null);\n this.categoryPanStart.set(null);\n this.scatterPan.set(null);\n if (event && this.hitbox().nativeElement.hasPointerCapture(event.pointerId)) {\n this.hitbox().nativeElement.releasePointerCapture(event.pointerId);\n }\n this.activePointerId.set(null);\n }\n\n protected onPointerCancel(event: PointerEvent): void {\n if (this.activePointerId() !== event.pointerId) {\n return;\n }\n if (this.hitbox().nativeElement.hasPointerCapture(event.pointerId)) {\n this.hitbox().nativeElement.releasePointerCapture(event.pointerId);\n }\n this.mode.set(null);\n this.categorical?.brushRange.set(null);\n this.scatterBrush.set(null);\n this.categoryStartIndex.set(null);\n this.categoryPanStart.set(null);\n this.scatterPan.set(null);\n this.activePointerId.set(null);\n }\n\n protected onWheel(event: WheelEvent): void {\n const local = this.localPoint(event);\n if (!local) {\n return;\n }\n event.preventDefault();\n\n if (this.scatter) {\n const xScale = this.scatter.xScale();\n const yScale = this.scatter.yScale();\n const fullX = this.scatter.fullXDomain();\n const fullY = this.scatter.fullYDomain();\n if (!xScale || !yScale || !fullX || !fullY) {\n return;\n }\n const factor = event.deltaY < 0 ? 0.8 : 1.25;\n const currentX = this.scatter.zoomXDomain() ?? fullX;\n const currentY = this.scatter.zoomYDomain() ?? fullY;\n const nextX = zoomNumericDomain(currentX, fullX, xScale.invert(local.x), factor);\n const nextY = zoomNumericDomain(currentY, fullY, yScale.invert(local.y), factor);\n this.scatter.zoomXDomain.set(sameDomain(nextX, fullX) ? null : nextX);\n this.scatter.zoomYDomain.set(sameDomain(nextY, fullY) ? null : nextY);\n return;\n }\n\n if (!this.cart || !this.categorical) {\n return;\n }\n const visibleIndex = nearestCategoryIndex(\n {\n categoryScale: this.cart.categoryScale,\n categories: this.cart.categories,\n orientation: this.cart.orientation,\n },\n local.x,\n local.y,\n );\n if (visibleIndex < 0) {\n return;\n }\n const anchor = (this.categorical.zoomRange()?.startIndex ?? 0) + visibleIndex;\n const factor = event.deltaY < 0 ? 0.75 : 1.25;\n this.categorical.zoomRange.set(\n zoomIndexRange(this.categorical.zoomRange(), this.categorical.dataCount(), anchor, factor),\n );\n this.categorical.brushRange.set(null);\n }\n\n protected resetZoom(): void {\n this.categorical?.resetZoom();\n this.scatter?.resetZoom();\n this.scatterBrush.set(null);\n }\n\n private onScatterPointerDown(event: PointerEvent, local: LocalPoint): void {\n const fullX = this.scatter?.fullXDomain();\n const fullY = this.scatter?.fullYDomain();\n if (!this.scatter || !fullX || !fullY) {\n return;\n }\n\n if (event.pointerType === 'touch' && this.scatter.hasZoom()) {\n this.mode.set('scatter-pan');\n this.scatterPan.set({\n start: local,\n xDomain: this.scatter.zoomXDomain() ?? fullX,\n yDomain: this.scatter.zoomYDomain() ?? fullY,\n });\n return;\n }\n\n this.mode.set('scatter-brush');\n this.scatterBrush.set({ start: local, current: local });\n }\n\n private localPoint(event: { clientX: number; clientY: number }): LocalPoint | null {\n const hitbox = this.hitbox()?.nativeElement;\n const width = this.width();\n const height = this.height();\n if (!hitbox || width <= 0 || height <= 0) {\n return null;\n }\n const rect = hitbox.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return null;\n }\n return {\n x: clamp(((event.clientX - rect.left) / rect.width) * width, 0, width),\n y: clamp(((event.clientY - rect.top) / rect.height) * height, 0, height),\n };\n }\n\n private pointerAxis(local: LocalPoint): number {\n return this.cart?.orientation() === 'horizontal' ? local.y : local.x;\n }\n}\n","import { Directive, inject } from '@angular/core';\nimport { ChartContext } from '@ojiepermana/angular-chart/core';\nimport { CartesianContext } from '@ojiepermana/angular-chart/core';\nimport { nearestCategoryIndex } from '@ojiepermana/angular-chart/core';\nimport { CategoricalViewportContext } from '@ojiepermana/angular-chart/core';\n\n/**\n * Attach to a chart's `<svg:svg>` to publish pointer-driven active-point\n * state into the surrounding `ChartContext`.\n *\n * Computes the local (x, y) of the pointer relative to the inner plotting\n * area, resolves the nearest category, and updates\n * `ChartContext.activePoint`. Clears it on `pointerleave`.\n */\n@Directive({\n selector: 'svg:svg[ChartPointerTracker]',\n host: {\n '(pointermove)': 'onMove($event)',\n '(pointerleave)': 'onLeave()',\n },\n})\nexport class ChartPointerTracker {\n private readonly root = inject(ChartContext);\n private readonly cart = inject(CartesianContext);\n private readonly viewport = inject(CategoricalViewportContext, { optional: true });\n\n protected onMove(event: PointerEvent): void {\n const target = event.currentTarget as SVGSVGElement | null;\n if (!target) return;\n const rect = target.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n\n const { width, height } = this.root.dimensions();\n // Map client coords → viewBox coords (SVG uses `0 0 width height`,\n // preserveAspectRatio=\"none\" so axes scale independently).\n const scaleX = width / rect.width;\n const scaleY = height / rect.height;\n const viewX = (event.clientX - rect.left) * scaleX;\n const viewY = (event.clientY - rect.top) * scaleY;\n\n const margin = this.cart.margin();\n const localX = viewX - margin.left;\n const localY = viewY - margin.top;\n\n const index = nearestCategoryIndex(\n {\n categoryScale: this.cart.categoryScale,\n categories: this.cart.categories,\n orientation: this.cart.orientation,\n },\n localX,\n localY,\n );\n if (index < 0) {\n this.root.activePoint.set(null);\n return;\n }\n this.root.activePoint.set({\n index,\n datumIndex: (this.viewport?.zoomRange()?.startIndex ?? 0) + index,\n clientX: event.clientX,\n clientY: event.clientY,\n });\n }\n\n protected onLeave(): void {\n this.root.activePoint.set(null);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n TemplateRef,\n type Type,\n computed,\n contentChild,\n inject,\n input,\n} from '@angular/core';\nimport { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport { ChartContext } from '@ojiepermana/angular-chart/core';\nimport type { ChartDatum } from '@ojiepermana/angular-chart/core';\nimport { seriesColorVar } from '@ojiepermana/angular-chart/core';\n\n/** Row of data fed to tooltip templates. */\nexport interface ChartTooltipRow {\n readonly seriesKey: string;\n readonly label: string;\n readonly value: unknown;\n readonly color: string;\n readonly icon?: Type<unknown>;\n}\n\n/** Payload available to a user-supplied tooltip template. */\nexport interface ChartTooltipPayload {\n readonly category: string;\n readonly datum: ChartDatum;\n readonly rows: readonly ChartTooltipRow[];\n}\n\n/** Indicator rendered beside each tooltip row. */\nexport type ChartTooltipIndicator = 'dot' | 'line' | 'dashed' | 'none';\n\n/** Signature for the per-row value formatter (string output). */\nexport type ChartTooltipValueFormatter = (value: unknown, row: ChartTooltipRow, payload: ChartTooltipPayload) => string;\n\n/** Signature for the tooltip header (label) formatter. */\nexport type ChartTooltipLabelFormatter = (label: string, payload: ChartTooltipPayload) => string;\n\n/** Locate the chart container DOM in order to position the tooltip. */\nfunction containerRect(el: HTMLElement): DOMRect | null {\n // Climb to the nearest `[data-chart]` (the ChartContainer host).\n let node: HTMLElement | null = el;\n while (node && !node.hasAttribute('data-chart')) {\n node = node.parentElement;\n }\n return node?.getBoundingClientRect() ?? null;\n}\n\n/**\n * Tooltip overlay — renders the default tooltip card (or a user-supplied\n * template) anchored to the currently active data point.\n *\n * Shadcn-compatible knobs:\n * - `indicator=\"line\"` / `\"none\"` / `\"dashed\"` — swap the row glyph\n * - `hideLabel` — drop the header row\n * - `label=\"Activities\"` — override the header text\n * - `labelKey=\"activities\"` — resolve the header from `config[labelKey].label`\n * - `labelFormatter` — transform the header (e.g. ISO date → long date)\n * - `formatter` — format per-row values (e.g. `\"380 kcal\"`)\n * - `valueKey` — for pie/radial/radar, read row value from a single field\n * - Icons are picked up automatically from `config[key].icon`.\n */\n@Component({\n selector: 'ChartTooltip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, NgComponentOutlet],\n host: {\n class: 'pointer-events-none absolute inset-0 z-10',\n '[attr.aria-hidden]': '!visible()',\n },\n template: `\n @if (payload(); as p) {\n <div\n role=\"tooltip\"\n class=\"pointer-events-none absolute grid min-w-32 max-w-72 -translate-x-1/2 -translate-y-full gap-1.5 rounded-lg border border-[hsl(var(--border)/var(--opacity-60))] bg-background px-3 py-1.5 text-xs shadow-md\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\">\n @if (customTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl; context: { $implicit: p }\" />\n } @else {\n @if (!hideLabel() && headerText(p); as header) {\n <div class=\"font-medium\">{{ header }}</div>\n }\n <ul class=\"grid gap-1.5\">\n @for (row of p.rows; track row.seriesKey) {\n <li class=\"flex w-full flex-wrap items-stretch gap-2\">\n <span class=\"flex flex-1 items-center gap-1.5\">\n @switch (indicator()) {\n @case ('dot') {\n <span\n class=\"h-2.5 w-2.5 shrink-0 rounded-sm\"\n [style.background]=\"row.color\"\n [style.borderColor]=\"row.color\"></span>\n }\n @case ('line') {\n <span class=\"h-full min-h-4 w-1 shrink-0 rounded-sm\" [style.background]=\"row.color\"></span>\n }\n @case ('dashed') {\n <span\n class=\"h-0 w-3 shrink-0 self-center border-t-2 border-dashed\"\n [style.borderColor]=\"row.color\"></span>\n }\n }\n @if (row.icon; as icon) {\n <span class=\"mr-1 inline-flex items-center text-muted-foreground\">\n <ng-container *ngComponentOutlet=\"icon\" />\n </span>\n }\n <span class=\"text-muted-foreground\">{{ row.label }}</span>\n </span>\n <span class=\"font-mono font-medium tabular-nums text-foreground\">\n {{ formatRow(row, p) }}\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n <!-- Live region — announces category changes to AT. -->\n <div class=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n @if (payload(); as p) {\n {{ p.category }}\n }\n </div>\n `,\n})\nexport class ChartTooltip {\n private readonly root = inject(ChartContext);\n private readonly host = inject(ElementRef<HTMLElement>);\n\n /** Data key on each datum whose value is the category label (x-axis). */\n readonly xKey = input<string | null>(null);\n /** Data source (optional — if omitted tooltip reads from chart data via activePoint.datumIndex). */\n readonly data = input<readonly ChartDatum[] | null>(null);\n /**\n * Optional key for per-datum value lookup (pie / radial / radar datasets\n * store values on a single field like `visitors` instead of one field per\n * series). When set and `activePoint.seriesKey` is active, the tooltip row\n * reads `datum[valueKey]` for its value.\n */\n readonly valueKey = input<string | null>(null);\n\n /** Indicator variant next to each row. Default `'dot'`. */\n readonly indicator = input<ChartTooltipIndicator>('dot');\n /** Hide the header label entirely. */\n readonly hideLabel = input<boolean>(false);\n /** Override the header label with a fixed string. Takes precedence over `labelKey`. */\n readonly label = input<string | null>(null);\n /**\n * Resolve the header label from `config[labelKey].label`. Useful when the\n * header should come from a config entry rather than the datum itself\n * (shadcn's \"Custom label\" variant).\n */\n readonly labelKey = input<string | null>(null);\n /** Transform the final header string (e.g. ISO date → long date). */\n readonly labelFormatter = input<ChartTooltipLabelFormatter | null>(null);\n /** Format each row's value (return string — HTML is not interpreted). */\n readonly formatter = input<ChartTooltipValueFormatter | null>(null);\n\n readonly customTpl = contentChild(TemplateRef<{ $implicit: ChartTooltipPayload }>);\n\n protected readonly visible = computed(() => this.root.activePoint() !== null);\n\n protected readonly payload = computed<ChartTooltipPayload | null>(() => {\n const active = this.root.activePoint();\n const rows = this.data();\n if (!active || !rows) return null;\n const dataIndex = active.datumIndex != null && active.datumIndex < rows.length ? active.datumIndex : active.index;\n if (dataIndex < 0 || dataIndex >= rows.length) return null;\n const cfg = this.root.config();\n const visibleKeys = this.root.visibleSeriesKeys();\n const datum = rows[dataIndex];\n const xKey = this.xKey();\n const category = xKey && xKey in datum ? String(datum[xKey]) : String(active.index);\n\n // When the active point targets a single series (pie/radial/radar hover),\n // collapse the tooltip to just that row.\n const activeSeriesKey = active.seriesKey && visibleKeys.includes(active.seriesKey) ? active.seriesKey : null;\n const keys = activeSeriesKey ? [activeSeriesKey] : visibleKeys;\n const valueKey = this.valueKey();\n\n const tooltipRows: ChartTooltipRow[] = keys.map((k) => {\n // For single-slice hover on pie/radial/radar the value lives on a\n // shared `valueKey` field, not on a per-series column.\n const rawValue = valueKey != null && activeSeriesKey === k ? datum[valueKey] : datum[k];\n return {\n seriesKey: k,\n label: cfg[k]?.label ?? k,\n value: rawValue,\n color: seriesColorVar(k),\n icon: cfg[k]?.icon,\n };\n });\n return { category, datum, rows: tooltipRows };\n });\n\n /** Resolve the header string honoring `label`, `labelKey`, then `labelFormatter`. */\n protected headerText(p: ChartTooltipPayload): string | null {\n if (this.hideLabel()) return null;\n const override = this.label();\n const labelKey = this.labelKey();\n const cfg = this.root.config();\n const fromKey = labelKey ? (cfg[labelKey]?.label ?? labelKey) : null;\n const raw = override ?? fromKey ?? p.category;\n const fmt = this.labelFormatter();\n return fmt ? fmt(raw, p) : raw;\n }\n\n /** Apply per-row value formatter (or stringify). */\n protected formatRow(row: ChartTooltipRow, p: ChartTooltipPayload): string {\n const fmt = this.formatter();\n if (fmt) return fmt(row.value, row, p);\n return row.value == null ? '' : String(row.value);\n }\n\n protected readonly position = computed(() => {\n const active = this.root.activePoint();\n if (!active || active.clientX == null || active.clientY == null) {\n return { x: 0, y: 0 };\n }\n // Map client coords → offset within the chart container (the element\n // marked with `data-chart`, which is our positioning ancestor).\n const rect = containerRect(this.host.nativeElement);\n if (!rect) return { x: 0, y: 0 };\n\n const tooltip = this.host.nativeElement.querySelector('[role=\"tooltip\"]') as HTMLElement | null;\n const tooltipWidth = tooltip?.offsetWidth ?? 128;\n const tooltipHeight = tooltip?.offsetHeight ?? 0;\n const padding = 8;\n\n const minX = padding + tooltipWidth / 2;\n const maxX = Math.max(minX, rect.width - padding - tooltipWidth / 2);\n const x = Math.min(maxX, Math.max(minX, active.clientX - rect.left));\n\n // Y is the tooltip's bottom edge because the card is translated upward.\n const minY = padding + tooltipHeight;\n const y = Math.max(minY, active.clientY - rect.top - padding);\n\n return { x, y };\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { ChartContext } from '@ojiepermana/angular-chart/core';\nimport { seriesColorVar } from '@ojiepermana/angular-chart/core';\n\n/**\n * Legend — renders a list of series swatches. Clicking an item toggles\n * visibility via `ChartContext.toggleSeries`.\n *\n * Place as a child of `<Chart>`:\n * ```html\n * <Chart [config]=\"cfg\">\n * <ChartBar ... />\n * <ChartLegend />\n * </Chart>\n * ```\n */\n@Component({\n selector: 'ChartLegend',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block pt-3' },\n template: `\n <ul class=\"flex flex-wrap items-center justify-center gap-3 text-xs\" aria-label=\"Toggle chart series visibility\">\n @for (item of items(); track item.seriesKey) {\n <li>\n <button\n type=\"button\"\n class=\"inline-flex min-h-11 items-center gap-2 rounded-md px-2.5 py-1.5 outline-none transition-opacity focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n [class.opacity-50]=\"item.hidden\"\n [attr.aria-pressed]=\"!item.hidden\"\n [attr.aria-label]=\"(item.hidden ? 'Show ' : 'Hide ') + item.label\"\n (click)=\"toggle(item.seriesKey)\">\n <span class=\"inline-block h-2.5 w-2.5 rounded-sm\" [style.background]=\"item.color\"></span>\n <span class=\"text-muted-foreground\">{{ item.label }}</span>\n </button>\n </li>\n }\n </ul>\n `,\n})\nexport class ChartLegend {\n private readonly root = inject(ChartContext);\n\n protected readonly items = computed(() => {\n const cfg = this.root.config();\n const hidden = this.root.hiddenSeries();\n return this.root.seriesKeys().map((key) => ({\n seriesKey: key,\n label: cfg[key]?.label ?? key,\n color: seriesColorVar(key),\n hidden: hidden.has(key),\n }));\n });\n\n protected toggle(key: string): void {\n this.root.toggleSeries(key);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { CategoricalViewportContext } from '@ojiepermana/angular-chart/core';\nimport { ScatterViewportContext } from '@ojiepermana/angular-chart/core';\n\nfunction formatNumber(value: number): string {\n return Math.abs(value) >= 10 ? value.toFixed(0) : value.toFixed(1);\n}\n\n@Component({\n selector: 'ChartZoomControls',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mt-3 flex flex-wrap items-center justify-between gap-3 text-xs text-muted-foreground' },\n template: `\n <p>{{ hint() }}</p>\n\n @if (status(); as currentStatus) {\n <div class=\"flex flex-wrap items-center gap-2\">\n <span class=\"rounded-full border border-border bg-background px-2.5 py-1 font-medium text-foreground\">\n {{ currentStatus }}\n </span>\n <button\n type=\"button\"\n class=\"inline-flex min-h-11 items-center rounded-md border border-border bg-background px-3 text-foreground transition-colors hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n (click)=\"resetZoom()\">\n Reset zoom\n </button>\n </div>\n }\n `,\n})\nexport class ChartZoomControls {\n private readonly categorical = inject(CategoricalViewportContext, { optional: true });\n private readonly scatter = inject(ScatterViewportContext, { optional: true });\n\n protected readonly status = computed(() => {\n if (this.categorical?.hasZoom()) {\n const range = this.categorical.zoomRange();\n const count = this.categorical.dataCount();\n if (!range) {\n return null;\n }\n return `Showing ${range.startIndex + 1}-${range.endIndex + 1} of ${count}`;\n }\n\n if (this.scatter?.hasZoom()) {\n const xDomain = this.scatter.zoomXDomain() ?? this.scatter.fullXDomain();\n const yDomain = this.scatter.zoomYDomain() ?? this.scatter.fullYDomain();\n if (!xDomain || !yDomain) {\n return null;\n }\n return `X ${formatNumber(xDomain[0])}-${formatNumber(xDomain[1])} · Y ${formatNumber(yDomain[0])}-${formatNumber(yDomain[1])}`;\n }\n\n return null;\n });\n\n protected readonly hint = computed(() => {\n if (this.scatter) {\n return 'Drag to brush a region. Use the wheel to zoom and one-finger touch drag to pan while zoomed.';\n }\n return 'Drag to select a category range. Use the wheel to zoom and one-finger touch drag to pan while zoomed.';\n });\n\n protected resetZoom(): void {\n this.categorical?.resetZoom();\n this.scatter?.resetZoom();\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'ChartPieCenter',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'flex max-w-[10rem] flex-col items-center justify-center text-center',\n },\n template: `<ng-content />`,\n})\nexport class PieCenter {}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'ChartRadialCenter',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'flex max-w-[10rem] flex-col items-center justify-center text-center',\n },\n template: `<ng-content />`,\n})\nexport class RadialCenter {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,329 @@
1
+ import { curveCardinalClosed, curveLinearClosed, lineRadial } from 'd3-shape';
2
+ import { max } from 'd3-array';
3
+ import { seriesColorVar, ChartContext } from '@ojiepermana/angular-chart/core';
4
+ import * as i0 from '@angular/core';
5
+ import { inject, input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
6
+
7
+ function computeRadarLayout(input) {
8
+ const { data, axisKey, seriesKeys, innerWidth, innerHeight, levels, curve, grid } = input;
9
+ const radius = Math.max(0, Math.min(innerWidth, innerHeight) / 2);
10
+ const centerX = innerWidth / 2;
11
+ const centerY = innerHeight / 2;
12
+ if (data.length === 0 || seriesKeys.length === 0 || radius === 0) {
13
+ return { centerX, centerY, radius, axes: [], levels: [], maxValue: 0, series: [], grid };
14
+ }
15
+ const maxValue = input.maxValue ?? max(data, (d) => max(seriesKeys, (k) => Number(d[k] ?? 0)) ?? 0) ?? 1;
16
+ const safeMaxValue = maxValue > 0 ? maxValue : 1;
17
+ const angleStep = (2 * Math.PI) / data.length;
18
+ const angleFor = (i) => i * angleStep - Math.PI / 2;
19
+ const axes = data.map((d, i) => {
20
+ const angle = angleFor(i);
21
+ return {
22
+ name: String(d[axisKey] ?? i),
23
+ angle,
24
+ x: Math.cos(angle) * radius,
25
+ y: Math.sin(angle) * radius,
26
+ };
27
+ });
28
+ const levelValues = Array.from({ length: levels }, (_, index) => {
29
+ const value = ((index + 1) / levels) * safeMaxValue;
30
+ const levelRadius = ((index + 1) / levels) * radius;
31
+ return {
32
+ value,
33
+ radius: levelRadius,
34
+ path: polygonPath(axes.map((axis) => ({
35
+ x: Math.cos(axis.angle) * levelRadius,
36
+ y: Math.sin(axis.angle) * levelRadius,
37
+ }))),
38
+ };
39
+ });
40
+ const curveFactory = curve === 'cardinal' ? curveCardinalClosed : curveLinearClosed;
41
+ const radial = lineRadial()
42
+ .angle((point) => point.angle + Math.PI / 2)
43
+ .radius((point) => (point.value / safeMaxValue) * radius)
44
+ .curve(curveFactory);
45
+ const series = seriesKeys.map((seriesKey) => {
46
+ const points = data.map((datum, index) => {
47
+ const value = Number(datum[seriesKey] ?? 0);
48
+ const angle = angleFor(index);
49
+ const pointRadius = (value / safeMaxValue) * radius;
50
+ return {
51
+ axis: String(datum[axisKey] ?? index),
52
+ value,
53
+ x: Math.cos(angle) * pointRadius,
54
+ y: Math.sin(angle) * pointRadius,
55
+ };
56
+ });
57
+ return {
58
+ seriesKey,
59
+ color: seriesColorVar(seriesKey),
60
+ path: radial(data.map((datum, index) => ({ angle: angleFor(index), value: Number(datum[seriesKey] ?? 0) }))) ?? '',
61
+ points,
62
+ };
63
+ });
64
+ return { centerX, centerY, radius, axes, levels: levelValues, maxValue: safeMaxValue, series, grid };
65
+ }
66
+ function polygonPath(points) {
67
+ if (points.length === 0) {
68
+ return '';
69
+ }
70
+ const [first, ...rest] = points;
71
+ return `M ${first.x} ${first.y} ${rest.map((point) => `L ${point.x} ${point.y}`).join(' ')} Z`;
72
+ }
73
+
74
+ const DEFAULT_MARGIN = { top: 24, right: 24, bottom: 24, left: 24 };
75
+ class RadarChart {
76
+ root = inject(ChartContext);
77
+ data = input.required(/* @ts-ignore */
78
+ ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
79
+ axisKey = input.required(/* @ts-ignore */
80
+ ...(ngDevMode ? [{ debugName: "axisKey" }] : /* istanbul ignore next */ []));
81
+ styles = input('base', /* @ts-ignore */
82
+ ...(ngDevMode ? [{ debugName: "styles" }] : /* istanbul ignore next */ []));
83
+ margin = input(DEFAULT_MARGIN, /* @ts-ignore */
84
+ ...(ngDevMode ? [{ debugName: "margin" }] : /* istanbul ignore next */ []));
85
+ curve = input('linear', /* @ts-ignore */
86
+ ...(ngDevMode ? [{ debugName: "curve" }] : /* istanbul ignore next */ []));
87
+ levels = input(4, /* @ts-ignore */
88
+ ...(ngDevMode ? [{ debugName: "levels" }] : /* istanbul ignore next */ []));
89
+ maxValue = input(undefined, /* @ts-ignore */
90
+ ...(ngDevMode ? [{ debugName: "maxValue" }] : /* istanbul ignore next */ []));
91
+ strokeWidth = input(2, /* @ts-ignore */
92
+ ...(ngDevMode ? [{ debugName: "strokeWidth" }] : /* istanbul ignore next */ []));
93
+ fillOpacity = input(0.2, /* @ts-ignore */
94
+ ...(ngDevMode ? [{ debugName: "fillOpacity" }] : /* istanbul ignore next */ []));
95
+ showLabels = input(true, /* @ts-ignore */
96
+ ...(ngDevMode ? [{ debugName: "showLabels" }] : /* istanbul ignore next */ []));
97
+ showDots = input(true, /* @ts-ignore */
98
+ ...(ngDevMode ? [{ debugName: "showDots" }] : /* istanbul ignore next */ []));
99
+ dotRadius = input(3, /* @ts-ignore */
100
+ ...(ngDevMode ? [{ debugName: "dotRadius" }] : /* istanbul ignore next */ []));
101
+ grid = input('circle', /* @ts-ignore */
102
+ ...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
103
+ gridFilled = input(false, /* @ts-ignore */
104
+ ...(ngDevMode ? [{ debugName: "gridFilled" }] : /* istanbul ignore next */ []));
105
+ showAxes = input(true, /* @ts-ignore */
106
+ ...(ngDevMode ? [{ debugName: "showAxes" }] : /* istanbul ignore next */ []));
107
+ linesOnly = input(false, /* @ts-ignore */
108
+ ...(ngDevMode ? [{ debugName: "linesOnly" }] : /* istanbul ignore next */ []));
109
+ innerWidth = computed(() => Math.max(0, this.root.dimensions().width - this.margin().left - this.margin().right), /* @ts-ignore */
110
+ ...(ngDevMode ? [{ debugName: "innerWidth" }] : /* istanbul ignore next */ []));
111
+ innerHeight = computed(() => Math.max(0, this.root.dimensions().height - this.margin().top - this.margin().bottom), /* @ts-ignore */
112
+ ...(ngDevMode ? [{ debugName: "innerHeight" }] : /* istanbul ignore next */ []));
113
+ layout = computed(() => computeRadarLayout({
114
+ data: this.data(),
115
+ axisKey: this.axisKey(),
116
+ seriesKeys: this.root.visibleSeriesKeys(),
117
+ innerWidth: this.innerWidth(),
118
+ innerHeight: this.innerHeight(),
119
+ maxValue: this.maxValue(),
120
+ levels: this.levels(),
121
+ curve: this.curve(),
122
+ grid: this.grid(),
123
+ }), /* @ts-ignore */
124
+ ...(ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []));
125
+ viewBox = computed(() => {
126
+ const { width, height } = this.root.dimensions();
127
+ return `0 0 ${Math.max(0, width)} ${Math.max(0, height)}`;
128
+ }, /* @ts-ignore */
129
+ ...(ngDevMode ? [{ debugName: "viewBox" }] : /* istanbul ignore next */ []));
130
+ innerTransform = computed(() => `translate(${this.margin().left},${this.margin().top})`, /* @ts-ignore */
131
+ ...(ngDevMode ? [{ debugName: "innerTransform" }] : /* istanbul ignore next */ []));
132
+ ariaSummary = computed(() => {
133
+ const keys = this.root.visibleSeriesKeys();
134
+ return `Radar chart, ${this.data().length} axes, ${keys.length} series.`;
135
+ }, /* @ts-ignore */
136
+ ...(ngDevMode ? [{ debugName: "ariaSummary" }] : /* istanbul ignore next */ []));
137
+ gridFill() {
138
+ return this.gridFilled() ? 'hsl(var(--muted))' : 'none';
139
+ }
140
+ gridFillOpacity(levelIndex) {
141
+ return this.gridFilled() ? Math.max(0.06, 0.18 - levelIndex * 0.02) : null;
142
+ }
143
+ dotAriaLabel(seriesKey, p) {
144
+ const label = this.root.config()[seriesKey]?.label ?? seriesKey;
145
+ return `${label} at ${p.axis}: ${p.value}`;
146
+ }
147
+ setActive(event, seriesKey, index) {
148
+ const clientX = event instanceof PointerEvent ? event.clientX : event.target.getBoundingClientRect().left;
149
+ const clientY = event instanceof PointerEvent ? event.clientY : event.target.getBoundingClientRect().top;
150
+ this.root.activePoint.set({ index, datumIndex: index, seriesKey, clientX, clientY });
151
+ }
152
+ clearActive() {
153
+ this.root.activePoint.set(null);
154
+ }
155
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RadarChart, deps: [], target: i0.ɵɵFactoryTarget.Component });
156
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: RadarChart, isStandalone: true, selector: "ChartRadar", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, axisKey: { classPropertyName: "axisKey", publicName: "axisKey", isSignal: true, isRequired: true, transformFunction: null }, styles: { classPropertyName: "styles", publicName: "styles", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, curve: { classPropertyName: "curve", publicName: "curve", isSignal: true, isRequired: false, transformFunction: null }, levels: { classPropertyName: "levels", publicName: "levels", isSignal: true, isRequired: false, transformFunction: null }, maxValue: { classPropertyName: "maxValue", publicName: "maxValue", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, fillOpacity: { classPropertyName: "fillOpacity", publicName: "fillOpacity", isSignal: true, isRequired: false, transformFunction: null }, showLabels: { classPropertyName: "showLabels", publicName: "showLabels", isSignal: true, isRequired: false, transformFunction: null }, showDots: { classPropertyName: "showDots", publicName: "showDots", isSignal: true, isRequired: false, transformFunction: null }, dotRadius: { classPropertyName: "dotRadius", publicName: "dotRadius", isSignal: true, isRequired: false, transformFunction: null }, grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: false, transformFunction: null }, gridFilled: { classPropertyName: "gridFilled", publicName: "gridFilled", isSignal: true, isRequired: false, transformFunction: null }, showAxes: { classPropertyName: "showAxes", publicName: "showAxes", isSignal: true, isRequired: false, transformFunction: null }, linesOnly: { classPropertyName: "linesOnly", publicName: "linesOnly", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-style": "styles()" }, classAttribute: "relative block h-full w-full" }, ngImport: i0, template: `
157
+ <svg:svg
158
+ class="block h-full w-full overflow-visible"
159
+ [attr.viewBox]="viewBox()"
160
+ preserveAspectRatio="xMidYMid meet"
161
+ role="img"
162
+ [attr.aria-label]="ariaSummary()">
163
+ <svg:g [attr.transform]="innerTransform()">
164
+ <svg:g class="chart-radar" [attr.transform]="'translate(' + layout().centerX + ',' + layout().centerY + ')'">
165
+ @if (layout().grid !== 'none') {
166
+ @for (level of layout().levels; track level.value; let levelIndex = $index) {
167
+ @if (layout().grid === 'circle') {
168
+ <svg:circle
169
+ class="chart-radar-level stroke-border"
170
+ [attr.fill]="gridFill()"
171
+ [attr.fill-opacity]="gridFillOpacity(levelIndex)"
172
+ stroke-dasharray="2 2"
173
+ cx="0"
174
+ cy="0"
175
+ [attr.r]="level.radius" />
176
+ } @else {
177
+ <svg:path
178
+ class="chart-radar-level stroke-border"
179
+ [attr.d]="level.path"
180
+ [attr.fill]="gridFill()"
181
+ [attr.fill-opacity]="gridFillOpacity(levelIndex)"
182
+ stroke-dasharray="2 2" />
183
+ }
184
+ }
185
+ }
186
+ @if (showAxes()) {
187
+ @for (axis of layout().axes; track axis.name) {
188
+ <svg:line class="chart-radar-axis stroke-border" x1="0" y1="0" [attr.x2]="axis.x" [attr.y2]="axis.y" />
189
+ @if (showLabels()) {
190
+ <svg:text
191
+ class="chart-radar-axis-label fill-muted-foreground text-2xs"
192
+ text-anchor="middle"
193
+ dominant-baseline="middle"
194
+ [attr.x]="axis.x * 1.12"
195
+ [attr.y]="axis.y * 1.12">
196
+ {{ axis.name }}
197
+ </svg:text>
198
+ }
199
+ }
200
+ }
201
+ @for (s of layout().series; track s.seriesKey) {
202
+ <svg:path
203
+ class="chart-radar-series"
204
+ [attr.d]="s.path"
205
+ [attr.stroke]="s.color"
206
+ [attr.fill]="linesOnly() ? 'none' : s.color"
207
+ [attr.fill-opacity]="linesOnly() ? null : fillOpacity()"
208
+ [attr.stroke-width]="strokeWidth()"
209
+ stroke-linejoin="round" />
210
+ @if (showDots()) {
211
+ @for (p of s.points; track p.axis; let i = $index) {
212
+ <svg:circle
213
+ class="chart-radar-dot cursor-pointer"
214
+ [attr.cx]="p.x"
215
+ [attr.cy]="p.y"
216
+ [attr.r]="dotRadius()"
217
+ [attr.fill]="s.color"
218
+ tabindex="0"
219
+ [attr.aria-label]="dotAriaLabel(s.seriesKey, p)"
220
+ (pointerenter)="setActive($event, s.seriesKey, i)"
221
+ (pointermove)="setActive($event, s.seriesKey, i)"
222
+ (pointerleave)="clearActive()"
223
+ (focus)="setActive($event, s.seriesKey, i)"
224
+ (blur)="clearActive()" />
225
+ }
226
+ }
227
+ }
228
+ </svg:g>
229
+ <ng-content />
230
+ </svg:g>
231
+ </svg:svg>
232
+ <ng-content select="ChartTooltip" />
233
+ <ng-content select="ChartLegend" />
234
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
235
+ }
236
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RadarChart, decorators: [{
237
+ type: Component,
238
+ args: [{
239
+ selector: 'ChartRadar',
240
+ changeDetection: ChangeDetectionStrategy.OnPush,
241
+ host: { class: 'relative block h-full w-full', '[attr.data-style]': 'styles()' },
242
+ template: `
243
+ <svg:svg
244
+ class="block h-full w-full overflow-visible"
245
+ [attr.viewBox]="viewBox()"
246
+ preserveAspectRatio="xMidYMid meet"
247
+ role="img"
248
+ [attr.aria-label]="ariaSummary()">
249
+ <svg:g [attr.transform]="innerTransform()">
250
+ <svg:g class="chart-radar" [attr.transform]="'translate(' + layout().centerX + ',' + layout().centerY + ')'">
251
+ @if (layout().grid !== 'none') {
252
+ @for (level of layout().levels; track level.value; let levelIndex = $index) {
253
+ @if (layout().grid === 'circle') {
254
+ <svg:circle
255
+ class="chart-radar-level stroke-border"
256
+ [attr.fill]="gridFill()"
257
+ [attr.fill-opacity]="gridFillOpacity(levelIndex)"
258
+ stroke-dasharray="2 2"
259
+ cx="0"
260
+ cy="0"
261
+ [attr.r]="level.radius" />
262
+ } @else {
263
+ <svg:path
264
+ class="chart-radar-level stroke-border"
265
+ [attr.d]="level.path"
266
+ [attr.fill]="gridFill()"
267
+ [attr.fill-opacity]="gridFillOpacity(levelIndex)"
268
+ stroke-dasharray="2 2" />
269
+ }
270
+ }
271
+ }
272
+ @if (showAxes()) {
273
+ @for (axis of layout().axes; track axis.name) {
274
+ <svg:line class="chart-radar-axis stroke-border" x1="0" y1="0" [attr.x2]="axis.x" [attr.y2]="axis.y" />
275
+ @if (showLabels()) {
276
+ <svg:text
277
+ class="chart-radar-axis-label fill-muted-foreground text-2xs"
278
+ text-anchor="middle"
279
+ dominant-baseline="middle"
280
+ [attr.x]="axis.x * 1.12"
281
+ [attr.y]="axis.y * 1.12">
282
+ {{ axis.name }}
283
+ </svg:text>
284
+ }
285
+ }
286
+ }
287
+ @for (s of layout().series; track s.seriesKey) {
288
+ <svg:path
289
+ class="chart-radar-series"
290
+ [attr.d]="s.path"
291
+ [attr.stroke]="s.color"
292
+ [attr.fill]="linesOnly() ? 'none' : s.color"
293
+ [attr.fill-opacity]="linesOnly() ? null : fillOpacity()"
294
+ [attr.stroke-width]="strokeWidth()"
295
+ stroke-linejoin="round" />
296
+ @if (showDots()) {
297
+ @for (p of s.points; track p.axis; let i = $index) {
298
+ <svg:circle
299
+ class="chart-radar-dot cursor-pointer"
300
+ [attr.cx]="p.x"
301
+ [attr.cy]="p.y"
302
+ [attr.r]="dotRadius()"
303
+ [attr.fill]="s.color"
304
+ tabindex="0"
305
+ [attr.aria-label]="dotAriaLabel(s.seriesKey, p)"
306
+ (pointerenter)="setActive($event, s.seriesKey, i)"
307
+ (pointermove)="setActive($event, s.seriesKey, i)"
308
+ (pointerleave)="clearActive()"
309
+ (focus)="setActive($event, s.seriesKey, i)"
310
+ (blur)="clearActive()" />
311
+ }
312
+ }
313
+ }
314
+ </svg:g>
315
+ <ng-content />
316
+ </svg:g>
317
+ </svg:svg>
318
+ <ng-content select="ChartTooltip" />
319
+ <ng-content select="ChartLegend" />
320
+ `,
321
+ }]
322
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], axisKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "axisKey", required: true }] }], styles: [{ type: i0.Input, args: [{ isSignal: true, alias: "styles", required: false }] }], margin: [{ type: i0.Input, args: [{ isSignal: true, alias: "margin", required: false }] }], curve: [{ type: i0.Input, args: [{ isSignal: true, alias: "curve", required: false }] }], levels: [{ type: i0.Input, args: [{ isSignal: true, alias: "levels", required: false }] }], maxValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxValue", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], fillOpacity: [{ type: i0.Input, args: [{ isSignal: true, alias: "fillOpacity", required: false }] }], showLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabels", required: false }] }], showDots: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDots", required: false }] }], dotRadius: [{ type: i0.Input, args: [{ isSignal: true, alias: "dotRadius", required: false }] }], grid: [{ type: i0.Input, args: [{ isSignal: true, alias: "grid", required: false }] }], gridFilled: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridFilled", required: false }] }], showAxes: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAxes", required: false }] }], linesOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "linesOnly", required: false }] }] } });
323
+
324
+ /**
325
+ * Generated bundle index. Do not edit.
326
+ */
327
+
328
+ export { RadarChart, computeRadarLayout };
329
+ //# sourceMappingURL=ojiepermana-angular-chart-radar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ojiepermana-angular-chart-radar.mjs","sources":["../../../library/chart/radar/radar-layout.ts","../../../library/chart/radar/radar-chart.ts","../../../library/chart/radar/ojiepermana-angular-chart-radar.ts"],"sourcesContent":["import { lineRadial, curveLinearClosed, curveCardinalClosed } from 'd3-shape';\nimport { max as d3max } from 'd3-array';\nimport type { ChartDatum } from '@ojiepermana/angular-chart/core';\nimport { seriesColorVar } from '@ojiepermana/angular-chart/core';\n\nexport type RadarCurve = 'linear' | 'cardinal';\nexport type RadarGrid = 'polygon' | 'circle' | 'none';\n\nexport interface RadarLayoutInput {\n readonly data: readonly ChartDatum[];\n readonly axisKey: string;\n readonly seriesKeys: readonly string[];\n readonly innerWidth: number;\n readonly innerHeight: number;\n readonly maxValue?: number;\n readonly levels: number;\n readonly curve: RadarCurve;\n readonly grid: RadarGrid;\n}\n\nexport interface RadarAxisInfo {\n readonly name: string;\n readonly angle: number;\n readonly x: number;\n readonly y: number;\n}\n\nexport interface RadarSeries {\n readonly seriesKey: string;\n readonly color: string;\n readonly path: string;\n readonly points: readonly { readonly x: number; readonly y: number; readonly value: number; readonly axis: string }[];\n}\n\nexport interface RadarLevel {\n readonly value: number;\n readonly radius: number;\n readonly path: string;\n}\n\nexport interface RadarLayout {\n readonly centerX: number;\n readonly centerY: number;\n readonly radius: number;\n readonly axes: readonly RadarAxisInfo[];\n readonly levels: readonly RadarLevel[];\n readonly maxValue: number;\n readonly series: readonly RadarSeries[];\n readonly grid: RadarGrid;\n}\n\nexport function computeRadarLayout(input: RadarLayoutInput): RadarLayout {\n const { data, axisKey, seriesKeys, innerWidth, innerHeight, levels, curve, grid } = input;\n const radius = Math.max(0, Math.min(innerWidth, innerHeight) / 2);\n const centerX = innerWidth / 2;\n const centerY = innerHeight / 2;\n\n if (data.length === 0 || seriesKeys.length === 0 || radius === 0) {\n return { centerX, centerY, radius, axes: [], levels: [], maxValue: 0, series: [], grid };\n }\n\n const maxValue = input.maxValue ?? d3max(data, (d) => d3max(seriesKeys, (k) => Number(d[k] ?? 0)) ?? 0) ?? 1;\n const safeMaxValue = maxValue > 0 ? maxValue : 1;\n\n const angleStep = (2 * Math.PI) / data.length;\n const angleFor = (i: number) => i * angleStep - Math.PI / 2;\n\n const axes: RadarAxisInfo[] = data.map((d, i) => {\n const angle = angleFor(i);\n return {\n name: String(d[axisKey] ?? i),\n angle,\n x: Math.cos(angle) * radius,\n y: Math.sin(angle) * radius,\n };\n });\n\n const levelValues: RadarLevel[] = Array.from({ length: levels }, (_, index) => {\n const value = ((index + 1) / levels) * safeMaxValue;\n const levelRadius = ((index + 1) / levels) * radius;\n return {\n value,\n radius: levelRadius,\n path: polygonPath(\n axes.map((axis) => ({\n x: Math.cos(axis.angle) * levelRadius,\n y: Math.sin(axis.angle) * levelRadius,\n })),\n ),\n };\n });\n\n const curveFactory = curve === 'cardinal' ? curveCardinalClosed : curveLinearClosed;\n const radial = lineRadial<{ angle: number; value: number }>()\n .angle((point) => point.angle + Math.PI / 2)\n .radius((point) => (point.value / safeMaxValue) * radius)\n .curve(curveFactory);\n\n const series: RadarSeries[] = seriesKeys.map((seriesKey) => {\n const points = data.map((datum, index) => {\n const value = Number(datum[seriesKey] ?? 0);\n const angle = angleFor(index);\n const pointRadius = (value / safeMaxValue) * radius;\n return {\n axis: String(datum[axisKey] ?? index),\n value,\n x: Math.cos(angle) * pointRadius,\n y: Math.sin(angle) * pointRadius,\n };\n });\n return {\n seriesKey,\n color: seriesColorVar(seriesKey),\n path:\n radial(data.map((datum, index) => ({ angle: angleFor(index), value: Number(datum[seriesKey] ?? 0) }))) ?? '',\n points,\n };\n });\n\n return { centerX, centerY, radius, axes, levels: levelValues, maxValue: safeMaxValue, series, grid };\n}\n\nfunction polygonPath(points: readonly { readonly x: number; readonly y: number }[]): string {\n if (points.length === 0) {\n return '';\n }\n\n const [first, ...rest] = points;\n return `M ${first.x} ${first.y} ${rest.map((point) => `L ${point.x} ${point.y}`).join(' ')} Z`;\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { ChartContext } from '@ojiepermana/angular-chart/core';\nimport type { ChartDatum, ChartMargin, ChartStyleVariant } from '@ojiepermana/angular-chart/core';\nimport { computeRadarLayout, type RadarCurve, type RadarGrid } from './radar-layout';\n\nconst DEFAULT_MARGIN: ChartMargin = { top: 24, right: 24, bottom: 24, left: 24 };\n\n@Component({\n selector: 'ChartRadar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'relative block h-full w-full', '[attr.data-style]': 'styles()' },\n template: `\n <svg:svg\n class=\"block h-full w-full overflow-visible\"\n [attr.viewBox]=\"viewBox()\"\n preserveAspectRatio=\"xMidYMid meet\"\n role=\"img\"\n [attr.aria-label]=\"ariaSummary()\">\n <svg:g [attr.transform]=\"innerTransform()\">\n <svg:g class=\"chart-radar\" [attr.transform]=\"'translate(' + layout().centerX + ',' + layout().centerY + ')'\">\n @if (layout().grid !== 'none') {\n @for (level of layout().levels; track level.value; let levelIndex = $index) {\n @if (layout().grid === 'circle') {\n <svg:circle\n class=\"chart-radar-level stroke-border\"\n [attr.fill]=\"gridFill()\"\n [attr.fill-opacity]=\"gridFillOpacity(levelIndex)\"\n stroke-dasharray=\"2 2\"\n cx=\"0\"\n cy=\"0\"\n [attr.r]=\"level.radius\" />\n } @else {\n <svg:path\n class=\"chart-radar-level stroke-border\"\n [attr.d]=\"level.path\"\n [attr.fill]=\"gridFill()\"\n [attr.fill-opacity]=\"gridFillOpacity(levelIndex)\"\n stroke-dasharray=\"2 2\" />\n }\n }\n }\n @if (showAxes()) {\n @for (axis of layout().axes; track axis.name) {\n <svg:line class=\"chart-radar-axis stroke-border\" x1=\"0\" y1=\"0\" [attr.x2]=\"axis.x\" [attr.y2]=\"axis.y\" />\n @if (showLabels()) {\n <svg:text\n class=\"chart-radar-axis-label fill-muted-foreground text-2xs\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n [attr.x]=\"axis.x * 1.12\"\n [attr.y]=\"axis.y * 1.12\">\n {{ axis.name }}\n </svg:text>\n }\n }\n }\n @for (s of layout().series; track s.seriesKey) {\n <svg:path\n class=\"chart-radar-series\"\n [attr.d]=\"s.path\"\n [attr.stroke]=\"s.color\"\n [attr.fill]=\"linesOnly() ? 'none' : s.color\"\n [attr.fill-opacity]=\"linesOnly() ? null : fillOpacity()\"\n [attr.stroke-width]=\"strokeWidth()\"\n stroke-linejoin=\"round\" />\n @if (showDots()) {\n @for (p of s.points; track p.axis; let i = $index) {\n <svg:circle\n class=\"chart-radar-dot cursor-pointer\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n [attr.r]=\"dotRadius()\"\n [attr.fill]=\"s.color\"\n tabindex=\"0\"\n [attr.aria-label]=\"dotAriaLabel(s.seriesKey, p)\"\n (pointerenter)=\"setActive($event, s.seriesKey, i)\"\n (pointermove)=\"setActive($event, s.seriesKey, i)\"\n (pointerleave)=\"clearActive()\"\n (focus)=\"setActive($event, s.seriesKey, i)\"\n (blur)=\"clearActive()\" />\n }\n }\n }\n </svg:g>\n <ng-content />\n </svg:g>\n </svg:svg>\n <ng-content select=\"ChartTooltip\" />\n <ng-content select=\"ChartLegend\" />\n `,\n})\nexport class RadarChart {\n private readonly root = inject(ChartContext);\n\n readonly data = input.required<readonly ChartDatum[]>();\n readonly axisKey = input.required<string>();\n readonly styles = input<ChartStyleVariant>('base');\n readonly margin = input<ChartMargin>(DEFAULT_MARGIN);\n readonly curve = input<RadarCurve>('linear');\n readonly levels = input<number>(4);\n readonly maxValue = input<number | undefined>(undefined);\n readonly strokeWidth = input<number>(2);\n readonly fillOpacity = input<number>(0.2);\n readonly showLabels = input<boolean>(true);\n readonly showDots = input<boolean>(true);\n readonly dotRadius = input<number>(3);\n readonly grid = input<RadarGrid>('circle');\n readonly gridFilled = input<boolean>(false);\n readonly showAxes = input<boolean>(true);\n readonly linesOnly = input<boolean>(false);\n\n protected readonly innerWidth = computed(() =>\n Math.max(0, this.root.dimensions().width - this.margin().left - this.margin().right),\n );\n protected readonly innerHeight = computed(() =>\n Math.max(0, this.root.dimensions().height - this.margin().top - this.margin().bottom),\n );\n\n protected readonly layout = computed(() =>\n computeRadarLayout({\n data: this.data(),\n axisKey: this.axisKey(),\n seriesKeys: this.root.visibleSeriesKeys(),\n innerWidth: this.innerWidth(),\n innerHeight: this.innerHeight(),\n maxValue: this.maxValue(),\n levels: this.levels(),\n curve: this.curve(),\n grid: this.grid(),\n }),\n );\n\n protected readonly viewBox = computed(() => {\n const { width, height } = this.root.dimensions();\n return `0 0 ${Math.max(0, width)} ${Math.max(0, height)}`;\n });\n\n protected readonly innerTransform = computed(() => `translate(${this.margin().left},${this.margin().top})`);\n\n protected readonly ariaSummary = computed(() => {\n const keys = this.root.visibleSeriesKeys();\n return `Radar chart, ${this.data().length} axes, ${keys.length} series.`;\n });\n\n protected gridFill(): string {\n return this.gridFilled() ? 'hsl(var(--muted))' : 'none';\n }\n\n protected gridFillOpacity(levelIndex: number): number | null {\n return this.gridFilled() ? Math.max(0.06, 0.18 - levelIndex * 0.02) : null;\n }\n\n protected dotAriaLabel(seriesKey: string, p: { axis: string; value: number }): string {\n const label = this.root.config()[seriesKey]?.label ?? seriesKey;\n return `${label} at ${p.axis}: ${p.value}`;\n }\n\n protected setActive(event: PointerEvent | FocusEvent, seriesKey: string, index: number): void {\n const clientX =\n event instanceof PointerEvent ? event.clientX : (event.target as Element).getBoundingClientRect().left;\n const clientY =\n event instanceof PointerEvent ? event.clientY : (event.target as Element).getBoundingClientRect().top;\n this.root.activePoint.set({ index, datumIndex: index, seriesKey, clientX, clientY });\n }\n\n protected clearActive(): void {\n this.root.activePoint.set(null);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["d3max"],"mappings":"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"}