@zendir/ui 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/index.js +67 -62
  3. package/dist/index.js.map +1 -1
  4. package/dist/react/3d/ZenSpace3D.js +3 -2
  5. package/dist/react/3d/ZenSpace3DShaders.js +478 -0
  6. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
  7. package/dist/react/3d/capturePngAnalysis.js +42 -0
  8. package/dist/react/3d/capturePngAnalysis.js.map +1 -0
  9. package/dist/react/3d/index.js +57 -0
  10. package/dist/react/3d/index.js.map +1 -0
  11. package/dist/react/3d/threeLoader.js +4 -0
  12. package/dist/react/3d/threeLoader.js.map +1 -1
  13. package/dist/react/astro/ClassificationBanner.js +1 -1
  14. package/dist/react/astro/GlobalStatusBar.js +1 -1
  15. package/dist/react/astro/MissionClock.js +8 -5
  16. package/dist/react/astro/MissionClock.js.map +1 -1
  17. package/dist/react/astro/MonitoringIcon.js +1 -1
  18. package/dist/react/astro/Notification.js +1 -1
  19. package/dist/react/astro/Progress.js +1 -1
  20. package/dist/react/astro/SimulationControls.js +1 -1
  21. package/dist/react/astro/StatusIndicator.js +1 -1
  22. package/dist/react/astro/UnifiedTimeline.js +1 -1
  23. package/dist/react/astro/index.js +34 -0
  24. package/dist/react/astro/index.js.map +1 -0
  25. package/dist/react/cards/AccessCard.js +410 -0
  26. package/dist/react/cards/AccessCard.js.map +1 -0
  27. package/dist/react/cards/OrbitCard.js +372 -0
  28. package/dist/react/cards/OrbitCard.js.map +1 -0
  29. package/dist/react/cards/SpacecraftCard.js +941 -0
  30. package/dist/react/cards/SpacecraftCard.js.map +1 -0
  31. package/dist/react/cards/TelemetryCard.js +742 -0
  32. package/dist/react/cards/TelemetryCard.js.map +1 -0
  33. package/dist/react/cards/TelemetryStreamCard.js +309 -0
  34. package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
  35. package/dist/react/cards/index.js +13 -0
  36. package/dist/react/cards/index.js.map +1 -0
  37. package/dist/react/charts/GroundTrackMap.js +1 -1
  38. package/dist/react/charts/GroundTrackMapLeaflet.js +1 -1
  39. package/dist/react/charts/index.js +104 -0
  40. package/dist/react/charts/index.js.map +1 -0
  41. package/dist/react/charts/unified/AstroChart.js +1 -1
  42. package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
  43. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
  44. package/dist/react/charts/unified/domain.js +3168 -0
  45. package/dist/react/charts/unified/domain.js.map +1 -0
  46. package/dist/react/charts/unified/generators.js +518 -0
  47. package/dist/react/charts/unified/generators.js.map +1 -0
  48. package/dist/react/charts/unified/presets.js +1000 -0
  49. package/dist/react/charts/unified/presets.js.map +1 -0
  50. package/dist/react/charts/unified/sync.js +219 -0
  51. package/dist/react/charts/unified/sync.js.map +1 -0
  52. package/dist/react/charts/unified/theme.js +331 -4
  53. package/dist/react/charts/unified/theme.js.map +1 -1
  54. package/dist/react/charts/unified/useChartStream.js +226 -0
  55. package/dist/react/charts/unified/useChartStream.js.map +1 -0
  56. package/dist/react/chatgpt/index.js +163 -0
  57. package/dist/react/chatgpt/index.js.map +1 -0
  58. package/dist/react/core/data/DataTable.js +1 -1
  59. package/dist/react/core/data/DataValue.js +1 -1
  60. package/dist/react/core/display/AstroIcon.js +1 -1
  61. package/dist/react/core/display/Badge.js +1 -1
  62. package/dist/react/core/display/CardHeader.js +1 -1
  63. package/dist/react/core/display/Container.js +1 -1
  64. package/dist/react/core/display/GlassCard.js +1 -1
  65. package/dist/react/core/display/HeaderIconWithStatus.js +1 -1
  66. package/dist/react/core/feedback/Dialog.js +24 -21
  67. package/dist/react/core/feedback/Dialog.js.map +1 -1
  68. package/dist/react/core/feedback/Toast.js +1 -1
  69. package/dist/react/core/index.d.ts +4 -0
  70. package/dist/react/core/index.js +166 -0
  71. package/dist/react/core/index.js.map +1 -0
  72. package/dist/react/core/inputs/Button.js +1 -1
  73. package/dist/react/core/inputs/Checkbox.js +1 -1
  74. package/dist/react/core/inputs/Input.js +1 -1
  75. package/dist/react/core/inputs/NumberInput.js +1 -1
  76. package/dist/react/core/inputs/PinInput.js +1 -1
  77. package/dist/react/core/inputs/Select.js +1 -1
  78. package/dist/react/core/inputs/Toggle.js +1 -1
  79. package/dist/react/core/layout/Box.js +1 -1
  80. package/dist/react/core/layout/Flex.js +1 -1
  81. package/dist/react/core/layout/Grid.js +1 -1
  82. package/dist/react/core/layout/Stack.js +1 -1
  83. package/dist/react/core/navigation/AppBar.js +1 -1
  84. package/dist/react/core/navigation/Pagination.js +1 -1
  85. package/dist/react/core/navigation/SideNav.js +1 -1
  86. package/dist/react/core/navigation/SideNav.js.map +1 -1
  87. package/dist/react/core/navigation/Tabs.js +1 -1
  88. package/dist/react/core/overlays/SidePanel.js +1 -1
  89. package/dist/react/core/overlays/Tooltip.js +1 -1
  90. package/dist/react/core/widgets/Capture.js +1 -1
  91. package/dist/react/core/widgets/ChatPanel.js +1 -1
  92. package/dist/react/core/widgets/ColorPickerPanel.js +1 -1
  93. package/dist/react/core/widgets/ConnectionForm.js +1 -1
  94. package/dist/react/core/widgets/FileExplorer.js +1 -1
  95. package/dist/react/core/widgets/ImageFrame.d.ts +51 -0
  96. package/dist/react/core/widgets/ImageFrame.js +201 -0
  97. package/dist/react/core/widgets/ImageFrame.js.map +1 -0
  98. package/dist/react/core/widgets/ImageGallery.js +1 -1
  99. package/dist/react/core/widgets/ImagePanel.d.ts +43 -0
  100. package/dist/react/core/widgets/ImagePanel.js +105 -0
  101. package/dist/react/core/widgets/ImagePanel.js.map +1 -0
  102. package/dist/react/core/widgets/MessageStream.js +1 -1
  103. package/dist/react/core/widgets/MissionCalendar.js +1 -1
  104. package/dist/react/hooks/useCompactMode.js +1 -1
  105. package/dist/react/index.d.ts +2 -2
  106. package/dist/react/panels/index.js +8 -0
  107. package/dist/react/panels/index.js.map +1 -0
  108. package/dist/react/theme/config.js +30 -0
  109. package/dist/react/theme/config.js.map +1 -0
  110. package/dist/react/theme/index.js +19 -0
  111. package/dist/react/theme/index.js.map +1 -0
  112. package/dist/react/utils/index.js +8 -0
  113. package/dist/react/utils/index.js.map +1 -1
  114. package/dist/react.js +67 -62
  115. package/dist/react.js.map +1 -1
  116. package/package.json +46 -38
