@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
@@ -10,6 +10,8 @@ var _absoluteFill = require("./utils/absoluteFill.js");
10
10
  var _useSafeAreaInsets = require("./hooks/useSafeAreaInsets.js");
11
11
  var _index = require("./ui/gameUI/index.js");
12
12
  var _index2 = require("./ui/components/index.js");
13
+ var _ToolBackground = require("./ui/backgrounds/ToolBackground.js");
14
+ var _nightTheme = require("./ui/night/nightTheme.js");
13
15
  var _persistentStorage = require("./utils/persistentStorage.js");
14
16
  var _devToolsStorageKeys = require("./storage/devToolsStorageKeys.js");
15
17
  var _index3 = require("./context/index.js");
@@ -29,6 +31,21 @@ var _jsxRuntime = require("react/jsx-runtime");
29
31
  // ============================================================================
30
32
  // CONSTANTS - Modal dimensions and configuration
31
33
  // ============================================================================
34
+
35
+ /**
36
+ * Tool modals open and close without an entrance animation.
37
+ *
38
+ * The animated entrance was `parallel([spring(tension:180, friction:22),
39
+ * timing(200ms)])`. Two measured problems: the modal mounts at opacity 0 and
40
+ * the fade only starts once its content has committed, so a tap left the screen
41
+ * unchanged for ~240ms; and the spring's completion did not land until ~1s,
42
+ * creeping long after it looked settled. Snapping to the final state made the
43
+ * whole devtools UI feel markedly faster.
44
+ *
45
+ * Setting this to `false` restores the animation for every tool modal — this is
46
+ * shared chrome, not settings-specific.
47
+ */
48
+ const INSTANT_MODAL_ENTRANCE = true;
32
49
  const SCREEN = _reactNative.Dimensions.get("window");
33
50
  const MIN_HEIGHT = 100;
34
51
  const DEFAULT_HEIGHT = 400;
