expo-router 7.0.0-canary-20251216-6e1f9a7 → 7.0.0-canary-20251223-b83b31e

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 (129) hide show
  1. package/android/build.gradle +2 -2
  2. package/build/color/index.d.ts +44 -0
  3. package/build/color/index.d.ts.map +1 -1
  4. package/build/color/index.js +69 -5
  5. package/build/color/index.js.map +1 -1
  6. package/build/exports.d.ts +1 -0
  7. package/build/exports.d.ts.map +1 -1
  8. package/build/exports.js +3 -1
  9. package/build/exports.js.map +1 -1
  10. package/build/layouts/StackClient.d.ts +3 -3
  11. package/build/layouts/stack-utils/StackHeaderButton.d.ts +77 -2
  12. package/build/layouts/stack-utils/StackHeaderButton.d.ts.map +1 -1
  13. package/build/layouts/stack-utils/StackHeaderButton.js +3 -0
  14. package/build/layouts/stack-utils/StackHeaderButton.js.map +1 -1
  15. package/build/layouts/stack-utils/StackHeaderComponent.d.ts +84 -1
  16. package/build/layouts/stack-utils/StackHeaderComponent.d.ts.map +1 -1
  17. package/build/layouts/stack-utils/StackHeaderComponent.js +54 -1
  18. package/build/layouts/stack-utils/StackHeaderComponent.js.map +1 -1
  19. package/build/layouts/stack-utils/StackHeaderLeftRight.d.ts +107 -3
  20. package/build/layouts/stack-utils/StackHeaderLeftRight.d.ts.map +1 -1
  21. package/build/layouts/stack-utils/StackHeaderLeftRight.js +108 -13
  22. package/build/layouts/stack-utils/StackHeaderLeftRight.js.map +1 -1
  23. package/build/layouts/stack-utils/StackHeaderMenu.d.ts +83 -7
  24. package/build/layouts/stack-utils/StackHeaderMenu.d.ts.map +1 -1
  25. package/build/layouts/stack-utils/StackHeaderMenu.js +14 -4
  26. package/build/layouts/stack-utils/StackHeaderMenu.js.map +1 -1
  27. package/build/layouts/stack-utils/StackHeaderSpacer.d.ts +7 -1
  28. package/build/layouts/stack-utils/StackHeaderSpacer.d.ts.map +1 -1
  29. package/build/layouts/stack-utils/StackHeaderSpacer.js +5 -2
  30. package/build/layouts/stack-utils/StackHeaderSpacer.js.map +1 -1
  31. package/build/layouts/stack-utils/{StackHeaderItem.d.ts → StackHeaderView.d.ts} +18 -5
  32. package/build/layouts/stack-utils/StackHeaderView.d.ts.map +1 -0
  33. package/build/layouts/stack-utils/{StackHeaderItem.js → StackHeaderView.js} +14 -10
  34. package/build/layouts/stack-utils/StackHeaderView.js.map +1 -0
  35. package/build/layouts/stack-utils/index.d.ts +5 -5
  36. package/build/layouts/stack-utils/index.d.ts.map +1 -1
  37. package/build/layouts/stack-utils/index.js +4 -4
  38. package/build/layouts/stack-utils/index.js.map +1 -1
  39. package/build/layouts/stack-utils/shared.d.ts +4 -42
  40. package/build/layouts/stack-utils/shared.d.ts.map +1 -1
  41. package/build/layouts/stack-utils/shared.js +3 -22
  42. package/build/layouts/stack-utils/shared.js.map +1 -1
  43. package/build/link/ExpoLink.d.ts.map +1 -1
  44. package/build/link/ExpoLink.js +1 -8
  45. package/build/link/ExpoLink.js.map +1 -1
  46. package/build/link/elements.d.ts +36 -13
  47. package/build/link/elements.d.ts.map +1 -1
  48. package/build/link/elements.js +14 -5
  49. package/build/link/elements.js.map +1 -1
  50. package/build/link/preview/native.d.ts +12 -1
  51. package/build/link/preview/native.d.ts.map +1 -1
  52. package/build/link/preview/native.js.map +1 -1
  53. package/build/navigationEvents/index.d.ts +36 -0
  54. package/build/navigationEvents/index.d.ts.map +1 -0
  55. package/build/navigationEvents/index.js +53 -0
  56. package/build/navigationEvents/index.js.map +1 -0
  57. package/build/toolbar/elements.d.ts +325 -16
  58. package/build/toolbar/elements.d.ts.map +1 -1
  59. package/build/toolbar/elements.js +130 -12
  60. package/build/toolbar/elements.js.map +1 -1
  61. package/build/toolbar/index.d.ts +38 -6
  62. package/build/toolbar/index.d.ts.map +1 -1
  63. package/build/toolbar/index.js +36 -1
  64. package/build/toolbar/index.js.map +1 -1
  65. package/build/toolbar/native.ios.d.ts.map +1 -1
  66. package/build/toolbar/native.ios.js.map +1 -1
  67. package/build/toolbar/native.types.d.ts +6 -5
  68. package/build/toolbar/native.types.d.ts.map +1 -1
  69. package/build/toolbar/native.types.js.map +1 -1
  70. package/build/useScreens.d.ts.map +1 -1
  71. package/build/useScreens.js +50 -0
  72. package/build/useScreens.js.map +1 -1
  73. package/build/utils/font.d.ts +9 -0
  74. package/build/utils/font.d.ts.map +1 -0
  75. package/build/utils/font.js +20 -0
  76. package/build/utils/font.js.map +1 -0
  77. package/expo-module.config.json +1 -1
  78. package/ios/LinkPreview/LinkPreviewNativeActionView.swift +105 -24
  79. package/ios/LinkPreview/LinkPreviewNativeModule.swift +35 -8
  80. package/ios/LinkPreview/LinkPreviewNativeNavigation.swift +16 -20
  81. package/ios/LinkPreview/LinkPreviewNativePreviewView.swift +1 -8
  82. package/ios/LinkPreview/LinkPreviewNativeView.swift +48 -50
  83. package/ios/LinkPreview/LinkZoomTransition.swift +8 -10
  84. package/ios/RouterViewWithLogger.swift +5 -0
  85. package/ios/Toolbar/RouterFontUtils.swift +50 -0
  86. package/ios/Toolbar/RouterToolbarHostView.swift +41 -17
  87. package/ios/Toolbar/RouterToolbarItemView.swift +30 -13
  88. package/ios/Toolbar/RouterToolbarModule.swift +28 -0
  89. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.aar +0 -0
  90. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.aar.md5 +1 -0
  91. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.aar.sha1 +1 -0
  92. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.aar.sha256 +1 -0
  93. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.aar.sha512 +1 -0
  94. package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.module → 7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.module} +17 -17
  95. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.module.md5 +1 -0
  96. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.module.sha1 +1 -0
  97. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.module.sha256 +1 -0
  98. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.module.sha512 +1 -0
  99. package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.pom → 7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.pom} +1 -1
  100. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.pom.md5 +1 -0
  101. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.pom.sha1 +1 -0
  102. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.pom.sha256 +1 -0
  103. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e.pom.sha512 +1 -0
  104. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml +4 -4
  105. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.md5 +1 -1
  106. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.sha1 +1 -1
  107. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.sha256 +1 -1
  108. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.sha512 +1 -1
  109. package/package.json +10 -10
  110. package/build/layouts/stack-utils/StackHeaderItem.d.ts.map +0 -1
  111. package/build/layouts/stack-utils/StackHeaderItem.js.map +0 -1
  112. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.aar +0 -0
  113. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.aar.md5 +0 -1
  114. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.aar.sha1 +0 -1
  115. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.aar.sha256 +0 -1
  116. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.aar.sha512 +0 -1
  117. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.module.md5 +0 -1
  118. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.module.sha1 +0 -1
  119. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.module.sha256 +0 -1
  120. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.module.sha512 +0 -1
  121. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.pom.md5 +0 -1
  122. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.pom.sha1 +0 -1
  123. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.pom.sha256 +0 -1
  124. package/local-maven-repo/expo/modules/router/expo.modules.router/7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7.pom.sha512 +0 -1
  125. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7-sources.jar → 7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e-sources.jar} +0 -0
  126. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7-sources.jar.md5 → 7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e-sources.jar.md5} +0 -0
  127. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7-sources.jar.sha1 → 7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e-sources.jar.sha1} +0 -0
  128. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7-sources.jar.sha256 → 7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e-sources.jar.sha256} +0 -0
  129. /package/local-maven-repo/expo/modules/router/expo.modules.router/{7.0.0-canary-20251216-6e1f9a7/expo.modules.router-7.0.0-canary-20251216-6e1f9a7-sources.jar.sha512 → 7.0.0-canary-20251223-b83b31e/expo.modules.router-7.0.0-canary-20251223-b83b31e-sources.jar.sha512} +0 -0
