@buoy-gg/shared-ui 3.0.0 → 3.0.2

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 (79) hide show
  1. package/lib/commonjs/JsModal.js +2 -1
  2. package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +3 -5
  3. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  4. package/lib/commonjs/icons/lucide-icons.js +104 -22
  5. package/lib/commonjs/index.js +7 -0
  6. package/lib/commonjs/license/DeviceLimitModal.js +2 -1
  7. package/lib/commonjs/license/LicenseEntryModal.js +2 -1
  8. package/lib/commonjs/license/ManageDevicesModal.js +2 -1
  9. package/lib/commonjs/stores/BaseEventStore.js +25 -1
  10. package/lib/commonjs/ui/components/CompactRow.js +62 -65
  11. package/lib/commonjs/ui/components/EventHistoryViewer/EventPickerModal.js +3 -2
  12. package/lib/commonjs/ui/components/ExpandableSectionWithModal.js +2 -1
  13. package/lib/commonjs/ui/console/CyberpunkConsoleSection.js +6 -5
  14. package/lib/commonjs/ui/console/GalaxyButton.js +2 -1
  15. package/lib/commonjs/ui/gameUI/components/GameUIStatusHeader.js +2 -1
  16. package/lib/commonjs/utils/absoluteFill.js +28 -0
  17. package/lib/commonjs/utils/index.js +7 -0
  18. package/lib/module/JsModal.js +2 -1
  19. package/lib/module/dataViewer/VirtualizedDataExplorer.js +3 -5
  20. package/lib/module/hooks/safe-area-impl.js +1 -1
  21. package/lib/module/icons/lucide-icons.js +100 -19
  22. package/lib/module/index.js +2 -0
  23. package/lib/module/license/DeviceLimitModal.js +2 -1
  24. package/lib/module/license/LicenseEntryModal.js +2 -1
  25. package/lib/module/license/ManageDevicesModal.js +2 -1
  26. package/lib/module/stores/BaseEventStore.js +25 -1
  27. package/lib/module/ui/components/CompactRow.js +62 -65
  28. package/lib/module/ui/components/EventHistoryViewer/EventPickerModal.js +3 -2
  29. package/lib/module/ui/components/ExpandableSectionWithModal.js +2 -1
  30. package/lib/module/ui/console/CyberpunkConsoleSection.js +6 -5
  31. package/lib/module/ui/console/GalaxyButton.js +2 -1
  32. package/lib/module/ui/gameUI/components/GameUIStatusHeader.js +2 -1
  33. package/lib/module/utils/absoluteFill.js +24 -0
  34. package/lib/module/utils/index.js +1 -0
  35. package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
  36. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  37. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  38. package/lib/typescript/commonjs/icons/lucide-icons.d.ts +4 -2
  39. package/lib/typescript/commonjs/icons/lucide-icons.d.ts.map +1 -1
  40. package/lib/typescript/commonjs/index.d.ts +1 -1
  41. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  42. package/lib/typescript/commonjs/license/DeviceLimitModal.d.ts.map +1 -1
  43. package/lib/typescript/commonjs/license/LicenseEntryModal.d.ts.map +1 -1
  44. package/lib/typescript/commonjs/license/ManageDevicesModal.d.ts.map +1 -1
  45. package/lib/typescript/commonjs/stores/BaseEventStore.d.ts +9 -0
  46. package/lib/typescript/commonjs/stores/BaseEventStore.d.ts.map +1 -1
  47. package/lib/typescript/commonjs/ui/components/CompactRow.d.ts.map +1 -1
  48. package/lib/typescript/commonjs/ui/components/EventHistoryViewer/EventPickerModal.d.ts.map +1 -1
  49. package/lib/typescript/commonjs/ui/components/ExpandableSectionWithModal.d.ts.map +1 -1
  50. package/lib/typescript/commonjs/ui/console/CyberpunkConsoleSection.d.ts.map +1 -1
  51. package/lib/typescript/commonjs/ui/console/GalaxyButton.d.ts.map +1 -1
  52. package/lib/typescript/commonjs/ui/gameUI/components/GameUIStatusHeader.d.ts.map +1 -1
  53. package/lib/typescript/commonjs/utils/absoluteFill.d.ts +18 -0
  54. package/lib/typescript/commonjs/utils/absoluteFill.d.ts.map +1 -0
  55. package/lib/typescript/commonjs/utils/index.d.ts +1 -0
  56. package/lib/typescript/commonjs/utils/index.d.ts.map +1 -1
  57. package/lib/typescript/module/JsModal.d.ts.map +1 -1
  58. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  59. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  60. package/lib/typescript/module/icons/lucide-icons.d.ts +4 -2
  61. package/lib/typescript/module/icons/lucide-icons.d.ts.map +1 -1
  62. package/lib/typescript/module/index.d.ts +1 -1
  63. package/lib/typescript/module/index.d.ts.map +1 -1
  64. package/lib/typescript/module/license/DeviceLimitModal.d.ts.map +1 -1
  65. package/lib/typescript/module/license/LicenseEntryModal.d.ts.map +1 -1
  66. package/lib/typescript/module/license/ManageDevicesModal.d.ts.map +1 -1
  67. package/lib/typescript/module/stores/BaseEventStore.d.ts +9 -0
  68. package/lib/typescript/module/stores/BaseEventStore.d.ts.map +1 -1
  69. package/lib/typescript/module/ui/components/CompactRow.d.ts.map +1 -1
  70. package/lib/typescript/module/ui/components/EventHistoryViewer/EventPickerModal.d.ts.map +1 -1
  71. package/lib/typescript/module/ui/components/ExpandableSectionWithModal.d.ts.map +1 -1
  72. package/lib/typescript/module/ui/console/CyberpunkConsoleSection.d.ts.map +1 -1
  73. package/lib/typescript/module/ui/console/GalaxyButton.d.ts.map +1 -1
  74. package/lib/typescript/module/ui/gameUI/components/GameUIStatusHeader.d.ts.map +1 -1
  75. package/lib/typescript/module/utils/absoluteFill.d.ts +18 -0
  76. package/lib/typescript/module/utils/absoluteFill.d.ts.map +1 -0
  77. package/lib/typescript/module/utils/index.d.ts +1 -0
  78. package/lib/typescript/module/utils/index.d.ts.map +1 -1
  79. package/package.json +4 -4
