@buoy-gg/shared-ui 3.0.1 → 4.0.1
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 +2 -1
- package/lib/commonjs/clipboard/clipboard-impl.js +28 -2
- package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +3 -5
- package/lib/commonjs/hooks/safe-area-impl.js +1 -1
- package/lib/commonjs/icons/lucide-icons.js +130 -22
- package/lib/commonjs/index.js +14 -0
- package/lib/commonjs/license/DeviceLimitModal.js +2 -1
- package/lib/commonjs/license/FeatureGate.js +60 -11
- package/lib/commonjs/license/LicenseEntryModal.js +14 -3
- package/lib/commonjs/license/ManageDevicesModal.js +2 -1
- package/lib/commonjs/license/openPricing.js +36 -0
- package/lib/commonjs/storage/devToolsStorageKeys.js +1 -0
- package/lib/commonjs/stores/BaseEventStore.js +72 -2
- package/lib/commonjs/stores/ignoredPatternsStore.js +229 -0
- package/lib/commonjs/stores/index.js +26 -1
- package/lib/commonjs/ui/components/CompactRow.js +73 -66
- package/lib/commonjs/ui/components/EventHistoryViewer/EventPickerModal.js +3 -2
- package/lib/commonjs/ui/components/ExpandableSectionWithModal.js +2 -1
- package/lib/commonjs/ui/components/ExpandedInfoRow.js +13 -3
- package/lib/commonjs/ui/components/WindowControls.js +9 -3
- package/lib/commonjs/ui/console/CyberpunkConsoleSection.js +6 -5
- package/lib/commonjs/ui/console/GalaxyButton.js +2 -1
- package/lib/commonjs/ui/gameUI/components/GameUIStatusHeader.js +2 -1
- package/lib/commonjs/utils/absoluteFill.js +28 -0
- package/lib/commonjs/utils/index.js +13 -0
- package/lib/commonjs/utils/safeExpoRouter.js +59 -4
- package/lib/module/JsModal.js +2 -1
- package/lib/module/clipboard/clipboard-impl.js +28 -2
- package/lib/module/dataViewer/VirtualizedDataExplorer.js +3 -5
- package/lib/module/hooks/safe-area-impl.js +1 -1
- package/lib/module/icons/lucide-icons.js +125 -19
- package/lib/module/index.js +3 -1
- package/lib/module/license/DeviceLimitModal.js +2 -1
- package/lib/module/license/FeatureGate.js +61 -12
- package/lib/module/license/LicenseEntryModal.js +15 -4
- package/lib/module/license/ManageDevicesModal.js +2 -1
- package/lib/module/license/openPricing.js +31 -0
- package/lib/module/storage/devToolsStorageKeys.js +1 -0
- package/lib/module/stores/BaseEventStore.js +72 -2
- package/lib/module/stores/ignoredPatternsStore.js +223 -0
- package/lib/module/stores/index.js +2 -1
- package/lib/module/ui/components/CompactRow.js +73 -66
- package/lib/module/ui/components/EventHistoryViewer/EventPickerModal.js +3 -2
- package/lib/module/ui/components/ExpandableSectionWithModal.js +2 -1
- package/lib/module/ui/components/ExpandedInfoRow.js +13 -3
- package/lib/module/ui/components/WindowControls.js +10 -4
- package/lib/module/ui/console/CyberpunkConsoleSection.js +6 -5
- package/lib/module/ui/console/GalaxyButton.js +2 -1
- package/lib/module/ui/gameUI/components/GameUIStatusHeader.js +2 -1
- package/lib/module/utils/absoluteFill.js +24 -0
- package/lib/module/utils/index.js +2 -1
- package/lib/module/utils/safeExpoRouter.js +58 -4
- package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/clipboard/clipboard-impl.d.ts +3 -2
- package/lib/typescript/commonjs/clipboard/clipboard-impl.d.ts.map +1 -1
- package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.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 +5 -2
- package/lib/typescript/commonjs/icons/lucide-icons.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +1 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/license/DeviceLimitModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/license/FeatureGate.d.ts +14 -1
- package/lib/typescript/commonjs/license/FeatureGate.d.ts.map +1 -1
- package/lib/typescript/commonjs/license/LicenseEntryModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/license/ManageDevicesModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/license/openPricing.d.ts +14 -0
- package/lib/typescript/commonjs/license/openPricing.d.ts.map +1 -0
- package/lib/typescript/commonjs/storage/devToolsStorageKeys.d.ts +1 -0
- package/lib/typescript/commonjs/storage/devToolsStorageKeys.d.ts.map +1 -1
- package/lib/typescript/commonjs/stores/BaseEventStore.d.ts +28 -0
- package/lib/typescript/commonjs/stores/BaseEventStore.d.ts.map +1 -1
- package/lib/typescript/commonjs/stores/ignoredPatternsStore.d.ts +84 -0
- package/lib/typescript/commonjs/stores/ignoredPatternsStore.d.ts.map +1 -0
- package/lib/typescript/commonjs/stores/index.d.ts +1 -0
- package/lib/typescript/commonjs/stores/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/CompactRow.d.ts +3 -1
- package/lib/typescript/commonjs/ui/components/CompactRow.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/EventHistoryViewer/EventPickerModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ExpandableSectionWithModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ExpandedInfoRow.d.ts +3 -1
- package/lib/typescript/commonjs/ui/components/ExpandedInfoRow.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/WindowControls.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/console/CyberpunkConsoleSection.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/console/GalaxyButton.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/gameUI/components/GameUIStatusHeader.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/absoluteFill.d.ts +18 -0
- package/lib/typescript/commonjs/utils/absoluteFill.d.ts.map +1 -0
- package/lib/typescript/commonjs/utils/index.d.ts +2 -1
- package/lib/typescript/commonjs/utils/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/safeExpoRouter.d.ts +9 -0
- package/lib/typescript/commonjs/utils/safeExpoRouter.d.ts.map +1 -1
- package/lib/typescript/module/JsModal.d.ts.map +1 -1
- package/lib/typescript/module/clipboard/clipboard-impl.d.ts +3 -2
- package/lib/typescript/module/clipboard/clipboard-impl.d.ts.map +1 -1
- package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.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 +5 -2
- package/lib/typescript/module/icons/lucide-icons.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +1 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/license/DeviceLimitModal.d.ts.map +1 -1
- package/lib/typescript/module/license/FeatureGate.d.ts +14 -1
- package/lib/typescript/module/license/FeatureGate.d.ts.map +1 -1
- package/lib/typescript/module/license/LicenseEntryModal.d.ts.map +1 -1
- package/lib/typescript/module/license/ManageDevicesModal.d.ts.map +1 -1
- package/lib/typescript/module/license/openPricing.d.ts +14 -0
- package/lib/typescript/module/license/openPricing.d.ts.map +1 -0
- package/lib/typescript/module/storage/devToolsStorageKeys.d.ts +1 -0
- package/lib/typescript/module/storage/devToolsStorageKeys.d.ts.map +1 -1
- package/lib/typescript/module/stores/BaseEventStore.d.ts +28 -0
- package/lib/typescript/module/stores/BaseEventStore.d.ts.map +1 -1
- package/lib/typescript/module/stores/ignoredPatternsStore.d.ts +84 -0
- package/lib/typescript/module/stores/ignoredPatternsStore.d.ts.map +1 -0
- package/lib/typescript/module/stores/index.d.ts +1 -0
- package/lib/typescript/module/stores/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/CompactRow.d.ts +3 -1
- package/lib/typescript/module/ui/components/CompactRow.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/EventHistoryViewer/EventPickerModal.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ExpandableSectionWithModal.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ExpandedInfoRow.d.ts +3 -1
- package/lib/typescript/module/ui/components/ExpandedInfoRow.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/WindowControls.d.ts.map +1 -1
- package/lib/typescript/module/ui/console/CyberpunkConsoleSection.d.ts.map +1 -1
- package/lib/typescript/module/ui/console/GalaxyButton.d.ts.map +1 -1
- package/lib/typescript/module/ui/gameUI/components/GameUIStatusHeader.d.ts.map +1 -1
- package/lib/typescript/module/utils/absoluteFill.d.ts +18 -0
- package/lib/typescript/module/utils/absoluteFill.d.ts.map +1 -0
- package/lib/typescript/module/utils/index.d.ts +2 -1
- package/lib/typescript/module/utils/index.d.ts.map +1 -1
- package/lib/typescript/module/utils/safeExpoRouter.d.ts +9 -0
- package/lib/typescript/module/utils/safeExpoRouter.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.CyberpunkConsoleSection = CyberpunkConsoleSection;
|
|
7
7
|
var _react = require("react");
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
|
+
var _absoluteFill = require("../../utils/absoluteFill.js");
|
|
9
10
|
var _index = require("../../icons/index.js");
|
|
10
11
|
var _index2 = require("../gameUI/index.js");
|
|
11
12
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
@@ -484,31 +485,31 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
484
485
|
backgroundColor: "rgba(5, 5, 10, 0.6)" // Darker glass background
|
|
485
486
|
},
|
|
486
487
|
glassLayer1: {
|
|
487
|
-
...
|
|
488
|
+
..._absoluteFill.absoluteFill,
|
|
488
489
|
backgroundColor: "rgba(10, 10, 15, 0.7)",
|
|
489
490
|
opacity: 0.8
|
|
490
491
|
},
|
|
491
492
|
glassLayer2: {
|
|
492
|
-
...
|
|
493
|
+
..._absoluteFill.absoluteFill,
|
|
493
494
|
backgroundColor: "rgba(15, 15, 25, 0.5)",
|
|
494
495
|
opacity: 0.6,
|
|
495
496
|
top: "20%",
|
|
496
497
|
left: "20%"
|
|
497
498
|
},
|
|
498
499
|
glassLayer3: {
|
|
499
|
-
...
|
|
500
|
+
..._absoluteFill.absoluteFill,
|
|
500
501
|
backgroundColor: "rgba(20, 20, 35, 0.3)",
|
|
501
502
|
opacity: 0.4,
|
|
502
503
|
top: "40%",
|
|
503
504
|
left: "40%"
|
|
504
505
|
},
|
|
505
506
|
glassShimmer: {
|
|
506
|
-
...
|
|
507
|
+
..._absoluteFill.absoluteFill,
|
|
507
508
|
backgroundColor: "rgba(255, 255, 255, 0.03)",
|
|
508
509
|
opacity: 0.6
|
|
509
510
|
},
|
|
510
511
|
glitchOverlayLayer: {
|
|
511
|
-
...
|
|
512
|
+
..._absoluteFill.absoluteFill,
|
|
512
513
|
borderRadius: 12,
|
|
513
514
|
borderWidth: 1,
|
|
514
515
|
justifyContent: "center",
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.GalaxyButton = GalaxyButton;
|
|
7
7
|
var _react = require("react");
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
|
+
var _absoluteFill = require("../../utils/absoluteFill.js");
|
|
9
10
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
10
11
|
const {
|
|
11
12
|
width: screenWidth
|
|
@@ -76,7 +77,7 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
76
77
|
overflow: "hidden"
|
|
77
78
|
},
|
|
78
79
|
starsContainer: {
|
|
79
|
-
...
|
|
80
|
+
..._absoluteFill.absoluteFill,
|
|
80
81
|
overflow: "hidden"
|
|
81
82
|
},
|
|
82
83
|
starsLayer: {
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.GameUIStatusHeader = GameUIStatusHeader;
|
|
7
7
|
var _reactNative = require("react-native");
|
|
8
|
+
var _absoluteFill = require("../../../utils/absoluteFill.js");
|
|
8
9
|
var _gameUIColors = require("../constants/gameUIColors.js");
|
|
9
10
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
10
11
|
/**
|
|
@@ -82,7 +83,7 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
82
83
|
overflow: "hidden"
|
|
83
84
|
},
|
|
84
85
|
glow: {
|
|
85
|
-
...
|
|
86
|
+
..._absoluteFill.absoluteFill,
|
|
86
87
|
opacity: 0.5
|
|
87
88
|
},
|
|
88
89
|
content: {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.absoluteFill = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Spreadable absolute-fill style.
|
|
9
|
+
*
|
|
10
|
+
* Replaces `StyleSheet.absoluteFillObject`, which was REMOVED in React Native
|
|
11
|
+
* 0.85 (returns `undefined` there). Spreading `undefined` is a silent no-op, so
|
|
12
|
+
* any overlay/backdrop/full-screen Pressable that relied on it collapses to zero
|
|
13
|
+
* size on RN 0.85+ — invisible and untappable.
|
|
14
|
+
*
|
|
15
|
+
* `StyleSheet.absoluteFill` is not a safe replacement for the spread pattern
|
|
16
|
+
* because its type changed across versions: it's a registered style *number* on
|
|
17
|
+
* RN <= 0.84 (spreading a number yields `{}`) and a frozen object only on 0.85+.
|
|
18
|
+
*
|
|
19
|
+
* This plain object works identically on every RN version, whether spread
|
|
20
|
+
* (`{ ...absoluteFill }`) or passed directly (`style={absoluteFill}`).
|
|
21
|
+
*/
|
|
22
|
+
const absoluteFill = exports.absoluteFill = {
|
|
23
|
+
position: "absolute",
|
|
24
|
+
top: 0,
|
|
25
|
+
left: 0,
|
|
26
|
+
right: 0,
|
|
27
|
+
bottom: 0
|
|
28
|
+
};
|
|
@@ -9,6 +9,12 @@ Object.defineProperty(exports, "Subscribable", {
|
|
|
9
9
|
return _subscribable.Subscribable;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
+
Object.defineProperty(exports, "absoluteFill", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _absoluteFill.absoluteFill;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
12
18
|
Object.defineProperty(exports, "displayValue", {
|
|
13
19
|
enumerable: true,
|
|
14
20
|
get: function () {
|
|
@@ -51,6 +57,12 @@ Object.defineProperty(exports, "getSafeAreaInsets", {
|
|
|
51
57
|
return _getSafeAreaInsets.getSafeAreaInsets;
|
|
52
58
|
}
|
|
53
59
|
});
|
|
60
|
+
Object.defineProperty(exports, "getSafeCurrentPathname", {
|
|
61
|
+
enumerable: true,
|
|
62
|
+
get: function () {
|
|
63
|
+
return _safeExpoRouter.getSafeCurrentPathname;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
54
66
|
Object.defineProperty(exports, "getSafeRouter", {
|
|
55
67
|
enumerable: true,
|
|
56
68
|
get: function () {
|
|
@@ -195,6 +207,7 @@ Object.defineProperty(exports, "useSafeSegments", {
|
|
|
195
207
|
return _safeExpoRouter.useSafeSegments;
|
|
196
208
|
}
|
|
197
209
|
});
|
|
210
|
+
var _absoluteFill = require("./absoluteFill.js");
|
|
198
211
|
var _displayValue = require("./displayValue.js");
|
|
199
212
|
var _getSafeAreaInsets = require("./getSafeAreaInsets.js");
|
|
200
213
|
var _persistentStorage = require("./persistentStorage.js");
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.getSafeCurrentPathname = getSafeCurrentPathname;
|
|
6
7
|
exports.getSafeRouter = getSafeRouter;
|
|
7
8
|
exports.isExpoRouterAvailable = isExpoRouterAvailable;
|
|
8
9
|
exports.useSafeGlobalSearchParams = useSafeGlobalSearchParams;
|
|
@@ -31,14 +32,27 @@ let checkedAvailability = false;
|
|
|
31
32
|
* where native modules moved to the Expo Modules API.
|
|
32
33
|
*/
|
|
33
34
|
function hasExpoNativeRuntime() {
|
|
35
|
+
// Modern Expo (SDK 50+, both Old and New Architecture): expo-modules-core
|
|
36
|
+
// installs a global `expo` object — the Expo Modules API runtime — via JSI
|
|
37
|
+
// when the native runtime is actually present. This is the most reliable
|
|
38
|
+
// signal and, crucially, the ONLY one of these checks that fires on SDK 54+ /
|
|
39
|
+
// New Architecture dev builds, where the legacy NativeModules entries below
|
|
40
|
+
// are no longer registered (ExpoLinking is gone, NativeUnimoduleProxy isn't
|
|
41
|
+
// on the bridge). It stays absent on bare RN CLI, so there's no false
|
|
42
|
+
// positive there. Without this, navigation-dependent tools (route sitemap,
|
|
43
|
+
// remote navigate, perf-monitor automation) silently no-op on modern builds.
|
|
44
|
+
const expoGlobal = globalThis.expo;
|
|
45
|
+
if (expoGlobal != null && (expoGlobal.modules != null || expoGlobal.EventEmitter != null || expoGlobal.NativeModule != null)) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
|
|
34
49
|
// Check legacy NativeModules bridge (Expo SDK < 54)
|
|
35
50
|
if (_reactNative.NativeModules.ExpoLinking) {
|
|
36
51
|
return true;
|
|
37
52
|
}
|
|
38
53
|
|
|
39
|
-
// Check for Expo Modules Core native bridge (
|
|
40
|
-
|
|
41
|
-
if (_reactNative.NativeModules.NativeUnimoduleProxy) {
|
|
54
|
+
// Check for Expo Modules Core native bridge (older SDKs / Old Architecture)
|
|
55
|
+
if (_reactNative.NativeModules.NativeUnimoduleProxy || _reactNative.NativeModules.ExpoModulesCore) {
|
|
42
56
|
return true;
|
|
43
57
|
}
|
|
44
58
|
|
|
@@ -47,7 +61,7 @@ function hasExpoNativeRuntime() {
|
|
|
47
61
|
return true;
|
|
48
62
|
}
|
|
49
63
|
|
|
50
|
-
// No Expo native runtime detected.
|
|
64
|
+
// No Expo native runtime detected (e.g. bare RN CLI).
|
|
51
65
|
// NOTE: We intentionally do NOT try require("expo-modules-core") here because
|
|
52
66
|
// on RN CLI it may be bundled as a transitive dep but the native modules
|
|
53
67
|
// (requireOptionalNativeModule etc.) are undefined, causing crashes.
|
|
@@ -161,6 +175,47 @@ function getSafeRouter() {
|
|
|
161
175
|
}
|
|
162
176
|
}
|
|
163
177
|
|
|
178
|
+
// ============================================================================
|
|
179
|
+
// Imperative current-route getter
|
|
180
|
+
// ============================================================================
|
|
181
|
+
|
|
182
|
+
// expo-router doesn't publicly re-export its imperative store, so we reach it
|
|
183
|
+
// via its build path. Cached + best-effort: if a future expo-router moves this
|
|
184
|
+
// path the require throws and the imperative fallback simply disables (callers
|
|
185
|
+
// degrade to route-events history). expo-router's store exposes getRouteInfo(),
|
|
186
|
+
// which returns the live pathname even before any navigation is recorded.
|
|
187
|
+
let routerStore;
|
|
188
|
+
function getRouterStore() {
|
|
189
|
+
if (routerStore !== undefined) return routerStore;
|
|
190
|
+
try {
|
|
191
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
192
|
+
routerStore = require("expo-router/build/global-state/router-store")?.store ?? null;
|
|
193
|
+
} catch {
|
|
194
|
+
routerStore = null;
|
|
195
|
+
}
|
|
196
|
+
return routerStore;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* The current route pathname, read imperatively from expo-router's store.
|
|
201
|
+
*
|
|
202
|
+
* Unlike a route-events history lookup, this works even before any navigation
|
|
203
|
+
* has been recorded — e.g. right after a cold start while the app sits on its
|
|
204
|
+
* initial route. Returns null when expo-router isn't available or the store
|
|
205
|
+
* can't be reached.
|
|
206
|
+
*/
|
|
207
|
+
function getSafeCurrentPathname() {
|
|
208
|
+
if (!checkExpoRouterAvailability()) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
const pathname = getRouterStore()?.getRouteInfo?.()?.pathname;
|
|
213
|
+
return typeof pathname === "string" && pathname.length > 0 ? pathname : null;
|
|
214
|
+
} catch (error) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
164
219
|
// ============================================================================
|
|
165
220
|
// Availability check
|
|
166
221
|
// ============================================================================
|
package/lib/module/JsModal.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
import { useState, useRef, useEffect, useMemo, useCallback, memo, isValidElement, cloneElement } from "react";
|
|
16
16
|
import { View, StyleSheet, TouchableWithoutFeedback, Dimensions, PanResponder, Animated, ScrollView, Text } from "react-native";
|
|
17
|
+
import { absoluteFill } from "./utils/absoluteFill.js";
|
|
17
18
|
import { useSafeAreaInsets } from "./hooks/useSafeAreaInsets.js";
|
|
18
19
|
import { gameUIColors, buoyColors } from "./ui/gameUI/index.js";
|
|
19
20
|
import { DraggableHeader, ModalHintBanner, WindowControls } from "./ui/components/index.js";
|
|
@@ -1237,7 +1238,7 @@ const JsModalComponent = ({
|
|
|
1237
1238
|
// ============================================================================
|
|
1238
1239
|
const styles = StyleSheet.create({
|
|
1239
1240
|
fullScreenContainer: {
|
|
1240
|
-
...
|
|
1241
|
+
...absoluteFill,
|
|
1241
1242
|
zIndex: 1000
|
|
1242
1243
|
},
|
|
1243
1244
|
bottomSheetWrapper: {
|
|
@@ -16,9 +16,17 @@
|
|
|
16
16
|
* Fallback chain:
|
|
17
17
|
* 1. expo-clipboard
|
|
18
18
|
* 2. @react-native-clipboard/clipboard
|
|
19
|
-
* 3.
|
|
19
|
+
* 3. Web clipboard API (navigator.clipboard)
|
|
20
|
+
* 4. Graceful failure
|
|
20
21
|
*/
|
|
21
22
|
|
|
23
|
+
// navigator.clipboard isn't in React Native's TS lib — narrow it manually
|
|
24
|
+
|
|
25
|
+
function getWebClipboard() {
|
|
26
|
+
if (typeof navigator === "undefined") return null;
|
|
27
|
+
const clipboard = navigator.clipboard;
|
|
28
|
+
return clipboard && typeof clipboard.writeText === "function" ? clipboard : null;
|
|
29
|
+
}
|
|
22
30
|
// Grab module references at load time (top-level try-catch for Metro)
|
|
23
31
|
// Always require both — we decide which actually works at call time
|
|
24
32
|
let _expoClipboard = null;
|
|
@@ -63,6 +71,21 @@ async function detect(text) {
|
|
|
63
71
|
return true;
|
|
64
72
|
} catch {/* rn-clipboard not functional */}
|
|
65
73
|
}
|
|
74
|
+
|
|
75
|
+
// 3. Web fallback (react-native-web / desktop dashboard / browsers)
|
|
76
|
+
const webClipboard = getWebClipboard();
|
|
77
|
+
if (webClipboard) {
|
|
78
|
+
try {
|
|
79
|
+
await webClipboard.writeText(text);
|
|
80
|
+
_detectedType = "web";
|
|
81
|
+
_clipboardFn = async t => {
|
|
82
|
+
await webClipboard.writeText(t);
|
|
83
|
+
return true;
|
|
84
|
+
};
|
|
85
|
+
_detected = true;
|
|
86
|
+
return true;
|
|
87
|
+
} catch {/* clipboard permission denied */}
|
|
88
|
+
}
|
|
66
89
|
_detected = true;
|
|
67
90
|
return false;
|
|
68
91
|
}
|
|
@@ -71,7 +94,10 @@ export const clipboardType = () => {
|
|
|
71
94
|
};
|
|
72
95
|
export const isClipboardAvailable = () => {
|
|
73
96
|
// Before first use, optimistically return true if we have a module ref
|
|
74
|
-
|
|
97
|
+
// or the web clipboard API is present
|
|
98
|
+
if (!_detected) {
|
|
99
|
+
return _expoClipboard != null || _rnClipboard != null || getWebClipboard() != null;
|
|
100
|
+
}
|
|
75
101
|
return _clipboardFn != null;
|
|
76
102
|
};
|
|
77
103
|
export const clipboardFunction = async text => {
|
|
@@ -723,7 +723,6 @@ const useDataFlattening = (data, maxDepth = 10, autoExpandFirstLevel = false) =>
|
|
|
723
723
|
const VirtualizedItemComponent = ({
|
|
724
724
|
item,
|
|
725
725
|
onToggleExpanded,
|
|
726
|
-
data,
|
|
727
726
|
index,
|
|
728
727
|
onSelect,
|
|
729
728
|
isSelected
|
|
@@ -787,9 +786,9 @@ const VirtualizedItemComponent = ({
|
|
|
787
786
|
children: formatValue(item.value, item.valueType)
|
|
788
787
|
})]
|
|
789
788
|
})]
|
|
790
|
-
}), item.
|
|
791
|
-
value:
|
|
792
|
-
size:
|
|
789
|
+
}), item.value !== undefined ? /*#__PURE__*/_jsx(CopyButton, {
|
|
790
|
+
value: item.value,
|
|
791
|
+
size: 14,
|
|
793
792
|
buttonStyle: {
|
|
794
793
|
marginLeft: 8,
|
|
795
794
|
marginRight: 8
|
|
@@ -874,7 +873,6 @@ export const VirtualizedDataExplorer = ({
|
|
|
874
873
|
item: item,
|
|
875
874
|
index: index,
|
|
876
875
|
onToggleExpanded: toggleExpanded,
|
|
877
|
-
data: data,
|
|
878
876
|
onSelect: setSelectedIndex,
|
|
879
877
|
isSelected: selectedIndex === index
|
|
880
878
|
});
|
|
@@ -505,6 +505,31 @@ export const Eye = ({
|
|
|
505
505
|
strokeWidth: strokeWidth
|
|
506
506
|
})]
|
|
507
507
|
});
|
|
508
|
+
export const Pin = ({
|
|
509
|
+
size = 24,
|
|
510
|
+
color = "currentColor",
|
|
511
|
+
strokeWidth = 2,
|
|
512
|
+
...props
|
|
513
|
+
}) => /*#__PURE__*/_jsxs(Svg, {
|
|
514
|
+
width: size,
|
|
515
|
+
height: size,
|
|
516
|
+
viewBox: "0 0 24 24",
|
|
517
|
+
...props,
|
|
518
|
+
children: [/*#__PURE__*/_jsx(Circle, {
|
|
519
|
+
cx: 12,
|
|
520
|
+
cy: 9,
|
|
521
|
+
r: 5,
|
|
522
|
+
stroke: color,
|
|
523
|
+
strokeWidth: strokeWidth
|
|
524
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
525
|
+
x1: 12,
|
|
526
|
+
y1: 14,
|
|
527
|
+
x2: 12,
|
|
528
|
+
y2: 21,
|
|
529
|
+
stroke: color,
|
|
530
|
+
strokeWidth: strokeWidth
|
|
531
|
+
})]
|
|
532
|
+
});
|
|
508
533
|
export const EyeOff = ({
|
|
509
534
|
size = 24,
|
|
510
535
|
color = "currentColor",
|
|
@@ -1361,7 +1386,65 @@ export const Plus = ({
|
|
|
1361
1386
|
strokeWidth: strokeWidth
|
|
1362
1387
|
})]
|
|
1363
1388
|
});
|
|
1389
|
+
|
|
1390
|
+
// Refresh / reload icon: a smooth 270° ring (open on the right) with a
|
|
1391
|
+
// clockwise triangle arrowhead. Built from the buoy icon-editor design
|
|
1392
|
+
// (smootharc ring + triangle) using the View-based border trick so it stays
|
|
1393
|
+
// crisp at any size. `strokeWidth` is accepted for API compatibility but the
|
|
1394
|
+
// proportions are fixed to keep the perfected look.
|
|
1364
1395
|
export const RefreshCw = ({
|
|
1396
|
+
size = 24,
|
|
1397
|
+
color = "currentColor",
|
|
1398
|
+
strokeWidth: _strokeWidth = 2,
|
|
1399
|
+
...props
|
|
1400
|
+
}) => {
|
|
1401
|
+
const RING_RADIUS = 7; // outer radius, centered in the 24x24 viewBox
|
|
1402
|
+
const RING_STROKE = 2.4;
|
|
1403
|
+
const ARROW_SIZE = 5.2;
|
|
1404
|
+
const ARROW_HALF = ARROW_SIZE * 0.577; // equilateral-ish half-width
|
|
1405
|
+
// Arrowhead anchor (from the editor design, mapped into the 0..24 viewBox)
|
|
1406
|
+
const arrowLeft = 12 + 3.162277660168379;
|
|
1407
|
+
const arrowTop = 12 - 2.846049894151541 - ARROW_HALF;
|
|
1408
|
+
return /*#__PURE__*/_jsxs(Svg, {
|
|
1409
|
+
width: size,
|
|
1410
|
+
height: size,
|
|
1411
|
+
viewBox: "0 0 24 24",
|
|
1412
|
+
...props,
|
|
1413
|
+
children: [/*#__PURE__*/_jsx(View, {
|
|
1414
|
+
style: {
|
|
1415
|
+
position: "absolute",
|
|
1416
|
+
left: 12 - RING_RADIUS,
|
|
1417
|
+
top: 12 - RING_RADIUS,
|
|
1418
|
+
width: RING_RADIUS * 2,
|
|
1419
|
+
height: RING_RADIUS * 2,
|
|
1420
|
+
borderRadius: RING_RADIUS,
|
|
1421
|
+
borderWidth: RING_STROKE,
|
|
1422
|
+
borderTopColor: color,
|
|
1423
|
+
borderLeftColor: color,
|
|
1424
|
+
borderBottomColor: color,
|
|
1425
|
+
borderRightColor: "transparent"
|
|
1426
|
+
}
|
|
1427
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
1428
|
+
style: {
|
|
1429
|
+
position: "absolute",
|
|
1430
|
+
left: arrowLeft,
|
|
1431
|
+
top: arrowTop,
|
|
1432
|
+
width: 0,
|
|
1433
|
+
height: 0,
|
|
1434
|
+
borderTopWidth: ARROW_HALF,
|
|
1435
|
+
borderBottomWidth: ARROW_HALF,
|
|
1436
|
+
borderLeftWidth: ARROW_SIZE,
|
|
1437
|
+
borderTopColor: "transparent",
|
|
1438
|
+
borderBottomColor: "transparent",
|
|
1439
|
+
borderLeftColor: color,
|
|
1440
|
+
transform: [{
|
|
1441
|
+
rotate: "45deg"
|
|
1442
|
+
}]
|
|
1443
|
+
}
|
|
1444
|
+
})]
|
|
1445
|
+
});
|
|
1446
|
+
};
|
|
1447
|
+
export const Home = ({
|
|
1365
1448
|
size = 24,
|
|
1366
1449
|
color = "currentColor",
|
|
1367
1450
|
strokeWidth = 2,
|
|
@@ -1372,41 +1455,64 @@ export const RefreshCw = ({
|
|
|
1372
1455
|
viewBox: "0 0 24 24",
|
|
1373
1456
|
...props,
|
|
1374
1457
|
children: [/*#__PURE__*/_jsx(Line, {
|
|
1375
|
-
x1:
|
|
1376
|
-
y1:
|
|
1377
|
-
x2:
|
|
1378
|
-
y2:
|
|
1458
|
+
x1: 3,
|
|
1459
|
+
y1: 10,
|
|
1460
|
+
x2: 12,
|
|
1461
|
+
y2: 3,
|
|
1379
1462
|
stroke: color,
|
|
1380
1463
|
strokeWidth: strokeWidth
|
|
1381
1464
|
}), /*#__PURE__*/_jsx(Line, {
|
|
1382
|
-
x1:
|
|
1383
|
-
y1:
|
|
1384
|
-
x2:
|
|
1465
|
+
x1: 12,
|
|
1466
|
+
y1: 3,
|
|
1467
|
+
x2: 21,
|
|
1385
1468
|
y2: 10,
|
|
1386
1469
|
stroke: color,
|
|
1387
1470
|
strokeWidth: strokeWidth
|
|
1388
1471
|
}), /*#__PURE__*/_jsx(Line, {
|
|
1389
|
-
x1:
|
|
1390
|
-
y1:
|
|
1391
|
-
x2:
|
|
1392
|
-
y2:
|
|
1472
|
+
x1: 5,
|
|
1473
|
+
y1: 9,
|
|
1474
|
+
x2: 5,
|
|
1475
|
+
y2: 21,
|
|
1393
1476
|
stroke: color,
|
|
1394
1477
|
strokeWidth: strokeWidth
|
|
1395
1478
|
}), /*#__PURE__*/_jsx(Line, {
|
|
1396
|
-
x1:
|
|
1397
|
-
y1:
|
|
1398
|
-
x2:
|
|
1399
|
-
y2:
|
|
1479
|
+
x1: 19,
|
|
1480
|
+
y1: 9,
|
|
1481
|
+
x2: 19,
|
|
1482
|
+
y2: 21,
|
|
1400
1483
|
stroke: color,
|
|
1401
1484
|
strokeWidth: strokeWidth
|
|
1402
|
-
}), /*#__PURE__*/_jsx(
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1485
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
1486
|
+
x1: 5,
|
|
1487
|
+
y1: 21,
|
|
1488
|
+
x2: 19,
|
|
1489
|
+
y2: 21,
|
|
1490
|
+
stroke: color,
|
|
1491
|
+
strokeWidth: strokeWidth
|
|
1492
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
1493
|
+
x1: 10,
|
|
1494
|
+
y1: 21,
|
|
1495
|
+
x2: 10,
|
|
1496
|
+
y2: 15,
|
|
1497
|
+
stroke: color,
|
|
1498
|
+
strokeWidth: strokeWidth
|
|
1499
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
1500
|
+
x1: 10,
|
|
1501
|
+
y1: 15,
|
|
1502
|
+
x2: 14,
|
|
1503
|
+
y2: 15,
|
|
1504
|
+
stroke: color,
|
|
1505
|
+
strokeWidth: strokeWidth
|
|
1506
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
1507
|
+
x1: 14,
|
|
1508
|
+
y1: 15,
|
|
1509
|
+
x2: 14,
|
|
1510
|
+
y2: 21,
|
|
1406
1511
|
stroke: color,
|
|
1407
1512
|
strokeWidth: strokeWidth
|
|
1408
1513
|
})]
|
|
1409
1514
|
});
|
|
1515
|
+
export const HomeIcon = Home;
|
|
1410
1516
|
export const Search = ({
|
|
1411
1517
|
size = 24,
|
|
1412
1518
|
color = "currentColor",
|
package/lib/module/index.js
CHANGED
|
@@ -8,6 +8,8 @@ export * from "./stores/index.js";
|
|
|
8
8
|
|
|
9
9
|
// Utils exports - selectively export to avoid conflicts
|
|
10
10
|
export {
|
|
11
|
+
// Absolute-fill style (replaces StyleSheet.absoluteFillObject, removed in RN 0.85)
|
|
12
|
+
absoluteFill,
|
|
11
13
|
// Display utilities
|
|
12
14
|
displayValue, parseDisplayValue,
|
|
13
15
|
// Safe area utilities
|
|
@@ -27,7 +29,7 @@ Subscribable,
|
|
|
27
29
|
// Subscriber count notifier for cross-package notifications
|
|
28
30
|
subscriberCountNotifier, subscribeToSubscriberCountChanges, notifySubscriberCountChange,
|
|
29
31
|
// Safe expo-router wrappers (falls back to no-ops on RN CLI)
|
|
30
|
-
useSafeRouter, useSafePathname, useSafeSegments, useSafeGlobalSearchParams, getSafeRouter, isExpoRouterAvailable } from "./utils/index.js";
|
|
32
|
+
useSafeRouter, useSafePathname, useSafeSegments, useSafeGlobalSearchParams, getSafeRouter, getSafeCurrentPathname, isExpoRouterAvailable } from "./utils/index.js";
|
|
31
33
|
|
|
32
34
|
// Also export formatting utils
|
|
33
35
|
export * from "./utils/formatting/index.js";
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import React, { useState, useEffect, useCallback } from "react";
|
|
10
10
|
import { View, Text, TouchableOpacity, StyleSheet, Modal, ActivityIndicator, ScrollView, Alert, Platform, Linking } from "react-native";
|
|
11
|
+
import { absoluteFill } from "../utils/absoluteFill.js";
|
|
11
12
|
import { macOSColors } from "../ui/gameUI/constants/macOSDesignSystemColors.js";
|
|
12
13
|
import { X, Smartphone, Trash2, RefreshCw, AlertTriangle } from "../icons/lucide-icons.js";
|
|
13
14
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
@@ -266,7 +267,7 @@ const styles = StyleSheet.create({
|
|
|
266
267
|
alignItems: "center"
|
|
267
268
|
},
|
|
268
269
|
backdrop: {
|
|
269
|
-
...
|
|
270
|
+
...absoluteFill,
|
|
270
271
|
backgroundColor: "rgba(0, 0, 0, 0.8)"
|
|
271
272
|
},
|
|
272
273
|
modal: {
|