diff --git a/.changeset/popular-oranges-provide.md b/.changeset/popular-oranges-provide.md new file mode 100644 index 00000000..2e50363f --- /dev/null +++ b/.changeset/popular-oranges-provide.md @@ -0,0 +1,6 @@ +--- +"react-native-bottom-tabs": patch +"react-native-bottom-tabs-example": patch +--- + +feat: macos support diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0141b8da..9d1b1897 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -242,3 +242,49 @@ jobs: - name: Build example for iOS run: | yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}" + + build-macos: + runs-on: macos-15 + env: + TURBO_CACHE_DIR: .turbo/macos + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup + uses: ./.github/actions/setup + + - name: Build package + run: yarn build + + - name: Install xcbeautify + run: | + brew install xcbeautify + + - name: Cache turborepo for macOS + uses: actions/cache@v3 + with: + path: ${{ env.TURBO_CACHE_DIR }} + key: ${{ runner.os }}-turborepo-macos-${{ hashFiles('yarn.lock') }} + restore-keys: | + ${{ runner.os }}-turborepo-macos- + + - name: Check turborepo cache for macOS + run: | + TURBO_CACHE_STATUS=$(node -p "($(yarn turbo run build:macos --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json)).tasks.find(t => t.task === 'build:macos').cache.status") + + if [[ $TURBO_CACHE_STATUS == "HIT" ]]; then + echo "turbo_cache_hit=1" >> $GITHUB_ENV + fi + + - name: Install cocoapods + if: env.turbo_cache_hit != 1 && steps.cocoapods-cache.outputs.cache-hit != 'true' + run: | + cd apps/example + pod install --project-directory=macos + env: + NO_FLIPPER: 1 + + - name: Build example for macOS + run: | + yarn turbo run build:macos --cache-dir="${{ env.TURBO_CACHE_DIR }}" diff --git a/apps/example/macos/Podfile b/apps/example/macos/Podfile new file mode 100644 index 00000000..319b5125 --- /dev/null +++ b/apps/example/macos/Podfile @@ -0,0 +1,13 @@ +ws_dir = Pathname.new(__dir__) +ws_dir = ws_dir.parent until + File.exist?("#{ws_dir}/node_modules/react-native-test-app/macos/test_app.rb") || + ws_dir.expand_path.to_s == '/' +require "#{ws_dir}/node_modules/react-native-test-app/macos/test_app.rb" + +workspace 'ReactNativeBottomTabs.xcworkspace' + +use_test_app! do |test_app| + # Workaround for not using use_frameworks! in the Podfile + pod 'SDWebImage', :modular_headers => true + pod 'SDWebImageSVGCoder', :modular_headers => true +end diff --git a/apps/example/macos/Podfile.lock b/apps/example/macos/Podfile.lock new file mode 100644 index 00000000..45199996 --- /dev/null +++ b/apps/example/macos/Podfile.lock @@ -0,0 +1,1827 @@ +PODS: + - boost (1.84.0) + - DoubleConversion (1.1.6) + - FBLazyVector (0.75.16) + - fmt (9.1.0) + - glog (0.3.5) + - RCT-Folly (2024.01.01.00): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Default (= 2024.01.01.00) + - RCT-Folly/Default (2024.01.01.00): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (2024.01.01.00): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCTDeprecation (0.75.16) + - RCTRequired (0.75.16) + - RCTTypeSafety (0.75.16): + - FBLazyVector (= 0.75.16) + - RCTRequired (= 0.75.16) + - React-Core (= 0.75.16) + - React (0.75.16): + - React-Core (= 0.75.16) + - React-Core/DevSupport (= 0.75.16) + - React-Core/RCTWebSocket (= 0.75.16) + - React-RCTActionSheet (= 0.75.16) + - React-RCTAnimation (= 0.75.16) + - React-RCTBlob (= 0.75.16) + - React-RCTImage (= 0.75.16) + - React-RCTLinking (= 0.75.16) + - React-RCTNetwork (= 0.75.16) + - React-RCTSettings (= 0.75.16) + - React-RCTText (= 0.75.16) + - React-RCTVibration (= 0.75.16) + - React-callinvoker (0.75.16) + - React-Core (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default (= 0.75.16) + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/CoreModulesHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/Default (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/DevSupport (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default (= 0.75.16) + - React-Core/RCTWebSocket (= 0.75.16) + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTActionSheetHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTAnimationHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTBlobHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTImageHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTLinkingHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTNetworkHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTSettingsHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTTextHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTVibrationHeaders (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-Core/RCTWebSocket (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default (= 0.75.16) + - React-cxxreact + - React-featureflags + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-CoreModules (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety (= 0.75.16) + - React-Core/CoreModulesHeaders (= 0.75.16) + - React-jsi (= 0.75.16) + - React-jsinspector + - React-NativeModulesApple + - React-RCTBlob + - React-RCTImage (= 0.75.16) + - ReactCodegen + - ReactCommon + - SocketRocket (= 0.7.0) + - React-cxxreact (0.75.16): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.75.16) + - React-debug (= 0.75.16) + - React-jsi (= 0.75.16) + - React-jsinspector + - React-logger (= 0.75.16) + - React-perflogger (= 0.75.16) + - React-runtimeexecutor (= 0.75.16) + - React-debug (0.75.16) + - React-defaultsnativemodule (0.75.16): + - DoubleConversion + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-domnativemodule + - React-Fabric + - React-featureflags + - React-featureflagsnativemodule + - React-graphics + - React-idlecallbacksnativemodule + - React-ImageManager + - React-jsi + - React-microtasksnativemodule + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-domnativemodule (0.75.16): + - DoubleConversion + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/animations (= 0.75.16) + - React-Fabric/attributedstring (= 0.75.16) + - React-Fabric/componentregistry (= 0.75.16) + - React-Fabric/componentregistrynative (= 0.75.16) + - React-Fabric/components (= 0.75.16) + - React-Fabric/core (= 0.75.16) + - React-Fabric/dom (= 0.75.16) + - React-Fabric/imagemanager (= 0.75.16) + - React-Fabric/leakchecker (= 0.75.16) + - React-Fabric/mounting (= 0.75.16) + - React-Fabric/observers (= 0.75.16) + - React-Fabric/scheduler (= 0.75.16) + - React-Fabric/telemetry (= 0.75.16) + - React-Fabric/templateprocessor (= 0.75.16) + - React-Fabric/uimanager (= 0.75.16) + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/animations (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/attributedstring (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistry (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistrynative (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.75.16) + - React-Fabric/components/root (= 0.75.16) + - React-Fabric/components/view (= 0.75.16) + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/legacyviewmanagerinterop (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/root (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/view (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric/core (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/dom (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/imagemanager (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/leakchecker (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/mounting (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.75.16) + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers/events (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/scheduler (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancetimeline + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/telemetry (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/templateprocessor (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.75.16) + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager/consistency (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-FabricComponents (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.75.16) + - React-FabricComponents/textlayoutmanager (= 0.75.16) + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.75.16) + - React-FabricComponents/components/iostextinput (= 0.75.16) + - React-FabricComponents/components/modal (= 0.75.16) + - React-FabricComponents/components/rncore (= 0.75.16) + - React-FabricComponents/components/safeareaview (= 0.75.16) + - React-FabricComponents/components/scrollview (= 0.75.16) + - React-FabricComponents/components/text (= 0.75.16) + - React-FabricComponents/components/textinput (= 0.75.16) + - React-FabricComponents/components/unimplementedview (= 0.75.16) + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/inputaccessory (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/iostextinput (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/modal (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/rncore (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/safeareaview (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/scrollview (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/text (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/textinput (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/unimplementedview (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/textlayoutmanager (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricImage (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired (= 0.75.16) + - RCTTypeSafety (= 0.75.16) + - React-Fabric + - React-graphics + - React-ImageManager + - React-jsc + - React-jsi + - React-jsiexecutor (= 0.75.16) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - Yoga + - React-featureflags (0.75.16) + - React-featureflagsnativemodule (0.75.16): + - DoubleConversion + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-graphics (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-Core + - React-jsi + - React-jsiexecutor + - React-utils + - React-idlecallbacksnativemodule (0.75.16): + - DoubleConversion + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-ImageManager (0.75.16): + - glog + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - React-jsc (0.75.16): + - React-jsc/Fabric (= 0.75.16) + - React-jsi (= 0.75.16) + - React-jsc/Fabric (0.75.16): + - React-jsi (= 0.75.16) + - React-jserrorhandler (0.75.16): + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-debug + - React-jsi + - React-jsi (0.75.16): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly (= 2024.01.01.00) + - React-jsiexecutor (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly (= 2024.01.01.00) + - React-cxxreact (= 0.75.16) + - React-jsi (= 0.75.16) + - React-jsinspector + - React-perflogger (= 0.75.16) + - React-jsinspector (0.75.16): + - DoubleConversion + - glog + - RCT-Folly (= 2024.01.01.00) + - React-featureflags + - React-jsi + - React-runtimeexecutor (= 0.75.16) + - React-jsitracing (0.75.16): + - React-jsi + - React-logger (0.75.16): + - glog + - React-Mapbuffer (0.75.16): + - glog + - React-debug + - React-microtasksnativemodule (0.75.16): + - DoubleConversion + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-bottom-tabs (0.7.1): + - DoubleConversion + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SDWebImage (>= 5.19.1) + - SDWebImageSVGCoder (>= 1.7.0) + - SwiftUIIntrospect (~> 1.0) + - Yoga + - react-native-safe-area-context (4.14.0): + - React-Core + - React-nativeconfig (0.75.16) + - React-NativeModulesApple (0.75.16): + - glog + - React-callinvoker + - React-Core + - React-cxxreact + - React-jsc + - React-jsi + - React-jsinspector + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-perflogger (0.75.16) + - React-performancetimeline (0.75.16): + - RCT-Folly (= 2024.01.01.00) + - React-cxxreact + - React-RCTActionSheet (0.75.16): + - React-Core/RCTActionSheetHeaders (= 0.75.16) + - React-RCTAnimation (0.75.16): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTAppDelegate (0.75.16): + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-jsc + - React-nativeconfig + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-RCTNetwork + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon + - React-RCTBlob (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - RCT-Folly (= 2024.01.01.00) + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTNetwork + - ReactCodegen + - ReactCommon + - React-RCTFabric (0.75.16): + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsc + - React-jsi + - React-jsinspector + - React-nativeconfig + - React-performancetimeline + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - Yoga + - React-RCTImage (0.75.16): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTNetwork + - ReactCodegen + - ReactCommon + - React-RCTLinking (0.75.16): + - React-Core/RCTLinkingHeaders (= 0.75.16) + - React-jsi (= 0.75.16) + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - ReactCommon/turbomodule/core (= 0.75.16) + - React-RCTNetwork (0.75.16): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTSettings (0.75.16): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTText (0.75.16): + - React-Core/RCTTextHeaders (= 0.75.16) + - Yoga + - React-RCTVibration (0.75.16): + - RCT-Folly (= 2024.01.01.00) + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-rendererconsistency (0.75.16) + - React-rendererdebug (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - RCT-Folly (= 2024.01.01.00) + - React-debug + - React-rncore (0.75.16) + - React-RuntimeApple (0.75.16): + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-jsc + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RuntimeCore + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - React-RuntimeCore (0.75.16): + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-cxxreact + - React-featureflags + - React-jsc + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - React-runtimeexecutor (0.75.16): + - React-jsi (= 0.75.16) + - React-runtimescheduler (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-jsc + - React-jsi + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-utils + - React-utils (0.75.16): + - glog + - RCT-Folly (= 2024.01.01.00) + - React-debug + - React-jsc + - React-jsi (= 0.75.16) + - ReactCodegen (0.75.16): + - DoubleConversion + - glog + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-jsc + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ReactCommon (0.75.16): + - ReactCommon/turbomodule (= 0.75.16) + - ReactCommon/turbomodule (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.75.16) + - React-cxxreact (= 0.75.16) + - React-jsi (= 0.75.16) + - React-logger (= 0.75.16) + - React-perflogger (= 0.75.16) + - ReactCommon/turbomodule/bridging (= 0.75.16) + - ReactCommon/turbomodule/core (= 0.75.16) + - ReactCommon/turbomodule/bridging (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.75.16) + - React-cxxreact (= 0.75.16) + - React-jsi (= 0.75.16) + - React-logger (= 0.75.16) + - React-perflogger (= 0.75.16) + - ReactCommon/turbomodule/core (0.75.16): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.75.16) + - React-cxxreact (= 0.75.16) + - React-debug (= 0.75.16) + - React-featureflags (= 0.75.16) + - React-jsi (= 0.75.16) + - React-logger (= 0.75.16) + - React-perflogger (= 0.75.16) + - React-utils (= 0.75.16) + - ReactNativeHost (0.5.0): + - DoubleConversion + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - ReactTestApp-DevSupport (4.0.2): + - React-Core + - React-jsi + - ReactTestApp-Resources (1.0.0-dev) + - RNGestureHandler (2.21.2): + - DoubleConversion + - glog + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - SDWebImage (5.20.0): + - SDWebImage/Core (= 5.20.0) + - SDWebImage/Core (5.20.0) + - SDWebImageSVGCoder (1.7.0): + - SDWebImage/Core (~> 5.6) + - SocketRocket (0.7.0) + - SwiftUIIntrospect (1.3.0) + - Yoga (0.0.0) + +DEPENDENCIES: + - boost (from `../../../node_modules/react-native-macos/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../../../node_modules/react-native-macos/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../../../node_modules/react-native-macos/Libraries/FBLazyVector`) + - fmt (from `../../../node_modules/react-native-macos/third-party-podspecs/fmt.podspec`) + - glog (from `../../../node_modules/react-native-macos/third-party-podspecs/glog.podspec`) + - RCT-Folly (from `../../../node_modules/react-native-macos/third-party-podspecs/RCT-Folly.podspec`) + - RCT-Folly/Fabric (from `../../../node_modules/react-native-macos/third-party-podspecs/RCT-Folly.podspec`) + - RCTDeprecation (from `../../../node_modules/react-native-macos/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) + - RCTRequired (from `../../../node_modules/react-native-macos/Libraries/Required`) + - RCTTypeSafety (from `../../../node_modules/react-native-macos/Libraries/TypeSafety`) + - React (from `../../../node_modules/react-native-macos/`) + - React-callinvoker (from `../../../node_modules/react-native-macos/ReactCommon/callinvoker`) + - React-Core (from `../../../node_modules/react-native-macos/`) + - React-Core/RCTWebSocket (from `../../../node_modules/react-native-macos/`) + - React-CoreModules (from `../../../node_modules/react-native-macos/React/CoreModules`) + - React-cxxreact (from `../../../node_modules/react-native-macos/ReactCommon/cxxreact`) + - React-debug (from `../../../node_modules/react-native-macos/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../../../node_modules/react-native-macos/ReactCommon`) + - React-FabricComponents (from `../../../node_modules/react-native-macos/ReactCommon`) + - React-FabricImage (from `../../../node_modules/react-native-macos/ReactCommon`) + - React-featureflags (from `../../../node_modules/react-native-macos/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../../../node_modules/react-native-macos/ReactCommon/react/renderer/graphics`) + - React-idlecallbacksnativemodule (from `../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../../../node_modules/react-native-macos/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jsc (from `../../../node_modules/react-native-macos/ReactCommon/jsc`) + - React-jserrorhandler (from `../../../node_modules/react-native-macos/ReactCommon/jserrorhandler`) + - React-jsi (from `../../../node_modules/react-native-macos/ReactCommon/jsi`) + - React-jsiexecutor (from `../../../node_modules/react-native-macos/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../../../node_modules/react-native-macos/ReactCommon/jsinspector-modern`) + - React-jsitracing (from `../../../node_modules/react-native-macos/ReactCommon/hermes/executor/`) + - React-logger (from `../../../node_modules/react-native-macos/ReactCommon/logger`) + - React-Mapbuffer (from `../../../node_modules/react-native-macos/ReactCommon`) + - React-microtasksnativemodule (from `../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/microtasks`) + - react-native-bottom-tabs (from `../../../node_modules/react-native-bottom-tabs`) + - react-native-safe-area-context (from `../../../node_modules/react-native-safe-area-context`) + - React-nativeconfig (from `../../../node_modules/react-native-macos/ReactCommon`) + - React-NativeModulesApple (from `../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/core/platform/ios`) + - React-perflogger (from `../../../node_modules/react-native-macos/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../../../node_modules/react-native-macos/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../../../node_modules/react-native-macos/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../../../node_modules/react-native-macos/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../../../node_modules/react-native-macos/Libraries/AppDelegate`) + - React-RCTBlob (from `../../../node_modules/react-native-macos/Libraries/Blob`) + - React-RCTFabric (from `../../../node_modules/react-native-macos/React`) + - React-RCTImage (from `../../../node_modules/react-native-macos/Libraries/Image`) + - React-RCTLinking (from `../../../node_modules/react-native-macos/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../../../node_modules/react-native-macos/Libraries/Network`) + - React-RCTSettings (from `../../../node_modules/react-native-macos/Libraries/Settings`) + - React-RCTText (from `../../../node_modules/react-native-macos/Libraries/Text`) + - React-RCTVibration (from `../../../node_modules/react-native-macos/Libraries/Vibration`) + - React-rendererconsistency (from `../../../node_modules/react-native-macos/ReactCommon/react/renderer/consistency`) + - React-rendererdebug (from `../../../node_modules/react-native-macos/ReactCommon/react/renderer/debug`) + - React-rncore (from `../../../node_modules/react-native-macos/ReactCommon`) + - React-RuntimeApple (from `../../../node_modules/react-native-macos/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../../../node_modules/react-native-macos/ReactCommon/react/runtime`) + - React-runtimeexecutor (from `../../../node_modules/react-native-macos/ReactCommon/runtimeexecutor`) + - React-runtimescheduler (from `../../../node_modules/react-native-macos/ReactCommon/react/renderer/runtimescheduler`) + - React-utils (from `../../../node_modules/react-native-macos/ReactCommon/react/utils`) + - ReactCodegen (from `build/generated/ios`) + - ReactCommon/turbomodule/core (from `../../../node_modules/react-native-macos/ReactCommon`) + - "ReactNativeHost (from `../../../node_modules/@rnx-kit/react-native-host`)" + - ReactTestApp-DevSupport (from `../../../node_modules/react-native-test-app`) + - ReactTestApp-Resources (from `..`) + - RNGestureHandler (from `../../../node_modules/react-native-gesture-handler`) + - SDWebImage + - SDWebImageSVGCoder + - SocketRocket (from `../../../node_modules/react-native-macos/third-party-podspecs/SocketRocket.podspec`) + - Yoga (from `../../../node_modules/react-native-macos/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - SDWebImage + - SDWebImageSVGCoder + - SwiftUIIntrospect + +EXTERNAL SOURCES: + boost: + :podspec: "../../../node_modules/react-native-macos/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../../../node_modules/react-native-macos/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../../../node_modules/react-native-macos/Libraries/FBLazyVector" + fmt: + :podspec: "../../../node_modules/react-native-macos/third-party-podspecs/fmt.podspec" + glog: + :podspec: "../../../node_modules/react-native-macos/third-party-podspecs/glog.podspec" + RCT-Folly: + :podspec: "../../../node_modules/react-native-macos/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../../../node_modules/react-native-macos/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + RCTRequired: + :path: "../../../node_modules/react-native-macos/Libraries/Required" + RCTTypeSafety: + :path: "../../../node_modules/react-native-macos/Libraries/TypeSafety" + React: + :path: "../../../node_modules/react-native-macos/" + React-callinvoker: + :path: "../../../node_modules/react-native-macos/ReactCommon/callinvoker" + React-Core: + :path: "../../../node_modules/react-native-macos/" + React-CoreModules: + :path: "../../../node_modules/react-native-macos/React/CoreModules" + React-cxxreact: + :path: "../../../node_modules/react-native-macos/ReactCommon/cxxreact" + React-debug: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/dom" + React-Fabric: + :path: "../../../node_modules/react-native-macos/ReactCommon" + React-FabricComponents: + :path: "../../../node_modules/react-native-macos/ReactCommon" + React-FabricImage: + :path: "../../../node_modules/react-native-macos/ReactCommon" + React-featureflags: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/featureflags" + React-graphics: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/renderer/graphics" + React-idlecallbacksnativemodule: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/idlecallbacks" + React-ImageManager: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jsc: + :path: "../../../node_modules/react-native-macos/ReactCommon/jsc" + React-jserrorhandler: + :path: "../../../node_modules/react-native-macos/ReactCommon/jserrorhandler" + React-jsi: + :path: "../../../node_modules/react-native-macos/ReactCommon/jsi" + React-jsiexecutor: + :path: "../../../node_modules/react-native-macos/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../../../node_modules/react-native-macos/ReactCommon/jsinspector-modern" + React-jsitracing: + :path: "../../../node_modules/react-native-macos/ReactCommon/hermes/executor/" + React-logger: + :path: "../../../node_modules/react-native-macos/ReactCommon/logger" + React-Mapbuffer: + :path: "../../../node_modules/react-native-macos/ReactCommon" + React-microtasksnativemodule: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/microtasks" + react-native-bottom-tabs: + :path: "../../../node_modules/react-native-bottom-tabs" + react-native-safe-area-context: + :path: "../../../node_modules/react-native-safe-area-context" + React-nativeconfig: + :path: "../../../node_modules/react-native-macos/ReactCommon" + React-NativeModulesApple: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/nativemodule/core/platform/ios" + React-perflogger: + :path: "../../../node_modules/react-native-macos/ReactCommon/reactperflogger" + React-performancetimeline: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/performance/timeline" + React-RCTActionSheet: + :path: "../../../node_modules/react-native-macos/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../../../node_modules/react-native-macos/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../../../node_modules/react-native-macos/Libraries/AppDelegate" + React-RCTBlob: + :path: "../../../node_modules/react-native-macos/Libraries/Blob" + React-RCTFabric: + :path: "../../../node_modules/react-native-macos/React" + React-RCTImage: + :path: "../../../node_modules/react-native-macos/Libraries/Image" + React-RCTLinking: + :path: "../../../node_modules/react-native-macos/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../../../node_modules/react-native-macos/Libraries/Network" + React-RCTSettings: + :path: "../../../node_modules/react-native-macos/Libraries/Settings" + React-RCTText: + :path: "../../../node_modules/react-native-macos/Libraries/Text" + React-RCTVibration: + :path: "../../../node_modules/react-native-macos/Libraries/Vibration" + React-rendererconsistency: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/renderer/consistency" + React-rendererdebug: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/renderer/debug" + React-rncore: + :path: "../../../node_modules/react-native-macos/ReactCommon" + React-RuntimeApple: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/runtime" + React-runtimeexecutor: + :path: "../../../node_modules/react-native-macos/ReactCommon/runtimeexecutor" + React-runtimescheduler: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/renderer/runtimescheduler" + React-utils: + :path: "../../../node_modules/react-native-macos/ReactCommon/react/utils" + ReactCodegen: + :path: build/generated/ios + ReactCommon: + :path: "../../../node_modules/react-native-macos/ReactCommon" + ReactNativeHost: + :path: "../../../node_modules/@rnx-kit/react-native-host" + ReactTestApp-DevSupport: + :path: "../../../node_modules/react-native-test-app" + ReactTestApp-Resources: + :path: ".." + RNGestureHandler: + :path: "../../../node_modules/react-native-gesture-handler" + SocketRocket: + :podspec: "../../../node_modules/react-native-macos/third-party-podspecs/SocketRocket.podspec" + Yoga: + :path: "../../../node_modules/react-native-macos/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: 78c06792d4bc8e05ba232b20737af9883a947a51 + DoubleConversion: e9fd6969c78f190642ac8adbd3a5ac37995620dc + FBLazyVector: ebbb0088dce747c92a3832ff6cc4f2428d2b39a6 + fmt: c32f09ca7679bf28db6ba79e474dab38daa634a1 + glog: f12b70f4104265bf944bf5800b4f85034eba0ea7 + RCT-Folly: 693a1865d476549c2b4a788ec924ce59dd7cb8cb + RCTDeprecation: 1a64a4f0bf3c0f62fa3d4f6ce1c2e03f8c8546fb + RCTRequired: 280394d12d478c94be017e680c795f4ef9c84f37 + RCTTypeSafety: 35e178804ed3ce588d444b0c23f231f2a20a1678 + React: c9c8b39d07c9bc845a7bd1957524f90714fa4db7 + React-callinvoker: 9bb70ff84d1b2c1a193dd7b881a34544690583a2 + React-Core: 1bb1ae89cef9b032218c8cf72a226fd410b0b629 + React-CoreModules: 965b8c39fed3972aa5ca7b2dcb4a7f3d6399f925 + React-cxxreact: 5fa1e8e194931b81fdee535c27603018bddcc3c4 + React-debug: 71277c41e3ea00d88faea0e7fdc70bc5441becaf + React-defaultsnativemodule: eb7d59b6f4c018d6a9dedabb51be50f4e1a12e94 + React-domnativemodule: fe48fb8416a86b95706e0bd923f1a1ebb2f51dc1 + React-Fabric: 883efc0d08dca6620114155ef65d52cdd1fa850f + React-FabricComponents: ece1fd6e0d3324c3aa6a6a1c1430c6b9f0699dcb + React-FabricImage: cf25f33029ce7a594b3fb7544b1f30b45afc0e5c + React-featureflags: 9dfc9a470b198f2af08dda9ca51091599c18375d + React-featureflagsnativemodule: a228133ebaac7309556361b64b75ee6c9fb23861 + React-graphics: 0bf22b1537743c16547926b5f9100d2101f26e5a + React-idlecallbacksnativemodule: 228e4fcf2f4011a62941d2d0bd615117160bf6bc + React-ImageManager: 06474c1e70255003bc9cac91d42f65b40d83af9c + React-jsc: 0658d2a6fb31513b0860b0e371b12541838bdc33 + React-jserrorhandler: 8b5e329bf96e449d3c4243dc4f00f77d951446e4 + React-jsi: 9091c2b7590146ff89eb9c028637ccf12881cba4 + React-jsiexecutor: a7c55a36df7569cbb76cb455233aa988336bfdc7 + React-jsinspector: 60b57fb1cce720928505e0e0c663af65b3568cc6 + React-jsitracing: 9345056779a4ff94c7a62967e7ffacd705321b26 + React-logger: 7e30032239af894a3de5320d132b7afe49ee4f10 + React-Mapbuffer: 5c2e4284948e47d5a46243f218dbe39393e3e37f + React-microtasksnativemodule: 03881a25bb7a2db99a79e3a8e575bbadb24391ce + react-native-bottom-tabs: 79b5dc21a92e4976ba8fd1972326a6c88a24ed6f + react-native-safe-area-context: 4532f1a0c5d34a46b9324ccaaedcb5582a302b7d + React-nativeconfig: 33b8222107c5eb4b73b9cd6d28397ab123904d5c + React-NativeModulesApple: 7ac40d907aa6e653e4063072c474ff8416cabad7 + React-perflogger: 4ef0d0f93248f8331d7de7824e4b7b34d9740147 + React-performancetimeline: 6b41c3a8d4fd1bc9b5df5f6f269779560e38d3cf + React-RCTActionSheet: 9de394e5786c8a129bcb1677736eed4cb80b6f1d + React-RCTAnimation: f7d388e5367dd1611761dbf2a1d96c4f1932de2a + React-RCTAppDelegate: dc04e6aae2b6808ae8f4b272ea328b651a19a3dc + React-RCTBlob: 41e79b0dd56e64e3c5d2b03f1790b0337d4d7374 + React-RCTFabric: b4173524029bb2f18d29a0169f862c6cc92be5ca + React-RCTImage: 0eda203ee739ace6ac409226e267c87182d78b39 + React-RCTLinking: a15757e88e7fc3c70cf2b49b9ad678789a41cbd8 + React-RCTNetwork: 06a35d8cea3b93c6fdcf45099a63dc2a6e5554a6 + React-RCTSettings: b48b8765b3384798a91eb271a81d89a2fd559351 + React-RCTText: 93e7bcccb0056412275d11bf4ec3074189688464 + React-RCTVibration: 062d47b765b17882a2d577dd550b8e2720105422 + React-rendererconsistency: 017d7843a61140b7e382340421e4dfa0bbf51138 + React-rendererdebug: 266e7c47a06c02a0a67b5ef77b560a53d3c72e38 + React-rncore: e2688b8a3daa9913bb921dd0c717b5f3de595bb4 + React-RuntimeApple: ca103387e77c0da9025b271a9570f15c07addf4a + React-RuntimeCore: 771fae5d5becec41a61777d901cf60e0d82973b2 + React-runtimeexecutor: 655bc58c8341e2f1806c13b395ef2d8dadb768fc + React-runtimescheduler: 203909e404c1aff1536898ec61233ca1ad3a69c5 + React-utils: 1cf02e8d4880550ff7550c162a454adae239f82c + ReactCodegen: 6e054b5ae02613188cbde28bec88f5c2268d601d + ReactCommon: e10fb4f939b3abe445dc8095997470a538627ec6 + ReactNativeHost: 99c0ffb175cd69de2ac9a70892cd22dac65ea79d + ReactTestApp-DevSupport: ce66fc1bbcf598d7e90616db390a0274c13e14e7 + ReactTestApp-Resources: 86136e1efe3aa7201759371c03dea3df77079b42 + RNGestureHandler: 6980c0e9faf478d385c9fdfcee5175c4b1215a7c + SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8 + SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c + SocketRocket: 9ee265c4b5ae2382d18e4ee1d2dd2d7af0ff1ab5 + SwiftUIIntrospect: fee9aa07293ee280373a591e1824e8ddc869ba5d + Yoga: 446e6f351a519539ff00a1159fe41e589aab1b94 + +PODFILE CHECKSUM: 5f056b58f37c7289404290973f771a93b7996fd7 + +COCOAPODS: 1.15.2 diff --git a/apps/example/metro.config.js b/apps/example/metro.config.js index e258f883..02786b7e 100644 --- a/apps/example/metro.config.js +++ b/apps/example/metro.config.js @@ -1,7 +1,9 @@ -const { makeMetroConfig } = require("@rnx-kit/metro-config"); +const { makeMetroConfig } = require('@rnx-kit/metro-config'); const path = require('path'); const root = path.resolve(__dirname, '../..'); +const pack = require('../../packages/react-native-bottom-tabs/package.json'); +const modules = Object.keys(pack.peerDependencies); const extraConfig = { watchFolders: [root], @@ -13,6 +15,13 @@ const extraConfig = { }, }), }, + resolver: { + unstable_enableSymlinks: true, + extraNodeModules: modules.reduce((acc, name) => { + acc[name] = path.join(__dirname, 'node_modules', name); + return acc; + }, {}), + }, }; const metroConfig = makeMetroConfig(extraConfig); diff --git a/apps/example/package.json b/apps/example/package.json index 6243878f..c5acd0cc 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -6,12 +6,14 @@ "android": "react-native run-android", "build:android": "npm run mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist && react-native build-android --extra-params \"--no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a\"", "build:android:fabric": "npm run mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist && react-native build-android --extra-params \"--no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a -PnewArchEnabled=true\"", + "build:macos": "npm run mkdist && react-native bundle --entry-file index.js --platform macos --dev true --bundle-output dist/main.macos.jsbundle --assets-dest dist", "build:ios": "npm run mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist && react-native build-ios --scheme ReactNativeBottomTabs --mode Debug --extra-params \"-sdk iphonesimulator CC=clang CPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ GCC_OPTIMIZATION_LEVEL=0 GCC_PRECOMPILE_PREFIX_HEADER=YES ASSETCATALOG_COMPILER_OPTIMIZATION=time DEBUG_INFORMATION_FORMAT=dwarf COMPILER_INDEX_STORE_ENABLE=NO\"", "build:visionos": "npm run mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.visionos.jsbundle --assets-dest dist", "ios": "react-native run-ios", "mkdist": "node -e \"require('node:fs').mkdirSync('dist', { recursive: true, mode: 0o755 })\"", "start": "react-native start", - "visionos": "react-native run-visionos" + "visionos": "react-native run-visionos", + "macos": "react-native run-macos --scheme ReactNativeBottomTabs" }, "dependencies": { "@bottom-tabs/react-navigation": "*", @@ -25,8 +27,9 @@ "react-native": "0.75.4", "react-native-bottom-tabs": "*", "react-native-gesture-handler": "^2.21.2", + "react-native-macos": "^0.75.0", "react-native-paper": "^5.12.5", - "react-native-safe-area-context": "^4.11.0", + "react-native-safe-area-context": "^4.14.0", "react-native-screens": "4.3.0", "react-native-vector-icons": "^10.2.0" }, diff --git a/apps/example/src/App.tsx b/apps/example/src/App.tsx index d516e4e0..8b464869 100644 --- a/apps/example/src/App.tsx +++ b/apps/example/src/App.tsx @@ -72,9 +72,16 @@ const FourTabsActiveIndicatorColor = () => { }; const examples = [ - { component: ThreeTabs, name: 'Three Tabs' }, + { + component: ThreeTabs, + name: 'Three Tabs', + }, { component: FourTabs, name: 'Four Tabs' }, - { component: SFSymbols, name: 'SF Symbols' }, + { + component: SFSymbols, + name: 'SF Symbols', + screenOptions: { headerShown: false }, + }, { component: LabeledTabs, name: 'Labeled Tabs', platform: 'android' }, { component: NativeBottomTabsEmbeddedStacks, @@ -176,8 +183,11 @@ const Stack = createStackNavigator(); const NativeStack = createNativeStackNavigator(); +const defaultStack = Platform.OS === 'macos' ? 'js' : 'native'; + export default function Navigation() { - const [mode, setMode] = React.useState<'native' | 'js'>('native'); + const [mode, setMode] = React.useState<'native' | 'js'>(defaultStack); + const NavigationStack = mode === 'js' ? Stack : NativeStack; const colorScheme = useColorScheme(); const theme = colorScheme === 'dark' ? DarkTheme : DefaultTheme; diff --git a/apps/example/src/Examples/NativeBottomTabsSVGs.tsx b/apps/example/src/Examples/NativeBottomTabsSVGs.tsx index 5caba900..e5bf6ba3 100644 --- a/apps/example/src/Examples/NativeBottomTabsSVGs.tsx +++ b/apps/example/src/Examples/NativeBottomTabsSVGs.tsx @@ -8,7 +8,7 @@ const Tab = createNativeBottomTabNavigator(); function NativeBottomTabsSVGs() { return ( - + Element? { @@ -8,7 +14,6 @@ extension Collection { } } - extension Collection where Element == TabInfo { func findByKey(_ key: String?) -> Element? { guard let key else { return nil } @@ -17,8 +22,8 @@ extension Collection where Element == TabInfo { } } -extension UIView { - func pinEdges(to other: UIView) { +extension PlatformView { + func pinEdges(to other: PlatformView) { NSLayoutConstraint.activate([ leadingAnchor.constraint(equalTo: other.leadingAnchor), trailingAnchor.constraint(equalTo: other.trailingAnchor), @@ -28,17 +33,41 @@ extension UIView { } } -extension UIImage { - func resizeImageTo(size: CGSize) -> UIImage? { +extension PlatformImage { + func resizeImageTo(size: CGSize) -> PlatformImage? { +#if os(macOS) + let newImage = NSImage(size: size, flipped: false) { (rect) -> Bool in + self.draw(in: rect, + from: CGRect(origin: .zero, size: self.size), + operation: .copy, + fraction: 1.0) + return true + } + return newImage +#else UIGraphicsBeginImageContextWithOptions(size, false, 0.0) self.draw(in: CGRect(origin: CGPoint.zero, size: size)) let resizedImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return resizedImage +#endif } } extension View { + +#if os(macOS) + @MainActor + @ViewBuilder + func introspectTabView(closure: @escaping (NSTabView) -> Void) -> some View { + self + .introspect( + .tabView, + on: .macOS(.v11, .v12, .v13, .v14, .v15), + customize: closure + ) + } +#else @MainActor @ViewBuilder func introspectTabView(closure: @escaping (UITabBarController) -> Void) -> some View { @@ -50,6 +79,7 @@ extension View { customize: closure ) } +#endif @MainActor diff --git a/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.h b/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.h index 8af33c1b..0530a172 100644 --- a/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.h +++ b/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.h @@ -1,6 +1,10 @@ #ifdef RCT_NEW_ARCH_ENABLED #import +#if TARGET_OS_OSX +#import +#else #import +#endif NS_ASSUME_NONNULL_BEGIN diff --git a/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.mm b/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.mm index 5cfcdc17..7fe7481c 100644 --- a/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.mm +++ b/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.mm @@ -21,6 +21,12 @@ #import "RCTImagePrimitivesConversions.h" #import "RCTConversions.h" +#if TARGET_OS_OSX +typedef NSView PlatformView; +#else +typedef UIView PlatformView; +#endif + using namespace facebook::react; @@ -31,7 +37,7 @@ @interface RCTTabViewComponentView () *_reactSubviews; + NSMutableArray *_reactSubviews; } + (ComponentDescriptorProvider)componentDescriptorProvider @@ -63,17 +69,17 @@ - (void)layoutSubviews { _tabViewProvider.children = [self reactSubviews]; } -- (NSArray *)reactSubviews +- (NSArray *)reactSubviews { return _reactSubviews; } -- (void)mountChildComponentView:(UIView *)childComponentView index:(NSInteger)index { +- (void)mountChildComponentView:(PlatformView *)childComponentView index:(NSInteger)index { [_reactSubviews insertObject:childComponentView atIndex:index]; _tabViewProvider.children = [self reactSubviews]; } -- (void)unmountChildComponentView:(UIView *)childComponentView index:(NSInteger)index { +- (void)unmountChildComponentView:(PlatformView *)childComponentView index:(NSInteger)index { [_reactSubviews removeObjectAtIndex:index]; [childComponentView removeFromSuperview]; diff --git a/packages/react-native-bottom-tabs/ios/PlatformAliases.swift b/packages/react-native-bottom-tabs/ios/PlatformAliases.swift new file mode 100644 index 00000000..5b508efd --- /dev/null +++ b/packages/react-native-bottom-tabs/ios/PlatformAliases.swift @@ -0,0 +1,37 @@ +import SwiftUI + +#if os(macOS) +import AppKit +#else +import UIKit +#endif + +#if os(macOS) +public typealias PlatformView = NSView +#else +public typealias PlatformView = UIView +#endif + +#if os(macOS) +typealias PlatformImage = NSImage +#else +typealias PlatformImage = UIImage +#endif + +#if os(macOS) +public typealias PlatformColor = NSColor +#else +public typealias PlatformColor = UIColor +#endif + +#if os(macOS) +typealias PlatformHostingController = NSHostingController +#else +typealias PlatformHostingController = UIHostingController +#endif + +#if os(macOS) +typealias PlatformViewRepresentable = NSViewRepresentable +#else +typealias PlatformViewRepresentable = UIViewRepresentable +#endif diff --git a/packages/react-native-bottom-tabs/ios/RCTTabViewViewManager.mm b/packages/react-native-bottom-tabs/ios/RCTTabViewViewManager.mm index 4cadc090..2c1194bd 100644 --- a/packages/react-native-bottom-tabs/ios/RCTTabViewViewManager.mm +++ b/packages/react-native-bottom-tabs/ios/RCTTabViewViewManager.mm @@ -1,7 +1,13 @@ #import #import #import -#import "RCTBridge.h" +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif #if __has_include("react_native_bottom_tabs/react_native_bottom_tabs-Swift.h") #import "react_native_bottom_tabs/react_native_bottom_tabs-Swift.h" @@ -60,7 +66,11 @@ - (void)onLayoutWithSize:(CGSize)size reactTag:(NSNumber *)reactTag { [self.bridge.eventDispatcher sendEvent:event]; } -- (UIView *)view +#if TARGET_OS_OSX +- (NSView *)view +#else +- (UIView *) view +#endif { return [[TabViewProvider alloc] initWithDelegate:self]; } diff --git a/packages/react-native-bottom-tabs/ios/RepresentableView.swift b/packages/react-native-bottom-tabs/ios/RepresentableView.swift new file mode 100644 index 00000000..d4418a64 --- /dev/null +++ b/packages/react-native-bottom-tabs/ios/RepresentableView.swift @@ -0,0 +1,26 @@ +import SwiftUI + +/** + Helper used to render UIView inside of SwiftUI. + */ +struct RepresentableView: PlatformViewRepresentable { + var view: PlatformView + +#if os(macOS) + + func makeNSView(context: Context) -> PlatformView { + return view + } + + func updateNSView(_ nsView: PlatformView, context: Context) {} + +#else + + func makeUIView(context: Context) -> PlatformView { + return view + } + + func updateUIView(_ uiView: PlatformView, context: Context) {} + +#endif +} diff --git a/packages/react-native-bottom-tabs/ios/TabItem.swift b/packages/react-native-bottom-tabs/ios/TabItem.swift new file mode 100644 index 00000000..f58a81cd --- /dev/null +++ b/packages/react-native-bottom-tabs/ios/TabItem.swift @@ -0,0 +1,24 @@ +import SwiftUI + +struct TabItem: View { + var title: String? + var icon: PlatformImage? + var sfSymbol: String? + var labeled: Bool? + + var body: some View { + if let icon { +#if os(macOS) + Image(nsImage: icon) +#else + Image(uiImage: icon) +#endif + } else if let sfSymbol, !sfSymbol.isEmpty { + Image(systemName: sfSymbol) + .noneSymbolVariant() + } + if (labeled != false) { + Text(title ?? "") + } + } +} diff --git a/packages/react-native-bottom-tabs/ios/TabItemEventModifier.swift b/packages/react-native-bottom-tabs/ios/TabItemEventModifier.swift index 1befa9bf..9033b67a 100644 --- a/packages/react-native-bottom-tabs/ios/TabItemEventModifier.swift +++ b/packages/react-native-bottom-tabs/ios/TabItemEventModifier.swift @@ -1,6 +1,8 @@ import SwiftUI import SwiftUIIntrospect +#if !os(macOS) + private final class TabBarDelegate: NSObject, UITabBarControllerDelegate { var onClick: ((_ index: Int) -> Void)? = nil @@ -95,3 +97,5 @@ extension View { modifier(TabItemEventModifier(onTabEvent: handler)) } } + +#endif diff --git a/packages/react-native-bottom-tabs/ios/TabViewImpl.swift b/packages/react-native-bottom-tabs/ios/TabViewImpl.swift index 12921bdf..636cf72c 100644 --- a/packages/react-native-bottom-tabs/ios/TabViewImpl.swift +++ b/packages/react-native-bottom-tabs/ios/TabViewImpl.swift @@ -4,58 +4,16 @@ import React @_spi(Advanced) import SwiftUIIntrospect -/** - Props that component accepts. SwiftUI view gets re-rendered when ObservableObject changes. - */ -class TabViewProps: ObservableObject { - @Published var children: [UIView] = [] - @Published var items: [TabInfo] = [] - @Published var selectedPage: String? - @Published var icons: [Int: UIImage] = [:] - @Published var sidebarAdaptable: Bool? - @Published var labeled: Bool? - @Published var scrollEdgeAppearance: String? - @Published var barTintColor: UIColor? - @Published var activeTintColor: UIColor? - @Published var inactiveTintColor: UIColor? - @Published var translucent: Bool = true - @Published var ignoresTopSafeArea: Bool = true - @Published var disablePageAnimations: Bool = false - @Published var hapticFeedbackEnabled: Bool = false - @Published var fontSize: Int? - @Published var fontFamily: String? - @Published var fontWeight: String? - - var selectedActiveTintColor: UIColor? { - if let selectedPage = selectedPage, - let tabData = items.findByKey(selectedPage), - let activeTintColor = tabData.activeTintColor { - return activeTintColor - } - - return activeTintColor - } -} - -/** - Helper used to render UIView inside of SwiftUI. - */ -struct RepresentableView: UIViewRepresentable { - var view: UIView - - func makeUIView(context: Context) -> UIView { - return view - } - - func updateUIView(_ uiView: UIView, context: Context) {} -} - /** SwiftUI implementation of TabView used to render React Native views. */ struct TabViewImpl: View { @ObservedObject var props: TabViewProps +#if os(macOS) + @Weak var tabBar: NSTabView? +#else @Weak var tabBar: UITabBar? +#endif var onSelect: (_ key: String) -> Void var onLongPress: (_ key: String) -> Void @@ -71,7 +29,7 @@ struct TabViewImpl: View { onLayout(size) }) } -#if !os(tvOS) +#if !os(tvOS) && !os(macOS) .onTabItemEvent({ index, isLongPress in guard let key = props.items.filter({ !$0.hidden || $0.key == props.selectedPage @@ -87,22 +45,30 @@ struct TabViewImpl: View { }) #endif .introspectTabView(closure: { tabController in +#if os(macOS) + tabBar = tabController +#else tabBar = tabController.tabBar onTabBarMeasured( Int(tabController.tabBar.frame.size.height) ) +#endif }) +#if !os(macOS) .configureAppearance(props: props, tabBar: tabBar) +#endif .tintColor(props.selectedActiveTintColor) .getSidebarAdaptable(enabled: props.sidebarAdaptable ?? false) .onChange(of: props.selectedPage ?? "") { newValue in +#if !os(macOS) if (props.disablePageAnimations) { UIView.setAnimationsEnabled(false) DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { UIView.setAnimationsEnabled(true) } } -#if os(tvOS) +#endif +#if os(tvOS) || os(macOS) onSelect(newValue) #endif } @@ -115,7 +81,7 @@ struct TabViewImpl: View { let isFocused = props.selectedPage == tabData?.key if !isHidden || isFocused { - let child = props.children[safe: index] ?? UIView() + let child = props.children[safe: index] ?? PlatformView() let icon = props.icons[index] RepresentableView(view: child) @@ -134,7 +100,9 @@ struct TabViewImpl: View { .tag(tabData?.key) .tabBadge(tabData?.badge) .onAppear { +#if !os(macOS) updateTabBarAppearance(props: props, tabBar: tabBar) +#endif #if os(iOS) guard index >= 4, @@ -161,41 +129,24 @@ struct TabViewImpl: View { } } -struct TabItem: View { - var title: String? - var icon: UIImage? - var sfSymbol: String? - var labeled: Bool? - - var body: some View { - if let icon { - Image(uiImage: icon) - } else if let sfSymbol, !sfSymbol.isEmpty { - Image(systemName: sfSymbol) - .noneSymbolVariant() - } - if (labeled != false) { - Text(title ?? "") - } - } -} - +#if !os(macOS) private func updateTabBarAppearance(props: TabViewProps, tabBar: UITabBar?) { - guard let tabBar else { return } + guard let tabBar else { return } - if props.scrollEdgeAppearance == "transparent" { - configureTransparentAppearance(tabBar: tabBar, props: props) - return - } + if props.scrollEdgeAppearance == "transparent" { + configureTransparentAppearance(tabBar: tabBar, props: props) + return + } - configureStandardAppearance(tabBar: tabBar, props: props) + configureStandardAppearance(tabBar: tabBar, props: props) } +#endif private func createFontAttributes( size: CGFloat, family: String?, weight: String?, - inactiveTintColor: UIColor? + inactiveTintColor: PlatformColor? ) -> [NSAttributedString.Key: Any] { var attributes: [NSAttributedString.Key: Any] = [:] @@ -223,6 +174,8 @@ let tabBarDefaultFontSize: CGFloat = 30.0 let tabBarDefaultFontSize: CGFloat = UIFont.smallSystemFontSize #endif + +#if !os(macOS) private func configureTransparentAppearance(tabBar: UITabBar, props: TabViewProps) { tabBar.barTintColor = props.barTintColor tabBar.isTranslucent = props.translucent @@ -265,7 +218,7 @@ private func configureStandardAppearance(tabBar: UITabBar, props: TabViewProps) weight: props.fontWeight, inactiveTintColor: props.inactiveTintColor ) - + if let inactiveTintColor = props.inactiveTintColor { attributes[.foregroundColor] = inactiveTintColor } @@ -287,6 +240,7 @@ private func configureStandardAppearance(tabBar: UITabBar, props: TabViewProps) tabBar.scrollEdgeAppearance = appearance.copy() } } +#endif extension View { @ViewBuilder @@ -337,6 +291,7 @@ extension View { } } +#if !os(macOS) @ViewBuilder func configureAppearance(props: TabViewProps, tabBar: UITabBar?) -> some View { self @@ -365,12 +320,13 @@ extension View { updateTabBarAppearance(props: props, tabBar: tabBar) } } +#endif @ViewBuilder - func tintColor(_ color: UIColor?) -> some View { + func tintColor(_ color: PlatformColor?) -> some View { if let color { let color = Color(color) - if #available(iOS 16.0, tvOS 16.0, *) { + if #available(iOS 16.0, tvOS 16.0, macOS 13.0, *) { self.tint(color) } else { self.accentColor(color) @@ -384,7 +340,7 @@ extension View { // By default they are always filled. @ViewBuilder func noneSymbolVariant() -> some View { - if #available(iOS 15.0, tvOS 15.0, *) { + if #available(iOS 15.0, tvOS 15.0, macOS 13.0, *) { self .environment(\.symbolVariants, .none) } else { diff --git a/packages/react-native-bottom-tabs/ios/TabViewProps.swift b/packages/react-native-bottom-tabs/ios/TabViewProps.swift new file mode 100644 index 00000000..d5426bd6 --- /dev/null +++ b/packages/react-native-bottom-tabs/ios/TabViewProps.swift @@ -0,0 +1,34 @@ +import SwiftUI + +/** + Props that component accepts. SwiftUI view gets re-rendered when ObservableObject changes. + */ +class TabViewProps: ObservableObject { + @Published var children: [PlatformView] = [] + @Published var items: [TabInfo] = [] + @Published var selectedPage: String? + @Published var icons: [Int: PlatformImage] = [:] + @Published var sidebarAdaptable: Bool? + @Published var labeled: Bool? + @Published var scrollEdgeAppearance: String? + @Published var barTintColor: PlatformColor? + @Published var activeTintColor: PlatformColor? + @Published var inactiveTintColor: PlatformColor? + @Published var translucent: Bool = true + @Published var ignoresTopSafeArea: Bool = true + @Published var disablePageAnimations: Bool = false + @Published var hapticFeedbackEnabled: Bool = false + @Published var fontSize: Int? + @Published var fontFamily: String? + @Published var fontWeight: String? + + var selectedActiveTintColor: PlatformColor? { + if let selectedPage = selectedPage, + let tabData = items.findByKey(selectedPage), + let activeTintColor = tabData.activeTintColor { + return activeTintColor + } + + return activeTintColor + } +} diff --git a/packages/react-native-bottom-tabs/ios/TabViewProvider.swift b/packages/react-native-bottom-tabs/ios/TabViewProvider.swift index 79322418..daec61a5 100644 --- a/packages/react-native-bottom-tabs/ios/TabViewProvider.swift +++ b/packages/react-native-bottom-tabs/ios/TabViewProvider.swift @@ -10,7 +10,7 @@ public final class TabInfo: NSObject { public let title: String public let badge: String public let sfSymbol: String - public let activeTintColor: UIColor? + public let activeTintColor: PlatformColor? public let hidden: Bool public init( @@ -18,7 +18,7 @@ public final class TabInfo: NSObject { title: String, badge: String, sfSymbol: String, - activeTintColor: UIColor?, + activeTintColor: PlatformColor?, hidden: Bool ) { self.key = key @@ -38,10 +38,10 @@ public final class TabInfo: NSObject { func onLayout(size: CGSize, reactTag: NSNumber?) } -@objc public class TabViewProvider: UIView { +@objc public class TabViewProvider: PlatformView { private var delegate: TabViewProviderDelegate? private var props = TabViewProps() - private var hostingController: UIHostingController? + private var hostingController: PlatformHostingController? private var coalescingKey: UInt16 = 0 private var iconSize = CGSize(width: 27, height: 27) @@ -57,7 +57,7 @@ public final class TabInfo: NSObject { } } - @objc public var children: [UIView] = [] { + @objc public var children: [PlatformView] = [] { didSet { props.children = children } @@ -118,19 +118,19 @@ public final class TabInfo: NSObject { } } - @objc public var barTintColor: UIColor? { + @objc public var barTintColor: PlatformColor? { didSet { props.barTintColor = barTintColor } } - @objc public var activeTintColor: UIColor? { + @objc public var activeTintColor: PlatformColor? { didSet { props.activeTintColor = activeTintColor } } - @objc public var inactiveTintColor: UIColor? { + @objc public var inactiveTintColor: PlatformColor? { didSet { props.inactiveTintColor = inactiveTintColor } @@ -172,17 +172,24 @@ public final class TabInfo: NSObject { props.children = reactSubviews() } +#if os(macOS) + public override func layout() { + super.layout() + setupView() + } +#else public override func layoutSubviews() { super.layoutSubviews() setupView() } +#endif private func setupView() { if self.hostingController != nil { return } - self.hostingController = UIHostingController(rootView: TabViewImpl(props: props) { key in + self.hostingController = PlatformHostingController(rootView: TabViewImpl(props: props) { key in self.delegate?.onPageSelected(key: key, reactTag: self.reactTag) } onLongPress: { key in self.delegate?.onLongPress(key: key, reactTag: self.reactTag) @@ -197,7 +204,9 @@ public final class TabInfo: NSObject { addSubview(hostingController.view) hostingController.view.translatesAutoresizingMaskIntoConstraints = false hostingController.view.pinEdges(to: self) +#if !os(macOS) hostingController.didMove(toParent: parentViewController) +#endif } } diff --git a/packages/react-native-bottom-tabs/react-native-bottom-tabs.podspec b/packages/react-native-bottom-tabs/react-native-bottom-tabs.podspec index 9fc6ac04..cafd8e5e 100644 --- a/packages/react-native-bottom-tabs/react-native-bottom-tabs.podspec +++ b/packages/react-native-bottom-tabs/react-native-bottom-tabs.podspec @@ -12,7 +12,11 @@ Pod::Spec.new do |s| s.license = package["license"] s.authors = package["author"] - s.platforms = { :ios => "14.0", :visionos => "1.0", :tvos => "15.1" } + s.ios.deployment_target = "14.0" + s.visionos.deployment_target = "1.0" + s.tvos.deployment_target = "15.1" + s.osx.deployment_target = "11.0" + s.source = { :git => "https://github.com/okwasniewski/react-native-bottom-tabs.git", :tag => "#{s.version}" } s.source_files = "ios/**/*.{h,m,mm,cpp,swift}" diff --git a/turbo.json b/turbo.json index 9275846d..23cc65c6 100644 --- a/turbo.json +++ b/turbo.json @@ -73,6 +73,21 @@ ], "outputs": [] }, + "build:macos": { + "env": ["RCT_NEW_ARCH_ENABLED"], + "inputs": [ + "packages/*/package.json", + "packages/*/*.podspec", + "packages/*/ios", + "packages/*/src/*.ts", + "packages/*/src/*.tsx", + "apps/example/package.json", + "apps/example/macos", + "!apps/example/macos/build", + "!apps/example/macos/Pods" + ], + "outputs": [] + }, "build:ios-expo": { "env": ["RCT_NEW_ARCH_ENABLED"], "inputs": [ diff --git a/yarn.lock b/yarn.lock index dad7f9a7..76c2b60b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3935,6 +3935,23 @@ __metadata: languageName: node linkType: hard +"@react-native-mac/virtualized-lists@npm:0.75.0": + version: 0.75.0 + resolution: "@react-native-mac/virtualized-lists@npm:0.75.0" + dependencies: + invariant: ^2.2.4 + nullthrows: ^1.1.1 + peerDependencies: + "@types/react": ^18.2.6 + react: "*" + react-native: "*" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 69431eecfab184258723dfad1d7ed5e2f1c2e6b250198264239a90df9fb8c163c6fcff23a5183e7e9ff2abf903efc8964dc1b0c625b3a043049418c9448be612 + languageName: node + linkType: hard + "@react-native/assets-registry@npm:0.75.2": version: 0.75.2 resolution: "@react-native/assets-registry@npm:0.75.2" @@ -15619,8 +15636,9 @@ __metadata: react-native-bottom-tabs: "*" react-native-builder-bob: ^0.30.2 react-native-gesture-handler: ^2.21.2 + react-native-macos: ^0.75.0 react-native-paper: ^5.12.5 - react-native-safe-area-context: ^4.11.0 + react-native-safe-area-context: ^4.14.0 react-native-screens: 4.3.0 react-native-test-app: ^4.0.1 react-native-vector-icons: ^10.2.0 @@ -15740,6 +15758,62 @@ __metadata: languageName: node linkType: hard +"react-native-macos@npm:^0.75.0": + version: 0.75.16 + resolution: "react-native-macos@npm:0.75.16" + dependencies: + "@jest/create-cache-key-function": ^29.6.3 + "@react-native-community/cli": 14.1.0 + "@react-native-community/cli-platform-android": 14.1.0 + "@react-native-community/cli-platform-apple": 14.1.0 + "@react-native-community/cli-platform-ios": 14.1.0 + "@react-native-mac/virtualized-lists": 0.75.0 + "@react-native/assets-registry": 0.75.4 + "@react-native/codegen": 0.75.4 + "@react-native/community-cli-plugin": 0.75.4 + "@react-native/gradle-plugin": 0.75.4 + "@react-native/js-polyfills": 0.75.4 + "@react-native/normalize-colors": 0.75.4 + abort-controller: ^3.0.0 + anser: ^1.4.9 + ansi-regex: ^5.0.0 + base64-js: ^1.5.1 + chalk: ^4.0.0 + commander: ^9.4.1 + event-target-shim: ^5.0.1 + flow-enums-runtime: ^0.0.6 + glob: ^7.1.1 + invariant: ^2.2.4 + jest-environment-node: ^29.6.3 + jsc-android: ^250231.0.0 + memoize-one: ^5.0.0 + metro-runtime: ^0.80.3 + metro-source-map: ^0.80.3 + mkdirp: ^0.5.1 + nullthrows: ^1.1.1 + pretty-format: ^26.5.2 + promise: ^8.3.0 + react-devtools-core: ^5.3.1 + react-refresh: ^0.14.0 + regenerator-runtime: ^0.13.2 + scheduler: 0.24.0-canary-efb381bbf-20230505 + semver: ^7.1.3 + stacktrace-parser: ^0.1.10 + whatwg-fetch: ^3.0.0 + ws: ^6.2.3 + yargs: ^17.6.2 + peerDependencies: + "@types/react": ^18.2.6 + react: ^18.2.0 + peerDependenciesMeta: + "@types/react": + optional: true + bin: + react-native: cli.js + checksum: bdc79d33cd0d9da324575fa8b58ccdeb1b08d228bd21344a11287dc1df068a5e8e24e5bf68d4702ca52089ff5f67f77508c7953bf2f1ea8610f0ee453c33157d + languageName: node + linkType: hard + "react-native-paper@npm:^5.12.5": version: 5.12.5 resolution: "react-native-paper@npm:5.12.5" @@ -15766,7 +15840,7 @@ __metadata: languageName: node linkType: hard -"react-native-safe-area-context@npm:^4.11.0": +"react-native-safe-area-context@npm:^4.14.0": version: 4.14.0 resolution: "react-native-safe-area-context@npm:4.14.0" peerDependencies: