@ankhorage/zora 25.6.2 → 25.8.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 (295) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +1 -1
  3. package/dist/capabilities/index.js +13 -1
  4. package/dist/capabilities/index.js.map +5 -4
  5. package/dist/features/grid-interactions/adapters/inbound/GridInteractions.d.ts +5 -0
  6. package/dist/features/grid-interactions/adapters/inbound/GridInteractions.d.ts.map +1 -0
  7. package/dist/features/grid-interactions/adapters/inbound/GridInteractions.js +40 -0
  8. package/dist/features/grid-interactions/adapters/inbound/GridInteractions.js.map +1 -0
  9. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.d.ts +2 -0
  10. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.d.ts.map +1 -0
  11. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.js +2 -0
  12. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.js.map +1 -0
  13. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.native.d.ts +11 -0
  14. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.native.d.ts.map +1 -0
  15. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.native.js +5 -0
  16. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.native.js.map +1 -0
  17. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.web.d.ts +11 -0
  18. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.web.d.ts.map +1 -0
  19. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.web.js +20 -0
  20. package/dist/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.web.js.map +1 -0
  21. package/dist/features/grid-interactions/adapters/inbound/createGridInteractionsPointerQueue.d.ts +17 -0
  22. package/dist/features/grid-interactions/adapters/inbound/createGridInteractionsPointerQueue.d.ts.map +1 -0
  23. package/dist/features/grid-interactions/adapters/inbound/createGridInteractionsPointerQueue.js +76 -0
  24. package/dist/features/grid-interactions/adapters/inbound/createGridInteractionsPointerQueue.js.map +1 -0
  25. package/dist/features/grid-interactions/adapters/inbound/resolveGridInteractionPointer.d.ts +21 -0
  26. package/dist/features/grid-interactions/adapters/inbound/resolveGridInteractionPointer.d.ts.map +1 -0
  27. package/dist/features/grid-interactions/adapters/inbound/resolveGridInteractionPointer.js +20 -0
  28. package/dist/features/grid-interactions/adapters/inbound/resolveGridInteractionPointer.js.map +1 -0
  29. package/dist/features/grid-interactions/application/createGridInteractionsController.d.ts +4 -0
  30. package/dist/features/grid-interactions/application/createGridInteractionsController.d.ts.map +1 -0
  31. package/dist/features/grid-interactions/application/createGridInteractionsController.js +191 -0
  32. package/dist/features/grid-interactions/application/createGridInteractionsController.js.map +1 -0
  33. package/dist/features/grid-interactions/meta.d.ts +11 -0
  34. package/dist/features/grid-interactions/meta.d.ts.map +1 -0
  35. package/dist/features/grid-interactions/meta.js +11 -0
  36. package/dist/features/grid-interactions/meta.js.map +1 -0
  37. package/dist/features/grid-interactions/public.d.ts +4 -0
  38. package/dist/features/grid-interactions/public.d.ts.map +1 -0
  39. package/dist/features/grid-interactions/public.js +3 -0
  40. package/dist/features/grid-interactions/public.js.map +1 -0
  41. package/dist/features/matrix-grid/adapters/inbound/MatrixGrid.d.ts.map +1 -1
  42. package/dist/features/matrix-grid/adapters/inbound/MatrixGrid.js +73 -19
  43. package/dist/features/matrix-grid/adapters/inbound/MatrixGrid.js.map +1 -1
  44. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.d.ts +9 -0
  45. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.d.ts.map +1 -0
  46. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.js +5 -0
  47. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.js.map +1 -0
  48. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.native.d.ts +9 -0
  49. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.native.d.ts.map +1 -0
  50. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.native.js +5 -0
  51. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.native.js.map +1 -0
  52. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.web.d.ts +9 -0
  53. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.web.d.ts.map +1 -0
  54. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.web.js +28 -0
  55. package/dist/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.web.js.map +1 -0
  56. package/dist/features/matrix-grid/adapters/inbound/useMatrixGridKeyboardFocus.d.ts +14 -0
  57. package/dist/features/matrix-grid/adapters/inbound/useMatrixGridKeyboardFocus.d.ts.map +1 -0
  58. package/dist/features/matrix-grid/adapters/inbound/useMatrixGridKeyboardFocus.js +50 -0
  59. package/dist/features/matrix-grid/adapters/inbound/useMatrixGridKeyboardFocus.js.map +1 -0
  60. package/dist/features/matrix-grid/application/createMatrixGridSparseIndex.d.ts +18 -0
  61. package/dist/features/matrix-grid/application/createMatrixGridSparseIndex.d.ts.map +1 -0
  62. package/dist/features/matrix-grid/application/createMatrixGridSparseIndex.js +56 -0
  63. package/dist/features/matrix-grid/application/createMatrixGridSparseIndex.js.map +1 -0
  64. package/dist/features/matrix-grid/application/getMatrixGridNextFocusId.d.ts +4 -0
  65. package/dist/features/matrix-grid/application/getMatrixGridNextFocusId.d.ts.map +1 -0
  66. package/dist/features/matrix-grid/application/getMatrixGridNextFocusId.js +65 -0
  67. package/dist/features/matrix-grid/application/getMatrixGridNextFocusId.js.map +1 -0
  68. package/dist/features/matrix-grid/application/resolveMatrixGridSelection.d.ts +8 -1
  69. package/dist/features/matrix-grid/application/resolveMatrixGridSelection.d.ts.map +1 -1
  70. package/dist/features/matrix-grid/application/resolveMatrixGridSelection.js +15 -4
  71. package/dist/features/matrix-grid/application/resolveMatrixGridSelection.js.map +1 -1
  72. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.d.ts.map +1 -1
  73. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.js +2 -0
  74. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.js.map +1 -1
  75. package/dist/features/registry/componentMeta.d.ts.map +1 -1
  76. package/dist/features/registry/componentMeta.js +2 -0
  77. package/dist/features/registry/componentMeta.js.map +1 -1
  78. package/dist/index.d.ts +1 -0
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +1 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/types/grid-interactions.d.ts +58 -0
  83. package/dist/types/grid-interactions.d.ts.map +1 -0
  84. package/dist/types/grid-interactions.js +2 -0
  85. package/dist/types/grid-interactions.js.map +1 -0
  86. package/dist/types/matrix-grid.d.ts +2 -0
  87. package/dist/types/matrix-grid.d.ts.map +1 -1
  88. package/dist/types/matrix-grid.js.map +1 -1
  89. package/package.json +5 -5
  90. package/src/features/grid-interactions/adapters/inbound/GridInteractions.test.tsx +143 -0
  91. package/src/features/grid-interactions/adapters/inbound/GridInteractions.tsx +79 -0
  92. package/src/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.native.tsx +14 -0
  93. package/src/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.tsx +1 -0
  94. package/src/features/grid-interactions/adapters/inbound/GridInteractionsKeyboardProxy.web.tsx +41 -0
  95. package/src/features/grid-interactions/adapters/inbound/createGridInteractionsPointerQueue.test.ts +98 -0
  96. package/src/features/grid-interactions/adapters/inbound/createGridInteractionsPointerQueue.ts +94 -0
  97. package/src/features/grid-interactions/adapters/inbound/resolveGridInteractionPointer.test.ts +33 -0
  98. package/src/features/grid-interactions/adapters/inbound/resolveGridInteractionPointer.ts +45 -0
  99. package/src/features/grid-interactions/application/createGridInteractionsController.test.ts +115 -0
  100. package/src/features/grid-interactions/application/createGridInteractionsController.ts +231 -0
  101. package/src/features/grid-interactions/meta.ts +12 -0
  102. package/src/features/grid-interactions/public.ts +11 -0
  103. package/src/features/matrix-grid/adapters/inbound/MatrixGrid.test.tsx +280 -2
  104. package/src/features/matrix-grid/adapters/inbound/MatrixGrid.tsx +121 -31
  105. package/src/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.native.tsx +11 -0
  106. package/src/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.tsx +11 -0
  107. package/src/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.web.tsx +43 -0
  108. package/src/features/matrix-grid/adapters/inbound/useMatrixGridKeyboardFocus.ts +70 -0
  109. package/src/features/matrix-grid/application/createMatrixGridSparseIndex.test.ts +35 -0
  110. package/src/features/matrix-grid/application/createMatrixGridSparseIndex.ts +105 -0
  111. package/src/features/matrix-grid/application/getMatrixGridNextFocusId.test.ts +93 -0
  112. package/src/features/matrix-grid/application/getMatrixGridNextFocusId.ts +112 -0
  113. package/src/features/matrix-grid/application/resolveMatrixGridSelection.test.ts +63 -2
  114. package/src/features/matrix-grid/application/resolveMatrixGridSelection.ts +27 -4
  115. package/src/features/registry/ZORA_COMPONENT_REGISTRY.ts +2 -0
  116. package/src/features/registry/componentMeta.ts +2 -0
  117. package/src/index.ts +11 -0
  118. package/src/types/grid-interactions.ts +72 -0
  119. package/src/types/matrix-grid.ts +2 -0
  120. package/web-dist/chunks/{Accordion-5g05kfmx.js → Accordion-0q2wzjdd.js} +4 -4
  121. package/web-dist/chunks/{Accordion-b96evb46.js → Accordion-1fsrnq73.js} +1 -1
  122. package/web-dist/chunks/{Accordion-h3y8qev2.js → Accordion-38ts3gnn.js} +2 -2
  123. package/web-dist/chunks/{Accordion-jnc315h7.js → Accordion-8pkw32q9.js} +2 -2
  124. package/web-dist/chunks/{Accordion-h7zsx9eg.js → Accordion-9jrxktne.js} +3 -3
  125. package/web-dist/chunks/{Accordion-9w8wg9mf.js → Accordion-9rnsg9pk.js} +1 -1
  126. package/web-dist/chunks/{Accordion-4zqd7twp.js → Accordion-9ygakvwk.js} +5 -5
  127. package/web-dist/chunks/{Accordion-fhnazn3n.js → Accordion-b74j4hdt.js} +1 -1
  128. package/web-dist/chunks/{Accordion-nssr5gep.js → Accordion-c50pywj3.js} +2 -2
  129. package/web-dist/chunks/{Accordion-pvj5npzc.js → Accordion-ddrn94v3.js} +3 -3
  130. package/web-dist/chunks/{Accordion-090y18cv.js → Accordion-dk0dtyc0.js} +3 -3
  131. package/web-dist/chunks/{Accordion-59pa0677.js → Accordion-fcczvwgg.js} +0 -1
  132. package/web-dist/chunks/{Accordion-sp4k08kw.js → Accordion-geah5s4f.js} +4 -4
  133. package/web-dist/chunks/{Accordion-6rrqpb2h.js → Accordion-h4ekm5cp.js} +2 -2
  134. package/web-dist/chunks/{Accordion-3d4wkzg7.js → Accordion-hecpczme.js} +5 -5
  135. package/web-dist/chunks/{Accordion-a6551mh4.js → Accordion-hn43wt45.js} +1 -1
  136. package/web-dist/chunks/{Accordion-sw7ep29d.js → Accordion-hnx7hx55.js} +2 -2
  137. package/web-dist/chunks/{Accordion-rsvphbe4.js → Accordion-j1chy29e.js} +1 -1
  138. package/web-dist/chunks/{Accordion-ewf1zen9.js → Accordion-k9cxpg08.js} +5 -5
  139. package/web-dist/chunks/{Accordion-5df6cgyf.js → Accordion-md1g54wg.js} +1 -1
  140. package/web-dist/chunks/{Accordion-kjtcbe09.js → Accordion-p1ebrt17.js} +3 -3
  141. package/web-dist/chunks/{Accordion-qn398m1x.js → Accordion-r2g18vxa.js} +1 -1
  142. package/web-dist/chunks/{Accordion-zt9yghdz.js → Accordion-rctfgyfv.js} +4 -4
  143. package/web-dist/chunks/{Accordion-88t8fgxv.js → Accordion-rfc5mdbv.js} +1 -1
  144. package/web-dist/chunks/{Accordion-fmzxat3v.js → Accordion-sdnzqktc.js} +4 -4
  145. package/web-dist/chunks/{Accordion-v0grdh6q.js → Accordion-sq7ya2ye.js} +2 -2
  146. package/web-dist/chunks/{Accordion-ejx5gcf9.js → Accordion-t5scffdr.js} +9 -9
  147. package/web-dist/chunks/{Accordion-sy1cc5my.js → Accordion-ts788t7b.js} +3 -3
  148. package/web-dist/chunks/{Accordion-4s68t3h7.js → Accordion-v3rzy273.js} +6 -6
  149. package/web-dist/chunks/{Accordion-7tjz25jh.js → Accordion-vbzjq3z8.js} +1 -1
  150. package/web-dist/chunks/{Accordion-jh72azm2.js → Accordion-vg337250.js} +2 -2
  151. package/web-dist/chunks/{Accordion-42jfy1a1.js → Accordion-vj1m2wck.js} +1 -1
  152. package/web-dist/chunks/{Accordion-tqpsmdrk.js → Accordion-vxg5sw01.js} +4 -4
  153. package/web-dist/chunks/{Accordion-61ntvh14.js → Accordion-w59y0jdf.js} +4 -4
  154. package/web-dist/chunks/{Accordion-fjxcn6g9.js → Accordion-wcmrasqx.js} +8 -8
  155. package/web-dist/chunks/{Accordion-r1cj2w9e.js → Accordion-wpk8dxqp.js} +3 -3
  156. package/web-dist/chunks/{Accordion-w6qedeba.js → Accordion-x055n3b3.js} +1 -1
  157. package/web-dist/chunks/{Accordion-dbf93gxh.js → Accordion-xcm1qc39.js} +1 -1
  158. package/web-dist/chunks/{Accordion-7kq500r1.js → Accordion-xgxxg1hz.js} +1 -1
  159. package/web-dist/chunks/{Accordion-a4cma5b6.js → Accordion-y3083394.js} +3 -3
  160. package/web-dist/chunks/{Accordion-40tenzcg.js → Accordion-yexfbrzg.js} +4 -4
  161. package/web-dist/chunks/{Accordion-2r0gqk3x.js → Accordion-ztw7zp6v.js} +5 -5
  162. package/web-dist/chunks/{Accordion-bz04casa.js → Accordion-zypyr9xw.js} +211 -6
  163. package/web-dist/components/accordion/Accordion.js +5 -5
  164. package/web-dist/components/accordion-item/AccordionItem.js +5 -5
  165. package/web-dist/components/activity-indicator/ActivityIndicator.js +1 -1
  166. package/web-dist/components/app-bar/AppBar.js +7 -7
  167. package/web-dist/components/app-header/AppHeader.js +7 -7
  168. package/web-dist/components/app-shell/AppShell.js +2 -2
  169. package/web-dist/components/auth-screen/AuthScreen.js +10 -10
  170. package/web-dist/components/avatar/Avatar.js +5 -5
  171. package/web-dist/components/avatar-group/AvatarGroup.js +5 -5
  172. package/web-dist/components/badge/Badge.js +2 -2
  173. package/web-dist/components/barcode-scanner-view/BarcodeScannerView.js +10 -10
  174. package/web-dist/components/bottom-sheet/BottomSheet.js +3 -3
  175. package/web-dist/components/bottom-sheet-flat-list/BottomSheetFlatList.js +3 -3
  176. package/web-dist/components/bottom-sheet-scroll-view/BottomSheetScrollView.js +3 -3
  177. package/web-dist/components/bottom-sheet-section-list/BottomSheetSectionList.js +3 -3
  178. package/web-dist/components/bottom-sheet-view/BottomSheetView.js +3 -3
  179. package/web-dist/components/bottom-sheet-virtualized-list/BottomSheetVirtualizedList.js +3 -3
  180. package/web-dist/components/breadcrumbs/Breadcrumbs.js +5 -5
  181. package/web-dist/components/button/Button.js +3 -3
  182. package/web-dist/components/button-group/ButtonGroup.js +3 -3
  183. package/web-dist/components/camera-permission-view/CameraPermissionView.js +10 -10
  184. package/web-dist/components/card/Card.js +9 -9
  185. package/web-dist/components/card-back/CardBack.js +2 -2
  186. package/web-dist/components/card-hand/CardHand.js +2 -2
  187. package/web-dist/components/chat-list-item/ChatListItem.js +7 -7
  188. package/web-dist/components/checkbox/Checkbox.js +4 -4
  189. package/web-dist/components/checkbox-group/CheckboxGroup.js +4 -4
  190. package/web-dist/components/chess-board/ChessBoard.js +2 -2
  191. package/web-dist/components/chip/Chip.js +5 -5
  192. package/web-dist/components/chip-group/ChipGroup.js +5 -5
  193. package/web-dist/components/collection-editor/CollectionEditor.js +9 -9
  194. package/web-dist/components/content-rail/ContentRail.js +4 -4
  195. package/web-dist/components/data-table/DataTable.js +14 -14
  196. package/web-dist/components/date-picker/DatePicker.js +5 -5
  197. package/web-dist/components/dialog/Dialog.js +4 -4
  198. package/web-dist/components/divider/Divider.js +2 -2
  199. package/web-dist/components/empty-state/EmptyState.js +10 -10
  200. package/web-dist/components/explorer/Explorer.js +7 -7
  201. package/web-dist/components/field/Field.js +4 -4
  202. package/web-dist/components/file-explorer/FileExplorer.js +7 -7
  203. package/web-dist/components/flat-list/FlatList.js +5 -5
  204. package/web-dist/components/forgot-password-form/ForgotPasswordForm.js +10 -10
  205. package/web-dist/components/form/Form.js +6 -6
  206. package/web-dist/components/form-actions/FormActions.js +6 -6
  207. package/web-dist/components/form-error/FormError.js +6 -6
  208. package/web-dist/components/game/Game.js +3 -3
  209. package/web-dist/components/game-entity/GameEntity.js +3 -3
  210. package/web-dist/components/game-field/GameField.js +3 -3
  211. package/web-dist/components/game-input-zone/GameInputZone.js +3 -3
  212. package/web-dist/components/game-measurement-probe/GameMeasurementProbe.js +3 -3
  213. package/web-dist/components/game-overlay/GameOverlay.js +3 -3
  214. package/web-dist/components/gradient/Gradient.js +3 -3
  215. package/web-dist/components/gradient-renderer-provider/GradientRendererProvider.js +3 -3
  216. package/web-dist/components/graph-view/GraphView.js +2 -2
  217. package/web-dist/components/grid/Grid.js +2 -2
  218. package/web-dist/components/grid-interactions/GridInteractions.d.ts +3 -0
  219. package/web-dist/components/grid-interactions/GridInteractions.js +371 -0
  220. package/web-dist/components/grid-interactions/index.d.ts +1 -0
  221. package/web-dist/components/grid-interactions/index.js +2 -0
  222. package/web-dist/components/grid-line-overlay/GridLineOverlay.js +2 -2
  223. package/web-dist/components/grid-ruler/GridRuler.js +2 -2
  224. package/web-dist/components/grid-view/GridView.js +1 -1
  225. package/web-dist/components/heading/Heading.js +2 -2
  226. package/web-dist/components/hero/Hero.js +9 -9
  227. package/web-dist/components/icon/Icon.js +2 -2
  228. package/web-dist/components/icon-button/IconButton.js +3 -3
  229. package/web-dist/components/image/Image.js +4 -4
  230. package/web-dist/components/keyboard-avoiding-view/KeyboardAvoidingView.js +2 -2
  231. package/web-dist/components/list/List.js +5 -5
  232. package/web-dist/components/list-item/ListItem.js +5 -5
  233. package/web-dist/components/list-section/ListSection.js +5 -5
  234. package/web-dist/components/matrix-grid/MatrixGrid.js +296 -47
  235. package/web-dist/components/media-card/MediaCard.js +9 -9
  236. package/web-dist/components/media-explorer/MediaExplorer.js +7 -7
  237. package/web-dist/components/message-bubble/MessageBubble.js +7 -7
  238. package/web-dist/components/metric-card/MetricCard.js +9 -9
  239. package/web-dist/components/missing-element/MissingElement.js +4 -4
  240. package/web-dist/components/o-auth-provider-button/OAuthProviderButton.js +10 -10
  241. package/web-dist/components/o-auth-provider-list/OAuthProviderList.js +10 -10
  242. package/web-dist/components/opening-book/OpeningBook.js +2 -2
  243. package/web-dist/components/otp-form/OtpForm.js +10 -10
  244. package/web-dist/components/pagination/Pagination.js +4 -4
  245. package/web-dist/components/palette-item/PaletteItem.js +9 -9
  246. package/web-dist/components/playing-card/PlayingCard.js +2 -2
  247. package/web-dist/components/poker-training-table/PokerTrainingTable.js +2 -2
  248. package/web-dist/components/popover-menu/PopoverMenu.js +4 -4
  249. package/web-dist/components/post-card/PostCard.js +9 -9
  250. package/web-dist/components/product-card/ProductCard.js +9 -9
  251. package/web-dist/components/progress/Progress.js +4 -4
  252. package/web-dist/components/progress-ring/ProgressRing.js +4 -4
  253. package/web-dist/components/radio/Radio.js +5 -5
  254. package/web-dist/components/radio-group/RadioGroup.js +5 -5
  255. package/web-dist/components/rating/Rating.js +3 -3
  256. package/web-dist/components/reader/Reader.js +10 -10
  257. package/web-dist/components/scan-overlay/ScanOverlay.js +10 -10
  258. package/web-dist/components/screen/Screen.js +2 -2
  259. package/web-dist/components/screen-section/ScreenSection.js +4 -4
  260. package/web-dist/components/scroll-view/ScrollView.js +2 -2
  261. package/web-dist/components/search-input/SearchInput.js +4 -4
  262. package/web-dist/components/section-header/SectionHeader.js +4 -4
  263. package/web-dist/components/section-list/SectionList.js +5 -5
  264. package/web-dist/components/select/Select.js +4 -4
  265. package/web-dist/components/selectable-item/SelectableItem.js +2 -2
  266. package/web-dist/components/selection-provider/SelectionProvider.js +2 -2
  267. package/web-dist/components/sign-in-form/SignInForm.js +10 -10
  268. package/web-dist/components/sign-up-form/SignUpForm.js +10 -10
  269. package/web-dist/components/skeleton/Skeleton.js +12 -12
  270. package/web-dist/components/skeleton-card/SkeletonCard.js +12 -12
  271. package/web-dist/components/skeleton-list/SkeletonList.js +12 -12
  272. package/web-dist/components/skeleton-text/SkeletonText.js +12 -12
  273. package/web-dist/components/spatial-grid/SpatialGrid.js +1 -1
  274. package/web-dist/components/surface/Surface.js +2 -2
  275. package/web-dist/components/switch/Switch.js +1 -1
  276. package/web-dist/components/tab/Tab.js +2 -2
  277. package/web-dist/components/tab-list/TabList.js +2 -2
  278. package/web-dist/components/tab-panel/TabPanel.js +2 -2
  279. package/web-dist/components/tabletop-table/TabletopTable.js +2 -2
  280. package/web-dist/components/tabs/Tabs.js +2 -2
  281. package/web-dist/components/text/Text.js +2 -2
  282. package/web-dist/components/text-input/TextInput.js +4 -4
  283. package/web-dist/components/tile-grid/TileGrid.js +1 -1
  284. package/web-dist/components/time-grid/TimeGrid.js +2 -2
  285. package/web-dist/components/time-picker/TimePicker.js +5 -5
  286. package/web-dist/components/timeline/Timeline.js +4 -4
  287. package/web-dist/components/toast/Toast.js +2 -2
  288. package/web-dist/components/toast-provider/ToastProvider.js +2 -2
  289. package/web-dist/components/toolbar/Toolbar.js +9 -9
  290. package/web-dist/components/tree-item/TreeItem.js +9 -9
  291. package/web-dist/components/tree-view/TreeView.js +1 -1
  292. package/web-dist/components/uploader/Uploader.js +12 -12
  293. package/web-dist/components/view/View.js +2 -2
  294. package/web-dist/manifest.json +787 -772
  295. package/web-dist/runtime/ZoraProvider.js +3 -3
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
  import"../../chunks/Accordion-6wrr910w.js";
