@buoy-gg/route-events 7.0.26 → 7.0.28

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 (39) hide show
  1. package/lib/commonjs/RouteParser.js +8 -4
  2. package/lib/commonjs/components/NavigationStack.js +19 -18
  3. package/lib/commonjs/components/ReactNavigationRoutes.js +108 -106
  4. package/lib/commonjs/components/RouteEventDetail.js +9 -6
  5. package/lib/commonjs/components/RouteEventExpandedContent.js +3 -3
  6. package/lib/commonjs/components/RouteEventItemCompact.js +5 -4
  7. package/lib/commonjs/components/RouteEventsModalWithTabs.js +48 -25
  8. package/lib/commonjs/components/RouteEventsTimeline.js +3 -3
  9. package/lib/commonjs/components/RoutesSitemap.js +129 -129
  10. package/lib/commonjs/sync/routeEventsSyncAdapter.js +9 -3
  11. package/lib/commonjs/useNavigationStack.js +4 -5
  12. package/lib/commonjs/useRouteObserverReactNavigation.js +1 -5
  13. package/lib/commonjs/utils/safeReactNavigation.js +62 -6
  14. package/lib/module/RouteParser.js +8 -4
  15. package/lib/module/components/NavigationStack.js +20 -19
  16. package/lib/module/components/ReactNavigationRoutes.js +111 -109
  17. package/lib/module/components/RouteEventDetail.js +10 -7
  18. package/lib/module/components/RouteEventExpandedContent.js +4 -4
  19. package/lib/module/components/RouteEventItemCompact.js +6 -5
  20. package/lib/module/components/RouteEventsModalWithTabs.js +51 -28
  21. package/lib/module/components/RouteEventsTimeline.js +4 -4
  22. package/lib/module/components/RoutesSitemap.js +131 -131
  23. package/lib/module/sync/routeEventsSyncAdapter.js +9 -3
  24. package/lib/module/useNavigationStack.js +6 -7
  25. package/lib/module/useRouteObserverReactNavigation.js +3 -7
  26. package/lib/module/utils/safeReactNavigation.js +62 -6
  27. package/lib/typescript/RouteParser.d.ts.map +1 -1
  28. package/lib/typescript/components/NavigationStack.d.ts.map +1 -1
  29. package/lib/typescript/components/ReactNavigationRoutes.d.ts.map +1 -1
  30. package/lib/typescript/components/RouteEventsModalWithTabs.d.ts +7 -0
  31. package/lib/typescript/components/RouteEventsModalWithTabs.d.ts.map +1 -1
  32. package/lib/typescript/components/RoutesSitemap.d.ts.map +1 -1
  33. package/lib/typescript/sync/routeEventsSyncAdapter.d.ts +1 -0
  34. package/lib/typescript/sync/routeEventsSyncAdapter.d.ts.map +1 -1
  35. package/lib/typescript/useNavigationStack.d.ts.map +1 -1
  36. package/lib/typescript/useRouteObserverReactNavigation.d.ts.map +1 -1
  37. package/lib/typescript/utils/safeReactNavigation.d.ts +6 -5
  38. package/lib/typescript/utils/safeReactNavigation.d.ts.map +1 -1
  39. package/package.json +5 -5
@@ -38,11 +38,11 @@ function getRouteTypeColor(routeType) {
38
38
  case "home":
39
39
  return _sharedUi.buoyColors.success;
40
40
  case "dynamic":
41
- return _sharedUi.buoyColors.primary;
41
+ return _sharedUi.night.color.accent;
42
42
  case "with-params":
43
43
  return _sharedUi.buoyColors.warning;
44
44
  default:
45
- return _sharedUi.buoyColors.textSecondary;
45
+ return _sharedUi.night.color.textSecondary;
46
46
  // More visible than border color
47
47
  }
48
48
  }
