@buoy-gg/shared-ui 7.0.25 → 7.0.27

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 (209) 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 +30 -17
  26. package/lib/commonjs/ui/components/DevToolsCard.js +12 -8
  27. package/lib/commonjs/ui/components/DynamicFilterView.js +43 -41
  28. package/lib/commonjs/ui/components/EventStepperFooter.js +38 -10
  29. package/lib/commonjs/ui/components/FilterComponents.js +11 -11
  30. package/lib/commonjs/ui/components/ModalHeader.js +13 -13
  31. package/lib/commonjs/ui/components/SectionHeader.js +3 -1
  32. package/lib/commonjs/ui/components/StorageTypeBadge.js +3 -2
  33. package/lib/commonjs/ui/components/TabSelector.js +56 -38
  34. package/lib/commonjs/ui/components/ValueTypeBadge.js +7 -6
  35. package/lib/commonjs/ui/components/WindowControls.js +37 -10
  36. package/lib/commonjs/ui/gameUI/constants/gameUIColors.js +8 -0
  37. package/lib/commonjs/ui/night/nightTheme.js +120 -0
  38. package/lib/commonjs/ui/night/primitives.js +498 -0
  39. package/lib/module/JsModal.js +156 -20
  40. package/lib/module/JsModal.web.js +83 -39
  41. package/lib/module/dataViewer/VirtualizedDataExplorer.js +14 -4
  42. package/lib/module/dataViewer/diffThemes.js +20 -18
  43. package/lib/module/dataViewer/tree/TreeDiffViewer.js +9 -9
  44. package/lib/module/hooks/safe-area-impl.js +1 -1
  45. package/lib/module/icons/lucide-icons.js +74 -15
  46. package/lib/module/index.js +4 -0
  47. package/lib/module/ui/backgrounds/BackgroundSwitcher.js +250 -76
  48. package/lib/module/ui/backgrounds/README.md +102 -20
  49. package/lib/module/ui/backgrounds/backgroundStore.js +19 -5
  50. package/lib/module/ui/backgrounds/index.js +11 -2
  51. package/lib/module/ui/backgrounds/primitives.js +53 -16
  52. package/lib/module/ui/backgrounds/registry.js +41 -64
  53. package/lib/module/ui/backgrounds/rng.js +20 -0
  54. package/lib/module/ui/backgrounds/skyClock.js +39 -0
  55. package/lib/module/ui/backgrounds/variants/daylight.js +449 -0
  56. package/lib/module/ui/backgrounds/variants/deepField.js +62 -31
  57. package/lib/module/ui/backgrounds/variants/hyperspace.js +214 -0
  58. package/lib/module/ui/backgrounds/variants/liveSky.js +893 -0
  59. package/lib/module/ui/backgrounds/variants/meteors.js +253 -0
  60. package/lib/module/ui/backgrounds/variants/moonlight.js +468 -0
  61. package/lib/module/ui/backgrounds/variants/underwater.js +753 -0
  62. package/lib/module/ui/components/Badge.js +11 -10
  63. package/lib/module/ui/components/CompactRow.js +30 -17
  64. package/lib/module/ui/components/DevToolsCard.js +12 -8
  65. package/lib/module/ui/components/DynamicFilterView.js +43 -41
  66. package/lib/module/ui/components/EventStepperFooter.js +38 -10
  67. package/lib/module/ui/components/FilterComponents.js +11 -11
  68. package/lib/module/ui/components/ModalHeader.js +13 -13
  69. package/lib/module/ui/components/SectionHeader.js +3 -1
  70. package/lib/module/ui/components/StorageTypeBadge.js +3 -2
  71. package/lib/module/ui/components/TabSelector.js +57 -39
  72. package/lib/module/ui/components/ValueTypeBadge.js +7 -6
  73. package/lib/module/ui/components/WindowControls.js +37 -10
  74. package/lib/module/ui/gameUI/constants/gameUIColors.js +8 -0
  75. package/lib/module/ui/night/nightTheme.js +116 -0
  76. package/lib/module/ui/night/primitives.js +485 -0
  77. package/lib/typescript/commonjs/JsModal.d.ts +18 -0
  78. package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
  79. package/lib/typescript/commonjs/JsModal.web.d.ts +13 -0
  80. package/lib/typescript/commonjs/JsModal.web.d.ts.map +1 -1
  81. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  82. package/lib/typescript/commonjs/dataViewer/diffThemes.d.ts +3 -1
  83. package/lib/typescript/commonjs/dataViewer/diffThemes.d.ts.map +1 -1
  84. package/lib/typescript/commonjs/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
  85. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  86. package/lib/typescript/commonjs/icons/lucide-icons.d.ts +12 -1
  87. package/lib/typescript/commonjs/icons/lucide-icons.d.ts.map +1 -1
  88. package/lib/typescript/commonjs/index.d.ts +3 -0
  89. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  90. package/lib/typescript/commonjs/ui/backgrounds/BackgroundSwitcher.d.ts +26 -6
  91. package/lib/typescript/commonjs/ui/backgrounds/BackgroundSwitcher.d.ts.map +1 -1
  92. package/lib/typescript/commonjs/ui/backgrounds/backgroundStore.d.ts +3 -0
  93. package/lib/typescript/commonjs/ui/backgrounds/backgroundStore.d.ts.map +1 -1
  94. package/lib/typescript/commonjs/ui/backgrounds/index.d.ts +7 -1
  95. package/lib/typescript/commonjs/ui/backgrounds/index.d.ts.map +1 -1
  96. package/lib/typescript/commonjs/ui/backgrounds/primitives.d.ts +18 -3
  97. package/lib/typescript/commonjs/ui/backgrounds/primitives.d.ts.map +1 -1
  98. package/lib/typescript/commonjs/ui/backgrounds/registry.d.ts +8 -0
  99. package/lib/typescript/commonjs/ui/backgrounds/registry.d.ts.map +1 -1
  100. package/lib/typescript/commonjs/ui/backgrounds/rng.d.ts +6 -0
  101. package/lib/typescript/commonjs/ui/backgrounds/rng.d.ts.map +1 -1
  102. package/lib/typescript/commonjs/ui/backgrounds/skyClock.d.ts +17 -0
  103. package/lib/typescript/commonjs/ui/backgrounds/skyClock.d.ts.map +1 -0
  104. package/lib/typescript/commonjs/ui/backgrounds/types.d.ts +1 -1
  105. package/lib/typescript/commonjs/ui/backgrounds/types.d.ts.map +1 -1
  106. package/lib/typescript/commonjs/ui/backgrounds/variants/daylight.d.ts +30 -0
  107. package/lib/typescript/commonjs/ui/backgrounds/variants/daylight.d.ts.map +1 -0
  108. package/lib/typescript/commonjs/ui/backgrounds/variants/deepField.d.ts +19 -4
  109. package/lib/typescript/commonjs/ui/backgrounds/variants/deepField.d.ts.map +1 -1
  110. package/lib/typescript/commonjs/ui/backgrounds/variants/hyperspace.d.ts +39 -0
  111. package/lib/typescript/commonjs/ui/backgrounds/variants/hyperspace.d.ts.map +1 -0
  112. package/lib/typescript/commonjs/ui/backgrounds/variants/liveSky.d.ts +41 -0
  113. package/lib/typescript/commonjs/ui/backgrounds/variants/liveSky.d.ts.map +1 -0
  114. package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts +26 -0
  115. package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts.map +1 -0
  116. package/lib/typescript/commonjs/ui/backgrounds/variants/moonlight.d.ts +35 -0
  117. package/lib/typescript/commonjs/ui/backgrounds/variants/moonlight.d.ts.map +1 -0
  118. package/lib/typescript/commonjs/ui/backgrounds/variants/underwater.d.ts +51 -0
  119. package/lib/typescript/commonjs/ui/backgrounds/variants/underwater.d.ts.map +1 -0
  120. package/lib/typescript/commonjs/ui/components/Badge.d.ts.map +1 -1
  121. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts.map +1 -1
  122. package/lib/typescript/commonjs/ui/components/DynamicFilterView.d.ts.map +1 -1
  123. package/lib/typescript/commonjs/ui/components/EventStepperFooter.d.ts +2 -0
  124. package/lib/typescript/commonjs/ui/components/EventStepperFooter.d.ts.map +1 -1
  125. package/lib/typescript/commonjs/ui/components/StorageTypeBadge.d.ts.map +1 -1
  126. package/lib/typescript/commonjs/ui/components/TabSelector.d.ts +9 -0
  127. package/lib/typescript/commonjs/ui/components/TabSelector.d.ts.map +1 -1
  128. package/lib/typescript/commonjs/ui/components/ValueTypeBadge.d.ts.map +1 -1
  129. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts +4 -2
  130. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts.map +1 -1
  131. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts +8 -0
  132. package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  133. package/lib/typescript/commonjs/ui/night/nightTheme.d.ts +113 -0
  134. package/lib/typescript/commonjs/ui/night/nightTheme.d.ts.map +1 -0
  135. package/lib/typescript/commonjs/ui/night/primitives.d.ts +111 -0
  136. package/lib/typescript/commonjs/ui/night/primitives.d.ts.map +1 -0
  137. package/lib/typescript/module/JsModal.d.ts +18 -0
  138. package/lib/typescript/module/JsModal.d.ts.map +1 -1
  139. package/lib/typescript/module/JsModal.web.d.ts +13 -0
  140. package/lib/typescript/module/JsModal.web.d.ts.map +1 -1
  141. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  142. package/lib/typescript/module/dataViewer/diffThemes.d.ts +3 -1
  143. package/lib/typescript/module/dataViewer/diffThemes.d.ts.map +1 -1
  144. package/lib/typescript/module/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
  145. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  146. package/lib/typescript/module/icons/lucide-icons.d.ts +12 -1
  147. package/lib/typescript/module/icons/lucide-icons.d.ts.map +1 -1
  148. package/lib/typescript/module/index.d.ts +3 -0
  149. package/lib/typescript/module/index.d.ts.map +1 -1
  150. package/lib/typescript/module/ui/backgrounds/BackgroundSwitcher.d.ts +26 -6
  151. package/lib/typescript/module/ui/backgrounds/BackgroundSwitcher.d.ts.map +1 -1
  152. package/lib/typescript/module/ui/backgrounds/backgroundStore.d.ts +3 -0
  153. package/lib/typescript/module/ui/backgrounds/backgroundStore.d.ts.map +1 -1
  154. package/lib/typescript/module/ui/backgrounds/index.d.ts +7 -1
  155. package/lib/typescript/module/ui/backgrounds/index.d.ts.map +1 -1
  156. package/lib/typescript/module/ui/backgrounds/primitives.d.ts +18 -3
  157. package/lib/typescript/module/ui/backgrounds/primitives.d.ts.map +1 -1
  158. package/lib/typescript/module/ui/backgrounds/registry.d.ts +8 -0
  159. package/lib/typescript/module/ui/backgrounds/registry.d.ts.map +1 -1
  160. package/lib/typescript/module/ui/backgrounds/rng.d.ts +6 -0
  161. package/lib/typescript/module/ui/backgrounds/rng.d.ts.map +1 -1
  162. package/lib/typescript/module/ui/backgrounds/skyClock.d.ts +17 -0
  163. package/lib/typescript/module/ui/backgrounds/skyClock.d.ts.map +1 -0
  164. package/lib/typescript/module/ui/backgrounds/types.d.ts +1 -1
  165. package/lib/typescript/module/ui/backgrounds/types.d.ts.map +1 -1
  166. package/lib/typescript/module/ui/backgrounds/variants/daylight.d.ts +30 -0
  167. package/lib/typescript/module/ui/backgrounds/variants/daylight.d.ts.map +1 -0
  168. package/lib/typescript/module/ui/backgrounds/variants/deepField.d.ts +19 -4
  169. package/lib/typescript/module/ui/backgrounds/variants/deepField.d.ts.map +1 -1
  170. package/lib/typescript/module/ui/backgrounds/variants/hyperspace.d.ts +39 -0
  171. package/lib/typescript/module/ui/backgrounds/variants/hyperspace.d.ts.map +1 -0
  172. package/lib/typescript/module/ui/backgrounds/variants/liveSky.d.ts +41 -0
  173. package/lib/typescript/module/ui/backgrounds/variants/liveSky.d.ts.map +1 -0
  174. package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts +26 -0
  175. package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts.map +1 -0
  176. package/lib/typescript/module/ui/backgrounds/variants/moonlight.d.ts +35 -0
  177. package/lib/typescript/module/ui/backgrounds/variants/moonlight.d.ts.map +1 -0
  178. package/lib/typescript/module/ui/backgrounds/variants/underwater.d.ts +51 -0
  179. package/lib/typescript/module/ui/backgrounds/variants/underwater.d.ts.map +1 -0
  180. package/lib/typescript/module/ui/components/Badge.d.ts.map +1 -1
  181. package/lib/typescript/module/ui/components/CompactRow.d.ts.map +1 -1
  182. package/lib/typescript/module/ui/components/DynamicFilterView.d.ts.map +1 -1
  183. package/lib/typescript/module/ui/components/EventStepperFooter.d.ts +2 -0
  184. package/lib/typescript/module/ui/components/EventStepperFooter.d.ts.map +1 -1
  185. package/lib/typescript/module/ui/components/StorageTypeBadge.d.ts.map +1 -1
  186. package/lib/typescript/module/ui/components/TabSelector.d.ts +9 -0
  187. package/lib/typescript/module/ui/components/TabSelector.d.ts.map +1 -1
  188. package/lib/typescript/module/ui/components/ValueTypeBadge.d.ts.map +1 -1
  189. package/lib/typescript/module/ui/components/WindowControls.d.ts +4 -2
  190. package/lib/typescript/module/ui/components/WindowControls.d.ts.map +1 -1
  191. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts +8 -0
  192. package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
  193. package/lib/typescript/module/ui/night/nightTheme.d.ts +113 -0
  194. package/lib/typescript/module/ui/night/nightTheme.d.ts.map +1 -0
  195. package/lib/typescript/module/ui/night/primitives.d.ts +111 -0
  196. package/lib/typescript/module/ui/night/primitives.d.ts.map +1 -0
  197. package/package.json +4 -4
  198. package/lib/commonjs/ui/backgrounds/variants/lattice.js +0 -579
  199. package/lib/commonjs/ui/backgrounds/variants/starfield.js +0 -210
  200. package/lib/module/ui/backgrounds/variants/lattice.js +0 -575
  201. package/lib/module/ui/backgrounds/variants/starfield.js +0 -206
  202. package/lib/typescript/commonjs/ui/backgrounds/variants/lattice.d.ts +0 -33
  203. package/lib/typescript/commonjs/ui/backgrounds/variants/lattice.d.ts.map +0 -1
  204. package/lib/typescript/commonjs/ui/backgrounds/variants/starfield.d.ts +0 -12
  205. package/lib/typescript/commonjs/ui/backgrounds/variants/starfield.d.ts.map +0 -1
  206. package/lib/typescript/module/ui/backgrounds/variants/lattice.d.ts +0 -33
  207. package/lib/typescript/module/ui/backgrounds/variants/lattice.d.ts.map +0 -1
  208. package/lib/typescript/module/ui/backgrounds/variants/starfield.d.ts +0 -12
  209. package/lib/typescript/module/ui/backgrounds/variants/starfield.d.ts.map +0 -1