3
- import"../../chunks/Accordion-42jfy1a1.js";
3
+ import"../../chunks/Accordion-vj1m2wck.js";
4
4
  import {
5
5
  GridLineOverlay2,
6
6
  GridRuler2
7
- } from "../../chunks/Accordion-jh72azm2.js";
7
+ } from "../../chunks/Accordion-vg337250.js";
8
8
  import"../../chunks/Accordion-srjya6dz.js";
9
9
  import"../../chunks/Accordion-xgpzh4wq.js";
10
10
  export {
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  GridView2,
4
4
  TileGrid2
5
- } from "../../chunks/Accordion-a6551mh4.js";
5
+ } from "../../chunks/Accordion-hn43wt45.js";
6
6
  import"../../chunks/Accordion-xgpzh4wq.js";
7
7
  export {
8
8
  GridView2 as GridView,
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
  import"../../chunks/Accordion-09qs8gt1.js";
3
3
  import"../../chunks/Accordion-6wrr910w.js";
4
- import"../../chunks/Accordion-42jfy1a1.js";
4
+ import"../../chunks/Accordion-vj1m2wck.js";
5
5
  import"../../chunks/Accordion-bfzeab9x.js";
6
6
  import {
7
7
  Heading2,
8
8
  Text3
9
- } from "../../chunks/Accordion-9w8wg9mf.js";
9
+ } from "../../chunks/Accordion-9rnsg9pk.js";
10
10
  import"../../chunks/Accordion-bff0p3x4.js";
