@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.JsModal = void 0;
7
7
  var _react = require("react");
8
8
  var _reactNative = require("react-native");
9
+ var _absoluteFill = require("./utils/absoluteFill.js");
9
10
  var _useSafeAreaInsets = require("./hooks/useSafeAreaInsets.js");
10
11
  var _index = require("./ui/gameUI/index.js");
11
12
  var _index2 = require("./ui/components/index.js");
@@ -1241,7 +1242,7 @@ const JsModalComponent = ({
1241
1242
  // ============================================================================
1242
1243
  const styles = _reactNative.StyleSheet.create({
1243
1244
  fullScreenContainer: {
1244
- ..._reactNative.StyleSheet.absoluteFillObject,
1245
+ ..._absoluteFill.absoluteFill,
1245
1246
  zIndex: 1000
1246
1247
  },
1247
1248
  bottomSheetWrapper: {
@@ -20,9 +20,17 @@ exports.isClipboardAvailable = exports.clipboardType = exports.clipboardFunction
20
20
  * Fallback chain:
21
21
  * 1. expo-clipboard
22
22
  * 2. @react-native-clipboard/clipboard
23
- * 3. Graceful failure
23
+ * 3. Web clipboard API (navigator.clipboard)
24
+ * 4. Graceful failure
24
25
  */
25
26
 
27
+ // navigator.clipboard isn't in React Native's TS lib — narrow it manually
28
+
29
+ function getWebClipboard() {
30
+ if (typeof navigator === "undefined") return null;
31
+ const clipboard = navigator.clipboard;
32
+ return clipboard && typeof clipboard.writeText === "function" ? clipboard : null;
33
+ }
26
34
  // Grab module references at load time (top-level try-catch for Metro)
27
35
  // Always require both — we decide which actually works at call time
28
36
  let _expoClipboard = null;
@@ -67,6 +75,21 @@ async function detect(text) {
67
75
  return true;
68
76
  } catch {/* rn-clipboard not functional */}
69
77
  }
78
+
79
+ // 3. Web fallback (react-native-web / desktop dashboard / browsers)
80
+ const webClipboard = getWebClipboard();
81
+ if (webClipboard) {
82
+ try {
83
+ await webClipboard.writeText(text);
84
+ _detectedType = "web";
85
+ _clipboardFn = async t => {
86
+ await webClipboard.writeText(t);
87
+ return true;
88
+ };
89
+ _detected = true;
90
+ return true;
91
+ } catch {/* clipboard permission denied */}
92
+ }
70
93
  _detected = true;
71
94
  return false;
72
95
  }
@@ -76,7 +99,10 @@ const clipboardType = () => {
76
99
  exports.clipboardType = clipboardType;
77
100
  const isClipboardAvailable = () => {
78
101
  // Before first use, optimistically return true if we have a module ref
79
- if (!_detected) return _expoClipboard != null || _rnClipboard != null;
102
+ // or the web clipboard API is present
103
+ if (!_detected) {
104
+ return _expoClipboard != null || _rnClipboard != null || getWebClipboard() != null;
105
+ }
80
106
  return _clipboardFn != null;
81
107
  };
82
108
  exports.isClipboardAvailable = isClipboardAvailable;
@@ -726,7 +726,6 @@ const useDataFlattening = (data, maxDepth = 10, autoExpandFirstLevel = false) =>
726
726
  const VirtualizedItemComponent = ({
727
727
  item,
728
728
  onToggleExpanded,
729
- data,
730
729
  index,
731
730
  onSelect,
732
731
  isSelected
@@ -790,9 +789,9 @@ const VirtualizedItemComponent = ({
790
789
  children: formatValue(item.value, item.valueType)
791
790
  })]
792
791
  })]
793
- }), item.id === "root" && data !== undefined && data !== null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_CopyButton.CopyButton, {
794
- value: data,
795
- size: 16,
792
+ }), item.value !== undefined ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_CopyButton.CopyButton, {
793
+ value: item.value,
794
+ size: 14,
796
795
  buttonStyle: {
797
796
  marginLeft: 8,
798
797
  marginRight: 8
@@ -877,7 +876,6 @@ const VirtualizedDataExplorer = ({
877
876
  item: item,
878
877
  index: index,
879
878
  onToggleExpanded: toggleExpanded,
880
- data: data,
881
879
  onSelect: setSelectedIndex,
882
880
  isSelected: selectedIndex === index
883
881
  });
@@ -7,7 +7,7 @@ exports.useNativeSafeAreaInsets = exports.safeAreaType = exports.hasSafeAreaPack
7
7
  /**
8
8
  * Auto-generated safe area implementation
9
9
  * Detected: none
10
- * Generated at: 2026-05-28T20:48:12.491Z
10
+ * Generated at: 2026-06-30T15:42:30.947Z
11
11
  *
12
12
  * DO NOT EDIT - This file is generated by scripts/detect-safe-area.js
13
13
  *
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PlusIcon = exports.Plus = exports.PlayIcon = exports.Play = exports.PhoneIcon = exports.Phone = exports.PauseIcon = exports.Pause = exports.PaletteIcon = exports.Palette = exports.NavigationIcon = exports.Navigation = exports.MusicIcon = exports.Music = exports.MinusIcon = exports.Minus = exports.Maximize2Icon = exports.Maximize2 = exports.LockIcon = exports.Lock = exports.LinkIcon = exports.Link = exports.LayersIcon = exports.Layers = exports.KeyIcon = exports.Key = exports.InfoIcon = exports.Info = exports.ImageIcon = exports.Image = exports.HelpCircle = exports.HashIcon = exports.Hash = exports.HardDriveIcon = exports.HardDrive = exports.HandIcon = exports.Hand = exports.GlobeIcon = exports.Globe = exports.GitBranchIcon = exports.GitBranch = exports.FloatWindow = exports.FlaskConicalIcon = exports.FlaskConical = exports.FilterIcon = exports.Filter = exports.FilmIcon = exports.Film = exports.FileTextIcon = exports.FileText = exports.FileJsonIcon = exports.FileJson = exports.FileCodeIcon = exports.FileCode = exports.EyeOffIcon = exports.EyeOff = exports.EyeIcon = exports.Eye = exports.Edit3Icon = exports.Edit3 = exports.DownloadIcon = exports.Download = exports.DockBottom = exports.DatabaseIcon = exports.Database = exports.CopyIcon = exports.Copy = exports.CloudIcon = exports.Cloud = exports.ClockIcon = exports.Clock = exports.ChevronUpIcon = exports.ChevronUp = exports.ChevronRightIcon = exports.ChevronRight = exports.ChevronLeftIcon = exports.ChevronLeft = exports.ChevronDownIcon = exports.ChevronDown = exports.CheckSquareIcon = exports.CheckSquare = exports.CheckIcon = exports.CheckCircleIcon = exports.CheckCircle2Icon = exports.CheckCircle2 = exports.CheckCircle = exports.Check = exports.BugIcon = exports.Bug = exports.BoxIcon = exports.Box = exports.BarChart3Icon = exports.BarChart3 = exports.AlertTriangleIcon = exports.AlertTriangle = exports.AlertOctagon = exports.AlertCircleIcon = exports.AlertCircle = exports.ActivityIcon = exports.Activity = void 0;
7
- exports.ZapIcon = exports.Zap = exports.XIcon = exports.XCircleIcon = exports.XCircle = exports.X = exports.WifiIcon = exports.Wifi = exports.VolumeIcon = exports.Volume = exports.UsersIcon = exports.Users = exports.UserIcon = exports.User = exports.UploadIcon = exports.Upload = exports.UnlockIcon = exports.Unlock = exports.TriangleAlertIcon = exports.TriangleAlert = exports.TrashIcon = exports.Trash2Icon = exports.Trash2 = exports.Trash = exports.TouchpadIcon = exports.Touchpad = exports.TimerIcon = exports.Timer = exports.TestTube2Icon = exports.TestTube2 = exports.SquareIcon = exports.SquareDashedIcon = exports.SquareDashed = exports.Square = exports.SmartphoneIcon = exports.Smartphone = exports.ShieldIcon = exports.Shield = exports.SettingsIcon = exports.Settings = exports.ServerIcon = exports.Server = exports.SearchIcon = exports.Search = exports.RouteIcon = exports.Route = exports.RefreshCwIcon = exports.RefreshCw = exports.PowerIcon = exports.Power = void 0;
6
+ exports.Play = exports.Pin = exports.PhoneIcon = exports.Phone = exports.PauseIcon = exports.Pause = exports.PaletteIcon = exports.Palette = exports.NavigationIcon = exports.Navigation = exports.MusicIcon = exports.Music = exports.MinusIcon = exports.Minus = exports.Maximize2Icon = exports.Maximize2 = exports.LockIcon = exports.Lock = exports.LinkIcon = exports.Link = exports.LayersIcon = exports.Layers = exports.KeyIcon = exports.Key = exports.InfoIcon = exports.Info = exports.ImageIcon = exports.Image = exports.HomeIcon = exports.Home = exports.HelpCircle = exports.HashIcon = exports.Hash = exports.HardDriveIcon = exports.HardDrive = exports.HandIcon = exports.Hand = exports.GlobeIcon = exports.Globe = exports.GitBranchIcon = exports.GitBranch = exports.FloatWindow = exports.FlaskConicalIcon = exports.FlaskConical = exports.FilterIcon = exports.Filter = exports.FilmIcon = exports.Film = exports.FileTextIcon = exports.FileText = exports.FileJsonIcon = exports.FileJson = exports.FileCodeIcon = exports.FileCode = exports.EyeOffIcon = exports.EyeOff = exports.EyeIcon = exports.Eye = exports.Edit3Icon = exports.Edit3 = exports.DownloadIcon = exports.Download = exports.DockBottom = exports.DatabaseIcon = exports.Database = exports.CopyIcon = exports.Copy = exports.CloudIcon = exports.Cloud = exports.ClockIcon = exports.Clock = exports.ChevronUpIcon = exports.ChevronUp = exports.ChevronRightIcon = exports.ChevronRight = exports.ChevronLeftIcon = exports.ChevronLeft = exports.ChevronDownIcon = exports.ChevronDown = exports.CheckSquareIcon = exports.CheckSquare = exports.CheckIcon = exports.CheckCircleIcon = exports.CheckCircle2Icon = exports.CheckCircle2 = exports.CheckCircle = exports.Check = exports.BugIcon = exports.Bug = exports.BoxIcon = exports.Box = exports.BarChart3Icon = exports.BarChart3 = exports.AlertTriangleIcon = exports.AlertTriangle = exports.AlertOctagon = exports.AlertCircleIcon = exports.AlertCircle = exports.ActivityIcon = exports.Activity = void 0;
7
+ exports.ZapIcon = exports.Zap = exports.XIcon = exports.XCircleIcon = exports.XCircle = exports.X = exports.WifiIcon = exports.Wifi = exports.VolumeIcon = exports.Volume = exports.UsersIcon = exports.Users = exports.UserIcon = exports.User = exports.UploadIcon = exports.Upload = exports.UnlockIcon = exports.Unlock = exports.TriangleAlertIcon = exports.TriangleAlert = exports.TrashIcon = exports.Trash2Icon = exports.Trash2 = exports.Trash = exports.TouchpadIcon = exports.Touchpad = exports.TimerIcon = exports.Timer = exports.TestTube2Icon = exports.TestTube2 = exports.SquareIcon = exports.SquareDashedIcon = exports.SquareDashed = exports.Square = exports.SmartphoneIcon = exports.Smartphone = exports.ShieldIcon = exports.Shield = exports.SettingsIcon = exports.Settings = exports.ServerIcon = exports.Server = exports.SearchIcon = exports.Search = exports.RouteIcon = exports.Route = exports.RefreshCwIcon = exports.RefreshCw = exports.PowerIcon = exports.Power = exports.PlusIcon = exports.Plus = exports.PlayIcon = void 0;
8
8
  var _reactNative = require("react-native");
9
9
  var OriginalIcons = _interopRequireWildcard(require("./lucide-icons-original-full.js"));
10
10
  var _jsxRuntime = require("react/jsx-runtime");
@@ -524,6 +524,32 @@ const Eye = ({
524
524
  })]
525
525
  });
526
526
  exports.Eye = Eye;
527
+ const Pin = ({
528
+ size = 24,
529
+ color = "currentColor",
530
+ strokeWidth = 2,
531
+ ...props
532
+ }) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(Svg, {
533
+ width: size,
534
+ height: size,
535
+ viewBox: "0 0 24 24",
536
+ ...props,
537
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Circle, {
538
+ cx: 12,
539
+ cy: 9,
540
+ r: 5,
541
+ stroke: color,
542
+ strokeWidth: strokeWidth
543
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Line, {
544
+ x1: 12,
545
+ y1: 14,
546
+ x2: 12,
547
+ y2: 21,
548
+ stroke: color,
549
+ strokeWidth: strokeWidth
550
+ })]
551
+ });
552
+ exports.Pin = Pin;
527
553
  const EyeOff = ({
528
554
  size = 24,
529
555
  color = "currentColor",
@@ -1398,8 +1424,67 @@ const Plus = ({
1398
1424
  strokeWidth: strokeWidth
1399
1425
  })]
1400
1426
  });
1427
+
1428
+ // Refresh / reload icon: a smooth 270° ring (open on the right) with a
1429
+ // clockwise triangle arrowhead. Built from the buoy icon-editor design
1430
+ // (smootharc ring + triangle) using the View-based border trick so it stays
1431
+ // crisp at any size. `strokeWidth` is accepted for API compatibility but the
1432
+ // proportions are fixed to keep the perfected look.
1401
1433
  exports.Plus = Plus;
1402
1434
  const RefreshCw = ({
1435
+ size = 24,
1436
+ color = "currentColor",
1437
+ strokeWidth: _strokeWidth = 2,
1438
+ ...props
1439
+ }) => {
1440
+ const RING_RADIUS = 7; // outer radius, centered in the 24x24 viewBox
1441
+ const RING_STROKE = 2.4;
1442
+ const ARROW_SIZE = 5.2;
1443
+ const ARROW_HALF = ARROW_SIZE * 0.577; // equilateral-ish half-width
1444
+ // Arrowhead anchor (from the editor design, mapped into the 0..24 viewBox)
1445
+ const arrowLeft = 12 + 3.162277660168379;
1446
+ const arrowTop = 12 - 2.846049894151541 - ARROW_HALF;
1447
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Svg, {
1448
+ width: size,
1449
+ height: size,
1450
+ viewBox: "0 0 24 24",
1451
+ ...props,
1452
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1453
+ style: {
1454
+ position: "absolute",
1455
+ left: 12 - RING_RADIUS,
1456
+ top: 12 - RING_RADIUS,
1457
+ width: RING_RADIUS * 2,
1458
+ height: RING_RADIUS * 2,
1459
+ borderRadius: RING_RADIUS,
1460
+ borderWidth: RING_STROKE,
1461
+ borderTopColor: color,
1462
+ borderLeftColor: color,
1463
+ borderBottomColor: color,
1464
+ borderRightColor: "transparent"
1465
+ }
1466
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1467
+ style: {
1468
+ position: "absolute",
1469
+ left: arrowLeft,
1470
+ top: arrowTop,
1471
+ width: 0,
1472
+ height: 0,
1473
+ borderTopWidth: ARROW_HALF,
1474
+ borderBottomWidth: ARROW_HALF,
1475
+ borderLeftWidth: ARROW_SIZE,
1476
+ borderTopColor: "transparent",
1477
+ borderBottomColor: "transparent",
1478
+ borderLeftColor: color,
1479
+ transform: [{
1480
+ rotate: "45deg"
1481
+ }]
1482
+ }
1483
+ })]
1484
+ });
1485
+ };
1486
+ exports.RefreshCw = RefreshCw;
1487
+ const Home = ({
1403
1488
  size = 24,
1404
1489
  color = "currentColor",
1405
1490
  strokeWidth = 2,
@@ -1410,42 +1495,65 @@ const RefreshCw = ({
1410
1495
  viewBox: "0 0 24 24",
1411
1496
  ...props,
1412
1497
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Line, {
1413
- x1: 23,
1414
- y1: 4,
1415
- x2: 23,
1416
- y2: 10,
1498
+ x1: 3,
1499
+ y1: 10,
1500
+ x2: 12,
1501
+ y2: 3,
1417
1502
  stroke: color,
1418
1503
  strokeWidth: strokeWidth
1419
1504
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Line, {
1420
- x1: 23,
1421
- y1: 10,
1422
- x2: 17,
1505
+ x1: 12,
1506
+ y1: 3,
1507
+ x2: 21,
1423
1508
  y2: 10,
1424
1509
  stroke: color,
1425
1510
  strokeWidth: strokeWidth
1426
1511
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Line, {
1427
- x1: 1,
1428
- y1: 20,
1429
- x2: 1,
1430
- y2: 14,
1512
+ x1: 5,
1513
+ y1: 9,
1514
+ x2: 5,
1515
+ y2: 21,
1431
1516
  stroke: color,
1432
1517
  strokeWidth: strokeWidth
1433
1518
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Line, {
1434
- x1: 1,
1435
- y1: 14,
1436
- x2: 7,
1437
- y2: 14,
1519
+ x1: 19,
1520
+ y1: 9,
1521
+ x2: 19,
1522
+ y2: 21,
1438
1523
  stroke: color,
1439
1524
  strokeWidth: strokeWidth
1440
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Circle, {
1441
- cx: 12,
1442
- cy: 12,
1443
- r: 9,
1525
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Line, {
1526
+ x1: 5,
1527
+ y1: 21,
1528
+ x2: 19,
1529
+ y2: 21,
1530
+ stroke: color,
1531
+ strokeWidth: strokeWidth
1532
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Line, {
1533
+ x1: 10,
1534
+ y1: 21,
1535
+ x2: 10,
1536
+ y2: 15,
1537
+ stroke: color,
1538
+ strokeWidth: strokeWidth
1539
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Line, {
1540
+ x1: 10,
1541
+ y1: 15,
1542
+ x2: 14,
1543
+ y2: 15,
1544
+ stroke: color,
1545
+ strokeWidth: strokeWidth
1546
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Line, {
1547
+ x1: 14,
1548
+ y1: 15,
1549
+ x2: 14,
1550
+ y2: 21,
1444
1551
  stroke: color,
1445
1552
  strokeWidth: strokeWidth
1446
1553
  })]
1447
1554
  });
1448
- exports.RefreshCw = RefreshCw;
1555
+ exports.Home = Home;
1556
+ const HomeIcon = exports.HomeIcon = Home;
1449
1557
  const Search = ({
1450
1558
  size = 24,
1451
1559
  color = "currentColor",
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  var _exportNames = {
7
+ absoluteFill: true,
7
8
  displayValue: true,
8
9
  parseDisplayValue: true,
9
10
  getSafeAreaInsets: true,
@@ -35,6 +36,7 @@ var _exportNames = {
35
36
  useSafeSegments: true,
36
37
  useSafeGlobalSearchParams: true,
37
38
  getSafeRouter: true,
39
+ getSafeCurrentPathname: true,
38
40
  isExpoRouterAvailable: true,
39
41
  isPlainObjectUtil: true,
40
42
  useSafeAreaInsets: true,
@@ -143,6 +145,12 @@ Object.defineProperty(exports, "UpgradePrompt", {
143
145
  return _index12.UpgradePrompt;
144
146
  }
145
147
  });
148
+ Object.defineProperty(exports, "absoluteFill", {
149
+ enumerable: true,
150
+ get: function () {
151
+ return _index3.absoluteFill;
152
+ }
153
+ });
146
154
  Object.defineProperty(exports, "buoyColors", {
147
155
  enumerable: true,
148
156
  get: function () {
@@ -209,6 +217,12 @@ Object.defineProperty(exports, "getSafeAreaInsets", {
209
217
  return _index3.getSafeAreaInsets;
210
218
  }
211
219
  });
220
+ Object.defineProperty(exports, "getSafeCurrentPathname", {
221
+ enumerable: true,
222
+ get: function () {
223
+ return _index3.getSafeCurrentPathname;
224
+ }
225
+ });
212
226
  Object.defineProperty(exports, "getSafeRouter", {
213
227
  enumerable: true,
214
228
  get: function () {
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.DeviceLimitModal = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactNative = require("react-native");
9
+ var _absoluteFill = require("../utils/absoluteFill.js");
9
10
  var _macOSDesignSystemColors = require("../ui/gameUI/constants/macOSDesignSystemColors.js");
10
11
  var _lucideIcons = require("../icons/lucide-icons.js");
11
12
  var _jsxRuntime = require("react/jsx-runtime");
@@ -272,7 +273,7 @@ const styles = _reactNative.StyleSheet.create({
272
273
  alignItems: "center"
273
274
  },
274
275
  backdrop: {
275
- ..._reactNative.StyleSheet.absoluteFillObject,
276
+ ..._absoluteFill.absoluteFill,
276
277
  backgroundColor: "rgba(0, 0, 0, 0.8)"
277
278
  },
278
279
  modal: {
@@ -3,13 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.UpgradePrompt = exports.UpgradeModal = exports.ProUpgradeModal = exports.ProFeatureBanner = exports.ProBadge = exports.FeatureGate = void 0;
6
+ exports.WEEKEND_PASS_LABEL = exports.UpgradePrompt = exports.UpgradeModal = exports.ProUpgradeModal = exports.ProFeatureBanner = exports.ProBadge = exports.FeatureGate = void 0;
7
7
  exports.useFeatureGate = useFeatureGate;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _reactNative = require("react-native");
10
10
  var _gameUIColors = require("../ui/gameUI/constants/gameUIColors.js");
11
11
  var _lucideIcons = require("../icons/lucide-icons.js");
12
12
  var _LicenseEntryModal = require("./LicenseEntryModal.js");
13
+ var _openPricing = require("./openPricing.js");
13
14
  var _license = require("@buoy-gg/license");
14
15
  var _jsxRuntime = require("react/jsx-runtime");
15
16
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
@@ -19,18 +20,33 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
19
20
  * Wraps premium features and shows an upgrade prompt for free users.
20
21
  */
21
22
 
23
+ // Weekend Pass branding — a distinct violet so it never reads as the gold PRO.
24
+ const WEEKEND_PASS_LABEL = exports.WEEKEND_PASS_LABEL = "WEEKEND PASS";
25
+ const WEEKEND_VIOLET = "#BF5AF2";
26
+
22
27
  /**
23
- * Simple Pro badge for marking premium features
28
+ * Simple Pro badge for marking premium features.
29
+ *
30
+ * Reason-aware: when the free Weekend Pass is the active unlock (a free user on
31
+ * a weekend), it shows a violet "WEEKEND PASS" badge instead of the gold "PRO"
32
+ * so people know Pro is free this weekend. A real license — or a free user on a
33
+ * weekday seeing the badge as a Pro-feature marker — shows "PRO".
24
34
  */
25
35
  const ProBadge = ({
26
36
  style
27
- }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
28
- style: [styles.proBadge, style],
29
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
30
- style: styles.proBadgeText,
31
- children: "PRO"
32
- })
33
- });
37
+ }) => {
38
+ const {
39
+ reason
40
+ } = (0, _license.useProAccess)();
41
+ const weekend = reason === "weekend";
42
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
43
+ style: [styles.proBadge, weekend && styles.weekendBadge, style],
44
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
45
+ style: [styles.proBadgeText, weekend && styles.weekendBadgeText],
46
+ children: weekend ? WEEKEND_PASS_LABEL : "PRO"
47
+ })
48
+ });
49
+ };
34
50
 
