@ankhorage/zora 22.1.3 → 23.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/dist/features/graph-view/adapters/inbound/web-artifact/GraphNodeOverlay.d.ts +2 -1
  4. package/dist/features/graph-view/adapters/inbound/web-artifact/GraphNodeOverlay.d.ts.map +1 -1
  5. package/dist/features/graph-view/adapters/inbound/web-artifact/GraphNodeOverlay.js +2 -1
  6. package/dist/features/graph-view/adapters/inbound/web-artifact/GraphNodeOverlay.js.map +1 -1
  7. package/dist/features/graph-view/adapters/inbound/web-artifact/GraphView.d.ts.map +1 -1
  8. package/dist/features/graph-view/adapters/inbound/web-artifact/GraphView.js +1 -1
  9. package/dist/features/graph-view/adapters/inbound/web-artifact/GraphView.js.map +1 -1
  10. package/dist/features/graph-view/adapters/inbound/web-artifact/bindGraphEvents.d.ts.map +1 -1
  11. package/dist/features/graph-view/adapters/inbound/web-artifact/bindGraphEvents.js +12 -4
  12. package/dist/features/graph-view/adapters/inbound/web-artifact/bindGraphEvents.js.map +1 -1
  13. package/dist/features/graph-view/adapters/inbound/web-artifact/createGraphRuntime.d.ts +2 -1
  14. package/dist/features/graph-view/adapters/inbound/web-artifact/createGraphRuntime.d.ts.map +1 -1
  15. package/dist/features/graph-view/adapters/inbound/web-artifact/createGraphRuntime.js +3 -3
  16. package/dist/features/graph-view/adapters/inbound/web-artifact/createGraphRuntime.js.map +1 -1
  17. package/dist/features/selection/adapters/inbound/SelectableItem.d.ts +1 -5
  18. package/dist/features/selection/adapters/inbound/SelectableItem.d.ts.map +1 -1
  19. package/dist/features/selection/adapters/inbound/SelectableItem.js +30 -54
  20. package/dist/features/selection/adapters/inbound/SelectableItem.js.map +1 -1
  21. package/dist/features/selection/adapters/inbound/SelectionProvider.d.ts +2 -6
  22. package/dist/features/selection/adapters/inbound/SelectionProvider.d.ts.map +1 -1
  23. package/dist/features/selection/adapters/inbound/SelectionProvider.js +36 -32
  24. package/dist/features/selection/adapters/inbound/SelectionProvider.js.map +1 -1
  25. package/dist/features/selection/application/resolveSelectionEventIntent.d.ts +5 -0
  26. package/dist/features/selection/application/resolveSelectionEventIntent.d.ts.map +1 -0
  27. package/dist/features/selection/application/resolveSelectionEventIntent.js +49 -0
  28. package/dist/features/selection/application/resolveSelectionEventIntent.js.map +1 -0
  29. package/dist/features/selection/public.d.ts +2 -0
  30. package/dist/features/selection/public.d.ts.map +1 -1
  31. package/dist/features/selection/public.js +1 -0
  32. package/dist/features/selection/public.js.map +1 -1
  33. package/dist/features/selection/utils/resolveSelectionNextIds.d.ts +4 -5
  34. package/dist/features/selection/utils/resolveSelectionNextIds.d.ts.map +1 -1
  35. package/dist/features/selection/utils/resolveSelectionNextIds.js +6 -13
  36. package/dist/features/selection/utils/resolveSelectionNextIds.js.map +1 -1
  37. package/dist/features/tree-view/adapters/inbound/TreeItem.d.ts +3 -2
  38. package/dist/features/tree-view/adapters/inbound/TreeItem.d.ts.map +1 -1
  39. package/dist/features/tree-view/adapters/inbound/TreeItem.js +11 -4
  40. package/dist/features/tree-view/adapters/inbound/TreeItem.js.map +1 -1
  41. package/dist/features/tree-view/adapters/inbound/TreeView.d.ts.map +1 -1
  42. package/dist/features/tree-view/adapters/inbound/TreeView.js +4 -5
  43. package/dist/features/tree-view/adapters/inbound/TreeView.js.map +1 -1
  44. package/dist/features/tree-view/adapters/inbound/web-artifact/TreeItemRow.d.ts +3 -2
  45. package/dist/features/tree-view/adapters/inbound/web-artifact/TreeItemRow.d.ts.map +1 -1
  46. package/dist/features/tree-view/adapters/inbound/web-artifact/TreeItemRow.js +17 -9
  47. package/dist/features/tree-view/adapters/inbound/web-artifact/TreeItemRow.js.map +1 -1
  48. package/dist/features/tree-view/adapters/inbound/web-artifact/TreeView.d.ts +4 -3
  49. package/dist/features/tree-view/adapters/inbound/web-artifact/TreeView.d.ts.map +1 -1
  50. package/dist/features/tree-view/adapters/inbound/web-artifact/TreeView.js +8 -8
  51. package/dist/features/tree-view/adapters/inbound/web-artifact/TreeView.js.map +1 -1
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/types/graph-view.d.ts +2 -0
  56. package/dist/types/graph-view.d.ts.map +1 -1
  57. package/dist/types/graph-view.js.map +1 -1
  58. package/dist/types/selection.d.ts +3 -0
  59. package/dist/types/selection.d.ts.map +1 -1
  60. package/dist/types/selection.js.map +1 -1
  61. package/dist/types/tree-view.d.ts +3 -2
  62. package/dist/types/tree-view.d.ts.map +1 -1
  63. package/dist/types/tree-view.js.map +1 -1
  64. package/package.json +4 -4
  65. package/src/features/graph-view/adapters/inbound/web-artifact/GraphNodeOverlay.tsx +10 -2
  66. package/src/features/graph-view/adapters/inbound/web-artifact/GraphView.tsx +3 -1
  67. package/src/features/graph-view/adapters/inbound/web-artifact/bindGraphEvents.ts +22 -5
  68. package/src/features/graph-view/adapters/inbound/web-artifact/createGraphRuntime.test.ts +21 -0
  69. package/src/features/graph-view/adapters/inbound/web-artifact/createGraphRuntime.ts +10 -3
  70. package/src/features/selection/adapters/inbound/SelectableItem.tsx +33 -50
  71. package/src/features/selection/adapters/inbound/SelectionProvider.tsx +34 -35
  72. package/src/features/selection/application/resolveSelectionEventIntent.test.ts +35 -0
  73. package/src/features/selection/application/resolveSelectionEventIntent.ts +55 -0
  74. package/src/features/selection/public.ts +2 -0
  75. package/src/features/selection/utils/resolveSelectionNextIds.test.ts +1 -14
  76. package/src/features/selection/utils/resolveSelectionNextIds.ts +6 -28
  77. package/src/features/tree-view/adapters/inbound/TreeItem.tsx +25 -9
  78. package/src/features/tree-view/adapters/inbound/TreeView.tsx +4 -6
  79. package/src/features/tree-view/adapters/inbound/web-artifact/TreeItemRow.tsx +26 -8
  80. package/src/features/tree-view/adapters/inbound/web-artifact/TreeView.test.tsx +77 -7
  81. package/src/features/tree-view/adapters/inbound/web-artifact/TreeView.tsx +11 -9
  82. package/src/index.ts +1 -0
  83. package/src/types/graph-view.ts +2 -0
  84. package/src/types/selection.ts +3 -0
  85. package/src/types/tree-view.ts +3 -2
  86. package/web-dist/chunks/{Accordion-j2aw3d5b.js → Accordion-01e56hb5.js} +1 -1
  87. package/web-dist/chunks/{Accordion-emczc5rg.js → Accordion-09se459d.js} +4 -4
  88. package/web-dist/chunks/{Accordion-784f23tq.js → Accordion-14p7zanv.js} +1 -1
  89. package/web-dist/chunks/{Accordion-cecn51ry.js → Accordion-17pht8jd.js} +3 -3
  90. package/web-dist/chunks/Accordion-5df6cgyf.js +55 -0
  91. package/web-dist/chunks/{Accordion-sr353w95.js → Accordion-78mj69zp.js} +2 -2
  92. package/web-dist/chunks/{Accordion-mpnb4qqw.js → Accordion-83hfn3y4.js} +5 -5
  93. package/web-dist/chunks/{Accordion-07rdw2vh.js → Accordion-89q14src.js} +2 -2
  94. package/web-dist/chunks/{Accordion-ajydqhjp.js → Accordion-8xk2zmr5.js} +2 -2
  95. package/web-dist/chunks/{Accordion-qvt6qdqm.js → Accordion-b3ymabze.js} +4 -4
  96. package/web-dist/chunks/{Accordion-avmgvcef.js → Accordion-cn8tbdvk.js} +3 -3
  97. package/web-dist/chunks/{Accordion-8af800ts.js → Accordion-czmnsspb.js} +5 -5
  98. package/web-dist/chunks/{Accordion-nc5gnvnb.js → Accordion-dp638q63.js} +2 -2
  99. package/web-dist/chunks/{Accordion-2fm2tm5r.js → Accordion-e633pb7z.js} +1 -1
  100. package/web-dist/chunks/{Accordion-yz7b7njb.js → Accordion-f1t3rzgg.js} +4 -4
  101. package/web-dist/chunks/{Accordion-b3qy1trj.js → Accordion-fm3jxs1f.js} +8 -8
  102. package/web-dist/chunks/{Accordion-zf3kzvef.js → Accordion-gj63vb6b.js} +4 -4
  103. package/web-dist/chunks/{Accordion-mvfz28m8.js → Accordion-gkzhd3zk.js} +3 -3
  104. package/web-dist/chunks/{Accordion-jj3bg8c1.js → Accordion-k7wwyx5x.js} +4 -4
  105. package/web-dist/chunks/{Accordion-rkv7jyaj.js → Accordion-kemavggr.js} +1 -1
  106. package/web-dist/chunks/{Accordion-jhwsvx3g.js → Accordion-kpnwdpb5.js} +1 -1
  107. package/web-dist/chunks/{Accordion-yf6vseep.js → Accordion-q0st659f.js} +82 -89
  108. package/web-dist/chunks/{Accordion-555gnfmw.js → Accordion-q165k3az.js} +6 -6
  109. package/web-dist/chunks/{Accordion-9rnepkvk.js → Accordion-q3z741vt.js} +3 -3
  110. package/web-dist/chunks/{Accordion-z585n0mr.js → Accordion-rjgdrn7y.js} +1 -1
  111. package/web-dist/chunks/{Accordion-vmz8y01b.js → Accordion-rspy7gjb.js} +6 -6
  112. package/web-dist/chunks/{Accordion-ycmg06sq.js → Accordion-rx2gzadh.js} +1 -1
  113. package/web-dist/chunks/{Accordion-45ej9brb.js → Accordion-swys7qts.js} +3 -3
  114. package/web-dist/chunks/{Accordion-v1dtv6v0.js → Accordion-w0k7gnn9.js} +3 -3
  115. package/web-dist/chunks/{Accordion-pnvt10cv.js → Accordion-w1afjp87.js} +4 -4
  116. package/web-dist/chunks/{Accordion-tj61sa5s.js → Accordion-w7jv9y5t.js} +4 -4
  117. package/web-dist/chunks/{Accordion-s1jhv8gk.js → Accordion-x13vca75.js} +1 -1
  118. package/web-dist/chunks/{Accordion-73m7z73v.js → Accordion-x1dg1f47.js} +5 -5
  119. package/web-dist/chunks/{Accordion-1cgz6f8t.js → Accordion-x4rjd7yn.js} +1 -1
  120. package/web-dist/chunks/{Accordion-nn38n7q4.js → Accordion-xf8cj8z4.js} +3 -3
  121. package/web-dist/chunks/{Accordion-8hhvtcxp.js → Accordion-xzd0tx46.js} +1 -1
  122. package/web-dist/components/accordion/Accordion.js +5 -5
  123. package/web-dist/components/accordion-item/AccordionItem.js +5 -5
  124. package/web-dist/components/activity-indicator/ActivityIndicator.js +1 -1
  125. package/web-dist/components/app-bar/AppBar.js +7 -7
  126. package/web-dist/components/app-shell/AppShell.js +2 -2
  127. package/web-dist/components/avatar/Avatar.js +5 -5
  128. package/web-dist/components/avatar-group/AvatarGroup.js +5 -5
  129. package/web-dist/components/badge/Badge.js +2 -2
  130. package/web-dist/components/barcode-scanner-view/BarcodeScannerView.js +10 -10
  131. package/web-dist/components/bottom-sheet/BottomSheet.js +3 -3
  132. package/web-dist/components/bottom-sheet-flat-list/BottomSheetFlatList.js +3 -3
  133. package/web-dist/components/bottom-sheet-scroll-view/BottomSheetScrollView.js +3 -3
  134. package/web-dist/components/bottom-sheet-section-list/BottomSheetSectionList.js +3 -3
  135. package/web-dist/components/bottom-sheet-view/BottomSheetView.js +3 -3
  136. package/web-dist/components/bottom-sheet-virtualized-list/BottomSheetVirtualizedList.js +3 -3
  137. package/web-dist/components/breadcrumbs/Breadcrumbs.js +5 -5
  138. package/web-dist/components/button/Button.js +3 -3
  139. package/web-dist/components/button-group/ButtonGroup.js +3 -3
  140. package/web-dist/components/camera-permission-view/CameraPermissionView.js +10 -10
  141. package/web-dist/components/card/Card.js +9 -9
  142. package/web-dist/components/card-back/CardBack.js +2 -2
  143. package/web-dist/components/card-hand/CardHand.js +2 -2
  144. package/web-dist/components/chat-list-item/ChatListItem.js +7 -7
  145. package/web-dist/components/checkbox/Checkbox.js +4 -4
  146. package/web-dist/components/checkbox-group/CheckboxGroup.js +4 -4
  147. package/web-dist/components/chess-board/ChessBoard.js +2 -2
  148. package/web-dist/components/chip/Chip.js +5 -5
  149. package/web-dist/components/chip-group/ChipGroup.js +5 -5
  150. package/web-dist/components/collection-editor/CollectionEditor.js +9 -9
  151. package/web-dist/components/content-rail/ContentRail.js +4 -4
  152. package/web-dist/components/data-table/DataTable.js +14 -14
  153. package/web-dist/components/date-picker/DatePicker.js +5 -5
  154. package/web-dist/components/dialog/Dialog.js +4 -4
  155. package/web-dist/components/divider/Divider.js +2 -2
  156. package/web-dist/components/empty-state/EmptyState.js +10 -10
  157. package/web-dist/components/field/Field.js +4 -4
  158. package/web-dist/components/flat-list/FlatList.js +5 -5
  159. package/web-dist/components/forgot-password-form/ForgotPasswordForm.js +8 -8
  160. package/web-dist/components/form/Form.js +6 -6
  161. package/web-dist/components/form-actions/FormActions.js +6 -6
  162. package/web-dist/components/form-error/FormError.js +6 -6
  163. package/web-dist/components/game/Game.js +3 -3
  164. package/web-dist/components/game-entity/GameEntity.js +3 -3
  165. package/web-dist/components/game-field/GameField.js +3 -3
  166. package/web-dist/components/game-input-zone/GameInputZone.js +3 -3
  167. package/web-dist/components/game-measurement-probe/GameMeasurementProbe.js +3 -3
  168. package/web-dist/components/game-overlay/GameOverlay.js +3 -3
  169. package/web-dist/components/gradient/Gradient.js +3 -3
  170. package/web-dist/components/gradient-renderer-provider/GradientRendererProvider.js +3 -3
  171. package/web-dist/components/graph-view/GraphView.js +20 -11
  172. package/web-dist/components/graph-view/GraphView.types-0.d.ts +2 -0
  173. package/web-dist/components/grid/Grid.js +2 -2
  174. package/web-dist/components/heading/Heading.js +2 -2
  175. package/web-dist/components/hero/Hero.js +9 -9
  176. package/web-dist/components/icon/Icon.js +2 -2
  177. package/web-dist/components/icon-button/IconButton.js +3 -3
  178. package/web-dist/components/image/Image.js +4 -4
  179. package/web-dist/components/keyboard-avoiding-view/KeyboardAvoidingView.js +1 -1
  180. package/web-dist/components/list/List.js +5 -5
  181. package/web-dist/components/list-item/ListItem.js +5 -5
  182. package/web-dist/components/list-section/ListSection.js +5 -5
  183. package/web-dist/components/media-card/MediaCard.js +9 -9
  184. package/web-dist/components/message-bubble/MessageBubble.js +7 -7
  185. package/web-dist/components/metric-card/MetricCard.js +9 -9
  186. package/web-dist/components/missing-element/MissingElement.js +4 -4
  187. package/web-dist/components/o-auth-provider-button/OAuthProviderButton.js +8 -8
  188. package/web-dist/components/o-auth-provider-list/OAuthProviderList.js +8 -8
  189. package/web-dist/components/opening-book/OpeningBook.js +2 -2
  190. package/web-dist/components/otp-form/OtpForm.js +8 -8
  191. package/web-dist/components/pagination/Pagination.js +4 -4
  192. package/web-dist/components/palette-item/PaletteItem.js +9 -9
  193. package/web-dist/components/playing-card/PlayingCard.js +2 -2
  194. package/web-dist/components/poker-training-table/PokerTrainingTable.js +2 -2
  195. package/web-dist/components/popover-menu/PopoverMenu.js +4 -4
  196. package/web-dist/components/post-card/PostCard.js +9 -9
  197. package/web-dist/components/product-card/ProductCard.js +9 -9
  198. package/web-dist/components/progress/Progress.js +4 -4
  199. package/web-dist/components/progress-ring/ProgressRing.js +4 -4
  200. package/web-dist/components/radio/Radio.js +5 -5
  201. package/web-dist/components/radio-group/RadioGroup.js +5 -5
  202. package/web-dist/components/rating/Rating.js +3 -3
  203. package/web-dist/components/reader-surface/ReaderSurface.js +9 -9
  204. package/web-dist/components/scan-overlay/ScanOverlay.js +10 -10
  205. package/web-dist/components/screen/Screen.js +2 -2
  206. package/web-dist/components/screen-section/ScreenSection.js +4 -4
  207. package/web-dist/components/scroll-view/ScrollView.js +2 -2
  208. package/web-dist/components/search-input/SearchInput.js +4 -4
  209. package/web-dist/components/section-header/SectionHeader.js +4 -4
  210. package/web-dist/components/section-list/SectionList.js +5 -5
  211. package/web-dist/components/select/Select.js +4 -4
  212. package/web-dist/components/selectable-item/SelectableItem.js +1 -1
  213. package/web-dist/components/selection-provider/SelectionProvider.js +1 -1
  214. package/web-dist/components/sign-in-form/SignInForm.js +8 -8
  215. package/web-dist/components/sign-up-form/SignUpForm.js +8 -8
  216. package/web-dist/components/skeleton/Skeleton.js +12 -12
  217. package/web-dist/components/skeleton-card/SkeletonCard.js +12 -12
  218. package/web-dist/components/skeleton-list/SkeletonList.js +12 -12
  219. package/web-dist/components/skeleton-text/SkeletonText.js +12 -12
  220. package/web-dist/components/surface/Surface.js +2 -2
  221. package/web-dist/components/switch/Switch.js +1 -1
  222. package/web-dist/components/tab/Tab.js +2 -2
  223. package/web-dist/components/tab-list/TabList.js +2 -2
  224. package/web-dist/components/tab-panel/TabPanel.js +2 -2
  225. package/web-dist/components/tabletop-table/TabletopTable.js +2 -2
  226. package/web-dist/components/tabs/Tabs.js +2 -2
  227. package/web-dist/components/text/Text.js +2 -2
  228. package/web-dist/components/text-input/TextInput.js +4 -4
  229. package/web-dist/components/time-picker/TimePicker.js +5 -5
  230. package/web-dist/components/timeline/Timeline.js +4 -4
  231. package/web-dist/components/toast/Toast.js +2 -2
  232. package/web-dist/components/toast-provider/ToastProvider.js +2 -2
  233. package/web-dist/components/toolbar/Toolbar.js +9 -9
  234. package/web-dist/components/tree-item/TreeItem.js +41 -22
  235. package/web-dist/components/tree-view/TreeView.d.ts +4 -3
  236. package/web-dist/components/tree-view/TreeView.js +25 -12
  237. package/web-dist/components/uploader/Uploader.js +10 -10
  238. package/web-dist/components/view/View.js +2 -2
  239. package/web-dist/manifest.json +577 -568
  240. package/web-dist/runtime/ZoraProvider.js +3 -3
  241. /package/web-dist/chunks/{Accordion-k3bc4kad.js → Accordion-13y3zx87.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"SelectableItem.js","sourceRoot":"","sources":["../../../../../src/features/selection/adapters/inbound/SelectableItem.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Pressable } from '@ankhorage/surface';\nimport React from 'react';\nimport type { GestureResponderEvent } from 'react-native';\n\nimport type {\n SelectableItemProps,\n SelectableItemState,\n SelectionTrigger,\n} from '../../../../types/selection';\nimport { useSelection } from './SelectionProvider';\n\nfunction resolveTrigger(trigger: SelectionTrigger | undefined): SelectionTrigger {\n return trigger ?? 'manual';\n}\n\nfunction isRenderProp(\n children: SelectableItemProps['children'],\n): children is (state: SelectableItemState) => React.ReactNode {\n return typeof children === 'function';\n}\n\n/***\n * Adds selection behavior to arbitrary child content via render props.\n *\n \n */\nexport function SelectableItem({\n id,\n trigger,\n disabled = false,\n interactionPolicy,\n children,\n}: SelectableItemProps) {\n const selection = useSelection();\n const resolvedTrigger = resolveTrigger(trigger);\n const resolvedDisabled = selection.disabled || disabled;\n const selected = selection.isSelected(id);\n\n const select = React.useCallback(() => {\n if (resolvedDisabled) return;\n if (interactionPolicy === 'passive') return;\n selection.select(id);\n }, [id, resolvedDisabled, interactionPolicy, selection]);\n\n const toggle = React.useCallback(() => {\n if (resolvedDisabled) return;\n if (interactionPolicy === 'passive') return;\n selection.toggle(id);\n }, [id, resolvedDisabled, interactionPolicy, selection]);\n\n const clear = React.useCallback(() => {\n if (selection.disabled) return;\n if (interactionPolicy === 'passive') return;\n selection.clear();\n }, [interactionPolicy, selection]);\n\n const itemState = React.useMemo<SelectableItemState>(() => {\n return {\n id,\n selected,\n disabled: resolvedDisabled,\n mode: selection.mode,\n select,\n toggle,\n clear,\n };\n }, [clear, id, resolvedDisabled, select, selected, selection.mode, toggle]);\n\n // IMPORTANT:\n // Do not pass `children` directly into Pressable. Pressable also supports function children,\n // but its function signature receives interaction state, not SelectableItemState.\n const content = isRenderProp(children) ? children(itemState) : children;\n\n if (resolvedTrigger === 'manual') {\n return <>{content}</>;\n }\n\n const handlePress = (event: GestureResponderEvent) => {\n event.stopPropagation();\n if (resolvedDisabled) return;\n if (interactionPolicy === 'passive') return;\n if (selection.mode === 'single') {\n selection.select(id);\n return;\n }\n\n selection.toggle(id);\n };\n\n const handleLongPress = (event: GestureResponderEvent) => {\n event.stopPropagation();\n if (resolvedDisabled) return;\n if (interactionPolicy === 'passive') return;\n if (selection.mode === 'single') {\n selection.select(id);\n return;\n }\n\n selection.toggle(id);\n };\n\n return (\n <Pressable\n interactionPolicy={interactionPolicy}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: resolvedDisabled, selected }}\n disabled={resolvedDisabled}\n onLongPress={resolvedTrigger === 'longPress' ? handleLongPress : undefined}\n onPress={resolvedTrigger === 'press' ? handlePress : undefined}\n >\n {content}\n </Pressable>\n );\n}\n"]}