@@ -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 () {
@@ -195,6 +201,7 @@ Object.defineProperty(exports, "useSafeSegments", {
195
201
  return _safeExpoRouter.useSafeSegments;
196
202
  }
197
203
  });
204
+ var _absoluteFill = require("./absoluteFill.js");
198
205
  var _displayValue = require("./displayValue.js");
199
206
  var _getSafeAreaInsets = require("./getSafeAreaInsets.js");
200
207
  var _persistentStorage = require("./persistentStorage.js");
@@ -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: {
@@ -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-06-12T23:17:33.323Z
6
+ * Generated at: 2026-06-23T21:16:34.896Z
7
7
  *
8
8
  * DO NOT EDIT - This file is generated by scripts/detect-safe-area.js
9
9
  *
@@ -1361,7 +1361,65 @@ export const Plus = ({
1361
1361
  strokeWidth: strokeWidth
1362
1362
  })]
1363
1363
  });
1364
+
1365
+ // Refresh / reload icon: a smooth 270° ring (open on the right) with a
1366
+ // clockwise triangle arrowhead. Built from the buoy icon-editor design
1367
+ // (smootharc ring + triangle) using the View-based border trick so it stays
1368
+ // crisp at any size. `strokeWidth` is accepted for API compatibility but the
1369
+ // proportions are fixed to keep the perfected look.
1364
1370
  export const RefreshCw = ({
1371
+ size = 24,
1372
+ color = "currentColor",
1373
+ strokeWidth: _strokeWidth = 2,
1374
+ ...props
1375
+ }) => {
1376
+ const RING_RADIUS = 7; // outer radius, centered in the 24x24 viewBox
1377
+ const RING_STROKE = 2.4;
1378
+ const ARROW_SIZE = 5.2;
1379
+ const ARROW_HALF = ARROW_SIZE * 0.577; // equilateral-ish half-width
1380
+ // Arrowhead anchor (from the editor design, mapped into the 0..24 viewBox)
1381
+ const arrowLeft = 12 + 3.162277660168379;
1382
+ const arrowTop = 12 - 2.846049894151541 - ARROW_HALF;
1383
+ return /*#__PURE__*/_jsxs(Svg, {
1384
+ width: size,
1385
+ height: size,
1386
+ viewBox: "0 0 24 24",
1387
+ ...props,
1388
+ children: [/*#__PURE__*/_jsx(View, {
1389
+ style: {
1390
+ position: "absolute",
1391
+ left: 12 - RING_RADIUS,
1392
+ top: 12 - RING_RADIUS,
1393
+ width: RING_RADIUS * 2,
1394
+ height: RING_RADIUS * 2,
1395
+ borderRadius: RING_RADIUS,
1396
+ borderWidth: RING_STROKE,
1397
+ borderTopColor: color,
1398
+ borderLeftColor: color,
1399
+ borderBottomColor: color,
1400
+ borderRightColor: "transparent"
1401
+ }
1402
+ }), /*#__PURE__*/_jsx(View, {
1403
+ style: {
1404
+ position: "absolute",
1405
+ left: arrowLeft,
1406
+ top: arrowTop,
1407
+ width: 0,
1408
+ height: 0,
1409
+ borderTopWidth: ARROW_HALF,
1410
+ borderBottomWidth: ARROW_HALF,
1411
+ borderLeftWidth: ARROW_SIZE,
1412
+ borderTopColor: "transparent",
1413
+ borderBottomColor: "transparent",
1414
+ borderLeftColor: color,
1415
+ transform: [{
1416
+ rotate: "45deg"
1417
+ }]
1418
+ }
1419
+ })]
1420
+ });
1421
+ };
1422
+ export const Home = ({
1365
1423
  size = 24,
1366
1424
  color = "currentColor",
1367
1425
  strokeWidth = 2,
@@ -1372,41 +1430,64 @@ export const RefreshCw = ({
1372
1430
  viewBox: "0 0 24 24",
1373
1431
  ...props,
1374
1432
  children: [/*#__PURE__*/_jsx(Line, {
1375
- x1: 23,
1376
- y1: 4,
1377
- x2: 23,
1378
- y2: 10,
1433
+ x1: 3,
1434
+ y1: 10,
1435
+ x2: 12,
1436
+ y2: 3,
1379
1437
  stroke: color,
1380
1438
  strokeWidth: strokeWidth
1381
1439
  }), /*#__PURE__*/_jsx(Line, {
1382
- x1: 23,
1383
- y1: 10,
1384
- x2: 17,
1440
+ x1: 12,
1441
+ y1: 3,
1442
+ x2: 21,
1385
1443
  y2: 10,
1386
1444
  stroke: color,
1387
1445
  strokeWidth: strokeWidth
1388
1446
  }), /*#__PURE__*/_jsx(Line, {
1389
- x1: 1,
1390
- y1: 20,
1391
- x2: 1,
1392
- y2: 14,
1447
+ x1: 5,
1448
+ y1: 9,
1449
+ x2: 5,
1450
+ y2: 21,
1393
1451
  stroke: color,
1394
1452
  strokeWidth: strokeWidth
1395
1453
  }), /*#__PURE__*/_jsx(Line, {
1396
- x1: 1,
1397
- y1: 14,
1398
- x2: 7,
1399
- y2: 14,
1454
+ x1: 19,
1455
+ y1: 9,
1456
+ x2: 19,
1457
+ y2: 21,
1400
1458
  stroke: color,
1401
1459
  strokeWidth: strokeWidth
1402
- }), /*#__PURE__*/_jsx(Circle, {
1403
- cx: 12,
1404
- cy: 12,
1405
- r: 9,
1460
+ }), /*#__PURE__*/_jsx(Line, {
1461
+ x1: 5,
1462
+ y1: 21,
1463
+ x2: 19,
1464
+ y2: 21,
1465
+ stroke: color,
1466
+ strokeWidth: strokeWidth
1467
+ }), /*#__PURE__*/_jsx(Line, {
1468
+ x1: 10,
1469
+ y1: 21,
1470
+ x2: 10,
1471
+ y2: 15,
1472
+ stroke: color,
1473
+ strokeWidth: strokeWidth
1474
+ }), /*#__PURE__*/_jsx(Line, {
1475
+ x1: 10,
1476
+ y1: 15,
1477
+ x2: 14,
1478
+ y2: 15,
1479
+ stroke: color,
1480
+ strokeWidth: strokeWidth
1481
+ }), /*#__PURE__*/_jsx(Line, {
1482
+ x1: 14,
1483
+ y1: 15,
1484
+ x2: 14,
1485
+ y2: 21,
1406
1486
  stroke: color,
1407
1487
  strokeWidth: strokeWidth
1408
1488
  })]
1409
1489
  });
1490
+ export const HomeIcon = Home;
1410
1491
  export const Search = ({
1411
1492
  size = 24,
1412
1493
  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
@@ -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: {
@@ -10,6 +10,7 @@
10
10
 
11
11
  import React, { useCallback } from "react";
12
12
  import { View, Text, TouchableOpacity, StyleSheet, Linking, Modal, Platform } from "react-native";
13
+ import { absoluteFill } from "../utils/absoluteFill.js";
13
14
  import { macOSColors } from "../ui/gameUI/constants/macOSDesignSystemColors.js";
14
15
  import { X, Key, Link, FileCode, Copy } from "../icons/lucide-icons.js";
15
16
 
@@ -194,7 +195,7 @@ const styles = StyleSheet.create({
194
195
  alignItems: "center"
195
196
  },
196
197
  backdrop: {
197
- ...StyleSheet.absoluteFillObject,
198
+ ...absoluteFill,
198
199
  backgroundColor: "rgba(0, 0, 0, 0.8)"
199
200
  },
200
201
  modal: {
@@ -9,6 +9,7 @@
9
9
 
10
10
  import React, { useState, useCallback, useEffect } from "react";
11
11
  import { View, Text, TouchableOpacity, StyleSheet, ActivityIndicator, Modal, ScrollView, Alert, Platform } from "react-native";
12
+ import { absoluteFill } from "../utils/absoluteFill.js";
12
13
  import { gameUIColors } from "../ui/gameUI/constants/gameUIColors.js";
13
14
  import { X, Smartphone, Trash2, RefreshCw, CheckCircle, AlertTriangle } from "../icons/lucide-icons.js";
14
15
 
@@ -337,7 +338,7 @@ const styles = StyleSheet.create({
337
338
  alignItems: "center"
338
339
  },
339
340
  backdrop: {
340
- ...StyleSheet.absoluteFillObject,
341
+ ...absoluteFill,
341
342
  backgroundColor: "rgba(0, 0, 0, 0.7)"
342
343
  },
343
344
  modal: {
@@ -267,10 +267,34 @@ export class BaseEventStore extends Subscribable {
267
267
  * mirror mode where full snapshots arrive from a synced device.
268
268
  */
269
269
  replaceEvents(events) {
270
- this.events = events.slice(0, this.maxEvents);
270
+ this.events = this.dedupeById(events).slice(0, this.maxEvents);
271
271
  this.notifyArrayListeners();
272
272
  }
273
273
 
274
+ /**
275
+ * Drop events that share an `id` with an earlier event, keeping the first
276
+ * (newest, since events are newest-first) occurrence. Remote snapshots can
277
+ * momentarily carry duplicate ids — e.g. a device's request counter resets
278
+ * on reload while older events with the same id are still in the buffer —
279
+ * which makes React list keys (keyed on `id`) collide. Events without an
280
+ * `id` are passed through untouched.
281
+ */
282
+ dedupeById(events) {
283
+ const seen = new Set();
284
+ const result = [];
285
+ for (const event of events) {
286
+ const id = event?.id;
287
+ if (id == null) {
288
+ result.push(event);
289
+ continue;
290
+ }
291
+ if (seen.has(id)) continue;
292
+ seen.add(id);
293
+ result.push(event);
294
+ }
295
+ return result;
296
+ }
297
+
274
298
  /**
275
299
  * Set maximum number of events to keep
276
300
  */
@@ -24,77 +24,77 @@ export function CompactRow({
24
24
  }) {
25
25
  return /*#__PURE__*/_jsx(View, {
26
26
  style: styles.rowWrapper,
27
- children: /*#__PURE__*/_jsxs(TouchableOpacity, {
27
+ children: /*#__PURE__*/_jsxs(View, {
28
28
  style: [styles.row, isSelected && styles.selectedRow, isExpanded && [styles.expandedRowActive, {
29
29
  borderColor: expandedGlowColor || buoyColors.primary,
30
30
  shadowColor: expandedGlowColor || buoyColors.primary
31
31
  }]],
32
- onPress: onPress,
33
- activeOpacity: 0.8,
34
- disabled: disabled || !onPress,
35
- children: [/*#__PURE__*/_jsxs(View, {
36
- style: styles.rowContent,
37
- children: [/*#__PURE__*/_jsxs(View, {
38
- style: styles.statusSection,
39
- children: [/*#__PURE__*/_jsx(View, {
40
- style: [styles.statusDot, {
41
- backgroundColor: statusDotColor
42
- }]
32
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
33
+ onPress: onPress,
34
+ activeOpacity: 0.8,
35
+ disabled: disabled || !onPress,
36
+ children: /*#__PURE__*/_jsxs(View, {
37
+ style: styles.rowContent,
38
+ children: [/*#__PURE__*/_jsxs(View, {
39
+ style: styles.statusSection,
40
+ children: [/*#__PURE__*/_jsx(View, {
41
+ style: [styles.statusDot, {
42
+ backgroundColor: statusDotColor
43
+ }]
44
+ }), /*#__PURE__*/_jsxs(View, {
45
+ style: styles.statusInfo,
46
+ children: [/*#__PURE__*/_jsx(Text, {
47
+ style: [styles.statusLabel, {
48
+ color: statusDotColor
49
+ }],
50
+ numberOfLines: 1,
51
+ children: statusLabel
52
+ }), statusSublabel ? /*#__PURE__*/_jsx(Text, {
53
+ style: styles.observerText,
54
+ numberOfLines: 1,
55
+ children: statusSublabel
56
+ }) : null]
57
+ })]
43
58
  }), /*#__PURE__*/_jsxs(View, {
44
- style: styles.statusInfo,
59
+ style: styles.querySection,
45
60
  children: [/*#__PURE__*/_jsx(Text, {
46
- style: [styles.statusLabel, {
47
- color: statusDotColor
48
- }],
49
- numberOfLines: 1,
50
- children: statusLabel
51
- }), statusSublabel && /*#__PURE__*/_jsx(Text, {
52
- style: styles.observerText,
61
+ style: styles.queryHash,
62
+ numberOfLines: isExpanded ? undefined : 2,
63
+ children: primaryText
64
+ }), !isExpanded && secondaryText ? /*#__PURE__*/_jsx(Text, {
65
+ style: styles.secondaryText,
53
66
  numberOfLines: 1,
54
- children: statusSublabel
67
+ children: secondaryText
68
+ }) : null]
69
+ }), /*#__PURE__*/_jsxs(View, {
70
+ style: styles.rightSection,
71
+ children: [(customBadge || badgeText !== undefined || !isExpanded && bottomRightText) && /*#__PURE__*/_jsxs(View, {
72
+ style: styles.badgeContainer,
73
+ children: [customBadge ? customBadge : badgeText !== undefined ? /*#__PURE__*/_jsx(Text, {
74
+ style: [styles.statusBadge, {
75
+ color: badgeColor || statusDotColor
76
+ }],
77
+ children: badgeText
78
+ }) : null, !isExpanded && bottomRightText ? /*#__PURE__*/_jsx(Text, {
79
+ style: styles.bottomRightText,
80
+ numberOfLines: 1,
81
+ children: bottomRightText
82
+ }) : null]
83
+ }), showChevron && /*#__PURE__*/_jsx(View, {
84
+ style: styles.chevronContainer,
85
+ children: isExpanded ? /*#__PURE__*/_jsx(ChevronDown, {
86
+ size: 14,
87
+ color: buoyColors.textMuted
88
+ }) : /*#__PURE__*/_jsx(ChevronRight, {
89
+ size: 14,
90
+ color: buoyColors.textMuted
91
+ })
55
92
  })]
56
93
  })]
57
- }), /*#__PURE__*/_jsxs(View, {
58
- style: styles.querySection,
59
- children: [/*#__PURE__*/_jsx(Text, {
60
- style: styles.queryHash,
61
- numberOfLines: isExpanded ? undefined : 2,
62
- children: primaryText
63
- }), !isExpanded && secondaryText && /*#__PURE__*/_jsx(Text, {
64
- style: styles.secondaryText,
65
- numberOfLines: 1,
66
- children: secondaryText
67
- })]
68
- }), /*#__PURE__*/_jsxs(View, {
69
- style: styles.rightSection,
70
- children: [(customBadge || badgeText !== undefined) && /*#__PURE__*/_jsx(View, {
71
- style: styles.badgeContainer,
72
- children: customBadge ? customBadge : /*#__PURE__*/_jsx(Text, {
73
- style: [styles.statusBadge, {
74
- color: badgeColor || statusDotColor
75
- }],
76
- children: badgeText
77
- })
78
- }), showChevron && /*#__PURE__*/_jsx(View, {
79
- style: styles.chevronContainer,
80
- children: isExpanded ? /*#__PURE__*/_jsx(ChevronDown, {
81
- size: 14,
82
- color: buoyColors.textMuted
83
- }) : /*#__PURE__*/_jsx(ChevronRight, {
84
- size: 14,
85
- color: buoyColors.textMuted
86
- })
87
- })]
88
- })]
94
+ })
89
95
  }), isExpanded && expandedContent && /*#__PURE__*/_jsx(View, {
90
96
  style: styles.expandedContent,
91
97
  children: expandedContent
92
- }), !isExpanded && bottomRightText && /*#__PURE__*/_jsx(View, {
93
- style: styles.bottomRightContainer,
94
- children: /*#__PURE__*/_jsx(Text, {
95
- style: styles.bottomRightText,
96
- children: bottomRightText
97
- })
98
98
  })]
99
99
  })
100
100
  });
@@ -196,7 +196,9 @@ const styles = StyleSheet.create({
196
196
  gap: 8
197
197
  },
198
198
  badgeContainer: {
199
- alignItems: "flex-end"
199
+ flexDirection: "column",
200
+ alignItems: "flex-end",
201
+ gap: 2
200
202
  },
201
203
  statusBadge: {
202
204
  fontSize: 12,
@@ -213,11 +215,6 @@ const styles = StyleSheet.create({
213
215
  borderTopColor: buoyColors.border + "20",
214
216
  marginLeft: 24 // Align with content after status dot
215
217
  },
216
- bottomRightContainer: {
217
- position: "absolute",
218
- bottom: 4,
219
- right: 8
220
- },
221
218
  bottomRightText: {
222
219
  fontSize: 9,
223
220
  color: buoyColors.textMuted,
@@ -10,6 +10,7 @@
10
10
 
11
11
  import React, { memo } from "react";
12
12
  import { View, Text, TouchableOpacity, ScrollView, StyleSheet } from "react-native";
13
+ import { absoluteFill } from "../../../utils/absoluteFill.js";
13
14
  import { macOSColors } from "../../gameUI/constants/macOSDesignSystemColors.js";
14
15
  import { X } from "../../../icons/lucide-icons.js";
15
16
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -77,13 +78,13 @@ export const EventPickerModal = /*#__PURE__*/memo(function EventPickerModal({
77
78
  });
78
79
  const styles = StyleSheet.create({
79
80
  overlay: {
80
- ...StyleSheet.absoluteFillObject,
81
+ ...absoluteFill,
81
82
  zIndex: 20,
82
83
  justifyContent: "center",
83
84
  alignItems: "center"
84
85
  },
85
86
  backdrop: {
86
- ...StyleSheet.absoluteFillObject,
87
+ ...absoluteFill,
87
88
  backgroundColor: "rgba(0,0,0,0.65)"
88
89
  },
89
90
  card: {
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useState } from "react";
4
4
  import { Dimensions, Modal, ScrollView, StyleSheet, TouchableOpacity, View } from "react-native";
5
+ import { absoluteFill } from "../../utils/absoluteFill.js";
5
6
  import { useSafeAreaInsets } from "../../hooks/useSafeAreaInsets.js";
6
7
  import { X } from "../../icons/index.js";
7
8
  import { ExpandableSection } from "./ExpandableSection.js";
@@ -121,7 +122,7 @@ const styles = StyleSheet.create({
121
122
  flex: 1
122
123
  },
123
124
  backdrop: {
124
- ...StyleSheet.absoluteFillObject,
125
+ ...absoluteFill,
125
126
  backgroundColor: "rgba(0, 0, 0, 0.8)"
126
127
  },
127
128
  backdropTouchable: {
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useEffect, useRef } from "react";
4
4
  import { View, Text, StyleSheet, Pressable, Animated, Easing } from "react-native";
5
+ import { absoluteFill } from "../../utils/absoluteFill.js";
5
6
  import { ChevronRight } from "../../icons/index.js";
6
7
  import { gameUIColors } from "../gameUI/index.js";
7
8
 
@@ -481,31 +482,31 @@ const styles = StyleSheet.create({
481
482
  backgroundColor: "rgba(5, 5, 10, 0.6)" // Darker glass background
482
483
  },
483
484
  glassLayer1: {
484
- ...StyleSheet.absoluteFillObject,
485
+ ...absoluteFill,
485
486
  backgroundColor: "rgba(10, 10, 15, 0.7)",
486
487
  opacity: 0.8
487
488
  },
488
489
  glassLayer2: {
489
- ...StyleSheet.absoluteFillObject,
490
+ ...absoluteFill,
490
491
  backgroundColor: "rgba(15, 15, 25, 0.5)",
491
492
  opacity: 0.6,
492
493
  top: "20%",
493
494
  left: "20%"
494
495
  },
495
496
  glassLayer3: {
496
- ...StyleSheet.absoluteFillObject,
497
+ ...absoluteFill,
497
498
  backgroundColor: "rgba(20, 20, 35, 0.3)",
498
499
  opacity: 0.4,
499
500
  top: "40%",
500
501
  left: "40%"
501
502
  },
502
503
  glassShimmer: {
503
- ...StyleSheet.absoluteFillObject,
504
+ ...absoluteFill,
504
505
  backgroundColor: "rgba(255, 255, 255, 0.03)",
505
506
  opacity: 0.6
506
507
  },
507
508
  glitchOverlayLayer: {
508
- ...StyleSheet.absoluteFillObject,
509
+ ...absoluteFill,
509
510
  borderRadius: 12,
510
511
  borderWidth: 1,
511
512
  justifyContent: "center",
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useEffect, useRef } from "react";
4
4
  import { View, StyleSheet, Animated, Pressable, Dimensions } from "react-native";
5
+ import { absoluteFill } from "../../utils/absoluteFill.js";
5
6
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
7
  const {
7
8
  width: screenWidth
@@ -72,7 +73,7 @@ const styles = StyleSheet.create({
72
73
  overflow: "hidden"
73
74
  },
74
75
  starsContainer: {
75
- ...StyleSheet.absoluteFillObject,
76
+ ...absoluteFill,
76
77
  overflow: "hidden"
77
78
  },
78
79
  starsLayer: {
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { StyleSheet, Text, View, Animated } from "react-native";
4
+ import { absoluteFill } from "../../../utils/absoluteFill.js";
4
5
  import { gameUIColors } from "../constants/gameUIColors.js";
5
6
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
7
  /**
@@ -78,7 +79,7 @@ const styles = StyleSheet.create({
78
79
  overflow: "hidden"
79
80
  },
80
81
  glow: {
81
- ...StyleSheet.absoluteFillObject,
82
+ ...absoluteFill,
82
83
  opacity: 0.5
83
84
  },
84
85
  content: {
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Spreadable absolute-fill style.
5
+ *
6
+ * Replaces `StyleSheet.absoluteFillObject`, which was REMOVED in React Native
7
+ * 0.85 (returns `undefined` there). Spreading `undefined` is a silent no-op, so
8
+ * any overlay/backdrop/full-screen Pressable that relied on it collapses to zero
9
+ * size on RN 0.85+ — invisible and untappable.
10
+ *
11
+ * `StyleSheet.absoluteFill` is not a safe replacement for the spread pattern
12
+ * because its type changed across versions: it's a registered style *number* on
13
+ * RN <= 0.84 (spreading a number yields `{}`) and a frozen object only on 0.85+.
14
+ *
15
+ * This plain object works identically on every RN version, whether spread
16
+ * (`{ ...absoluteFill }`) or passed directly (`style={absoluteFill}`).
17
+ */
18
+ export const absoluteFill = {
19
+ position: "absolute",
20
+ top: 0,
21
+ left: 0,
22
+ right: 0,
23
+ bottom: 0
24
+ };
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ export { absoluteFill } from "./absoluteFill.js";
3
4
  export { displayValue, parseDisplayValue } from "./displayValue.js";
4
5
  export { getSafeAreaInsets } from "./getSafeAreaInsets.js";
5
6
  export { persistentStorage, isUsingPersistentStorage, getStorageBackendType } from "./persistentStorage.js";
@@ -1 +1 @@
1
- {"version":3,"file":"JsModal.d.ts","sourceRoot":"","sources":["../../../src/JsModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAUL,SAAS,EAEV,MAAM,OAAO,CAAC;AACf,OAAO,EAML,QAAQ,EAGR,SAAS,EAEV,MAAM,cAAc,CAAC;AA6FtB,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnD,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAChC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gIAAgI;IAChI,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AA8hDD,eAAO,MAAM,OAAO,oDAAyB,CAAC"}
1
+ {"version":3,"file":"JsModal.d.ts","sourceRoot":"","sources":["../../../src/JsModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAUL,SAAS,EAEV,MAAM,OAAO,CAAC;AACf,OAAO,EAML,QAAQ,EAGR,SAAS,EAEV,MAAM,cAAc,CAAC;AA8FtB,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnD,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAChC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gIAAgI;IAChI,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AA8hDD,eAAO,MAAM,OAAO,oDAAyB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualizedDataExplorer.d.ts","sourceRoot":"","sources":["../../../../src/dataViewer/VirtualizedDataExplorer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAOL,EAAE,EAEH,MAAM,OAAO,CAAC;AAm+Bf,UAAU,4BAA4B;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,4BAA4B,CAmQpE,CAAC"}
1
+ {"version":3,"file":"VirtualizedDataExplorer.d.ts","sourceRoot":"","sources":["../../../../src/dataViewer/VirtualizedDataExplorer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAOL,EAAE,EAEH,MAAM,OAAO,CAAC;AAo+Bf,UAAU,4BAA4B;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,4BAA4B,CAkQpE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Auto-generated safe area implementation
3
3
  * Detected: none
4
- * Generated at: 2026-06-12T23:17:33.323Z
4
+ * Generated at: 2026-06-23T21:16:34.896Z
5
5
  *
6
6
  * DO NOT EDIT - This file is generated by scripts/detect-safe-area.js
7
7
  *