@buoy-gg/route-events 7.0.33 → 7.0.35

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 (29) hide show
  1. package/lib/commonjs/components/NavigationStack.js +11 -11
  2. package/lib/commonjs/components/ReactNavigationRoutes.js +15 -15
  3. package/lib/commonjs/components/RouteEventDetail.js +1 -1
  4. package/lib/commonjs/components/RouteEventExpandedContent.js +3 -3
  5. package/lib/commonjs/components/RouteEventItemCompact.js +2 -2
  6. package/lib/commonjs/components/RouteEventsModalWithTabs.js +24 -107
  7. package/lib/commonjs/components/RouteEventsTimeline.js +4 -13
  8. package/lib/commonjs/components/RoutesSitemap.js +16 -16
  9. package/lib/commonjs/hooks/useRouteEvents.js +12 -43
  10. package/lib/commonjs/preset.js +7 -21
  11. package/lib/module/components/NavigationStack.js +12 -12
  12. package/lib/module/components/ReactNavigationRoutes.js +16 -16
  13. package/lib/module/components/RouteEventDetail.js +2 -2
  14. package/lib/module/components/RouteEventExpandedContent.js +4 -4
  15. package/lib/module/components/RouteEventItemCompact.js +3 -3
  16. package/lib/module/components/RouteEventsModalWithTabs.js +26 -109
  17. package/lib/module/components/RouteEventsTimeline.js +5 -14
  18. package/lib/module/components/RoutesSitemap.js +17 -17
  19. package/lib/module/hooks/useRouteEvents.js +12 -43
  20. package/lib/module/preset.js +6 -19
  21. package/lib/typescript/components/NavigationStack.d.ts.map +1 -1
  22. package/lib/typescript/components/ReactNavigationRoutes.d.ts.map +1 -1
  23. package/lib/typescript/components/RouteEventsModalWithTabs.d.ts.map +1 -1
  24. package/lib/typescript/components/RouteEventsTimeline.d.ts.map +1 -1
  25. package/lib/typescript/components/RoutesSitemap.d.ts.map +1 -1
  26. package/lib/typescript/hooks/useRouteEvents.d.ts.map +1 -1
  27. package/lib/typescript/preset.d.ts +2 -8
  28. package/lib/typescript/preset.d.ts.map +1 -1
  29. package/package.json +5 -5