@@ -2,16 +2,12 @@ import ExpoModulesCore
2
2
  import RNScreens
3
3
  import UIKit
4
4
 
5
- class RouterToolbarHostView: ExpoView, LinkPreviewMenuUpdatable {
5
+ class RouterToolbarHostView: RouterViewWithLogger, LinkPreviewMenuUpdatable {
6
6
  // Mutable map of toolbar items
7
7
  var toolbarItemsArray: [String] = []
8
8
  var toolbarItemsMap: [String: RouterToolbarItemView] = [:]
9
9
  var menuItemsMap: [String: LinkPreviewNativeActionView] = [:]
10
10
 
11
- required init(appContext: AppContext? = nil) {
12
- super.init(appContext: appContext)
13
- }
14
-
15
11
  private func addRouterToolbarItemAtIndex(
16
12
  _ item: RouterToolbarItemView,
17
13
  index: Int
@@ -56,6 +52,7 @@ class RouterToolbarHostView: ExpoView, LinkPreviewMenuUpdatable {
56
52
  if let item = toolbarItemsMap[$0] {
57
53
  return item.barButtonItem
58
54
  }
55
+ // TODO: Extract this logic to separate function
59
56
  if let menu = menuItemsMap[$0] {
60
57
  let item = UIBarButtonItem(
61
58
  title: menu.title,
@@ -65,10 +62,35 @@ class RouterToolbarHostView: ExpoView, LinkPreviewMenuUpdatable {
65
62
  )
66
63
  // Otherwise, the menu items will be reversed in the toolbar
67
64
  item.preferredMenuElementOrder = .fixed
65
+ if #available(iOS 26.0, *) {
66
+ if let hidesSharedBackground = menu.hidesSharedBackground {
67
+ item.hidesSharedBackground = hidesSharedBackground
68
+ }
69
+ if let sharesBackground = menu.sharesBackground {
70
+ item.sharesBackground = sharesBackground
71
+ }
72
+ }
73
+ if let titleStyle = menu.titleStyle {
74
+ RouterFontUtils.setTitleStyle(fromConfig: titleStyle, for: item)
75
+ }
76
+ item.isHidden = menu.routerHidden
77
+ item.isEnabled = !menu.disabled
78
+ if let accessibilityLabel = menu.accessibilityLabelForMenu {
79
+ item.accessibilityLabel = accessibilityLabel
80
+ } else {
81
+ item.accessibilityLabel = menu.title
82
+ }
83
+ if let accessibilityHint = menu.accessibilityHintForMenu {
84
+ item.accessibilityHint = accessibilityHint
85
+ }
86
+ item.tintColor = menu.customTintColor
87
+ if let style = menu.barButtonItemStyle {
88
+ item.style = style
89
+ }
68
90
  return item
69
91
  }
70
- print(
71
- "[expo-router] Warning: Could not find toolbar item or menu for identifier \($0)"
92
+ logger?.warn(
93
+ "[expo-router] Warning: Could not find toolbar item or menu for identifier \($0). This is most likely a bug in expo-router."
72
94
  )
73
95
  return nil
74
96
  }, animated: true)
@@ -76,16 +98,15 @@ class RouterToolbarHostView: ExpoView, LinkPreviewMenuUpdatable {
76
98
  false, animated: true)
77
99
  return
78
100
  }
79
- } else {
80
- print(
81
- "[expo-router] Warning: Could not find owning UIViewController for RouterToolbarHostView")
82
101
  }
83
102
  }