35
51
  /**
36
52
  * Simple Pro upgrade modal - minimal modal with just upgrade button
@@ -63,6 +79,10 @@ const UpgradePrompt = ({
63
79
  const handlePress = (0, _react.useCallback)(() => {
64
80
  if (onUpgradePress) {
65
81
  onUpgradePress();
82
+ } else if (_openPricing.isWeb) {
83
+ // Desktop dashboard: buy on the website, not via the mobile Buoy.init()
84
+ // code path. (Already have a key? Enter it from the toolbar Upgrade button.)
85
+ (0, _openPricing.openPricing)();
66
86
  } else {
67
87
  setShowLicenseModal(true);
68
88
  }
@@ -190,13 +210,21 @@ const FeatureGate = ({
190
210
  */
191
211
  exports.FeatureGate = FeatureGate;
192
212
  function useFeatureGate() {
193
- const isPro = (0, _license.useIsPro)();
213
+ const {
214
+ isPro,
215
+ isLicensed,
216
+ isWeekendFree,
217
+ reason
218
+ } = (0, _license.useProAccess)();
194
219
  const showUpgrade = () => {
195
- _reactNative.Linking.openURL("https://buoy.gg/pro");
220
+ (0, _openPricing.openPricing)("https://buoy.gg/pro");
196
221
  };
197
222
  return {
198
223
  hasAccess: isPro,
199
224
  isPro,
225
+ isLicensed,
226
+ isWeekendFree,
227
+ reason,
200
228
  showUpgrade
201
229
  };
202
230
  }
