@ankhorage/zora 2.8.6 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/dist/components/app-bar/AppBar.d.ts.map +1 -1
- package/dist/components/app-bar/AppBar.js +3 -3
- package/dist/components/app-bar/AppBar.js.map +1 -1
- package/dist/components/avatar/Avatar.d.ts.map +1 -1
- package/dist/components/avatar/Avatar.js +1 -1
- package/dist/components/avatar/Avatar.js.map +1 -1
- package/dist/components/avatar-group/AvatarGroup.d.ts.map +1 -1
- package/dist/components/avatar-group/AvatarGroup.js +1 -1
- package/dist/components/avatar-group/AvatarGroup.js.map +1 -1
- package/dist/components/badge/Badge.d.ts.map +1 -1
- package/dist/components/badge/Badge.js +1 -1
- package/dist/components/badge/Badge.js.map +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.js +2 -2
- package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/button/Button.d.ts.map +1 -1
- package/dist/components/button/Button.js +2 -2
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/button-group/ButtonGroup.d.ts.map +1 -1
- package/dist/components/button-group/ButtonGroup.js +1 -1
- package/dist/components/button-group/ButtonGroup.js.map +1 -1
- package/dist/components/card/Card.d.ts.map +1 -1
- package/dist/components/card/Card.js +3 -2
- package/dist/components/card/Card.js.map +1 -1
- package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/checkbox/Checkbox.js +2 -2
- package/dist/components/checkbox/Checkbox.js.map +1 -1
- package/dist/components/checkbox/CheckboxGroup.d.ts.map +1 -1
- package/dist/components/checkbox/CheckboxGroup.js +7 -4
- package/dist/components/checkbox/CheckboxGroup.js.map +1 -1
- package/dist/components/chip/Chip.d.ts.map +1 -1
- package/dist/components/chip/Chip.js +2 -2
- package/dist/components/chip/Chip.js.map +1 -1
- package/dist/components/chip-group/ChipGroup.d.ts.map +1 -1
- package/dist/components/chip-group/ChipGroup.js +5 -2
- package/dist/components/chip-group/ChipGroup.js.map +1 -1
- package/dist/components/data-table/DataTable.d.ts.map +1 -1
- package/dist/components/data-table/DataTable.js +20 -14
- package/dist/components/data-table/DataTable.js.map +1 -1
- package/dist/components/date-picker/DatePicker.d.ts.map +1 -1
- package/dist/components/date-picker/DatePicker.js +23 -6
- package/dist/components/date-picker/DatePicker.js.map +1 -1
- package/dist/components/drawer/Drawer.d.ts.map +1 -1
- package/dist/components/drawer/Drawer.js +2 -2
- package/dist/components/drawer/Drawer.js.map +1 -1
- package/dist/components/form/Form.d.ts.map +1 -1
- package/dist/components/form/Form.js +5 -3
- package/dist/components/form/Form.js.map +1 -1
- package/dist/components/form/FormActions.d.ts.map +1 -1
- package/dist/components/form/FormActions.js +2 -2
- package/dist/components/form/FormActions.js.map +1 -1
- package/dist/components/form/FormError.d.ts.map +1 -1
- package/dist/components/form/FormError.js +1 -1
- package/dist/components/form/FormError.js.map +1 -1
- package/dist/components/form/FormField.d.ts.map +1 -1
- package/dist/components/form/FormField.js +3 -3
- package/dist/components/form/FormField.js.map +1 -1
- package/dist/components/gradient/Gradient.d.ts.map +1 -1
- package/dist/components/gradient/Gradient.js +1 -1
- package/dist/components/gradient/Gradient.js.map +1 -1
- package/dist/components/heading/Heading.d.ts.map +1 -1
- package/dist/components/heading/Heading.js +2 -2
- package/dist/components/heading/Heading.js.map +1 -1
- package/dist/components/icon/Icon.d.ts.map +1 -1
- package/dist/components/icon/Icon.js +1 -1
- package/dist/components/icon/Icon.js.map +1 -1
- package/dist/components/icon-button/IconButton.d.ts.map +1 -1
- package/dist/components/icon-button/IconButton.js +2 -2
- package/dist/components/icon-button/IconButton.js.map +1 -1
- package/dist/components/image/Image.d.ts.map +1 -1
- package/dist/components/image/Image.js +1 -1
- package/dist/components/image/Image.js.map +1 -1
- package/dist/components/input/Input.d.ts.map +1 -1
- package/dist/components/input/Input.js +2 -2
- package/dist/components/input/Input.js.map +1 -1
- package/dist/components/media-card/MediaCard.d.ts.map +1 -1
- package/dist/components/media-card/MediaCard.js +2 -2
- package/dist/components/media-card/MediaCard.js.map +1 -1
- package/dist/components/metric-card/MetricCard.d.ts.map +1 -1
- package/dist/components/metric-card/MetricCard.js +2 -2
- package/dist/components/metric-card/MetricCard.js.map +1 -1
- package/dist/components/modal/Modal.d.ts.map +1 -1
- package/dist/components/modal/Modal.js +2 -2
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/components/navigation-item/NavigationItem.d.ts.map +1 -1
- package/dist/components/navigation-item/NavigationItem.js +2 -2
- package/dist/components/navigation-item/NavigationItem.js.map +1 -1
- package/dist/components/navigation-list/NavigationList.d.ts.map +1 -1
- package/dist/components/navigation-list/NavigationList.js +3 -3
- package/dist/components/navigation-list/NavigationList.js.map +1 -1
- package/dist/components/pagination/Pagination.d.ts.map +1 -1
- package/dist/components/pagination/Pagination.js +8 -7
- package/dist/components/pagination/Pagination.js.map +1 -1
- package/dist/components/progress/Progress.d.ts.map +1 -1
- package/dist/components/progress/Progress.js +1 -1
- package/dist/components/progress/Progress.js.map +1 -1
- package/dist/components/radio/Radio.js +2 -2
- package/dist/components/radio/Radio.js.map +1 -1
- package/dist/components/radio/RadioGroup.d.ts.map +1 -1
- package/dist/components/radio/RadioGroup.js +7 -4
- package/dist/components/radio/RadioGroup.js.map +1 -1
- package/dist/components/rating/Rating.d.ts.map +1 -1
- package/dist/components/rating/Rating.js +1 -1
- package/dist/components/rating/Rating.js.map +1 -1
- package/dist/components/search-bar/SearchBar.d.ts.map +1 -1
- package/dist/components/search-bar/SearchBar.js +5 -2
- package/dist/components/search-bar/SearchBar.js.map +1 -1
- package/dist/components/select/Select.d.ts.map +1 -1
- package/dist/components/select/Select.js +12 -4
- package/dist/components/select/Select.js.map +1 -1
- package/dist/components/tabs/Tabs.d.ts.map +1 -1
- package/dist/components/tabs/Tabs.js +17 -4
- package/dist/components/tabs/Tabs.js.map +1 -1
- package/dist/components/text/Text.d.ts.map +1 -1
- package/dist/components/text/Text.js +1 -1
- package/dist/components/text/Text.js.map +1 -1
- package/dist/components/textarea/Textarea.d.ts.map +1 -1
- package/dist/components/textarea/Textarea.js +2 -2
- package/dist/components/textarea/Textarea.js.map +1 -1
- package/dist/components/time-picker/TimePicker.d.ts.map +1 -1
- package/dist/components/time-picker/TimePicker.js +16 -4
- package/dist/components/time-picker/TimePicker.js.map +1 -1
- package/dist/components/toolbar/Toolbar.d.ts.map +1 -1
- package/dist/components/toolbar/Toolbar.js +1 -1
- package/dist/components/toolbar/Toolbar.js.map +1 -1
- package/dist/foundation/Box.d.ts.map +1 -1
- package/dist/foundation/Box.js +1 -1
- package/dist/foundation/Box.js.map +1 -1
- package/dist/foundation/Center.d.ts.map +1 -1
- package/dist/foundation/Center.js +1 -1
- package/dist/foundation/Center.js.map +1 -1
- package/dist/foundation/Container.d.ts.map +1 -1
- package/dist/foundation/Container.js +1 -1
- package/dist/foundation/Container.js.map +1 -1
- package/dist/foundation/Divider.d.ts.map +1 -1
- package/dist/foundation/Divider.js +1 -1
- package/dist/foundation/Divider.js.map +1 -1
- package/dist/foundation/Grid.d.ts.map +1 -1
- package/dist/foundation/Grid.js +1 -1
- package/dist/foundation/Grid.js.map +1 -1
- package/dist/foundation/Inline.d.ts.map +1 -1
- package/dist/foundation/Inline.js +1 -1
- package/dist/foundation/Inline.js.map +1 -1
- package/dist/foundation/Show.d.ts.map +1 -1
- package/dist/foundation/Show.js +1 -1
- package/dist/foundation/Show.js.map +1 -1
- package/dist/foundation/Spacer.d.ts.map +1 -1
- package/dist/foundation/Spacer.js +1 -1
- package/dist/foundation/Spacer.js.map +1 -1
- package/dist/foundation/Stack.d.ts.map +1 -1
- package/dist/foundation/Stack.js +1 -1
- package/dist/foundation/Stack.js.map +1 -1
- package/dist/foundation/Surface.d.ts.map +1 -1
- package/dist/foundation/Surface.js +1 -1
- package/dist/foundation/Surface.js.map +1 -1
- package/dist/layout/app-shell/AppShell.d.ts.map +1 -1
- package/dist/layout/app-shell/AppShell.js +1 -1
- package/dist/layout/app-shell/AppShell.js.map +1 -1
- package/dist/layout/screen/Screen.d.ts.map +1 -1
- package/dist/layout/screen/Screen.js +1 -1
- package/dist/layout/screen/Screen.js.map +1 -1
- package/dist/layout/screen-section/ScreenSection.d.ts.map +1 -1
- package/dist/layout/screen-section/ScreenSection.js +1 -1
- package/dist/layout/screen-section/ScreenSection.js.map +1 -1
- package/dist/layout/settings-layout/SettingsLayout.d.ts.map +1 -1
- package/dist/layout/settings-layout/SettingsLayout.js +1 -1
- package/dist/layout/settings-layout/SettingsLayout.js.map +1 -1
- package/dist/layout/sidebar-layout/SidebarLayout.d.ts.map +1 -1
- package/dist/layout/sidebar-layout/SidebarLayout.js +1 -1
- package/dist/layout/sidebar-layout/SidebarLayout.js.map +1 -1
- package/dist/layout/topbar-layout/TopbarLayout.d.ts.map +1 -1
- package/dist/layout/topbar-layout/TopbarLayout.js +1 -1
- package/dist/layout/topbar-layout/TopbarLayout.js.map +1 -1
- package/dist/patterns/auth/ForgotPasswordForm.d.ts.map +1 -1
- package/dist/patterns/auth/ForgotPasswordForm.js +3 -3
- package/dist/patterns/auth/ForgotPasswordForm.js.map +1 -1
- package/dist/patterns/auth/OAuthProviderButton.d.ts.map +1 -1
- package/dist/patterns/auth/OAuthProviderButton.js +2 -2
- package/dist/patterns/auth/OAuthProviderButton.js.map +1 -1
- package/dist/patterns/auth/OAuthProviderList.d.ts.map +1 -1
- package/dist/patterns/auth/OAuthProviderList.js +2 -2
- package/dist/patterns/auth/OAuthProviderList.js.map +1 -1
- package/dist/patterns/auth/OtpForm.d.ts.map +1 -1
- package/dist/patterns/auth/OtpForm.js +3 -3
- package/dist/patterns/auth/OtpForm.js.map +1 -1
- package/dist/patterns/auth/SignInForm.d.ts.map +1 -1
- package/dist/patterns/auth/SignInForm.js +4 -4
- package/dist/patterns/auth/SignInForm.js.map +1 -1
- package/dist/patterns/auth/SignUpForm.d.ts.map +1 -1
- package/dist/patterns/auth/SignUpForm.js +3 -3
- package/dist/patterns/auth/SignUpForm.js.map +1 -1
- package/dist/patterns/chat-list-item/ChatListItem.d.ts.map +1 -1
- package/dist/patterns/chat-list-item/ChatListItem.js +2 -2
- package/dist/patterns/chat-list-item/ChatListItem.js.map +1 -1
- package/dist/patterns/collection-editor/CollectionEditor.d.ts.map +1 -1
- package/dist/patterns/collection-editor/CollectionEditor.js +5 -5
- package/dist/patterns/collection-editor/CollectionEditor.js.map +1 -1
- package/dist/patterns/confirm-dialog/ConfirmDialog.d.ts.map +1 -1
- package/dist/patterns/confirm-dialog/ConfirmDialog.js +4 -4
- package/dist/patterns/confirm-dialog/ConfirmDialog.js.map +1 -1
- package/dist/patterns/disclosure-section/DisclosureSection.d.ts.map +1 -1
- package/dist/patterns/disclosure-section/DisclosureSection.js +4 -3
- package/dist/patterns/disclosure-section/DisclosureSection.js.map +1 -1
- package/dist/patterns/empty-state/EmptyState.d.ts.map +1 -1
- package/dist/patterns/empty-state/EmptyState.js +4 -4
- package/dist/patterns/empty-state/EmptyState.js.map +1 -1
- package/dist/patterns/filter-bar/FilterBar.d.ts.map +1 -1
- package/dist/patterns/filter-bar/FilterBar.js +1 -1
- package/dist/patterns/filter-bar/FilterBar.js.map +1 -1
- package/dist/patterns/hero/Hero.d.ts.map +1 -1
- package/dist/patterns/hero/Hero.js +10 -6
- package/dist/patterns/hero/Hero.js.map +1 -1
- package/dist/patterns/image-preview/ImagePreview.d.ts.map +1 -1
- package/dist/patterns/image-preview/ImagePreview.js +1 -1
- package/dist/patterns/image-preview/ImagePreview.js.map +1 -1
- package/dist/patterns/image-upload-field/ImageUploadField.d.ts.map +1 -1
- package/dist/patterns/image-upload-field/ImageUploadField.js +19 -13
- package/dist/patterns/image-upload-field/ImageUploadField.js.map +1 -1
- package/dist/patterns/inspector-field/InspectorField.d.ts.map +1 -1
- package/dist/patterns/inspector-field/InspectorField.js +1 -1
- package/dist/patterns/inspector-field/InspectorField.js.map +1 -1
- package/dist/patterns/message-bubble/MessageBubble.d.ts.map +1 -1
- package/dist/patterns/message-bubble/MessageBubble.js +2 -2
- package/dist/patterns/message-bubble/MessageBubble.js.map +1 -1
- package/dist/patterns/notice/Notice.d.ts.map +1 -1
- package/dist/patterns/notice/Notice.js +1 -1
- package/dist/patterns/notice/Notice.js.map +1 -1
- package/dist/patterns/post-card/PostCard.d.ts.map +1 -1
- package/dist/patterns/post-card/PostCard.js +2 -2
- package/dist/patterns/post-card/PostCard.js.map +1 -1
- package/dist/patterns/product-card/ProductCard.d.ts.map +1 -1
- package/dist/patterns/product-card/ProductCard.js +4 -4
- package/dist/patterns/product-card/ProductCard.js.map +1 -1
- package/dist/patterns/product-card/types.d.ts +2 -1
- package/dist/patterns/product-card/types.d.ts.map +1 -1
- package/dist/patterns/product-card/types.js.map +1 -1
- package/dist/patterns/responsive-panel/ResponsivePanel.d.ts.map +1 -1
- package/dist/patterns/responsive-panel/ResponsivePanel.js +13 -4
- package/dist/patterns/responsive-panel/ResponsivePanel.js.map +1 -1
- package/dist/patterns/scanner/BarcodeScannerView.d.ts.map +1 -1
- package/dist/patterns/scanner/BarcodeScannerView.js +3 -3
- package/dist/patterns/scanner/BarcodeScannerView.js.map +1 -1
- package/dist/patterns/scanner/CameraPermissionView.d.ts.map +1 -1
- package/dist/patterns/scanner/CameraPermissionView.js +4 -4
- package/dist/patterns/scanner/CameraPermissionView.js.map +1 -1
- package/dist/patterns/scanner/ScanOverlay.d.ts.map +1 -1
- package/dist/patterns/scanner/ScanOverlay.js +1 -1
- package/dist/patterns/scanner/ScanOverlay.js.map +1 -1
- package/dist/patterns/section-header/SectionHeader.d.ts.map +1 -1
- package/dist/patterns/section-header/SectionHeader.js +1 -1
- package/dist/patterns/section-header/SectionHeader.js.map +1 -1
- package/dist/patterns/selection/SelectableItem.d.ts +1 -1
- package/dist/patterns/selection/SelectableItem.d.ts.map +1 -1
- package/dist/patterns/selection/SelectableItem.js +15 -5
- package/dist/patterns/selection/SelectableItem.js.map +1 -1
- package/dist/patterns/selection/SelectionProvider.d.ts +1 -1
- package/dist/patterns/selection/SelectionProvider.d.ts.map +1 -1
- package/dist/patterns/selection/SelectionProvider.js +4 -2
- package/dist/patterns/selection/SelectionProvider.js.map +1 -1
- package/dist/patterns/selection/types.d.ts +3 -0
- package/dist/patterns/selection/types.d.ts.map +1 -1
- package/dist/patterns/selection/types.js.map +1 -1
- package/dist/patterns/settings-row/SettingsRow.d.ts.map +1 -1
- package/dist/patterns/settings-row/SettingsRow.js +3 -3
- package/dist/patterns/settings-row/SettingsRow.js.map +1 -1
- package/dist/patterns/switch-field/SwitchField.d.ts.map +1 -1
- package/dist/patterns/switch-field/SwitchField.js +2 -2
- package/dist/patterns/switch-field/SwitchField.js.map +1 -1
- package/dist/patterns/tile-grid/TileGrid.d.ts.map +1 -1
- package/dist/patterns/tile-grid/TileGrid.js +1 -1
- package/dist/patterns/tile-grid/TileGrid.js.map +1 -1
- package/dist/patterns/timeline/Timeline.d.ts.map +1 -1
- package/dist/patterns/timeline/Timeline.js +1 -1
- package/dist/patterns/timeline/Timeline.js.map +1 -1
- package/dist/patterns/tree-view/TreeItem.d.ts.map +1 -1
- package/dist/patterns/tree-view/TreeItem.js +3 -3
- package/dist/patterns/tree-view/TreeItem.js.map +1 -1
- package/dist/patterns/tree-view/TreeView.d.ts.map +1 -1
- package/dist/patterns/tree-view/TreeView.js +4 -2
- package/dist/patterns/tree-view/TreeView.js.map +1 -1
- package/dist/patterns/zora-drawer-content/ZoraDrawerContent.d.ts.map +1 -1
- package/dist/patterns/zora-drawer-content/ZoraDrawerContent.js +2 -2
- package/dist/patterns/zora-drawer-content/ZoraDrawerContent.js.map +1 -1
- package/dist/patterns/zora-tab-bar/ZoraTabBar.d.ts.map +1 -1
- package/dist/patterns/zora-tab-bar/ZoraTabBar.js +5 -3
- package/dist/patterns/zora-tab-bar/ZoraTabBar.js.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +2 -1
- package/dist/registry.js.map +1 -1
- package/dist/theme/ZoraBaseProps.d.ts +6 -0
- package/dist/theme/ZoraBaseProps.d.ts.map +1 -1
- package/dist/theme/ZoraBaseProps.js.map +1 -1
- package/package.json +2 -2
- package/src/components/app-bar/AppBar.tsx +3 -0
- package/src/components/avatar/Avatar.tsx +1 -0
- package/src/components/avatar-group/AvatarGroup.tsx +1 -0
- package/src/components/badge/Badge.tsx +1 -0
- package/src/components/breadcrumbs/Breadcrumbs.tsx +2 -0
- package/src/components/button/Button.tsx +8 -1
- package/src/components/button-group/ButtonGroup.tsx +1 -0
- package/src/components/card/Card.tsx +3 -1
- package/src/components/checkbox/Checkbox.tsx +7 -2
- package/src/components/checkbox/CheckboxGroup.tsx +8 -0
- package/src/components/chip/Chip.tsx +8 -1
- package/src/components/chip-group/ChipGroup.tsx +5 -0
- package/src/components/data-table/DataTable.tsx +25 -8
- package/src/components/date-picker/DatePicker.tsx +26 -3
- package/src/components/drawer/Drawer.tsx +2 -1
- package/src/components/form/Form.tsx +5 -0
- package/src/components/form/FormActions.tsx +8 -1
- package/src/components/form/FormError.tsx +7 -1
- package/src/components/form/FormField.tsx +3 -0
- package/src/components/gradient/Gradient.tsx +1 -0
- package/src/components/heading/Heading.tsx +3 -2
- package/src/components/icon/Icon.tsx +6 -1
- package/src/components/icon-button/IconButton.tsx +2 -0
- package/src/components/image/Image.tsx +6 -1
- package/src/components/input/Input.tsx +3 -0
- package/src/components/media-card/MediaCard.tsx +2 -0
- package/src/components/metric-card/MetricCard.tsx +2 -0
- package/src/components/modal/Modal.tsx +2 -1
- package/src/components/navigation-item/NavigationItem.tsx +2 -0
- package/src/components/navigation-list/NavigationList.tsx +3 -0
- package/src/components/pagination/Pagination.tsx +8 -1
- package/src/components/progress/Progress.tsx +1 -0
- package/src/components/radio/Radio.tsx +2 -2
- package/src/components/radio/RadioGroup.tsx +8 -0
- package/src/components/rating/Rating.tsx +1 -0
- package/src/components/search-bar/SearchBar.tsx +7 -1
- package/src/components/select/Select.tsx +30 -21
- package/src/components/tabs/Tabs.tsx +17 -3
- package/src/components/text/Text.tsx +1 -0
- package/src/components/textarea/Textarea.tsx +2 -0
- package/src/components/time-picker/TimePicker.tsx +19 -2
- package/src/components/toolbar/Toolbar.tsx +1 -0
- package/src/foundation/Box.tsx +6 -1
- package/src/foundation/Center.tsx +6 -1
- package/src/foundation/Container.tsx +6 -1
- package/src/foundation/Divider.tsx +6 -1
- package/src/foundation/Grid.tsx +6 -1
- package/src/foundation/Inline.tsx +6 -1
- package/src/foundation/Show.tsx +6 -1
- package/src/foundation/Spacer.tsx +6 -1
- package/src/foundation/Stack.tsx +6 -1
- package/src/foundation/Surface.tsx +6 -1
- package/src/interactionPolicy.test.ts +226 -0
- package/src/layout/app-shell/AppShell.tsx +1 -0
- package/src/layout/screen/Screen.tsx +1 -0
- package/src/layout/screen-section/ScreenSection.tsx +1 -0
- package/src/layout/settings-layout/SettingsLayout.tsx +1 -0
- package/src/layout/sidebar-layout/SidebarLayout.tsx +1 -0
- package/src/layout/topbar-layout/TopbarLayout.tsx +1 -0
- package/src/patterns/auth/ForgotPasswordForm.tsx +3 -0
- package/src/patterns/auth/OAuthProviderButton.tsx +2 -0
- package/src/patterns/auth/OAuthProviderList.tsx +2 -0
- package/src/patterns/auth/OtpForm.tsx +3 -0
- package/src/patterns/auth/SignInForm.tsx +4 -0
- package/src/patterns/auth/SignUpForm.tsx +3 -0
- package/src/patterns/chat-list-item/ChatListItem.tsx +2 -0
- package/src/patterns/collection-editor/CollectionEditor.tsx +12 -1
- package/src/patterns/confirm-dialog/ConfirmDialog.tsx +15 -2
- package/src/patterns/disclosure-section/DisclosureSection.tsx +4 -1
- package/src/patterns/empty-state/EmptyState.tsx +4 -0
- package/src/patterns/filter-bar/FilterBar.tsx +1 -0
- package/src/patterns/hero/Hero.tsx +14 -4
- package/src/patterns/image-preview/ImagePreview.tsx +1 -0
- package/src/patterns/image-upload-field/ImageUploadField.tsx +30 -9
- package/src/patterns/inspector-field/InspectorField.tsx +1 -0
- package/src/patterns/message-bubble/MessageBubble.tsx +2 -0
- package/src/patterns/notice/Notice.tsx +1 -0
- package/src/patterns/post-card/PostCard.tsx +2 -0
- package/src/patterns/product-card/ProductCard.tsx +19 -3
- package/src/patterns/product-card/types.ts +3 -1
- package/src/patterns/responsive-panel/ResponsivePanel.tsx +15 -2
- package/src/patterns/scanner/BarcodeScannerView.tsx +3 -0
- package/src/patterns/scanner/CameraPermissionView.tsx +4 -0
- package/src/patterns/scanner/ScanOverlay.tsx +1 -0
- package/src/patterns/section-header/SectionHeader.tsx +1 -0
- package/src/patterns/selection/SelectableItem.tsx +16 -4
- package/src/patterns/selection/SelectionProvider.tsx +3 -1
- package/src/patterns/selection/types.ts +3 -0
- package/src/patterns/settings-row/SettingsRow.tsx +4 -2
- package/src/patterns/switch-field/SwitchField.tsx +9 -1
- package/src/patterns/tile-grid/TileGrid.tsx +1 -0
- package/src/patterns/timeline/Timeline.tsx +1 -0
- package/src/patterns/tree-view/TreeItem.tsx +3 -0
- package/src/patterns/tree-view/TreeView.tsx +3 -0
- package/src/patterns/zora-drawer-content/ZoraDrawerContent.tsx +2 -0
- package/src/patterns/zora-tab-bar/ZoraTabBar.tsx +11 -2
- package/src/registry.test.ts +47 -14
- package/src/registry.ts +29 -3
- package/src/theme/ZoraBaseProps.ts +8 -0
|
@@ -52,16 +52,18 @@ function DisclosureSectionInner({
|
|
|
52
52
|
children,
|
|
53
53
|
disabled,
|
|
54
54
|
testID,
|
|
55
|
+
interactionPolicy,
|
|
55
56
|
}: DisclosureSectionProps) {
|
|
56
57
|
const [internalOpen, setInternalOpen] = React.useState(defaultOpen);
|
|
57
58
|
|
|
58
59
|
const isControlled = controlledOpen !== undefined;
|
|
59
60
|
const isOpen = isControlled ? controlledOpen : internalOpen;
|
|
61
|
+
const passive = interactionPolicy === 'passive';
|
|
60
62
|
const titleLabel = typeof title === 'string' || typeof title === 'number' ? `: ${title}` : '';
|
|
61
63
|
const toggleLabel = `${isOpen ? 'Collapse' : 'Expand'} section${titleLabel}`;
|
|
62
64
|
|
|
63
65
|
const toggleOpen = () => {
|
|
64
|
-
if (disabled) return;
|
|
66
|
+
if (disabled || passive) return;
|
|
65
67
|
|
|
66
68
|
if (isControlled) {
|
|
67
69
|
onOpenChange?.(!controlledOpen);
|
|
@@ -108,6 +110,7 @@ function DisclosureSectionInner({
|
|
|
108
110
|
color="neutral"
|
|
109
111
|
size="s"
|
|
110
112
|
disabled={disabled}
|
|
113
|
+
interactionPolicy={interactionPolicy}
|
|
111
114
|
onPress={toggleOpen}
|
|
112
115
|
/>
|
|
113
116
|
</Box>
|
|
@@ -9,6 +9,7 @@ import type { EmptyStateProps } from './types';
|
|
|
9
9
|
function EmptyStateInner({
|
|
10
10
|
themeId: _themeId,
|
|
11
11
|
mode: _mode,
|
|
12
|
+
interactionPolicy,
|
|
12
13
|
title,
|
|
13
14
|
description,
|
|
14
15
|
eyebrow,
|
|
@@ -22,6 +23,7 @@ function EmptyStateInner({
|
|
|
22
23
|
compact
|
|
23
24
|
description={description}
|
|
24
25
|
eyebrow={eyebrow}
|
|
26
|
+
interactionPolicy={interactionPolicy}
|
|
25
27
|
testID={testID}
|
|
26
28
|
title={title}
|
|
27
29
|
tone="subtle"
|
|
@@ -31,6 +33,7 @@ function EmptyStateInner({
|
|
|
31
33
|
<Stack direction={{ base: 'column', md: 'row' }} gap="s">
|
|
32
34
|
{primaryAction ? (
|
|
33
35
|
<Button
|
|
36
|
+
interactionPolicy={interactionPolicy}
|
|
34
37
|
variant={primaryAction.variant}
|
|
35
38
|
onPress={primaryAction.onPress}
|
|
36
39
|
color={primaryAction.color}
|
|
@@ -40,6 +43,7 @@ function EmptyStateInner({
|
|
|
40
43
|
) : null}
|
|
41
44
|
{secondaryAction ? (
|
|
42
45
|
<Button
|
|
46
|
+
interactionPolicy={interactionPolicy}
|
|
43
47
|
variant={secondaryAction.variant ?? 'soft'}
|
|
44
48
|
onPress={secondaryAction.onPress}
|
|
45
49
|
color={secondaryAction.color ?? 'neutral'}
|
|
@@ -11,6 +11,7 @@ import type { HeroAction, HeroAlign, HeroProps } from './types';
|
|
|
11
11
|
function HeroInner({
|
|
12
12
|
themeId: _themeId,
|
|
13
13
|
mode: _mode,
|
|
14
|
+
interactionPolicy,
|
|
14
15
|
title,
|
|
15
16
|
description,
|
|
16
17
|
eyebrow,
|
|
@@ -64,8 +65,12 @@ function HeroInner({
|
|
|
64
65
|
gap="s"
|
|
65
66
|
justify={align === 'center' ? 'center' : 'flex-start'}
|
|
66
67
|
>
|
|
67
|
-
{primaryAction !== undefined
|
|
68
|
-
|
|
68
|
+
{primaryAction !== undefined
|
|
69
|
+
? renderAction(primaryAction, 'primary', interactionPolicy)
|
|
70
|
+
: null}
|
|
71
|
+
{secondaryAction !== undefined
|
|
72
|
+
? renderAction(secondaryAction, 'secondary', interactionPolicy)
|
|
73
|
+
: null}
|
|
69
74
|
</Stack>
|
|
70
75
|
) : null}
|
|
71
76
|
|
|
@@ -90,16 +95,21 @@ function HeroInner({
|
|
|
90
95
|
);
|
|
91
96
|
|
|
92
97
|
return (
|
|
93
|
-
<Card compact={compact} testID={testID} tone={tone}>
|
|
98
|
+
<Card compact={compact} interactionPolicy={interactionPolicy} testID={testID} tone={tone}>
|
|
94
99
|
{body}
|
|
95
100
|
</Card>
|
|
96
101
|
);
|
|
97
102
|
}
|
|
98
103
|
|
|
99
|
-
function renderAction(
|
|
104
|
+
function renderAction(
|
|
105
|
+
action: HeroAction,
|
|
106
|
+
role: 'primary' | 'secondary',
|
|
107
|
+
interactionPolicy: HeroProps['interactionPolicy'],
|
|
108
|
+
) {
|
|
100
109
|
return (
|
|
101
110
|
<Button
|
|
102
111
|
disabled={action.disabled}
|
|
112
|
+
interactionPolicy={interactionPolicy}
|
|
103
113
|
variant={action.variant ?? (role === 'primary' ? 'solid' : 'soft')}
|
|
104
114
|
onPress={action.onPress}
|
|
105
115
|
color={action.color ?? (role === 'primary' ? 'primary' : 'neutral')}
|
|
@@ -34,6 +34,7 @@ function ImagePreviewInner({
|
|
|
34
34
|
fit = 'cover',
|
|
35
35
|
emptyTitle = 'No image',
|
|
36
36
|
emptyDescription = 'Select an image to preview it here.',
|
|
37
|
+
interactionPolicy: _interactionPolicy,
|
|
37
38
|
}: ImagePreviewProps) {
|
|
38
39
|
const { theme } = useZoraTheme();
|
|
39
40
|
const renderableUrl = resolveRenderableUrl(asset);
|
|
@@ -51,7 +51,9 @@ function ImageUploadFieldInner({
|
|
|
51
51
|
aspectRatio = 1,
|
|
52
52
|
previewTitle = 'Image preview',
|
|
53
53
|
previewDescription,
|
|
54
|
+
interactionPolicy,
|
|
54
55
|
}: ImageUploadFieldProps) {
|
|
56
|
+
const passive = interactionPolicy === 'passive';
|
|
55
57
|
const [internalError, setInternalError] = React.useState<string | undefined>(undefined);
|
|
56
58
|
const [uploading, setUploading] = React.useState(false);
|
|
57
59
|
const [removing, setRemoving] = React.useState(false);
|
|
@@ -88,7 +90,7 @@ function ImageUploadFieldInner({
|
|
|
88
90
|
}, []);
|
|
89
91
|
|
|
90
92
|
const handleReplace = React.useCallback(async () => {
|
|
91
|
-
if (actionsDisabled || uploading || removing) return;
|
|
93
|
+
if (passive || actionsDisabled || uploading || removing) return;
|
|
92
94
|
|
|
93
95
|
setInternalError(undefined);
|
|
94
96
|
let picked;
|
|
@@ -143,6 +145,7 @@ function ImageUploadFieldInner({
|
|
|
143
145
|
onChange,
|
|
144
146
|
onPick,
|
|
145
147
|
onUpload,
|
|
148
|
+
passive,
|
|
146
149
|
removing,
|
|
147
150
|
setProgressSafe,
|
|
148
151
|
uploading,
|
|
@@ -150,7 +153,7 @@ function ImageUploadFieldInner({
|
|
|
150
153
|
]);
|
|
151
154
|
|
|
152
155
|
const handleRemove = React.useCallback(async () => {
|
|
153
|
-
if (actionsDisabled || uploading || removing) return;
|
|
156
|
+
if (passive || actionsDisabled || uploading || removing) return;
|
|
154
157
|
if (!value) {
|
|
155
158
|
onChange(null);
|
|
156
159
|
return;
|
|
@@ -174,14 +177,17 @@ function ImageUploadFieldInner({
|
|
|
174
177
|
setInternalError(formatUnknownError(error));
|
|
175
178
|
setRemoving(false);
|
|
176
179
|
}
|
|
177
|
-
}, [actionsDisabled, onChange, onRemove, removing, uploading, value]);
|
|
180
|
+
}, [actionsDisabled, onChange, onRemove, passive, removing, uploading, value]);
|
|
178
181
|
|
|
179
182
|
const handlePreview = React.useCallback(() => {
|
|
180
|
-
if (!isRenderable) return;
|
|
183
|
+
if (passive || !isRenderable) return;
|
|
181
184
|
setPreviewOpen(true);
|
|
182
|
-
}, [isRenderable]);
|
|
185
|
+
}, [isRenderable, passive]);
|
|
183
186
|
|
|
184
|
-
const closePreview = React.useCallback(() =>
|
|
187
|
+
const closePreview = React.useCallback(() => {
|
|
188
|
+
if (passive) return;
|
|
189
|
+
setPreviewOpen(false);
|
|
190
|
+
}, [passive]);
|
|
185
191
|
|
|
186
192
|
return (
|
|
187
193
|
<>
|
|
@@ -190,6 +196,7 @@ function ImageUploadFieldInner({
|
|
|
190
196
|
disabled={disabled}
|
|
191
197
|
errorText={effectiveError}
|
|
192
198
|
helperText={helperText}
|
|
199
|
+
interactionPolicy={interactionPolicy}
|
|
193
200
|
invalid={invalid}
|
|
194
201
|
label={label}
|
|
195
202
|
readOnly={readOnly}
|
|
@@ -230,6 +237,7 @@ function ImageUploadFieldInner({
|
|
|
230
237
|
<Stack direction={{ base: 'column', md: 'row' }} gap="s">
|
|
231
238
|
<Button
|
|
232
239
|
disabled={actionsDisabled || uploading || removing}
|
|
240
|
+
interactionPolicy={interactionPolicy}
|
|
233
241
|
onPress={() => {
|
|
234
242
|
void handleReplace();
|
|
235
243
|
}}
|
|
@@ -243,6 +251,7 @@ function ImageUploadFieldInner({
|
|
|
243
251
|
variant="outline"
|
|
244
252
|
loading={removing}
|
|
245
253
|
color="danger"
|
|
254
|
+
interactionPolicy={interactionPolicy}
|
|
246
255
|
onPress={() => {
|
|
247
256
|
void handleRemove();
|
|
248
257
|
}}
|
|
@@ -252,7 +261,13 @@ function ImageUploadFieldInner({
|
|
|
252
261
|
) : null}
|
|
253
262
|
|
|
254
263
|
{isRenderable ? (
|
|
255
|
-
<Button
|
|
264
|
+
<Button
|
|
265
|
+
disabled={false}
|
|
266
|
+
interactionPolicy={interactionPolicy}
|
|
267
|
+
variant="soft"
|
|
268
|
+
color="neutral"
|
|
269
|
+
onPress={handlePreview}
|
|
270
|
+
>
|
|
256
271
|
Preview
|
|
257
272
|
</Button>
|
|
258
273
|
) : null}
|
|
@@ -272,14 +287,20 @@ function ImageUploadFieldInner({
|
|
|
272
287
|
<Modal
|
|
273
288
|
closeOnBackdrop
|
|
274
289
|
description={previewDescription}
|
|
290
|
+
interactionPolicy={interactionPolicy}
|
|
291
|
+
onDismiss={closePreview}
|
|
275
292
|
title={previewTitle}
|
|
276
293
|
visible={previewOpen}
|
|
277
|
-
onDismiss={closePreview}
|
|
278
294
|
>
|
|
279
295
|
<Stack gap="m">
|
|
280
296
|
<ImagePreview asset={value} aspectRatio={aspectRatio} />
|
|
281
297
|
<Stack direction="row" justify="flex-end">
|
|
282
|
-
<Button
|
|
298
|
+
<Button
|
|
299
|
+
interactionPolicy={interactionPolicy}
|
|
300
|
+
variant="soft"
|
|
301
|
+
color="neutral"
|
|
302
|
+
onPress={closePreview}
|
|
303
|
+
>
|
|
283
304
|
Close
|
|
284
305
|
</Button>
|
|
285
306
|
</Stack>
|
|
@@ -131,6 +131,7 @@ function MessageAvatar({
|
|
|
131
131
|
function MessageBubbleInner({
|
|
132
132
|
themeId: _themeId,
|
|
133
133
|
mode: _mode,
|
|
134
|
+
interactionPolicy,
|
|
134
135
|
testID,
|
|
135
136
|
direction = 'incoming',
|
|
136
137
|
text,
|
|
@@ -224,6 +225,7 @@ function MessageBubbleInner({
|
|
|
224
225
|
accessibilityRole="button"
|
|
225
226
|
accessibilityState={{ disabled, selected }}
|
|
226
227
|
disabled={disabled}
|
|
228
|
+
interactionPolicy={interactionPolicy}
|
|
227
229
|
onPress={onPress}
|
|
228
230
|
radius={isSystem ? 'm' : 'l'}
|
|
229
231
|
testID={testID}
|
|
@@ -174,6 +174,7 @@ function PostCardComments({ comments }: { comments: readonly PostCommentPreview[
|
|
|
174
174
|
function PostCardInner({
|
|
175
175
|
themeId: _themeId,
|
|
176
176
|
mode: _mode,
|
|
177
|
+
interactionPolicy,
|
|
177
178
|
testID,
|
|
178
179
|
author,
|
|
179
180
|
text,
|
|
@@ -196,6 +197,7 @@ function PostCardInner({
|
|
|
196
197
|
return (
|
|
197
198
|
<Card
|
|
198
199
|
compact={compact}
|
|
200
|
+
interactionPolicy={interactionPolicy}
|
|
199
201
|
onPress={isInteractive ? onPress : undefined}
|
|
200
202
|
testID={testID}
|
|
201
203
|
tone={tone}
|
|
@@ -28,6 +28,7 @@ function ProductCardInner({
|
|
|
28
28
|
onPress,
|
|
29
29
|
onPrimaryAction,
|
|
30
30
|
onSecondaryAction,
|
|
31
|
+
interactionPolicy,
|
|
31
32
|
...rest
|
|
32
33
|
}: ProductCardProps & ZoraBaseProps) {
|
|
33
34
|
const hasHeaderInfo = !!title || !!brand || !!subtitle;
|
|
@@ -38,7 +39,11 @@ function ProductCardInner({
|
|
|
38
39
|
const eyebrow = brand ?? _vendor;
|
|
39
40
|
|
|
40
41
|
return (
|
|
41
|
-
<Card
|
|
42
|
+
<Card
|
|
43
|
+
onPress={isInteractive ? onPress : undefined}
|
|
44
|
+
interactionPolicy={interactionPolicy}
|
|
45
|
+
{...rest}
|
|
46
|
+
>
|
|
42
47
|
<Stack gap="m">
|
|
43
48
|
{imageUrl ? (
|
|
44
49
|
<Image
|
|
@@ -105,12 +110,23 @@ function ProductCardInner({
|
|
|
105
110
|
<Divider />
|
|
106
111
|
<Inline gap="s">
|
|
107
112
|
{secondaryActionLabel ? (
|
|
108
|
-
<Button
|
|
113
|
+
<Button
|
|
114
|
+
interactionPolicy={interactionPolicy}
|
|
115
|
+
variant="ghost"
|
|
116
|
+
onPress={onSecondaryAction}
|
|
117
|
+
size="s"
|
|
118
|
+
>
|
|
109
119
|
{secondaryActionLabel}
|
|
110
120
|
</Button>
|
|
111
121
|
) : null}
|
|
112
122
|
{primaryActionLabel ? (
|
|
113
|
-
<Button
|
|
123
|
+
<Button
|
|
124
|
+
interactionPolicy={interactionPolicy}
|
|
125
|
+
variant="solid"
|
|
126
|
+
onPress={onPrimaryAction}
|
|
127
|
+
size="s"
|
|
128
|
+
flex={1}
|
|
129
|
+
>
|
|
114
130
|
{primaryActionLabel}
|
|
115
131
|
</Button>
|
|
116
132
|
) : null}
|
|
@@ -72,9 +72,11 @@ function ResponsivePanelInner({
|
|
|
72
72
|
size,
|
|
73
73
|
scroll = 'none',
|
|
74
74
|
testID,
|
|
75
|
+
interactionPolicy,
|
|
75
76
|
}: ResponsivePanelProps) {
|
|
76
77
|
if (!open) return null;
|
|
77
78
|
|
|
79
|
+
const passive = interactionPolicy === 'passive';
|
|
78
80
|
const body = renderPanelBody(children, scroll);
|
|
79
81
|
|
|
80
82
|
// For now, we assume desktopMode determines the rendering.
|
|
@@ -87,7 +89,12 @@ function ResponsivePanelInner({
|
|
|
87
89
|
<Modal
|
|
88
90
|
description={description}
|
|
89
91
|
footer={footer}
|
|
90
|
-
|
|
92
|
+
interactionPolicy={interactionPolicy}
|
|
93
|
+
onDismiss={() => {
|
|
94
|
+
if (passive) return;
|
|
95
|
+
|
|
96
|
+
onOpenChange(false);
|
|
97
|
+
}}
|
|
91
98
|
testID={testID}
|
|
92
99
|
title={title}
|
|
93
100
|
visible={open}
|
|
@@ -102,7 +109,12 @@ function ResponsivePanelInner({
|
|
|
102
109
|
<Drawer
|
|
103
110
|
description={description}
|
|
104
111
|
footer={footer}
|
|
105
|
-
|
|
112
|
+
interactionPolicy={interactionPolicy}
|
|
113
|
+
onDismiss={() => {
|
|
114
|
+
if (passive) return;
|
|
115
|
+
|
|
116
|
+
onOpenChange(false);
|
|
117
|
+
}}
|
|
106
118
|
position={side}
|
|
107
119
|
testID={testID}
|
|
108
120
|
title={title}
|
|
@@ -119,6 +131,7 @@ function ResponsivePanelInner({
|
|
|
119
131
|
compact={compact}
|
|
120
132
|
description={description}
|
|
121
133
|
footer={footer}
|
|
134
|
+
interactionPolicy={interactionPolicy}
|
|
122
135
|
testID={testID}
|
|
123
136
|
title={title}
|
|
124
137
|
>
|
|
@@ -12,6 +12,7 @@ import type { BarcodeScannerViewProps } from './types';
|
|
|
12
12
|
|
|
13
13
|
function BarcodeScannerViewInner({
|
|
14
14
|
themeId: _themeId,
|
|
15
|
+
interactionPolicy,
|
|
15
16
|
mode: _mode,
|
|
16
17
|
permissionStatus,
|
|
17
18
|
camera,
|
|
@@ -46,6 +47,7 @@ function BarcodeScannerViewInner({
|
|
|
46
47
|
requestLabel={requestPermissionLabel}
|
|
47
48
|
status={permissionStatus}
|
|
48
49
|
testID={testID}
|
|
50
|
+
interactionPolicy={interactionPolicy}
|
|
49
51
|
/>
|
|
50
52
|
);
|
|
51
53
|
}
|
|
@@ -55,6 +57,7 @@ function BarcodeScannerViewInner({
|
|
|
55
57
|
compact
|
|
56
58
|
description={description}
|
|
57
59
|
eyebrow="Scanner"
|
|
60
|
+
interactionPolicy={interactionPolicy}
|
|
58
61
|
testID={testID}
|
|
59
62
|
title={title}
|
|
60
63
|
tone="subtle"
|
|
@@ -32,6 +32,7 @@ function resolvePermissionCopy(status: CameraPermissionViewProps['status']) {
|
|
|
32
32
|
|
|
33
33
|
function CameraPermissionViewInner({
|
|
34
34
|
themeId: _themeId,
|
|
35
|
+
interactionPolicy,
|
|
35
36
|
mode: _mode,
|
|
36
37
|
status,
|
|
37
38
|
title,
|
|
@@ -63,6 +64,7 @@ function CameraPermissionViewInner({
|
|
|
63
64
|
compact
|
|
64
65
|
description={description ?? copy.description}
|
|
65
66
|
eyebrow="Scanner permission"
|
|
67
|
+
interactionPolicy={interactionPolicy}
|
|
66
68
|
testID={testID}
|
|
67
69
|
title={title ?? copy.title}
|
|
68
70
|
tone="subtle"
|
|
@@ -78,6 +80,7 @@ function CameraPermissionViewInner({
|
|
|
78
80
|
disabled={status === 'requesting'}
|
|
79
81
|
onPress={handleRequestPermission}
|
|
80
82
|
{...requestButtonProps}
|
|
83
|
+
interactionPolicy={interactionPolicy}
|
|
81
84
|
>
|
|
82
85
|
{primaryLabel}
|
|
83
86
|
</Button>
|
|
@@ -88,6 +91,7 @@ function CameraPermissionViewInner({
|
|
|
88
91
|
onPress={handleManualEntry}
|
|
89
92
|
variant="soft"
|
|
90
93
|
{...manualEntryButtonProps}
|
|
94
|
+
interactionPolicy={interactionPolicy}
|
|
91
95
|
>
|
|
92
96
|
{manualEntryLabel}
|
|
93
97
|
</Button>
|
|
@@ -10,6 +10,7 @@ import type { ScanOverlayProps } from './types';
|
|
|
10
10
|
|
|
11
11
|
function ScanOverlayInner({
|
|
12
12
|
themeId: _themeId,
|
|
13
|
+
interactionPolicy: _interactionPolicy,
|
|
13
14
|
mode: _mode,
|
|
14
15
|
title = 'Align the barcode',
|
|
15
16
|
description = 'Hold the barcode inside the frame. Scanning starts automatically.',
|
|
@@ -20,7 +20,13 @@ function isRenderProp(
|
|
|
20
20
|
*
|
|
21
21
|
|
|
22
22
|
*/
|
|
23
|
-
export function SelectableItem({
|
|
23
|
+
export function SelectableItem({
|
|
24
|
+
id,
|
|
25
|
+
trigger,
|
|
26
|
+
disabled = false,
|
|
27
|
+
interactionPolicy,
|
|
28
|
+
children,
|
|
29
|
+
}: SelectableItemProps) {
|
|
24
30
|
const selection = useSelection();
|
|
25
31
|
const resolvedTrigger = resolveTrigger(trigger);
|
|
26
32
|
const resolvedDisabled = selection.disabled || disabled;
|
|
@@ -28,18 +34,21 @@ export function SelectableItem({ id, trigger, disabled = false, children }: Sele
|
|
|
28
34
|
|
|
29
35
|
const select = React.useCallback(() => {
|
|
30
36
|
if (resolvedDisabled) return;
|
|
37
|
+
if (interactionPolicy === 'passive') return;
|
|
31
38
|
selection.select(id);
|
|
32
|
-
}, [id, resolvedDisabled, selection]);
|
|
39
|
+
}, [id, resolvedDisabled, interactionPolicy, selection]);
|
|
33
40
|
|
|
34
41
|
const toggle = React.useCallback(() => {
|
|
35
42
|
if (resolvedDisabled) return;
|
|
43
|
+
if (interactionPolicy === 'passive') return;
|
|
36
44
|
selection.toggle(id);
|
|
37
|
-
}, [id, resolvedDisabled, selection]);
|
|
45
|
+
}, [id, resolvedDisabled, interactionPolicy, selection]);
|
|
38
46
|
|
|
39
47
|
const clear = React.useCallback(() => {
|
|
40
48
|
if (selection.disabled) return;
|
|
49
|
+
if (interactionPolicy === 'passive') return;
|
|
41
50
|
selection.clear();
|
|
42
|
-
}, [selection]);
|
|
51
|
+
}, [interactionPolicy, selection]);
|
|
43
52
|
|
|
44
53
|
const itemState = React.useMemo<SelectableItemState>(() => {
|
|
45
54
|
return {
|
|
@@ -65,6 +74,7 @@ export function SelectableItem({ id, trigger, disabled = false, children }: Sele
|
|
|
65
74
|
const handlePress = (event: GestureResponderEvent) => {
|
|
66
75
|
event.stopPropagation();
|
|
67
76
|
if (resolvedDisabled) return;
|
|
77
|
+
if (interactionPolicy === 'passive') return;
|
|
68
78
|
if (selection.mode === 'single') {
|
|
69
79
|
selection.select(id);
|
|
70
80
|
return;
|
|
@@ -76,6 +86,7 @@ export function SelectableItem({ id, trigger, disabled = false, children }: Sele
|
|
|
76
86
|
const handleLongPress = (event: GestureResponderEvent) => {
|
|
77
87
|
event.stopPropagation();
|
|
78
88
|
if (resolvedDisabled) return;
|
|
89
|
+
if (interactionPolicy === 'passive') return;
|
|
79
90
|
if (selection.mode === 'single') {
|
|
80
91
|
selection.select(id);
|
|
81
92
|
return;
|
|
@@ -86,6 +97,7 @@ export function SelectableItem({ id, trigger, disabled = false, children }: Sele
|
|
|
86
97
|
|
|
87
98
|
return (
|
|
88
99
|
<ButtonBase
|
|
100
|
+
interactionPolicy={interactionPolicy}
|
|
89
101
|
accessibilityRole="button"
|
|
90
102
|
accessibilityState={{ disabled: resolvedDisabled, selected }}
|
|
91
103
|
disabled={resolvedDisabled}
|
|
@@ -44,6 +44,7 @@ export function SelectionProvider({
|
|
|
44
44
|
mode,
|
|
45
45
|
disabled,
|
|
46
46
|
onSelectionChange,
|
|
47
|
+
interactionPolicy,
|
|
47
48
|
}: SelectionProviderProps) {
|
|
48
49
|
const resolvedMode = resolveMode(mode);
|
|
49
50
|
const resolvedDisabled = resolveDisabled(disabled);
|
|
@@ -61,6 +62,7 @@ export function SelectionProvider({
|
|
|
61
62
|
const commitSelectionChange = React.useCallback(
|
|
62
63
|
(nextNormalizedIds: readonly string[]) => {
|
|
63
64
|
if (resolvedDisabled) return;
|
|
65
|
+
if (interactionPolicy === 'passive') return;
|
|
64
66
|
if (areIdsEqual(nextNormalizedIds, currentNormalizedIds)) return;
|
|
65
67
|
|
|
66
68
|
onSelectionChange?.(nextNormalizedIds);
|
|
@@ -69,7 +71,7 @@ export function SelectionProvider({
|
|
|
69
71
|
setUncontrolledIds(nextNormalizedIds);
|
|
70
72
|
}
|
|
71
73
|
},
|
|
72
|
-
[currentNormalizedIds, isControlled, onSelectionChange, resolvedDisabled],
|
|
74
|
+
[currentNormalizedIds, interactionPolicy, isControlled, onSelectionChange, resolvedDisabled],
|
|
73
75
|
);
|
|
74
76
|
|
|
75
77
|
const clear = React.useCallback(() => {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { InteractionPolicy } from '@ankhorage/surface';
|
|
1
2
|
import type React from 'react';
|
|
2
3
|
|
|
3
4
|
export type SelectionMode = 'single' | 'multi';
|
|
@@ -11,6 +12,7 @@ export interface SelectionProviderProps {
|
|
|
11
12
|
mode?: SelectionMode;
|
|
12
13
|
disabled?: boolean;
|
|
13
14
|
onSelectionChange?: (ids: readonly string[]) => void;
|
|
15
|
+
interactionPolicy?: InteractionPolicy;
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
export interface UseSelectionResult {
|
|
@@ -39,5 +41,6 @@ export interface SelectableItemProps {
|
|
|
39
41
|
id: string;
|
|
40
42
|
trigger?: SelectionTrigger;
|
|
41
43
|
disabled?: boolean;
|
|
44
|
+
interactionPolicy?: InteractionPolicy;
|
|
42
45
|
children: React.ReactNode | ((state: SelectableItemState) => React.ReactNode);
|
|
43
46
|
}
|
|
@@ -16,17 +16,19 @@ function SettingsRowInner({
|
|
|
16
16
|
onPress,
|
|
17
17
|
disabled = false,
|
|
18
18
|
testID,
|
|
19
|
+
interactionPolicy,
|
|
19
20
|
}: SettingsRowProps) {
|
|
20
|
-
// Prevent nested interactive elements:
|
|
21
|
-
// If a control is present (likely contains buttons), the row itself must not be clickable
|
|
22
21
|
const isInteractive = Boolean(onPress) && !control;
|
|
23
22
|
|
|
23
|
+
// Prevent nested interactive elements:
|
|
24
|
+
// If a control is present (likely contains buttons), the row itself must not be clickable
|
|
24
25
|
return (
|
|
25
26
|
<Card
|
|
26
27
|
compact
|
|
27
28
|
actions={control}
|
|
28
29
|
description={description}
|
|
29
30
|
disabled={disabled}
|
|
31
|
+
interactionPolicy={interactionPolicy}
|
|
30
32
|
onPress={isInteractive ? onPress : undefined}
|
|
31
33
|
testID={testID}
|
|
32
34
|
title={title}
|
|
@@ -14,6 +14,7 @@ function SwitchFieldInner({
|
|
|
14
14
|
onValueChange,
|
|
15
15
|
disabled,
|
|
16
16
|
testID,
|
|
17
|
+
interactionPolicy,
|
|
17
18
|
}: SwitchFieldProps) {
|
|
18
19
|
return (
|
|
19
20
|
<SettingsRow
|
|
@@ -21,7 +22,14 @@ function SwitchFieldInner({
|
|
|
21
22
|
description={description}
|
|
22
23
|
disabled={disabled}
|
|
23
24
|
testID={testID}
|
|
24
|
-
control={
|
|
25
|
+
control={
|
|
26
|
+
<Switch
|
|
27
|
+
checked={value}
|
|
28
|
+
disabled={disabled}
|
|
29
|
+
interactionPolicy={interactionPolicy}
|
|
30
|
+
onCheckedChange={onValueChange}
|
|
31
|
+
/>
|
|
32
|
+
}
|
|
25
33
|
/>
|
|
26
34
|
);
|
|
27
35
|
}
|
|
@@ -28,6 +28,7 @@ function TreeItemInner<TId extends string = string>({
|
|
|
28
28
|
onToggleExpand,
|
|
29
29
|
renderItem,
|
|
30
30
|
testID,
|
|
31
|
+
interactionPolicy,
|
|
31
32
|
}: TreeItemProps<TId>) {
|
|
32
33
|
const hasChildren = node.children !== undefined && node.children.length > 0;
|
|
33
34
|
const isExpanded = expandedIds.includes(node.id);
|
|
@@ -53,6 +54,7 @@ function TreeItemInner<TId extends string = string>({
|
|
|
53
54
|
{hasChildren ? (
|
|
54
55
|
<IconButton
|
|
55
56
|
icon={{ name: isExpanded ? 'chevron-down-outline' : 'chevron-forward-outline' }}
|
|
57
|
+
interactionPolicy={interactionPolicy}
|
|
56
58
|
label={isExpanded ? 'Collapse' : 'Expand'}
|
|
57
59
|
onPress={() => onToggleExpand(node.id)}
|
|
58
60
|
size="s"
|
|
@@ -77,6 +79,7 @@ function TreeItemInner<TId extends string = string>({
|
|
|
77
79
|
key={child.id}
|
|
78
80
|
depth={depth + 1}
|
|
79
81
|
expandedIds={expandedIds}
|
|
82
|
+
interactionPolicy={interactionPolicy}
|
|
80
83
|
node={child}
|
|
81
84
|
onSelect={onSelect}
|
|
82
85
|
onToggleExpand={onToggleExpand}
|