84
103
 
85
104
  override func mountChildComponentView(_ childComponentView: UIView, index: Int) {
86
105
  if let toolbarItem = childComponentView as? RouterToolbarItemView {
87
106
  if toolbarItem.identifier.isEmpty {
88
- print("[expo-router] RouterToolbarItemView identifier is empty")
107
+ logger?.warn(
108
+ "[expo-router] RouterToolbarItemView identifier is empty. This is most likely a bug in expo-router."
109
+ )
89
110
  return
90
111
  }
91
112
  addRouterToolbarItemAtIndex(toolbarItem, index: index)
@@ -93,8 +114,8 @@ class RouterToolbarHostView: ExpoView, LinkPreviewMenuUpdatable {
93
114
  menu.parentMenuUpdatable = self
94
115
  addMenuToolbarItemAtIndex(menu, index: index)
95
116
  } else {
96
- print(
97
- "ExpoRouter: Unknown child component view (\(childComponentView)) mounted to RouterToolbarHost"
117
+ logger?.warn(
118
+ "[expo-router] Unknown child component view (\(childComponentView)) mounted to RouterToolbarHost. This is most likely a bug in expo-router."
98
119
  )
99
120
  }
100
121
  updateToolbarItems()
@@ -103,19 +124,22 @@ class RouterToolbarHostView: ExpoView, LinkPreviewMenuUpdatable {
103
124
  override func unmountChildComponentView(_ childComponentView: UIView, index: Int) {
104
125
  if let toolbarItem = childComponentView as? RouterToolbarItemView {
105
126
  if toolbarItem.identifier.isEmpty {
106
- print("[expo-router] RouterToolbarItemView identifier is empty")
127
+ logger?.warn(
128
+ "[expo-router] RouterToolbarItemView identifier is empty. This is most likely a bug in expo-router."
129
+ )
107
130
  return
108
131
  }
109
132
  removeToolbarItemWithId(toolbarItem.identifier)
110
133
  } else if let menu = childComponentView as? LinkPreviewNativeActionView {
111
134
  if menu.identifier.isEmpty {
112
- print("[expo-router] Menu identifier is empty")
135
+ logger?.warn(
136
+ "[expo-router] Menu identifier is empty. This is most likely a bug in expo-router.")
113
137
  return
114
138
  }
115
139
  removeToolbarItemWithId(menu.identifier)
116
140
  } else {
117
- print(
118
- "ExpoRouter: Unknown child component view (\(childComponentView)) unmounted from RouterToolbarHost"
141
+ logger?.warn(
142
+ "[expo-router] Unknown child component view (\(childComponentView)) unmounted from RouterToolbarHost. This is most likely a bug in expo-router."
119
143
  )
120
144
  }
121
145
  updateToolbarItems()
@@ -1,8 +1,7 @@
1
1
  import ExpoModulesCore
2
- import React
3
2
  import UIKit
4
3
 
5
- class RouterToolbarItemView: ExpoView {
4
+ class RouterToolbarItemView: RouterViewWithLogger {
6
5
  var identifier: String = ""
7
6
  @ReactiveProp var type: ItemType?
8
7
  @ReactiveProp var title: String?
@@ -18,6 +17,10 @@ class RouterToolbarItemView: ExpoView {
18
17
  @ReactiveProp var selected: Bool = false
19
18
  @ReactiveProp var possibleTitles: Set<String>?
20
19
  @ReactiveProp var badgeConfiguration: BadgeConfiguration?
20
+ @ReactiveProp var titleStyle: TitleStyle?
21
+ @ReactiveProp var routerAccessibilityLabel: String?
22
+ @ReactiveProp var routerAccessibilityHint: String?
23
+ @ReactiveProp var disabled: Bool = false
21
24
 
22
25
  var host: RouterToolbarHostView?
23
26
 
@@ -50,6 +53,9 @@ class RouterToolbarItemView: ExpoView {
50
53
  if let tintColor = customTintColor {
51
54
  item.tintColor = tintColor
52
55
  }
56
+ if let titleStyle {
57
+ RouterFontUtils.setTitleStyle(fromConfig: titleStyle, for: item)
58
+ }
53
59
  }
54
60
  if #available(iOS 26.0, *) {
55
61
  item.hidesSharedBackground = hidesSharedBackground
@@ -67,6 +73,13 @@ class RouterToolbarItemView: ExpoView {
67
73
  item.isHidden = routerHidden
68
74
  }
69
75
  item.isSelected = selected
76
+ if let routerAccessibilityLabel = routerAccessibilityLabel {
77
+ item.accessibilityLabel = routerAccessibilityLabel
78
+ }
79
+ if let routerAccessibilityHint = routerAccessibilityHint {
80
+ item.accessibilityHint = routerAccessibilityHint
81
+ }
82
+ item.isEnabled = !disabled
70
83
  if #available(iOS 26.0, *) {
71
84
  if let badgeConfig = badgeConfiguration {
72
85
  var badge = UIBarButtonItem.Badge.indicator()
@@ -81,17 +94,14 @@ class RouterToolbarItemView: ExpoView {
81
94
  }
82
95
  if badgeConfig.fontFamily != nil || badgeConfig.fontSize != nil
83
96
  || badgeConfig.fontWeight != nil {
84
- let font = RCTFont.update(
85
- nil,
86
- withFamily: badgeConfig.fontFamily,
87
- size: badgeConfig.fontSize != nil ? NSNumber(value: badgeConfig.fontSize!) : nil,
88
- weight: badgeConfig.fontWeight,
89
- style: nil,
90
- variant: nil,
91
- scaleMultiplier: 1.0)
97
+ let font = RouterFontUtils.convertTitleStyleToFont(
98
+ TitleStyle(
99
+ fontFamily: badgeConfig.fontFamily,
100
+ fontSize: badgeConfig.fontSize,
101
+ fontWeight: badgeConfig.fontWeight
102
+ ))
92
103
  badge.font = font
93
104
  }
94
- // TODO: Find out why this does not work
95
105
  item.badge = badge
96
106
  }
97
107
  }
@@ -105,8 +115,8 @@ class RouterToolbarItemView: ExpoView {
105
115
 
106
116
  override func mountChildComponentView(_ childComponentView: UIView, index: Int) {
107
117
  if customView != nil {
108
- print(
109
- "[expo-router] Warning: RouterToolbarItemView can only have one child view"
118
+ logger?.warn(
119
+ "[expo-router] RouterToolbarItemView can only have one child view. This is most likely a bug in expo-router."
110
120
  )
111
121
  return
112
122
  }
@@ -138,6 +148,13 @@ struct BadgeConfiguration: Equatable {
138
148
  var fontWeight: String?
139
149
  }
140
150
 
151
+ struct TitleStyle: Equatable {
152
+ var fontFamily: String?
153
+ var fontSize: Double?
154
+ var fontWeight: String?
155
+ var color: UIColor?
156
+ }
157
+
141
158
  @propertyWrapper
142
159
  struct ReactiveProp<Value: Equatable> {
143
160
  private var value: Value
@@ -57,6 +57,18 @@ public class RouterToolbarModule: Module {
57
57
  (view: RouterToolbarItemView, config: BadgeConfigurationRecord?) in
58
58
  view.badgeConfiguration = config?.toBadgeConfiguration()
59
59
  }
60
+ Prop("titleStyle") { (view: RouterToolbarItemView, style: TitleStyleRecord?) in
61
+ view.titleStyle = style?.toTitleStyle()
62
+ }
63
+ Prop("accessibilityLabel") { (view: RouterToolbarItemView, accessibilityLabel: String?) in
64
+ view.accessibilityLabel = accessibilityLabel
65
+ }
66
+ Prop("accessibilityHint") { (view: RouterToolbarItemView, accessibilityHint: String?) in
67
+ view.accessibilityHint = accessibilityHint
68
+ }
69
+ Prop("disabled") { (view: RouterToolbarItemView, disabled: Bool?) in
70
+ view.disabled = disabled ?? false
71
+ }
60
72
 
61
73
  Events("onSelected")
62
74
  }
@@ -100,3 +112,19 @@ struct BadgeConfigurationRecord: Record {
100
112
  )
101
113
  }
102
114
  }
115
+
116
+ struct TitleStyleRecord: Record {
117
+ @Field var fontFamily: String?
118
+ @Field var fontSize: Double?
119
+ @Field var fontWeight: String?
120
+ @Field var color: UIColor?
121
+
122
+ func toTitleStyle() -> TitleStyle {
123
+ return TitleStyle(
124
+ fontFamily: fontFamily,
125
+ fontSize: fontSize,
126
+ fontWeight: fontWeight,
127
+ color: color
128
+ )
129
+ }
130
+ }
@@ -0,0 +1 @@
1
+ 0c996832cda246cbf02acf875f7c3add8610a0e5e7c466bbe5fa2f073a6a644933eec90d1bff2a7fac7fd3c0c5bdae8a695373cebdec4f9853ce116658960554
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.router",
5
5
  "module": "expo.modules.router",
6
- "version": "7.0.0-canary-20251216-6e1f9a7",
6
+ "version": "7.0.0-canary-20251223-b83b31e",
7
7
  "attributes": {
8
8
  "org.gradle.status": "release"
9
9
  }
@@ -24,13 +24,13 @@
24
24
  },
25
25
  "files": [
26
26
  {
27
- "name": "expo.modules.router-7.0.0-canary-20251216-6e1f9a7.aar",
28
- "url": "expo.modules.router-7.0.0-canary-20251216-6e1f9a7.aar",
29
- "size": 13671,
30
- "sha512": "f51bd2a6d3fcc9075dbf99d66f77162d530586d0793d68e109a55f6edfbe4ff98bc9c9c5d587d0feec99807b6ae94a729232000e89f840278b21f4d423caa520",
31
- "sha256": "089d182f36875a201ad1b30b44d39812cd5155af987f3d33cd5eef8542103c82",
32
- "sha1": "66c7762b33a455cfeb2d1819cdaf409620f43ba8",
33
- "md5": "e14cd08df62d96cb4ea6521e778ecf1d"
27
+ "name": "expo.modules.router-7.0.0-canary-20251223-b83b31e.aar",
28
+ "url": "expo.modules.router-7.0.0-canary-20251223-b83b31e.aar",
29
+ "size": 13665,
30
+ "sha512": "0c996832cda246cbf02acf875f7c3add8610a0e5e7c466bbe5fa2f073a6a644933eec90d1bff2a7fac7fd3c0c5bdae8a695373cebdec4f9853ce116658960554",
31
+ "sha256": "054876f9b960d2ed5b7762c66b32c7e994f942c05013456f5e41e1fe6c71ee54",
32
+ "sha1": "5fa5e3051c154802f07905f47f18a306d7262425",
33
+ "md5": "8c916bee60640e0b60daed543761abd9"
34
34
  }
35
35
  ]
36
36
  },
@@ -60,13 +60,13 @@
60
60
  ],
61
61
  "files": [
62
62
  {
63
- "name": "expo.modules.router-7.0.0-canary-20251216-6e1f9a7.aar",
64
- "url": "expo.modules.router-7.0.0-canary-20251216-6e1f9a7.aar",
65
- "size": 13671,
66
- "sha512": "f51bd2a6d3fcc9075dbf99d66f77162d530586d0793d68e109a55f6edfbe4ff98bc9c9c5d587d0feec99807b6ae94a729232000e89f840278b21f4d423caa520",
67
- "sha256": "089d182f36875a201ad1b30b44d39812cd5155af987f3d33cd5eef8542103c82",
68
- "sha1": "66c7762b33a455cfeb2d1819cdaf409620f43ba8",
69
- "md5": "e14cd08df62d96cb4ea6521e778ecf1d"
63
+ "name": "expo.modules.router-7.0.0-canary-20251223-b83b31e.aar",
64
+ "url": "expo.modules.router-7.0.0-canary-20251223-b83b31e.aar",
65
+ "size": 13665,
66
+ "sha512": "0c996832cda246cbf02acf875f7c3add8610a0e5e7c466bbe5fa2f073a6a644933eec90d1bff2a7fac7fd3c0c5bdae8a695373cebdec4f9853ce116658960554",
67
+ "sha256": "054876f9b960d2ed5b7762c66b32c7e994f942c05013456f5e41e1fe6c71ee54",
68
+ "sha1": "5fa5e3051c154802f07905f47f18a306d7262425",
69
+ "md5": "8c916bee60640e0b60daed543761abd9"
70
70
  }
71
71
  ]
72
72
  },
@@ -80,8 +80,8 @@
80
80
  },
81
81
  "files": [
82
82
  {
83
- "name": "expo.modules.router-7.0.0-canary-20251216-6e1f9a7-sources.jar",
84
- "url": "expo.modules.router-7.0.0-canary-20251216-6e1f9a7-sources.jar",
83
+ "name": "expo.modules.router-7.0.0-canary-20251223-b83b31e-sources.jar",
84
+ "url": "expo.modules.router-7.0.0-canary-20251223-b83b31e-sources.jar",
85
85
  "size": 2318,
86
86
  "sha512": "9864add8e93e3c0a9a9c930aaed67016b15054c3fafd59a0bd3a5402d7cdc5827be84c22c2c137f3e5acb4e39270d9bfb9ca3fe11234458d4f2e0d4c78747f48",
87
87
  "sha256": "d5dff6259e86de721fc0f07fe740a5e18088e19b76738719b0a6f94caef06224",
@@ -0,0 +1 @@
1
+ 09cb0020c7eeaef845fe7c52a8fefac3225d8afd12d7cc162cef4efd92aebb0c18be600c748cd953d6447b63ef63ab0aed844ac486cc2f8e391298d55b8ab4be
@@ -9,7 +9,7 @@
9
9
  <modelVersion>4.0.0</modelVersion>
10
10
  <groupId>expo.modules.router</groupId>
11
11
  <artifactId>expo.modules.router</artifactId>
12
- <version>7.0.0-canary-20251216-6e1f9a7</version>
12
+ <version>7.0.0-canary-20251223-b83b31e</version>
13
13
  <packaging>aar</packaging>
14
14
  <name>expo.modules.router</name>
15
15
  <url>https://github.com/expo/expo</url>
@@ -0,0 +1 @@
1
+ c321f92895b53d8d5e3e142f8dd69499e4b42b6c281c61eade79775de6a3357e75e96f2936a595a41bbe484e22d921cfc51afab1313b7a29144d10efa5179ba8
@@ -3,11 +3,11 @@
3
3
  <groupId>expo.modules.router</groupId>
4
4
  <artifactId>expo.modules.router</artifactId>
5
5
  <versioning>
6
- <latest>7.0.0-canary-20251216-6e1f9a7</latest>
7
- <release>7.0.0-canary-20251216-6e1f9a7</release>
6
+ <latest>7.0.0-canary-20251223-b83b31e</latest>
7
+ <release>7.0.0-canary-20251223-b83b31e</release>
8
8
  <versions>
9
- <version>7.0.0-canary-20251216-6e1f9a7</version>
9
+ <version>7.0.0-canary-20251223-b83b31e</version>
10
10
  </versions>
11
- <lastUpdated>20251216074519</lastUpdated>
11
+ <lastUpdated>20251223153337</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 2a4f62869e73091472ab8285a3723da5
1
+ 9c8ae8fb77072b90906f286d15f6e53f
@@ -1 +1 @@
1
- 0bf438566c4abf2eb9360ea041d7570ba4607032
1
+ 7a3eefae0cda2474676727908158cf3ba05d25bd
@@ -1 +1 @@
1
- 543f585654035c7f66c63d4a89ec26cf6c0a434d6b743944e9aa19cf5a532d38
1
+ 6fb5bb2f365acc0c8f814d933f3225471ede23ccd394d1688bd28f5b48a75e00
@@ -1 +1 @@
1
- 51d9160727f18e8b69ad1de60f6a27f75bf1510d64f591e1a2201d49597673f6a4fd8d1a4128e57fa1072c03a7f697b9c641d48c7afffe16401412a4a70a1d52
1
+ cd68ca26ba6472608fe2574607710dd2c39b53cb321b346c65428fd6947e1dfb164917ea612cd0e400ecfb66b68a895591d4977f2586ab94049df87b5b0b5dc2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-router",
3
- "version": "7.0.0-canary-20251216-6e1f9a7",
3
+ "version": "7.0.0-canary-20251223-b83b31e",
4
4
  "description": "Expo Router is a file-based router for React Native and web applications.",
5
5
  "author": "650 Industries, Inc.",
6
6
  "license": "MIT",
@@ -83,14 +83,13 @@
83
83
  "expo"
84
84
  ],
85
85
  "peerDependencies": {
86
- "@expo/metro-runtime": "6.2.0-canary-20251216-6e1f9a7",
87
- "@expo/log-box": "0.0.13-canary-20251216-6e1f9a7",
86
+ "@expo/metro-runtime": "6.2.0-canary-20251223-b83b31e",
87
+ "@expo/log-box": "0.0.13-canary-20251223-b83b31e",
88
88
  "@react-navigation/drawer": "^7.7.2",
89
89
  "@testing-library/react-native": ">= 12.0.0",
90
- "expo": "55.0.0-canary-20251216-6e1f9a7",
91
- "expo-constants": "18.1.0-canary-20251216-6e1f9a7",
92
- "expo-linking": "8.0.11-canary-20251216-6e1f9a7",
93
- "expo-symbols": "1.1.0-canary-20251216-6e1f9a7",
90
+ "expo": "55.0.0-canary-20251223-b83b31e",
91
+ "expo-constants": "18.1.0-canary-20251223-b83b31e",
92
+ "expo-linking": "8.0.12-canary-20251223-b83b31e",
94
93
  "react": "*",
95
94
  "react-dom": "*",
96
95
  "react-native": "*",
@@ -135,8 +134,8 @@
135
134
  "react-server-dom-webpack": "~19.0.3"
136
135
  },
137
136
  "dependencies": {
138
- "@expo/metro-runtime": "6.2.0-canary-20251216-6e1f9a7",
139
- "@expo/schema-utils": "0.1.9-canary-20251216-6e1f9a7",
137
+ "@expo/metro-runtime": "6.2.0-canary-20251223-b83b31e",
138
+ "@expo/schema-utils": "0.1.9-canary-20251223-b83b31e",
140
139
  "@radix-ui/react-slot": "1.2.0",
141
140
  "@radix-ui/react-tabs": "^1.1.12",
142
141
  "@react-navigation/bottom-tabs": "^7.7.3",
@@ -145,7 +144,8 @@
145
144
  "client-only": "^0.0.1",
146
145
  "debug": "^4.3.4",
147
146
  "escape-string-regexp": "^4.0.0",
148
- "expo-server": "1.0.6-canary-20251216-6e1f9a7",
147
+ "expo-server": "1.0.6-canary-20251223-b83b31e",
148
+ "expo-symbols": "1.1.0-canary-20251223-b83b31e",
149
149
  "fast-deep-equal": "^3.1.3",
150
150
  "invariant": "^2.2.4",
151
151
  "nanoid": "^3.3.8",
@@ -1 +0,0 @@
1
- {"version":3,"file":"StackHeaderItem.d.ts","sourceRoot":"","sources":["../../../src/layouts/stack-utils/StackHeaderItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAElF,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,QAAQ,CAAC,EAAE,2BAA2B,CAAC,SAAS,CAAC,CAAC;IAClD,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAAc,CAAC;AAE1E,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,oBAAoB,GAC1B,2BAA2B,CAY7B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"StackHeaderItem.js","sourceRoot":"","sources":["../../../src/layouts/stack-utils/StackHeaderItem.tsx"],"names":[],"mappings":";;;AA8CA,8FAcC;AAlDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACI,MAAM,eAAe,GAAmC,GAAG,EAAE,CAAC,IAAI,CAAC;AAA7D,QAAA,eAAe,mBAA8C;AAE1E,SAAgB,yCAAyC,CACvD,KAA2B;IAE3B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CACV,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,QAAQ,IAAI,EAAE,GAAG;KAC3B,CAAC;AACJ,CAAC","sourcesContent":["import type { NativeStackHeaderItemCustom } from '@react-navigation/native-stack';\n\nexport interface StackHeaderItemProps {\n /**\n * Can be any React node.\n */\n children?: NativeStackHeaderItemCustom['element'];\n hideSharedBackground?: boolean;\n}\n\n/**\n * A wrapper to render custom content in the header.\n *\n * Use as `Stack.Header.Item` to render a custom React element into the header\n *\n * @example\n * ```tsx\n * import { Stack } from 'expo-router';\n * import { Text } from 'react-native';\n *\n * function CustomHeaderElement() {\n * return <Text>Custom Element</Text>;\n * }\n *\n * function Screen() {\n * return (\n * <>\n * <ScreenContent />\n * <Stack.Screen>\n * <Stack.Header>\n * <Stack.Header.Left>\n * <Stack.Header.Item>\n * <CustomHeaderElement />\n * </Stack.Header.Item>\n * </Stack.Header.Left>\n * </Stack.Header>\n * </Stack.Screen>\n * </>\n * );\n * }\n * ```\n *\n * @platform ios\n */\nexport const StackHeaderItem: React.FC<StackHeaderItemProps> = () => null;\n\nexport function convertStackHeaderItemPropsToRNHeaderItem(\n props: StackHeaderItemProps\n): NativeStackHeaderItemCustom {\n const { children, ...rest } = props;\n if (!children) {\n console.warn(\n 'Stack.Header.Item requires a child element to render custom content in the header.'\n );\n }\n return {\n ...rest,\n type: 'custom',\n element: children ?? <></>,\n };\n}\n"]}
@@ -1 +0,0 @@
1
- f51bd2a6d3fcc9075dbf99d66f77162d530586d0793d68e109a55f6edfbe4ff98bc9c9c5d587d0feec99807b6ae94a729232000e89f840278b21f4d423caa520
@@ -1 +0,0 @@
1
- d9665917800ec6a62bc4b9adaffb0aac3cf6534c3499fff8ff8d4d3fa5bdd199832a4ca51feebd86d2f1d1f3a86e13cd260ae8fa9c29ae33ad22f5013e8c71e7
@@ -1 +0,0 @@
1
- ebe337d50192acd4ef69978915e08d3b51ad7e4078a52bb498de32bfae043866bbbc4cacff17af781deaec0b65e7e6a0a1496aab395dd4cba3634ca931efcca3