@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.
Files changed (185) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +1 -1
  3. package/dist/components/radio/RadioGroup.d.ts +1 -3
  4. package/dist/components/radio/RadioGroup.d.ts.map +1 -1
  5. package/dist/components/radio/RadioGroup.js +52 -40
  6. package/dist/components/radio/RadioGroup.js.map +1 -1
  7. package/dist/components/radio/RadioOptionControl.d.ts +15 -0
  8. package/dist/components/radio/RadioOptionControl.d.ts.map +1 -0
  9. package/dist/components/radio/RadioOptionControl.js +105 -0
  10. package/dist/components/radio/RadioOptionControl.js.map +1 -0
  11. package/dist/components/radio/handleRadioOptionKeyDown.d.ts +13 -0
  12. package/dist/components/radio/handleRadioOptionKeyDown.d.ts.map +1 -0
  13. package/dist/components/radio/handleRadioOptionKeyDown.js +22 -0
  14. package/dist/components/radio/handleRadioOptionKeyDown.js.map +1 -0
  15. package/dist/components/radio/meta.d.ts +38 -3
  16. package/dist/components/radio/meta.d.ts.map +1 -1
  17. package/dist/components/radio/meta.js +28 -3
  18. package/dist/components/radio/meta.js.map +1 -1
  19. package/dist/components/radio/resolveRadioOptionColors.d.ts +10 -0
  20. package/dist/components/radio/resolveRadioOptionColors.d.ts.map +1 -0
  21. package/dist/components/radio/resolveRadioOptionColors.js +27 -0
  22. package/dist/components/radio/resolveRadioOptionColors.js.map +1 -0
  23. package/dist/components/radio/types.d.ts +12 -2
  24. package/dist/components/radio/types.d.ts.map +1 -1
  25. package/dist/components/radio/types.js.map +1 -1
  26. package/dist/constants/keyboard.d.ts +3 -0
  27. package/dist/constants/keyboard.d.ts.map +1 -0
  28. package/dist/constants/keyboard.js +8 -0
  29. package/dist/constants/keyboard.js.map +1 -0
  30. package/dist/index.d.ts +0 -12
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +0 -6
  33. package/dist/index.js.map +1 -1
  34. package/dist/metadata/componentMeta.d.ts.map +1 -1
  35. package/dist/metadata/componentMeta.js +0 -12
  36. package/dist/metadata/componentMeta.js.map +1 -1
  37. package/dist/registry.d.ts.map +1 -1
  38. package/dist/registry.js +0 -12
  39. package/dist/registry.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/audit.test.ts +0 -29
  42. package/src/components/radio/RadioGroup.test.ts +13 -9
  43. package/src/components/radio/RadioGroup.tsx +85 -111
  44. package/src/components/radio/RadioOptionControl.tsx +192 -0
  45. package/src/components/radio/handleRadioOptionKeyDown.test.ts +47 -0
  46. package/src/components/radio/handleRadioOptionKeyDown.ts +37 -0
  47. package/src/components/radio/meta.ts +28 -3
  48. package/src/components/radio/resolveRadioOptionColors.test.ts +29 -0
  49. package/src/components/radio/resolveRadioOptionColors.ts +37 -0
  50. package/src/components/radio/types.ts +10 -2
  51. package/src/constants/keyboard.ts +7 -0
  52. package/src/index.ts +0 -23
  53. package/src/interactionPolicy.test.ts +0 -17
  54. package/src/metadata/componentMeta.test.ts +1 -0
  55. package/src/metadata/componentMeta.ts +0 -12
  56. package/src/registry.ts +0 -12
  57. package/src/showcaseCoverage.test.ts +0 -6
  58. package/src/theme/themeScopeStructure.test.ts +0 -4
  59. package/dist/components/drawer/Drawer.d.ts +0 -7
  60. package/dist/components/drawer/Drawer.d.ts.map +0 -1
  61. package/dist/components/drawer/Drawer.js +0 -36
  62. package/dist/components/drawer/Drawer.js.map +0 -1
  63. package/dist/components/drawer/index.d.ts +0 -3
  64. package/dist/components/drawer/index.d.ts.map +0 -1
  65. package/dist/components/drawer/index.js +0 -2
  66. package/dist/components/drawer/index.js.map +0 -1
  67. package/dist/components/drawer/meta.d.ts +0 -9
  68. package/dist/components/drawer/meta.d.ts.map +0 -1
  69. package/dist/components/drawer/meta.js +0 -9
  70. package/dist/components/drawer/meta.js.map +0 -1
  71. package/dist/components/drawer/types.d.ts +0 -10
  72. package/dist/components/drawer/types.d.ts.map +0 -1
  73. package/dist/components/drawer/types.js +0 -2
  74. package/dist/components/drawer/types.js.map +0 -1
  75. package/dist/components/navigation-item/NavigationItem.d.ts +0 -7
  76. package/dist/components/navigation-item/NavigationItem.d.ts.map +0 -1
  77. package/dist/components/navigation-item/NavigationItem.js +0 -21
  78. package/dist/components/navigation-item/NavigationItem.js.map +0 -1
  79. package/dist/components/navigation-item/index.d.ts +0 -3
  80. package/dist/components/navigation-item/index.d.ts.map +0 -1
  81. package/dist/components/navigation-item/index.js +0 -2
  82. package/dist/components/navigation-item/index.js.map +0 -1
  83. package/dist/components/navigation-item/meta.d.ts +0 -9
  84. package/dist/components/navigation-item/meta.d.ts.map +0 -1
  85. package/dist/components/navigation-item/meta.js +0 -9
  86. package/dist/components/navigation-item/meta.js.map +0 -1
  87. package/dist/components/navigation-item/types.d.ts +0 -23
  88. package/dist/components/navigation-item/types.d.ts.map +0 -1
  89. package/dist/components/navigation-item/types.js +0 -2
  90. package/dist/components/navigation-item/types.js.map +0 -1
  91. package/dist/components/navigation-list/NavigationList.d.ts +0 -7
  92. package/dist/components/navigation-list/NavigationList.d.ts.map +0 -1
  93. package/dist/components/navigation-list/NavigationList.js +0 -29
  94. package/dist/components/navigation-list/NavigationList.js.map +0 -1
  95. package/dist/components/navigation-list/index.d.ts +0 -3
  96. package/dist/components/navigation-list/index.d.ts.map +0 -1
  97. package/dist/components/navigation-list/index.js +0 -2
  98. package/dist/components/navigation-list/index.js.map +0 -1
  99. package/dist/components/navigation-list/meta.d.ts +0 -9
  100. package/dist/components/navigation-list/meta.d.ts.map +0 -1
  101. package/dist/components/navigation-list/meta.js +0 -9
  102. package/dist/components/navigation-list/meta.js.map +0 -1
  103. package/dist/components/navigation-list/types.d.ts +0 -15
  104. package/dist/components/navigation-list/types.d.ts.map +0 -1
  105. package/dist/components/navigation-list/types.js +0 -2
  106. package/dist/components/navigation-list/types.js.map +0 -1
  107. package/dist/internal/resolveZoraNavigationItems.d.ts +0 -65
  108. package/dist/internal/resolveZoraNavigationItems.d.ts.map +0 -1
  109. package/dist/internal/resolveZoraNavigationItems.js +0 -56
  110. package/dist/internal/resolveZoraNavigationItems.js.map +0 -1
  111. package/dist/patterns/responsive-panel/ResponsivePanel.d.ts +0 -16
  112. package/dist/patterns/responsive-panel/ResponsivePanel.d.ts.map +0 -1
  113. package/dist/patterns/responsive-panel/ResponsivePanel.js +0 -101
  114. package/dist/patterns/responsive-panel/ResponsivePanel.js.map +0 -1
  115. package/dist/patterns/responsive-panel/index.d.ts +0 -3
  116. package/dist/patterns/responsive-panel/index.d.ts.map +0 -1
  117. package/dist/patterns/responsive-panel/index.js +0 -3
  118. package/dist/patterns/responsive-panel/index.js.map +0 -1
  119. package/dist/patterns/responsive-panel/meta.d.ts +0 -9
  120. package/dist/patterns/responsive-panel/meta.d.ts.map +0 -1
  121. package/dist/patterns/responsive-panel/meta.js +0 -9
  122. package/dist/patterns/responsive-panel/meta.js.map +0 -1
  123. package/dist/patterns/responsive-panel/types.d.ts +0 -23
  124. package/dist/patterns/responsive-panel/types.d.ts.map +0 -1
  125. package/dist/patterns/responsive-panel/types.js +0 -2
  126. package/dist/patterns/responsive-panel/types.js.map +0 -1
  127. package/dist/patterns/zora-drawer-content/ZoraDrawerContent.d.ts +0 -9
  128. package/dist/patterns/zora-drawer-content/ZoraDrawerContent.d.ts.map +0 -1
  129. package/dist/patterns/zora-drawer-content/ZoraDrawerContent.js +0 -31
  130. package/dist/patterns/zora-drawer-content/ZoraDrawerContent.js.map +0 -1
  131. package/dist/patterns/zora-drawer-content/index.d.ts +0 -3
  132. package/dist/patterns/zora-drawer-content/index.d.ts.map +0 -1
  133. package/dist/patterns/zora-drawer-content/index.js +0 -2
  134. package/dist/patterns/zora-drawer-content/index.js.map +0 -1
  135. package/dist/patterns/zora-drawer-content/meta.d.ts +0 -9
  136. package/dist/patterns/zora-drawer-content/meta.d.ts.map +0 -1
  137. package/dist/patterns/zora-drawer-content/meta.js +0 -9
  138. package/dist/patterns/zora-drawer-content/meta.js.map +0 -1
  139. package/dist/patterns/zora-drawer-content/types.d.ts +0 -15
  140. package/dist/patterns/zora-drawer-content/types.d.ts.map +0 -1
  141. package/dist/patterns/zora-drawer-content/types.js +0 -2
  142. package/dist/patterns/zora-drawer-content/types.js.map +0 -1
  143. package/dist/patterns/zora-tab-bar/ZoraTabBar.d.ts +0 -9
  144. package/dist/patterns/zora-tab-bar/ZoraTabBar.d.ts.map +0 -1
  145. package/dist/patterns/zora-tab-bar/ZoraTabBar.js +0 -89
  146. package/dist/patterns/zora-tab-bar/ZoraTabBar.js.map +0 -1
  147. package/dist/patterns/zora-tab-bar/index.d.ts +0 -3
  148. package/dist/patterns/zora-tab-bar/index.d.ts.map +0 -1
  149. package/dist/patterns/zora-tab-bar/index.js +0 -2
  150. package/dist/patterns/zora-tab-bar/index.js.map +0 -1
  151. package/dist/patterns/zora-tab-bar/meta.d.ts +0 -9
  152. package/dist/patterns/zora-tab-bar/meta.d.ts.map +0 -1
  153. package/dist/patterns/zora-tab-bar/meta.js +0 -9
  154. package/dist/patterns/zora-tab-bar/meta.js.map +0 -1
  155. package/dist/patterns/zora-tab-bar/types.d.ts +0 -19
  156. package/dist/patterns/zora-tab-bar/types.d.ts.map +0 -1
  157. package/dist/patterns/zora-tab-bar/types.js +0 -2
  158. package/dist/patterns/zora-tab-bar/types.js.map +0 -1
  159. package/src/components/drawer/Drawer.tsx +0 -59
  160. package/src/components/drawer/index.ts +0 -2
  161. package/src/components/drawer/meta.ts +0 -10
  162. package/src/components/drawer/types.ts +0 -17
  163. package/src/components/navigation-item/NavigationItem.tsx +0 -41
  164. package/src/components/navigation-item/index.ts +0 -6
  165. package/src/components/navigation-item/meta.ts +0 -10
  166. package/src/components/navigation-item/types.ts +0 -26
  167. package/src/components/navigation-list/NavigationList.tsx +0 -68
  168. package/src/components/navigation-list/index.ts +0 -2
  169. package/src/components/navigation-list/meta.ts +0 -10
  170. package/src/components/navigation-list/types.ts +0 -17
  171. package/src/internal/resolveZoraNavigationItems.test.ts +0 -174
  172. package/src/internal/resolveZoraNavigationItems.ts +0 -157
  173. package/src/navigationExports.test.ts +0 -15
  174. package/src/patterns/responsive-panel/ResponsivePanel.tsx +0 -172
  175. package/src/patterns/responsive-panel/index.ts +0 -2
  176. package/src/patterns/responsive-panel/meta.ts +0 -10
  177. package/src/patterns/responsive-panel/types.ts +0 -25
  178. package/src/patterns/zora-drawer-content/ZoraDrawerContent.tsx +0 -60
  179. package/src/patterns/zora-drawer-content/index.ts +0 -2
  180. package/src/patterns/zora-drawer-content/meta.ts +0 -10
  181. package/src/patterns/zora-drawer-content/types.ts +0 -20
  182. package/src/patterns/zora-tab-bar/ZoraTabBar.tsx +0 -157
  183. package/src/patterns/zora-tab-bar/index.ts +0 -2
  184. package/src/patterns/zora-tab-bar/meta.ts +0 -10
  185. 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