1
+ {"version":3,"file":"SelectableItem.js","sourceRoot":"","sources":["../../../../../src/features/selection/adapters/inbound/SelectableItem.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Pressable } from '@ankhorage/surface';\nimport type { SelectionIntent } from '@ankhorage/utility/selection';\nimport React from 'react';\nimport { type GestureResponderEvent, Platform } from 'react-native';\n\nimport type {\n SelectableItemProps,\n SelectableItemState,\n SelectionTrigger,\n} from '../../../../types/selection';\nimport { resolveSelectionEventIntent } from '../../application/resolveSelectionEventIntent';\nimport { useSelection } from './SelectionProvider';\n\n/*** Resolve the configured selection trigger. */\nfunction resolveTrigger(trigger: SelectionTrigger | undefined): SelectionTrigger {\n return trigger ?? 'manual';\n}\n\n/*** Narrow render-prop children without changing ordinary React-node children. */\nfunction isRenderProp(\n children: SelectableItemProps['children'],\n): children is (state: SelectableItemState) => React.ReactNode {\n return typeof children === 'function';\n}\n\n/*** Adds selection behavior to arbitrary child content via render props. */\nexport function SelectableItem({\n id,\n trigger,\n disabled = false,\n interactionPolicy,\n children,\n}: SelectableItemProps) {\n const selection = useSelection();\n const resolvedTrigger = resolveTrigger(trigger);\n const resolvedDisabled = selection.disabled || disabled;\n const selected = selection.isSelected(id);\n\n const activate = React.useCallback(\n (intent: SelectionIntent) => {\n if (resolvedDisabled || interactionPolicy === 'passive') return;\n selection.activate(id, intent);\n },\n [id, interactionPolicy, resolvedDisabled, selection],\n );\n const select = React.useCallback(() => {\n if (resolvedDisabled || interactionPolicy === 'passive') return;\n selection.select(id);\n }, [id, interactionPolicy, resolvedDisabled, selection]);\n const toggle = React.useCallback(() => {\n if (resolvedDisabled || interactionPolicy === 'passive') return;\n selection.toggle(id);\n }, [id, interactionPolicy, resolvedDisabled, selection]);\n const clear = React.useCallback(() => {\n if (selection.disabled || interactionPolicy === 'passive') return;\n selection.clear();\n }, [interactionPolicy, selection]);\n\n const itemState = React.useMemo<SelectableItemState>(\n () => ({\n id,\n selected,\n disabled: resolvedDisabled,\n mode: selection.mode,\n activate,\n select,\n toggle,\n clear,\n }),\n [activate, clear, id, resolvedDisabled, select, selected, selection.mode, toggle],\n );\n\n const content = isRenderProp(children) ? children(itemState) : children;\n if (resolvedTrigger === 'manual') return <>{content}</>;\n\n const handleActivation = (event: GestureResponderEvent) => {\n event.stopPropagation();\n if (resolvedDisabled || interactionPolicy === 'passive') return;\n selection.activate(\n id,\n resolveSelectionEventIntent(event, Platform.OS === 'web' ? 'pointer' : 'touch'),\n );\n };\n\n return (\n <Pressable\n interactionPolicy={interactionPolicy}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: resolvedDisabled, selected }}\n disabled={resolvedDisabled}\n onLongPress={resolvedTrigger === 'longPress' ? handleActivation : undefined}\n onPress={resolvedTrigger === 'press' ? handleActivation : undefined}\n >\n {content}\n </Pressable>\n );\n}\n"]}
@@ -1,11 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { SelectionProviderProps, UseSelectionResult } from '../../../../types/selection';
3
- /***
4
- * Accesses selection state provided by `SelectionProvider`.
5
- */
3
+ /*** Accesses selection state provided by `SelectionProvider`. */
6
4
  export declare function useSelection(): UseSelectionResult;
