@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.
Files changed (133) hide show
  1. package/lib/commonjs/JsModal.js +2 -1
  2. package/lib/commonjs/clipboard/clipboard-impl.js +28 -2
  3. package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +3 -5
  4. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  5. package/lib/commonjs/icons/lucide-icons.js +130 -22
  6. package/lib/commonjs/index.js +14 -0
  7. package/lib/commonjs/license/DeviceLimitModal.js +2 -1
  8. package/lib/commonjs/license/FeatureGate.js +60 -11
  9. package/lib/commonjs/license/LicenseEntryModal.js +14 -3
  10. package/lib/commonjs/license/ManageDevicesModal.js +2 -1
  11. package/lib/commonjs/license/openPricing.js +36 -0
  12. package/lib/commonjs/storage/devToolsStorageKeys.js +1 -0
  13. package/lib/commonjs/stores/BaseEventStore.js +72 -2
  14. package/lib/commonjs/stores/ignoredPatternsStore.js +229 -0
  15. package/lib/commonjs/stores/index.js +26 -1
  16. package/lib/commonjs/ui/components/CompactRow.js +73 -66
  17. package/lib/commonjs/ui/components/EventHistoryViewer/EventPickerModal.js +3 -2
  18. package/lib/commonjs/ui/components/ExpandableSectionWithModal.js +2 -1
  19. package/lib/commonjs/ui/components/ExpandedInfoRow.js +13 -3
  20. package/lib/commonjs/ui/components/WindowControls.js +9 -3
  21. package/lib/commonjs/ui/console/CyberpunkConsoleSection.js +6 -5
  22. package/lib/commonjs/ui/console/GalaxyButton.js +2 -1
  23. package/lib/commonjs/ui/gameUI/components/GameUIStatusHeader.js +2 -1
  24. package/lib/commonjs/utils/absoluteFill.js +28 -0
  25. package/lib/commonjs/utils/index.js +13 -0
  26. package/lib/commonjs/utils/safeExpoRouter.js +59 -4
  27. package/lib/module/JsModal.js +2 -1
  28. package/lib/module/clipboard/clipboard-impl.js +28 -2
  29. package/lib/module/dataViewer/VirtualizedDataExplorer.js +3 -5
  30. package/lib/module/hooks/safe-area-impl.js +1 -1
  31. package/lib/module/icons/lucide-icons.js +125 -19
  32. package/lib/module/index.js +3 -1
  33. package/lib/module/license/DeviceLimitModal.js +2 -1
  34. package/lib/module/license/FeatureGate.js +61 -12
  35. package/lib/module/license/LicenseEntryModal.js +15 -4
  36. package/lib/module/license/ManageDevicesModal.js +2 -1
  37. package/lib/module/license/openPricing.js +31 -0
  38. package/lib/module/storage/devToolsStorageKeys.js +1 -0
  39. package/lib/module/stores/BaseEventStore.js +72 -2
  40. package/lib/module/stores/ignoredPatternsStore.js +223 -0
  41. package/lib/module/stores/index.js +2 -1
  42. package/lib/module/ui/components/CompactRow.js +73 -66
  43. package/lib/module/ui/components/EventHistoryViewer/EventPickerModal.js +3 -2
  44. package/lib/module/ui/components/ExpandableSectionWithModal.js +2 -1
  45. package/lib/module/ui/components/ExpandedInfoRow.js +13 -3
  46. package/lib/module/ui/components/WindowControls.js +10 -4
  47. package/lib/module/ui/console/CyberpunkConsoleSection.js +6 -5
  48. package/lib/module/ui/console/GalaxyButton.js +2 -1
  49. package/lib/module/ui/gameUI/components/GameUIStatusHeader.js +2 -1
  50. package/lib/module/utils/absoluteFill.js +24 -0
  51. package/lib/module/utils/index.js +2 -1
  52. package/lib/module/utils/safeExpoRouter.js +58 -4
  53. package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
  54. package/lib/typescript/commonjs/clipboard/clipboard-impl.d.ts +3 -2
  55. package/lib/typescript/commonjs/clipboard/clipboard-impl.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  57. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  58. package/lib/typescript/commonjs/icons/lucide-icons.d.ts +5 -2
  59. package/lib/typescript/commonjs/icons/lucide-icons.d.ts.map +1 -1
  60. package/lib/typescript/commonjs/index.d.ts +1 -1
  61. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  62. package/lib/typescript/commonjs/license/DeviceLimitModal.d.ts.map +1 -1
  63. package/lib/typescript/commonjs/license/FeatureGate.d.ts +14 -1
  64. package/lib/typescript/commonjs/license/FeatureGate.d.ts.map +1 -1
  65. package/lib/typescript/commonjs/license/LicenseEntryModal.d.ts.map +1 -1
  66. package/lib/typescript/commonjs/license/ManageDevicesModal.d.ts.map +1 -1
  67. package/lib/typescript/commonjs/license/openPricing.d.ts +14 -0
  68. package/lib/typescript/commonjs/license/openPricing.d.ts.map +1 -0
  69. package/lib/typescript/commonjs/storage/devToolsStorageKeys.d.ts +1 -0
  70. package/lib/typescript/commonjs/storage/devToolsStorageKeys.d.ts.map +1 -1
  71. package/lib/typescript/commonjs/stores/BaseEventStore.d.ts +28 -0
  72. package/lib/typescript/commonjs/stores/BaseEventStore.d.ts.map +1 -1
  73. package/lib/typescript/commonjs/stores/ignoredPatternsStore.d.ts +84 -0
  74. package/lib/typescript/commonjs/stores/ignoredPatternsStore.d.ts.map +1 -0
  75. package/lib/typescript/commonjs/stores/index.d.ts +1 -0
  76. package/lib/typescript/commonjs/stores/index.d.ts.map +1 -1
  77. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts +3 -1
  78. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts.map +1 -1
  79. package/lib/typescript/commonjs/ui/components/EventHistoryViewer/EventPickerModal.d.ts.map +1 -1
  80. package/lib/typescript/commonjs/ui/components/ExpandableSectionWithModal.d.ts.map +1 -1
  81. package/lib/typescript/commonjs/ui/components/ExpandedInfoRow.d.ts +3 -1
  82. package/lib/typescript/commonjs/ui/components/ExpandedInfoRow.d.ts.map +1 -1
  83. package/lib/typescript/commonjs/ui/components/WindowControls.d.ts.map +1 -1
  84. package/lib/typescript/commonjs/ui/console/CyberpunkConsoleSection.d.ts.map +1 -1
  85. package/lib/typescript/commonjs/ui/console/GalaxyButton.d.ts.map +1 -1
  86. package/lib/typescript/commonjs/ui/gameUI/components/GameUIStatusHeader.d.ts.map +1 -1
  87. package/lib/typescript/commonjs/utils/absoluteFill.d.ts +18 -0
  88. package/lib/typescript/commonjs/utils/absoluteFill.d.ts.map +1 -0
  89. package/lib/typescript/commonjs/utils/index.d.ts +2 -1
  90. package/lib/typescript/commonjs/utils/index.d.ts.map +1 -1
  91. package/lib/typescript/commonjs/utils/safeExpoRouter.d.ts +9 -0
  92. package/lib/typescript/commonjs/utils/safeExpoRouter.d.ts.map +1 -1
  93. package/lib/typescript/module/JsModal.d.ts.map +1 -1
  94. package/lib/typescript/module/clipboard/clipboard-impl.d.ts +3 -2
  95. package/lib/typescript/module/clipboard/clipboard-impl.d.ts.map +1 -1
  96. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  97. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  98. package/lib/typescript/module/icons/lucide-icons.d.ts +5 -2
  99. package/lib/typescript/module/icons/lucide-icons.d.ts.map +1 -1
  100. package/lib/typescript/module/index.d.ts +1 -1
  101. package/lib/typescript/module/index.d.ts.map +1 -1
  102. package/lib/typescript/module/license/DeviceLimitModal.d.ts.map +1 -1
  103. package/lib/typescript/module/license/FeatureGate.d.ts +14 -1
  104. package/lib/typescript/module/license/FeatureGate.d.ts.map +1 -1
  105. package/lib/typescript/module/license/LicenseEntryModal.d.ts.map +1 -1
  106. package/lib/typescript/module/license/ManageDevicesModal.d.ts.map +1 -1
  107. package/lib/typescript/module/license/openPricing.d.ts +14 -0
  108. package/lib/typescript/module/license/openPricing.d.ts.map +1 -0
  109. package/lib/typescript/module/storage/devToolsStorageKeys.d.ts +1 -0
  110. package/lib/typescript/module/storage/devToolsStorageKeys.d.ts.map +1 -1
  111. package/lib/typescript/module/stores/BaseEventStore.d.ts +28 -0
  112. package/lib/typescript/module/stores/BaseEventStore.d.ts.map +1 -1
  113. package/lib/typescript/module/stores/ignoredPatternsStore.d.ts +84 -0
  114. package/lib/typescript/module/stores/ignoredPatternsStore.d.ts.map +1 -0
  115. package/lib/typescript/module/stores/index.d.ts +1 -0
  116. package/lib/typescript/module/stores/index.d.ts.map +1 -1
  117. package/lib/typescript/module/ui/components/CompactRow.d.ts +3 -1
  118. package/lib/typescript/module/ui/components/CompactRow.d.ts.map +1 -1
  119. package/lib/typescript/module/ui/components/EventHistoryViewer/EventPickerModal.d.ts.map +1 -1
  120. package/lib/typescript/module/ui/components/ExpandableSectionWithModal.d.ts.map +1 -1
  121. package/lib/typescript/module/ui/components/ExpandedInfoRow.d.ts +3 -1
  122. package/lib/typescript/module/ui/components/ExpandedInfoRow.d.ts.map +1 -1
  123. package/lib/typescript/module/ui/components/WindowControls.d.ts.map +1 -1
  124. package/lib/typescript/module/ui/console/CyberpunkConsoleSection.d.ts.map +1 -1
  125. package/lib/typescript/module/ui/console/GalaxyButton.d.ts.map +1 -1
  126. package/lib/typescript/module/ui/gameUI/components/GameUIStatusHeader.d.ts.map +1 -1
  127. package/lib/typescript/module/utils/absoluteFill.d.ts +18 -0
  128. package/lib/typescript/module/utils/absoluteFill.d.ts.map +1 -0
  129. package/lib/typescript/module/utils/index.d.ts +2 -1
  130. package/lib/typescript/module/utils/index.d.ts.map +1 -1
  131. package/lib/typescript/module/utils/safeExpoRouter.d.ts +9 -0
  132. package/lib/typescript/module/utils/safeExpoRouter.d.ts.map +1 -1
  133. 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