@@ -180,7 +180,7 @@ const styles = _reactNative.StyleSheet.create({
180
180
  fontFamily: "monospace"
181
181
  },
182
182
  goButton: {
183
- backgroundColor: _sharedUi.buoyColors.primary,
183
+ backgroundColor: _sharedUi.night.color.accent,
184
184
  paddingHorizontal: 8,
185
185
  paddingVertical: 4,
186
186
  borderRadius: 4
@@ -188,7 +188,8 @@ const styles = _reactNative.StyleSheet.create({
188
188
  goButtonText: {
189
189
  fontSize: 10,
190
190
  fontWeight: "600",
191
- color: "#FFFFFF",
191
+ // Ink on a filled accent surface — the night accent takes dark ink.
192
+ color: _sharedUi.night.color.onAccent,
192
193
  fontFamily: "monospace"
193
194
  }
194
195
  });
@@ -18,11 +18,10 @@ var _ReactNavigationRoutes = require("./ReactNavigationRoutes");
18
18
  var _NavigationStack = require("./NavigationStack");
19
19
  var _RouteEventsTimeline = require("./RouteEventsTimeline");
20
20
  var _jsxRuntime = require("react/jsx-runtime");
21
- // Resolved once at module load; null when @react-navigation/native is absent
22
- // (the fallback context then yields an undefined containerRef, so the
23
- // dispatch paths below never execute).
21
+ // Resolved once at module load; null when React Navigation is absent
22
+ // (useSafeNavigationContainerRef then yields undefined, so the dispatch
23
+ // paths below never execute).
24
24
  const CommonActions = (0, _safeReactNavigation.getCommonActions)();
25
- const NavigationContainerRefContext = (0, _safeReactNavigation.getNavigationContainerRefContext)();
26
25
 
27
26
  // Free tier limit for route events
28
27
 
@@ -84,7 +83,7 @@ function RouteEventsModalWithTabs({
84
83
  remote
85
84
  }) {
86
85
  const router = (0, _sharedUi.useSafeRouter)();
87
- const containerRef = (0, _react.useContext)(NavigationContainerRefContext);
86
+ const containerRef = (0, _safeReactNavigation.useSafeNavigationContainerRef)();
88
87
  const hasExpoRouter = (0, _sharedUi.isExpoRouterAvailable)();
89
88
  const [activeTab, setActiveTab] = (0, _react.useState)("events");
90
89
  const [showUpgradeModal, setShowUpgradeModal] = (0, _react.useState)(false);
@@ -138,6 +137,19 @@ function RouteEventsModalWithTabs({
138
137
  }, []);
139
138
  const handleNavigate = (0, _react.useCallback)(pathname => {
140
139
  try {
140
+ // A remote host (Buoy Desktop) means the events belong to a synced
141
+ // device — this process has no router, so delegate over the socket.
142
+ // Same Pro gate as remote sitemap navigation: Home stays free so a
143
+ // free user can always get the device back to a known screen.
144
+ if (remote) {
145
+ if (!remote.onNavigatePath) return;
146
+ if (!isPro && pathname !== "/") {
147
+ setShowUpgradeModal(true);
148
+ return;
149
+ }
150
+ remote.onNavigatePath(pathname);
151
+ return;
152
+ }
141
153
  if (hasExpoRouter) {
142
154
  router.push(pathname);
143
155
  } else if (containerRef) {
@@ -161,11 +173,15 @@ function RouteEventsModalWithTabs({
161
173
  containerRef.dispatch(CommonActions.navigate({
162
174
  name: screenName
163
175
  }));
176
+ } else {
177
+ // Neither Expo Router nor a navigation container — say so instead
178
+ // of swallowing the tap.
179
+ _reactNative.Alert.alert("Navigation Unavailable", "No Expo Router or React Navigation container was found in this app.");
164
180
  }
165
181
  } catch (error) {
166
182
  _reactNative.Alert.alert("Navigation Error", String(error));
167
183
  }
168
- }, [router, containerRef, hasExpoRouter]);
184
+ }, [router, containerRef, hasExpoRouter, remote, isPro]);
169
185
 
170
186
  // Load persisted tab state on mount
171
187
  (0, _react.useEffect)(() => {
@@ -446,7 +462,7 @@ function RouteEventsModalWithTabs({
446
462
  style: styles.emptyState,
447
463
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Navigation, {
448
464
  size: 48,
449
- color: _sharedUi.buoyColors.textMuted
465
+ color: _sharedUi.night.color.textTertiary
450
466
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
451
467
  style: styles.emptyTitle,
452
468
  children: searchQuery.trim() ? "No matching events" : isListening ? "No route events yet" : "Event listener is paused"
@@ -472,7 +488,7 @@ function RouteEventsModalWithTabs({
472
488
  style: styles.lockedEventsBanner,
473
489
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Lock, {
474
490
  size: 14,
475
- color: _sharedUi.buoyColors.warning
491
+ color: _sharedUi.night.color.warning
476
492
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
477
493
  style: styles.lockedEventsBannerText,
478
494
  children: [lockedEventCount, " older ", lockedEventCount === 1 ? 'event' : 'events', " locked"]
@@ -547,7 +563,7 @@ function RouteEventsModalWithTabs({
547
563
  style: [styles.iconButton, ignoredPatterns.size > 0 && styles.activeFilterButton],
548
564
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Filter, {
549
565
  size: 14,
550
- color: ignoredPatterns.size > 0 ? _sharedUi.buoyColors.primary : _sharedUi.buoyColors.textSecondary
566
+ color: ignoredPatterns.size > 0 ? _sharedUi.night.color.accent : _sharedUi.night.color.textSecondary
551
567
  })
552
568
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.PowerToggleButton, {
553
569
  isEnabled: isListening,
@@ -558,7 +574,7 @@ function RouteEventsModalWithTabs({
558
574
  style: styles.iconButton,
559
575
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Trash2, {
560
576
  size: 14,
561
- color: _sharedUi.buoyColors.error
577
+ color: _sharedUi.night.color.danger
562
578
  })
563
579
  })]
564
580
  })]
@@ -611,7 +627,11 @@ function RouteEventsModalWithTabs({
611
627
  onModeChange: handleModeChange,
612
628
  enablePersistence: true,
613
629
  initialMode: "bottomSheet",
614
- enableGlitchEffects: true,
630
+ enableGlitchEffects: true
631
+ // Every screen owns its scrolling (timeline FlatList, sitemap/stack/
632
+ // detail/filter ScrollViews) — the default wrapper would nest them.
633
+ ,
634
+ disableScrollWrapper: true,
615
635
  styles: {},
616
636
  footer: footerNode,
617
637
  footerHeight: footerNode ? 68 : 0,
@@ -638,7 +658,9 @@ const styles = _reactNative.StyleSheet.create({
638
658
  inlineRoot: {
639
659
  flex: 1,
640
660
  minHeight: 0,
641
- backgroundColor: _sharedUi.buoyColors.base
661
+ // Transparent so the desktop workbench's hoisted sky (one field spanning
662
+ // sidebar + panel) shows through — the shell paints its base beneath it.
663
+ backgroundColor: "transparent"
642
664
  },
643
665
  inlineHeader: {
644
666
  paddingHorizontal: 12,
@@ -650,10 +672,10 @@ const styles = _reactNative.StyleSheet.create({
650
672
  iconButton: {
651
673
  padding: 6,
652
674
  borderRadius: 6,
653
- backgroundColor: _sharedUi.buoyColors.input
675
+ backgroundColor: _sharedUi.night.color.buttonSurface
654
676
  },
655
677
  activeFilterButton: {
656
- backgroundColor: _sharedUi.buoyColors.primary + "1A"
678
+ backgroundColor: _sharedUi.night.color.accentSoft
657
679
  },
658
680
  emptyState: {
659
681
  flex: 1,
@@ -662,7 +684,7 @@ const styles = _reactNative.StyleSheet.create({
662
684
  padding: 32
663
685
  },
664
686
  emptyTitle: {
665
- color: _sharedUi.buoyColors.text,
687
+ color: _sharedUi.night.color.text,
666
688
  fontSize: 16,
667
689
  fontWeight: "600",
668
690
  marginTop: 16,
@@ -672,7 +694,7 @@ const styles = _reactNative.StyleSheet.create({
672
694
  textTransform: "uppercase"
673
695
  },
674
696
  emptySubtitle: {
675
- color: _sharedUi.buoyColors.textSecondary,
697
+ color: _sharedUi.night.color.textSecondary,
676
698
  fontSize: 14,
677
699
  textAlign: "center",
678
700
  fontFamily: "monospace"
@@ -683,32 +705,33 @@ const styles = _reactNative.StyleSheet.create({
683
705
  statsContainer: {
684
706
  paddingHorizontal: 16,
685
707
  paddingVertical: 8,
686
- backgroundColor: _sharedUi.buoyColors.card,
708
+ backgroundColor: _sharedUi.night.color.surface,
687
709
  borderBottomWidth: 1,
688
- borderBottomColor: _sharedUi.buoyColors.border
710
+ borderBottomColor: _sharedUi.night.color.border
689
711
  },
690
712
  statsText: {
691
713
  fontSize: 11,
692
- color: _sharedUi.buoyColors.textSecondary,
714
+ color: _sharedUi.night.color.textSecondary,
693
715
  fontFamily: "monospace",
694
716
  textAlign: "center"
695
717
  },
696
718
  statsWarning: {
697
- color: _sharedUi.buoyColors.warning,
719
+ color: _sharedUi.night.color.warning,
698
720
  fontWeight: "600"
699
721
  },
700
722
  searchContainer: {
701
723
  paddingHorizontal: 16,
702
724
  paddingVertical: 8,
703
- backgroundColor: _sharedUi.buoyColors.base
725
+ // Transparent so the night sheet's star field shows through.
726
+ backgroundColor: "transparent"
704
727
  },
705
728
  lockedEventsBanner: {
706
729
  flexDirection: "row",
707
730
  alignItems: "center",
708
731
  gap: 8,
709
- backgroundColor: _sharedUi.buoyColors.warning + "15",
732
+ backgroundColor: _sharedUi.night.color.warningSoft,
710
733
  borderWidth: 1,
711
- borderColor: _sharedUi.buoyColors.warning + "30",
734
+ borderColor: _sharedUi.night.color.warning + "30",
712
735
  borderRadius: 8,
713
736
  paddingVertical: 10,
714
737
  paddingHorizontal: 14,
@@ -718,12 +741,12 @@ const styles = _reactNative.StyleSheet.create({
718
741
  lockedEventsBannerText: {
719
742
  fontSize: 12,
720
743
  fontWeight: "600",
721
- color: _sharedUi.buoyColors.warning,
744
+ color: _sharedUi.night.color.warning,
722
745
  fontFamily: "monospace"
723
746
  },
724
747
  lockedEventsBannerSubtext: {
725
748
  fontSize: 11,
726
- color: _sharedUi.buoyColors.textSecondary,
749
+ color: _sharedUi.night.color.textSecondary,
727
750
  marginLeft: "auto"
728
751
  }
729
752
  });
@@ -35,7 +35,7 @@ function RouteEventsTimeline({
35
35
  style: styles.emptyState,
36
36
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Navigation, {
37
37
  size: 48,
38
- color: _sharedUi.buoyColors.textMuted
38
+ color: _sharedUi.night.color.textTertiary
39
39
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
40
40
  style: styles.emptyTitle,
41
41
  children: "No events yet"
@@ -89,7 +89,7 @@ const styles = _reactNative.StyleSheet.create({
89
89
  padding: 32
90
90
  },
91
91
  emptyTitle: {
92
- color: _sharedUi.buoyColors.text,
92
+ color: _sharedUi.night.color.text,
93
93
  fontSize: 16,
94
94
  fontWeight: "600",
95
95
  marginTop: 16,
@@ -99,7 +99,7 @@ const styles = _reactNative.StyleSheet.create({
99
99
  textTransform: "uppercase"
100
100
  },
101
101
  emptySubtitle: {
102
- color: _sharedUi.buoyColors.textSecondary,
102
+ color: _sharedUi.night.color.textSecondary,
103
103
  fontSize: 14,
104
104
  textAlign: "center",
105
105
  fontFamily: "monospace"