11
11
  import"../../chunks/Accordion-srjya6dz.js";
12
12
  import"../../chunks/Accordion-xgpzh4wq.js";
@@ -8,26 +8,26 @@ import"../../chunks/Accordion-nnv76yff.js";
8
8
  import"../../chunks/Accordion-wyxmd0n0.js";
9
9
  import {
10
10
  Button2
11
- } from "../../chunks/Accordion-6rrqpb2h.js";
11
+ } from "../../chunks/Accordion-h4ekm5cp.js";
12
12
  import {
13
13
  withZoraThemeScope
14
- } from "../../chunks/Accordion-42jfy1a1.js";
14
+ } from "../../chunks/Accordion-vj1m2wck.js";
15
15
  import {
16
16
  View2,
17
17
  Grid2
18
- } from "../../chunks/Accordion-7tjz25jh.js";
18
+ } from "../../chunks/Accordion-vbzjq3z8.js";
19
19
  import"../../chunks/Accordion-2nesr9cv.js";
20
20
  import {
21
21
  Card2
22
- } from "../../chunks/Accordion-fjxcn6g9.js";
22
+ } from "../../chunks/Accordion-wcmrasqx.js";
23
23
  import {
24
24
  Heading2,
25
25
  Text3
26
- } from "../../chunks/Accordion-9w8wg9mf.js";
27
- import"../../chunks/Accordion-7kq500r1.js";
28
- import"../../chunks/Accordion-b96evb46.js";
29
- import"../../chunks/Accordion-61ntvh14.js";
30
- import"../../chunks/Accordion-a4cma5b6.js";
26
+ } from "../../chunks/Accordion-9rnsg9pk.js";
27
+ import"../../chunks/Accordion-xgxxg1hz.js";
28
+ import"../../chunks/Accordion-1fsrnq73.js";
29
+ import"../../chunks/Accordion-w59y0jdf.js";
30
+ import"../../chunks/Accordion-y3083394.js";
31
31
  import"../../chunks/Accordion-eqvdv7tt.js";