@@ -18,6 +18,8 @@ import { absoluteFill } from "./utils/absoluteFill.js";
18
18
  import { useSafeAreaInsets } from "./hooks/useSafeAreaInsets.js";
19
19
  import { gameUIColors, buoyColors } from "./ui/gameUI/index.js";
20
20
  import { DraggableHeader, ModalHintBanner, WindowControls } from "./ui/components/index.js";
21
+ import { ToolBackground } from "./ui/backgrounds/ToolBackground.js";
22
+ import { night } from "./ui/night/nightTheme.js";
21
23
  import { persistentStorage } from "./utils/persistentStorage.js";
22
24
  import { devToolsStorageKeys } from "./storage/devToolsStorageKeys.js";
23
25
  import { useHintsDisabled } from "./context/index.js";
@@ -25,6 +27,21 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
25
27
  // ============================================================================
26
28
  // CONSTANTS - Modal dimensions and configuration
27
29
  // ============================================================================
30
+
31
+ /**
32
+ * Tool modals open and close without an entrance animation.
33
+ *
34
+ * The animated entrance was `parallel([spring(tension:180, friction:22),
35
+ * timing(200ms)])`. Two measured problems: the modal mounts at opacity 0 and
36
+ * the fade only starts once its content has committed, so a tap left the screen
37
+ * unchanged for ~240ms; and the spring's completion did not land until ~1s,
38
+ * creeping long after it looked settled. Snapping to the final state made the
39
+ * whole devtools UI feel markedly faster.
40
+ *
41
+ * Setting this to `false` restores the animation for every tool modal — this is
42
+ * shared chrome, not settings-specific.
43
+ */
44
+ const INSTANT_MODAL_ENTRANCE = true;
28
45
  const SCREEN = Dimensions.get("window");
