@octane-xplat/ui 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/index.shared.web.js +92 -0
- 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 +10 -8
- package/dist/web/virtual-list-layout.js +146 -0
- package/dist/web/web/index.js +2 -2
- package/package.json +35 -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 +298 -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.shared.web.ts +270 -0
- package/src/index.ts +1 -0
- package/src/index.web.ts +1 -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 +250 -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.shared.web.d.ts +111 -0
- package/types/generated/index.web.d.ts +1 -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
package/src/route.web.ts
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { useSyncExternalStore } from 'octane'
|
|
2
|
+
|
|
3
|
+
/** Web route store — the browser half of the nav contract. One linear URL
|
|
4
|
+
* stack; `stack` names the conceptual outlet ('root' covers the app, a
|
|
5
|
+
* named stack is the pane that owns it — parallel stacks map to nested
|
|
6
|
+
* routes). URL shape: /<stack>/<path>?query or /<path>?query for root,
|
|
7
|
+
* where <path> comes from the route-dir manifest — `app/demo/[id].tsrx`
|
|
8
|
+
* pushes as /demo/<id-value>. Names not in the manifest keep the legacy
|
|
9
|
+
* /<name>?params shape. Module-scope like every other store — the pane
|
|
10
|
+
* that owns `stack` subscribes with useRoute(stack) and swaps content.
|
|
11
|
+
*
|
|
12
|
+
* Modal routes (presentation 'modal' — `+modal` route files or a
|
|
13
|
+
* pushRoute override) push a real URL but overlay instead of replacing:
|
|
14
|
+
* `current` keeps the underlying route, `modalRoute` carries the modal.
|
|
15
|
+
* Back (popstate or popRoute) dismisses it. */
|
|
16
|
+
|
|
17
|
+
export type { Route } from './props'
|
|
18
|
+
import type { Route, RouteHead, RouteManifest, RouteMeta, ScreenTable } from './props'
|
|
19
|
+
import {
|
|
20
|
+
buildRoutePath,
|
|
21
|
+
layoutChain,
|
|
22
|
+
linkPath,
|
|
23
|
+
matchUrl,
|
|
24
|
+
mergeRouteManifests,
|
|
25
|
+
RouteRedirect,
|
|
26
|
+
} from './route-table'
|
|
27
|
+
|
|
28
|
+
// ---------- screen registry ----------
|
|
29
|
+
|
|
30
|
+
// Effective tables = the file-derived base manifest merged under every
|
|
31
|
+
// addRoutes layer. Keeping the split means an HMR re-run of routes.gen.*
|
|
32
|
+
// (registerRoutes again) can't wipe routes an app added at runtime.
|
|
33
|
+
let baseManifest: RouteManifest = { screens: {}, routes: [], layouts: {} }
|
|
34
|
+
const dynamicManifests: RouteManifest[] = []
|
|
35
|
+
let screens: ScreenTable = {}
|
|
36
|
+
let routes: RouteMeta[] = []
|
|
37
|
+
let routeLayouts: Record<string, any> = {}
|
|
38
|
+
let routeLoaders: NonNullable<RouteManifest['loaders']> = {}
|
|
39
|
+
|
|
40
|
+
function rebuildRegistry(): void {
|
|
41
|
+
const merged = mergeRouteManifests(baseManifest, ...dynamicManifests)
|
|
42
|
+
screens = merged.screens
|
|
43
|
+
routes = merged.routes
|
|
44
|
+
routeLayouts = merged.layouts
|
|
45
|
+
routeLoaders = merged.loaders ?? {}
|
|
46
|
+
// Registration can land after the first lazy parse (deep link read
|
|
47
|
+
// before the routes module ran) — re-parse with patterns present.
|
|
48
|
+
if (current !== undefined) {
|
|
49
|
+
current = parse()
|
|
50
|
+
emit()
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Register the app's name → screen table. On web the table feeds
|
|
55
|
+
* `screenFor` — the fallback outlet resolution in Tabs when no
|
|
56
|
+
* `resolveScreen` prop is given; on native `pushRoute` resolves
|
|
57
|
+
* `route.name` through it. `manifest` (from deriveRouteManifest) enables
|
|
58
|
+
* path-param matching — call once from the shared routes module. */
|
|
59
|
+
export function registerScreens(table: ScreenTable, manifest?: RouteMeta[]): void {
|
|
60
|
+
baseManifest = { ...baseManifest, screens: table, routes: manifest ?? [] }
|
|
61
|
+
rebuildRegistry()
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** One-call registration for route-dir apps — screens + URL patterns +
|
|
65
|
+
* layouts all come from deriveRouteManifest. */
|
|
66
|
+
export function registerRoutes(manifest: RouteManifest): void {
|
|
67
|
+
baseManifest = manifest
|
|
68
|
+
rebuildRegistry()
|
|
69
|
+
applyHead(read())
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Layer a programmatic manifest (from `defineRoutes`) over the registered
|
|
73
|
+
* routes — same-name entries win over the base with a warn, so a host
|
|
74
|
+
* framework can override a file route deliberately. Registered layers
|
|
75
|
+
* survive later registerRoutes re-registration (e.g. routes.gen HMR). */
|
|
76
|
+
export function addRoutes(manifest: RouteManifest): void {
|
|
77
|
+
dynamicManifests.push(manifest)
|
|
78
|
+
rebuildRegistry()
|
|
79
|
+
applyHead(read())
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function screenFor(name: string): ScreenTable[string] | undefined {
|
|
83
|
+
return screens[name]
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Directory layouts wrapping a route, outermost → innermost — outlets
|
|
87
|
+
* wrap their resolved element with these (`_layout.tsrx` files). */
|
|
88
|
+
export function layoutsFor(name: string): any[] {
|
|
89
|
+
return layoutChain(routeLayouts, name)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export { layoutsFor as layoutsForRoute }
|
|
93
|
+
|
|
94
|
+
// ---------- the store ----------
|
|
95
|
+
|
|
96
|
+
const listeners = new Set<() => void>()
|
|
97
|
+
// Lazy — the manifest registers after this module evaluates, and parse()
|
|
98
|
+
// needs its patterns for path params.
|
|
99
|
+
let current: Route | null | undefined
|
|
100
|
+
let modalRoute: Route | null = null
|
|
101
|
+
let historyDepth = history.state?.__octaneXplatDepth ?? 0
|
|
102
|
+
|
|
103
|
+
const ROUTE_HEAD_ATTR = 'data-octane-xplat-route-head'
|
|
104
|
+
|
|
105
|
+
// Scroll positions keyed by URL — restored on popstate (native keeps
|
|
106
|
+
// stack pages alive, so only the web leaf needs this). `lastKey` is the
|
|
107
|
+
// outgoing URL: popstate fires after location already changed, so the
|
|
108
|
+
// saved position must be written under the URL we just left.
|
|
109
|
+
const scrollPositions = new Map<string, number>()
|
|
110
|
+
let lastKey = location.pathname + location.search
|
|
111
|
+
const scrollKey = () => location.pathname + location.search
|
|
112
|
+
const saveScroll = () => scrollPositions.set(lastKey, window.scrollY)
|
|
113
|
+
const restoreScroll = () => {
|
|
114
|
+
const y = scrollPositions.get(scrollKey())
|
|
115
|
+
if (y !== undefined) {
|
|
116
|
+
requestAnimationFrame(() => window.scrollTo(0, y))
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function parse(): Route | null {
|
|
121
|
+
return matchUrl(routes, location.pathname + location.search)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function read(): Route | null {
|
|
125
|
+
if (current === undefined) {
|
|
126
|
+
current = parse()
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return current
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function emit() {
|
|
133
|
+
listeners.forEach((l) => l())
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function metaFor(name: string): RouteMeta | undefined {
|
|
137
|
+
return routes.find((meta) => meta.name === name)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function headFor(r: Route | null): RouteHead | undefined {
|
|
141
|
+
const head = r ? metaFor(r.name)?.head : undefined
|
|
142
|
+
return typeof head === 'function' ? head(r?.params ?? {}) : head
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function applyHead(r: Route | null): void {
|
|
146
|
+
if (typeof document === 'undefined') {
|
|
147
|
+
return
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const head = headFor(r)
|
|
151
|
+
if (!head) {
|
|
152
|
+
document.querySelectorAll(`meta[${ROUTE_HEAD_ATTR}]`).forEach((node) => node.remove())
|
|
153
|
+
return
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (head.title !== undefined) {
|
|
157
|
+
document.title = head.title
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
document.querySelectorAll(`meta[${ROUTE_HEAD_ATTR}]`).forEach((node) => node.remove())
|
|
161
|
+
for (const [name, content] of Object.entries(head.meta ?? {})) {
|
|
162
|
+
const tag = document.createElement('meta')
|
|
163
|
+
tag.setAttribute('name', name)
|
|
164
|
+
tag.setAttribute('content', content)
|
|
165
|
+
tag.setAttribute(ROUTE_HEAD_ATTR, '')
|
|
166
|
+
document.head.appendChild(tag)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function contextFor(r: Route): Record<string, unknown> {
|
|
171
|
+
return r.context ?? {}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async function prepareRoute(r: Route, redirects = 0): Promise<void> {
|
|
175
|
+
const beforeLoad = metaFor(r.name)?.beforeLoad
|
|
176
|
+
if (!beforeLoad) {
|
|
177
|
+
commitRoute(r)
|
|
178
|
+
return
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (redirects > 16) {
|
|
182
|
+
console.warn(`[octane-xplat] beforeLoad redirect loop for '${r.name}'`)
|
|
183
|
+
return
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
const returned = await beforeLoad({ params: r.params, context: contextFor(r) })
|
|
188
|
+
const context = returned ? { ...contextFor(r), ...returned } : contextFor(r)
|
|
189
|
+
commitRoute({
|
|
190
|
+
...r,
|
|
191
|
+
context,
|
|
192
|
+
})
|
|
193
|
+
} catch (e) {
|
|
194
|
+
if (e instanceof RouteRedirect) {
|
|
195
|
+
await prepareRoute(e.route, redirects + 1)
|
|
196
|
+
return
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
console.warn(`[octane-xplat] beforeLoad('${r.name}') rejected: ${(e as Error)?.message ?? e}`)
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export function redirect(r: Route): never {
|
|
204
|
+
throw new RouteRedirect(r)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export function pushRoute(r: Route): void {
|
|
208
|
+
if (metaFor(r.name)?.beforeLoad) {
|
|
209
|
+
void prepareRoute(r)
|
|
210
|
+
return
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
commitRoute(r)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function commitRoute(r: Route): void {
|
|
217
|
+
const route: Route = { ...r, presentation: r.presentation ?? presentationFor(r.name) }
|
|
218
|
+
const loader = routeLoaders[route.name] ?? routes.find((meta) => meta.name === route.name)?.loader
|
|
219
|
+
if (
|
|
220
|
+
loader &&
|
|
221
|
+
!Object.prototype.hasOwnProperty.call(route, 'loaderData') &&
|
|
222
|
+
!Object.prototype.hasOwnProperty.call(route, 'loaderError')
|
|
223
|
+
) {
|
|
224
|
+
void Promise.resolve()
|
|
225
|
+
.then(() => loader(route.params))
|
|
226
|
+
.then(
|
|
227
|
+
(loaderData) => commitRoute({ ...route, loaderData }),
|
|
228
|
+
(loaderError) => commitRoute({ ...route, loaderError }),
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
return
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
saveScroll()
|
|
235
|
+
historyDepth += 1
|
|
236
|
+
history.pushState({ __octaneXplatDepth: historyDepth }, '', buildRoutePath(routes, route))
|
|
237
|
+
lastKey = scrollKey()
|
|
238
|
+
if (route.presentation === 'modal') {
|
|
239
|
+
modalRoute = route
|
|
240
|
+
} else {
|
|
241
|
+
current = route
|
|
242
|
+
modalRoute = null
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
applyHead(modalRoute ?? current ?? null)
|
|
246
|
+
emit()
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function presentationFor(name: string): Route['presentation'] {
|
|
250
|
+
return routes.find((m) => m.name === name)?.presentation
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** Web history is one linear stack — back pops whatever route is current;
|
|
254
|
+
* per-stack pops aren't expressible, so `stack` is accepted for parity
|
|
255
|
+
* and ignored. A pushed modal is the top entry, so back dismisses it. */
|
|
256
|
+
export function popRoute(_stack = 'root'): void {
|
|
257
|
+
history.back()
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
let backInterceptorWarned = false
|
|
261
|
+
|
|
262
|
+
/** No-op twin of the native leaf. Browser back is already real history —
|
|
263
|
+
* there is no hardware-back event to intercept on web, so registered
|
|
264
|
+
* interceptors never fire. Warns once so a mistaken call site isn't
|
|
265
|
+
* silently absent. */
|
|
266
|
+
export function addBackInterceptor(_fn: () => boolean): () => void {
|
|
267
|
+
if (!backInterceptorWarned) {
|
|
268
|
+
backInterceptorWarned = true
|
|
269
|
+
console.warn(
|
|
270
|
+
'[octane-xplat] addBackInterceptor is a no-op on web — browser back is URL history, not an interceptable event.',
|
|
271
|
+
)
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return () => {}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
window.addEventListener('popstate', () => {
|
|
278
|
+
saveScroll()
|
|
279
|
+
historyDepth = history.state?.__octaneXplatDepth ?? 0
|
|
280
|
+
lastKey = scrollKey()
|
|
281
|
+
modalRoute = null
|
|
282
|
+
current = parse()
|
|
283
|
+
applyHead(current)
|
|
284
|
+
restoreScroll()
|
|
285
|
+
emit()
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
/** Current route if it targets `stack`, else null. */
|
|
289
|
+
export function routeFor(stack: string): Route | null {
|
|
290
|
+
const c = read()
|
|
291
|
+
return c && c.stack === stack ? c : null
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** Web has one linear browser history; expose its active route stack for parity. */
|
|
295
|
+
export function routeStacks(): string[] {
|
|
296
|
+
const route = read()
|
|
297
|
+
return route ? [route.stack] : []
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/** The route active at boot — for deep-link tab selection. */
|
|
301
|
+
export function currentRoute(): Route | null {
|
|
302
|
+
return read()
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/** The modal route overlaying the current one, if any. */
|
|
306
|
+
export function currentModalRoute(): Route | null {
|
|
307
|
+
return modalRoute
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/** Deep-link entry, web half — the URL *is* the route state, so this is a
|
|
311
|
+
* plain pushRoute of the matched path (parity with the native leaf, where
|
|
312
|
+
* apps wire `onDeepLink(pushDeepLink)`). */
|
|
313
|
+
export function pushDeepLink(url: string): boolean {
|
|
314
|
+
const r = matchUrl(routes, linkPath(url))
|
|
315
|
+
if (!r) {
|
|
316
|
+
console.warn(`[octane-xplat] pushDeepLink('${url}') dropped — no route matches.`)
|
|
317
|
+
return false
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
pushRoute(r)
|
|
321
|
+
return true
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** URL for a Route — Link's href and shareable-path helper. */
|
|
325
|
+
export function hrefFor(r: Route): string {
|
|
326
|
+
return buildRoutePath(routes, r)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
export function useRoute(stack: string): Route | null {
|
|
330
|
+
return useSyncExternalStore(
|
|
331
|
+
(cb) => {
|
|
332
|
+
listeners.add(cb)
|
|
333
|
+
return () => listeners.delete(cb)
|
|
334
|
+
},
|
|
335
|
+
() => routeFor(stack),
|
|
336
|
+
)
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/** Whether the selected conceptual stack has an in-app route to pop. A
|
|
340
|
+
* browser's pre-app history is intentionally not counted. */
|
|
341
|
+
export function canGoBack(stack = 'root'): boolean {
|
|
342
|
+
const route = read()
|
|
343
|
+
return historyDepth > 0 && route?.stack === stack
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export function useCanGoBack(stack = 'root'): boolean {
|
|
347
|
+
return useSyncExternalStore(
|
|
348
|
+
(cb) => {
|
|
349
|
+
listeners.add(cb)
|
|
350
|
+
return () => listeners.delete(cb)
|
|
351
|
+
},
|
|
352
|
+
() => canGoBack(stack),
|
|
353
|
+
)
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/** The modal route overlaying the shell — outlets render it above their
|
|
357
|
+
* normal content (URL preserved underneath). */
|
|
358
|
+
export function useModalRoute(): Route | null {
|
|
359
|
+
return useSyncExternalStore(
|
|
360
|
+
(cb) => {
|
|
361
|
+
listeners.add(cb)
|
|
362
|
+
return () => listeners.delete(cb)
|
|
363
|
+
},
|
|
364
|
+
() => modalRoute,
|
|
365
|
+
)
|
|
366
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SafeAreaInsets } from './props'
|
|
2
|
+
|
|
3
|
+
/** The AppKit root view begins below the title bar; there are no additional
|
|
4
|
+
* safe-area insets in this window-hosted renderer. */
|
|
5
|
+
export function useSafeAreaInsets(): SafeAreaInsets {
|
|
6
|
+
return { top: 0, right: 0, bottom: 0, left: 0 }
|
|
7
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useEffect, useState } from 'octane';
|
|
2
|
+
import { Application, Screen } from '@nativescript/core';
|
|
3
|
+
|
|
4
|
+
export interface SafeAreaInsets { top: number; right: number; bottom: number; left: number; }
|
|
5
|
+
|
|
6
|
+
function androidActivity(): any {
|
|
7
|
+
return Application.android?.foregroundActivity ?? Application.android?.startActivity;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function readAndroidInsets(): SafeAreaInsets {
|
|
11
|
+
const decorView = androidActivity()?.getWindow?.()?.getDecorView?.();
|
|
12
|
+
const insets = decorView?.getRootWindowInsets?.();
|
|
13
|
+
if (!insets) return { top: 0, right: 0, bottom: 0, left: 0 };
|
|
14
|
+
|
|
15
|
+
const scale = Screen.mainScreen.scale || 1;
|
|
16
|
+
if (android.os.Build.VERSION.SDK_INT >= 30) {
|
|
17
|
+
const systemBars =
|
|
18
|
+
android.view.WindowInsets.Type.systemBars() | android.view.WindowInsets.Type.displayCutout();
|
|
19
|
+
|
|
20
|
+
const i = insets.getInsets(systemBars);
|
|
21
|
+
return {
|
|
22
|
+
top: i.top / scale,
|
|
23
|
+
right: i.right / scale,
|
|
24
|
+
bottom: i.bottom / scale,
|
|
25
|
+
left: i.left / scale,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
top: insets.getSystemWindowInsetTop() / scale,
|
|
31
|
+
right: insets.getSystemWindowInsetRight() / scale,
|
|
32
|
+
bottom: insets.getSystemWindowInsetBottom() / scale,
|
|
33
|
+
left: insets.getSystemWindowInsetLeft() / scale,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function measure(): SafeAreaInsets {
|
|
38
|
+
const view = Application.ios?.rootController?.view;
|
|
39
|
+
const insets = view?.safeAreaInsets;
|
|
40
|
+
if (insets) return { top: insets.top, right: insets.right, bottom: insets.bottom, left: insets.left };
|
|
41
|
+
if (Application.android) return readAndroidInsets();
|
|
42
|
+
return { top: 0, right: 0, bottom: 0, left: 0 };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Reads the root view's insets; Android and pre-attachment reads may be zero. */
|
|
46
|
+
export function useSafeAreaInsets(): SafeAreaInsets {
|
|
47
|
+
const [insets, setInsets] = useState<SafeAreaInsets>(measure);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const update = () => setInsets(measure());
|
|
50
|
+
Application.on(Application.orientationChangedEvent, update);
|
|
51
|
+
Application.on(Application.resumeEvent, update);
|
|
52
|
+
update();
|
|
53
|
+
return () => {
|
|
54
|
+
Application.off(Application.orientationChangedEvent, update);
|
|
55
|
+
Application.off(Application.resumeEvent, update);
|
|
56
|
+
};
|
|
57
|
+
}, []);
|
|
58
|
+
|
|
59
|
+
return insets;
|
|
60
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useEffect, useState } from 'octane';
|
|
2
|
+
|
|
3
|
+
export interface SafeAreaInsets { top: number; right: number; bottom: number; left: number; }
|
|
4
|
+
|
|
5
|
+
function measure(): SafeAreaInsets {
|
|
6
|
+
if (!document.body) return { top: 0, right: 0, bottom: 0, left: 0 };
|
|
7
|
+
const probe = document.createElement('div');
|
|
8
|
+
probe.style.cssText = 'position:fixed;visibility:hidden;pointer-events:none;' +
|
|
9
|
+
'padding:env(safe-area-inset-top) env(safe-area-inset-right) ' +
|
|
10
|
+
'env(safe-area-inset-bottom) env(safe-area-inset-left);' +
|
|
11
|
+
'padding:constant(safe-area-inset-top) constant(safe-area-inset-right) ' +
|
|
12
|
+
'constant(safe-area-inset-bottom) constant(safe-area-inset-left);';
|
|
13
|
+
|
|
14
|
+
document.body.appendChild(probe);
|
|
15
|
+
const style = getComputedStyle(probe);
|
|
16
|
+
const insets = {
|
|
17
|
+
top: parseFloat(style.paddingTop) || 0,
|
|
18
|
+
right: parseFloat(style.paddingRight) || 0,
|
|
19
|
+
bottom: parseFloat(style.paddingBottom) || 0,
|
|
20
|
+
left: parseFloat(style.paddingLeft) || 0,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
probe.remove();
|
|
24
|
+
return insets;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Approximate CSS safe-area values, measured on mount and viewport resize. */
|
|
28
|
+
export function useSafeAreaInsets(): SafeAreaInsets {
|
|
29
|
+
const [insets, setInsets] = useState<SafeAreaInsets>({ top: 0, right: 0, bottom: 0, left: 0 });
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
const update = () => setInsets(measure());
|
|
32
|
+
update();
|
|
33
|
+
window.addEventListener('resize', update);
|
|
34
|
+
return () => window.removeEventListener('resize', update);
|
|
35
|
+
}, []);
|
|
36
|
+
|
|
37
|
+
return insets;
|
|
38
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { FlexboxLayout, Screen } from '@nativescript/core'
|
|
2
|
+
import { detentOffset, normalizeDetents, snapDetentIndex } from './sheet-snap'
|
|
3
|
+
|
|
4
|
+
const SNAP_MS = 200
|
|
5
|
+
|
|
6
|
+
export interface SheetDetentsController {
|
|
7
|
+
/** Slide the panel in from below the screen edge — call once the host
|
|
8
|
+
* is inside the RootLayout (the RootLayout open call replaces the
|
|
9
|
+
* built-in enter/exit animation, which would fight detent offsets:
|
|
10
|
+
* it always animates translateY to 0). */
|
|
11
|
+
enter: () => void
|
|
12
|
+
detach: () => void
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Drag-to-snap detents on a RootLayout sheet host: a self-drawn grabber
|
|
16
|
+
* strip (top-aligned grid child — the only drag target, so it never
|
|
17
|
+
* fights inner scrolling) drives the host's translateY; the host is
|
|
18
|
+
* sized to the largest detent and parked at the offset for the current
|
|
19
|
+
* one. `closeNow` fires after the dismiss slide-out — the caller decides
|
|
20
|
+
* what closing means (declarative `onDismiss` via RootLayout 'closed',
|
|
21
|
+
* or the `openSheet` resolution).
|
|
22
|
+
*
|
|
23
|
+
* In-window on native: the OS detent presentations
|
|
24
|
+
* (UISheetPresentationController / BottomSheetBehavior via
|
|
25
|
+
* BottomSheetDialogFragment) host a modal VC or a separate dialog
|
|
26
|
+
* window — a different surface contract than the RootLayout child this
|
|
27
|
+
* sheet is (UIModal/MaterialDialog own the modal path), so the snap
|
|
28
|
+
* mechanics are self-drawn and identical to the web leaf. */
|
|
29
|
+
export function attachSheetDetents(
|
|
30
|
+
host: any,
|
|
31
|
+
detents: readonly number[],
|
|
32
|
+
closeNow: () => void,
|
|
33
|
+
): SheetDetentsController {
|
|
34
|
+
const sorted = normalizeDetents(detents)
|
|
35
|
+
if (!sorted.length) {
|
|
36
|
+
return { detach: () => {}, enter: () => {} }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Parentless at attach (before RootLayout.open) — fall back to screen
|
|
40
|
+
// dips; every gesture-time read uses the real parent height.
|
|
41
|
+
const vh = () => (host.parent?.getActualSize?.().height || Screen.mainScreen.heightDIPs)
|
|
42
|
+
const max = sorted[sorted.length - 1]
|
|
43
|
+
let cur = 0
|
|
44
|
+
|
|
45
|
+
host.verticalAlignment = 'bottom'
|
|
46
|
+
host.translateY = vh() // fully below the screen until enter()
|
|
47
|
+
|
|
48
|
+
const grabber = new FlexboxLayout()
|
|
49
|
+
grabber.className = 'vx-sheet-grabber'
|
|
50
|
+
grabber.verticalAlignment = 'top'
|
|
51
|
+
const grip = new FlexboxLayout()
|
|
52
|
+
grip.className = 'vx-sheet-grip'
|
|
53
|
+
grabber.addChild(grip)
|
|
54
|
+
host.addChild(grabber)
|
|
55
|
+
|
|
56
|
+
let dragging = false
|
|
57
|
+
let dy0 = 0 // pan deltaY baseline — the gesture reports cumulative deltas
|
|
58
|
+
let ty0 = 0
|
|
59
|
+
let vy = 0
|
|
60
|
+
let lastDy = 0
|
|
61
|
+
let lastT = 0
|
|
62
|
+
|
|
63
|
+
const animateTo = (value: number, then?: () => void) => {
|
|
64
|
+
const done = host.animate?.({ translate: { x: 0, y: value }, duration: SNAP_MS })
|
|
65
|
+
if (!then) {
|
|
66
|
+
return
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (done?.then) {
|
|
70
|
+
done.then(() => then())
|
|
71
|
+
} else {
|
|
72
|
+
setTimeout(then, SNAP_MS)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const end = () => {
|
|
77
|
+
if (!dragging) {
|
|
78
|
+
return
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
dragging = false
|
|
82
|
+
const next = snapDetentIndex(host.translateY, vy, sorted, vh())
|
|
83
|
+
if (next < 0) {
|
|
84
|
+
animateTo(vh(), closeNow)
|
|
85
|
+
} else {
|
|
86
|
+
cur = next
|
|
87
|
+
animateTo(detentOffset(sorted, cur, vh()))
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const onPan = (e: any) => {
|
|
92
|
+
if (e.state === 1) {
|
|
93
|
+
// began
|
|
94
|
+
dragging = true
|
|
95
|
+
dy0 = e.deltaY
|
|
96
|
+
ty0 = host.translateY
|
|
97
|
+
vy = 0
|
|
98
|
+
lastDy = e.deltaY
|
|
99
|
+
lastT = Date.now()
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (e.state === 0 || e.state === 3) {
|
|
104
|
+
// cancelled / ended
|
|
105
|
+
end()
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (!dragging) {
|
|
110
|
+
return
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const now = Date.now()
|
|
114
|
+
const dt = (now - lastT) / 1000
|
|
115
|
+
const inc = e.deltaY - lastDy
|
|
116
|
+
if (dt > 0) {
|
|
117
|
+
vy = vy * 0.7 + (inc / dt) * 0.3
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
lastDy = e.deltaY
|
|
121
|
+
lastT = now
|
|
122
|
+
host.translateY = Math.min(Math.max(ty0 + (e.deltaY - dy0), 0), vh())
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
grabber.on('pan', onPan)
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
enter: () => {
|
|
129
|
+
// Size the panel now that the host has a parent — grabber row
|
|
130
|
+
// heights and detent fractions resolve against the RootLayout.
|
|
131
|
+
host.height = max * vh()
|
|
132
|
+
host.translateY = vh()
|
|
133
|
+
animateTo(detentOffset(sorted, cur, vh()))
|
|
134
|
+
},
|
|
135
|
+
detach: () => {
|
|
136
|
+
grabber.off('pan', onPan)
|
|
137
|
+
if (grabber.parent === host) {
|
|
138
|
+
host.removeChild?.(grabber)
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
}
|
|
142
|
+
}
|