32
32
  import"../../chunks/Accordion-61e19g3e.js";
33
33
  import"../../chunks/Accordion-ys214jt5.js";
@@ -2,10 +2,10 @@
2
2
  import"../../chunks/Accordion-bfzeab9x.js";
3
3
  import"../../chunks/Accordion-6wrr910w.js";
4
4
  import"../../chunks/Accordion-8f0nekwe.js";
5
- import"../../chunks/Accordion-42jfy1a1.js";
5
+ import"../../chunks/Accordion-vj1m2wck.js";
6
6
  import {
7
7
  Icon2
8
- } from "../../chunks/Accordion-b96evb46.js";
8
+ } from "../../chunks/Accordion-1fsrnq73.js";
9
9
  import"../../chunks/Accordion-fre84yaq.js";
10
10
  import"../../chunks/Accordion-xgpzh4wq.js";
11
11
  export {
@@ -10,9 +10,9 @@ import {
10
10
  Button2,
11
11
  ButtonGroup2,
12
12
  IconButton2
13
- } from "../../chunks/Accordion-6rrqpb2h.js";
14
- import"../../chunks/Accordion-42jfy1a1.js";
15
- import"../../chunks/Accordion-7tjz25jh.js";
13
+ } from "../../chunks/Accordion-h4ekm5cp.js";
14
+ import"../../chunks/Accordion-vj1m2wck.js";
15
+ import"../../chunks/Accordion-vbzjq3z8.js";
16
16
  import"../../chunks/Accordion-61e19g3e.js";
17
17
  import"../../chunks/Accordion-ys214jt5.js";