@@ -96,6 +113,15 @@ class ModalStorage {
96
113
  // TYPE DEFINITIONS - Interface contracts for the modal
97
114
  // ============================================================================
98
115
 
116
+ /**
117
+ * Chrome variant. "night" (the default since the suite-wide theme move) is
118
+ * the Everlights-style sheet (see ui/night): near-black `#050505` surfaces at
119
+ * radius 16, a hairline accent border, a neutral drag handle instead of the
120
+ * teal bar, a transparent header, and the ToolBackground hoisted to the sheet
121
+ * root so the star field runs through the header instead of stopping under
122
+ * it. "default" is the legacy card-grey chrome, kept as an escape hatch.
123
+ */
124
+
99
125
  /**
100
126
  * Modal state that can be saved and restored when minimizing/restoring
101
127
  */
@@ -110,12 +136,15 @@ class ModalStorage {
110
136
  const DragIndicator = /*#__PURE__*/(0, _react.memo)(function DragIndicator({
111
137
  isResizing,
112
138
  mode,
113
- hasCustomContent = false
139
+ hasCustomContent = false,
140
+ variant = "default"
114
141
  }) {
115
142
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
116
143
  style: [styles.dragIndicatorContainer, hasCustomContent && styles.dragIndicatorContainerCustom],
117
144
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
118
- style: [styles.dragIndicator, mode === "floating" && styles.floatingDragIndicator, isResizing && styles.dragIndicatorActive]
145
+ style: [styles.dragIndicator, mode === "floating" && styles.floatingDragIndicator, isResizing && styles.dragIndicatorActive,
146
+ // Night: the neutral Everlights sheet handle, no glow, both modes.
147
+ variant === "night" && styles.nightDragIndicator]
119
148
  }), isResizing && mode === "bottomSheet" && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
120
149
  style: styles.resizeGripContainer,
121
150
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
@@ -155,7 +184,8 @@ const ModalHeader = /*#__PURE__*/(0, _react.memo)(function ModalHeader({
155
184
  onMinimize,
156
185
  isResizing,
157
186
  mode,
158
- panHandlers
187
+ panHandlers,
188
+ variant = "default"
159
189
  }) {
160
190
  const lastTapRef = (0, _react.useRef)(0);
161
191
  const tapCountRef = (0, _react.useRef)(0);
@@ -234,11 +264,12 @@ const ModalHeader = /*#__PURE__*/(0, _react.memo)(function ModalHeader({
234
264
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(DragIndicator, {
235
265
  isResizing: isResizing,
236
266
  mode: mode,
237
- hasCustomContent: true
267
+ hasCustomContent: true,
268
+ variant: variant
238
269
  }), customContentWithMinimize]
239
270
  });
240
271
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
241
- style: styles.header,
272
+ style: [styles.header, variant === "night" && styles.nightHeader],
242
273
  ...headerProps,
243
274
  children: shouldHandleTap ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableWithoutFeedback, {
244
275
  onPress: handleHeaderTap,
@@ -250,7 +281,8 @@ const ModalHeader = /*#__PURE__*/(0, _react.memo)(function ModalHeader({
250
281
  style: styles.headerInner,
251
282
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(DragIndicator, {
252
283
  isResizing: isResizing,
253
- mode: mode
284
+ mode: mode,
285
+ variant: variant
254
286
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
255
287
  style: styles.headerContent,
256
288
  children: [header?.title && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
@@ -269,7 +301,7 @@ const ModalHeader = /*#__PURE__*/(0, _react.memo)(function ModalHeader({
269
301
  })]
270
302
  });
271
303
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
272
- style: [styles.header, mode === "floating" && styles.floatingModeHeader],
304
+ style: [styles.header, mode === "floating" && styles.floatingModeHeader, variant === "night" && styles.nightHeader],
273
305
  ...headerProps,
274
306
  children: shouldHandleTap ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableWithoutFeedback, {
275
307
  onPress: handleHeaderTap,
@@ -342,7 +374,9 @@ const JsModalComponent = ({
342
374
  minimizeTargetPosition,
343
375
  initialModalState,
344
376
  zIndex,
345
- disableScrollWrapper = false
377
+ disableScrollWrapper = false,
378
+ background = true,
379
+ variant = "night"
346
380
  }) => {
347
381
  const insets = (0, _useSafeAreaInsets.useSafeAreaInsets)();
348
382
  const [isStateLoaded, setIsStateLoaded] = (0, _react.useState)(!enablePersistence);
@@ -671,6 +705,27 @@ const JsModalComponent = ({
671
705
  // Visibility effect
672
706
  let openAnimation = null;
673
707
  let closeAnimation = null;
708
+ if (INSTANT_MODAL_ENTRANCE) {
709
+ // Snap to the final state — no animation in either direction.
710
+ if (visible) {
711
+ if (mode === "bottomSheet") {
712
+ bottomSheetTranslateY.setValue(0);
713
+ } else {
714
+ floatingScale.setValue(1);
715
+ floatingPosition.setValue({
716
+ x: currentDimensionsRef.current.left,
717
+ y: currentDimensionsRef.current.top
718
+ });
719
+ }
720
+ visibilityProgress.setValue(1);
721
+ } else {
722
+ if (mode === "bottomSheet") {
723
+ bottomSheetTranslateY.setValue(SCREEN.height);
724
+ }
725
+ visibilityProgress.setValue(0);
726
+ }
727
+ return;
728
+ }
674
729
  if (visible) {
675
730
  // Reset position if needed and then open
676
731
  bottomSheetTranslateY.setValue(SCREEN.height);
@@ -1148,8 +1203,12 @@ const JsModalComponent = ({
1148
1203
  ...(zIndex !== undefined && {
1149
1204
  zIndex
1150
1205
  })
1151
- }, (isDragging || isResizing) && styles.floatingModalDragging, customStyles.container, !visible && styles.parkedOffscreen],
1152
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index2.DraggableHeader, {
1206
+ }, variant === "night" && styles.nightFloatingModal, (isDragging || isResizing) && styles.floatingModalDragging, customStyles.container, !visible && styles.parkedOffscreen],
1207
+ children: [background && variant === "night" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1208
+ style: styles.nightBackdropFloating,
1209
+ pointerEvents: "none",
1210
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToolBackground.ToolBackground, {})
1211
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_index2.DraggableHeader, {
1153
1212
  position: floatingPosition,
1154
1213
  onDragStart: handleFloatingDragStart,
1155
1214
  onDragEnd: handleFloatingDragEnd,
@@ -1168,7 +1227,8 @@ const JsModalComponent = ({
1168
1227
  onToggleMode: toggleMode,
1169
1228
  onMinimize: onMinimize ? handleMinimize : undefined,
1170
1229
  isResizing: isDragging || isResizing,
1171
- mode: mode
1230
+ mode: mode,
1231
+ variant: variant
1172
1232
  })
1173
1233
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1174
1234
  style: styles.windowControlsContainer,
@@ -1176,11 +1236,12 @@ const JsModalComponent = ({
1176
1236
  onClose: onClose,
1177
1237
  onMinimize: onMinimize ? handleMinimize : undefined,
1178
1238
  onToggleMode: toggleMode,
1179
- mode: mode
1239
+ mode: mode,
1240
+ variant: variant
1180
1241
  })
1181
1242
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1182
- style: [styles.content, customStyles.content],
1183
- children: [disableScrollWrapper ?
1243
+ style: [styles.content, variant === "night" && styles.nightContent, customStyles.content],
1244
+ children: [background && variant !== "night" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToolBackground.ToolBackground, {}) : null, disableScrollWrapper ?
1184
1245
  /*#__PURE__*/
1185
1246
  // Render children directly when they manage their own scrolling (FlatList, etc.)
1186
1247
  (0, _jsxRuntime.jsx)(_reactNative.View, {
@@ -1264,30 +1325,36 @@ const JsModalComponent = ({
1264
1325
  }]
1265
1326
  }],
1266
1327
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Animated.View, {
1267
- style: [styles.bottomSheet, customStyles.container, {
1328
+ style: [styles.bottomSheet, variant === "night" && styles.nightBottomSheet, customStyles.container, {
1268
1329
  height: externalAnimatedHeight || animatedBottomPosition
1269
1330
  }],
1270
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(ModalHeader, {
1331
+ children: [background && variant === "night" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1332
+ style: styles.nightBackdropSheet,
1333
+ pointerEvents: "none",
1334
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToolBackground.ToolBackground, {})
1335
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(ModalHeader, {
1271
1336
  header: header,
1272
1337
  onClose: onClose,
1273
1338
  onToggleMode: toggleMode,
1274
1339
  onMinimize: onMinimize ? handleMinimize : undefined,
1275
1340
  isResizing: isResizing,
1276
1341
  mode: mode,
1277
- panHandlers: bottomSheetPanResponder.panHandlers
1342
+ panHandlers: bottomSheetPanResponder.panHandlers,
1343
+ variant: variant
1278
1344
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1279
1345
  style: styles.windowControlsContainer,
1280
1346
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_index2.WindowControls, {
1281
1347
  onClose: onClose,
1282
1348
  onMinimize: onMinimize ? handleMinimize : undefined,
1283
1349
  onToggleMode: toggleMode,
1284
- mode: mode
1350
+ mode: mode,
1351
+ variant: variant
1285
1352
  })
1286
1353
  }), hintLoaded && showHint && mode === "bottomSheet" && !hintsDisabled && /*#__PURE__*/(0, _jsxRuntime.jsx)(_index2.ModalHintBanner, {
1287
1354
  onAcknowledge: handleHintAcknowledge
1288
1355
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1289
- style: [styles.content, customStyles.content],
1290
- children: [disableScrollWrapper ?
1356
+ style: [styles.content, variant === "night" && styles.nightContent, customStyles.content],
1357
+ children: [background && variant !== "night" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToolBackground.ToolBackground, {}) : null, disableScrollWrapper ?
1291
1358
  /*#__PURE__*/
1292
1359
  // Render children directly when they manage their own scrolling (FlatList, etc.)
1293
1360
  (0, _jsxRuntime.jsx)(_reactNative.View, {
@@ -1407,6 +1474,75 @@ const styles = _reactNative.StyleSheet.create({
1407
1474
  borderBottomWidth: 1,
1408
1475
  borderBottomColor: _index.buoyColors.border
1409
1476
  },
1477
+ // ── Night variant (Everlights sheet — see ui/night/nightTheme.ts) ────────
1478
+ // NO `overflow: "hidden"` on the sheets: Fabric clips children to the
1479
+ // square rect, so the star-field layer's corner painted OVER the rounded
1480
+ // corner (it read as chopped off) — and iOS suppresses a layer's own shadow
1481
+ // when it clips. The backdrop clips itself instead (nightBackdrop* below).
1482
+ nightBottomSheet: {
1483
+ backgroundColor: _nightTheme.night.color.bg,
1484
+ borderTopLeftRadius: _nightTheme.night.radius.sheet,
1485
+ borderTopRightRadius: _nightTheme.night.radius.sheet,
1486
+ borderWidth: _reactNative.StyleSheet.hairlineWidth,
1487
+ borderColor: _nightTheme.night.color.accent + "55",
1488
+ shadowColor: _nightTheme.night.color.accent,
1489
+ shadowOffset: {
1490
+ width: 0,
1491
+ height: -4
1492
+ },
1493
+ shadowOpacity: 0.22,
1494
+ shadowRadius: 10
1495
+ },
1496
+ nightFloatingModal: {
1497
+ backgroundColor: _nightTheme.night.color.bg,
1498
+ borderRadius: _nightTheme.night.radius.sheet,
1499
+ borderWidth: _reactNative.StyleSheet.hairlineWidth,
1500
+ borderColor: _nightTheme.night.color.accent + "55",
1501
+ shadowColor: _nightTheme.night.color.accent,
1502
+ shadowOffset: {
1503
+ width: 0,
1504
+ height: 0
1505
+ },
1506
+ shadowOpacity: 0.22,
1507
+ shadowRadius: 14
1508
+ },
1509
+ /** The header is glass — the sheet-level star field runs through it. */
1510
+ nightHeader: {
1511
+ backgroundColor: "transparent",
1512
+ borderWidth: 0,
1513
+ borderBottomWidth: 0,
1514
+ borderTopLeftRadius: _nightTheme.night.radius.sheet,
1515
+ borderTopRightRadius: _nightTheme.night.radius.sheet
1516
+ },
1517
+ nightContent: {
1518
+ backgroundColor: "transparent"
1519
+ },
1520
+ /**
1521
+ * The hoisted star field clips ITSELF to the sheet's corners (matching
1522
+ * radii + overflow hidden) — see the note on the sheet styles above. It
1523
+ * also keeps scenes that animate outside their own bounds (Hyperspace's
1524
+ * scaled shells) from bleeding past the window.
1525
+ */
1526
+ nightBackdropSheet: {
1527
+ ..._absoluteFill.absoluteFill,
1528
+ borderTopLeftRadius: _nightTheme.night.radius.sheet,
1529
+ borderTopRightRadius: _nightTheme.night.radius.sheet,
1530
+ overflow: "hidden"
1531
+ },
1532
+ nightBackdropFloating: {
1533
+ ..._absoluteFill.absoluteFill,
1534
+ borderRadius: _nightTheme.night.radius.sheet,
1535
+ overflow: "hidden"
1536
+ },
1537
+ /** Neutral Everlights handle instead of the glowing teal bar. */
1538
+ nightDragIndicator: {
1539
+ width: 36,
1540
+ height: 5,
1541
+ borderRadius: 2.5,
1542
+ backgroundColor: _nightTheme.night.color.placeholder,
1543
+ shadowOpacity: 0,
1544
+ elevation: 0
1545
+ },
1410
1546
  floatingHeader: {
1411
1547
  borderTopLeftRadius: 6,
1412
1548
  borderTopRightRadius: 6
@@ -7,6 +7,8 @@ exports.JsModal = void 0;
7
7
  var _react = require("react");
8
8
  var _devToolsStorageKeys = require("./storage/devToolsStorageKeys.js");
9
9
  var _index = require("./context/index.js");
10
+ var _ToolBackground = require("./ui/backgrounds/ToolBackground.js");
11
+ var _nightTheme = require("./ui/night/nightTheme.js");
10
12
  var _jsxRuntime = require("react/jsx-runtime");
11
13
  /**
12
14
  * JsModal.web — DOM port of JsModal.tsx (React Native).
@@ -78,6 +80,12 @@ var _jsxRuntime = require("react/jsx-runtime");
78
80
  * @platform React DOM Web (Vite, Tauri, Capacitor/Ionic, Electron)
79
81
  */
80
82
 
83
+ // RN component, but safe here: every consumer of the web modal (desktop
84
+ // renderer, website demos) aliases `react-native` to react-native-web, and
85
+ // the backgrounds primitives handle RNW explicitly (see backgrounds/README).
86
+
87
+ // Pure token module (no react-native import) — safe on web.
88
+
81
89
  // ============================================================================
82
90
  // PALETTE — inlined from shared-ui with provenance (RN-only modules on web)
83
91
  // ============================================================================
@@ -470,9 +478,11 @@ function WindowControls({
470
478
  const DragIndicator = /*#__PURE__*/(0, _react.memo)(function DragIndicator({
471
479
  isResizing,
472
480
  mode,
473
- hasCustomContent = false
481
+ hasCustomContent = false,
482
+ variant = "default"
474
483
  }) {
475
484
  const floating = mode === "floating";
485
+ const isNight = variant === "night";
476
486
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
477
487
  style: {
478
488
  display: "flex",
@@ -489,12 +499,13 @@ const DragIndicator = /*#__PURE__*/(0, _react.memo)(function DragIndicator({
489
499
  style: {
490
500
  // native dragIndicator: 40x3 teal bar, radius 2, teal glow
491
501
  // (shadowOpacity 0.6, radius 4); floating variant: 50x5 textMuted;
492
- // active (isResizing/isDragging): teal, width 40
493
- width: isResizing ? 40 : floating ? 50 : 40,
494
- height: floating ? 5 : 3,
495
- backgroundColor: isResizing ? buoy.primary : floating ? buoy.textMuted : buoy.primary,
496
- borderRadius: 2,
497
- boxShadow: `0 0 4px ${buoy.primary}99`
502
+ // active (isResizing/isDragging): teal, width 40.
503
+ // Night: the neutral 36x5 Everlights handle, no glow, both modes.
504
+ width: isNight ? 36 : isResizing ? 40 : floating ? 50 : 40,
505
+ height: isNight ? 5 : floating ? 5 : 3,
506
+ backgroundColor: isNight ? _nightTheme.night.color.placeholder : isResizing ? buoy.primary : floating ? buoy.textMuted : buoy.primary,
507
+ borderRadius: isNight ? 2.5 : 2,
508
+ boxShadow: isNight ? "none" : `0 0 4px ${buoy.primary}99`
498
509
  }
499
510
  }), isResizing && mode === "bottomSheet" && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
500
511
  style: {
@@ -628,7 +639,8 @@ function ModalHeaderContent({
628
639
  header,
629
640
  isResizing,
630
641
  mode,
631
- onMinimize
642
+ onMinimize,
643
+ variant = "default"
632
644
  }) {
633
645
  if (header?.customContent) {
634
646
  // native (non-CyberpunkModalHeader path): inject onMinimize into the
@@ -651,7 +663,8 @@ function ModalHeaderContent({
651
663
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(DragIndicator, {
652
664
  isResizing: isResizing,
653
665
  mode: mode,
654
- hasCustomContent: true
666
+ hasCustomContent: true,
667
+ variant: variant
655
668
  }), customContent]
656
669
  });
657
670
  }
@@ -666,7 +679,8 @@ function ModalHeaderContent({
666
679
  },
667
680
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(DragIndicator, {
668
681
  isResizing: isResizing,
669
- mode: mode
682
+ mode: mode,
683
+ variant: variant
670
684
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
671
685
  style: {
672
686
  // native headerContent: paddingHorizontal 16, alignItems center
@@ -743,7 +757,9 @@ const JsModalComponent = ({
743
757
  minimizeTargetPosition,
744
758
  initialModalState,
745
759
  zIndex,
746
- disableScrollWrapper = false
760
+ disableScrollWrapper = false,
761
+ background = true,
762
+ variant = "night"
747
763
  }) => {
748
764
  const [insets] = (0, _react.useState)(readSafeAreaInsets);
749
765
  const [isStateLoaded, setIsStateLoaded] = (0, _react.useState)(!enablePersistence);
@@ -1346,9 +1362,23 @@ const JsModalComponent = ({
1346
1362
  }, "hidden");
1347
1363
  }
1348
1364
  const dialogLabel = header?.title || "Dev tool panel";
1365
+ const isNight = variant === "night";
1366
+
1367
+ // Night: the star field fills the whole sheet — header included — instead
1368
+ // of starting under the header band (native parity: hoisted to sheet root).
1369
+ const nightBackdrop = background && isNight ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
1370
+ style: {
1371
+ position: "absolute",
1372
+ inset: 0,
1373
+ pointerEvents: "none"
1374
+ },
1375
+ "aria-hidden": true,
1376
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToolBackground.ToolBackground, {})
1377
+ }) : null;
1349
1378
 
1350
1379
  // Content block shared by both modes — native styles.content:
1351
1380
  // flex 1, bg base #121212, borderBottomRadius 16, overflow hidden.
1381
+ // Night: transparent, so the sheet-level star field shows through.
1352
1382
  const contentBlock = /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
1353
1383
  style: {
1354
1384
  flex: 1,
@@ -1356,13 +1386,13 @@ const JsModalComponent = ({
1356
1386
  position: "relative",
1357
1387
  display: "flex",
1358
1388
  flexDirection: "column",
1359
- backgroundColor: buoy.base,
1389
+ backgroundColor: isNight ? "transparent" : buoy.base,
1360
1390
  borderBottomLeftRadius: 16,
1361
1391
  borderBottomRightRadius: 16,
1362
1392
  overflow: "hidden",
1363
1393
  ...customStyles.content
1364
1394
  },
1365
- children: [disableScrollWrapper ?
1395
+ children: [background && !isNight ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToolBackground.ToolBackground, {}) : null, disableScrollWrapper ?
1366
1396
  /*#__PURE__*/
1367
1397
  // children manage their own scrolling (native: plain flex View)
1368
1398
  (0, _jsxRuntime.jsx)("div", {
@@ -1437,27 +1467,32 @@ const JsModalComponent = ({
1437
1467
  transform: `translate(${posRef.current.x}px, ${posRef.current.y}px)`,
1438
1468
  display: "flex",
1439
1469
  flexDirection: "column",
1440
- backgroundColor: buoy.card,
1441
- borderRadius: 6,
1442
- border: active ? `2px solid ${buoy.primary}` : `1px solid ${buoy.border}`,
1443
- boxShadow: active ? `0 0 12px ${buoy.primary}7A` : `0 0 20px ${buoy.primary}4D`,
1470
+ backgroundColor: isNight ? _nightTheme.night.color.bg : buoy.card,
1471
+ borderRadius: isNight ? _nightTheme.night.radius.sheet : 6,
1472
+ border: isNight ? `1px solid ${_nightTheme.night.color.accent}55` : active ? `2px solid ${buoy.primary}` : `1px solid ${buoy.border}`,
1473
+ boxShadow: isNight ? `0 0 14px ${_nightTheme.night.color.accent}38` : active ? `0 0 12px ${buoy.primary}7A` : `0 0 20px ${buoy.primary}4D`,
1474
+ // Night clips the hoisted star field to the rounded window.
1475
+ ...(isNight ? {
1476
+ overflow: "hidden"
1477
+ } : null),
1444
1478
  boxSizing: "border-box",
1445
1479
  // RN borders draw inside the rect
1446
1480
  zIndex: zIndex ?? 1000,
1447
1481
  ...customStyles.container
1448
1482
  },
1449
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
1483
+ children: [nightBackdrop, /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
1450
1484
  onPointerDown: handleFloatPointerDown,
1451
1485
  onPointerMove: handleFloatPointerMove,
1452
1486
  onPointerUp: handleFloatPointerUp,
1453
1487
  onPointerCancel: handleFloatPointerCancel,
1454
1488
  style: {
1455
- // native styles.header (+ floatingHeader top radius 6)
1456
- borderTopLeftRadius: 6,
1457
- borderTopRightRadius: 6,
1458
- backgroundColor: buoy.card,
1489
+ // native styles.header (+ floatingHeader top radius 6);
1490
+ // night: transparent glass, no border — the field runs through
1491
+ borderTopLeftRadius: isNight ? _nightTheme.night.radius.sheet : 6,
1492
+ borderTopRightRadius: isNight ? _nightTheme.night.radius.sheet : 6,
1493
+ backgroundColor: isNight ? "transparent" : buoy.card,
1459
1494
  minHeight: 56,
1460
- border: `1px solid ${buoy.border}`,
1495
+ border: isNight ? "none" : `1px solid ${buoy.border}`,
1461
1496
  boxSizing: "border-box",
1462
1497
  display: "flex",
1463
1498
  flexDirection: "column",
@@ -1465,13 +1500,16 @@ const JsModalComponent = ({
1465
1500
  flexShrink: 0,
1466
1501
  touchAction: "none",
1467
1502
  userSelect: "none",
1468
- cursor: isDragging ? "grabbing" : "grab" // web-only affordance
1503
+ cursor: isDragging ? "grabbing" : "grab",
1504
+ // web-only affordance
1505
+ position: "relative"
1469
1506
  },
1470
1507
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ModalHeaderContent, {
1471
1508
  header: header,
1472
1509
  isResizing: isDragging || isResizing,
1473
1510
  mode: mode,
1474
- onMinimize: onMinimize ? handleMinimize : undefined
1511
+ onMinimize: onMinimize ? handleMinimize : undefined,
1512
+ variant: variant
1475
1513
  })
1476
1514
  }), windowControlsBlock, contentBlock, ["bottomLeft", "bottomRight"].map(corner => /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
1477
1515
  onPointerDown: handleResizePointerDown(corner),
@@ -1533,31 +1571,36 @@ const JsModalComponent = ({
1533
1571
  "aria-label": dialogLabel,
1534
1572
  style: {
1535
1573
  // native bottomSheet: card bg, top radius 6, 1px #333 border,
1536
- // teal shadow (offset 0/-4, opacity 0.2, radius 12)
1574
+ // teal shadow (offset 0/-4, opacity 0.2, radius 12).
1575
+ // Night: #050505 sheet, top radius 16, hairline accent border.
1537
1576
  height: currentHeightRef.current,
1538
1577
  display: "flex",
1539
1578
  flexDirection: "column",
1540
- backgroundColor: buoy.card,
1541
- borderTopLeftRadius: 6,
1542
- borderTopRightRadius: 6,
1543
- border: `1px solid ${buoy.border}`,
1544
- boxShadow: `0 -4px 12px ${buoy.primary}33`,
1579
+ backgroundColor: isNight ? _nightTheme.night.color.bg : buoy.card,
1580
+ borderTopLeftRadius: isNight ? _nightTheme.night.radius.sheet : 6,
1581
+ borderTopRightRadius: isNight ? _nightTheme.night.radius.sheet : 6,
1582
+ border: isNight ? `1px solid ${_nightTheme.night.color.accent}55` : `1px solid ${buoy.border}`,
1583
+ boxShadow: isNight ? `0 -4px 10px ${_nightTheme.night.color.accent}38` : `0 -4px 12px ${buoy.primary}33`,
1584
+ // Night clips the hoisted star field to the rounded sheet.
1585
+ ...(isNight ? {
1586
+ overflow: "hidden"
1587
+ } : null),
1545
1588
  boxSizing: "border-box",
1546
1589
  position: "relative",
1547
1590
  ...customStyles.container
1548
1591
  },
1549
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
1592
+ children: [nightBackdrop, /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
1550
1593
  onPointerDown: handleSheetPointerDown,
1551
1594
  onPointerMove: handleSheetPointerMove,
1552
1595
  onPointerUp: handleSheetPointerUp,
1553
1596
  onPointerCancel: handleSheetPointerCancel,
1554
1597
  style: {
1555
- // native styles.header
1556
- borderTopLeftRadius: 6,
1557
- borderTopRightRadius: 6,
1558
- backgroundColor: buoy.card,
1598
+ // native styles.header; night: transparent glass, no border
1599
+ borderTopLeftRadius: isNight ? _nightTheme.night.radius.sheet : 6,
1600
+ borderTopRightRadius: isNight ? _nightTheme.night.radius.sheet : 6,
1601
+ backgroundColor: isNight ? "transparent" : buoy.card,
1559
1602
  minHeight: 56,
1560
- border: `1px solid ${buoy.border}`,
1603
+ border: isNight ? "none" : `1px solid ${buoy.border}`,
1561
1604
  boxSizing: "border-box",
1562
1605
  display: "flex",
1563
1606
  flexDirection: "column",
@@ -1565,13 +1608,16 @@ const JsModalComponent = ({
1565
1608
  flexShrink: 0,
1566
1609
  touchAction: "none",
1567
1610
  userSelect: "none",
1568
- cursor: "ns-resize" // web-only affordance
1611
+ cursor: "ns-resize",
1612
+ // web-only affordance
1613
+ position: "relative"
1569
1614
  },
1570
1615
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ModalHeaderContent, {
1571
1616
  header: header,
1572
1617
  isResizing: isResizing,
1573
1618
  mode: mode,
1574
- onMinimize: onMinimize ? handleMinimize : undefined
1619
+ onMinimize: onMinimize ? handleMinimize : undefined,
1620
+ variant: variant
1575
1621
  })
1576
1622
  }), windowControlsBlock, hintLoaded && showHint && !hintsDisabled && /*#__PURE__*/(0, _jsxRuntime.jsx)(ModalHintBanner, {
1577
1623
  onAcknowledge: handleHintAcknowledge
@@ -8,6 +8,7 @@ var _react = require("react");
8
8
  var _reactNative = require("react-native");
9
9
  var _displayValue = require("../utils/displayValue.js");
10
10
  var _index = require("../ui/gameUI/index.js");
11
+ var _nightTheme = require("../ui/night/nightTheme.js");
11
12
  var _CopyButton = require("../ui/components/CopyButton.js");
12
13
  var _index2 = require("../icons/index.js");
13
14
  var _IndentGuidesOverlay = require("./IndentGuidesOverlay.js");
@@ -57,11 +58,13 @@ const TYPE_COLOR_CACHE = new Map([["string", _index.gameUIColors.dataTypes.strin
57
58
  // Pre-computed stable styles with React Query-inspired design
58
59
  const STABLE_STYLES = _reactNative.StyleSheet.create({
59
60
  container: {
60
- backgroundColor: _index.gameUIColors.primary + "08",
61
- // bg-white/[0.03]
61
+ // Night inset panel: darker than the card it sits in, hairline border —
62
+ // the old white-wash fill (primary+"08") read as a grey slab on the
63
+ // night surfaces. Global on purpose: every tool is moving to night.
64
+ backgroundColor: _nightTheme.night.color.bg,
62
65
  borderRadius: 8,
63
66
  borderWidth: 1,
64
- borderColor: _index.gameUIColors.primary + "14" // border-white/[0.08]
67
+ borderColor: _nightTheme.night.color.border
65
68
  },
66
69
  header: {
67
70
  flexDirection: "column",
@@ -893,7 +896,14 @@ const VirtualizedItemComponent = ({
893
896
  style: [STABLE_STYLES.itemContainer, indentStyle],
894
897
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
895
898
  "sentry-label": "ignore devtools data explorer item",
896
- style: [STABLE_STYLES.itemTouchable, isPressed && STABLE_STYLES.itemTouchablePressed, isSelected && STABLE_STYLES.itemSelected, isLongKey && {
899
+ style: [STABLE_STYLES.itemTouchable, isPressed && STABLE_STYLES.itemTouchablePressed,
900
+ // The selected wash exists for the action-bar/edit flow. In a plain
901
+ // read-only viewer every expand/collapse tap ALSO selects, which
902
+ // left a permanent grey strip on the last-tapped row (the collapsed
903
+ // root, usually) — so the wash only paints when selection means
904
+ // something. selectedId still tracks either way: the indent-guide
905
+ // depth highlight uses it.
906
+ canEdit && isSelected && STABLE_STYLES.itemSelected, isLongKey && {
897
907
  minHeight: LONG_ITEM_HEIGHT,
898
908
  paddingVertical: 2
899
909
  }],