@ankhorage/zora 4.4.1 → 5.0.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 +13 -0
- package/README.md +1 -1
- package/dist/components/radio/RadioGroup.d.ts +1 -3
- package/dist/components/radio/RadioGroup.d.ts.map +1 -1
- package/dist/components/radio/RadioGroup.js +52 -40
- package/dist/components/radio/RadioGroup.js.map +1 -1
- package/dist/components/radio/RadioOptionControl.d.ts +15 -0
- package/dist/components/radio/RadioOptionControl.d.ts.map +1 -0
- package/dist/components/radio/RadioOptionControl.js +105 -0
- package/dist/components/radio/RadioOptionControl.js.map +1 -0
- package/dist/components/radio/handleRadioOptionKeyDown.d.ts +13 -0
- package/dist/components/radio/handleRadioOptionKeyDown.d.ts.map +1 -0
- package/dist/components/radio/handleRadioOptionKeyDown.js +22 -0
- package/dist/components/radio/handleRadioOptionKeyDown.js.map +1 -0
- package/dist/components/radio/meta.d.ts +38 -3
- package/dist/components/radio/meta.d.ts.map +1 -1
- package/dist/components/radio/meta.js +28 -3
- package/dist/components/radio/meta.js.map +1 -1
- package/dist/components/radio/resolveRadioOptionColors.d.ts +10 -0
- package/dist/components/radio/resolveRadioOptionColors.d.ts.map +1 -0
- package/dist/components/radio/resolveRadioOptionColors.js +27 -0
- package/dist/components/radio/resolveRadioOptionColors.js.map +1 -0
- package/dist/components/radio/types.d.ts +12 -2
- package/dist/components/radio/types.d.ts.map +1 -1
- package/dist/components/radio/types.js.map +1 -1
- package/dist/constants/keyboard.d.ts +3 -0
- package/dist/constants/keyboard.d.ts.map +1 -0
- package/dist/constants/keyboard.js +8 -0
- package/dist/constants/keyboard.js.map +1 -0
- package/dist/index.d.ts +0 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +1 -1
- package/dist/metadata/componentMeta.d.ts.map +1 -1
- package/dist/metadata/componentMeta.js +0 -12
- package/dist/metadata/componentMeta.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +0 -12
- package/dist/registry.js.map +1 -1
- package/package.json +1 -1
- package/src/audit.test.ts +0 -29
- package/src/components/radio/RadioGroup.test.ts +13 -9
- package/src/components/radio/RadioGroup.tsx +85 -111
- package/src/components/radio/RadioOptionControl.tsx +192 -0
- package/src/components/radio/handleRadioOptionKeyDown.test.ts +47 -0
- package/src/components/radio/handleRadioOptionKeyDown.ts +37 -0
- package/src/components/radio/meta.ts +28 -3
- package/src/components/radio/resolveRadioOptionColors.test.ts +29 -0
- package/src/components/radio/resolveRadioOptionColors.ts +37 -0
- package/src/components/radio/types.ts +10 -2
- package/src/constants/keyboard.ts +7 -0
- package/src/index.ts +0 -23
- package/src/interactionPolicy.test.ts +0 -17
- package/src/metadata/componentMeta.test.ts +1 -0
- package/src/metadata/componentMeta.ts +0 -12
- package/src/registry.ts +0 -12
- package/src/showcaseCoverage.test.ts +0 -6
- package/src/theme/themeScopeStructure.test.ts +0 -4
- package/dist/components/drawer/Drawer.d.ts +0 -7
- package/dist/components/drawer/Drawer.d.ts.map +0 -1
- package/dist/components/drawer/Drawer.js +0 -36
- package/dist/components/drawer/Drawer.js.map +0 -1
- package/dist/components/drawer/index.d.ts +0 -3
- package/dist/components/drawer/index.d.ts.map +0 -1
- package/dist/components/drawer/index.js +0 -2
- package/dist/components/drawer/index.js.map +0 -1
- package/dist/components/drawer/meta.d.ts +0 -9
- package/dist/components/drawer/meta.d.ts.map +0 -1
- package/dist/components/drawer/meta.js +0 -9
- package/dist/components/drawer/meta.js.map +0 -1
- package/dist/components/drawer/types.d.ts +0 -10
- package/dist/components/drawer/types.d.ts.map +0 -1
- package/dist/components/drawer/types.js +0 -2
- package/dist/components/drawer/types.js.map +0 -1
- package/dist/components/navigation-item/NavigationItem.d.ts +0 -7
- package/dist/components/navigation-item/NavigationItem.d.ts.map +0 -1
- package/dist/components/navigation-item/NavigationItem.js +0 -21
- package/dist/components/navigation-item/NavigationItem.js.map +0 -1
- package/dist/components/navigation-item/index.d.ts +0 -3
- package/dist/components/navigation-item/index.d.ts.map +0 -1
- package/dist/components/navigation-item/index.js +0 -2
- package/dist/components/navigation-item/index.js.map +0 -1
- package/dist/components/navigation-item/meta.d.ts +0 -9
- package/dist/components/navigation-item/meta.d.ts.map +0 -1
- package/dist/components/navigation-item/meta.js +0 -9
- package/dist/components/navigation-item/meta.js.map +0 -1
- package/dist/components/navigation-item/types.d.ts +0 -23
- package/dist/components/navigation-item/types.d.ts.map +0 -1
- package/dist/components/navigation-item/types.js +0 -2
- package/dist/components/navigation-item/types.js.map +0 -1
- package/dist/components/navigation-list/NavigationList.d.ts +0 -7
- package/dist/components/navigation-list/NavigationList.d.ts.map +0 -1
- package/dist/components/navigation-list/NavigationList.js +0 -29
- package/dist/components/navigation-list/NavigationList.js.map +0 -1
- package/dist/components/navigation-list/index.d.ts +0 -3
- package/dist/components/navigation-list/index.d.ts.map +0 -1
- package/dist/components/navigation-list/index.js +0 -2
- package/dist/components/navigation-list/index.js.map +0 -1
- package/dist/components/navigation-list/meta.d.ts +0 -9
- package/dist/components/navigation-list/meta.d.ts.map +0 -1
- package/dist/components/navigation-list/meta.js +0 -9
- package/dist/components/navigation-list/meta.js.map +0 -1
- package/dist/components/navigation-list/types.d.ts +0 -15
- package/dist/components/navigation-list/types.d.ts.map +0 -1
- package/dist/components/navigation-list/types.js +0 -2
- package/dist/components/navigation-list/types.js.map +0 -1
- package/dist/internal/resolveZoraNavigationItems.d.ts +0 -65
- package/dist/internal/resolveZoraNavigationItems.d.ts.map +0 -1
- package/dist/internal/resolveZoraNavigationItems.js +0 -56
- package/dist/internal/resolveZoraNavigationItems.js.map +0 -1
- package/dist/patterns/responsive-panel/ResponsivePanel.d.ts +0 -16
- package/dist/patterns/responsive-panel/ResponsivePanel.d.ts.map +0 -1
- package/dist/patterns/responsive-panel/ResponsivePanel.js +0 -101
- package/dist/patterns/responsive-panel/ResponsivePanel.js.map +0 -1
- package/dist/patterns/responsive-panel/index.d.ts +0 -3
- package/dist/patterns/responsive-panel/index.d.ts.map +0 -1
- package/dist/patterns/responsive-panel/index.js +0 -3
- package/dist/patterns/responsive-panel/index.js.map +0 -1
- package/dist/patterns/responsive-panel/meta.d.ts +0 -9
- package/dist/patterns/responsive-panel/meta.d.ts.map +0 -1
- package/dist/patterns/responsive-panel/meta.js +0 -9
- package/dist/patterns/responsive-panel/meta.js.map +0 -1
- package/dist/patterns/responsive-panel/types.d.ts +0 -23
- package/dist/patterns/responsive-panel/types.d.ts.map +0 -1
- package/dist/patterns/responsive-panel/types.js +0 -2
- package/dist/patterns/responsive-panel/types.js.map +0 -1
- package/dist/patterns/zora-drawer-content/ZoraDrawerContent.d.ts +0 -9
- package/dist/patterns/zora-drawer-content/ZoraDrawerContent.d.ts.map +0 -1
- package/dist/patterns/zora-drawer-content/ZoraDrawerContent.js +0 -31
- package/dist/patterns/zora-drawer-content/ZoraDrawerContent.js.map +0 -1
- package/dist/patterns/zora-drawer-content/index.d.ts +0 -3
- package/dist/patterns/zora-drawer-content/index.d.ts.map +0 -1
- package/dist/patterns/zora-drawer-content/index.js +0 -2
- package/dist/patterns/zora-drawer-content/index.js.map +0 -1
- package/dist/patterns/zora-drawer-content/meta.d.ts +0 -9
- package/dist/patterns/zora-drawer-content/meta.d.ts.map +0 -1
- package/dist/patterns/zora-drawer-content/meta.js +0 -9
- package/dist/patterns/zora-drawer-content/meta.js.map +0 -1
- package/dist/patterns/zora-drawer-content/types.d.ts +0 -15
- package/dist/patterns/zora-drawer-content/types.d.ts.map +0 -1
- package/dist/patterns/zora-drawer-content/types.js +0 -2
- package/dist/patterns/zora-drawer-content/types.js.map +0 -1
- package/dist/patterns/zora-tab-bar/ZoraTabBar.d.ts +0 -9
- package/dist/patterns/zora-tab-bar/ZoraTabBar.d.ts.map +0 -1
- package/dist/patterns/zora-tab-bar/ZoraTabBar.js +0 -89
- package/dist/patterns/zora-tab-bar/ZoraTabBar.js.map +0 -1
- package/dist/patterns/zora-tab-bar/index.d.ts +0 -3
- package/dist/patterns/zora-tab-bar/index.d.ts.map +0 -1
- package/dist/patterns/zora-tab-bar/index.js +0 -2
- package/dist/patterns/zora-tab-bar/index.js.map +0 -1
- package/dist/patterns/zora-tab-bar/meta.d.ts +0 -9
- package/dist/patterns/zora-tab-bar/meta.d.ts.map +0 -1
- package/dist/patterns/zora-tab-bar/meta.js +0 -9
- package/dist/patterns/zora-tab-bar/meta.js.map +0 -1
- package/dist/patterns/zora-tab-bar/types.d.ts +0 -19
- package/dist/patterns/zora-tab-bar/types.d.ts.map +0 -1
- package/dist/patterns/zora-tab-bar/types.js +0 -2
- package/dist/patterns/zora-tab-bar/types.js.map +0 -1
- package/src/components/drawer/Drawer.tsx +0 -59
- package/src/components/drawer/index.ts +0 -2
- package/src/components/drawer/meta.ts +0 -10
- package/src/components/drawer/types.ts +0 -17
- package/src/components/navigation-item/NavigationItem.tsx +0 -41
- package/src/components/navigation-item/index.ts +0 -6
- package/src/components/navigation-item/meta.ts +0 -10
- package/src/components/navigation-item/types.ts +0 -26
- package/src/components/navigation-list/NavigationList.tsx +0 -68
- package/src/components/navigation-list/index.ts +0 -2
- package/src/components/navigation-list/meta.ts +0 -10
- package/src/components/navigation-list/types.ts +0 -17
- package/src/internal/resolveZoraNavigationItems.test.ts +0 -174
- package/src/internal/resolveZoraNavigationItems.ts +0 -157
- package/src/navigationExports.test.ts +0 -15
- package/src/patterns/responsive-panel/ResponsivePanel.tsx +0 -172
- package/src/patterns/responsive-panel/index.ts +0 -2
- package/src/patterns/responsive-panel/meta.ts +0 -10
- package/src/patterns/responsive-panel/types.ts +0 -25
- package/src/patterns/zora-drawer-content/ZoraDrawerContent.tsx +0 -60
- package/src/patterns/zora-drawer-content/index.ts +0 -2
- package/src/patterns/zora-drawer-content/meta.ts +0 -10
- package/src/patterns/zora-drawer-content/types.ts +0 -20
- package/src/patterns/zora-tab-bar/ZoraTabBar.tsx +0 -157
- package/src/patterns/zora-tab-bar/index.ts +0 -2
- package/src/patterns/zora-tab-bar/meta.ts +0 -10
- package/src/patterns/zora-tab-bar/types.ts +0 -18
package/dist/registry.js
CHANGED
|
@@ -12,7 +12,6 @@ import { Chip } from './components/chip';
|
|
|
12
12
|
import { ChipGroup } from './components/chip-group';
|
|
13
13
|
import { DataTable } from './components/data-table';
|
|
14
14
|
import { DatePicker } from './components/date-picker';
|
|
15
|
-
import { Drawer } from './components/drawer';
|
|
16
15
|
import { Form, FormActions, FormError, FormField } from './components/form';
|
|
17
16
|
import { Gradient } from './components/gradient';
|
|
18
17
|
import { Heading } from './components/heading';
|
|
@@ -24,8 +23,6 @@ import { MediaCard } from './components/media-card';
|
|
|
24
23
|
import { DropdownMenu, Menu } from './components/menu';
|
|
25
24
|
import { MetricCard } from './components/metric-card';
|
|
26
25
|
import { Modal } from './components/modal';
|
|
27
|
-
import { NavigationItem } from './components/navigation-item';
|
|
28
|
-
import { NavigationList } from './components/navigation-list';
|
|
29
26
|
import { Pagination } from './components/pagination';
|
|
30
27
|
import { Progress, ProgressRing } from './components/progress';
|
|
31
28
|
import { Radio, RadioGroup } from './components/radio';
|
|
@@ -67,7 +64,6 @@ import { Panel } from './patterns/panel';
|
|
|
67
64
|
import { PostCard } from './patterns/post-card';
|
|
68
65
|
import { ProductCard } from './patterns/product-card';
|
|
69
66
|
import { ReaderSurface } from './patterns/reader';
|
|
70
|
-
import { ResponsivePanel } from './patterns/responsive-panel';
|
|
71
67
|
import { BarcodeScannerView, CameraPermissionView, ScanOverlay } from './patterns/scanner';
|
|
72
68
|
import { SectionHeader } from './patterns/section-header';
|
|
73
69
|
import { SelectableItem } from './patterns/selection';
|
|
@@ -77,8 +73,6 @@ import { ThemeComposer } from './patterns/theme-composer';
|
|
|
77
73
|
import { PaletteItem, TileGrid } from './patterns/tile-grid';
|
|
78
74
|
import { Timeline } from './patterns/timeline';
|
|
79
75
|
import { TreeItem, TreeView } from './patterns/tree-view';
|
|
80
|
-
import { ZoraDrawerContent } from './patterns/zora-drawer-content';
|
|
81
|
-
import { ZoraTabBar } from './patterns/zora-tab-bar';
|
|
82
76
|
import { ThemeModeToggle } from './theme/ThemeModeToggle';
|
|
83
77
|
const _ZORA_COMPONENT_REGISTRY = {
|
|
84
78
|
ActionSheet,
|
|
@@ -97,7 +91,6 @@ const _ZORA_COMPONENT_REGISTRY = {
|
|
|
97
91
|
ChipGroup,
|
|
98
92
|
DataTable,
|
|
99
93
|
DatePicker,
|
|
100
|
-
Drawer,
|
|
101
94
|
DropdownMenu,
|
|
102
95
|
Form,
|
|
103
96
|
FormActions,
|
|
@@ -113,8 +106,6 @@ const _ZORA_COMPONENT_REGISTRY = {
|
|
|
113
106
|
Menu,
|
|
114
107
|
MetricCard,
|
|
115
108
|
Modal,
|
|
116
|
-
NavigationItem,
|
|
117
|
-
NavigationList,
|
|
118
109
|
Pagination,
|
|
119
110
|
Progress,
|
|
120
111
|
ProgressRing,
|
|
@@ -178,7 +169,6 @@ const _ZORA_COMPONENT_REGISTRY = {
|
|
|
178
169
|
Panel,
|
|
179
170
|
PostCard,
|
|
180
171
|
ProductCard,
|
|
181
|
-
ResponsivePanel,
|
|
182
172
|
ReaderSurface,
|
|
183
173
|
BarcodeScannerView,
|
|
184
174
|
CameraPermissionView,
|
|
@@ -193,8 +183,6 @@ const _ZORA_COMPONENT_REGISTRY = {
|
|
|
193
183
|
Timeline,
|
|
194
184
|
TreeItem,
|
|
195
185
|
TreeView,
|
|
196
|
-
ZoraDrawerContent,
|
|
197
|
-
ZoraTabBar,
|
|
198
186
|
};
|
|
199
187
|
export const ZORA_COMPONENT_REGISTRY = _ZORA_COMPONENT_REGISTRY;
|
|
200
188
|
//# sourceMappingURL=registry.js.map
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InteractionPolicyProps } from '@ankhorage/surface';\nimport type React from 'react';\n\nimport { ActionSheet, ActionSheetItem } from './components/action-sheet';\nimport { AppBar } from './components/app-bar';\nimport { Avatar } from './components/avatar';\nimport { AvatarGroup } from './components/avatar-group';\nimport { Badge } from './components/badge';\nimport { Breadcrumbs } from './components/breadcrumbs';\nimport { Button } from './components/button';\nimport { ButtonGroup } from './components/button-group';\nimport { Card } from './components/card';\nimport { Checkbox, CheckboxGroup } from './components/checkbox';\nimport { Chip } from './components/chip';\nimport { ChipGroup } from './components/chip-group';\nimport { DataTable } from './components/data-table';\nimport { DatePicker } from './components/date-picker';\nimport { Drawer } from './components/drawer';\nimport { Form, FormActions, FormError, FormField } from './components/form';\nimport { Gradient } from './components/gradient';\nimport { Heading } from './components/heading';\nimport { Icon } from './components/icon';\nimport { IconButton } from './components/icon-button';\nimport { Image } from './components/image';\nimport { Input } from './components/input';\nimport { MediaCard } from './components/media-card';\nimport { DropdownMenu, Menu } from './components/menu';\nimport { MetricCard } from './components/metric-card';\nimport { Modal } from './components/modal';\nimport { NavigationItem } from './components/navigation-item';\nimport { NavigationList } from './components/navigation-list';\nimport { Pagination } from './components/pagination';\nimport { Progress, ProgressRing } from './components/progress';\nimport { Radio, RadioGroup } from './components/radio';\nimport { Rating } from './components/rating';\nimport { SearchBar } from './components/search-bar';\nimport { Select } from './components/select';\nimport { Skeleton, SkeletonCard, SkeletonList, SkeletonText } from './components/skeleton';\nimport { SplashScreen } from './components/splash-screen';\nimport { Tabs } from './components/tabs';\nimport { Text } from './components/text';\nimport { Textarea } from './components/textarea';\nimport { TimePicker } from './components/time-picker';\nimport { Toast } from './components/toast';\nimport { Toolbar, ToolbarAction } from './components/toolbar';\nimport {\n Box,\n Center,\n Container,\n Divider,\n Grid,\n Inline,\n Show,\n Spacer,\n Stack,\n Surface,\n} from './foundation';\nimport { AppShell } from './layout/app-shell';\nimport { Screen } from './layout/screen';\nimport { ScreenSection } from './layout/screen-section';\nimport { SettingsLayout } from './layout/settings-layout';\nimport { SidebarLayout } from './layout/sidebar-layout';\nimport { TopbarLayout } from './layout/topbar-layout';\nimport {\n ForgotPasswordForm,\n OAuthProviderButton,\n OAuthProviderList,\n OtpForm,\n SignInForm,\n SignUpForm,\n} from './patterns/auth';\nimport { ChatListItem } from './patterns/chat-list-item';\nimport { CollectionEditor } from './patterns/collection-editor';\nimport { ConfirmDialog } from './patterns/confirm-dialog';\nimport { ContentRail } from './patterns/content-rail';\nimport { DisclosureSection } from './patterns/disclosure-section';\nimport { EmptyState } from './patterns/empty-state';\nimport { FilterBar } from './patterns/filter-bar';\nimport { Hero } from './patterns/hero';\nimport { ImagePreview } from './patterns/image-preview';\nimport { ImageUploadField } from './patterns/image-upload-field';\nimport { InspectorField } from './patterns/inspector-field';\nimport { List, ListRow, ListSection } from './patterns/list';\nimport { MessageBubble } from './patterns/message-bubble';\nimport { MissingElement } from './patterns/missing-element';\nimport { Notice } from './patterns/notice';\nimport { Panel } from './patterns/panel';\nimport { PostCard } from './patterns/post-card';\nimport { ProductCard } from './patterns/product-card';\nimport { ReaderSurface } from './patterns/reader';\nimport { ResponsivePanel } from './patterns/responsive-panel';\nimport { BarcodeScannerView, CameraPermissionView, ScanOverlay } from './patterns/scanner';\nimport { SectionHeader } from './patterns/section-header';\nimport { SelectableItem } from './patterns/selection';\nimport { SettingsRow } from './patterns/settings-row';\nimport { SwitchField } from './patterns/switch-field';\nimport { ThemeComposer } from './patterns/theme-composer';\nimport { PaletteItem, TileGrid } from './patterns/tile-grid';\nimport { Timeline } from './patterns/timeline';\nimport { TreeItem, TreeView } from './patterns/tree-view';\nimport { ZoraDrawerContent } from './patterns/zora-drawer-content';\nimport { ZoraTabBar } from './patterns/zora-tab-bar';\nimport { ThemeModeToggle } from './theme/ThemeModeToggle';\n\nexport type ZoraComponentRegistry = Readonly<Record<string, React.ElementType>>;\n\ntype ComponentPropsFor<K extends keyof typeof _ZORA_COMPONENT_REGISTRY> = React.ComponentProps<\n (typeof _ZORA_COMPONENT_REGISTRY)[K]\n>;\n\ntype AcceptsSurfaceInteractionPolicyProps<P> = 'interactionPolicy' extends keyof P\n ? InteractionPolicyProps extends Pick<P, 'interactionPolicy'>\n ? Pick<P, 'interactionPolicy'> extends InteractionPolicyProps\n ? true\n : false\n : false\n : false;\n\ntype RegistryInteractionPolicyContract = {\n [K in keyof typeof _ZORA_COMPONENT_REGISTRY]: AcceptsSurfaceInteractionPolicyProps<\n ComponentPropsFor<K>\n >;\n};\n\ntype _AssertTrue<T extends true> = T;\ntype _RegistryInteractionPolicyCheck = _AssertTrue<\n RegistryInteractionPolicyContract[keyof typeof _ZORA_COMPONENT_REGISTRY]\n>;\n\nconst _ZORA_COMPONENT_REGISTRY = {\n ActionSheet,\n ActionSheetItem,\n AppBar,\n Avatar,\n AvatarGroup,\n Badge,\n Breadcrumbs,\n Button,\n ButtonGroup,\n Card,\n Checkbox,\n CheckboxGroup,\n Chip,\n ChipGroup,\n DataTable,\n DatePicker,\n Drawer,\n DropdownMenu,\n Form,\n FormActions,\n FormError,\n FormField,\n Gradient,\n Heading,\n Icon,\n IconButton,\n Image,\n Input,\n MediaCard,\n Menu,\n MetricCard,\n Modal,\n NavigationItem,\n NavigationList,\n Pagination,\n Progress,\n ProgressRing,\n Radio,\n RadioGroup,\n Rating,\n SearchBar,\n Select,\n Skeleton,\n SkeletonCard,\n SkeletonList,\n SkeletonText,\n SplashScreen,\n Tabs,\n Text,\n Textarea,\n TimePicker,\n Toast,\n Toolbar,\n ToolbarAction,\n ThemeModeToggle,\n Box,\n Center,\n Container,\n Divider,\n Grid,\n Inline,\n Show,\n Spacer,\n Stack,\n Surface,\n AppShell,\n Screen,\n ScreenSection,\n SettingsLayout,\n SidebarLayout,\n TopbarLayout,\n ForgotPasswordForm,\n OAuthProviderButton,\n OAuthProviderList,\n OtpForm,\n SignInForm,\n SignUpForm,\n ChatListItem,\n CollectionEditor,\n ConfirmDialog,\n ContentRail,\n DisclosureSection,\n EmptyState,\n FilterBar,\n Hero,\n ImagePreview,\n ImageUploadField,\n InspectorField,\n List,\n ListRow,\n ListSection,\n MessageBubble,\n MissingElement,\n Notice,\n Panel,\n PostCard,\n ProductCard,\n ResponsivePanel,\n ReaderSurface,\n BarcodeScannerView,\n CameraPermissionView,\n ScanOverlay,\n SectionHeader,\n SelectableItem,\n SettingsRow,\n SwitchField,\n ThemeComposer,\n PaletteItem,\n TileGrid,\n Timeline,\n TreeItem,\n TreeView,\n ZoraDrawerContent,\n ZoraTabBar,\n} as const satisfies ZoraComponentRegistry;\n\nexport const ZORA_COMPONENT_REGISTRY: ZoraComponentRegistry = _ZORA_COMPONENT_REGISTRY;\n"]}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InteractionPolicyProps } from '@ankhorage/surface';\nimport type React from 'react';\n\nimport { ActionSheet, ActionSheetItem } from './components/action-sheet';\nimport { AppBar } from './components/app-bar';\nimport { Avatar } from './components/avatar';\nimport { AvatarGroup } from './components/avatar-group';\nimport { Badge } from './components/badge';\nimport { Breadcrumbs } from './components/breadcrumbs';\nimport { Button } from './components/button';\nimport { ButtonGroup } from './components/button-group';\nimport { Card } from './components/card';\nimport { Checkbox, CheckboxGroup } from './components/checkbox';\nimport { Chip } from './components/chip';\nimport { ChipGroup } from './components/chip-group';\nimport { DataTable } from './components/data-table';\nimport { DatePicker } from './components/date-picker';\nimport { Form, FormActions, FormError, FormField } from './components/form';\nimport { Gradient } from './components/gradient';\nimport { Heading } from './components/heading';\nimport { Icon } from './components/icon';\nimport { IconButton } from './components/icon-button';\nimport { Image } from './components/image';\nimport { Input } from './components/input';\nimport { MediaCard } from './components/media-card';\nimport { DropdownMenu, Menu } from './components/menu';\nimport { MetricCard } from './components/metric-card';\nimport { Modal } from './components/modal';\nimport { Pagination } from './components/pagination';\nimport { Progress, ProgressRing } from './components/progress';\nimport { Radio, RadioGroup } from './components/radio';\nimport { Rating } from './components/rating';\nimport { SearchBar } from './components/search-bar';\nimport { Select } from './components/select';\nimport { Skeleton, SkeletonCard, SkeletonList, SkeletonText } from './components/skeleton';\nimport { SplashScreen } from './components/splash-screen';\nimport { Tabs } from './components/tabs';\nimport { Text } from './components/text';\nimport { Textarea } from './components/textarea';\nimport { TimePicker } from './components/time-picker';\nimport { Toast } from './components/toast';\nimport { Toolbar, ToolbarAction } from './components/toolbar';\nimport {\n Box,\n Center,\n Container,\n Divider,\n Grid,\n Inline,\n Show,\n Spacer,\n Stack,\n Surface,\n} from './foundation';\nimport { AppShell } from './layout/app-shell';\nimport { Screen } from './layout/screen';\nimport { ScreenSection } from './layout/screen-section';\nimport { SettingsLayout } from './layout/settings-layout';\nimport { SidebarLayout } from './layout/sidebar-layout';\nimport { TopbarLayout } from './layout/topbar-layout';\nimport {\n ForgotPasswordForm,\n OAuthProviderButton,\n OAuthProviderList,\n OtpForm,\n SignInForm,\n SignUpForm,\n} from './patterns/auth';\nimport { ChatListItem } from './patterns/chat-list-item';\nimport { CollectionEditor } from './patterns/collection-editor';\nimport { ConfirmDialog } from './patterns/confirm-dialog';\nimport { ContentRail } from './patterns/content-rail';\nimport { DisclosureSection } from './patterns/disclosure-section';\nimport { EmptyState } from './patterns/empty-state';\nimport { FilterBar } from './patterns/filter-bar';\nimport { Hero } from './patterns/hero';\nimport { ImagePreview } from './patterns/image-preview';\nimport { ImageUploadField } from './patterns/image-upload-field';\nimport { InspectorField } from './patterns/inspector-field';\nimport { List, ListRow, ListSection } from './patterns/list';\nimport { MessageBubble } from './patterns/message-bubble';\nimport { MissingElement } from './patterns/missing-element';\nimport { Notice } from './patterns/notice';\nimport { Panel } from './patterns/panel';\nimport { PostCard } from './patterns/post-card';\nimport { ProductCard } from './patterns/product-card';\nimport { ReaderSurface } from './patterns/reader';\nimport { BarcodeScannerView, CameraPermissionView, ScanOverlay } from './patterns/scanner';\nimport { SectionHeader } from './patterns/section-header';\nimport { SelectableItem } from './patterns/selection';\nimport { SettingsRow } from './patterns/settings-row';\nimport { SwitchField } from './patterns/switch-field';\nimport { ThemeComposer } from './patterns/theme-composer';\nimport { PaletteItem, TileGrid } from './patterns/tile-grid';\nimport { Timeline } from './patterns/timeline';\nimport { TreeItem, TreeView } from './patterns/tree-view';\nimport { ThemeModeToggle } from './theme/ThemeModeToggle';\n\nexport type ZoraComponentRegistry = Readonly<Record<string, React.ElementType>>;\n\ntype ComponentPropsFor<K extends keyof typeof _ZORA_COMPONENT_REGISTRY> = React.ComponentProps<\n (typeof _ZORA_COMPONENT_REGISTRY)[K]\n>;\n\ntype AcceptsSurfaceInteractionPolicyProps<P> = 'interactionPolicy' extends keyof P\n ? InteractionPolicyProps extends Pick<P, 'interactionPolicy'>\n ? Pick<P, 'interactionPolicy'> extends InteractionPolicyProps\n ? true\n : false\n : false\n : false;\n\ntype RegistryInteractionPolicyContract = {\n [K in keyof typeof _ZORA_COMPONENT_REGISTRY]: AcceptsSurfaceInteractionPolicyProps<\n ComponentPropsFor<K>\n >;\n};\n\ntype _AssertTrue<T extends true> = T;\ntype _RegistryInteractionPolicyCheck = _AssertTrue<\n RegistryInteractionPolicyContract[keyof typeof _ZORA_COMPONENT_REGISTRY]\n>;\n\nconst _ZORA_COMPONENT_REGISTRY = {\n ActionSheet,\n ActionSheetItem,\n AppBar,\n Avatar,\n AvatarGroup,\n Badge,\n Breadcrumbs,\n Button,\n ButtonGroup,\n Card,\n Checkbox,\n CheckboxGroup,\n Chip,\n ChipGroup,\n DataTable,\n DatePicker,\n DropdownMenu,\n Form,\n FormActions,\n FormError,\n FormField,\n Gradient,\n Heading,\n Icon,\n IconButton,\n Image,\n Input,\n MediaCard,\n Menu,\n MetricCard,\n Modal,\n Pagination,\n Progress,\n ProgressRing,\n Radio,\n RadioGroup,\n Rating,\n SearchBar,\n Select,\n Skeleton,\n SkeletonCard,\n SkeletonList,\n SkeletonText,\n SplashScreen,\n Tabs,\n Text,\n Textarea,\n TimePicker,\n Toast,\n Toolbar,\n ToolbarAction,\n ThemeModeToggle,\n Box,\n Center,\n Container,\n Divider,\n Grid,\n Inline,\n Show,\n Spacer,\n Stack,\n Surface,\n AppShell,\n Screen,\n ScreenSection,\n SettingsLayout,\n SidebarLayout,\n TopbarLayout,\n ForgotPasswordForm,\n OAuthProviderButton,\n OAuthProviderList,\n OtpForm,\n SignInForm,\n SignUpForm,\n ChatListItem,\n CollectionEditor,\n ConfirmDialog,\n ContentRail,\n DisclosureSection,\n EmptyState,\n FilterBar,\n Hero,\n ImagePreview,\n ImageUploadField,\n InspectorField,\n List,\n ListRow,\n ListSection,\n MessageBubble,\n MissingElement,\n Notice,\n Panel,\n PostCard,\n ProductCard,\n ReaderSurface,\n BarcodeScannerView,\n CameraPermissionView,\n ScanOverlay,\n SectionHeader,\n SelectableItem,\n SettingsRow,\n SwitchField,\n ThemeComposer,\n PaletteItem,\n TileGrid,\n Timeline,\n TreeItem,\n TreeView,\n} as const satisfies ZoraComponentRegistry;\n\nexport const ZORA_COMPONENT_REGISTRY: ZoraComponentRegistry = _ZORA_COMPONENT_REGISTRY;\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ankhorage/zora",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "5.0.0",
|
|
5
5
|
"description": "Opinionated React Native and React Native Web UI kit built on @ankhorage/surface.",
|
|
6
6
|
"homepage": "https://github.com/ankhorage/zora#readme",
|
|
7
7
|
"bugs": {
|
package/src/audit.test.ts
CHANGED
|
@@ -240,32 +240,3 @@ describe('Plan 5 audit — public exports carry no legacy types', () => {
|
|
|
240
240
|
expect(indexSource).not.toContain('AnkhTheme');
|
|
241
241
|
});
|
|
242
242
|
});
|
|
243
|
-
|
|
244
|
-
describe('navigation chrome policy', () => {
|
|
245
|
-
const NAVIGATION_PATHS = [
|
|
246
|
-
join(SRC_ROOT, 'components', 'navigation-item'),
|
|
247
|
-
join(SRC_ROOT, 'components', 'navigation-list'),
|
|
248
|
-
join(SRC_ROOT, 'patterns', 'zora-tab-bar'),
|
|
249
|
-
join(SRC_ROOT, 'patterns', 'zora-drawer-content'),
|
|
250
|
-
join(SRC_ROOT, 'internal', 'resolveZoraNavigationItems.ts'),
|
|
251
|
-
];
|
|
252
|
-
|
|
253
|
-
test('does not import expo-router, react-navigation, or Surface internals', () => {
|
|
254
|
-
const sources = NAVIGATION_PATHS.flatMap((path) => {
|
|
255
|
-
if (path.endsWith('.ts')) {
|
|
256
|
-
return [readFileSync(path, 'utf8')];
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
if (!path.includes(`${SRC_ROOT}/`)) {
|
|
260
|
-
return [];
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
return listFiles(path).map((filePath) => readFileSync(filePath, 'utf8'));
|
|
264
|
-
}).join('\n');
|
|
265
|
-
|
|
266
|
-
expect(sources).not.toMatch(/expo-router/);
|
|
267
|
-
expect(sources).not.toMatch(/@react-navigation\//);
|
|
268
|
-
expect(sources).not.toMatch(/@ankhorage\/surface\/src\//);
|
|
269
|
-
expect(sources).not.toMatch(/@ankhorage\/surface\/dist\//);
|
|
270
|
-
});
|
|
271
|
-
});
|
|
@@ -19,13 +19,17 @@ test('resolves RadioGroup theme defaults while preserving instance overrides', (
|
|
|
19
19
|
).toEqual({ gap: 'l', color: 'danger', size: 's' });
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
-
test('
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
expect(
|
|
26
|
-
expect(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
expect(
|
|
30
|
-
|
|
22
|
+
test('icon radio options expose serializable authoring metadata', async () => {
|
|
23
|
+
const { radioGroupMeta } = await import('./meta');
|
|
24
|
+
expect(radioGroupMeta.directManifestNode).toBe(true);
|
|
25
|
+
expect(radioGroupMeta.blueprint.label).toBe('Radio button group');
|
|
26
|
+
expect(radioGroupMeta.blueprint.defaultProps.options.map((option) => option.value)).toContain(
|
|
27
|
+
radioGroupMeta.blueprint.defaultProps.defaultValue,
|
|
28
|
+
);
|
|
29
|
+
expect(
|
|
30
|
+
radioGroupMeta.props.options.itemSchema.find((field) => field.key === 'iconSource')?.schema,
|
|
31
|
+
).toMatchObject({ type: 'media', mediaKinds: ['image'] });
|
|
32
|
+
expect(radioGroupMeta.props.columns.enum).toEqual([1, 2, 3, 4]);
|
|
33
|
+
expect(radioGroupMeta.props.contentOrientation.enum).toEqual(['horizontal', 'vertical']);
|
|
34
|
+
expect(radioGroupMeta.events.valueChange.eventType).toBe('radioGroup.valueChange');
|
|
31
35
|
});
|
|
@@ -1,145 +1,117 @@
|
|
|
1
|
-
import { Radio
|
|
1
|
+
import { Radio } from '@ankhorage/surface';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import { View } from 'react-native';
|
|
3
|
+
import { StyleSheet, View } from 'react-native';
|
|
4
4
|
|
|
5
5
|
import { Stack } from '../../foundation';
|
|
6
6
|
import { useZoraThemeRecipe } from '../../theme/useZoraThemeRecipe';
|
|
7
7
|
import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
|
|
8
8
|
import { Text } from '../text';
|
|
9
|
+
import { RadioOptionControl } from './RadioOptionControl';
|
|
9
10
|
import { resolveRadioGroupThemeRecipe } from './resolveRadioGroupThemeRecipe';
|
|
10
|
-
import type {
|
|
11
|
+
import type { RadioGroupProps } from './types';
|
|
11
12
|
|
|
12
|
-
/***
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
/*** Present one controlled single-choice group as inline radios or icon radio options. */
|
|
14
|
+
export const RadioGroup = withZoraThemeScope(RadioGroupInner);
|
|
15
|
+
|
|
16
|
+
/*** Resolve shared presentation once and preserve a single interaction boundary per option. */
|
|
15
17
|
function RadioGroupInner<TValue extends string>({
|
|
16
18
|
themeId: _themeId,
|
|
17
19
|
mode: _mode,
|
|
18
|
-
|
|
19
|
-
onValueChange,
|
|
20
|
-
options,
|
|
21
|
-
orientation = 'vertical',
|
|
22
|
-
gap,
|
|
23
|
-
presentation = 'inline',
|
|
24
|
-
color,
|
|
25
|
-
size,
|
|
26
|
-
invalid = false,
|
|
27
|
-
readOnly = false,
|
|
28
|
-
disabled = false,
|
|
29
|
-
testID,
|
|
30
|
-
interactionPolicy,
|
|
20
|
+
...props
|
|
31
21
|
}: RadioGroupProps<TValue>) {
|
|
32
|
-
const
|
|
22
|
+
const [localValue, setLocalValue] = React.useState(props.defaultValue);
|
|
23
|
+
const onValueChange = (next: TValue) => {
|
|
24
|
+
if (props.value === undefined) setLocalValue(next);
|
|
25
|
+
props.onValueChange?.(next);
|
|
26
|
+
};
|
|
27
|
+
const selectedProps = { ...props, value: props.value ?? localValue, onValueChange };
|
|
33
28
|
const themeFields = useZoraThemeRecipe('RadioGroup');
|
|
34
|
-
const recipe = resolveRadioGroupThemeRecipe({
|
|
29
|
+
const recipe = resolveRadioGroupThemeRecipe({ ...props, themeFields });
|
|
30
|
+
if (props.presentation !== 'card') return <RadioGroupInline {...selectedProps} {...recipe} />;
|
|
31
|
+
const columns =
|
|
32
|
+
props.columns ?? (props.orientation === 'horizontal' ? Math.max(1, props.options.length) : 1);
|
|
33
|
+
const rows = Array.from({ length: Math.ceil(props.options.length / columns) }, (_, index) =>
|
|
34
|
+
props.options.slice(index * columns, (index + 1) * columns),
|
|
35
|
+
);
|
|
36
|
+
return (
|
|
37
|
+
<View testID={props.testID} accessibilityRole="radiogroup">
|
|
38
|
+
<Stack gap={recipe.gap}>
|
|
39
|
+
{rows.map((options, index) => (
|
|
40
|
+
<Stack key={index} direction="row" gap={recipe.gap}>
|
|
41
|
+
{options.map((option) => (
|
|
42
|
+
<View key={option.value} style={styles.option}>
|
|
43
|
+
<RadioGroupItem {...selectedProps} {...recipe} option={option} />
|
|
44
|
+
</View>
|
|
45
|
+
))}
|
|
46
|
+
{Array.from({ length: columns - options.length }, (_, slot) => (
|
|
47
|
+
<View key={`empty-${slot}`} style={styles.option} />
|
|
48
|
+
))}
|
|
49
|
+
</Stack>
|
|
50
|
+
))}
|
|
51
|
+
</Stack>
|
|
52
|
+
</View>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
35
55
|
|
|
56
|
+
/*** Preserve ordinary radio wrapping independently of the icon-option grid. */
|
|
57
|
+
function RadioGroupInline<TValue extends string>(props: RadioGroupProps<TValue>) {
|
|
36
58
|
return (
|
|
37
|
-
<View
|
|
38
|
-
testID={testID}
|
|
39
|
-
accessibilityRole="radiogroup"
|
|
40
|
-
style={{
|
|
41
|
-
flexDirection: isHorizontal ? 'row' : 'column',
|
|
42
|
-
flexWrap: isHorizontal ? 'wrap' : 'nowrap',
|
|
43
|
-
}}
|
|
44
|
-
>
|
|
59
|
+
<View testID={props.testID} accessibilityRole="radiogroup">
|
|
45
60
|
<Stack
|
|
46
|
-
direction={
|
|
47
|
-
gap={
|
|
48
|
-
wrap=
|
|
61
|
+
direction={props.orientation === 'horizontal' ? 'row' : 'column'}
|
|
62
|
+
gap={props.gap}
|
|
63
|
+
wrap="wrap"
|
|
49
64
|
>
|
|
50
|
-
{options.map((option) => (
|
|
51
|
-
<RadioGroupItem
|
|
52
|
-
key={option.value}
|
|
53
|
-
option={option}
|
|
54
|
-
checked={value === option.value}
|
|
55
|
-
disabled={disabled || option.disabled === true}
|
|
56
|
-
invalid={invalid}
|
|
57
|
-
readOnly={readOnly}
|
|
58
|
-
size={recipe.size}
|
|
59
|
-
color={recipe.color}
|
|
60
|
-
orientation={orientation}
|
|
61
|
-
presentation={presentation}
|
|
62
|
-
onSelect={onValueChange}
|
|
63
|
-
interactionPolicy={interactionPolicy}
|
|
64
|
-
/>
|
|
65
|
+
{props.options.map((option) => (
|
|
66
|
+
<RadioGroupItem key={option.value} {...props} option={option} />
|
|
65
67
|
))}
|
|
66
68
|
</Stack>
|
|
67
69
|
</View>
|
|
68
70
|
);
|
|
69
71
|
}
|
|
70
72
|
|
|
71
|
-
/***
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
orientation: NonNullable<RadioGroupProps<TValue>['orientation']>;
|
|
100
|
-
presentation: NonNullable<RadioGroupProps<TValue>['presentation']>;
|
|
101
|
-
onSelect: (value: TValue) => void;
|
|
102
|
-
interactionPolicy: RadioGroupProps<TValue>['interactionPolicy'];
|
|
103
|
-
}) {
|
|
104
|
-
const { theme } = useTheme();
|
|
105
|
-
const passive = interactionPolicy === 'passive';
|
|
106
|
-
const isCard = presentation === 'card';
|
|
107
|
-
|
|
73
|
+
/*** Delegate icon options to their composed radio boundary and ordinary options to Surface Radio. */
|
|
74
|
+
function RadioGroupItem<TValue extends string>(
|
|
75
|
+
props: RadioGroupProps<TValue> & {
|
|
76
|
+
option: RadioGroupProps<TValue>['options'][number];
|
|
77
|
+
},
|
|
78
|
+
) {
|
|
79
|
+
const { option, value, onValueChange, interactionPolicy, color, size } = props;
|
|
80
|
+
const checked = value === option.value;
|
|
81
|
+
const inactive = props.disabled === true || option.disabled === true;
|
|
82
|
+
const readOnly = props.readOnly === true;
|
|
83
|
+
const invalid = props.invalid === true;
|
|
84
|
+
const onSelect = () => {
|
|
85
|
+
if (!inactive && !readOnly && interactionPolicy !== 'passive' && !checked)
|
|
86
|
+
onValueChange?.(option.value);
|
|
87
|
+
};
|
|
88
|
+
if (props.presentation === 'card') {
|
|
89
|
+
return (
|
|
90
|
+
<RadioOptionControl
|
|
91
|
+
{...props}
|
|
92
|
+
checked={checked}
|
|
93
|
+
disabled={inactive}
|
|
94
|
+
readOnly={readOnly}
|
|
95
|
+
invalid={invalid}
|
|
96
|
+
layout={props.contentOrientation ?? 'horizontal'}
|
|
97
|
+
onSelect={onSelect}
|
|
98
|
+
/>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
108
101
|
return (
|
|
109
102
|
<Radio
|
|
110
|
-
interactionPolicy={interactionPolicy}
|
|
111
103
|
checked={checked}
|
|
112
|
-
disabled={
|
|
113
|
-
invalid={invalid}
|
|
104
|
+
disabled={inactive}
|
|
114
105
|
readOnly={readOnly}
|
|
115
|
-
|
|
106
|
+
invalid={invalid}
|
|
107
|
+
interactionPolicy={interactionPolicy}
|
|
116
108
|
color={color}
|
|
109
|
+
size={size}
|
|
117
110
|
testID={option.testID}
|
|
118
|
-
|
|
119
|
-
isCard
|
|
120
|
-
? checked
|
|
121
|
-
? theme.semantics.selection.background
|
|
122
|
-
: theme.semantics.surface.default
|
|
123
|
-
: undefined
|
|
124
|
-
}
|
|
125
|
-
borderColor={
|
|
126
|
-
isCard
|
|
127
|
-
? checked
|
|
128
|
-
? theme.semantics.selection.border
|
|
129
|
-
: theme.semantics.border.default
|
|
130
|
-
: undefined
|
|
131
|
-
}
|
|
132
|
-
borderWidth={isCard ? 1 : undefined}
|
|
133
|
-
p={isCard ? 'm' : undefined}
|
|
134
|
-
radius={isCard ? 'l' : undefined}
|
|
135
|
-
width={isCard && orientation === 'vertical' ? '100%' : undefined}
|
|
136
|
-
onCheckedChange={(nextChecked) => {
|
|
137
|
-
if (passive) return;
|
|
138
|
-
if (nextChecked) onSelect(option.value);
|
|
139
|
-
}}
|
|
111
|
+
onCheckedChange={onSelect}
|
|
140
112
|
>
|
|
141
113
|
<Stack gap="xs">
|
|
142
|
-
<Text
|
|
114
|
+
<Text>{option.label}</Text>
|
|
143
115
|
{option.description ? (
|
|
144
116
|
<Text emphasis="muted" variant="caption">
|
|
145
117
|
{option.description}
|
|
@@ -149,3 +121,5 @@ function RadioGroupItem<TValue extends string>({
|
|
|
149
121
|
</Radio>
|
|
150
122
|
);
|
|
151
123
|
}
|
|
124
|
+
|
|
125
|
+
const styles = StyleSheet.create({ option: { flex: 1, minWidth: 0 } });
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { useTheme } from '@ankhorage/surface';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Platform, Pressable, StyleSheet, View } from 'react-native';
|
|
4
|
+
|
|
5
|
+
import { Icon } from '../icon';
|
|
6
|
+
import { Text } from '../text';
|
|
7
|
+
import {
|
|
8
|
+
handleRadioOptionKeyDown,
|
|
9
|
+
type RadioOptionKeyboardTarget,
|
|
10
|
+
} from './handleRadioOptionKeyDown';
|
|
11
|
+
import { resolveRadioOptionColors } from './resolveRadioOptionColors';
|
|
12
|
+
import type { RadioGroupProps } from './types';
|
|
13
|
+
|
|
14
|
+
/*** Render a selectable icon radio option with one accessible radio target and a trailing check. */
|
|
15
|
+
export function RadioOptionControl<TValue extends string>(props: RadioOptionControlProps<TValue>) {
|
|
16
|
+
const { theme } = useTheme();
|
|
17
|
+
const { option, checked, disabled, readOnly, interactionPolicy, onSelect } = props;
|
|
18
|
+
const colors = resolveRadioOptionColors(theme, props);
|
|
19
|
+
const [focused, setFocused] = React.useState(false);
|
|
20
|
+
const keyboardProps =
|
|
21
|
+
Platform.OS === 'web' && !readOnly && !disabled && interactionPolicy !== 'passive'
|
|
22
|
+
? {
|
|
23
|
+
onKeyDown: (event: React.KeyboardEvent<RadioOptionKeyboardTarget>) =>
|
|
24
|
+
handleRadioOptionKeyDown(event, onSelect),
|
|
25
|
+
}
|
|
26
|
+
: {};
|
|
27
|
+
const controlStyle = {
|
|
28
|
+
flex: 1,
|
|
29
|
+
width: '100%' as const,
|
|
30
|
+
minHeight: props.size === 'l' ? 84 : 44,
|
|
31
|
+
borderWidth: checked || focused ? 2 : 1,
|
|
32
|
+
borderColor: focused ? theme.semantics.border.focus : checked ? colors.accent : colors.border,
|
|
33
|
+
borderRadius: theme.radii.l,
|
|
34
|
+
backgroundColor: colors.surface,
|
|
35
|
+
};
|
|
36
|
+
return (
|
|
37
|
+
<Pressable
|
|
38
|
+
{...keyboardProps}
|
|
39
|
+
accessibilityRole="radio"
|
|
40
|
+
accessibilityState={{ checked, disabled }}
|
|
41
|
+
aria-checked={checked}
|
|
42
|
+
aria-disabled={disabled}
|
|
43
|
+
aria-readonly={readOnly}
|
|
44
|
+
disabled={disabled}
|
|
45
|
+
onPress={readOnly || interactionPolicy === 'passive' ? undefined : onSelect}
|
|
46
|
+
onFocus={() => setFocused(true)}
|
|
47
|
+
onBlur={() => setFocused(false)}
|
|
48
|
+
testID={option.testID}
|
|
49
|
+
style={controlStyle}
|
|
50
|
+
>
|
|
51
|
+
{(state) => <RadioOptionControlBody {...props} pressed={state.pressed} />}
|
|
52
|
+
</Pressable>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/*** Arrange the icon, label and passive indicator within the native radio press target. */
|
|
57
|
+
function RadioOptionControlBody<TValue extends string>(
|
|
58
|
+
props: RadioOptionControlProps<TValue> & { pressed: boolean },
|
|
59
|
+
) {
|
|
60
|
+
const { theme } = useTheme();
|
|
61
|
+
const colors = resolveRadioOptionColors(theme, props);
|
|
62
|
+
const contentStyle = {
|
|
63
|
+
padding: props.size === 's' ? theme.spacing.s : props.size === 'm' ? 12 : theme.spacing.m,
|
|
64
|
+
gap:
|
|
65
|
+
props.layout === 'vertical' || !props.option.iconSource ? theme.spacing.s : theme.spacing.m,
|
|
66
|
+
...(!props.option.iconSource ? { flexDirection: 'row-reverse' as const } : {}),
|
|
67
|
+
opacity: props.disabled ? 0.5 : props.pressed ? 0.7 : 1,
|
|
68
|
+
};
|
|
69
|
+
return (
|
|
70
|
+
<View
|
|
71
|
+
style={[
|
|
72
|
+
styles.content,
|
|
73
|
+
props.layout === 'vertical' ? styles.vertical : styles.horizontal,
|
|
74
|
+
contentStyle,
|
|
75
|
+
]}
|
|
76
|
+
>
|
|
77
|
+
<RadioOptionControlContent {...props} />
|
|
78
|
+
{props.option.iconSource || props.checked ? (
|
|
79
|
+
<View style={props.layout === 'vertical' ? styles.corner : undefined}>
|
|
80
|
+
<RadioOptionControlIndicator
|
|
81
|
+
checked={props.checked}
|
|
82
|
+
accent={colors.accent}
|
|
83
|
+
onAccent={colors.onAccent}
|
|
84
|
+
/>
|
|
85
|
+
</View>
|
|
86
|
+
) : null}
|
|
87
|
+
</View>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
interface RadioOptionControlProps<TValue extends string> extends Pick<
|
|
92
|
+
RadioGroupProps<TValue>,
|
|
93
|
+
'color' | 'size' | 'interactionPolicy'
|
|
94
|
+
> {
|
|
95
|
+
option: RadioGroupProps<TValue>['options'][number];
|
|
96
|
+
checked: boolean;
|
|
97
|
+
disabled: boolean;
|
|
98
|
+
readOnly: boolean;
|
|
99
|
+
invalid: boolean;
|
|
100
|
+
layout: 'horizontal' | 'vertical';
|
|
101
|
+
onSelect: () => void;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/*** Keep decoration passive while allowing labels to wrap at narrow widths and large text sizes. */
|
|
105
|
+
function RadioOptionControlContent<TValue extends string>({
|
|
106
|
+
option,
|
|
107
|
+
layout,
|
|
108
|
+
size,
|
|
109
|
+
color,
|
|
110
|
+
invalid,
|
|
111
|
+
disabled,
|
|
112
|
+
}: RadioOptionControlProps<TValue>) {
|
|
113
|
+
const { theme } = useTheme();
|
|
114
|
+
const colors = resolveRadioOptionColors(theme, { color, invalid, disabled });
|
|
115
|
+
return (
|
|
116
|
+
<>
|
|
117
|
+
{option.iconSource ? (
|
|
118
|
+
<View accessibilityElementsHidden importantForAccessibility="no-hide-descendants">
|
|
119
|
+
<Icon source={option.iconSource} size={size === 'l' ? 36 : 28} color={colors.accent} />
|
|
120
|
+
</View>
|
|
121
|
+
) : null}
|
|
122
|
+
<View style={layout === 'horizontal' ? styles.label : styles.centerLabel}>
|
|
123
|
+
<Text
|
|
124
|
+
variant={size === 'l' ? 'body' : 'bodySmall'}
|
|
125
|
+
weight="semiBold"
|
|
126
|
+
align={layout === 'vertical' || !option.iconSource ? 'center' : 'left'}
|
|
127
|
+
>
|
|
128
|
+
{option.label}
|
|
129
|
+
</Text>
|
|
130
|
+
{option.description ? (
|
|
131
|
+
<Text
|
|
132
|
+
emphasis="muted"
|
|
133
|
+
variant="bodySmall"
|
|
134
|
+
align={layout === 'vertical' || !option.iconSource ? 'center' : 'left'}
|
|
135
|
+
>
|
|
136
|
+
{option.description}
|
|
137
|
+
</Text>
|
|
138
|
+
) : null}
|
|
139
|
+
</View>
|
|
140
|
+
</>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*** Draw a passive check using themed geometry without requiring an application media asset. */
|
|
145
|
+
function RadioOptionControlIndicator({
|
|
146
|
+
checked,
|
|
147
|
+
accent,
|
|
148
|
+
onAccent,
|
|
149
|
+
}: {
|
|
150
|
+
checked: boolean;
|
|
151
|
+
accent: string;
|
|
152
|
+
onAccent: string;
|
|
153
|
+
}) {
|
|
154
|
+
const indicatorStyle = { backgroundColor: checked ? accent : 'transparent' };
|
|
155
|
+
return (
|
|
156
|
+
<View
|
|
157
|
+
accessibilityElementsHidden
|
|
158
|
+
importantForAccessibility="no-hide-descendants"
|
|
159
|
+
style={[styles.indicator, indicatorStyle]}
|
|
160
|
+
>
|
|
161
|
+
{checked ? <View style={[styles.check, { borderColor: onAccent }]} /> : null}
|
|
162
|
+
</View>
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const styles = StyleSheet.create({
|
|
167
|
+
content: { gap: 16, flex: 1, minWidth: 0 },
|
|
168
|
+
horizontal: { flexDirection: 'row', alignItems: 'center' },
|
|
169
|
+
vertical: {
|
|
170
|
+
flexDirection: 'column',
|
|
171
|
+
alignItems: 'center',
|
|
172
|
+
justifyContent: 'center',
|
|
173
|
+
paddingTop: 24,
|
|
174
|
+
},
|
|
175
|
+
label: { flex: 1, minWidth: 0, gap: 4 },
|
|
176
|
+
centerLabel: { alignSelf: 'stretch', gap: 4 },
|
|
177
|
+
corner: { position: 'absolute', right: 8, top: 8 },
|
|
178
|
+
indicator: {
|
|
179
|
+
width: 24,
|
|
180
|
+
height: 24,
|
|
181
|
+
borderRadius: 12,
|
|
182
|
+
alignItems: 'center',
|
|
183
|
+
justifyContent: 'center',
|
|
184
|
+
},
|
|
185
|
+
check: {
|
|
186
|
+
width: 7,
|
|
187
|
+
height: 12,
|
|
188
|
+
borderRightWidth: 2.5,
|
|
189
|
+
borderBottomWidth: 2.5,
|
|
190
|
+
transform: [{ rotate: '45deg' }, { translateY: -2 }],
|
|
191
|
+
},
|
|
192
|
+
});
|