18
18
  import"../../chunks/Accordion-bff0p3x4.js";
@@ -2,14 +2,14 @@
2
2
  import"../../chunks/Accordion-6wrr910w.js";
3
3
  import {
4
4
  Image2
5
- } from "../../chunks/Accordion-a4cma5b6.js";
5
+ } from "../../chunks/Accordion-y3083394.js";
6
6
  import"../../chunks/Accordion-bfzeab9x.js";
7
7
  import"../../chunks/Accordion-8f0nekwe.js";
8
- import"../../chunks/Accordion-42jfy1a1.js";
9
- import"../../chunks/Accordion-b96evb46.js";
8
+ import"../../chunks/Accordion-vj1m2wck.js";
9
+ import"../../chunks/Accordion-1fsrnq73.js";
10
10
  import"../../chunks/Accordion-09qs8gt1.js";
11
11
  import"../../chunks/Accordion-z5a0tx18.js";
12
- import"../../chunks/Accordion-7tjz25jh.js";
12
+ import"../../chunks/Accordion-vbzjq3z8.js";
13
13
  import"../../chunks/Accordion-srjya6dz.js";
14
14
  import"../../chunks/Accordion-184r2r82.js";
15
15
  import"../../chunks/Accordion-fre84yaq.js";
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import {
3
3
  KeyboardAvoidingView2
4
- } from "../../chunks/Accordion-qn398m1x.js";
4
+ } from "../../chunks/Accordion-r2g18vxa.js";
5
5
  import"../../chunks/Accordion-6wrr910w.js";
6
- import"../../chunks/Accordion-42jfy1a1.js";
6
+ import"../../chunks/Accordion-vj1m2wck.js";
7
7
  import"../../chunks/Accordion-xgpzh4wq.js";
8
8
  export {
9
9
  KeyboardAvoidingView2 as KeyboardAvoidingView
@@ -1,21 +1,21 @@
1
1
  'use client';
2
2
  import"../../chunks/Accordion-6wrr910w.js";
3
- import"../../chunks/Accordion-42jfy1a1.js";
3
+ import"../../chunks/Accordion-vj1m2wck.js";
4
4
  import"../../chunks/Accordion-09qs8gt1.js";
5
5
  import"../../chunks/Accordion-bfzeab9x.js";
6
- import"../../chunks/Accordion-9w8wg9mf.js";
6
+ import"../../chunks/Accordion-9rnsg9pk.js";
7
7
  import"../../chunks/Accordion-z5a0tx18.js";
8
- import"../../chunks/Accordion-7tjz25jh.js";
8
+ import"../../chunks/Accordion-vbzjq3z8.js";
9
9
  import {
10
10
  FlatList2,
11
11
  ListItem2,
12
12
  List2,
13
13
  ListSection2,
14
14
  SectionList2
15
- } from "../../chunks/Accordion-5g05kfmx.js";
15
+ } from "../../chunks/Accordion-0q2wzjdd.js";
16
16
  import"../../chunks/Accordion-nnv76yff.js";
17
17
  import"../../chunks/Accordion-wyxmd0n0.js";
18
- import"../../chunks/Accordion-sy1cc5my.js";
18
+ import"../../chunks/Accordion-ts788t7b.js";
19
19
  import"../../chunks/Accordion-61e19g3e.js";
20
20
  import"../../chunks/Accordion-ys214jt5.js";
21
21
  import"../../chunks/Accordion-bff0p3x4.js";
@@ -1,21 +1,21 @@
1
1
  'use client';
2
2
  import"../../chunks/Accordion-6wrr910w.js";
3
- import"../../chunks/Accordion-42jfy1a1.js";
3
+ import"../../chunks/Accordion-vj1m2wck.js";
4
4
  import"../../chunks/Accordion-09qs8gt1.js";
5
5
  import"../../chunks/Accordion-bfzeab9x.js";
6
- import"../../chunks/Accordion-9w8wg9mf.js";
6
+ import"../../chunks/Accordion-9rnsg9pk.js";
7
7
  import"../../chunks/Accordion-z5a0tx18.js";
8
- import"../../chunks/Accordion-7tjz25jh.js";
8
+ import"../../chunks/Accordion-vbzjq3z8.js";
9
9
  import {
10
10
  FlatList2,
11
11
  ListItem2,
12
12
  List2,
13
13
  ListSection2,
14
14
  SectionList2
15
- } from "../../chunks/Accordion-5g05kfmx.js";
15
+ } from "../../chunks/Accordion-0q2wzjdd.js";
16
16
  import"../../chunks/Accordion-nnv76yff.js";
17
17
  import"../../chunks/Accordion-wyxmd0n0.js";
18
- import"../../chunks/Accordion-sy1cc5my.js";
18
+ import"../../chunks/Accordion-ts788t7b.js";
19
19
  import"../../chunks/Accordion-61e19g3e.js";
20
20
  import"../../chunks/Accordion-ys214jt5.js";
21
21
  import"../../chunks/Accordion-bff0p3x4.js";
@@ -1,21 +1,21 @@
1
1
  'use client';
2
2
  import"../../chunks/Accordion-6wrr910w.js";
3
- import"../../chunks/Accordion-42jfy1a1.js";
3
+ import"../../chunks/Accordion-vj1m2wck.js";
4
4
  import"../../chunks/Accordion-09qs8gt1.js";
5
5
  import"../../chunks/Accordion-bfzeab9x.js";
6
- import"../../chunks/Accordion-9w8wg9mf.js";
6
+ import"../../chunks/Accordion-9rnsg9pk.js";
7
7
  import"../../chunks/Accordion-z5a0tx18.js";
8
- import"../../chunks/Accordion-7tjz25jh.js";
8
+ import"../../chunks/Accordion-vbzjq3z8.js";
9
9
  import {
10
10
  FlatList2,
11
11
  ListItem2,
12
12
  List2,
13
13
  ListSection2,
14
14
  SectionList2
15
- } from "../../chunks/Accordion-5g05kfmx.js";
15
+ } from "../../chunks/Accordion-0q2wzjdd.js";
16
16
  import"../../chunks/Accordion-nnv76yff.js";
17
17
  import"../../chunks/Accordion-wyxmd0n0.js";
18
- import"../../chunks/Accordion-sy1cc5my.js";
18
+ import"../../chunks/Accordion-ts788t7b.js";
19
19
  import"../../chunks/Accordion-61e19g3e.js";
20
20
  import"../../chunks/Accordion-ys214jt5.js";
21
21
  import"../../chunks/Accordion-bff0p3x4.js";
@@ -1,31 +1,32 @@
1
1
  'use client';
2
- import"../../chunks/Accordion-09qs8gt1.js";
3
- import"../../chunks/Accordion-6wrr910w.js";
4
- import {
5
- Pressable
6
- } from "../../chunks/Accordion-nnv76yff.js";
7
2
  import {
8
3
  GridView2
9
- } from "../../chunks/Accordion-a6551mh4.js";
4
+ } from "../../chunks/Accordion-hn43wt45.js";
5
+ import"../../chunks/Accordion-09qs8gt1.js";
6
+ import"../../chunks/Accordion-6wrr910w.js";
7
+ import"../../chunks/Accordion-nnv76yff.js";
10
8
  import {
11
9
  withZoraThemeScope
12
- } from "../../chunks/Accordion-42jfy1a1.js";
13
- import"../../chunks/Accordion-sw7ep29d.js";
10
+ } from "../../chunks/Accordion-vj1m2wck.js";
11
+ import"../../chunks/Accordion-hnx7hx55.js";
14
12
  import {
15
13
  resolveSelectionEventIntent
16
- } from "../../chunks/Accordion-5df6cgyf.js";
14
+ } from "../../chunks/Accordion-md1g54wg.js";
17
15
  import {
18
16
  applySelectionIntent
19
17
  } from "../../chunks/Accordion-n4et7etk.js";
