@buoy-gg/shared-ui 7.0.26 → 7.0.28

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 (221) hide show
  1. package/lib/commonjs/JsModal.js +156 -20
  2. package/lib/commonjs/JsModal.web.js +85 -39
  3. package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +14 -4
  4. package/lib/commonjs/dataViewer/diffThemes.js +20 -18
  5. package/lib/commonjs/dataViewer/tree/TreeDiffViewer.js +8 -8
  6. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  7. package/lib/commonjs/icons/lucide-icons.js +74 -15
  8. package/lib/commonjs/index.js +86 -0
  9. package/lib/commonjs/ui/backgrounds/BackgroundSwitcher.js +248 -74
  10. package/lib/commonjs/ui/backgrounds/README.md +102 -20
  11. package/lib/commonjs/ui/backgrounds/backgroundStore.js +20 -6
  12. package/lib/commonjs/ui/backgrounds/index.js +91 -1
  13. package/lib/commonjs/ui/backgrounds/primitives.js +50 -14
  14. package/lib/commonjs/ui/backgrounds/registry.js +41 -64
  15. package/lib/commonjs/ui/backgrounds/rng.js +21 -0
  16. package/lib/commonjs/ui/backgrounds/skyClock.js +45 -0
  17. package/lib/commonjs/ui/backgrounds/variants/daylight.js +453 -0
  18. package/lib/commonjs/ui/backgrounds/variants/deepField.js +60 -30
  19. package/lib/commonjs/ui/backgrounds/variants/hyperspace.js +218 -0
  20. package/lib/commonjs/ui/backgrounds/variants/liveSky.js +898 -0
  21. package/lib/commonjs/ui/backgrounds/variants/meteors.js +257 -0
  22. package/lib/commonjs/ui/backgrounds/variants/moonlight.js +472 -0
  23. package/lib/commonjs/ui/backgrounds/variants/underwater.js +757 -0
  24. package/lib/commonjs/ui/components/Badge.js +11 -10
  25. package/lib/commonjs/ui/components/CompactRow.js +35 -18
  26. package/lib/commonjs/ui/components/CopyButton.js +6 -4
  27. package/lib/commonjs/ui/components/DevToolsCard.js +16 -9
  28. package/lib/commonjs/ui/components/DynamicFilterView.js +43 -41
  29. package/lib/commonjs/ui/components/EventStepperFooter.js +38 -10
  30. package/lib/commonjs/ui/components/FilterComponents.js +11 -11
  31. package/lib/commonjs/ui/components/ModalHeader.js +28 -15
  32. package/lib/commonjs/ui/components/SectionHeader.js +3 -1
  33. package/lib/commonjs/ui/components/StorageTypeBadge.js +3 -2
  34. package/lib/commonjs/ui/components/TabSelector.js +56 -38
  35. package/lib/commonjs/ui/components/ValueTypeBadge.js +7 -6
  36. package/lib/commonjs/ui/components/WindowControls.js +37 -10
  37. package/lib/commonjs/ui/gameUI/constants/gameUIColors.js +8 -0
  38. package/lib/commonjs/ui/night/nightTheme.js +120 -0
  39. package/lib/commonjs/ui/night/primitives.js +498 -0
  40. package/lib/module/JsModal.js +156 -20
  41. package/lib/module/JsModal.web.js +83 -39
  42. package/lib/module/dataViewer/VirtualizedDataExplorer.js +14 -4
  43. package/lib/module/dataViewer/diffThemes.js +20 -18
  44. package/lib/module/dataViewer/tree/TreeDiffViewer.js +9 -9
  45. package/lib/module/hooks/safe-area-impl.js +1 -1
  46. package/lib/module/icons/lucide-icons.js +74 -15
  47. package/lib/module/index.js +4 -0
  48. package/lib/module/ui/backgrounds/BackgroundSwitcher.js +250 -76
  49. package/lib/module/ui/backgrounds/README.md +102 -20
  50. package/lib/module/ui/backgrounds/backgroundStore.js +19 -5
  51. package/lib/module/ui/backgrounds/index.js +11 -2
  52. package/lib/module/ui/backgrounds/primitives.js +53 -16
  53. package/lib/module/ui/backgrounds/registry.js +41 -64
  54. package/lib/module/ui/backgrounds/rng.js +20 -0
  55. package/lib/module/ui/backgrounds/skyClock.js +39 -0
  56. package/lib/module/ui/backgrounds/variants/daylight.js +449 -0
  57. package/lib/module/ui/backgrounds/variants/deepField.js +62 -31
  58. package/lib/module/ui/backgrounds/variants/hyperspace.js +214 -0
  59. package/lib/module/ui/backgrounds/variants/liveSky.js +893 -0
  60. package/lib/module/ui/backgrounds/variants/meteors.js +253 -0
  61. package/lib/module/ui/backgrounds/variants/moonlight.js +468 -0
  62. package/lib/module/ui/backgrounds/variants/underwater.js +753 -0
  63. package/lib/module/ui/components/Badge.js +11 -10
  64. package/lib/module/ui/components/CompactRow.js +35 -18
  65. package/lib/module/ui/components/CopyButton.js +6 -4
  66. package/lib/module/ui/components/DevToolsCard.js +16 -9
  67. package/lib/module/ui/components/DynamicFilterView.js +43 -41
  68. package/lib/module/ui/components/EventStepperFooter.js +38 -10
  69. package/lib/module/ui/components/FilterComponents.js +11 -11
  70. package/lib/module/ui/components/ModalHeader.js +28 -15
  71. package/lib/module/ui/components/SectionHeader.js +3 -1
  72. package/lib/module/ui/components/StorageTypeBadge.js +3 -2
  73. package/lib/module/ui/components/TabSelector.js +57 -39
  74. package/lib/module/ui/components/ValueTypeBadge.js +7 -6
  75. package/lib/module/ui/components/WindowControls.js +37 -10
  76. package/lib/module/ui/gameUI/constants/gameUIColors.js +8 -0
  77. package/lib/module/ui/night/nightTheme.js +116 -0
  78. package/lib/module/ui/night/primitives.js +485 -0
  79. package/lib/typescript/commonjs/JsModal.d.ts +18 -0
  80. package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
  81. package/lib/typescript/commonjs/JsModal.web.d.ts +13 -0
  82. package/lib/typescript/commonjs/JsModal.web.d.ts.map +1 -1
  83. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  84. package/lib/typescript/commonjs/dataViewer/diffThemes.d.ts +3 -1
  85. package/lib/typescript/commonjs/dataViewer/diffThemes.d.ts.map +1 -1
  86. package/lib/typescript/commonjs/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
  87. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  88. package/lib/typescript/commonjs/icons/lucide-icons.d.ts +12 -1
  89. package/lib/typescript/commonjs/icons/lucide-icons.d.ts.map +1 -1
  90. package/lib/typescript/commonjs/index.d.ts +3 -0
  91. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  92. package/lib/typescript/commonjs/ui/backgrounds/BackgroundSwitcher.d.ts +26 -6
  93. package/lib/typescript/commonjs/ui/backgrounds/BackgroundSwitcher.d.ts.map +1 -1
  94. package/lib/typescript/commonjs/ui/backgrounds/backgroundStore.d.ts +3 -0
  95. package/lib/typescript/commonjs/ui/backgrounds/backgroundStore.d.ts.map +1 -1
  96. package/lib/typescript/commonjs/ui/backgrounds/index.d.ts +7 -1
  97. package/lib/typescript/commonjs/ui/backgrounds/index.d.ts.map +1 -1
  98. package/lib/typescript/commonjs/ui/backgrounds/primitives.d.ts +18 -3
  99. package/lib/typescript/commonjs/ui/backgrounds/primitives.d.ts.map +1 -1
  100. package/lib/typescript/commonjs/ui/backgrounds/registry.d.ts +8 -0
  101. package/lib/typescript/commonjs/ui/backgrounds/registry.d.ts.map +1 -1
  102. package/lib/typescript/commonjs/ui/backgrounds/rng.d.ts +6 -0
  103. package/lib/typescript/commonjs/ui/backgrounds/rng.d.ts.map +1 -1
  104. package/lib/typescript/commonjs/ui/backgrounds/skyClock.d.ts +17 -0
  105. package/lib/typescript/commonjs/ui/backgrounds/skyClock.d.ts.map +1 -0
  106. package/lib/typescript/commonjs/ui/backgrounds/types.d.ts +1 -1
  107. package/lib/typescript/commonjs/ui/backgrounds/types.d.ts.map +1 -1
  108. package/lib/typescript/commonjs/ui/backgrounds/variants/daylight.d.ts +30 -0
  109. package/lib/typescript/commonjs/ui/backgrounds/variants/daylight.d.ts.map +1 -0
  110. package/lib/typescript/commonjs/ui/backgrounds/variants/deepField.d.ts +19 -4
  111. package/lib/typescript/commonjs/ui/backgrounds/variants/deepField.d.ts.map +1 -1
  112. package/lib/typescript/commonjs/ui/backgrounds/variants/hyperspace.d.ts +39 -0
  113. package/lib/typescript/commonjs/ui/backgrounds/variants/hyperspace.d.ts.map +1 -0
  114. package/lib/typescript/commonjs/ui/backgrounds/variants/liveSky.d.ts +41 -0
  115. package/lib/typescript/commonjs/ui/backgrounds/variants/liveSky.d.ts.map +1 -0
  116. package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts +26 -0
  117. package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts.map +1 -0
  118. package/lib/typescript/commonjs/ui/backgrounds/variants/moonlight.d.ts +35 -0
  119. package/lib/typescript/commonjs/ui/backgrounds/variants/moonlight.d.ts.map +1 -0
  120. package/lib/typescript/commonjs/ui/backgrounds/variants/underwater.d.ts +51 -0
  121. package/lib/typescript/commonjs/ui/backgrounds/variants/underwater.d.ts.map +1 -0
  122. package/lib/typescript/commonjs/ui/components/Badge.d.ts.map +1 -1
  123. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts +3 -1
  124. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts.map +1 -1
  125. package/lib/typescript/commonjs/ui/components/CopyButton.d.ts.map +1 -1
  126. package/lib/typescript/commonjs/ui/components/DevToolsCard.d.ts +3 -1
  127. package/lib/typescript/commonjs/ui/components/DevToolsCard.d.ts.map +1 -1
  128. package/lib/typescript/commonjs/ui/components/DynamicFilterView.d.ts.map +1 -1
  129. package/lib/typescript/commonjs/ui/components/EventStepperFooter.d.ts +2 -0
  130. package/lib/typescript/commonjs/ui/components/EventStepperFooter.d.ts.map +1 -1
  131. package/lib/typescript/commonjs/ui/components/ModalHeader.d.ts.map +1 -1
  132. package/lib/typescript/commonjs/ui/components/StorageTypeBadge.d.ts.map +1 -1
  133. package/lib/typescript/commonjs/ui/components/TabSelector.d.ts +9 -0
  134. package/lib/typescript/commonjs/ui/components/TabSelector.d.ts.map +1 -1
  135. package/lib/typescript/commonjs/ui/components/ValueTypeBadge.d.ts.map +1 -1
  136. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts +4 -2
  137. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts.map +1 -1
  138. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts +8 -0
  139. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  140. package/lib/typescript/commonjs/ui/night/nightTheme.d.ts +113 -0
  141. package/lib/typescript/commonjs/ui/night/nightTheme.d.ts.map +1 -0
  142. package/lib/typescript/commonjs/ui/night/primitives.d.ts +111 -0
  143. package/lib/typescript/commonjs/ui/night/primitives.d.ts.map +1 -0
  144. package/lib/typescript/module/JsModal.d.ts +18 -0
  145. package/lib/typescript/module/JsModal.d.ts.map +1 -1
  146. package/lib/typescript/module/JsModal.web.d.ts +13 -0
  147. package/lib/typescript/module/JsModal.web.d.ts.map +1 -1
  148. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  149. package/lib/typescript/module/dataViewer/diffThemes.d.ts +3 -1
  150. package/lib/typescript/module/dataViewer/diffThemes.d.ts.map +1 -1
  151. package/lib/typescript/module/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
  152. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  153. package/lib/typescript/module/icons/lucide-icons.d.ts +12 -1
  154. package/lib/typescript/module/icons/lucide-icons.d.ts.map +1 -1
  155. package/lib/typescript/module/index.d.ts +3 -0
  156. package/lib/typescript/module/index.d.ts.map +1 -1
  157. package/lib/typescript/module/ui/backgrounds/BackgroundSwitcher.d.ts +26 -6
  158. package/lib/typescript/module/ui/backgrounds/BackgroundSwitcher.d.ts.map +1 -1
  159. package/lib/typescript/module/ui/backgrounds/backgroundStore.d.ts +3 -0
  160. package/lib/typescript/module/ui/backgrounds/backgroundStore.d.ts.map +1 -1
  161. package/lib/typescript/module/ui/backgrounds/index.d.ts +7 -1
  162. package/lib/typescript/module/ui/backgrounds/index.d.ts.map +1 -1
  163. package/lib/typescript/module/ui/backgrounds/primitives.d.ts +18 -3
  164. package/lib/typescript/module/ui/backgrounds/primitives.d.ts.map +1 -1
  165. package/lib/typescript/module/ui/backgrounds/registry.d.ts +8 -0
  166. package/lib/typescript/module/ui/backgrounds/registry.d.ts.map +1 -1
  167. package/lib/typescript/module/ui/backgrounds/rng.d.ts +6 -0
  168. package/lib/typescript/module/ui/backgrounds/rng.d.ts.map +1 -1
  169. package/lib/typescript/module/ui/backgrounds/skyClock.d.ts +17 -0
  170. package/lib/typescript/module/ui/backgrounds/skyClock.d.ts.map +1 -0
  171. package/lib/typescript/module/ui/backgrounds/types.d.ts +1 -1
  172. package/lib/typescript/module/ui/backgrounds/types.d.ts.map +1 -1
  173. package/lib/typescript/module/ui/backgrounds/variants/daylight.d.ts +30 -0
  174. package/lib/typescript/module/ui/backgrounds/variants/daylight.d.ts.map +1 -0
  175. package/lib/typescript/module/ui/backgrounds/variants/deepField.d.ts +19 -4
  176. package/lib/typescript/module/ui/backgrounds/variants/deepField.d.ts.map +1 -1
  177. package/lib/typescript/module/ui/backgrounds/variants/hyperspace.d.ts +39 -0
  178. package/lib/typescript/module/ui/backgrounds/variants/hyperspace.d.ts.map +1 -0
  179. package/lib/typescript/module/ui/backgrounds/variants/liveSky.d.ts +41 -0
  180. package/lib/typescript/module/ui/backgrounds/variants/liveSky.d.ts.map +1 -0
  181. package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts +26 -0
  182. package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts.map +1 -0
  183. package/lib/typescript/module/ui/backgrounds/variants/moonlight.d.ts +35 -0
  184. package/lib/typescript/module/ui/backgrounds/variants/moonlight.d.ts.map +1 -0
  185. package/lib/typescript/module/ui/backgrounds/variants/underwater.d.ts +51 -0
  186. package/lib/typescript/module/ui/backgrounds/variants/underwater.d.ts.map +1 -0
  187. package/lib/typescript/module/ui/components/Badge.d.ts.map +1 -1
  188. package/lib/typescript/module/ui/components/CompactRow.d.ts +3 -1
  189. package/lib/typescript/module/ui/components/CompactRow.d.ts.map +1 -1
  190. package/lib/typescript/module/ui/components/CopyButton.d.ts.map +1 -1
  191. package/lib/typescript/module/ui/components/DevToolsCard.d.ts +3 -1
  192. package/lib/typescript/module/ui/components/DevToolsCard.d.ts.map +1 -1
  193. package/lib/typescript/module/ui/components/DynamicFilterView.d.ts.map +1 -1
  194. package/lib/typescript/module/ui/components/EventStepperFooter.d.ts +2 -0
  195. package/lib/typescript/module/ui/components/EventStepperFooter.d.ts.map +1 -1
  196. package/lib/typescript/module/ui/components/ModalHeader.d.ts.map +1 -1
  197. package/lib/typescript/module/ui/components/StorageTypeBadge.d.ts.map +1 -1
  198. package/lib/typescript/module/ui/components/TabSelector.d.ts +9 -0
  199. package/lib/typescript/module/ui/components/TabSelector.d.ts.map +1 -1
  200. package/lib/typescript/module/ui/components/ValueTypeBadge.d.ts.map +1 -1
  201. package/lib/typescript/module/ui/components/WindowControls.d.ts +4 -2
  202. package/lib/typescript/module/ui/components/WindowControls.d.ts.map +1 -1
  203. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts +8 -0
  204. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  205. package/lib/typescript/module/ui/night/nightTheme.d.ts +113 -0
  206. package/lib/typescript/module/ui/night/nightTheme.d.ts.map +1 -0
  207. package/lib/typescript/module/ui/night/primitives.d.ts +111 -0
  208. package/lib/typescript/module/ui/night/primitives.d.ts.map +1 -0
  209. package/package.json +4 -4
  210. package/lib/commonjs/ui/backgrounds/variants/lattice.js +0 -579
  211. package/lib/commonjs/ui/backgrounds/variants/starfield.js +0 -210
  212. package/lib/module/ui/backgrounds/variants/lattice.js +0 -575
  213. package/lib/module/ui/backgrounds/variants/starfield.js +0 -206
  214. package/lib/typescript/commonjs/ui/backgrounds/variants/lattice.d.ts +0 -33
  215. package/lib/typescript/commonjs/ui/backgrounds/variants/lattice.d.ts.map +0 -1
  216. package/lib/typescript/commonjs/ui/backgrounds/variants/starfield.d.ts +0 -12
  217. package/lib/typescript/commonjs/ui/backgrounds/variants/starfield.d.ts.map +0 -1
  218. package/lib/typescript/module/ui/backgrounds/variants/lattice.d.ts +0 -33
  219. package/lib/typescript/module/ui/backgrounds/variants/lattice.d.ts.map +0 -1
  220. package/lib/typescript/module/ui/backgrounds/variants/starfield.d.ts +0 -12
  221. package/lib/typescript/module/ui/backgrounds/variants/starfield.d.ts.map +0 -1
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Hyperspace — a faithful port of the Everlights `HyperspaceBackground`
5
+ * (components/hyperspace-background.tsx), the Star Wars "lightspeed" field:
6
+ * crisp ROUND points streaming out of a centre vanishing point on the 3D
7
+ * depth projection `screen = plane / z`.
8
+ *
9
+ * THE FIELD IS EXACT: one mulberry32 stream seeded `0x5747 ^ 260`, pulling
10
+ * `ang, rad, z0, tw` per star in the original's call order — same 260 stars,
11
+ * same sqrt-biased radii with the 12% clear centre, same palette pick
12
+ * formula, same z sweep (1.0 → 0.06), same speed (0.55 z-units/sec, the
13
+ * "lightspeed" tuning), same 0.15 + 0.85·near² brightness with 6% fade at
14
+ * both ends of a star's life. Stars are round dots, NOT streaks — the
15
+ * original never elongates anything.
16
+ *
17
+ * HOW THE PROJECTION RUNS WITHOUT SKIA: a star at plane offset p appears at
18
+ * `centre + (p/z)·centre`, so a LAYER scaled by S = 1/z about the centre
19
+ * carries every star along its exact trajectory. The z-sweep becomes scale
20
+ * keyframes on ONE looping value.
21
+ *
22
+ * WHAT COULDN'T COME ACROSS 1:1, and what was done instead:
23
+ *
24
+ * - **Continuous per-star start phase.** Every star has its own `z0`; per
25
+ * star that's 260 nodes. `z0` (and ONLY z0) is quantised into 8 shells —
26
+ * the same single-quantity discipline Deep Field applies to speed.
27
+ * Position, size, colour and brightness stay exact.
28
+ * - **The size CAP.** The original stamps its sprite at `dia = baseDia/z`
29
+ * capped at 4.5×base, but a scaling layer can't cap one star's size
30
+ * mid-flight. Instead each dot is drawn at the sprite's true lit-core
31
+ * size (12.5% of the stamp — 0.45px at z=1), which reaches the original's
32
+ * 2px cap at the cap's own z and only overshoots inside the final 6%
33
+ * fade-out, where brightness is already dying.
34
+ * - **The blurred sprite.** As in Deep Field: a solid core at the lit 12.5%
35
+ * plus one concentric disc at the halo's α0.30 stands in for the blur.
36
+ * - **Additive blend + the 5% twinkle** are dropped; over near-black at this
37
+ * density neither reads.
38
+ */
39
+
40
+ import { memo } from "react";
41
+ import { Animated, View } from "react-native";
42
+ import { absoluteFill } from "../../../utils/absoluteFill.js";
43
+ import { Base, RasterLayer, Vignette, useLoop } from "../primitives.js";
44
+ import { mulberry32, withAlpha } from "../rng.js";
45
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
46
+ const BASE_COLOR = "#050505";
47
+
48
+ // ---------------------------------------------------------------------------
49
+ // The original's constants, verbatim (variant 1, "lightspeed").
50
+ // ---------------------------------------------------------------------------
51
+ const COUNT = 260;
52
+ const SPEED = 0.55; // z-units/sec → one life = 1/0.55 s
53
+ const BASE_DIA = 3.6; // sprite diameter px at z=1
54
+ const PLANE = 0.5;
55
+ const Z_FAR = 1.0;
56
+ const Z_NEAR = 0.06;
57
+ const Z_SPAN = Z_FAR - Z_NEAR;
58
+ /** The lit core of the 64px sprite is r=4 → 12.5% of the stamp. */
59
+ const CORE_FRAC = 0.125;
60
+ const CYCLE_MS = Math.round(1000 / SPEED);
61
+ const PALETTE = ["#FFFFFF", "#B3D9FF", "#8CB3FF"];
62
+ const SHELLS = 8;
63
+ /**
64
+ * The original field, regenerated — ONE rng stream, original call order
65
+ * (ang, rad, z0, tw per star), original seed. Any other order or seed is a
66
+ * different sky.
67
+ */
68
+ function buildField() {
69
+ const rnd = mulberry32((0x5747 ^ COUNT) >>> 0);
70
+ const stars = [];
71
+ for (let i = 0; i < COUNT; i++) {
72
+ const ang = rnd() * Math.PI * 2;
73
+ // sqrt-biased outward, inner 12% clear of the vanishing point.
74
+ const rad = (0.12 + 0.88 * Math.sqrt(rnd())) * PLANE;
75
+ const z0 = rnd();
76
+ const tw = rnd() * Math.PI * 2;
77
+ stars.push({
78
+ px: Math.cos(ang) * rad,
79
+ py: Math.sin(ang) * rad,
80
+ shell: Math.min(SHELLS - 1, Math.floor(z0 * SHELLS)),
81
+ // The original's exact (quirky) pick: floor((tw·0.5 + 0.5)·n) % n.
82
+ color: PALETTE[Math.floor((tw * 0.5 + 0.5) * PALETTE.length) % PALETTE.length]
83
+ });
84
+ }
85
+ return stars;
86
+ }
87
+ const FIELD = buildField();
88
+
89
+ /** S(p) = 1/z with z falling linearly over the phase — the projection. */
90
+ function scaleAt(p) {
91
+ return 1 / (Z_FAR - p * Z_SPAN);
92
+ }
93
+
94
+ /** The original's brightness: 0.15 + 0.85·near², faded over the first and
95
+ * last 6% of a star's life (which also hides the shell's wrap snap). */
96
+ function opacityAt(p) {
97
+ let bright = 0.15 + 0.85 * p * p;
98
+ if (p < 0.06) bright *= p / 0.06;else if (p > 0.94) bright *= (1 - p) / 0.06;
99
+ return Math.min(1, bright);
100
+ }
101
+
102
+ /** Interpolate stops for shell k (phase = (v + k/K) mod 1); the wrap point is
103
+ * double-sampled 1e-4 apart inside the zero-opacity sliver. */
104
+ function shellStops(k) {
105
+ const offset = k / SHELLS;
106
+ const vs = [];
107
+ const SEGMENTS = 18;
108
+ for (let i = 0; i <= SEGMENTS; i++) vs.push(i / SEGMENTS);
109
+ const vWrap = (1 - offset) % 1;
110
+ if (vWrap > 1e-3 && vWrap < 1 - 1e-3) vs.push(vWrap - 1e-4, vWrap + 1e-4);
111
+ vs.sort((a, b) => a - b);
112
+ const input = [];
113
+ const scale = [];
114
+ const opacity = [];
115
+ for (const v of vs) {
116
+ // At the loop boundary the offset-0 shell's phase must read as END of
117
+ // life (p=1, max scale, zero opacity), not wrap to 0 — otherwise the
118
+ // last segment lerps scale back to 1 at visible opacity and the stars
119
+ // retract to the centre once per cycle.
120
+ const p = offset === 0 && v === 1 ? 1 : (v + offset) % 1;
121
+ input.push(v);
122
+ scale.push(scaleAt(p));
123
+ opacity.push(opacityAt(p));
124
+ }
125
+ return {
126
+ input,
127
+ scale,
128
+ opacity
129
+ };
130
+ }
131
+ const SHELL_STOPS = Array.from({
132
+ length: SHELLS
133
+ }, (_, k) => shellStops(k));
134
+ export const Hyperspace = /*#__PURE__*/memo(function Hyperspace({
135
+ width,
136
+ height,
137
+ animated
138
+ }) {
139
+ const drive = useLoop(CYCLE_MS, animated);
140
+ const cx = width / 2;
141
+ const cy = height / 2;
142
+
143
+ // Core at the sprite's lit 12.5% (0.45px at z=1) with a floor so the far
144
+ // stars land on a pixel; halo disc at the sprite's α0.30, 2.4× the core.
145
+ const core = Math.max(0.5, BASE_DIA * CORE_FRAC);
146
+ const halo = core * 2.4;
147
+ const shells = [];
148
+ for (let k = 0; k < SHELLS; k++) {
149
+ const stops = SHELL_STOPS[k];
150
+ const stars = [];
151
+ for (let i = 0; i < FIELD.length; i++) {
152
+ const star = FIELD[i];
153
+ if (star.shell !== k) continue;
154
+ // The original's projection at z=1: sx = cx + px·cx, sy = cy + py·cy
155
+ // (offsets scale with the HALF-extent — elliptical, exactly as there).
156
+ const x = cx + star.px * cx;
157
+ const y = cy + star.py * cy;
158
+ stars.push(/*#__PURE__*/_jsx(View, {
159
+ style: {
160
+ position: "absolute",
161
+ left: x - halo / 2,
162
+ top: y - halo / 2,
163
+ width: halo,
164
+ height: halo,
165
+ borderRadius: halo / 2,
166
+ backgroundColor: withAlpha(star.color, 0.3)
167
+ }
168
+ }, `${i}-h`), /*#__PURE__*/_jsx(View, {
169
+ style: {
170
+ position: "absolute",
171
+ left: x - core / 2,
172
+ top: y - core / 2,
173
+ width: core,
174
+ height: core,
175
+ borderRadius: core / 2,
176
+ backgroundColor: star.color
177
+ }
178
+ }, i));
179
+ }
180
+ shells.push(/*#__PURE__*/_jsx(Animated.View, {
181
+ style: [absoluteFill, {
182
+ opacity: drive.interpolate({
183
+ inputRange: stops.input,
184
+ outputRange: stops.opacity
185
+ }),
186
+ transform: [{
187
+ scale: drive.interpolate({
188
+ inputRange: stops.input,
189
+ outputRange: stops.scale
190
+ })
191
+ }]
192
+ }],
193
+ pointerEvents: "none",
194
+ children: /*#__PURE__*/_jsx(RasterLayer, {
195
+ style: absoluteFill,
196
+ raster: false,
197
+ children: stars
198
+ })
199
+ }, k));
200
+ }
201
+ return /*#__PURE__*/_jsxs(View, {
202
+ style: [absoluteFill, {
203
+ overflow: "hidden"
204
+ }],
205
+ pointerEvents: "none",
206
+ children: [/*#__PURE__*/_jsx(Base, {
207
+ color: BASE_COLOR
208
+ }), shells, /*#__PURE__*/_jsx(Vignette, {
209
+ color: "#000000",
210
+ alpha: 0.3,
211
+ spread: 0.3
212
+ })]
213
+ });
214
+ });