@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,149 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import {
|
|
3
|
+
createContext,
|
|
4
|
+
createObjectContainer,
|
|
5
|
+
createObjectDriver,
|
|
6
|
+
createUniversalRoot,
|
|
7
|
+
defineUniversalComponent,
|
|
8
|
+
flushUniversalSync,
|
|
9
|
+
universalComponent,
|
|
10
|
+
universalPlan,
|
|
11
|
+
universalValue,
|
|
12
|
+
useContext,
|
|
13
|
+
} from 'octane/universal/native'
|
|
14
|
+
|
|
15
|
+
import { createStore } from './store'
|
|
16
|
+
import { useStore } from './use-store'
|
|
17
|
+
|
|
18
|
+
// Universal-runtime scheduler semantics, exercised through the object driver
|
|
19
|
+
// (the same retain/dirty-epoch path the NativeScript driver runs). These tests
|
|
20
|
+
// pin the deliberate divergence from the DOM renderer: a re-rendering parent
|
|
21
|
+
// retains children whose props are shallow-unchanged, so module-store reads
|
|
22
|
+
// only refresh in components that subscribe themselves — via useStore.
|
|
23
|
+
|
|
24
|
+
const labelPlan = universalPlan('object', {
|
|
25
|
+
kind: 'host',
|
|
26
|
+
type: 'label',
|
|
27
|
+
bindings: [['value', 0]],
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const label = (value: string) => universalValue(labelPlan, [value])
|
|
31
|
+
const texts = (container: ReturnType<typeof createObjectContainer>) =>
|
|
32
|
+
container.children.map((c: any) => c.props.value)
|
|
33
|
+
|
|
34
|
+
function objectRoot() {
|
|
35
|
+
const container = createObjectContainer()
|
|
36
|
+
return { container, root: createUniversalRoot(container, createObjectDriver()) }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
describe('universal renderer — store reads under parent re-render', () => {
|
|
40
|
+
it('refreshes a child that reads the store through useStore', () => {
|
|
41
|
+
const store = createStore(0)
|
|
42
|
+
const Child = defineUniversalComponent('object', () => label(`child:${useStore(store)}`))
|
|
43
|
+
const Parent = defineUniversalComponent('object', () => {
|
|
44
|
+
useStore(store)
|
|
45
|
+
return [universalComponent('object', Child, { stable: 'same' }), label('parent')]
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
const { container, root } = objectRoot()
|
|
49
|
+
root.render(Parent, {})
|
|
50
|
+
expect(texts(container)).toEqual(['child:0', 'parent'])
|
|
51
|
+
|
|
52
|
+
flushUniversalSync(() => store.set(1))
|
|
53
|
+
expect(texts(container)).toEqual(['child:1', 'parent'])
|
|
54
|
+
root.unmount()
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('retains a child that reads the store bare — the divergence useStore fixes', () => {
|
|
58
|
+
const store = createStore(0)
|
|
59
|
+
const renders = { bare: 0, propDriven: 0 }
|
|
60
|
+
// Bare read: no subscription — a retained child never re-runs.
|
|
61
|
+
const BareChild = defineUniversalComponent('object', () => {
|
|
62
|
+
renders.bare++
|
|
63
|
+
return label(`bare:${store.get()}`)
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
// Control: a child whose PROPS change still re-renders normally.
|
|
67
|
+
const PropChild = defineUniversalComponent('object', (props: { tick: number }) => {
|
|
68
|
+
renders.propDriven++
|
|
69
|
+
return label(`prop:${props.tick}`)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
const Parent = defineUniversalComponent('object', (props: { tick: number }) => {
|
|
73
|
+
useStore(store)
|
|
74
|
+
return [
|
|
75
|
+
universalComponent('object', BareChild, { stable: 'same' }),
|
|
76
|
+
universalComponent('object', PropChild, { tick: props.tick }),
|
|
77
|
+
]
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
const { container, root } = objectRoot()
|
|
81
|
+
root.render(Parent, { tick: 0 })
|
|
82
|
+
expect(texts(container)).toEqual(['bare:0', 'prop:0'])
|
|
83
|
+
|
|
84
|
+
// Store write: parent re-renders, bare-read child is retained → stale.
|
|
85
|
+
flushUniversalSync(() => store.set(1))
|
|
86
|
+
expect(renders.bare).toBe(1)
|
|
87
|
+
expect(texts(container)).toEqual(['bare:0', 'prop:0'])
|
|
88
|
+
|
|
89
|
+
// Changed props still re-render the same child — retention keys on
|
|
90
|
+
// shallow-equal props, not on component identity alone.
|
|
91
|
+
root.render(Parent, { tick: 1 })
|
|
92
|
+
expect(renders.propDriven).toBe(2)
|
|
93
|
+
expect(renders.bare).toBe(1)
|
|
94
|
+
expect(texts(container)).toEqual(['bare:0', 'prop:1'])
|
|
95
|
+
root.unmount()
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
it('re-renders a retained child when its consumed context changes', () => {
|
|
99
|
+
const Theme = createContext('light')
|
|
100
|
+
const renders = { ctx: 0, plain: 0 }
|
|
101
|
+
const CtxChild = defineUniversalComponent('object', () => {
|
|
102
|
+
renders.ctx++
|
|
103
|
+
return label(`ctx:${useContext(Theme)}`)
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
const PlainChild = defineUniversalComponent('object', () => {
|
|
107
|
+
renders.plain++
|
|
108
|
+
return label('plain')
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
const Parent = defineUniversalComponent('object', (props: { theme: string }) => [
|
|
112
|
+
universalComponent('object', Theme, {
|
|
113
|
+
value: props.theme,
|
|
114
|
+
children: universalComponent('object', CtxChild, { stable: 'same' }),
|
|
115
|
+
}),
|
|
116
|
+
universalComponent('object', PlainChild, { stable: 'same' }),
|
|
117
|
+
])
|
|
118
|
+
|
|
119
|
+
const { container, root } = objectRoot()
|
|
120
|
+
root.render(Parent, { theme: 'light' })
|
|
121
|
+
expect(texts(container)).toEqual(['ctx:light', 'plain'])
|
|
122
|
+
|
|
123
|
+
// Changed provider value defeats retention for consumers only.
|
|
124
|
+
root.render(Parent, { theme: 'dark' })
|
|
125
|
+
expect(renders.ctx).toBe(2)
|
|
126
|
+
expect(renders.plain).toBe(1)
|
|
127
|
+
expect(texts(container)).toEqual(['ctx:dark', 'plain'])
|
|
128
|
+
root.unmount()
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
it('useStore with a selector re-renders only when the slice changes', () => {
|
|
132
|
+
const store = createStore({ a: 0, b: 0 })
|
|
133
|
+
const renders = { a: 0 }
|
|
134
|
+
const Child = defineUniversalComponent('object', () => {
|
|
135
|
+
renders.a++
|
|
136
|
+
return label(`a:${useStore(store, (s) => s.a)}`)
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
const { container, root } = objectRoot()
|
|
140
|
+
root.render(Child, {})
|
|
141
|
+
expect(texts(container)).toEqual(['a:0'])
|
|
142
|
+
|
|
143
|
+
flushUniversalSync(() => store.set({ a: 0, b: 1 }))
|
|
144
|
+
expect(renders.a).toBe(1) // slice unchanged → no re-render
|
|
145
|
+
flushUniversalSync(() => store.set({ a: 2, b: 1 }))
|
|
146
|
+
expect(texts(container)).toEqual(['a:2'])
|
|
147
|
+
root.unmount()
|
|
148
|
+
})
|
|
149
|
+
})
|
package/src/store.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module-scope store — the shared-state primitive for this stack.
|
|
3
|
+
*
|
|
4
|
+
* Why it exists: the universal (native) renderer RETAINS child components
|
|
5
|
+
* whose props are shallow-unchanged when a parent re-renders — their render
|
|
6
|
+
* functions do not re-run, so a bare `store.get()` in a child stays stale
|
|
7
|
+
* (the DOM renderer re-invokes them, React-style). The portable rule is:
|
|
8
|
+
* every component that reads shared state subscribes to it. The renderer-owned
|
|
9
|
+
* `use-store` leaves implement that subscription; this file is the hook-free
|
|
10
|
+
* half, so plain `.ts` is correct.
|
|
11
|
+
*/
|
|
12
|
+
import type { Store } from './props'
|
|
13
|
+
|
|
14
|
+
export type { ReadableStore, Store } from './props'
|
|
15
|
+
|
|
16
|
+
export function createStore<T>(initial: T): Store<T> {
|
|
17
|
+
let value = initial
|
|
18
|
+
const listeners = new Set<() => void>()
|
|
19
|
+
return {
|
|
20
|
+
get: () => value,
|
|
21
|
+
set(next) {
|
|
22
|
+
const v = typeof next === 'function' ? (next as (p: T) => T)(value) : next
|
|
23
|
+
if (Object.is(v, value)) {
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
value = v
|
|
28
|
+
for (const l of [...listeners]) {
|
|
29
|
+
l()
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
subscribe(notify) {
|
|
33
|
+
listeners.add(notify)
|
|
34
|
+
return () => {
|
|
35
|
+
listeners.delete(notify)
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { act, createRoot } from 'octane';
|
|
4
|
+
import { createStore } from './store';
|
|
5
|
+
import { useStore } from './use-store';
|
|
6
|
+
|
|
7
|
+
// DOM-renderer counterpart to store.mobile.test.ts. Here a parent re-render
|
|
8
|
+
// re-invokes children with unchanged props (React semantics — memo() is the
|
|
9
|
+
// only bail), so a bare store.get() in a child refreshes incidentally. The
|
|
10
|
+
// portable rule is still: readers subscribe via useStore.
|
|
11
|
+
|
|
12
|
+
const store = createStore(0);
|
|
13
|
+
|
|
14
|
+
function BareChild() @{
|
|
15
|
+
<span class="bare">{String(store.get())}</span>
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function SubbedChild() @{
|
|
19
|
+
const v = useStore(store);
|
|
20
|
+
|
|
21
|
+
<span class="subbed">{String(v)}</span>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function SelectedChild() @{
|
|
25
|
+
const v = useStore(store, (s) => s * 10);
|
|
26
|
+
|
|
27
|
+
<span class="sel">{String(v)}</span>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function Parent() @{
|
|
31
|
+
useStore(store);
|
|
32
|
+
|
|
33
|
+
<>
|
|
34
|
+
<BareChild />
|
|
35
|
+
<SubbedChild />
|
|
36
|
+
<SelectedChild />
|
|
37
|
+
</>
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
describe('createStore + useStore (DOM renderer)', () => {
|
|
41
|
+
it('parent store subscription re-renders a bare-read child too (DOM semantics)', () => {
|
|
42
|
+
const el = document.createElement('div');
|
|
43
|
+
document.body.appendChild(el);
|
|
44
|
+
const root = createRoot(el);
|
|
45
|
+
act(() => root.render(<Parent />));
|
|
46
|
+
expect(el.querySelector('.bare')!.textContent).toBe('0');
|
|
47
|
+
expect(el.querySelector('.subbed')!.textContent).toBe('0');
|
|
48
|
+
expect(el.querySelector('.sel')!.textContent).toBe('0');
|
|
49
|
+
|
|
50
|
+
act(() => store.set(1));
|
|
51
|
+
// On DOM the retained child DOES re-run — the divergence this test pins.
|
|
52
|
+
expect(el.querySelector('.bare')!.textContent).toBe('1');
|
|
53
|
+
expect(el.querySelector('.subbed')!.textContent).toBe('1');
|
|
54
|
+
expect(el.querySelector('.sel')!.textContent).toBe('10');
|
|
55
|
+
root.unmount();
|
|
56
|
+
el.remove();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineUniversalComponent, universalComponent } from 'octane/universal/native'
|
|
2
|
+
import { cx } from './cx'
|
|
3
|
+
|
|
4
|
+
/** Compose CSS-backed class names onto an AppKit component factory. */
|
|
5
|
+
export function styled<P extends { className?: any }, V extends Record<string, any>>(
|
|
6
|
+
Base: (props: P) => any,
|
|
7
|
+
def: { base?: any; variants?: V },
|
|
8
|
+
) {
|
|
9
|
+
function Styled(props: P & { [K in keyof V]?: boolean }) {
|
|
10
|
+
const classes: any[] = [def.base]
|
|
11
|
+
const rest: any = { ...props }
|
|
12
|
+
for (const key of Object.keys(def.variants ?? {})) {
|
|
13
|
+
if ((props as any)[key]) {classes.push((def.variants as any)[key])}
|
|
14
|
+
delete rest[key]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (props.className) {classes.push(props.className)}
|
|
18
|
+
rest.className = cx(classes)
|
|
19
|
+
return universalComponent('macos', Base as any, rest)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return defineUniversalComponent('macos', Styled)
|
|
23
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { styled } from './styled.tsrx'
|
|
3
|
+
import { getColorScheme } from './theme/colorScheme.web'
|
|
4
|
+
|
|
5
|
+
// styled.tsrx builds elements via universalComponent() — a plain
|
|
6
|
+
// {$$kind, component, props:{props,key,hasKey,hasChildren}} object — so
|
|
7
|
+
// composition is node-testable. (Compiled components can't be
|
|
8
|
+
// direct-called for inspection on web — the runtime owns invocation.)
|
|
9
|
+
|
|
10
|
+
const Base = ((props: any) => props) as any
|
|
11
|
+
const inner = (el: any) => el.props.props
|
|
12
|
+
|
|
13
|
+
describe('styled() (native leaf)', () => {
|
|
14
|
+
const Btn = styled(Base, { base: 'btn', variants: { danger: 'bg-danger', flat: 'shadow-none' } })
|
|
15
|
+
|
|
16
|
+
it('composes base + variant classes', () => {
|
|
17
|
+
const el = Btn({ danger: true })
|
|
18
|
+
expect(inner(el).className).toEqual(['btn', 'bg-danger'])
|
|
19
|
+
expect(el.component).toBe(Base)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
it('drops falsy variants and consumes variant props', () => {
|
|
23
|
+
const el = Btn({ danger: false, flat: true, id: 'b1' })
|
|
24
|
+
expect(inner(el).className).toEqual(['btn', 'shadow-none'])
|
|
25
|
+
expect(inner(el).danger).toBeUndefined()
|
|
26
|
+
expect(inner(el).flat).toBeUndefined()
|
|
27
|
+
expect(inner(el).id).toBe('b1') // non-variant props pass through
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('appends caller className last', () => {
|
|
31
|
+
const el = Btn({ danger: true, className: 'extra' })
|
|
32
|
+
expect(inner(el).className).toEqual(['btn', 'bg-danger', 'extra'])
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
describe('getColorScheme (web leaf)', () => {
|
|
37
|
+
it('falls back to light without matchMedia', () => {
|
|
38
|
+
expect(getColorScheme()).toBe('light')
|
|
39
|
+
})
|
|
40
|
+
})
|
package/src/styled.tsrx
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { defineUniversalComponent, universalComponent } from 'octane/universal/native';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* styled() — decision #7, Tamagui-shaped but CSS-backed. base/variants are
|
|
5
|
+
* class strings composed into className; the leaf decides what those classes
|
|
6
|
+
* mean per platform.
|
|
7
|
+
*
|
|
8
|
+
* const DangerBtn = styled(Pressable, { base: 'btn', variants: { danger: 'bg-danger' } });
|
|
9
|
+
* <DangerBtn danger /> → className=['btn','bg-danger']
|
|
10
|
+
*
|
|
11
|
+
* Universal constraint (Exp 16): component elements require the
|
|
12
|
+
* compiler-stamped UNIVERSAL_COMPONENT mark and JSX/`@{ }` only lowers at
|
|
13
|
+
* module level — so a component factory can't be authored with JSX. This
|
|
14
|
+
* leaf stamps the mark itself via defineUniversalComponent and returns
|
|
15
|
+
* universalComponent(...) elements directly. If upstream exposes a blessed
|
|
16
|
+
* factory path, switch to it (driver-level fix candidate).
|
|
17
|
+
*/
|
|
18
|
+
export function styled<P extends { className?: any }, V extends Record<string, any>>(
|
|
19
|
+
Base: (props: P) => any,
|
|
20
|
+
def: { base?: any; variants?: V },
|
|
21
|
+
) {
|
|
22
|
+
function Styled(props: P & { [K in keyof V]?: boolean }) {
|
|
23
|
+
const cls: any[] = [def.base];
|
|
24
|
+
const rest: any = { ...props };
|
|
25
|
+
for (const k of Object.keys(def.variants ?? {})) {
|
|
26
|
+
if ((props as any)[k]) cls.push((def.variants as any)[k]);
|
|
27
|
+
delete rest[k]; // variant flags are consumed — don't leak to the leaf
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (props.className) cls.push(props.className);
|
|
31
|
+
rest.className = cls;
|
|
32
|
+
return universalComponent('nativescript', Base as any, rest);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return defineUniversalComponent('nativescript', Styled);
|
|
36
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* styled() — decision #7. Web side: DOM codegen lowers JSX in nested
|
|
3
|
+
* functions fine, so the factory is a plain component.
|
|
4
|
+
*/
|
|
5
|
+
export function styled<P extends { className?: any }, V extends Record<string, any>>(
|
|
6
|
+
Base: (props: P) => any,
|
|
7
|
+
def: { base?: any; variants?: V },
|
|
8
|
+
) {
|
|
9
|
+
function Styled(props: P & { [K in keyof V]?: boolean }) @{
|
|
10
|
+
const cls: any[] = [def.base];
|
|
11
|
+
const rest: any = { ...props };
|
|
12
|
+
for (const k of Object.keys(def.variants ?? {})) {
|
|
13
|
+
if ((props as any)[k]) cls.push((def.variants as any)[k]);
|
|
14
|
+
delete rest[k];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (props.className) cls.push(props.className);
|
|
18
|
+
|
|
19
|
+
<Base {...rest} className={cls} />
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return Styled;
|
|
23
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** @jsxImportSource @xplat/macos/renderer */
|
|
2
|
+
import type { OverlayProps, PopoverProps, SheetProps } from './props'
|
|
3
|
+
import { cx } from './cx'
|
|
4
|
+
|
|
5
|
+
export function Overlay(props: OverlayProps) @{
|
|
6
|
+
@if (props.open) {
|
|
7
|
+
<flexboxlayout flexDirection="column" className={cx('vx-overlay', props.className)} style={props.style}>
|
|
8
|
+
{props.children}
|
|
9
|
+
</flexboxlayout>
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function Popover(props: PopoverProps) @{
|
|
14
|
+
@if (props.open) {
|
|
15
|
+
<flexboxlayout flexDirection="column" className={cx('vx-popover', props.className)} style={props.style}>
|
|
16
|
+
{props.children}
|
|
17
|
+
</flexboxlayout>
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function Sheet(props: SheetProps) @{
|
|
22
|
+
@if (props.open) {
|
|
23
|
+
<flexboxlayout flexDirection="column" className={cx('vx-sheet', props.className)} style={props.style}>
|
|
24
|
+
{props.children}
|
|
25
|
+
</flexboxlayout>
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { registerElement } from '@nativescript-community/octane'
|
|
2
|
+
import type { Attributes } from '@nativescript-community/octane/intrinsics'
|
|
3
|
+
import { SVGView } from './vendor/ui-svg'
|
|
4
|
+
import type { IconGlyph } from './props'
|
|
5
|
+
|
|
6
|
+
declare module '@nativescript-community/octane/intrinsics' {
|
|
7
|
+
interface NativeScriptElements {
|
|
8
|
+
svgview: Omit<Attributes<typeof SVGView>, 'src'> & {
|
|
9
|
+
/** SVGView awaits promise srcs — remote .svg URLs arrive as fetched markup. */
|
|
10
|
+
src?: string | Promise<string>
|
|
11
|
+
stretch?: 'none' | 'fill' | 'aspectFit' | 'aspectFill'
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Vendored ui-svg SVGView (Icon + Image + Meter route SVG sources here
|
|
17
|
+
// unconditionally): SVGView renders via androidsvg on Android, SVGKit on iOS.
|
|
18
|
+
// Its src grammar is File / ImageAsset / res:// / ~/, or an inline markup
|
|
19
|
+
// string.
|
|
20
|
+
registerElement('svgview', SVGView)
|
|
21
|
+
|
|
22
|
+
const SVG_DATA_URI = /^data:image\/svg\+xml[;,]/i
|
|
23
|
+
const SVG_PATH = /\.svg([?#].*)?$/i
|
|
24
|
+
const EMPTY_SVG = '<svg xmlns="http://www.w3.org/2000/svg"/>'
|
|
25
|
+
|
|
26
|
+
/** True when an `src` carries SVG: inline markup, an svg data URI, or an
|
|
27
|
+
* .svg path/URL. Anything else stays on the raster <image> path. */
|
|
28
|
+
export function isSvgSrc(src: string): boolean {
|
|
29
|
+
return src.trimStart().startsWith('<svg') || SVG_DATA_URI.test(src) || SVG_PATH.test(src)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Normalize an svg-shaped src into SVGView's grammar: file/resource paths and
|
|
33
|
+
* markup pass through, data URIs decode to markup, remote URLs fetch to
|
|
34
|
+
* markup (SVGView has no fetch of its own — it awaits promise srcs). */
|
|
35
|
+
export function svgSource(src: string): string | Promise<string> {
|
|
36
|
+
if (SVG_DATA_URI.test(src)) {
|
|
37
|
+
const comma = src.indexOf(',')
|
|
38
|
+
const body = src.slice(comma + 1)
|
|
39
|
+
if (src.slice(0, comma).endsWith(';base64')) {
|
|
40
|
+
const atob = (globalThis as { atob?: (data: string) => string }).atob
|
|
41
|
+
if (!atob) {
|
|
42
|
+
return EMPTY_SVG
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return atob(body)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return decodeURIComponent(body)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (/^https?:\/\//.test(src)) {
|
|
52
|
+
return fetch(src)
|
|
53
|
+
.then((r) => (r.ok ? r.text() : EMPTY_SVG))
|
|
54
|
+
.catch(() => EMPTY_SVG)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return src
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** IconGlyph → a full `<svg>` string for SVGView. `svg` path data gets a
|
|
61
|
+
* `<path>` with the requested fill; `markup` wraps inside a viewBox shell
|
|
62
|
+
* with `color`/`fill` set on the root so `currentColor` and default-fill
|
|
63
|
+
* children pick up the tint. */
|
|
64
|
+
export function glyphSvgMarkup(glyph: IconGlyph, color?: string): string | undefined {
|
|
65
|
+
const viewBox = glyph.viewBox ?? '0 0 24 24'
|
|
66
|
+
if (glyph.markup) {
|
|
67
|
+
const tint = color ? ` color="${color}" fill="${color}"` : ''
|
|
68
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${viewBox}"${tint}>${glyph.markup}</svg>`
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (glyph.svg) {
|
|
72
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${viewBox}"><path d="${glyph.svg}" fill="${color ?? 'currentColor'}"/></svg>`
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return undefined
|
|
76
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Application } from '@nativescript/core';
|
|
2
|
+
|
|
3
|
+
/** Tap-outside-to-blur: iOS keeps a focused UITextField/UITextView as first
|
|
4
|
+
* responder until something else takes it, so a tap on blank chrome never
|
|
5
|
+
* dismisses the keyboard on its own.
|
|
6
|
+
*
|
|
7
|
+
* iOS: a single window-level UITapGestureRecognizer (ref-counted across
|
|
8
|
+
* attach calls) sees every touch in the app window — popups/sheets included —
|
|
9
|
+
* where a recognizer on an intermediate container proved unreliable. On each
|
|
10
|
+
* tap we hit-test and resign first responder unless the hit view is an
|
|
11
|
+
* editable text view (otherwise the field would focus-then-blur in the same
|
|
12
|
+
* tap — recognizers fire on touch-up, after the field's touch-down focus).
|
|
13
|
+
* Keyboard taps live in a separate UIWindow, so they never reach it.
|
|
14
|
+
* `cancelsTouchesInView` stays false so taps still reach buttons.
|
|
15
|
+
*
|
|
16
|
+
* Android: hides the soft keyboard from the currently focused view when a
|
|
17
|
+
* tap lands on the attached container. */
|
|
18
|
+
export function attachTapToBlur(view: any): () => void {
|
|
19
|
+
const marker = '__xplatTapToBlur';
|
|
20
|
+
if (!view || view[marker]) {return () => {};}
|
|
21
|
+
view[marker] = true;
|
|
22
|
+
|
|
23
|
+
if (Application.ios) {
|
|
24
|
+
iosAttach();
|
|
25
|
+
return () => {
|
|
26
|
+
view[marker] = false;
|
|
27
|
+
iosDetach();
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (Application.android) {
|
|
32
|
+
const handler = (_args: any) => {
|
|
33
|
+
const activity = Application.android.foregroundActivity;
|
|
34
|
+
const focused = activity?.currentFocus;
|
|
35
|
+
if (!focused) {return;}
|
|
36
|
+
const imm = activity.getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
|
|
37
|
+
imm?.hideSoftInputFromWindow(focused.getWindowToken(), 0);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
view.on('tap', handler);
|
|
41
|
+
return () => {
|
|
42
|
+
view[marker] = false;
|
|
43
|
+
view.off('tap', handler);
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return () => {
|
|
48
|
+
view[marker] = false;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let iosCount = 0;
|
|
53
|
+
let iosTarget: any = null;
|
|
54
|
+
let iosRecognizer: any = null;
|
|
55
|
+
let iosWindow: any = null;
|
|
56
|
+
|
|
57
|
+
function iosAttach() {
|
|
58
|
+
iosCount++;
|
|
59
|
+
if (iosRecognizer) {return;}
|
|
60
|
+
const appWin = appWindow();
|
|
61
|
+
if (!appWin) {return;}
|
|
62
|
+
iosWindow = appWin;
|
|
63
|
+
|
|
64
|
+
const Owner = class extends NSObject {
|
|
65
|
+
static ObjCExposedMethods = {
|
|
66
|
+
tap: { returns: interop.types.void, params: [UITapGestureRecognizer] },
|
|
67
|
+
};
|
|
68
|
+
tap(recognizer: any) {
|
|
69
|
+
const point = recognizer.locationInView(iosWindow);
|
|
70
|
+
// hitTest can land on a text field's internal subview — walk up.
|
|
71
|
+
let hit = iosWindow.hitTest(point, null);
|
|
72
|
+
while (hit) {
|
|
73
|
+
if (hit instanceof UITextField || hit instanceof UITextView) {return;}
|
|
74
|
+
hit = hit.superview;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
iosWindow.endEditing(true);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
iosTarget = Owner.new();
|
|
82
|
+
iosRecognizer = UITapGestureRecognizer.alloc().initWithTargetAction(iosTarget, 'tap');
|
|
83
|
+
iosRecognizer.cancelsTouchesInView = false;
|
|
84
|
+
appWin.addGestureRecognizer(iosRecognizer);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function iosDetach() {
|
|
88
|
+
iosCount--;
|
|
89
|
+
if (iosCount > 0 || !iosRecognizer) {return;}
|
|
90
|
+
iosWindow?.removeGestureRecognizer(iosRecognizer);
|
|
91
|
+
iosRecognizer = null;
|
|
92
|
+
iosTarget = null;
|
|
93
|
+
iosWindow = null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function appWindow() {
|
|
97
|
+
const scenes = UIApplication.sharedApplication.connectedScenes;
|
|
98
|
+
// connectedScenes is an NSSet — `allObjects` marshals to a JS array.
|
|
99
|
+
for (const scene of (scenes as any).allObjects ?? []) {
|
|
100
|
+
if (scene instanceof UIWindowScene) {
|
|
101
|
+
for (const w of (scene.windows as any)?.allObjects ?? scene.windows ?? []) {
|
|
102
|
+
if (w.isKeyWindow) {return w;}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return UIApplication.sharedApplication.keyWindow;
|
|
108
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** @jsxImportSource @xplat/macos/renderer */
|
|
2
|
+
import type { TextAreaProps, TextInputProps } from './props'
|
|
3
|
+
import { cx } from './cx'
|
|
4
|
+
|
|
5
|
+
export function TextInput(props: TextInputProps) @{
|
|
6
|
+
<textfield id={props.id} value={props.value} placeholder={props.placeholder} className={cx('vx-input', props.className)} style={props.style} onTextChange={props.onChange} accessibilityLabel={props.accessibilityLabel} />
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function TextArea(props: TextAreaProps) @{
|
|
10
|
+
<textview id={props.id} value={props.value} placeholder={props.placeholder} rows={props.autoGrow ? undefined : props.rows ?? 3} className={cx('vx-textarea', props.className)} style={props.style} onTextChange={props.onChange} accessibilityLabel={props.accessibilityLabel} />
|
|
11
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Controlled `text` write for TextInput/TextArea leaves. The driver's
|
|
2
|
+
* generic prop path writes view.text verbatim; on Android the EditText
|
|
3
|
+
* setText resets the cursor to 0 on every controlled write. Park and
|
|
4
|
+
* restore the selection around the write (clamped to the new length so an
|
|
5
|
+
* append-shrink can't throw). iOS keeps the plain write — UITextField's
|
|
6
|
+
* text setter preserves the selected text range already.
|
|
7
|
+
* Returns without writing when the value already matches — the textChange
|
|
8
|
+
* echo of the user's own typing must not bounce back through setText. */
|
|
9
|
+
export function writeText(view: any, value: string | undefined | null): void {
|
|
10
|
+
const next = value ?? ''
|
|
11
|
+
if (!view || view.text === next) {
|
|
12
|
+
return
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const et = view.android
|
|
16
|
+
if (!et) {
|
|
17
|
+
view.text = next
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const start = et.getSelectionStart?.() ?? -1
|
|
22
|
+
const end = et.getSelectionEnd?.() ?? -1
|
|
23
|
+
view.text = next
|
|
24
|
+
if (start >= 0) {
|
|
25
|
+
const len = next.length
|
|
26
|
+
et.setSelection(Math.min(start, len), Math.min(end >= 0 ? end : start, len))
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Web twin — controlled text writes are DOM value assignments; the browser
|
|
2
|
+
* keeps the selection on unchanged prefixes itself. Present for
|
|
3
|
+
* platform-suffix parity; the native leaves are the only callers. */
|
|
4
|
+
export function writeText(view: any, value: string | undefined | null): void {
|
|
5
|
+
if (!view) {
|
|
6
|
+
return
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const next = value ?? ''
|
|
10
|
+
if (view.text !== next) {
|
|
11
|
+
view.text = next
|
|
12
|
+
}
|
|
13
|
+
}
|