@@ -0,0 +1,478 @@
1
+ const atmosphereVertexShader = `
2
+ varying vec3 vNormal;
3
+ varying vec3 vPosition;
4
+ varying float vIntensity;
5
+
6
+ void main() {
7
+ vNormal = normalize(normalMatrix * normal);
8
+ vPosition = position;
9
+
10
+ // Calculate intensity based on view angle
11
+ vec4 worldPosition = modelMatrix * vec4(position, 1.0);
12
+ vec3 viewDirection = normalize(cameraPosition - worldPosition.xyz);
13
+ vIntensity = pow(0.65 - dot(vNormal, viewDirection), 2.0);
14
+
15
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
16
+ }
17
+ `;
18
+ const atmosphereFragmentShader = `
19
+ varying vec3 vNormal;
20
+ varying vec3 vPosition;
21
+ varying float vIntensity;
22
+
23
+ uniform vec3 glowColor;
24
+ uniform float glowIntensity;
25
+
26
+ void main() {
27
+ // Fresnel-based glow
28
+ float intensity = vIntensity * glowIntensity;
29
+
30
+ // Add subtle color variation
31
+ vec3 color = glowColor * intensity;
32
+
33
+ // Fade at edges for smoother blending
34
+ float alpha = intensity * 0.8;
35
+
36
+ gl_FragColor = vec4(color, alpha);
37
+ }
38
+ `;
39
+ const starsVertexShader = `
40
+ attribute float opacity;
41
+ attribute float size;
42
+ attribute vec3 customColor;
43
+
44
+ varying float vOpacity;
45
+ varying vec3 vColor;
46
+
47
+ uniform float time;
48
+ uniform float pointSize;
49
+
50
+ void main() {
51
+ vOpacity = opacity;
52
+ vColor = customColor;
53
+
54
+ // Twinkle effect
55
+ float twinkle = sin(time * (0.5 + opacity * 2.0) + opacity * 100.0) * 0.5 + 0.5;
56
+ vOpacity = opacity * (0.6 + twinkle * 0.4);
57
+
58
+ vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
59
+
60
+ // Size attenuation
61
+ float sizeMultiplier = size > 0.0 ? size : 1.0;
62
+ gl_PointSize = pointSize * sizeMultiplier * (300.0 / -mvPosition.z);
63
+ gl_PointSize = clamp(gl_PointSize, 0.5, 8.0);
64
+
65
+ gl_Position = projectionMatrix * mvPosition;
66
+ }
67
+ `;
68
+ const starsFragmentShader = `
69
+ varying float vOpacity;
70
+ varying vec3 vColor;
71
+
72
+ void main() {
73
+ // Circular point with soft edge
74
+ vec2 center = gl_PointCoord - vec2(0.5);
75
+ float dist = length(center);
76
+
77
+ if (dist > 0.5) discard;
78
+
79
+ // Soft glow falloff
80
+ float alpha = smoothstep(0.5, 0.0, dist) * vOpacity;
81
+
82
+ // Apply color
83
+ vec3 color = vColor.r > 0.0 ? vColor : vec3(1.0, 1.0, 1.0);
84
+
85
+ gl_FragColor = vec4(color, alpha);
86
+ }
87
+ `;
88
+ const coverageVertexShader = `
89
+ varying vec2 vUv;
90
+ varying vec3 vNormal;
91
+ varying vec3 vPosition;
92
+
93
+ void main() {
94
+ vUv = uv;
95
+ vNormal = normalize(normalMatrix * normal);
96
+ vPosition = (modelMatrix * vec4(position, 1.0)).xyz;
97
+
98
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
99
+ }
100
+ `;
101
+ const coverageFragmentShader = `
102
+ uniform sampler2D coverageMap;
103
+ uniform vec3 lowColor;
104
+ uniform vec3 highColor;
105
+ uniform float opacity;
106
+ uniform float time;
107
+
108
+ varying vec2 vUv;
109
+ varying vec3 vNormal;
110
+ varying vec3 vPosition;
111
+
112
+ void main() {
113
+ // Sample coverage value
114
+ float coverage = texture2D(coverageMap, vUv).r;
115
+
116
+ // Animated pulse for active areas
117
+ float pulse = sin(time * 2.0) * 0.1 + 0.9;
118
+ coverage *= coverage > 0.5 ? pulse : 1.0;
119
+
120
+ // Color gradient
121
+ vec3 color = mix(lowColor, highColor, coverage);
122
+
123
+ // Fresnel edge highlight
124
+ vec3 viewDir = normalize(cameraPosition - vPosition);
125
+ float fresnel = pow(1.0 - dot(vNormal, viewDir), 2.0);
126
+ color += vec3(0.1, 0.3, 0.5) * fresnel * coverage;
127
+
128
+ // Hexagon pattern overlay (subtle)
129
+ float hexPattern = fract(vUv.x * 20.0 + vUv.y * 10.0);
130
+ color *= 0.95 + hexPattern * 0.05;
131
+
132
+ gl_FragColor = vec4(color, coverage * opacity);
133
+ }
134
+ `;
135
+ const visibilityConeVertexShader = `
136
+ varying vec3 vPosition;
137
+ varying vec3 vNormal;
138
+ varying float vDistFromApex;
139
+
140
+ uniform vec3 apexPosition;
141
+
142
+ void main() {
143
+ vPosition = (modelMatrix * vec4(position, 1.0)).xyz;
144
+ vNormal = normalize(normalMatrix * normal);
145
+ vDistFromApex = distance(position, apexPosition);
146
+
147
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
148
+ }
149
+ `;
150
+ const visibilityConeFragmentShader = `
151
+ uniform vec3 coneColor;
152
+ uniform float coneOpacity;
153
+ uniform float time;
154
+
155
+ varying vec3 vPosition;
156
+ varying vec3 vNormal;
157
+ varying float vDistFromApex;
158
+
159
+ void main() {
160
+ // Fresnel effect for edge visibility
161
+ vec3 viewDir = normalize(cameraPosition - vPosition);
162
+ float fresnel = pow(1.0 - abs(dot(vNormal, viewDir)), 2.0);
163
+
164
+ // Animated scan line effect
165
+ float scan = fract(vDistFromApex * 0.001 - time * 0.5);
166
+ scan = smoothstep(0.0, 0.1, scan) * smoothstep(0.2, 0.1, scan);
167
+
168
+ // Distance-based opacity (fade towards apex)
169
+ float distFade = smoothstep(0.0, 500.0, vDistFromApex);
170
+
171
+ // Combine effects
172
+ float alpha = (fresnel * 0.3 + 0.1 + scan * 0.2) * coneOpacity * distFade;
173
+
174
+ gl_FragColor = vec4(coneColor, alpha);
175
+ }
176
+ `;
177
+ const orbitLineVertexShader = `
178
+ attribute float lineDistance;
179
+ varying float vLineDistance;
180
+ varying float vOpacity;
181
+
182
+ uniform float totalLength;
183
+ uniform float time;
184
+ uniform float dashScale;
185
+
186
+ void main() {
187
+ vLineDistance = lineDistance;
188
+
189
+ // Animated dash effect
190
+ float animOffset = mod(time * 0.5, 1.0) * totalLength;
191
+ float dashPos = mod(lineDistance + animOffset, dashScale);
192
+ vOpacity = smoothstep(0.0, dashScale * 0.3, dashPos) *
193
+ smoothstep(dashScale, dashScale * 0.7, dashPos);
194
+
195
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
196
+ }
197
+ `;
198
+ const orbitLineFragmentShader = `
199
+ uniform vec3 lineColor;
200
+ uniform float lineOpacity;
201
+
202
+ varying float vLineDistance;
203
+ varying float vOpacity;
204
+
205
+ void main() {
206
+ gl_FragColor = vec4(lineColor, lineOpacity * vOpacity);
207
+ }
208
+ `;
209
+ const objectGlowVertexShader = `
210
+ varying vec3 vNormal;
211
+ varying vec3 vViewPosition;
212
+
213
+ void main() {
214
+ vNormal = normalize(normalMatrix * normal);
215
+ vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
216
+ vViewPosition = -mvPosition.xyz;
217
+
218
+ gl_Position = projectionMatrix * mvPosition;
219
+ }
220
+ `;
221
+ const objectGlowFragmentShader = `
222
+ uniform vec3 glowColor;
223
+ uniform float glowIntensity;
224
+ uniform float glowPower;
225
+
226
+ varying vec3 vNormal;
227
+ varying vec3 vViewPosition;
228
+
229
+ void main() {
230
+ vec3 viewDir = normalize(vViewPosition);
231
+ float fresnel = pow(1.0 - abs(dot(vNormal, viewDir)), glowPower);
232
+
233
+ vec3 color = glowColor * glowIntensity * fresnel;
234
+ float alpha = fresnel * glowIntensity;
235
+
236
+ gl_FragColor = vec4(color, alpha);
237
+ }
238
+ `;
239
+ const selectionRingVertexShader = `
240
+ varying vec2 vUv;
241
+
242
+ void main() {
243
+ vUv = uv;
244
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
245
+ }
246
+ `;
247
+ const selectionRingFragmentShader = `
248
+ uniform vec3 ringColor;
249
+ uniform float time;
250
+ uniform float ringWidth;
251
+ uniform float ringRadius;
252
+
253
+ varying vec2 vUv;
254
+
255
+ void main() {
256
+ vec2 center = vUv - vec2(0.5);
257
+ float dist = length(center);
258
+
259
+ // Ring shape
260
+ float ring = smoothstep(ringRadius - ringWidth, ringRadius, dist) *
261
+ smoothstep(ringRadius + ringWidth, ringRadius, dist);
262
+
263
+ // Animated rotation
264
+ float angle = atan(center.y, center.x);
265
+ float rotatingDash = sin(angle * 8.0 - time * 3.0) * 0.5 + 0.5;
266
+
267
+ // Pulse effect
268
+ float pulse = sin(time * 2.0) * 0.2 + 0.8;
269
+
270
+ float alpha = ring * rotatingDash * pulse;
271
+
272
+ gl_FragColor = vec4(ringColor, alpha);
273
+ }
274
+ `;
275
+ const terminatorVertexShader = `
276
+ varying vec3 vWorldPosition;
277
+ varying vec3 vNormal;
278
+
279
+ void main() {
280
+ vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;
281
+ vNormal = normalize(normalMatrix * normal);
282
+
283
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
284
+ }
285
+ `;
286
+ const terminatorFragmentShader = `
287
+ uniform vec3 sunDirection;
288
+ uniform sampler2D dayTexture;
289
+ uniform sampler2D nightTexture;
290
+
291
+ varying vec3 vWorldPosition;
292
+ varying vec3 vNormal;
293
+
294
+ void main() {
295
+ // Calculate sun illumination
296
+ float sunDot = dot(vNormal, sunDirection);
297
+
298
+ // Smooth transition at terminator
299
+ float dayFactor = smoothstep(-0.1, 0.2, sunDot);
300
+
301
+ // Sample textures (simplified - using world position for UV)
302
+ vec2 uv = vec2(
303
+ atan(vWorldPosition.z, vWorldPosition.x) / (2.0 * 3.14159) + 0.5,
304
+ asin(vWorldPosition.y / length(vWorldPosition)) / 3.14159 + 0.5
305
+ );
306
+
307
+ vec4 dayColor = texture2D(dayTexture, uv);
308
+ vec4 nightColor = texture2D(nightTexture, uv);
309
+
310
+ // Blend day and night
311
+ vec4 color = mix(nightColor, dayColor, dayFactor);
312
+
313
+ // Add city lights glow on night side
314
+ float nightGlow = (1.0 - dayFactor) * nightColor.r * 0.5;
315
+ color.rgb += vec3(1.0, 0.9, 0.7) * nightGlow;
316
+
317
+ gl_FragColor = color;
318
+ }
319
+ `;
320
+ const gridVertexShader = `
321
+ varying vec3 vPosition;
322
+
323
+ void main() {
324
+ vPosition = position;
325
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
326
+ }
327
+ `;
328
+ const gridFragmentShader = `
329
+ uniform vec3 gridColor;
330
+ uniform float gridOpacity;
331
+ uniform float gridSpacing;
332
+ uniform float lineWidth;
333
+
334
+ varying vec3 vPosition;
335
+
336
+ void main() {
337
+ // Convert position to lat/lon
338
+ float lat = asin(vPosition.y / length(vPosition)) * 57.2958; // rad to deg
339
+ float lon = atan(vPosition.z, vPosition.x) * 57.2958;
340
+
341
+ // Create grid lines
342
+ float latLine = abs(mod(lat + 90.0, gridSpacing) - gridSpacing * 0.5);
343
+ float lonLine = abs(mod(lon + 180.0, gridSpacing) - gridSpacing * 0.5);
344
+
345
+ float line = min(latLine, lonLine);
346
+ float alpha = smoothstep(lineWidth, 0.0, line) * gridOpacity;
347
+
348
+ // Highlight equator and prime meridian
349
+ float equator = smoothstep(1.0, 0.0, abs(lat));
350
+ float primeMeridian = smoothstep(1.0, 0.0, abs(lon));
351
+ alpha += (equator + primeMeridian) * 0.3;
352
+
353
+ gl_FragColor = vec4(gridColor, alpha);
354
+ }
355
+ `;
356
+ const planetRingVertexShader = `
357
+ varying vec2 vUv;
358
+ varying vec3 vWorldPosition;
359
+
360
+ void main() {
361
+ vUv = uv;
362
+ vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;
363
+
364
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
365
+ }
366
+ `;
367
+ const planetRingFragmentShader = `
368
+ uniform vec3 ringColor;
369
+ uniform float innerRadius;
370
+ uniform float outerRadius;
371
+ uniform float ringOpacity;
372
+ uniform vec3 sunDirection;
373
+
374
+ varying vec2 vUv;
375
+ varying vec3 vWorldPosition;
376
+
377
+ void main() {
378
+ vec2 center = vUv - vec2(0.5);
379
+ float dist = length(center) * 2.0;
380
+
381
+ // Ring bands
382
+ float normalizedDist = (dist - innerRadius) / (outerRadius - innerRadius);
383
+
384
+ if (normalizedDist < 0.0 || normalizedDist > 1.0) discard;
385
+
386
+ // Create ring bands pattern
387
+ float bands = sin(normalizedDist * 50.0) * 0.3 + 0.7;
388
+ float gaps = step(0.3, fract(normalizedDist * 5.0));
389
+
390
+ // Simple shadow from planet
391
+ float shadow = smoothstep(0.3, 0.5, dist);
392
+
393
+ float alpha = bands * gaps * ringOpacity * shadow;
394
+
395
+ gl_FragColor = vec4(ringColor, alpha);
396
+ }
397
+ `;
398
+ const debrisVertexShader = `
399
+ attribute vec3 instancePosition;
400
+ attribute float instanceSize;
401
+ attribute vec3 instanceColor;
402
+
403
+ varying vec3 vColor;
404
+ varying float vSize;
405
+
406
+ uniform float time;
407
+
408
+ void main() {
409
+ vColor = instanceColor;
410
+ vSize = instanceSize;
411
+
412
+ // Apply instance transform
413
+ vec3 transformed = position * instanceSize + instancePosition;
414
+
415
+ // Slight rotation animation
416
+ float angle = time * 0.5 + instancePosition.x * 0.01;
417
+ mat2 rot = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));
418
+ transformed.xz = rot * transformed.xz;
419
+
420
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(transformed, 1.0);
421
+ }
422
+ `;
423
+ const debrisFragmentShader = `
424
+ varying vec3 vColor;
425
+ varying float vSize;
426
+
427
+ void main() {
428
+ gl_FragColor = vec4(vColor, 1.0);
429
+ }
430
+ `;
431
+ function createAtmosphereUniforms(color = [0.3, 0.6, 1], intensity = 1.5) {
432
+ return {
433
+ glowColor: { value: color },
434
+ glowIntensity: { value: intensity }
435
+ };
436
+ }
437
+ function createStarsUniforms(pointSize = 2) {
438
+ return {
439
+ time: { value: 0 },
440
+ pointSize: { value: pointSize }
441
+ };
442
+ }
443
+ function createVisibilityConeUniforms(color = [0.2, 0.8, 0.9], opacity = 0.3) {
444
+ return {
445
+ coneColor: { value: color },
446
+ coneOpacity: { value: opacity },
447
+ time: { value: 0 },
448
+ apexPosition: { value: [0, 0, 0] }
449
+ };
450
+ }
451
+ export {
452
+ atmosphereFragmentShader,
453
+ atmosphereVertexShader,
454
+ coverageFragmentShader,
455
+ coverageVertexShader,
456
+ createAtmosphereUniforms,
457
+ createStarsUniforms,
458
+ createVisibilityConeUniforms,
459
+ debrisFragmentShader,
460
+ debrisVertexShader,
461
+ gridFragmentShader,
462
+ gridVertexShader,
463
+ objectGlowFragmentShader,
464
+ objectGlowVertexShader,
465
+ orbitLineFragmentShader,
466
+ orbitLineVertexShader,
467
+ planetRingFragmentShader,
468
+ planetRingVertexShader,
469
+ selectionRingFragmentShader,
470
+ selectionRingVertexShader,
471
+ starsFragmentShader,
472
+ starsVertexShader,
473
+ terminatorFragmentShader,
474
+ terminatorVertexShader,
475
+ visibilityConeFragmentShader,
476
+ visibilityConeVertexShader
477
+ };
478
+ //# sourceMappingURL=ZenSpace3DShaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZenSpace3DShaders.js","sources":["../../../src/react/3d/ZenSpace3DShaders.ts"],"sourcesContent":["/**\r\n * @zendir/ui - ZenSpace3D Shaders\r\n * \r\n * Advanced GLSL shaders for atmosphere, glow effects, coverage visualization,\r\n * and other space rendering effects.\r\n */\r\n\r\n// =============================================================================\r\n// Atmosphere Shader (Enhanced from original)\r\n// =============================================================================\r\n\r\nexport const atmosphereVertexShader = `\r\nvarying vec3 vNormal;\r\nvarying vec3 vPosition;\r\nvarying float vIntensity;\r\n\r\nvoid main() {\r\n vNormal = normalize(normalMatrix * normal);\r\n vPosition = position;\r\n \r\n // Calculate intensity based on view angle\r\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\r\n vec3 viewDirection = normalize(cameraPosition - worldPosition.xyz);\r\n vIntensity = pow(0.65 - dot(vNormal, viewDirection), 2.0);\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const atmosphereFragmentShader = `\r\nvarying vec3 vNormal;\r\nvarying vec3 vPosition;\r\nvarying float vIntensity;\r\n\r\nuniform vec3 glowColor;\r\nuniform float glowIntensity;\r\n\r\nvoid main() {\r\n // Fresnel-based glow\r\n float intensity = vIntensity * glowIntensity;\r\n \r\n // Add subtle color variation\r\n vec3 color = glowColor * intensity;\r\n \r\n // Fade at edges for smoother blending\r\n float alpha = intensity * 0.8;\r\n \r\n gl_FragColor = vec4(color, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Enhanced Stars Shader (Twinkling with nebula)\r\n// =============================================================================\r\n\r\nexport const starsVertexShader = `\r\nattribute float opacity;\r\nattribute float size;\r\nattribute vec3 customColor;\r\n\r\nvarying float vOpacity;\r\nvarying vec3 vColor;\r\n\r\nuniform float time;\r\nuniform float pointSize;\r\n\r\nvoid main() {\r\n vOpacity = opacity;\r\n vColor = customColor;\r\n \r\n // Twinkle effect\r\n float twinkle = sin(time * (0.5 + opacity * 2.0) + opacity * 100.0) * 0.5 + 0.5;\r\n vOpacity = opacity * (0.6 + twinkle * 0.4);\r\n \r\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\r\n \r\n // Size attenuation\r\n float sizeMultiplier = size > 0.0 ? size : 1.0;\r\n gl_PointSize = pointSize * sizeMultiplier * (300.0 / -mvPosition.z);\r\n gl_PointSize = clamp(gl_PointSize, 0.5, 8.0);\r\n \r\n gl_Position = projectionMatrix * mvPosition;\r\n}\r\n`;\r\n\r\nexport const starsFragmentShader = `\r\nvarying float vOpacity;\r\nvarying vec3 vColor;\r\n\r\nvoid main() {\r\n // Circular point with soft edge\r\n vec2 center = gl_PointCoord - vec2(0.5);\r\n float dist = length(center);\r\n \r\n if (dist > 0.5) discard;\r\n \r\n // Soft glow falloff\r\n float alpha = smoothstep(0.5, 0.0, dist) * vOpacity;\r\n \r\n // Apply color\r\n vec3 color = vColor.r > 0.0 ? vColor : vec3(1.0, 1.0, 1.0);\r\n \r\n gl_FragColor = vec4(color, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Coverage Heatmap Shader\r\n// =============================================================================\r\n\r\nexport const coverageVertexShader = `\r\nvarying vec2 vUv;\r\nvarying vec3 vNormal;\r\nvarying vec3 vPosition;\r\n\r\nvoid main() {\r\n vUv = uv;\r\n vNormal = normalize(normalMatrix * normal);\r\n vPosition = (modelMatrix * vec4(position, 1.0)).xyz;\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const coverageFragmentShader = `\r\nuniform sampler2D coverageMap;\r\nuniform vec3 lowColor;\r\nuniform vec3 highColor;\r\nuniform float opacity;\r\nuniform float time;\r\n\r\nvarying vec2 vUv;\r\nvarying vec3 vNormal;\r\nvarying vec3 vPosition;\r\n\r\nvoid main() {\r\n // Sample coverage value\r\n float coverage = texture2D(coverageMap, vUv).r;\r\n \r\n // Animated pulse for active areas\r\n float pulse = sin(time * 2.0) * 0.1 + 0.9;\r\n coverage *= coverage > 0.5 ? pulse : 1.0;\r\n \r\n // Color gradient\r\n vec3 color = mix(lowColor, highColor, coverage);\r\n \r\n // Fresnel edge highlight\r\n vec3 viewDir = normalize(cameraPosition - vPosition);\r\n float fresnel = pow(1.0 - dot(vNormal, viewDir), 2.0);\r\n color += vec3(0.1, 0.3, 0.5) * fresnel * coverage;\r\n \r\n // Hexagon pattern overlay (subtle)\r\n float hexPattern = fract(vUv.x * 20.0 + vUv.y * 10.0);\r\n color *= 0.95 + hexPattern * 0.05;\r\n \r\n gl_FragColor = vec4(color, coverage * opacity);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Visibility Cone Shader\r\n// =============================================================================\r\n\r\nexport const visibilityConeVertexShader = `\r\nvarying vec3 vPosition;\r\nvarying vec3 vNormal;\r\nvarying float vDistFromApex;\r\n\r\nuniform vec3 apexPosition;\r\n\r\nvoid main() {\r\n vPosition = (modelMatrix * vec4(position, 1.0)).xyz;\r\n vNormal = normalize(normalMatrix * normal);\r\n vDistFromApex = distance(position, apexPosition);\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const visibilityConeFragmentShader = `\r\nuniform vec3 coneColor;\r\nuniform float coneOpacity;\r\nuniform float time;\r\n\r\nvarying vec3 vPosition;\r\nvarying vec3 vNormal;\r\nvarying float vDistFromApex;\r\n\r\nvoid main() {\r\n // Fresnel effect for edge visibility\r\n vec3 viewDir = normalize(cameraPosition - vPosition);\r\n float fresnel = pow(1.0 - abs(dot(vNormal, viewDir)), 2.0);\r\n \r\n // Animated scan line effect\r\n float scan = fract(vDistFromApex * 0.001 - time * 0.5);\r\n scan = smoothstep(0.0, 0.1, scan) * smoothstep(0.2, 0.1, scan);\r\n \r\n // Distance-based opacity (fade towards apex)\r\n float distFade = smoothstep(0.0, 500.0, vDistFromApex);\r\n \r\n // Combine effects\r\n float alpha = (fresnel * 0.3 + 0.1 + scan * 0.2) * coneOpacity * distFade;\r\n \r\n gl_FragColor = vec4(coneColor, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Orbit Line Shader\r\n// =============================================================================\r\n\r\nexport const orbitLineVertexShader = `\r\nattribute float lineDistance;\r\nvarying float vLineDistance;\r\nvarying float vOpacity;\r\n\r\nuniform float totalLength;\r\nuniform float time;\r\nuniform float dashScale;\r\n\r\nvoid main() {\r\n vLineDistance = lineDistance;\r\n \r\n // Animated dash effect\r\n float animOffset = mod(time * 0.5, 1.0) * totalLength;\r\n float dashPos = mod(lineDistance + animOffset, dashScale);\r\n vOpacity = smoothstep(0.0, dashScale * 0.3, dashPos) * \r\n smoothstep(dashScale, dashScale * 0.7, dashPos);\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const orbitLineFragmentShader = `\r\nuniform vec3 lineColor;\r\nuniform float lineOpacity;\r\n\r\nvarying float vLineDistance;\r\nvarying float vOpacity;\r\n\r\nvoid main() {\r\n gl_FragColor = vec4(lineColor, lineOpacity * vOpacity);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Satellite/Object Glow Shader\r\n// =============================================================================\r\n\r\nexport const objectGlowVertexShader = `\r\nvarying vec3 vNormal;\r\nvarying vec3 vViewPosition;\r\n\r\nvoid main() {\r\n vNormal = normalize(normalMatrix * normal);\r\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\r\n vViewPosition = -mvPosition.xyz;\r\n \r\n gl_Position = projectionMatrix * mvPosition;\r\n}\r\n`;\r\n\r\nexport const objectGlowFragmentShader = `\r\nuniform vec3 glowColor;\r\nuniform float glowIntensity;\r\nuniform float glowPower;\r\n\r\nvarying vec3 vNormal;\r\nvarying vec3 vViewPosition;\r\n\r\nvoid main() {\r\n vec3 viewDir = normalize(vViewPosition);\r\n float fresnel = pow(1.0 - abs(dot(vNormal, viewDir)), glowPower);\r\n \r\n vec3 color = glowColor * glowIntensity * fresnel;\r\n float alpha = fresnel * glowIntensity;\r\n \r\n gl_FragColor = vec4(color, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Selection Ring Shader\r\n// =============================================================================\r\n\r\nexport const selectionRingVertexShader = `\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n vUv = uv;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const selectionRingFragmentShader = `\r\nuniform vec3 ringColor;\r\nuniform float time;\r\nuniform float ringWidth;\r\nuniform float ringRadius;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n vec2 center = vUv - vec2(0.5);\r\n float dist = length(center);\r\n \r\n // Ring shape\r\n float ring = smoothstep(ringRadius - ringWidth, ringRadius, dist) *\r\n smoothstep(ringRadius + ringWidth, ringRadius, dist);\r\n \r\n // Animated rotation\r\n float angle = atan(center.y, center.x);\r\n float rotatingDash = sin(angle * 8.0 - time * 3.0) * 0.5 + 0.5;\r\n \r\n // Pulse effect\r\n float pulse = sin(time * 2.0) * 0.2 + 0.8;\r\n \r\n float alpha = ring * rotatingDash * pulse;\r\n \r\n gl_FragColor = vec4(ringColor, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Terminator (Day/Night) Shader\r\n// =============================================================================\r\n\r\nexport const terminatorVertexShader = `\r\nvarying vec3 vWorldPosition;\r\nvarying vec3 vNormal;\r\n\r\nvoid main() {\r\n vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;\r\n vNormal = normalize(normalMatrix * normal);\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const terminatorFragmentShader = `\r\nuniform vec3 sunDirection;\r\nuniform sampler2D dayTexture;\r\nuniform sampler2D nightTexture;\r\n\r\nvarying vec3 vWorldPosition;\r\nvarying vec3 vNormal;\r\n\r\nvoid main() {\r\n // Calculate sun illumination\r\n float sunDot = dot(vNormal, sunDirection);\r\n \r\n // Smooth transition at terminator\r\n float dayFactor = smoothstep(-0.1, 0.2, sunDot);\r\n \r\n // Sample textures (simplified - using world position for UV)\r\n vec2 uv = vec2(\r\n atan(vWorldPosition.z, vWorldPosition.x) / (2.0 * 3.14159) + 0.5,\r\n asin(vWorldPosition.y / length(vWorldPosition)) / 3.14159 + 0.5\r\n );\r\n \r\n vec4 dayColor = texture2D(dayTexture, uv);\r\n vec4 nightColor = texture2D(nightTexture, uv);\r\n \r\n // Blend day and night\r\n vec4 color = mix(nightColor, dayColor, dayFactor);\r\n \r\n // Add city lights glow on night side\r\n float nightGlow = (1.0 - dayFactor) * nightColor.r * 0.5;\r\n color.rgb += vec3(1.0, 0.9, 0.7) * nightGlow;\r\n \r\n gl_FragColor = color;\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Grid Shader (Lat/Lon lines)\r\n// =============================================================================\r\n\r\nexport const gridVertexShader = `\r\nvarying vec3 vPosition;\r\n\r\nvoid main() {\r\n vPosition = position;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const gridFragmentShader = `\r\nuniform vec3 gridColor;\r\nuniform float gridOpacity;\r\nuniform float gridSpacing;\r\nuniform float lineWidth;\r\n\r\nvarying vec3 vPosition;\r\n\r\nvoid main() {\r\n // Convert position to lat/lon\r\n float lat = asin(vPosition.y / length(vPosition)) * 57.2958; // rad to deg\r\n float lon = atan(vPosition.z, vPosition.x) * 57.2958;\r\n \r\n // Create grid lines\r\n float latLine = abs(mod(lat + 90.0, gridSpacing) - gridSpacing * 0.5);\r\n float lonLine = abs(mod(lon + 180.0, gridSpacing) - gridSpacing * 0.5);\r\n \r\n float line = min(latLine, lonLine);\r\n float alpha = smoothstep(lineWidth, 0.0, line) * gridOpacity;\r\n \r\n // Highlight equator and prime meridian\r\n float equator = smoothstep(1.0, 0.0, abs(lat));\r\n float primeMeridian = smoothstep(1.0, 0.0, abs(lon));\r\n alpha += (equator + primeMeridian) * 0.3;\r\n \r\n gl_FragColor = vec4(gridColor, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Planet Ring Shader (Saturn-like)\r\n// =============================================================================\r\n\r\nexport const planetRingVertexShader = `\r\nvarying vec2 vUv;\r\nvarying vec3 vWorldPosition;\r\n\r\nvoid main() {\r\n vUv = uv;\r\n vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const planetRingFragmentShader = `\r\nuniform vec3 ringColor;\r\nuniform float innerRadius;\r\nuniform float outerRadius;\r\nuniform float ringOpacity;\r\nuniform vec3 sunDirection;\r\n\r\nvarying vec2 vUv;\r\nvarying vec3 vWorldPosition;\r\n\r\nvoid main() {\r\n vec2 center = vUv - vec2(0.5);\r\n float dist = length(center) * 2.0;\r\n \r\n // Ring bands\r\n float normalizedDist = (dist - innerRadius) / (outerRadius - innerRadius);\r\n \r\n if (normalizedDist < 0.0 || normalizedDist > 1.0) discard;\r\n \r\n // Create ring bands pattern\r\n float bands = sin(normalizedDist * 50.0) * 0.3 + 0.7;\r\n float gaps = step(0.3, fract(normalizedDist * 5.0));\r\n \r\n // Simple shadow from planet\r\n float shadow = smoothstep(0.3, 0.5, dist);\r\n \r\n float alpha = bands * gaps * ringOpacity * shadow;\r\n \r\n gl_FragColor = vec4(ringColor, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Debris Field Shader (for instanced rendering)\r\n// =============================================================================\r\n\r\nexport const debrisVertexShader = `\r\nattribute vec3 instancePosition;\r\nattribute float instanceSize;\r\nattribute vec3 instanceColor;\r\n\r\nvarying vec3 vColor;\r\nvarying float vSize;\r\n\r\nuniform float time;\r\n\r\nvoid main() {\r\n vColor = instanceColor;\r\n vSize = instanceSize;\r\n \r\n // Apply instance transform\r\n vec3 transformed = position * instanceSize + instancePosition;\r\n \r\n // Slight rotation animation\r\n float angle = time * 0.5 + instancePosition.x * 0.01;\r\n mat2 rot = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\r\n transformed.xz = rot * transformed.xz;\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(transformed, 1.0);\r\n}\r\n`;\r\n\r\nexport const debrisFragmentShader = `\r\nvarying vec3 vColor;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n gl_FragColor = vec4(vColor, 1.0);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Shader Uniforms Helpers\r\n// =============================================================================\r\n\r\nexport interface AtmosphereUniforms {\r\n glowColor: { value: [number, number, number] };\r\n glowIntensity: { value: number };\r\n}\r\n\r\nexport interface StarsUniforms {\r\n time: { value: number };\r\n pointSize: { value: number };\r\n}\r\n\r\nexport interface CoverageUniforms {\r\n coverageMap: { value: unknown };\r\n lowColor: { value: [number, number, number] };\r\n highColor: { value: [number, number, number] };\r\n opacity: { value: number };\r\n time: { value: number };\r\n}\r\n\r\nexport interface VisibilityConeUniforms {\r\n coneColor: { value: [number, number, number] };\r\n coneOpacity: { value: number };\r\n time: { value: number };\r\n apexPosition: { value: [number, number, number] };\r\n}\r\n\r\nexport function createAtmosphereUniforms(\r\n color: [number, number, number] = [0.3, 0.6, 1.0],\r\n intensity: number = 1.5\r\n): AtmosphereUniforms {\r\n return {\r\n glowColor: { value: color },\r\n glowIntensity: { value: intensity },\r\n };\r\n}\r\n\r\nexport function createStarsUniforms(pointSize: number = 2.0): StarsUniforms {\r\n return {\r\n time: { value: 0 },\r\n pointSize: { value: pointSize },\r\n };\r\n}\r\n\r\nexport function createVisibilityConeUniforms(\r\n color: [number, number, number] = [0.2, 0.8, 0.9],\r\n opacity: number = 0.3\r\n): VisibilityConeUniforms {\r\n return {\r\n coneColor: { value: color },\r\n coneOpacity: { value: opacity },\r\n time: { value: 0 },\r\n apexPosition: { value: [0, 0, 0] },\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ function rgbToLuma(r, g, b) {
2
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
3
+ }
4
+ async function meanLuminanceFromPngBytes(png) {
5
+ var _a;
6
+ if (typeof createImageBitmap !== "function" || typeof document === "undefined") {
7
+ return 0;
8
+ }
9
+ try {
10
+ const blob = new Blob([png], { type: "image/png" });
11
+ const bmp = await createImageBitmap(blob);
12
+ const w = bmp.width;
13
+ const h = bmp.height;
14
+ const canvas = document.createElement("canvas");
15
+ const step = Math.max(1, Math.floor(Math.sqrt(w * h / 4096)));
16
+ canvas.width = Math.ceil(w / step);
17
+ canvas.height = Math.ceil(h / step);
18
+ const ctx = canvas.getContext("2d");
19
+ if (!ctx) return 0;
20
+ ctx.drawImage(bmp, 0, 0, w, h, 0, 0, canvas.width, canvas.height);
21
+ const { data } = ctx.getImageData(0, 0, canvas.width, canvas.height);
22
+ let sum = 0;
23
+ const n = data.length / 4;
24
+ for (let i = 0; i < data.length; i += 4) {
25
+ sum += rgbToLuma(data[i], data[i + 1], data[i + 2]);
26
+ }
27
+ (_a = bmp.close) == null ? void 0 : _a.call(bmp);
28
+ return n > 0 ? sum / n : 0;
29
+ } catch {
30
+ return 0;
31
+ }
32
+ }
33
+ async function isPngMostlyBlack(png, threshold = 5) {
34
+ const m = await meanLuminanceFromPngBytes(png);
35
+ return m < threshold;
36
+ }
37
+ export {
38
+ isPngMostlyBlack,
39
+ meanLuminanceFromPngBytes,
40
+ rgbToLuma
41
+ };
42
+ //# sourceMappingURL=capturePngAnalysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capturePngAnalysis.js","sources":["../../../src/react/3d/capturePngAnalysis.ts"],"sourcesContent":["/**\r\n * Lightweight PNG analysis for capture QA (brightness / \"all black\" detection).\r\n * Used by tests and optional runtime checks — keep dependency-free (no pngjs).\r\n */\r\n\r\n/** ITU-R BT.709 luma from RGB */\r\nexport function rgbToLuma(r: number, g: number, b: number): number {\r\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\r\n}\r\n\r\n/**\r\n * Sample mean luma of PNG bytes by drawing to a small canvas (browser / happy-dom).\r\n * Returns 0 if decode fails. For very large images, samples a grid (max ~4096 samples).\r\n */\r\nexport async function meanLuminanceFromPngBytes(png: Uint8Array): Promise<number> {\r\n if (typeof createImageBitmap !== 'function' || typeof document === 'undefined') {\r\n return 0;\r\n }\r\n try {\r\n const blob = new Blob([png as unknown as BlobPart], { type: 'image/png' });\r\n const bmp = await createImageBitmap(blob);\r\n const w = bmp.width;\r\n const h = bmp.height;\r\n const canvas = document.createElement('canvas');\r\n const step = Math.max(1, Math.floor(Math.sqrt((w * h) / 4096)));\r\n canvas.width = Math.ceil(w / step);\r\n canvas.height = Math.ceil(h / step);\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return 0;\r\n ctx.drawImage(bmp, 0, 0, w, h, 0, 0, canvas.width, canvas.height);\r\n const { data } = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n let sum = 0;\r\n const n = data.length / 4;\r\n for (let i = 0; i < data.length; i += 4) {\r\n sum += rgbToLuma(data[i], data[i + 1], data[i + 2]);\r\n }\r\n bmp.close?.();\r\n return n > 0 ? sum / n : 0;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * True if the image is uniformly dark (likely failed render / empty GL buffer).\r\n * Threshold is mean luma on 0–255 scale (default 5 ≈ pure black).\r\n */\r\nexport async function isPngMostlyBlack(png: Uint8Array, threshold = 5): Promise<boolean> {\r\n const m = await meanLuminanceFromPngBytes(png);\r\n return m < threshold;\r\n}\r\n"],"names":[],"mappings":"AAMO,SAAS,UAAU,GAAW,GAAW,GAAmB;AACjE,SAAO,SAAS,IAAI,SAAS,IAAI,SAAS;AAC5C;AAMA,eAAsB,0BAA0B,KAAkC;AAR3E;AASL,MAAI,OAAO,sBAAsB,cAAc,OAAO,aAAa,aAAa;AAC9E,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,OAAO,IAAI,KAAK,CAAC,GAA0B,GAAG,EAAE,MAAM,aAAa;AACzE,UAAM,MAAM,MAAM,kBAAkB,IAAI;AACxC,UAAM,IAAI,IAAI;AACd,UAAM,IAAI,IAAI;AACd,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAM,IAAI,IAAK,IAAI,CAAC,CAAC;AAC9D,WAAO,QAAQ,KAAK,KAAK,IAAI,IAAI;AACjC,WAAO,SAAS,KAAK,KAAK,IAAI,IAAI;AAClC,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,UAAU,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAChE,UAAM,EAAE,KAAA,IAAS,IAAI,aAAa,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACnE,QAAI,MAAM;AACV,UAAM,IAAI,KAAK,SAAS;AACxB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,aAAO,UAAU,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,IACpD;AACA,cAAI,UAAJ;AACA,WAAO,IAAI,IAAI,MAAM,IAAI;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,iBAAiB,KAAiB,YAAY,GAAqB;AACvF,QAAM,IAAI,MAAM,0BAA0B,GAAG;AAC7C,SAAO,IAAI;AACb;"}
@@ -0,0 +1,57 @@
1
+ import { ZenSpace3D, ZenSpace3D as ZenSpace3D2 } from "./ZenSpace3D.js";
2
+ import { ZenSpace3DCesium } from "./ZenSpace3DCesium.js";
3
+ import { DEG_TO_RAD, EARTH_RADIUS_KM, KM_TO_SCENE, RAD_TO_DEG, SCENE_EARTH_RADIUS, easeOutCubic, latLonAltToCartesian } from "./ZenSpace3DUtils.js";
4
+ import { atmosphereFragmentShader, atmosphereVertexShader, coverageFragmentShader, coverageVertexShader, createAtmosphereUniforms, createStarsUniforms, createVisibilityConeUniforms, debrisFragmentShader, debrisVertexShader, gridFragmentShader, gridVertexShader, objectGlowFragmentShader, objectGlowVertexShader, orbitLineFragmentShader, orbitLineVertexShader, planetRingFragmentShader, planetRingVertexShader, selectionRingFragmentShader, selectionRingVertexShader, starsFragmentShader, starsVertexShader, terminatorFragmentShader, terminatorVertexShader, visibilityConeFragmentShader, visibilityConeVertexShader } from "./ZenSpace3DShaders.js";
5
+ import { computeDofBlurPx, createCesiumCaptureSource, ecefEulerXyzToHpr, ecefMetersToSdkPosition, eulerXyzToHpr } from "./CesiumCaptureSource.js";
6
+ import { isPngMostlyBlack, meanLuminanceFromPngBytes, rgbToLuma } from "./capturePngAnalysis.js";
7
+ import { isThreeLoaded, loadThree } from "./threeLoader.js";
8
+ import { useSimulationScene } from "../hooks/useSimulationScene.js";
9
+ export {
10
+ DEG_TO_RAD,
11
+ EARTH_RADIUS_KM,
12
+ KM_TO_SCENE,
13
+ RAD_TO_DEG,
14
+ SCENE_EARTH_RADIUS,
15
+ ZenSpace3D,
16
+ ZenSpace3DCesium,
17
+ ZenSpace3D2 as ZenSpace3DDefault,
18
+ atmosphereFragmentShader,
19
+ atmosphereVertexShader,
20
+ computeDofBlurPx,
21
+ coverageFragmentShader,
22
+ coverageVertexShader,
23
+ createAtmosphereUniforms,
24
+ createCesiumCaptureSource,
25
+ createStarsUniforms,
26
+ createVisibilityConeUniforms,
27
+ debrisFragmentShader,
28
+ debrisVertexShader,
29
+ easeOutCubic,
30
+ ecefEulerXyzToHpr,
31
+ ecefMetersToSdkPosition,
32
+ eulerXyzToHpr,
33
+ gridFragmentShader,
34
+ gridVertexShader,
35
+ isPngMostlyBlack,
36
+ isThreeLoaded,
37
+ latLonAltToCartesian,
38
+ loadThree,
39
+ meanLuminanceFromPngBytes,
40
+ objectGlowFragmentShader,
41
+ objectGlowVertexShader,
42
+ orbitLineFragmentShader,
43
+ orbitLineVertexShader,
44
+ planetRingFragmentShader,
45
+ planetRingVertexShader,
46
+ rgbToLuma,
47
+ selectionRingFragmentShader,
48
+ selectionRingVertexShader,
49
+ starsFragmentShader,
50
+ starsVertexShader,
51
+ terminatorFragmentShader,
52
+ terminatorVertexShader,
53
+ useSimulationScene,
54
+ visibilityConeFragmentShader,
55
+ visibilityConeVertexShader
56
+ };
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -12,7 +12,11 @@ async function loadThree() {
12
12
  })();