@@ -416,7 +416,7 @@ const styles = _reactNative.StyleSheet.create({
416
416
  loadingText: {
417
417
  color: _sharedUi.night.color.textSecondary,
418
418
  fontSize: 14,
419
- fontFamily: "monospace"
419
+ fontFamily: _sharedUi.monoFont
420
420
  },
421
421
  errorContainer: {
422
422
  flex: 1,
@@ -428,13 +428,13 @@ const styles = _reactNative.StyleSheet.create({
428
428
  color: _sharedUi.buoyColors.error,
429
429
  fontSize: 16,
430
430
  fontWeight: "600",
431
- fontFamily: "monospace",
431
+ fontFamily: _sharedUi.monoFont,
432
432
  marginBottom: 8
433
433
  },
434
434
  errorDetail: {
435
435
  color: _sharedUi.night.color.textSecondary,
436
436
  fontSize: 12,
437
- fontFamily: "monospace",
437
+ fontFamily: _sharedUi.monoFont,
438
438
  textAlign: "center"
439
439
  },
440
440
  emptyContainer: {
@@ -447,13 +447,13 @@ const styles = _reactNative.StyleSheet.create({
447
447
  color: _sharedUi.night.color.text,
448
448
  fontSize: 16,
449
449
  fontWeight: "600",
450
- fontFamily: "monospace",
450
+ fontFamily: _sharedUi.monoFont,
451
451
  marginBottom: 8
452
452
  },
453
453
  emptySubtext: {
454
454
  color: _sharedUi.night.color.textSecondary,
455
455
  fontSize: 14,
456
- fontFamily: "monospace",
456
+ fontFamily: _sharedUi.monoFont,
457
457
  textAlign: "center"
458
458
  },
459
459
  stackScroll: {
@@ -491,7 +491,7 @@ const styles = _reactNative.StyleSheet.create({
491
491
  fontSize: 13,
492
492
  fontWeight: "600",
493
493
  color: _sharedUi.night.color.text,
494
- fontFamily: "monospace",
494
+ fontFamily: _sharedUi.monoFont,
495
495
  flex: 1
496
496
  },
497
497
  copyRouteButton: {
@@ -507,7 +507,7 @@ const styles = _reactNative.StyleSheet.create({
507
507
  statusBadgeText: {
508
508
  fontSize: 10,
509
509
  fontWeight: "600",
510
- fontFamily: "monospace"
510
+ fontFamily: _sharedUi.monoFont
511
511
  },
512
512
  expandedContent: {
513
513
  paddingHorizontal: 12,
@@ -522,13 +522,13 @@ const styles = _reactNative.StyleSheet.create({
522
522
  detailLabel: {
523
523
  fontSize: 10,
524
524
  color: _sharedUi.night.color.textSecondary,
525
- fontFamily: "monospace",
525
+ fontFamily: _sharedUi.monoFont,
526
526
  marginBottom: 2
527
527
  },
528
528
  detailValue: {
529
529
  fontSize: 12,
530
530
  color: _sharedUi.night.color.text,
531
- fontFamily: "monospace"
531
+ fontFamily: _sharedUi.monoFont
532
532
  },
533
533
  dataViewerContainer: {
534
534
  marginTop: 4,
@@ -557,7 +557,7 @@ const styles = _reactNative.StyleSheet.create({
557
557
  fontSize: 12,
558
558
  fontWeight: "600",
559
559
  color: _sharedUi.night.color.text,
560
- fontFamily: "monospace"
560
+ fontFamily: _sharedUi.monoFont
561
561
  },
562
562
  actionButtonTextDisabled: {
563
563
  color: _sharedUi.night.color.textTertiary
@@ -565,7 +565,7 @@ const styles = _reactNative.StyleSheet.create({
565
565
  helpText: {
566
566
  fontSize: 9,
567
567
  color: _sharedUi.night.color.textSecondary,
568
- fontFamily: "monospace",
568
+ fontFamily: _sharedUi.monoFont,
569
569
  textAlign: "center",
570
570
  marginTop: 4,
571
571
  lineHeight: 12
@@ -550,12 +550,12 @@ const styles = _reactNative.StyleSheet.create({
550
550
  emptyText: {
551
551
  color: _sharedUi.night.color.textSecondary,
552
552
  fontSize: 14,
553
- fontFamily: "monospace"
553
+ fontFamily: _sharedUi.monoFont
554
554
  },
555
555
  emptySubtext: {
556
556
  color: _sharedUi.night.color.textTertiary,
557
557
  fontSize: 12,
558
- fontFamily: "monospace",
558
+ fontFamily: _sharedUi.monoFont,
559
559
  marginTop: 8
560
560
  },
561
561
  header: {
@@ -593,7 +593,7 @@ const styles = _reactNative.StyleSheet.create({
593
593
  actionLabel: {
594
594
  fontSize: 8,
595
595
  color: _sharedUi.night.color.textTertiary,
596
- fontFamily: "monospace",
596
+ fontFamily: _sharedUi.monoFont,
597
597
  textTransform: "uppercase",
598
598
  letterSpacing: 0.5
599
599
  },
@@ -620,13 +620,13 @@ const styles = _reactNative.StyleSheet.create({
620
620
  fontSize: 18,
621
621
  fontWeight: "800",
622
622
  color: _sharedUi.night.color.text,
623
- fontFamily: "monospace"
623
+ fontFamily: _sharedUi.monoFont
624
624
  },
625
625
  statLabel: {
626
626
  fontSize: 10,
627
627
  color: _sharedUi.night.color.textTertiary,
628
628
  marginTop: 4,
629
- fontFamily: "monospace",
629
+ fontFamily: _sharedUi.monoFont,
630
630
  textTransform: "uppercase",
631
631
  letterSpacing: 0.5
632
632
  },
@@ -642,7 +642,7 @@ const styles = _reactNative.StyleSheet.create({
642
642
  flex: 1,
643
643
  color: _sharedUi.night.color.text,
644
644
  fontSize: 14,
645
- fontFamily: "monospace"
645
+ fontFamily: _sharedUi.monoFont
646
646
  },
647
647
  clearButton: {
648
648
  padding: 4
@@ -659,7 +659,7 @@ const styles = _reactNative.StyleSheet.create({
659
659
  color: _sharedUi.night.color.accent,
660
660
  fontSize: 14,
661
661
  fontWeight: "600",
662
- fontFamily: "monospace"
662
+ fontFamily: _sharedUi.monoFont
663
663
  },
664
664
  scrollView: {
665
665
  flex: 1
@@ -681,7 +681,7 @@ const styles = _reactNative.StyleSheet.create({
681
681
  metaText: {
682
682
  fontSize: 12,
683
683
  color: _sharedUi.night.color.textSecondary,
684
- fontFamily: "monospace"
684
+ fontFamily: _sharedUi.monoFont
685
685
  },
686
686
  sourceBadge: {
687
687
  paddingHorizontal: 8,
@@ -695,7 +695,7 @@ const styles = _reactNative.StyleSheet.create({
695
695
  fontSize: 11,
696
696
  color: _sharedUi.night.color.textSecondary,
697
697
  textTransform: "capitalize",
698
- fontFamily: "monospace"
698
+ fontFamily: _sharedUi.monoFont
699
699
  },
700
700
  groupContainer: {
701
701
  marginVertical: 4
@@ -720,7 +720,7 @@ const styles = _reactNative.StyleSheet.create({
720
720
  fontSize: 12,
721
721
  fontWeight: "700",
722
722
  color: _sharedUi.night.color.text,
723
- fontFamily: "monospace",
723
+ fontFamily: _sharedUi.monoFont,
724
724
  textTransform: "uppercase",
725
725
  letterSpacing: 0.8
726
726
  },
@@ -739,7 +739,7 @@ const styles = _reactNative.StyleSheet.create({
739
739
  fontSize: 11,
740
740
  fontWeight: "600",
741
741
  color: "#3B82F6",
742
- fontFamily: "monospace"
742
+ fontFamily: _sharedUi.monoFont
743
743
  },
744
744
  screensList: {
745
745
  // Transparent so the night sheet's star field shows through.
@@ -756,7 +756,7 @@ const styles = _reactNative.StyleSheet.create({
756
756
  groupDescriptionText: {
757
757
  fontSize: 11,
758
758
  color: _sharedUi.night.color.textSecondary,
759
- fontFamily: "monospace",
759
+ fontFamily: _sharedUi.monoFont,
760
760
  lineHeight: 16
761
761
  },
762
762
  screenItem: {
@@ -795,7 +795,7 @@ const styles = _reactNative.StyleSheet.create({
795
795
  fontSize: 13,
796
796
  fontWeight: "600",
797
797
  color: _sharedUi.night.color.text,
798
- fontFamily: "monospace",
798
+ fontFamily: _sharedUi.monoFont,
799
799
  flex: 1
800
800
  },
801
801
  screenHeaderActions: {
@@ -812,7 +812,7 @@ const styles = _reactNative.StyleSheet.create({
812
812
  statusText: {
813
813
  fontSize: 10,
814
814
  fontWeight: "600",
815
- fontFamily: "monospace"
815
+ fontFamily: _sharedUi.monoFont
816
816
  },
817
817
  headerActionButton: {
818
818
  padding: 6,
@@ -830,7 +830,7 @@ const styles = _reactNative.StyleSheet.create({
830
830
  navigateButtonText: {
831
831
  fontSize: 12,
832
832
  color: _sharedUi.night.color.accent,
833
- fontFamily: "monospace",
833
+ fontFamily: _sharedUi.monoFont,
834
834
  fontWeight: "600"
835
835
  }
836
836
  });
@@ -90,7 +90,7 @@ const styles = _reactNative.StyleSheet.create({
90
90
  fontWeight: "600",
91
91
  // Ink on a filled accent surface — the night accent takes dark ink.
92
92
  color: _sharedUi.night.color.onAccent,
93
- fontFamily: "monospace",
93
+ fontFamily: _sharedUi.monoFont,
94
94
  textTransform: "uppercase",
95
95
  letterSpacing: 0.5
96
96
  }
@@ -172,14 +172,14 @@ const styles = _reactNative.StyleSheet.create({
172
172
  detailLabel: {
173
173
  fontSize: 10,
174
174
  color: _sharedUi.night.color.textSecondary,
175
- fontFamily: "monospace",
175
+ fontFamily: _sharedUi.monoFont,
176
176
  fontWeight: "600",
177
177
  minWidth: 70
178
178
  },
179
179
  detailValue: {
180
180
  fontSize: 11,
181
181
  color: _sharedUi.night.color.text,
182
- fontFamily: "monospace",
182
+ fontFamily: _sharedUi.monoFont,
183
183
  flex: 1
184
184
  },
185
185
  copyButton: {
@@ -198,7 +198,7 @@ const styles = _reactNative.StyleSheet.create({
198
198
  dataViewerTitle: {
199
199
  fontSize: 11,
200
200
  color: _sharedUi.night.color.textSecondary,
201
- fontFamily: "monospace",
201
+ fontFamily: _sharedUi.monoFont,
202
202
  fontWeight: "600"
203
203
  }
204
204
  });
@@ -191,7 +191,7 @@ const styles = _reactNative.StyleSheet.create({
191
191
  badgeText: {
192
192
  fontSize: 11,
193
193
  fontWeight: "600",
194
- fontFamily: "monospace"
194
+ fontFamily: _sharedUi.monoFont
195
195
  },
196
196
  goButton: {
197
197
  backgroundColor: _sharedUi.night.color.accent,
@@ -204,6 +204,6 @@ const styles = _reactNative.StyleSheet.create({
204
204
  fontWeight: "600",
205
205
  // Ink on a filled accent surface — the night accent takes dark ink.
206
206
  color: _sharedUi.night.color.onAccent,
207
- fontFamily: "monospace"
207
+ fontFamily: _sharedUi.monoFont
208
208
  }
209
209
  });
@@ -25,6 +25,23 @@ const CommonActions = (0, _safeReactNavigation.getCommonActions)();
25
25
 
26
26
  // Free tier limit for route events
27
27
 
28
+ /** Persistence recipes: the tab is stored as its bare name, the flag as "true"/"false". */
29
+ const TAB_PERSISTENCE = {
30
+ // Every tab the selector offers, including "stack": the save side has
31
+ // always written it, so leaving it off this list meant the Stack tab
32
+ // was persisted and then silently discarded on the next launch.
33
+ parse: raw => raw === "routes" || raw === "events" || raw === "stack" ? raw : undefined,
34
+ serialize: tab => tab
35
+ };
36
+ const BOOLEAN_PERSISTENCE = {
37
+ parse: raw => raw === "true",
38
+ serialize: value => value.toString()
39
+ };
40
+ const STRING_SET_PERSISTENCE = {
41
+ parse: raw => new Set(JSON.parse(raw)),
42
+ serialize: set => JSON.stringify(Array.from(set))
43
+ };
44
+
28
45
  /**
29
46
  * Find the path from root navigation state to a screen by name.
30
47
  * Returns array of route names from root to the target, or null if not found.
@@ -85,7 +102,7 @@ function RouteEventsModalWithTabs({
85
102
  const router = (0, _sharedUi.useSafeRouter)();
86
103
  const containerRef = (0, _safeReactNavigation.useSafeNavigationContainerRef)();
87
104
  const hasExpoRouter = (0, _sharedUi.isExpoRouterAvailable)();
88
- const [activeTab, setActiveTab] = (0, _react.useState)("events");
105
+ const [activeTab, setActiveTab] = (0, _sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.routeEvents.activeTab(), "events", TAB_PERSISTENCE);
89
106
  const [showUpgradeModal, setShowUpgradeModal] = (0, _react.useState)(false);
90
107
  // Serialized stack reported up by NavigationStack so the copy button can live
91
108
  // in the shared navbar.
@@ -107,7 +124,7 @@ function RouteEventsModalWithTabs({
107
124
  // See the RouteTracker component export for easy setup.
108
125
 
109
126
  // Local state to control subscription (true = subscribed, false = unsubscribed)
110
- const [isListeningEnabled, setIsListeningEnabled] = (0, _react.useState)(true);
127
+ const [isListeningEnabled, setIsListeningEnabled] = (0, _sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.routeEvents.isMonitoring(), true, BOOLEAN_PERSISTENCE);
111
128
 
112
129
  // Event Listener state - using centralized store via hook
113
130
  // Pass enabled option to control subscription
@@ -127,11 +144,8 @@ function RouteEventsModalWithTabs({
127
144
  const [selectedEvent, setSelectedEvent] = (0, _react.useState)(null);
128
145
  const [selectedVisitNumber, setSelectedVisitNumber] = (0, _react.useState)(1);
129
146
  const [searchQuery, setSearchQuery] = (0, _react.useState)("");
130
- const [ignoredPatterns, setIgnoredPatterns] = (0, _react.useState)(new Set(["/_sitemap", "/api", "/__dev"]));
147
+ const [ignoredPatterns, setIgnoredPatterns] = (0, _sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.routeEvents.eventFilters(), new Set(["/_sitemap", "/api", "/__dev"]), STRING_SET_PERSISTENCE);
131
148
  const lastEventRef = (0, _react.useRef)(null);
132
- const hasLoadedFilters = (0, _react.useRef)(false);
133
- const hasLoadedTabState = (0, _react.useRef)(false);
134
- const hasLoadedMonitoringState = (0, _react.useRef)(false);
135
149
  const handleModeChange = (0, _react.useCallback)(_mode => {
136
150
  // Mode changes handled by JsModal
137
151
  }, []);
@@ -183,103 +197,6 @@ function RouteEventsModalWithTabs({
183
197
  }
184
198
  }, [router, containerRef, hasExpoRouter, remote, isPro]);
185
199
 
186
- // Load persisted tab state on mount
187
- (0, _react.useEffect)(() => {
188
- if (!visible || hasLoadedTabState.current) return;
189
- const loadTabState = async () => {
190
- try {
191
- const storedTab = await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.routeEvents.activeTab());
192
- // Every tab the selector offers, including "stack": the save side has
193
- // always written it, so leaving it off this list meant the Stack tab
194
- // was persisted and then silently discarded on the next launch —
195
- // you came back to Events having chosen otherwise.
196
- if (storedTab === "routes" || storedTab === "events" || storedTab === "stack") {
197
- setActiveTab(storedTab);
198
- }
199
- hasLoadedTabState.current = true;
200
- } catch (error) {
201
- // Failed to load tab state
202
- }
203
- };
204
- loadTabState();
205
- }, [visible]);
206
-
207
- // Load persisted monitoring state on mount
208
- (0, _react.useEffect)(() => {
209
- if (!visible || hasLoadedMonitoringState.current) return;
210
- const loadMonitoringState = async () => {
211
- try {
212
- const storedMonitoring = await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.routeEvents.isMonitoring());
213
- if (storedMonitoring !== null) {
214
- const shouldMonitor = storedMonitoring === "true";
215
- setIsListeningEnabled(shouldMonitor);
216
- }
217
- hasLoadedMonitoringState.current = true;
218
- } catch (error) {
219
- // Failed to load monitoring state
220
- }
221
- };
222
- loadMonitoringState();
223
- }, [visible]);
224
-
225
- // Save tab state when it changes
226
- (0, _react.useEffect)(() => {
227
- if (!hasLoadedTabState.current) return;
228
- const saveTabState = async () => {
229
- try {
230
- await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.routeEvents.activeTab(), activeTab);
231
- } catch (error) {
232
- // Failed to save tab state
233
- }
234
- };
235
- saveTabState();
236
- }, [activeTab]);
237
-
238
- // Save monitoring state when it changes
239
- (0, _react.useEffect)(() => {
240
- if (!hasLoadedMonitoringState.current) return;
241
- const saveMonitoringState = async () => {
242
- try {
243
- await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.routeEvents.isMonitoring(), isListening.toString());
244
- } catch (error) {
245
- // Failed to save monitoring state
246
- }
247
- };
248
- saveMonitoringState();
249
- }, [isListening]);
250
-
251
- // Load persisted filters on mount
252
- (0, _react.useEffect)(() => {
253
- if (!visible || hasLoadedFilters.current) return;
254
- const loadFilters = async () => {
255
- try {
256
- const storedFilters = await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.routeEvents.eventFilters());
257
- if (storedFilters) {
258
- const filters = JSON.parse(storedFilters);
259
- setIgnoredPatterns(new Set(filters));
260
- }
261
- hasLoadedFilters.current = true;
262
- } catch (error) {
263
- // Failed to load filters
264
- }
265
- };
266
- loadFilters();
267
- }, [visible]);
268
-
269
- // Save filters when they change
270
- (0, _react.useEffect)(() => {
271
- if (!hasLoadedFilters.current) return;
272
- const saveFilters = async () => {
273
- try {
274
- const filters = Array.from(ignoredPatterns);
275
- await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.routeEvents.eventFilters(), JSON.stringify(filters));
276
- } catch (error) {
277
- // Failed to save filters
278
- }
279
- };
280
- saveFilters();
281
- }, [ignoredPatterns]);
282
-
283
200
  // Event listener is now managed by useRouteEvents hook
284
201
 
285
202
  const handleToggleListening = (0, _react.useCallback)(() => {
@@ -729,7 +646,7 @@ const styles = _reactNative.StyleSheet.create({
729
646
  fontWeight: "600",
730
647
  marginTop: 16,
731
648
  marginBottom: 8,
732
- fontFamily: "monospace",
649
+ fontFamily: _sharedUi.monoFont,
733
650
  letterSpacing: 0.5,
734
651
  textTransform: "uppercase"
735
652
  },
@@ -737,7 +654,7 @@ const styles = _reactNative.StyleSheet.create({
737
654
  color: _sharedUi.night.color.textSecondary,
738
655
  fontSize: 14,
739
656
  textAlign: "center",
740
- fontFamily: "monospace"
657
+ fontFamily: _sharedUi.monoFont
741
658
  },
742
659
  contentWrapper: {
743
660
  flex: 1
@@ -752,7 +669,7 @@ const styles = _reactNative.StyleSheet.create({
752
669
  statsText: {
753
670
  fontSize: 11,
754
671
  color: _sharedUi.night.color.textSecondary,
755
- fontFamily: "monospace",
672
+ fontFamily: _sharedUi.monoFont,
756
673
  textAlign: "center"
757
674
  },
758
675
  statsWarning: {
@@ -782,7 +699,7 @@ const styles = _reactNative.StyleSheet.create({
782
699
  fontSize: 12,
783
700
  fontWeight: "600",
784
701
  color: _sharedUi.night.color.warning,
785
- fontFamily: "monospace"
702
+ fontFamily: _sharedUi.monoFont
786
703
  },
787
704
  lockedEventsBannerSubtext: {
788
705
  fontSize: 11,
@@ -73,17 +73,8 @@ function RouteEventsTimeline({
73
73
  onPress: handleItemPress,
74
74
  onNavigate: onNavigate
75
75
  }),
76
- showsVerticalScrollIndicator: true
77
- // Clipped cells fail Detox's hittability check even when they are on
78
- // screen, so the e2e bundle keeps every mounted row targetable. The
79
- // env var is inlined at bundle time; guarded so a non-inlining bundler
80
- // keeps production behaviour.
81
- ,
82
- removeClippedSubviews: !(typeof process !== "undefined" && process.env?.EXPO_PUBLIC_E2E),
83
- initialNumToRender: 12,
84
- maxToRenderPerBatch: 8,
85
- windowSize: 5,
86
- updateCellsBatchingPeriod: 50
76
+ showsVerticalScrollIndicator: true,
77
+ ..._sharedUi.EVENT_LIST_PRESET
87
78
  })
88
79
  );
89
80
  }
@@ -103,7 +94,7 @@ const styles = _reactNative.StyleSheet.create({
103
94
  fontWeight: "600",
104
95
  marginTop: 16,
105
96
  marginBottom: 8,
106
- fontFamily: "monospace",
97
+ fontFamily: _sharedUi.monoFont,
107
98
  letterSpacing: 0.5,
108
99
  textTransform: "uppercase"
109
100
  },
@@ -111,6 +102,6 @@ const styles = _reactNative.StyleSheet.create({
111
102
  color: _sharedUi.night.color.textSecondary,
112
103
  fontSize: 14,
113
104
  textAlign: "center",
114
- fontFamily: "monospace"
105
+ fontFamily: _sharedUi.monoFont
115
106
  }
116
107
  });
@@ -687,7 +687,7 @@ const styles = _reactNative.StyleSheet.create({
687
687
  loadingText: {
688
688
  color: _sharedUi.night.color.textSecondary,
689
689
  fontSize: 14,
690
- fontFamily: "monospace",
690
+ fontFamily: _sharedUi.monoFont,
691
691
  textAlign: "center",
692
692
  lineHeight: 20,
693
693
  paddingHorizontal: 32,
@@ -728,13 +728,13 @@ const styles = _reactNative.StyleSheet.create({
728
728
  fontSize: 18,
729
729
  fontWeight: "800",
730
730
  color: _sharedUi.night.color.text,
731
- fontFamily: "monospace"
731
+ fontFamily: _sharedUi.monoFont
732
732
  },
733
733
  statLabel: {
734
734
  fontSize: 10,
735
735
  color: _sharedUi.night.color.textTertiary,
736
736
  marginTop: 4,
737
- fontFamily: "monospace",
737
+ fontFamily: _sharedUi.monoFont,
738
738
  textTransform: "uppercase",
739
739
  letterSpacing: 0.5
740
740
  },
@@ -773,7 +773,7 @@ const styles = _reactNative.StyleSheet.create({
773
773
  actionLabel: {
774
774
  fontSize: 8,
775
775
  color: _sharedUi.night.color.textTertiary,
776
- fontFamily: "monospace",
776
+ fontFamily: _sharedUi.monoFont,
777
777
  textTransform: "uppercase",
778
778
  letterSpacing: 0.5
779
779
  },
@@ -797,7 +797,7 @@ const styles = _reactNative.StyleSheet.create({
797
797
  metaText: {
798
798
  fontSize: 12,
799
799
  color: _sharedUi.night.color.textSecondary,
800
- fontFamily: "monospace"
800
+ fontFamily: _sharedUi.monoFont
801
801
  },
802
802
  sourceBadge: {
803
803
  paddingHorizontal: 8,
@@ -811,7 +811,7 @@ const styles = _reactNative.StyleSheet.create({
811
811
  fontSize: 11,
812
812
  color: _sharedUi.night.color.textSecondary,
813
813
  textTransform: "capitalize",
814
- fontFamily: "monospace"
814
+ fontFamily: _sharedUi.monoFont
815
815
  },
816
816
  searchContainer: {
817
817
  flexDirection: "row",
@@ -825,7 +825,7 @@ const styles = _reactNative.StyleSheet.create({
825
825
  flex: 1,
826
826
  color: _sharedUi.night.color.text,
827
827
  fontSize: 14,
828
- fontFamily: "monospace"
828
+ fontFamily: _sharedUi.monoFont
829
829
  },
830
830
  clearButton: {
831
831
  padding: 4
@@ -842,7 +842,7 @@ const styles = _reactNative.StyleSheet.create({
842
842
  color: _sharedUi.night.color.accent,
843
843
  fontSize: 14,
844
844
  fontWeight: "600",
845
- fontFamily: "monospace"
845
+ fontFamily: _sharedUi.monoFont
846
846
  },
847
847
  scrollView: {
848
848
  flex: 1
@@ -857,7 +857,7 @@ const styles = _reactNative.StyleSheet.create({
857
857
  emptyText: {
858
858
  color: _sharedUi.night.color.textSecondary,
859
859
  fontSize: 14,
860
- fontFamily: "monospace"
860
+ fontFamily: _sharedUi.monoFont
861
861
  },
862
862
  groupContainer: {
863
863
  marginVertical: 4
@@ -882,7 +882,7 @@ const styles = _reactNative.StyleSheet.create({
882
882
  fontSize: 12,
883
883
  fontWeight: "700",
884
884
  color: _sharedUi.night.color.text,
885
- fontFamily: "monospace",
885
+ fontFamily: _sharedUi.monoFont,
886
886
  textTransform: "uppercase",
887
887
  letterSpacing: 0.8
888
888
  },
@@ -901,7 +901,7 @@ const styles = _reactNative.StyleSheet.create({
901
901
  fontSize: 11,
902
902
  fontWeight: "600",
903
903
  color: "#3B82F6",
904
- fontFamily: "monospace"
904
+ fontFamily: _sharedUi.monoFont
905
905
  },
906
906
  routesList: {
907
907
  // Transparent so the night sheet's star field shows through.
@@ -918,7 +918,7 @@ const styles = _reactNative.StyleSheet.create({
918
918
  groupDescriptionText: {
919
919
  fontSize: 11,
920
920
  color: _sharedUi.night.color.textSecondary,
921
- fontFamily: "monospace",
921
+ fontFamily: _sharedUi.monoFont,
922
922
  lineHeight: 16
923
923
  },
924
924
  routeItem: {
@@ -961,7 +961,7 @@ const styles = _reactNative.StyleSheet.create({
961
961
  fontSize: 13,
962
962
  fontWeight: "600",
963
963
  color: _sharedUi.night.color.text,
964
- fontFamily: "monospace",
964
+ fontFamily: _sharedUi.monoFont,
965
965
  flex: 1
966
966
  },
967
967
  routeHeaderActions: {
@@ -984,7 +984,7 @@ const styles = _reactNative.StyleSheet.create({
984
984
  fontSize: 11,
985
985
  fontWeight: "600",
986
986
  color: _sharedUi.night.color.textSecondary,
987
- fontFamily: "monospace"
987
+ fontFamily: _sharedUi.monoFont
988
988
  },
989
989
  typeTag: {
990
990
  borderRadius: 4,
@@ -995,7 +995,7 @@ const styles = _reactNative.StyleSheet.create({
995
995
  typeText: {
996
996
  fontSize: 10,
997
997
  fontWeight: "600",
998
- fontFamily: "monospace"
998
+ fontFamily: _sharedUi.monoFont
999
999
  },
1000
1000
  // Compact icon-sized Copy button in the header action cluster.
1001
1001
  iconAction: {
@@ -1022,7 +1022,7 @@ const styles = _reactNative.StyleSheet.create({
1022
1022
  goButtonText: {
1023
1023
  fontSize: 12,
1024
1024
  color: _sharedUi.night.color.accent,
1025
- fontFamily: "monospace",
1025
+ fontFamily: _sharedUi.monoFont,
1026
1026
  fontWeight: "600"
1027
1027
  },
1028
1028
  childrenContainer: {