@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,68 @@
|
|
|
1
|
+
/** @jsxImportSource @nativescript-community/octane */
|
|
2
|
+
import { useEffect, useRef } from 'octane';
|
|
3
|
+
import type { ModalProps } from "../props";
|
|
4
|
+
import { Frame, GridLayout } from '@nativescript/core';
|
|
5
|
+
import { createNativeScriptRoot } from '@nativescript-community/octane';
|
|
6
|
+
import type { UniversalComponent } from 'octane/universal';
|
|
7
|
+
import { applyThemeClasses } from '../theme/theme-scheme';
|
|
8
|
+
import { modalPresenter } from '../modal-presenter.mobile';
|
|
9
|
+
|
|
10
|
+
// The modal's content renders inside a separate Octane root on a GridLayout
|
|
11
|
+
// host — modals never share context with their presenter (decision #9).
|
|
12
|
+
// GridLayout because the root host must be multi-child: ContentView assigns
|
|
13
|
+
// each child to `.content`, so a fragment of siblings would keep only the
|
|
14
|
+
// last; grid children all fill the cell (single-child layout unchanged).
|
|
15
|
+
// Children arrive as an already-created element: element data evaluates in
|
|
16
|
+
// whichever root renders it, so re-parenting through the second root is safe.
|
|
17
|
+
function Panel(props: { children?: any }) @{
|
|
18
|
+
<>{props.children}</>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** UIModal — declarative `open` drives the platform modal presentation
|
|
22
|
+
* (`showModal`; fullscreen=false is an iOS form sheet). Renders nothing
|
|
23
|
+
* inline; the content lives on the modal's own root above the whole tree.
|
|
24
|
+
* The shared `ui` surface has no Modal — `Overlay`/`Sheet` are the
|
|
25
|
+
* self-drawn in-window versions. */
|
|
26
|
+
export function UIModal(props: ModalProps) @{
|
|
27
|
+
const shown = useRef<{ host: GridLayout; root: any; unbindTheme?: () => void } | null>(null);
|
|
28
|
+
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (props.open && !shown.current) {
|
|
31
|
+
const presenter = modalPresenter(Frame.topmost());
|
|
32
|
+
if (!presenter) {
|
|
33
|
+
// Dropped, not deferred: the effect only re-runs when props
|
|
34
|
+
// change, so warn loudly instead of silently swallowing open.
|
|
35
|
+
console.warn('[Modal] open dropped — no live presenter (currentPage mid-navigation or no active frame).');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const host = new GridLayout();
|
|
40
|
+
const unbindTheme = applyThemeClasses(host, 'vx-modal-host');
|
|
41
|
+
const root = createNativeScriptRoot(host);
|
|
42
|
+
shown.current = { host, root, unbindTheme };
|
|
43
|
+
if (props.component) {
|
|
44
|
+
root.render(props.component as UniversalComponent, props.params ?? {});
|
|
45
|
+
} else {
|
|
46
|
+
root.render(Panel as unknown as UniversalComponent, { children: props.children });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Signature is showModal(viewToShow, options) — not an options bag.
|
|
50
|
+
const fullscreen = props.presentation
|
|
51
|
+
? props.presentation === 'fullscreen'
|
|
52
|
+
: props.fullscreen ?? true;
|
|
53
|
+
|
|
54
|
+
presenter.showModal(host, {
|
|
55
|
+
context: {},
|
|
56
|
+
closeCallback: (result?: unknown) => { shown.current?.unbindTheme?.(); shown.current = null; props.onClose?.(result); },
|
|
57
|
+
fullscreen,
|
|
58
|
+
animated: true,
|
|
59
|
+
});
|
|
60
|
+
} else if (!props.open && shown.current) {
|
|
61
|
+
const { host } = shown.current;
|
|
62
|
+
shown.current = null;
|
|
63
|
+
host.closeModal();
|
|
64
|
+
}
|
|
65
|
+
}, [props.open]);
|
|
66
|
+
|
|
67
|
+
<></>
|
|
68
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** @jsxImportSource @nativescript-community/octane */
|
|
2
|
+
import type { PlatformWidgetProps, SliderProps } from '../props';
|
|
3
|
+
import { cx } from '../cx';
|
|
4
|
+
import { applyNativeProps } from '../platformProps';
|
|
5
|
+
|
|
6
|
+
/** UISlider — the platform widget (UIKit UISlider via NativeScript `slider`).
|
|
7
|
+
* The self-drawn shared `Slider` lives in the root export. */
|
|
8
|
+
export function UISlider(props: PlatformWidgetProps<SliderProps>) @{
|
|
9
|
+
<slider
|
|
10
|
+
id={props.id}
|
|
11
|
+
className={cx(props.className)}
|
|
12
|
+
style={props.style}
|
|
13
|
+
value={props.value}
|
|
14
|
+
minValue={props.minValue ?? 0}
|
|
15
|
+
maxValue={props.maxValue ?? 100}
|
|
16
|
+
isEnabled={props.disabled ? false : true}
|
|
17
|
+
onValueChange={(e: any) => props.onValueChange?.(e.value)}
|
|
18
|
+
ref={(el: any) => applyNativeProps(el, props)}
|
|
19
|
+
/>
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** @jsxImportSource @nativescript-community/octane */
|
|
2
|
+
import type { PlatformWidgetProps, SwitchProps } from "../props";
|
|
3
|
+
import { cx } from "../cx";
|
|
4
|
+
import { applyEscapeProps } from "../escape-props";
|
|
5
|
+
|
|
6
|
+
/** UISwitch — the platform widget (UIKit UISwitch via NativeScript `switch`).
|
|
7
|
+
* OS chrome is the point here; the self-drawn shared `Switch` lives in the
|
|
8
|
+
* root export. */
|
|
9
|
+
export function UISwitch(props: PlatformWidgetProps<SwitchProps>) @{
|
|
10
|
+
<switch
|
|
11
|
+
ref={(v: any) => applyEscapeProps(v, props)}
|
|
12
|
+
id={props.id}
|
|
13
|
+
className={cx(props.className)}
|
|
14
|
+
style={props.style}
|
|
15
|
+
checked={props.checked}
|
|
16
|
+
onCheckedChange={(e: any) => props.onCheckedChange?.(e.value)}
|
|
17
|
+
/>
|
|
18
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/** @jsxImportSource @nativescript-community/octane */
|
|
2
|
+
import { memo } from 'octane';
|
|
3
|
+
import { Frame, GridLayout, Page, TabView, TabViewItem } from '@nativescript/core';
|
|
4
|
+
import { createNativeScriptRoot } from '@nativescript-community/octane';
|
|
5
|
+
import type { UniversalComponent } from 'octane/universal';
|
|
6
|
+
import { registerStack } from '../stacks';
|
|
7
|
+
import { cx } from '../cx';
|
|
8
|
+
import { getIcon } from '../icons';
|
|
9
|
+
import type { PlatformTabSpec, PlatformTabsProps, PlatformWidgetProps } from '../props';
|
|
10
|
+
import { applyEscapeProps } from '../escape-props';
|
|
11
|
+
|
|
12
|
+
export type { PlatformTabSpec as TabSpec } from '../props';
|
|
13
|
+
|
|
14
|
+
// TabViewItem content is a plain native view — the driver can't parent
|
|
15
|
+
// reconciled children into <tabviewitem>, so each pane is a GridLayout
|
|
16
|
+
// hosting its own universal root (same shape as List cells). GridLayout,
|
|
17
|
+
// not ContentView: the host must be multi-child — a pane render producing
|
|
18
|
+
// more than one root view would keep only the last under `.content`
|
|
19
|
+
// assignment. Grid children all fill the cell, so single-child panes are
|
|
20
|
+
// unaffected.
|
|
21
|
+
type TabPaneProps = { render: () => any };
|
|
22
|
+
function TabPane(props: TabPaneProps) @{
|
|
23
|
+
<>{props.render()}</>
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const paneRoots = new WeakMap<GridLayout, any>();
|
|
27
|
+
const tabsByView = new WeakMap<GridLayout, () => any>();
|
|
28
|
+
const itemsCache = new WeakMap<readonly PlatformTabSpec[], TabViewItem[]>();
|
|
29
|
+
const iconWarned = new Set<string>();
|
|
30
|
+
|
|
31
|
+
// Registered glyph → UITabBarItem image. `src` passes to iconSource
|
|
32
|
+
// verbatim (sys:// = SF Symbol, res://, font://, file path); `font` and
|
|
33
|
+
// `text` glyphs draw through font://. svg/markup can't become a UIImage
|
|
34
|
+
// synchronously — warn once, render title-only.
|
|
35
|
+
function applyIcon(item: TabViewItem, name: string): void {
|
|
36
|
+
if (name.startsWith('sys://') || name.startsWith('res://')) {
|
|
37
|
+
item.iconSource = name;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const glyph = getIcon(name);
|
|
41
|
+
if (!glyph) {
|
|
42
|
+
warnIconOnce(name, `tab icon '${name}' isn't registered — call registerIcons() at boot.`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (glyph.src) {
|
|
47
|
+
item.iconSource = glyph.src;
|
|
48
|
+
} else if (glyph.font) {
|
|
49
|
+
item.iconSource = 'font://' + glyph.font.glyph;
|
|
50
|
+
item.iconFontFamily = glyph.font.family;
|
|
51
|
+
} else if (glyph.text) {
|
|
52
|
+
// font:// with no iconFontFamily draws through the default font.
|
|
53
|
+
item.iconSource = 'font://' + glyph.text;
|
|
54
|
+
} else {
|
|
55
|
+
warnIconOnce(
|
|
56
|
+
name,
|
|
57
|
+
`tab icon '${name}' has no src/font/text representation — UITabBarItem can't render svg/markup glyphs.`,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function warnIconOnce(name: string, msg: string): void {
|
|
63
|
+
if (iconWarned.has(name)) return;
|
|
64
|
+
iconWarned.add(name);
|
|
65
|
+
console.warn('[octane-xplat] ' + msg);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function itemsFor(tabs: readonly PlatformTabSpec[]): TabViewItem[] {
|
|
69
|
+
let items = itemsCache.get(tabs);
|
|
70
|
+
if (items !== undefined) return items;
|
|
71
|
+
items = tabs.map((t) => {
|
|
72
|
+
const item = new TabViewItem();
|
|
73
|
+
item.title = t.title;
|
|
74
|
+
if (t.icon != null) applyIcon(item, t.icon);
|
|
75
|
+
if (t.stack) {
|
|
76
|
+
// Parallel-stack pane: the item's view IS a Frame whose default
|
|
77
|
+
// page hosts the pane's own Octane root. Pushes land inside the
|
|
78
|
+
// tab; the tab bar stays visible.
|
|
79
|
+
// Navigate on `loaded`, not eagerly: a navigate issued before the
|
|
80
|
+
// frame enters the window hierarchy leaves _executingContext
|
|
81
|
+
// stuck (iOS's delegate never sees didShow) and every later push
|
|
82
|
+
// queues forever.
|
|
83
|
+
const frame = new Frame();
|
|
84
|
+
frame.once('loaded', () => {
|
|
85
|
+
frame.navigate({
|
|
86
|
+
create: () => {
|
|
87
|
+
const page = new Page();
|
|
88
|
+
page.actionBarHidden = true;
|
|
89
|
+
// Page is a ContentView — single-child. Root on a
|
|
90
|
+
// GridLayout child for the same multi-child guarantee.
|
|
91
|
+
const pane = new GridLayout();
|
|
92
|
+
page.content = pane;
|
|
93
|
+
createNativeScriptRoot(pane).render(
|
|
94
|
+
TabPane as unknown as UniversalComponent, { render: t.render });
|
|
95
|
+
|
|
96
|
+
return page;
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
registerStack(t.stack, frame);
|
|
102
|
+
item.view = frame;
|
|
103
|
+
return item;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const cv = new GridLayout();
|
|
107
|
+
tabsByView.set(cv, t.render);
|
|
108
|
+
item.view = cv;
|
|
109
|
+
return item;
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
itemsCache.set(tabs, items);
|
|
113
|
+
return items;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Panes mount lazily: a pane view that isn't loaded yet would render into
|
|
117
|
+
// nothing — mount on the tabview's loaded event, all at once.
|
|
118
|
+
function mountPanes(e: any) {
|
|
119
|
+
const tv = e.object as TabView;
|
|
120
|
+
for (const item of tv.items as TabViewItem[]) {
|
|
121
|
+
const cv = item.view as GridLayout;
|
|
122
|
+
if (!(cv instanceof GridLayout) || paneRoots.has(cv)) continue;
|
|
123
|
+
const render = tabsByView.get(cv);
|
|
124
|
+
if (!render) continue;
|
|
125
|
+
const root = createNativeScriptRoot(cv);
|
|
126
|
+
paneRoots.set(cv, root);
|
|
127
|
+
root.render(TabPane as unknown as UniversalComponent, { render });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function TabBarInner(props: {
|
|
132
|
+
className?: any;
|
|
133
|
+
style?: any;
|
|
134
|
+
id?: string;
|
|
135
|
+
tabs: readonly PlatformTabSpec[];
|
|
136
|
+
selectedIndex?: number;
|
|
137
|
+
onSelectedIndexChanged?: (index: number) => void;
|
|
138
|
+
ios?: Record<string, any>;
|
|
139
|
+
modifiers?: PlatformWidgetProps<PlatformTabsProps>['modifiers'];
|
|
140
|
+
}) @{
|
|
141
|
+
<tabview
|
|
142
|
+
ref={(v: any) => applyEscapeProps(v, props)}
|
|
143
|
+
id={props.id}
|
|
144
|
+
className={cx(props.className)}
|
|
145
|
+
style={props.style}
|
|
146
|
+
items={itemsFor(props.tabs)}
|
|
147
|
+
selectedIndex={props.selectedIndex}
|
|
148
|
+
onSelectedIndexChanged={(e: any) => props.onSelectedIndexChanged?.(e.value)}
|
|
149
|
+
onLoaded={mountPanes}
|
|
150
|
+
/>
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Memoized on the tabs array — TabView.item writes rebuild the native
|
|
154
|
+
// structure, and the driver re-applies props every render.
|
|
155
|
+
const MemoTabBar = memo(TabBarInner, (a, b) => a.tabs === b.tabs && a.selectedIndex === b.selectedIndex && a.modifiers === b.modifiers);
|
|
156
|
+
|
|
157
|
+
/** UITabBar — the platform tab bar (UIKit UITabBarController-backed TabView).
|
|
158
|
+
* Real per-pane Frames: each `stack` tab keeps a native navigation stack
|
|
159
|
+
* inside its pane. The self-drawn shared `Tabs` lives in the root export.
|
|
160
|
+
* `tabs` is identity-stable (module const preferred). */
|
|
161
|
+
export function UITabBar(props: PlatformWidgetProps<PlatformTabsProps>) @{
|
|
162
|
+
<MemoTabBar
|
|
163
|
+
id={props.id}
|
|
164
|
+
className={props.className}
|
|
165
|
+
style={props.style}
|
|
166
|
+
tabs={props.tabs}
|
|
167
|
+
selectedIndex={props.selectedIndex}
|
|
168
|
+
ios={props.ios}
|
|
169
|
+
onSelectedIndexChanged={props.onSelectedIndexChanged}
|
|
170
|
+
modifiers={props.modifiers}
|
|
171
|
+
/>
|
|
172
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/** @jsxImportSource @nativescript-community/octane */
|
|
2
|
+
// Universal hooks import from 'octane' — the compiler retargets them to the
|
|
3
|
+
// nativescript runtime, and the dev server serves them via HTTP-ESM.
|
|
4
|
+
import { memo, useEffect, useRef } from 'octane';
|
|
5
|
+
import { ScrollView } from '@nativescript/core';
|
|
6
|
+
import type { ListProps, PlatformWidgetProps } from "../props";
|
|
7
|
+
import type { RefreshConfig, RefreshController } from '../refresh';
|
|
8
|
+
import { cx } from "../cx";
|
|
9
|
+
import { ActivityIndicator } from '../ActivityIndicator.tsrx';
|
|
10
|
+
import { applyEscapeProps } from '../escape-props';
|
|
11
|
+
import { REFRESH_HEADER_HEIGHT } from '../refresh-metrics';
|
|
12
|
+
import { createPullToRefresh } from '../refresh';
|
|
13
|
+
|
|
14
|
+
function rejectNestedScrollView(event: any) {
|
|
15
|
+
let parent = event.object?.parent;
|
|
16
|
+
while (parent) {
|
|
17
|
+
if (parent instanceof ScrollView) {
|
|
18
|
+
throw new Error('[UITableView] cannot be nested inside native ScrollView. Use ScrollBox so the list owns scrolling.');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
parent = parent.parent;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Stable ref bag across the memo boundary — refresh callbacks are fresh
|
|
26
|
+
* closures each parent render, so the props live behind refs and the
|
|
27
|
+
* memo compare just sees the same bag. */
|
|
28
|
+
interface RefreshBag {
|
|
29
|
+
cfg: { current: RefreshConfig };
|
|
30
|
+
indicator: { current: any };
|
|
31
|
+
ctl: { current: RefreshController | null };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Cell machinery is driver-owned since @nativescript-community/octane 0.2.1
|
|
35
|
+
// (upstream #7, closes our issue #1): `renderItem` on <listview> makes
|
|
36
|
+
// itemTemplate vend a ContentView per recycled cell, each with its own
|
|
37
|
+
// universal root; itemLoading binds items[index] and skips unchanged rows;
|
|
38
|
+
// a changed renderItem re-binds live cells; discard unmounts the roots.
|
|
39
|
+
// The cell ContentView is single-child — a renderItem returning multiple
|
|
40
|
+
// roots would silently drop siblings — so output wraps in a gridlayout.
|
|
41
|
+
function UITableViewInner(props: {
|
|
42
|
+
className?: any;
|
|
43
|
+
style?: any;
|
|
44
|
+
id?: string;
|
|
45
|
+
items: any[];
|
|
46
|
+
renderItem: (item: any, index: number) => any;
|
|
47
|
+
estimatedItemHeight?: number;
|
|
48
|
+
onEndReached?: () => void;
|
|
49
|
+
ios?: Record<string, any>;
|
|
50
|
+
modifiers?: PlatformWidgetProps<ListProps>['modifiers'];
|
|
51
|
+
refresh?: RefreshBag;
|
|
52
|
+
}) @{
|
|
53
|
+
const lv = useRef<any>(null);
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
const bag = props.refresh;
|
|
56
|
+
if (!bag || !lv.current) return;
|
|
57
|
+
bag.ctl.current = createPullToRefresh({
|
|
58
|
+
scroller: lv.current,
|
|
59
|
+
indicator: bag.indicator.current,
|
|
60
|
+
isAtTop: () => true, // iOS reads contentOffset directly — unused
|
|
61
|
+
cfg: bag.cfg,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return () => {
|
|
65
|
+
bag.ctl.current?.detach();
|
|
66
|
+
bag.ctl.current = null;
|
|
67
|
+
};
|
|
68
|
+
}, []);
|
|
69
|
+
|
|
70
|
+
<listview
|
|
71
|
+
ref={(v: any) => {
|
|
72
|
+
lv.current = v;
|
|
73
|
+
applyEscapeProps(v, props);
|
|
74
|
+
}}
|
|
75
|
+
id={props.id}
|
|
76
|
+
className={cx(props.className)}
|
|
77
|
+
style={props.style}
|
|
78
|
+
items={props.items}
|
|
79
|
+
iosEstimatedRowHeight={props.estimatedItemHeight}
|
|
80
|
+
onLoadMoreItems={props.onEndReached}
|
|
81
|
+
onLoaded={rejectNestedScrollView}
|
|
82
|
+
renderItem={(item: any, index: number) => <gridlayout>{props.renderItem(item, index)}</gridlayout>}
|
|
83
|
+
{...props.ios}
|
|
84
|
+
/>
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// The listview subtree is memoized on `items` and list configuration: the
|
|
88
|
+
// universal driver re-applies props on every render (no value diffing), and
|
|
89
|
+
// each write can trigger view-level side effects — measured: every unrelated
|
|
90
|
+
// parent re-render refired itemLoading for all visible cells. Memoized on the
|
|
91
|
+
// items reference and list configuration, unrelated parent re-renders skip
|
|
92
|
+
// this subtree. Constraint: `renderItem` should be identity-stable (a
|
|
93
|
+
// useCallback-style ref) — a fresh closure each render is deliberately
|
|
94
|
+
// not part of the compare. (`UITableViewInner` must precede this — compiled
|
|
95
|
+
// components are consts, not hoisted functions.)
|
|
96
|
+
const MemoListView = memo(UITableViewInner, (a, b) =>
|
|
97
|
+
a.items === b.items &&
|
|
98
|
+
a.className === b.className &&
|
|
99
|
+
a.style === b.style &&
|
|
100
|
+
a.id === b.id &&
|
|
101
|
+
a.estimatedItemHeight === b.estimatedItemHeight &&
|
|
102
|
+
a.onEndReached === b.onEndReached &&
|
|
103
|
+
a.ios === b.ios &&
|
|
104
|
+
a.modifiers === b.modifiers &&
|
|
105
|
+
a.refresh === b.refresh
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
/** UITableView — the platform recycling list (UIKit UITableView via
|
|
109
|
+
* NativeScript `listview`). `items` is a plain array, ItemsSource, or
|
|
110
|
+
* ObservableArray — the driver binds `items[index]` into the recycled
|
|
111
|
+
* cell's root and skips rebinds whose row, item, and renderer are
|
|
112
|
+
* unchanged. Cell identity = the recycled host view, not the item.
|
|
113
|
+
* The shared `ui` export has no List — compose ScrollView + mapped
|
|
114
|
+
* children there.
|
|
115
|
+
*
|
|
116
|
+
* `refreshing`/`onRefresh`/`refreshThreshold` enable pull-to-refresh:
|
|
117
|
+
* the indicator is self-drawn (vx-spinner), the pull rides UITableView's
|
|
118
|
+
* own bounce, and the docked phase holds via contentInset — the same
|
|
119
|
+
* mechanics UIRefreshControl uses, without its OS spinner. */
|
|
120
|
+
export function UITableView(props: PlatformWidgetProps<ListProps>) @{
|
|
121
|
+
const refreshCapable = props.onRefresh != null || props.refreshing != null;
|
|
122
|
+
const cfg = useRef<RefreshConfig>({});
|
|
123
|
+
cfg.current = {
|
|
124
|
+
onRefresh: props.onRefresh,
|
|
125
|
+
refreshing: props.refreshing,
|
|
126
|
+
threshold: props.refreshThreshold,
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const indicator = useRef<any>(null);
|
|
130
|
+
const ctl = useRef<RefreshController | null>(null);
|
|
131
|
+
const refresh = useRef<RefreshBag>({ cfg, indicator, ctl });
|
|
132
|
+
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
ctl.current?.sync();
|
|
135
|
+
}, [props.refreshing]);
|
|
136
|
+
|
|
137
|
+
@if (props.items.length > 0) {
|
|
138
|
+
@if (refreshCapable) {
|
|
139
|
+
<gridlayout
|
|
140
|
+
ref={(v: any) => {
|
|
141
|
+
// iOS doesn't clip children — the resting indicator sits
|
|
142
|
+
// translated above the wrapper's top edge without it.
|
|
143
|
+
if (v?.ios) v.ios.clipsToBounds = true;
|
|
144
|
+
}}
|
|
145
|
+
className={cx('vx-refresh-wrap', props.className)}
|
|
146
|
+
style={props.style}
|
|
147
|
+
>
|
|
148
|
+
<MemoListView
|
|
149
|
+
id={props.id}
|
|
150
|
+
items={props.items}
|
|
151
|
+
renderItem={props.renderItem}
|
|
152
|
+
estimatedItemHeight={props.estimatedItemHeight}
|
|
153
|
+
onEndReached={props.onEndReached}
|
|
154
|
+
ios={props.ios}
|
|
155
|
+
modifiers={props.modifiers}
|
|
156
|
+
refresh={refresh.current}
|
|
157
|
+
/>
|
|
158
|
+
<flexboxlayout
|
|
159
|
+
ref={(v: any) => {
|
|
160
|
+
indicator.current = v;
|
|
161
|
+
}}
|
|
162
|
+
className="vx-refresh"
|
|
163
|
+
verticalAlignment="top"
|
|
164
|
+
height={REFRESH_HEADER_HEIGHT}
|
|
165
|
+
translateY={-REFRESH_HEADER_HEIGHT}
|
|
166
|
+
>
|
|
167
|
+
<ActivityIndicator />
|
|
168
|
+
</flexboxlayout>
|
|
169
|
+
</gridlayout>
|
|
170
|
+
} @else {
|
|
171
|
+
<MemoListView
|
|
172
|
+
id={props.id}
|
|
173
|
+
items={props.items}
|
|
174
|
+
className={props.className}
|
|
175
|
+
style={props.style}
|
|
176
|
+
renderItem={props.renderItem}
|
|
177
|
+
estimatedItemHeight={props.estimatedItemHeight}
|
|
178
|
+
onEndReached={props.onEndReached}
|
|
179
|
+
ios={props.ios}
|
|
180
|
+
modifiers={props.modifiers}
|
|
181
|
+
/>
|
|
182
|
+
}
|
|
183
|
+
} @else {
|
|
184
|
+
<>{props.renderEmpty?.()}</>
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PlatformIconChoice } from '../props'
|
|
2
|
+
|
|
3
|
+
/** Selector for glyphs used by iOS-authentic widgets; the shared root Icon is unchanged. */
|
|
4
|
+
export const Icon = {
|
|
5
|
+
select(choice: PlatformIconChoice): string {
|
|
6
|
+
return choice.ios.startsWith('sys://') ? choice.ios : `sys://${choice.ios}`
|
|
7
|
+
},
|
|
8
|
+
}
|
package/src/ios/index.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// @octane-xplat/ui/ios — iOS-authentic widgets. OS chrome is the point:
|
|
2
|
+
// these resolve only in native builds (the `ui/ios` subpath has no `web`
|
|
3
|
+
// export condition). Use inside `.ios.tsrx`/`.mobile.tsrx` files, or behind
|
|
4
|
+
// `isIOS` in native-default code — a shared `.tsrx` that imports this path fails
|
|
5
|
+
// the web build on purpose.
|
|
6
|
+
|
|
7
|
+
export { UISwitch } from './UISwitch.ios.tsrx'
|
|
8
|
+
export { UISlider } from './UISlider.ios.tsrx'
|
|
9
|
+
export { UIActivityIndicatorView } from './UIActivityIndicatorView.ios.tsrx'
|
|
10
|
+
export { UITableView } from './UITableView.ios.tsrx'
|
|
11
|
+
export { UITabBar } from './UITabBar.ios.tsrx'
|
|
12
|
+
export type { PlatformTabSpec as TabSpec } from '../props'
|
|
13
|
+
export { UIModal } from './UIModal.ios.tsrx'
|
|
14
|
+
export { openModal } from './openModal.ios'
|
|
15
|
+
export { SideDrawer } from './SideDrawer.ios.tsrx'
|
|
16
|
+
export { LiquidGlass } from './LiquidGlass.ios.tsrx'
|
|
17
|
+
export { LiquidGlassContainer } from './LiquidGlassContainer.ios.tsrx'
|
|
18
|
+
export { Icon } from './icon.ios'
|
|
19
|
+
export { modifier } from '../modifier-factories'
|
|
20
|
+
|
|
21
|
+
export type {
|
|
22
|
+
SwitchProps,
|
|
23
|
+
SliderProps,
|
|
24
|
+
ActivityIndicatorProps,
|
|
25
|
+
ListProps,
|
|
26
|
+
TabsProps,
|
|
27
|
+
ModalProps,
|
|
28
|
+
ModalOpenOptions,
|
|
29
|
+
ModalOpenResult,
|
|
30
|
+
OpenModal,
|
|
31
|
+
DrawerProps,
|
|
32
|
+
LiquidGlassProps,
|
|
33
|
+
LiquidGlassContainerProps,
|
|
34
|
+
GlassConfig,
|
|
35
|
+
NativeModifier,
|
|
36
|
+
NativeModifierValue,
|
|
37
|
+
PlatformIconChoice,
|
|
38
|
+
PlatformTabSpec,
|
|
39
|
+
PlatformTabsProps,
|
|
40
|
+
PlatformWidgetProps,
|
|
41
|
+
RefreshProps,
|
|
42
|
+
} from '../props'
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Frame, GridLayout } from '@nativescript/core'
|
|
2
|
+
import { createNativeScriptRoot } from '@nativescript-community/octane'
|
|
3
|
+
import type { UniversalComponent } from 'octane/universal'
|
|
4
|
+
import type { ModalOpenOptions, ModalOpenResult, OpenModal } from '../props'
|
|
5
|
+
import { applyThemeClasses } from '../theme/theme-scheme'
|
|
6
|
+
import { modalPresenter } from '../modal-presenter.mobile'
|
|
7
|
+
|
|
8
|
+
/** Open a component in its own NativeScript modal root and resolve on close. */
|
|
9
|
+
export const openModal: OpenModal = (Component, params, options = {}) =>
|
|
10
|
+
new Promise<ModalOpenResult>((resolve, reject) => {
|
|
11
|
+
const presenter = modalPresenter(Frame.topmost())
|
|
12
|
+
if (!presenter) {
|
|
13
|
+
reject(
|
|
14
|
+
new Error(
|
|
15
|
+
'openModal dropped — no live presenter. The topmost frame has no loaded currentPage (a page mid-navigation), or no frame is active yet.',
|
|
16
|
+
),
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
return
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const host = new GridLayout()
|
|
23
|
+
const unbindTheme = applyThemeClasses(host, 'vx-modal-host')
|
|
24
|
+
const root = createNativeScriptRoot(host) as any
|
|
25
|
+
let finished = false
|
|
26
|
+
const finish = (result?: ModalOpenResult) => {
|
|
27
|
+
if (finished) {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
finished = true
|
|
32
|
+
unbindTheme()
|
|
33
|
+
root.unmount?.()
|
|
34
|
+
host.removeChildren?.()
|
|
35
|
+
resolve(result)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const close = (result?: ModalOpenResult) => host.closeModal(result)
|
|
39
|
+
root.render(Component as UniversalComponent, { params, close })
|
|
40
|
+
|
|
41
|
+
const fullscreen = options.presentation
|
|
42
|
+
? options.presentation === 'fullscreen'
|
|
43
|
+
: (options.fullscreen ?? true)
|
|
44
|
+
|
|
45
|
+
// showModal takes (viewToShow, options). On iOS fullscreen=false is a
|
|
46
|
+
// form sheet.
|
|
47
|
+
presenter.showModal(host, {
|
|
48
|
+
context: {},
|
|
49
|
+
closeCallback: finish,
|
|
50
|
+
fullscreen,
|
|
51
|
+
animated: options.animated ?? true,
|
|
52
|
+
})
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
export type { ModalOpenOptions }
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Application } from '@nativescript/core';
|
|
2
|
+
|
|
3
|
+
// One shared observer tracks the keyboard's current bottom inset — a sheet
|
|
4
|
+
// opened while the keyboard is ALREADY up must lift immediately (a
|
|
5
|
+
// WillChangeFrame observer only learns about changes after binding), and a
|
|
6
|
+
// focused field keeps the inset live across sheet swaps.
|
|
7
|
+
const bound = new Set<any>();
|
|
8
|
+
let inset = 0;
|
|
9
|
+
let wired = false;
|
|
10
|
+
|
|
11
|
+
const apply = () => {
|
|
12
|
+
bound.forEach((host) => {
|
|
13
|
+
host.translateY = -inset;
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
const wireIos = () => {
|
|
19
|
+
if (wired) { return; }
|
|
20
|
+
wired = true;
|
|
21
|
+
NSNotificationCenter.defaultCenter.addObserverForNameObjectQueueUsingBlock(
|
|
22
|
+
UIKeyboardWillChangeFrameNotification,
|
|
23
|
+
null,
|
|
24
|
+
NSOperationQueue.mainQueue,
|
|
25
|
+
(note: any) => {
|
|
26
|
+
// UIKeyboardFrameEndUserInfoKey arrives boxed as NSValue whose
|
|
27
|
+
// `CGRectValue` marshals to a plain CGRect object (not a call).
|
|
28
|
+
const raw = note.userInfo.objectForKey(UIKeyboardFrameEndUserInfoKey);
|
|
29
|
+
const boxed = raw?.CGRectValue;
|
|
30
|
+
const frame = typeof boxed === 'function' ? raw.CGRectValue() : (boxed ?? raw);
|
|
31
|
+
inset = Math.max(0, UIScreen.mainScreen.bounds.size.height - (frame?.origin?.y ?? UIScreen.mainScreen.bounds.size.height));
|
|
32
|
+
apply();
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** Lift a bottom-anchored overlay host above the software keyboard.
|
|
38
|
+
* iOS: a shared UIKeyboardWillChangeFrame observer tracks the inset and
|
|
39
|
+
* translateY shifts the host — reliable on popup views regardless of how
|
|
40
|
+
* the RootLayout passes margins through. The current inset is applied at
|
|
41
|
+
* bind time so hosts opened over an already-visible keyboard still lift.
|
|
42
|
+
* Android: when the window runs `adjustResize` (KeyboardAvoiding sets it)
|
|
43
|
+
* the RootLayout resizes and the host follows on its own; otherwise the
|
|
44
|
+
* decor view's IME inset supplies the lift. Returns an unbind that
|
|
45
|
+
* restores the transform — call it when the host detaches. */
|
|
46
|
+
export function bindBottomInsetToKeyboard(host: any): () => void {
|
|
47
|
+
if (Application.ios) {
|
|
48
|
+
wireIos();
|
|
49
|
+
bound.add(host);
|
|
50
|
+
host.translateY = -inset;
|
|
51
|
+
return () => {
|
|
52
|
+
bound.delete(host);
|
|
53
|
+
host.translateY = 0;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (Application.android) {
|
|
58
|
+
const nativeWindow = Application.android.foregroundActivity?.window;
|
|
59
|
+
if (!nativeWindow) { return () => {}; }
|
|
60
|
+
const params = (globalThis as any).android?.view?.WindowManager?.LayoutParams;
|
|
61
|
+
if (!params) { return () => {}; }
|
|
62
|
+
// adjustResize resizes the RootLayout for us — an extra offset would
|
|
63
|
+
// double-lift the host.
|
|
64
|
+
if ((nativeWindow.attributes.softInputMode & params.SOFT_INPUT_MASK_ADJUST) === params.SOFT_INPUT_ADJUST_RESIZE) {
|
|
65
|
+
return () => {};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const ViewCompat = (globalThis as any).androidx?.core?.view?.ViewCompat;
|
|
69
|
+
const WindowInsetsCompat = (globalThis as any).androidx?.core?.view?.WindowInsetsCompat;
|
|
70
|
+
if (!ViewCompat || !WindowInsetsCompat) { return () => {}; }
|
|
71
|
+
const decorView = nativeWindow.decorView;
|
|
72
|
+
const listener = new ViewCompat.OnApplyWindowInsetsListener({
|
|
73
|
+
onApplyWindowInsets: (v: any, insets: any) => {
|
|
74
|
+
const ime = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom;
|
|
75
|
+
const nav = insets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom;
|
|
76
|
+
host.translateY = -Math.max(0, ime - nav);
|
|
77
|
+
return insets;
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
ViewCompat.setOnApplyWindowInsetsListener(decorView, listener);
|
|
82
|
+
return () => {
|
|
83
|
+
host.translateY = 0;
|
|
84
|
+
ViewCompat.setOnApplyWindowInsetsListener(decorView, null);
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return () => {};
|
|
89
|
+
}
|