13
13
  return loadPromise;
14
14
  }
15
+ function isThreeLoaded() {
16
+ return loadPromise !== null;
17
+ }
15
18
  export {
19
+ isThreeLoaded,
16
20
  loadThree
17
21
  };
18
22
  //# sourceMappingURL=threeLoader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"threeLoader.js","sources":["../../../src/react/3d/threeLoader.ts"],"sourcesContent":["/**\r\n * Shared Three.js loader\r\n * \r\n * Ensures only one instance of Three.js is loaded across all 3D components.\r\n * This prevents the \"Multiple instances of Three.js being imported\" warning.\r\n */\r\n\r\nexport type ThreeModule = typeof import('three');\r\nexport type OrbitControlsType = typeof import('three/examples/jsm/controls/OrbitControls.js').OrbitControls;\r\n\r\ninterface ThreeLoaderResult {\r\n THREE: ThreeModule;\r\n OrbitControls: OrbitControlsType;\r\n}\r\n\r\n// Cached promise to ensure single load\r\nlet loadPromise: Promise<ThreeLoaderResult> | null = null;\r\n\r\n/**\r\n * Load Three.js and OrbitControls\r\n * Returns cached instance if already loaded\r\n */\r\nexport async function loadThree(): Promise<ThreeLoaderResult> {\r\n if (loadPromise) {\r\n return loadPromise;\r\n }\r\n\r\n loadPromise = (async () => {\r\n const [THREE, { OrbitControls }] = await Promise.all([\r\n import('three'),\r\n import('three/examples/jsm/controls/OrbitControls.js'),\r\n ]);\r\n \r\n return { THREE, OrbitControls };\r\n })();\r\n\r\n return loadPromise;\r\n}\r\n\r\n/**\r\n * Check if Three.js is already loaded\r\n */\r\nexport function isThreeLoaded(): boolean {\r\n return loadPromise !== null;\r\n}\r\n"],"names":[],"mappings":"AAgBA,IAAI,cAAiD;AAMrD,eAAsB,YAAwC;AAC5D,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,iBAAe,YAAY;AACzB,UAAM,CAAC,OAAO,EAAE,cAAA,CAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,MACnD,OAAO,OAAO;AAAA,MACd,OAAO,8CAA8C;AAAA,IAAA,CACtD;AAED,WAAO,EAAE,OAAO,cAAA;AAAA,EAClB,GAAA;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"threeLoader.js","sources":["../../../src/react/3d/threeLoader.ts"],"sourcesContent":["/**\r\n * Shared Three.js loader\r\n * \r\n * Ensures only one instance of Three.js is loaded across all 3D components.\r\n * This prevents the \"Multiple instances of Three.js being imported\" warning.\r\n */\r\n\r\nexport type ThreeModule = typeof import('three');\r\nexport type OrbitControlsType = typeof import('three/examples/jsm/controls/OrbitControls.js').OrbitControls;\r\n\r\ninterface ThreeLoaderResult {\r\n THREE: ThreeModule;\r\n OrbitControls: OrbitControlsType;\r\n}\r\n\r\n// Cached promise to ensure single load\r\nlet loadPromise: Promise<ThreeLoaderResult> | null = null;\r\n\r\n/**\r\n * Load Three.js and OrbitControls\r\n * Returns cached instance if already loaded\r\n */\r\nexport async function loadThree(): Promise<ThreeLoaderResult> {\r\n if (loadPromise) {\r\n return loadPromise;\r\n }\r\n\r\n loadPromise = (async () => {\r\n const [THREE, { OrbitControls }] = await Promise.all([\r\n import('three'),\r\n import('three/examples/jsm/controls/OrbitControls.js'),\r\n ]);\r\n \r\n return { THREE, OrbitControls };\r\n })();\r\n\r\n return loadPromise;\r\n}\r\n\r\n/**\r\n * Check if Three.js is already loaded\r\n */\r\nexport function isThreeLoaded(): boolean {\r\n return loadPromise !== null;\r\n}\r\n"],"names":[],"mappings":"AAgBA,IAAI,cAAiD;AAMrD,eAAsB,YAAwC;AAC5D,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,iBAAe,YAAY;AACzB,UAAM,CAAC,OAAO,EAAE,cAAA,CAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,MACnD,OAAO,OAAO;AAAA,MACd,OAAO,8CAA8C;AAAA,IAAA,CACtD;AAED,WAAO,EAAE,OAAO,cAAA;AAAA,EAClB,GAAA;AAEA,SAAO;AACT;AAKO,SAAS,gBAAyB;AACvC,SAAO,gBAAgB;AACzB;"}
@@ -1,7 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { memo } from "react";
3
- import { classNames } from "../utils/index.js";
4
3
  import { useTheme } from "../theme/ThemeProvider.js";
4
+ import { classNames } from "../utils/index.js";
5
5
  const CLASSIFICATION_STYLES = {
6
6
  unclassified: {
7
7
  bg: "#007a33",
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { memo } from "react";
3
- import { safeAccentText, classNames } from "../utils/index.js";
4
3
  import { useTheme } from "../theme/ThemeProvider.js";
4
+ import { safeAccentText, classNames } from "../utils/index.js";
5
5
  const GlobalStatusBar = memo(function GlobalStatusBar2({
6
6
  appName = "Zendir",
7
7
  appDomain,