@expo/ui 0.2.0-beta.2 → 0.2.0-beta.4

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 (89) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/ui/ChipView.kt +5 -2
  4. package/android/src/main/java/expo/modules/ui/button/Button.kt +19 -8
  5. package/android/src/main/java/expo/modules/ui/menu/ContextMenu.kt +26 -4
  6. package/android/src/main/java/expo/modules/ui/menu/ContextMenuRecords.kt +2 -0
  7. package/build/jetpack-compose/Button/index.d.ts +14 -2
  8. package/build/jetpack-compose/Button/index.d.ts.map +1 -1
  9. package/build/jetpack-compose/Button/types.d.ts +1 -1
  10. package/build/jetpack-compose/Button/types.d.ts.map +1 -1
  11. package/build/jetpack-compose/ContextMenu/Submenu.d.ts +17 -0
  12. package/build/jetpack-compose/ContextMenu/Submenu.d.ts.map +1 -0
  13. package/build/jetpack-compose/ContextMenu/index.d.ts +3 -15
  14. package/build/jetpack-compose/ContextMenu/index.d.ts.map +1 -1
  15. package/build/jetpack-compose/ContextMenu/utils.d.ts.map +1 -1
  16. package/build/swift-ui/Button/index.d.ts +6 -5
  17. package/build/swift-ui/Button/index.d.ts.map +1 -1
  18. package/build/swift-ui/ContentUnavailableView/index.d.ts +2 -1
  19. package/build/swift-ui/ContentUnavailableView/index.d.ts.map +1 -1
  20. package/build/swift-ui/Image/index.d.ts +2 -1
  21. package/build/swift-ui/Image/index.d.ts.map +1 -1
  22. package/build/swift-ui/Label/index.d.ts +2 -1
  23. package/build/swift-ui/Label/index.d.ts.map +1 -1
  24. package/build/swift-ui/LabeledContent/index.d.ts +16 -0
  25. package/build/swift-ui/LabeledContent/index.d.ts.map +1 -0
  26. package/build/swift-ui/index.d.ts +1 -0
  27. package/build/swift-ui/index.d.ts.map +1 -1
  28. package/build/swift-ui/modifiers/index.d.ts +17 -10
  29. package/build/swift-ui/modifiers/index.d.ts.map +1 -1
  30. package/expo-module.config.json +1 -1
  31. package/ios/Button/Button.swift +7 -2
  32. package/ios/ExpoUIModule.swift +1 -0
  33. package/ios/LabeledContentView.swift +27 -0
  34. package/ios/Modifiers/ViewModifierRegistry.swift +21 -0
  35. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2-sources.jar → 0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4-sources.jar} +0 -0
  36. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4-sources.jar.md5 +1 -0
  37. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4-sources.jar.sha1 +1 -0
  38. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4-sources.jar.sha256 +1 -0
  39. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4-sources.jar.sha512 +1 -0
  40. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.aar +0 -0
  41. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.aar.md5 +1 -0
  42. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.aar.sha1 +1 -0
  43. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.aar.sha256 +1 -0
  44. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.aar.sha512 +1 -0
  45. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.module → 0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.module} +22 -22
  46. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.module.md5 +1 -0
  47. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.module.sha1 +1 -0
  48. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.module.sha256 +1 -0
  49. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.module.sha512 +1 -0
  50. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.pom → 0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.pom} +1 -1
  51. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.pom.md5 +1 -0
  52. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.pom.sha1 +1 -0
  53. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.pom.sha256 +1 -0
  54. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.4/expo.modules.ui-0.2.0-beta.4.pom.sha512 +1 -0
  55. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  56. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  57. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  58. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  59. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  60. package/package.json +5 -3
  61. package/src/jetpack-compose/Button/index.tsx +21 -4
  62. package/src/jetpack-compose/Button/types.ts +3 -0
  63. package/src/jetpack-compose/ContextMenu/Submenu.tsx +21 -0
  64. package/src/jetpack-compose/ContextMenu/index.tsx +3 -19
  65. package/src/jetpack-compose/ContextMenu/utils.ts +3 -2
  66. package/src/swift-ui/Button/index.tsx +6 -5
  67. package/src/swift-ui/ContentUnavailableView/index.tsx +2 -1
  68. package/src/swift-ui/Image/index.tsx +2 -1
  69. package/src/swift-ui/Label/index.tsx +2 -1
  70. package/src/swift-ui/LabeledContent/index.tsx +34 -0
  71. package/src/swift-ui/index.tsx +1 -0
  72. package/src/swift-ui/modifiers/index.ts +36 -10
  73. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2-sources.jar.md5 +0 -1
  74. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2-sources.jar.sha1 +0 -1
  75. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2-sources.jar.sha256 +0 -1
  76. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2-sources.jar.sha512 +0 -1
  77. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.aar +0 -0
  78. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.aar.md5 +0 -1
  79. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.aar.sha1 +0 -1
  80. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.aar.sha256 +0 -1
  81. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.aar.sha512 +0 -1
  82. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.module.md5 +0 -1
  83. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.module.sha1 +0 -1
  84. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.module.sha256 +0 -1
  85. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.module.sha512 +0 -1
  86. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.pom.md5 +0 -1
  87. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.pom.sha1 +0 -1
  88. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.pom.sha256 +0 -1
  89. package/local-maven-repo/expo/modules/ui/expo.modules.ui/0.2.0-beta.2/expo.modules.ui-0.2.0-beta.2.pom.sha512 +0 -1