20
18
  import {
21
19
  getMatrixCellPlacement,
22
20
  getVisibleMatrixCells
23
- } from "../../chunks/Accordion-bz04casa.js";
21
+ } from "../../chunks/Accordion-zypyr9xw.js";
24
22
  import {
25
23
  useZoraTheme2
26
24
  } from "../../chunks/Accordion-srjya6dz.js";
27
25
  import"../../chunks/Accordion-184r2r82.js";
28
26
  import"../../chunks/Accordion-fre84yaq.js";
27
+ import {
28
+ isRecord
29
+ } from "../../chunks/Accordion-fcczvwgg.js";
29
30
  import {
30
31
  require_cjs
31
32
  } from "../../chunks/Accordion-xgpzh4wq.js";
@@ -35,7 +36,55 @@ import {
35
36
 
36
37
  // src/features/matrix-grid/adapters/inbound/MatrixGrid.tsx
37
38
  var import_react_native = __toESM(require_cjs(), 1);
38
- import React from "react";
39
+ import React2 from "react";
40
+
41
+ // src/features/matrix-grid/application/createMatrixGridSparseIndex.ts
42
+ function createMatrixGridSparseIndex(layout, cells) {
43
+ const rowIndexes = new Map(layout.rows.map((row, index) => [row.id, index]));
44
+ const columnIndexes = new Map(layout.columns.map((column, index) => [column.id, index]));
45
+ const entries = cells.map((cell) => createSparseEntry(cell, rowIndexes, columnIndexes));
46
+ const entriesByRow = groupEntries(entries, "columnIndex");
47
+ const entriesByColumn = groupEntries(entries, "rowIndex");
48
+ const orderedEntries = [...entries].sort(compareRowThenColumn);
49
+ return {
50
+ cellById: new Map(entries.map((entry) => [entry.id, entry.cell])),
51
+ entries,
52
+ entriesByColumn,
53
+ entriesByRow,
54
+ firstId: orderedEntries.at(0)?.id ?? null,
55
+ positionById: new Map(entries.map((entry) => [entry.id, entry]))
56
+ };
57
+ }
58
+ function createSparseEntry(cell, rowIndexes, columnIndexes) {
59
+ const rowIndex = rowIndexes.get(cell.rowId);
60
+ const columnIndex = columnIndexes.get(cell.columnId);
61
+ if (rowIndex === undefined || columnIndex === undefined) {
62
+ throw new Error(`Matrix cell ${cell.id} references an unknown row or column.`);
63
+ }
64
+ return { cell, columnIndex, id: cell.id, rowIndex };
65
+ }
66
+ function groupEntries(entries, axis) {
67
+ const groups = new Map;
68
+ for (const entry of entries) {
69
+ const groupKey = axis === "columnIndex" ? entry.rowIndex : entry.columnIndex;
70
+ const group = groups.get(groupKey) ?? [];
71
+ group.push(entry);
72
+ groups.set(groupKey, group);
73
+ }
74
+ return new Map([...groups].map(([key, group]) => [
75
+ key,
76
+ group.sort((left, right) => compareAxisThenId(left, right, axis))
77
+ ]));
78
+ }
79
+ function compareRowThenColumn(left, right) {
80
+ return left.rowIndex - right.rowIndex || left.columnIndex - right.columnIndex || left.id.localeCompare(right.id);
81
+ }
82
+ function compareAxisThenId(left, right, axis) {
83
+ return getAxisCoordinate(left, axis) - getAxisCoordinate(right, axis) || left.id.localeCompare(right.id);
84
+ }
85
+ function getAxisCoordinate(entry, axis) {
86
+ return axis === "columnIndex" ? entry.columnIndex : entry.rowIndex;
87
+ }
39
88
 
40
89
  // src/features/matrix-grid/application/resolveMatrixGridContentSize.ts
41
90
  function resolveMatrixGridContentSize(layout) {
@@ -61,12 +110,157 @@ function resolveMatrixGridContentSize(layout) {
61
110
  }
62
111
 
63
112
  // src/features/matrix-grid/application/resolveMatrixGridSelection.ts
64
- function resolveMatrixGridSelection(selectedIds, cellId, intent, mode) {
65
- return mode === "single" ? applySelectionIntent(selectedIds, cellId, "replace") : applySelectionIntent(selectedIds, cellId, intent);
113
+ function resolveMatrixGridSelection(cells, selectedIds, cellId, anchorId, intent, mode) {
114
+ if (mode === "single")
115
+ return applySelectionIntent(selectedIds, cellId, "replace");
116
+ if (intent !== "range")
117
+ return applySelectionIntent(selectedIds, cellId, intent);
118
+ const anchor = cells.find((cell) => cell.id === anchorId);
119
+ const target = cells.find((cell) => cell.id === cellId);
120
+ if (!anchor || !target)
121
+ return applySelectionIntent(selectedIds, cellId, "replace");
122
+ return cells.filter((cell) => cell.rowIndex >= Math.min(anchor.rowIndex, target.rowIndex) && cell.rowIndex <= Math.max(anchor.rowIndex, target.rowIndex) && cell.columnIndex >= Math.min(anchor.columnIndex, target.columnIndex) && cell.columnIndex <= Math.max(anchor.columnIndex, target.columnIndex)).map((cell) => cell.id);
66
123
  }
67
124
 
68
- // src/features/matrix-grid/adapters/inbound/MatrixGrid.tsx
125
+ // src/features/matrix-grid/adapters/inbound/MatrixGridKeyboardProxy.web.tsx
69
126
  import { jsx } from "react/jsx-runtime";
127
+ function MatrixGridKeyboardProxy({ children, onKeyDown }) {
128
+ return /* @__PURE__ */ jsx("div", {
129
+ onKeyDownCapture: (event) => {
130
+ if (isNestedInteractiveElement(event.target, event.currentTarget))
131
+ return;
132
+ if (onKeyDown(event))
133
+ event.preventDefault();
134
+ },
135
+ style: { display: "flex", flex: 1 },
136
+ children
137
+ });
138
+ }
139
+ function isNestedInteractiveElement(target, boundary) {
140
+ if (target === boundary || !hasClosest(target))
141
+ return false;
142
+ const interactiveElement = target.closest(interactiveSelector);
143
+ return interactiveElement !== null && interactiveElement !== getFirstElementChild(boundary);
144
+ }
145
+ function hasClosest(target) {
146
+ return "closest" in target && typeof target.closest === "function";
147
+ }
148
+ function getFirstElementChild(boundary) {
149
+ return "firstElementChild" in boundary ? boundary.firstElementChild : undefined;
150
+ }
151
+ var interactiveSelector = 'a, button, input, select, textarea, [contenteditable="true"], [role="button"], [role="checkbox"], [role="combobox"], [role="link"], [role="menuitem"], [role="option"], [role="slider"], [role="spinbutton"], [role="switch"], [role="tab"]';
152
+
153
+ // src/features/matrix-grid/adapters/inbound/useMatrixGridKeyboardFocus.ts
154
+ import React from "react";
155
+
156
+ // src/features/matrix-grid/application/getMatrixGridNextFocusId.ts
157
+ function getMatrixGridNextFocusId(index, currentId, key) {
158
+ const current = currentId === null ? undefined : index.positionById.get(currentId);
159
+ if (!current)
160
+ return index.firstId;
161
+ return resolveDirectionalCandidate(index, current, key)?.id ?? current.id;
162
+ }
163
+ function resolveDirectionalCandidate(index, current, key) {
164
+ switch (key) {
165
+ case "ArrowLeft":
166
+ return findDirectionalNeighbour(index.entriesByRow.get(current.rowIndex), current, "columnIndex", -1);
167
+ case "ArrowRight":
168
+ return findDirectionalNeighbour(index.entriesByRow.get(current.rowIndex), current, "columnIndex", 1);
169
+ case "ArrowUp":
170
+ return findDirectionalNeighbour(index.entriesByColumn.get(current.columnIndex), current, "rowIndex", -1);
171
+ case "ArrowDown":
172
+ return findDirectionalNeighbour(index.entriesByColumn.get(current.columnIndex), current, "rowIndex", 1);
173
+ default:
174
+ return;
175
+ }
176
+ }
177
+ function findDirectionalNeighbour(entries, current, axis, direction) {
178
+ if (!entries)
179
+ return;
180
+ const coordinate = getAxisCoordinate2(current, axis);
181
+ const insertionIndex = findFirstGreaterOrEqual(entries, coordinate, axis);
182
+ if (direction === -1)
183
+ return insertionIndex === 0 ? undefined : entries[insertionIndex - 1];
184
+ return entries[findFirstGreater(entries, coordinate, axis)];
185
+ }
186
+ function findFirstGreater(entries, coordinate, axis) {
187
+ let lower = 0;
188
+ let upper = entries.length;
189
+ while (lower < upper) {
190
+ const middle = Math.floor((lower + upper) / 2);
191
+ const entry = entries.at(middle);
192
+ if (entry && getAxisCoordinate2(entry, axis) <= coordinate)
193
+ lower = middle + 1;
194
+ else
195
+ upper = middle;
196
+ }
197
+ return lower;
198
+ }
199
+ function findFirstGreaterOrEqual(entries, coordinate, axis) {
200
+ let lower = 0;
201
+ let upper = entries.length;
202
+ while (lower < upper) {
203
+ const middle = Math.floor((lower + upper) / 2);
204
+ const entry = entries.at(middle);
205
+ if (entry && getAxisCoordinate2(entry, axis) < coordinate)
206
+ lower = middle + 1;
207
+ else
208
+ upper = middle;
209
+ }
210
+ return lower;
211
+ }
212
+ function getAxisCoordinate2(entry, axis) {
213
+ return axis === "columnIndex" ? entry.columnIndex : entry.rowIndex;
214
+ }
215
+
216
+ // src/features/matrix-grid/adapters/inbound/useMatrixGridKeyboardFocus.ts
217
+ function useMatrixGridKeyboardFocus(index, disabled, visibleIds, onNavigate) {
218
+ const [focusedId, setFocusedId] = React.useState(null);
219
+ const focusedRef = React.useRef(null);
220
+ const pendingFocusRef = React.useRef(null);
221
+ const cellRefs = React.useRef(new Map);
222
+ const visibleIdSet = React.useMemo(() => new Set(visibleIds), [visibleIds]);
223
+ const tabStopId = focusedId !== null && visibleIdSet.has(focusedId) ? focusedId : visibleIds.find((id) => index.positionById.has(id));
224
+ const onFocus = React.useCallback((id) => {
225
+ pendingFocusRef.current = null;
226
+ focusedRef.current = id;
227
+ setFocusedId(id);
228
+ }, []);
229
+ const registerCell = React.useCallback((id, node) => {
230
+ if (node === null) {
231
+ cellRefs.current.delete(id);
232
+ return;
233
+ }
234
+ cellRefs.current.set(id, node);
235
+ if (pendingFocusRef.current === id) {
236
+ pendingFocusRef.current = null;
237
+ node.focus();
238
+ }
239
+ }, []);
240
+ const onKeyDown = React.useCallback((id, key, shiftKey) => {
241
+ if (disabled || !["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(key)) {
242
+ return false;
243
+ }
244
+ const originId = focusedRef.current ?? id;
245
+ const nextId = getMatrixGridNextFocusId(index, originId, key);
246
+ if (nextId === null || nextId === originId)
247
+ return true;
248
+ focusedRef.current = nextId;
249
+ pendingFocusRef.current = nextId;
250
+ setFocusedId(nextId);
251
+ onNavigate(nextId, originId, shiftKey);
252
+ const mounted = cellRefs.current.get(nextId);
253
+ if (mounted) {
254
+ pendingFocusRef.current = null;
255
+ mounted.focus();
256
+ }
257
+ return true;
258
+ }, [disabled, index, onNavigate]);
259
+ return { focusedId, onFocus, onKeyDown, registerCell, tabStopId };
260
+ }
261
+
262
+ // src/features/matrix-grid/adapters/inbound/MatrixGrid.tsx
263
+ import { jsx as jsx2 } from "react/jsx-runtime";
70
264
  function MatrixGridInner({
71
265
  accessibilityLabel = "Matrix grid",
72
266
  cells,
@@ -76,6 +270,7 @@ function MatrixGridInner({
76
270
  onSelectionChange,
77
271
  onViewportChange,
78
272
  overscanPixels = 160,
273
+ readOnly = false,
79
274
  renderCell,
80
275
  selectedCellIds = [],
81
276
  selectionMode = "single",
@@ -86,37 +281,65 @@ function MatrixGridInner({
86
281
  zoomY = 1
87
282
  }) {
88
283
  const { theme } = useZoraTheme2();
89
- const contentSize = React.useMemo(() => resolveMatrixGridContentSize(layout), [layout]);
90
- const initialViewport = React.useMemo(() => ({ height, offsetX: 0, offsetY: 0, pixelsPerUnitX: zoomX, pixelsPerUnitY: zoomY, width }), [height, width, zoomX, zoomY]);
91
- const [uncontrolledViewport, setUncontrolledViewport] = React.useState(initialViewport);
284
+ const contentSize = React2.useMemo(() => resolveMatrixGridContentSize(layout), [layout]);
285
+ const initialViewport = React2.useMemo(() => ({ height, offsetX: 0, offsetY: 0, pixelsPerUnitX: zoomX, pixelsPerUnitY: zoomY, width }), [height, width, zoomX, zoomY]);
286
+ const [uncontrolledViewport, setUncontrolledViewport] = React2.useState(initialViewport);
92
287
  const viewport = controlledViewport ?? uncontrolledViewport;
93
- const visibleCells = React.useMemo(() => getVisibleMatrixCells(layout, cells, viewport, overscanPixels), [cells, layout, overscanPixels, viewport]);
94
- const visibleCellById = React.useMemo(() => new Map(visibleCells.map((cell) => [cell.id, cell])), [visibleCells]);
95
- const handleViewportChange = React.useCallback((proposal) => {
288
+ const sparseIndex = React2.useMemo(() => createMatrixGridSparseIndex(layout, cells), [cells, layout]);
289
+ const cellPlacements = React2.useMemo(() => getVisibleMatrixCells(layout, cells, viewport, overscanPixels), [cells, layout, overscanPixels, viewport]);
290
+ const [visibleIds, setVisibleIds] = React2.useState([]);
291
+ const anchorId = React2.useRef(null);
292
+ const handleViewportChange = React2.useCallback((proposal) => {
96
293
  if (controlledViewport === undefined)
97
294
  setUncontrolledViewport(proposal);
98
295
  onViewportChange?.(proposal);
99
296
  }, [controlledViewport, onViewportChange]);
100
- const activateCell = React.useCallback((cell, event) => {
101
- if (interactionPolicy === "passive")
297
+ const activateCell = React2.useCallback((cell, event) => {
298
+ if (interactionPolicy === "passive" || readOnly)
299
+ return;
300
+ const intent = isRangeSelectionEvent(event) ? "range" : resolveSelectionEventIntent(event, "pointer");
301
+ onSelectionChange?.(resolveMatrixGridSelection(sparseIndex.entries, selectedCellIds, cell.id, anchorId.current, intent, selectionMode));
302
+ if (intent !== "range")
303
+ anchorId.current = cell.id;
304
+ }, [
305
+ interactionPolicy,
306
+ onSelectionChange,
307
+ readOnly,
308
+ selectedCellIds,
309
+ selectionMode,
310
+ sparseIndex.entries
311
+ ]);
312
+ const handleKeyboardNavigation = React2.useCallback((targetId, originId, shiftKey) => {
313
+ anchorId.current ??= originId;
314
+ if (!shiftKey)
102
315
  return;
103
- const intent = resolveSelectionEventIntent(event, "pointer");
104
- onSelectionChange?.(resolveMatrixGridSelection(selectedCellIds, cell.id, intent, selectionMode));
105
- }, [interactionPolicy, onSelectionChange, selectedCellIds, selectionMode]);
106
- return /* @__PURE__ */ jsx(import_react_native.View, {
316
+ const cell = sparseIndex.cellById.get(targetId);
317
+ if (cell)
318
+ activateCell(getMatrixCellPlacement(layout, cell), { shiftKey: true });
319
+ }, [activateCell, layout, sparseIndex]);
320
+ const keyboard = useMatrixGridKeyboardFocus(sparseIndex, interactionPolicy === "passive", visibleIds, handleKeyboardNavigation);
321
+ const focusedPlacement = React2.useMemo(() => {
322
+ const focusedCell = keyboard.focusedId === null ? undefined : sparseIndex.cellById.get(keyboard.focusedId);
323
+ return focusedCell ? getMatrixCellPlacement(layout, focusedCell) : undefined;
324
+ }, [keyboard.focusedId, layout, sparseIndex.cellById]);
325
+ const gridItems = React2.useMemo(() => focusedPlacement && !cellPlacements.some((cell) => cell.id === focusedPlacement.id) ? [...cellPlacements, focusedPlacement] : cellPlacements, [cellPlacements, focusedPlacement]);
326
+ const cellById = React2.useMemo(() => new Map(gridItems.map((cell) => [cell.id, cell])), [gridItems]);
327
+ return /* @__PURE__ */ jsx2(import_react_native.View, {
107
328
  accessibilityLabel,
108
- children: /* @__PURE__ */ jsx(GridView2, {
329
+ children: /* @__PURE__ */ jsx2(GridView2, {
109
330
  contentHeight: contentSize.height,
110
331
  contentWidth: contentSize.width,
111
332
  height,
112
333
  interactionPolicy,
113
- items: visibleCells,
334
+ items: gridItems,
335
+ focusedItemId: keyboard.focusedId ?? undefined,
114
336
  overscanPixels: 0,
337
+ onVisibleItemIdsChange: setVisibleIds,
115
338
  renderItem: (item) => {
116
- const cell = visibleCellById.get(item.id);
339
+ const cell = cellById.get(item.id);
117
340
  if (!cell)
118
341
  return null;
119
- return renderMatrixCell(cell, selectedCellIds, theme.semantics.neutral.divider, theme.colors.primary, renderCell, activateCell, testID);
342
+ return renderMatrixCell(cell, selectedCellIds, theme.semantics.neutral.divider, theme.colors.primary, renderCell, activateCell, keyboard, interactionPolicy === "passive", readOnly, testID);
120
343
  },
121
344
  testID,
122
345
  viewport,
@@ -125,24 +348,50 @@ function MatrixGridInner({
125
348
  })
126
349
  });
127
350
  }
128
- function renderMatrixCell(cell, selectedCellIds, dividerColor, selectedColor, renderCell, activateCell, testID) {
351
+ function renderMatrixCell(cell, selectedCellIds, dividerColor, selectedColor, renderCell, activateCell, keyboard, passive, readOnly, testID) {
129
352
  const selected = selectedCellIds.includes(cell.id);
130
- return /* @__PURE__ */ jsx(Pressable, {
131
- accessibilityLabel: `Cell ${cell.id}`,
132
- accessibilityRole: "button",
133
- accessibilityState: { selected },
134
- style: [
135
- styles.cell,
136
- {
137
- borderColor: selected ? selectedColor : dividerColor,
138
- height: "100%",
139
- width: "100%"
140
- }
141
- ],
142
- testID: testID === undefined ? undefined : `${testID}-cell-${cell.id}`,
143
- onPress: (event) => activateCell(cell, event),
144
- children: renderCell(cell)
145
- }, cell.id);
353
+ const canInteract = keyboard.tabStopId === cell.id;
354
+ return /* @__PURE__ */ jsx2(MatrixGridKeyboardProxy, {
355
+ onKeyDown: (event) => {
356
+ if (keyboard.onKeyDown(cell.id, event.key, event.shiftKey))
357
+ return true;
358
+ if (!["Enter", " "].includes(event.key))
359
+ return false;
360
+ if (passive || readOnly)
361
+ return false;
362
+ activateCell(cell, event);
363
+ return true;
364
+ },
365
+ children: /* @__PURE__ */ jsx2(import_react_native.Pressable, {
366
+ accessibilityActions: [{ name: "activate" }],
367
+ accessibilityLabel: `Cell ${cell.id}`,
368
+ accessibilityRole: "button",
369
+ accessibilityState: { disabled: passive, selected },
370
+ disabled: passive,
371
+ focusable: import_react_native.Platform.OS !== "web" || canInteract,
372
+ style: [
373
+ styles.cell,
374
+ {
375
+ borderColor: selected || keyboard.focusedId === cell.id ? selectedColor : dividerColor,
376
+ height: "100%",
377
+ width: "100%"
378
+ }
379
+ ],
380
+ testID: testID === undefined ? undefined : `${testID}-cell-${cell.id}`,
381
+ onAccessibilityAction: () => activateCell(cell, {}),
382
+ onFocus: () => keyboard.onFocus(cell.id),
383
+ onPress: (event) => activateCell(cell, event),
384
+ ref: (node) => keyboard.registerCell(cell.id, node),
385
+ children: renderCell(cell)
386
+ }, cell.id)
387
+ });
388
+ }
389
+ function isRangeSelectionEvent(event) {
390
+ if (!isRecord(event))
391
+ return false;
392
+ if (event.shiftKey === true)
393
+ return true;
394
+ return isRecord(event.nativeEvent) && event.nativeEvent.shiftKey === true || isRecord(event.originalEvent) && event.originalEvent.shiftKey === true;
146
395
  }
147
396
  var styles = import_react_native.StyleSheet.create({
148
397
  cell: { borderWidth: 1, height: "100%", overflow: "hidden", width: "100%" }