@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,742 +0,0 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { memo, useState, useMemo } from "react";
3
- import { DataValue } from "../core/DataValue.js";
4
- import { getPropertyConfig } from "../core/propertyConfig.js";
5
- import { AstroIcon } from "../core/AstroIcon.js";
6
- import { CardHeader } from "../core/CardHeader.js";
7
- import { HeaderIconWithStatus } from "../core/HeaderIconWithStatus.js";
8
- import { Icon } from "../core/Icon.js";
9
- import { useCardBorderStyle } from "../context/DisplaySettingsContext.js";
10
- import { classNames, getStatusColor, formatTime, safeNumber, normalizeStatus, deriveBatteryStatus } from "../utils/index.js";
11
- import { useTheme } from "../theme/ThemeProvider.js";
12
- import { useCompactMode } from "../hooks/useCompactMode.js";
13
- import { StatusIndicator } from "../astro/StatusIndicator.js";
14
- function getHealthStatus(healthStatus) {
15
- return normalizeStatus(healthStatus);
16
- }
17
- function getBatteryStatus(level) {
18
- return deriveBatteryStatus(level);
19
- }
20
- const TelemetryCard = memo(function TelemetryCard2({
21
- telemetry,
22
- spacecraftName,
23
- showPower = true,
24
- showAttitude = true,
25
- showComms = true,
26
- loading = false,
27
- className = "",
28
- compact = false,
29
- defaultExpanded = false,
30
- onPinChange
31
- }) {
32
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
33
- const { tokens, theme, prefersReducedMotion } = useTheme();
34
- const isTransparentTheme = theme === "transparent" || theme === "transparent-bold" || theme === "transparent-minimal";
35
- const isBoldVariant = theme === "transparent-bold";
36
- const isMinimalVariant = theme === "transparent-minimal";
37
- const useGlassMode = isBoldVariant || isMinimalVariant;
38
- const glassAccentColor = tokens.colors.accent.primary;
39
- const glassAccentMuted = `${glassAccentColor}66`;
40
- const cardBg = isTransparentTheme ? "transparent" : tokens.colors.background.surface;
41
- const cardGlass = isTransparentTheme ? {
42
- backdropFilter: "blur(12px)",
43
- WebkitBackdropFilter: "blur(12px)"
44
- } : {};
45
- const cardBorderStyle = useCardBorderStyle(tokens, isTransparentTheme);
46
- const glassContainerStyle = useGlassMode ? {
47
- backgroundColor: "rgba(10, 15, 25, 0.35)",
48
- backdropFilter: "blur(12px)",
49
- WebkitBackdropFilter: "blur(12px)",
50
- border: `1px solid ${glassAccentMuted}`,
51
- borderTop: isBoldVariant ? `2px solid ${glassAccentColor}` : `1px solid ${glassAccentColor}`
52
- } : {};
53
- const { expanded, isPinned, isHovered: _isHovered, handlers, transitionDuration: compactTransition } = useCompactMode({
54
- compact,
55
- defaultExpanded,
56
- onPinChange
57
- });
58
- const [_isAnimating, _setIsAnimating] = useState(false);
59
- const animationDuration = prefersReducedMotion ? 0 : 250;
60
- const animationEasing = "cubic-bezier(0.4, 0, 0.2, 1)";
61
- const healthStatus = useMemo(
62
- () => {
63
- var _a2;
64
- return getHealthStatus((_a2 = telemetry == null ? void 0 : telemetry.health) == null ? void 0 : _a2.status);
65
- },
66
- [(_a = telemetry == null ? void 0 : telemetry.health) == null ? void 0 : _a.status]
67
- );
68
- const batteryStatus = useMemo(
69
- () => {
70
- var _a2;
71
- return getBatteryStatus((_a2 = telemetry == null ? void 0 : telemetry.power) == null ? void 0 : _a2.batteryLevel);
72
- },
73
- [(_b = telemetry == null ? void 0 : telemetry.power) == null ? void 0 : _b.batteryLevel]
74
- );
75
- const transitionDuration = prefersReducedMotion ? "0ms" : "200ms";
76
- if (loading) {
77
- return /* @__PURE__ */ jsxs(
78
- "div",
79
- {
80
- className: classNames("zendir-telemetry-card", "loading", className),
81
- role: "article",
82
- "aria-busy": "true",
83
- "aria-label": "Loading telemetry data",
84
- style: {
85
- backgroundColor: cardBg,
86
- ...cardGlass,
87
- ...cardBorderStyle,
88
- borderRadius: tokens.borderRadius.lg,
89
- padding: tokens.spacing.md,
90
- minHeight: 200
91
- },
92
- children: [
93
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 16 }, children: [
94
- /* @__PURE__ */ jsx(
95
- "div",
96
- {
97
- style: {
98
- width: 24,
99
- height: 24,
100
- borderRadius: 4,
101
- backgroundColor: "rgba(255,255,255,0.1)"
102
- }
103
- }
104
- ),
105
- /* @__PURE__ */ jsx(
106
- "div",
107
- {
108
- style: {
109
- height: 16,
110
- width: "40%",
111
- backgroundColor: "rgba(255,255,255,0.1)",
112
- borderRadius: 4
113
- }
114
- }
115
- )
116
- ] }),
117
- [1, 2, 3].map((i) => /* @__PURE__ */ jsxs("div", { style: { marginBottom: 16 }, children: [
118
- /* @__PURE__ */ jsx(
119
- "div",
120
- {
121
- style: {
122
- height: 12,
123
- width: "30%",
124
- backgroundColor: "rgba(255,255,255,0.08)",
125
- borderRadius: 2,
126
- marginBottom: 8
127
- }
128
- }
129
- ),
130
- /* @__PURE__ */ jsx(
131
- "div",
132
- {
133
- style: {
134
- display: "grid",
135
- gridTemplateColumns: "repeat(2, 1fr)",
136
- gap: 8
137
- },
138
- children: [1, 2, 3, 4].map((j) => /* @__PURE__ */ jsx(
139
- "div",
140
- {
141
- style: {
142
- height: 32,
143
- backgroundColor: "rgba(255,255,255,0.06)",
144
- borderRadius: 4
145
- }
146
- },
147
- j
148
- ))
149
- }
150
- )
151
- ] }, i))
152
- ]
153
- }
154
- );
155
- }
156
- if (!telemetry) {
157
- return /* @__PURE__ */ jsxs(
158
- "div",
159
- {
160
- className: classNames("zendir-telemetry-card", "empty", className),
161
- role: "article",
162
- "aria-label": "No telemetry data",
163
- style: {
164
- backgroundColor: cardBg,
165
- ...cardGlass,
166
- ...tokens.colors.border.cardStyleDashed ?? {},
167
- borderRadius: tokens.borderRadius.lg,
168
- padding: tokens.spacing.lg,
169
- textAlign: "center",
170
- color: tokens.colors.text.tertiary
171
- },
172
- children: [
173
- /* @__PURE__ */ jsx(AstroIcon, { name: "antenna", size: "normal", label: "", style: { opacity: 0.5 } }),
174
- /* @__PURE__ */ jsx("p", { style: { margin: "8px 0 0 0", fontSize: tokens.typography.body[2].fontSize }, children: "No telemetry data available" })
175
- ]
176
- }
177
- );
178
- }
179
- const sectionStyle = {
180
- marginBottom: tokens.spacing.md,
181
- paddingBottom: tokens.spacing.md,
182
- borderBottom: `1px solid ${tokens.colors.border.muted}`
183
- };
184
- const iconColumnWidth = 20;
185
- const iconGap = tokens.spacing.sm;
186
- const rowGap = tokens.spacing.smd;
187
- const sectionGridColumns = `${iconColumnWidth}px 1fr ${iconColumnWidth}px 1fr`;
188
- const CompactMetric = ({
189
- icon,
190
- label,
191
- value,
192
- color,
193
- astroIcon
194
- }) => /* @__PURE__ */ jsxs("div", { style: {
195
- display: "flex",
196
- alignItems: "center",
197
- gap: 3,
198
- padding: `2px 0`
199
- }, children: [
200
- astroIcon ? /* @__PURE__ */ jsx(AstroIcon, { name: astroIcon, size: 12, color: color ?? tokens.colors.text.secondary }) : icon ? /* @__PURE__ */ jsx(Icon, { name: icon, size: 12, color: color ?? tokens.colors.text.secondary }) : null,
201
- /* @__PURE__ */ jsx("span", { style: {
202
- fontSize: tokens.typography.fontSize.micro,
203
- // 0.5625rem / 9px (AstroUXDS micro)
204
- fontWeight: tokens.typography.fontWeight.medium,
205
- fontFamily: tokens.typography.fontFamily.primary,
206
- // Roboto - Astro UX compliant
207
- color: tokens.colors.text.tertiary,
208
- textTransform: "uppercase",
209
- minWidth: 8
210
- }, children: label.charAt(0) }),
211
- /* @__PURE__ */ jsx("span", { style: {
212
- fontVariantNumeric: "tabular-nums",
213
- fontFamily: tokens.typography.fontFamily.mono,
214
- fontSize: tokens.typography.fontSize.xs,
215
- color: color ?? tokens.colors.text.primary,
216
- fontWeight: tokens.typography.fontWeight.medium
217
- }, children: value })
218
- ] });
219
- const renderCompactContent = () => {
220
- var _a2, _b2, _c2, _d2;
221
- const power = (telemetry == null ? void 0 : telemetry.power) ?? ((_a2 = telemetry == null ? void 0 : telemetry.subsystems) == null ? void 0 : _a2.power);
222
- const attitude = (telemetry == null ? void 0 : telemetry.attitude) ?? ((_b2 = telemetry == null ? void 0 : telemetry.subsystems) == null ? void 0 : _b2.attitude);
223
- const comms = (telemetry == null ? void 0 : telemetry.communications) ?? ((_c2 = telemetry == null ? void 0 : telemetry.subsystems) == null ? void 0 : _c2.comms);
224
- const thermal = (_d2 = telemetry == null ? void 0 : telemetry.subsystems) == null ? void 0 : _d2.thermal;
225
- const compactStatusColor = getStatusColor(healthStatus);
226
- return /* @__PURE__ */ jsxs(Fragment, { children: [
227
- /* @__PURE__ */ jsxs("div", { style: {
228
- display: "flex",
229
- alignItems: "center",
230
- justifyContent: "space-between",
231
- marginBottom: tokens.spacing.xs,
232
- paddingBottom: tokens.spacing.xs,
233
- borderBottom: useGlassMode ? "none" : `1px solid ${tokens.colors.border.muted}`,
234
- position: "relative",
235
- zIndex: 1
236
- }, children: [
237
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: tokens.spacing.sm, minWidth: 0, flex: 1 }, children: [
238
- /* @__PURE__ */ jsx(
239
- HeaderIconWithStatus,
240
- {
241
- icon: "antenna-receive",
242
- size: 20,
243
- status: healthStatus,
244
- statusColor: compactStatusColor
245
- }
246
- ),
247
- /* @__PURE__ */ jsx("span", { style: {
248
- fontWeight: tokens.typography.fontWeight.semibold,
249
- fontSize: tokens.typography.fontSize.sm,
250
- fontFamily: tokens.typography.fontFamily.primary,
251
- color: useGlassMode ? glassAccentColor : void 0,
252
- textShadow: useGlassMode ? `0 0 16px ${glassAccentMuted}` : void 0,
253
- whiteSpace: "nowrap",
254
- overflow: "hidden",
255
- textOverflow: "ellipsis",
256
- minWidth: 0
257
- }, children: spacecraftName ? spacecraftName.split(" ")[0] : "Telemetry" }),
258
- useGlassMode && /* @__PURE__ */ jsx("div", { style: {
259
- flex: 1,
260
- height: isBoldVariant ? "2px" : "1px",
261
- minWidth: 20,
262
- background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,
263
- boxShadow: isBoldVariant ? `0 0 8px ${glassAccentMuted}` : void 0
264
- } })
265
- ] }),
266
- /* @__PURE__ */ jsx("div", { style: { display: "flex", alignItems: "center", gap: tokens.spacing.xs, flexShrink: 0 }, children: isPinned && /* @__PURE__ */ jsx(Icon, { name: "lock", size: 10, color: tokens.colors.accent.primary }) })
267
- ] }),
268
- /* @__PURE__ */ jsxs("div", { style: {
269
- display: "grid",
270
- gridTemplateColumns: "repeat(3, 1fr)",
271
- gap: `${tokens.spacing.xs} ${tokens.spacing.sm}`
272
- }, children: [
273
- showPower && power && /* @__PURE__ */ jsxs(Fragment, { children: [
274
- power.batteryLevel !== void 0 && /* @__PURE__ */ jsx(
275
- CompactMetric,
276
- {
277
- icon: "battery",
278
- label: "Battery",
279
- value: `${safeNumber(power.batteryLevel, 0)}%`,
280
- color: getStatusColor(batteryStatus)
281
- }
282
- ),
283
- (power.solarGeneration ?? power.solarArrayOutput) !== void 0 && /* @__PURE__ */ jsx(
284
- CompactMetric,
285
- {
286
- astroIcon: "solar",
287
- label: "Solar",
288
- value: `${safeNumber(power.solarGeneration ?? power.solarArrayOutput, 1)}W`,
289
- color: tokens.colors.status.standby
290
- }
291
- ),
292
- power.voltage !== void 0 && /* @__PURE__ */ jsx(
293
- CompactMetric,
294
- {
295
- astroIcon: "propulsion-power",
296
- label: "Voltage",
297
- value: `${safeNumber(power.voltage, 1)}V`
298
- }
299
- )
300
- ] }),
301
- showAttitude && attitude && /* @__PURE__ */ jsxs(Fragment, { children: [
302
- attitude.pointingError !== void 0 && /* @__PURE__ */ jsx(
303
- CompactMetric,
304
- {
305
- astroIcon: "explore",
306
- label: "Pointing",
307
- value: `${safeNumber(attitude.pointingError, 2)}°`
308
- }
309
- ),
310
- attitude.targetMode && /* @__PURE__ */ jsx(
311
- CompactMetric,
312
- {
313
- astroIcon: "explore",
314
- label: "Mode",
315
- value: attitude.targetMode
316
- }
317
- )
318
- ] }),
319
- thermal && /* @__PURE__ */ jsx(Fragment, { children: thermal.cpuTemp !== void 0 && /* @__PURE__ */ jsx(
320
- CompactMetric,
321
- {
322
- icon: "thermometer",
323
- label: "CPU",
324
- value: `${safeNumber(thermal.cpuTemp, 0)}°C`,
325
- color: thermal.cpuTemp > 50 ? tokens.colors.status.caution : void 0
326
- }
327
- ) }),
328
- showComms && comms && /* @__PURE__ */ jsxs(Fragment, { children: [
329
- comms.signalStrength !== void 0 && /* @__PURE__ */ jsx(
330
- CompactMetric,
331
- {
332
- astroIcon: "antenna",
333
- label: "Signal",
334
- value: `${safeNumber(comms.signalStrength, 0)}%`
335
- }
336
- ),
337
- (comms.downlinkRate ?? comms.dataRate) !== void 0 && /* @__PURE__ */ jsx(
338
- CompactMetric,
339
- {
340
- astroIcon: "antenna-transmit",
341
- label: "Rate",
342
- value: `${safeNumber(comms.downlinkRate ?? comms.dataRate, 0)}Mb`
343
- }
344
- ),
345
- comms.transmitterStatus && /* @__PURE__ */ jsx(
346
- CompactMetric,
347
- {
348
- astroIcon: "antenna-receive",
349
- label: "TX",
350
- value: comms.transmitterStatus === "transmitting" ? "ON" : "OFF",
351
- color: comms.transmitterStatus === "transmitting" ? tokens.colors.status.normal : tokens.colors.status.off
352
- }
353
- )
354
- ] })
355
- ] })
356
- ] });
357
- };
358
- if (compact) {
359
- return /* @__PURE__ */ jsxs(
360
- "article",
361
- {
362
- className: classNames("zendir-telemetry-card", "compact", expanded ? "expanded" : "", className),
363
- ...handlers,
364
- "aria-label": spacecraftName ? `${spacecraftName} Telemetry${expanded ? "" : " (compact)"}` : "Telemetry Data",
365
- style: {
366
- position: "relative",
367
- overflow: "hidden",
368
- // Use glass container style for bold/minimal themes
369
- ...useGlassMode ? glassContainerStyle : {
370
- backgroundColor: cardBg,
371
- ...cardGlass,
372
- ...cardBorderStyle
373
- },
374
- borderRadius: tokens.borderRadius.lg,
375
- padding: expanded ? tokens.spacing.md : tokens.spacing.sm,
376
- fontFamily: tokens.typography.fontFamily.primary,
377
- color: tokens.colors.text.primary,
378
- fontSize: expanded ? tokens.typography.fontSize.base : tokens.typography.fontSize.sm,
379
- cursor: "pointer",
380
- transition: `all ${animationDuration}ms ${animationEasing}`,
381
- boxShadow: expanded ? `0 12px 40px rgba(0,0,0,0.4), 0 0 0 1px ${tokens.colors.accent.primary}30` : "none",
382
- zIndex: expanded ? 50 : 1
383
- },
384
- children: [
385
- useGlassMode && /* @__PURE__ */ jsx(
386
- "div",
387
- {
388
- style: {
389
- position: "absolute",
390
- inset: 0,
391
- background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
392
- pointerEvents: "none",
393
- zIndex: 0
394
- }
395
- }
396
- ),
397
- expanded ? (
398
- // Full expanded content - resolve data with fallbacks like compact view
399
- (() => {
400
- var _a2, _b2, _c2, _d2, _e2, _f2;
401
- const power = (telemetry == null ? void 0 : telemetry.power) ?? ((_a2 = telemetry == null ? void 0 : telemetry.subsystems) == null ? void 0 : _a2.power);
402
- const attitude = (telemetry == null ? void 0 : telemetry.attitude) ?? ((_b2 = telemetry == null ? void 0 : telemetry.subsystems) == null ? void 0 : _b2.attitude);
403
- const comms = (telemetry == null ? void 0 : telemetry.communications) ?? ((_c2 = telemetry == null ? void 0 : telemetry.subsystems) == null ? void 0 : _c2.comms);
404
- return /* @__PURE__ */ jsxs(Fragment, { children: [
405
- /* @__PURE__ */ jsxs(
406
- "header",
407
- {
408
- style: {
409
- display: "flex",
410
- justifyContent: "space-between",
411
- alignItems: "center",
412
- marginBottom: tokens.spacing.md
413
- },
414
- children: [
415
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: tokens.spacing.sm }, children: [
416
- /* @__PURE__ */ jsx(
417
- HeaderIconWithStatus,
418
- {
419
- icon: "antenna-receive",
420
- size: 24,
421
- status: healthStatus
422
- }
423
- ),
424
- /* @__PURE__ */ jsx(
425
- "h3",
426
- {
427
- style: {
428
- margin: 0,
429
- fontSize: tokens.typography.fontSize.md,
430
- fontWeight: tokens.typography.fontWeight.semibold
431
- },
432
- children: spacecraftName ? `${spacecraftName} Telemetry` : "Telemetry"
433
- }
434
- ),
435
- isPinned && /* @__PURE__ */ jsx(Icon, { name: "lock", size: 12, color: tokens.colors.accent.primary, style: { marginLeft: 4 } })
436
- ] }),
437
- /* @__PURE__ */ jsx(StatusIndicator, { status: healthStatus, label: healthStatus, small: true })
438
- ]
439
- }
440
- ),
441
- showPower && /* @__PURE__ */ jsxs("section", { style: sectionStyle, "aria-label": "Power subsystem", children: [
442
- /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: "center" }, children: [
443
- /* @__PURE__ */ jsx(AstroIcon, { name: "propulsion-power", size: 12, color: tokens.colors.text.tertiary }),
444
- /* @__PURE__ */ jsx("h4", { style: { margin: 0, gridColumn: "2 / -1", fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }, children: "Power" }),
445
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("battery").icon, size: 16, color: getStatusColor(batteryStatus) }),
446
- /* @__PURE__ */ jsx(DataValue, { property: "battery", value: power == null ? void 0 : power.batteryLevel, size: "sm", variant: "card", showIcon: false }),
447
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("voltage").icon, size: 16, color: tokens.colors.text.tertiary }),
448
- /* @__PURE__ */ jsx(DataValue, { property: "voltage", value: power == null ? void 0 : power.voltage, size: "sm", variant: "card", showIcon: false }),
449
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("solarPower").icon, size: 16, color: tokens.colors.text.tertiary }),
450
- /* @__PURE__ */ jsx(DataValue, { property: "solarPower", value: (power == null ? void 0 : power.solarGeneration) ?? (power == null ? void 0 : power.solarArrayOutput), size: "sm", variant: "card", status: "standby", showIcon: false }),
451
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("load").icon, size: 16, color: tokens.colors.text.tertiary }),
452
- /* @__PURE__ */ jsx(DataValue, { property: "load", value: power == null ? void 0 : power.consumption, size: "sm", variant: "card", showIcon: false })
453
- ] }),
454
- /* @__PURE__ */ jsx(
455
- "div",
456
- {
457
- style: {
458
- marginTop: tokens.spacing.sm,
459
- height: 4,
460
- backgroundColor: tokens.colors.border.muted,
461
- borderRadius: 2,
462
- overflow: "hidden"
463
- },
464
- children: /* @__PURE__ */ jsx(
465
- "div",
466
- {
467
- role: "progressbar",
468
- "aria-valuenow": (power == null ? void 0 : power.batteryLevel) ?? 0,
469
- "aria-valuemin": 0,
470
- "aria-valuemax": 100,
471
- "aria-label": "Battery level",
472
- style: {
473
- height: "100%",
474
- width: `${Math.min(100, Math.max(0, (power == null ? void 0 : power.batteryLevel) ?? 0))}%`,
475
- backgroundColor: getStatusColor(batteryStatus),
476
- borderRadius: 2,
477
- transition: `width ${transitionDuration} ease-out`
478
- }
479
- }
480
- )
481
- }
482
- )
483
- ] }),
484
- showAttitude && /* @__PURE__ */ jsx("section", { style: sectionStyle, "aria-label": "Attitude subsystem", children: /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: "center" }, children: [
485
- /* @__PURE__ */ jsx(AstroIcon, { name: "explore", size: 12, color: tokens.colors.text.tertiary }),
486
- /* @__PURE__ */ jsx("h4", { style: { margin: 0, gridColumn: "2 / -1", fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }, children: "Attitude" }),
487
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("roll").icon, size: 16, color: tokens.colors.text.tertiary }),
488
- /* @__PURE__ */ jsx(DataValue, { property: "roll", value: ((_d2 = attitude == null ? void 0 : attitude.eulerAngles) == null ? void 0 : _d2.roll) ?? (attitude == null ? void 0 : attitude.pointingError), size: "sm", variant: "card", showStatus: false, showIcon: false }),
489
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("pitch").icon, size: 16, color: tokens.colors.text.tertiary }),
490
- /* @__PURE__ */ jsx(DataValue, { property: "pitch", value: (_e2 = attitude == null ? void 0 : attitude.eulerAngles) == null ? void 0 : _e2.pitch, size: "sm", variant: "card", showStatus: false, showIcon: false }),
491
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("yaw").icon, size: 16, color: tokens.colors.text.tertiary }),
492
- /* @__PURE__ */ jsx(DataValue, { property: "yaw", value: (_f2 = attitude == null ? void 0 : attitude.eulerAngles) == null ? void 0 : _f2.yaw, size: "sm", variant: "card", showStatus: false, showIcon: false }),
493
- /* @__PURE__ */ jsx(AstroIcon, { name: "explore", size: 16, color: tokens.colors.text.tertiary }),
494
- /* @__PURE__ */ jsx(DataValue, { label: "Mode", icon: "explore", value: (attitude == null ? void 0 : attitude.targetMode) ?? "--", size: "sm", variant: "card", showStatus: false, showIcon: false })
495
- ] }) }),
496
- showComms && /* @__PURE__ */ jsx("section", { style: { marginBottom: tokens.spacing.sm }, "aria-label": "Communications subsystem", children: /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: "center" }, children: [
497
- /* @__PURE__ */ jsx(AstroIcon, { name: "antenna", size: 12, color: tokens.colors.text.tertiary }),
498
- /* @__PURE__ */ jsx("h4", { style: { margin: 0, gridColumn: "2 / -1", fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }, children: "Communications" }),
499
- /* @__PURE__ */ jsx(AstroIcon, { name: "antenna-transmit", size: 16, color: tokens.colors.text.tertiary }),
500
- /* @__PURE__ */ jsx(DataValue, { label: "Status", icon: "antenna-transmit", value: (comms == null ? void 0 : comms.transmitterStatus) ?? (comms == null ? void 0 : comms.status) ?? "--", size: "sm", variant: "card", showStatus: false, showIcon: false }),
501
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("signalStrength").icon, size: 16, color: tokens.colors.text.tertiary }),
502
- /* @__PURE__ */ jsx(DataValue, { property: "signalStrength", value: comms == null ? void 0 : comms.signalStrength, size: "sm", variant: "card", showStatus: false, showIcon: false }),
503
- /* @__PURE__ */ jsx(AstroIcon, { name: "antenna-receive", size: 16, color: tokens.colors.text.tertiary }),
504
- /* @__PURE__ */ jsx(DataValue, { label: "Transmitted", icon: "antenna-receive", value: (comms == null ? void 0 : comms.packetsTransmitted) ?? (comms == null ? void 0 : comms.dataRate) ?? "--", size: "sm", variant: "card", showStatus: false, showIcon: false }),
505
- /* @__PURE__ */ jsx("span", { style: { gridColumn: "4 / -1" } })
506
- ] }) }),
507
- (telemetry == null ? void 0 : telemetry.timestamp) && /* @__PURE__ */ jsx(
508
- "time",
509
- {
510
- dateTime: telemetry.timestamp,
511
- style: {
512
- display: "block",
513
- fontSize: tokens.typography.fontSize.xs,
514
- color: tokens.colors.text.tertiary,
515
- marginTop: tokens.spacing.sm,
516
- fontVariantNumeric: "tabular-nums"
517
- },
518
- children: formatTime(telemetry.timestamp)
519
- }
520
- )
521
- ] });
522
- })()
523
- ) : (
524
- // Compact content
525
- renderCompactContent()
526
- )
527
- ]
528
- }
529
- );
530
- }
531
- return /* @__PURE__ */ jsxs(
532
- "article",
533
- {
534
- className: classNames("zendir-telemetry-card", compact ? "expanded" : "", className),
535
- ...compact ? handlers : {},
536
- role: compact ? handlers.role : "article",
537
- tabIndex: compact ? handlers.tabIndex : void 0,
538
- "aria-expanded": compact ? handlers["aria-expanded"] : void 0,
539
- "aria-label": spacecraftName ? `${spacecraftName} Telemetry` : "Telemetry Data",
540
- style: {
541
- position: "relative",
542
- overflow: "hidden",
543
- ...useGlassMode ? glassContainerStyle : {
544
- backgroundColor: cardBg,
545
- ...cardGlass,
546
- ...cardBorderStyle
547
- },
548
- borderRadius: tokens.borderRadius.lg,
549
- padding: tokens.spacing.md,
550
- fontFamily: tokens.typography.fontFamily.primary,
551
- color: tokens.colors.text.primary,
552
- fontSize: tokens.typography.fontSize.sm,
553
- cursor: compact ? "pointer" : void 0,
554
- transition: compact ? `all ${compactTransition} ease-out` : void 0
555
- },
556
- children: [
557
- useGlassMode && /* @__PURE__ */ jsx(
558
- "div",
559
- {
560
- style: {
561
- position: "absolute",
562
- inset: 0,
563
- background: "linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%, rgba(0,0,0,0.1) 100%)",
564
- pointerEvents: "none",
565
- zIndex: 0
566
- }
567
- }
568
- ),
569
- /* @__PURE__ */ jsx(
570
- CardHeader,
571
- {
572
- icon: "antenna-receive",
573
- title: spacecraftName ? `${spacecraftName} Telemetry` : "Telemetry",
574
- status: healthStatus,
575
- isPinned: compact && isPinned
576
- }
577
- ),
578
- showPower && /* @__PURE__ */ jsxs("section", { style: sectionStyle, "aria-label": "Power subsystem", children: [
579
- /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: "center" }, children: [
580
- /* @__PURE__ */ jsx(AstroIcon, { name: "propulsion-power", size: 12, color: tokens.colors.text.tertiary }),
581
- /* @__PURE__ */ jsx("h4", { style: { margin: 0, gridColumn: "2 / -1", fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }, children: "Power" }),
582
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("battery").icon, size: 16, color: getStatusColor(batteryStatus) }),
583
- /* @__PURE__ */ jsx(DataValue, { property: "battery", value: (_c = telemetry.power) == null ? void 0 : _c.batteryLevel, size: "sm", variant: "card", showIcon: false }),
584
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("voltage").icon, size: 16, color: tokens.colors.text.tertiary }),
585
- /* @__PURE__ */ jsx(DataValue, { property: "voltage", value: (_d = telemetry.power) == null ? void 0 : _d.voltage, size: "sm", variant: "card", showIcon: false }),
586
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("solarPower").icon, size: 16, color: tokens.colors.text.tertiary }),
587
- /* @__PURE__ */ jsx(DataValue, { property: "solarPower", value: (_e = telemetry.power) == null ? void 0 : _e.solarGeneration, size: "sm", variant: "card", status: "standby", showIcon: false }),
588
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("load").icon, size: 16, color: tokens.colors.text.tertiary }),
589
- /* @__PURE__ */ jsx(DataValue, { property: "load", value: (_f = telemetry.power) == null ? void 0 : _f.consumption, size: "sm", variant: "card", showIcon: false })
590
- ] }),
591
- /* @__PURE__ */ jsx(
592
- "div",
593
- {
594
- style: {
595
- marginTop: tokens.spacing.sm,
596
- height: 4,
597
- backgroundColor: tokens.colors.border.muted,
598
- borderRadius: 2,
599
- overflow: "hidden"
600
- },
601
- children: /* @__PURE__ */ jsx(
602
- "div",
603
- {
604
- role: "progressbar",
605
- "aria-valuenow": ((_g = telemetry.power) == null ? void 0 : _g.batteryLevel) ?? 0,
606
- "aria-valuemin": 0,
607
- "aria-valuemax": 100,
608
- "aria-label": "Battery level",
609
- style: {
610
- height: "100%",
611
- width: `${Math.min(100, Math.max(0, ((_h = telemetry.power) == null ? void 0 : _h.batteryLevel) ?? 0))}%`,
612
- backgroundColor: getStatusColor(batteryStatus),
613
- borderRadius: 2,
614
- transition: `width ${transitionDuration} ease-out`
615
- }
616
- }
617
- )
618
- }
619
- )
620
- ] }),
621
- showAttitude && /* @__PURE__ */ jsxs("section", { style: sectionStyle, "aria-label": "Attitude subsystem", children: [
622
- /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: "center" }, children: [
623
- /* @__PURE__ */ jsx(AstroIcon, { name: "explore", size: 12, color: tokens.colors.text.tertiary }),
624
- /* @__PURE__ */ jsx("h4", { style: { margin: 0, gridColumn: "2 / -1", fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }, children: "Attitude" }),
625
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("roll").icon, size: 16, color: tokens.colors.text.tertiary }),
626
- /* @__PURE__ */ jsx(DataValue, { property: "roll", value: (_j = (_i = telemetry.attitude) == null ? void 0 : _i.eulerAngles) == null ? void 0 : _j.roll, size: "sm", variant: "card", showStatus: false, showIcon: false }),
627
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("pitch").icon, size: 16, color: tokens.colors.text.tertiary }),
628
- /* @__PURE__ */ jsx(DataValue, { property: "pitch", value: (_l = (_k = telemetry.attitude) == null ? void 0 : _k.eulerAngles) == null ? void 0 : _l.pitch, size: "sm", variant: "card", showStatus: false, showIcon: false }),
629
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("yaw").icon, size: 16, color: tokens.colors.text.tertiary }),
630
- /* @__PURE__ */ jsx(DataValue, { property: "yaw", value: (_n = (_m = telemetry.attitude) == null ? void 0 : _m.eulerAngles) == null ? void 0 : _n.yaw, size: "sm", variant: "card", showStatus: false, showIcon: false }),
631
- /* @__PURE__ */ jsx(AstroIcon, { name: "explore", size: 16, color: tokens.colors.text.tertiary }),
632
- /* @__PURE__ */ jsx(DataValue, { label: "Mode", icon: "explore", value: ((_o = telemetry.attitude) == null ? void 0 : _o.targetMode) ?? "--", size: "sm", variant: "card", showStatus: false, showIcon: false })
633
- ] }),
634
- ((_p = telemetry.attitude) == null ? void 0 : _p.pointingError) !== void 0 && /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: iconGap, marginTop: tokens.spacing.sm }, children: [
635
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("pointingError").icon, size: 16, color: tokens.colors.text.tertiary }),
636
- /* @__PURE__ */ jsx(DataValue, { property: "pointingError", value: telemetry.attitude.pointingError, size: "sm", variant: "inline", showIcon: false })
637
- ] })
638
- ] }),
639
- showComms && /* @__PURE__ */ jsx("section", { style: { marginBottom: tokens.spacing.md }, "aria-label": "Communications subsystem", children: /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: sectionGridColumns, gap: `${rowGap} ${iconGap}`, alignItems: "center" }, children: [
640
- /* @__PURE__ */ jsx(AstroIcon, { name: "antenna", size: 12, color: tokens.colors.text.tertiary }),
641
- /* @__PURE__ */ jsx("h4", { style: { margin: 0, gridColumn: "2 / -1", fontSize: tokens.typography.fontSize.xs, fontWeight: tokens.typography.fontWeight.medium, color: tokens.colors.text.secondary }, children: "Communications" }),
642
- /* @__PURE__ */ jsx(AstroIcon, { name: "antenna-transmit", size: 16, color: tokens.colors.text.tertiary }),
643
- /* @__PURE__ */ jsx(
644
- DataValue,
645
- {
646
- label: "Status",
647
- icon: "antenna-transmit",
648
- value: ((_q = telemetry.communications) == null ? void 0 : _q.transmitterStatus) ?? "--",
649
- size: "sm",
650
- variant: "card",
651
- showIcon: false,
652
- status: ((_r = telemetry.communications) == null ? void 0 : _r.transmitterStatus) === "transmitting" ? "normal" : ((_s = telemetry.communications) == null ? void 0 : _s.transmitterStatus) === "error" ? "critical" : "off"
653
- }
654
- ),
655
- /* @__PURE__ */ jsx(AstroIcon, { name: getPropertyConfig("queue").icon, size: 16, color: tokens.colors.text.tertiary }),
656
- /* @__PURE__ */ jsx(DataValue, { property: "queue", value: (_t = telemetry.communications) == null ? void 0 : _t.packetsQueued, size: "sm", variant: "card", showIcon: false }),
657
- /* @__PURE__ */ jsx(AstroIcon, { name: "antenna-receive", size: 16, color: tokens.colors.text.tertiary }),
658
- /* @__PURE__ */ jsx(
659
- DataValue,
660
- {
661
- label: "Transmitted",
662
- icon: "antenna-receive",
663
- value: safeNumber((((_u = telemetry.communications) == null ? void 0 : _u.bytesTransmitted) ?? 0) / 1024, 1),
664
- unit: "KB",
665
- size: "sm",
666
- variant: "card",
667
- showStatus: false,
668
- showIcon: false
669
- }
670
- ),
671
- /* @__PURE__ */ jsx("span", { style: { gridColumn: "4 / -1" } })
672
- ] }) }),
673
- ((_v = telemetry.health) == null ? void 0 : _v.anomalies) && telemetry.health.anomalies.length > 0 && /* @__PURE__ */ jsxs(
674
- "div",
675
- {
676
- role: "alert",
677
- style: {
678
- backgroundColor: `${tokens.colors.status.critical}15`,
679
- border: `1px solid ${tokens.colors.status.critical}40`,
680
- borderRadius: tokens.borderRadius.md,
681
- padding: tokens.spacing.sm,
682
- marginTop: tokens.spacing.md
683
- },
684
- children: [
685
- /* @__PURE__ */ jsxs(
686
- "h4",
687
- {
688
- style: {
689
- margin: `0 0 ${tokens.spacing.xs} 0`,
690
- fontSize: tokens.typography.fontSize.xs,
691
- fontWeight: tokens.typography.fontWeight.medium,
692
- color: tokens.colors.status.critical,
693
- display: "flex",
694
- alignItems: "center",
695
- gap: 4
696
- },
697
- children: [
698
- "⚠️ Anomalies (",
699
- telemetry.health.anomalies.length,
700
- ")"
701
- ]
702
- }
703
- ),
704
- /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 16 }, children: telemetry.health.anomalies.map((anomaly, idx) => /* @__PURE__ */ jsx(
705
- "li",
706
- {
707
- style: {
708
- fontSize: tokens.typography.fontSize.xs,
709
- color: tokens.colors.status.critical,
710
- marginTop: 2
711
- },
712
- children: typeof anomaly === "object" && anomaly !== null && "message" in anomaly ? anomaly.message : String(anomaly)
713
- },
714
- idx
715
- )) })
716
- ]
717
- }
718
- ),
719
- /* @__PURE__ */ jsx(
720
- "footer",
721
- {
722
- style: {
723
- marginTop: tokens.spacing.md,
724
- fontSize: tokens.typography.fontSize.xs,
725
- color: tokens.colors.text.secondary,
726
- // WCAG AA compliant - 4.5:1 contrast
727
- textAlign: "right"
728
- },
729
- children: /* @__PURE__ */ jsxs("time", { dateTime: telemetry.timestamp, children: [
730
- formatTime(telemetry.timestamp),
731
- " UTC"
732
- ] })
733
- }
734
- )
735
- ]
736
- }
737
- );
738
- });
739
- export {
740
- TelemetryCard
741
- };
742
- //# sourceMappingURL=TelemetryCard.js.map