@@ -39,7 +39,12 @@ struct Button: ExpoSwiftUI.View {
39
39
  .if(props.variant == .borderedProminent, {
40
40
  $0.buttonStyle(.borderedProminent)
41
41
  })
42
- #if !os(tvOS)
42
+
43
+ #if os(tvOS)
44
+ .if(props.variant == .card, {
45
+ $0.buttonStyle(.card)
46
+ })
47
+ #else
43
48
  .if(props.variant == .borderless, {
44
49
  $0.buttonStyle(.borderless)
45
50
  })
@@ -60,7 +65,7 @@ struct Button: ExpoSwiftUI.View {
60
65
  })
61
66
  #endif
62
67
 
63
- if #available(iOS 26.0, *) {
68
+ if #available(iOS 26.0, tvOS 26.0, *) {
64
69
  #if compiler(>=6.2) // Xcode 26
65
70
  switch props.variant {
66
71
  case .glass:
@@ -52,5 +52,6 @@ public final class ExpoUIModule: Module {
52
52
  View(ZStackView.self)
53
53
  View(NamespaceView.self)
54
54
  View(GlassEffectContainerView.self)
55
+ View(LabeledContentView.self)
55
56
  }
56
57
  }
@@ -0,0 +1,27 @@
1
+ // Copyright 2025-present 650 Industries. All rights reserved.
2
+
3
+ import SwiftUI
4
+ import ExpoModulesCore
5
+
6
+ final class LabeledContentProps: ExpoSwiftUI.ViewProps, CommonViewModifierProps {
7
+ @Field var fixedSize: Bool?
8
+ @Field var frame: FrameOptions?
9
+ @Field var padding: PaddingOptions?
10
+ @Field var testID: String?
11
+ @Field var modifiers: ModifierArray?
12
+
13
+ @Field var label: String?
14
+ }
15
+
16
+ internal struct LabeledContentView: ExpoSwiftUI.View {
17
+ @ObservedObject var props: LabeledContentProps
18
+
19
+ var body: some View {
20
+ if #available(iOS 16.0, tvOS 16.0, *) {
21
+ LabeledContent(props.label ?? "") {
22
+ Children()
23
+ }
24
+ .modifier(CommonViewModifiers(props: props))
25
+ }
26
+ }
27
+ }
@@ -488,6 +488,23 @@ internal struct BackgroundOverlayModifier: ViewModifier, Record {
488
488
  }
489
489
  }
490
490
 
