@octane-xplat/ui 0.6.0 → 0.7.1
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/README.md +14 -4
- package/dist/native/{Absolute.native.tsrx.js → Absolute.tsrx.js} +2 -2
- package/dist/native/{Accordion.native.tsrx.js → Accordion.tsrx.js} +3 -3
- package/dist/native/{ActivityIndicator.native.tsrx.js → ActivityIndicator.tsrx.js} +2 -2
- package/dist/native/{Alert.native.tsrx.js → Alert.tsrx.js} +3 -3
- package/dist/native/{Avatar.native.tsrx.js → Avatar.tsrx.js} +3 -3
- package/dist/native/{AvatarGroup.native.tsrx.js → AvatarGroup.tsrx.js} +3 -3
- package/dist/native/{Badge.native.tsrx.js → Badge.tsrx.js} +2 -2
- package/dist/native/{Banner.native.tsrx.js → Banner.tsrx.js} +3 -3
- package/dist/native/{Breadcrumb.native.tsrx.js → Breadcrumb.tsrx.js} +2 -2
- package/dist/native/{Button.native.tsrx.js → Button.tsrx.js} +3 -3
- package/dist/native/{Card.native.tsrx.js → Card.tsrx.js} +2 -2
- package/dist/native/{Checkbox.native.tsrx.js → Checkbox.tsrx.js} +2 -2
- package/dist/native/{CheckboxGroup.native.tsrx.js → CheckboxGroup.tsrx.js} +3 -3
- package/dist/native/{Chip.native.tsrx.js → Chip.tsrx.js} +2 -2
- package/dist/native/{Collapsible.native.tsrx.js → Collapsible.tsrx.js} +3 -3
- package/dist/native/{CommandPalette.native.tsrx.js → CommandPalette.tsrx.js} +4 -4
- package/dist/native/{ContextMenu.native.tsrx.js → ContextMenu.tsrx.js} +4 -4
- package/dist/native/{Drawer.native.tsrx.js → Drawer.tsrx.js} +2 -2
- package/dist/native/{DropdownMenu.native.tsrx.js → DropdownMenu.tsrx.js} +5 -5
- package/dist/native/{Empty.native.tsrx.js → Empty.tsrx.js} +3 -3
- package/dist/native/{FieldGroup.native.tsrx.js → FieldGroup.tsrx.js} +2 -2
- package/dist/native/{FormField.native.tsrx.js → FormField.tsrx.js} +2 -2
- package/dist/native/{Grid.native.tsrx.js → Grid.tsrx.js} +2 -2
- package/dist/native/{Heading.native.tsrx.js → Heading.tsrx.js} +3 -3
- package/dist/native/Hoverable.tsrx.js +139 -0
- package/dist/native/{Icon.native.tsrx.js → Icon.tsrx.js} +3 -3
- package/dist/native/{Image.native.tsrx.js → Image.tsrx.js} +4 -4
- package/dist/native/{InputNumber.native.tsrx.js → InputNumber.tsrx.js} +4 -4
- package/dist/native/{InputRating.native.tsrx.js → InputRating.tsrx.js} +3 -3
- package/dist/native/{InputTags.native.tsrx.js → InputTags.tsrx.js} +4 -4
- package/dist/native/{Kbd.native.tsrx.js → Kbd.tsrx.js} +2 -2
- package/dist/native/{KeyboardAvoiding.native.tsrx.js → KeyboardAvoiding.mobile.tsrx.js} +5 -3
- package/dist/native/{Link.native.tsrx.js → Link.tsrx.js} +2 -2
- package/dist/native/ListItem.tsrx.js +178 -0
- package/dist/native/Meter.tsrx.js +70 -0
- package/dist/native/{NavLink.native.tsrx.js → NavLink.tsrx.js} +3 -3
- package/dist/native/{NavigationMenu.native.tsrx.js → NavigationMenu.tsrx.js} +3 -3
- package/dist/native/{Overlay.native.tsrx.js → Overlay.tsrx.js} +2 -2
- package/dist/native/{Pagination.native.tsrx.js → Pagination.tsrx.js} +2 -2
- package/dist/native/{PinInput.native.tsrx.js → PinInput.tsrx.js} +3 -3
- package/dist/native/{Popover.native.tsrx.js → Popover.tsrx.js} +4 -4
- package/dist/native/{Pressable.native.tsrx.js → Pressable.tsrx.js} +4 -4
- package/dist/native/{ProgressGroup.native.tsrx.js → ProgressGroup.tsrx.js} +3 -3
- package/dist/native/{RadioGroup.native.tsrx.js → RadioGroup.tsrx.js} +2 -2
- package/dist/native/{RichText.native.tsrx.js → RichText.tsrx.js} +3 -3
- package/dist/native/{RouteHost.native.tsrx.js → RouteHost.mobile.tsrx.js} +13 -2
- package/dist/native/{Row.native.tsrx.js → Row.tsrx.js} +4 -4
- package/dist/native/{SafeArea.native.tsrx.js → SafeArea.tsrx.js} +9 -3
- package/dist/native/{Screen.native.tsrx.js → Screen.tsrx.js} +13 -5
- package/dist/native/{ScrollBox.native.tsrx.js → ScrollBox.tsrx.js} +2 -2
- package/dist/native/{ScrollView.native.tsrx.js → ScrollView.tsrx.js} +5 -5
- package/dist/native/{SearchInput.native.tsrx.js → SearchInput.tsrx.js} +4 -4
- package/dist/native/{SegmentedControl.native.tsrx.js → SegmentedControl.tsrx.js} +2 -2
- package/dist/native/{Select.native.tsrx.js → Select.tsrx.js} +4 -4
- package/dist/native/{Separator.native.tsrx.js → Separator.tsrx.js} +2 -2
- package/dist/native/{Sheet.native.tsrx.js → Sheet.tsrx.js} +11 -3
- package/dist/native/{Skeleton.native.tsrx.js → Skeleton.tsrx.js} +2 -2
- package/dist/native/{Slider.native.tsrx.js → Slider.tsrx.js} +5 -5
- package/dist/native/{Spacer.native.tsrx.js → Spacer.tsrx.js} +2 -2
- package/dist/native/{Stack.native.tsrx.js → Stack.tsrx.js} +2 -2
- package/dist/native/{Stepper.native.tsrx.js → Stepper.tsrx.js} +2 -2
- package/dist/native/{Switch.native.tsrx.js → Switch.tsrx.js} +2 -2
- package/dist/native/{Table.native.tsrx.js → Table.tsrx.js} +2 -2
- package/dist/native/{Tabs.native.tsrx.js → Tabs.tsrx.js} +8 -18
- package/dist/native/{Text.native.tsrx.js → Text.tsrx.js} +3 -3
- package/dist/native/{TextArea.native.tsrx.js → TextArea.tsrx.js} +3 -3
- package/dist/native/{TextInput.native.tsrx.js → TextInput.tsrx.js} +3 -3
- package/dist/native/{Timeline.native.tsrx.js → Timeline.tsrx.js} +3 -3
- package/dist/native/Tooltip.tsrx.js +131 -0
- package/dist/native/{Tree.native.tsrx.js → Tree.tsrx.js} +2 -2
- package/dist/native/{User.native.tsrx.js → User.tsrx.js} +3 -3
- package/dist/native/{View.native.tsrx.js → View.tsrx.js} +4 -4
- package/dist/native/VirtualList.tsrx.js +466 -0
- package/dist/native/{WebView.native.tsrx.js → WebView.tsrx.js} +31 -6
- package/dist/native/{aliases.native.tsrx.js → aliases.tsrx.js} +2 -2
- package/dist/native/android/BottomNavigationView.android.tsrx.js +72 -23
- package/dist/native/android/CircularProgressIndicator.android.tsrx.js +1 -1
- package/dist/native/android/DrawerLayout.android.tsrx.js +2 -1
- package/dist/native/android/MaterialDialog.android.tsrx.js +1 -1
- package/dist/native/android/MaterialSwitch.android.tsrx.js +1 -1
- package/dist/native/android/RecyclerView.android.tsrx.js +15 -3
- package/dist/native/android/SeekBar.android.tsrx.js +1 -1
- package/dist/native/android/icon.android.js +7 -0
- package/dist/native/android/index.js +3 -1
- package/dist/native/android/openModal.android.js +1 -1
- package/dist/native/{anim.native.tsrx.js → anim.tsrx.js} +1 -1
- package/dist/native/apply-native-modifiers.native.js +9 -0
- package/dist/native/{escape-props.native.js → escape-props.js} +3 -1
- package/dist/native/index.shared.js +92 -0
- package/dist/native/ios/LiquidGlass.ios.tsrx.js +2 -2
- package/dist/native/ios/LiquidGlassContainer.ios.tsrx.js +2 -2
- package/dist/native/ios/SideDrawer.ios.tsrx.js +2 -1
- package/dist/native/ios/UIActivityIndicatorView.ios.tsrx.js +1 -1
- package/dist/native/ios/UIModal.ios.tsrx.js +1 -1
- package/dist/native/ios/UISlider.ios.tsrx.js +1 -1
- package/dist/native/ios/UISwitch.ios.tsrx.js +1 -1
- package/dist/native/ios/UITabBar.ios.tsrx.js +33 -12
- package/dist/native/ios/UITableView.ios.tsrx.js +15 -3
- package/dist/native/ios/icon.ios.js +7 -0
- package/dist/native/ios/index.js +3 -1
- package/dist/native/ios/openModal.ios.js +1 -1
- package/dist/native/keyboard-inset.mobile.js +66 -0
- package/dist/native/{layout-child.native.js → layout-child.js} +1 -1
- package/dist/native/{modal-presenter.native.js → modal-presenter.mobile.js} +1 -1
- package/dist/native/modifier-factories.js +24 -0
- package/dist/native/native/index.js +3 -3
- package/dist/native/octane-client-build.json +1 -1
- package/dist/native/{pan.native.tsrx.js → pan.tsrx.js} +1 -1
- package/dist/native/{platform.native.js → platform.js} +3 -3
- package/dist/native/{platformProps.native.js → platformProps.js} +3 -1
- package/dist/native/{refresh.native.js → refresh.js} +1 -1
- package/dist/native/{root-layout.native.js → root-layout.mobile.js} +2 -2
- package/dist/native/route-host.mobile.js +2 -0
- package/dist/native/route-table.js +105 -4
- package/dist/native/{route.native.js → route.js} +49 -13
- package/dist/native/safeAreaInsets.tsrx.js +67 -0
- package/dist/native/shared.js +93 -0
- package/dist/native/{sheet-detents.native.js → sheet-detents.js} +1 -1
- package/dist/native/{sheet-service.native.js → sheet-service.js} +9 -3
- package/dist/native/{stacks.native.js → stacks.js} +1 -1
- package/dist/native/{styled.native.tsrx.js → styled.tsrx.js} +1 -1
- package/dist/native/{svg.native.js → svg.mobile.js} +2 -2
- package/dist/native/tap-to-blur.mobile.js +94 -0
- package/dist/native/{text-write.native.js → text-write.js} +1 -1
- package/dist/native/theme/{colorScheme.native.js → colorScheme.js} +2 -2
- package/dist/native/theme/{status-bar-scheme.native.js → status-bar-scheme.mobile.js} +1 -1
- package/dist/native/theme/theme-scheme.js +2 -2
- package/dist/native/{toast-anchor.native.tsrx.js → toast-anchor.tsrx.js} +3 -3
- package/dist/native/{translate.native.js → translate.js} +1 -1
- package/dist/native/ui.js +92 -90
- package/dist/native/{use-back.native.tsrx.js → use-back.tsrx.js} +2 -2
- package/dist/native/{use-store.native.tsrx.js → use-store.tsrx.js} +1 -1
- package/dist/native/{useMeasure.native.tsrx.js → useMeasure.tsrx.js} +1 -1
- package/dist/native/vendor/ui-svg/index.android.js +137 -0
- package/dist/native/vendor/ui-svg/index.common.js +10 -0
- package/dist/native/vendor/ui-svg/index.ios.js +111 -0
- package/dist/native/virtual-list-layout.js +146 -0
- package/dist/native/{windows.native.js → windows.js} +1 -1
- package/dist/web/{web/Hoverable.web.tsrx.js → Hoverable.web.tsrx.js} +7 -6
- package/dist/web/ListItem.web.tsrx.js +139 -0
- package/dist/web/SafeArea.web.tsrx.js +9 -3
- package/dist/web/Tabs.web.tsrx.js +88 -44
- package/dist/web/{web/Tooltip.web.tsrx.js → Tooltip.web.tsrx.js} +7 -6
- package/dist/web/VirtualList.web.tsrx.js +622 -0
- package/dist/web/WebView.web.tsrx.js +42 -5
- package/dist/web/octane-client-build.json +1 -1
- package/dist/web/platform.web.js +1 -1
- package/dist/web/route-table.js +105 -4
- package/dist/web/route.web.js +36 -11
- package/dist/web/ui.js +9 -8
- package/dist/web/virtual-list-layout.js +146 -0
- package/dist/web/web/index.js +2 -2
- package/package.json +51 -23
- package/platforms/android/include.gradle +8 -0
- package/platforms/android/native-api-usage.json +8 -0
- package/platforms/ios/Podfile +2 -0
- package/src/Absolute.tsrx +22 -0
- package/src/Absolute.web.tsrx +22 -0
- package/src/Accordion.macos.tsrx +50 -0
- package/src/Accordion.tsrx +50 -0
- package/src/Accordion.web.tsrx +43 -0
- package/src/ActivityIndicator.tsrx +29 -0
- package/src/ActivityIndicator.web.tsrx +14 -0
- package/src/Alert.macos.tsrx +42 -0
- package/src/Alert.tsrx +24 -0
- package/src/Alert.web.tsrx +23 -0
- package/src/Avatar.macos.tsrx +25 -0
- package/src/Avatar.tsrx +25 -0
- package/src/Avatar.web.tsrx +24 -0
- package/src/AvatarGroup.macos.tsrx +32 -0
- package/src/AvatarGroup.tsrx +32 -0
- package/src/AvatarGroup.web.tsrx +29 -0
- package/src/Badge.macos.tsrx +12 -0
- package/src/Badge.tsrx +12 -0
- package/src/Badge.web.tsrx +10 -0
- package/src/Banner.macos.tsrx +20 -0
- package/src/Banner.tsrx +20 -0
- package/src/Banner.web.tsrx +20 -0
- package/src/Breadcrumb.macos.tsrx +27 -0
- package/src/Breadcrumb.tsrx +27 -0
- package/src/Breadcrumb.web.tsrx +25 -0
- package/src/Button.tsrx +23 -0
- package/src/Button.web.tsrx +21 -0
- package/src/CameraView.macos.tsrx +6 -0
- package/src/Card.macos.tsrx +13 -0
- package/src/Card.tsrx +13 -0
- package/src/Card.web.tsrx +11 -0
- package/src/Checkbox.tsrx +23 -0
- package/src/Checkbox.web.tsrx +34 -0
- package/src/CheckboxGroup.macos.tsrx +39 -0
- package/src/CheckboxGroup.tsrx +39 -0
- package/src/CheckboxGroup.web.tsrx +38 -0
- package/src/Chip.macos.tsrx +25 -0
- package/src/Chip.tsrx +25 -0
- package/src/Chip.web.tsrx +25 -0
- package/src/Collapsible.macos.tsrx +39 -0
- package/src/Collapsible.tsrx +39 -0
- package/src/Collapsible.web.tsrx +33 -0
- package/src/CommandPalette.macos.tsrx +58 -0
- package/src/CommandPalette.tsrx +58 -0
- package/src/CommandPalette.web.tsrx +59 -0
- package/src/ContextMenu.macos.tsrx +59 -0
- package/src/ContextMenu.tsrx +59 -0
- package/src/ContextMenu.web.tsrx +69 -0
- package/src/Drawer.macos.tsrx +28 -0
- package/src/Drawer.tsrx +25 -0
- package/src/Drawer.web.tsrx +31 -0
- package/src/DropdownMenu.macos.tsrx +63 -0
- package/src/DropdownMenu.tsrx +63 -0
- package/src/DropdownMenu.web.tsrx +78 -0
- package/src/Empty.macos.tsrx +15 -0
- package/src/Empty.tsrx +15 -0
- package/src/Empty.web.tsrx +13 -0
- package/src/FieldGroup.macos.tsrx +17 -0
- package/src/FieldGroup.tsrx +17 -0
- package/src/FieldGroup.web.tsrx +17 -0
- package/src/FormField.macos.tsrx +25 -0
- package/src/FormField.tsrx +25 -0
- package/src/FormField.web.tsrx +24 -0
- package/src/Grid.tsrx +32 -0
- package/src/Grid.web.tsrx +43 -0
- package/src/Heading.macos.tsrx +8 -0
- package/src/Heading.tsrx +17 -0
- package/src/Heading.web.tsrx +15 -0
- package/src/Hoverable.mobile.tsrx +21 -0
- package/src/Hoverable.tsrx +113 -0
- package/src/Hoverable.web.tsrx +98 -0
- package/src/Icon.macos.tsrx +18 -0
- package/src/Icon.tsrx +65 -0
- package/src/Icon.web.tsrx +75 -0
- package/src/Image.macos.tsrx +12 -0
- package/src/Image.tsrx +51 -0
- package/src/Image.web.tsrx +14 -0
- package/src/InputNumber.macos.tsrx +49 -0
- package/src/InputNumber.tsrx +49 -0
- package/src/InputNumber.web.tsrx +47 -0
- package/src/InputRating.macos.tsrx +42 -0
- package/src/InputRating.tsrx +39 -0
- package/src/InputRating.web.tsrx +52 -0
- package/src/InputTags.macos.tsrx +49 -0
- package/src/InputTags.tsrx +49 -0
- package/src/InputTags.web.tsrx +49 -0
- package/src/Kbd.macos.tsrx +11 -0
- package/src/Kbd.tsrx +11 -0
- package/src/Kbd.web.tsrx +9 -0
- package/src/KeyboardAvoiding.macos.tsrx +8 -0
- package/src/KeyboardAvoiding.mobile.tsrx +63 -0
- package/src/Link.macos.tsrx +15 -0
- package/src/Link.tsrx +10 -0
- package/src/Link.web.tsrx +12 -0
- package/src/ListItem.macos.tsrx +52 -0
- package/src/ListItem.tsrx +52 -0
- package/src/ListItem.web.tsrx +50 -0
- package/src/Meter.macos.tsrx +8 -0
- package/src/Meter.tsrx +45 -0
- package/src/Meter.web.tsrx +32 -0
- package/src/NavLink.macos.tsrx +24 -0
- package/src/NavLink.tsrx +22 -0
- package/src/NavLink.web.tsrx +23 -0
- package/src/NavigationMenu.macos.tsrx +31 -0
- package/src/NavigationMenu.tsrx +28 -0
- package/src/NavigationMenu.web.tsrx +31 -0
- package/src/Overlay.macos.tsrx +11 -0
- package/src/Overlay.tsrx +84 -0
- package/src/Overlay.web.tsrx +23 -0
- package/src/Pagination.macos.tsrx +54 -0
- package/src/Pagination.tsrx +47 -0
- package/src/Pagination.web.tsrx +50 -0
- package/src/PinInput.macos.tsrx +46 -0
- package/src/PinInput.tsrx +46 -0
- package/src/PinInput.web.tsrx +45 -0
- package/src/Popover.macos.tsrx +11 -0
- package/src/Popover.tsrx +157 -0
- package/src/Popover.web.tsrx +109 -0
- package/src/Pressable.macos.tsrx +19 -0
- package/src/Pressable.tsrx +37 -0
- package/src/Pressable.web.tsrx +45 -0
- package/src/ProgressGroup.macos.tsrx +17 -0
- package/src/ProgressGroup.tsrx +17 -0
- package/src/ProgressGroup.web.tsrx +15 -0
- package/src/RadioGroup.macos.tsrx +50 -0
- package/src/RadioGroup.tsrx +34 -0
- package/src/RadioGroup.web.tsrx +43 -0
- package/src/RichText.tsrx +40 -0
- package/src/RichText.web.tsrx +24 -0
- package/src/RouteHost.macos.tsrx +18 -0
- package/src/RouteHost.mobile.tsrx +44 -0
- package/src/Row.macos.tsrx +26 -0
- package/src/Row.tsrx +27 -0
- package/src/Row.web.tsrx +27 -0
- package/src/SafeArea.macos.tsrx +8 -0
- package/src/SafeArea.tsrx +20 -0
- package/src/SafeArea.web.tsrx +24 -0
- package/src/Screen.macos.tsrx +14 -0
- package/src/Screen.tsrx +31 -0
- package/src/Screen.web.tsrx +7 -0
- package/src/ScrollBox.tsrx +8 -0
- package/src/ScrollBox.web.tsrx +7 -0
- package/src/ScrollView.macos.tsrx +19 -0
- package/src/ScrollView.tsrx +117 -0
- package/src/ScrollView.web.tsrx +109 -0
- package/src/SearchInput.tsrx +60 -0
- package/src/SearchInput.web.test.tsrx +58 -0
- package/src/SearchInput.web.tsrx +55 -0
- package/src/SegmentedControl.tsrx +43 -0
- package/src/SegmentedControl.web.test.tsrx +46 -0
- package/src/SegmentedControl.web.tsrx +51 -0
- package/src/Select.macos.tsrx +104 -0
- package/src/Select.tsrx +104 -0
- package/src/Select.web.tsrx +124 -0
- package/src/Separator.macos.tsrx +17 -0
- package/src/Separator.tsrx +17 -0
- package/src/Separator.web.tsrx +17 -0
- package/src/Sheet.macos.tsrx +15 -0
- package/src/Sheet.tsrx +122 -0
- package/src/Sheet.web.tsrx +56 -0
- package/src/Skeleton.macos.tsrx +15 -0
- package/src/Skeleton.tsrx +15 -0
- package/src/Skeleton.web.tsrx +15 -0
- package/src/Slider.tsrx +71 -0
- package/src/Slider.web.tsrx +60 -0
- package/src/Spacer.tsrx +8 -0
- package/src/Spacer.web.tsrx +6 -0
- package/src/Stack.tsrx +24 -0
- package/src/Stack.web.tsrx +22 -0
- package/src/Stepper.macos.tsrx +52 -0
- package/src/Stepper.tsrx +31 -0
- package/src/Stepper.web.tsrx +37 -0
- package/src/Switch.tsrx +21 -0
- package/src/Switch.web.tsrx +28 -0
- package/src/Table.macos.tsrx +37 -0
- package/src/Table.tsrx +37 -0
- package/src/Table.web.tsrx +37 -0
- package/src/Tabs.macos.tsrx +60 -0
- package/src/Tabs.tsrx +55 -0
- package/src/Tabs.web.tsrx +98 -0
- package/src/Text.macos.tsrx +18 -0
- package/src/Text.tsrx +62 -0
- package/src/Text.web.tsrx +31 -0
- package/src/TextArea.tsrx +65 -0
- package/src/TextArea.web.tsrx +61 -0
- package/src/TextInput.tsrx +39 -0
- package/src/TextInput.web.tsrx +28 -0
- package/src/Timeline.macos.tsrx +27 -0
- package/src/Timeline.tsrx +24 -0
- package/src/Timeline.web.tsrx +22 -0
- package/src/Tooltip.mobile.tsrx +20 -0
- package/src/Tooltip.tsrx +102 -0
- package/src/Tooltip.web.tsrx +156 -0
- package/src/Tree.macos.tsrx +45 -0
- package/src/Tree.tsrx +45 -0
- package/src/Tree.web.tsrx +52 -0
- package/src/User.macos.tsrx +24 -0
- package/src/User.tsrx +24 -0
- package/src/User.web.tsrx +24 -0
- package/src/View.macos.tsrx +29 -0
- package/src/View.tsrx +32 -0
- package/src/View.web.tsrx +33 -0
- package/src/VirtualList.macos.tsrx +335 -0
- package/src/VirtualList.tsrx +358 -0
- package/src/VirtualList.web.tsrx +313 -0
- package/src/WebView.macos.tsrx +6 -0
- package/src/WebView.tsrx +89 -0
- package/src/WebView.web.tsrx +92 -0
- package/src/aliases.macos.tsrx +18 -0
- package/src/aliases.tsrx +18 -0
- package/src/aliases.web.tsrx +17 -0
- package/src/android/BottomNavigationView.android.tsrx +170 -0
- package/src/android/CircularProgressIndicator.android.tsrx +19 -0
- package/src/android/DrawerLayout.android.tsrx +48 -0
- package/src/android/MaterialDialog.android.tsrx +62 -0
- package/src/android/MaterialSwitch.android.tsrx +18 -0
- package/src/android/RecyclerView.android.tsrx +173 -0
- package/src/android/SeekBar.android.tsrx +20 -0
- package/src/android/icon.android.ts +8 -0
- package/src/android/index.ts +37 -0
- package/src/android/openModal.android.ts +55 -0
- package/src/anim.macos.tsrx +20 -0
- package/src/anim.tsrx +65 -0
- package/src/anim.web.tsrx +55 -0
- package/src/apply-native-modifiers.native.ts +13 -0
- package/src/camera-permission.web.ts +11 -0
- package/src/child-array.ts +16 -0
- package/src/colorScheme.macos.ts +27 -0
- package/src/controls.macos.tsrx +171 -0
- package/src/cx.ts +8 -0
- package/src/escape-props.macos.ts +11 -0
- package/src/escape-props.ts +70 -0
- package/src/escape-props.web.ts +25 -0
- package/src/hosted-unsupported.macos.tsrx +9 -0
- package/src/icons.ts +60 -0
- package/src/index.linux.ts +10 -0
- package/src/index.macos.ts +106 -0
- package/src/index.mobile.ts +6 -0
- package/src/index.shared.ts +269 -0
- package/src/index.ts +1 -0
- package/src/index.web.ts +261 -0
- package/src/ios/LiquidGlass.ios.tsrx +41 -0
- package/src/ios/LiquidGlassContainer.ios.tsrx +34 -0
- package/src/ios/SideDrawer.ios.tsrx +49 -0
- package/src/ios/UIActivityIndicatorView.ios.tsrx +18 -0
- package/src/ios/UIModal.ios.tsrx +68 -0
- package/src/ios/UISlider.ios.tsrx +20 -0
- package/src/ios/UISwitch.ios.tsrx +18 -0
- package/src/ios/UITabBar.ios.tsrx +172 -0
- package/src/ios/UITableView.ios.tsrx +186 -0
- package/src/ios/icon.ios.ts +8 -0
- package/src/ios/index.ts +42 -0
- package/src/ios/openModal.ios.ts +55 -0
- package/src/keyboard-inset.mobile.ts +89 -0
- package/src/layout-child.ts +57 -0
- package/src/layout-child.web.ts +108 -0
- package/src/layout-shells.macos.tsrx +10 -0
- package/src/layout.macos.tsrx +41 -0
- package/src/macos-extras.macos.tsrx +40 -0
- package/src/meter-math.ts +6 -0
- package/src/modal-presenter.mobile.ts +24 -0
- package/src/modifier-factories.ts +20 -0
- package/src/native/index.ts +6 -0
- package/src/pan.tsrx +64 -0
- package/src/pan.web.tsrx +38 -0
- package/src/platform.macos.ts +1 -0
- package/src/platform.ts +7 -0
- package/src/platform.web.ts +6 -0
- package/src/platformProps.ts +23 -0
- package/src/platformProps.web.ts +14 -0
- package/src/popover-position.ts +62 -0
- package/src/popover.mobile.test.ts +54 -0
- package/src/props.ts +1812 -0
- package/src/references.d.ts +2 -0
- package/src/refresh-metrics.ts +11 -0
- package/src/refresh.ts +271 -0
- package/src/refresh.web.test.ts +111 -0
- package/src/refresh.web.ts +205 -0
- package/src/root-layout.mobile.ts +89 -0
- package/src/route-host.mobile.ts +1 -0
- package/src/route-table.test.ts +345 -0
- package/src/route-table.ts +585 -0
- package/src/route.macos.ts +201 -0
- package/src/route.ts +703 -0
- package/src/route.web.ts +366 -0
- package/src/safeAreaInsets.macos.tsrx +7 -0
- package/src/safeAreaInsets.tsrx +60 -0
- package/src/safeAreaInsets.web.tsrx +38 -0
- package/src/sheet-detents.ts +142 -0
- package/src/sheet-detents.web.ts +147 -0
- package/src/sheet-service.macos.ts +60 -0
- package/src/sheet-service.ts +124 -0
- package/src/sheet-service.web.ts +64 -0
- package/src/sheet-snap.test.ts +46 -0
- package/src/sheet-snap.ts +66 -0
- package/src/stacks.macos.ts +13 -0
- package/src/stacks.ts +44 -0
- package/src/stacks.web.ts +9 -0
- package/src/store.mobile.test.ts +149 -0
- package/src/store.ts +39 -0
- package/src/store.web.test.tsrx +58 -0
- package/src/styled.macos.tsrx +23 -0
- package/src/styled.test.ts +40 -0
- package/src/styled.tsrx +36 -0
- package/src/styled.web.tsrx +23 -0
- package/src/surfaces.macos.tsrx +27 -0
- package/src/svg.mobile.ts +76 -0
- package/src/tap-to-blur.mobile.ts +108 -0
- package/src/text-controls.macos.tsrx +11 -0
- package/src/text-write.ts +28 -0
- package/src/text-write.web.ts +13 -0
- package/src/theme/colorScheme.linux.ts +52 -0
- package/src/theme/colorScheme.ts +26 -0
- package/src/theme/colorScheme.web.ts +20 -0
- package/src/theme/status-bar-scheme.mobile.ts +39 -0
- package/src/theme/theme-scheme.macos.ts +50 -0
- package/src/theme/theme-scheme.ts +66 -0
- package/src/theme/tokens.css +44 -22
- package/src/toast-anchor.macos.tsrx +3 -0
- package/src/toast-anchor.tsrx +122 -0
- package/src/toast-anchor.web.tsrx +92 -0
- package/src/toast.tsrx +90 -0
- package/src/toast.web.tsrx +50 -0
- package/src/transform.web.ts +52 -0
- package/src/translate.macos.ts +5 -0
- package/src/translate.ts +13 -0
- package/src/translate.web.ts +15 -0
- package/src/tsconfig.json +8 -0
- package/src/unsupported.macos.tsrx +5 -0
- package/src/use-back.tsrx +11 -0
- package/src/use-back.web.tsrx +12 -0
- package/src/use-store.tsrx +18 -0
- package/src/use-store.web.tsrx +18 -0
- package/src/useMeasure.macos.tsrx +23 -0
- package/src/useMeasure.tsrx +66 -0
- package/src/useMeasure.web.tsrx +39 -0
- package/src/useStore.macos.tsrx +6 -0
- package/src/vendor/ui-svg/LICENSE +201 -0
- package/src/vendor/ui-svg/index.android.ts +189 -0
- package/src/vendor/ui-svg/index.common.ts +19 -0
- package/src/vendor/ui-svg/index.ios.ts +147 -0
- package/src/vendor/ui-svg/index.ts +1 -0
- package/src/vendor/ui-svg/typings/SVGKit.d.ts +2862 -0
- package/src/vendor/ui-svg/typings/android.d.ts +1483 -0
- package/src/vendor/ui-svg/typings/ios.d.ts +1511 -0
- package/src/virtual-list-layout.test.ts +81 -0
- package/src/virtual-list-layout.ts +246 -0
- package/src/web/index.ts +11 -0
- package/src/windows.linux.ts +59 -0
- package/src/windows.macos.ts +10 -0
- package/src/windows.ts +7 -0
- package/src/windows.web.ts +6 -0
- package/types/generated/.tsrx-typegen-manifest.json +249 -0
- package/types/generated/Absolute.d.ts +3 -0
- package/types/generated/Absolute.web.d.ts +3 -0
- package/types/generated/Accordion.d.ts +5 -0
- package/types/generated/Accordion.web.d.ts +5 -0
- package/types/generated/ActivityIndicator.d.ts +7 -0
- package/types/generated/ActivityIndicator.web.d.ts +3 -0
- package/types/generated/Alert.d.ts +4 -0
- package/types/generated/Alert.web.d.ts +5 -0
- package/types/generated/Avatar.d.ts +6 -0
- package/types/generated/Avatar.web.d.ts +7 -0
- package/types/generated/AvatarGroup.d.ts +6 -0
- package/types/generated/AvatarGroup.web.d.ts +6 -0
- package/types/generated/Badge.d.ts +5 -0
- package/types/generated/Badge.web.d.ts +5 -0
- package/types/generated/Banner.d.ts +4 -0
- package/types/generated/Banner.web.d.ts +4 -0
- package/types/generated/Breadcrumb.d.ts +4 -0
- package/types/generated/Breadcrumb.web.d.ts +5 -0
- package/types/generated/Button.d.ts +6 -0
- package/types/generated/Button.web.d.ts +6 -0
- package/types/generated/Card.d.ts +4 -0
- package/types/generated/Card.web.d.ts +4 -0
- package/types/generated/Checkbox.d.ts +5 -0
- package/types/generated/Checkbox.web.d.ts +6 -0
- package/types/generated/CheckboxGroup.d.ts +3 -0
- package/types/generated/CheckboxGroup.web.d.ts +3 -0
- package/types/generated/Chip.d.ts +5 -0
- package/types/generated/Chip.web.d.ts +5 -0
- package/types/generated/Collapsible.d.ts +5 -0
- package/types/generated/Collapsible.web.d.ts +5 -0
- package/types/generated/CommandPalette.d.ts +4 -0
- package/types/generated/CommandPalette.web.d.ts +4 -0
- package/types/generated/ContextMenu.d.ts +5 -0
- package/types/generated/ContextMenu.web.d.ts +4 -0
- package/types/generated/Drawer.d.ts +7 -0
- package/types/generated/Drawer.web.d.ts +7 -0
- package/types/generated/DropdownMenu.d.ts +5 -0
- package/types/generated/DropdownMenu.web.d.ts +5 -0
- package/types/generated/Empty.d.ts +4 -0
- package/types/generated/Empty.web.d.ts +4 -0
- package/types/generated/FieldGroup.d.ts +4 -0
- package/types/generated/FieldGroup.web.d.ts +4 -0
- package/types/generated/FormField.d.ts +5 -0
- package/types/generated/FormField.web.d.ts +5 -0
- package/types/generated/Grid.d.ts +3 -0
- package/types/generated/Grid.web.d.ts +3 -0
- package/types/generated/Heading.d.ts +2 -0
- package/types/generated/Heading.web.d.ts +2 -0
- package/types/generated/Hoverable.d.ts +10 -0
- package/types/generated/Hoverable.web.d.ts +9 -0
- package/types/generated/Icon.d.ts +3 -0
- package/types/generated/Icon.web.d.ts +3 -0
- package/types/generated/Image.d.ts +7 -0
- package/types/generated/Image.web.d.ts +3 -0
- package/types/generated/InputNumber.d.ts +5 -0
- package/types/generated/InputNumber.web.d.ts +5 -0
- package/types/generated/InputRating.d.ts +4 -0
- package/types/generated/InputRating.web.d.ts +4 -0
- package/types/generated/InputTags.d.ts +4 -0
- package/types/generated/InputTags.web.d.ts +5 -0
- package/types/generated/Kbd.d.ts +4 -0
- package/types/generated/Kbd.web.d.ts +4 -0
- package/types/generated/KeyboardAvoiding.mobile.d.ts +2 -0
- package/types/generated/Link.d.ts +2 -0
- package/types/generated/Link.web.d.ts +3 -0
- package/types/generated/ListItem.d.ts +3 -0
- package/types/generated/ListItem.web.d.ts +3 -0
- package/types/generated/Meter.d.ts +3 -0
- package/types/generated/Meter.web.d.ts +3 -0
- package/types/generated/NavLink.d.ts +3 -0
- package/types/generated/NavLink.web.d.ts +3 -0
- package/types/generated/NavigationMenu.d.ts +4 -0
- package/types/generated/NavigationMenu.web.d.ts +5 -0
- package/types/generated/Overlay.d.ts +3 -0
- package/types/generated/Overlay.web.d.ts +3 -0
- package/types/generated/Pagination.d.ts +4 -0
- package/types/generated/Pagination.web.d.ts +5 -0
- package/types/generated/PinInput.d.ts +4 -0
- package/types/generated/PinInput.web.d.ts +4 -0
- package/types/generated/Popover.d.ts +6 -0
- package/types/generated/Popover.web.d.ts +3 -0
- package/types/generated/Pressable.d.ts +6 -0
- package/types/generated/Pressable.web.d.ts +2 -0
- package/types/generated/ProgressGroup.d.ts +3 -0
- package/types/generated/ProgressGroup.web.d.ts +4 -0
- package/types/generated/RadioGroup.d.ts +5 -0
- package/types/generated/RadioGroup.web.d.ts +5 -0
- package/types/generated/RichText.d.ts +7 -0
- package/types/generated/RichText.web.d.ts +3 -0
- package/types/generated/RouteHost.mobile.d.ts +14 -0
- package/types/generated/Row.d.ts +2 -0
- package/types/generated/Row.web.d.ts +2 -0
- package/types/generated/SafeArea.d.ts +2 -0
- package/types/generated/SafeArea.web.d.ts +3 -0
- package/types/generated/Screen.d.ts +3 -0
- package/types/generated/Screen.web.d.ts +3 -0
- package/types/generated/ScrollBox.d.ts +3 -0
- package/types/generated/ScrollBox.web.d.ts +3 -0
- package/types/generated/ScrollView.d.ts +7 -0
- package/types/generated/ScrollView.web.d.ts +6 -0
- package/types/generated/SearchInput.d.ts +7 -0
- package/types/generated/SearchInput.web.d.ts +6 -0
- package/types/generated/SegmentedControl.d.ts +7 -0
- package/types/generated/SegmentedControl.web.d.ts +6 -0
- package/types/generated/Select.d.ts +6 -0
- package/types/generated/Select.web.d.ts +6 -0
- package/types/generated/Separator.d.ts +5 -0
- package/types/generated/Separator.web.d.ts +5 -0
- package/types/generated/Sheet.d.ts +5 -0
- package/types/generated/Sheet.web.d.ts +7 -0
- package/types/generated/Skeleton.d.ts +5 -0
- package/types/generated/Skeleton.web.d.ts +6 -0
- package/types/generated/Slider.d.ts +6 -0
- package/types/generated/Slider.web.d.ts +6 -0
- package/types/generated/Spacer.d.ts +3 -0
- package/types/generated/Spacer.web.d.ts +3 -0
- package/types/generated/Stack.d.ts +3 -0
- package/types/generated/Stack.web.d.ts +3 -0
- package/types/generated/Stepper.d.ts +4 -0
- package/types/generated/Stepper.web.d.ts +5 -0
- package/types/generated/Switch.d.ts +7 -0
- package/types/generated/Switch.web.d.ts +6 -0
- package/types/generated/Table.d.ts +4 -0
- package/types/generated/Table.web.d.ts +5 -0
- package/types/generated/Tabs.d.ts +10 -0
- package/types/generated/Tabs.web.d.ts +6 -0
- package/types/generated/Text.d.ts +2 -0
- package/types/generated/Text.web.d.ts +2 -0
- package/types/generated/TextArea.d.ts +8 -0
- package/types/generated/TextArea.web.d.ts +9 -0
- package/types/generated/TextInput.d.ts +9 -0
- package/types/generated/TextInput.web.d.ts +2 -0
- package/types/generated/Timeline.d.ts +3 -0
- package/types/generated/Timeline.web.d.ts +4 -0
- package/types/generated/Tooltip.d.ts +9 -0
- package/types/generated/Tooltip.web.d.ts +12 -0
- package/types/generated/Tree.d.ts +4 -0
- package/types/generated/Tree.web.d.ts +4 -0
- package/types/generated/User.d.ts +5 -0
- package/types/generated/User.web.d.ts +5 -0
- package/types/generated/View.d.ts +7 -0
- package/types/generated/View.web.d.ts +7 -0
- package/types/generated/VirtualList.d.ts +5 -0
- package/types/generated/VirtualList.web.d.ts +4 -0
- package/types/generated/WebView.d.ts +11 -0
- package/types/generated/WebView.web.d.ts +5 -0
- package/types/generated/aliases.d.ts +7 -0
- package/types/generated/aliases.web.d.ts +7 -0
- package/types/generated/android/BottomNavigationView.android.d.ts +9 -0
- package/types/generated/android/CircularProgressIndicator.android.d.ts +6 -0
- package/types/generated/android/DrawerLayout.android.d.ts +12 -0
- package/types/generated/android/MaterialDialog.android.d.ts +8 -0
- package/types/generated/android/MaterialSwitch.android.d.ts +6 -0
- package/types/generated/android/RecyclerView.android.d.ts +14 -0
- package/types/generated/android/SeekBar.android.d.ts +5 -0
- package/types/generated/android/icon.android.d.ts +5 -0
- package/types/generated/android/index.d.ts +12 -0
- package/types/generated/android/openModal.android.d.ts +4 -0
- package/types/generated/anim.d.ts +10 -0
- package/types/generated/anim.web.d.ts +3 -0
- package/types/generated/apply-native-modifiers.native.d.ts +3 -0
- package/types/generated/child-array.d.ts +3 -0
- package/types/generated/cx.d.ts +6 -0
- package/types/generated/escape-props.d.ts +16 -0
- package/types/generated/icons.d.ts +5 -0
- package/types/generated/index.d.ts +1 -0
- package/types/generated/index.linux.d.ts +5 -0
- package/types/generated/index.mobile.d.ts +4 -0
- package/types/generated/index.shared.d.ts +111 -0
- package/types/generated/index.web.d.ts +111 -0
- package/types/generated/ios/LiquidGlass.ios.d.ts +12 -0
- package/types/generated/ios/LiquidGlassContainer.ios.d.ts +13 -0
- package/types/generated/ios/SideDrawer.ios.d.ts +12 -0
- package/types/generated/ios/UIActivityIndicatorView.ios.d.ts +5 -0
- package/types/generated/ios/UIModal.ios.d.ts +7 -0
- package/types/generated/ios/UISlider.ios.d.ts +5 -0
- package/types/generated/ios/UISwitch.ios.d.ts +6 -0
- package/types/generated/ios/UITabBar.ios.d.ts +7 -0
- package/types/generated/ios/UITableView.ios.d.ts +14 -0
- package/types/generated/ios/icon.ios.d.ts +5 -0
- package/types/generated/ios/index.d.ts +14 -0
- package/types/generated/ios/openModal.ios.d.ts +4 -0
- package/types/generated/keyboard-inset.mobile.d.ts +10 -0
- package/types/generated/layout-child.d.ts +6 -0
- package/types/generated/layout-child.web.d.ts +15 -0
- package/types/generated/meter-math.d.ts +6 -0
- package/types/generated/modal-presenter.mobile.d.ts +14 -0
- package/types/generated/modifier-factories.d.ts +15 -0
- package/types/generated/native/index.d.ts +3 -0
- package/types/generated/pan.d.ts +2 -0
- package/types/generated/pan.web.d.ts +9 -0
- package/types/generated/platform.d.ts +7 -0
- package/types/generated/platform.web.d.ts +6 -0
- package/types/generated/platformProps.d.ts +7 -0
- package/types/generated/platformProps.web.d.ts +2 -0
- package/types/generated/popover-position.d.ts +14 -0
- package/types/{props.d.ts → generated/props.d.ts} +127 -133
- package/types/generated/refresh-metrics.d.ts +8 -0
- package/types/generated/refresh.d.ts +42 -0
- package/types/generated/refresh.web.d.ts +23 -0
- package/types/generated/root-layout.mobile.d.ts +22 -0
- package/types/generated/route-host.mobile.d.ts +1 -0
- package/types/generated/route-table.d.ts +90 -0
- package/types/generated/route.d.ts +74 -0
- package/types/generated/route.web.d.ts +67 -0
- package/types/generated/safeAreaInsets.d.ts +8 -0
- package/types/generated/safeAreaInsets.web.d.ts +8 -0
- package/types/generated/sheet-detents.d.ts +23 -0
- package/types/generated/sheet-detents.web.d.ts +13 -0
- package/types/generated/sheet-service.d.ts +11 -0
- package/types/generated/sheet-service.web.d.ts +6 -0
- package/types/generated/sheet-snap.d.ts +18 -0
- package/types/generated/stacks.d.ts +9 -0
- package/types/generated/stacks.web.d.ts +4 -0
- package/types/generated/store.d.ts +14 -0
- package/types/generated/styled.d.ts +20 -0
- package/types/generated/styled.web.d.ts +10 -0
- package/types/generated/svg.mobile.d.ts +23 -0
- package/types/generated/tap-to-blur.mobile.d.ts +16 -0
- package/types/generated/text-write.d.ts +9 -0
- package/types/generated/theme/colorScheme.d.ts +6 -0
- package/types/generated/theme/colorScheme.linux.d.ts +5 -0
- package/types/generated/theme/colorScheme.web.d.ts +5 -0
- package/types/generated/theme/status-bar-scheme.mobile.d.ts +1 -0
- package/types/generated/theme/theme-scheme.d.ts +20 -0
- package/types/generated/toast-anchor.d.ts +4 -0
- package/types/generated/toast-anchor.web.d.ts +4 -0
- package/types/generated/transform.web.d.ts +8 -0
- package/types/generated/translate.d.ts +5 -0
- package/types/generated/translate.web.d.ts +6 -0
- package/types/generated/use-back.d.ts +6 -0
- package/types/generated/use-back.web.d.ts +7 -0
- package/types/generated/use-store.d.ts +9 -0
- package/types/generated/use-store.web.d.ts +9 -0
- package/types/generated/useMeasure.d.ts +3 -0
- package/types/generated/useMeasure.web.d.ts +3 -0
- package/types/generated/vendor/ui-svg/index.common.d.ts +7 -0
- package/types/generated/vendor/ui-svg/index.d.ts +1 -0
- package/types/generated/vendor/ui-svg/index.ios.d.ts +13 -0
- package/types/generated/virtual-list-layout.d.ts +44 -0
- package/types/generated/web/index.d.ts +3 -0
- package/types/generated/windows.d.ts +3 -0
- package/types/generated/windows.linux.d.ts +15 -0
- package/types/generated/windows.web.d.ts +3 -0
- package/types/index.macos.d.ts +142 -0
- package/dist/native/CameraView.native.tsrx.js +0 -165
- package/dist/native/Meter.native.tsrx.js +0 -92
- package/dist/native/Pager.native.tsrx.js +0 -282
- package/dist/native/Video.native.tsrx.js +0 -248
- package/dist/native/camera-permission.native.js +0 -47
- package/dist/native/safeAreaInsets.native.tsrx.js +0 -35
- package/dist/native/video-chrome.native.tsrx.js +0 -365
- package/dist/web/CameraView.web.tsrx.js +0 -310
- package/dist/web/Pager.web.tsrx.js +0 -337
- package/dist/web/Video.web.tsrx.js +0 -400
- package/dist/web/video-chrome.web.tsrx.js +0 -207
- package/types/android.d.ts +0 -53
- package/types/index.d.ts +0 -273
- package/types/index.native.d.ts +0 -273
- package/types/index.web.d.ts +0 -272
- package/types/ios.d.ts +0 -59
- package/types/native.d.ts +0 -5
- package/types/web.d.ts +0 -17
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Pull-to-refresh geometry — one strip height drives the indicator
|
|
2
|
+
* reveal, the default trigger threshold, and the docked gap on every
|
|
3
|
+
* target (px on web, dip on native — equal by the dip≈px contract). */
|
|
4
|
+
export const REFRESH_HEADER_HEIGHT = 64
|
|
5
|
+
|
|
6
|
+
/** Finger-travel → content displacement. iOS rubber-band applies ~0.5
|
|
7
|
+
* resistance at small pulls; web/Android drive the same ratio so the
|
|
8
|
+
* affordance reads identically across targets. */
|
|
9
|
+
export function dampenPull(dy: number): number {
|
|
10
|
+
return dy * 0.5
|
|
11
|
+
}
|
package/src/refresh.ts
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { isIOS } from '@nativescript/core'
|
|
2
|
+
import { REFRESH_HEADER_HEIGHT, dampenPull } from './refresh-metrics'
|
|
3
|
+
|
|
4
|
+
export interface RefreshConfig {
|
|
5
|
+
onRefresh?: () => void
|
|
6
|
+
refreshing?: boolean
|
|
7
|
+
threshold?: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface RefreshHost {
|
|
11
|
+
/** The scrolling view — NS ScrollView or ListView. */
|
|
12
|
+
scroller: any
|
|
13
|
+
/** The overlay strip (owns the self-drawn spinner), translated in/out. */
|
|
14
|
+
indicator: any
|
|
15
|
+
/** True when the scroller is resting at its top edge (Android only —
|
|
16
|
+
* iOS reads the overscroll directly from contentOffset). */
|
|
17
|
+
isAtTop: () => boolean
|
|
18
|
+
/** Latest props — a ref so callback identity churn can't re-attach. */
|
|
19
|
+
cfg: { current: RefreshConfig }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface RefreshController {
|
|
23
|
+
/** Call when `refreshing` changes — docks/undocks the indicator. */
|
|
24
|
+
sync: () => void
|
|
25
|
+
detach: () => void
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const PAN_ENDED = new Set([0, 3]) // GestureStateTypes cancelled / ended
|
|
29
|
+
const DOCK_ANIM_MS = 180
|
|
30
|
+
|
|
31
|
+
/* UIEdgeInsetsMake is a UIKit inline function — reach it through
|
|
32
|
+
* globalThis so nothing references NS globals at module scope. */
|
|
33
|
+
function makeInsets(top: number, left: number, bottom: number, right: number) {
|
|
34
|
+
const make = (globalThis as any).UIEdgeInsetsMake
|
|
35
|
+
if (make) {
|
|
36
|
+
return make(top, left, bottom, right)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return { top, left, bottom, right }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Pan-driven pull-to-refresh over any NS scrollable (scrollview or
|
|
43
|
+
* listview). Two mechanics, one visual:
|
|
44
|
+
*
|
|
45
|
+
* iOS — UIScrollView's own bounce supplies the content displacement
|
|
46
|
+
* (NS gesture delegates allow simultaneous recognition, so our pan on
|
|
47
|
+
* the scroller observes alongside the scroll pan). The handler reads
|
|
48
|
+
* `contentOffset` for the live gap and docks with
|
|
49
|
+
* `contentInset.top += H` — the exact mechanics UIRefreshControl uses.
|
|
50
|
+
*
|
|
51
|
+
* Android — there is no overscroll; the scroller box itself is
|
|
52
|
+
* translated inside the clipping wrapper while the damped drag
|
|
53
|
+
* accumulates. Docking holds the translate at H. Edge glow is disabled
|
|
54
|
+
* (OVER_SCROLL_NEVER) so no OS chrome leaks into the pixels.
|
|
55
|
+
*
|
|
56
|
+
* Releasing past `threshold` fires `onRefresh` once per pull and holds
|
|
57
|
+
* the docked gap; the controlled `refreshing` prop keeps it docked.
|
|
58
|
+
* A short grace window collapses the dock if `refreshing` never comes —
|
|
59
|
+
* props land a render after `onRefresh` fires. */
|
|
60
|
+
export function createPullToRefresh(host: RefreshHost): RefreshController {
|
|
61
|
+
const { scroller, indicator, isAtTop, cfg } = host
|
|
62
|
+
if (!scroller || !indicator) {
|
|
63
|
+
return { sync: () => {}, detach: () => {} }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
let docked = false // gesture-driven dock at REFRESH_HEADER_HEIGHT
|
|
67
|
+
let pullAcc = 0 // android: damped accumulation beyond the held baseline
|
|
68
|
+
let prevDy = 0
|
|
69
|
+
let touching = false // a pan gesture is in flight
|
|
70
|
+
let grace: any = null
|
|
71
|
+
let baseInsetTop: number | null = null
|
|
72
|
+
let lastTy = Number.NaN
|
|
73
|
+
|
|
74
|
+
const threshold = () => cfg.current.threshold ?? REFRESH_HEADER_HEIGHT
|
|
75
|
+
/** Resting gap: the strip stays docked while the gesture docked it OR
|
|
76
|
+
* the controlled `refreshing` prop holds it open. */
|
|
77
|
+
const held = () => docked || !!cfg.current.refreshing
|
|
78
|
+
|
|
79
|
+
/* iOS: distance the content hangs below its resting top edge — 0 at
|
|
80
|
+
* rest whether docked or not, so the held gap is added back by the
|
|
81
|
+
* caller. */
|
|
82
|
+
const iosOverscroll = () => {
|
|
83
|
+
const sv = scroller.ios
|
|
84
|
+
if (!sv?.contentOffset) {
|
|
85
|
+
return 0
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return Math.max(0, -(sv.contentOffset.y + sv.contentInset.top))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const applyReveal = (reveal: number) => {
|
|
92
|
+
const ty = reveal - REFRESH_HEADER_HEIGHT
|
|
93
|
+
if (ty !== lastTy) {
|
|
94
|
+
lastTy = ty
|
|
95
|
+
indicator.translateY = ty
|
|
96
|
+
if (!isIOS) {
|
|
97
|
+
scroller.translateY = reveal
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const settle = (reveal: number) => {
|
|
103
|
+
lastTy = Number.NaN // animate() owns translateY now
|
|
104
|
+
if (isIOS) {
|
|
105
|
+
animateTo(indicator, reveal - REFRESH_HEADER_HEIGHT)
|
|
106
|
+
} else {
|
|
107
|
+
animateTo(scroller, reveal)
|
|
108
|
+
animateTo(indicator, reveal - REFRESH_HEADER_HEIGHT)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const setInset = (on: boolean) => {
|
|
113
|
+
const sv = scroller.ios
|
|
114
|
+
if (!sv?.contentInset) {
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (on && baseInsetTop == null) {
|
|
119
|
+
baseInsetTop = sv.contentInset.top
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const next = (baseInsetTop ?? 0) + (on ? REFRESH_HEADER_HEIGHT : 0)
|
|
123
|
+
if (Math.abs(sv.contentInset.top - next) < 0.5) {
|
|
124
|
+
return
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const apply = () => {
|
|
128
|
+
sv.contentInset = makeInsets(next, sv.contentInset.left, sv.contentInset.bottom, sv.contentInset.right)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const UIView = (globalThis as any).UIView
|
|
132
|
+
if (UIView?.animateWithDurationAnimations) {
|
|
133
|
+
UIView.animateWithDurationAnimations(DOCK_ANIM_MS / 1000, apply)
|
|
134
|
+
} else {
|
|
135
|
+
apply()
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function animateTo(view: any, y: number) {
|
|
140
|
+
view?.animate?.({ translate: { x: 0, y }, duration: DOCK_ANIM_MS })
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const dock = () => {
|
|
144
|
+
docked = true
|
|
145
|
+
pullAcc = 0
|
|
146
|
+
if (isIOS) {
|
|
147
|
+
setInset(true)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
settle(REFRESH_HEADER_HEIGHT)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const collapse = () => {
|
|
154
|
+
docked = false
|
|
155
|
+
pullAcc = 0
|
|
156
|
+
if (isIOS) {
|
|
157
|
+
setInset(false)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
settle(0)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** `extra` is pull beyond the held baseline — a release only fires
|
|
164
|
+
* `onRefresh` when the user actually pulled (a resting release inside
|
|
165
|
+
* the dock re-fires nothing). */
|
|
166
|
+
const release = (extra: number) => {
|
|
167
|
+
const reveal = extra + (held() ? REFRESH_HEADER_HEIGHT : 0)
|
|
168
|
+
if (extra > 0 && reveal >= threshold()) {
|
|
169
|
+
cfg.current.onRefresh?.()
|
|
170
|
+
dock()
|
|
171
|
+
clearTimeout(grace)
|
|
172
|
+
grace = setTimeout(() => {
|
|
173
|
+
if (!cfg.current.refreshing) {
|
|
174
|
+
collapse()
|
|
175
|
+
}
|
|
176
|
+
}, 350)
|
|
177
|
+
} else if (held()) {
|
|
178
|
+
// A `refreshing`-driven dock deferred while the finger was down
|
|
179
|
+
// applies now; gesture-driven docks just settle back.
|
|
180
|
+
docked = true
|
|
181
|
+
pullAcc = 0
|
|
182
|
+
if (isIOS) {
|
|
183
|
+
setInset(true)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
settle(REFRESH_HEADER_HEIGHT)
|
|
187
|
+
} else {
|
|
188
|
+
collapse()
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const onPan = (e: any) => {
|
|
193
|
+
if (isIOS) {
|
|
194
|
+
// Clamped: once the user scrolls down past the held gap the
|
|
195
|
+
// indicator stays pinned — the dock is header-fixed, not a
|
|
196
|
+
// content row (uniform with the Android/web overlay).
|
|
197
|
+
const extra = iosOverscroll()
|
|
198
|
+
if (PAN_ENDED.has(e.state)) {
|
|
199
|
+
touching = false
|
|
200
|
+
release(extra)
|
|
201
|
+
} else {
|
|
202
|
+
touching = true
|
|
203
|
+
applyReveal(extra + (held() ? REFRESH_HEADER_HEIGHT : 0))
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (e.state === 1) {
|
|
210
|
+
touching = true
|
|
211
|
+
prevDy = e.deltaY
|
|
212
|
+
pullAcc = 0
|
|
213
|
+
return
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (PAN_ENDED.has(e.state)) {
|
|
217
|
+
touching = false
|
|
218
|
+
release(pullAcc)
|
|
219
|
+
pullAcc = 0
|
|
220
|
+
return
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const inc = e.deltaY - prevDy
|
|
224
|
+
prevDy = e.deltaY
|
|
225
|
+
if (!isAtTop()) {
|
|
226
|
+
return
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
pullAcc = Math.max(0, pullAcc + dampenPull(inc))
|
|
230
|
+
applyReveal(pullAcc + (held() ? REFRESH_HEADER_HEIGHT : 0))
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// `view.on('pan')` routes through NS's gesture observer; the recognizer
|
|
234
|
+
// attaches when the view loads. iOS marks NS recognizers as simultaneous
|
|
235
|
+
// with the scroll view's own pan, so it fires alongside scrolling.
|
|
236
|
+
scroller.on('pan', onPan)
|
|
237
|
+
// Kill Android's overscroll edge glow — OS chrome breaks the parity
|
|
238
|
+
// contract. 2 = android.view.View.OVER_SCROLL_NEVER.
|
|
239
|
+
if (!isIOS) {
|
|
240
|
+
scroller.android?.setOverScrollMode?.(2)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return {
|
|
244
|
+
sync: () => {
|
|
245
|
+
if (cfg.current.refreshing) {
|
|
246
|
+
clearTimeout(grace)
|
|
247
|
+
// Defer the dock while a gesture is in flight — release()
|
|
248
|
+
// applies it when the finger lifts.
|
|
249
|
+
if (!docked && !touching) {
|
|
250
|
+
dock()
|
|
251
|
+
}
|
|
252
|
+
} else if (docked && !touching) {
|
|
253
|
+
collapse()
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
detach: () => {
|
|
257
|
+
clearTimeout(grace)
|
|
258
|
+
scroller.off('pan', onPan)
|
|
259
|
+
if (docked) {
|
|
260
|
+
docked = false
|
|
261
|
+
if (isIOS) {
|
|
262
|
+
setInset(false)
|
|
263
|
+
} else {
|
|
264
|
+
scroller.translateY = 0
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
indicator.translateY = -REFRESH_HEADER_HEIGHT
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
}
|
|
271
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { createPullToRefresh } from './refresh.web';
|
|
4
|
+
import { REFRESH_HEADER_HEIGHT } from './refresh-metrics';
|
|
5
|
+
|
|
6
|
+
// Unit-level check of the web pull-to-refresh state machine: synthetic
|
|
7
|
+
// pointer events drive the controller, assertions read the composed
|
|
8
|
+
// transform writes (setTranslate → translateX/translateY pair). jsdom has
|
|
9
|
+
// no PointerEvent constructor — plain Events carry the fields the
|
|
10
|
+
// handlers read.
|
|
11
|
+
|
|
12
|
+
function host() {
|
|
13
|
+
const wrapper = document.createElement('div');
|
|
14
|
+
const scroller = document.createElement('div');
|
|
15
|
+
const indicator = document.createElement('div');
|
|
16
|
+
wrapper.appendChild(indicator);
|
|
17
|
+
wrapper.appendChild(scroller);
|
|
18
|
+
document.body.appendChild(wrapper);
|
|
19
|
+
return { wrapper, scroller, indicator };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function pointer(type: string, y: number) {
|
|
23
|
+
const e = new Event(type, { cancelable: true, bubbles: true });
|
|
24
|
+
Object.assign(e, { pointerType: 'mouse', clientY: y, button: 0 });
|
|
25
|
+
return e;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const ty = (el: HTMLElement) => el.style.transform;
|
|
29
|
+
|
|
30
|
+
describe('createPullToRefresh (web)', () => {
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
vi.useFakeTimers();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
vi.useRealTimers();
|
|
37
|
+
document.body.innerHTML = '';
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('tracks a sub-threshold drag and resets on release', () => {
|
|
41
|
+
const { scroller, indicator } = host();
|
|
42
|
+
const cfg = { current: { onRefresh: vi.fn() } };
|
|
43
|
+
const ctl = createPullToRefresh({ scroller, indicator, cfg });
|
|
44
|
+
|
|
45
|
+
scroller.dispatchEvent(pointer('pointerdown', 100));
|
|
46
|
+
scroller.dispatchEvent(pointer('pointermove', 180));
|
|
47
|
+
// damped: 80 * 0.5 = 40
|
|
48
|
+
expect(ty(scroller)).toContain('translateY(40px)');
|
|
49
|
+
expect(ty(indicator)).toContain(`translateY(${40 - REFRESH_HEADER_HEIGHT}px)`);
|
|
50
|
+
|
|
51
|
+
scroller.dispatchEvent(pointer('pointerup', 180));
|
|
52
|
+
expect(cfg.current.onRefresh).not.toHaveBeenCalled();
|
|
53
|
+
expect(ty(scroller)).toContain('translateY(0px)');
|
|
54
|
+
ctl.detach();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('fires onRefresh and docks past the threshold; refreshless release collapses after grace', () => {
|
|
58
|
+
const { scroller, indicator } = host();
|
|
59
|
+
const cfg = { current: { onRefresh: vi.fn(), refreshing: false } };
|
|
60
|
+
const ctl = createPullToRefresh({ scroller, indicator, cfg });
|
|
61
|
+
|
|
62
|
+
scroller.dispatchEvent(pointer('pointerdown', 100));
|
|
63
|
+
scroller.dispatchEvent(pointer('pointermove', 320));
|
|
64
|
+
scroller.dispatchEvent(pointer('pointerup', 320));
|
|
65
|
+
// 220 * 0.5 = 110 >= 64 → docked
|
|
66
|
+
expect(cfg.current.onRefresh).toHaveBeenCalledTimes(1);
|
|
67
|
+
expect(ty(scroller)).toContain(`translateY(${REFRESH_HEADER_HEIGHT}px)`);
|
|
68
|
+
expect(ty(indicator)).toContain('translateY(0px)');
|
|
69
|
+
|
|
70
|
+
// refreshing never arrives → grace collapse
|
|
71
|
+
vi.advanceTimersByTime(400);
|
|
72
|
+
expect(ty(scroller)).toContain('translateY(0px)');
|
|
73
|
+
ctl.detach();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('refreshing keeps the dock; sync(false) collapses', () => {
|
|
77
|
+
const { scroller, indicator } = host();
|
|
78
|
+
const cfg = { current: { onRefresh: vi.fn(), refreshing: false } };
|
|
79
|
+
const ctl = createPullToRefresh({ scroller, indicator, cfg });
|
|
80
|
+
|
|
81
|
+
scroller.dispatchEvent(pointer('pointerdown', 100));
|
|
82
|
+
scroller.dispatchEvent(pointer('pointermove', 320));
|
|
83
|
+
cfg.current.refreshing = true;
|
|
84
|
+
ctl.sync();
|
|
85
|
+
scroller.dispatchEvent(pointer('pointerup', 320));
|
|
86
|
+
expect(cfg.current.onRefresh).toHaveBeenCalledTimes(1);
|
|
87
|
+
|
|
88
|
+
vi.advanceTimersByTime(400);
|
|
89
|
+
expect(ty(scroller)).toContain(`translateY(${REFRESH_HEADER_HEIGHT}px)`);
|
|
90
|
+
|
|
91
|
+
cfg.current.refreshing = false;
|
|
92
|
+
ctl.sync();
|
|
93
|
+
expect(ty(scroller)).toContain('translateY(0px)');
|
|
94
|
+
expect(ty(indicator)).toContain(`translateY(${-REFRESH_HEADER_HEIGHT}px)`);
|
|
95
|
+
ctl.detach();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('ignores drags that start below the top edge', () => {
|
|
99
|
+
const { scroller } = host();
|
|
100
|
+
Object.defineProperty(scroller, 'scrollTop', { value: 30, writable: true });
|
|
101
|
+
const cfg = { current: { onRefresh: vi.fn() } };
|
|
102
|
+
const ctl = createPullToRefresh({ scroller, indicator: document.createElement('div'), cfg });
|
|
103
|
+
|
|
104
|
+
scroller.dispatchEvent(pointer('pointerdown', 100));
|
|
105
|
+
scroller.dispatchEvent(pointer('pointermove', 320));
|
|
106
|
+
scroller.dispatchEvent(pointer('pointerup', 320));
|
|
107
|
+
expect(cfg.current.onRefresh).not.toHaveBeenCalled();
|
|
108
|
+
expect(ty(scroller)).toBe('');
|
|
109
|
+
ctl.detach();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { REFRESH_HEADER_HEIGHT, dampenPull } from './refresh-metrics'
|
|
2
|
+
import { setTranslate } from './translate.web'
|
|
3
|
+
|
|
4
|
+
export interface RefreshConfig {
|
|
5
|
+
onRefresh?: () => void
|
|
6
|
+
refreshing?: boolean
|
|
7
|
+
threshold?: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface RefreshController {
|
|
11
|
+
/** Call when `refreshing` changes — docks/undocks the indicator. */
|
|
12
|
+
sync: () => void
|
|
13
|
+
detach: () => void
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const DOCK_ANIM_MS = 180
|
|
17
|
+
|
|
18
|
+
/** Pointer/touch-driven pull-to-refresh for the DOM leaf — the web has no
|
|
19
|
+
* native overscroll, so drag distance translates the scroller inside the
|
|
20
|
+
* clipped wrapper while the self-drawn indicator slides into the gap.
|
|
21
|
+
* `touchmove` must be non-passive: `preventDefault` is what keeps the
|
|
22
|
+
* browser from taking the gesture as a scroll (or Chrome's own
|
|
23
|
+
* pull-to-refresh on Android). Mouse drags ride the pointer events. */
|
|
24
|
+
export function createPullToRefresh(host: {
|
|
25
|
+
scroller: HTMLElement | null
|
|
26
|
+
indicator: HTMLElement | null
|
|
27
|
+
cfg: { current: RefreshConfig }
|
|
28
|
+
}): RefreshController {
|
|
29
|
+
const { scroller, indicator, cfg } = host
|
|
30
|
+
if (!scroller || !indicator) {
|
|
31
|
+
return { sync: () => {}, detach: () => {} }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let pulling = false
|
|
35
|
+
let y0 = 0
|
|
36
|
+
let pull = 0 // displacement beyond the held baseline
|
|
37
|
+
let docked = false // gesture-driven dock at REFRESH_HEADER_HEIGHT
|
|
38
|
+
let grace: ReturnType<typeof setTimeout> | null = null
|
|
39
|
+
|
|
40
|
+
const threshold = () => cfg.current.threshold ?? REFRESH_HEADER_HEIGHT
|
|
41
|
+
/** Resting gap: the strip stays docked while the gesture docked it OR
|
|
42
|
+
* the controlled `refreshing` prop holds it open. */
|
|
43
|
+
const held = () => docked || !!cfg.current.refreshing
|
|
44
|
+
|
|
45
|
+
const applyReveal = (reveal: number) => {
|
|
46
|
+
setTranslate(indicator, 0, reveal - REFRESH_HEADER_HEIGHT)
|
|
47
|
+
setTranslate(scroller, 0, reveal)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const settle = (reveal: number) => {
|
|
51
|
+
for (const el of [scroller, indicator]) {
|
|
52
|
+
el.style.transition = `transform ${DOCK_ANIM_MS}ms ease-out`
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
applyReveal(reveal)
|
|
56
|
+
setTimeout(() => {
|
|
57
|
+
for (const el of [scroller, indicator]) {
|
|
58
|
+
el.style.transition = ''
|
|
59
|
+
}
|
|
60
|
+
}, DOCK_ANIM_MS)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const dock = () => {
|
|
64
|
+
docked = true
|
|
65
|
+
pull = 0
|
|
66
|
+
settle(REFRESH_HEADER_HEIGHT)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const collapse = () => {
|
|
70
|
+
docked = false
|
|
71
|
+
pull = 0
|
|
72
|
+
settle(0)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** `pull` is drag distance beyond the held baseline — a release only
|
|
76
|
+
* fires `onRefresh` when the user actually pulled (a resting release
|
|
77
|
+
* inside the dock re-fires nothing). */
|
|
78
|
+
const release = () => {
|
|
79
|
+
pulling = false
|
|
80
|
+
const reveal = pull + (held() ? REFRESH_HEADER_HEIGHT : 0)
|
|
81
|
+
if (pull > 0 && reveal >= threshold()) {
|
|
82
|
+
cfg.current.onRefresh?.()
|
|
83
|
+
dock()
|
|
84
|
+
if (grace) {
|
|
85
|
+
clearTimeout(grace)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
grace = setTimeout(() => {
|
|
89
|
+
if (!cfg.current.refreshing) {
|
|
90
|
+
collapse()
|
|
91
|
+
}
|
|
92
|
+
}, 350)
|
|
93
|
+
} else if (held()) {
|
|
94
|
+
// A `refreshing`-driven dock deferred while the pointer was down
|
|
95
|
+
// applies now; gesture-driven docks just settle back.
|
|
96
|
+
docked = true
|
|
97
|
+
pull = 0
|
|
98
|
+
settle(REFRESH_HEADER_HEIGHT)
|
|
99
|
+
} else {
|
|
100
|
+
collapse()
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const begin = (y: number, prevent?: () => void) => {
|
|
105
|
+
if (scroller.scrollTop > 0) {
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
pulling = true
|
|
110
|
+
y0 = y
|
|
111
|
+
pull = 0
|
|
112
|
+
prevent?.()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const move = (y: number, prevent: () => void) => {
|
|
116
|
+
if (!pulling) {
|
|
117
|
+
return
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const dy = y - y0
|
|
121
|
+
if (dy <= 0 || scroller.scrollTop > 0) {
|
|
122
|
+
pulling = false
|
|
123
|
+
pull = 0
|
|
124
|
+
applyReveal(held() ? REFRESH_HEADER_HEIGHT : 0)
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
prevent()
|
|
129
|
+
pull = dampenPull(dy)
|
|
130
|
+
applyReveal(pull + (held() ? REFRESH_HEADER_HEIGHT : 0))
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const end = () => {
|
|
134
|
+
if (pulling) {
|
|
135
|
+
release()
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const touchStart = (e: TouchEvent) => begin(e.touches[0].clientY)
|
|
140
|
+
const touchMove = (e: TouchEvent) => move(e.touches[0].clientY, () => e.preventDefault())
|
|
141
|
+
const touchEnd = () => end()
|
|
142
|
+
// pointer events cover mouse/pen drags — touch is handled by the touch
|
|
143
|
+
// listeners above since pointermove cannot preventDefault a native pan.
|
|
144
|
+
const pointerDown = (e: PointerEvent) => {
|
|
145
|
+
if (e.pointerType === 'mouse' && e.button === 0) {
|
|
146
|
+
begin(e.clientY, () => e.preventDefault())
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const pointerMove = (e: PointerEvent) => {
|
|
151
|
+
if (e.pointerType === 'mouse') {
|
|
152
|
+
move(e.clientY, () => e.preventDefault())
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const pointerUp = (e: PointerEvent) => {
|
|
157
|
+
if (e.pointerType === 'mouse') {
|
|
158
|
+
end()
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
scroller.addEventListener('touchstart', touchStart, { passive: true })
|
|
163
|
+
scroller.addEventListener('touchmove', touchMove, { passive: false })
|
|
164
|
+
scroller.addEventListener('touchend', touchEnd)
|
|
165
|
+
scroller.addEventListener('touchcancel', touchEnd)
|
|
166
|
+
scroller.addEventListener('pointerdown', pointerDown)
|
|
167
|
+
scroller.addEventListener('pointermove', pointerMove)
|
|
168
|
+
scroller.addEventListener('pointerup', pointerUp)
|
|
169
|
+
scroller.addEventListener('pointercancel', pointerUp)
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
sync: () => {
|
|
173
|
+
if (cfg.current.refreshing) {
|
|
174
|
+
if (grace) {
|
|
175
|
+
clearTimeout(grace)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Defer the dock while a gesture is in flight — release()
|
|
179
|
+
// applies it when the pointer lifts.
|
|
180
|
+
if (!docked && !pulling) {
|
|
181
|
+
dock()
|
|
182
|
+
}
|
|
183
|
+
} else if (docked && !pulling) {
|
|
184
|
+
collapse()
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
detach: () => {
|
|
188
|
+
if (grace) {
|
|
189
|
+
clearTimeout(grace)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
scroller.removeEventListener('touchstart', touchStart)
|
|
193
|
+
scroller.removeEventListener('touchmove', touchMove)
|
|
194
|
+
scroller.removeEventListener('touchend', touchEnd)
|
|
195
|
+
scroller.removeEventListener('touchcancel', touchEnd)
|
|
196
|
+
scroller.removeEventListener('pointerdown', pointerDown)
|
|
197
|
+
scroller.removeEventListener('pointermove', pointerMove)
|
|
198
|
+
scroller.removeEventListener('pointerup', pointerUp)
|
|
199
|
+
scroller.removeEventListener('pointercancel', pointerUp)
|
|
200
|
+
scroller.style.transition = ''
|
|
201
|
+
indicator.style.transition = ''
|
|
202
|
+
applyReveal(0)
|
|
203
|
+
},
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { getRootLayout, RootLayout } from '@nativescript/core'
|
|
2
|
+
|
|
3
|
+
// NS keeps an internal rootLayoutStack (mounted order) — but the module is
|
|
4
|
+
// private and can duplicate when deep imports split bundles, so Screen
|
|
5
|
+
// self-registers here on loaded/unloaded instead. registry order = mount
|
|
6
|
+
// order; last = most recently mounted screen shell.
|
|
7
|
+
const registry: RootLayout[] = []
|
|
8
|
+
|
|
9
|
+
/** Called by the Screen leaf's <rootlayout> onLoaded/onUnloaded. */
|
|
10
|
+
export function registerRootLayout(rl: RootLayout | undefined | null) {
|
|
11
|
+
if (rl && !registry.includes(rl)) {
|
|
12
|
+
registry.push(rl)
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function unregisterRootLayout(rl: RootLayout | undefined | null) {
|
|
17
|
+
const i = rl ? registry.indexOf(rl) : -1
|
|
18
|
+
if (i >= 0) {
|
|
19
|
+
registry.splice(i, 1)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** The most recently mounted rootlayout — the top of the push stack. For
|
|
24
|
+
* imperative services (toast, sheet) there is no invoking component to
|
|
25
|
+
* walk from; last-mounted is the pushed page when one exists. Caveat: tabs
|
|
26
|
+
* keep visited panes mounted — last is the newest, not the visible tab. */
|
|
27
|
+
export function topRootLayout(): RootLayout | undefined {
|
|
28
|
+
return registry[registry.length - 1] ?? getRootLayout()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Resolve the RootLayout enclosing `view` by walking the native parent
|
|
32
|
+
* chain — the screen shell is a RootLayout (Screen), so the first
|
|
33
|
+
* RootLayout ancestor IS the current page's overlay host. Falls back to
|
|
34
|
+
* the top registry entry when the component renders outside any Screen. */
|
|
35
|
+
export function rootLayoutFor(view: any): RootLayout | undefined {
|
|
36
|
+
for (let v = view?.parent; v; v = v.parent) {
|
|
37
|
+
if (v instanceof RootLayout) {
|
|
38
|
+
return v
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return topRootLayout()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Search every registered rootlayout for a view by id — overlays/sheets/
|
|
46
|
+
* toasts land on different rootlayouts depending on which screen's shell
|
|
47
|
+
* mounted last. Unloaded subtrees are skipped: a covered page unloads its
|
|
48
|
+
* views (NativeScript detaches their native recognizers while the JS views
|
|
49
|
+
* stay parented), so an unloaded match is a dead twin that can swallow
|
|
50
|
+
* interaction probes — the live view either doesn't exist here yet or sits
|
|
51
|
+
* under a loaded branch. */
|
|
52
|
+
export function findInRootLayouts(id: string): any {
|
|
53
|
+
const walk = (view: any): any => {
|
|
54
|
+
if (!view) {
|
|
55
|
+
return null
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (view.id === id) {
|
|
59
|
+
return view
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let hit: any = null
|
|
63
|
+
view.eachChildView?.((c: any) => {
|
|
64
|
+
if (c?.isLoaded === false) {
|
|
65
|
+
return true
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const found = walk(c)
|
|
69
|
+
if (found) {
|
|
70
|
+
hit = found
|
|
71
|
+
return false
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return true
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
return hit
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
for (let i = registry.length - 1; i >= 0; i--) {
|
|
81
|
+
const hit = walk(registry[i])
|
|
82
|
+
if (hit) {
|
|
83
|
+
return hit
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const rl = getRootLayout() as any
|
|
88
|
+
return rl ? walk(rl) : null
|
|
89
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RouteHost, screenParamsFor } from './RouteHost.mobile.tsrx'
|