react-native-platform-components 1.4.0 → 1.6.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.cjs +79 -6
- package/plugin/build/index.d.ts +27 -2
- package/plugin/build/index.d.ts.map +1 -1
- package/plugin/tsconfig.json +2 -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
package/ios/PCLiquidGlass.swift
CHANGED
|
@@ -21,32 +21,50 @@ import UIKit
|
|
|
21
21
|
#endif
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
///
|
|
27
|
-
///
|
|
28
|
-
|
|
24
|
+
/// The Liquid Glass view: a UIVisualEffectView with a UIGlassEffect on iOS 26.
|
|
25
|
+
///
|
|
26
|
+
/// Built with an Xcode older than the iOS 26 SDK, the glass code is compiled
|
|
27
|
+
/// out and the view falls back to a blur. Built with the iOS 26 SDK and run on
|
|
28
|
+
/// an older iOS, it is a plain view.
|
|
29
|
+
///
|
|
30
|
+
/// Inside a `PCLiquidGlassContainerView` the glass merges with its neighbours,
|
|
31
|
+
/// and it morphs when it appears, disappears or changes frame: UIKit
|
|
32
|
+
/// materializes glass when `effect` is set inside an animation block, and
|
|
33
|
+
/// reshapes the merged glass when a frame changes inside one.
|
|
29
34
|
@objcMembers
|
|
30
35
|
public final class PCLiquidGlassView: UIVisualEffectView {
|
|
31
36
|
|
|
32
37
|
// MARK: - Static
|
|
33
38
|
|
|
34
39
|
@objc public static var isSupported: Bool {
|
|
35
|
-
|
|
40
|
+
#if compiler(>=6.2)
|
|
41
|
+
if #available(iOS 26.0, *) {
|
|
42
|
+
return true
|
|
43
|
+
}
|
|
44
|
+
#endif
|
|
45
|
+
return false
|
|
36
46
|
}
|
|
37
47
|
|
|
48
|
+
/// Duration of the morphs inside a container.
|
|
49
|
+
static let morphDuration: TimeInterval = 0.45
|
|
50
|
+
|
|
38
51
|
// MARK: - Props (set from ObjC++)
|
|
39
52
|
|
|
40
53
|
private var isFirstMount: Bool = true
|
|
41
54
|
|
|
42
55
|
/// Effect style: "clear", "regular", "none"
|
|
43
56
|
public var effectStyle: String = "regular" {
|
|
44
|
-
didSet {
|
|
57
|
+
didSet { applyEffect() }
|
|
45
58
|
}
|
|
46
59
|
|
|
47
60
|
/// Corner radius for the glass effect
|
|
48
61
|
public var glassCornerRadius: CGFloat = 0 {
|
|
49
|
-
didSet {
|
|
62
|
+
didSet { applyCornerStyle() }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// Corner shape: "capsule", "concentric", or "" for glassCornerRadius
|
|
66
|
+
public var cornerStyle: String = "" {
|
|
67
|
+
didSet { applyCornerStyle() }
|
|
50
68
|
}
|
|
51
69
|
|
|
52
70
|
/// Enable touch interaction feedback
|
|
@@ -54,7 +72,7 @@ public final class PCLiquidGlassView: UIVisualEffectView {
|
|
|
54
72
|
|
|
55
73
|
/// Tint color for the glass effect (hex string)
|
|
56
74
|
public var glassTintColor: String? {
|
|
57
|
-
didSet {
|
|
75
|
+
didSet { applyEffect() }
|
|
58
76
|
}
|
|
59
77
|
|
|
60
78
|
/// Color scheme: "light", "dark", "system"
|
|
@@ -65,6 +83,11 @@ public final class PCLiquidGlassView: UIVisualEffectView {
|
|
|
65
83
|
/// Callback for press events with touch coordinates
|
|
66
84
|
public var onPressCallback: ((CGFloat, CGFloat) -> Void)?
|
|
67
85
|
|
|
86
|
+
/// The dematerializing copy `willUnmount()` left in the container. Kept
|
|
87
|
+
/// until the end of the run loop: a view that is only being moved is
|
|
88
|
+
/// inserted again before then, and removes its copy.
|
|
89
|
+
private weak var pendingGhost: UIView?
|
|
90
|
+
|
|
68
91
|
// MARK: - Init
|
|
69
92
|
|
|
70
93
|
public override init(effect: UIVisualEffect?) {
|
|
@@ -80,6 +103,9 @@ public final class PCLiquidGlassView: UIVisualEffectView {
|
|
|
80
103
|
private func setup() {
|
|
81
104
|
clipsToBounds = false
|
|
82
105
|
setupTapGesture()
|
|
106
|
+
#if !compiler(>=6.2)
|
|
107
|
+
applyEffect()
|
|
108
|
+
#endif
|
|
83
109
|
}
|
|
84
110
|
|
|
85
111
|
private func setupTapGesture() {
|
|
@@ -99,7 +125,11 @@ public final class PCLiquidGlassView: UIVisualEffectView {
|
|
|
99
125
|
|
|
100
126
|
// Apply glass effect on first layout when we have bounds
|
|
101
127
|
if effect == nil && bounds.size != .zero {
|
|
102
|
-
|
|
128
|
+
applyEffect()
|
|
129
|
+
}
|
|
130
|
+
// Without corner configurations, a capsule follows the size
|
|
131
|
+
if cornerStyle == "capsule" && !usesCornerConfiguration {
|
|
132
|
+
applyCornerStyle()
|
|
103
133
|
}
|
|
104
134
|
}
|
|
105
135
|
|
|
@@ -107,12 +137,24 @@ public final class PCLiquidGlassView: UIVisualEffectView {
|
|
|
107
137
|
|
|
108
138
|
/// Call this after setting props to apply/re-apply the glass effect
|
|
109
139
|
@objc public func setupView() {
|
|
110
|
-
|
|
140
|
+
applyEffect()
|
|
111
141
|
}
|
|
112
142
|
|
|
113
143
|
// MARK: - Glass Effect
|
|
114
144
|
|
|
115
|
-
private func
|
|
145
|
+
private func applyEffect() {
|
|
146
|
+
#if compiler(>=6.2)
|
|
147
|
+
if #available(iOS 26.0, *) {
|
|
148
|
+
applyGlassEffect(duration: 0.2)
|
|
149
|
+
}
|
|
150
|
+
#else
|
|
151
|
+
applyFallbackEffect()
|
|
152
|
+
#endif
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
#if compiler(>=6.2)
|
|
156
|
+
@available(iOS 26.0, *)
|
|
157
|
+
private func applyGlassEffect(duration: TimeInterval) {
|
|
116
158
|
guard bounds.size != .zero else { return }
|
|
117
159
|
|
|
118
160
|
// Parse effect style
|
|
@@ -128,7 +170,7 @@ public final class PCLiquidGlassView: UIVisualEffectView {
|
|
|
128
170
|
|
|
129
171
|
// Handle "none" style
|
|
130
172
|
guard let glassStyle = style.glassStyle else {
|
|
131
|
-
UIView.animate(withDuration:
|
|
173
|
+
UIView.animate(withDuration: duration) {
|
|
132
174
|
self.effect = nil
|
|
133
175
|
}
|
|
134
176
|
return
|
|
@@ -149,106 +191,14 @@ public final class PCLiquidGlassView: UIVisualEffectView {
|
|
|
149
191
|
self.effect = glassEffect
|
|
150
192
|
isFirstMount = false
|
|
151
193
|
} else {
|
|
152
|
-
UIView.animate(withDuration:
|
|
194
|
+
UIView.animate(withDuration: duration) {
|
|
153
195
|
self.effect = glassEffect
|
|
154
196
|
}
|
|
155
197
|
}
|
|
156
198
|
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
private func applyCornerRadius() {
|
|
161
|
-
layer.cornerRadius = glassCornerRadius
|
|
162
|
-
layer.cornerCurve = .continuous
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
private func applyColorScheme() {
|
|
166
|
-
switch colorScheme {
|
|
167
|
-
case "light":
|
|
168
|
-
overrideUserInterfaceStyle = .light
|
|
169
|
-
case "dark":
|
|
170
|
-
overrideUserInterfaceStyle = .dark
|
|
171
|
-
default:
|
|
172
|
-
overrideUserInterfaceStyle = .unspecified
|
|
173
|
-
}
|
|
174
|
-
applyGlassEffect()
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// MARK: - Sizing
|
|
178
|
-
|
|
179
|
-
public override func sizeThatFits(_ size: CGSize) -> CGSize {
|
|
180
|
-
return size
|
|
199
|
+
applyCornerStyle()
|
|
181
200
|
}
|
|
182
|
-
|
|
183
|
-
public override var intrinsicContentSize: CGSize {
|
|
184
|
-
return CGSize(width: UIView.noIntrinsicMetric, height: UIView.noIntrinsicMetric)
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
#else
|
|
189
|
-
|
|
190
|
-
/// Fallback for older Swift compilers (pre-iOS 26 SDK)
|
|
191
|
-
/// Uses UIBlurEffect as a fallback
|
|
192
|
-
@objcMembers
|
|
193
|
-
public final class PCLiquidGlassView: UIVisualEffectView {
|
|
194
|
-
|
|
195
|
-
@objc public static var isSupported: Bool {
|
|
196
|
-
return false
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
public var effectStyle: String = "regular" {
|
|
200
|
-
didSet { applyFallbackEffect() }
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
public var glassCornerRadius: CGFloat = 0 {
|
|
204
|
-
didSet { applyCornerRadius() }
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
public var interactive: Bool = false
|
|
208
|
-
public var glassTintColor: String?
|
|
209
|
-
public var colorScheme: String = "system" {
|
|
210
|
-
didSet { applyColorScheme() }
|
|
211
|
-
}
|
|
212
|
-
public var onPressCallback: ((CGFloat, CGFloat) -> Void)?
|
|
213
|
-
|
|
214
|
-
public override init(effect: UIVisualEffect?) {
|
|
215
|
-
super.init(effect: effect)
|
|
216
|
-
setup()
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
public required init?(coder: NSCoder) {
|
|
220
|
-
super.init(coder: coder)
|
|
221
|
-
setup()
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
private func setup() {
|
|
225
|
-
clipsToBounds = false
|
|
226
|
-
setupTapGesture()
|
|
227
|
-
applyFallbackEffect()
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
private func setupTapGesture() {
|
|
231
|
-
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
|
|
232
|
-
addGestureRecognizer(tap)
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
@objc private func handleTap(_ gesture: UITapGestureRecognizer) {
|
|
236
|
-
let location = gesture.location(in: self)
|
|
237
|
-
onPressCallback?(location.x, location.y)
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
public override func layoutSubviews() {
|
|
241
|
-
super.layoutSubviews()
|
|
242
|
-
if effect == nil && bounds.size != .zero {
|
|
243
|
-
applyFallbackEffect()
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/// Call this after setting props to apply/re-apply the effect
|
|
248
|
-
@objc public func setupView() {
|
|
249
|
-
applyFallbackEffect()
|
|
250
|
-
}
|
|
251
|
-
|
|
201
|
+
#else
|
|
252
202
|
private func applyFallbackEffect() {
|
|
253
203
|
guard effectStyle != "none" else {
|
|
254
204
|
self.effect = nil
|
|
@@ -273,11 +223,46 @@ public final class PCLiquidGlassView: UIVisualEffectView {
|
|
|
273
223
|
}
|
|
274
224
|
|
|
275
225
|
self.effect = UIBlurEffect(style: blurStyle)
|
|
276
|
-
|
|
226
|
+
applyCornerStyle()
|
|
277
227
|
}
|
|
228
|
+
#endif
|
|
229
|
+
|
|
230
|
+
// MARK: - Corners
|
|
278
231
|
|
|
279
|
-
|
|
280
|
-
|
|
232
|
+
/// Whether corners go through UIView.cornerConfiguration (iOS 26).
|
|
233
|
+
private var usesCornerConfiguration: Bool {
|
|
234
|
+
#if compiler(>=6.2)
|
|
235
|
+
if #available(iOS 26.0, *) {
|
|
236
|
+
return true
|
|
237
|
+
}
|
|
238
|
+
#endif
|
|
239
|
+
return false
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private func applyCornerStyle() {
|
|
243
|
+
#if compiler(>=6.2)
|
|
244
|
+
if #available(iOS 26.0, *) {
|
|
245
|
+
switch cornerStyle {
|
|
246
|
+
case "capsule":
|
|
247
|
+
cornerConfiguration = .capsule()
|
|
248
|
+
case "concentric":
|
|
249
|
+
// Each corner follows the matching corner of the enclosing
|
|
250
|
+
// shape (a parent glass, the screen), inset by the distance
|
|
251
|
+
// to it; cornerRadius is the smallest it gets.
|
|
252
|
+
cornerConfiguration = .corners(
|
|
253
|
+
radius: .containerConcentric(minimum: glassCornerRadius > 0 ? glassCornerRadius : nil)
|
|
254
|
+
)
|
|
255
|
+
default:
|
|
256
|
+
cornerConfiguration = .uniformCorners(radius: .fixed(Double(glassCornerRadius)))
|
|
257
|
+
}
|
|
258
|
+
return
|
|
259
|
+
}
|
|
260
|
+
#endif
|
|
261
|
+
// Without corner configurations: a capsule is half the short side,
|
|
262
|
+
// and concentric corners use cornerRadius
|
|
263
|
+
layer.cornerRadius = cornerStyle == "capsule"
|
|
264
|
+
? min(bounds.width, bounds.height) / 2
|
|
265
|
+
: glassCornerRadius
|
|
281
266
|
layer.cornerCurve = .continuous
|
|
282
267
|
}
|
|
283
268
|
|
|
@@ -290,11 +275,133 @@ public final class PCLiquidGlassView: UIVisualEffectView {
|
|
|
290
275
|
default:
|
|
291
276
|
overrideUserInterfaceStyle = .unspecified
|
|
292
277
|
}
|
|
293
|
-
|
|
278
|
+
applyEffect()
|
|
294
279
|
}
|
|
295
|
-
}
|
|
296
280
|
|
|
297
|
-
|
|
281
|
+
// MARK: - Container morphing
|
|
282
|
+
|
|
283
|
+
/// The container this glass merges in: the nearest one above it, unless
|
|
284
|
+
/// another glass view comes first.
|
|
285
|
+
private var glassContainer: PCLiquidGlassContainerView? {
|
|
286
|
+
var view = superview
|
|
287
|
+
while let current = view {
|
|
288
|
+
if let container = current as? PCLiquidGlassContainerView {
|
|
289
|
+
return container
|
|
290
|
+
}
|
|
291
|
+
if current is PCLiquidGlassView {
|
|
292
|
+
return nil
|
|
293
|
+
}
|
|
294
|
+
view = current.superview
|
|
295
|
+
}
|
|
296
|
+
return nil
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/// Whether frame changes should animate: glass shown in a container that
|
|
300
|
+
/// is already on screen.
|
|
301
|
+
@objc public var morphsLayoutChanges: Bool {
|
|
302
|
+
#if compiler(>=6.2)
|
|
303
|
+
if #available(iOS 26.0, *) {
|
|
304
|
+
return effect is UIGlassEffect && glassContainer?.isSettled == true
|
|
305
|
+
}
|
|
306
|
+
#endif
|
|
307
|
+
return false
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/// Runs layout changes in the animation that reshapes merged glass.
|
|
311
|
+
@objc public static func morph(_ changes: @escaping () -> Void) {
|
|
312
|
+
UIView.animate(
|
|
313
|
+
withDuration: morphDuration,
|
|
314
|
+
delay: 0,
|
|
315
|
+
usingSpringWithDamping: 0.82,
|
|
316
|
+
initialSpringVelocity: 0,
|
|
317
|
+
options: [.beginFromCurrentState, .allowUserInteraction],
|
|
318
|
+
animations: changes
|
|
319
|
+
)
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
public override func didMoveToWindow() {
|
|
323
|
+
super.didMoveToWindow()
|
|
324
|
+
guard window != nil else { return }
|
|
325
|
+
|
|
326
|
+
if let ghost = pendingGhost {
|
|
327
|
+
// Moved within one transaction rather than removed: the glass
|
|
328
|
+
// is still here, so drop the copy that was fading out
|
|
329
|
+
ghost.removeFromSuperview()
|
|
330
|
+
pendingGhost = nil
|
|
331
|
+
return
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
#if compiler(>=6.2)
|
|
335
|
+
if #available(iOS 26.0, *), glassContainer?.isSettled == true, bounds.size != .zero {
|
|
336
|
+
// Added to a container already on screen: materialize, which
|
|
337
|
+
// grows the glass out of the neighbours it merges with
|
|
338
|
+
effect = nil
|
|
339
|
+
isFirstMount = false
|
|
340
|
+
applyGlassEffect(duration: PCLiquidGlassView.morphDuration)
|
|
341
|
+
}
|
|
342
|
+
#endif
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/// Called by the React view as it is removed from its parent. In a
|
|
346
|
+
/// container that is on screen, a copy of the glass takes its place and
|
|
347
|
+
/// dematerializes, so the shape melts back into its neighbours instead of
|
|
348
|
+
/// vanishing.
|
|
349
|
+
@objc public func willUnmount() {
|
|
350
|
+
#if compiler(>=6.2)
|
|
351
|
+
guard #available(iOS 26.0, *),
|
|
352
|
+
let glass = effect as? UIGlassEffect,
|
|
353
|
+
let container = glassContainer, container.isSettled,
|
|
354
|
+
bounds.size != .zero else { return }
|
|
355
|
+
|
|
356
|
+
let ghost = UIVisualEffectView(effect: glass)
|
|
357
|
+
ghost.frame = convert(bounds, to: container.contentView)
|
|
358
|
+
ghost.cornerConfiguration = cornerConfiguration
|
|
359
|
+
ghost.overrideUserInterfaceStyle = overrideUserInterfaceStyle
|
|
360
|
+
ghost.isUserInteractionEnabled = false
|
|
361
|
+
// Last, so the indexes React inserts its children at stay right
|
|
362
|
+
container.contentView.addSubview(ghost)
|
|
363
|
+
|
|
364
|
+
pendingGhost = ghost
|
|
365
|
+
UIView.animate(withDuration: PCLiquidGlassView.morphDuration, animations: {
|
|
366
|
+
ghost.effect = nil
|
|
367
|
+
}, completion: { _ in
|
|
368
|
+
ghost.removeFromSuperview()
|
|
369
|
+
})
|
|
370
|
+
|
|
371
|
+
// Once the transaction has applied the container's new size: a copy
|
|
372
|
+
// left outside it (glass removed at an edge) shrinks into the edge,
|
|
373
|
+
// where its neighbour is, rather than being cut off by the bounds.
|
|
374
|
+
// A transform keeps its corners; a new frame would square them.
|
|
375
|
+
DispatchQueue.main.async { [weak self] in
|
|
376
|
+
self?.pendingGhost = nil
|
|
377
|
+
guard ghost.superview != nil else { return }
|
|
378
|
+
let bounds = container.contentView.bounds
|
|
379
|
+
let frame = ghost.frame
|
|
380
|
+
let target = CGPoint(
|
|
381
|
+
x: min(max(frame.midX, bounds.minX), bounds.maxX),
|
|
382
|
+
y: min(max(frame.midY, bounds.minY), bounds.maxY)
|
|
383
|
+
)
|
|
384
|
+
guard target.x != frame.midX || target.y != frame.midY else { return }
|
|
385
|
+
PCLiquidGlassView.morph {
|
|
386
|
+
ghost.transform = CGAffineTransform(
|
|
387
|
+
translationX: target.x - frame.midX,
|
|
388
|
+
y: target.y - frame.midY
|
|
389
|
+
).scaledBy(x: 0.5, y: 0.5)
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
#endif
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// MARK: - Sizing
|
|
396
|
+
|
|
397
|
+
public override func sizeThatFits(_ size: CGSize) -> CGSize {
|
|
398
|
+
return size
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
public override var intrinsicContentSize: CGSize {
|
|
402
|
+
return CGSize(width: UIView.noIntrinsicMetric, height: UIView.noIntrinsicMetric)
|
|
403
|
+
}
|
|
404
|
+
}
|
|
298
405
|
|
|
299
406
|
// MARK: - UIColor parsing extension
|
|
300
407
|
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// PCLiquidGlassContainer.mm
|
|
2
|
+
|
|
3
|
+
#import "PCLiquidGlassContainer.h"
|
|
4
|
+
|
|
5
|
+
#import <React/RCTComponentViewFactory.h>
|
|
6
|
+
#import <React/RCTFabricComponentsPlugins.h>
|
|
7
|
+
|
|
8
|
+
#import <react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h>
|
|
9
|
+
#import <react/renderer/components/PlatformComponentsViewSpec/Props.h>
|
|
10
|
+
|
|
11
|
+
#if __has_include(<PlatformComponents/PlatformComponents-Swift.h>)
|
|
12
|
+
#import <PlatformComponents/PlatformComponents-Swift.h>
|
|
13
|
+
#else
|
|
14
|
+
#import "PlatformComponents-Swift.h"
|
|
15
|
+
#endif
|
|
16
|
+
|
|
17
|
+
using namespace facebook::react;
|
|
18
|
+
|
|
19
|
+
@implementation PCLiquidGlassContainer {
|
|
20
|
+
PCLiquidGlassContainerView *_view;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
+ (ComponentDescriptorProvider)componentDescriptorProvider {
|
|
24
|
+
return concreteComponentDescriptorProvider<PCLiquidGlassContainerComponentDescriptor>();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
- (instancetype)initWithFrame:(CGRect)frame {
|
|
28
|
+
if (self = [super initWithFrame:frame]) {
|
|
29
|
+
static const auto defaultProps = std::make_shared<const PCLiquidGlassContainerProps>();
|
|
30
|
+
_props = defaultProps;
|
|
31
|
+
|
|
32
|
+
_view = [[PCLiquidGlassContainerView alloc] initWithEffect:nil];
|
|
33
|
+
_view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
|
34
|
+
[self addSubview:_view];
|
|
35
|
+
}
|
|
36
|
+
return self;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Children go in the effect view's contentView, where the container effect
|
|
40
|
+
// renders their glass together
|
|
41
|
+
- (void)mountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index {
|
|
42
|
+
[_view.contentView insertSubview:childComponentView atIndex:index];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
- (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index {
|
|
46
|
+
[childComponentView removeFromSuperview];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// On screen, a new size animates with the glass inside it: the container
|
|
50
|
+
// clips the merged glass to about its bounds, and glass morphing into a
|
|
51
|
+
// smaller container would otherwise be cut off
|
|
52
|
+
- (void)updateLayoutMetrics:(const LayoutMetrics &)layoutMetrics
|
|
53
|
+
oldLayoutMetrics:(const LayoutMetrics &)oldLayoutMetrics {
|
|
54
|
+
BOOL morphs = oldLayoutMetrics != EmptyLayoutMetrics &&
|
|
55
|
+
layoutMetrics.frame.size != oldLayoutMetrics.frame.size && _view.isSettled;
|
|
56
|
+
if (!morphs) {
|
|
57
|
+
[super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
[PCLiquidGlassView morph:^{
|
|
61
|
+
[super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
|
|
62
|
+
[self layoutIfNeeded];
|
|
63
|
+
}];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
- (void)updateProps:(Props::Shared const &)props
|
|
67
|
+
oldProps:(Props::Shared const &)oldProps {
|
|
68
|
+
const auto &newProps =
|
|
69
|
+
*std::static_pointer_cast<const PCLiquidGlassContainerProps>(props);
|
|
70
|
+
const auto prevProps =
|
|
71
|
+
std::static_pointer_cast<const PCLiquidGlassContainerProps>(oldProps);
|
|
72
|
+
|
|
73
|
+
if (!prevProps || newProps.spacing != prevProps->spacing) {
|
|
74
|
+
_view.spacing = newProps.spacing;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
[super updateProps:props oldProps:oldProps];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@end
|
|
81
|
+
|
|
82
|
+
Class<RCTComponentViewProtocol> PCLiquidGlassContainerCls(void) {
|
|
83
|
+
return PCLiquidGlassContainer.class;
|
|
84
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import UIKit
|
|
2
|
+
|
|
3
|
+
/// The container Liquid Glass views merge in: a UIVisualEffectView with a
|
|
4
|
+
/// UIGlassContainerEffect on iOS 26. Glass views in its contentView render
|
|
5
|
+
/// as one shape, and blend into each other when they come within `spacing`.
|
|
6
|
+
///
|
|
7
|
+
/// Elsewhere (older iOS, or a build without the iOS 26 SDK) it has no effect
|
|
8
|
+
/// and is a plain container.
|
|
9
|
+
@objcMembers
|
|
10
|
+
public final class PCLiquidGlassContainerView: UIVisualEffectView {
|
|
11
|
+
|
|
12
|
+
/// Distance at which glass views begin to merge; negative keeps the
|
|
13
|
+
/// system default.
|
|
14
|
+
public var spacing: CGFloat = -1 {
|
|
15
|
+
didSet {
|
|
16
|
+
if spacing != oldValue { applyEffect() }
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/// True once the container has been on screen for a run loop. Glass
|
|
21
|
+
/// added, removed or moved after that morphs; glass that arrives with the
|
|
22
|
+
/// container just appears.
|
|
23
|
+
public private(set) var isSettled = false
|
|
24
|
+
|
|
25
|
+
public override init(effect: UIVisualEffect?) {
|
|
26
|
+
super.init(effect: nil)
|
|
27
|
+
clipsToBounds = false
|
|
28
|
+
applyEffect()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public required init?(coder: NSCoder) {
|
|
32
|
+
super.init(coder: coder)
|
|
33
|
+
clipsToBounds = false
|
|
34
|
+
applyEffect()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public override func willMove(toWindow newWindow: UIWindow?) {
|
|
38
|
+
super.willMove(toWindow: newWindow)
|
|
39
|
+
if newWindow == nil {
|
|
40
|
+
isSettled = false
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public override func didMoveToWindow() {
|
|
45
|
+
super.didMoveToWindow()
|
|
46
|
+
isSettled = false
|
|
47
|
+
guard window != nil else { return }
|
|
48
|
+
DispatchQueue.main.async { [weak self] in
|
|
49
|
+
guard let self else { return }
|
|
50
|
+
self.isSettled = self.window != nil
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private func applyEffect() {
|
|
55
|
+
#if compiler(>=6.2)
|
|
56
|
+
if #available(iOS 26.0, *) {
|
|
57
|
+
let containerEffect = UIGlassContainerEffect()
|
|
58
|
+
if spacing >= 0 {
|
|
59
|
+
containerEffect.spacing = spacing
|
|
60
|
+
}
|
|
61
|
+
// Replacing one container effect with another leaves the
|
|
62
|
+
// spacing the glass was merged with; clearing it first applies
|
|
63
|
+
// the new one
|
|
64
|
+
effect = nil
|
|
65
|
+
effect = containerEffect
|
|
66
|
+
}
|
|
67
|
+
#endif
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// PCMenuItems.h
|
|
2
|
+
//
|
|
3
|
+
// Bridges flattened menu items (src/menuItems.ts) from their codegen structs
|
|
4
|
+
// to the dictionaries PCMenuItem (PCMenuSupport.swift) reads. Codegen makes a
|
|
5
|
+
// struct per component and prop, so these are templates over any struct with
|
|
6
|
+
// the menu item fields.
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#import <Foundation/Foundation.h>
|
|
11
|
+
|
|
12
|
+
#include <string>
|
|
13
|
+
#include <vector>
|
|
14
|
+
|
|
15
|
+
namespace platformcomponents {
|
|
16
|
+
|
|
17
|
+
inline NSString *PCMenuString(const std::string &value) {
|
|
18
|
+
return value.empty() ? @"" : [NSString stringWithUTF8String:value.c_str()];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
template <typename Item>
|
|
22
|
+
NSDictionary *PCMenuItemToDictionary(const Item &item) {
|
|
23
|
+
return @{
|
|
24
|
+
@"id" : PCMenuString(item.id),
|
|
25
|
+
@"title" : PCMenuString(item.title),
|
|
26
|
+
@"subtitle" : PCMenuString(item.subtitle),
|
|
27
|
+
@"parent" : @(item.parent),
|
|
28
|
+
@"kind" : PCMenuString(item.kind),
|
|
29
|
+
@"iconType" : PCMenuString(item.iconType),
|
|
30
|
+
@"iconName" : PCMenuString(item.iconName),
|
|
31
|
+
@"iconRequest" : PCMenuString(item.iconRequest),
|
|
32
|
+
@"iconUri" : PCMenuString(item.iconUri),
|
|
33
|
+
@"iconScale" : @(item.iconScale),
|
|
34
|
+
@"iconTinted" : PCMenuString(item.iconTinted),
|
|
35
|
+
@"imageColor" : PCMenuString(item.imageColor),
|
|
36
|
+
@"destructive" : PCMenuString(item.destructive),
|
|
37
|
+
@"disabled" : PCMenuString(item.disabled),
|
|
38
|
+
@"keepsMenuPresented" : PCMenuString(item.keepsMenuPresented),
|
|
39
|
+
@"state" : PCMenuString(item.state),
|
|
40
|
+
@"haptics" : PCMenuString(item.haptics),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
template <typename Item>
|
|
45
|
+
NSArray<NSDictionary *> *PCMenuItemsToArray(const std::vector<Item> &items) {
|
|
46
|
+
NSMutableArray<NSDictionary *> *array = [NSMutableArray arrayWithCapacity:items.size()];
|
|
47
|
+
for (const auto &item : items) {
|
|
48
|
+
[array addObject:PCMenuItemToDictionary(item)];
|
|
49
|
+
}
|
|
50
|
+
return array;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
template <typename Item>
|
|
54
|
+
bool PCMenuItemEqual(const Item &a, const Item &b) {
|
|
55
|
+
return a.id == b.id && a.title == b.title && a.subtitle == b.subtitle &&
|
|
56
|
+
a.parent == b.parent && a.kind == b.kind && a.iconType == b.iconType &&
|
|
57
|
+
a.iconName == b.iconName && a.iconRequest == b.iconRequest && a.iconUri == b.iconUri &&
|
|
58
|
+
a.iconScale == b.iconScale && a.iconTinted == b.iconTinted &&
|
|
59
|
+
a.imageColor == b.imageColor && a.destructive == b.destructive &&
|
|
60
|
+
a.disabled == b.disabled &&
|
|
61
|
+
a.keepsMenuPresented == b.keepsMenuPresented && a.state == b.state &&
|
|
62
|
+
a.haptics == b.haptics;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// Compares every field, so a changed title or state (a stepper or toggle
|
|
66
|
+
/// in an open menu) reaches native.
|
|
67
|
+
template <typename Item>
|
|
68
|
+
bool PCMenuItemsEqual(const std::vector<Item> &a, const std::vector<Item> &b) {
|
|
69
|
+
if (a.size() != b.size()) return false;
|
|
70
|
+
for (size_t i = 0; i < a.size(); i++) {
|
|
71
|
+
if (!PCMenuItemEqual(a[i], b[i])) return false;
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
} // namespace platformcomponents
|