@buoy-gg/shared-ui 7.0.26 → 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.
- package/lib/commonjs/JsModal.js +156 -20
- package/lib/commonjs/JsModal.web.js +85 -39
- package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +14 -4
- package/lib/commonjs/dataViewer/diffThemes.js +20 -18
- package/lib/commonjs/dataViewer/tree/TreeDiffViewer.js +8 -8
- package/lib/commonjs/hooks/safe-area-impl.js +1 -1
- package/lib/commonjs/icons/lucide-icons.js +74 -15
- package/lib/commonjs/index.js +86 -0
- package/lib/commonjs/ui/backgrounds/BackgroundSwitcher.js +248 -74
- package/lib/commonjs/ui/backgrounds/README.md +102 -20
- package/lib/commonjs/ui/backgrounds/backgroundStore.js +20 -6
- package/lib/commonjs/ui/backgrounds/index.js +91 -1
- package/lib/commonjs/ui/backgrounds/primitives.js +50 -14
- package/lib/commonjs/ui/backgrounds/registry.js +41 -64
- package/lib/commonjs/ui/backgrounds/rng.js +21 -0
- package/lib/commonjs/ui/backgrounds/skyClock.js +45 -0
- package/lib/commonjs/ui/backgrounds/variants/daylight.js +453 -0
- package/lib/commonjs/ui/backgrounds/variants/deepField.js +60 -30
- package/lib/commonjs/ui/backgrounds/variants/hyperspace.js +218 -0
- package/lib/commonjs/ui/backgrounds/variants/liveSky.js +898 -0
- package/lib/commonjs/ui/backgrounds/variants/meteors.js +257 -0
- package/lib/commonjs/ui/backgrounds/variants/moonlight.js +472 -0
- package/lib/commonjs/ui/backgrounds/variants/underwater.js +757 -0
- package/lib/commonjs/ui/components/Badge.js +11 -10
- package/lib/commonjs/ui/components/CompactRow.js +30 -17
- package/lib/commonjs/ui/components/DevToolsCard.js +12 -8
- package/lib/commonjs/ui/components/DynamicFilterView.js +43 -41
- package/lib/commonjs/ui/components/EventStepperFooter.js +38 -10
- package/lib/commonjs/ui/components/FilterComponents.js +11 -11
- package/lib/commonjs/ui/components/ModalHeader.js +13 -13
- package/lib/commonjs/ui/components/SectionHeader.js +3 -1
- package/lib/commonjs/ui/components/StorageTypeBadge.js +3 -2
- package/lib/commonjs/ui/components/TabSelector.js +56 -38
- package/lib/commonjs/ui/components/ValueTypeBadge.js +7 -6
- package/lib/commonjs/ui/components/WindowControls.js +37 -10
- package/lib/commonjs/ui/gameUI/constants/gameUIColors.js +8 -0
- package/lib/commonjs/ui/night/nightTheme.js +120 -0
- package/lib/commonjs/ui/night/primitives.js +498 -0
- package/lib/module/JsModal.js +156 -20
- package/lib/module/JsModal.web.js +83 -39
- package/lib/module/dataViewer/VirtualizedDataExplorer.js +14 -4
- package/lib/module/dataViewer/diffThemes.js +20 -18
- package/lib/module/dataViewer/tree/TreeDiffViewer.js +9 -9
- package/lib/module/hooks/safe-area-impl.js +1 -1
- package/lib/module/icons/lucide-icons.js +74 -15
- package/lib/module/index.js +4 -0
- package/lib/module/ui/backgrounds/BackgroundSwitcher.js +250 -76
- package/lib/module/ui/backgrounds/README.md +102 -20
- package/lib/module/ui/backgrounds/backgroundStore.js +19 -5
- package/lib/module/ui/backgrounds/index.js +11 -2
- package/lib/module/ui/backgrounds/primitives.js +53 -16
- package/lib/module/ui/backgrounds/registry.js +41 -64
- package/lib/module/ui/backgrounds/rng.js +20 -0
- package/lib/module/ui/backgrounds/skyClock.js +39 -0
- package/lib/module/ui/backgrounds/variants/daylight.js +449 -0
- package/lib/module/ui/backgrounds/variants/deepField.js +62 -31
- package/lib/module/ui/backgrounds/variants/hyperspace.js +214 -0
- package/lib/module/ui/backgrounds/variants/liveSky.js +893 -0
- package/lib/module/ui/backgrounds/variants/meteors.js +253 -0
- package/lib/module/ui/backgrounds/variants/moonlight.js +468 -0
- package/lib/module/ui/backgrounds/variants/underwater.js +753 -0
- package/lib/module/ui/components/Badge.js +11 -10
- package/lib/module/ui/components/CompactRow.js +30 -17
- package/lib/module/ui/components/DevToolsCard.js +12 -8
- package/lib/module/ui/components/DynamicFilterView.js +43 -41
- package/lib/module/ui/components/EventStepperFooter.js +38 -10
- package/lib/module/ui/components/FilterComponents.js +11 -11
- package/lib/module/ui/components/ModalHeader.js +13 -13
- package/lib/module/ui/components/SectionHeader.js +3 -1
- package/lib/module/ui/components/StorageTypeBadge.js +3 -2
- package/lib/module/ui/components/TabSelector.js +57 -39
- package/lib/module/ui/components/ValueTypeBadge.js +7 -6
- package/lib/module/ui/components/WindowControls.js +37 -10
- package/lib/module/ui/gameUI/constants/gameUIColors.js +8 -0
- package/lib/module/ui/night/nightTheme.js +116 -0
- package/lib/module/ui/night/primitives.js +485 -0
- package/lib/typescript/commonjs/JsModal.d.ts +18 -0
- package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/JsModal.web.d.ts +13 -0
- package/lib/typescript/commonjs/JsModal.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
- package/lib/typescript/commonjs/dataViewer/diffThemes.d.ts +3 -1
- package/lib/typescript/commonjs/dataViewer/diffThemes.d.ts.map +1 -1
- package/lib/typescript/commonjs/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
- package/lib/typescript/commonjs/icons/lucide-icons.d.ts +12 -1
- package/lib/typescript/commonjs/icons/lucide-icons.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +3 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/BackgroundSwitcher.d.ts +26 -6
- package/lib/typescript/commonjs/ui/backgrounds/BackgroundSwitcher.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/backgroundStore.d.ts +3 -0
- package/lib/typescript/commonjs/ui/backgrounds/backgroundStore.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/index.d.ts +7 -1
- package/lib/typescript/commonjs/ui/backgrounds/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/primitives.d.ts +18 -3
- package/lib/typescript/commonjs/ui/backgrounds/primitives.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/registry.d.ts +8 -0
- package/lib/typescript/commonjs/ui/backgrounds/registry.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/rng.d.ts +6 -0
- package/lib/typescript/commonjs/ui/backgrounds/rng.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/skyClock.d.ts +17 -0
- package/lib/typescript/commonjs/ui/backgrounds/skyClock.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/backgrounds/types.d.ts +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/variants/daylight.d.ts +30 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/daylight.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/deepField.d.ts +19 -4
- package/lib/typescript/commonjs/ui/backgrounds/variants/deepField.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/backgrounds/variants/hyperspace.d.ts +39 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/hyperspace.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/liveSky.d.ts +41 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/liveSky.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts +26 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/meteors.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/moonlight.d.ts +35 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/moonlight.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/underwater.d.ts +51 -0
- package/lib/typescript/commonjs/ui/backgrounds/variants/underwater.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/Badge.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/CompactRow.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/DynamicFilterView.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/EventStepperFooter.d.ts +2 -0
- package/lib/typescript/commonjs/ui/components/EventStepperFooter.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/StorageTypeBadge.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/TabSelector.d.ts +9 -0
- package/lib/typescript/commonjs/ui/components/TabSelector.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ValueTypeBadge.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/WindowControls.d.ts +4 -2
- package/lib/typescript/commonjs/ui/components/WindowControls.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts +8 -0
- package/lib/typescript/commonjs/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/night/nightTheme.d.ts +113 -0
- package/lib/typescript/commonjs/ui/night/nightTheme.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/night/primitives.d.ts +111 -0
- package/lib/typescript/commonjs/ui/night/primitives.d.ts.map +1 -0
- package/lib/typescript/module/JsModal.d.ts +18 -0
- package/lib/typescript/module/JsModal.d.ts.map +1 -1
- package/lib/typescript/module/JsModal.web.d.ts +13 -0
- package/lib/typescript/module/JsModal.web.d.ts.map +1 -1
- package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
- package/lib/typescript/module/dataViewer/diffThemes.d.ts +3 -1
- package/lib/typescript/module/dataViewer/diffThemes.d.ts.map +1 -1
- package/lib/typescript/module/dataViewer/tree/TreeDiffViewer.d.ts.map +1 -1
- package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
- package/lib/typescript/module/icons/lucide-icons.d.ts +12 -1
- package/lib/typescript/module/icons/lucide-icons.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +3 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/backgrounds/BackgroundSwitcher.d.ts +26 -6
- package/lib/typescript/module/ui/backgrounds/BackgroundSwitcher.d.ts.map +1 -1
- package/lib/typescript/module/ui/backgrounds/backgroundStore.d.ts +3 -0
- package/lib/typescript/module/ui/backgrounds/backgroundStore.d.ts.map +1 -1
- package/lib/typescript/module/ui/backgrounds/index.d.ts +7 -1
- package/lib/typescript/module/ui/backgrounds/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/backgrounds/primitives.d.ts +18 -3
- package/lib/typescript/module/ui/backgrounds/primitives.d.ts.map +1 -1
- package/lib/typescript/module/ui/backgrounds/registry.d.ts +8 -0
- package/lib/typescript/module/ui/backgrounds/registry.d.ts.map +1 -1
- package/lib/typescript/module/ui/backgrounds/rng.d.ts +6 -0
- package/lib/typescript/module/ui/backgrounds/rng.d.ts.map +1 -1
- package/lib/typescript/module/ui/backgrounds/skyClock.d.ts +17 -0
- package/lib/typescript/module/ui/backgrounds/skyClock.d.ts.map +1 -0
- package/lib/typescript/module/ui/backgrounds/types.d.ts +1 -1
- package/lib/typescript/module/ui/backgrounds/types.d.ts.map +1 -1
- package/lib/typescript/module/ui/backgrounds/variants/daylight.d.ts +30 -0
- package/lib/typescript/module/ui/backgrounds/variants/daylight.d.ts.map +1 -0
- package/lib/typescript/module/ui/backgrounds/variants/deepField.d.ts +19 -4
- package/lib/typescript/module/ui/backgrounds/variants/deepField.d.ts.map +1 -1
- package/lib/typescript/module/ui/backgrounds/variants/hyperspace.d.ts +39 -0
- package/lib/typescript/module/ui/backgrounds/variants/hyperspace.d.ts.map +1 -0
- package/lib/typescript/module/ui/backgrounds/variants/liveSky.d.ts +41 -0
- package/lib/typescript/module/ui/backgrounds/variants/liveSky.d.ts.map +1 -0
- package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts +26 -0
- package/lib/typescript/module/ui/backgrounds/variants/meteors.d.ts.map +1 -0
- package/lib/typescript/module/ui/backgrounds/variants/moonlight.d.ts +35 -0
- package/lib/typescript/module/ui/backgrounds/variants/moonlight.d.ts.map +1 -0
- package/lib/typescript/module/ui/backgrounds/variants/underwater.d.ts +51 -0
- package/lib/typescript/module/ui/backgrounds/variants/underwater.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/Badge.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/CompactRow.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/DynamicFilterView.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/EventStepperFooter.d.ts +2 -0
- package/lib/typescript/module/ui/components/EventStepperFooter.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/StorageTypeBadge.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/TabSelector.d.ts +9 -0
- package/lib/typescript/module/ui/components/TabSelector.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ValueTypeBadge.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/WindowControls.d.ts +4 -2
- package/lib/typescript/module/ui/components/WindowControls.d.ts.map +1 -1
- package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts +8 -0
- package/lib/typescript/module/ui/gameUI/constants/gameUIColors.d.ts.map +1 -1
- package/lib/typescript/module/ui/night/nightTheme.d.ts +113 -0
- package/lib/typescript/module/ui/night/nightTheme.d.ts.map +1 -0
- package/lib/typescript/module/ui/night/primitives.d.ts +111 -0
- package/lib/typescript/module/ui/night/primitives.d.ts.map +1 -0
- package/package.json +4 -4
- package/lib/commonjs/ui/backgrounds/variants/lattice.js +0 -579
- package/lib/commonjs/ui/backgrounds/variants/starfield.js +0 -210
- package/lib/module/ui/backgrounds/variants/lattice.js +0 -575
- package/lib/module/ui/backgrounds/variants/starfield.js +0 -206
- package/lib/typescript/commonjs/ui/backgrounds/variants/lattice.d.ts +0 -33
- package/lib/typescript/commonjs/ui/backgrounds/variants/lattice.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/backgrounds/variants/starfield.d.ts +0 -12
- package/lib/typescript/commonjs/ui/backgrounds/variants/starfield.d.ts.map +0 -1
- package/lib/typescript/module/ui/backgrounds/variants/lattice.d.ts +0 -33
- package/lib/typescript/module/ui/backgrounds/variants/lattice.d.ts.map +0 -1
- package/lib/typescript/module/ui/backgrounds/variants/starfield.d.ts +0 -12
- package/lib/typescript/module/ui/backgrounds/variants/starfield.d.ts.map +0 -1
package/lib/module/JsModal.js
CHANGED
|
@@ -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(
|
|
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(
|
|
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
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
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
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
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"
|
|
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"
|
|
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
|
-
|
|
57
|
-
//
|
|
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:
|
|
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,
|
|
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
|
-
*
|
|
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: "
|
|
56
|
-
//
|
|
57
|
-
background: "#
|
|
58
|
-
panelBackground: "#
|
|
59
|
-
headerBackground: "#
|
|
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
|
|
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: "#
|
|
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: "#
|
|
79
|
-
lineNumberText: "#
|
|
80
|
-
lineNumberBorder: "#
|
|
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: "#
|
|
87
|
+
markerText: "#9BA1A6",
|
|
86
88
|
// Borders and dividers
|
|
87
|
-
borderColor: "#
|
|
88
|
-
dividerColor: "#
|
|
89
|
+
borderColor: "#1A1A1C",
|
|
90
|
+
dividerColor: "#1A1A1C",
|
|
89
91
|
// Summary bar
|
|
90
|
-
summaryBackground: "#
|
|
92
|
+
summaryBackground: "#0C0C0C",
|
|
91
93
|
summaryAddedText: "#20C997",
|
|
92
94
|
summaryRemovedText: "#EF4444",
|
|
93
95
|
summaryModifiedText: "#9B70E0",
|
|
94
96
|
// Empty state
|
|
95
|
-
emptyStateText: "#
|
|
97
|
+
emptyStateText: "#636366",
|
|
96
98
|
// Separator
|
|
97
|
-
separatorBackground: "#
|
|
98
|
-
separatorText: "#
|
|
99
|
+
separatorBackground: "#0C0C0C",
|
|
100
|
+
separatorText: "#9BA1A6"
|
|
99
101
|
};
|
|
100
102
|
|
|
101
103
|
/**
|