@moda-chart/core 0.1.2

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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/dist/conformance.d.ts +40 -0
  4. package/dist/conformance.d.ts.map +1 -0
  5. package/dist/conformance.js +1608 -0
  6. package/dist/conformance.js.map +1 -0
  7. package/dist/core.d.ts +448 -0
  8. package/dist/core.d.ts.map +1 -0
  9. package/dist/core.js +6026 -0
  10. package/dist/core.js.map +1 -0
  11. package/dist/geo.d.ts +85 -0
  12. package/dist/geo.d.ts.map +1 -0
  13. package/dist/geo.js +264 -0
  14. package/dist/geo.js.map +1 -0
  15. package/dist/geometry.d.ts +29 -0
  16. package/dist/geometry.d.ts.map +1 -0
  17. package/dist/geometry.js +92 -0
  18. package/dist/geometry.js.map +1 -0
  19. package/dist/hierarchy.d.ts +142 -0
  20. package/dist/hierarchy.d.ts.map +1 -0
  21. package/dist/hierarchy.js +422 -0
  22. package/dist/hierarchy.js.map +1 -0
  23. package/dist/index.d.ts +18 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +12 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/maps/world.d.ts +9 -0
  28. package/dist/maps/world.d.ts.map +1 -0
  29. package/dist/maps/world.js +9 -0
  30. package/dist/maps/world.js.map +1 -0
  31. package/dist/mount.d.ts +75 -0
  32. package/dist/mount.d.ts.map +1 -0
  33. package/dist/mount.js +795 -0
  34. package/dist/mount.js.map +1 -0
  35. package/dist/scales.d.ts +22 -0
  36. package/dist/scales.d.ts.map +1 -0
  37. package/dist/scales.js +118 -0
  38. package/dist/scales.js.map +1 -0
  39. package/dist/sparkline.d.ts +4 -0
  40. package/dist/sparkline.d.ts.map +1 -0
  41. package/dist/sparkline.js +62 -0
  42. package/dist/sparkline.js.map +1 -0
  43. package/dist/styles.css +989 -0
  44. package/dist/svg.d.ts +21 -0
  45. package/dist/svg.d.ts.map +1 -0
  46. package/dist/svg.js +1022 -0
  47. package/dist/svg.js.map +1 -0
  48. package/dist/text.d.ts +23 -0
  49. package/dist/text.d.ts.map +1 -0
  50. package/dist/text.js +67 -0
  51. package/dist/text.js.map +1 -0
  52. package/dist/types.d.ts +1881 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +8 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/xml.d.ts +13 -0
  57. package/dist/xml.d.ts.map +1 -0
  58. package/dist/xml.js +109 -0
  59. package/dist/xml.js.map +1 -0
  60. package/package.json +44 -0
