@aurum-grid/charts 0.0.0-stage → 0.2.0

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.
@@ -0,0 +1,221 @@
1
+ /* Aurum Grid Charts. Colours derive from the shared --agr-* theme tokens. */
2
+ .agc-root {
3
+ --agc-1: #d4a72c; --agc-2: #3aa597; --agc-3: #e0704f; --agc-4: #5b8fd9;
4
+ --agc-5: #9b77d1; --agc-6: #8fae3c; --agc-7: #d4628f; --agc-8: #7d8b99;
5
+ position: relative;
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 6px;
9
+ color: var(--agr-fg, #222);
10
+ font-family: var(--agr-font, system-ui, sans-serif);
11
+ font-size: 12px;
12
+ min-width: 0;
13
+ }
14
+ [data-agr-theme='high-contrast'] .agc-root, .agc-root[data-agr-theme='high-contrast'] {
15
+ --agc-1: #ffff00; --agc-2: #00ffff; --agc-3: #ff8c00; --agc-4: #7cff7c;
16
+ --agc-5: #ff7cff; --agc-6: #ffffff; --agc-7: #8ab4ff; --agc-8: #ffb3b3;
17
+ }
18
+ .agc-title { font-weight: 700; font-size: 13px; }
19
+ .agc-title[hidden] { display: none; }
20
+ .agc-plot { position: relative; width: 100%; min-width: 0; }
21
+ .agc-plot[hidden] { display: none; }
22
+ .agc-svg { display: block; width: 100%; height: auto; overflow: visible; }
23
+ .agc-fill { height: 100%; min-height: 0; }
24
+ .agc-fill .agc-plot { flex: 1 1 auto; min-height: 120px; }
25
+ .agc-fill .agc-svg { position: absolute; inset: 0; width: 100%; height: 100%; }
26
+ .agc-text, .agc-axis-text { fill: var(--agr-fg, #222); font-size: 11px; }
27
+ .agc-axis-text { fill: var(--agr-muted, #666); }
28
+ .agc-axis-title { fill: var(--agr-muted, #666); font-size: 11px; font-weight: 600; }
29
+ .agc-big { fill: var(--agr-fg, #222); font-size: 22px; font-weight: 700; }
30
+ .agc-on-mark { fill: #fff; font-size: 12px; font-weight: 700; paint-order: stroke; stroke: rgba(0, 0, 0, 0.55); stroke-width: 2.5px; }
31
+ .agc-on-mark-sub { font-weight: 500; font-size: 11px; }
32
+ .agc-on-accent { fill: var(--agr-accent-fg, #fff); font-size: 11px; font-weight: 600; }
33
+ .agc-grid { stroke: var(--agr-border, #ddd); stroke-width: 1; fill: none; }
34
+ .agc-zero { stroke: var(--agr-muted, #888); stroke-width: 1; }
35
+ .agc-line { fill: none; stroke-width: 2.25; stroke-linejoin: round; stroke-linecap: round; }
36
+ .agc-area { opacity: 0.22; }
37
+ .agc-dot { stroke: var(--agr-bg, #fff); stroke-width: 1.5; }
38
+ .agc-scatter-dot { opacity: 0.85; stroke: var(--agr-bg, #fff); stroke-width: 1; }
39
+ .agc-slice { stroke: var(--agr-bg, #fff); stroke-width: 1.5; }
40
+ .agc-gauge-track { fill: none; stroke: var(--agr-border, #ddd); stroke-width: 18; stroke-linecap: round; }
41
+ .agc-gauge-value { fill: none; stroke-width: 18; stroke-linecap: round; }
42
+ .agc-radar-area { fill-opacity: 0.18; stroke-width: 2; }
43
+ .agc-mark { transition: opacity 0.15s; outline: none; }
44
+ .agc-mark:hover { opacity: 0.85; }
45
+ .agc-mark:focus-visible { stroke: var(--agr-focus, #2457c5); stroke-width: 3; }
46
+ .agc-dim { opacity: 0.3; }
47
+ .agc-selected { stroke: var(--agr-fg, #111); stroke-width: 2; }
48
+ .agc-empty { display: flex; align-items: center; justify-content: center; min-height: 140px; color: var(--agr-muted, #666); border: 1px dashed var(--agr-border, #ccc); border-radius: 6px; }
49
+ .agc-empty[hidden] { display: none; }
50
+ .agc-legend { display: flex; flex-wrap: wrap; gap: 4px 12px; }
51
+ .agc-legend[hidden] { display: none; }
52
+ .agc-legend-item { display: inline-flex; align-items: center; gap: 6px; padding: 2px 4px; border: 0; background: transparent; color: inherit; font: inherit; border-radius: 4px; }
53
+ button.agc-legend-item { cursor: pointer; }
54
+ button.agc-legend-item:hover { background: var(--agr-row-hover-bg, #eee); }
55
+ button.agc-legend-item:focus-visible { outline: 2px solid var(--agr-focus, #2457c5); }
56
+ .agc-legend-off { opacity: 0.45; text-decoration: line-through; }
57
+ .agc-swatch { width: 10px; height: 10px; border-radius: 2px; flex: 0 0 auto; }
58
+ .agc-swatch-dash { width: 14px; height: 0; border-top: 2px dashed; border-radius: 0; }
59
+ .agc-tooltip {
60
+ position: absolute; z-index: 20; pointer-events: none; padding: 5px 9px; border-radius: 5px; white-space: nowrap;
61
+ background: var(--agr-popup-bg, #fff); color: var(--agr-fg, #222); border: 1px solid var(--agr-border, #ddd);
62
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.22); font-weight: 600;
63
+ }
64
+ .agc-tooltip[hidden] { display: none; }
65
+ .agc-sr-only { display: block; position: absolute; left: 0; top: 0; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
66
+
67
+ /* Toolbar: label inline with the control; groups wrap as units. */
68
+ .agc-toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px; }
69
+ .agc-toolbar-group { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
70
+ .agc-field { display: inline-flex; align-items: center; gap: 8px; margin: 0; white-space: nowrap; }
71
+ .agc-field-label { font-weight: 600; color: var(--agr-fg, #222); line-height: 1; }
72
+ .agc-control {
73
+ height: 32px; box-sizing: border-box; padding: 0 10px; border-radius: 6px; font: inherit; font-size: 13px; line-height: 30px;
74
+ border: 1px solid var(--agr-border, #ccc); background: var(--agr-input-bg, #fff); color: var(--agr-fg, #222);
75
+ }
76
+ .agc-control:focus-visible { outline: 2px solid var(--agr-focus, #2457c5); outline-offset: 1px; }
77
+ .agc-btn { cursor: pointer; font-weight: 600; }
78
+ .agc-btn:hover:not(:disabled) { background: var(--agr-row-hover-bg, #eee); }
79
+ .agc-btn:disabled { opacity: 0.5; cursor: default; }
80
+ .agc-btn-primary { background: var(--agr-accent, #2457c5); border-color: var(--agr-accent, #2457c5); color: var(--agr-accent-fg, #fff); }
81
+ .agc-btn-primary:hover:not(:disabled) { background: color-mix(in srgb, var(--agr-accent, #2457c5) 85%, #000); }
82
+ @media (prefers-reduced-motion: reduce) { .agc-mark { transition: none; } }
83
+ @media (forced-colors: active) { .agc-mark:focus-visible { stroke: Highlight; } }
84
+
85
+ /* ---------- smart overlays ---------- */
86
+ .agc-trend { stroke: var(--agr-muted, #777); stroke-width: 1.75; stroke-dasharray: 6 4; fill: none; }
87
+ .agc-forecast-zone { fill: color-mix(in srgb, var(--agr-fg, #222) 4%, transparent); }
88
+ .agc-forecast-band { opacity: 0.16; }
89
+ .agc-forecast-line { fill: none; stroke-width: 2.25; stroke-dasharray: 5 4; }
90
+ .agc-dot-forecast { fill: var(--agr-bg, #fff); stroke-width: 2; }
91
+ .agc-axis-future { font-style: italic; }
92
+ .agc-reference { stroke: var(--agr-danger, #b42318); stroke-width: 1.5; stroke-dasharray: 2 3; }
93
+ .agc-reference-label { fill: var(--agr-danger, #b42318); font-size: 11px; font-weight: 600; }
94
+ .agc-highlight { fill: none; stroke-width: 2; }
95
+ .agc-highlight-high { stroke: var(--agr-success, #1a7f37); }
96
+ .agc-highlight-low { stroke: var(--agr-danger, #b42318); }
97
+ .agc-callout-bg { fill: var(--agr-popup-bg, #fff); stroke: currentColor; stroke-width: 1; }
98
+ .agc-callout-high { color: var(--agr-success, #1a7f37); }
99
+ .agc-callout-low { color: var(--agr-danger, #b42318); }
100
+ .agc-callout-text { fill: currentColor; font-size: 11px; font-weight: 700; }
101
+ .agc-data-label { fill: var(--agr-fg, #222); font-size: 10.5px; font-weight: 600; }
102
+ .agc-axis-secondary { fill: var(--agr-muted, #666); }
103
+ .agc-line-secondary { stroke-dasharray: none; }
104
+ .agc-gauge-band { fill: none; stroke-width: 7; stroke-linecap: butt; }
105
+ .agc-band-bad { stroke: color-mix(in srgb, var(--agr-danger, #b42318) 70%, transparent); }
106
+ .agc-band-warn { stroke: color-mix(in srgb, var(--agr-warning, #9a6700) 75%, transparent); }
107
+ .agc-band-good { stroke: color-mix(in srgb, var(--agr-success, #1a7f37) 70%, transparent); }
108
+ .agc-gauge-target { stroke: var(--agr-fg, #222); stroke-width: 3; stroke-linecap: round; }
109
+ .agc-target-label { font-weight: 700; fill: var(--agr-fg, #222); }
110
+
111
+ /* ---------- sparklines ---------- */
112
+ .agc-spark { display: block; overflow: visible; }
113
+ .agc-spark-line { fill: none; stroke-width: 1.6; stroke-linejoin: round; }
114
+ .agc-spark-area { opacity: 0.14; }
115
+ .agc-spark-cell { display: inline-flex; align-items: center; height: 100%; }
116
+
117
+ /* ---------- chart studio ---------- */
118
+ .agc-studio { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
119
+ .agc-studio-fill { height: 100%; }
120
+ .agc-studio-chart { min-width: 0; }
121
+ .agc-studio-fill .agc-studio-chart { flex: 1 1 auto; min-height: 160px; display: flex; flex-direction: column; }
122
+ .agc-toolbar-smart .agc-control { height: 30px; }
123
+ .agc-toggle[aria-pressed='true'] { background: color-mix(in srgb, var(--agr-accent, #2457c5) 20%, var(--agr-input-bg, #fff)); border-color: var(--agr-accent, #2457c5); }
124
+ .agc-btn:disabled { opacity: 0.45; }
125
+ .agc-note { padding: 8px 10px; border-radius: 6px; font-size: 12.5px; line-height: 1.45; background: color-mix(in srgb, var(--agr-accent, #2457c5) 9%, transparent); border-left: 3px solid var(--agr-accent, #2457c5); }
126
+ .agc-note[data-kind='error'] { border-left-color: var(--agr-danger, #b42318); background: color-mix(in srgb, var(--agr-danger, #b42318) 9%, transparent); }
127
+ .agc-note[hidden] { display: none; }
128
+ .agc-customize { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; padding: 10px; border: 1px solid var(--agr-border, #ddd); border-radius: 6px; }
129
+ .agc-customize[hidden] { display: none; }
130
+ .agc-control-narrow { width: 70px; }
131
+ .agc-check { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; }
132
+ .agc-check input { accent-color: var(--agr-accent, #2457c5); }
133
+ .agc-data-wrap { max-height: 220px; overflow: auto; border: 1px solid var(--agr-border, #ddd); border-radius: 6px; }
134
+ .agc-data-wrap[hidden] { display: none; }
135
+ .agc-data-table { width: 100%; border-collapse: collapse; font-size: 12px; font-variant-numeric: tabular-nums; }
136
+ .agc-data-table caption { text-align: left; padding: 6px 8px; font-weight: 700; }
137
+ .agc-data-table th, .agc-data-table td { padding: 4px 8px; border-top: 1px solid var(--agr-border, #ddd); text-align: left; }
138
+ .agc-data-table td + td, .agc-data-table th + th { text-align: right; }
139
+ .agc-studio-fill .agc-studio-chart > .agc-root { flex: 1 1 auto; }
140
+
141
+ /* 0.3 chart types */
142
+ .agc-radar-line { fill: none; stroke-width: 2; }
143
+ .agc-area.agc-area-stacked { opacity: 0.78; }
144
+ .agc-gauge-track-fill { fill: var(--agr-border, #ddd); opacity: 0.45; }
145
+ .agc-stat-whisker { stroke: var(--agr-muted, #777); stroke-width: 1.5; }
146
+ .agc-stat-box { stroke: var(--agr-fg, #222); stroke-opacity: 0.35; }
147
+ .agc-stat-median { stroke: var(--agr-fg, #111); stroke-width: 2.5; }
148
+ .agc-stat-mean { stroke: var(--agr-fg, #111); stroke-width: 2; }
149
+ .agc-sun-outer { stroke: var(--agr-row-bg, #fff); stroke-width: 1; }
150
+ .agc-sun-total { font-weight: 700; font-size: 13px; }
151
+
152
+ /* ---------- integrated chart window ---------- */
153
+ .agc-ic-backdrop { position: fixed; inset: 0; z-index: 1000; background: rgba(8, 10, 14, 0.45); backdrop-filter: blur(1.5px); animation: agc-fade 0.14s ease-out; }
154
+ @keyframes agc-fade { from { opacity: 0; } to { opacity: 1; } }
155
+ .agc-ic {
156
+ position: fixed; display: flex; flex-direction: column; min-width: 320px; min-height: 300px; overflow: hidden;
157
+ border: 1px solid var(--agr-border, #ccc); border-radius: 12px; background: var(--agr-row-bg, #fff); color: var(--agr-fg, #222);
158
+ font-family: var(--agr-font, system-ui, sans-serif); font-size: 13px; box-shadow: 0 24px 64px rgba(0, 0, 0, 0.38), 0 2px 8px rgba(0, 0, 0, 0.2);
159
+ animation: agc-pop 0.16s ease-out;
160
+ }
161
+ @keyframes agc-pop { from { opacity: 0; transform: translateY(6px) scale(0.985); } to { opacity: 1; transform: none; } }
162
+ .agc-ic:focus { outline: none; }
163
+ .agc-ic-head { display: flex; align-items: center; gap: 12px; padding: 10px 10px 10px 16px; border-bottom: 1px solid var(--agr-border, #ddd); cursor: move; user-select: none; background: color-mix(in srgb, var(--agr-header-bg, #f6f6f6) 70%, var(--agr-row-bg, #fff)); }
164
+ .agc-ic-max .agc-ic-head { cursor: default; }
165
+ .agc-ic-titles { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
166
+ .agc-ic-title { margin: 0; font-size: 14px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
167
+ .agc-ic-sub { color: var(--agr-muted, #666); font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
168
+ .agc-ic-tools { display: flex; gap: 4px; flex: 0 0 auto; }
169
+ .agc-ic-btn { display: inline-grid; place-items: center; min-width: 30px; height: 30px; padding: 0 8px; border: 1px solid var(--agr-border, #ccc); border-radius: 6px; background: var(--agr-input-bg, #fff); color: inherit; font: inherit; font-size: 15px; line-height: 1; cursor: pointer; }
170
+ .agc-ic-btn.agc-ic-text { font-size: 12px; font-weight: 700; }
171
+ .agc-ic-btn:hover { border-color: var(--agr-accent, #2563eb); }
172
+ .agc-ic-close { font-size: 20px; }
173
+ .agc-ic-body { position: relative; flex: 1 1 auto; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) 0 304px; }
174
+ .agc-ic-panel-closed .agc-ic-body { grid-template-columns: minmax(0, 1fr) 0 0; }
175
+ .agc-ic-chart { min-width: 0; min-height: 0; padding: 12px 22px 12px 14px; display: flex; flex-direction: column; }
176
+ .agc-ic-chart > .agc-chart { flex: 1 1 auto; min-height: 0; }
177
+ .agc-ic-toggle {
178
+ position: relative; z-index: 2; align-self: center; justify-self: end; width: 22px; height: 56px; margin-right: -1px; padding: 0;
179
+ border: 1px solid var(--agr-border, #ccc); border-right: 0; border-radius: 8px 0 0 8px; background: var(--agr-input-bg, #fff);
180
+ color: var(--agr-fg, #222); font-size: 18px; font-weight: 700; line-height: 1; cursor: pointer;
181
+ }
182
+ .agc-ic-toggle:hover { color: var(--agr-accent, #2563eb); border-color: var(--agr-accent, #2563eb); }
183
+ .agc-ic-panel { min-width: 0; overflow: auto; border-left: 1px solid var(--agr-border, #ddd); background: color-mix(in srgb, var(--agr-fg, #000) 2.5%, var(--agr-row-bg, #fff)); }
184
+ .agc-ic-tabs { position: sticky; top: 0; z-index: 1; display: flex; border-bottom: 1px solid var(--agr-border, #ddd); background: inherit; }
185
+ .agc-ic-tab { flex: 1 1 0; height: 38px; border: 0; background: transparent; color: var(--agr-muted, #666); font: inherit; font-weight: 700; cursor: pointer; position: relative; }
186
+ .agc-ic-tab[aria-selected='true'] { color: var(--agr-fg, #222); }
187
+ .agc-ic-tab[aria-selected='true']::after { content: ''; position: absolute; left: 12px; right: 12px; bottom: -1px; height: 2px; background: var(--agr-accent, #2563eb); }
188
+ .agc-ic-pane { padding: 10px 12px 16px; display: flex; flex-direction: column; gap: 10px; }
189
+ .agc-ic-group-title { margin: 4px 0 6px; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--agr-muted, #666); }
190
+ .agc-ic-types { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
191
+ .agc-ic-type {
192
+ display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 7px 4px 6px; min-width: 0;
193
+ border: 1px solid var(--agr-border, #ddd); border-radius: 8px; background: var(--agr-row-bg, #fff); color: var(--agr-fg, #222); font: inherit; cursor: pointer;
194
+ }
195
+ .agc-ic-type:hover { border-color: var(--agr-accent, #2563eb); }
196
+ .agc-ic-type[aria-pressed='true'] { border-color: var(--agr-accent, #2563eb); box-shadow: inset 0 0 0 1px var(--agr-accent, #2563eb); background: color-mix(in srgb, var(--agr-accent, #2563eb) 10%, var(--agr-row-bg, #fff)); }
197
+ .agc-ic-type-label { font-size: 10.5px; line-height: 1.2; text-align: center; color: var(--agr-muted, #666); overflow: hidden; text-overflow: ellipsis; max-width: 100%; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
198
+ .agc-ic-type[aria-pressed='true'] .agc-ic-type-label { color: var(--agr-fg, #222); font-weight: 600; }
199
+ .agc-type-icon .agc-ti-fill.agc-ti-1 { fill: var(--agc-1, var(--agr-accent, #2563eb)); }
200
+ .agc-type-icon .agc-ti-fill.agc-ti-2 { fill: var(--agc-2, #14b8a6); }
201
+ .agc-type-icon .agc-ti-fill.agc-ti-3 { fill: var(--agc-3, #f97316); }
202
+ .agc-type-icon .agc-ti-stroke.agc-ti-1 { stroke: var(--agc-1, var(--agr-accent, #2563eb)); }
203
+ .agc-type-icon .agc-ti-stroke.agc-ti-2 { stroke: var(--agc-2, #14b8a6); }
204
+ .agc-type-icon .agc-ti-stroke.agc-ti-3 { stroke: var(--agr-muted, #999); }
205
+ .agc-ic-field { display: flex; flex-direction: column; gap: 5px; }
206
+ .agc-ic-label { font-size: 12px; font-weight: 700; }
207
+ .agc-ic-field .agc-control { width: 100%; }
208
+ .agc-ic-series { margin: 0; padding: 8px 10px; border: 1px solid var(--agr-border, #ddd); border-radius: 8px; display: grid; gap: 6px; }
209
+ .agc-ic-series legend { padding: 0 4px; }
210
+ .agc-ic-checks { display: grid; gap: 8px; }
211
+ .agc-check { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
212
+ .agc-check input { accent-color: var(--agr-accent, #2563eb); }
213
+ .agc-ic-note { margin: 0; color: var(--agr-muted, #666); font-size: 12px; }
214
+ @media (max-width: 720px) {
215
+ .agc-ic-body { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(220px, 1fr) auto minmax(0, 45%); }
216
+ .agc-ic-panel-closed .agc-ic-body { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) auto 0; }
217
+ .agc-ic-toggle { justify-self: center; width: 64px; height: 20px; border: 1px solid var(--agr-border, #ccc); border-bottom: 0; border-radius: 8px 8px 0 0; transform: rotate(90deg) translateX(0); writing-mode: horizontal-tb; }
218
+ .agc-ic-panel { border-left: 0; border-top: 1px solid var(--agr-border, #ddd); }
219
+ }
220
+ @media (prefers-reduced-motion: reduce) { .agc-ic, .agc-ic-backdrop { animation: none; } }
221
+ .agc-ic-pane[hidden], .agc-ic-panel[hidden] { display: none; }
@@ -0,0 +1,62 @@
1
+ /** Pure data transforms used by the chart renderers (unit-tested). */
2
+ export type Datum = Record<string, unknown>;
3
+ export declare function toNumber(v: unknown): number;
4
+ /** "Nice" axis ticks covering [min, max]. */
5
+ export declare function niceTicks(min: number, max: number, count?: number): number[];
6
+ export declare function compactNumber(n: number): string;
7
+ export interface Bin {
8
+ x0: number;
9
+ x1: number;
10
+ count: number;
11
+ label: string;
12
+ }
13
+ export declare function histogramBins(values: number[], bins?: number): Bin[];
14
+ /** Stack series per category. Positive and negative values stack separately. */
15
+ export declare function stack(values: number[][]): Array<Array<[number, number]>>;
16
+ export interface WaterfallStep {
17
+ label: string;
18
+ start: number;
19
+ end: number;
20
+ value: number;
21
+ kind: 'up' | 'down' | 'total';
22
+ }
23
+ export declare function waterfall(labels: string[], deltas: number[], totalLabel?: string): WaterfallStep[];
24
+ export interface Rect {
25
+ x: number;
26
+ y: number;
27
+ w: number;
28
+ h: number;
29
+ }
30
+ /** Squarified treemap layout. Returns rects in input order. */
31
+ export declare function treemap(values: number[], box: Rect): Rect[];
32
+ export type Agg = 'sum' | 'avg' | 'count' | 'min' | 'max';
33
+ /** Group rows by a category and aggregate measure fields. */
34
+ export declare function aggregateBy(rows: Datum[], categoryKey: string, measures: Array<{
35
+ key: string;
36
+ agg: Agg;
37
+ }>): Datum[];
38
+ export interface Regression {
39
+ slope: number;
40
+ intercept: number;
41
+ r2: number;
42
+ at: (x: number) => number;
43
+ }
44
+ /** Ordinary least squares over x = 0..n-1 (or the supplied xs). */
45
+ export declare function linearRegression(ys: number[], xs?: number[]): Regression;
46
+ export interface ForecastPoint {
47
+ value: number;
48
+ low: number;
49
+ high: number;
50
+ }
51
+ /**
52
+ * Holt's linear (double exponential) smoothing forecast with an approximate
53
+ * 95% interval that widens with the horizon. Deterministic and dependency-free.
54
+ */
55
+ export declare function holtForecast(ys: number[], periods: number, alpha?: number, beta?: number): ForecastPoint[];
56
+ /** Labels for future periods: continues YYYY-MM, YYYY-MM-DD, YYYY and Qn sequences; falls back to "+1". */
57
+ export declare function nextLabels(labels: string[], periods: number): string[];
58
+ /** Index of the max and min values (ignores non-finite). */
59
+ export declare function extremes(values: number[]): {
60
+ maxIndex: number;
61
+ minIndex: number;
62
+ };
@@ -0,0 +1,274 @@
1
+ /** Pure data transforms used by the chart renderers (unit-tested). */
2
+ export function toNumber(v) {
3
+ if (typeof v === 'number')
4
+ return Number.isFinite(v) ? v : 0;
5
+ if (typeof v === 'string' && v.trim() !== '') {
6
+ const n = Number(v.replace(/,/g, ''));
7
+ return Number.isFinite(n) ? n : 0;
8
+ }
9
+ return 0;
10
+ }
11
+ /** "Nice" axis ticks covering [min, max]. */
12
+ export function niceTicks(min, max, count = 5) {
13
+ if (!Number.isFinite(min) || !Number.isFinite(max))
14
+ return [0, 1];
15
+ if (min === max) {
16
+ if (min === 0)
17
+ return [0, 1];
18
+ const pad = Math.abs(min) * 0.1;
19
+ min -= pad;
20
+ max += pad;
21
+ }
22
+ const span = max - min;
23
+ const raw = span / Math.max(1, count);
24
+ const mag = 10 ** Math.floor(Math.log10(raw));
25
+ const norm = raw / mag;
26
+ const step = (norm >= 5 ? 10 : norm >= 2 ? 5 : norm >= 1 ? 2 : 1) * mag;
27
+ const start = Math.floor(min / step) * step;
28
+ const end = Math.ceil(max / step) * step;
29
+ const out = [];
30
+ for (let v = start; v <= end + step / 2; v += step)
31
+ out.push(Math.round(v / step) * step);
32
+ return out;
33
+ }
34
+ export function compactNumber(n) {
35
+ const a = Math.abs(n);
36
+ if (a >= 1e9)
37
+ return `${(n / 1e9).toFixed(a >= 1e10 ? 0 : 1)}B`;
38
+ if (a >= 1e6)
39
+ return `${(n / 1e6).toFixed(a >= 1e7 ? 0 : 1)}M`;
40
+ if (a >= 1e3)
41
+ return `${(n / 1e3).toFixed(a >= 1e4 ? 0 : 1)}K`;
42
+ return Number.isInteger(n) ? String(n) : n.toFixed(2);
43
+ }
44
+ export function histogramBins(values, bins = 10) {
45
+ const v = values.filter((x) => Number.isFinite(x));
46
+ if (!v.length)
47
+ return [];
48
+ let min = Math.min(...v);
49
+ let max = Math.max(...v);
50
+ if (min === max) {
51
+ min -= 0.5;
52
+ max += 0.5;
53
+ }
54
+ const width = (max - min) / bins;
55
+ const out = Array.from({ length: bins }, (_, i) => ({
56
+ x0: min + i * width, x1: min + (i + 1) * width, count: 0, label: `${compactNumber(min + i * width)}–${compactNumber(min + (i + 1) * width)}`,
57
+ }));
58
+ for (const x of v)
59
+ out[Math.min(bins - 1, Math.floor((x - min) / width))].count++;
60
+ return out;
61
+ }
62
+ /** Stack series per category. Positive and negative values stack separately. */
63
+ export function stack(values) {
64
+ // values[s][c]
65
+ const cats = values[0]?.length ?? 0;
66
+ const pos = new Array(cats).fill(0);
67
+ const neg = new Array(cats).fill(0);
68
+ return values.map((series) => series.map((v, c) => {
69
+ if (v >= 0) {
70
+ const r = [pos[c], pos[c] + v];
71
+ pos[c] += v;
72
+ return r;
73
+ }
74
+ const r = [neg[c] + v, neg[c]];
75
+ neg[c] += v;
76
+ return r;
77
+ }));
78
+ }
79
+ export function waterfall(labels, deltas, totalLabel = 'Total') {
80
+ let run = 0;
81
+ const steps = labels.map((label, i) => {
82
+ const start = run;
83
+ run += deltas[i];
84
+ return { label, start, end: run, value: deltas[i], kind: deltas[i] >= 0 ? 'up' : 'down' };
85
+ });
86
+ steps.push({ label: totalLabel, start: 0, end: run, value: run, kind: 'total' });
87
+ return steps;
88
+ }
89
+ /** Squarified treemap layout. Returns rects in input order. */
90
+ export function treemap(values, box) {
91
+ const total = values.reduce((a, b) => a + Math.max(0, b), 0);
92
+ const out = new Array(values.length);
93
+ if (!total)
94
+ return values.map(() => ({ x: box.x, y: box.y, w: 0, h: 0 }));
95
+ const items = values.map((v, i) => ({ i, a: (Math.max(0, v) / total) * box.w * box.h })).sort((a, b) => b.a - a.a);
96
+ let rect = { ...box };
97
+ const worst = (row, side) => {
98
+ const s = row.reduce((a, b) => a + b, 0);
99
+ const mx = Math.max(...row);
100
+ const mn = Math.min(...row);
101
+ return Math.max((side * side * mx) / (s * s), (s * s) / (side * side * mn));
102
+ };
103
+ let row = [];
104
+ const layoutRow = (r) => {
105
+ const s = r.reduce((a, b) => a + b.a, 0);
106
+ if (rect.w >= rect.h) {
107
+ const w = s / rect.h;
108
+ let y = rect.y;
109
+ for (const it of r) {
110
+ const hgt = it.a / w;
111
+ out[it.i] = { x: rect.x, y, w, h: hgt };
112
+ y += hgt;
113
+ }
114
+ rect = { x: rect.x + w, y: rect.y, w: rect.w - w, h: rect.h };
115
+ }
116
+ else {
117
+ const hgt = s / rect.w;
118
+ let x = rect.x;
119
+ for (const it of r) {
120
+ const w = it.a / hgt;
121
+ out[it.i] = { x, y: rect.y, w, h: hgt };
122
+ x += w;
123
+ }
124
+ rect = { x: rect.x, y: rect.y + hgt, w: rect.w, h: rect.h - hgt };
125
+ }
126
+ };
127
+ for (const it of items) {
128
+ if (it.a <= 0) {
129
+ out[it.i] = { x: rect.x, y: rect.y, w: 0, h: 0 };
130
+ continue;
131
+ }
132
+ const side = Math.min(rect.w, rect.h);
133
+ if (!row.length || worst([...row.map((r) => r.a), it.a], side) <= worst(row.map((r) => r.a), side))
134
+ row.push(it);
135
+ else {
136
+ layoutRow(row);
137
+ row = [it];
138
+ }
139
+ }
140
+ if (row.length)
141
+ layoutRow(row);
142
+ return out;
143
+ }
144
+ /** Group rows by a category and aggregate measure fields. */
145
+ export function aggregateBy(rows, categoryKey, measures) {
146
+ const groups = new Map();
147
+ for (const r of rows) {
148
+ const k = String(r[categoryKey] ?? '(Blank)');
149
+ let g = groups.get(k);
150
+ if (!g)
151
+ groups.set(k, (g = []));
152
+ g.push(r);
153
+ }
154
+ return [...groups.entries()].map(([k, list]) => {
155
+ const out = { [categoryKey]: k };
156
+ for (const m of measures) {
157
+ const nums = list.map((r) => toNumber(r[m.key]));
158
+ out[m.key] =
159
+ m.agg === 'count' ? list.length
160
+ : m.agg === 'avg' ? (nums.length ? nums.reduce((a, b) => a + b, 0) / nums.length : 0)
161
+ : m.agg === 'min' ? Math.min(...nums)
162
+ : m.agg === 'max' ? Math.max(...nums)
163
+ : nums.reduce((a, b) => a + b, 0);
164
+ }
165
+ return out;
166
+ });
167
+ }
168
+ /** Ordinary least squares over x = 0..n-1 (or the supplied xs). */
169
+ export function linearRegression(ys, xs) {
170
+ const n = ys.length;
171
+ const X = xs ?? ys.map((_, i) => i);
172
+ if (n < 2)
173
+ return { slope: 0, intercept: ys[0] ?? 0, r2: 0, at: () => ys[0] ?? 0 };
174
+ const mx = X.reduce((a, b) => a + b, 0) / n;
175
+ const my = ys.reduce((a, b) => a + b, 0) / n;
176
+ let sxy = 0;
177
+ let sxx = 0;
178
+ let syy = 0;
179
+ for (let i = 0; i < n; i++) {
180
+ sxy += (X[i] - mx) * (ys[i] - my);
181
+ sxx += (X[i] - mx) ** 2;
182
+ syy += (ys[i] - my) ** 2;
183
+ }
184
+ const slope = sxx ? sxy / sxx : 0;
185
+ const intercept = my - slope * mx;
186
+ const r2 = sxx && syy ? (sxy * sxy) / (sxx * syy) : 0;
187
+ return { slope, intercept, r2, at: (x) => intercept + slope * x };
188
+ }
189
+ /**
190
+ * Holt's linear (double exponential) smoothing forecast with an approximate
191
+ * 95% interval that widens with the horizon. Deterministic and dependency-free.
192
+ */
193
+ export function holtForecast(ys, periods, alpha = 0.5, beta = 0.3) {
194
+ const clean = ys.filter((v) => Number.isFinite(v));
195
+ if (!clean.length || periods <= 0)
196
+ return [];
197
+ if (clean.length === 1)
198
+ return Array.from({ length: periods }, () => ({ value: clean[0], low: clean[0], high: clean[0] }));
199
+ let level = clean[0];
200
+ let trend = clean[1] - clean[0];
201
+ const residuals = [];
202
+ for (let i = 1; i < clean.length; i++) {
203
+ const predicted = level + trend;
204
+ residuals.push(clean[i] - predicted);
205
+ const prevLevel = level;
206
+ level = alpha * clean[i] + (1 - alpha) * (level + trend);
207
+ trend = beta * (level - prevLevel) + (1 - beta) * trend;
208
+ }
209
+ const sigma = Math.sqrt(residuals.reduce((s, r) => s + r * r, 0) / Math.max(1, residuals.length));
210
+ return Array.from({ length: periods }, (_, i) => {
211
+ const h = i + 1;
212
+ const value = level + h * trend;
213
+ const spread = 1.96 * sigma * Math.sqrt(h);
214
+ return { value, low: value - spread, high: value + spread };
215
+ });
216
+ }
217
+ /** Labels for future periods: continues YYYY-MM, YYYY-MM-DD, YYYY and Qn sequences; falls back to "+1". */
218
+ export function nextLabels(labels, periods) {
219
+ const last = labels[labels.length - 1] ?? '';
220
+ const out = [];
221
+ let m = /^(\d{4})-(\d{2})$/.exec(last);
222
+ if (m) {
223
+ let y = Number(m[1]);
224
+ let mo = Number(m[2]);
225
+ for (let i = 0; i < periods; i++) {
226
+ mo++;
227
+ if (mo > 12) {
228
+ mo = 1;
229
+ y++;
230
+ }
231
+ out.push(`${y}-${String(mo).padStart(2, '0')}`);
232
+ }
233
+ return out;
234
+ }
235
+ m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(last);
236
+ if (m) {
237
+ const step = labels.length > 1 ? Date.parse(last) - Date.parse(labels[labels.length - 2]) : 86_400_000;
238
+ for (let i = 1; i <= periods; i++)
239
+ out.push(new Date(Date.parse(last) + i * (step || 86_400_000)).toISOString().slice(0, 10));
240
+ return out;
241
+ }
242
+ if (/^\d{4}$/.test(last))
243
+ return Array.from({ length: periods }, (_, i) => String(Number(last) + i + 1));
244
+ m = /^Q([1-4])\s*(\d{4})$/.exec(last);
245
+ if (m) {
246
+ let q = Number(m[1]);
247
+ let y = Number(m[2]);
248
+ for (let i = 0; i < periods; i++) {
249
+ q++;
250
+ if (q > 4) {
251
+ q = 1;
252
+ y++;
253
+ }
254
+ out.push(`Q${q} ${y}`);
255
+ }
256
+ return out;
257
+ }
258
+ return Array.from({ length: periods }, (_, i) => `+${i + 1}`);
259
+ }
260
+ /** Index of the max and min values (ignores non-finite). */
261
+ export function extremes(values) {
262
+ let maxIndex = -1;
263
+ let minIndex = -1;
264
+ values.forEach((v, i) => {
265
+ if (!Number.isFinite(v))
266
+ return;
267
+ if (maxIndex < 0 || v > values[maxIndex])
268
+ maxIndex = i;
269
+ if (minIndex < 0 || v < values[minIndex])
270
+ minIndex = i;
271
+ });
272
+ return { maxIndex, minIndex };
273
+ }
274
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,40 @@
1
1
  {
2
2
  "name": "@aurum-grid/charts",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Aurum Grid Charts: themeable SVG charts, standalone or grid-integrated.",
5
+ "license": "SEE LICENSE IN LICENSE.md",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./styles.css": "./dist/styles.css"
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "LICENSE.md",
19
+ "README.md"
20
+ ],
21
+ "sideEffects": [
22
+ "*.css"
23
+ ],
24
+ "dependencies": {},
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "keywords": [
29
+ "data grid",
30
+ "datagrid",
31
+ "table",
32
+ "enterprise",
33
+ "pivot",
34
+ "ag-grid alternative"
35
+ ],
36
+ "scripts": {
37
+ "build": "tsc -p tsconfig.json && node ../../scripts/copy-css.mjs",
38
+ "typecheck": "tsc -p tsconfig.json --noEmit"
39
+ }
6
40
  }