- ..._reactNative.StyleSheet.absoluteFillObject,
488
+ ..._absoluteFill.absoluteFill,
488
489
  backgroundColor: "rgba(10, 10, 15, 0.7)",
489
490
  opacity: 0.8
490
491
  },
491
492
  glassLayer2: {
492
- ..._reactNative.StyleSheet.absoluteFillObject,
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
- ..._reactNative.StyleSheet.absoluteFillObject,
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
- ..._reactNative.StyleSheet.absoluteFillObject,
507
+ ..._absoluteFill.absoluteFill,
507
508
  backgroundColor: "rgba(255, 255, 255, 0.03)",
508
509
  opacity: 0.6
509
510
  },
510
511
  glitchOverlayLayer: {
511
- ..._reactNative.StyleSheet.absoluteFillObject,
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
- ..._reactNative.StyleSheet.absoluteFillObject,
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
- ..._reactNative.StyleSheet.absoluteFillObject,
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 (Expo SDK 51+)
40
- // NativeUnimoduleProxy is registered by expo-modules-core on both old and new arch
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
  // ============================================================================
@@ -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
- ...StyleSheet.absoluteFillObject,
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. Graceful failure
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
- if (!_detected) return _expoClipboard != null || _rnClipboard != null;
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.id === "root" && data !== undefined && data !== null ? /*#__PURE__*/_jsx(CopyButton, {
791
- value: data,
792
- size: 16,
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
  });
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * Auto-generated safe area implementation
5
5
  * Detected: none
6
- * Generated at: 2026-05-28T20:48:12.491Z
6
+ * Generated at: 2026-06-30T15:42:30.947Z
7
7
  *
8
8
  * DO NOT EDIT - This file is generated by scripts/detect-safe-area.js
9
9
  *
@@ -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: 23,
1376
- y1: 4,
1377
- x2: 23,
1378
- y2: 10,
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: 23,
1383
- y1: 10,
1384
- x2: 17,
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: 1,
1390
- y1: 20,
1391
- x2: 1,
1392
- y2: 14,
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: 1,
1397
- y1: 14,
1398
- x2: 7,
1399
- y2: 14,
1479
+ x1: 19,
1480
+ y1: 9,
1481
+ x2: 19,
1482
+ y2: 21,
1400
1483
  stroke: color,
1401
1484
  strokeWidth: strokeWidth
1402
- }), /*#__PURE__*/_jsx(Circle, {
1403
- cx: 12,
1404
- cy: 12,
1405
- r: 9,
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",
@@ -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
- ...StyleSheet.absoluteFillObject,
270
+ ...absoluteFill,
270
271
  backgroundColor: "rgba(0, 0, 0, 0.8)"
271
272
  },
272
273
  modal: {