@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,147 @@
|
|
|
1
|
+
import { setTranslate } from './translate.web'
|
|
2
|
+
import { detentOffset, normalizeDetents, snapDetentIndex } from './sheet-snap'
|
|
3
|
+
|
|
4
|
+
const SNAP_MS = 200
|
|
5
|
+
|
|
6
|
+
export interface SheetDetentsController {
|
|
7
|
+
detach: () => void
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Drag-to-snap detents on a `.vx-sheet` panel: a self-drawn grabber strip
|
|
11
|
+
* (the only drag target — it never fights inner scrolling) drives the
|
|
12
|
+
* panel's translateY; the panel is sized to the largest detent and parked
|
|
13
|
+
* at the offset for the current one. `closeNow` fires after the dismiss
|
|
14
|
+
* slide-out — the caller decides what closing means (declarative
|
|
15
|
+
* `onDismiss` or the `openSheet` resolution). In-window on every target —
|
|
16
|
+
* the OS detent presentations (UISheetPresentationController /
|
|
17
|
+
* BottomSheetDialog) host a modal VC/dialog window, not a RootLayout
|
|
18
|
+
* child, so the snap mechanics stay self-drawn for pixel parity. */
|
|
19
|
+
export function attachSheetDetents(
|
|
20
|
+
panel: HTMLElement,
|
|
21
|
+
detents: readonly number[],
|
|
22
|
+
closeNow: () => void,
|
|
23
|
+
): SheetDetentsController {
|
|
24
|
+
const sorted = normalizeDetents(detents)
|
|
25
|
+
if (!sorted.length) {
|
|
26
|
+
return { detach: () => {} }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const vh = () => panel.parentElement?.clientHeight || window.innerHeight || 1
|
|
30
|
+
const max = sorted[sorted.length - 1]
|
|
31
|
+
|
|
32
|
+
panel.classList.add('vx-sheet-detents')
|
|
33
|
+
// Panel is sized to the largest detent; translateY parks it per detent.
|
|
34
|
+
panel.style.height = `${max * 100}%`
|
|
35
|
+
|
|
36
|
+
const grabber = document.createElement('div')
|
|
37
|
+
grabber.className = 'vx-sheet-grabber'
|
|
38
|
+
const grip = document.createElement('div')
|
|
39
|
+
grip.className = 'vx-sheet-grip'
|
|
40
|
+
grabber.appendChild(grip)
|
|
41
|
+
panel.appendChild(grabber)
|
|
42
|
+
|
|
43
|
+
let cur = 0
|
|
44
|
+
let ty = 0
|
|
45
|
+
let dragging = false
|
|
46
|
+
let y0 = 0
|
|
47
|
+
let ty0 = 0
|
|
48
|
+
let vy = 0
|
|
49
|
+
let lastY = 0
|
|
50
|
+
let lastT = 0
|
|
51
|
+
|
|
52
|
+
const applyTy = (value: number) => {
|
|
53
|
+
ty = value
|
|
54
|
+
setTranslate(panel, 0, value)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const animateTo = (value: number, then?: () => void) => {
|
|
58
|
+
panel.style.transition = `transform ${SNAP_MS}ms ease-out`
|
|
59
|
+
applyTy(value)
|
|
60
|
+
setTimeout(() => {
|
|
61
|
+
panel.style.transition = ''
|
|
62
|
+
then?.()
|
|
63
|
+
}, SNAP_MS)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const down = (e: PointerEvent) => {
|
|
67
|
+
if (e.pointerType === 'mouse' && e.button !== 0) {
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
dragging = true
|
|
72
|
+
grabber.setPointerCapture?.(e.pointerId)
|
|
73
|
+
y0 = e.clientY
|
|
74
|
+
lastY = e.clientY
|
|
75
|
+
lastT = Date.now()
|
|
76
|
+
ty0 = ty
|
|
77
|
+
vy = 0
|
|
78
|
+
panel.style.transition = ''
|
|
79
|
+
e.preventDefault()
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const move = (e: PointerEvent) => {
|
|
83
|
+
if (!dragging) {
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const now = Date.now()
|
|
88
|
+
const dt = (now - lastT) / 1000
|
|
89
|
+
if (dt > 0) {
|
|
90
|
+
// Smoothed velocity — a single noisy event shouldn't fling.
|
|
91
|
+
vy = vy * 0.7 + ((e.clientY - lastY) / dt) * 0.3
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
lastY = e.clientY
|
|
95
|
+
lastT = now
|
|
96
|
+
applyTy(Math.min(Math.max(ty0 + (e.clientY - y0), 0), vh()))
|
|
97
|
+
e.preventDefault()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const up = () => {
|
|
101
|
+
if (!dragging) {
|
|
102
|
+
return
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
dragging = false
|
|
106
|
+
const next = snapDetentIndex(ty, vy, sorted, vh())
|
|
107
|
+
if (next < 0) {
|
|
108
|
+
animateTo(vh(), closeNow)
|
|
109
|
+
} else {
|
|
110
|
+
cur = next
|
|
111
|
+
animateTo(detentOffset(sorted, cur, vh()))
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// `.vx-sheet` scrolls its own overflow — the grabber is absolutely
|
|
116
|
+
// positioned against the content box, so pin it to the scrollport top
|
|
117
|
+
// while the panel scrolls (same floating-overlay shape as native).
|
|
118
|
+
const pinGrabber = () => {
|
|
119
|
+
grabber.style.top = `${panel.scrollTop}px`
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
panel.addEventListener('scroll', pinGrabber)
|
|
123
|
+
grabber.addEventListener('pointerdown', down)
|
|
124
|
+
grabber.addEventListener('pointermove', move)
|
|
125
|
+
grabber.addEventListener('pointerup', up)
|
|
126
|
+
grabber.addEventListener('pointercancel', up)
|
|
127
|
+
|
|
128
|
+
// Slide in from below the screen edge, matching the native leaf's
|
|
129
|
+
// translateY = vh → detent enter animation.
|
|
130
|
+
applyTy(vh())
|
|
131
|
+
const raf = requestAnimationFrame(() => animateTo(detentOffset(sorted, cur, vh())))
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
detach: () => {
|
|
135
|
+
cancelAnimationFrame(raf)
|
|
136
|
+
panel.removeEventListener('scroll', pinGrabber)
|
|
137
|
+
grabber.removeEventListener('pointerdown', down)
|
|
138
|
+
grabber.removeEventListener('pointermove', move)
|
|
139
|
+
grabber.removeEventListener('pointerup', up)
|
|
140
|
+
grabber.removeEventListener('pointercancel', up)
|
|
141
|
+
grabber.remove()
|
|
142
|
+
panel.classList.remove('vx-sheet-detents')
|
|
143
|
+
panel.style.height = ''
|
|
144
|
+
panel.style.transition = ''
|
|
145
|
+
},
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ModalOpenResult, OpenSheet, SheetOpenOptions } from './props'
|
|
2
|
+
|
|
3
|
+
interface SheetController {
|
|
4
|
+
close(): void
|
|
5
|
+
closed: Promise<void>
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
interface ActiveSheet {
|
|
9
|
+
controller: SheetController
|
|
10
|
+
finish: (result?: ModalOpenResult) => void
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const active = new Set<ActiveSheet>()
|
|
14
|
+
|
|
15
|
+
const mount = () => (globalThis as any).__xplatAppKitMountSheet
|
|
16
|
+
|
|
17
|
+
/** Close the most recently opened sheet (resolve with `result`). */
|
|
18
|
+
export function closeSheet(result?: ModalOpenResult): void {
|
|
19
|
+
;[...active].pop()?.finish(result)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Imperative sheet on the AppKit host — the component mounts on a dedicated
|
|
23
|
+
* Octane root inside a dialog-kind window presented as a sheet on the key
|
|
24
|
+
* window. Resolves when the sheet closes (either `close(result)` from the
|
|
25
|
+
* component or the window itself closing). `sheetHost` stays null — the
|
|
26
|
+
* sheet lives in a real NSWindow, not a rendered host element. */
|
|
27
|
+
export const openSheet: OpenSheet = (Component, params, options: SheetOpenOptions = {}) => {
|
|
28
|
+
if (typeof mount() !== 'function') {
|
|
29
|
+
console.warn('[octane-xplat] Imperative sheets are unsupported by the current AppKit host.')
|
|
30
|
+
return Promise.reject(new Error('unsupported: AppKit host has no sheet presenter'))
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return new Promise<ModalOpenResult>((resolve) => {
|
|
34
|
+
let finished = false
|
|
35
|
+
const finish = (result?: ModalOpenResult) => {
|
|
36
|
+
if (finished) return
|
|
37
|
+
finished = true
|
|
38
|
+
active.delete(entry)
|
|
39
|
+
try {
|
|
40
|
+
entry.controller?.close()
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error('[octane-xplat] sheet close failed', error)
|
|
43
|
+
}
|
|
44
|
+
resolve(result)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const entry: ActiveSheet = {
|
|
48
|
+
controller: undefined as unknown as SheetController,
|
|
49
|
+
finish,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
entry.controller = mount()(Component, { params, close: finish }, options)
|
|
53
|
+
active.add(entry)
|
|
54
|
+
void entry.controller.closed.then(() => finish('closed'))
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function sheetHost(): null {
|
|
59
|
+
return null
|
|
60
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { GridLayout } from '@nativescript/core'
|
|
2
|
+
import { createNativeScriptRoot } from '@nativescript-community/octane'
|
|
3
|
+
import type { UniversalComponent } from 'octane/universal'
|
|
4
|
+
import type { ModalOpenResult, OpenSheet } from './props'
|
|
5
|
+
import { topRootLayout } from './root-layout.mobile'
|
|
6
|
+
import { applyThemeClasses } from './theme/theme-scheme'
|
|
7
|
+
import { attachSheetDetents } from './sheet-detents'
|
|
8
|
+
import { bindBottomInsetToKeyboard } from './keyboard-inset.mobile'
|
|
9
|
+
import { attachTapToBlur } from './tap-to-blur.mobile'
|
|
10
|
+
|
|
11
|
+
interface ActiveSheet {
|
|
12
|
+
host: GridLayout
|
|
13
|
+
root: any
|
|
14
|
+
unbindKeyboard?: () => void
|
|
15
|
+
finish: (result?: ModalOpenResult) => void
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const active = new Set<ActiveSheet>()
|
|
19
|
+
|
|
20
|
+
/** The most recently opened sheet's host view — for harness asserts (view
|
|
21
|
+
* identity beats tree search; the owning rootlayout may unload/reload). */
|
|
22
|
+
export function sheetHost(): GridLayout | null {
|
|
23
|
+
return [...active].pop()?.host ?? null
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Close the most recently opened sheet (resolve with `result`). */
|
|
27
|
+
export function closeSheet(result?: ModalOpenResult): void {
|
|
28
|
+
;[...active].pop()?.finish(result)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Imperative in-window sheet: a dedicated Octane root on a bottom-docked
|
|
32
|
+
* GridLayout host opened on the CURRENT rootlayout (topRootLayout — the
|
|
33
|
+
* service has no declaring view). Resolves when the sheet closes. */
|
|
34
|
+
export const openSheet: OpenSheet = (Component, params, options = {}) =>
|
|
35
|
+
new Promise<ModalOpenResult>((resolve) => {
|
|
36
|
+
const rl = topRootLayout()
|
|
37
|
+
if (!rl) {
|
|
38
|
+
console.warn('[openSheet] no RootLayout mounted — sheet skipped')
|
|
39
|
+
resolve(undefined)
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const host = new GridLayout()
|
|
44
|
+
const unbindTheme = applyThemeClasses(host, 'vx-sheet-host')
|
|
45
|
+
host.horizontalAlignment = 'stretch'
|
|
46
|
+
host.verticalAlignment = 'bottom'
|
|
47
|
+
const root = createNativeScriptRoot(host)
|
|
48
|
+
// Detents own enter/slide-out — the RootLayout animation always
|
|
49
|
+
// lands translateY at 0, so it's skipped while detents attach.
|
|
50
|
+
const detents = options.detents?.length
|
|
51
|
+
? attachSheetDetents(host, options.detents, () => finish())
|
|
52
|
+
: null
|
|
53
|
+
|
|
54
|
+
// Lift the host above the software keyboard — bottom-anchored sheets
|
|
55
|
+
// hosting inputs (e.g. the demo 'In sheet' todo add row) are covered
|
|
56
|
+
// otherwise.
|
|
57
|
+
const unbindKeyboard = bindBottomInsetToKeyboard(host)
|
|
58
|
+
attachTapToBlur(host)
|
|
59
|
+
|
|
60
|
+
let finished = false
|
|
61
|
+
// RootLayout notifies 'closed' from inside its own close(), before the
|
|
62
|
+
// removal lands — hasChild still answers true there. Re-entering
|
|
63
|
+
// close() from that notification schedules a second removeChild and
|
|
64
|
+
// throws 'View not added to this instance' once the first removal
|
|
65
|
+
// clears the parent. While a close is in flight the host is already
|
|
66
|
+
// spliced out of _popupViews, so getPopupIndex < 0 marks the two cases
|
|
67
|
+
// where we must not close() again: mid-close (RootLayout owns the
|
|
68
|
+
// detach) and raced-close leftovers (plain removeChild instead).
|
|
69
|
+
const finish = (result?: ModalOpenResult) => {
|
|
70
|
+
if (finished) {
|
|
71
|
+
return
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
finished = true
|
|
75
|
+
active.delete(entry)
|
|
76
|
+
unbindKeyboard()
|
|
77
|
+
unbindTheme()
|
|
78
|
+
detents?.detach()
|
|
79
|
+
root.unmount?.()
|
|
80
|
+
const owner = host.parent as any
|
|
81
|
+
if (owner?.hasChild?.(host) && !closing) {
|
|
82
|
+
if (owner.getPopupIndex?.(host) === -1) {
|
|
83
|
+
owner.removeChild?.(host)
|
|
84
|
+
} else {
|
|
85
|
+
;(owner.close?.(host) as Promise<unknown> | undefined)?.catch((error: unknown) => {
|
|
86
|
+
console.error('[openSheet] close failed', error)
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
resolve(result)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
let closing = false
|
|
95
|
+
|
|
96
|
+
const entry: ActiveSheet = { host, root, unbindKeyboard, finish }
|
|
97
|
+
// 'closed' covers tap-to-dismiss — finish through the same path, but
|
|
98
|
+
// mark the close as already in flight so finish doesn't re-enter
|
|
99
|
+
// RootLayout.close (see above).
|
|
100
|
+
host.on('closed', () => {
|
|
101
|
+
closing = true
|
|
102
|
+
finish()
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
root.render(Component as UniversalComponent, { params, close: finish })
|
|
106
|
+
active.add(entry)
|
|
107
|
+
|
|
108
|
+
rl.open(host, {
|
|
109
|
+
...((options.shadeCover ?? true) ? { shadeCover: { opacity: 0.4, tapToClose: true } } : {}),
|
|
110
|
+
...(detents
|
|
111
|
+
? {}
|
|
112
|
+
: {
|
|
113
|
+
animation: {
|
|
114
|
+
enterFrom: { translateY: 400, duration: 250 },
|
|
115
|
+
exitTo: { translateY: 400, duration: 200 },
|
|
116
|
+
},
|
|
117
|
+
}),
|
|
118
|
+
})
|
|
119
|
+
.then(() => detents?.enter())
|
|
120
|
+
.catch((error: unknown) => {
|
|
121
|
+
console.error('[openSheet] open failed', error)
|
|
122
|
+
finish()
|
|
123
|
+
})
|
|
124
|
+
})
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createRoot } from 'octane'
|
|
2
|
+
import type { ModalOpenResult, OpenSheet } from './props'
|
|
3
|
+
import { applyThemeClasses } from './theme/theme-scheme'
|
|
4
|
+
import { attachSheetDetents } from './sheet-detents.web'
|
|
5
|
+
|
|
6
|
+
interface ActiveSheet {
|
|
7
|
+
layer: HTMLElement
|
|
8
|
+
finish: (result?: ModalOpenResult) => void
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const active = new Set<ActiveSheet>()
|
|
12
|
+
|
|
13
|
+
/** Close the most recently opened sheet (resolve with `result`). */
|
|
14
|
+
export function closeSheet(result?: ModalOpenResult): void {
|
|
15
|
+
;[...active].pop()?.finish(result)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Imperative in-window sheet: portal layer at document root, bottom-
|
|
19
|
+
* anchored panel, dedicated Octane root. Resolves when the sheet closes. */
|
|
20
|
+
export const openSheet: OpenSheet = (Component, params, options = {}) =>
|
|
21
|
+
new Promise<ModalOpenResult>((resolve) => {
|
|
22
|
+
const layer = document.createElement('div')
|
|
23
|
+
const unbindTheme = applyThemeClasses(layer, 'vx-sheet-layer')
|
|
24
|
+
const panel = document.createElement('div')
|
|
25
|
+
panel.className = 'vx-sheet'
|
|
26
|
+
if (options.detents?.length) {
|
|
27
|
+
panel.classList.add('vx-sheet-detents')
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let finished = false
|
|
31
|
+
const finish = (result?: ModalOpenResult) => {
|
|
32
|
+
if (finished) {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
finished = true
|
|
37
|
+
active.delete(entry)
|
|
38
|
+
unbindTheme()
|
|
39
|
+
detents?.detach()
|
|
40
|
+
root.unmount()
|
|
41
|
+
layer.remove()
|
|
42
|
+
resolve(result)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const entry: ActiveSheet = { layer, finish }
|
|
46
|
+
if (options.shadeCover ?? true) {
|
|
47
|
+
const backdrop = document.createElement('div')
|
|
48
|
+
backdrop.className = 'vx-sheet-backdrop'
|
|
49
|
+
backdrop.addEventListener('click', () => finish())
|
|
50
|
+
layer.appendChild(backdrop)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
layer.appendChild(panel)
|
|
54
|
+
document.body.appendChild(layer)
|
|
55
|
+
// Attached after the layer is in the document — the panel sizes
|
|
56
|
+
// against the viewport and slides in to the smallest detent.
|
|
57
|
+
const detents = options.detents?.length
|
|
58
|
+
? attachSheetDetents(panel, options.detents, () => finish())
|
|
59
|
+
: null
|
|
60
|
+
|
|
61
|
+
const root = createRoot(panel)
|
|
62
|
+
root.render(Component, { params, close: finish })
|
|
63
|
+
active.add(entry)
|
|
64
|
+
})
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { detentOffset, normalizeDetents, snapDetentIndex } from './sheet-snap';
|
|
3
|
+
|
|
4
|
+
// Pure math behind the sheet detents: fractions → sorted snap points →
|
|
5
|
+
// resting translateY offsets → release-time snap targets. The DOM/NS
|
|
6
|
+
// attachments are thin adapters over this.
|
|
7
|
+
|
|
8
|
+
const D = [0.25, 0.5, 0.9];
|
|
9
|
+
const VH = 800;
|
|
10
|
+
|
|
11
|
+
describe('normalizeDetents', () => {
|
|
12
|
+
it('sorts, filters, and dedupes', () => {
|
|
13
|
+
expect(normalizeDetents([0.9, 0.25, 0, 1.5, 0.25])).toEqual([0.25, 0.9]);
|
|
14
|
+
expect(normalizeDetents()).toEqual([]);
|
|
15
|
+
expect(normalizeDetents([0])).toEqual([]);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe('detentOffset', () => {
|
|
20
|
+
it('parks the largest-detent-sized panel per detent', () => {
|
|
21
|
+
expect(detentOffset(D, 0, VH)).toBe((0.9 - 0.25) * VH);
|
|
22
|
+
expect(detentOffset(D, 2, VH)).toBe(0);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('snapDetentIndex', () => {
|
|
27
|
+
it('snaps to the nearest detent on a slow release', () => {
|
|
28
|
+
// frac 0.55 → detent 0.5 wins
|
|
29
|
+
expect(snapDetentIndex((0.9 - 0.55) * VH, 0, D, VH)).toBe(1);
|
|
30
|
+
expect(snapDetentIndex(0, 0, D, VH)).toBe(2); // fully open
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('dismisses below half of the smallest detent', () => {
|
|
34
|
+
// frac 0.1 < 0.25/2
|
|
35
|
+
expect(snapDetentIndex((0.9 - 0.1) * VH, 0, D, VH)).toBe(-1);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('fling direction overrides proximity', () => {
|
|
39
|
+
// frac 0.6 (nearer 0.5) flung up → 0.9
|
|
40
|
+
expect(snapDetentIndex((0.9 - 0.6) * VH, -600, D, VH)).toBe(2);
|
|
41
|
+
// frac 0.4 (nearer 0.5) flung down → 0.25
|
|
42
|
+
expect(snapDetentIndex((0.9 - 0.4) * VH, 600, D, VH)).toBe(0);
|
|
43
|
+
// flung down at/below the smallest detent → dismiss
|
|
44
|
+
expect(snapDetentIndex((0.9 - 0.25) * VH, 600, D, VH)).toBe(-1);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** Detent math shared by the web/native sheet-detents attachments.
|
|
2
|
+
* Detents are viewport-height fractions; the panel is sized to the
|
|
3
|
+
* largest detent and parked at the translateY offset for the current
|
|
4
|
+
* one, so a snap is just a transform write — no layout thrash. */
|
|
5
|
+
|
|
6
|
+
/** Downward/upward finger speed (px/s web, dip/s native) that overrides
|
|
7
|
+
* nearest-detent snapping — a fling snaps one detent in its direction. */
|
|
8
|
+
export const DETENT_FLICK_VELOCITY = 500
|
|
9
|
+
|
|
10
|
+
/** Sorted, filtered, deduped detent fractions. Empty → the caller keeps
|
|
11
|
+
* the content-sized sheet behavior (detents off). */
|
|
12
|
+
export function normalizeDetents(input?: readonly number[]): number[] {
|
|
13
|
+
if (!input?.length) {
|
|
14
|
+
return []
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return [...new Set(input.filter((d) => d > 0 && d <= 1))].sort((a, b) => a - b)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Resting translateY for a detent: the panel is `max * vh` tall, so the
|
|
21
|
+
* portion below the screen edge is `(max - detent) * vh`. */
|
|
22
|
+
export function detentOffset(detents: readonly number[], index: number, vh: number): number {
|
|
23
|
+
return (detents[detents.length - 1] - detents[index]) * vh
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Snap target for a release at translateY `ty` with vertical velocity
|
|
27
|
+
* `vy` (positive = dragging down). Returns the detent index, or -1 to
|
|
28
|
+
* dismiss: released below half of the smallest detent, or a downward
|
|
29
|
+
* fling while at/below it. */
|
|
30
|
+
export function snapDetentIndex(ty: number, vy: number, detents: readonly number[], vh: number): number {
|
|
31
|
+
const max = detents[detents.length - 1]
|
|
32
|
+
const frac = Math.min(Math.max(max - ty / vh, 0), 1)
|
|
33
|
+
|
|
34
|
+
if (vy > DETENT_FLICK_VELOCITY) {
|
|
35
|
+
// Fling down — the nearest detent strictly below the finger.
|
|
36
|
+
let i = -1
|
|
37
|
+
while (i + 1 < detents.length && detents[i + 1] < frac - 1e-6) {
|
|
38
|
+
i++
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return i
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (vy < -DETENT_FLICK_VELOCITY) {
|
|
45
|
+
// Fling up — the nearest detent strictly above the finger.
|
|
46
|
+
let i = detents.length - 1
|
|
47
|
+
while (i - 1 >= 0 && detents[i - 1] > frac + 1e-6) {
|
|
48
|
+
i--
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return i
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (frac < detents[0] * 0.5) {
|
|
55
|
+
return -1
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let best = 0
|
|
59
|
+
for (let i = 1; i < detents.length; i++) {
|
|
60
|
+
if (Math.abs(detents[i] - frac) < Math.abs(detents[best] - frac)) {
|
|
61
|
+
best = i
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return best
|
|
66
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const stacks = new Map<string, unknown>()
|
|
2
|
+
|
|
3
|
+
export function registerStack(name: string, stack: unknown): void {
|
|
4
|
+
stacks.set(name, stack)
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function getStack(name: string): unknown {
|
|
8
|
+
return stacks.get(name)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function stackEntries(): IterableIterator<[string, unknown]> {
|
|
12
|
+
return stacks.entries()
|
|
13
|
+
}
|
package/src/stacks.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Application, Frame } from '@nativescript/core'
|
|
2
|
+
|
|
3
|
+
/** Named parallel stacks. A shell (Tabs with `stack` on a spec, the app
|
|
4
|
+
* entry's root frame) registers its Frame here; `pushRoute` resolves the
|
|
5
|
+
* target by name. Native-only concept — on web, parallel stacks map to
|
|
6
|
+
* nested routes (one linear URL stack). 'root' needs no registration:
|
|
7
|
+
* unregistered, it resolves to the app's root view when that's a
|
|
8
|
+
* Frame — the standard `Application.run({ create: () => frame })` boot
|
|
9
|
+
* shape. An explicit registerStack('root', frame) overrides it. */
|
|
10
|
+
const stacks = new Map<string, Frame>()
|
|
11
|
+
const regListeners = new Set<(name: string, frame: Frame) => void>()
|
|
12
|
+
|
|
13
|
+
export function registerStack(name: string, frame: Frame): void {
|
|
14
|
+
stacks.set(name, frame)
|
|
15
|
+
regListeners.forEach((l) => l(name, frame))
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function getStack(name: string): Frame | undefined {
|
|
19
|
+
const registered = stacks.get(name)
|
|
20
|
+
if (registered) {
|
|
21
|
+
return registered
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (name === 'root') {
|
|
25
|
+
const rv = Application.getRootView?.()
|
|
26
|
+
if (rv instanceof Frame) {
|
|
27
|
+
return rv
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return undefined
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** All registered stacks in registration order — for hardware-back
|
|
35
|
+
* resolution (pop whichever stack is visibly on top). */
|
|
36
|
+
export function stackEntries(): IterableIterator<[string, Frame]> {
|
|
37
|
+
return stacks.entries()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Internal: route.native attaches frame listeners as stacks appear —
|
|
41
|
+
* named frames can register after a useRoute subscription ran. */
|
|
42
|
+
export function onStackRegistered(cb: (name: string, frame: Frame) => void): void {
|
|
43
|
+
regListeners.add(cb)
|
|
44
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Web twin — one linear URL stack; named stacks don't apply. */
|
|
2
|
+
export function registerStack(_name: string, _frame: unknown): void {}
|
|
3
|
+
export function getStack(_name: string): undefined {
|
|
4
|
+
return undefined
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function stackEntries(): IterableIterator<[string, never]> {
|
|
8
|
+
return [].values()
|
|
9
|
+
}
|