@@ -0,0 +1,1881 @@
1
+ /**
2
+ * @moda-chart/core 타입 정의.
3
+ *
4
+ * 코어는 옵션(데이터 + 설정)을 받아 불변 스냅샷(렌더 모델)을 발행한다.
5
+ * 어댑터는 스냅샷을 같은 DOM 계약(mc-* 클래스)으로 그리기만 한다.
6
+ */
7
+ /** 차트 타입 — 시리즈별 override 가능 */
8
+ export type ChartType = "radar" | "radar-area" | "range-bar" | "range-area" | "candlestick" | "ohlc" | "boxplot" | "histogram" | "line" | "step" | "spline" | "area" | "bar" | "stacked-bar" | "percent-stacked-bar" | "waterfall" | "pie" | "donut" | "funnel" | "cone-funnel" | "pyramid" | "scatter" | "bubble" | "heatmap" | "wordcloud" | "map" | "sunburst" | "treemap" | "organization" | "sankey" | "chord" | "nightingale" | "radial-bar" | "radial-column" | "gauge" | "linear-gauge" | "pictogram" | "population-pyramid";
9
+ /** 스케일 종류 — x는 band/linear/time, y는 linear/log */
10
+ export type ScaleKind = "linear" | "log" | "time" | "band";
11
+ export type AxisPosition = "left" | "right" | "bottom" | "top";
12
+ export type LegendPosition = "top" | "bottom" | "left" | "right" | "none";
13
+ export type TooltipMode = "point" | "shared" | "none";
14
+ export type ChartTheme = "light" | "dark";
15
+ /** 내장 문구 로케일 — ko면 emptyText/툴바 버튼이 한국어 */
16
+ export type ChartLocale = "ko" | "en";
17
+ export type ChartDirection = "vertical" | "horizontal";
18
+ /**
19
+ * x축 카테고리 값 — 문자열은 band, number는 linear, Date는 time.
20
+ * 배열이면 그룹 카테고리(AG Charts grouped category axis 해당) —
21
+ * 마지막 요소가 리프 라벨, 앞 요소는 그룹 라벨로 두 번째 틱 행에 표시된다.
22
+ */
23
+ export type CategoryValue = string | number | Date | readonly (string | number | Date)[];
24
+ /** 산점도/시계열용 명시 포인트 */
25
+ export interface ChartPointInput {
26
+ x: number | string | Date;
27
+ y: number | null;
28
+ /** 버블 차트 크기 값 — 반지름은 전체 버블의 최대 z 대비 sqrt로 스케일된다 */
29
+ z?: number;
30
+ /** 포인트 고정 색 — IBChart pointColor 해당. itemStyle보다 우선순위 낮음 */
31
+ color?: string;
32
+ /** 포인트 이름 — 툴팁/라벨/aria에 카테고리 라벨 대신 표시 (pointName 해당) */
33
+ name?: string;
34
+ /**
35
+ * 포인트 부가 데이터 — IBChart etcData 해당. 툴팁 컨텍스트와
36
+ * pointSelect 이벤트에 그대로 전달된다 (코드표/원문 키 등).
37
+ */
38
+ etcData?: unknown;
39
+ }
40
+ /** boxplot 입력 — 카테고리별 [최소, Q1, 중앙값, Q3, 최대] */
41
+ export type ChartBoxInput = readonly [
42
+ min: number,
43
+ q1: number,
44
+ median: number,
45
+ q3: number,
46
+ max: number
47
+ ];
48
+ /**
49
+ * 포인트 스타일 콜백 결과 — AG Charts itemStyler 해당.
50
+ * color는 시리즈 색을 덮는 포인트 고정색, name은 라벨 대체 이름이다.
51
+ */
52
+ export interface ItemStyle {
53
+ color?: string;
54
+ name?: string;
55
+ }
56
+ /** itemStyle 콜백 입력 — 렌더되는 포인트/슬라이스 단위 */
57
+ export interface ItemStyleContext {
58
+ seriesId: string;
59
+ /** 데이터 인덱스 — 슬라이스 타입은 카테고리 인덱스 */
60
+ index: number;
61
+ value: number | null;
62
+ /** 기본 라벨 (카테고리/포인트 이름) */
63
+ label: string;
64
+ }
65
+ /** 지도 마커 — 경도/위도 포인트 레이어 (AG Charts map-marker 해당) */
66
+ export interface ChartMapPoint {
67
+ /** 경도 (degree) */
68
+ lon: number;
69
+ /** 위도 (degree) */
70
+ lat: number;
71
+ /** 버블 크기 값 — 있으면 전체 마커의 최대 대비 sqrt 스케일 */
72
+ value?: number;
73
+ /** 툴팁/라벨 이름 — 기본 "lon, lat" */
74
+ label?: string;
75
+ /** 마커 고정 색 */
76
+ color?: string;
77
+ /**
78
+ * 아바타 이미지 URL — 있으면 원형 클립 이미지 마커(.mc-map-avatar)로
79
+ * 렌더된다. 사용자 지도(프로필 핀) 용도. data URI도 허용.
80
+ */
81
+ image?: string;
82
+ /**
83
+ * 내 위치 표시 — 마커 주위에 펄스 링(.mc-map-pulse)을 애니메이션한다.
84
+ */
85
+ pulse?: boolean;
86
+ }
87
+ /** 지도 라인 — 두 좌표를 잇는 연결선 (AG Charts map-line 해당) */
88
+ export interface ChartMapLine {
89
+ from: readonly [lon: number, lat: number];
90
+ to: readonly [lon: number, lat: number];
91
+ label?: string;
92
+ }
93
+ /** 입력 시리즈 — values는 categories와 인덱스 정렬, points는 명시 좌표 */
94
+ export interface ChartSeriesInput {
95
+ name?: string;
96
+ /** 고정 색. 없으면 팔레트(--chart-palette-N) 순환 */
97
+ color?: string;
98
+ /** 차트 타입 override (혼합 차트) */
99
+ type?: ChartType;
100
+ /** 다중 축 — yAxis 항목의 id. 기본 첫 번째 축 */
101
+ axis?: string;
102
+ values?: readonly (number | null)[];
103
+ points?: readonly ChartPointInput[];
104
+ /** range-bar/range-area — 카테고리별 [최소, 최대] */
105
+ ranges?: readonly (readonly [number, number])[];
106
+ /** candlestick/ohlc — 카테고리별 [시가, 고가, 저가, 종가] */
107
+ ohlc?: readonly (readonly [number, number, number, number])[];
108
+ /** boxplot — 카테고리별 [최소, Q1, 중앙값, Q3, 최대] */
109
+ box?: readonly ChartBoxInput[];
110
+ /**
111
+ * 포인트 스타일 콜백 — AG Charts itemStyler 해당.
112
+ * 포인트/바/슬라이스/마커마다 호출돼 color/name을 덮어쓴다.
113
+ * 포인트의 명시 color/name 필드보다 우선한다.
114
+ */
115
+ itemStyle?: (item: ItemStyleContext) => ItemStyle | null | undefined;
116
+ /** 에러바 — 포인트별 [하한 편차, 상한 편차]. line/bar/scatter에 적용 */
117
+ errors?: readonly (readonly [number, number])[];
118
+ /** 추세선 오버레이 — "linear"(최소제곱) | "movingAverage" */
119
+ trend?: {
120
+ type: "linear" | "movingAverage";
121
+ period?: number;
122
+ };
123
+ /** map 타입 — 지역 코드별 값. 코드는 피처 id/iso 코드/name과 조인된다 */
124
+ mapData?: readonly ChartMapDatum[];
125
+ /** map 타입 — 위성 마커 레이어 (도시 포인트/버블) */
126
+ mapPoints?: readonly ChartMapPoint[];
127
+ /** map 타입 — 연결선 레이어 (출발→도착) */
128
+ mapLines?: readonly ChartMapLine[];
129
+ /**
130
+ * 계층 차트(sunburst/treemap) — 트리 노드 배열.
131
+ * 노드의 value 생략 시 children 합계로 계산된다.
132
+ */
133
+ tree?: readonly ChartTreeNode[];
134
+ /**
135
+ * sankey — 노드 간 플로우. 노드 목록은 source/target 이름에서
136
+ * 유도되고 열은 최장 경로 깊이로 배정된다.
137
+ */
138
+ links?: readonly ChartFlowLink[];
139
+ /**
140
+ * 시리즈 부가 데이터 — IBChart etcData 해당. 툴팁 컨텍스트와
141
+ * pointSelect 이벤트에 전달되며 chart.getEtcData로 조회할 수 있다.
142
+ */
143
+ etcData?: unknown;
144
+ }
145
+ /** 계층 차트 트리 노드 — sunburst/treemap의 재귀 입력 */
146
+ export interface ChartTreeNode {
147
+ name: string;
148
+ /** 값 — 생략 시 children 합계로 계산된다 */
149
+ value?: number;
150
+ children?: readonly ChartTreeNode[];
151
+ }
152
+ /** sankey 플로우 — source 노드 → target 노드 방향 유량 */
153
+ export interface ChartFlowLink {
154
+ source: string;
155
+ target: string;
156
+ value: number;
157
+ }
158
+ /** sankey 레이아웃 옵션 */
159
+ export interface ChartSankeyOptions {
160
+ /** 노드 두께 px (기본 12) */
161
+ nodeWidth?: number;
162
+ /** 같은 열 노드 사이 간격 px (기본 12) */
163
+ nodeGap?: number;
164
+ }
165
+ /**
166
+ * chord 데이터 — n×n 유향 플로우 행렬.
167
+ * matrix[i][j]는 그룹 i → 그룹 j의 유량, (i,j)와 (j,i)는 같은 리본의
168
+ * 양끝 두께가 된다.
169
+ */
170
+ export interface ChartChordOptions {
171
+ matrix: readonly (readonly number[])[];
172
+ /** 그룹 라벨 — 기본 G0..Gn-1 */
173
+ labels?: readonly string[];
174
+ }
175
+ /** gauge 옵션 — type:"gauge"의 단일 값 다이얼 범위 */
176
+ export interface ChartGaugeOptions {
177
+ /** 최소값 (기본 0) */
178
+ min?: number;
179
+ /** 최대값 (기본 100) */
180
+ max?: number;
181
+ /** 목표값 — 있으면 트랙 위에 .mc-gauge-target 눈금을 그린다 */
182
+ target?: number;
183
+ }
184
+ /** 지도 값 레코드 — 지역 코드 → 값 (choropleth) */
185
+ export interface ChartMapDatum {
186
+ /**
187
+ * 지역 코드 — topology 피처의 id, ISO 코드(iso_a2/iso_a3),
188
+ * name과 대소문자 무관하게 조인된다 (world-atlas는 ISO numeric id).
189
+ */
190
+ code: string;
191
+ value: number;
192
+ }
193
+ /** 지도 투영 — mercator는 위도 ±85°로 클램프 */
194
+ export type MapProjection = "equirectangular" | "mercator";
195
+ /** 지도 옵션 — topology는 TopoJSON 또는 GeoJSON */
196
+ export interface ChartMapOptions {
197
+ /**
198
+ * 지형 데이터 — TopoJSON Topology 또는 GeoJSON FeatureCollection.
199
+ * `WORLD_TOPOLOGY`(내장 세계 지도)를 넘기거나 사용자 지형을 주입한다.
200
+ * 없으면 지역이 렌더되지 않는다(빈 상태).
201
+ */
202
+ topology?: unknown;
203
+ /** TopoJSON objects의 오브젝트명 — 기본 첫 오브젝트 */
204
+ object?: string;
205
+ /** 투영 — 기본 "equirectangular" */
206
+ projection?: MapProjection;
207
+ /**
208
+ * 피처 → 조인 키 추출 — 기본은 id + iso_a2/iso_a3/name 후보 전부.
209
+ * 반환값이 조인의 1순위 키가 된다.
210
+ */
211
+ featureKey?: (f: {
212
+ id?: string | number;
213
+ properties?: Record<string, unknown>;
214
+ }) => string | number | undefined;
215
+ /**
216
+ * 렌더에서 제외할 피처 코드 — 기본 남극 제외
217
+ * (남극이 들어가면 면적 대비 표시 영역이 크게 줄어든다).
218
+ */
219
+ excludeCodes?: readonly string[];
220
+ /**
221
+ * 렌더에 포함할 피처 코드 — 지정 시 이 목록에 맞는 피처만 쓴다.
222
+ * `["410"]`이면 WORLD_TOPOLOGY에서 한국만 플롯에 맞춘다
223
+ * (사용자 지도처럼 한 지역만 확대해 쓸 때).
224
+ */
225
+ includeCodes?: readonly string[];
226
+ /**
227
+ * 마커 클러스터링 — 가까운 마커를 카운트 버블(.mc-map-cluster)로 묶는다.
228
+ * true면 켜고 { size }는 화면 px 셀 크기(기본 48). 클러스터 클릭은
229
+ * clusterSelect 이벤트로 묶인 포인트를 전달한다.
230
+ */
231
+ cluster?: boolean | {
232
+ size?: number;
233
+ };
234
+ /**
235
+ * 지도 팬/줌 — 플롯 중심 변환으로 휠 줌·드래그 팬·핀치를 지원한다.
236
+ * 축 기반 zoom 옵션과 별개로 지도 레이어만 변환된다.
237
+ */
238
+ panZoom?: boolean;
239
+ /** 색상 스케일 저값 색 (기본 --chart-map-from) */
240
+ from?: string;
241
+ /** 색상 스케일 고값 색 (기본 --chart-map-to) */
242
+ to?: string;
243
+ }
244
+ export interface TooltipFormatContext {
245
+ seriesId: string;
246
+ name: string;
247
+ index: number;
248
+ /** 카테고리/슬라이스 라벨 */
249
+ label: string;
250
+ /** 전체 대비 비율 (파이) */
251
+ percent?: number;
252
+ /** 포인트/시리즈 부가 데이터 (etcData) */
253
+ etcData?: unknown;
254
+ }
255
+ export interface ChartAxisOptions {
256
+ id?: string;
257
+ position?: AxisPosition;
258
+ scale?: ScaleKind;
259
+ min?: number;
260
+ max?: number;
261
+ tickCount?: number;
262
+ label?: string;
263
+ grid?: boolean;
264
+ format?: (value: number) => string;
265
+ }
266
+ export interface ChartPadding {
267
+ top: number;
268
+ right: number;
269
+ bottom: number;
270
+ left: number;
271
+ }
272
+ export interface ChartLegendOptions {
273
+ position?: LegendPosition;
274
+ /**
275
+ * 범례 항목 앞에 체크박스 — IBChart series showCheckbox 해당.
276
+ * 체크 상태 = 시리즈/슬라이스 가시성, 클릭 시 legendCheck 이벤트 발행.
277
+ */
278
+ checkboxes?: boolean;
279
+ /**
280
+ * 페이지네이션 — 항목이 pageSize를 넘으면 잘라 보여주고
281
+ * .mc-legend-prev/.mc-legend-next 버튼으로 넘긴다 (AG legend pagination 해당).
282
+ * true면 페이지당 8개, 숫자면 페이지 크기.
283
+ */
284
+ pagination?: boolean | number;
285
+ }
286
+ /** 툴팁 HTML 렌더 컨텍스트 — tooltip.render 콜백 입력 */
287
+ export interface TooltipRenderContext {
288
+ /** 툴팁 제목 (카테고리/포인트 라벨) */
289
+ title: string;
290
+ rows: TooltipRowView[];
291
+ }
292
+ export interface ChartTooltipOptions {
293
+ mode?: TooltipMode;
294
+ /** 값 → 툴팁 문자열 포맷터 */
295
+ format?: (value: number | null, ctx: TooltipFormatContext) => string;
296
+ /**
297
+ * 툴팁 전체 HTML 렌더러 — 반환 문자열이 .mc-tooltip의 innerHTML이 된다
298
+ * (AG Charts tooltip.renderer / IBChart tooltip formatter 해당).
299
+ * 반환값은 escape 없이 삽입되므로 신뢰된 마크업만 반환할 것.
300
+ */
301
+ render?: (ctx: TooltipRenderContext) => string;
302
+ }
303
+ export interface ChartZoomOptions {
304
+ wheel?: boolean;
305
+ pan?: boolean;
306
+ /** 도메인 단위 최소 창 크기 (band: 카테고리 수) */
307
+ minSpan?: number;
308
+ /**
309
+ * 줌이 적용되는 도메인 축 — "x"(기본, 카테고리/x 도메인)만.
310
+ * "y" 또는 "xy"면 값 축 도메인(첫 y축)도 wheel/pan 대상이 된다.
311
+ */
312
+ axes?: "x" | "y" | "xy";
313
+ /**
314
+ * Shift+드래그로 영역 줌 — brush와 동시에 켜면 brush가 우선한다.
315
+ * axes가 적용된 방향의 범위로 줌된다 (.mc-selection rect 재사용).
316
+ */
317
+ select?: boolean;
318
+ }
319
+ /**
320
+ * setZoomWindow 입력 — DomainWindow이면 x 창으로 해석하고,
321
+ * { x, y } 객체면 축별로 지정한다. null은 전체 리셋.
322
+ */
323
+ export type ZoomWindowInput = DomainWindow | {
324
+ x?: DomainWindow | null;
325
+ y?: DomainWindow | null;
326
+ } | null;
327
+ export interface ChartAnimationOptions {
328
+ duration?: number;
329
+ /**
330
+ * 데이터 갱신 전환 — setData/실시간 API/updateDelta로 데이터가 바뀐
331
+ * 뒤 첫 렌더에 .mc-updating이 붙어 mc-update 키프레임이 재생된다.
332
+ * 기본 true. false면 갱신 전환을 끄고 진입 애니메이션만 남긴다.
333
+ */
334
+ updates?: boolean;
335
+ }
336
+ /** 데이터 라벨 — 포인트/바/슬라이스 위의 값 텍스트 */
337
+ export interface ChartDataLabelOptions {
338
+ /** 값 → 라벨 문자열 포맷터 (기본 formatNumber) */
339
+ format?: (value: number | null, ctx: TooltipFormatContext) => string;
340
+ }
341
+ /** 값 축 기준선 — 임계값/평균선 등 */
342
+ export interface MarkLineInput {
343
+ /** 값 축 도메인 값 */
344
+ value: number;
345
+ label?: string;
346
+ color?: string;
347
+ /** 다중 축 — yAxis 항목의 id. 기본 첫 번째 축 */
348
+ axis?: string;
349
+ }
350
+ /** 값 축 기준 영역 — 경고/정상 구간 음영 (IBChart plotBand 해당) */
351
+ export interface MarkBandInput {
352
+ /** 값 축 도메인 구간 시작 */
353
+ from: number;
354
+ /** 값 축 도메인 구간 끝 */
355
+ to: number;
356
+ label?: string;
357
+ color?: string;
358
+ /** 다중 축 — yAxis 항목의 id. 기본 첫 번째 축 */
359
+ axis?: string;
360
+ }
361
+ /** 히트맵 색상 스케일 — 저값→고값 그래디언트 */
362
+ export interface ChartHeatmapOptions {
363
+ /** 최소값 색 (기본 --chart-heat-from) */
364
+ from?: string;
365
+ /** 최대값 색 (기본 --chart-heat-to) */
366
+ to?: string;
367
+ }
368
+ /**
369
+ * 인라인 주석 — 데이터 좌표에 텍스트/이미지를 띄운다 (IBChart annotation 해당).
370
+ * x는 카테고리(band면 라벨, linear/time이면 값), y는 값 축 좌표.
371
+ * y 생략 시 플롯 상단에 배치된다.
372
+ */
373
+ export interface AnnotationInput {
374
+ x: CategoryValue;
375
+ y?: number;
376
+ /** 텍스트 주석 — label/image 중 하나는 필요 */
377
+ label?: string;
378
+ /** 이미지 주석 — url. width/height로 크기 지정 (기본 24×24) */
379
+ image?: string;
380
+ width?: number;
381
+ height?: number;
382
+ }
383
+ /**
384
+ * 드릴다운 레벨 — 포인트/슬라이스 클릭 시 교체될 데이터.
385
+ * `drilldown` 옵션 맵의 키는 포인트 라벨(카테고리 문자열)이다.
386
+ */
387
+ export interface DrilldownLevel {
388
+ series: readonly ChartSeriesInput[];
389
+ categories?: readonly CategoryValue[];
390
+ /** 드릴된 상태에서 .mc-title에 표시할 제목 */
391
+ title?: string;
392
+ }
393
+ /** histogram 빈 옵션 — binWidth 우선, 아니면 bins(기본 Sturges 개수) */
394
+ export interface ChartHistogramOptions {
395
+ bins?: number;
396
+ /** 고정 구간 폭 — 지정 시 bins보다 우선한다 (AG binCount 대비 binInterval 해당) */
397
+ binWidth?: number;
398
+ }
399
+ /** 컨텍스트 메뉴 커스텀 항목 — 내장(reset/export) 뒤에 붙는다 */
400
+ export interface ChartMenuItem {
401
+ /** menuAction 이벤트의 식별자 — 기본 "custom:{i}" */
402
+ id?: string;
403
+ label: string;
404
+ }
405
+ /**
406
+ * 컨텍스트 메뉴 — 플롯 우클릭 시 메뉴 (.mc-menu).
407
+ * true면 내장 항목(줌 리셋/SVG/PNG 저장)만, 객체면 items를 추가한다.
408
+ */
409
+ export interface ChartContextMenuOptions {
410
+ items?: readonly ChartMenuItem[];
411
+ }
412
+ /**
413
+ * 주석 그리기 도구 — setDrawMode로 활성 도구를 고르면 플롯 드래그가
414
+ * 주석 생성이 된다 (AG Charts annotations 그리기 도구 해당).
415
+ * - channel — 드래그한 추세선에 평행선+음영 밴드를 붙인 가격 채널
416
+ * - fibonacci — 드래그 구간의 피보나치 되돌림 레벨 (0~100%)
417
+ * - measure — 드래그 구간의 Δx/Δy를 라벨로 표시하는 측정 도구
418
+ */
419
+ export type DrawTool = "line" | "hline" | "vline" | "rect" | "channel" | "fibonacci" | "measure";
420
+ /** 그린 주석 입력 — 데이터 좌표(band x는 연속 인덱스 0..n) */
421
+ export interface DrawingInput {
422
+ tool: DrawTool;
423
+ /** 시작점 — x 도메인 값, y 값 축 값 */
424
+ x1: number;
425
+ y1: number;
426
+ /** 끝점 — hline은 y만, vline은 x만 쓴다 */
427
+ x2?: number;
428
+ y2?: number;
429
+ color?: string;
430
+ label?: string;
431
+ /** channel 도구의 평행선 오프셋 px — 기본 drawing.channelWidth */
432
+ width?: number;
433
+ }
434
+ export interface ChartDrawingOptions {
435
+ /** 그린 주석 선/영역 색 — 기본 --chart-draw-color */
436
+ color?: string;
437
+ /** channel 도구의 기본 채널 폭 px (기본 16) */
438
+ channelWidth?: number;
439
+ }
440
+ /**
441
+ * 외부 데이터 로딩 — IBChart search 네임스페이스 해당.
442
+ * load()가 url을 GET해 응답을 setData에 주입한다.
443
+ */
444
+ export interface ChartSearchOptions {
445
+ /** 데이터 URL — 응답은 {series, categories?} 형태의 JSON */
446
+ url?: string;
447
+ /** fetch RequestInit (headers/method 등) */
448
+ request?: RequestInit;
449
+ /** 응답 → 차트 데이터 변환기 — 없으면 응답을 그대로 해석한다 */
450
+ transform?: (raw: unknown) => {
451
+ series: ChartSeriesInput[];
452
+ categories?: CategoryValue[];
453
+ };
454
+ /** 차트 생성 시 자동 로드 */
455
+ auto?: boolean;
456
+ /** fetch 주입점 — 테스트/SSR에서 교체 */
457
+ fetcher?: (url: string, init?: RequestInit) => Promise<unknown>;
458
+ }
459
+ /** search.load()의 호출 인자 — 옵션을 덮어쓴다 */
460
+ export interface SearchLoadArgs {
461
+ url?: string;
462
+ request?: RequestInit;
463
+ transform?: (raw: unknown) => {
464
+ series: ChartSeriesInput[];
465
+ categories?: CategoryValue[];
466
+ };
467
+ }
468
+ /**
469
+ * 픽토그램 — type:"pictogram"의 아이콘 배치 옵션 (ISOTYPE 스타일).
470
+ * 카테고리별 행에 사람 아이콘을 값 비례로 채운다 — 아이콘 1개 = unit 값.
471
+ */
472
+ export interface ChartPictogramOptions {
473
+ /**
474
+ * 아이콘 1개가 나타내는 값 — 생략하면 행 최대 합계를
475
+ * maxPerRow로 나눈 nice 단위로 자동 계산한다.
476
+ */
477
+ unit?: number;
478
+ /** unit 자동 계산 기준 행당 아이콘 수 (기본 12) */
479
+ maxPerRow?: number;
480
+ }
481
+ /**
482
+ * 인구 피라미드 — type:"population-pyramid"의 옵션.
483
+ * 첫 시리즈는 좌측, 나머지 시리즈는 우측으로 그려지는 대칭 수평 막대.
484
+ * 값 축 도메인은 ±대칭이고 틱 라벨은 절대값으로 표시된다.
485
+ */
486
+ export interface ChartPyramidPopOptions {
487
+ /** 좌측으로 그릴 시리즈 수 (기본 1 — 첫 시리즈만 좌측) */
488
+ leftSeries?: number;
489
+ }
490
+ /** 코어 생성 옵션 */
491
+ export interface ChartCoreOptions {
492
+ type?: ChartType;
493
+ /** 차트 제목 — .mc-title */
494
+ title?: string;
495
+ /** 부제목 — .mc-subtitle */
496
+ subtitle?: string;
497
+ series?: readonly ChartSeriesInput[];
498
+ categories?: readonly CategoryValue[];
499
+ width?: number;
500
+ height?: number;
501
+ padding?: Partial<ChartPadding>;
502
+ /** bar 타입의 방향 — horizontal이면 값 축이 x로 간다 */
503
+ direction?: ChartDirection;
504
+ xAxis?: ChartAxisOptions;
505
+ /** 배열이면 다중 축 — position left/right 순서대로 배치 */
506
+ yAxis?: ChartAxisOptions | readonly ChartAxisOptions[];
507
+ palette?: readonly string[];
508
+ theme?: ChartTheme;
509
+ legend?: boolean | ChartLegendOptions;
510
+ tooltip?: TooltipMode | ChartTooltipOptions;
511
+ /** wheel 줌 + drag 팬. true면 둘 다 활성 */
512
+ zoom?: boolean | ChartZoomOptions;
513
+ /** drag로 x 범위 선택 */
514
+ brush?: boolean;
515
+ /**
516
+ * 네비게이터(미니맵) — 플롯 아래 전체 도메인 개요 + 드래그로
517
+ * 줌 창 제어. 직교 차트에서만 렌더된다 (AG Charts navigator 해당).
518
+ */
519
+ navigator?: boolean | {
520
+ height?: number;
521
+ };
522
+ /**
523
+ * 스크롤바 — 미니 시리즈 없는 얇은 줌 스트립 (.mc-scrollbar).
524
+ * 네비게이터가 켜져 있으면 네비게이터가 우선한다.
525
+ */
526
+ scrollbar?: boolean | {
527
+ height?: number;
528
+ };
529
+ /**
530
+ * 컨텍스트 메뉴 — 플롯 우클릭 시 열림 (AG Charts contextMenu 해당).
531
+ * 내장 항목: 줌 리셋/SVG 저장/PNG 저장 + items로 커스텀 추가.
532
+ * 커스텀 항목 선택은 menuAction 이벤트로 전달된다.
533
+ */
534
+ contextMenu?: boolean | ChartContextMenuOptions;
535
+ /**
536
+ * 차트 동기화 그룹 id — 같은 키를 가진 차트끼리 호버와
537
+ * 줌 창을 공유한다 (AG Charts sync 해당).
538
+ */
539
+ sync?: string;
540
+ /**
541
+ * 주석 그리기 도구 — chart.setDrawMode("line"|"hline"|"vline"|"rect")로
542
+ * 활성화하면 플롯 드래그가 주석을 만든다 (AG annotations 도구 해당).
543
+ * 그린 주석은 drawings 상태에 쌓이고 getState/setState로 왕복된다.
544
+ */
545
+ drawing?: boolean | ChartDrawingOptions;
546
+ /**
547
+ * 외부 데이터 로딩 — chart.search.load()로 url을 GET해
548
+ * setData에 주입한다. 로딩 중 loading 오버레이, 완료 시 searchEnd,
549
+ * 실패 시 searchError 이벤트 (IBChart search 해당).
550
+ */
551
+ search?: ChartSearchOptions;
552
+ /** histogram 빈 개수 — type:"histogram"의 원시 values를 구간화 */
553
+ histogram?: ChartHistogramOptions;
554
+ /**
555
+ * 픽토그램 — type:"pictogram"에서 아이콘 1개가 나타내는 값 등
556
+ * (인구/설문 통계의 ISOTYPE 스타일 사람 아이콘 차트)
557
+ */
558
+ pictogram?: ChartPictogramOptions;
559
+ /**
560
+ * 인구 피라미드 — type:"population-pyramid"의 좌측 시리즈 수.
561
+ * 첫 시리즈(기본)를 좌측으로 그리는 대칭 수평 막대 차트.
562
+ */
563
+ pyramidPop?: ChartPyramidPopOptions;
564
+ animation?: boolean | ChartAnimationOptions;
565
+ /** 값 라벨 표시 — true면 기본 포맷 */
566
+ dataLabels?: boolean | ChartDataLabelOptions;
567
+ /** 값 축 기준선 — 수평 차트에서는 x 축 기준 */
568
+ markLines?: readonly MarkLineInput[];
569
+ /** 값 축 기준 영역 — 경고/정상 구간 음영 */
570
+ markBands?: readonly MarkBandInput[];
571
+ /** 접근성 패턴 채우기 — 색 외에 무늬로도 시리즈를 구분한다 */
572
+ patterns?: boolean;
573
+ /** 히트맵 색상 스케일 */
574
+ heatmap?: ChartHeatmapOptions;
575
+ /**
576
+ * 지도 — type:"map"일 때 지형 데이터와 투영 설정.
577
+ * `map: { topology: WORLD_TOPOLOGY }`로 내장 세계 지도를 켠다
578
+ * (AG Charts topology 해당 — 축 없이 국가 경계 path로 렌더).
579
+ */
580
+ map?: ChartMapOptions;
581
+ /**
582
+ * 드릴다운 — 키(포인트 라벨)별 하위 데이터 맵.
583
+ * 해당 라벨의 포인트/슬라이스 클릭 시 하위 레벨로 내려가고
584
+ * .mc-drillup 버튼 또는 chart.drillUp()으로 복귀한다.
585
+ */
586
+ drilldown?: Record<string, DrilldownLevel>;
587
+ /**
588
+ * 인라인 주석 — 데이터 좌표에 텍스트/이미지 (.mc-annotation).
589
+ * 직교 좌표 차트에서만 렌더된다.
590
+ */
591
+ annotations?: readonly AnnotationInput[];
592
+ /** sankey 레이아웃 튜닝 — 노드 두께/간격 */
593
+ sankey?: ChartSankeyOptions;
594
+ /**
595
+ * chord 데이터 — type:"chord"에서 행렬과 그룹 라벨.
596
+ * (AG Charts chord 해당 — 시리즈 대신 옵션으로 행렬을 받는다)
597
+ */
598
+ chord?: ChartChordOptions;
599
+ /**
600
+ * gauge 범위 — type:"gauge"의 최소/최대/목표값.
601
+ * 값은 첫 시리즈의 첫 포인트(values[0])에서 읽는다.
602
+ */
603
+ gauge?: ChartGaugeOptions;
604
+ /**
605
+ * 포인트 클릭으로 선택/해제 (IBChart allowPointSelect 해당).
606
+ * 선택된 요소는 .mc-selected, pointSelect/pointUnselect 이벤트 발행.
607
+ */
608
+ allowPointSelect?: boolean;
609
+ /** 내장 문구 로케일 — emptyText/툴바 버튼 등 (기본 "en") */
610
+ locale?: ChartLocale;
611
+ /** 데이터 없음 텍스트 (기본 "No data") */
612
+ emptyText?: string;
613
+ /** 로딩 오버레이 초기 상태 — setLoading으로 제어 */
614
+ loading?: boolean;
615
+ /** ResizeObserver로 컨테이너 너비 추적 (렌더러가 처리) */
616
+ responsive?: boolean;
617
+ ariaLabel?: string;
618
+ /** 시리즈 고유 ID — 렌더 키·이벤트 식별자 (기본: name ?? series-N) */
619
+ getSeriesId?: (series: ChartSeriesInput, index: number) => string;
620
+ /** 이벤트 핸들러 — on()과 같은 이름 */
621
+ events?: ChartEventHandlers;
622
+ }
623
+ export interface DomainWindow {
624
+ min: number;
625
+ max: number;
626
+ }
627
+ export interface Rect {
628
+ x: number;
629
+ y: number;
630
+ w: number;
631
+ h: number;
632
+ }
633
+ /** 해석된 시리즈 — color가 null이면 렌더러가 var(--chart-palette-N)을 쓴다 */
634
+ export interface SeriesView {
635
+ id: string;
636
+ name: string;
637
+ color: string | null;
638
+ colorIndex: number;
639
+ type: ChartType;
640
+ axisId: string;
641
+ visible: boolean;
642
+ }
643
+ /** 데이터 포인트 — px 좌표 + 라벨 */
644
+ export interface PointView {
645
+ /** 렌더 키 (seriesId:index) — keyed each에서 고유 */
646
+ key: string;
647
+ seriesId: string;
648
+ index: number;
649
+ x: number;
650
+ y: number;
651
+ value: number | null;
652
+ label: string;
653
+ /** 버블 반지름 px — bubble 타입에서만 설정 */
654
+ r?: number;
655
+ /** 포인트 고정 색 — points[].color 또는 itemStyle이 지정한 경우 */
656
+ color?: string | null;
657
+ focused: boolean;
658
+ dimmed: boolean;
659
+ /** allowPointSelect로 선택된 포인트 — .mc-selected */
660
+ selected?: boolean;
661
+ }
662
+ export interface BarView {
663
+ key: string;
664
+ seriesId: string;
665
+ index: number;
666
+ x: number;
667
+ y: number;
668
+ w: number;
669
+ h: number;
670
+ value: number;
671
+ label: string;
672
+ /** 포인트 고정 색 — itemStyle/points color override */
673
+ color?: string | null;
674
+ /** waterfall 증감 방향 / percent-stacked-bar 카테고리 점유율(0..1) */
675
+ tone?: "up" | "down";
676
+ share?: number;
677
+ /**
678
+ * population-pyramid 미러링 — -1이면 중앙축 기준 좌측(음수 방향) 막대.
679
+ * 수평 막대의 라벨/툴팁 배치가 이 값을 참조한다.
680
+ */
681
+ dir?: 1 | -1;
682
+ focused: boolean;
683
+ dimmed: boolean;
684
+ selected?: boolean;
685
+ }
686
+ export interface SliceView {
687
+ key: string;
688
+ index: number;
689
+ path: string;
690
+ color: string | null;
691
+ colorIndex: number;
692
+ value: number;
693
+ label: string;
694
+ /** 툴팁/라벨 앵커 — 조각 중심각 위의 점 (svg 좌표) */
695
+ mx: number;
696
+ my: number;
697
+ focused: boolean;
698
+ dimmed: boolean;
699
+ /** allowPointSelect로 선택된 슬라이스 — .mc-selected */
700
+ selected?: boolean;
701
+ }
702
+ /** 워드클라우드 단어 — .mc-word text */
703
+ export interface WordView {
704
+ /** 렌더 키 (slice-i) */
705
+ key: string;
706
+ /** 카테고리 인덱스 */
707
+ index: number;
708
+ text: string;
709
+ /** svg 좌표 — 텍스트 기준점(text-anchor middle, dominant-baseline middle) */
710
+ x: number;
711
+ y: number;
712
+ /** 충돌 박스 — hitTest/레이아웃 공용 */
713
+ w: number;
714
+ h: number;
715
+ /** font-size px */
716
+ size: number;
717
+ color: string | null;
718
+ colorIndex: number;
719
+ value: number;
720
+ focused: boolean;
721
+ dimmed: boolean;
722
+ selected?: boolean;
723
+ }
724
+ /** 그린 주석 뷰 — svg 좌표로 해석된 선/영역 */
725
+ export interface DrawingView {
726
+ key: string;
727
+ tool: DrawTool;
728
+ /** svg 좌표 — hline은 y1만, vline은 x1만 의미 있다 */
729
+ x1: number;
730
+ y1: number;
731
+ x2: number;
732
+ y2: number;
733
+ color: string | null;
734
+ colorIndex: number;
735
+ label?: string;
736
+ /** channel 도구 — 평행선 오프셋 px (해석된 값) */
737
+ width?: number;
738
+ /** 드래그 진행 중 미리보기 — .mc-draw-draft로 렌더된다 */
739
+ draft?: boolean;
740
+ }
741
+ /** 인라인 주석 뷰 — .mc-annotation */
742
+ export interface AnnotationView {
743
+ key: string;
744
+ /** svg 좌표 — 주석 앵커 */
745
+ x: number;
746
+ y: number;
747
+ label?: string;
748
+ image?: string;
749
+ w: number;
750
+ h: number;
751
+ }
752
+ /** 히트맵 셀 — .mc-heat-cell rect */
753
+ export interface HeatCellView {
754
+ /** 렌더 키 (seriesId:index) */
755
+ key: string;
756
+ /** 행 시리즈 id */
757
+ seriesId: string;
758
+ /** 열 인덱스 (카테고리) */
759
+ index: number;
760
+ /** 행 인덱스 (시리즈) */
761
+ row: number;
762
+ x: number;
763
+ y: number;
764
+ w: number;
765
+ h: number;
766
+ value: number;
767
+ /** 열 라벨 (카테고리) */
768
+ label: string;
769
+ /** 정규화된 값 0..1 — 색상 스케일 위치 */
770
+ t: number;
771
+ focused: boolean;
772
+ dimmed: boolean;
773
+ selected?: boolean;
774
+ }
775
+ /** range-bar 막대 — 카테고리별 [low, high] 구간 (.mc-range-bar) */
776
+ export interface RangeBarView {
777
+ seriesId: string;
778
+ index: number;
779
+ x: number;
780
+ y: number;
781
+ w: number;
782
+ h: number;
783
+ low: number;
784
+ high: number;
785
+ label: string;
786
+ /** 포인트 고정 색 — itemStyle override */
787
+ color?: string | null;
788
+ focused: boolean;
789
+ dimmed: boolean;
790
+ selected?: boolean;
791
+ }
792
+ /**
793
+ * boxplot 상자 — 카테고리별 5수치 요약 (.mc-box).
794
+ * 수직 전용 — box rect(Q1~Q3) + 중앙값 선 + 수염(whisker) + 끝 캡.
795
+ */
796
+ export interface BoxPlotView {
797
+ seriesId: string;
798
+ index: number;
799
+ /** 상자 중심 x */
800
+ cx: number;
801
+ /** 상자 rect (Q1~Q3) */
802
+ x: number;
803
+ y: number;
804
+ w: number;
805
+ h: number;
806
+ /** 수염 끝 (svg y) — highY가 위쪽 */
807
+ lowY: number;
808
+ highY: number;
809
+ /** 중앙값 y */
810
+ medY: number;
811
+ min: number;
812
+ q1: number;
813
+ median: number;
814
+ q3: number;
815
+ max: number;
816
+ label: string;
817
+ /** 포인트 고정 색 — itemStyle override */
818
+ color?: string | null;
819
+ focused: boolean;
820
+ dimmed: boolean;
821
+ selected?: boolean;
822
+ }
823
+ /** candlestick 캔들 — 시가/고가/저가/종가 (.mc-candle) */
824
+ export interface CandleView {
825
+ seriesId: string;
826
+ index: number;
827
+ /** 몸통 중심 x */
828
+ cx: number;
829
+ /** 몸통 rect */
830
+ x: number;
831
+ y: number;
832
+ w: number;
833
+ h: number;
834
+ /** 심지(고가/저가) 선분 */
835
+ highY: number;
836
+ lowY: number;
837
+ open: number;
838
+ high: number;
839
+ low: number;
840
+ close: number;
841
+ label: string;
842
+ /** 종가>시가면 up */
843
+ tone: "up" | "down";
844
+ focused: boolean;
845
+ dimmed: boolean;
846
+ selected?: boolean;
847
+ }
848
+ /** 에러바 세그먼트 — 포인트 위 ±오차 (.mc-error) */
849
+ export interface ErrorBarView {
850
+ seriesId: string;
851
+ index: number;
852
+ /** 포인트 앵커 (svg 좌표) */
853
+ x: number;
854
+ y: number;
855
+ /** 오차 상/하 끝 */
856
+ yLo: number;
857
+ yHi: number;
858
+ }
859
+ /** 추세선 — svg 좌표 폴리라인 path (.mc-trendline). linear는 2점, movingAverage는 다점 */
860
+ export interface TrendLineView {
861
+ seriesId: string;
862
+ path: string;
863
+ color: string | null;
864
+ colorIndex: number;
865
+ type: "linear" | "movingAverage";
866
+ }
867
+ /** 지도 지역 — .mc-map-region path (choropleth 채움) */
868
+ export interface MapRegionView {
869
+ /** 렌더 키 (map:<code>) */
870
+ key: string;
871
+ /** 피처 조인 키 (피처 id 또는 featureKey 결과) */
872
+ code: string;
873
+ /** 피처 표시 이름 — properties.name */
874
+ name: string;
875
+ /** series.mapData 인덱스 — 데이터 없는 지역은 -1 (상호작용 비활성) */
876
+ index: number;
877
+ /** 피처 폴리곤 path (svg 좌표) */
878
+ path: string;
879
+ /** 툴팁/포커스 앵커 — 최대 면적 링의 도형 중심 */
880
+ cx: number;
881
+ cy: number;
882
+ /** mapData 값 — null이면 데이터 없음(.mc-map-no-data) */
883
+ value: number | null;
884
+ /** 정규화된 값 0..1 — 색상 스케일 위치 */
885
+ t: number;
886
+ focused: boolean;
887
+ dimmed: boolean;
888
+ selected?: boolean;
889
+ }
890
+ /** 지도 값 범례 — .mc-map-scale 그라데이션 바의 min/max */
891
+ export interface MapScaleView {
892
+ min: number;
893
+ max: number;
894
+ /** 커스텀 색상 — null이면 --chart-map-from/to 변수 사용 */
895
+ from: string | null;
896
+ to: string | null;
897
+ }
898
+ /** treemap 리프 노드 — .mc-treemap-node rect */
899
+ export interface TreemapNodeView {
900
+ /** 렌더 키 — 노드 경로 (root>child>…) */
901
+ key: string;
902
+ /** DFS 플랫 인덱스 — 포커스/선택 식별자 */
903
+ index: number;
904
+ name: string;
905
+ value: number;
906
+ depth: number;
907
+ /** 최상위 조상 인덱스 — 색/범례 그룹 */
908
+ root: number;
909
+ x: number;
910
+ y: number;
911
+ w: number;
912
+ h: number;
913
+ color: string | null;
914
+ colorIndex: number;
915
+ /** rect가 충분히 크면 이름 라벨 표시용 (dataLabels) */
916
+ label?: string;
917
+ focused: boolean;
918
+ dimmed: boolean;
919
+ selected?: boolean;
920
+ }
921
+ /** sunburst 노드 — .mc-sunburst-node 환형 섹터 path */
922
+ export interface SunburstNodeView {
923
+ /** 렌더 키 — 노드 경로 */
924
+ key: string;
925
+ /** DFS 플랫 인덱스 */
926
+ index: number;
927
+ name: string;
928
+ value: number;
929
+ depth: number;
930
+ /** 최상위 조상 인덱스 — 색/범례 그룹 */
931
+ root: number;
932
+ /** 각도 범위 (rad, -π/2가 12시) — hitTest용 */
933
+ a0: number;
934
+ a1: number;
935
+ /** 반지름 범위 (svg px) — hitTest용 */
936
+ r0: number;
937
+ r1: number;
938
+ /** 중심 좌표 (svg) — hitTest용 */
939
+ cx0: number;
940
+ cy0: number;
941
+ /** 환형 섹터 path */
942
+ path: string;
943
+ /** 라벨/툴팁 앵커 — 중간 각도·반지름 위의 점 */
944
+ cx: number;
945
+ cy: number;
946
+ color: string | null;
947
+ colorIndex: number;
948
+ /** 섹터가 충분히 크면 이름 라벨 표시용 (dataLabels) */
949
+ label?: string;
950
+ focused: boolean;
951
+ dimmed: boolean;
952
+ selected?: boolean;
953
+ }
954
+ /** sankey 노드 — .mc-sankey-node 세로 rect */
955
+ export interface SankeyNodeView {
956
+ /** 렌더 키 — 노드 이름 */
957
+ key: string;
958
+ /** 노드 인덱스 (입력 등장 순서) */
959
+ index: number;
960
+ name: string;
961
+ /** 노드 유량 — max(유입 합, 유출 합) */
962
+ value: number;
963
+ x: number;
964
+ y: number;
965
+ w: number;
966
+ h: number;
967
+ color: string | null;
968
+ colorIndex: number;
969
+ focused: boolean;
970
+ dimmed: boolean;
971
+ selected?: boolean;
972
+ }
973
+ /** sankey 링크 — .mc-sankey-link 베지어 리본 path */
974
+ export interface SankeyLinkView {
975
+ key: string;
976
+ /** links 입력 인덱스 */
977
+ index: number;
978
+ sourceIndex: number;
979
+ targetIndex: number;
980
+ source: string;
981
+ target: string;
982
+ value: number;
983
+ /** 리본 path — 상/하 곡선 두께가 value에 비례 */
984
+ path: string;
985
+ /** 소스 노드 색 계승 */
986
+ colorIndex: number;
987
+ }
988
+ /** chord 그룹 — .mc-chord-group 외곽 아크 */
989
+ export interface ChordGroupView {
990
+ /** 렌더 키 (group-i) */
991
+ key: string;
992
+ /** 행렬 인덱스 */
993
+ index: number;
994
+ name: string;
995
+ /** 그룹 총 유량 — 행 합계 */
996
+ value: number;
997
+ /** 아크 각도 범위 (rad) — hitTest용 */
998
+ a0: number;
999
+ a1: number;
1000
+ /** 환형 아크 path */
1001
+ path: string;
1002
+ /** 라벨 앵커 — 아크 바깥 */
1003
+ lx: number;
1004
+ ly: number;
1005
+ color: string | null;
1006
+ colorIndex: number;
1007
+ focused: boolean;
1008
+ dimmed: boolean;
1009
+ selected?: boolean;
1010
+ }
1011
+ /** chord 리본 — .mc-chord-ribbon (그룹 쌍을 잇는 내부 곡면) */
1012
+ export interface ChordRibbonView {
1013
+ key: string;
1014
+ /** 무방향 그룹 쌍 인덱스 */
1015
+ index: number;
1016
+ sourceIndex: number;
1017
+ targetIndex: number;
1018
+ /** source → target 유량 (소스 측 두께) */
1019
+ value: number;
1020
+ /** target → source 유량 (타겟 측 두께) */
1021
+ valueBack: number;
1022
+ path: string;
1023
+ colorIndex: number;
1024
+ }
1025
+ /**
1026
+ * 극좌표 환형 섹터 — nightingale/radial-bar의 노드.
1027
+ * nightingale은 각도=등분·반지름=값, radial-bar는 반지름=카테고리·각도=값.
1028
+ */
1029
+ export interface PolarSectorView {
1030
+ /** 렌더 키 */
1031
+ key: string;
1032
+ /** 카테고리 인덱스 */
1033
+ index: number;
1034
+ seriesId: string;
1035
+ /** 카테고리 라벨 */
1036
+ name: string;
1037
+ value: number;
1038
+ /** 각도 범위 (rad, -π/2가 12시) — hitTest용 */
1039
+ a0: number;
1040
+ a1: number;
1041
+ /** 반지름 범위 (svg px) — hitTest용 */
1042
+ r0: number;
1043
+ r1: number;
1044
+ /** 중심 좌표 (svg) — hitTest용 */
1045
+ cx0: number;
1046
+ cy0: number;
1047
+ /** 환형 섹터 path */
1048
+ path: string;
1049
+ /** 라벨/툴팁 앵커 — 섹터 중간각·중간반지름 위의 점 */
1050
+ cx: number;
1051
+ cy: number;
1052
+ color: string | null;
1053
+ colorIndex: number;
1054
+ /** 섹터가 충분히 크면 이름 라벨 표시용 (dataLabels) */
1055
+ label?: string;
1056
+ focused: boolean;
1057
+ dimmed: boolean;
1058
+ selected?: boolean;
1059
+ }
1060
+ /** 지도 마커 뷰 — mapPoints의 투영된 원 (.mc-map-marker) */
1061
+ export interface MapMarkerView {
1062
+ /** 렌더 키 (marker-i) */
1063
+ key: string;
1064
+ /** mapPoints 인덱스 */
1065
+ index: number;
1066
+ /** svg 좌표 — 투영 + panZoom 변환 후 위치 */
1067
+ x: number;
1068
+ y: number;
1069
+ /** 반지름 — value가 있으면 sqrt 스케일. 이미지 마커는 최소 10px */
1070
+ r: number;
1071
+ value: number | null;
1072
+ label: string;
1073
+ /** 고정 색 — 없으면 시리즈 색 */
1074
+ color?: string | null;
1075
+ /** 아바타 이미지 URL — 있으면 .mc-map-avatar로 렌더 */
1076
+ image?: string | null;
1077
+ /** 내 위치 펄스 링 표시 */
1078
+ pulse?: boolean;
1079
+ focused: boolean;
1080
+ dimmed: boolean;
1081
+ selected?: boolean;
1082
+ }
1083
+ /** 지도 클러스터 뷰 — 같은 셀에 묶인 마커의 카운트 버블 (.mc-map-cluster) */
1084
+ export interface MapClusterView {
1085
+ /** 렌더 키 (cluster-i) */
1086
+ key: string;
1087
+ /** svg 좌표 — 묶인 마커들의 무게중심 */
1088
+ x: number;
1089
+ y: number;
1090
+ r: number;
1091
+ /** 묶인 마커 수 */
1092
+ count: number;
1093
+ /** 묶인 mapPoints 인덱스 */
1094
+ members: number[];
1095
+ }
1096
+ /** 지도 연결선 뷰 — mapLines의 투영된 선분 (.mc-map-line) */
1097
+ export interface MapLineView {
1098
+ key: string;
1099
+ index: number;
1100
+ /** svg path — M x1 y1 L x2 y2 (곡률 없는 직선) */
1101
+ path: string;
1102
+ label?: string;
1103
+ }
1104
+ /** linear-gauge 뷰 — 수평 바 게이지 (.mc-lg-*) */
1105
+ export interface LinearGaugeView {
1106
+ value: number;
1107
+ min: number;
1108
+ max: number;
1109
+ /** 배경 트랙 rect (.mc-lg-track) */
1110
+ track: Rect;
1111
+ /** 값 채움 rect (.mc-lg-value) */
1112
+ bar: Rect;
1113
+ /** 목표값 눈금 — 수직 선분 */
1114
+ target?: {
1115
+ x: number;
1116
+ y0: number;
1117
+ y1: number;
1118
+ };
1119
+ /** 값 라벨 — 트랙 중심 위 */
1120
+ label: {
1121
+ x: number;
1122
+ y: number;
1123
+ text: string;
1124
+ };
1125
+ /** min/max 눈금 라벨 — 트랙 양끝 아래 */
1126
+ ticks: {
1127
+ x: number;
1128
+ y: number;
1129
+ text: string;
1130
+ }[];
1131
+ /** 시리즈 색 — 값 채움 fill */
1132
+ color: string | null;
1133
+ colorIndex: number;
1134
+ focused: boolean;
1135
+ dimmed: boolean;
1136
+ selected?: boolean;
1137
+ }
1138
+ /** organization 노드 — top-down 트리의 박스 (.mc-org-node) */
1139
+ export interface OrgNodeView {
1140
+ /** 렌더 키 — 노드 경로 */
1141
+ key: string;
1142
+ /** DFS 플랫 인덱스 */
1143
+ index: number;
1144
+ name: string;
1145
+ value: number;
1146
+ /** 최상위 조상 인덱스 — 색/범례 그룹 */
1147
+ root: number;
1148
+ x: number;
1149
+ y: number;
1150
+ w: number;
1151
+ h: number;
1152
+ /** 노드 중심 — 툴팁/포커스 앵커 */
1153
+ cx: number;
1154
+ cy: number;
1155
+ color: string | null;
1156
+ colorIndex: number;
1157
+ focused: boolean;
1158
+ dimmed: boolean;
1159
+ selected?: boolean;
1160
+ }
1161
+ /** organization 연결선 — 부모 하단 → 자식 상단 엘보 커넥터 (.mc-org-link) */
1162
+ export interface OrgLinkView {
1163
+ key: string;
1164
+ path: string;
1165
+ }
1166
+ /** 픽토그램 아이콘 — 카테고리 행 안의 사람 모양 심볼 (.mc-picto) */
1167
+ export interface PictoIconView {
1168
+ key: string;
1169
+ /** 채움 아이콘의 시리즈 — 빈 아이콘은 null */
1170
+ seriesId: string | null;
1171
+ /** 카테고리 인덱스 */
1172
+ index: number;
1173
+ /** svg 좌표 — 아이콘 rect (24×24 박스를 size로 스케일) */
1174
+ x: number;
1175
+ y: number;
1176
+ size: number;
1177
+ /** 값만큼 채워진 아이콘 여부 — false면 잔여 빈 아이콘 */
1178
+ filled: boolean;
1179
+ colorIndex: number;
1180
+ /** 호버 시 툴팁 값 — 채움 아이콘의 시리즈 값 */
1181
+ value: number | null;
1182
+ label: string;
1183
+ focused: boolean;
1184
+ dimmed: boolean;
1185
+ selected?: boolean;
1186
+ }
1187
+ /** 픽토그램 행 — 카테고리별 아이콘 묶음 + 행 라벨 */
1188
+ export interface PictoRowView {
1189
+ /** 카테고리 인덱스 */
1190
+ index: number;
1191
+ label: string;
1192
+ /** 행 라벨 위치 (svg 좌표, text-anchor=end 기준점) */
1193
+ labelX: number;
1194
+ labelY: number;
1195
+ /** 행 밴드 — hitTest 범위 */
1196
+ y: number;
1197
+ h: number;
1198
+ icons: PictoIconView[];
1199
+ }
1200
+ /** gauge 뷰 — type:"gauge"의 단일 다이얼 (.mc-gauge-*) */
1201
+ export interface GaugeView {
1202
+ /** 값 (첫 시리즈 첫 포인트) */
1203
+ value: number;
1204
+ min: number;
1205
+ max: number;
1206
+ /** 배경 트랙 아크 path (.mc-gauge-track) */
1207
+ trackPath: string;
1208
+ /** 값 아크 path (.mc-gauge-value) */
1209
+ valuePath: string;
1210
+ /** 바늘 — 중심에서 끝점까지 선분 */
1211
+ needle: {
1212
+ x1: number;
1213
+ y1: number;
1214
+ x2: number;
1215
+ y2: number;
1216
+ };
1217
+ /** 중앙 값 라벨 위치 */
1218
+ label: {
1219
+ x: number;
1220
+ y: number;
1221
+ text: string;
1222
+ };
1223
+ /** min/max 눈금 라벨 — 양끝 아래 */
1224
+ ticks: {
1225
+ x: number;
1226
+ y: number;
1227
+ text: string;
1228
+ }[];
1229
+ /** 목표값 눈금 — 있으면 트랙 위의 .mc-gauge-target 선분 */
1230
+ target?: {
1231
+ x1: number;
1232
+ y1: number;
1233
+ x2: number;
1234
+ y2: number;
1235
+ };
1236
+ /** hitTest용 — 값 아크 각도/반지름 */
1237
+ cx: number;
1238
+ cy: number;
1239
+ r0: number;
1240
+ r1: number;
1241
+ a0: number;
1242
+ a1: number;
1243
+ /** 시리즈 색 — 값 아크 fill */
1244
+ color: string | null;
1245
+ colorIndex: number;
1246
+ focused: boolean;
1247
+ dimmed: boolean;
1248
+ selected?: boolean;
1249
+ }
1250
+ /** 레이더 축 그리드 — 동심원 링 + 방사 스포크 */
1251
+ export interface RadarGridView {
1252
+ cx: number;
1253
+ cy: number;
1254
+ r: number;
1255
+ /** 각 링의 반지름 비율(0..1) + 도메인 값 라벨 */
1256
+ rings: {
1257
+ r: number;
1258
+ label: string;
1259
+ }[];
1260
+ /** 스포크 — 카테고리 방향 선분 + 라벨 좌표 */
1261
+ spokes: {
1262
+ x2: number;
1263
+ y2: number;
1264
+ lx: number;
1265
+ ly: number;
1266
+ label: string;
1267
+ }[];
1268
+ }
1269
+ /** 네비게이터(미니맵) 뷰 — .mc-navigator */
1270
+ export interface NavigatorView {
1271
+ /** 스트립 높이 px */
1272
+ h: number;
1273
+ /** 스트립 상단 y (svg 좌표) */
1274
+ y: number;
1275
+ /** 미니 시리즈 라인 — 전체 x 도메인 */
1276
+ tracks: {
1277
+ seriesId: string;
1278
+ color: string | null;
1279
+ colorIndex: number;
1280
+ path: string;
1281
+ }[];
1282
+ /** 현재 줌 창 rect — 없으면 전체 */
1283
+ window: {
1284
+ x: number;
1285
+ w: number;
1286
+ };
1287
+ /** 스트립 좌우 (svg 좌표) — 드래그 px→도메인 변환 기준 */
1288
+ left: number;
1289
+ right: number;
1290
+ }
1291
+ export type GeometryView = {
1292
+ kind: "line";
1293
+ seriesId: string;
1294
+ path: string;
1295
+ /** 선 보간 방식 — step/spline이면 .mc-step/.mc-spline 클래스 추가 */
1296
+ shape?: "linear" | "step" | "spline";
1297
+ points: PointView[];
1298
+ } | {
1299
+ kind: "area";
1300
+ seriesId: string;
1301
+ path: string;
1302
+ linePath: string;
1303
+ points: PointView[];
1304
+ } | {
1305
+ kind: "bar";
1306
+ seriesId: string;
1307
+ horizontal: boolean;
1308
+ bars: BarView[];
1309
+ /** waterfall 막대 사이 연결선 path — waterfall 타입에서만 설정 */
1310
+ connectorPath?: string;
1311
+ } | {
1312
+ kind: "scatter";
1313
+ seriesId: string;
1314
+ points: PointView[];
1315
+ } | {
1316
+ kind: "bubble";
1317
+ seriesId: string;
1318
+ points: PointView[];
1319
+ } | {
1320
+ kind: "pie";
1321
+ seriesId: string;
1322
+ donut: boolean;
1323
+ slices: SliceView[];
1324
+ } | {
1325
+ kind: "funnel";
1326
+ seriesId: string;
1327
+ slices: SliceView[];
1328
+ } | {
1329
+ /**
1330
+ * cone-funnel — 단계 높이가 값에 비례하고 외곽이 꼭짓점으로
1331
+ * 수렴하는 퍼널 (AG Charts cone-funnel 해당)
1332
+ */
1333
+ kind: "cone-funnel";
1334
+ seriesId: string;
1335
+ slices: SliceView[];
1336
+ /** 슬라이스별 y 범위 — 균등 분할이 아니므로 hitTest가 참조 */
1337
+ bands: {
1338
+ y0: number;
1339
+ y1: number;
1340
+ }[];
1341
+ } | {
1342
+ kind: "pyramid";
1343
+ seriesId: string;
1344
+ slices: SliceView[];
1345
+ } | {
1346
+ kind: "heatmap";
1347
+ /** 첫 행 시리즈 id — 그룹 식별용 (셀은 자기 seriesId를 갖는다) */
1348
+ seriesId: string;
1349
+ /** 커스텀 색상 — null이면 --chart-heat-from/to 변수 사용 */
1350
+ from: string | null;
1351
+ to: string | null;
1352
+ cells: HeatCellView[];
1353
+ } | {
1354
+ kind: "wordcloud";
1355
+ seriesId: string;
1356
+ words: WordView[];
1357
+ } | {
1358
+ /** 레이더 — 폐합 다각형. area=true면 채움(radar-area) */
1359
+ kind: "radar";
1360
+ seriesId: string;
1361
+ path: string;
1362
+ area: boolean;
1363
+ points: PointView[];
1364
+ } | {
1365
+ kind: "range-bar";
1366
+ seriesId: string;
1367
+ horizontal: boolean;
1368
+ bars: RangeBarView[];
1369
+ } | {
1370
+ /** range-area — 상/하한 사이 채움 밴드 */
1371
+ kind: "range-area";
1372
+ seriesId: string;
1373
+ bandPath: string;
1374
+ points: PointView[];
1375
+ } | {
1376
+ kind: "candlestick";
1377
+ seriesId: string;
1378
+ candles: CandleView[];
1379
+ } | {
1380
+ /** ohlc — 캔들 대신 시가/종가 틱 선분 (.mc-ohlc-*) */
1381
+ kind: "ohlc";
1382
+ seriesId: string;
1383
+ candles: CandleView[];
1384
+ } | {
1385
+ /** boxplot — 카테고리별 5수치 상자 (.mc-box) */
1386
+ kind: "boxplot";
1387
+ seriesId: string;
1388
+ boxes: BoxPlotView[];
1389
+ } | {
1390
+ /** 지도 — 국가/지역 폴리곤. 첫 map 시리즈의 mapData로 채움 */
1391
+ kind: "map";
1392
+ seriesId: string;
1393
+ /** 커스텀 색상 — null이면 --chart-map-from/to 변수 사용 */
1394
+ from: string | null;
1395
+ to: string | null;
1396
+ regions: MapRegionView[];
1397
+ /** 마커 레이어 — series.mapPoints (클러스터에 묶인 것 제외) */
1398
+ markers: MapMarkerView[];
1399
+ /** 클러스터 버블 — map.cluster가 켜지고 2개 이상 뭉칠 때 */
1400
+ clusters: MapClusterView[];
1401
+ /** 연결선 레이어 — series.mapLines */
1402
+ lines: MapLineView[];
1403
+ /** panZoom 변환 — 지역/라인 그룹에 적용할 svg transform 문자열 */
1404
+ transform: string | null;
1405
+ } | {
1406
+ /** sunburst — 계층 환형 섹터. 깊이별 링 */
1407
+ kind: "sunburst";
1408
+ seriesId: string;
1409
+ nodes: SunburstNodeView[];
1410
+ } | {
1411
+ /** treemap — squarified 사각형 분할. 리프만 렌더 */
1412
+ kind: "treemap";
1413
+ seriesId: string;
1414
+ nodes: TreemapNodeView[];
1415
+ } | {
1416
+ /** sankey — 노드 열 + 유량 리본 */
1417
+ kind: "sankey";
1418
+ seriesId: string;
1419
+ nodes: SankeyNodeView[];
1420
+ links: SankeyLinkView[];
1421
+ } | {
1422
+ /** chord — 행렬 플로우의 원호 그룹 + 리본 */
1423
+ kind: "chord";
1424
+ seriesId: string;
1425
+ /** 중심/반지름 — hitTest용 (ri는 그룹 링의 안쪽 반지름) */
1426
+ cx: number;
1427
+ cy: number;
1428
+ r: number;
1429
+ ri: number;
1430
+ groups: ChordGroupView[];
1431
+ ribbons: ChordRibbonView[];
1432
+ } | {
1433
+ /** nightingale — 극좌표 면적. 각도=등분 카테고리, 반지름=값 */
1434
+ kind: "nightingale";
1435
+ seriesId: string;
1436
+ sectors: PolarSectorView[];
1437
+ } | {
1438
+ /** radial-bar — 극좌표 막대. 반지름=카테고리 링, 각도=값 */
1439
+ kind: "radial-bar";
1440
+ seriesId: string;
1441
+ sectors: PolarSectorView[];
1442
+ } | {
1443
+ /** radial-column — 극좌표 컬럼. 각도=카테고리 방향, 반지름=값 */
1444
+ kind: "radial-column";
1445
+ seriesId: string;
1446
+ sectors: PolarSectorView[];
1447
+ } | {
1448
+ /** gauge — 단일 값 다이얼 */
1449
+ kind: "gauge";
1450
+ seriesId: string;
1451
+ gauge: GaugeView;
1452
+ } | {
1453
+ /** linear-gauge — 수평 바 게이지 (AG Charts linear-gauge 해당) */
1454
+ kind: "linear-gauge";
1455
+ seriesId: string;
1456
+ gauge: LinearGaugeView;
1457
+ } | {
1458
+ /** organization — top-down 조직도 트리 */
1459
+ kind: "organization";
1460
+ seriesId: string;
1461
+ nodes: OrgNodeView[];
1462
+ links: OrgLinkView[];
1463
+ } | {
1464
+ /**
1465
+ * pictogram — 카테고리별 행에 사람 아이콘을 값 비례로 채움.
1466
+ * 아이콘 1개 = unit 값 (ISOTYPE 스타일).
1467
+ */
1468
+ kind: "pictogram";
1469
+ seriesId: string;
1470
+ /** 아이콘 1개가 나타내는 값 */
1471
+ unit: number;
1472
+ rows: PictoRowView[];
1473
+ };
1474
+ export interface TickView {
1475
+ value: number;
1476
+ label: string;
1477
+ /** 축 방향 px 좌표 */
1478
+ pos: number;
1479
+ }
1480
+ /** 그룹 카테고리 축의 상위 레벨 틱 — 연속 같은 그룹의 범위 + 라벨 */
1481
+ export interface GroupTickView {
1482
+ label: string;
1483
+ /** 라벨 위치 — 그룹 범위 중심 (축 방향 px) */
1484
+ pos: number;
1485
+ /** 그룹 시작/끝 경계 (px) — 구분선 위치 */
1486
+ x0: number;
1487
+ x1: number;
1488
+ }
1489
+ export interface AxisView {
1490
+ id: string;
1491
+ /** 렌더 축 방향 — "x"면 수평, "y"면 수직 */
1492
+ kind: "x" | "y";
1493
+ position: AxisPosition;
1494
+ scale: ScaleKind;
1495
+ ticks: TickView[];
1496
+ /**
1497
+ * 그룹 카테고리의 상위 레벨 틱 — categories 항목이 배열일 때
1498
+ * (.mc-tick-group). 두 번째 틱 행으로 렌더된다.
1499
+ */
1500
+ groups?: GroupTickView[];
1501
+ label?: string;
1502
+ grid: boolean;
1503
+ }
1504
+ export interface LegendItemView {
1505
+ /** series id 또는 "slice:N" */
1506
+ id: string;
1507
+ label: string;
1508
+ color: string | null;
1509
+ colorIndex: number;
1510
+ visible: boolean;
1511
+ kind: "series" | "slice";
1512
+ }
1513
+ export interface TooltipRowView {
1514
+ seriesId: string;
1515
+ name: string;
1516
+ color: string | null;
1517
+ colorIndex: number;
1518
+ value: string;
1519
+ /** 포인트/시리즈 부가 데이터 (etcData) — tooltip.render에서 접근 */
1520
+ etcData?: unknown;
1521
+ }
1522
+ export interface TooltipView {
1523
+ /** .mc-viewport 기준 px 앵커 */
1524
+ x: number;
1525
+ y: number;
1526
+ title: string;
1527
+ rows: TooltipRowView[];
1528
+ /**
1529
+ * tooltip.render의 커스텀 HTML — 있으면 기본 행 마크업 대신
1530
+ * .mc-tooltip의 내용으로 삽입된다
1531
+ */
1532
+ html?: string;
1533
+ }
1534
+ /** 컨텍스트 메뉴 항목 뷰 — .mc-menu-item */
1535
+ export interface MenuItemView {
1536
+ id: string;
1537
+ label: string;
1538
+ /** 내장 항목 여부 — reset-zoom/export-svg/export-png */
1539
+ builtin?: boolean;
1540
+ }
1541
+ /** 컨텍스트 메뉴 뷰 — .mc-menu (우클릭으로 열림) */
1542
+ export interface MenuView {
1543
+ /** .mc-viewport 기준 px 위치 */
1544
+ x: number;
1545
+ y: number;
1546
+ items: MenuItemView[];
1547
+ }
1548
+ /**
1549
+ * getState/setState의 가시성·준 스냅 — AG Charts state 저장/복원 해당.
1550
+ * 데이터 자체는 포함하지 않는다 (시리즈/카테고리는 setData로).
1551
+ */
1552
+ export interface ChartState {
1553
+ type?: ChartType;
1554
+ theme?: ChartTheme;
1555
+ /** x 줌 창 — null이면 미줌 */
1556
+ window?: DomainWindow | null;
1557
+ /** 값 축 줌 창 (axes:"y"|"xy") */
1558
+ yWindow?: DomainWindow | null;
1559
+ /** 숨겨진 범례 id — 시리즈 id 또는 "slice:N" */
1560
+ hidden?: string[];
1561
+ /** 선택된 포인트 */
1562
+ selected?: FocusPoint | null;
1563
+ /** 그린 주석 — 데이터 좌표 그대로 왕복된다 */
1564
+ drawings?: DrawingInput[];
1565
+ /** 범례 페이지 — pagination 켜진 경우 */
1566
+ legendPage?: number;
1567
+ }
1568
+ /** sparkline 마운트 옵션 — 축/범례 없는 미니 라인·영역·막대 */
1569
+ export interface SparklineOptions {
1570
+ /** 기본 "line" */
1571
+ type?: "line" | "area" | "bar";
1572
+ values: readonly (number | null)[];
1573
+ /** 선/채움 색 — 기본 --chart-palette-1 */
1574
+ color?: string;
1575
+ width?: number;
1576
+ height?: number;
1577
+ /** 값 도메인 override — 없으면 데이터 min/max */
1578
+ min?: number;
1579
+ max?: number;
1580
+ /** area 채움 불투명도 (기본 0.2) */
1581
+ fillOpacity?: number;
1582
+ }
1583
+ export interface SelectionView {
1584
+ /** .mc-viewport 기준 px */
1585
+ x: number;
1586
+ w: number;
1587
+ min: number;
1588
+ max: number;
1589
+ /**
1590
+ * y 범위 선택(영역 줌)일 때만 설정 — rect의 y/h.
1591
+ * 없으면 플롯 전체 높이로 렌더된다.
1592
+ */
1593
+ y?: number;
1594
+ h?: number;
1595
+ minY?: number;
1596
+ maxY?: number;
1597
+ /** 선택 범위에 포함되는 카테고리 인덱스 */
1598
+ indices: number[];
1599
+ }
1600
+ export interface HoverInfo {
1601
+ seriesId: string;
1602
+ index: number;
1603
+ value: number | null;
1604
+ label: string;
1605
+ /** 클러스터 히트 — 묶인 mapPoints 인덱스 (지도 클러스터만) */
1606
+ members?: readonly number[];
1607
+ }
1608
+ export interface FocusPoint {
1609
+ seriesId: string;
1610
+ index: number;
1611
+ }
1612
+ /** 값 라벨 뷰 — .mc-data-label text */
1613
+ export interface DataLabelView {
1614
+ key: string;
1615
+ /** svg 좌표 */
1616
+ x: number;
1617
+ y: number;
1618
+ text: string;
1619
+ /** 텍스트 기준점 — css로 translate/anchor 결정 */
1620
+ anchor: "middle" | "start" | "end";
1621
+ }
1622
+ /** 값 축 기준선 뷰 — .mc-mark-line */
1623
+ export interface MarkLineView {
1624
+ key: string;
1625
+ /** svg 좌표 — plot 안 수평/수직 선 */
1626
+ x1: number;
1627
+ y1: number;
1628
+ x2: number;
1629
+ y2: number;
1630
+ label?: string;
1631
+ /** 라벨 앵커 좌표 */
1632
+ lx: number;
1633
+ ly: number;
1634
+ color: string | null;
1635
+ }
1636
+ /** 값 축 기준 영역 뷰 — .mc-mark-band rect */
1637
+ export interface MarkBandView {
1638
+ key: string;
1639
+ /** svg 좌표 — plot 안에 clamp된 rect */
1640
+ x: number;
1641
+ y: number;
1642
+ w: number;
1643
+ h: number;
1644
+ label?: string;
1645
+ /** 라벨 앵커 좌표 */
1646
+ lx: number;
1647
+ ly: number;
1648
+ color: string | null;
1649
+ }
1650
+ /** 구독자에게 전달되는 읽기 전용 스냅샷 — 어댑터는 이것만 렌더한다 */
1651
+ export interface ChartSnapshot {
1652
+ type: ChartType;
1653
+ width: number;
1654
+ height: number;
1655
+ /** 플롯 영역 (svg 좌표계) */
1656
+ plot: Rect;
1657
+ theme: ChartTheme;
1658
+ animate: boolean;
1659
+ animationDuration: number;
1660
+ /**
1661
+ * 직전 무효화가 데이터 변경( setData/실시간 API/updateDelta )으로
1662
+ * 발생했는지 — animation.updates가 켜져 있으면 루트에 .mc-updating이
1663
+ * 붙어 갱신 전환이 재생된다. 다음 스냅샷에서 해제된다.
1664
+ */
1665
+ updating: boolean;
1666
+ ariaLabel: string;
1667
+ /** 인스턴스 고유 id — clipPath id 충돌 방지 */
1668
+ clipId: string;
1669
+ /** 데이터 없음 — .mc-empty 렌더 */
1670
+ empty: boolean;
1671
+ /** 데이터 없음 텍스트 */
1672
+ emptyText: string;
1673
+ /** 제목/부제목 — null이면 .mc-title/.mc-subtitle 숨김 */
1674
+ title: string | null;
1675
+ subtitle: string | null;
1676
+ /** 로딩 오버레이 상태 */
1677
+ loading: boolean;
1678
+ /** 값 라벨 (.mc-data-label) */
1679
+ dataLabels: DataLabelView[];
1680
+ /** 값 축 기준선 (.mc-mark-line) */
1681
+ markLines: MarkLineView[];
1682
+ /** 값 축 기준 영역 (.mc-mark-band) */
1683
+ markBands: MarkBandView[];
1684
+ /** 접근성 패턴 채우기 활성 여부 — defs에 .mc-pattern 생성 */
1685
+ patterns: boolean;
1686
+ /** 드릴다운 깊이 — 0보다 크면 .mc-drillup 버튼 표시 */
1687
+ drillDepth: number;
1688
+ /** 인라인 주석 (.mc-annotation) */
1689
+ annotations: AnnotationView[];
1690
+ /** 그린 주석 (.mc-drawings 안 .mc-draw-*) — draft 포함 */
1691
+ drawings: DrawingView[];
1692
+ /** 활성 그리기 도구 — null이면 드래그는 줌/선택 */
1693
+ drawMode: DrawTool | null;
1694
+ /** 범례 페이지네이션 — null이면 단일 페이지 */
1695
+ legendPage: {
1696
+ page: number;
1697
+ pages: number;
1698
+ size: number;
1699
+ } | null;
1700
+ /** 에러바 오버레이 — series.errors가 있는 시리즈의 포인트별 오차 */
1701
+ errors: ErrorBarView[];
1702
+ /** 추세선 오버레이 — series.trend가 있는 시리즈 */
1703
+ trendLines: TrendLineView[];
1704
+ /** 레이더 축 그리드 — radar/radar-area 타입에서만 */
1705
+ radar: RadarGridView | null;
1706
+ /** 네비게이터 미니맵 — navigator 옵션이고 직교 차트일 때 */
1707
+ navigator: NavigatorView | null;
1708
+ /** 스크롤바 스트립 — scrollbar 옵션이고 네비게이터가 없을 때 */
1709
+ scrollbar: NavigatorView | null;
1710
+ /** 범례 체크박스 — legend.checkboxes이면 .mc-legend-check 렌더 */
1711
+ legendChecks: boolean;
1712
+ /** 열린 컨텍스트 메뉴 — null이면 닫힘 */
1713
+ menu: MenuView | null;
1714
+ /** 지도 값 범례 — map 타입이고 mapData가 있을 때 (.mc-map-scale) */
1715
+ mapScale: MapScaleView | null;
1716
+ /** 선택된 포인트 (allowPointSelect) — 없으면 null */
1717
+ selected: FocusPoint | null;
1718
+ /** 로케일이 적용된 툴바 문구 */
1719
+ labels: {
1720
+ /** .mc-drillup 버튼 텍스트 */
1721
+ drillUp: string;
1722
+ /** .mc-zoom-reset 버튼 텍스트 */
1723
+ reset: string;
1724
+ };
1725
+ series: SeriesView[];
1726
+ geometry: GeometryView[];
1727
+ /** 렌더 순서 무관 — kind/position으로 배치 */
1728
+ axes: AxisView[];
1729
+ legend: LegendItemView[];
1730
+ legendPosition: LegendPosition;
1731
+ tooltip: TooltipView | null;
1732
+ /** 공유 툴팁의 세로 가이드선 (plot 상대 x) */
1733
+ crosshair: number | null;
1734
+ selection: SelectionView | null;
1735
+ zoomed: boolean;
1736
+ focused: FocusPoint | null;
1737
+ /** aria-live로 읽을 포커스/호버 설명 */
1738
+ a11yText: string;
1739
+ }
1740
+ export type ChartEventType = "ready" | "seriesClick" | "pointDblClick" | "chartClick" | "legendToggle" | "legendHover" | "zoomChange" | "selectionChange" | "hoverChange" | "focusChange" | "visibilityChange" | "dataChange" | "themeChange" | "typeChange" | "loadingChange" | "drilldown" | "drillup" | "drillupall" | "legendCheck" | "menuAction" | "pointSelect" | "pointUnselect" | "beforePrint" | "afterPrint" | "pointUpdate" | "redraw" | "resize" | "export" | "drawEnd" | "searchEnd" | "searchError" | "clusterSelect";
1741
+ export interface ChartEventMap {
1742
+ ready: {
1743
+ snapshot: ChartSnapshot;
1744
+ };
1745
+ /** 플롯 클릭 — point는 히트 결과 (빈 영역이면 null) */
1746
+ chartClick: {
1747
+ point: HoverInfo | null;
1748
+ };
1749
+ seriesClick: {
1750
+ seriesId: string;
1751
+ index: number;
1752
+ value: number | null;
1753
+ };
1754
+ pointDblClick: {
1755
+ seriesId: string;
1756
+ index: number;
1757
+ value: number | null;
1758
+ };
1759
+ legendToggle: {
1760
+ id: string;
1761
+ visible: boolean;
1762
+ };
1763
+ /** 범례 항목 hover — id 또는 해제 시 null. 다른 시리즈가 dim된다 */
1764
+ legendHover: {
1765
+ id: string | null;
1766
+ };
1767
+ visibilityChange: {
1768
+ seriesId: string;
1769
+ visible: boolean;
1770
+ };
1771
+ zoomChange: {
1772
+ window: DomainWindow | null;
1773
+ /** axes:"y"|"xy" 줌의 값 축 창 — 없으면 null */
1774
+ yWindow: DomainWindow | null;
1775
+ };
1776
+ selectionChange: {
1777
+ range: DomainWindow | null;
1778
+ indices: number[];
1779
+ };
1780
+ hoverChange: {
1781
+ point: HoverInfo | null;
1782
+ };
1783
+ focusChange: {
1784
+ point: FocusPoint | null;
1785
+ };
1786
+ /** setData 적용 시 */
1787
+ dataChange: {
1788
+ seriesCount: number;
1789
+ categoryCount: number;
1790
+ };
1791
+ themeChange: {
1792
+ theme: ChartTheme;
1793
+ };
1794
+ typeChange: {
1795
+ type: ChartType;
1796
+ };
1797
+ loadingChange: {
1798
+ loading: boolean;
1799
+ };
1800
+ /** 컨테이너 크기 변경 시 (setSize 경유) */
1801
+ resize: {
1802
+ width: number;
1803
+ height: number;
1804
+ };
1805
+ /** 드릴다운 진입 — key는 drilldown 옵션 맵의 키(포인트 라벨) */
1806
+ drilldown: {
1807
+ key: string;
1808
+ depth: number;
1809
+ };
1810
+ /** 한 레벨 위로 복귀 */
1811
+ drillup: {
1812
+ depth: number;
1813
+ };
1814
+ /** 최상위 레벨로 일괄 복귀 — drillUpAll() (IBChart drillupall 해당) */
1815
+ drillupall: {
1816
+ depth: number;
1817
+ };
1818
+ /** 범례 체크박스 클릭 — checked는 새 가시성 (IBChart seriesCheckBoxClick 해당) */
1819
+ legendCheck: {
1820
+ id: string;
1821
+ checked: boolean;
1822
+ };
1823
+ /** 컨텍스트 메뉴 커스텀 항목 선택 — 내장 항목은 코어가 직접 처리 */
1824
+ menuAction: {
1825
+ id: string;
1826
+ };
1827
+ /** allowPointSelect 클릭/API로 포인트 선택 */
1828
+ pointSelect: {
1829
+ seriesId: string;
1830
+ index: number;
1831
+ value: number | null;
1832
+ /** 포인트/시리즈 부가 데이터 (etcData) */
1833
+ etcData?: unknown;
1834
+ };
1835
+ /** 선택 해제 — 재클릭/Escape/데이터 리셋 */
1836
+ pointUnselect: {
1837
+ seriesId: string;
1838
+ index: number;
1839
+ };
1840
+ /** window beforeprint/afterprint 전달 (IBChart 동명 이벤트 해당) */
1841
+ beforePrint: Record<string, never>;
1842
+ afterPrint: Record<string, never>;
1843
+ /** updatePoint/API로 포인트 값 변경 (IBChart pointUpdate 해당) */
1844
+ pointUpdate: {
1845
+ seriesId: string;
1846
+ index: number;
1847
+ value: number | null;
1848
+ };
1849
+ /** redraw() 호출 등 재렌더 요청 시 */
1850
+ redraw: Record<string, never>;
1851
+ export: {
1852
+ format: "svg" | "png";
1853
+ };
1854
+ /** 주석 그리기 완료 — 드래그 종료로 drawings에 추가될 때 */
1855
+ drawEnd: {
1856
+ drawing: DrawingInput;
1857
+ };
1858
+ /** search.load 완료 — setData가 적용된 뒤 발행 (IBChart searchEnd 해당) */
1859
+ searchEnd: {
1860
+ seriesCount: number;
1861
+ categoryCount: number;
1862
+ };
1863
+ /** search.load 실패 — 네트워크/변환 오류 */
1864
+ searchError: {
1865
+ message: string;
1866
+ };
1867
+ /**
1868
+ * 지도 클러스터 클릭 — map.cluster로 묶인 마커 버블.
1869
+ * members는 mapPoints 인덱스, points는 해당 입력 레코드.
1870
+ */
1871
+ clusterSelect: {
1872
+ seriesId: string;
1873
+ members: readonly number[];
1874
+ points: readonly ChartMapPoint[];
1875
+ };
1876
+ }
1877
+ /** 이벤트 핸들러 맵 — 옵션/구독 양쪽에서 사용 */
1878
+ export type ChartEventHandlers = {
1879
+ [K in ChartEventType]?: (e: ChartEventMap[K]) => void;
1880
+ };
1881
+ //# sourceMappingURL=types.d.ts.map