@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
@@ -146,15 +146,19 @@ export class RouteParser {
146
146
  */
147
147
  static organizeRoutes(routes) {
148
148
  const groups = [];
149
- const rootRoutes = routes.filter(r => r.depth === 0 && r.type !== 'dynamic' && r.type !== 'layout');
149
+
150
+ // Flatten before grouping, like every other bucket — static/index screens
151
+ // nested under layouts (e.g. (tabs)/about at depth 2) must still be listed,
152
+ // or the stats header counts routes the list never shows.
153
+ const staticRoutes = this.flattenRoutes(routes).filter(r => r.type === 'static' || r.type === 'index');
150
154
  const dynamicRoutes = this.flattenRoutes(routes).filter(r => r.type === 'dynamic' || r.type === 'catch-all');
151
155
  const layoutRoutes = this.flattenRoutes(routes).filter(r => r.type === 'layout');
152
156
  const groupedRoutes = this.flattenRoutes(routes).filter(r => r.type === 'group');
153
- if (rootRoutes.length > 0) {
157
+ if (staticRoutes.length > 0) {
154
158
  groups.push({
155
- title: 'Root Routes',
159
+ title: 'Static Routes',
156
160
  icon: '',
157
- routes: rootRoutes
161
+ routes: staticRoutes
158
162
  });
159
163
  }
160
164
  if (dynamicRoutes.length > 0) {
@@ -9,7 +9,7 @@
9
9
 
10
10
  import { useState, useMemo, useEffect } from "react";
11
11
  import { View, Text, ScrollView, TouchableOpacity, StyleSheet, Alert } from "react-native";
12
- import { ChevronDown, ChevronRight, InlineCopyButton, ProUpgradeModal, buoyColors, useSafeAreaInsets } from "@buoy-gg/shared-ui";
12
+ import { ChevronDown, ChevronRight, InlineCopyButton, ProUpgradeModal, buoyColors, night, useSafeAreaInsets } from "@buoy-gg/shared-ui";
13
13
  import { useIsPro } from "@buoy-gg/license";
14
14
  import { DataViewer } from "@buoy-gg/shared-ui/dataViewer";
15
15
  import { useNavigationStack } from "../useNavigationStack";
@@ -255,10 +255,10 @@ export function NavigationStack({
255
255
  style: styles.expandIndicator,
256
256
  children: isExpanded ? /*#__PURE__*/_jsx(ChevronDown, {
257
257
  size: 14,
258
- color: buoyColors.textSecondary
258
+ color: night.color.textSecondary
259
259
  }) : /*#__PURE__*/_jsx(ChevronRight, {
260
260
  size: 14,
261
- color: buoyColors.textSecondary
261
+ color: night.color.textSecondary
262
262
  })
263
263
  }), /*#__PURE__*/_jsx(Text, {
264
264
  style: styles.stackItemPath,
@@ -371,7 +371,8 @@ export function NavigationStack({
371
371
  const styles = StyleSheet.create({
372
372
  container: {
373
373
  flex: 1,
374
- backgroundColor: buoyColors.base
374
+ // Transparent so JsModal's ToolBackground shows through (the modal paints opaque base beneath it).
375
+ backgroundColor: "transparent"
375
376
  },
376
377
  loadingContainer: {
377
378
  flex: 1,
@@ -380,7 +381,7 @@ const styles = StyleSheet.create({
380
381
  padding: 32
381
382
  },
382
383
  loadingText: {
383
- color: buoyColors.textSecondary,
384
+ color: night.color.textSecondary,
384
385
  fontSize: 14,
385
386
  fontFamily: "monospace"
386
387
  },
@@ -398,7 +399,7 @@ const styles = StyleSheet.create({
398
399
  marginBottom: 8
399
400
  },
400
401
  errorDetail: {
401
- color: buoyColors.textSecondary,
402
+ color: night.color.textSecondary,
402
403
  fontSize: 12,
403
404
  fontFamily: "monospace",
404
405
  textAlign: "center"
@@ -410,14 +411,14 @@ const styles = StyleSheet.create({
410
411
  padding: 32
411
412
  },
412
413
  emptyText: {
413
- color: buoyColors.text,
414
+ color: night.color.text,
414
415
  fontSize: 16,
415
416
  fontWeight: "600",
416
417
  fontFamily: "monospace",
417
418
  marginBottom: 8
418
419
  },
419
420
  emptySubtext: {
420
- color: buoyColors.textSecondary,
421
+ color: night.color.textSecondary,
421
422
  fontSize: 14,
422
423
  fontFamily: "monospace",
423
424
  textAlign: "center"
@@ -432,14 +433,14 @@ const styles = StyleSheet.create({
432
433
  marginBottom: 6
433
434
  },
434
435
  stackItem: {
435
- backgroundColor: buoyColors.card,
436
+ backgroundColor: night.color.surface,
436
437
  borderRadius: 6,
437
438
  borderWidth: 1,
438
- borderColor: buoyColors.border,
439
+ borderColor: night.color.border,
439
440
  overflow: "hidden"
440
441
  },
441
442
  stackItemSelected: {
442
- borderColor: buoyColors.primary,
443
+ borderColor: night.color.accent,
443
444
  borderWidth: 2
444
445
  },
445
446
  stackItemHeader: {
@@ -456,7 +457,7 @@ const styles = StyleSheet.create({
456
457
  stackItemPath: {
457
458
  fontSize: 13,
458
459
  fontWeight: "600",
459
- color: buoyColors.text,
460
+ color: night.color.text,
460
461
  fontFamily: "monospace",
461
462
  flex: 1
462
463
  },
@@ -480,20 +481,20 @@ const styles = StyleSheet.create({
480
481
  paddingTop: 8,
481
482
  paddingBottom: 12,
482
483
  borderTopWidth: 1,
483
- borderTopColor: buoyColors.border
484
+ borderTopColor: night.color.border
484
485
  },
485
486
  detailRow: {
486
487
  marginBottom: 8
487
488
  },
488
489
  detailLabel: {
489
490
  fontSize: 10,
490
- color: buoyColors.textSecondary,
491
+ color: night.color.textSecondary,
491
492
  fontFamily: "monospace",
492
493
  marginBottom: 2
493
494
  },
494
495
  detailValue: {
495
496
  fontSize: 12,
496
- color: buoyColors.text,
497
+ color: night.color.text,
497
498
  fontFamily: "monospace"
498
499
  },
499
500
  dataViewerContainer: {
@@ -510,7 +511,7 @@ const styles = StyleSheet.create({
510
511
  flex: 1
511
512
  },
512
513
  actionButton: {
513
- backgroundColor: buoyColors.input,
514
+ backgroundColor: night.color.surfaceElevated,
514
515
  paddingVertical: 8,
515
516
  paddingHorizontal: 8,
516
517
  borderRadius: 6,
@@ -522,15 +523,15 @@ const styles = StyleSheet.create({
522
523
  actionButtonText: {
523
524
  fontSize: 12,
524
525
  fontWeight: "600",
525
- color: buoyColors.text,
526
+ color: night.color.text,
526
527
  fontFamily: "monospace"
527
528
  },
528
529
  actionButtonTextDisabled: {
529
- color: buoyColors.textMuted
530
+ color: night.color.textTertiary
530
531
  },
531
532
  helpText: {
532
533
  fontSize: 9,
533
- color: buoyColors.textSecondary,
534
+ color: night.color.textSecondary,
534
535
  fontFamily: "monospace",
535
536
  textAlign: "center",
536
537
  marginTop: 4,
@@ -10,16 +10,15 @@
10
10
  * Provides navigation to any discovered screen using nested screen/params actions.
11
11
  */
12
12
 
13
- import { useState, useCallback, useMemo, useEffect, useContext } from "react";
13
+ import { useState, useCallback, useMemo, useEffect } from "react";
14
14
  import { View, Text, TextInput, TouchableOpacity, ScrollView, StyleSheet, Alert } from "react-native";
15
- import { getCommonActions, getNavigationContainerRefContext } from "../utils/safeReactNavigation";
15
+ import { getCommonActions, useSafeNavigationContainerRef } from "../utils/safeReactNavigation";
16
16
 
17
- // Resolved once at module load; null when @react-navigation/native is absent
18
- // (the fallback context then yields an undefined containerRef, so the
19
- // dispatch paths below never execute).
17
+ // Resolved once at module load; null when React Navigation is absent
18
+ // (useSafeNavigationContainerRef then yields undefined, so the dispatch
19
+ // paths below never execute).
20
20
  const CommonActions = getCommonActions();
21
- const NavigationContainerRefContext = getNavigationContainerRefContext();
22
- import { Search, ChevronDown, ChevronRight, InlineCopyButton, ToolbarCopyButton, RefreshCw, ProUpgradeModal, buoyColors } from "@buoy-gg/shared-ui";
21
+ import { Search, ChevronDown, ChevronRight, InlineCopyButton, ToolbarCopyButton, RefreshCw, ProUpgradeModal, buoyColors, night } from "@buoy-gg/shared-ui";
23
22
  import { useIsPro } from "@buoy-gg/license";
24
23
 
25
24
  // ============================================================================
@@ -121,7 +120,7 @@ function buildNestedNavigateAction(path) {
121
120
  export function ReactNavigationRoutes({
122
121
  style
123
122
  }) {
124
- const containerRef = useContext(NavigationContainerRefContext);
123
+ const containerRef = useSafeNavigationContainerRef();
125
124
  const [navigationState, setNavigationState] = useState(() => containerRef?.getRootState?.() ?? null);
126
125
  const [searchQuery, setSearchQuery] = useState("");
127
126
  const [isSearching, setIsSearching] = useState(false);
@@ -275,72 +274,15 @@ export function ReactNavigationRoutes({
275
274
  }
276
275
  return /*#__PURE__*/_jsxs(View, {
277
276
  style: [styles.container, style],
278
- children: [!isSearching ? /*#__PURE__*/_jsxs(View, {
279
- style: styles.header,
280
- children: [/*#__PURE__*/_jsxs(View, {
281
- style: styles.actionsRow,
282
- children: [/*#__PURE__*/_jsxs(View, {
283
- style: styles.actionWrapper,
284
- children: [/*#__PURE__*/_jsx(ToolbarCopyButton, {
285
- value: copyAllData,
286
- buttonStyle: styles.actionButtonHeader
287
- }), /*#__PURE__*/_jsx(Text, {
288
- style: styles.actionLabel,
289
- children: "Copy"
290
- })]
291
- }), /*#__PURE__*/_jsxs(View, {
292
- style: styles.actionWrapper,
293
- children: [/*#__PURE__*/_jsx(TouchableOpacity, {
294
- style: [styles.iconButton, isRefreshing && styles.refreshButtonDisabled],
295
- onPress: handleRefresh,
296
- disabled: isRefreshing,
297
- children: /*#__PURE__*/_jsx(RefreshCw, {
298
- size: 16,
299
- color: isRefreshing ? buoyColors.textMuted : buoyColors.textSecondary
300
- })
301
- }), /*#__PURE__*/_jsx(Text, {
302
- style: styles.actionLabel,
303
- children: "Refresh"
304
- })]
305
- }), /*#__PURE__*/_jsxs(View, {
306
- style: styles.actionWrapper,
307
- children: [/*#__PURE__*/_jsx(TouchableOpacity, {
308
- style: styles.iconButton,
309
- onPress: () => setIsSearching(true),
310
- children: /*#__PURE__*/_jsx(Search, {
311
- size: 16,
312
- color: buoyColors.textSecondary
313
- })
314
- }), /*#__PURE__*/_jsx(Text, {
315
- style: styles.actionLabel,
316
- children: "Search"
317
- })]
318
- })]
319
- }), /*#__PURE__*/_jsxs(View, {
320
- style: styles.statsGrid,
321
- children: [/*#__PURE__*/_jsx(StatItem, {
322
- value: stats.total,
323
- label: "Screens"
324
- }), /*#__PURE__*/_jsx(StatItem, {
325
- value: stats.mounted,
326
- label: "Mounted"
327
- }), /*#__PURE__*/_jsx(StatItem, {
328
- value: stats.available,
329
- label: "Available"
330
- }), /*#__PURE__*/_jsx(StatItem, {
331
- value: stats.navigators,
332
- label: "Navigators"
333
- })]
334
- })]
335
- }) : /*#__PURE__*/_jsxs(View, {
277
+ children: [isSearching && /*#__PURE__*/_jsxs(View, {
336
278
  style: styles.searchContainer,
337
279
  children: [/*#__PURE__*/_jsx(Search, {
338
280
  size: 16,
339
- color: buoyColors.textMuted
281
+ color: night.color.textTertiary
340
282
  }), /*#__PURE__*/_jsx(TextInput, {
341
283
  style: styles.searchInput,
342
284
  placeholder: "Search screens...",
343
- placeholderTextColor: buoyColors.textMuted,
285
+ placeholderTextColor: night.color.placeholder,
344
286
  value: searchQuery,
345
287
  onChangeText: setSearchQuery,
346
288
  autoCapitalize: "none",
@@ -367,7 +309,64 @@ export function ReactNavigationRoutes({
367
309
  }), /*#__PURE__*/_jsxs(ScrollView, {
368
310
  style: styles.scrollView,
369
311
  contentContainerStyle: styles.scrollContent,
370
- children: [filteredGroups.length === 0 ? /*#__PURE__*/_jsx(View, {
312
+ children: [!isSearching && /*#__PURE__*/_jsxs(View, {
313
+ style: styles.header,
314
+ children: [/*#__PURE__*/_jsxs(View, {
315
+ style: styles.actionsRow,
316
+ children: [/*#__PURE__*/_jsxs(View, {
317
+ style: styles.actionWrapper,
318
+ children: [/*#__PURE__*/_jsx(ToolbarCopyButton, {
319
+ value: copyAllData,
320
+ buttonStyle: styles.actionButtonHeader
321
+ }), /*#__PURE__*/_jsx(Text, {
322
+ style: styles.actionLabel,
323
+ children: "Copy"
324
+ })]
325
+ }), /*#__PURE__*/_jsxs(View, {
326
+ style: styles.actionWrapper,
327
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
328
+ style: [styles.iconButton, isRefreshing && styles.refreshButtonDisabled],
329
+ onPress: handleRefresh,
330
+ disabled: isRefreshing,
331
+ children: /*#__PURE__*/_jsx(RefreshCw, {
332
+ size: 16,
333
+ color: isRefreshing ? night.color.textTertiary : night.color.textSecondary
334
+ })
335
+ }), /*#__PURE__*/_jsx(Text, {
336
+ style: styles.actionLabel,
337
+ children: "Refresh"
338
+ })]
339
+ }), /*#__PURE__*/_jsxs(View, {
340
+ style: styles.actionWrapper,
341
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
342
+ style: styles.iconButton,
343
+ onPress: () => setIsSearching(true),
344
+ children: /*#__PURE__*/_jsx(Search, {
345
+ size: 16,
346
+ color: night.color.textSecondary
347
+ })
348
+ }), /*#__PURE__*/_jsx(Text, {
349
+ style: styles.actionLabel,
350
+ children: "Search"
351
+ })]
352
+ })]
353
+ }), /*#__PURE__*/_jsxs(View, {
354
+ style: styles.statsGrid,
355
+ children: [/*#__PURE__*/_jsx(StatItem, {
356
+ value: stats.total,
357
+ label: "Screens"
358
+ }), /*#__PURE__*/_jsx(StatItem, {
359
+ value: stats.mounted,
360
+ label: "Mounted"
361
+ }), /*#__PURE__*/_jsx(StatItem, {
362
+ value: stats.available,
363
+ label: "Available"
364
+ }), /*#__PURE__*/_jsx(StatItem, {
365
+ value: stats.navigators,
366
+ label: "Navigators"
367
+ })]
368
+ })]
369
+ }), filteredGroups.length === 0 ? /*#__PURE__*/_jsx(View, {
371
370
  style: styles.emptyState,
372
371
  children: /*#__PURE__*/_jsx(Text, {
373
372
  style: styles.emptyText,
@@ -438,10 +437,10 @@ function NavigatorGroupView({
438
437
  style: styles.groupHeaderLeft,
439
438
  children: [isExpanded ? /*#__PURE__*/_jsx(ChevronDown, {
440
439
  size: 14,
441
- color: buoyColors.textSecondary
440
+ color: night.color.textSecondary
442
441
  }) : /*#__PURE__*/_jsx(ChevronRight, {
443
442
  size: 14,
444
- color: buoyColors.textSecondary
443
+ color: night.color.textSecondary
445
444
  }), /*#__PURE__*/_jsx(Text, {
446
445
  style: styles.groupTitle,
447
446
  numberOfLines: 1,
@@ -477,7 +476,7 @@ function ScreenItemView({
477
476
  onToggleExpand,
478
477
  onNavigate
479
478
  }) {
480
- const statusColor = screen.isFocused ? buoyColors.success : screen.isMounted ? "#3B82F6" : buoyColors.textMuted;
479
+ const statusColor = screen.isFocused ? buoyColors.success : screen.isMounted ? "#3B82F6" : night.color.textTertiary;
481
480
  const statusLabel = screen.isFocused ? "FOCUSED" : screen.isMounted ? "MOUNTED" : "AVAILABLE";
482
481
  return /*#__PURE__*/_jsx(View, {
483
482
  style: styles.screenItem,
@@ -491,10 +490,10 @@ function ScreenItemView({
491
490
  style: styles.expandIndicator,
492
491
  children: isExpanded ? /*#__PURE__*/_jsx(ChevronDown, {
493
492
  size: 14,
494
- color: buoyColors.textSecondary
493
+ color: night.color.textSecondary
495
494
  }) : /*#__PURE__*/_jsx(ChevronRight, {
496
495
  size: 14,
497
- color: buoyColors.textSecondary
496
+ color: night.color.textSecondary
498
497
  })
499
498
  }), /*#__PURE__*/_jsx(Text, {
500
499
  style: styles.screenName,
@@ -537,19 +536,20 @@ function ScreenItemView({
537
536
  const styles = StyleSheet.create({
538
537
  container: {
539
538
  flex: 1,
540
- backgroundColor: buoyColors.base
539
+ // Transparent so JsModal's ToolBackground shows through (the modal paints opaque base beneath it).
540
+ backgroundColor: "transparent"
541
541
  },
542
542
  emptyState: {
543
543
  padding: 32,
544
544
  alignItems: "center"
545
545
  },
546
546
  emptyText: {
547
- color: buoyColors.textSecondary,
547
+ color: night.color.textSecondary,
548
548
  fontSize: 14,
549
549
  fontFamily: "monospace"
550
550
  },
551
551
  emptySubtext: {
552
- color: buoyColors.textMuted,
552
+ color: night.color.textTertiary,
553
553
  fontSize: 12,
554
554
  fontFamily: "monospace",
555
555
  marginTop: 8
@@ -558,8 +558,9 @@ const styles = StyleSheet.create({
558
558
  flexDirection: "column",
559
559
  padding: 8,
560
560
  borderBottomWidth: 1,
561
- borderBottomColor: buoyColors.border,
562
- gap: 12
561
+ borderBottomColor: night.color.border,
562
+ gap: 12,
563
+ marginBottom: 8
563
564
  },
564
565
  actionsRow: {
565
566
  flexDirection: "row",
@@ -577,7 +578,7 @@ const styles = StyleSheet.create({
577
578
  actionButtonHeader: {
578
579
  padding: 6,
579
580
  borderRadius: 4,
580
- backgroundColor: buoyColors.input
581
+ backgroundColor: night.color.surfaceElevated
581
582
  },
582
583
  iconButton: {
583
584
  padding: 6,
@@ -587,7 +588,7 @@ const styles = StyleSheet.create({
587
588
  },
588
589
  actionLabel: {
589
590
  fontSize: 8,
590
- color: buoyColors.textMuted,
591
+ color: night.color.textTertiary,
591
592
  fontFamily: "monospace",
592
593
  textTransform: "uppercase",
593
594
  letterSpacing: 0.5
@@ -605,7 +606,7 @@ const styles = StyleSheet.create({
605
606
  flexShrink: 1,
606
607
  flexBasis: "20%",
607
608
  minWidth: 70,
608
- backgroundColor: buoyColors.card,
609
+ backgroundColor: night.color.surface,
609
610
  borderRadius: 8,
610
611
  paddingVertical: 10,
611
612
  paddingHorizontal: 12,
@@ -614,12 +615,12 @@ const styles = StyleSheet.create({
614
615
  statValue: {
615
616
  fontSize: 18,
616
617
  fontWeight: "800",
617
- color: buoyColors.text,
618
+ color: night.color.text,
618
619
  fontFamily: "monospace"
619
620
  },
620
621
  statLabel: {
621
622
  fontSize: 10,
622
- color: buoyColors.textMuted,
623
+ color: night.color.textTertiary,
623
624
  marginTop: 4,
624
625
  fontFamily: "monospace",
625
626
  textTransform: "uppercase",
@@ -631,11 +632,11 @@ const styles = StyleSheet.create({
631
632
  padding: 8,
632
633
  gap: 8,
633
634
  borderBottomWidth: 1,
634
- borderBottomColor: buoyColors.border
635
+ borderBottomColor: night.color.border
635
636
  },
636
637
  searchInput: {
637
638
  flex: 1,
638
- color: buoyColors.text,
639
+ color: night.color.text,
639
640
  fontSize: 14,
640
641
  fontFamily: "monospace"
641
642
  },
@@ -643,7 +644,7 @@ const styles = StyleSheet.create({
643
644
  padding: 4
644
645
  },
645
646
  clearButtonText: {
646
- color: buoyColors.textMuted,
647
+ color: night.color.textTertiary,
647
648
  fontSize: 18
648
649
  },
649
650
  closeSearchButton: {
@@ -651,7 +652,7 @@ const styles = StyleSheet.create({
651
652
  paddingVertical: 4
652
653
  },
653
654
  closeSearchText: {
654
- color: buoyColors.primary,
655
+ color: night.color.accent,
655
656
  fontSize: 14,
656
657
  fontWeight: "600",
657
658
  fontFamily: "monospace"
@@ -660,7 +661,7 @@ const styles = StyleSheet.create({
660
661
  flex: 1
661
662
  },
662
663
  scrollContent: {
663
- paddingVertical: 8
664
+ paddingBottom: 8
664
665
  },
665
666
  metaFooter: {
666
667
  flexDirection: "row",
@@ -671,11 +672,11 @@ const styles = StyleSheet.create({
671
672
  paddingVertical: 16,
672
673
  marginTop: 16,
673
674
  borderTopWidth: 1,
674
- borderTopColor: buoyColors.border
675
+ borderTopColor: night.color.border
675
676
  },
676
677
  metaText: {
677
678
  fontSize: 12,
678
- color: buoyColors.textSecondary,
679
+ color: night.color.textSecondary,
679
680
  fontFamily: "monospace"
680
681
  },
681
682
  sourceBadge: {
@@ -683,12 +684,12 @@ const styles = StyleSheet.create({
683
684
  paddingVertical: 2,
684
685
  borderRadius: 999,
685
686
  borderWidth: 1,
686
- borderColor: buoyColors.border,
687
- backgroundColor: buoyColors.card
687
+ borderColor: night.color.border,
688
+ backgroundColor: night.color.surface
688
689
  },
689
690
  sourceText: {
690
691
  fontSize: 11,
691
- color: buoyColors.textSecondary,
692
+ color: night.color.textSecondary,
692
693
  textTransform: "capitalize",
693
694
  fontFamily: "monospace"
694
695
  },
@@ -701,9 +702,9 @@ const styles = StyleSheet.create({
701
702
  justifyContent: "space-between",
702
703
  padding: 12,
703
704
  paddingHorizontal: 16,
704
- backgroundColor: buoyColors.card,
705
+ backgroundColor: night.color.surface,
705
706
  borderLeftWidth: 3,
706
- borderLeftColor: buoyColors.textSecondary
707
+ borderLeftColor: night.color.fillTertiary
707
708
  },
708
709
  groupHeaderLeft: {
709
710
  flexDirection: "row",
@@ -714,7 +715,7 @@ const styles = StyleSheet.create({
714
715
  groupTitle: {
715
716
  fontSize: 12,
716
717
  fontWeight: "700",
717
- color: buoyColors.text,
718
+ color: night.color.text,
718
719
  fontFamily: "monospace",
719
720
  textTransform: "uppercase",
720
721
  letterSpacing: 0.8
@@ -737,19 +738,20 @@ const styles = StyleSheet.create({
737
738
  fontFamily: "monospace"
738
739
  },
739
740
  screensList: {
740
- backgroundColor: buoyColors.base
741
+ // Transparent so the night sheet's star field shows through.
742
+ backgroundColor: "transparent"
741
743
  },
742
744
  groupDescription: {
743
745
  paddingHorizontal: 16,
744
746
  paddingVertical: 8,
745
747
  marginBottom: 8,
746
- backgroundColor: buoyColors.input,
748
+ backgroundColor: night.color.surfaceElevated,
747
749
  borderLeftWidth: 3,
748
- borderLeftColor: buoyColors.textSecondary
750
+ borderLeftColor: night.color.fillTertiary
749
751
  },
750
752
  groupDescriptionText: {
751
753
  fontSize: 11,
752
- color: buoyColors.textSecondary,
754
+ color: night.color.textSecondary,
753
755
  fontFamily: "monospace",
754
756
  lineHeight: 16
755
757
  },
@@ -762,10 +764,10 @@ const styles = StyleSheet.create({
762
764
  justifyContent: "space-between",
763
765
  paddingVertical: 10,
764
766
  paddingHorizontal: 12,
765
- backgroundColor: buoyColors.card,
767
+ backgroundColor: night.color.surface,
766
768
  borderRadius: 6,
767
769
  borderWidth: 1,
768
- borderColor: buoyColors.border,
770
+ borderColor: night.color.border,
769
771
  shadowColor: "#000",
770
772
  shadowOffset: {
771
773
  width: 0,
@@ -788,7 +790,7 @@ const styles = StyleSheet.create({
788
790
  screenName: {
789
791
  fontSize: 13,
790
792
  fontWeight: "600",
791
- color: buoyColors.text,
793
+ color: night.color.text,
792
794
  fontFamily: "monospace",
793
795
  flex: 1
794
796
  },
@@ -811,19 +813,19 @@ const styles = StyleSheet.create({
811
813
  headerActionButton: {
812
814
  padding: 6,
813
815
  borderRadius: 4,
814
- backgroundColor: buoyColors.input,
816
+ backgroundColor: night.color.surfaceElevated,
815
817
  borderWidth: 1,
816
- borderColor: buoyColors.border,
818
+ borderColor: night.color.border,
817
819
  alignItems: "center",
818
820
  justifyContent: "center"
819
821
  },
820
822
  navigateButton: {
821
- backgroundColor: buoyColors.primary + "15",
822
- borderColor: buoyColors.primary + "40"
823
+ backgroundColor: night.color.accentSoft,
824
+ borderColor: night.color.accentBorder
823
825
  },
824
826
  navigateButtonText: {
825
827
  fontSize: 12,
826
- color: buoyColors.primary,
828
+ color: night.color.accent,
827
829
  fontFamily: "monospace",
828
830
  fontWeight: "600"
829
831
  }
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { View, Text, StyleSheet, TouchableOpacity, ScrollView } from "react-native";
13
- import { Navigation, buoyColors } from "@buoy-gg/shared-ui";
13
+ import { Navigation, night } from "@buoy-gg/shared-ui";
14
14
  import { RouteEventExpandedContent } from "./RouteEventExpandedContent";
15
15
  import { getRouteTemplate } from "../utils/routeTemplate";
16
16
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -39,7 +39,7 @@ export function RouteEventDetail({
39
39
  activeOpacity: 0.8,
40
40
  children: [/*#__PURE__*/_jsx(Navigation, {
41
41
  size: 16,
42
- color: "#FFFFFF"
42
+ color: night.color.onAccent
43
43
  }), /*#__PURE__*/_jsx(Text, {
44
44
  style: styles.goButtonText,
45
45
  children: "Go to route"
@@ -51,7 +51,8 @@ export function RouteEventDetail({
51
51
  const styles = StyleSheet.create({
52
52
  container: {
53
53
  flex: 1,
54
- backgroundColor: buoyColors.base
54
+ // Transparent so the night sheet's star field shows through.
55
+ backgroundColor: "transparent"
55
56
  },
56
57
  scroll: {
57
58
  flex: 1
@@ -62,23 +63,25 @@ const styles = StyleSheet.create({
62
63
  footer: {
63
64
  paddingHorizontal: 16,
64
65
  paddingVertical: 12,
65
- backgroundColor: buoyColors.base,
66
+ // Transparent so the night sheet's star field shows through.
67
+ backgroundColor: "transparent",
66
68
  borderTopWidth: 1,
67
- borderTopColor: buoyColors.border
69
+ borderTopColor: night.color.border
68
70
  },
69
71
  goButton: {
70
72
  flexDirection: "row",
71
73
  alignItems: "center",
72
74
  justifyContent: "center",
73
75
  gap: 8,
74
- backgroundColor: buoyColors.primary,
76
+ backgroundColor: night.color.accent,
75
77
  paddingVertical: 12,
76
78
  borderRadius: 8
77
79
  },
78
80
  goButtonText: {
79
81
  fontSize: 13,
80
82
  fontWeight: "600",
81
- color: "#FFFFFF",
83
+ // Ink on a filled accent surface — the night accent takes dark ink.
84
+ color: night.color.onAccent,
82
85
  fontFamily: "monospace",
83
86
  textTransform: "uppercase",
84
87
  letterSpacing: 0.5