@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,468 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Moonlight — moon over a still sea, the glade shimmering below.
5
+ *
6
+ * Composed like the pixel-art seascape it's modelled on: a night-sky
7
+ * gradient with breathing stars, cloud banks with moonlit top edges, a
8
+ * cratered moon in a TIGHT bloom (many rings at steep falloff — a big
9
+ * 8-ring glow shows its rings as visible circles), mountain silhouettes with
10
+ * a few shore lights on the horizon, and a glade built from chunky
11
+ * row-quantized water blocks — brightest mid-glade, thinning at the horizon
12
+ * and toward the viewer.
13
+ *
14
+ * Same contract as ../README.md: native-driven loops only, static geometry
15
+ * rasterized, scatter tables at module load, geometry sized from the WINDOW
16
+ * (never the modal — resizing crops, it doesn't stretch). Per-dash rands come
17
+ * off ONE stream in a fixed stride (the Deep Field lesson).
18
+ */
19
+
20
+ import { memo } from "react";
21
+ import { Animated, Dimensions, View } from "react-native";
22
+ import { absoluteFill } from "../../../utils/absoluteFill.js";
23
+ import { Base, LinearFade, RadialGlow, RasterLayer, Vignette, usePulse } from "../primitives.js";
24
+ import { scatter, withAlpha } from "../rng.js";
25
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
26
+ const BASE_COLOR = "#040609";
27
+ const HORIZON = 0.46;
28
+ const MOON_X = 0.72;
29
+ const MOON_Y = 0.17;
30
+ const MOON_DIA = 56;
31
+
32
+ /** Craters as fractions of the moon: [dx, dy, dia] of MOON_DIA. */
33
+ const CRATERS = [[0.24, -0.12, 0.2], [-0.16, 0.2, 0.13], [0.08, 0.06, 0.1]];
34
+
35
+ /** Stride 3: x, y, size. */
36
+ const SKY_STAR_COUNT = 22;
37
+ const SKY_STARS = scatter(0x52b7, SKY_STAR_COUNT * 3);
38
+
39
+ // ============================================================================
40
+ // Clouds — dark banks with a moonlit top edge
41
+ // ============================================================================
42
+
43
+ /**
44
+ * A cloud is a row of overlapping ellipses; the lit rim is the SAME puffs in
45
+ * a lighter colour, drawn first and offset up toward the moon, so the body
46
+ * occludes all of it except a moonlit sliver along the top.
47
+ */
48
+
49
+ const CLOUDS = [{
50
+ at: [0.16, 0.3],
51
+ puffs: [[-62, 4, 150, 20], [-44, -8, 62, 24], [-4, -14, 74, 30], [38, -4, 54, 20]],
52
+ rim: [4, -3.5],
53
+ bodyAlpha: 0.94
54
+ }, {
55
+ at: [0.84, 0.37],
56
+ puffs: [[-55, 3, 130, 18], [-30, -8, 56, 22], [8, -13, 64, 27], [42, -3, 44, 17]],
57
+ rim: [-2, -4],
58
+ bodyAlpha: 0.94
59
+ }, {
60
+ at: [0.46, 0.425],
61
+ puffs: [[-40, 2, 96, 13], [-12, -6, 48, 16], [22, -2, 38, 12]],
62
+ rim: [3, -3],
63
+ bodyAlpha: 0.9
64
+ }];
65
+ function cloudPuffs(cloud, cx, cy, key) {
66
+ const parts = [];
67
+ // Pass 1: the lit rim (drawn first, mostly hidden by the body).
68
+ for (let i = 0; i < cloud.puffs.length; i++) {
69
+ const [dx, dy, w, h] = cloud.puffs[i];
70
+ parts.push(/*#__PURE__*/_jsx(View, {
71
+ style: {
72
+ position: "absolute",
73
+ left: cx + dx + cloud.rim[0] - w / 2,
74
+ top: cy + dy + cloud.rim[1] - h / 2,
75
+ width: w,
76
+ height: h,
77
+ borderRadius: h / 2,
78
+ backgroundColor: withAlpha("#1D2A42", 0.35)
79
+ }
80
+ }, `${key}-r${i}`));
81
+ }
82
+ // Pass 2: the body.
83
+ for (let i = 0; i < cloud.puffs.length; i++) {
84
+ const [dx, dy, w, h] = cloud.puffs[i];
85
+ parts.push(/*#__PURE__*/_jsx(View, {
86
+ style: {
87
+ position: "absolute",
88
+ left: cx + dx - w / 2,
89
+ top: cy + dy - h / 2,
90
+ width: w,
91
+ height: h,
92
+ borderRadius: h / 2,
93
+ backgroundColor: withAlpha("#070D18", cloud.bodyAlpha)
94
+ }
95
+ }, `${key}-b${i}`));
96
+ }
97
+ return parts;
98
+ }
99
+
100
+ // ============================================================================
101
+ // Mountains — silhouette range on the horizon
102
+ // ============================================================================
103
+
104
+ /** [xFrac, base width, height, color] — border-trick triangles. */
105
+ const PEAKS = [[0.03, 120, 24, "#030609"], [0.11, 96, 36, "#020408"], [0.2, 140, 24, "#030609"], [0.29, 76, 15, "#020408"], [0.9, 96, 18, "#030609"], [0.98, 130, 27, "#020408"]];
106
+
107
+ /** Tiny warm shore lights at the foot of the range: xFrac positions. */
108
+ const SHORE_LIGHTS = [0.06, 0.13, 0.18, 0.26];
109
+
110
+ // ============================================================================
111
+ // Water blocks — the glade
112
+ // ============================================================================
113
+
114
+ /** Stride 4: depth, x jitter, width jitter, alpha jitter. */
115
+ const GLADE_LAYERS = [{
116
+ count: 44,
117
+ seed: 0x3aa1
118
+ }, {
119
+ count: 34,
120
+ seed: 0x77c2
121
+ }, {
122
+ count: 26,
123
+ seed: 0xb4e9
124
+ }];
125
+ const GLADE_TABLES = GLADE_LAYERS.map(l => scatter(l.seed, l.count * 4));
126
+
127
+ /** Quantizing block rows to this grid is what makes them read as ripples. */
128
+ const ROW_STEP = 7;
129
+ const GladeLayer = /*#__PURE__*/memo(function GladeLayer({
130
+ indices,
131
+ drive,
132
+ scale,
133
+ raster,
134
+ width,
135
+ height,
136
+ animated
137
+ }) {
138
+ const sway = usePulse(drive === "swayA" ? 9000 : 12500, animated && drive !== "breathe");
139
+ const breathe = usePulse(6200, animated && drive === "breathe");
140
+ const moonX = width * MOON_X;
141
+ const horizonY = height * HORIZON;
142
+ const blocks = [];
143
+ for (const li of indices) {
144
+ const layer = GLADE_LAYERS[li];
145
+ const count = Math.round(layer.count * scale);
146
+ // Shipping scale reads the module-load table; an amplified scale (bench
147
+ // only) draws a longer stream from the same seed.
148
+ const table = scale === 1 ? GLADE_TABLES[li] : scatter(layer.seed, count * 4);
149
+ for (let i = 0; i < count; i++) {
150
+ const d = table[i * 4];
151
+ const jx = table[i * 4 + 1];
152
+ const jw = table[i * 4 + 2];
153
+ const ja = table[i * 4 + 3];
154
+ const y = horizonY + 4 + d * (height - horizonY) * 0.94;
155
+ const halfSpread = width * (0.03 + d * 0.16);
156
+ const x = moonX + (jx - 0.5) * 2 * halfSpread;
157
+ const blockW = 6 + d * 26 + jw * 10;
158
+ const blockH = d < 0.3 ? 1 : d < 0.62 ? 2 : 3;
159
+ // Brightest mid-glade and along the centre line, dimmer at the horizon
160
+ // and toward the viewer — the shape of a real moonglade.
161
+ const arc = Math.sin(Math.PI * (0.12 + d * 0.82));
162
+ const centered = Math.max(0.25, 1 - Math.abs(jx - 0.5) * 1.4);
163
+ const alpha = (0.16 + arc * 0.48) * centered * (0.75 + ja * 0.25);
164
+ blocks.push(/*#__PURE__*/_jsx(View, {
165
+ style: {
166
+ position: "absolute",
167
+ left: x - blockW / 2,
168
+ top: Math.round(y / ROW_STEP) * ROW_STEP,
169
+ width: blockW,
170
+ height: blockH,
171
+ borderRadius: 0.5,
172
+ backgroundColor: withAlpha("#CFE0F4", alpha)
173
+ }
174
+ }, `${li}-${i}`));
175
+ }
176
+ }
177
+ const style = drive === "breathe" ? {
178
+ opacity: breathe.interpolate({
179
+ inputRange: [0, 1],
180
+ outputRange: [0.55, 1]
181
+ })
182
+ } : {
183
+ transform: [{
184
+ translateX: sway.interpolate({
185
+ inputRange: [0, 1],
186
+ outputRange: drive === "swayA" ? [-7, 7] : [6, -6]
187
+ })
188
+ }]
189
+ };
190
+ return /*#__PURE__*/_jsx(Animated.View, {
191
+ style: [absoluteFill, style],
192
+ pointerEvents: "none",
193
+ children: /*#__PURE__*/_jsx(RasterLayer, {
194
+ style: absoluteFill,
195
+ raster: raster,
196
+ children: blocks
197
+ })
198
+ });
199
+ });
200
+
201
+ // ============================================================================
202
+ // The scene
203
+ // ============================================================================
204
+
205
+ /**
206
+ * The tunable body. `Moonlight` below is this with the shipping defaults; the
207
+ * bench route (`example-dev-build/app/bg-bench.tsx`) drives the knobs so every
208
+ * measured variant is this exact code, not a copy of it.
209
+ */
210
+ export const MoonlightTunable = /*#__PURE__*/memo(function MoonlightTunable({
211
+ gladeScale = 1,
212
+ fusedGlade = false,
213
+ raster = true,
214
+ chrome = true,
215
+ ...props
216
+ }) {
217
+ const {
218
+ width,
219
+ height,
220
+ animated
221
+ } = props;
222
+ const twinkle = usePulse(7400, animated);
223
+ const cloudDrift = usePulse(26000, animated);
224
+ const starOpacity = twinkle.interpolate({
225
+ inputRange: [0, 1],
226
+ outputRange: [0.7, 1]
227
+ });
228
+ const cloudX = cloudDrift.interpolate({
229
+ inputRange: [0, 1],
230
+ outputRange: [-8, 8]
231
+ });
232
+ const moonX = width * MOON_X;
233
+ const moonY = height * MOON_Y;
234
+ const horizonY = height * HORIZON;
235
+ // Light geometry is sized from the WINDOW so resizing the modal never
236
+ // swells or shrinks the moon's bloom — only positions follow the modal.
237
+ const refW = Dimensions.get("window").width;
238
+ const stars = [];
239
+ for (let i = 0; i < SKY_STAR_COUNT; i++) {
240
+ const size = SKY_STARS[i * 3 + 2];
241
+ const dia = 1 + size * 1.3;
242
+ const x = SKY_STARS[i * 3] * width;
243
+ const y = SKY_STARS[i * 3 + 1] * horizonY * 0.92;
244
+ // Keep the sky clear right around the moon so its bloom stays clean.
245
+ if (Math.hypot(x - moonX, y - moonY) < refW * 0.18) continue;
246
+ stars.push(/*#__PURE__*/_jsx(View, {
247
+ style: {
248
+ position: "absolute",
249
+ left: x - dia / 2,
250
+ top: y - dia / 2,
251
+ width: dia,
252
+ height: dia,
253
+ borderRadius: dia / 2,
254
+ backgroundColor: withAlpha("#C9DAF0", 0.3 + size * 0.4)
255
+ }
256
+ }, i));
257
+ }
258
+ const clouds = CLOUDS.flatMap((cloud, i) => cloudPuffs(cloud, width * cloud.at[0], height * cloud.at[1], `c${i}`));
259
+ const mountains = PEAKS.map(([xf, wBase, h, color], i) => /*#__PURE__*/_jsx(View, {
260
+ style: {
261
+ position: "absolute",
262
+ left: width * xf - wBase / 2,
263
+ top: horizonY - h,
264
+ width: 0,
265
+ height: 0,
266
+ borderLeftWidth: wBase / 2,
267
+ borderRightWidth: wBase / 2,
268
+ borderBottomWidth: h,
269
+ borderLeftColor: "transparent",
270
+ borderRightColor: "transparent",
271
+ borderBottomColor: color
272
+ }
273
+ }, `m${i}`));
274
+ const lights = SHORE_LIGHTS.map((xf, i) => /*#__PURE__*/_jsx(View, {
275
+ style: {
276
+ position: "absolute",
277
+ left: width * xf,
278
+ top: horizonY - 3,
279
+ width: 2,
280
+ height: 1.5,
281
+ backgroundColor: withAlpha("#E8D9A8", 0.55 + i % 2 * 0.2)
282
+ }
283
+ }, `sl${i}`));
284
+ return (
285
+ /*#__PURE__*/
286
+ // Clips: the blooms are window-sized, so a small modal crops the scene.
287
+ _jsxs(View, {
288
+ style: [absoluteFill, {
289
+ overflow: "hidden"
290
+ }],
291
+ pointerEvents: "none",
292
+ children: [/*#__PURE__*/_jsx(Base, {
293
+ color: BASE_COLOR
294
+ }), /*#__PURE__*/_jsx(View, {
295
+ style: {
296
+ position: "absolute",
297
+ left: 0,
298
+ right: 0,
299
+ top: 0,
300
+ height: horizonY
301
+ },
302
+ children: /*#__PURE__*/_jsx(LinearFade, {
303
+ color: "#0A1424",
304
+ from: 0.45,
305
+ to: 0,
306
+ direction: "down",
307
+ bands: 20,
308
+ flattenBase: BASE_COLOR
309
+ })
310
+ }), /*#__PURE__*/_jsx(Animated.View, {
311
+ style: [absoluteFill, {
312
+ opacity: starOpacity
313
+ }],
314
+ pointerEvents: "none",
315
+ children: /*#__PURE__*/_jsx(RasterLayer, {
316
+ style: absoluteFill,
317
+ children: stars
318
+ })
319
+ }), /*#__PURE__*/_jsx(Animated.View, {
320
+ style: [absoluteFill, {
321
+ transform: [{
322
+ translateX: cloudX
323
+ }]
324
+ }],
325
+ pointerEvents: "none",
326
+ children: /*#__PURE__*/_jsx(RasterLayer, {
327
+ style: absoluteFill,
328
+ children: clouds
329
+ })
330
+ }), /*#__PURE__*/_jsx(RadialGlow, {
331
+ size: refW * 0.44,
332
+ color: "#A9C2DE",
333
+ alpha: 0.15,
334
+ rings: 20,
335
+ falloff: 1.9,
336
+ style: {
337
+ position: "absolute",
338
+ left: moonX - refW * 0.22,
339
+ top: moonY - refW * 0.22
340
+ }
341
+ }), /*#__PURE__*/_jsx(RadialGlow, {
342
+ size: 116,
343
+ color: "#DCE8F6",
344
+ alpha: 0.34,
345
+ rings: 10,
346
+ falloff: 1.6,
347
+ style: {
348
+ position: "absolute",
349
+ left: moonX - 58,
350
+ top: moonY - 58
351
+ }
352
+ }), /*#__PURE__*/_jsx(View, {
353
+ style: {
354
+ position: "absolute",
355
+ left: moonX - MOON_DIA / 2,
356
+ top: moonY - MOON_DIA / 2,
357
+ width: MOON_DIA,
358
+ height: MOON_DIA,
359
+ borderRadius: MOON_DIA / 2,
360
+ // Fully opaque: any translucency lets the app behind the modal
361
+ // bleed through the brightest surface in the scene.
362
+ backgroundColor: "#EDF3FB",
363
+ overflow: "hidden"
364
+ },
365
+ children: CRATERS.map(([dx, dy, frac], i) => {
366
+ const d = MOON_DIA * frac;
367
+ return /*#__PURE__*/_jsx(View, {
368
+ style: {
369
+ position: "absolute",
370
+ left: MOON_DIA / 2 + dx * MOON_DIA - d / 2,
371
+ top: MOON_DIA / 2 + dy * MOON_DIA - d / 2,
372
+ width: d,
373
+ height: d,
374
+ borderRadius: d / 2,
375
+ backgroundColor: withAlpha("#9DB2C8", 0.32)
376
+ }
377
+ }, i);
378
+ })
379
+ }), chrome ? /*#__PURE__*/_jsx(View, {
380
+ style: {
381
+ position: "absolute",
382
+ left: 0,
383
+ right: 0,
384
+ top: horizonY - 76,
385
+ height: 76
386
+ },
387
+ children: /*#__PURE__*/_jsx(LinearFade, {
388
+ color: "#17293F",
389
+ from: 0,
390
+ to: 0.28,
391
+ direction: "down",
392
+ bands: 12
393
+ })
394
+ }) : null, /*#__PURE__*/_jsxs(RasterLayer, {
395
+ style: absoluteFill,
396
+ children: [mountains, lights]
397
+ }), /*#__PURE__*/_jsx(View, {
398
+ style: {
399
+ position: "absolute",
400
+ left: 0,
401
+ right: 0,
402
+ top: horizonY,
403
+ height: 1,
404
+ backgroundColor: withAlpha("#9FB8D4", 0.12)
405
+ }
406
+ }), /*#__PURE__*/_jsx(View, {
407
+ style: {
408
+ position: "absolute",
409
+ left: moonX - width * 0.16,
410
+ top: horizonY,
411
+ width: width * 0.32,
412
+ height: 1,
413
+ backgroundColor: withAlpha("#C6DAF0", 0.32)
414
+ }
415
+ }), chrome ? /*#__PURE__*/_jsx(View, {
416
+ style: {
417
+ position: "absolute",
418
+ left: 0,
419
+ right: 0,
420
+ top: horizonY,
421
+ bottom: 0
422
+ },
423
+ children: /*#__PURE__*/_jsx(LinearFade, {
424
+ color: "#010409",
425
+ from: 0,
426
+ to: 0.5,
427
+ direction: "down",
428
+ bands: 12
429
+ })
430
+ }) : null, fusedGlade ? /*#__PURE__*/_jsx(GladeLayer, {
431
+ indices: [0, 1, 2],
432
+ drive: "swayA",
433
+ scale: gladeScale,
434
+ raster: raster,
435
+ ...props
436
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
437
+ children: [/*#__PURE__*/_jsx(GladeLayer, {
438
+ indices: [0],
439
+ drive: "swayA",
440
+ scale: gladeScale,
441
+ raster: raster,
442
+ ...props
443
+ }), /*#__PURE__*/_jsx(GladeLayer, {
444
+ indices: [1],
445
+ drive: "swayB",
446
+ scale: gladeScale,
447
+ raster: raster,
448
+ ...props
449
+ }), /*#__PURE__*/_jsx(GladeLayer, {
450
+ indices: [2],
451
+ drive: "breathe",
452
+ scale: gladeScale,
453
+ raster: raster,
454
+ ...props
455
+ })]
456
+ }), chrome ? /*#__PURE__*/_jsx(Vignette, {
457
+ color: "#020305",
458
+ alpha: 0.42,
459
+ spread: 0.34
460
+ }) : null]
461
+ })
462
+ );
463
+ });
464
+ export const Moonlight = /*#__PURE__*/memo(function Moonlight(props) {
465
+ return /*#__PURE__*/_jsx(MoonlightTunable, {
466
+ ...props
467
+ });
468
+ });