@ankhorage/zora 2.8.6 → 2.9.0

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