@@ -214,6 +242,12 @@ const ProFeatureBanner = ({
214
242
  const [showLicenseModal, setShowLicenseModal] = (0, _react.useState)(false);
215
243
  const license = (0, _license.useLicense)();
216
244
  const handleUpgrade = (0, _react.useCallback)(() => {
245
+ // Desktop dashboard: open pricing in the browser instead of the mobile
246
+ // license-entry modal.
247
+ if (_openPricing.isWeb) {
248
+ (0, _openPricing.openPricing)();
249
+ return;
250
+ }
217
251
  setShowLicenseModal(true);
218
252
  }, []);
219
253
  const handleCloseModal = (0, _react.useCallback)(() => {
@@ -289,6 +323,12 @@ const UpgradeModal = ({
289
323
  const [showLicenseModal, setShowLicenseModal] = (0, _react.useState)(false);
290
324
  const license = (0, _license.useLicense)();
291
325
  const handleUpgrade = (0, _react.useCallback)(() => {
326
+ // Desktop dashboard: send users straight to the pricing page in their
327
+ // browser instead of the mobile Buoy.init() license-entry modal.
328
+ if (_openPricing.isWeb) {
329
+ (0, _openPricing.openPricing)();
330
+ return;
331
+ }
292
332
  setShowLicenseModal(true);
293
333
  }, []);
294
334
  const handleCloseLicenseModal = (0, _react.useCallback)(() => {
@@ -424,6 +464,15 @@ const styles = _reactNative.StyleSheet.create({
424
464
  color: _gameUIColors.buoyColors.primary,
425
465
  letterSpacing: 0.5
426
466
  },
467
+ // Weekend Pass variant — violet instead of the gold/primary PRO.
468
+ weekendBadge: {
469
+ backgroundColor: WEEKEND_VIOLET + "1A",
470
+ borderColor: WEEKEND_VIOLET + "55"
471
+ },
472
+ weekendBadgeText: {
473
+ color: WEEKEND_VIOLET,
474
+ letterSpacing: 0.4
475
+ },
427
476
  container: {
428
477
  padding: 20,
429
478
  alignItems: "center",
@@ -6,7 +6,9 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.LicenseEntryModal = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactNative = require("react-native");
9
+ var _absoluteFill = require("../utils/absoluteFill.js");
9
10
  var _macOSDesignSystemColors = require("../ui/gameUI/constants/macOSDesignSystemColors.js");
11
+ var _openPricing = require("./openPricing.js");
10
12
  var _lucideIcons = require("../icons/lucide-icons.js");
11
13
  var _jsxRuntime = require("react/jsx-runtime");
12
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
@@ -40,7 +42,7 @@ const LicenseEntryModal = ({
40
42
  }) => {
41
43
  const [copied, setCopied] = _react.default.useState(false);
42
44
  const handleGetLicense = (0, _react.useCallback)(() => {
43
- _reactNative.Linking.openURL(purchaseUrl);
45
+ (0, _openPricing.openPricing)(purchaseUrl);
44
46
  }, [purchaseUrl]);
45
47
  const handleCopyCode = (0, _react.useCallback)(() => {
46
48
  if (Clipboard?.setString) {
@@ -106,7 +108,16 @@ const LicenseEntryModal = ({
106
108
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
107
109
  style: styles.dividerLine
108
110
  })]
109
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
111
+ }), _openPricing.isWeb ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
112
+ style: styles.instructionsContainer,
113
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
114
+ style: styles.instructionsNote,
115
+ children: "Click the Upgrade button in the top toolbar and paste your license key. It also unlocks automatically when a connected device is running Buoy Pro."
116
+ })
117
+ }) :
118
+ /*#__PURE__*/
119
+ /* Option 2: Instructions */
120
+ (0, _jsxRuntime.jsxs)(_reactNative.View, {
110
121
  style: styles.instructionsContainer,
111
122
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
112
123
  style: styles.instructionsHeader,
@@ -199,7 +210,7 @@ const styles = _reactNative.StyleSheet.create({
199
210
  alignItems: "center"
200
211
  },
201
212
  backdrop: {
202
- ..._reactNative.StyleSheet.absoluteFillObject,
213
+ ..._absoluteFill.absoluteFill,
203
214
  backgroundColor: "rgba(0, 0, 0, 0.8)"
204
215
  },
205
216
  modal: {
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.ManageDevicesModal = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactNative = require("react-native");
9
+ var _absoluteFill = require("../utils/absoluteFill.js");
9
10
  var _gameUIColors = require("../ui/gameUI/constants/gameUIColors.js");
10
11
  var _lucideIcons = require("../icons/lucide-icons.js");
11
12
  var _jsxRuntime = require("react/jsx-runtime");
@@ -343,7 +344,7 @@ const styles = _reactNative.StyleSheet.create({
343
344
  alignItems: "center"
344
345
  },
345
346
  backdrop: {
346
- ..._reactNative.StyleSheet.absoluteFillObject,
347
+ ..._absoluteFill.absoluteFill,
347
348
  backgroundColor: "rgba(0, 0, 0, 0.7)"
348
349
  },
349
350
  modal: {
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isWeb = exports.PRICING_URL = void 0;
7
+ exports.openPricing = openPricing;
8
+ var _reactNative = require("react-native");
9
+ const PRICING_URL = exports.PRICING_URL = "https://buoy.gg/pricing";
10
+
11
+ /** True when running on the desktop dashboard / web (react-native-web). */
12
+ const isWeb = exports.isWeb = _reactNative.Platform.OS === "web";
13
+
14
+ /**
15
+ * Open an upgrade/pricing URL.
16
+ *
17
+ * On the desktop dashboard (web) the upgrade flow is NOT the mobile
18
+ * `Buoy.init()` code path — the user buys on the website (or enters a key in
19
+ * the toolbar). Route the link through the Electron shell bridge so it lands in
20
+ * the user's DEFAULT browser instead of a bare in-app window; fall back to
21
+ * window.open for a plain browser tab. On native, use React Native Linking.
22
+ */
23
+ function openPricing(url = PRICING_URL) {
24
+ // Access the browser globals via globalThis so this file doesn't depend on
25
+ // the DOM lib (the shared package targets React Native).
26
+ const win = globalThis.window;
27
+ if (isWeb && win) {
28
+ if (win.buoyShell?.openExternal) {
29
+ win.buoyShell.openExternal(url);
30
+ return;
31
+ }
32
+ win.open?.(url, "_blank", "noopener");
33
+ return;
34
+ }
35
+ _reactNative.Linking.openURL(url);
36
+ }
@@ -98,6 +98,7 @@ const devToolsStorageKeys = exports.devToolsStorageKeys = {
98
98
  filters: () => `${devToolsStorageKeys.storage.root()}_filters`,
99
99
  eventFilters: () => `${devToolsStorageKeys.storage.root()}_event_filters`,
100
100
  keyFilters: () => `${devToolsStorageKeys.storage.root()}_key_filters`,
101
+ pinnedKeys: () => `${devToolsStorageKeys.storage.root()}_pinned_keys`,
101
102
  preferences: () => `${devToolsStorageKeys.storage.root()}_preferences`,
102
103
  activeTab: () => `${devToolsStorageKeys.storage.root()}_active_tab`,
103
104
  isMonitoring: () => `${devToolsStorageKeys.storage.root()}_is_monitoring`,