491
+ internal struct FixedSizeModifier: ViewModifier, Record {
492
+ @Field var horizontal: Bool?
493
+ @Field var vertical: Bool?
494
+
495
+ func body(content: Content) -> some View {
496
+ if let horizontal, let vertical {
497
+ content.fixedSize(horizontal: horizontal, vertical: vertical)
498
+ } else if let horizontal {
499
+ content.fixedSize(horizontal: horizontal, vertical: false)
500
+ } else if let vertical {
501
+ content.fixedSize(horizontal: false, vertical: vertical)
502
+ } else {
503
+ content.fixedSize()
504
+ }
505
+ }
506
+ }
507
+
491
508
  /**
492
509
  * A type-erased wrapper for `ViewModifier`
493
510
  */
@@ -932,5 +949,9 @@ extension ViewModifierRegistry {
932
949
  register("matchedGeometryEffect") { params, appContext, _ in
933
950
  return try MatchedGeometryEffectModifier.init(from: params, appContext: appContext)
934
951
  }
952
+
953
+ register("fixedSize") { params, appContext, _ in
954
+ return try FixedSizeModifier(from: params, appContext: appContext)
955
+ }
935
956
  }
936
957
  }
@@ -0,0 +1 @@
1
+ 5a7003c3bb4ab5e12e1ab0d8b4636b32adb0e10076efcacb3d888dcfa6a50f7c
@@ -0,0 +1 @@
1
+ 744a477ab9a27f351ecdf6fbd8bd23f228f862a9872ddc6686f7fb9f6d9eabd023efd87529ccb8e840585bd7318107614dcbb480d1c514c25d39a0323821b7ca
@@ -0,0 +1 @@
1
+ d25dd55e7dc6b5f815e768d9fcfd84d43bce8dda10252e3e5a5c22111a1fe5c3
@@ -0,0 +1 @@
1
+ 5cba128046c5727e4b9f4c9d474e113da5c7dae810ac34fa85af8e5f37e6d2267d464d9a60a407235c103b6c16c5be1db5a1229a0639facd36cccb2914c98be1
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.ui",
5
5
  "module": "expo.modules.ui",
6
- "version": "0.2.0-beta.2",
6
+ "version": "0.2.0-beta.4",
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.ui-0.2.0-beta.2.aar",
28
- "url": "expo.modules.ui-0.2.0-beta.2.aar",
29
- "size": 324202,
30
- "sha512": "04d36cf0b0c9f7014ce6d036652d34ef3761bb62ba8170fdbfa780d131a47fecb223b4286916dc2275ce3ac6eb3481c4500550ae9239f8d1dd68c084ea128d1e",
31
- "sha256": "7000d36858d8ab31a4505a0c19f9266e4e7e98b7a2fb17b5de6eff8d2a9556bc",
32
- "sha1": "22688f17e9f523d3382da309e7d7c5360c28cb6b",
33
- "md5": "511552fcc9064c335d40f2724d42ca5e"
27
+ "name": "expo.modules.ui-0.2.0-beta.4.aar",
28
+ "url": "expo.modules.ui-0.2.0-beta.4.aar",
29
+ "size": 328002,
30
+ "sha512": "5cba128046c5727e4b9f4c9d474e113da5c7dae810ac34fa85af8e5f37e6d2267d464d9a60a407235c103b6c16c5be1db5a1229a0639facd36cccb2914c98be1",
31
+ "sha256": "d25dd55e7dc6b5f815e768d9fcfd84d43bce8dda10252e3e5a5c22111a1fe5c3",
32
+ "sha1": "75af4602729dd306ec54593ac1d53711fc4dd1e9",
33
+ "md5": "1410ec08df204198790aa9f18de00279"
34
34
  }
35
35
  ]
36
36
  },
@@ -102,13 +102,13 @@
102
102
  ],