7
- /***
8
- * Provides selection state for building selectable lists and grids.
9
- */
5
+ /*** Provides selection state for building selectable lists and grids. */
10
6
  export declare function SelectionProvider({ children, selectedIds, defaultSelectedIds, mode, disabled, onSelectionChange, interactionPolicy, }: SelectionProviderProps): React.JSX.Element;
11
7
  //# sourceMappingURL=SelectionProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionProvider.d.ts","sourceRoot":"","sources":["../../../../../src/features/selection/adapters/inbound/SelectionProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAEV,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AA0BrC;;GAEG;AACH,wBAAgB,YAAY,IAAI,kBAAkB,CAOjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,IAAI,EACJ,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,GAClB,EAAE,sBAAsB,qBAkExB"}
1
+ {"version":3,"file":"SelectionProvider.d.ts","sourceRoot":"","sources":["../../../../../src/features/selection/adapters/inbound/SelectionProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAEV,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAoBrC,iEAAiE;AACjE,wBAAgB,YAAY,IAAI,kBAAkB,CAIjD;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,IAAI,EACJ,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,GAClB,EAAE,sBAAsB,qBA6ExB"}
@@ -1,5 +1,6 @@
1
+ import { applySelectionIntent } from '@ankhorage/utility/selection';
1
2
  import React from 'react';
2
- import { areIdsEqual, clearIds, normalizeIds, selectId, toggleId, } from '../../utils/resolveSelectionNextIds';
3
+ import { areIdsEqual, clearIds, normalizeIds, selectId } from '../../utils/resolveSelectionNextIds';
3
4
  const MISSING_CONTEXT_MESSAGE = 'ZORA selection context is missing. Wrap this tree in <SelectionProvider>.';
4
5
  const SelectionContext = React.createContext(null);
5
6
  /*** Resolve the effective selection mode. */
@@ -10,19 +11,14 @@ function resolveMode(mode) {
10
11
  function resolveDisabled(disabled) {
11
12
  return disabled ?? false;
12
13
  }
13
- /***
14
- * Accesses selection state provided by `SelectionProvider`.
15
- */
14
+ /*** Accesses selection state provided by `SelectionProvider`. */
16
15
  export function useSelection() {
17
16
  const value = React.use(SelectionContext);
18
- if (!value) {
17
+ if (!value)
19
18
  throw new Error(MISSING_CONTEXT_MESSAGE);
20
- }
21
19
  return value;
22
20
  }
23
- /***
24
- * Provides selection state for building selectable lists and grids.
25
- */
21
+ /*** Provides selection state for building selectable lists and grids. */
26
22
  export function SelectionProvider({ children, selectedIds, defaultSelectedIds, mode, disabled, onSelectionChange, interactionPolicy, }) {
27
23
  const resolvedMode = resolveMode(mode);
28
24
  const resolvedDisabled = resolveDisabled(disabled);
@@ -32,43 +28,51 @@ export function SelectionProvider({ children, selectedIds, defaultSelectedIds, m
32
28
  const currentNormalizedIds = normalizeIds(rawIds, resolvedMode);
33
29
  const selectedIdSet = React.useMemo(() => new Set(currentNormalizedIds), [currentNormalizedIds]);
34
30
  const commitSelectionChange = React.useCallback((nextNormalizedIds) => {
35
- if (resolvedDisabled)
36
- return;
37
- if (interactionPolicy === 'passive')
31
+ if (resolvedDisabled || interactionPolicy === 'passive')
38
32
  return;
39
33
  if (areIdsEqual(nextNormalizedIds, currentNormalizedIds))
40
34
  return;
41
35
  onSelectionChange?.(nextNormalizedIds);
42
- if (!isControlled) {
36
+ if (!isControlled)
43
37
  setUncontrolledIds(nextNormalizedIds);
44
- }
45
38
  }, [currentNormalizedIds, interactionPolicy, isControlled, onSelectionChange, resolvedDisabled]);
46
39
  const clear = React.useCallback(() => {
47
40
  commitSelectionChange(normalizeIds(clearIds(), resolvedMode));
48
41
  }, [commitSelectionChange, resolvedMode]);
49
42
  const select = React.useCallback((id) => {
50
43
  const nextIds = selectId({ mode: resolvedMode, ids: currentNormalizedIds, id });
51
- const nextNormalizedIds = normalizeIds(nextIds, resolvedMode);
52
- commitSelectionChange(nextNormalizedIds);
44
+ commitSelectionChange(normalizeIds(nextIds, resolvedMode));
53
45
  }, [commitSelectionChange, currentNormalizedIds, resolvedMode]);
54
46
  const toggle = React.useCallback((id) => {
55
- const nextIds = toggleId({ mode: resolvedMode, ids: currentNormalizedIds, id });
56
- const nextNormalizedIds = normalizeIds(nextIds, resolvedMode);
57
- commitSelectionChange(nextNormalizedIds);
47
+ const nextIds = applySelectionIntent(currentNormalizedIds, id, 'toggle');
48
+ commitSelectionChange(normalizeIds(nextIds, resolvedMode));
49
+ }, [commitSelectionChange, currentNormalizedIds, resolvedMode]);
50
+ const activate = React.useCallback((id, intent) => {
51
+ const effectiveIntent = resolvedMode === 'single' ? 'replace' : intent;
52
+ const nextIds = applySelectionIntent(currentNormalizedIds, id, effectiveIntent);
53
+ commitSelectionChange(normalizeIds(nextIds, resolvedMode));
58
54
  }, [commitSelectionChange, currentNormalizedIds, resolvedMode]);
59
- const value = React.useMemo(() => {
60
- return {
61
- mode: resolvedMode,
62
- disabled: resolvedDisabled,
63
- selectedIds: currentNormalizedIds,
64
- selectedCount: currentNormalizedIds.length,
65
- hasSelection: currentNormalizedIds.length > 0,
66
- isSelected: (id) => selectedIdSet.has(id),
67
- select,
68
- toggle,
69
- clear,
70
- };
71
- }, [clear, currentNormalizedIds, resolvedDisabled, resolvedMode, select, selectedIdSet, toggle]);
55
+ const value = React.useMemo(() => ({
56
+ mode: resolvedMode,
57
+ disabled: resolvedDisabled,
58
+ selectedIds: currentNormalizedIds,
59
+ selectedCount: currentNormalizedIds.length,
60
+ hasSelection: currentNormalizedIds.length > 0,
61
+ isSelected: (id) => selectedIdSet.has(id),
62
+ activate,
63
+ select,
64
+ toggle,
65
+ clear,
66
+ }), [
67
+ activate,
68
+ clear,
69
+ currentNormalizedIds,
70
+ resolvedDisabled,
71
+ resolvedMode,
72
+ select,
73
+ selectedIdSet,
74
+ toggle,
75
+ ]);
72
76
  return <SelectionContext value={value}>{children}</SelectionContext>;
73
77
  }
74
78
  //# sourceMappingURL=SelectionProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionProvider.js","sourceRoot":"","sources":["../../../../../src/features/selection/adapters/inbound/SelectionProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport type {\n SelectionMode,\n SelectionProviderProps,\n UseSelectionResult,\n} from '../../../../types/selection';\nimport {\n areIdsEqual,\n clearIds,\n normalizeIds,\n selectId,\n toggleId,\n} from '../../utils/resolveSelectionNextIds';\n\nconst MISSING_CONTEXT_MESSAGE =\n 'ZORA selection context is missing. Wrap this tree in <SelectionProvider>.';\n\ntype SelectionContextValue = UseSelectionResult;\n\nconst SelectionContext = React.createContext<SelectionContextValue | null>(null);\n\n/*** Resolve the effective selection mode. */\nfunction resolveMode(mode: SelectionMode | undefined): SelectionMode {\n return mode ?? 'single';\n}\n\n/*** Resolve the effective disabled state. */\nfunction resolveDisabled(disabled: boolean | undefined): boolean {\n return disabled ?? false;\n}\n\n/***\n * Accesses selection state provided by `SelectionProvider`.\n */\nexport function useSelection(): UseSelectionResult {\n const value = React.use(SelectionContext);\n if (!value) {\n throw new Error(MISSING_CONTEXT_MESSAGE);\n }\n\n return value;\n}\n\n/***\n * Provides selection state for building selectable lists and grids.\n */\nexport function SelectionProvider({\n children,\n selectedIds,\n defaultSelectedIds,\n mode,\n disabled,\n onSelectionChange,\n interactionPolicy,\n}: SelectionProviderProps) {\n const resolvedMode = resolveMode(mode);\n const resolvedDisabled = resolveDisabled(disabled);\n const isControlled = selectedIds !== undefined;\n\n const [uncontrolledIds, setUncontrolledIds] = React.useState<readonly string[]>(\n defaultSelectedIds ?? [],\n );\n\n const rawIds = isControlled ? selectedIds : uncontrolledIds;\n const currentNormalizedIds = normalizeIds(rawIds, resolvedMode);\n\n const selectedIdSet = React.useMemo(() => new Set(currentNormalizedIds), [currentNormalizedIds]);\n\n const commitSelectionChange = React.useCallback(\n (nextNormalizedIds: readonly string[]) => {\n if (resolvedDisabled) return;\n if (interactionPolicy === 'passive') return;\n if (areIdsEqual(nextNormalizedIds, currentNormalizedIds)) return;\n\n onSelectionChange?.(nextNormalizedIds);\n\n if (!isControlled) {\n setUncontrolledIds(nextNormalizedIds);\n }\n },\n [currentNormalizedIds, interactionPolicy, isControlled, onSelectionChange, resolvedDisabled],\n );\n\n const clear = React.useCallback(() => {\n commitSelectionChange(normalizeIds(clearIds(), resolvedMode));\n }, [commitSelectionChange, resolvedMode]);\n\n const select = React.useCallback(\n (id: string) => {\n const nextIds = selectId({ mode: resolvedMode, ids: currentNormalizedIds, id });\n const nextNormalizedIds = normalizeIds(nextIds, resolvedMode);\n commitSelectionChange(nextNormalizedIds);\n },\n [commitSelectionChange, currentNormalizedIds, resolvedMode],\n );\n\n const toggle = React.useCallback(\n (id: string) => {\n const nextIds = toggleId({ mode: resolvedMode, ids: currentNormalizedIds, id });\n const nextNormalizedIds = normalizeIds(nextIds, resolvedMode);\n commitSelectionChange(nextNormalizedIds);\n },\n [commitSelectionChange, currentNormalizedIds, resolvedMode],\n );\n\n const value = React.useMemo<UseSelectionResult>(() => {\n return {\n mode: resolvedMode,\n disabled: resolvedDisabled,\n selectedIds: currentNormalizedIds,\n selectedCount: currentNormalizedIds.length,\n hasSelection: currentNormalizedIds.length > 0,\n isSelected: (id: string) => selectedIdSet.has(id),\n select,\n toggle,\n clear,\n };\n }, [clear, currentNormalizedIds, resolvedDisabled, resolvedMode, select, selectedIdSet, toggle]);\n\n return <SelectionContext value={value}>{children}</SelectionContext>;\n}\n"]}
1
+ {"version":3,"file":"SelectionProvider.js","sourceRoot":"","sources":["../../../../../src/features/selection/adapters/inbound/SelectionProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { applySelectionIntent, type SelectionIntent } from '@ankhorage/utility/selection';\nimport React from 'react';\n\nimport type {\n SelectionMode,\n SelectionProviderProps,\n UseSelectionResult,\n} from '../../../../types/selection';\nimport { areIdsEqual, clearIds, normalizeIds, selectId } from '../../utils/resolveSelectionNextIds';\n\nconst MISSING_CONTEXT_MESSAGE =\n 'ZORA selection context is missing. Wrap this tree in <SelectionProvider>.';\n\ntype SelectionContextValue = UseSelectionResult;\n\nconst SelectionContext = React.createContext<SelectionContextValue | null>(null);\n\n/*** Resolve the effective selection mode. */\nfunction resolveMode(mode: SelectionMode | undefined): SelectionMode {\n return mode ?? 'single';\n}\n\n/*** Resolve the effective disabled state. */\nfunction resolveDisabled(disabled: boolean | undefined): boolean {\n return disabled ?? false;\n}\n\n/*** Accesses selection state provided by `SelectionProvider`. */\nexport function useSelection(): UseSelectionResult {\n const value = React.use(SelectionContext);\n if (!value) throw new Error(MISSING_CONTEXT_MESSAGE);\n return value;\n}\n\n/*** Provides selection state for building selectable lists and grids. */\nexport function SelectionProvider({\n children,\n selectedIds,\n defaultSelectedIds,\n mode,\n disabled,\n onSelectionChange,\n interactionPolicy,\n}: SelectionProviderProps) {\n const resolvedMode = resolveMode(mode);\n const resolvedDisabled = resolveDisabled(disabled);\n const isControlled = selectedIds !== undefined;\n const [uncontrolledIds, setUncontrolledIds] = React.useState<readonly string[]>(\n defaultSelectedIds ?? [],\n );\n\n const rawIds = isControlled ? selectedIds : uncontrolledIds;\n const currentNormalizedIds = normalizeIds(rawIds, resolvedMode);\n const selectedIdSet = React.useMemo(() => new Set(currentNormalizedIds), [currentNormalizedIds]);\n\n const commitSelectionChange = React.useCallback(\n (nextNormalizedIds: readonly string[]) => {\n if (resolvedDisabled || interactionPolicy === 'passive') return;\n if (areIdsEqual(nextNormalizedIds, currentNormalizedIds)) return;\n onSelectionChange?.(nextNormalizedIds);\n if (!isControlled) setUncontrolledIds(nextNormalizedIds);\n },\n [currentNormalizedIds, interactionPolicy, isControlled, onSelectionChange, resolvedDisabled],\n );\n\n const clear = React.useCallback(() => {\n commitSelectionChange(normalizeIds(clearIds(), resolvedMode));\n }, [commitSelectionChange, resolvedMode]);\n\n const select = React.useCallback(\n (id: string) => {\n const nextIds = selectId({ mode: resolvedMode, ids: currentNormalizedIds, id });\n commitSelectionChange(normalizeIds(nextIds, resolvedMode));\n },\n [commitSelectionChange, currentNormalizedIds, resolvedMode],\n );\n\n const toggle = React.useCallback(\n (id: string) => {\n const nextIds = applySelectionIntent(currentNormalizedIds, id, 'toggle');\n commitSelectionChange(normalizeIds(nextIds, resolvedMode));\n },\n [commitSelectionChange, currentNormalizedIds, resolvedMode],\n );\n\n const activate = React.useCallback(\n (id: string, intent: SelectionIntent) => {\n const effectiveIntent = resolvedMode === 'single' ? 'replace' : intent;\n const nextIds = applySelectionIntent(currentNormalizedIds, id, effectiveIntent);\n commitSelectionChange(normalizeIds(nextIds, resolvedMode));\n },\n [commitSelectionChange, currentNormalizedIds, resolvedMode],\n );\n\n const value = React.useMemo<UseSelectionResult>(\n () => ({\n mode: resolvedMode,\n disabled: resolvedDisabled,\n selectedIds: currentNormalizedIds,\n selectedCount: currentNormalizedIds.length,\n hasSelection: currentNormalizedIds.length > 0,\n isSelected: (id: string) => selectedIdSet.has(id),\n activate,\n select,\n toggle,\n clear,\n }),\n [\n activate,\n clear,\n currentNormalizedIds,\n resolvedDisabled,\n resolvedMode,\n select,\n selectedIdSet,\n toggle,\n ],\n );\n\n return <SelectionContext value={value}>{children}</SelectionContext>;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { type SelectionActivationKind } from '@ankhorage/utility/interaction';
2
+ import type { SelectionIntent } from '@ankhorage/utility/selection';
3
+ /*** Normalize DOM, React Native, and renderer events into one semantic selection intent. */
4
+ export declare function resolveSelectionEventIntent(event: unknown, fallbackKind: SelectionActivationKind): SelectionIntent;
5
+ //# sourceMappingURL=resolveSelectionEventIntent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSelectionEventIntent.d.ts","sourceRoot":"","sources":["../../../../src/features/selection/application/resolveSelectionEventIntent.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,uBAAuB,EAE7B,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,4FAA4F;AAC5F,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,uBAAuB,GACpC,eAAe,CAejB"}
@@ -0,0 +1,49 @@
1
+ import { resolveSelectionIntent, } from '@ankhorage/utility/interaction';
2
+ import { isRecord } from '@ankhorage/utility/object';
3
+ /*** Normalize DOM, React Native, and renderer events into one semantic selection intent. */
4
+ export function resolveSelectionEventIntent(event, fallbackKind) {
5
+ const source = readEventSource(event);
6
+ const kind = isTouchActivation(source) ? 'touch' : fallbackKind;
7
+ const sourceModifiers = readInteractionModifiers(source);
8
+ const wrapperModifiers = readInteractionModifiers(event);
9
+ const input = {
10
+ kind,
11
+ modifiers: {
12
+ altKey: sourceModifiers.altKey === true || wrapperModifiers.altKey === true,
13
+ ctrlKey: sourceModifiers.ctrlKey === true || wrapperModifiers.ctrlKey === true,
14
+ metaKey: sourceModifiers.metaKey === true || wrapperModifiers.metaKey === true,
15
+ shiftKey: sourceModifiers.shiftKey === true || wrapperModifiers.shiftKey === true,
16
+ },
17
+ };
18
+ return resolveSelectionIntent(input);
19
+ }
20
+ /*** Prefer one nested native/renderer event while preserving structural event compatibility. */
21
+ function readEventSource(event) {
22
+ if (!isRecord(event))
23
+ return {};
24
+ if (isRecord(event.originalEvent))
25
+ return event.originalEvent;
26
+ if (isRecord(event.nativeEvent))
27
+ return event.nativeEvent;
28
+ return event;
29
+ }
30
+ /*** Recognize pointer and native/browser touch event shapes without depending on platform event types. */
31
+ function isTouchActivation(source) {
32
+ if (source.pointerType === 'touch')
33
+ return true;
34
+ if (typeof source.type === 'string' && source.type.startsWith('touch'))
35
+ return true;
36
+ return 'touches' in source || 'changedTouches' in source;
37
+ }
38
+ /*** Read known modifiers explicitly so arbitrary event properties never become dynamic input keys. */
39
+ function readInteractionModifiers(value) {
40
+ if (!isRecord(value))
41
+ return {};
42
+ return {
43
+ altKey: value.altKey === true,
44
+ ctrlKey: value.ctrlKey === true,
45
+ metaKey: value.metaKey === true,
46
+ shiftKey: value.shiftKey === true,
47
+ };
48
+ }
49
+ //# sourceMappingURL=resolveSelectionEventIntent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSelectionEventIntent.js","sourceRoot":"","sources":["../../../../src/features/selection/application/resolveSelectionEventIntent.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,GAGvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAGrD,4FAA4F;AAC5F,MAAM,UAAU,2BAA2B,CACzC,KAAc,EACd,YAAqC;IAErC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,IAAI,GAA4B,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;IACzF,MAAM,eAAe,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,KAAK,GAA8B;QACvC,IAAI;QACJ,SAAS,EAAE;YACT,MAAM,EAAE,eAAe,CAAC,MAAM,KAAK,IAAI,IAAI,gBAAgB,CAAC,MAAM,KAAK,IAAI;YAC3E,OAAO,EAAE,eAAe,CAAC,OAAO,KAAK,IAAI,IAAI,gBAAgB,CAAC,OAAO,KAAK,IAAI;YAC9E,OAAO,EAAE,eAAe,CAAC,OAAO,KAAK,IAAI,IAAI,gBAAgB,CAAC,OAAO,KAAK,IAAI;YAC9E,QAAQ,EAAE,eAAe,CAAC,QAAQ,KAAK,IAAI,IAAI,gBAAgB,CAAC,QAAQ,KAAK,IAAI;SAClF;KACF,CAAC;IACF,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,gGAAgG;AAChG,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;QAAE,OAAO,KAAK,CAAC,aAAa,CAAC;IAC9D,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC,WAAW,CAAC;IAC1D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0GAA0G;AAC1G,SAAS,iBAAiB,CAAC,MAAyC;IAClE,IAAI,MAAM,CAAC,WAAW,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,OAAO,SAAS,IAAI,MAAM,IAAI,gBAAgB,IAAI,MAAM,CAAC;AAC3D,CAAC;AAED,sGAAsG;AACtG,SAAS,wBAAwB,CAAC,KAAc;IAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,IAAI;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,IAAI;QAC/B,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,IAAI;QAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import {\n type InteractionModifiers,\n resolveSelectionIntent,\n type SelectionActivationKind,\n type SelectionInteractionInput,\n} from '@ankhorage/utility/interaction';\nimport { isRecord } from '@ankhorage/utility/object';\nimport type { SelectionIntent } from '@ankhorage/utility/selection';\n\n/*** Normalize DOM, React Native, and renderer events into one semantic selection intent. */\nexport function resolveSelectionEventIntent(\n event: unknown,\n fallbackKind: SelectionActivationKind,\n): SelectionIntent {\n const source = readEventSource(event);\n const kind: SelectionActivationKind = isTouchActivation(source) ? 'touch' : fallbackKind;\n const sourceModifiers = readInteractionModifiers(source);\n const wrapperModifiers = readInteractionModifiers(event);\n const input: SelectionInteractionInput = {\n kind,\n modifiers: {\n altKey: sourceModifiers.altKey === true || wrapperModifiers.altKey === true,\n ctrlKey: sourceModifiers.ctrlKey === true || wrapperModifiers.ctrlKey === true,\n metaKey: sourceModifiers.metaKey === true || wrapperModifiers.metaKey === true,\n shiftKey: sourceModifiers.shiftKey === true || wrapperModifiers.shiftKey === true,\n },\n };\n return resolveSelectionIntent(input);\n}\n\n/*** Prefer one nested native/renderer event while preserving structural event compatibility. */\nfunction readEventSource(event: unknown): Readonly<Record<string, unknown>> {\n if (!isRecord(event)) return {};\n if (isRecord(event.originalEvent)) return event.originalEvent;\n if (isRecord(event.nativeEvent)) return event.nativeEvent;\n return event;\n}\n\n/*** Recognize pointer and native/browser touch event shapes without depending on platform event types. */\nfunction isTouchActivation(source: Readonly<Record<string, unknown>>): boolean {\n if (source.pointerType === 'touch') return true;\n if (typeof source.type === 'string' && source.type.startsWith('touch')) return true;\n return 'touches' in source || 'changedTouches' in source;\n}\n\n/*** Read known modifiers explicitly so arbitrary event properties never become dynamic input keys. */\nfunction readInteractionModifiers(value: unknown): InteractionModifiers {\n if (!isRecord(value)) return {};\n return {\n altKey: value.altKey === true,\n ctrlKey: value.ctrlKey === true,\n metaKey: value.metaKey === true,\n shiftKey: value.shiftKey === true,\n };\n}\n"]}
@@ -1,4 +1,6 @@
1
1
  export type { SelectableItemProps, SelectableItemState, SelectionMode, SelectionProviderProps, SelectionTrigger, UseSelectionResult, } from '../../types/selection';
2
2
  export { SelectableItem } from './adapters/inbound/SelectableItem';
3
3
  export { SelectionProvider, useSelection } from './adapters/inbound/SelectionProvider';
4
+ export { resolveSelectionEventIntent } from './application/resolveSelectionEventIntent';
5
+ export type { SelectionIntent } from '@ankhorage/utility/selection';
4
6
  //# sourceMappingURL=public.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/features/selection/public.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/features/selection/public.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { SelectableItem } from './adapters/inbound/SelectableItem';
2
2
  export { SelectionProvider, useSelection } from './adapters/inbound/SelectionProvider';
3
+ export { resolveSelectionEventIntent } from './application/resolveSelectionEventIntent';
3
4
  //# sourceMappingURL=public.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/features/selection/public.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC","sourcesContent":["export type {\n SelectableItemProps,\n SelectableItemState,\n SelectionMode,\n SelectionProviderProps,\n SelectionTrigger,\n UseSelectionResult,\n} from '../../types/selection';\nexport { SelectableItem } from './adapters/inbound/SelectableItem';\nexport { SelectionProvider, useSelection } from './adapters/inbound/SelectionProvider';\n"]}
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/features/selection/public.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC","sourcesContent":["export type {\n SelectableItemProps,\n SelectableItemState,\n SelectionMode,\n SelectionProviderProps,\n SelectionTrigger,\n UseSelectionResult,\n} from '../../types/selection';\nexport { SelectableItem } from './adapters/inbound/SelectableItem';\nexport { SelectionProvider, useSelection } from './adapters/inbound/SelectionProvider';\nexport { resolveSelectionEventIntent } from './application/resolveSelectionEventIntent';\nexport type { SelectionIntent } from '@ankhorage/utility/selection';\n"]}
@@ -1,15 +1,14 @@
1
1
  import type { SelectionMode } from '../../../types/selection';
2
+ /*** Normalize selected ids to stable unique membership within the configured selection mode. */
2
3
  export declare function normalizeIds(ids: readonly string[] | undefined, mode: SelectionMode): readonly string[];
4
+ /*** Compare ordered selection ids without allocating replacement arrays. */
3
5
  export declare function areIdsEqual(a: readonly string[], b: readonly string[]): boolean;
6
+ /*** Produce the canonical empty selection. */
4
7
  export declare function clearIds(): readonly string[];
8
+ /*** Ensure one id is selected while preserving multi-selection membership. */
5
9
  export declare function selectId({ mode, ids, id, }: {
6
10
  mode: SelectionMode;
7
11
  ids: readonly string[];
8
12
  id: string;
9
13
  }): readonly string[];
10
- export declare function toggleId({ mode, ids, id, }: {
11
- mode: SelectionMode;
12
- ids: readonly string[];
13
- id: string;
14
- }): readonly string[];
15
14
  //# sourceMappingURL=resolveSelectionNextIds.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveSelectionNextIds.d.ts","sourceRoot":"","sources":["../../../../src/features/selection/utils/resolveSelectionNextIds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,wBAAgB,YAAY,CAC1B,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAClC,IAAI,EAAE,aAAa,GAClB,SAAS,MAAM,EAAE,CAYnB;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAO/E;AAED,wBAAgB,QAAQ,IAAI,SAAS,MAAM,EAAE,CAE5C;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,GAAG,EACH,EAAE,GACH,EAAE;IACD,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,SAAS,MAAM,EAAE,CAUpB;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,GAAG,EACH,EAAE,GACH,EAAE;IACD,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,SAAS,MAAM,EAAE,CAUpB"}
1
+ {"version":3,"file":"resolveSelectionNextIds.d.ts","sourceRoot":"","sources":["../../../../src/features/selection/utils/resolveSelectionNextIds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,gGAAgG;AAChG,wBAAgB,YAAY,CAC1B,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAClC,IAAI,EAAE,aAAa,GAClB,SAAS,MAAM,EAAE,CAYnB;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAO/E;AAED,8CAA8C;AAC9C,wBAAgB,QAAQ,IAAI,SAAS,MAAM,EAAE,CAE5C;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,GAAG,EACH,EAAE,GACH,EAAE;IACD,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,SAAS,MAAM,EAAE,CAIpB"}
@@ -1,3 +1,4 @@
1
+ /*** Normalize selected ids to stable unique membership within the configured selection mode. */
1
2
  export function normalizeIds(ids, mode) {
2
3
  const uniqueIds = [];
3
4
  const seen = new Set();
@@ -11,6 +12,7 @@ export function normalizeIds(ids, mode) {
11
12
  }
12
13
  return uniqueIds;
13
14
  }
15
+ /*** Compare ordered selection ids without allocating replacement arrays. */
14
16
  export function areIdsEqual(a, b) {
15
17
  if (a.length !== b.length)
16
18
  return false;
@@ -20,25 +22,16 @@ export function areIdsEqual(a, b) {
20
22
  }
21
23
  return true;
22
24
  }
25
+ /*** Produce the canonical empty selection. */
23
26
  export function clearIds() {
24
27
  return [];
25
28
  }
29
+ /*** Ensure one id is selected while preserving multi-selection membership. */
26
30
  export function selectId({ mode, ids, id, }) {
27
- if (mode === 'single') {
31
+ if (mode === 'single')
28
32
  return [id];
29
- }
30
- if (ids.includes(id)) {
33
+ if (ids.includes(id))
31
34
  return ids;
32
- }
33
- return [...ids, id];
34
- }
35
- export function toggleId({ mode, ids, id, }) {
36
- if (ids.includes(id)) {
37
- return ids.filter((existingId) => existingId !== id);
38
- }
39
- if (mode === 'single') {
40
- return [id];
41
- }
42
35
  return [...ids, id];
43
36
  }
44
37
  //# sourceMappingURL=resolveSelectionNextIds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveSelectionNextIds.js","sourceRoot":"","sources":["../../../../src/features/selection/utils/resolveSelectionNextIds.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAC1B,GAAkC,EAClC,IAAmB;IAEnB,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,IAAI,KAAK,QAAQ;YAAE,MAAM;IAC/B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAoB,EAAE,CAAoB;IACpE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EACvB,IAAI,EACJ,GAAG,EACH,EAAE,GAKH;IACC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EACvB,IAAI,EACJ,GAAG,EACH,EAAE,GAKH;IACC,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC","sourcesContent":["import type { SelectionMode } from '../../../types/selection';\n\nexport function normalizeIds(\n ids: readonly string[] | undefined,\n mode: SelectionMode,\n): readonly string[] {\n const uniqueIds: string[] = [];\n const seen = new Set<string>();\n\n for (const id of ids ?? []) {\n if (seen.has(id)) continue;\n seen.add(id);\n uniqueIds.push(id);\n if (mode === 'single') break;\n }\n\n return uniqueIds;\n}\n\nexport function areIdsEqual(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n for (let index = 0; index < a.length; index += 1) {\n if (a.at(index) !== b.at(index)) return false;\n }\n\n return true;\n}\n\nexport function clearIds(): readonly string[] {\n return [];\n}\n\nexport function selectId({\n mode,\n ids,\n id,\n}: {\n mode: SelectionMode;\n ids: readonly string[];\n id: string;\n}): readonly string[] {\n if (mode === 'single') {\n return [id];\n }\n\n if (ids.includes(id)) {\n return ids;\n }\n\n return [...ids, id];\n}\n\nexport function toggleId({\n mode,\n ids,\n id,\n}: {\n mode: SelectionMode;\n ids: readonly string[];\n id: string;\n}): readonly string[] {\n if (ids.includes(id)) {\n return ids.filter((existingId) => existingId !== id);\n }\n\n if (mode === 'single') {\n return [id];\n }\n\n return [...ids, id];\n}\n"]}
1
+ {"version":3,"file":"resolveSelectionNextIds.js","sourceRoot":"","sources":["../../../../src/features/selection/utils/resolveSelectionNextIds.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAC1B,GAAkC,EAClC,IAAmB;IAEnB,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,IAAI,KAAK,QAAQ;YAAE,MAAM;IAC/B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CAAC,CAAoB,EAAE,CAAoB;IACpE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,QAAQ;IACtB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,QAAQ,CAAC,EACvB,IAAI,EACJ,GAAG,EACH,EAAE,GAKH;IACC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,GAAG,CAAC;IACjC,OAAO,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC","sourcesContent":["import type { SelectionMode } from '../../../types/selection';\n\n/*** Normalize selected ids to stable unique membership within the configured selection mode. */\nexport function normalizeIds(\n ids: readonly string[] | undefined,\n mode: SelectionMode,\n): readonly string[] {\n const uniqueIds: string[] = [];\n const seen = new Set<string>();\n\n for (const id of ids ?? []) {\n if (seen.has(id)) continue;\n seen.add(id);\n uniqueIds.push(id);\n if (mode === 'single') break;\n }\n\n return uniqueIds;\n}\n\n/*** Compare ordered selection ids without allocating replacement arrays. */\nexport function areIdsEqual(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n for (let index = 0; index < a.length; index += 1) {\n if (a.at(index) !== b.at(index)) return false;\n }\n\n return true;\n}\n\n/*** Produce the canonical empty selection. */\nexport function clearIds(): readonly string[] {\n return [];\n}\n\n/*** Ensure one id is selected while preserving multi-selection membership. */\nexport function selectId({\n mode,\n ids,\n id,\n}: {\n mode: SelectionMode;\n ids: readonly string[];\n id: string;\n}): readonly string[] {\n if (mode === 'single') return [id];\n if (ids.includes(id)) return ids;\n return [...ids, id];\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { SelectionIntent } from '@ankhorage/utility/selection';
1
2
  import React from 'react';
2
3
  import type { ZoraBaseProps } from '../../../../types/base';
3
4
  import type { TreeItemNode, TreeItemRenderProps } from '../../../../types/tree-view';
@@ -5,9 +6,9 @@ interface TreeItemProps<TId extends string = string> extends ZoraBaseProps {
5
6
  node: TreeItemNode<TId>;
6
7
  depth: number;
7
8
  expansionIndicator: 'chevron' | 'folder';
8
- selectedId?: TId;
9
+ selectedIds: readonly TId[];
9
10
  expandedIds: readonly TId[];
10
- onSelect?: (id: TId) => void;
11
+ onSelect?: (id: TId, intent: SelectionIntent) => void;
11
12
  onToggleExpand: (id: TId) => void;
12
13
  renderItem?: (props: TreeItemRenderProps<TId>) => React.ReactNode;
13
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TreeItem.d.ts","sourceRoot":"","sources":["../../../../../src/features/tree-view/adapters/inbound/TreeItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAOrF,UAAU,aAAa,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa;IACxE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,SAAS,GAAG,QAAQ,CAAC;IACzC,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,WAAW,EAAE,SAAS,GAAG,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,cAAc,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;CACnE;AAuGD,oDAAoD;AACpD,eAAO,MAAM,QAAQ,GArGE,GAAG,SAAS,MAAM,kEAqGgB,CAAC"}
1
+ {"version":3,"file":"TreeItem.d.ts","sourceRoot":"","sources":["../../../../../src/features/tree-view/adapters/inbound/TreeItem.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAQrF,UAAU,aAAa,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa;IACxE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,SAAS,GAAG,QAAQ,CAAC;IACzC,WAAW,EAAE,SAAS,GAAG,EAAE,CAAC;IAC5B,WAAW,EAAE,SAAS,GAAG,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACtD,cAAc,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;CACnE;AAmHD,oDAAoD;AACpD,eAAO,MAAM,QAAQ,GAjHE,GAAG,SAAS,MAAM,kEAiHgB,CAAC"}
@@ -1,14 +1,17 @@
1
+ import { Pressable } from '@ankhorage/surface';
1
2
  import React from 'react';
3
+ import { Platform } from 'react-native';
2
4
  import { IconButton } from '../../../button/public';
3
5
  import { Icon } from '../../../icon/public';
4
6
  import { View } from '../../../layout/public';
5
7
  import { ListItem } from '../../../list/public';
8
+ import { resolveSelectionEventIntent } from '../../../selection/public';
6
9
  import { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope';
7
10
  /*** Render one recursive themed tree row and keep row selection separate from expansion controls. */
8
- function TreeItemInner({ themeId: _themeId, mode: _mode, node, depth, expansionIndicator, selectedId, expandedIds, onSelect, onToggleExpand, renderItem, testID, interactionPolicy, }) {
11
+ function TreeItemInner({ themeId: _themeId, mode: _mode, node, depth, expansionIndicator, selectedIds, expandedIds, onSelect, onToggleExpand, renderItem, testID, interactionPolicy, }) {
9
12
  const hasChildren = node.children !== undefined && node.children.length > 0;
10
13
  const isExpanded = expandedIds.includes(node.id);
11
- const isSelected = selectedId === node.id;
14
+ const isSelected = selectedIds.includes(node.id);
12
15
  /*** Compose custom content or the selectable row independently of the expansion control. */
13
16
  const renderContent = () => {
14
17
  if (renderItem) {
@@ -28,7 +31,11 @@ function TreeItemInner({ themeId: _themeId, mode: _mode, node, depth, expansionI
28
31
  selected: isSelected,
29
32
  trailing: node.actions,
30
33
  };
31
- return onSelect === undefined ? (<ListItem {...listItemProps}/>) : (<ListItem {...listItemProps} onPress={() => onSelect(node.id)}/>);
34
+ if (onSelect === undefined)
35
+ return <ListItem {...listItemProps}/>;
36
+ return (<Pressable accessibilityRole="button" accessibilityState={{ disabled: node.disabled, selected: isSelected }} disabled={node.disabled} interactionPolicy={interactionPolicy} onPress={(event) => onSelect(node.id, resolveSelectionEventIntent(event, Platform.OS === 'web' ? 'pointer' : 'touch'))}>
37
+ <ListItem {...listItemProps}/>
38
+ </Pressable>);
32
39
  };
33
40
  return (<View testID={testID}>
34
41
  <View direction="row" align="center" style={{ paddingLeft: depth * 16 }}>
@@ -46,7 +53,7 @@ function TreeItemInner({ themeId: _themeId, mode: _mode, node, depth, expansionI
46
53
  <View style={{ flex: 1, minWidth: 0 }}>{renderContent()}</View>
47
54
  </View>
48
55
  {hasChildren && isExpanded ? (<View>
49
- {node.children?.map((child) => (<TreeItem key={child.id} depth={depth + 1} expandedIds={expandedIds} expansionIndicator={expansionIndicator} interactionPolicy={interactionPolicy} node={child} onSelect={onSelect} onToggleExpand={onToggleExpand} renderItem={renderItem} selectedId={selectedId}/>))}
56
+ {node.children?.map((child) => (<TreeItem key={child.id} depth={depth + 1} expandedIds={expandedIds} expansionIndicator={expansionIndicator} interactionPolicy={interactionPolicy} node={child} onSelect={onSelect} onToggleExpand={onToggleExpand} renderItem={renderItem} selectedIds={selectedIds}/>))}
50
57
  </View>) : null}
51
58
  </View>);
52
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TreeItem.js","sourceRoot":"","sources":["../../../../../src/features/tree-view/adapters/inbound/TreeItem.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport type { ZoraBaseProps } from '../../../../types/base';\nimport type { TreeItemNode, TreeItemRenderProps } from '../../../../types/tree-view';\nimport { IconButton } from '../../../button/public';\nimport { Icon } from '../../../icon/public';\nimport { View } from '../../../layout/public';\nimport { ListItem } from '../../../list/public';\nimport { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope';\n\ninterface TreeItemProps<TId extends string = string> extends ZoraBaseProps {\n node: TreeItemNode<TId>;\n depth: number;\n expansionIndicator: 'chevron' | 'folder';\n selectedId?: TId;\n expandedIds: readonly TId[];\n onSelect?: (id: TId) => void;\n onToggleExpand: (id: TId) => void;\n renderItem?: (props: TreeItemRenderProps<TId>) => React.ReactNode;\n}\n\n/*** Render one recursive themed tree row and keep row selection separate from expansion controls. */\nfunction TreeItemInner<TId extends string = string>({\n themeId: _themeId,\n mode: _mode,\n node,\n depth,\n expansionIndicator,\n selectedId,\n expandedIds,\n onSelect,\n onToggleExpand,\n renderItem,\n testID,\n interactionPolicy,\n}: TreeItemProps<TId>) {\n const hasChildren = node.children !== undefined && node.children.length > 0;\n const isExpanded = expandedIds.includes(node.id);\n const isSelected = selectedId === node.id;\n\n /*** Compose custom content or the selectable row independently of the expansion control. */\n const renderContent = () => {\n if (renderItem) {\n return renderItem({\n node,\n depth,\n selected: isSelected,\n expanded: isExpanded,\n hasChildren,\n });\n }\n\n const listItemProps = {\n title: node.label,\n leading:\n expansionIndicator === 'folder' || node.icon === undefined ? undefined : (\n <Icon {...node.icon} size=\"s\" />\n ),\n meta: node.meta,\n disabled: node.disabled,\n selected: isSelected,\n trailing: node.actions,\n };\n\n return onSelect === undefined ? (\n <ListItem {...listItemProps} />\n ) : (\n <ListItem {...listItemProps} onPress={() => onSelect(node.id)} />\n );\n };\n\n return (\n <View testID={testID}>\n <View direction=\"row\" align=\"center\" style={{ paddingLeft: depth * 16 }}>\n {hasChildren ? (\n <IconButton\n icon={{\n name:\n expansionIndicator === 'folder'\n ? isExpanded\n ? 'folder-open-outline'\n : 'folder-outline'\n : isExpanded\n ? 'chevron-down-outline'\n : 'chevron-forward-outline',\n }}\n disabled={node.disabled}\n interactionPolicy={interactionPolicy}\n label={isExpanded ? 'Collapse' : 'Expand'}\n onPress={() => onToggleExpand(node.id)}\n size=\"s\"\n variant=\"ghost\"\n />\n ) : (\n <View style={{ width: 32 }} align=\"center\">\n {expansionIndicator === 'folder' ? <Icon name=\"document-outline\" size=\"s\" /> : null}\n </View>\n )}\n <View style={{ flex: 1, minWidth: 0 }}>{renderContent()}</View>\n </View>\n {hasChildren && isExpanded ? (\n <View>\n {node.children?.map((child) => (\n <TreeItem\n key={child.id}\n depth={depth + 1}\n expandedIds={expandedIds}\n expansionIndicator={expansionIndicator}\n interactionPolicy={interactionPolicy}\n node={child}\n onSelect={onSelect}\n onToggleExpand={onToggleExpand}\n renderItem={renderItem}\n selectedId={selectedId}\n />\n ))}\n </View>\n ) : null}\n </View>\n );\n}\n\n/*** Single tree node row used within `TreeView`. */\nexport const TreeItem = withZoraThemeScope(TreeItemInner);\n"]}
1
+ {"version":3,"file":"TreeItem.js","sourceRoot":"","sources":["../../../../../src/features/tree-view/adapters/inbound/TreeItem.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Pressable } from '@ankhorage/surface';\nimport type { SelectionIntent } from '@ankhorage/utility/selection';\nimport React from 'react';\nimport { Platform } from 'react-native';\n\nimport type { ZoraBaseProps } from '../../../../types/base';\nimport type { TreeItemNode, TreeItemRenderProps } from '../../../../types/tree-view';\nimport { IconButton } from '../../../button/public';\nimport { Icon } from '../../../icon/public';\nimport { View } from '../../../layout/public';\nimport { ListItem } from '../../../list/public';\nimport { resolveSelectionEventIntent } from '../../../selection/public';\nimport { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope';\n\ninterface TreeItemProps<TId extends string = string> extends ZoraBaseProps {\n node: TreeItemNode<TId>;\n depth: number;\n expansionIndicator: 'chevron' | 'folder';\n selectedIds: readonly TId[];\n expandedIds: readonly TId[];\n onSelect?: (id: TId, intent: SelectionIntent) => void;\n onToggleExpand: (id: TId) => void;\n renderItem?: (props: TreeItemRenderProps<TId>) => React.ReactNode;\n}\n\n/*** Render one recursive themed tree row and keep row selection separate from expansion controls. */\nfunction TreeItemInner<TId extends string = string>({\n themeId: _themeId,\n mode: _mode,\n node,\n depth,\n expansionIndicator,\n selectedIds,\n expandedIds,\n onSelect,\n onToggleExpand,\n renderItem,\n testID,\n interactionPolicy,\n}: TreeItemProps<TId>) {\n const hasChildren = node.children !== undefined && node.children.length > 0;\n const isExpanded = expandedIds.includes(node.id);\n const isSelected = selectedIds.includes(node.id);\n\n /*** Compose custom content or the selectable row independently of the expansion control. */\n const renderContent = () => {\n if (renderItem) {\n return renderItem({\n node,\n depth,\n selected: isSelected,\n expanded: isExpanded,\n hasChildren,\n });\n }\n\n const listItemProps = {\n title: node.label,\n leading:\n expansionIndicator === 'folder' || node.icon === undefined ? undefined : (\n <Icon {...node.icon} size=\"s\" />\n ),\n meta: node.meta,\n disabled: node.disabled,\n selected: isSelected,\n trailing: node.actions,\n };\n\n if (onSelect === undefined) return <ListItem {...listItemProps} />;\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: node.disabled, selected: isSelected }}\n disabled={node.disabled}\n interactionPolicy={interactionPolicy}\n onPress={(event) =>\n onSelect(\n node.id,\n resolveSelectionEventIntent(event, Platform.OS === 'web' ? 'pointer' : 'touch'),\n )\n }\n >\n <ListItem {...listItemProps} />\n </Pressable>\n );\n };\n\n return (\n <View testID={testID}>\n <View direction=\"row\" align=\"center\" style={{ paddingLeft: depth * 16 }}>\n {hasChildren ? (\n <IconButton\n icon={{\n name:\n expansionIndicator === 'folder'\n ? isExpanded\n ? 'folder-open-outline'\n : 'folder-outline'\n : isExpanded\n ? 'chevron-down-outline'\n : 'chevron-forward-outline',\n }}\n disabled={node.disabled}\n interactionPolicy={interactionPolicy}\n label={isExpanded ? 'Collapse' : 'Expand'}\n onPress={() => onToggleExpand(node.id)}\n size=\"s\"\n variant=\"ghost\"\n />\n ) : (\n <View style={{ width: 32 }} align=\"center\">\n {expansionIndicator === 'folder' ? <Icon name=\"document-outline\" size=\"s\" /> : null}\n </View>\n )}\n <View style={{ flex: 1, minWidth: 0 }}>{renderContent()}</View>\n </View>\n {hasChildren && isExpanded ? (\n <View>\n {node.children?.map((child) => (\n <TreeItem\n key={child.id}\n depth={depth + 1}\n expandedIds={expandedIds}\n expansionIndicator={expansionIndicator}\n interactionPolicy={interactionPolicy}\n node={child}\n onSelect={onSelect}\n onToggleExpand={onToggleExpand}\n renderItem={renderItem}\n selectedIds={selectedIds}\n />\n ))}\n </View>\n ) : null}\n </View>\n );\n}\n\n/*** Single tree node row used within `TreeView`. */\nexport const TreeItem = withZoraThemeScope(TreeItemInner);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TreeView.d.ts","sourceRoot":"","sources":["../../../../../src/features/tree-view/adapters/inbound/TreeView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AA0DjE;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAxDE,GAAG,SAAS,MAAM,kEAwDgB,CAAC"}
1
+ {"version":3,"file":"TreeView.d.ts","sourceRoot":"","sources":["../../../../../src/features/tree-view/adapters/inbound/TreeView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAwDjE;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAtDE,GAAG,SAAS,MAAM,kEAsDgB,CAAC"}
@@ -3,8 +3,8 @@ import { View } from '../../../layout/public';
3
3
  import { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope';
4
4
  import { toggleExpandedIds } from '../../utils/toggleExpandedIds';
5
5
  import { TreeItem } from './TreeItem';
6
- /*** Render the themed TreeView while supporting controlled or internal expansion state. */
7
- function TreeViewInner({ themeId: _themeId, mode: _mode, nodes, selectedId, expandedIds: controlledExpandedIds, defaultExpandedIds, onSelect, onExpandedChange, renderItem, expansionIndicator = 'folder', testID, interactionPolicy, }) {
6
+ /*** Render the themed TreeView while supporting controlled selection and expansion state. */
7
+ function TreeViewInner({ themeId: _themeId, mode: _mode, nodes, selectedIds = [], expandedIds: controlledExpandedIds, defaultExpandedIds, onSelect, onExpandedChange, renderItem, expansionIndicator = 'folder', testID, interactionPolicy, }) {
8
8
  const [internalExpandedIds, setInternalExpandedIds] = React.useState(defaultExpandedIds ?? []);
9
9
  const isControlled = controlledExpandedIds !== undefined;
10
10
  const expandedIds = isControlled ? controlledExpandedIds : internalExpandedIds;
@@ -12,13 +12,12 @@ function TreeViewInner({ themeId: _themeId, mode: _mode, nodes, selectedId, expa
12
12
  if (interactionPolicy === 'passive')
13
13
  return;
14
14
  const nextExpandedIds = toggleExpandedIds(expandedIds, id);
15
- if (!isControlled) {
15
+ if (!isControlled)
16
16
  setInternalExpandedIds(nextExpandedIds);
17
- }
18
17
  onExpandedChange?.(nextExpandedIds);
19
18
  };
20
19
  return (<View gap="none" testID={testID}>
21
- {nodes.map((node) => (<TreeItem key={node.id} depth={0} expandedIds={expandedIds} expansionIndicator={expansionIndicator} node={node} onSelect={onSelect} onToggleExpand={handleToggleExpand} renderItem={renderItem} selectedId={selectedId} interactionPolicy={interactionPolicy}/>))}
20
+ {nodes.map((node) => (<TreeItem key={node.id} depth={0} expandedIds={expandedIds} expansionIndicator={expansionIndicator} node={node} onSelect={onSelect} onToggleExpand={handleToggleExpand} renderItem={renderItem} selectedIds={selectedIds} interactionPolicy={interactionPolicy}/>))}
22
21
  </View>);
23
22
  }
24
23
  /***
@@ -1 +1 @@
1
- {"version":3,"file":"TreeView.js","sourceRoot":"","sources":["../../../../../src/features/tree-view/adapters/inbound/TreeView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,2FAA2F;AAC3F,SAAS,aAAa,CAA8B,EAClD,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,KAAK,EACX,KAAK,EACL,UAAU,EACV,WAAW,EAAE,qBAAqB,EAClC,kBAAkB,EAClB,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,kBAAkB,GAAG,QAAQ,EAC7B,MAAM,EACN,iBAAiB,GACE;IACnB,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAClE,kBAAkB,IAAI,EAAE,CACzB,CAAC;IAEF,MAAM,YAAY,GAAG,qBAAqB,KAAK,SAAS,CAAC;IACzD,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAE/E,MAAM,kBAAkB,GAAG,CAAC,EAAO,EAAE,EAAE;QACrC,IAAI,iBAAiB,KAAK,SAAS;YAAE,OAAO;QAC5C,MAAM,eAAe,GAAG,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,sBAAsB,CAAC,eAAe,CAAC,CAAC;QAC1C,CAAC;QACD,gBAAgB,EAAE,CAAC,eAAe,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,OAAO,CACL,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAC9B;MAAA,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,CAAC,QAAQ,CACP,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACb,KAAK,CAAC,CAAC,CAAC,CAAC,CACT,WAAW,CAAC,CAAC,WAAW,CAAC,CACzB,kBAAkB,CAAC,CAAC,kBAAkB,CAAC,CACvC,IAAI,CAAC,CAAC,IAAI,CAAC,CACX,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,cAAc,CAAC,CAAC,kBAAkB,CAAC,CACnC,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,iBAAiB,CAAC,CAAC,iBAAiB,CAAC,EACrC,CACH,CAAC,CACJ;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC","sourcesContent":["import React from 'react';\n\nimport type { TreeViewProps } from '../../../../types/tree-view';\nimport { View } from '../../../layout/public';\nimport { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope';\nimport { toggleExpandedIds } from '../../utils/toggleExpandedIds';\nimport { TreeItem } from './TreeItem';\n\n/*** Render the themed TreeView while supporting controlled or internal expansion state. */\nfunction TreeViewInner<TId extends string = string>({\n themeId: _themeId,\n mode: _mode,\n nodes,\n selectedId,\n expandedIds: controlledExpandedIds,\n defaultExpandedIds,\n onSelect,\n onExpandedChange,\n renderItem,\n expansionIndicator = 'folder',\n testID,\n interactionPolicy,\n}: TreeViewProps<TId>) {\n const [internalExpandedIds, setInternalExpandedIds] = React.useState<readonly TId[]>(\n defaultExpandedIds ?? [],\n );\n\n const isControlled = controlledExpandedIds !== undefined;\n const expandedIds = isControlled ? controlledExpandedIds : internalExpandedIds;\n\n const handleToggleExpand = (id: TId) => {\n if (interactionPolicy === 'passive') return;\n const nextExpandedIds = toggleExpandedIds(expandedIds, id);\n\n if (!isControlled) {\n setInternalExpandedIds(nextExpandedIds);\n }\n onExpandedChange?.(nextExpandedIds);\n };\n\n return (\n <View gap=\"none\" testID={testID}>\n {nodes.map((node) => (\n <TreeItem\n key={node.id}\n depth={0}\n expandedIds={expandedIds}\n expansionIndicator={expansionIndicator}\n node={node}\n onSelect={onSelect}\n onToggleExpand={handleToggleExpand}\n renderItem={renderItem}\n selectedId={selectedId}\n interactionPolicy={interactionPolicy}\n />\n ))}\n </View>\n );\n}\n\n/***\n * Tree view pattern for hierarchical navigation and expandable lists.\n * expansionIndicator Select `folder` (default) or `chevron` for leading expansion controls.\n * Expansion controls are separate from row selection, including when rendering custom row content.\n */\nexport const TreeView = withZoraThemeScope(TreeViewInner);\n"]}
1
+ {"version":3,"file":"TreeView.js","sourceRoot":"","sources":["../../../../../src/features/tree-view/adapters/inbound/TreeView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,6FAA6F;AAC7F,SAAS,aAAa,CAA8B,EAClD,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,KAAK,EACX,KAAK,EACL,WAAW,GAAG,EAAE,EAChB,WAAW,EAAE,qBAAqB,EAClC,kBAAkB,EAClB,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,kBAAkB,GAAG,QAAQ,EAC7B,MAAM,EACN,iBAAiB,GACE;IACnB,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAClE,kBAAkB,IAAI,EAAE,CACzB,CAAC;IAEF,MAAM,YAAY,GAAG,qBAAqB,KAAK,SAAS,CAAC;IACzD,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAE/E,MAAM,kBAAkB,GAAG,CAAC,EAAO,EAAE,EAAE;QACrC,IAAI,iBAAiB,KAAK,SAAS;YAAE,OAAO;QAC5C,MAAM,eAAe,GAAG,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC,YAAY;YAAE,sBAAsB,CAAC,eAAe,CAAC,CAAC;QAC3D,gBAAgB,EAAE,CAAC,eAAe,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,OAAO,CACL,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAC9B;MAAA,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,CAAC,QAAQ,CACP,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACb,KAAK,CAAC,CAAC,CAAC,CAAC,CACT,WAAW,CAAC,CAAC,WAAW,CAAC,CACzB,kBAAkB,CAAC,CAAC,kBAAkB,CAAC,CACvC,IAAI,CAAC,CAAC,IAAI,CAAC,CACX,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,cAAc,CAAC,CAAC,kBAAkB,CAAC,CACnC,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,WAAW,CAAC,CAAC,WAAW,CAAC,CACzB,iBAAiB,CAAC,CAAC,iBAAiB,CAAC,EACrC,CACH,CAAC,CACJ;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC","sourcesContent":["import React from 'react';\n\nimport type { TreeViewProps } from '../../../../types/tree-view';\nimport { View } from '../../../layout/public';\nimport { withZoraThemeScope } from '../../../theme/adapters/inbound/withZoraThemeScope';\nimport { toggleExpandedIds } from '../../utils/toggleExpandedIds';\nimport { TreeItem } from './TreeItem';\n\n/*** Render the themed TreeView while supporting controlled selection and expansion state. */\nfunction TreeViewInner<TId extends string = string>({\n themeId: _themeId,\n mode: _mode,\n nodes,\n selectedIds = [],\n expandedIds: controlledExpandedIds,\n defaultExpandedIds,\n onSelect,\n onExpandedChange,\n renderItem,\n expansionIndicator = 'folder',\n testID,\n interactionPolicy,\n}: TreeViewProps<TId>) {\n const [internalExpandedIds, setInternalExpandedIds] = React.useState<readonly TId[]>(\n defaultExpandedIds ?? [],\n );\n\n const isControlled = controlledExpandedIds !== undefined;\n const expandedIds = isControlled ? controlledExpandedIds : internalExpandedIds;\n\n const handleToggleExpand = (id: TId) => {\n if (interactionPolicy === 'passive') return;\n const nextExpandedIds = toggleExpandedIds(expandedIds, id);\n\n if (!isControlled) setInternalExpandedIds(nextExpandedIds);\n onExpandedChange?.(nextExpandedIds);\n };\n\n return (\n <View gap=\"none\" testID={testID}>\n {nodes.map((node) => (\n <TreeItem\n key={node.id}\n depth={0}\n expandedIds={expandedIds}\n expansionIndicator={expansionIndicator}\n node={node}\n onSelect={onSelect}\n onToggleExpand={handleToggleExpand}\n renderItem={renderItem}\n selectedIds={selectedIds}\n interactionPolicy={interactionPolicy}\n />\n ))}\n </View>\n );\n}\n\n/***\n * Tree view pattern for hierarchical navigation and expandable lists.\n * expansionIndicator Select `folder` (default) or `chevron` for leading expansion controls.\n * Expansion controls are separate from row selection, including when rendering custom row content.\n */\nexport const TreeView = withZoraThemeScope(TreeViewInner);\n"]}
@@ -1,3 +1,4 @@
1
+ import type { SelectionIntent } from '@ankhorage/utility/selection';
1
2
  import React from 'react';
2
3
  import type { TreeItemNode, TreeItemRenderProps } from './TreeView';
3
4
  /*** Render one recursive browser tree row while keeping selection and expansion independent. */
@@ -6,9 +7,9 @@ interface TreeItemRowProps<TId extends string> {
6
7
  readonly node: TreeItemNode<TId>;
7
8
  readonly depth: number;
8
9
  readonly expansionIndicator: 'chevron' | 'folder';
9
- readonly selectedId?: TId;
10
+ readonly selectedIds: readonly TId[];
10
11
  readonly expandedIds: readonly TId[];
11
- readonly onSelect?: (id: TId) => void;
12
+ readonly onSelect?: (id: TId, intent: SelectionIntent) => void;
12
13
  readonly onToggleExpand: (id: TId) => void;
13
14
  readonly renderItem?: (props: TreeItemRenderProps<TId>) => React.ReactNode;
14
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TreeItemRow.d.ts","sourceRoot":"","sources":["../../../../../../src/features/tree-view/adapters/inbound/web-artifact/TreeItemRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpE,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,qBAuC3E;AAED,UAAU,gBAAgB,CAAC,GAAG,SAAS,MAAM;IAC3C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,kBAAkB,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClD,QAAQ,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS,GAAG,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;CAC5E"}
1
+ {"version":3,"file":"TreeItemRow.d.ts","sourceRoot":"","sources":["../../../../../../src/features/tree-view/adapters/inbound/web-artifact/TreeItemRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpE,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,qBAwC3E;AAED,UAAU,gBAAgB,CAAC,GAAG,SAAS,MAAM;IAC3C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,kBAAkB,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,SAAS,GAAG,EAAE,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,SAAS,GAAG,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;CAC5E"}