@vxrn/native 1.12.8-1774390675831
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.
- package/.turbo/turbo-build.log +2 -0
- package/android/build.gradle +32 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/dev/vxrn/native/VxrnNativeModule.kt +117 -0
- package/android/src/main/java/dev/vxrn/native/VxrnNativePackage.kt +16 -0
- package/dist/cjs/color/android.dynamic.types.cjs +16 -0
- package/dist/cjs/color/android.dynamic.types.native.js +19 -0
- package/dist/cjs/color/android.dynamic.types.native.js.map +1 -0
- package/dist/cjs/color/android.material.types.cjs +16 -0
- package/dist/cjs/color/android.material.types.native.js +19 -0
- package/dist/cjs/color/android.material.types.native.js.map +1 -0
- package/dist/cjs/color/index.cjs +66 -0
- package/dist/cjs/color/index.native.js +69 -0
- package/dist/cjs/color/index.native.js.map +1 -0
- package/dist/cjs/color/ios.types.cjs +16 -0
- package/dist/cjs/color/ios.types.native.js +19 -0
- package/dist/cjs/color/ios.types.native.js.map +1 -0
- package/dist/cjs/color/materialColor.cjs +32 -0
- package/dist/cjs/color/materialColor.native.js +43 -0
- package/dist/cjs/color/materialColor.native.js.map +1 -0
- package/dist/cjs/index.cjs +37 -0
- package/dist/cjs/index.native.js +40 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/menu/index.cjs +28 -0
- package/dist/cjs/menu/index.native.js +47 -0
- package/dist/cjs/menu/index.native.js.map +1 -0
- package/dist/cjs/menu/types.cjs +16 -0
- package/dist/cjs/menu/types.native.js +19 -0
- package/dist/cjs/menu/types.native.js.map +1 -0
- package/dist/cjs/split-view/index.cjs +26 -0
- package/dist/cjs/split-view/index.native.js +29 -0
- package/dist/cjs/split-view/index.native.js.map +1 -0
- package/dist/cjs/split-view/split-view.cjs +80 -0
- package/dist/cjs/split-view/split-view.native.js +88 -0
- package/dist/cjs/split-view/split-view.native.js.map +1 -0
- package/dist/cjs/toolbar/index.cjs +32 -0
- package/dist/cjs/toolbar/index.native.js +60 -0
- package/dist/cjs/toolbar/index.native.js.map +1 -0
- package/dist/cjs/toolbar/types.cjs +16 -0
- package/dist/cjs/toolbar/types.native.js +19 -0
- package/dist/cjs/toolbar/types.native.js.map +1 -0
- package/dist/cjs/zoom/index.cjs +36 -0
- package/dist/cjs/zoom/index.native.js +65 -0
- package/dist/cjs/zoom/index.native.js.map +1 -0
- package/dist/cjs/zoom/types.cjs +16 -0
- package/dist/cjs/zoom/types.native.js +19 -0
- package/dist/cjs/zoom/types.native.js.map +1 -0
- package/dist/esm/color/android.dynamic.types.mjs +2 -0
- package/dist/esm/color/android.dynamic.types.mjs.map +1 -0
- package/dist/esm/color/android.dynamic.types.native.js +2 -0
- package/dist/esm/color/android.dynamic.types.native.js.map +1 -0
- package/dist/esm/color/android.material.types.mjs +2 -0
- package/dist/esm/color/android.material.types.mjs.map +1 -0
- package/dist/esm/color/android.material.types.native.js +2 -0
- package/dist/esm/color/android.material.types.native.js.map +1 -0
- package/dist/esm/color/index.mjs +42 -0
- package/dist/esm/color/index.mjs.map +1 -0
- package/dist/esm/color/index.native.js +42 -0
- package/dist/esm/color/index.native.js.map +1 -0
- package/dist/esm/color/ios.types.mjs +2 -0
- package/dist/esm/color/ios.types.mjs.map +1 -0
- package/dist/esm/color/ios.types.native.js +2 -0
- package/dist/esm/color/ios.types.native.js.map +1 -0
- package/dist/esm/color/materialColor.mjs +8 -0
- package/dist/esm/color/materialColor.mjs.map +1 -0
- package/dist/esm/color/materialColor.native.js +16 -0
- package/dist/esm/color/materialColor.native.js.map +1 -0
- package/dist/esm/index.mjs +7 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +7 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/menu/index.mjs +5 -0
- package/dist/esm/menu/index.mjs.map +1 -0
- package/dist/esm/menu/index.native.js +21 -0
- package/dist/esm/menu/index.native.js.map +1 -0
- package/dist/esm/menu/types.mjs +2 -0
- package/dist/esm/menu/types.mjs.map +1 -0
- package/dist/esm/menu/types.native.js +2 -0
- package/dist/esm/menu/types.native.js.map +1 -0
- package/dist/esm/split-view/index.mjs +3 -0
- package/dist/esm/split-view/index.mjs.map +1 -0
- package/dist/esm/split-view/index.native.js +3 -0
- package/dist/esm/split-view/index.native.js.map +1 -0
- package/dist/esm/split-view/split-view.mjs +46 -0
- package/dist/esm/split-view/split-view.mjs.map +1 -0
- package/dist/esm/split-view/split-view.native.js +51 -0
- package/dist/esm/split-view/split-view.native.js.map +1 -0
- package/dist/esm/toolbar/index.mjs +8 -0
- package/dist/esm/toolbar/index.mjs.map +1 -0
- package/dist/esm/toolbar/index.native.js +33 -0
- package/dist/esm/toolbar/index.native.js.map +1 -0
- package/dist/esm/toolbar/types.mjs +2 -0
- package/dist/esm/toolbar/types.mjs.map +1 -0
- package/dist/esm/toolbar/types.native.js +2 -0
- package/dist/esm/toolbar/types.native.js.map +1 -0
- package/dist/esm/zoom/index.mjs +11 -0
- package/dist/esm/zoom/index.mjs.map +1 -0
- package/dist/esm/zoom/index.native.js +37 -0
- package/dist/esm/zoom/index.native.js.map +1 -0
- package/dist/esm/zoom/types.mjs +2 -0
- package/dist/esm/zoom/types.mjs.map +1 -0
- package/dist/esm/zoom/types.native.js +2 -0
- package/dist/esm/zoom/types.native.js.map +1 -0
- package/ios/Menu/MenuActionView.swift +339 -0
- package/ios/Menu/VxrnMenuActionManager.m +47 -0
- package/ios/Toolbar/FontUtils.swift +46 -0
- package/ios/Toolbar/ToolbarHostView.swift +138 -0
- package/ios/Toolbar/ToolbarItemView.swift +334 -0
- package/ios/Toolbar/VxrnToolbarHostManager.m +20 -0
- package/ios/Toolbar/VxrnToolbarItemManager.m +41 -0
- package/ios/VxrnNative-Bridging-Header.h +7 -0
- package/ios/VxrnNative.podspec +31 -0
- package/ios/ZoomTransition/VxrnZoomAlignmentManager.m +22 -0
- package/ios/ZoomTransition/VxrnZoomEnablerManager.m +23 -0
- package/ios/ZoomTransition/VxrnZoomSourceManager.m +24 -0
- package/ios/ZoomTransition/ZoomTransition.swift +384 -0
- package/package.json +82 -0
- package/react-native.config.js +14 -0
- package/src/color/android.dynamic.types.ts +384 -0
- package/src/color/android.material.types.ts +291 -0
- package/src/color/index.native.ts +75 -0
- package/src/color/index.ts +75 -0
- package/src/color/ios.types.ts +156 -0
- package/src/color/materialColor.native.ts +15 -0
- package/src/color/materialColor.ts +7 -0
- package/src/index.ts +20 -0
- package/src/menu/index.native.tsx +28 -0
- package/src/menu/index.ts +7 -0
- package/src/menu/types.ts +32 -0
- package/src/split-view/index.ts +2 -0
- package/src/split-view/split-view.tsx +80 -0
- package/src/toolbar/index.native.tsx +39 -0
- package/src/toolbar/index.ts +11 -0
- package/src/toolbar/types.ts +39 -0
- package/src/zoom/index.native.tsx +56 -0
- package/src/zoom/index.ts +28 -0
- package/src/zoom/types.ts +30 -0
- package/tsconfig.json +7 -0
- package/types/color/android.dynamic.types.d.ts +384 -0
- package/types/color/android.dynamic.types.d.ts.map +1 -0
- package/types/color/android.material.types.d.ts +291 -0
- package/types/color/android.material.types.d.ts.map +1 -0
- package/types/color/index.d.ts +25 -0
- package/types/color/index.d.ts.map +1 -0
- package/types/color/index.native.d.ts +25 -0
- package/types/color/index.native.d.ts.map +1 -0
- package/types/color/ios.types.d.ts +156 -0
- package/types/color/ios.types.d.ts.map +1 -0
- package/types/color/materialColor.d.ts +3 -0
- package/types/color/materialColor.d.ts.map +1 -0
- package/types/color/materialColor.native.d.ts +3 -0
- package/types/color/materialColor.native.d.ts.map +1 -0
- package/types/index.d.ts +10 -0
- package/types/index.d.ts.map +1 -0
- package/types/menu/index.d.ts +4 -0
- package/types/menu/index.d.ts.map +1 -0
- package/types/menu/index.native.d.ts +4 -0
- package/types/menu/index.native.d.ts.map +1 -0
- package/types/menu/types.d.ts +32 -0
- package/types/menu/types.d.ts.map +1 -0
- package/types/split-view/index.d.ts +3 -0
- package/types/split-view/index.d.ts.map +1 -0
- package/types/split-view/split-view.d.ts +19 -0
- package/types/split-view/split-view.d.ts.map +1 -0
- package/types/toolbar/index.d.ts +5 -0
- package/types/toolbar/index.d.ts.map +1 -0
- package/types/toolbar/index.native.d.ts +5 -0
- package/types/toolbar/index.native.d.ts.map +1 -0
- package/types/toolbar/types.d.ts +37 -0
- package/types/toolbar/types.d.ts.map +1 -0
- package/types/zoom/index.d.ts +6 -0
- package/types/zoom/index.d.ts.map +1 -0
- package/types/zoom/index.native.d.ts +6 -0
- package/types/zoom/index.native.d.ts.map +1 -0
- package/types/zoom/types.d.ts +26 -0
- package/types/zoom/types.d.ts.map +1 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// adapted from expo-router (MIT license) - https://github.com/expo/expo
|
|
2
|
+
import React
|
|
3
|
+
|
|
4
|
+
import UIKit
|
|
5
|
+
|
|
6
|
+
@objc(ToolbarItemView) public
|
|
7
|
+
class ToolbarItemView: RCTView {
|
|
8
|
+
// MARK: - internal state
|
|
9
|
+
var itemIdentifier: String = ""
|
|
10
|
+
var host: ToolbarHostView?
|
|
11
|
+
private var currentBarButtonItem: UIBarButtonItem?
|
|
12
|
+
@objc var onSelected: RCTDirectEventBlock?
|
|
13
|
+
|
|
14
|
+
// MARK: - props set from RN via @objc
|
|
15
|
+
|
|
16
|
+
@objc var identifier: NSString = "" {
|
|
17
|
+
didSet { itemIdentifier = identifier as String }
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
private var _type: ItemType?
|
|
21
|
+
@objc var type: NSString? {
|
|
22
|
+
didSet {
|
|
23
|
+
if let t = type as String? { _type = ItemType(rawValue: t) } else { _type = nil }
|
|
24
|
+
performRebuild()
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@objc var title: NSString? {
|
|
29
|
+
didSet { performUpdate() }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@objc var systemImageName: NSString? {
|
|
33
|
+
didSet { performUpdate() }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@objc var xcassetName: NSString? {
|
|
37
|
+
didSet { performUpdate() }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@objc var imageSource: NSDictionary? {
|
|
41
|
+
didSet { resolveImage() }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private var resolvedImage: UIImage?
|
|
45
|
+
|
|
46
|
+
private func resolveImage() {
|
|
47
|
+
guard let source = imageSource, let uriObj = source["uri"] else {
|
|
48
|
+
resolvedImage = nil
|
|
49
|
+
performUpdate()
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
guard let uri = uriObj as? String, !uri.isEmpty, let url = URL(string: uri) else {
|
|
53
|
+
resolvedImage = nil
|
|
54
|
+
performUpdate()
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
URLSession.shared.dataTask(with: url) { [weak self] data, _, _ in
|
|
58
|
+
guard let data = data, let image = UIImage(data: data) else { return }
|
|
59
|
+
DispatchQueue.main.async {
|
|
60
|
+
self?.resolvedImage = image
|
|
61
|
+
self?.performUpdate()
|
|
62
|
+
}
|
|
63
|
+
}.resume()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@objc var tintColor_: UIColor? {
|
|
67
|
+
didSet { performUpdate() }
|
|
68
|
+
}
|
|
69
|
+
// we use customTintColor internally to avoid conflict with UIView.tintColor
|
|
70
|
+
var customTintColor: UIColor? { return tintColor_ }
|
|
71
|
+
|
|
72
|
+
private var _imageRenderingMode: ImageRenderingMode?
|
|
73
|
+
@objc var imageRenderingMode: NSString? {
|
|
74
|
+
didSet {
|
|
75
|
+
if let m = imageRenderingMode as String? { _imageRenderingMode = ImageRenderingMode(rawValue: m) } else { _imageRenderingMode = nil }
|
|
76
|
+
performUpdate()
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@objc var hidesSharedBackground: Bool = false {
|
|
81
|
+
didSet { performUpdate() }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@objc var sharesBackground: Bool = true {
|
|
85
|
+
didSet { performUpdate() }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private var _barButtonItemStyle: UIBarButtonItem.Style?
|
|
89
|
+
@objc var barButtonItemStyle: NSString? {
|
|
90
|
+
didSet {
|
|
91
|
+
if let s = barButtonItemStyle as String? {
|
|
92
|
+
_barButtonItemStyle = BarItemStyle(rawValue: s)?.toUIBarButtonItemStyle()
|
|
93
|
+
} else {
|
|
94
|
+
_barButtonItemStyle = nil
|
|
95
|
+
}
|
|
96
|
+
performUpdate()
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@objc var width: NSNumber? {
|
|
101
|
+
didSet { performUpdate() }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@objc var routerHidden: Bool = false {
|
|
105
|
+
didSet { performUpdate() }
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@objc var selected: Bool = false {
|
|
109
|
+
didSet { performUpdate() }
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@objc var badgeConfiguration: NSDictionary? {
|
|
113
|
+
didSet {
|
|
114
|
+
_badgeConfig = parseBadgeConfiguration(badgeConfiguration)
|
|
115
|
+
performUpdate()
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
private var _badgeConfig: BadgeConfiguration?
|
|
119
|
+
|
|
120
|
+
@objc var titleStyle: NSDictionary? {
|
|
121
|
+
didSet {
|
|
122
|
+
_titleStyle = parseTitleStyle(titleStyle)
|
|
123
|
+
performUpdate()
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
private var _titleStyle: TitleStyle?
|
|
127
|
+
|
|
128
|
+
// use unique names to avoid conflict with UIView's built-in accessibility properties
|
|
129
|
+
@objc var routerAccessibilityLabel: NSString? {
|
|
130
|
+
didSet { performUpdate() }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@objc var routerAccessibilityHint: NSString? {
|
|
134
|
+
didSet { performUpdate() }
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@objc var disabled: Bool = false {
|
|
138
|
+
didSet { performUpdate() }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// MARK: - custom view child
|
|
142
|
+
|
|
143
|
+
private var customView: UIView? {
|
|
144
|
+
didSet { performRebuild() }
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// MARK: - update / rebuild
|
|
148
|
+
|
|
149
|
+
func performRebuild() {
|
|
150
|
+
guard self.host != nil else { return }
|
|
151
|
+
rebuildBarButtonItem()
|
|
152
|
+
self.host?.updateToolbarItems()
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
func performUpdate() {
|
|
156
|
+
guard self.host != nil else { return }
|
|
157
|
+
updateBarButtonItem()
|
|
158
|
+
self.host?.updateToolbarItems()
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
@objc func handleAction() {
|
|
162
|
+
onSelected?([:])
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
var barButtonItem: UIBarButtonItem {
|
|
166
|
+
if let item = currentBarButtonItem { return item }
|
|
167
|
+
rebuildBarButtonItem()
|
|
168
|
+
return currentBarButtonItem ?? UIBarButtonItem()
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private func updateBarButtonItem() {
|
|
172
|
+
guard let item = currentBarButtonItem else { rebuildBarButtonItem(); return }
|
|
173
|
+
applyContentProperties(to: item)
|
|
174
|
+
applyCommonProperties(to: item)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private func rebuildBarButtonItem() {
|
|
178
|
+
var item = UIBarButtonItem()
|
|
179
|
+
if let customView { item = UIBarButtonItem(customView: customView) }
|
|
180
|
+
else if _type == .fluidSpacer { item = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) }
|
|
181
|
+
else if _type == .fixedSpacer { item = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) }
|
|
182
|
+
else if _type == .searchBar {
|
|
183
|
+
guard #available(iOS 26.0, *), let controller = self.host?.findViewController() else {
|
|
184
|
+
currentBarButtonItem = nil; return
|
|
185
|
+
}
|
|
186
|
+
guard let navController = controller.navigationController, navController.isNavigationBarHidden == false else {
|
|
187
|
+
currentBarButtonItem = nil; return
|
|
188
|
+
}
|
|
189
|
+
item = controller.navigationItem.searchBarPlacementBarButtonItem
|
|
190
|
+
} else {
|
|
191
|
+
applyContentProperties(to: item)
|
|
192
|
+
}
|
|
193
|
+
item.target = self
|
|
194
|
+
item.action = #selector(handleAction)
|
|
195
|
+
applyCommonProperties(to: item)
|
|
196
|
+
currentBarButtonItem = item
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private func applyContentProperties(to item: UIBarButtonItem) {
|
|
200
|
+
if _type == .normal || _type == nil {
|
|
201
|
+
item.title = (title as String?) ?? ""
|
|
202
|
+
if let resolvedImage = resolvedImage {
|
|
203
|
+
let renderingMode: UIImage.RenderingMode = _imageRenderingMode == .template ? .alwaysTemplate : .alwaysOriginal
|
|
204
|
+
item.image = resolvedImage.withRenderingMode(renderingMode)
|
|
205
|
+
} else if let xcassetName = xcassetName as String? {
|
|
206
|
+
let renderingMode: UIImage.RenderingMode = _imageRenderingMode == .template ? .alwaysTemplate : .alwaysOriginal
|
|
207
|
+
item.image = UIImage(named: xcassetName)?.withRenderingMode(renderingMode)
|
|
208
|
+
} else if let systemImageName = systemImageName as String? {
|
|
209
|
+
item.image = UIImage(systemName: systemImageName)
|
|
210
|
+
} else { item.image = nil }
|
|
211
|
+
item.tintColor = customTintColor
|
|
212
|
+
if let titleStyle = _titleStyle { FontUtils.setTitleStyle(fromConfig: titleStyle, for: item) }
|
|
213
|
+
else { FontUtils.clearTitleStyle(for: item) }
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
private func applyCommonProperties(to item: UIBarButtonItem) {
|
|
218
|
+
if #available(iOS 26.0, *) {
|
|
219
|
+
item.hidesSharedBackground = hidesSharedBackground
|
|
220
|
+
item.sharesBackground = sharesBackground
|
|
221
|
+
}
|
|
222
|
+
item.style = _barButtonItemStyle ?? .plain
|
|
223
|
+
item.width = width.map { CGFloat($0.doubleValue) } ?? 0
|
|
224
|
+
item.isSelected = selected
|
|
225
|
+
item.accessibilityLabel = routerAccessibilityLabel as String?
|
|
226
|
+
item.accessibilityHint = routerAccessibilityHint as String?
|
|
227
|
+
item.isEnabled = !disabled
|
|
228
|
+
if #available(iOS 26.0, *) {
|
|
229
|
+
if let badgeConfig = _badgeConfig {
|
|
230
|
+
var badge = UIBarButtonItem.Badge.indicator()
|
|
231
|
+
if let value = badgeConfig.value { badge = .string(value) }
|
|
232
|
+
if let backgroundColor = badgeConfig.backgroundColor { badge.backgroundColor = backgroundColor }
|
|
233
|
+
if let foregroundColor = badgeConfig.color { badge.foregroundColor = foregroundColor }
|
|
234
|
+
if badgeConfig.fontFamily != nil || badgeConfig.fontSize != nil || badgeConfig.fontWeight != nil {
|
|
235
|
+
badge.font = FontUtils.convertTitleStyleToFont(TitleStyle(
|
|
236
|
+
fontFamily: badgeConfig.fontFamily, fontSize: badgeConfig.fontSize, fontWeight: badgeConfig.fontWeight))
|
|
237
|
+
}
|
|
238
|
+
item.badge = badge
|
|
239
|
+
} else { item.badge = nil }
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
public override func insertReactSubview(_ subview: UIView!, at atIndex: Int) {
|
|
244
|
+
guard customView == nil else { return }
|
|
245
|
+
customView = subview
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
public override func removeReactSubview(_ subview: UIView!) {
|
|
249
|
+
if customView === subview { subview.removeFromSuperview(); customView = nil }
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// MARK: - enums and structs (no Expo dependency)
|
|
254
|
+
|
|
255
|
+
enum ItemType: String {
|
|
256
|
+
case normal
|
|
257
|
+
case fixedSpacer
|
|
258
|
+
case fluidSpacer
|
|
259
|
+
case searchBar
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
enum BarItemStyle: String {
|
|
263
|
+
case plain
|
|
264
|
+
case prominent
|
|
265
|
+
|
|
266
|
+
func toUIBarButtonItemStyle() -> UIBarButtonItem.Style {
|
|
267
|
+
switch self {
|
|
268
|
+
case .plain: return .plain
|
|
269
|
+
case .prominent:
|
|
270
|
+
if #available(iOS 26.0, *) { return .prominent }
|
|
271
|
+
else { return .done }
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
enum ImageRenderingMode: String {
|
|
277
|
+
case template
|
|
278
|
+
case original
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
struct BadgeConfiguration: Equatable {
|
|
282
|
+
var value: String?
|
|
283
|
+
var backgroundColor: UIColor?
|
|
284
|
+
var color: UIColor?
|
|
285
|
+
var fontFamily: String?
|
|
286
|
+
var fontSize: Double?
|
|
287
|
+
var fontWeight: String?
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
struct TitleStyle: Equatable {
|
|
291
|
+
var fontFamily: String?
|
|
292
|
+
var fontSize: Double?
|
|
293
|
+
var fontWeight: String?
|
|
294
|
+
var color: UIColor?
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// MARK: - dict -> struct helpers
|
|
298
|
+
|
|
299
|
+
func parseBadgeConfiguration(_ dict: NSDictionary?) -> BadgeConfiguration? {
|
|
300
|
+
guard let dict = dict else { return nil }
|
|
301
|
+
return BadgeConfiguration(
|
|
302
|
+
value: dict["value"] as? String,
|
|
303
|
+
backgroundColor: parseColor(dict["backgroundColor"]),
|
|
304
|
+
color: parseColor(dict["color"]),
|
|
305
|
+
fontFamily: dict["fontFamily"] as? String,
|
|
306
|
+
fontSize: dict["fontSize"] as? Double,
|
|
307
|
+
fontWeight: dict["fontWeight"] as? String
|
|
308
|
+
)
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
func parseTitleStyle(_ dict: NSDictionary?) -> TitleStyle? {
|
|
312
|
+
guard let dict = dict else { return nil }
|
|
313
|
+
return TitleStyle(
|
|
314
|
+
fontFamily: dict["fontFamily"] as? String,
|
|
315
|
+
fontSize: dict["fontSize"] as? Double,
|
|
316
|
+
fontWeight: dict["fontWeight"] as? String,
|
|
317
|
+
color: parseColor(dict["color"])
|
|
318
|
+
)
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
func parseColor(_ value: Any?) -> UIColor? {
|
|
322
|
+
guard let value = value else { return nil }
|
|
323
|
+
if let color = value as? UIColor { return color }
|
|
324
|
+
if let num = value as? NSNumber {
|
|
325
|
+
// RN passes colors as processed integers
|
|
326
|
+
let intVal = num.uint32Value
|
|
327
|
+
let a = CGFloat((intVal >> 24) & 0xFF) / 255.0
|
|
328
|
+
let r = CGFloat((intVal >> 16) & 0xFF) / 255.0
|
|
329
|
+
let g = CGFloat((intVal >> 8) & 0xFF) / 255.0
|
|
330
|
+
let b = CGFloat(intVal & 0xFF) / 255.0
|
|
331
|
+
return UIColor(red: r, green: g, blue: b, alpha: a)
|
|
332
|
+
}
|
|
333
|
+
return nil
|
|
334
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#import <React/RCTViewManager.h>
|
|
2
|
+
|
|
3
|
+
#if __has_include("VxrnNative-Swift.h")
|
|
4
|
+
#import "VxrnNative-Swift.h"
|
|
5
|
+
#else
|
|
6
|
+
#import <VxrnNative/VxrnNative-Swift.h>
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
@interface VxrnToolbarHostManager : RCTViewManager
|
|
10
|
+
@end
|
|
11
|
+
|
|
12
|
+
@implementation VxrnToolbarHostManager
|
|
13
|
+
|
|
14
|
+
RCT_EXPORT_MODULE(VxrnToolbarHost)
|
|
15
|
+
|
|
16
|
+
- (UIView *)view {
|
|
17
|
+
return [ToolbarHostView new];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#import <React/RCTViewManager.h>
|
|
2
|
+
|
|
3
|
+
#if __has_include("VxrnNative-Swift.h")
|
|
4
|
+
#import "VxrnNative-Swift.h"
|
|
5
|
+
#else
|
|
6
|
+
#import <VxrnNative/VxrnNative-Swift.h>
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
@interface VxrnToolbarItemManager : RCTViewManager
|
|
10
|
+
@end
|
|
11
|
+
|
|
12
|
+
@implementation VxrnToolbarItemManager
|
|
13
|
+
|
|
14
|
+
RCT_EXPORT_MODULE(VxrnToolbarItem)
|
|
15
|
+
|
|
16
|
+
- (UIView *)view {
|
|
17
|
+
return [ToolbarItemView new];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
RCT_EXPORT_VIEW_PROPERTY(identifier, NSString)
|
|
21
|
+
RCT_EXPORT_VIEW_PROPERTY(type, NSString)
|
|
22
|
+
RCT_EXPORT_VIEW_PROPERTY(title, NSString)
|
|
23
|
+
RCT_EXPORT_VIEW_PROPERTY(systemImageName, NSString)
|
|
24
|
+
RCT_EXPORT_VIEW_PROPERTY(xcassetName, NSString)
|
|
25
|
+
RCT_EXPORT_VIEW_PROPERTY(imageSource, NSDictionary)
|
|
26
|
+
RCT_REMAP_VIEW_PROPERTY(tintColor, tintColor_, UIColor)
|
|
27
|
+
RCT_EXPORT_VIEW_PROPERTY(imageRenderingMode, NSString)
|
|
28
|
+
RCT_EXPORT_VIEW_PROPERTY(hidesSharedBackground, BOOL)
|
|
29
|
+
RCT_EXPORT_VIEW_PROPERTY(sharesBackground, BOOL)
|
|
30
|
+
RCT_EXPORT_VIEW_PROPERTY(barButtonItemStyle, NSString)
|
|
31
|
+
RCT_EXPORT_VIEW_PROPERTY(width, NSNumber)
|
|
32
|
+
RCT_REMAP_VIEW_PROPERTY(hidden, routerHidden, BOOL)
|
|
33
|
+
RCT_EXPORT_VIEW_PROPERTY(selected, BOOL)
|
|
34
|
+
RCT_EXPORT_VIEW_PROPERTY(badgeConfiguration, NSDictionary)
|
|
35
|
+
RCT_EXPORT_VIEW_PROPERTY(titleStyle, NSDictionary)
|
|
36
|
+
RCT_REMAP_VIEW_PROPERTY(accessibilityLabel, routerAccessibilityLabel, NSString)
|
|
37
|
+
RCT_REMAP_VIEW_PROPERTY(accessibilityHint, routerAccessibilityHint, NSString)
|
|
38
|
+
RCT_EXPORT_VIEW_PROPERTY(disabled, BOOL)
|
|
39
|
+
RCT_EXPORT_VIEW_PROPERTY(onSelected, RCTDirectEventBlock)
|
|
40
|
+
|
|
41
|
+
@end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, '..', 'package.json')))
|
|
4
|
+
|
|
5
|
+
Pod::Spec.new do |s|
|
|
6
|
+
s.name = 'VxrnNative'
|
|
7
|
+
s.version = package['version']
|
|
8
|
+
s.summary = package['description']
|
|
9
|
+
s.description = package['description']
|
|
10
|
+
s.license = package['license']
|
|
11
|
+
s.author = 'vxrn'
|
|
12
|
+
s.homepage = 'https://github.com/onejs/one'
|
|
13
|
+
s.platforms = {
|
|
14
|
+
:ios => '15.1'
|
|
15
|
+
}
|
|
16
|
+
s.swift_version = '5.9'
|
|
17
|
+
s.source = { git: 'https://github.com/onejs/one.git' }
|
|
18
|
+
s.static_framework = true
|
|
19
|
+
|
|
20
|
+
s.dependency 'React-Core'
|
|
21
|
+
|
|
22
|
+
s.pod_target_xcconfig = {
|
|
23
|
+
'DEFINES_MODULE' => 'YES',
|
|
24
|
+
'SWIFT_COMPILATION_MODE' => 'wholemodule',
|
|
25
|
+
'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES',
|
|
26
|
+
'OTHER_SWIFT_FLAGS' => '$(inherited) -Xcc -Wno-non-modular-include-in-framework-module',
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
s.source_files = "**/*.{h,m,swift,mm,cpp}"
|
|
30
|
+
s.exclude_files = 'Tests/**/*'
|
|
31
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#import <React/RCTViewManager.h>
|
|
2
|
+
|
|
3
|
+
#if __has_include("VxrnNative-Swift.h")
|
|
4
|
+
#import "VxrnNative-Swift.h"
|
|
5
|
+
#else
|
|
6
|
+
#import <VxrnNative/VxrnNative-Swift.h>
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
@interface VxrnZoomAlignmentManager : RCTViewManager
|
|
10
|
+
@end
|
|
11
|
+
|
|
12
|
+
@implementation VxrnZoomAlignmentManager
|
|
13
|
+
|
|
14
|
+
RCT_EXPORT_MODULE(VxrnZoomAlignment)
|
|
15
|
+
|
|
16
|
+
- (UIView *)view {
|
|
17
|
+
return [ZoomTransitionAlignmentRectDetectorView new];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
RCT_EXPORT_VIEW_PROPERTY(identifier, NSString)
|
|
21
|
+
|
|
22
|
+
@end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#import <React/RCTViewManager.h>
|
|
2
|
+
|
|
3
|
+
#if __has_include("VxrnNative-Swift.h")
|
|
4
|
+
#import "VxrnNative-Swift.h"
|
|
5
|
+
#else
|
|
6
|
+
#import <VxrnNative/VxrnNative-Swift.h>
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
@interface VxrnZoomEnablerManager : RCTViewManager
|
|
10
|
+
@end
|
|
11
|
+
|
|
12
|
+
@implementation VxrnZoomEnablerManager
|
|
13
|
+
|
|
14
|
+
RCT_EXPORT_MODULE(VxrnZoomEnabler)
|
|
15
|
+
|
|
16
|
+
- (UIView *)view {
|
|
17
|
+
return [ZoomTransitionEnablerView new];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
RCT_EXPORT_VIEW_PROPERTY(zoomTransitionSourceIdentifier, NSString)
|
|
21
|
+
RCT_EXPORT_VIEW_PROPERTY(dismissalBoundsRect, NSDictionary)
|
|
22
|
+
|
|
23
|
+
@end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#import <React/RCTViewManager.h>
|
|
2
|
+
|
|
3
|
+
#if __has_include("VxrnNative-Swift.h")
|
|
4
|
+
#import "VxrnNative-Swift.h"
|
|
5
|
+
#else
|
|
6
|
+
#import <VxrnNative/VxrnNative-Swift.h>
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
@interface VxrnZoomSourceManager : RCTViewManager
|
|
10
|
+
@end
|
|
11
|
+
|
|
12
|
+
@implementation VxrnZoomSourceManager
|
|
13
|
+
|
|
14
|
+
RCT_EXPORT_MODULE(VxrnZoomSource)
|
|
15
|
+
|
|
16
|
+
- (UIView *)view {
|
|
17
|
+
return [ZoomTransitionSourceView new];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
RCT_EXPORT_VIEW_PROPERTY(identifier, NSString)
|
|
21
|
+
RCT_EXPORT_VIEW_PROPERTY(alignment, NSDictionary)
|
|
22
|
+
RCT_EXPORT_VIEW_PROPERTY(animateAspectRatioChange, BOOL)
|
|
23
|
+
|
|
24
|
+
@end
|