103
103
  "files": [
104
104
  {
105
- "name": "expo.modules.ui-0.2.0-beta.2.aar",
106
- "url": "expo.modules.ui-0.2.0-beta.2.aar",
107
- "size": 324202,
108
- "sha512": "04d36cf0b0c9f7014ce6d036652d34ef3761bb62ba8170fdbfa780d131a47fecb223b4286916dc2275ce3ac6eb3481c4500550ae9239f8d1dd68c084ea128d1e",
109
- "sha256": "7000d36858d8ab31a4505a0c19f9266e4e7e98b7a2fb17b5de6eff8d2a9556bc",
110
- "sha1": "22688f17e9f523d3382da309e7d7c5360c28cb6b",
111
- "md5": "511552fcc9064c335d40f2724d42ca5e"
105
+ "name": "expo.modules.ui-0.2.0-beta.4.aar",
106
+ "url": "expo.modules.ui-0.2.0-beta.4.aar",
107
+ "size": 328002,
108
+ "sha512": "5cba128046c5727e4b9f4c9d474e113da5c7dae810ac34fa85af8e5f37e6d2267d464d9a60a407235c103b6c16c5be1db5a1229a0639facd36cccb2914c98be1",
109
+ "sha256": "d25dd55e7dc6b5f815e768d9fcfd84d43bce8dda10252e3e5a5c22111a1fe5c3",
110
+ "sha1": "75af4602729dd306ec54593ac1d53711fc4dd1e9",
111
+ "md5": "1410ec08df204198790aa9f18de00279"
112
112
  }
113
113
  ]
114
114
  },
@@ -122,13 +122,13 @@
122
122
  },
123
123
  "files": [
124
124
  {
125
- "name": "expo.modules.ui-0.2.0-beta.2-sources.jar",
126
- "url": "expo.modules.ui-0.2.0-beta.2-sources.jar",
127
- "size": 20394,
128
- "sha512": "7e22d3be8ddd94a0c7a34138f5a59434434110c209a1c67c7875b22adacaeae116e0fcd0713ed8c9a85a11626c2bd585aacb09037377946ce5a48f4e3304a9fa",
129
- "sha256": "52f56d8ce78bb4f30f6249844a2c3093b054ef1b2f5ea6ea7d5a12b454f5526b",
130
- "sha1": "24aa4b775d293e67addeb4ca62506468ec2d04f8",
131
- "md5": "85f85abe12b0ab2ecef0554a122d9400"
125
+ "name": "expo.modules.ui-0.2.0-beta.4-sources.jar",
126
+ "url": "expo.modules.ui-0.2.0-beta.4-sources.jar",
127
+ "size": 20539,
128
+ "sha512": "744a477ab9a27f351ecdf6fbd8bd23f228f862a9872ddc6686f7fb9f6d9eabd023efd87529ccb8e840585bd7318107614dcbb480d1c514c25d39a0323821b7ca",
129
+ "sha256": "5a7003c3bb4ab5e12e1ab0d8b4636b32adb0e10076efcacb3d888dcfa6a50f7c",
130
+ "sha1": "507a9e87f447d5e57d9d22bf172c741076a7ffd7",
131
+ "md5": "9598e67cb2835e28696a00926f62371e"
132
132
  }
133
133
  ]
134
134
  }
@@ -0,0 +1 @@
1
+ fb6cb313dd6b181c4578b553b7a9581043a1757c19d74bda7bf77dfcf3120a18
@@ -0,0 +1 @@
1
+ 64ffe85aa50346d490d9e3541b6de47e61db6a1997c461aec40a5e090fdab7bfbd8ec70569abd5a481e9460a4cc567fd15f8a1d49c1050006f92d41104c52f6c
@@ -9,7 +9,7 @@
9
9
  <modelVersion>4.0.0</modelVersion>
10
10
  <groupId>expo.modules.ui</groupId>
11
11
  <artifactId>expo.modules.ui</artifactId>
12
- <version>0.2.0-beta.2</version>
12
+ <version>0.2.0-beta.4</version>
13
13
  <packaging>aar</packaging>
14
14
  <name>expo.modules.ui</name>
