react-native-platform-components 1.4.0 → 1.5.0
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/PlatformComponents.podspec +1 -1
- package/README.md +33 -31
- package/android/src/main/java/com/platformcomponents/PCButtonGroupView.kt +175 -9
- package/android/src/main/java/com/platformcomponents/PCButtonGroupViewManager.kt +52 -2
- package/android/src/main/java/com/platformcomponents/PCButtonSupport.kt +44 -12
- package/android/src/main/java/com/platformcomponents/PCButtonView.kt +187 -5
- package/android/src/main/java/com/platformcomponents/PCButtonViewManager.kt +85 -7
- package/android/src/main/java/com/platformcomponents/PCContextMenuView.kt +41 -151
- package/android/src/main/java/com/platformcomponents/PCContextMenuViewManager.kt +7 -63
- package/android/src/main/java/com/platformcomponents/PCDatePickerView.kt +310 -115
- package/android/src/main/java/com/platformcomponents/PCDatePickerViewManager.kt +23 -3
- package/android/src/main/java/com/platformcomponents/PCExpressive.kt +6 -1
- package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonView.kt +485 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonViewManager.kt +109 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingToolbarView.kt +132 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingToolbarViewManager.kt +8 -0
- package/android/src/main/java/com/platformcomponents/PCHaptics.kt +46 -0
- package/android/src/main/java/com/platformcomponents/PCImageLoader.kt +42 -7
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerView.kt +32 -0
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerViewManager.kt +31 -0
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassView.kt +32 -6
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassViewManager.kt +4 -0
- package/android/src/main/java/com/platformcomponents/PCMenuSupport.kt +280 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationBarSupport.kt +332 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationRailView.kt +448 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationRailViewManager.kt +176 -0
- package/android/src/main/java/com/platformcomponents/PCSegmentedControlView.kt +24 -14
- package/android/src/main/java/com/platformcomponents/PCSegmentedControlViewManager.kt +14 -2
- package/android/src/main/java/com/platformcomponents/PCSelectionMenuView.kt +371 -39
- package/android/src/main/java/com/platformcomponents/PCSelectionMenuViewManager.kt +18 -4
- package/android/src/main/java/com/platformcomponents/PCTabBarView.kt +397 -0
- package/android/src/main/java/com/platformcomponents/PCTabBarViewManager.kt +182 -0
- package/android/src/main/java/com/platformcomponents/PCTextFieldView.kt +415 -40
- package/android/src/main/java/com/platformcomponents/PCTextFieldViewManager.kt +109 -3
- package/android/src/main/java/com/platformcomponents/PCThemeSupport.kt +37 -0
- package/android/src/main/java/com/platformcomponents/PlatformComponentsPackage.kt +4 -0
- package/android/src/main/res/drawable/pc_ic_search.xml +12 -0
- package/android/src/main/res/values/ids.xml +5 -0
- package/android/src/main/res/values/styles.xml +24 -0
- package/ios/PCButton.mm +122 -7
- package/ios/PCButtonGroup.mm +68 -1
- package/ios/PCButtonGroupView.swift +225 -6
- package/ios/PCButtonSupport.swift +181 -10
- package/ios/PCButtonView.swift +297 -14
- package/ios/PCConstants.swift +23 -2
- package/ios/PCContextMenu.mm +28 -110
- package/ios/PCContextMenu.swift +106 -167
- package/ios/PCDatePicker.mm +21 -9
- package/ios/PCDatePickerView.swift +94 -20
- package/ios/PCFloatingActionButton.h +10 -0
- package/ios/PCFloatingActionButton.mm +177 -0
- package/ios/PCFloatingActionButtonView.swift +426 -0
- package/ios/PCFloatingToolbar.mm +27 -0
- package/ios/PCFloatingToolbarView.swift +241 -0
- package/ios/PCHaptics.swift +91 -0
- package/ios/PCImageLoader.swift +76 -12
- package/ios/PCLiquidGlass.mm +36 -0
- package/ios/PCLiquidGlass.swift +221 -114
- package/ios/PCLiquidGlassContainer.h +10 -0
- package/ios/PCLiquidGlassContainer.mm +84 -0
- package/ios/PCLiquidGlassContainer.swift +69 -0
- package/ios/PCMenuItems.h +76 -0
- package/ios/PCMenuSupport.swift +350 -0
- package/ios/PCNavigationRail.h +10 -0
- package/ios/PCNavigationRail.mm +270 -0
- package/ios/PCNavigationRailView.swift +415 -0
- package/ios/PCSegmentedControl.mm +17 -2
- package/ios/PCSegmentedControl.swift +57 -7
- package/ios/PCSelectionMenu.mm +36 -8
- package/ios/PCSelectionMenu.swift +224 -48
- package/ios/PCTabBar.h +10 -0
- package/ios/PCTabBar.mm +285 -0
- package/ios/PCTabBarAccessory.h +10 -0
- package/ios/PCTabBarAccessory.mm +93 -0
- package/ios/PCTabBarAccessoryView.swift +96 -0
- package/ios/PCTabBarView.swift +671 -0
- package/ios/PCTextField.mm +159 -4
- package/ios/PCTextFieldView.swift +603 -57
- package/lib/commonjs/Button.js +73 -1
- package/lib/commonjs/Button.js.map +1 -1
- package/lib/commonjs/ButtonGroup.js +13 -3
- package/lib/commonjs/ButtonGroup.js.map +1 -1
- package/lib/commonjs/ButtonGroupNativeComponent.ts +74 -4
- package/lib/commonjs/ButtonNativeComponent.ts +119 -3
- package/lib/commonjs/ContextMenu.js +9 -48
- package/lib/commonjs/ContextMenu.js.map +1 -1
- package/lib/commonjs/ContextMenuNativeComponent.ts +47 -49
- package/lib/commonjs/DatePicker.js +98 -2
- package/lib/commonjs/DatePicker.js.map +1 -1
- package/lib/commonjs/DatePickerNativeComponent.ts +19 -2
- package/lib/commonjs/FloatingActionButton.js +60 -0
- package/lib/commonjs/FloatingActionButton.js.map +1 -0
- package/lib/commonjs/FloatingActionButtonNativeComponent.ts +58 -0
- package/lib/commonjs/FloatingToolbar.js +9 -1
- package/lib/commonjs/FloatingToolbar.js.map +1 -1
- package/lib/commonjs/FloatingToolbarNativeComponent.ts +16 -0
- package/lib/commonjs/LiquidGlass.js +7 -1
- package/lib/commonjs/LiquidGlass.js.map +1 -1
- package/lib/commonjs/LiquidGlassContainer.js +32 -0
- package/lib/commonjs/LiquidGlassContainer.js.map +1 -0
- package/lib/commonjs/LiquidGlassContainerNativeComponent.ts +17 -0
- package/lib/commonjs/LiquidGlassNativeComponent.ts +8 -0
- package/lib/commonjs/NavigationRail.js +104 -0
- package/lib/commonjs/NavigationRail.js.map +1 -0
- package/lib/commonjs/NavigationRailNativeComponent.ts +107 -0
- package/lib/commonjs/PlatformComponentsProvider.js +18 -0
- package/lib/commonjs/PlatformComponentsProvider.js.map +1 -0
- package/lib/commonjs/SegmentedControl.js +7 -0
- package/lib/commonjs/SegmentedControl.js.map +1 -1
- package/lib/commonjs/SegmentedControlNativeComponent.ts +11 -0
- package/lib/commonjs/SelectionMenu.js +27 -3
- package/lib/commonjs/SelectionMenu.js.map +1 -1
- package/lib/commonjs/SelectionMenuNativeComponent.ts +26 -4
- package/lib/commonjs/SplitButton.js +98 -0
- package/lib/commonjs/SplitButton.js.map +1 -0
- package/lib/commonjs/TabBar.js +203 -0
- package/lib/commonjs/TabBar.js.map +1 -0
- package/lib/commonjs/TabBarAccessoryNativeComponent.ts +19 -0
- package/lib/commonjs/TabBarNativeComponent.ts +145 -0
- package/lib/commonjs/TextField.js +171 -8
- package/lib/commonjs/TextField.js.map +1 -1
- package/lib/commonjs/TextFieldNativeComponent.ts +110 -4
- package/lib/commonjs/focusRegistry.js +2 -1
- package/lib/commonjs/focusRegistry.js.map +1 -1
- package/lib/commonjs/haptics.js +2 -0
- package/lib/commonjs/haptics.js.map +1 -0
- package/lib/commonjs/icons.js +15 -1
- package/lib/commonjs/icons.js.map +1 -1
- package/lib/commonjs/index.js +77 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +156 -92
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/jest.js +910 -0
- package/lib/commonjs/jest.js.map +1 -0
- package/lib/commonjs/menuItems.js +68 -0
- package/lib/commonjs/menuItems.js.map +1 -0
- package/lib/commonjs/selectionIdentifiers.js +18 -0
- package/lib/commonjs/selectionIdentifiers.js.map +1 -0
- package/lib/commonjs/submitBehavior.js +19 -0
- package/lib/commonjs/submitBehavior.js.map +1 -0
- package/lib/commonjs/tabItems.js +49 -0
- package/lib/commonjs/tabItems.js.map +1 -0
- package/lib/commonjs/web/Button.js +170 -0
- package/lib/commonjs/web/Button.js.map +1 -0
- package/lib/commonjs/web/ButtonGroup.js +119 -0
- package/lib/commonjs/web/ButtonGroup.js.map +1 -0
- package/lib/commonjs/web/DatePicker.js +168 -0
- package/lib/commonjs/web/DatePicker.js.map +1 -0
- package/lib/commonjs/web/DateRangePicker.js +137 -0
- package/lib/commonjs/web/DateRangePicker.js.map +1 -0
- package/lib/commonjs/web/Dialog.js +54 -0
- package/lib/commonjs/web/Dialog.js.map +1 -0
- package/lib/commonjs/web/FloatingActionButton.js +98 -0
- package/lib/commonjs/web/FloatingActionButton.js.map +1 -0
- package/lib/commonjs/web/Icon.js +34 -0
- package/lib/commonjs/web/Icon.js.map +1 -0
- package/lib/commonjs/web/NativeTheme.js +28 -0
- package/lib/commonjs/web/NativeTheme.js.map +1 -0
- package/lib/commonjs/web/NavigationRail.js +139 -0
- package/lib/commonjs/web/NavigationRail.js.map +1 -0
- package/lib/commonjs/web/PlatformComponentsProvider.js +51 -0
- package/lib/commonjs/web/PlatformComponentsProvider.js.map +1 -0
- package/lib/commonjs/web/SegmentedControl.js +117 -0
- package/lib/commonjs/web/SegmentedControl.js.map +1 -0
- package/lib/commonjs/web/SelectionMenu.js +142 -0
- package/lib/commonjs/web/SelectionMenu.js.map +1 -0
- package/lib/commonjs/web/SplitButton.js +35 -0
- package/lib/commonjs/web/SplitButton.js.map +1 -0
- package/lib/commonjs/web/TabBar.js +131 -0
- package/lib/commonjs/web/TabBar.js.map +1 -0
- package/lib/commonjs/web/TextField.js +322 -0
- package/lib/commonjs/web/TextField.js.map +1 -0
- package/lib/commonjs/web/components.js +36 -0
- package/lib/commonjs/web/components.js.map +1 -0
- package/lib/commonjs/web/containers.js +121 -0
- package/lib/commonjs/web/containers.js.map +1 -0
- package/lib/commonjs/web/dateInput.js +116 -0
- package/lib/commonjs/web/dateInput.js.map +1 -0
- package/lib/commonjs/web/shared.js +192 -0
- package/lib/commonjs/web/shared.js.map +1 -0
- package/lib/commonjs/webComponents.js +6 -0
- package/lib/commonjs/webComponents.js.map +1 -0
- package/lib/module/Button.js +74 -2
- package/lib/module/Button.js.map +1 -1
- package/lib/module/ButtonGroup.js +13 -3
- package/lib/module/ButtonGroup.js.map +1 -1
- package/lib/module/ButtonGroupNativeComponent.ts +74 -4
- package/lib/module/ButtonNativeComponent.ts +119 -3
- package/lib/module/ContextMenu.js +9 -48
- package/lib/module/ContextMenu.js.map +1 -1
- package/lib/module/ContextMenuNativeComponent.ts +47 -49
- package/lib/module/DatePicker.js +98 -4
- package/lib/module/DatePicker.js.map +1 -1
- package/lib/module/DatePickerNativeComponent.ts +19 -2
- package/lib/module/FloatingActionButton.js +53 -0
- package/lib/module/FloatingActionButton.js.map +1 -0
- package/lib/module/FloatingActionButtonNativeComponent.ts +58 -0
- package/lib/module/FloatingToolbar.js +9 -1
- package/lib/module/FloatingToolbar.js.map +1 -1
- package/lib/module/FloatingToolbarNativeComponent.ts +16 -0
- package/lib/module/LiquidGlass.js +7 -1
- package/lib/module/LiquidGlass.js.map +1 -1
- package/lib/module/LiquidGlassContainer.js +26 -0
- package/lib/module/LiquidGlassContainer.js.map +1 -0
- package/lib/module/LiquidGlassContainerNativeComponent.ts +17 -0
- package/lib/module/LiquidGlassNativeComponent.ts +8 -0
- package/lib/module/NavigationRail.js +99 -0
- package/lib/module/NavigationRail.js.map +1 -0
- package/lib/module/NavigationRailNativeComponent.ts +107 -0
- package/lib/module/PlatformComponentsProvider.js +13 -0
- package/lib/module/PlatformComponentsProvider.js.map +1 -0
- package/lib/module/SegmentedControl.js +9 -1
- package/lib/module/SegmentedControl.js.map +1 -1
- package/lib/module/SegmentedControlNativeComponent.ts +11 -0
- package/lib/module/SelectionMenu.js +27 -3
- package/lib/module/SelectionMenu.js.map +1 -1
- package/lib/module/SelectionMenuNativeComponent.ts +26 -4
- package/lib/module/SplitButton.js +91 -0
- package/lib/module/SplitButton.js.map +1 -0
- package/lib/module/TabBar.js +196 -0
- package/lib/module/TabBar.js.map +1 -0
- package/lib/module/TabBarAccessoryNativeComponent.ts +19 -0
- package/lib/module/TabBarNativeComponent.ts +145 -0
- package/lib/module/TextField.js +172 -9
- package/lib/module/TextField.js.map +1 -1
- package/lib/module/TextFieldNativeComponent.ts +110 -4
- package/lib/module/focusRegistry.js +1 -0
- package/lib/module/focusRegistry.js.map +1 -1
- package/lib/module/haptics.js +2 -0
- package/lib/module/haptics.js.map +1 -0
- package/lib/module/icons.js +15 -1
- package/lib/module/icons.js.map +1 -1
- package/lib/module/index.js +7 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +12 -87
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/jest.js +840 -0
- package/lib/module/jest.js.map +1 -0
- package/lib/module/menuItems.js +65 -0
- package/lib/module/menuItems.js.map +1 -0
- package/lib/module/selectionIdentifiers.js +14 -0
- package/lib/module/selectionIdentifiers.js.map +1 -0
- package/lib/module/submitBehavior.js +15 -0
- package/lib/module/submitBehavior.js.map +1 -0
- package/lib/module/tabItems.js +45 -0
- package/lib/module/tabItems.js.map +1 -0
- package/lib/module/web/Button.js +164 -0
- package/lib/module/web/Button.js.map +1 -0
- package/lib/module/web/ButtonGroup.js +113 -0
- package/lib/module/web/ButtonGroup.js.map +1 -0
- package/lib/module/web/DatePicker.js +162 -0
- package/lib/module/web/DatePicker.js.map +1 -0
- package/lib/module/web/DateRangePicker.js +131 -0
- package/lib/module/web/DateRangePicker.js.map +1 -0
- package/lib/module/web/Dialog.js +48 -0
- package/lib/module/web/Dialog.js.map +1 -0
- package/lib/module/web/FloatingActionButton.js +94 -0
- package/lib/module/web/FloatingActionButton.js.map +1 -0
- package/lib/module/web/Icon.js +29 -0
- package/lib/module/web/Icon.js.map +1 -0
- package/lib/module/web/NativeTheme.js +23 -0
- package/lib/module/web/NativeTheme.js.map +1 -0
- package/lib/module/web/NavigationRail.js +133 -0
- package/lib/module/web/NavigationRail.js.map +1 -0
- package/lib/module/web/PlatformComponentsProvider.js +44 -0
- package/lib/module/web/PlatformComponentsProvider.js.map +1 -0
- package/lib/module/web/SegmentedControl.js +112 -0
- package/lib/module/web/SegmentedControl.js.map +1 -0
- package/lib/module/web/SelectionMenu.js +137 -0
- package/lib/module/web/SelectionMenu.js.map +1 -0
- package/lib/module/web/SplitButton.js +30 -0
- package/lib/module/web/SplitButton.js.map +1 -0
- package/lib/module/web/TabBar.js +126 -0
- package/lib/module/web/TabBar.js.map +1 -0
- package/lib/module/web/TextField.js +316 -0
- package/lib/module/web/TextField.js.map +1 -0
- package/lib/module/web/components.js +33 -0
- package/lib/module/web/components.js.map +1 -0
- package/lib/module/web/containers.js +112 -0
- package/lib/module/web/containers.js.map +1 -0
- package/lib/module/web/dateInput.js +109 -0
- package/lib/module/web/dateInput.js.map +1 -0
- package/lib/module/web/shared.js +179 -0
- package/lib/module/web/shared.js.map +1 -0
- package/lib/module/webComponents.js +4 -0
- package/lib/module/webComponents.js.map +1 -0
- package/lib/typescript/commonjs/docs/sidebars.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/Button.d.ts +111 -3
- package/lib/typescript/commonjs/src/Button.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts +21 -6
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts +64 -3
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts +94 -3
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ContextMenu.d.ts +20 -33
- package/lib/typescript/commonjs/src/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts +45 -47
- package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DatePicker.d.ts +74 -1
- package/lib/typescript/commonjs/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts +16 -1
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/FloatingActionButton.d.ts +67 -0
- package/lib/typescript/commonjs/src/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts +43 -0
- package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingToolbar.d.ts +30 -0
- package/lib/typescript/commonjs/src/FloatingToolbar.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts +12 -0
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/LiquidGlass.d.ts +17 -0
- package/lib/typescript/commonjs/src/LiquidGlass.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts +27 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts +7 -0
- package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/NavigationRail.d.ts +86 -0
- package/lib/typescript/commonjs/src/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts +81 -0
- package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts +6 -0
- package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/SegmentedControl.d.ts +18 -1
- package/lib/typescript/commonjs/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts +9 -0
- package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SelectionMenu.d.ts +44 -2
- package/lib/typescript/commonjs/src/SelectionMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts +20 -4
- package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SplitButton.d.ts +83 -0
- package/lib/typescript/commonjs/src/SplitButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBar.d.ts +144 -0
- package/lib/typescript/commonjs/src/TabBar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts +13 -0
- package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts +110 -0
- package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TextField.d.ts +166 -8
- package/lib/typescript/commonjs/src/TextField.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts +81 -3
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/focusRegistry.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/haptics.d.ts +20 -0
- package/lib/typescript/commonjs/src/haptics.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/icons.d.ts +7 -1
- package/lib/typescript/commonjs/src/icons.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +7 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.web.d.ts +25 -254
- package/lib/typescript/commonjs/src/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/jest.d.ts +139 -0
- package/lib/typescript/commonjs/src/jest.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/menuItems.d.ts +100 -0
- package/lib/typescript/commonjs/src/menuItems.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts +3 -0
- package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/submitBehavior.d.ts +9 -0
- package/lib/typescript/commonjs/src/submitBehavior.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/tabItems.d.ts +55 -0
- package/lib/typescript/commonjs/src/tabItems.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Button.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/Button.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts +11 -0
- package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/DatePicker.d.ts +14 -0
- package/lib/typescript/commonjs/src/web/DatePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts +11 -0
- package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Dialog.d.ts +12 -0
- package/lib/typescript/commonjs/src/web/Dialog.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Icon.d.ts +12 -0
- package/lib/typescript/commonjs/src/web/Icon.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/NativeTheme.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/NativeTheme.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/NavigationRail.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SplitButton.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/SplitButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/TabBar.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/TabBar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/TextField.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/TextField.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/components.d.ts +17 -0
- package/lib/typescript/commonjs/src/web/components.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/containers.d.ts +24 -0
- package/lib/typescript/commonjs/src/web/containers.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/dateInput.d.ts +20 -0
- package/lib/typescript/commonjs/src/web/dateInput.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/shared.d.ts +43 -0
- package/lib/typescript/commonjs/src/web/shared.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/webComponents.d.ts +43 -0
- package/lib/typescript/commonjs/src/webComponents.d.ts.map +1 -0
- package/lib/typescript/module/docs/sidebars.d.ts.map +1 -1
- package/lib/typescript/module/src/Button.d.ts +111 -3
- package/lib/typescript/module/src/Button.d.ts.map +1 -1
- package/lib/typescript/module/src/ButtonGroup.d.ts +21 -6
- package/lib/typescript/module/src/ButtonGroup.d.ts.map +1 -1
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts +64 -3
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts +94 -3
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/ContextMenu.d.ts +20 -33
- package/lib/typescript/module/src/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts +45 -47
- package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePicker.d.ts +74 -1
- package/lib/typescript/module/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts +16 -1
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/FloatingActionButton.d.ts +67 -0
- package/lib/typescript/module/src/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts +43 -0
- package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingToolbar.d.ts +30 -0
- package/lib/typescript/module/src/FloatingToolbar.d.ts.map +1 -1
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts +12 -0
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/LiquidGlass.d.ts +17 -0
- package/lib/typescript/module/src/LiquidGlass.d.ts.map +1 -1
- package/lib/typescript/module/src/LiquidGlassContainer.d.ts +27 -0
- package/lib/typescript/module/src/LiquidGlassContainer.d.ts.map +1 -0
- package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
- package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts +7 -0
- package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/NavigationRail.d.ts +86 -0
- package/lib/typescript/module/src/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts +81 -0
- package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/PlatformComponentsProvider.d.ts +6 -0
- package/lib/typescript/module/src/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/SegmentedControl.d.ts +18 -1
- package/lib/typescript/module/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts +9 -0
- package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/SelectionMenu.d.ts +44 -2
- package/lib/typescript/module/src/SelectionMenu.d.ts.map +1 -1
- package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts +20 -4
- package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/SplitButton.d.ts +83 -0
- package/lib/typescript/module/src/SplitButton.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBar.d.ts +144 -0
- package/lib/typescript/module/src/TabBar.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts +13 -0
- package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBarNativeComponent.d.ts +110 -0
- package/lib/typescript/module/src/TabBarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/TextField.d.ts +166 -8
- package/lib/typescript/module/src/TextField.d.ts.map +1 -1
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts +81 -3
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/focusRegistry.d.ts.map +1 -1
- package/lib/typescript/module/src/haptics.d.ts +20 -0
- package/lib/typescript/module/src/haptics.d.ts.map +1 -0
- package/lib/typescript/module/src/icons.d.ts +7 -1
- package/lib/typescript/module/src/icons.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +7 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/index.web.d.ts +25 -254
- package/lib/typescript/module/src/index.web.d.ts.map +1 -1
- package/lib/typescript/module/src/jest.d.ts +139 -0
- package/lib/typescript/module/src/jest.d.ts.map +1 -0
- package/lib/typescript/module/src/menuItems.d.ts +100 -0
- package/lib/typescript/module/src/menuItems.d.ts.map +1 -0
- package/lib/typescript/module/src/selectionIdentifiers.d.ts +3 -0
- package/lib/typescript/module/src/selectionIdentifiers.d.ts.map +1 -0
- package/lib/typescript/module/src/submitBehavior.d.ts +9 -0
- package/lib/typescript/module/src/submitBehavior.d.ts.map +1 -0
- package/lib/typescript/module/src/tabItems.d.ts +55 -0
- package/lib/typescript/module/src/tabItems.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Button.d.ts +9 -0
- package/lib/typescript/module/src/web/Button.d.ts.map +1 -0
- package/lib/typescript/module/src/web/ButtonGroup.d.ts +11 -0
- package/lib/typescript/module/src/web/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/module/src/web/DatePicker.d.ts +14 -0
- package/lib/typescript/module/src/web/DatePicker.d.ts.map +1 -0
- package/lib/typescript/module/src/web/DateRangePicker.d.ts +11 -0
- package/lib/typescript/module/src/web/DateRangePicker.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Dialog.d.ts +12 -0
- package/lib/typescript/module/src/web/Dialog.d.ts.map +1 -0
- package/lib/typescript/module/src/web/FloatingActionButton.d.ts +8 -0
- package/lib/typescript/module/src/web/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Icon.d.ts +12 -0
- package/lib/typescript/module/src/web/Icon.d.ts.map +1 -0
- package/lib/typescript/module/src/web/NativeTheme.d.ts +10 -0
- package/lib/typescript/module/src/web/NativeTheme.d.ts.map +1 -0
- package/lib/typescript/module/src/web/NavigationRail.d.ts +8 -0
- package/lib/typescript/module/src/web/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts +10 -0
- package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SegmentedControl.d.ts +8 -0
- package/lib/typescript/module/src/web/SegmentedControl.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SelectionMenu.d.ts +10 -0
- package/lib/typescript/module/src/web/SelectionMenu.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SplitButton.d.ts +9 -0
- package/lib/typescript/module/src/web/SplitButton.d.ts.map +1 -0
- package/lib/typescript/module/src/web/TabBar.d.ts +9 -0
- package/lib/typescript/module/src/web/TabBar.d.ts.map +1 -0
- package/lib/typescript/module/src/web/TextField.d.ts +9 -0
- package/lib/typescript/module/src/web/TextField.d.ts.map +1 -0
- package/lib/typescript/module/src/web/components.d.ts +17 -0
- package/lib/typescript/module/src/web/components.d.ts.map +1 -0
- package/lib/typescript/module/src/web/containers.d.ts +24 -0
- package/lib/typescript/module/src/web/containers.d.ts.map +1 -0
- package/lib/typescript/module/src/web/dateInput.d.ts +20 -0
- package/lib/typescript/module/src/web/dateInput.d.ts.map +1 -0
- package/lib/typescript/module/src/web/shared.d.ts +43 -0
- package/lib/typescript/module/src/web/shared.d.ts.map +1 -0
- package/lib/typescript/module/src/webComponents.d.ts +43 -0
- package/lib/typescript/module/src/webComponents.d.ts.map +1 -0
- package/package.json +32 -2
- package/plugin/build/index.d.ts +3 -2
- package/plugin/build/index.d.ts.map +1 -1
- package/react-native.config.js +3 -0
- package/shared/PCFloatingActionButtonComponentDescriptors-custom.h +22 -0
- package/shared/PCFloatingActionButtonShadowNode-custom.cpp +48 -0
- package/shared/PCFloatingActionButtonShadowNode-custom.h +54 -0
- package/shared/PCFloatingActionButtonState-custom.h +61 -0
- package/shared/PCNavigationRailComponentDescriptors-custom.h +47 -0
- package/shared/PCNavigationRailShadowNode-custom.h +42 -0
- package/shared/PCNavigationRailState-custom.h +62 -0
- package/shared/PCTabBarComponentDescriptors-custom.h +22 -0
- package/shared/PCTabBarShadowNode-custom.cpp +54 -0
- package/shared/PCTabBarShadowNode-custom.h +54 -0
- package/shared/PCTabBarState-custom.h +62 -0
- package/shared/react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h +3 -0
- package/src/Button.tsx +222 -7
- package/src/ButtonGroup.tsx +29 -11
- package/src/ButtonGroupNativeComponent.ts +74 -4
- package/src/ButtonNativeComponent.ts +119 -3
- package/src/ContextMenu.tsx +34 -81
- package/src/ContextMenuNativeComponent.ts +47 -49
- package/src/DatePicker.tsx +182 -4
- package/src/DatePickerNativeComponent.ts +19 -2
- package/src/FloatingActionButton.tsx +121 -0
- package/src/FloatingActionButtonNativeComponent.ts +58 -0
- package/src/FloatingToolbar.tsx +54 -3
- package/src/FloatingToolbarNativeComponent.ts +16 -0
- package/src/LiquidGlass.tsx +24 -1
- package/src/LiquidGlassContainer.tsx +42 -0
- package/src/LiquidGlassContainerNativeComponent.ts +17 -0
- package/src/LiquidGlassNativeComponent.ts +8 -0
- package/src/NavigationRail.tsx +203 -0
- package/src/NavigationRailNativeComponent.ts +107 -0
- package/src/PlatformComponentsProvider.tsx +15 -0
- package/src/SegmentedControl.tsx +31 -1
- package/src/SegmentedControlNativeComponent.ts +11 -0
- package/src/SelectionMenu.tsx +81 -6
- package/src/SelectionMenuNativeComponent.ts +26 -4
- package/src/SplitButton.tsx +198 -0
- package/src/TabBar.tsx +373 -0
- package/src/TabBarAccessoryNativeComponent.ts +19 -0
- package/src/TabBarNativeComponent.ts +145 -0
- package/src/TextField.tsx +428 -14
- package/src/TextFieldNativeComponent.ts +110 -4
- package/src/focusRegistry.ts +1 -0
- package/src/haptics.ts +31 -0
- package/src/icons.ts +28 -1
- package/src/index.tsx +7 -0
- package/src/index.web.tsx +51 -391
- package/src/jest.tsx +958 -0
- package/src/menuItems.ts +152 -0
- package/src/selectionIdentifiers.ts +17 -0
- package/src/submitBehavior.ts +16 -0
- package/src/tabItems.ts +113 -0
- package/src/web/Button.tsx +201 -0
- package/src/web/ButtonGroup.tsx +154 -0
- package/src/web/DatePicker.tsx +204 -0
- package/src/web/DateRangePicker.tsx +135 -0
- package/src/web/Dialog.tsx +54 -0
- package/src/web/FloatingActionButton.tsx +76 -0
- package/src/web/Icon.tsx +33 -0
- package/src/web/NativeTheme.ts +23 -0
- package/src/web/NavigationRail.tsx +148 -0
- package/src/web/PlatformComponentsProvider.tsx +48 -0
- package/src/web/SegmentedControl.tsx +127 -0
- package/src/web/SelectionMenu.tsx +149 -0
- package/src/web/SplitButton.tsx +32 -0
- package/src/web/TabBar.tsx +150 -0
- package/src/web/TextField.tsx +361 -0
- package/src/web/components.tsx +71 -0
- package/src/web/containers.tsx +130 -0
- package/src/web/dateInput.ts +137 -0
- package/src/web/shared.ts +176 -0
- package/src/webComponents.ts +45 -0
- package/android/src/main/java/com/platformcomponents/DateConstraints.kt +0 -83
|
@@ -3,6 +3,11 @@ import UIKit
|
|
|
3
3
|
/// The floating toolbar container: a Liquid Glass capsule on iOS 26, and a
|
|
4
4
|
/// blur-material capsule with a soft shadow on earlier versions, where a blur
|
|
5
5
|
/// over a flat background would otherwise have no edge.
|
|
6
|
+
///
|
|
7
|
+
/// Linked to a ScrollView (by nativeID), it sits on one of its edges: on iOS
|
|
8
|
+
/// 26 that edge's scroll edge effect takes the toolbar's shape and the style
|
|
9
|
+
/// asked for, and with hideOnScroll the toolbar slides past the edge while
|
|
10
|
+
/// the content scrolls down.
|
|
6
11
|
@objcMembers
|
|
7
12
|
public final class PCFloatingToolbarView: UIView {
|
|
8
13
|
// MARK: - Props (set from ObjC++)
|
|
@@ -17,6 +22,30 @@ public final class PCFloatingToolbarView: UIView {
|
|
|
17
22
|
didSet { applyEffect() }
|
|
18
23
|
}
|
|
19
24
|
|
|
25
|
+
/// iOS 26: glass that scales and shimmers under a touch
|
|
26
|
+
public var interactive: Bool = false {
|
|
27
|
+
didSet { if oldValue != interactive { applyEffect() } }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// nativeID of the ScrollView the toolbar floats over
|
|
31
|
+
public var scrollViewNativeID: String = "" {
|
|
32
|
+
didSet { if oldValue != scrollViewNativeID { unlinkScrollView(); linkScrollView() } }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// iOS 26 edge effect under the toolbar: "" (the scroll view's own) |
|
|
36
|
+
/// "automatic" | "soft" | "hard" | "hidden"
|
|
37
|
+
public var scrollEdgeEffect: String = "" {
|
|
38
|
+
didSet { if oldValue != scrollEdgeEffect { applyScrollEdge() } }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// Slide past the scroll view's edge while its content scrolls down
|
|
42
|
+
public var hideOnScroll: Bool = false {
|
|
43
|
+
didSet { if !hideOnScroll { setScrollHidden(false) } }
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// Whether the toolbar is slid away (the host passes touches through)
|
|
47
|
+
public private(set) var isScrollHidden = false
|
|
48
|
+
|
|
20
49
|
/// React children mount here
|
|
21
50
|
public var contentView: UIView { effectView.contentView }
|
|
22
51
|
|
|
@@ -24,6 +53,17 @@ public final class PCFloatingToolbarView: UIView {
|
|
|
24
53
|
|
|
25
54
|
private let effectView = UIVisualEffectView(effect: nil)
|
|
26
55
|
|
|
56
|
+
/// The linked scroll view, its offset observation and the edge the
|
|
57
|
+
/// toolbar sits on
|
|
58
|
+
private weak var linkedScrollView: UIScrollView?
|
|
59
|
+
private var offsetObservation: NSKeyValueObservation?
|
|
60
|
+
private var linkedEdge: UIRectEdge = .bottom
|
|
61
|
+
|
|
62
|
+
/// iOS 26: the UIScrollEdgeElementContainerInteraction on this view, and
|
|
63
|
+
/// the edge effect values it replaced (edge, style, isHidden)
|
|
64
|
+
private var edgeInteraction: UIInteraction?
|
|
65
|
+
private var savedEdgeEffect: (edge: UIRectEdge, style: AnyObject, hidden: Bool)?
|
|
66
|
+
|
|
27
67
|
/// Liquid Glass needs both the iOS 26 SDK at build time and iOS 26 at runtime.
|
|
28
68
|
private static var glassAvailable: Bool {
|
|
29
69
|
#if compiler(>=6.2)
|
|
@@ -70,6 +110,24 @@ public final class PCFloatingToolbarView: UIView {
|
|
|
70
110
|
if !Self.glassAvailable {
|
|
71
111
|
layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: radius).cgPath
|
|
72
112
|
}
|
|
113
|
+
// The ScrollView may mount after the toolbar, and the toolbar may
|
|
114
|
+
// move to another edge
|
|
115
|
+
if let scrollView = linkedScrollView, scrollView.window != nil {
|
|
116
|
+
if edge(of: scrollView) != linkedEdge { applyScrollEdge() }
|
|
117
|
+
} else {
|
|
118
|
+
unlinkScrollView()
|
|
119
|
+
linkScrollView()
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public override func didMoveToWindow() {
|
|
124
|
+
super.didMoveToWindow()
|
|
125
|
+
// Off screen, the scroll view gets its edge effect back
|
|
126
|
+
if window == nil {
|
|
127
|
+
unlinkScrollView()
|
|
128
|
+
} else {
|
|
129
|
+
linkScrollView()
|
|
130
|
+
}
|
|
73
131
|
}
|
|
74
132
|
|
|
75
133
|
// MARK: - Effect
|
|
@@ -78,6 +136,7 @@ public final class PCFloatingToolbarView: UIView {
|
|
|
78
136
|
#if compiler(>=6.2)
|
|
79
137
|
if #available(iOS 26.0, *) {
|
|
80
138
|
let glass = UIGlassEffect(style: effectStyle == "clear" ? .clear : .regular)
|
|
139
|
+
glass.isInteractive = interactive
|
|
81
140
|
if let tintUIColor {
|
|
82
141
|
glass.tintColor = tintUIColor
|
|
83
142
|
}
|
|
@@ -92,4 +151,186 @@ public final class PCFloatingToolbarView: UIView {
|
|
|
92
151
|
// UIBlurEffect has no tint; wash the content area with the color instead
|
|
93
152
|
effectView.contentView.backgroundColor = tintUIColor?.withAlphaComponent(0.35)
|
|
94
153
|
}
|
|
154
|
+
|
|
155
|
+
// MARK: - Linked scroll view
|
|
156
|
+
|
|
157
|
+
private func linkScrollView() {
|
|
158
|
+
guard linkedScrollView == nil, !scrollViewNativeID.isEmpty, let window,
|
|
159
|
+
let scrollView = Self.scrollView(nativeID: scrollViewNativeID, in: window)
|
|
160
|
+
else { return }
|
|
161
|
+
linkedScrollView = scrollView
|
|
162
|
+
offsetObservation = scrollView.observe(\.contentOffset, options: [.old, .new]) { [weak self] scrollView, change in
|
|
163
|
+
guard let old = change.oldValue, let new = change.newValue else { return }
|
|
164
|
+
self?.contentScrolled(scrollView, from: old, to: new)
|
|
165
|
+
}
|
|
166
|
+
applyScrollEdge()
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private func unlinkScrollView() {
|
|
170
|
+
guard linkedScrollView != nil || offsetObservation != nil || edgeInteraction != nil else { return }
|
|
171
|
+
offsetObservation?.invalidate()
|
|
172
|
+
offsetObservation = nil
|
|
173
|
+
restoreScrollEdge()
|
|
174
|
+
#if compiler(>=6.2)
|
|
175
|
+
if #available(iOS 26.0, *), let edgeInteraction {
|
|
176
|
+
removeInteraction(edgeInteraction)
|
|
177
|
+
}
|
|
178
|
+
#endif
|
|
179
|
+
edgeInteraction = nil
|
|
180
|
+
linkedScrollView = nil
|
|
181
|
+
setScrollHidden(false)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/// The edge of the scroll view the toolbar sits on: top or bottom for a
|
|
185
|
+
/// horizontal toolbar, left or right for a vertical one.
|
|
186
|
+
private func edge(of scrollView: UIScrollView) -> UIRectEdge {
|
|
187
|
+
// The host, not this view, which moves while hidden
|
|
188
|
+
let host = superview ?? self
|
|
189
|
+
let toolbar = host.convert(host.bounds, to: nil)
|
|
190
|
+
let visible = scrollView.convert(scrollView.bounds, to: nil)
|
|
191
|
+
if toolbar.width >= toolbar.height {
|
|
192
|
+
return toolbar.midY < visible.midY ? .top : .bottom
|
|
193
|
+
}
|
|
194
|
+
return toolbar.midX < visible.midX ? .left : .right
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/// The UIScrollView of the React Native view with this nativeID.
|
|
198
|
+
private static func scrollView(nativeID: String, in root: UIView) -> UIScrollView? {
|
|
199
|
+
var match: UIView?
|
|
200
|
+
func find(_ view: UIView) {
|
|
201
|
+
guard match == nil else { return }
|
|
202
|
+
if view.responds(to: NSSelectorFromString("nativeId")),
|
|
203
|
+
view.value(forKey: "nativeId") as? String == nativeID {
|
|
204
|
+
match = view
|
|
205
|
+
return
|
|
206
|
+
}
|
|
207
|
+
view.subviews.forEach(find)
|
|
208
|
+
}
|
|
209
|
+
find(root)
|
|
210
|
+
guard let match else { return nil }
|
|
211
|
+
if let scroll = match as? UIScrollView { return scroll }
|
|
212
|
+
var scroll: UIScrollView?
|
|
213
|
+
func firstScroll(_ view: UIView) {
|
|
214
|
+
guard scroll == nil else { return }
|
|
215
|
+
if let s = view as? UIScrollView { scroll = s; return }
|
|
216
|
+
view.subviews.forEach(firstScroll)
|
|
217
|
+
}
|
|
218
|
+
firstScroll(match)
|
|
219
|
+
return scroll
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// MARK: - Scroll edge effect (iOS 26)
|
|
223
|
+
|
|
224
|
+
/// Shapes the linked edge's effect around the toolbar and applies the
|
|
225
|
+
/// style asked for, after giving back what an earlier call replaced.
|
|
226
|
+
private func applyScrollEdge() {
|
|
227
|
+
restoreScrollEdge()
|
|
228
|
+
guard let scrollView = linkedScrollView else { return }
|
|
229
|
+
linkedEdge = edge(of: scrollView)
|
|
230
|
+
#if compiler(>=6.2)
|
|
231
|
+
guard #available(iOS 26.0, *) else { return }
|
|
232
|
+
|
|
233
|
+
let interaction = edgeInteraction as? UIScrollEdgeElementContainerInteraction
|
|
234
|
+
?? UIScrollEdgeElementContainerInteraction()
|
|
235
|
+
if edgeInteraction == nil {
|
|
236
|
+
addInteraction(interaction)
|
|
237
|
+
edgeInteraction = interaction
|
|
238
|
+
}
|
|
239
|
+
interaction.scrollView = scrollView
|
|
240
|
+
interaction.edge = linkedEdge
|
|
241
|
+
|
|
242
|
+
guard !scrollEdgeEffect.isEmpty else { return }
|
|
243
|
+
let effect = Self.edgeEffect(of: scrollView, at: linkedEdge)
|
|
244
|
+
savedEdgeEffect = (linkedEdge, effect.style, effect.isHidden)
|
|
245
|
+
switch scrollEdgeEffect {
|
|
246
|
+
case "hidden":
|
|
247
|
+
effect.isHidden = true
|
|
248
|
+
case "soft":
|
|
249
|
+
effect.style = .soft
|
|
250
|
+
effect.isHidden = false
|
|
251
|
+
case "hard":
|
|
252
|
+
effect.style = .hard
|
|
253
|
+
effect.isHidden = false
|
|
254
|
+
default:
|
|
255
|
+
effect.style = .automatic
|
|
256
|
+
effect.isHidden = false
|
|
257
|
+
}
|
|
258
|
+
#endif
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/// Gives the scroll view back the edge effect values applyScrollEdge
|
|
262
|
+
/// replaced.
|
|
263
|
+
private func restoreScrollEdge() {
|
|
264
|
+
#if compiler(>=6.2)
|
|
265
|
+
if #available(iOS 26.0, *), let saved = savedEdgeEffect, let scrollView = linkedScrollView,
|
|
266
|
+
let style = saved.style as? UIScrollEdgeEffect.Style {
|
|
267
|
+
let effect = Self.edgeEffect(of: scrollView, at: saved.edge)
|
|
268
|
+
effect.style = style
|
|
269
|
+
effect.isHidden = saved.hidden
|
|
270
|
+
}
|
|
271
|
+
#endif
|
|
272
|
+
savedEdgeEffect = nil
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
#if compiler(>=6.2)
|
|
276
|
+
@available(iOS 26.0, *)
|
|
277
|
+
private static func edgeEffect(of scrollView: UIScrollView, at edge: UIRectEdge) -> UIScrollEdgeEffect {
|
|
278
|
+
switch edge {
|
|
279
|
+
case .top: return scrollView.topEdgeEffect
|
|
280
|
+
case .left: return scrollView.leftEdgeEffect
|
|
281
|
+
case .right: return scrollView.rightEdgeEffect
|
|
282
|
+
default: return scrollView.bottomEdgeEffect
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
#endif
|
|
286
|
+
|
|
287
|
+
// MARK: - Hide on scroll
|
|
288
|
+
|
|
289
|
+
// The motion of Material's HideViewOnScrollBehavior, as TabBar uses on
|
|
290
|
+
// Android: out while the content scrolls down, back as it scrolls up or
|
|
291
|
+
// reaches the top.
|
|
292
|
+
private func contentScrolled(_ scrollView: UIScrollView, from old: CGPoint, to new: CGPoint) {
|
|
293
|
+
guard hideOnScroll else { return }
|
|
294
|
+
let top = -scrollView.adjustedContentInset.top
|
|
295
|
+
if new.y <= top {
|
|
296
|
+
setScrollHidden(false)
|
|
297
|
+
return
|
|
298
|
+
}
|
|
299
|
+
// Rubber-banding past the end doesn't scroll the content
|
|
300
|
+
let bottom = max(top, scrollView.contentSize.height + scrollView.adjustedContentInset.bottom - scrollView.bounds.height)
|
|
301
|
+
guard new.y != old.y, new.y <= bottom, old.y <= bottom else { return }
|
|
302
|
+
setScrollHidden(new.y > old.y)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
private func setScrollHidden(_ hide: Bool) {
|
|
306
|
+
guard isScrollHidden != hide else { return }
|
|
307
|
+
isScrollHidden = hide
|
|
308
|
+
let offset = hide ? hiddenOffset() : .zero
|
|
309
|
+
UIView.animate(
|
|
310
|
+
withDuration: hide ? 0.175 : 0.225,
|
|
311
|
+
delay: 0,
|
|
312
|
+
options: [hide ? .curveEaseIn : .curveEaseOut, .beginFromCurrentState, .allowUserInteraction]
|
|
313
|
+
) {
|
|
314
|
+
self.transform = CGAffineTransform(translationX: offset.x, y: offset.y)
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/// How far to move to get past the linked edge: from the toolbar to the
|
|
319
|
+
/// edge of the visible scroll view, and at least the toolbar's own size.
|
|
320
|
+
private func hiddenOffset() -> CGPoint {
|
|
321
|
+
guard let scrollView = linkedScrollView else { return .zero }
|
|
322
|
+
let host = superview ?? self
|
|
323
|
+
let toolbar = host.convert(host.bounds, to: nil)
|
|
324
|
+
let visible = scrollView.convert(scrollView.bounds, to: nil)
|
|
325
|
+
switch linkedEdge {
|
|
326
|
+
case .top:
|
|
327
|
+
return CGPoint(x: 0, y: min(visible.minY - toolbar.maxY, -toolbar.height))
|
|
328
|
+
case .left:
|
|
329
|
+
return CGPoint(x: min(visible.minX - toolbar.maxX, -toolbar.width), y: 0)
|
|
330
|
+
case .right:
|
|
331
|
+
return CGPoint(x: max(visible.maxX - toolbar.minX, toolbar.width), y: 0)
|
|
332
|
+
default:
|
|
333
|
+
return CGPoint(x: 0, y: max(visible.maxY - toolbar.minY, toolbar.height))
|
|
334
|
+
}
|
|
335
|
+
}
|
|
95
336
|
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import UIKit
|
|
2
|
+
|
|
3
|
+
/// The shared `haptics` prop: a UIKit feedback generator played when a
|
|
4
|
+
/// control reports the user's action. Each view keeps one of these; a
|
|
5
|
+
/// generator is created on first use of its kind (attached to the view on
|
|
6
|
+
/// iOS 17.5+) and kept. UIKit follows the system haptics setting.
|
|
7
|
+
@objcMembers
|
|
8
|
+
@MainActor
|
|
9
|
+
public final class PCHaptics: NSObject {
|
|
10
|
+
/// "" (unset) | "none" | "selection" | "light" | "medium" | "heavy" |
|
|
11
|
+
/// "success" | "warning" | "error". "" and "none" play nothing: UIKit has
|
|
12
|
+
/// no switch for the haptics its own controls play.
|
|
13
|
+
public var kind: String = ""
|
|
14
|
+
|
|
15
|
+
/// Generators by kind, created on first use.
|
|
16
|
+
private var generators: [String: UIFeedbackGenerator] = [:]
|
|
17
|
+
|
|
18
|
+
/// Readies the Taptic Engine for an action that is likely to follow, such
|
|
19
|
+
/// as a touch down, so the haptic plays without delay.
|
|
20
|
+
public func prepare(in view: UIView) {
|
|
21
|
+
generator(for: kind, in: view)?.prepare()
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/// Plays the haptic for `kind`.
|
|
25
|
+
public func perform(in view: UIView) {
|
|
26
|
+
play(kind, in: view)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/// Plays `override` when it is set (a menu item's own `haptics`, "none"
|
|
30
|
+
/// included), else `kind`.
|
|
31
|
+
public func perform(in view: UIView, override: String) {
|
|
32
|
+
play(override.isEmpty ? kind : override, in: view)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private func play(_ kind: String, in view: UIView) {
|
|
36
|
+
switch generator(for: kind, in: view) {
|
|
37
|
+
case let selection as UISelectionFeedbackGenerator:
|
|
38
|
+
selection.selectionChanged()
|
|
39
|
+
case let impact as UIImpactFeedbackGenerator:
|
|
40
|
+
impact.impactOccurred()
|
|
41
|
+
case let notification as UINotificationFeedbackGenerator:
|
|
42
|
+
if case let .notification(type) = Feedback(kind) {
|
|
43
|
+
notification.notificationOccurred(type)
|
|
44
|
+
}
|
|
45
|
+
default:
|
|
46
|
+
break
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private enum Feedback {
|
|
51
|
+
case selection
|
|
52
|
+
case impact(UIImpactFeedbackGenerator.FeedbackStyle)
|
|
53
|
+
case notification(UINotificationFeedbackGenerator.FeedbackType)
|
|
54
|
+
|
|
55
|
+
init?(_ kind: String) {
|
|
56
|
+
switch kind {
|
|
57
|
+
case "selection": self = .selection
|
|
58
|
+
case "light": self = .impact(.light)
|
|
59
|
+
case "medium": self = .impact(.medium)
|
|
60
|
+
case "heavy": self = .impact(.heavy)
|
|
61
|
+
case "success": self = .notification(.success)
|
|
62
|
+
case "warning": self = .notification(.warning)
|
|
63
|
+
case "error": self = .notification(.error)
|
|
64
|
+
default: return nil
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private func generator(for kind: String, in view: UIView) -> UIFeedbackGenerator? {
|
|
70
|
+
if let generator = generators[kind] { return generator }
|
|
71
|
+
guard let feedback = Feedback(kind) else { return nil }
|
|
72
|
+
let made: UIFeedbackGenerator
|
|
73
|
+
if #available(iOS 17.5, *) {
|
|
74
|
+
// Attached to the view: UIKit's replacement for the plain
|
|
75
|
+
// initializers, which are slated for deprecation
|
|
76
|
+
switch feedback {
|
|
77
|
+
case .selection: made = UISelectionFeedbackGenerator(view: view)
|
|
78
|
+
case let .impact(style): made = UIImpactFeedbackGenerator(style: style, view: view)
|
|
79
|
+
case .notification: made = UINotificationFeedbackGenerator(view: view)
|
|
80
|
+
}
|
|
81
|
+
} else {
|
|
82
|
+
switch feedback {
|
|
83
|
+
case .selection: made = UISelectionFeedbackGenerator()
|
|
84
|
+
case let .impact(style): made = UIImpactFeedbackGenerator(style: style)
|
|
85
|
+
case .notification: made = UINotificationFeedbackGenerator()
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
generators[kind] = made
|
|
89
|
+
return made
|
|
90
|
+
}
|
|
91
|
+
}
|
package/ios/PCImageLoader.swift
CHANGED
|
@@ -8,11 +8,42 @@ import UIKit
|
|
|
8
8
|
/// as `http(s)://` (Metro) or `data:` URLs and load asynchronously.
|
|
9
9
|
///
|
|
10
10
|
/// Must be used from the main thread.
|
|
11
|
-
final class PCImageLoader {
|
|
11
|
+
final class PCImageLoader: NSObject, URLSessionTaskDelegate {
|
|
12
12
|
static let shared = PCImageLoader()
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
/// A symbol by name: an SF Symbol, else a custom symbol or image from the
|
|
15
|
+
/// app's asset catalog, so an app's own icons (custom symbols exported
|
|
16
|
+
/// from SVG with the SF Symbols app) work wherever SF Symbol names do.
|
|
17
|
+
static func symbol(named name: String) -> UIImage? {
|
|
18
|
+
guard !name.isEmpty else { return nil }
|
|
19
|
+
return UIImage(systemName: name) ?? UIImage(named: name)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private let cache = NSCache<NSString, UIImage>()
|
|
15
23
|
private var pending: [String: [(UIImage?) -> Void]] = [:]
|
|
24
|
+
private var generations: [String: Int] = [:]
|
|
25
|
+
private var nextGeneration = 0
|
|
26
|
+
// Custom credentials/body must not enter the shared URL cache or be
|
|
27
|
+
// forwarded to a redirect target. Decoded images use the full request key.
|
|
28
|
+
private lazy var requestSession: URLSession = {
|
|
29
|
+
let configuration = URLSessionConfiguration.ephemeral
|
|
30
|
+
configuration.urlCache = nil
|
|
31
|
+
configuration.httpShouldSetCookies = false
|
|
32
|
+
configuration.urlCredentialStorage = nil
|
|
33
|
+
return URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
|
|
34
|
+
}()
|
|
35
|
+
|
|
36
|
+
private override init() {
|
|
37
|
+
super.init()
|
|
38
|
+
cache.countLimit = 32
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func urlSession(_ session: URLSession, task: URLSessionTask,
|
|
42
|
+
willPerformHTTPRedirection response: HTTPURLResponse,
|
|
43
|
+
newRequest request: URLRequest,
|
|
44
|
+
completionHandler: @escaping (URLRequest?) -> Void) {
|
|
45
|
+
completionHandler(nil)
|
|
46
|
+
}
|
|
16
47
|
|
|
17
48
|
/// Returns the image immediately when it is cached or readable from disk.
|
|
18
49
|
/// Otherwise starts a load and calls `completion` on the main thread with
|
|
@@ -21,34 +52,67 @@ final class PCImageLoader {
|
|
|
21
52
|
func image(
|
|
22
53
|
uri: String,
|
|
23
54
|
scale: CGFloat,
|
|
55
|
+
request: String = "",
|
|
24
56
|
completion: @escaping (UIImage?) -> Void
|
|
25
57
|
) -> UIImage? {
|
|
26
|
-
|
|
27
|
-
if
|
|
58
|
+
var options: [String: Any] = [:]
|
|
59
|
+
if !request.isEmpty {
|
|
60
|
+
guard let data = request.data(using: .utf8),
|
|
61
|
+
let decoded = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
|
|
62
|
+
else { return nil }
|
|
63
|
+
options = decoded
|
|
64
|
+
}
|
|
65
|
+
let policy = options.removeValue(forKey: "cache") as? String ?? "default"
|
|
66
|
+
guard let keyData = try? JSONSerialization.data(
|
|
67
|
+
withJSONObject: [uri, scale, options], options: [.sortedKeys]),
|
|
68
|
+
let key = String(data: keyData, encoding: .utf8) else { return nil }
|
|
69
|
+
if policy != "reload", let cached = cache.object(forKey: key as NSString) {
|
|
28
70
|
return cached
|
|
29
71
|
}
|
|
72
|
+
if policy == "only-if-cached" { return nil }
|
|
30
73
|
|
|
31
74
|
guard let url = URL(string: uri) else { return nil }
|
|
32
75
|
|
|
33
76
|
if url.isFileURL {
|
|
34
77
|
guard let data = try? Data(contentsOf: url),
|
|
35
78
|
let image = UIImage(data: data, scale: scale) else { return nil }
|
|
36
|
-
cache
|
|
79
|
+
cache.setObject(image, forKey: key as NSString)
|
|
37
80
|
return image
|
|
38
81
|
}
|
|
39
82
|
|
|
40
|
-
|
|
41
|
-
|
|
83
|
+
let pendingKey = key + (policy == "reload" ? ":reload" : ":cached")
|
|
84
|
+
if pending[pendingKey] != nil {
|
|
85
|
+
pending[pendingKey]?.append(completion)
|
|
42
86
|
return nil
|
|
43
87
|
}
|
|
44
|
-
pending[
|
|
88
|
+
pending[pendingKey] = [completion]
|
|
89
|
+
nextGeneration += 1
|
|
90
|
+
let generation = nextGeneration
|
|
91
|
+
generations[key] = generation
|
|
92
|
+
|
|
93
|
+
var urlRequest = URLRequest(url: url)
|
|
94
|
+
urlRequest.httpMethod = options["method"] as? String ?? "GET"
|
|
95
|
+
urlRequest.httpBody = (options["body"] as? String)?.data(using: .utf8)
|
|
96
|
+
urlRequest.allHTTPHeaderFields = options["headers"] as? [String: String]
|
|
97
|
+
let custom = !options.isEmpty
|
|
98
|
+
if custom || policy == "reload" {
|
|
99
|
+
urlRequest.cachePolicy = .reloadIgnoringLocalCacheData
|
|
100
|
+
}
|
|
45
101
|
|
|
46
|
-
URLSession.shared.dataTask(with:
|
|
47
|
-
let
|
|
102
|
+
(custom ? requestSession : URLSession.shared).dataTask(with: urlRequest) { [weak self] data, response, error in
|
|
103
|
+
let http = response as? HTTPURLResponse
|
|
104
|
+
let success = error == nil && (http == nil || (200..<300).contains(http!.statusCode))
|
|
105
|
+
let image = success ? data.flatMap { UIImage(data: $0, scale: scale) } : nil
|
|
106
|
+
let canCache = !(http?.value(forHTTPHeaderField: "Cache-Control")?
|
|
107
|
+
.lowercased().contains("no-store") ?? false)
|
|
48
108
|
DispatchQueue.main.async {
|
|
49
109
|
guard let self else { return }
|
|
50
|
-
if
|
|
51
|
-
|
|
110
|
+
if self.generations[key] == generation {
|
|
111
|
+
if let image, canCache { self.cache.setObject(image, forKey: key as NSString) }
|
|
112
|
+
else { self.cache.removeObject(forKey: key as NSString) }
|
|
113
|
+
self.generations.removeValue(forKey: key)
|
|
114
|
+
}
|
|
115
|
+
let callbacks = self.pending.removeValue(forKey: pendingKey) ?? []
|
|
52
116
|
callbacks.forEach { $0(image) }
|
|
53
117
|
}
|
|
54
118
|
}.resume()
|
package/ios/PCLiquidGlass.mm
CHANGED
|
@@ -28,6 +28,12 @@ using namespace facebook::react;
|
|
|
28
28
|
|
|
29
29
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|
30
30
|
if (self = [super initWithFrame:frame]) {
|
|
31
|
+
// Fabric views seed _props with their own defaults: RCTViewComponentView
|
|
32
|
+
// asserts on it in debug builds of React Native core, and the first
|
|
33
|
+
// updateProps would otherwise read the base ViewProps as PCLiquidGlassProps.
|
|
34
|
+
static const auto defaultProps = std::make_shared<const PCLiquidGlassProps>();
|
|
35
|
+
_props = defaultProps;
|
|
36
|
+
|
|
31
37
|
_view = [[PCLiquidGlassView alloc] initWithEffect:nil];
|
|
32
38
|
_view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
|
33
39
|
[self addSubview:_view];
|
|
@@ -62,6 +68,31 @@ using namespace facebook::react;
|
|
|
62
68
|
[childComponentView removeFromSuperview];
|
|
63
69
|
}
|
|
64
70
|
|
|
71
|
+
// Removed from its parent: inside a glass container the glass dematerializes
|
|
72
|
+
// in place rather than vanishing
|
|
73
|
+
- (void)willMoveToSuperview:(UIView *)newSuperview {
|
|
74
|
+
if (newSuperview == nil && self.superview != nil) {
|
|
75
|
+
[_view willUnmount];
|
|
76
|
+
}
|
|
77
|
+
[super willMoveToSuperview:newSuperview];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Inside a glass container on screen, a new frame animates, which morphs the
|
|
81
|
+
// merged glass instead of jumping
|
|
82
|
+
- (void)updateLayoutMetrics:(const LayoutMetrics &)layoutMetrics
|
|
83
|
+
oldLayoutMetrics:(const LayoutMetrics &)oldLayoutMetrics {
|
|
84
|
+
BOOL morphs = oldLayoutMetrics != EmptyLayoutMetrics &&
|
|
85
|
+
layoutMetrics.frame != oldLayoutMetrics.frame && _view.morphsLayoutChanges;
|
|
86
|
+
if (!morphs) {
|
|
87
|
+
[super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
[PCLiquidGlassView morph:^{
|
|
91
|
+
[super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
|
|
92
|
+
[self layoutIfNeeded];
|
|
93
|
+
}];
|
|
94
|
+
}
|
|
95
|
+
|
|
65
96
|
|
|
66
97
|
- (void)updateProps:(Props::Shared const &)props
|
|
67
98
|
oldProps:(Props::Shared const &)oldProps {
|
|
@@ -77,6 +108,11 @@ using namespace facebook::react;
|
|
|
77
108
|
_view.glassCornerRadius = newProps.cornerRadius;
|
|
78
109
|
}
|
|
79
110
|
|
|
111
|
+
// cornerStyle -> cornerConfiguration on iOS 26
|
|
112
|
+
if (!prevProps || newProps.cornerStyle != prevProps->cornerStyle) {
|
|
113
|
+
_view.cornerStyle = [NSString stringWithUTF8String:newProps.cornerStyle.c_str()];
|
|
114
|
+
}
|
|
115
|
+
|
|
80
116
|
// iOS-specific props
|
|
81
117
|
const auto &newIos = newProps.ios;
|
|
82
118
|
const auto &oldIos = prevProps ? prevProps->ios : PCLiquidGlassIosStruct{};
|