@zendir/ui 0.1.8 → 0.1.9

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 (79) hide show
  1. package/dist/index.js +0 -137
  2. package/dist/index.js.map +1 -1
  3. package/dist/react/context/DisplaySettingsContext.js +0 -12
  4. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  5. package/dist/react/index.d.ts +0 -30
  6. package/dist/react/utils/index.js +0 -8
  7. package/dist/react/utils/index.js.map +1 -1
  8. package/dist/react.js +0 -137
  9. package/dist/react.js.map +1 -1
  10. package/package.json +1 -1
  11. package/dist/react/3d/EarthViewer.js +0 -836
  12. package/dist/react/3d/EarthViewer.js.map +0 -1
  13. package/dist/react/3d/SolarSystemViewer.js +0 -372
  14. package/dist/react/3d/SolarSystemViewer.js.map +0 -1
  15. package/dist/react/3d/ZenSpace3D.js +0 -1253
  16. package/dist/react/3d/ZenSpace3D.js.map +0 -1
  17. package/dist/react/3d/ZenSpace3DCesium.js +0 -186
  18. package/dist/react/3d/ZenSpace3DCesium.js.map +0 -1
  19. package/dist/react/3d/ZenSpace3DShaders.js +0 -94
  20. package/dist/react/3d/ZenSpace3DShaders.js.map +0 -1
  21. package/dist/react/3d/ZenSpace3DUtils.js +0 -213
  22. package/dist/react/3d/ZenSpace3DUtils.js.map +0 -1
  23. package/dist/react/3d/threeLoader.js +0 -18
  24. package/dist/react/3d/threeLoader.js.map +0 -1
  25. package/dist/react/cards/AccessCard.js +0 -410
  26. package/dist/react/cards/AccessCard.js.map +0 -1
  27. package/dist/react/cards/OrbitCard.js +0 -372
  28. package/dist/react/cards/OrbitCard.js.map +0 -1
  29. package/dist/react/cards/SpacecraftCard.js +0 -941
  30. package/dist/react/cards/SpacecraftCard.js.map +0 -1
  31. package/dist/react/cards/TelemetryCard.js +0 -742
  32. package/dist/react/cards/TelemetryCard.js.map +0 -1
  33. package/dist/react/cards/TelemetryStreamCard.js +0 -309
  34. package/dist/react/cards/TelemetryStreamCard.js.map +0 -1
  35. package/dist/react/charts/GroundTrackMap.js +0 -1123
  36. package/dist/react/charts/GroundTrackMap.js.map +0 -1
  37. package/dist/react/charts/GroundTrackMapLeaflet.js +0 -571
  38. package/dist/react/charts/GroundTrackMapLeaflet.js.map +0 -1
  39. package/dist/react/charts/groundTrackMapLeafletTiles.js +0 -11
  40. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +0 -1
  41. package/dist/react/charts/groundTrackMapLeafletUtils.js +0 -109
  42. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +0 -1
  43. package/dist/react/charts/unified/AstroChart.js +0 -1405
  44. package/dist/react/charts/unified/AstroChart.js.map +0 -1
  45. package/dist/react/charts/unified/PowerOverviewChart.js +0 -488
  46. package/dist/react/charts/unified/PowerOverviewChart.js.map +0 -1
  47. package/dist/react/charts/unified/domain.js +0 -3168
  48. package/dist/react/charts/unified/domain.js.map +0 -1
  49. package/dist/react/charts/unified/generators.js +0 -518
  50. package/dist/react/charts/unified/generators.js.map +0 -1
  51. package/dist/react/charts/unified/presets.js +0 -999
  52. package/dist/react/charts/unified/presets.js.map +0 -1
  53. package/dist/react/charts/unified/sync.js +0 -219
  54. package/dist/react/charts/unified/sync.js.map +0 -1
  55. package/dist/react/charts/unified/theme.js +0 -562
  56. package/dist/react/charts/unified/theme.js.map +0 -1
  57. package/dist/react/charts/unified/useChartStream.js +0 -226
  58. package/dist/react/charts/unified/useChartStream.js.map +0 -1
  59. package/dist/react/visualizations/EclipseTimerCard.js +0 -250
  60. package/dist/react/visualizations/EclipseTimerCard.js.map +0 -1
  61. package/dist/react/visualizations/LinkBudgetCard.js +0 -444
  62. package/dist/react/visualizations/LinkBudgetCard.js.map +0 -1
  63. package/dist/react/visualizations/NavBallCard.js +0 -243
  64. package/dist/react/visualizations/NavBallCard.js.map +0 -1
  65. package/dist/react/visualizations/PropulsionCard.js +0 -298
  66. package/dist/react/visualizations/PropulsionCard.js.map +0 -1
  67. package/dist/react/visualizations/SensorFootprintCard.js +0 -326
  68. package/dist/react/visualizations/SensorFootprintCard.js.map +0 -1
  69. package/dist/react/visualizations/ThermalHeatmapCard.js +0 -372
  70. package/dist/react/visualizations/ThermalHeatmapCard.js.map +0 -1
  71. package/dist/shaders/atmosphere.frag.js +0 -5
  72. package/dist/shaders/atmosphere.frag.js.map +0 -1
  73. package/dist/shaders/atmosphere.vert.js +0 -5
  74. package/dist/shaders/atmosphere.vert.js.map +0 -1
  75. package/dist/shaders/stars.frag.js +0 -5
  76. package/dist/shaders/stars.frag.js.map +0 -1
  77. package/dist/shaders/stars.vert.js +0 -5
  78. package/dist/shaders/stars.vert.js.map +0 -1
  79. package/dist/style.css +0 -143