15
15
  <url>https://github.com/expo/expo</url>
@@ -0,0 +1 @@
1
+ 3652173bc50eb3e478ebcac84b0314eabf0711502ab39cc28c3c7891c1c0745f
@@ -0,0 +1 @@
1
+ 3c76296de2cc67e581f28747a99e44f2863c23023cf536f7dbf38630ad7586bd858cd2e61d6655bca165edd7954e024bbe451c61b9eb31fcb7ed00210ebb8369
@@ -3,11 +3,11 @@
3
3
  <groupId>expo.modules.ui</groupId>
4
4
  <artifactId>expo.modules.ui</artifactId>
5
5
  <versioning>
6
- <latest>0.2.0-beta.2</latest>
7
- <release>0.2.0-beta.2</release>
6
+ <latest>0.2.0-beta.4</latest>
7
+ <release>0.2.0-beta.4</release>
8
8
  <versions>
9
- <version>0.2.0-beta.2</version>
9
+ <version>0.2.0-beta.4</version>
10
10
  </versions>
11
- <lastUpdated>20250912154226</lastUpdated>
11
+ <lastUpdated>20250922222657</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 6a21e746c6c56a1cef3435ba7596affb
1
+ a2968a71a12761953bb85a72c326adbb
@@ -1 +1 @@
1
- 83341d9931696e20604c02f7f8bc2ff8919b51cc
1
+ d2b0b0b5ab8609c871be8fd6786e523ebe09d94e
@@ -1 +1 @@
1
- 52ff813bf5c181d9617584d12d0b35f6f7812c0c080b06688b0dfc3fe4780ee4
1
+ eabafe3dc7c5dc2a650450a6f7d3d9f47d02d38f0b71560f298c281e836fdb32
@@ -1 +1 @@
1
- 9026fb57dcf2fb748700bc260f54a011e44c1d9dea1cb48898f408c3ee9256c9789cfdfb1005af55b9eb5968ad92f9344e21a3bbc24d5ec01ee2e2fba2aaf997
1
+ 529f435014b6914ba88afb8c4d94fbfb09320544803d331b4b229049f84dfc0edadf055c08769ec9c988e36adb8d14d9f2e0b56b49fc95f648abf16d9963a841
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/ui",
3
- "version": "0.2.0-beta.2",
3
+ "version": "0.2.0-beta.4",
4
4
  "description": "A collection of UI components",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -46,7 +46,9 @@
46
46
  ],
47
47
  "author": "650 Industries, Inc.",
48
48
  "license": "MIT",
49
- "dependencies": {},
49
+ "dependencies": {
50
+ "sf-symbols-typescript": "^2.1.0"
51
+ },
50
52
  "devDependencies": {
51
53
  "@types/react": "~19.1.10",
52
54
  "expo-module-scripts": "^5.0.7"
@@ -56,5 +58,5 @@
56
58
  "react": "*",
57
59
  "react-native": "*"
58
60
  },
59
- "gitHead": "33f49d0f802b101fd61ac0eedcb1ce35b0adde51"
61
+ "gitHead": "6523053d0d997d2a21f580d2752b2f873c122038"
60
62
  }