@@ -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.4.1",
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('card presentation stays on the RadioGroup and Surface Radio semantic path', async () => {
23
- const source = await Bun.file('src/components/radio/RadioGroup.tsx').text();
24
-
25
- expect(source).toContain('accessibilityRole="radiogroup"');
26
- expect(source).toContain('checked={value === option.value}');
27
- expect(source).toContain('<Radio');
28
- expect(source).toContain("const isCard = presentation === 'card';");
29
- expect(source).not.toContain('<Button');
30
- expect(source).not.toContain('SelectableItem');
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, useTheme } from '@ankhorage/surface';
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 { RadioGroupOption, RadioGroupProps } from './types';
11
+ import type { RadioGroupProps } from './types';
11
12
 
12
- /***
13
- * Resolves the themed radio-group presentation within the active ZORA scope.
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
- value,
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 isHorizontal = orientation === 'horizontal';
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({ gap, color, size, themeFields });
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={isHorizontal ? 'row' : 'column'}
47
- gap={recipe.gap}
48
- wrap={isHorizontal ? 'wrap' : 'nowrap'}
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
- * Renders a group of radio options for selecting a single value.
73
- */
74
- export const RadioGroup = withZoraThemeScope(RadioGroupInner);
75
-
76
- /***
77
- * Renders one option through the single Surface Radio interaction boundary.
78
- */
79
- function RadioGroupItem<TValue extends string>({
80
- option,
81
- checked,
82
- disabled,
83
- invalid,
84
- readOnly,
85
- size,
86
- color,
87
- orientation,
88
- presentation,
89
- onSelect,
90
- interactionPolicy,
91
- }: {
92
- option: RadioGroupOption<TValue>;
93
- checked: boolean;
94
- disabled: boolean;
95
- invalid: boolean;
96
- readOnly: boolean;
97
- size: NonNullable<RadioGroupProps<TValue>['size']>;
98
- color: NonNullable<RadioGroupProps<TValue>['color']>;
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={disabled}
113
- invalid={invalid}
104
+ disabled={inactive}
114
105
  readOnly={readOnly}
115
- size={size}
106
+ invalid={invalid}
107
+ interactionPolicy={interactionPolicy}
116
108
  color={color}
109
+ size={size}
117
110
  testID={option.testID}
118
- bg={
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 weight={isCard ? 'semiBold' : undefined}>{option.label}</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
+ });