@@ -1,488 +0,0 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { useMemo } from "react";
3
- import { AstroChart } from "./AstroChart.js";
4
- import { useTheme } from "../../theme/ThemeProvider.js";
5
- const STATUS_BORDER_COLORS = {
6
- off: "#3c3e42",
7
- standby: "#285766",
8
- normal: "#005a00",
9
- caution: "#645600",
10
- serious: "#664618",
11
- critical: "#661102"
12
- };
13
- const StatusShape = ({ status, size, color, borderColor, glow = true }) => {
14
- const hasBorder = !!borderColor;
15
- const strokeWidth = hasBorder ? 1 : 0;
16
- const glowFilter = glow && !hasBorder ? `drop-shadow(0 0 4px ${color})` : void 0;
17
- const renderShape = () => {
18
- switch (status) {
19
- case "off":
20
- return /* @__PURE__ */ jsx("circle", { cx: "6", cy: "6", r: hasBorder ? 2.5 : 3, fill: color, stroke: borderColor, strokeWidth });
21
- case "standby":
22
- return /* @__PURE__ */ jsx("circle", { cx: "6", cy: "6", r: "3.5", fill: "none", stroke: color, strokeWidth: "2" });
23
- case "normal":
24
- return /* @__PURE__ */ jsx(
25
- "circle",
26
- {
27
- cx: "6",
28
- cy: "6",
29
- r: hasBorder ? 4.5 : 5,
30
- fill: color,
31
- stroke: borderColor,
32
- strokeWidth
33
- }
34
- );
35
- case "caution":
36
- return /* @__PURE__ */ jsx(
37
- "rect",
38
- {
39
- x: hasBorder ? 1.5 : 1,
40
- y: hasBorder ? 1.5 : 1,
41
- width: hasBorder ? 9 : 10,
42
- height: hasBorder ? 9 : 10,
43
- fill: color,
44
- stroke: borderColor,
45
- strokeWidth
46
- }
47
- );
48
- case "serious":
49
- return /* @__PURE__ */ jsx(
50
- "polygon",
51
- {
52
- points: "6,1 11,6 6,11 1,6",
53
- fill: color,
54
- stroke: borderColor,
55
- strokeWidth
56
- }
57
- );
58
- case "critical":
59
- return /* @__PURE__ */ jsx(
60
- "polygon",
61
- {
62
- points: "6,11 1,2 11,2",
63
- fill: color,
64
- stroke: borderColor,
65
- strokeWidth
66
- }
67
- );
68
- default:
69
- return null;
70
- }
71
- };
72
- return /* @__PURE__ */ jsx(
73
- "svg",
74
- {
75
- viewBox: "0 0 12 12",
76
- width: size,
77
- height: size,
78
- style: { filter: glowFilter },
79
- children: renderShape()
80
- }
81
- );
82
- };
83
- const STATE_COLORS = {
84
- running: "#0d4d4d",
85
- // Deep teal
86
- safe: "#8b7355",
87
- // Brown/gold
88
- shutdown: "#1a1a1a"
89
- // Near black
90
- };
91
- const MODE_COLORS = {
92
- none: "#1a2332",
93
- inertial: "#1e3a5f",
94
- sun: "#8b7355",
95
- nadir: "#2d5a4d",
96
- velocity: "#2e4a7c",
97
- ground: "#4a3d6e"
98
- };
99
- const EVENT_COLORS = {
100
- scenario: "#ffffff",
101
- operator: "#ff6b9d",
102
- spacecraft: "#a78bfa",
103
- ground: "#4ade80"
104
- };
105
- const ECLIPSE_COLOR = "rgba(10, 10, 15, 0.6)";
106
- function PowerOverviewChart(props) {
107
- const {
108
- data,
109
- events = [],
110
- title = "Power - Power Generated",
111
- height = 300,
112
- showBattery = false,
113
- showLegend = false,
114
- enableExport = true,
115
- className,
116
- compact = false,
117
- showEventDots = true,
118
- showStatus = true,
119
- enableZoom = true
120
- } = props;
121
- const { tokens, mode } = useTheme();
122
- const currentStatus = useMemo(() => {
123
- if (!data || data.length === 0) return "off";
124
- const latest = data[data.length - 1];
125
- if (latest.state === "shutdown") return "critical";
126
- if (latest.state === "safe") return "caution";
127
- if (latest.eclipse) return "serious";
128
- return "normal";
129
- }, [data]);
130
- const chartConfig = useMemo(() => {
131
- if (!data || data.length === 0) {
132
- return {
133
- type: "line",
134
- series: [],
135
- height
136
- };
137
- }
138
- const times = data.map((d) => typeof d.time === "number" ? d.time : d.time.getTime());
139
- const minTime = Math.min(...times);
140
- const maxTime = Math.max(...times);
141
- const stateRegions = [];
142
- let currentState = data[0].state;
143
- let regionStart = minTime;
144
- data.forEach((point, idx) => {
145
- const pointTime = typeof point.time === "number" ? point.time : point.time.getTime();
146
- if (point.state !== currentState || idx === data.length - 1) {
147
- const regionEnd = idx === data.length - 1 ? maxTime : pointTime;
148
- stateRegions.push([
149
- {
150
- xAxis: regionStart,
151
- itemStyle: { color: STATE_COLORS[currentState] }
152
- },
153
- { xAxis: regionEnd }
154
- ]);
155
- regionStart = pointTime;
156
- currentState = point.state;
157
- }
158
- });
159
- const eclipseRegions = [];
160
- let inEclipse = false;
161
- let eclipseStart = minTime;
162
- data.forEach((point, _idx) => {
163
- const pointTime = typeof point.time === "number" ? point.time : point.time.getTime();
164
- if (point.eclipse && !inEclipse) {
165
- eclipseStart = pointTime;
166
- inEclipse = true;
167
- } else if (!point.eclipse && inEclipse) {
168
- eclipseRegions.push([
169
- {
170
- xAxis: eclipseStart,
171
- itemStyle: { color: ECLIPSE_COLOR }
172
- },
173
- { xAxis: pointTime }
174
- ]);
175
- inEclipse = false;
176
- }
177
- });
178
- if (inEclipse) {
179
- eclipseRegions.push([
180
- {
181
- xAxis: eclipseStart,
182
- itemStyle: { color: ECLIPSE_COLOR }
183
- },
184
- { xAxis: maxTime }
185
- ]);
186
- }
187
- const series = [
188
- {
189
- id: "power",
190
- name: "Power (W)",
191
- data: data.map((d) => ({
192
- time: typeof d.time === "number" ? d.time : d.time.getTime(),
193
- value: d.power
194
- })),
195
- color: "#ffffff",
196
- lineStyle: { width: 2 },
197
- areaStyle: { opacity: 0.3, color: "rgba(255, 255, 255, 0.2)" },
198
- smooth: true,
199
- yAxisIndex: 0
200
- }
201
- ];
202
- if (showBattery) {
203
- series.push({
204
- id: "battery",
205
- name: "Battery %",
206
- data: data.map((d) => ({
207
- time: typeof d.time === "number" ? d.time : d.time.getTime(),
208
- value: d.battery ?? 0
209
- })),
210
- color: "#4ade80",
211
- lineStyle: { width: 2, type: "dashed" },
212
- smooth: true,
213
- yAxisIndex: 1
214
- });
215
- }
216
- const maxPower = Math.max(...data.map((d) => d.power), 100);
217
- const eventDots = showEventDots ? events.map((event) => ({
218
- coord: [
219
- typeof event.time === "number" ? event.time : event.time.getTime(),
220
- maxPower * 0.95
221
- ],
222
- name: event.label,
223
- symbol: event.type === "scenario" ? "diamond" : "circle",
224
- symbolSize: event.type === "scenario" ? 10 : 8,
225
- itemStyle: {
226
- color: EVENT_COLORS[event.type],
227
- borderColor: tokens.colors.background.base,
228
- borderWidth: 2,
229
- shadowBlur: 4,
230
- shadowColor: EVENT_COLORS[event.type]
231
- },
232
- label: {
233
- show: false
234
- },
235
- emphasis: {
236
- scale: true,
237
- itemStyle: {
238
- borderWidth: 3,
239
- shadowBlur: 8
240
- },
241
- label: {
242
- show: true,
243
- fontSize: 12,
244
- color: tokens.colors.text.primary,
245
- backgroundColor: tokens.colors.background.surface,
246
- borderColor: EVENT_COLORS[event.type],
247
- borderWidth: 1,
248
- padding: [6, 10],
249
- borderRadius: 6,
250
- formatter: `{b}`
251
- }
252
- }
253
- })) : [];
254
- const yAxisConfig = showBattery ? [
255
- {
256
- type: "value",
257
- name: "Power (W)",
258
- position: "left",
259
- min: 0,
260
- splitLine: { show: true }
261
- },
262
- {
263
- type: "value",
264
- name: "Battery %",
265
- position: "right",
266
- min: 0,
267
- max: 100,
268
- splitLine: { show: false }
269
- }
270
- ] : {
271
- type: "value",
272
- name: "Power (W)",
273
- min: 0,
274
- splitLine: { show: true }
275
- };
276
- return {
277
- type: "area",
278
- title,
279
- subtitle: compact ? void 0 : `System states, operational modes, eclipse periods, and events`,
280
- height,
281
- series,
282
- xAxis: {
283
- type: "time",
284
- showGrid: true,
285
- splitLine: { show: true }
286
- },
287
- yAxis: yAxisConfig,
288
- tooltip: {
289
- enabled: true,
290
- trigger: "axis",
291
- crosshair: "both",
292
- formatter: (params) => {
293
- const param = Array.isArray(params) ? params[0] : params;
294
- if (!param) return "";
295
- const time = new Date(param.data[0]);
296
- const dataPoint = data.find((d) => {
297
- const t = typeof d.time === "number" ? d.time : d.time.getTime();
298
- return t === param.data[0];
299
- });
300
- let html = `<div style="font-size: 13px; min-width: 220px; font-family: ${tokens.typography.fontFamily.primary};">`;
301
- html += `<div style="font-weight: 600; margin-bottom: 10px; color: ${tokens.colors.text.primary}; font-size: 14px;">${time.toLocaleTimeString()}</div>`;
302
- if (Array.isArray(params)) {
303
- params.forEach((p) => {
304
- const value = p.data[1];
305
- const seriesName = p.seriesName;
306
- const color = p.color;
307
- html += `<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 6px;">`;
308
- html += `<span style="width: 12px; height: 12px; background: ${color}; border-radius: 3px; box-shadow: 0 0 4px ${color};"></span>`;
309
- html += `<span style="color: ${tokens.colors.text.secondary};">${seriesName}: <strong style="color: ${tokens.colors.text.primary};">${value.toFixed(1)}</strong></span>`;
310
- html += `</div>`;
311
- });
312
- } else {
313
- const value = param.data[1];
314
- html += `<div style="margin-bottom: 6px; color: ${tokens.colors.text.secondary};">Power: <strong style="color: ${tokens.colors.text.primary};">${value.toFixed(1)} W</strong></div>`;
315
- }
316
- if (dataPoint) {
317
- html += `<div style="margin-top: 10px; padding-top: 10px; border-top: 1px solid ${tokens.colors.border.muted};">`;
318
- html += `<div style="display: grid; grid-template-columns: auto 1fr; gap: 8px 12px; font-size: 12px;">`;
319
- html += `<span style="color: ${tokens.colors.text.muted};">STATE</span>`;
320
- html += `<span style="color: ${STATE_COLORS[dataPoint.state]}; font-weight: 600;">${dataPoint.state.toUpperCase()}</span>`;
321
- html += `<span style="color: ${tokens.colors.text.muted};">MODE</span>`;
322
- html += `<span style="color: ${MODE_COLORS[dataPoint.mode]}; font-weight: 600;">${dataPoint.mode.toUpperCase()}</span>`;
323
- if (dataPoint.battery !== void 0) {
324
- html += `<span style="color: ${tokens.colors.text.muted};">BATTERY</span>`;
325
- html += `<span style="color: ${tokens.colors.text.primary}; font-weight: 600;">${dataPoint.battery.toFixed(1)}%</span>`;
326
- }
327
- html += `</div>`;
328
- if (dataPoint.eclipse) {
329
- html += `<div style="color: ${tokens.colors.status.caution}; font-weight: 600; margin-top: 8px; font-size: 12px; display: flex; align-items: center; gap: 6px;">`;
330
- html += `<span style="font-weight: 600;">ECLIPSE</span>`;
331
- html += `</div>`;
332
- }
333
- html += `</div>`;
334
- }
335
- html += `</div>`;
336
- return html;
337
- }
338
- },
339
- legend: showLegend ? {
340
- show: true,
341
- position: "top",
342
- orient: "horizontal"
343
- } : { show: false },
344
- zoom: enableZoom ? {
345
- enabled: true,
346
- type: "both",
347
- axis: "x",
348
- start: 0,
349
- end: 100
350
- } : void 0,
351
- annotations: {
352
- markAreas: {
353
- data: [...stateRegions, ...eclipseRegions],
354
- itemStyle: {
355
- opacity: 1
356
- }
357
- },
358
- markPoints: eventDots
359
- },
360
- export: enableExport ? {
361
- enabled: true,
362
- formats: ["png", "svg", "csv"],
363
- getExportFileName: () => `zendir-power-overview-${Date.now()}`
364
- } : void 0,
365
- infoTooltip: compact ? void 0 : {
366
- content: /* @__PURE__ */ jsxs("div", { style: { fontSize: "13px", lineHeight: "1.6" }, children: [
367
- /* @__PURE__ */ jsx("div", { style: { marginBottom: "8px", fontWeight: 500 }, children: "Interactive Power Timeline" }),
368
- /* @__PURE__ */ jsx("div", { style: { marginBottom: "4px" }, children: "• Background colors show system states" }),
369
- /* @__PURE__ */ jsx("div", { style: { marginBottom: "4px" }, children: "• Dark overlays indicate eclipse periods" }),
370
- /* @__PURE__ */ jsx("div", { style: { marginBottom: "4px" }, children: "• Diamond markers show key events" }),
371
- /* @__PURE__ */ jsx("div", { children: "• Scroll to zoom, drag to pan" })
372
- ] })
373
- },
374
- className
375
- };
376
- }, [data, events, title, height, showBattery, showLegend, enableExport, className, compact, showEventDots, enableZoom, tokens]);
377
- return /* @__PURE__ */ jsxs("div", { style: { position: "relative", width: "100%" }, children: [
378
- showStatus && /* @__PURE__ */ jsxs("div", { style: {
379
- position: "absolute",
380
- top: 10,
381
- right: 60,
382
- zIndex: 10,
383
- display: "flex",
384
- alignItems: "center",
385
- gap: 8,
386
- padding: "6px 12px",
387
- background: tokens.colors.background.surface,
388
- border: `1px solid ${tokens.colors.border.default}`,
389
- borderRadius: tokens.borderRadius.md,
390
- fontSize: tokens.typography.fontSize.xs,
391
- fontFamily: tokens.typography.fontFamily.primary
392
- }, children: [
393
- /* @__PURE__ */ jsx(
394
- StatusShape,
395
- {
396
- status: currentStatus,
397
- size: 10,
398
- color: tokens.colors.status[currentStatus] || tokens.colors.status.off,
399
- borderColor: mode === "light" ? STATUS_BORDER_COLORS[currentStatus] : void 0,
400
- glow: mode !== "light"
401
- }
402
- ),
403
- /* @__PURE__ */ jsx("span", { style: {
404
- color: tokens.colors.text.primary,
405
- fontWeight: 500,
406
- textTransform: "uppercase",
407
- letterSpacing: "0.5px"
408
- }, children: currentStatus })
409
- ] }),
410
- /* @__PURE__ */ jsx(AstroChart, { ...chartConfig })
411
- ] });
412
- }
413
- function generateSamplePowerData(durationSeconds = 3600) {
414
- const dataPoints = [];
415
- const eventList = [];
416
- const startTime = Date.now();
417
- const interval = 10;
418
- let currentState = "running";
419
- let currentMode = "inertial";
420
- let inEclipse = false;
421
- for (let i = 0; i <= durationSeconds; i += interval) {
422
- const time = startTime + i * 1e3;
423
- if (i === 300) currentState = "safe";
424
- if (i === 600) currentState = "running";
425
- if (i === 1800) currentState = "shutdown";
426
- if (i === 2100) currentState = "running";
427
- if (i === 2400) currentState = "safe";
428
- if (i === 2700) currentState = "running";
429
- if (i === 200) currentMode = "sun";
430
- if (i === 500) currentMode = "inertial";
431
- if (i === 800) currentMode = "nadir";
432
- if (i === 1100) currentMode = "velocity";
433
- if (i === 1400) currentMode = "ground";
434
- if (i === 1700) currentMode = "sun";
435
- if (i === 2e3) currentMode = "inertial";
436
- if (i === 2300) currentMode = "nadir";
437
- if (i === 2600) currentMode = "velocity";
438
- if (i === 2900) currentMode = "ground";
439
- if (i === 3200) currentMode = "sun";
440
- if (i >= 1700 && i <= 2100) inEclipse = true;
441
- else if (i >= 2400 && i <= 2700) inEclipse = true;
442
- else inEclipse = false;
443
- let battery = 95;
444
- if (inEclipse) {
445
- battery = 95 - (i - 1700) % 400 * 0.1;
446
- } else if (currentMode === "sun") {
447
- battery = 70 + Math.sin(i * 0.01) * 15;
448
- } else {
449
- battery = 90 + Math.sin(i * 5e-3) * 5;
450
- }
451
- battery = Math.max(10, Math.min(100, battery));
452
- let power = 0;
453
- if (inEclipse) {
454
- power = 0;
455
- } else if (currentMode === "sun") {
456
- power = 300 + Math.sin(i * 0.02) * 50;
457
- } else if (currentMode === "ground" || currentMode === "nadir") {
458
- power = 150 + Math.sin(i * 0.03) * 30;
459
- } else {
460
- power = 50 + Math.sin(i * 0.01) * 20;
461
- }
462
- if (currentState === "safe") power *= 0.3;
463
- if (currentState === "shutdown") power = 0;
464
- dataPoints.push({
465
- time,
466
- power,
467
- battery,
468
- state: currentState,
469
- mode: currentMode,
470
- eclipse: inEclipse
471
- });
472
- }
473
- const eventTimes = [250, 420, 550, 900, 1300, 1650, 1850, 2200, 2500, 2800, 3100, 3400];
474
- const eventTypes = ["scenario", "operator", "spacecraft", "ground"];
475
- eventTimes.forEach((timeOffset, idx) => {
476
- eventList.push({
477
- time: startTime + timeOffset * 1e3,
478
- type: eventTypes[idx % eventTypes.length],
479
- label: `Event ${idx + 1}`
480
- });
481
- });
482
- return { data: dataPoints, events: eventList };
483
- }
484
- export {
485
- PowerOverviewChart,
486
- generateSamplePowerData
487
- };
488
- //# sourceMappingURL=PowerOverviewChart.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PowerOverviewChart.js","sources":["../../../../src/react/charts/unified/PowerOverviewChart.tsx"],"sourcesContent":["/**\n * Power Overview Chart - Combined Timeline Visualization\n * \n * Award-winning UX combining:\n * - Power generation timeline\n * - State regions (Running, Safe, Shutdown)\n * - Mode indicators (Inertial, Sun, Nadir, Velocity, Ground)\n * - Eclipse periods\n * - Event markers with dots on timeline\n * - Interactive tooltips\n * - Status indicators\n * \n * @module @zendir/ui/charts/PowerOverviewChart\n */\n\nimport React, { useMemo } from 'react';\nimport { AstroChart } from './AstroChart';\nimport type { AstroChartProps, ChartStatus } from './types';\nimport { useTheme } from '../../theme';\n\n// =============================================================================\n// Status Shape SVGs - Astro UX compliant (color + shape for accessibility)\n// =============================================================================\n\nconst STATUS_BORDER_COLORS: Record<ChartStatus, string> = {\n off: '#3c3e42',\n standby: '#285766',\n normal: '#005a00',\n caution: '#645600',\n serious: '#664618',\n critical: '#661102',\n};\n\ninterface StatusShapeProps {\n status: ChartStatus;\n size: number;\n color: string;\n borderColor?: string;\n glow?: boolean;\n}\n\nconst StatusShape = ({ status, size, color, borderColor, glow = true }: StatusShapeProps): React.ReactElement => {\n const hasBorder = !!borderColor;\n const strokeWidth = hasBorder ? 1 : 0;\n const glowFilter = glow && !hasBorder ? `drop-shadow(0 0 4px ${color})` : undefined;\n \n const renderShape = () => {\n switch (status) {\n case 'off':\n return <circle cx=\"6\" cy=\"6\" r={hasBorder ? 2.5 : 3} fill={color} stroke={borderColor} strokeWidth={strokeWidth} />;\n case 'standby':\n return <circle cx=\"6\" cy=\"6\" r=\"3.5\" fill=\"none\" stroke={color} strokeWidth=\"2\" />;\n case 'normal':\n return (\n <circle\n cx=\"6\"\n cy=\"6\"\n r={hasBorder ? 4.5 : 5}\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case 'caution':\n return (\n <rect\n x={hasBorder ? 1.5 : 1}\n y={hasBorder ? 1.5 : 1}\n width={hasBorder ? 9 : 10}\n height={hasBorder ? 9 : 10}\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case 'serious':\n return (\n <polygon\n points=\"6,1 11,6 6,11 1,6\"\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case 'critical':\n return (\n <polygon\n points=\"6,11 1,2 11,2\"\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n default:\n return null;\n }\n };\n \n return (\n <svg \n viewBox=\"0 0 12 12\" \n width={size} \n height={size}\n style={{ filter: glowFilter }}\n >\n {renderShape()}\n </svg>\n );\n};\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type PowerState = 'running' | 'safe' | 'shutdown';\nexport type OperationalMode = 'none' | 'inertial' | 'sun' | 'nadir' | 'velocity' | 'ground';\nexport type EventType = 'scenario' | 'operator' | 'spacecraft' | 'ground';\n\nexport interface PowerTimelinePoint {\n /** Timestamp (Unix ms or Date) */\n time: number | Date;\n /** Power generated (W) */\n power: number;\n /** Battery percentage (0-100) */\n battery?: number;\n /** System state */\n state: PowerState;\n /** Operational mode */\n mode: OperationalMode;\n /** Eclipse flag */\n eclipse?: boolean;\n}\n\nexport interface PowerEvent {\n /** Event timestamp */\n time: number | Date;\n /** Event type */\n type: EventType;\n /** Event label */\n label: string;\n /** Optional metadata */\n meta?: Record<string, unknown>;\n}\n\nexport interface PowerOverviewChartProps {\n /** Timeline data points */\n data: PowerTimelinePoint[];\n /** Event markers */\n events?: PowerEvent[];\n /** Chart title */\n title?: string;\n /** Chart height */\n height?: number | string;\n /** Show battery as secondary series */\n showBattery?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Enable export */\n enableExport?: boolean;\n /** Custom class name */\n className?: string;\n /** Compact mode */\n compact?: boolean;\n /** Show event dots on timeline */\n showEventDots?: boolean;\n /** Show status indicator */\n showStatus?: boolean;\n /** Enable zoom controls */\n enableZoom?: boolean;\n}\n\n// =============================================================================\n// Color Schemes\n// =============================================================================\n\nconst STATE_COLORS: Record<PowerState, string> = {\n running: '#0d4d4d', // Deep teal\n safe: '#8b7355', // Brown/gold\n shutdown: '#1a1a1a', // Near black\n};\n\nconst MODE_COLORS: Record<OperationalMode, string> = {\n none: '#1a2332',\n inertial: '#1e3a5f',\n sun: '#8b7355',\n nadir: '#2d5a4d',\n velocity: '#2e4a7c',\n ground: '#4a3d6e',\n};\n\nconst EVENT_COLORS: Record<EventType, string> = {\n scenario: '#ffffff',\n operator: '#ff6b9d',\n spacecraft: '#a78bfa',\n ground: '#4ade80',\n};\n\nconst ECLIPSE_COLOR = 'rgba(10, 10, 15, 0.6)';\n\n// =============================================================================\n// PowerOverviewChart Component\n// =============================================================================\n\nexport function PowerOverviewChart(props: PowerOverviewChartProps) {\n const {\n data,\n events = [],\n title = 'Power - Power Generated',\n height = 300,\n showBattery = false,\n showLegend = false,\n enableExport = true,\n className,\n compact = false,\n showEventDots = true,\n showStatus = true,\n enableZoom = true,\n } = props;\n\n const { tokens, mode } = useTheme();\n\n // Calculate current status from latest data\n const currentStatus = useMemo(() => {\n if (!data || data.length === 0) return 'off';\n const latest = data[data.length - 1];\n if (latest.state === 'shutdown') return 'critical';\n if (latest.state === 'safe') return 'caution';\n if (latest.eclipse) return 'serious';\n return 'normal';\n }, [data]);\n\n const chartConfig = useMemo<AstroChartProps>(() => {\n if (!data || data.length === 0) {\n return {\n type: 'line',\n series: [],\n height,\n };\n }\n\n // Extract time range\n const times = data.map(d => typeof d.time === 'number' ? d.time : d.time.getTime());\n const minTime = Math.min(...times);\n const maxTime = Math.max(...times);\n\n // Build state regions with proper colors\n const stateRegions: Array<[{ xAxis: number; itemStyle?: { color: string } }, { xAxis: number }]> = [];\n let currentState = data[0].state;\n let regionStart = minTime;\n\n data.forEach((point, idx) => {\n const pointTime = typeof point.time === 'number' ? point.time : point.time.getTime();\n \n if (point.state !== currentState || idx === data.length - 1) {\n const regionEnd = idx === data.length - 1 ? maxTime : pointTime;\n stateRegions.push([\n { \n xAxis: regionStart,\n itemStyle: { color: STATE_COLORS[currentState] }\n },\n { xAxis: regionEnd }\n ]);\n regionStart = pointTime;\n currentState = point.state;\n }\n });\n\n // Build eclipse regions (overlay on top of state regions)\n const eclipseRegions: Array<[{ xAxis: number; itemStyle?: { color: string } }, { xAxis: number }]> = [];\n let inEclipse = false;\n let eclipseStart = minTime;\n\n data.forEach((point, _idx) => {\n const pointTime = typeof point.time === 'number' ? point.time : point.time.getTime();\n \n if (point.eclipse && !inEclipse) {\n eclipseStart = pointTime;\n inEclipse = true;\n } else if (!point.eclipse && inEclipse) {\n eclipseRegions.push([\n { \n xAxis: eclipseStart,\n itemStyle: { color: ECLIPSE_COLOR }\n },\n { xAxis: pointTime }\n ]);\n inEclipse = false;\n }\n });\n\n // If still in eclipse at the end\n if (inEclipse) {\n eclipseRegions.push([\n { \n xAxis: eclipseStart,\n itemStyle: { color: ECLIPSE_COLOR }\n },\n { xAxis: maxTime }\n ]);\n }\n\n // Build series\n const series: AstroChartProps['series'] = [\n {\n id: 'power',\n name: 'Power (W)',\n data: data.map(d => ({\n time: typeof d.time === 'number' ? d.time : d.time.getTime(),\n value: d.power,\n })),\n color: '#ffffff',\n lineStyle: { width: 2 },\n areaStyle: { opacity: 0.3, color: 'rgba(255, 255, 255, 0.2)' },\n smooth: true,\n yAxisIndex: 0,\n },\n ];\n\n if (showBattery) {\n series.push({\n id: 'battery',\n name: 'Battery %',\n data: data.map(d => ({\n time: typeof d.time === 'number' ? d.time : d.time.getTime(),\n value: d.battery ?? 0,\n })),\n color: '#4ade80',\n lineStyle: { width: 2, type: 'dashed' },\n smooth: true,\n yAxisIndex: 1,\n });\n }\n\n // Event markers - use dots for timeline, diamonds for emphasis\n const maxPower = Math.max(...data.map(d => d.power), 100);\n \n // Event dots positioned just above the chart area\n const eventDots = showEventDots ? events.map(event => ({\n coord: [\n typeof event.time === 'number' ? event.time : event.time.getTime(),\n maxPower * 0.95\n ] as [number, number],\n name: event.label,\n symbol: event.type === 'scenario' ? 'diamond' : 'circle',\n symbolSize: event.type === 'scenario' ? 10 : 8,\n itemStyle: {\n color: EVENT_COLORS[event.type],\n borderColor: tokens.colors.background.base,\n borderWidth: 2,\n shadowBlur: 4,\n shadowColor: EVENT_COLORS[event.type],\n },\n label: {\n show: false,\n },\n emphasis: {\n scale: true,\n itemStyle: {\n borderWidth: 3,\n shadowBlur: 8,\n },\n label: {\n show: true,\n fontSize: 12,\n color: tokens.colors.text.primary,\n backgroundColor: tokens.colors.background.surface,\n borderColor: EVENT_COLORS[event.type],\n borderWidth: 1,\n padding: [6, 10],\n borderRadius: 6,\n formatter: `{b}`,\n },\n },\n })) : [];\n\n // Dual axis config\n const yAxisConfig: AstroChartProps['yAxis'] = showBattery ? [\n {\n type: 'value',\n name: 'Power (W)',\n position: 'left',\n min: 0,\n splitLine: { show: true },\n },\n {\n type: 'value',\n name: 'Battery %',\n position: 'right',\n min: 0,\n max: 100,\n splitLine: { show: false },\n },\n ] : {\n type: 'value',\n name: 'Power (W)',\n min: 0,\n splitLine: { show: true },\n };\n\n return {\n type: 'area',\n title,\n subtitle: compact ? undefined : `System states, operational modes, eclipse periods, and events`,\n height,\n series,\n xAxis: {\n type: 'time',\n showGrid: true,\n splitLine: { show: true },\n },\n yAxis: yAxisConfig,\n tooltip: {\n enabled: true,\n trigger: 'axis',\n crosshair: 'both',\n formatter: (params: any) => {\n const param = Array.isArray(params) ? params[0] : params;\n if (!param) return '';\n \n const time = new Date(param.data[0]);\n const dataPoint = data.find(d => {\n const t = typeof d.time === 'number' ? d.time : d.time.getTime();\n return t === param.data[0];\n });\n \n let html = `<div style=\"font-size: 13px; min-width: 220px; font-family: ${tokens.typography.fontFamily.primary};\">`;\n html += `<div style=\"font-weight: 600; margin-bottom: 10px; color: ${tokens.colors.text.primary}; font-size: 14px;\">${time.toLocaleTimeString()}</div>`;\n \n // Power values\n if (Array.isArray(params)) {\n params.forEach((p: any) => {\n const value = p.data[1];\n const seriesName = p.seriesName;\n const color = p.color;\n html += `<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 6px;\">`;\n html += `<span style=\"width: 12px; height: 12px; background: ${color}; border-radius: 3px; box-shadow: 0 0 4px ${color};\"></span>`;\n html += `<span style=\"color: ${tokens.colors.text.secondary};\">${seriesName}: <strong style=\"color: ${tokens.colors.text.primary};\">${value.toFixed(1)}</strong></span>`;\n html += `</div>`;\n });\n } else {\n const value = param.data[1];\n html += `<div style=\"margin-bottom: 6px; color: ${tokens.colors.text.secondary};\">Power: <strong style=\"color: ${tokens.colors.text.primary};\">${value.toFixed(1)} W</strong></div>`;\n }\n \n // System info\n if (dataPoint) {\n html += `<div style=\"margin-top: 10px; padding-top: 10px; border-top: 1px solid ${tokens.colors.border.muted};\">`;\n html += `<div style=\"display: grid; grid-template-columns: auto 1fr; gap: 8px 12px; font-size: 12px;\">`;\n html += `<span style=\"color: ${tokens.colors.text.muted};\">STATE</span>`;\n html += `<span style=\"color: ${STATE_COLORS[dataPoint.state]}; font-weight: 600;\">${dataPoint.state.toUpperCase()}</span>`;\n html += `<span style=\"color: ${tokens.colors.text.muted};\">MODE</span>`;\n html += `<span style=\"color: ${MODE_COLORS[dataPoint.mode]}; font-weight: 600;\">${dataPoint.mode.toUpperCase()}</span>`;\n if (dataPoint.battery !== undefined) {\n html += `<span style=\"color: ${tokens.colors.text.muted};\">BATTERY</span>`;\n html += `<span style=\"color: ${tokens.colors.text.primary}; font-weight: 600;\">${dataPoint.battery.toFixed(1)}%</span>`;\n }\n html += `</div>`;\n if (dataPoint.eclipse) {\n html += `<div style=\"color: ${tokens.colors.status.caution}; font-weight: 600; margin-top: 8px; font-size: 12px; display: flex; align-items: center; gap: 6px;\">`;\n html += `<span style=\"font-weight: 600;\">ECLIPSE</span>`;\n html += `</div>`;\n }\n html += `</div>`;\n }\n \n html += `</div>`;\n return html;\n },\n },\n legend: showLegend ? {\n show: true,\n position: 'top',\n orient: 'horizontal',\n } : { show: false },\n zoom: enableZoom ? {\n enabled: true,\n type: 'both',\n axis: 'x',\n start: 0,\n end: 100,\n } : undefined,\n annotations: {\n markAreas: {\n data: [...stateRegions, ...eclipseRegions],\n itemStyle: {\n opacity: 1,\n },\n },\n markPoints: eventDots,\n },\n export: enableExport ? {\n enabled: true,\n formats: ['png', 'svg', 'csv'],\n getExportFileName: () => `zendir-power-overview-${Date.now()}`,\n } : undefined,\n infoTooltip: compact ? undefined : {\n content: (\n <div style={{ fontSize: '13px', lineHeight: '1.6' }}>\n <div style={{ marginBottom: '8px', fontWeight: 500 }}>Interactive Power Timeline</div>\n <div style={{ marginBottom: '4px' }}>• Background colors show system states</div>\n <div style={{ marginBottom: '4px' }}>• Dark overlays indicate eclipse periods</div>\n <div style={{ marginBottom: '4px' }}>• Diamond markers show key events</div>\n <div>• Scroll to zoom, drag to pan</div>\n </div>\n ),\n },\n className,\n };\n }, [data, events, title, height, showBattery, showLegend, enableExport, className, compact, showEventDots, enableZoom, tokens]);\n\n return (\n <div style={{ position: 'relative', width: '100%' }}>\n {showStatus && (\n <div style={{\n position: 'absolute',\n top: 10,\n right: 60,\n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 12px',\n background: tokens.colors.background.surface,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: tokens.borderRadius.md,\n fontSize: tokens.typography.fontSize.xs,\n fontFamily: tokens.typography.fontFamily.primary,\n }}>\n <StatusShape\n status={currentStatus}\n size={10}\n color={tokens.colors.status[currentStatus] || tokens.colors.status.off}\n borderColor={mode === 'light' ? STATUS_BORDER_COLORS[currentStatus] : undefined}\n glow={mode !== 'light'}\n />\n <span style={{ \n color: tokens.colors.text.primary,\n fontWeight: 500,\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n }}>\n {currentStatus}\n </span>\n </div>\n )}\n <AstroChart {...chartConfig} />\n </div>\n );\n}\n\n// =============================================================================\n// Sample Data Generator\n// =============================================================================\n\nexport function generateSamplePowerData(durationSeconds = 3600): {\n data: PowerTimelinePoint[];\n events: PowerEvent[];\n} {\n const dataPoints: PowerTimelinePoint[] = [];\n const eventList: PowerEvent[] = [];\n \n const startTime = Date.now();\n const interval = 10;\n \n let currentState: PowerState = 'running';\n let currentMode: OperationalMode = 'inertial';\n let inEclipse = false;\n \n for (let i = 0; i <= durationSeconds; i += interval) {\n const time = startTime + i * 1000;\n \n // State transitions\n if (i === 300) currentState = 'safe';\n if (i === 600) currentState = 'running';\n if (i === 1800) currentState = 'shutdown';\n if (i === 2100) currentState = 'running';\n if (i === 2400) currentState = 'safe';\n if (i === 2700) currentState = 'running';\n \n // Mode transitions\n if (i === 200) currentMode = 'sun';\n if (i === 500) currentMode = 'inertial';\n if (i === 800) currentMode = 'nadir';\n if (i === 1100) currentMode = 'velocity';\n if (i === 1400) currentMode = 'ground';\n if (i === 1700) currentMode = 'sun';\n if (i === 2000) currentMode = 'inertial';\n if (i === 2300) currentMode = 'nadir';\n if (i === 2600) currentMode = 'velocity';\n if (i === 2900) currentMode = 'ground';\n if (i === 3200) currentMode = 'sun';\n \n // Eclipse periods\n if (i >= 1700 && i <= 2100) inEclipse = true;\n else if (i >= 2400 && i <= 2700) inEclipse = true;\n else inEclipse = false;\n \n // Battery\n let battery = 95;\n if (inEclipse) {\n battery = 95 - ((i - 1700) % 400) * 0.1;\n } else if (currentMode === 'sun') {\n battery = 70 + Math.sin(i * 0.01) * 15;\n } else {\n battery = 90 + Math.sin(i * 0.005) * 5;\n }\n battery = Math.max(10, Math.min(100, battery));\n \n // Power\n let power = 0;\n if (inEclipse) {\n power = 0;\n } else if (currentMode === 'sun') {\n power = 300 + Math.sin(i * 0.02) * 50;\n } else if (currentMode === 'ground' || currentMode === 'nadir') {\n power = 150 + Math.sin(i * 0.03) * 30;\n } else {\n power = 50 + Math.sin(i * 0.01) * 20;\n }\n \n if (currentState === 'safe') power *= 0.3;\n if (currentState === 'shutdown') power = 0;\n \n dataPoints.push({\n time,\n power,\n battery,\n state: currentState,\n mode: currentMode,\n eclipse: inEclipse,\n });\n }\n \n // Events\n const eventTimes = [250, 420, 550, 900, 1300, 1650, 1850, 2200, 2500, 2800, 3100, 3400];\n const eventTypes: EventType[] = ['scenario', 'operator', 'spacecraft', 'ground'];\n \n eventTimes.forEach((timeOffset, idx) => {\n eventList.push({\n time: startTime + timeOffset * 1000,\n type: eventTypes[idx % eventTypes.length],\n label: `Event ${idx + 1}`,\n });\n });\n \n return { data: dataPoints, events: eventList };\n}\n\nexport default PowerOverviewChart;\n"],"names":[],"mappings":"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"}