@@ -26,9 +26,20 @@ export type ButtonProps = {
26
26
  * A callback that is called when the button is pressed.
27
27
  */
28
28
  onPress?: () => void;
29
+ /**
30
+ * A string describing the leading icon to display in the button.
31
+ * Uses Material Icons on Android.
32
+ */
33
+ leadingIcon?: MaterialIcon;
34
+ /**
35
+ * A string describing the trailing icon to display in the button.
36
+ * Uses Material Icons on Android.
37
+ */
38
+ trailingIcon?: MaterialIcon;
29
39
  /**
30
40
  * A string describing the system image to display in the button.
31
41
  * Uses Material Icons on Android.
42
+ * @deprecated Use `leadingIcon` instead.
32
43
  */
33
44
  systemImage?: MaterialIcon;
34
45
  /**
@@ -66,10 +77,11 @@ export type ButtonProps = {
66
77
  */
67
78
  export type NativeButtonProps = Omit<
68
79
  ButtonProps,
69
- 'role' | 'onPress' | 'children' | 'systemImage'
80
+ 'role' | 'onPress' | 'children' | 'leadingIcon' | 'trailingIcon' | 'systemImage'
70
81
  > & {
71
82
  text: string;
72
- systemImage?: string;
83
+ leadingIcon?: string;
84
+ trailingIcon?: string;
73
85
  } & ViewEvent<'onButtonPressed', void>;
74
86
 
75
87
  // We have to work around the `role` and `onPress` props being reserved by React Native.
@@ -82,11 +94,16 @@ const ButtonNativeView: React.ComponentType<NativeButtonProps> = requireNativeVi
82
94
  * @hidden
83
95
  */
84
96
  export function transformButtonProps(props: ButtonProps): NativeButtonProps {
85
- const { children, onPress, systemImage, ...restProps } = props;
97
+ const { children, onPress, leadingIcon, trailingIcon, systemImage, ...restProps } = props;
98
+
99
+ // Handle backward compatibility: systemImage maps to leadingIcon
100
+ const finalLeadingIcon = leadingIcon ?? systemImage;
101
+
86
102
  return {
87
103
  ...restProps,
88
104
  text: children ?? '',
89
- systemImage,
105
+ leadingIcon: finalLeadingIcon,
106
+ trailingIcon,
90
107
  onButtonPressed: onPress,
91
108
  // @ts-expect-error
92
109
  modifiers: props.modifiers?.map((m) => m.__expo_shared_object_id__),
@@ -14,7 +14,9 @@ type Icon =
14
14
  | 'CheckCircle'
15
15
  | 'Clear'
16
16
  | 'Close'
17
+ | 'Contrast'
17
18
  | 'Create'
19
+ | 'DarkMode'
18
20
  | 'DateRange'
19
21
  | 'Delete'
20
22
  | 'Done'
@@ -30,6 +32,7 @@ type Icon =
30
32
  | 'KeyboardArrowLeft'
31
33
  | 'KeyboardArrowRight'
32
34
  | 'KeyboardArrowUp'
35
+ | 'LightMode'
33
36
  | 'List'
34
37
  | 'LocationOn'
35
38
  | 'Lock'
@@ -0,0 +1,21 @@
1
+ import { ReactElement, ReactNode } from 'react';
2
+
3
+ import { ButtonProps } from '../Button';
4
+
5
+ /**
6
+ * Props of the `Submenu` component.
7
+ */
8
+ export type SubmenuProps = {
9
+ /**
10
+ * The button that will be used to expand the submenu. On Android the `text` prop of the `Button` will be used as a section title.
11
+ */
12
+ button: ReactElement<ButtonProps>;
13
+ /**
14
+ * Children of the submenu. Only `Button`, `Switch`, `Picker` and `Submenu` elements should be used.
15
+ */
16
+ children: ReactNode;
17
+ };
18
+
19
+ export function Submenu(props: SubmenuProps) {
20
+ return <></>;
21
+ }
@@ -2,6 +2,7 @@ import { requireNativeView } from 'expo';
2
2
  import { Children, ReactElement, ReactNode, useMemo } from 'react';
3
3
  import { NativeSyntheticEvent, StyleProp, ViewStyle } from 'react-native';
4
4
 
5
+ import { SubmenuProps } from './Submenu';
5
6
  import { MenuElement, transformChildrenToElementArray } from './utils';
6
7
  import { ExpoModifier } from '../../types';
7
8
  import { ButtonProps } from '../Button';
@@ -76,20 +77,6 @@ export type ContextMenuProps = {
76
77
  modifiers?: ExpoModifier[];
77
78
  };
78
79
 
79
- /**
80
- * Props of the `Submenu` component.
81
- */
82
- export type SubmenuProps = {
83
- /**
84
- * The button that will be used to expand the submenu. On Android the `text` prop of the `Button` will be used as a section title.
85
- */
86
- button: ReactElement<ButtonProps>;
87
- /**
88
- * Children of the submenu. Only `Button`, `Switch`, `Picker` and `Submenu` elements should be used.
89
- */
90
- children: ReactNode;
91
- };
92
-
93
80
  /**
94
81
  * @hidden
95
82
  */
@@ -113,11 +100,7 @@ type NativeMenuProps = ContextMenuProps & {
113
100
  ) => void;
114
101
  };
115
102
 
116
- export function Submenu() {
117
- return <></>;
118
- }
119
-
120
- export function Items() {
103
+ export function Items(props: ContextMenuContentProps) {
121
104
  return <></>;
122
105
  }
123
106
  Items.tag = 'Items';
@@ -175,3 +158,4 @@ ContextMenu.Preview = Preview;
175
158
  ContextMenu.Items = Items;
176
159
 
177
160
  export { ContextMenu };
161
+ export { Submenu } from './Submenu';
@@ -1,7 +1,8 @@
1
1
  import { Children, isValidElement, ReactElement, ReactNode } from 'react';
2
2
  import { NativeSyntheticEvent } from 'react-native';
3
3
 
4
- import { ContextMenuElementBase, EventHandlers, Submenu, SubmenuProps } from './index';
4
+ import { Submenu, SubmenuProps } from './Submenu';
5
+ import { ContextMenuElementBase, EventHandlers } from './index';
5
6
  import { Button, ButtonProps, NativeButtonProps, transformButtonProps } from '../Button';
6
7
  import { Picker, PickerProps } from '../Picker';
7
8
  import { Switch, SwitchProps } from '../Switch';
@@ -139,5 +140,5 @@ function createSubmenuElement(
139
140
  }
140
141
 
141
142
  function isSubmenuComponent(child: ReactElement): boolean {
142
- return child.type.toString() === Submenu.toString();
143
+ return child.type === Submenu;
143
144
  }
@@ -1,4 +1,5 @@
1
1
  import { requireNativeView } from 'expo';
2
+ import { type SFSymbol } from 'sf-symbols-typescript';
2
3
 
3
4
  import { type ViewEvent } from '../../types';
4
5
  import { createViewModifierEventListener } from '../modifiers/utils';
@@ -21,9 +22,9 @@ export type ButtonRole = 'default' | 'cancel' | 'destructive';
21
22
  * - `borderless` - A button with no background or border. On Android, equivalent to `TextButton`.
22
23
  * - `borderedProminent` - A bordered button with a prominent appearance.
23
24
  * - `plain` - A button with no border or background and a less prominent text.
25
+ * - `glass` – A liquid glass button effect – (available only from iOS 26, when built with Xcode 26)
26
+ * - `glassProminent` – A liquid glass button effect – (available only from iOS 26, when built with Xcode 26)
24
27
  * macOS-only styles:
25
- * - `glass` – A liquid glass button effect – (available only since iOS 26, for now only when built with beta version of Xcode)
26
- * - `glassProminent` – A liquid glass button effect – (available only since iOS 26, for now only when built with beta 3 version of Xcode)
27
28
  * - `accessoryBar` - A button style for accessory bars.
28
29
  * - `accessoryBarAction` - A button style for accessory bar actions.
29
30
  * - `card` - A button style for cards.
@@ -52,9 +53,9 @@ export type ButtonProps = {
52
53
  /**
53
54
  * A string describing the system image to display in the button.
54
55
  * This is only used if `children` is a string.
55
- * Uses Material Icons on Android and SF Symbols on iOS.
56
+ * Uses SF Symbols.
56
57
  */
57
- systemImage?: string;
58
+ systemImage?: SFSymbol;
58
59
  /**
59
60
  * Indicated the role of the button.
60
61
  * @platform ios
@@ -88,7 +89,7 @@ export type NativeButtonProps = Omit<
88
89
  > & {
89
90
  buttonRole?: ButtonRole;
90
91
  text: string | undefined;
91
- systemImage?: string;
92
+ systemImage?: SFSymbol;
92
93
  } & ViewEvent<'onButtonPressed', void>;
93
94
 
94
95
  // We have to work around the `role` and `onPress` props being reserved by React Native.
@@ -1,4 +1,5 @@
1
1
  import { requireNativeView } from 'expo';
2
+ import { type SFSymbol } from 'sf-symbols-typescript';
2
3
 
3
4
  import { createViewModifierEventListener } from '../modifiers/utils';
4
5
  import { type CommonViewModifierProps } from '../types';
@@ -12,7 +13,7 @@ export interface ContentUnavailableViewProps extends CommonViewModifierProps {
12
13
  /**
13
14
  * SF Symbol indicating why the content is not available.
14
15
  */
15
- systemImage?: string;
16
+ systemImage?: SFSymbol;
16
17
 
17
18
  /**
18
19
  * Description of why the content is not available.
@@ -1,4 +1,5 @@
1
1
  import { requireNativeView } from 'expo';
2
+ import { type SFSymbol } from 'sf-symbols-typescript';
2
3
 
3
4
  import { type ViewEvent } from '../../types';
4
5
  import { createViewModifierEventListener } from '../modifiers/utils';
@@ -9,7 +10,7 @@ export interface ImageProps extends CommonViewModifierProps {
9
10
  * The name of the system image (SF Symbol).
10
11
  * For example: 'photo', 'heart.fill', 'star.circle'
11
12
  */
12
- systemName: string;
13
+ systemName: SFSymbol;
13
14
  /**
14
15
  * The size of the system image.
15
16
  */
@@ -1,4 +1,5 @@
1
1
  import { requireNativeView } from 'expo';
2
+ import { type SFSymbol } from 'sf-symbols-typescript';
2
3
 
3
4
  import { createViewModifierEventListener } from '../modifiers/utils';
4
5
  import { type CommonViewModifierProps } from '../types';
@@ -12,7 +13,7 @@ export type LabelProps = {
12
13
  /**
13
14
  * The name of the SFSymbol to be displayed in the label.
14
15
  */
15
- systemImage?: string;
16
+ systemImage?: SFSymbol;
16
17
 
17
18
  /**
18
19
  * The color of the label icon.
@@ -0,0 +1,34 @@
1
+ import { requireNativeView } from 'expo';
2
+
3
+ import { createViewModifierEventListener } from '../modifiers/utils';
4
+ import { type CommonViewModifierProps } from '../types';
5
+
6
+ export type LabeledContentProps = {
7
+ /**
8
+ * The label to be displayed in the labeled content.
9
+ */
10
+ label?: string;
11
+ children: React.ReactNode;
12
+ } & CommonViewModifierProps;
13
+
14
+ const LabeledContentNativeView: React.ComponentType<LabeledContentProps> = requireNativeView(
15
+ 'ExpoUI',
16
+ 'LabeledContentView'
17
+ );
18
+
19
+ /**
20
+ * LabeledContent component uses the native [LabeledContent](https://developer.apple.com/documentation/swiftui/labeledcontent) component.
21
+ * A container for attaching a label to a value-bearing view.
22
+ * Available from iOS 16.0.
23
+ * @platform ios
24
+ */
25
+ export function LabeledContent(props: LabeledContentProps) {
26
+ const { modifiers, ...restProps } = props;
27
+ return (
28
+ <LabeledContentNativeView
29
+ modifiers={modifiers}
30
+ {...(modifiers ? createViewModifierEventListener(modifiers) : undefined)}
31
+ {...restProps}
32
+ />
33
+ );
34
+ }
@@ -11,6 +11,7 @@ export * from './Gauge';
11
11
  export * from './Host';
12
12
  export * from './Image';
13
13
  export * from './Label';
14
+ export * from './LabeledContent';
14
15
  export * from './Layout';
15
16
  export * from './List';
16
17
  export * from './Picker';