@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
package/README.md ADDED
@@ -0,0 +1,249 @@
1
+ # Chart
2
+
3
+ Angular chart primitives and chart families inspired by shadcn Chart.
4
+
5
+ In this repository, shadcn's single Chart page maps to the dedicated `/ui/chart/*` demo route group so each chart family can keep focused, production-like examples without forcing everything into one `/ui/shadcn/chart` page.
6
+
7
+ Use Chart for dashboards, KPI cards, trend comparisons, radial summaries, and interactive data views where one shared config should drive labels, colors, legends, and tooltip copy.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ bun add @ojiepermana/angular-chart
13
+ npm install @ojiepermana/angular-chart
14
+ ```
15
+
16
+ ## Import
17
+
18
+ Import shared primitives from the chart root entrypoint, then import the concrete chart family from its granular subpath.
19
+
20
+ ```ts
21
+ import {
22
+ ChartAxisX,
23
+ ChartAxisY,
24
+ ChartContainer,
25
+ ChartGrid,
26
+ ChartLegend,
27
+ ChartTooltip,
28
+ type ChartConfig,
29
+ } from '@ojiepermana/angular-chart';
30
+ import { BarChart } from '@ojiepermana/angular-chart/bar';
31
+ ```
32
+
33
+ ### Supported chart entrypoints
34
+
35
+ | Import path | Selector | Best for |
36
+ | ---------------------- | -------------- | ----------------------------------------------------------------- |
37
+ | `@ojiepermana/angular-chart/bar` | `ChartBar` | grouped, stacked, horizontal, active, and mixed-color bar layouts |
38
+ | `@ojiepermana/angular-chart/line` | `ChartLine` | trends, comparisons, and zoomable time-series lines |
39
+ | `@ojiepermana/angular-chart/area` | `ChartArea` | filled trend bands, stacked areas, and expanded percent views |
40
+ | `@ojiepermana/angular-chart/pie` | `ChartPie` | part-to-whole slices and donut charts |
41
+ | `@ojiepermana/angular-chart/radar` | `ChartRadar` | multi-axis performance comparisons |
42
+ | `@ojiepermana/angular-chart/radial` | `ChartRadial` | progress rings, radial comparisons, and center-metric summaries |
43
+ | `@ojiepermana/angular-chart/scatter` | `ChartScatter` | XY correlation plots and point clouds |
44
+
45
+ ## Composition
46
+
47
+ The Angular structure keeps the same high-level idea as shadcn Chart: define a shared chart config once, then compose a specific chart type with optional grid, axis, tooltip, legend, and center content.
48
+
49
+ ```text
50
+ chart
51
+ ├── chart-bar | chart-line | chart-area | chart-scatter
52
+ │ ├── svg:g[chart-grid]
53
+ │ ├── svg:g[chart-axis-x]
54
+ │ ├── svg:g[chart-axis-y]
55
+ │ └── svg:g[chart-crosshair] / svg:g[chart-brush] (optional)
56
+ ├── chart-pie | chart-radial | chart-radar
57
+ │ └── chart-pie-center | chart-radial-center (optional)
58
+ ├── chart-tooltip
59
+ ├── chart-legend
60
+ └── chart-zoom-controls (optional)
61
+ ```
62
+
63
+ All child primitives read dimensions, series metadata, and scoped color tokens from `Chart`.
64
+
65
+ ## Basic usage
66
+
67
+ Start with a readonly `ChartConfig`, keep the dataset in any shape that makes sense for your feature, and map the chart to the relevant keys.
68
+
69
+ ```ts
70
+ const trafficChartConfig = {
71
+ desktop: { label: 'Desktop', color: 'var(--chart-1)' },
72
+ mobile: { label: 'Mobile', color: 'var(--chart-2)' },
73
+ } satisfies ChartConfig;
74
+
75
+ const trafficData = [
76
+ { month: 'January', desktop: 186, mobile: 80 },
77
+ { month: 'February', desktop: 305, mobile: 200 },
78
+ { month: 'March', desktop: 237, mobile: 120 },
79
+ { month: 'April', desktop: 73, mobile: 190 },
80
+ { month: 'May', desktop: 209, mobile: 130 },
81
+ { month: 'June', desktop: 214, mobile: 140 },
82
+ ];
83
+ ```
84
+
85
+ ```html
86
+ <div class="w-full max-w-3xl">
87
+ <Chart [config]="trafficChartConfig" chartId="traffic-overview">
88
+ <ChartBar [data]="trafficData" xKey="month">
89
+ <svg:g ChartGrid></svg:g>
90
+ <svg:g ChartAxisX></svg:g>
91
+ <svg:g ChartAxisY></svg:g>
92
+ </ChartBar>
93
+ <ChartTooltip [data]="trafficData" xKey="month" />
94
+ <ChartLegend />
95
+ </Chart>
96
+ </div>
97
+ ```
98
+
99
+ ## Common patterns
100
+
101
+ ### First chart flow
102
+
103
+ The closest Angular equivalent to the upstream shadcn walkthrough is:
104
+
105
+ 1. Define your dataset.
106
+ 2. Define `ChartConfig` so labels and colors stay decoupled from the raw data.
107
+ 3. Wrap the chart in `Chart`.
108
+ 4. Add `svg:g[ChartGrid]`, axis directives, `ChartTooltip`, and `ChartLegend` only where they add value.
109
+
110
+ This keeps the chart family focused while still letting the shared primitives manage the common UI pieces.
111
+
112
+ ### Swapping chart families
113
+
114
+ The same `ChartConfig` can back multiple chart families. In most cases you only swap the concrete chart import and the family-specific inputs.
115
+
116
+ ```ts
117
+ import { AreaChart } from '@ojiepermana/angular-chart/area';
118
+ import { LineChart } from '@ojiepermana/angular-chart/line';
119
+ ```
120
+
121
+ - `ChartLine` adds inputs such as `curve`, `showDots`, and `showValueLabels`.
122
+ - `ChartArea` adds `stacked`, `expanded`, `gradient`, and `curve`.
123
+ - `ChartBar` adds `orientation`, `variant`, `colorKey`, `activeKey`, and `activeValue`.
124
+
125
+ ### Pie and radial summaries
126
+
127
+ For donut, pie, and radial progress layouts, use `nameKey` plus `valueKey` instead of `xKey`.
128
+
129
+ ```html
130
+ <Chart [config]="browserConfig" aspect="aspect-square">
131
+ <ChartPie
132
+ [data]="browserData"
133
+ nameKey="browser"
134
+ valueKey="visitors"
135
+ [seriesKeys]="browserSeriesKeys"
136
+ [innerRadius]="64">
137
+ </ChartPie>
138
+ <ChartTooltip [data]="browserData" xKey="browser" valueKey="visitors" indicator="dot" />
139
+ <ChartLegend />
140
+ </Chart>
141
+ ```
142
+
143
+ ### Tooltip formatting
144
+
145
+ `ChartTooltip` is where most presentational customization lives.
146
+
147
+ ```html
148
+ <ChartTooltip
149
+ [data]="activityData"
150
+ xKey="date"
151
+ indicator="line"
152
+ labelKey="views"
153
+ [labelFormatter]="longDateFormatter"
154
+ [formatter]="compactNumberFormatter" />
155
+ ```
156
+
157
+ Use `valueKey` for single-value radial and pie datasets, `hideLabel` when the card already provides the label context, and `indicator="none"` when you want a copy-first tooltip layout.
158
+
159
+ ### Per-row colors and active emphasis
160
+
161
+ Use `colorKey` when the dataset itself carries a color token such as `fill`, and use `activeKey` plus `activeValue` when one category should be visually emphasized without rewriting the whole series config.
162
+
163
+ ## API reference
164
+
165
+ ### `ChartContainer`
166
+
167
+ | Input | Type | Default |
168
+ | --------- | ---------------- | ---------------- |
169
+ | `config` | `ChartConfig` | — |
170
+ | `aspect` | `string` | `'aspect-video'` |
171
+ | `ChartId` | `string \| null` | auto-generated |
172
+
173
+ `ChartConfig` is a readonly record of series keys to labels, icons, colors, or theme-aware light/dark color maps.
174
+
175
+ ```ts
176
+ type ChartConfig = Readonly<
177
+ Record<
178
+ string,
179
+ {
180
+ label?: string;
181
+ icon?: Type<unknown>;
182
+ color?: string;
183
+ theme?: Readonly<Record<'light' | 'dark', string>>;
184
+ }
185
+ >
186
+ >;
187
+ ```
188
+
189
+ ### Shared primitives
190
+
191
+ | Part | Key inputs | Notes |
192
+ | ------------------- | -------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
193
+ | `svg:g[ChartGrid]` | none | Adds cartesian grid lines behind bar, line, and area charts. |
194
+ | `svg:g[ChartAxisX]` | `tickCount`, `tickLine`, `tickFormat` | Categorical axis for cartesian layouts. |
195
+ | `svg:g[ChartAxisY]` | `tickCount`, `tickLine`, `tickFormat` | Numeric axis for cartesian layouts. |
196
+ | `ChartTooltip` | `data`, `xKey`, `valueKey`, `indicator`, `label`, `labelKey`, `labelFormatter`, `formatter`, `hideLabel` | Handles default tooltip layout plus custom template projection. |
197
+ | `ChartLegend` | none | Renders toggle buttons for visible series. |
198
+ | `ChartZoomControls` | none | Pair with zoomable line and scatter views. |
199
+ | `ChartPieCenter` | projected content | Centers labels or KPIs inside pie layouts. |
200
+ | `ChartRadialCenter` | projected content | Centers labels or KPIs inside radial layouts. |
201
+
202
+ ### Chart families
203
+
204
+ | Selector | Key inputs |
205
+ | -------------- | --------------------------------------------------------------------------------------------------- |
206
+ | `ChartBar` | `data`, `xKey`, `orientation`, `variant`, `colorKey`, `activeKey`, `activeValue`, `showValueLabels` |
207
+ | `ChartLine` | `data`, `xKey`, `curve`, `showDots`, `dotRadius`, `showValueLabels` |
208
+ | `ChartArea` | `data`, `xKey`, `stacked`, `expanded`, `gradient`, `curve` |
209
+ | `ChartPie` | `data`, `nameKey`, `valueKey`, `seriesKeys`, `innerRadius`, `activeIndex`, `activeOffset` |
210
+ | `ChartRadar` | `data`, `axisKey`, `curve`, `levels`, `grid`, `showLabels`, `showDots` |
211
+ | `ChartRadial` | `data`, `nameKey`, `valueKey`, `seriesKeys`, `maxValue`, `showTrack`, `showValueLabels` |
212
+ | `ChartScatter` | `data`, `xKey`, `yKey`, `sizeKey`, `seriesKey`, `xDomain`, `yDomain` |
213
+
214
+ ## Styling and theming
215
+
216
+ - Prefer CSS variables such as `var(--chart-1)` and `var(--chart-2)` in `ChartConfig`. This matches the current shadcn guidance and the theme tokens shipped by this library.
217
+ - `Chart` scopes generated `--color-<series>` variables to the chart instance, so tooltip rows, legends, and series shapes stay aligned.
218
+ - Use `theme: { light, dark }` on a series config entry when the chart needs different values per color scheme.
219
+ - Keep the parent container responsible for width, and use the `aspect` input when the default `aspect-video` does not match the layout.
220
+ - Use `colorKey` only when the dataset should override per-series colors with a row-specific token such as `fill`.
221
+
222
+ ## Accessibility
223
+
224
+ - Chart hosts expose an `aria-label` summary describing the chart type, category count, and visible series.
225
+ - Interactive marks such as bars, dots, and slices are keyboard focusable where the layout supports activation.
226
+ - `ChartTooltip` includes a polite live region so changing categories can be announced to assistive technology.
227
+ - `ChartLegend` uses native buttons with `aria-pressed` to reflect hidden and visible series state.
228
+ - Keep surrounding card copy descriptive so the chart has enough context when read outside its visual layout.
229
+
230
+ ## Keyboard interactions
231
+
232
+ - `Tab` reaches interactive bars, dots, slices, and legend toggle buttons.
233
+ - `Enter` and `Space` trigger the same click behavior as pointer activation on interactive marks.
234
+ - Focusing a supported data mark updates the shared active point so tooltip content stays reachable without hover.
235
+
236
+ ## Angular notes
237
+
238
+ - Keep chart config objects readonly and signal-friendly. A top-level `const` or signal-backed computed config works well.
239
+ - Every chart family must live inside `Chart`; that container provides dimensions, series visibility state, and scoped color variables to descendants.
240
+ - Use an explicit `ChartId` when multiple charts of the same family appear on one page or when tests need a stable selector.
241
+ - The local shadcn mapping for Chart lives in the dedicated `/ui/chart` overview route with focused family demos under `/ui/chart/*`.
242
+
243
+ ## Source parity
244
+
245
+ This Angular package follows the shadcn Chart information architecture and theming concepts, but it does not mirror the React API one-to-one.
246
+
247
+ - shadcn uses Recharts components directly and layers `ChartTooltipContent` and `ChartLegendContent` around them.
248
+ - This Angular library ships standalone chart families plus shared primitives, so you compose `Chart`, the relevant `chart-*`, `ChartTooltip`, and `ChartLegend` instead of wiring Recharts JSX.
249
+ - The dedicated `/ui/chart/*` route group is the intentional local mapping for shadcn Chart in this repo; no duplicate `/ui/shadcn/chart` page is required.
@@ -0,0 +1,266 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, input, output, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { ChartContext, CartesianContext, CategoricalViewportContext, sliceByIndexRange, computeAreaLayout, provideCartesianFromLineLayout, elementClientCenter } from '@ojiepermana/angular-chart/core';
4
+ import { ChartPointerTracker } from '@ojiepermana/angular-chart/primitives';
5
+
6
+ const DEFAULT_MARGIN = { top: 8, right: 8, bottom: 24, left: 40 };
7
+ /**
8
+ * Area chart — composable within `<Chart>`.
9
+ *
10
+ * - `stacked=true` stacks series along the value axis.
11
+ * - `gradient=true` fills each area with a vertical linear-gradient from
12
+ * the series color (top) to transparent (bottom). The gradient is
13
+ * emitted as `<defs><linearGradient>` per series, unique per chart id.
14
+ */
15
+ class AreaChart {
16
+ root = inject(ChartContext);
17
+ cart = inject(CartesianContext);
18
+ viewport = inject(CategoricalViewportContext);
19
+ data = input.required(/* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
21
+ xKey = input.required(/* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "xKey" }] : /* istanbul ignore next */ []));
23
+ orientation = input('vertical', /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
25
+ styles = input('base', /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "styles" }] : /* istanbul ignore next */ []));
27
+ stacked = input(false, /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "stacked" }] : /* istanbul ignore next */ []));
29
+ expanded = input(false, /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
31
+ gradient = input(true, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "gradient" }] : /* istanbul ignore next */ []));
33
+ curve = input('monotone', /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "curve" }] : /* istanbul ignore next */ []));
35
+ margin = input(DEFAULT_MARGIN, /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "margin" }] : /* istanbul ignore next */ []));
37
+ strokeWidth = input(2, /* @ts-ignore */
38
+ ...(ngDevMode ? [{ debugName: "strokeWidth" }] : /* istanbul ignore next */ []));
39
+ showDots = input(false, /* @ts-ignore */
40
+ ...(ngDevMode ? [{ debugName: "showDots" }] : /* istanbul ignore next */ []));
41
+ dotRadius = input(3, /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "dotRadius" }] : /* istanbul ignore next */ []));
43
+ pointClick = output();
44
+ innerWidth = computed(() => Math.max(0, this.root.dimensions().width - this.margin().left - this.margin().right), /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "innerWidth" }] : /* istanbul ignore next */ []));
46
+ innerHeight = computed(() => Math.max(0, this.root.dimensions().height - this.margin().top - this.margin().bottom), /* @ts-ignore */
47
+ ...(ngDevMode ? [{ debugName: "innerHeight" }] : /* istanbul ignore next */ []));
48
+ visibleStartIndex = computed(() => this.viewport.zoomRange()?.startIndex ?? 0, /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "visibleStartIndex" }] : /* istanbul ignore next */ []));
50
+ visibleData = computed(() => sliceByIndexRange(this.data(), this.viewport.zoomRange()), /* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "visibleData" }] : /* istanbul ignore next */ []));
52
+ layout = computed(() => computeAreaLayout({
53
+ data: this.visibleData(),
54
+ xKey: this.xKey(),
55
+ seriesKeys: this.root.visibleSeriesKeys(),
56
+ orientation: this.orientation(),
57
+ innerWidth: this.innerWidth(),
58
+ innerHeight: this.innerHeight(),
59
+ curve: this.curve(),
60
+ stacked: this.stacked(),
61
+ expanded: this.expanded(),
62
+ }), /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []));
64
+ series = computed(() => this.layout().series, /* @ts-ignore */
65
+ ...(ngDevMode ? [{ debugName: "series" }] : /* istanbul ignore next */ []));
66
+ viewBox = computed(() => {
67
+ const { width, height } = this.root.dimensions();
68
+ return `0 0 ${Math.max(0, width)} ${Math.max(0, height)}`;
69
+ }, /* @ts-ignore */
70
+ ...(ngDevMode ? [{ debugName: "viewBox" }] : /* istanbul ignore next */ []));
71
+ innerTransform = computed(() => `translate(${this.margin().left},${this.margin().top})`, /* @ts-ignore */
72
+ ...(ngDevMode ? [{ debugName: "innerTransform" }] : /* istanbul ignore next */ []));
73
+ ariaSummary = computed(() => {
74
+ const keys = this.root.visibleSeriesKeys();
75
+ return `Area chart, ${this.visibleData().length} points, ${keys.length} series: ${keys.join(', ')}.`;
76
+ }, /* @ts-ignore */
77
+ ...(ngDevMode ? [{ debugName: "ariaSummary" }] : /* istanbul ignore next */ []));
78
+ constructor() {
79
+ effect(() => {
80
+ const layout = this.layout();
81
+ this.viewport.dataCount.set(this.data().length);
82
+ provideCartesianFromLineLayout(this.cart, layout, this.orientation(), this.innerWidth(), this.innerHeight());
83
+ this.cart.margin.set(this.margin());
84
+ });
85
+ }
86
+ gradientId(seriesKey) {
87
+ return `${this.root.id()}-grad-${seriesKey.replace(/[^a-zA-Z0-9_-]/g, '_')}`;
88
+ }
89
+ areaFill(seriesKey, color) {
90
+ return this.gradient() ? `url(#${this.gradientId(seriesKey)})` : color;
91
+ }
92
+ emitClick(p) {
93
+ const datumIndex = this.visibleStartIndex() + p.datumIndex;
94
+ this.pointClick.emit({
95
+ seriesKey: p.seriesKey,
96
+ datumIndex,
97
+ category: p.category,
98
+ value: p.value,
99
+ datum: this.data()[datumIndex],
100
+ });
101
+ }
102
+ setActivePoint(event, p) {
103
+ const center = elementClientCenter(event.currentTarget);
104
+ const datumIndex = this.visibleStartIndex() + p.datumIndex;
105
+ this.root.activePoint.set({
106
+ index: p.datumIndex,
107
+ datumIndex,
108
+ seriesKey: p.seriesKey,
109
+ clientX: center?.clientX,
110
+ clientY: center?.clientY,
111
+ });
112
+ }
113
+ clearActivePoint() {
114
+ this.root.activePoint.set(null);
115
+ }
116
+ pointAriaLabel(p) {
117
+ const label = this.root.config()[p.seriesKey]?.label ?? p.seriesKey;
118
+ return `${label} at ${p.category}: ${p.value}`;
119
+ }
120
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: AreaChart, deps: [], target: i0.ɵɵFactoryTarget.Component });
121
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: AreaChart, isStandalone: true, selector: "ChartArea", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, xKey: { classPropertyName: "xKey", publicName: "xKey", isSignal: true, isRequired: true, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, styles: { classPropertyName: "styles", publicName: "styles", isSignal: true, isRequired: false, transformFunction: null }, stacked: { classPropertyName: "stacked", publicName: "stacked", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, gradient: { classPropertyName: "gradient", publicName: "gradient", isSignal: true, isRequired: false, transformFunction: null }, curve: { classPropertyName: "curve", publicName: "curve", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", 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 } }, outputs: { pointClick: "pointClick" }, host: { properties: { "attr.data-style": "styles()" }, classAttribute: "relative block h-full w-full" }, providers: [CartesianContext, CategoricalViewportContext], ngImport: i0, template: `
122
+ <svg:svg
123
+ ChartPointerTracker
124
+ class="block h-full w-full overflow-visible"
125
+ [attr.viewBox]="viewBox()"
126
+ preserveAspectRatio="none"
127
+ role="img"
128
+ [attr.aria-label]="ariaSummary()">
129
+ @if (gradient()) {
130
+ <svg:defs>
131
+ @for (s of series(); track s.seriesKey) {
132
+ <svg:linearGradient [attr.id]="gradientId(s.seriesKey)" x1="0" y1="0" x2="0" y2="1">
133
+ <svg:stop offset="0%" [attr.stop-color]="s.color" stop-opacity="0.4" />
134
+ <svg:stop offset="100%" [attr.stop-color]="s.color" stop-opacity="0" />
135
+ </svg:linearGradient>
136
+ }
137
+ </svg:defs>
138
+ }
139
+ <svg:g [attr.transform]="innerTransform()">
140
+ <ng-content select="svg\\:g[ChartGrid]" />
141
+ <svg:g class="chart-areas">
142
+ @for (s of series(); track s.seriesKey) {
143
+ <svg:path
144
+ class="chart-area"
145
+ [attr.d]="s.areaPath"
146
+ [attr.fill]="areaFill(s.seriesKey, s.color)"
147
+ stroke="none" />
148
+ <svg:path
149
+ class="chart-area-stroke"
150
+ [attr.d]="s.linePath"
151
+ [attr.stroke]="s.color"
152
+ [attr.stroke-width]="strokeWidth()"
153
+ fill="none"
154
+ stroke-linecap="round"
155
+ stroke-linejoin="round" />
156
+ @if (showDots()) {
157
+ @for (p of s.points; track p.datumIndex) {
158
+ <svg:circle
159
+ class="chart-dot cursor-pointer outline-none"
160
+ [attr.cx]="p.x"
161
+ [attr.cy]="p.y"
162
+ [attr.r]="dotRadius()"
163
+ [attr.fill]="s.color"
164
+ [attr.aria-label]="pointAriaLabel(p)"
165
+ tabindex="0"
166
+ (focus)="setActivePoint($event, p)"
167
+ (blur)="clearActivePoint()"
168
+ (click)="emitClick(p)"
169
+ (keydown.enter)="emitClick(p)"
170
+ (keydown.space)="emitClick(p); $event.preventDefault()" />
171
+ }
172
+ }
173
+ }
174
+ </svg:g>
175
+ <ng-content select="svg\\:g[ChartAxisX]" />
176
+ <ng-content select="svg\\:g[ChartAxisY]" />
177
+ <ng-content select="svg\\:g[ChartCrosshair]" />
178
+ <ng-content select="svg:g[ChartBrush]" />
179
+ </svg:g>
180
+ </svg:svg>
181
+ <ng-content select="ChartTooltip" />
182
+ <ng-content select="ChartLegend" />
183
+ <ng-content select="ChartZoomControls" />
184
+ `, isInline: true, dependencies: [{ kind: "directive", type: ChartPointerTracker, selector: "svg:svg[ChartPointerTracker]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
185
+ }
186
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: AreaChart, decorators: [{
187
+ type: Component,
188
+ args: [{
189
+ selector: 'ChartArea',
190
+ changeDetection: ChangeDetectionStrategy.OnPush,
191
+ providers: [CartesianContext, CategoricalViewportContext],
192
+ imports: [ChartPointerTracker],
193
+ host: { class: 'relative block h-full w-full', '[attr.data-style]': 'styles()' },
194
+ template: `
195
+ <svg:svg
196
+ ChartPointerTracker
197
+ class="block h-full w-full overflow-visible"
198
+ [attr.viewBox]="viewBox()"
199
+ preserveAspectRatio="none"
200
+ role="img"
201
+ [attr.aria-label]="ariaSummary()">
202
+ @if (gradient()) {
203
+ <svg:defs>
204
+ @for (s of series(); track s.seriesKey) {
205
+ <svg:linearGradient [attr.id]="gradientId(s.seriesKey)" x1="0" y1="0" x2="0" y2="1">
206
+ <svg:stop offset="0%" [attr.stop-color]="s.color" stop-opacity="0.4" />
207
+ <svg:stop offset="100%" [attr.stop-color]="s.color" stop-opacity="0" />
208
+ </svg:linearGradient>
209
+ }
210
+ </svg:defs>
211
+ }
212
+ <svg:g [attr.transform]="innerTransform()">
213
+ <ng-content select="svg\\:g[ChartGrid]" />
214
+ <svg:g class="chart-areas">
215
+ @for (s of series(); track s.seriesKey) {
216
+ <svg:path
217
+ class="chart-area"
218
+ [attr.d]="s.areaPath"
219
+ [attr.fill]="areaFill(s.seriesKey, s.color)"
220
+ stroke="none" />
221
+ <svg:path
222
+ class="chart-area-stroke"
223
+ [attr.d]="s.linePath"
224
+ [attr.stroke]="s.color"
225
+ [attr.stroke-width]="strokeWidth()"
226
+ fill="none"
227
+ stroke-linecap="round"
228
+ stroke-linejoin="round" />
229
+ @if (showDots()) {
230
+ @for (p of s.points; track p.datumIndex) {
231
+ <svg:circle
232
+ class="chart-dot cursor-pointer outline-none"
233
+ [attr.cx]="p.x"
234
+ [attr.cy]="p.y"
235
+ [attr.r]="dotRadius()"
236
+ [attr.fill]="s.color"
237
+ [attr.aria-label]="pointAriaLabel(p)"
238
+ tabindex="0"
239
+ (focus)="setActivePoint($event, p)"
240
+ (blur)="clearActivePoint()"
241
+ (click)="emitClick(p)"
242
+ (keydown.enter)="emitClick(p)"
243
+ (keydown.space)="emitClick(p); $event.preventDefault()" />
244
+ }
245
+ }
246
+ }
247
+ </svg:g>
248
+ <ng-content select="svg\\:g[ChartAxisX]" />
249
+ <ng-content select="svg\\:g[ChartAxisY]" />
250
+ <ng-content select="svg\\:g[ChartCrosshair]" />
251
+ <ng-content select="svg:g[ChartBrush]" />
252
+ </svg:g>
253
+ </svg:svg>
254
+ <ng-content select="ChartTooltip" />
255
+ <ng-content select="ChartLegend" />
256
+ <ng-content select="ChartZoomControls" />
257
+ `,
258
+ }]
259
+ }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], xKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "xKey", required: true }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], styles: [{ type: i0.Input, args: [{ isSignal: true, alias: "styles", required: false }] }], stacked: [{ type: i0.Input, args: [{ isSignal: true, alias: "stacked", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], gradient: [{ type: i0.Input, args: [{ isSignal: true, alias: "gradient", required: false }] }], curve: [{ type: i0.Input, args: [{ isSignal: true, alias: "curve", required: false }] }], margin: [{ type: i0.Input, args: [{ isSignal: true, alias: "margin", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], showDots: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDots", required: false }] }], dotRadius: [{ type: i0.Input, args: [{ isSignal: true, alias: "dotRadius", required: false }] }], pointClick: [{ type: i0.Output, args: ["pointClick"] }] } });
260
+
261
+ /**
262
+ * Generated bundle index. Do not edit.
263
+ */
264
+
265
+ export { AreaChart };
266
+ //# sourceMappingURL=ojiepermana-angular-chart-area.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ojiepermana-angular-chart-area.mjs","sources":["../../../library/chart/area/area-chart.ts","../../../library/chart/area/ojiepermana-angular-chart-area.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output } from '@angular/core';\nimport { ChartContext } from '@ojiepermana/angular-chart/core';\nimport {\n CartesianContext,\n type ChartDatum,\n type ChartMargin,\n type ChartOrientation,\n type ChartStyleVariant,\n} from '@ojiepermana/angular-chart/core';\nimport { CategoricalViewportContext } from '@ojiepermana/angular-chart/core';\nimport { computeAreaLayout, type LineCurve, type LinePoint, type LineSeriesPath } from '@ojiepermana/angular-chart/core';\nimport { provideCartesianFromLineLayout } from '@ojiepermana/angular-chart/core';\nimport { ChartPointerTracker } from '@ojiepermana/angular-chart/primitives';\nimport { elementClientCenter } from '@ojiepermana/angular-chart/core';\nimport { sliceByIndexRange } from '@ojiepermana/angular-chart/core';\n\nconst DEFAULT_MARGIN: ChartMargin = { top: 8, right: 8, bottom: 24, left: 40 };\n\nexport interface AreaPointClickEvent {\n readonly seriesKey: string;\n readonly datumIndex: number;\n readonly category: string;\n readonly value: number;\n readonly datum: ChartDatum;\n}\n\n/**\n * Area chart — composable within `<Chart>`.\n *\n * - `stacked=true` stacks series along the value axis.\n * - `gradient=true` fills each area with a vertical linear-gradient from\n * the series color (top) to transparent (bottom). The gradient is\n * emitted as `<defs><linearGradient>` per series, unique per chart id.\n */\n@Component({\n selector: 'ChartArea',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [CartesianContext, CategoricalViewportContext],\n imports: [ChartPointerTracker],\n host: { class: 'relative block h-full w-full', '[attr.data-style]': 'styles()' },\n template: `\n <svg:svg\n ChartPointerTracker\n class=\"block h-full w-full overflow-visible\"\n [attr.viewBox]=\"viewBox()\"\n preserveAspectRatio=\"none\"\n role=\"img\"\n [attr.aria-label]=\"ariaSummary()\">\n @if (gradient()) {\n <svg:defs>\n @for (s of series(); track s.seriesKey) {\n <svg:linearGradient [attr.id]=\"gradientId(s.seriesKey)\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <svg:stop offset=\"0%\" [attr.stop-color]=\"s.color\" stop-opacity=\"0.4\" />\n <svg:stop offset=\"100%\" [attr.stop-color]=\"s.color\" stop-opacity=\"0\" />\n </svg:linearGradient>\n }\n </svg:defs>\n }\n <svg:g [attr.transform]=\"innerTransform()\">\n <ng-content select=\"svg\\\\:g[ChartGrid]\" />\n <svg:g class=\"chart-areas\">\n @for (s of series(); track s.seriesKey) {\n <svg:path\n class=\"chart-area\"\n [attr.d]=\"s.areaPath\"\n [attr.fill]=\"areaFill(s.seriesKey, s.color)\"\n stroke=\"none\" />\n <svg:path\n class=\"chart-area-stroke\"\n [attr.d]=\"s.linePath\"\n [attr.stroke]=\"s.color\"\n [attr.stroke-width]=\"strokeWidth()\"\n fill=\"none\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n @if (showDots()) {\n @for (p of s.points; track p.datumIndex) {\n <svg:circle\n class=\"chart-dot cursor-pointer outline-none\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n [attr.r]=\"dotRadius()\"\n [attr.fill]=\"s.color\"\n [attr.aria-label]=\"pointAriaLabel(p)\"\n tabindex=\"0\"\n (focus)=\"setActivePoint($event, p)\"\n (blur)=\"clearActivePoint()\"\n (click)=\"emitClick(p)\"\n (keydown.enter)=\"emitClick(p)\"\n (keydown.space)=\"emitClick(p); $event.preventDefault()\" />\n }\n }\n }\n </svg:g>\n <ng-content select=\"svg\\\\:g[ChartAxisX]\" />\n <ng-content select=\"svg\\\\:g[ChartAxisY]\" />\n <ng-content select=\"svg\\\\:g[ChartCrosshair]\" />\n <ng-content select=\"svg:g[ChartBrush]\" />\n </svg:g>\n </svg:svg>\n <ng-content select=\"ChartTooltip\" />\n <ng-content select=\"ChartLegend\" />\n <ng-content select=\"ChartZoomControls\" />\n `,\n})\nexport class AreaChart {\n private readonly root = inject(ChartContext);\n private readonly cart = inject(CartesianContext);\n private readonly viewport = inject(CategoricalViewportContext);\n\n readonly data = input.required<readonly ChartDatum[]>();\n readonly xKey = input.required<string>();\n readonly orientation = input<ChartOrientation>('vertical');\n readonly styles = input<ChartStyleVariant>('base');\n readonly stacked = input<boolean>(false);\n readonly expanded = input<boolean>(false);\n readonly gradient = input<boolean>(true);\n readonly curve = input<LineCurve>('monotone');\n readonly margin = input<ChartMargin>(DEFAULT_MARGIN);\n readonly strokeWidth = input<number>(2);\n readonly showDots = input<boolean>(false);\n readonly dotRadius = input<number>(3);\n\n readonly pointClick = output<AreaPointClickEvent>();\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 visibleStartIndex = computed(() => this.viewport.zoomRange()?.startIndex ?? 0);\n\n protected readonly visibleData = computed(() => sliceByIndexRange(this.data(), this.viewport.zoomRange()));\n\n protected readonly layout = computed(() =>\n computeAreaLayout({\n data: this.visibleData(),\n xKey: this.xKey(),\n seriesKeys: this.root.visibleSeriesKeys(),\n orientation: this.orientation(),\n innerWidth: this.innerWidth(),\n innerHeight: this.innerHeight(),\n curve: this.curve(),\n stacked: this.stacked(),\n expanded: this.expanded(),\n }),\n );\n\n protected readonly series = computed<readonly LineSeriesPath[]>(() => this.layout().series);\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 `Area chart, ${this.visibleData().length} points, ${keys.length} series: ${keys.join(', ')}.`;\n });\n\n constructor() {\n effect(() => {\n const layout = this.layout();\n this.viewport.dataCount.set(this.data().length);\n provideCartesianFromLineLayout(this.cart, layout, this.orientation(), this.innerWidth(), this.innerHeight());\n this.cart.margin.set(this.margin());\n });\n }\n\n protected gradientId(seriesKey: string): string {\n return `${this.root.id()}-grad-${seriesKey.replace(/[^a-zA-Z0-9_-]/g, '_')}`;\n }\n\n protected areaFill(seriesKey: string, color: string): string {\n return this.gradient() ? `url(#${this.gradientId(seriesKey)})` : color;\n }\n\n protected emitClick(p: LinePoint): void {\n const datumIndex = this.visibleStartIndex() + p.datumIndex;\n this.pointClick.emit({\n seriesKey: p.seriesKey,\n datumIndex,\n category: p.category,\n value: p.value,\n datum: this.data()[datumIndex],\n });\n }\n\n protected setActivePoint(event: FocusEvent, p: LinePoint): void {\n const center = elementClientCenter(event.currentTarget);\n const datumIndex = this.visibleStartIndex() + p.datumIndex;\n this.root.activePoint.set({\n index: p.datumIndex,\n datumIndex,\n seriesKey: p.seriesKey,\n clientX: center?.clientX,\n clientY: center?.clientY,\n });\n }\n\n protected clearActivePoint(): void {\n this.root.activePoint.set(null);\n }\n\n protected pointAriaLabel(p: LinePoint): string {\n const label = this.root.config()[p.seriesKey]?.label ?? p.seriesKey;\n return `${label} at ${p.category}: ${p.value}`;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}