29
46
  const MIN_HEIGHT = 100;
30
47
  const DEFAULT_HEIGHT = 400;
@@ -92,6 +109,15 @@ class ModalStorage {
92
109
  // TYPE DEFINITIONS - Interface contracts for the modal
93
110
  // ============================================================================
94
111
 
112
+ /**
113
+ * Chrome variant. "night" (the default since the suite-wide theme move) is
114
+ * the Everlights-style sheet (see ui/night): near-black `#050505` surfaces at
115
+ * radius 16, a hairline accent border, a neutral drag handle instead of the
116
+ * teal bar, a transparent header, and the ToolBackground hoisted to the sheet
117
+ * root so the star field runs through the header instead of stopping under
118
+ * it. "default" is the legacy card-grey chrome, kept as an escape hatch.
119
+ */
120
+
95
121
  /**
96
122
  * Modal state that can be saved and restored when minimizing/restoring
97
123
  */
@@ -106,12 +132,15 @@ class ModalStorage {
106
132
  const DragIndicator = /*#__PURE__*/memo(function DragIndicator({
107
133
  isResizing,
108
134
  mode,
109
- hasCustomContent = false
135
+ hasCustomContent = false,
136
+ variant = "default"
110
137
  }) {
111
138
  return /*#__PURE__*/_jsxs(View, {
112
139
  style: [styles.dragIndicatorContainer, hasCustomContent && styles.dragIndicatorContainerCustom],
113
140
  children: [/*#__PURE__*/_jsx(View, {
114
- style: [styles.dragIndicator, mode === "floating" && styles.floatingDragIndicator, isResizing && styles.dragIndicatorActive]
141
+ style: [styles.dragIndicator, mode === "floating" && styles.floatingDragIndicator, isResizing && styles.dragIndicatorActive,
142
+ // Night: the neutral Everlights sheet handle, no glow, both modes.
143
+ variant === "night" && styles.nightDragIndicator]
115
144
  }), isResizing && mode === "bottomSheet" && /*#__PURE__*/_jsxs(View, {
116
145
  style: styles.resizeGripContainer,
117
146
  children: [/*#__PURE__*/_jsx(View, {
@@ -151,7 +180,8 @@ const ModalHeader = /*#__PURE__*/memo(function ModalHeader({
151
180
  onMinimize,
152
181
  isResizing,
153
182
  mode,
154
- panHandlers
183
+ panHandlers,
184
+ variant = "default"
155
185
  }) {
156
186
  const lastTapRef = useRef(0);
157
187
  const tapCountRef = useRef(0);
@@ -230,11 +260,12 @@ const ModalHeader = /*#__PURE__*/memo(function ModalHeader({
230
260
  children: [/*#__PURE__*/_jsx(DragIndicator, {
231
261
  isResizing: isResizing,
232
262
  mode: mode,
233
- hasCustomContent: true
263
+ hasCustomContent: true,
264
+ variant: variant
234
265
  }), customContentWithMinimize]
235
266
  });
236
267
  return /*#__PURE__*/_jsx(View, {
237
- style: styles.header,
268
+ style: [styles.header, variant === "night" && styles.nightHeader],
238
269
  ...headerProps,
239
270
  children: shouldHandleTap ? /*#__PURE__*/_jsx(TouchableWithoutFeedback, {
240
271
  onPress: handleHeaderTap,
@@ -246,7 +277,8 @@ const ModalHeader = /*#__PURE__*/memo(function ModalHeader({
246
277
  style: styles.headerInner,
247
278
  children: [/*#__PURE__*/_jsx(DragIndicator, {
248
279
  isResizing: isResizing,
249
- mode: mode
280
+ mode: mode,
281
+ variant: variant
250
282
  }), /*#__PURE__*/_jsxs(View, {
251
283
  style: styles.headerContent,
252
284
  children: [header?.title && /*#__PURE__*/_jsx(Text, {
@@ -265,7 +297,7 @@ const ModalHeader = /*#__PURE__*/memo(function ModalHeader({
265
297
  })]
266
298
  });
267
299
  return /*#__PURE__*/_jsx(View, {
268
- style: [styles.header, mode === "floating" && styles.floatingModeHeader],
300
+ style: [styles.header, mode === "floating" && styles.floatingModeHeader, variant === "night" && styles.nightHeader],
269
301
  ...headerProps,
270
302
  children: shouldHandleTap ? /*#__PURE__*/_jsx(TouchableWithoutFeedback, {
271
303
  onPress: handleHeaderTap,
@@ -338,7 +370,9 @@ const JsModalComponent = ({
338
370
  minimizeTargetPosition,
339
371
  initialModalState,
340
372
  zIndex,
341
- disableScrollWrapper = false
373
+ disableScrollWrapper = false,
374
+ background = true,
375
+ variant = "night"
342
376
  }) => {
343
377
  const insets = useSafeAreaInsets();
344
378
  const [isStateLoaded, setIsStateLoaded] = useState(!enablePersistence);
@@ -667,6 +701,27 @@ const JsModalComponent = ({
667
701
  // Visibility effect
668
702
  let openAnimation = null;
669
703
  let closeAnimation = null;
704
+ if (INSTANT_MODAL_ENTRANCE) {
705
+ // Snap to the final state — no animation in either direction.
706
+ if (visible) {
707
+ if (mode === "bottomSheet") {
708
+ bottomSheetTranslateY.setValue(0);
709
+ } else {
710
+ floatingScale.setValue(1);
711
+ floatingPosition.setValue({
712
+ x: currentDimensionsRef.current.left,
713
+ y: currentDimensionsRef.current.top
714
+ });
715
+ }
716
+ visibilityProgress.setValue(1);
717
+ } else {
718
+ if (mode === "bottomSheet") {
719
+ bottomSheetTranslateY.setValue(SCREEN.height);
720
+ }
721
+ visibilityProgress.setValue(0);
722
+ }
723
+ return;
724
+ }
670
725
  if (visible) {
671
726
  // Reset position if needed and then open
672
727
  bottomSheetTranslateY.setValue(SCREEN.height);
@@ -1144,8 +1199,12 @@ const JsModalComponent = ({
1144
1199
  ...(zIndex !== undefined && {
1145
1200
  zIndex
1146
1201
  })
1147
- }, (isDragging || isResizing) && styles.floatingModalDragging, customStyles.container, !visible && styles.parkedOffscreen],
1148
- children: [/*#__PURE__*/_jsx(DraggableHeader, {
1202
+ }, variant === "night" && styles.nightFloatingModal, (isDragging || isResizing) && styles.floatingModalDragging, customStyles.container, !visible && styles.parkedOffscreen],
1203
+ children: [background && variant === "night" ? /*#__PURE__*/_jsx(View, {
1204
+ style: styles.nightBackdropFloating,
1205
+ pointerEvents: "none",
1206
+ children: /*#__PURE__*/_jsx(ToolBackground, {})
1207
+ }) : null, /*#__PURE__*/_jsx(DraggableHeader, {
1149
1208
  position: floatingPosition,
1150
1209
  onDragStart: handleFloatingDragStart,
1151
1210
  onDragEnd: handleFloatingDragEnd,
@@ -1164,7 +1223,8 @@ const JsModalComponent = ({
1164
1223
  onToggleMode: toggleMode,
1165
1224
  onMinimize: onMinimize ? handleMinimize : undefined,
1166
1225
  isResizing: isDragging || isResizing,
1167
- mode: mode
1226
+ mode: mode,
1227
+ variant: variant
1168
1228
  })
1169
1229
  }), /*#__PURE__*/_jsx(View, {
1170
1230
  style: styles.windowControlsContainer,
@@ -1172,11 +1232,12 @@ const JsModalComponent = ({
1172
1232
  onClose: onClose,
1173
1233
  onMinimize: onMinimize ? handleMinimize : undefined,
1174
1234
  onToggleMode: toggleMode,
1175
- mode: mode
1235
+ mode: mode,
1236
+ variant: variant
1176
1237
  })
1177
1238
  }), /*#__PURE__*/_jsxs(View, {
1178
- style: [styles.content, customStyles.content],
1179
- children: [disableScrollWrapper ?
1239
+ style: [styles.content, variant === "night" && styles.nightContent, customStyles.content],
1240
+ children: [background && variant !== "night" ? /*#__PURE__*/_jsx(ToolBackground, {}) : null, disableScrollWrapper ?
1180
1241
  /*#__PURE__*/
1181
1242
  // Render children directly when they manage their own scrolling (FlatList, etc.)
1182
1243
  _jsx(View, {
@@ -1260,30 +1321,36 @@ const JsModalComponent = ({
1260
1321
  }]
1261
1322
  }],
1262
1323
  children: /*#__PURE__*/_jsxs(Animated.View, {
1263
- style: [styles.bottomSheet, customStyles.container, {
1324
+ style: [styles.bottomSheet, variant === "night" && styles.nightBottomSheet, customStyles.container, {
1264
1325
  height: externalAnimatedHeight || animatedBottomPosition
1265
1326
  }],
1266
- children: [/*#__PURE__*/_jsx(ModalHeader, {
1327
+ children: [background && variant === "night" ? /*#__PURE__*/_jsx(View, {
1328
+ style: styles.nightBackdropSheet,
1329
+ pointerEvents: "none",
1330
+ children: /*#__PURE__*/_jsx(ToolBackground, {})
1331
+ }) : null, /*#__PURE__*/_jsx(ModalHeader, {
1267
1332
  header: header,
1268
1333
  onClose: onClose,
1269
1334
  onToggleMode: toggleMode,
1270
1335
  onMinimize: onMinimize ? handleMinimize : undefined,
1271
1336
  isResizing: isResizing,
1272
1337
  mode: mode,
1273
- panHandlers: bottomSheetPanResponder.panHandlers
1338
+ panHandlers: bottomSheetPanResponder.panHandlers,
1339
+ variant: variant
1274
1340
  }), /*#__PURE__*/_jsx(View, {
1275
1341
  style: styles.windowControlsContainer,
1276
1342
  children: /*#__PURE__*/_jsx(WindowControls, {
1277
1343
  onClose: onClose,
1278
1344
  onMinimize: onMinimize ? handleMinimize : undefined,
1279
1345
  onToggleMode: toggleMode,
1280
- mode: mode
1346
+ mode: mode,
1347
+ variant: variant
1281
1348
  })
1282
1349
  }), hintLoaded && showHint && mode === "bottomSheet" && !hintsDisabled && /*#__PURE__*/_jsx(ModalHintBanner, {
1283
1350
  onAcknowledge: handleHintAcknowledge
1284
1351
  }), /*#__PURE__*/_jsxs(View, {
1285
- style: [styles.content, customStyles.content],
1286
- children: [disableScrollWrapper ?
1352
+ style: [styles.content, variant === "night" && styles.nightContent, customStyles.content],
1353
+ children: [background && variant !== "night" ? /*#__PURE__*/_jsx(ToolBackground, {}) : null, disableScrollWrapper ?
1287
1354
  /*#__PURE__*/
1288
1355
  // Render children directly when they manage their own scrolling (FlatList, etc.)
1289
1356
  _jsx(View, {
@@ -1403,6 +1470,75 @@ const styles = StyleSheet.create({
1403
1470
  borderBottomWidth: 1,
1404
1471
  borderBottomColor: buoyColors.border
1405
1472
  },
1473
+ // ── Night variant (Everlights sheet — see ui/night/nightTheme.ts) ────────
1474
+ // NO `overflow: "hidden"` on the sheets: Fabric clips children to the
1475
+ // square rect, so the star-field layer's corner painted OVER the rounded
1476
+ // corner (it read as chopped off) — and iOS suppresses a layer's own shadow
1477
+ // when it clips. The backdrop clips itself instead (nightBackdrop* below).
1478
+ nightBottomSheet: {
1479
+ backgroundColor: night.color.bg,
1480
+ borderTopLeftRadius: night.radius.sheet,
1481
+ borderTopRightRadius: night.radius.sheet,
1482
+ borderWidth: StyleSheet.hairlineWidth,
1483
+ borderColor: night.color.accent + "55",
1484
+ shadowColor: night.color.accent,
1485
+ shadowOffset: {
1486
+ width: 0,
1487
+ height: -4
1488
+ },
1489
+ shadowOpacity: 0.22,
1490
+ shadowRadius: 10
1491
+ },
1492
+ nightFloatingModal: {
1493
+ backgroundColor: night.color.bg,
1494
+ borderRadius: night.radius.sheet,
1495
+ borderWidth: StyleSheet.hairlineWidth,
1496
+ borderColor: night.color.accent + "55",
1497
+ shadowColor: night.color.accent,
1498
+ shadowOffset: {
1499
+ width: 0,
1500
+ height: 0
1501
+ },
1502
+ shadowOpacity: 0.22,
1503
+ shadowRadius: 14
1504
+ },
1505
+ /** The header is glass — the sheet-level star field runs through it. */
1506
+ nightHeader: {
1507
+ backgroundColor: "transparent",
1508
+ borderWidth: 0,
1509
+ borderBottomWidth: 0,
1510
+ borderTopLeftRadius: night.radius.sheet,
1511
+ borderTopRightRadius: night.radius.sheet
1512
+ },
1513
+ nightContent: {
1514
+ backgroundColor: "transparent"
1515
+ },
1516
+ /**
1517
+ * The hoisted star field clips ITSELF to the sheet's corners (matching
1518
+ * radii + overflow hidden) — see the note on the sheet styles above. It
1519
+ * also keeps scenes that animate outside their own bounds (Hyperspace's
1520
+ * scaled shells) from bleeding past the window.
1521
+ */
1522
+ nightBackdropSheet: {
1523
+ ...absoluteFill,
1524
+ borderTopLeftRadius: night.radius.sheet,
1525
+ borderTopRightRadius: night.radius.sheet,
1526
+ overflow: "hidden"
1527
+ },
1528
+ nightBackdropFloating: {
1529
+ ...absoluteFill,
1530
+ borderRadius: night.radius.sheet,
1531
+ overflow: "hidden"
1532
+ },
1533
+ /** Neutral Everlights handle instead of the glowing teal bar. */
1534
+ nightDragIndicator: {
1535
+ width: 36,
1536
+ height: 5,
1537
+ borderRadius: 2.5,
1538
+ backgroundColor: night.color.placeholder,
1539
+ shadowOpacity: 0,
1540
+ elevation: 0
1541
+ },
1406
1542
  floatingHeader: {
1407
1543
  borderTopLeftRadius: 6,
1408
1544
  borderTopRightRadius: 6
@@ -73,6 +73,12 @@
73
73
  import { useState, useRef, useEffect, useLayoutEffect, useCallback, memo, isValidElement, cloneElement } from "react";
74
74
  import { devToolsStorageKeys } from "./storage/devToolsStorageKeys.js";
75
75
  import { useHintsDisabled } from "./context/index.js";
76
+ // RN component, but safe here: every consumer of the web modal (desktop
77
+ // renderer, website demos) aliases `react-native` to react-native-web, and
78
+ // the backgrounds primitives handle RNW explicitly (see backgrounds/README).
79
+ import { ToolBackground } from "./ui/backgrounds/ToolBackground.js";
80
+ // Pure token module (no react-native import) — safe on web.
81
+ import { night } from "./ui/night/nightTheme.js";
76
82
 
77
83
  // ============================================================================
78
84
  // PALETTE — inlined from shared-ui with provenance (RN-only modules on web)
@@ -468,9 +474,11 @@ function WindowControls({
468
474
  const DragIndicator = /*#__PURE__*/memo(function DragIndicator({
469
475
  isResizing,
470
476
  mode,
471
- hasCustomContent = false
477
+ hasCustomContent = false,
478
+ variant = "default"
472
479
  }) {
473
480
  const floating = mode === "floating";
481
+ const isNight = variant === "night";
474
482
  return /*#__PURE__*/_jsxs("div", {
475
483
  style: {
476
484
  display: "flex",
@@ -487,12 +495,13 @@ const DragIndicator = /*#__PURE__*/memo(function DragIndicator({
487
495
  style: {
488
496
  // native dragIndicator: 40x3 teal bar, radius 2, teal glow
489
497
  // (shadowOpacity 0.6, radius 4); floating variant: 50x5 textMuted;
490
- // active (isResizing/isDragging): teal, width 40
491
- width: isResizing ? 40 : floating ? 50 : 40,
492
- height: floating ? 5 : 3,
493
- backgroundColor: isResizing ? buoy.primary : floating ? buoy.textMuted : buoy.primary,
494
- borderRadius: 2,
495
- boxShadow: `0 0 4px ${buoy.primary}99`
498
+ // active (isResizing/isDragging): teal, width 40.
499
+ // Night: the neutral 36x5 Everlights handle, no glow, both modes.
500
+ width: isNight ? 36 : isResizing ? 40 : floating ? 50 : 40,
501
+ height: isNight ? 5 : floating ? 5 : 3,
502
+ backgroundColor: isNight ? night.color.placeholder : isResizing ? buoy.primary : floating ? buoy.textMuted : buoy.primary,
503
+ borderRadius: isNight ? 2.5 : 2,
504
+ boxShadow: isNight ? "none" : `0 0 4px ${buoy.primary}99`
496
505
  }
497
506
  }), isResizing && mode === "bottomSheet" && /*#__PURE__*/_jsx("div", {
498
507
  style: {
@@ -626,7 +635,8 @@ function ModalHeaderContent({
626
635
  header,
627
636
  isResizing,
628
637
  mode,
629
- onMinimize
638
+ onMinimize,
639
+ variant = "default"
630
640
  }) {
631
641
  if (header?.customContent) {
632
642
  // native (non-CyberpunkModalHeader path): inject onMinimize into the
@@ -649,7 +659,8 @@ function ModalHeaderContent({
649
659
  children: [/*#__PURE__*/_jsx(DragIndicator, {
650
660
  isResizing: isResizing,
651
661
  mode: mode,
652
- hasCustomContent: true
662
+ hasCustomContent: true,
663
+ variant: variant
653
664
  }), customContent]
654
665
  });
655
666
  }
@@ -664,7 +675,8 @@ function ModalHeaderContent({
664
675
  },
665
676
  children: [/*#__PURE__*/_jsx(DragIndicator, {
666
677
  isResizing: isResizing,
667
- mode: mode
678
+ mode: mode,
679
+ variant: variant
668
680
  }), /*#__PURE__*/_jsxs("div", {
669
681
  style: {
670
682
  // native headerContent: paddingHorizontal 16, alignItems center
@@ -741,7 +753,9 @@ const JsModalComponent = ({
741
753
  minimizeTargetPosition,
742
754
  initialModalState,
743
755
  zIndex,
744
- disableScrollWrapper = false
756
+ disableScrollWrapper = false,
757
+ background = true,
758
+ variant = "night"
745
759
  }) => {
746
760
  const [insets] = useState(readSafeAreaInsets);
747
761
  const [isStateLoaded, setIsStateLoaded] = useState(!enablePersistence);
@@ -1344,9 +1358,23 @@ const JsModalComponent = ({
1344
1358
  }, "hidden");
1345
1359
  }
1346
1360
  const dialogLabel = header?.title || "Dev tool panel";
1361
+ const isNight = variant === "night";
1362
+
1363
+ // Night: the star field fills the whole sheet — header included — instead
1364
+ // of starting under the header band (native parity: hoisted to sheet root).
1365
+ const nightBackdrop = background && isNight ? /*#__PURE__*/_jsx("div", {
1366
+ style: {
1367
+ position: "absolute",
1368
+ inset: 0,
1369
+ pointerEvents: "none"
1370
+ },
1371
+ "aria-hidden": true,
1372
+ children: /*#__PURE__*/_jsx(ToolBackground, {})
1373
+ }) : null;
1347
1374
 
1348
1375
  // Content block shared by both modes — native styles.content:
1349
1376
  // flex 1, bg base #121212, borderBottomRadius 16, overflow hidden.
1377
+ // Night: transparent, so the sheet-level star field shows through.
1350
1378
  const contentBlock = /*#__PURE__*/_jsxs("div", {
1351
1379
  style: {
1352
1380
  flex: 1,
@@ -1354,13 +1382,13 @@ const JsModalComponent = ({
1354
1382
  position: "relative",
1355
1383
  display: "flex",
1356
1384
  flexDirection: "column",
1357
- backgroundColor: buoy.base,
1385
+ backgroundColor: isNight ? "transparent" : buoy.base,
1358
1386
  borderBottomLeftRadius: 16,
1359
1387
  borderBottomRightRadius: 16,
1360
1388
  overflow: "hidden",
1361
1389
  ...customStyles.content
1362
1390
  },
1363
- children: [disableScrollWrapper ?
1391
+ children: [background && !isNight ? /*#__PURE__*/_jsx(ToolBackground, {}) : null, disableScrollWrapper ?
1364
1392
  /*#__PURE__*/
1365
1393
  // children manage their own scrolling (native: plain flex View)
1366
1394
  _jsx("div", {
@@ -1435,27 +1463,32 @@ const JsModalComponent = ({
1435
1463
  transform: `translate(${posRef.current.x}px, ${posRef.current.y}px)`,
1436
1464
  display: "flex",
1437
1465
  flexDirection: "column",
1438
- backgroundColor: buoy.card,
1439
- borderRadius: 6,
1440
- border: active ? `2px solid ${buoy.primary}` : `1px solid ${buoy.border}`,
1441
- boxShadow: active ? `0 0 12px ${buoy.primary}7A` : `0 0 20px ${buoy.primary}4D`,
1466
+ backgroundColor: isNight ? night.color.bg : buoy.card,
1467
+ borderRadius: isNight ? night.radius.sheet : 6,
1468
+ border: isNight ? `1px solid ${night.color.accent}55` : active ? `2px solid ${buoy.primary}` : `1px solid ${buoy.border}`,
1469
+ boxShadow: isNight ? `0 0 14px ${night.color.accent}38` : active ? `0 0 12px ${buoy.primary}7A` : `0 0 20px ${buoy.primary}4D`,
1470
+ // Night clips the hoisted star field to the rounded window.
1471
+ ...(isNight ? {
1472
+ overflow: "hidden"
1473
+ } : null),
1442
1474
  boxSizing: "border-box",
1443
1475
  // RN borders draw inside the rect
1444
1476
  zIndex: zIndex ?? 1000,
1445
1477
  ...customStyles.container
1446
1478
  },
1447
- children: [/*#__PURE__*/_jsx("div", {
1479
+ children: [nightBackdrop, /*#__PURE__*/_jsx("div", {
1448
1480
  onPointerDown: handleFloatPointerDown,
1449
1481
  onPointerMove: handleFloatPointerMove,
1450
1482
  onPointerUp: handleFloatPointerUp,
1451
1483
  onPointerCancel: handleFloatPointerCancel,
1452
1484
  style: {
1453
- // native styles.header (+ floatingHeader top radius 6)
1454
- borderTopLeftRadius: 6,
1455
- borderTopRightRadius: 6,
1456
- backgroundColor: buoy.card,
1485
+ // native styles.header (+ floatingHeader top radius 6);
1486
+ // night: transparent glass, no border — the field runs through
1487
+ borderTopLeftRadius: isNight ? night.radius.sheet : 6,
1488
+ borderTopRightRadius: isNight ? night.radius.sheet : 6,
1489
+ backgroundColor: isNight ? "transparent" : buoy.card,
1457
1490
  minHeight: 56,
1458
- border: `1px solid ${buoy.border}`,
1491
+ border: isNight ? "none" : `1px solid ${buoy.border}`,
1459
1492
  boxSizing: "border-box",
1460
1493
  display: "flex",
1461
1494
  flexDirection: "column",
@@ -1463,13 +1496,16 @@ const JsModalComponent = ({
1463
1496
  flexShrink: 0,
1464
1497
  touchAction: "none",
1465
1498
  userSelect: "none",
1466
- cursor: isDragging ? "grabbing" : "grab" // web-only affordance
1499
+ cursor: isDragging ? "grabbing" : "grab",
1500
+ // web-only affordance
1501
+ position: "relative"
1467
1502
  },
1468
1503
  children: /*#__PURE__*/_jsx(ModalHeaderContent, {
1469
1504
  header: header,
1470
1505
  isResizing: isDragging || isResizing,
1471
1506
  mode: mode,
1472
- onMinimize: onMinimize ? handleMinimize : undefined
1507
+ onMinimize: onMinimize ? handleMinimize : undefined,
1508
+ variant: variant
1473
1509
  })
1474
1510
  }), windowControlsBlock, contentBlock, ["bottomLeft", "bottomRight"].map(corner => /*#__PURE__*/_jsx("div", {
1475
1511
  onPointerDown: handleResizePointerDown(corner),
@@ -1531,31 +1567,36 @@ const JsModalComponent = ({
1531
1567
  "aria-label": dialogLabel,
1532
1568
  style: {
1533
1569
  // native bottomSheet: card bg, top radius 6, 1px #333 border,
1534
- // teal shadow (offset 0/-4, opacity 0.2, radius 12)
1570
+ // teal shadow (offset 0/-4, opacity 0.2, radius 12).
1571
+ // Night: #050505 sheet, top radius 16, hairline accent border.
1535
1572
  height: currentHeightRef.current,
1536
1573
  display: "flex",
1537
1574
  flexDirection: "column",
1538
- backgroundColor: buoy.card,
1539
- borderTopLeftRadius: 6,
1540
- borderTopRightRadius: 6,
1541
- border: `1px solid ${buoy.border}`,
1542
- boxShadow: `0 -4px 12px ${buoy.primary}33`,
1575
+ backgroundColor: isNight ? night.color.bg : buoy.card,
1576
+ borderTopLeftRadius: isNight ? night.radius.sheet : 6,
1577
+ borderTopRightRadius: isNight ? night.radius.sheet : 6,
1578
+ border: isNight ? `1px solid ${night.color.accent}55` : `1px solid ${buoy.border}`,
1579
+ boxShadow: isNight ? `0 -4px 10px ${night.color.accent}38` : `0 -4px 12px ${buoy.primary}33`,
1580
+ // Night clips the hoisted star field to the rounded sheet.
1581
+ ...(isNight ? {
1582
+ overflow: "hidden"
1583
+ } : null),
1543
1584
  boxSizing: "border-box",
1544
1585
  position: "relative",
1545
1586
  ...customStyles.container
1546
1587
  },
1547
- children: [/*#__PURE__*/_jsx("div", {
1588
+ children: [nightBackdrop, /*#__PURE__*/_jsx("div", {
1548
1589
  onPointerDown: handleSheetPointerDown,
1549
1590
  onPointerMove: handleSheetPointerMove,
1550
1591
  onPointerUp: handleSheetPointerUp,
1551
1592
  onPointerCancel: handleSheetPointerCancel,
1552
1593
  style: {
1553
- // native styles.header
1554
- borderTopLeftRadius: 6,
1555
- borderTopRightRadius: 6,
1556
- backgroundColor: buoy.card,
1594
+ // native styles.header; night: transparent glass, no border
1595
+ borderTopLeftRadius: isNight ? night.radius.sheet : 6,
1596
+ borderTopRightRadius: isNight ? night.radius.sheet : 6,
1597
+ backgroundColor: isNight ? "transparent" : buoy.card,
1557
1598
  minHeight: 56,
1558
- border: `1px solid ${buoy.border}`,
1599
+ border: isNight ? "none" : `1px solid ${buoy.border}`,
1559
1600
  boxSizing: "border-box",
1560
1601
  display: "flex",
1561
1602
  flexDirection: "column",
@@ -1563,13 +1604,16 @@ const JsModalComponent = ({
1563
1604
  flexShrink: 0,
1564
1605
  touchAction: "none",
1565
1606
  userSelect: "none",
1566
- cursor: "ns-resize" // web-only affordance
1607
+ cursor: "ns-resize",
1608
+ // web-only affordance
1609
+ position: "relative"
1567
1610
  },
1568
1611
  children: /*#__PURE__*/_jsx(ModalHeaderContent, {
1569
1612
  header: header,
1570
1613
  isResizing: isResizing,
1571
1614
  mode: mode,
1572
- onMinimize: onMinimize ? handleMinimize : undefined
1615
+ onMinimize: onMinimize ? handleMinimize : undefined,
1616
+ variant: variant
1573
1617
  })
1574
1618
  }), windowControlsBlock, hintLoaded && showHint && !hintsDisabled && /*#__PURE__*/_jsx(ModalHintBanner, {
1575
1619
  onAcknowledge: handleHintAcknowledge
@@ -4,6 +4,7 @@ import { useState, useMemo, useCallback, useRef, useEffect, memo } from "react";
4
4
  import { Text, TouchableOpacity, View, StyleSheet, FlatList } from "react-native";
5
5
  import { displayValue } from "../utils/displayValue.js";
6
6
  import { gameUIColors } from "../ui/gameUI/index.js";
7
+ import { night } from "../ui/night/nightTheme.js";
7
8
  import { CopyButton } from "../ui/components/CopyButton.js";
8
9
  import { ChevronRight } from "../icons/index.js";
9
10
  import { IndentGuidesOverlay } from "./IndentGuidesOverlay.js";
@@ -53,11 +54,13 @@ const TYPE_COLOR_CACHE = new Map([["string", gameUIColors.dataTypes.string], ["n
53
54
  // Pre-computed stable styles with React Query-inspired design
54
55
  const STABLE_STYLES = StyleSheet.create({
55
56
  container: {
56
- backgroundColor: gameUIColors.primary + "08",
57
- // bg-white/[0.03]
57
+ // Night inset panel: darker than the card it sits in, hairline border —
58
+ // the old white-wash fill (primary+"08") read as a grey slab on the
59
+ // night surfaces. Global on purpose: every tool is moving to night.
60
+ backgroundColor: night.color.bg,
58
61
  borderRadius: 8,
59
62
  borderWidth: 1,
60
- borderColor: gameUIColors.primary + "14" // border-white/[0.08]
63
+ borderColor: night.color.border
61
64
  },
62
65
  header: {
63
66
  flexDirection: "column",
@@ -889,7 +892,14 @@ const VirtualizedItemComponent = ({
889
892
  style: [STABLE_STYLES.itemContainer, indentStyle],
890
893
  children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
891
894
  "sentry-label": "ignore devtools data explorer item",
892
- style: [STABLE_STYLES.itemTouchable, isPressed && STABLE_STYLES.itemTouchablePressed, isSelected && STABLE_STYLES.itemSelected, isLongKey && {
895
+ style: [STABLE_STYLES.itemTouchable, isPressed && STABLE_STYLES.itemTouchablePressed,
896
+ // The selected wash exists for the action-bar/edit flow. In a plain
897
+ // read-only viewer every expand/collapse tap ALSO selects, which
898
+ // left a permanent grey strip on the last-tapped row (the collapsed
899
+ // root, usually) — so the wash only paints when selection means
900
+ // something. selectedId still tracks either way: the indent-guide
901
+ // depth highlight uses it.
902
+ canEdit && isSelected && STABLE_STYLES.itemSelected, isLongKey && {
893
903
  minHeight: LONG_ITEM_HEIGHT,
894
904
  paddingVertical: 2
895
905
  }],
@@ -48,17 +48,19 @@ export const gitClassicTheme = {
48
48
 
49
49
  /**
50
50
  * Dev Tools Default Theme
51
- * Clean dark theme matching Buoy website brand colors
51
+ * The night theme (ui/night) — near-black surfaces, hairline borders. Diff
52
+ * DATA colors (added green / removed red / modified purple) are semantic and
53
+ * deliberately unchanged.
52
54
  */
53
55
  export const devToolsDefaultTheme = {
54
56
  name: "Dev Tools Default",
55
- description: "Clean dark theme with Buoy brand colors",
56
- // Surface colors (matching website dark theme)
57
- background: "#121212",
58
- panelBackground: "#1A1A1A",
59
- headerBackground: "#1A1A1A",
57
+ description: "The Buoy night theme",
58
+ // Night surfaces
59
+ background: "#050505",
60
+ panelBackground: "#0C0C0C",
61
+ headerBackground: "#0C0C0C",
60
62
  // Diff colors using website's semantic colors
61
- // Added: Primary teal (#20C997)
63
+ // Added: Primary green (#20C997)
62
64
  // Removed: Error red (#EF4444)
63
65
  // Modified: Secondary purple (#9B70E0)
64
66
  addedBackground: "rgba(32, 201, 151, 0.12)",
@@ -70,32 +72,32 @@ export const devToolsDefaultTheme = {
70
72
  addedText: "#20C997",
71
73
  removedText: "#EF4444",
72
74
  modifiedText: "#9B70E0",
73
- unchangedText: "#E0E0E0",
75
+ unchangedText: "#ECEDEE",
74
76
  // Word-level highlights
75
77
  addedWordHighlight: "rgba(32, 201, 151, 0.3)",
76
78
  removedWordHighlight: "rgba(239, 68, 68, 0.3)",
77
79
  // UI elements
78
- lineNumberBackground: "#121212",
79
- lineNumberText: "#A0A0A0",
80
- lineNumberBorder: "#333333",
80
+ lineNumberBackground: "#050505",
81
+ lineNumberText: "#9BA1A6",
82
+ lineNumberBorder: "#1A1A1C",
81
83
  // Markers
82
84
  markerAddedBackground: "rgba(32, 201, 151, 0.2)",
83
85
  markerRemovedBackground: "rgba(239, 68, 68, 0.2)",
84
86
  markerModifiedBackground: "rgba(155, 112, 224, 0.2)",
85
- markerText: "#A0A0A0",
87
+ markerText: "#9BA1A6",
86
88
  // Borders and dividers
87
- borderColor: "#333333",
88
- dividerColor: "#333333",
89
+ borderColor: "#1A1A1C",
90
+ dividerColor: "#1A1A1C",
89
91
  // Summary bar
90
- summaryBackground: "#1A1A1A",
92
+ summaryBackground: "#0C0C0C",
91
93
  summaryAddedText: "#20C997",
92
94
  summaryRemovedText: "#EF4444",
93
95
  summaryModifiedText: "#9B70E0",
94
96
  // Empty state
95
- emptyStateText: "#888888",
97
+ emptyStateText: "#636366",
96
98
  // Separator
97
- separatorBackground: "#1A1A1A",
98
- separatorText: "#A0A0A0"
99
+ separatorBackground: "#0C0C0C",
100
+ separatorText: "#9BA1A6"
99
101
  };
100
102
 
101
103
  /**