react-aria 3.49.0 → 3.50.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 (244) hide show
  1. package/dist/private/autocomplete/useAutocomplete.cjs +16 -7
  2. package/dist/private/autocomplete/useAutocomplete.cjs.map +1 -1
  3. package/dist/private/autocomplete/useAutocomplete.js +16 -7
  4. package/dist/private/autocomplete/useAutocomplete.js.map +1 -1
  5. package/dist/private/autocomplete/useAutocomplete.mjs +16 -7
  6. package/dist/private/autocomplete/useAutocomplete.mjs.map +1 -1
  7. package/dist/private/breadcrumbs/useBreadcrumbs.cjs.map +1 -1
  8. package/dist/private/breadcrumbs/useBreadcrumbs.js.map +1 -1
  9. package/dist/private/breadcrumbs/useBreadcrumbs.mjs.map +1 -1
  10. package/dist/private/calendar/useCalendarBase.cjs.map +1 -1
  11. package/dist/private/calendar/useCalendarBase.js.map +1 -1
  12. package/dist/private/calendar/useCalendarBase.mjs.map +1 -1
  13. package/dist/private/calendar/useCalendarCell.cjs.map +1 -1
  14. package/dist/private/calendar/useCalendarCell.js.map +1 -1
  15. package/dist/private/calendar/useCalendarCell.mjs.map +1 -1
  16. package/dist/private/calendar/useCalendarYearPicker.cjs +4 -4
  17. package/dist/private/calendar/useCalendarYearPicker.cjs.map +1 -1
  18. package/dist/private/calendar/useCalendarYearPicker.js +4 -4
  19. package/dist/private/calendar/useCalendarYearPicker.js.map +1 -1
  20. package/dist/private/calendar/useCalendarYearPicker.mjs +4 -4
  21. package/dist/private/calendar/useCalendarYearPicker.mjs.map +1 -1
  22. package/dist/private/calendar/utils.cjs.map +1 -1
  23. package/dist/private/calendar/utils.js.map +1 -1
  24. package/dist/private/calendar/utils.mjs.map +1 -1
  25. package/dist/private/color/useColorArea.cjs.map +1 -1
  26. package/dist/private/color/useColorArea.js.map +1 -1
  27. package/dist/private/color/useColorArea.mjs.map +1 -1
  28. package/dist/private/color/useColorSwatch.cjs.map +1 -1
  29. package/dist/private/color/useColorSwatch.js.map +1 -1
  30. package/dist/private/color/useColorSwatch.mjs.map +1 -1
  31. package/dist/private/combobox/useComboBox.cjs +2 -0
  32. package/dist/private/combobox/useComboBox.cjs.map +1 -1
  33. package/dist/private/combobox/useComboBox.js +2 -0
  34. package/dist/private/combobox/useComboBox.js.map +1 -1
  35. package/dist/private/combobox/useComboBox.mjs +2 -0
  36. package/dist/private/combobox/useComboBox.mjs.map +1 -1
  37. package/dist/private/datepicker/useDateField.cjs.map +1 -1
  38. package/dist/private/datepicker/useDateField.js.map +1 -1
  39. package/dist/private/datepicker/useDateField.mjs.map +1 -1
  40. package/dist/private/datepicker/useDatePicker.cjs.map +1 -1
  41. package/dist/private/datepicker/useDatePicker.js.map +1 -1
  42. package/dist/private/datepicker/useDatePicker.mjs.map +1 -1
  43. package/dist/private/datepicker/useDateRangePicker.cjs.map +1 -1
  44. package/dist/private/datepicker/useDateRangePicker.js.map +1 -1
  45. package/dist/private/datepicker/useDateRangePicker.mjs.map +1 -1
  46. package/dist/private/datepicker/useDisplayNames.cjs +1 -2
  47. package/dist/private/datepicker/useDisplayNames.cjs.map +1 -1
  48. package/dist/private/datepicker/useDisplayNames.js +1 -2
  49. package/dist/private/datepicker/useDisplayNames.js.map +1 -1
  50. package/dist/private/datepicker/useDisplayNames.mjs +1 -2
  51. package/dist/private/datepicker/useDisplayNames.mjs.map +1 -1
  52. package/dist/private/dnd/DragManager.cjs +4 -1
  53. package/dist/private/dnd/DragManager.cjs.map +1 -1
  54. package/dist/private/dnd/DragManager.js +4 -1
  55. package/dist/private/dnd/DragManager.js.map +1 -1
  56. package/dist/private/dnd/DragManager.mjs +4 -1
  57. package/dist/private/dnd/DragManager.mjs.map +1 -1
  58. package/dist/private/dnd/useDrag.cjs.map +1 -1
  59. package/dist/private/dnd/useDrag.js.map +1 -1
  60. package/dist/private/dnd/useDrag.mjs.map +1 -1
  61. package/dist/private/dnd/useDraggableItem.cjs.map +1 -1
  62. package/dist/private/dnd/useDraggableItem.js.map +1 -1
  63. package/dist/private/dnd/useDraggableItem.mjs.map +1 -1
  64. package/dist/private/dnd/useDropIndicator.cjs.map +1 -1
  65. package/dist/private/dnd/useDropIndicator.js.map +1 -1
  66. package/dist/private/dnd/useDropIndicator.mjs.map +1 -1
  67. package/dist/private/dnd/useVirtualDrop.cjs.map +1 -1
  68. package/dist/private/dnd/useVirtualDrop.js.map +1 -1
  69. package/dist/private/dnd/useVirtualDrop.mjs.map +1 -1
  70. package/dist/private/dnd/utils.cjs +13 -3
  71. package/dist/private/dnd/utils.cjs.map +1 -1
  72. package/dist/private/dnd/utils.js +13 -3
  73. package/dist/private/dnd/utils.js.map +1 -1
  74. package/dist/private/dnd/utils.mjs +13 -3
  75. package/dist/private/dnd/utils.mjs.map +1 -1
  76. package/dist/private/form/useFormValidation.cjs +1 -1
  77. package/dist/private/form/useFormValidation.cjs.map +1 -1
  78. package/dist/private/form/useFormValidation.js +1 -1
  79. package/dist/private/form/useFormValidation.js.map +1 -1
  80. package/dist/private/form/useFormValidation.mjs +1 -1
  81. package/dist/private/form/useFormValidation.mjs.map +1 -1
  82. package/dist/private/grid/useGridSelectionAnnouncement.cjs.map +1 -1
  83. package/dist/private/grid/useGridSelectionAnnouncement.js.map +1 -1
  84. package/dist/private/grid/useGridSelectionAnnouncement.mjs.map +1 -1
  85. package/dist/private/grid/useGridSelectionCheckbox.cjs.map +1 -1
  86. package/dist/private/grid/useGridSelectionCheckbox.js.map +1 -1
  87. package/dist/private/grid/useGridSelectionCheckbox.mjs.map +1 -1
  88. package/dist/private/grid/useHighlightSelectionDescription.cjs.map +1 -1
  89. package/dist/private/grid/useHighlightSelectionDescription.js.map +1 -1
  90. package/dist/private/grid/useHighlightSelectionDescription.mjs.map +1 -1
  91. package/dist/private/gridlist/useGridList.cjs +2 -1
  92. package/dist/private/gridlist/useGridList.cjs.map +1 -1
  93. package/dist/private/gridlist/useGridList.js +2 -1
  94. package/dist/private/gridlist/useGridList.js.map +1 -1
  95. package/dist/private/gridlist/useGridList.mjs +2 -1
  96. package/dist/private/gridlist/useGridList.mjs.map +1 -1
  97. package/dist/private/gridlist/useGridListItem.cjs +62 -21
  98. package/dist/private/gridlist/useGridListItem.cjs.map +1 -1
  99. package/dist/private/gridlist/useGridListItem.js +63 -22
  100. package/dist/private/gridlist/useGridListItem.js.map +1 -1
  101. package/dist/private/gridlist/useGridListItem.mjs +62 -21
  102. package/dist/private/gridlist/useGridListItem.mjs.map +1 -1
  103. package/dist/private/interactions/createEventHandler.cjs +3 -0
  104. package/dist/private/interactions/createEventHandler.cjs.map +1 -1
  105. package/dist/private/interactions/createEventHandler.js +3 -0
  106. package/dist/private/interactions/createEventHandler.js.map +1 -1
  107. package/dist/private/interactions/createEventHandler.mjs +3 -0
  108. package/dist/private/interactions/createEventHandler.mjs.map +1 -1
  109. package/dist/private/interactions/useFocusVisible.cjs +16 -5
  110. package/dist/private/interactions/useFocusVisible.cjs.map +1 -1
  111. package/dist/private/interactions/useFocusVisible.js +16 -5
  112. package/dist/private/interactions/useFocusVisible.js.map +1 -1
  113. package/dist/private/interactions/useFocusVisible.mjs +16 -5
  114. package/dist/private/interactions/useFocusVisible.mjs.map +1 -1
  115. package/dist/private/menu/useMenu.cjs.map +1 -1
  116. package/dist/private/menu/useMenu.js.map +1 -1
  117. package/dist/private/menu/useMenu.mjs.map +1 -1
  118. package/dist/private/menu/useMenuItem.cjs +1 -1
  119. package/dist/private/menu/useMenuItem.cjs.map +1 -1
  120. package/dist/private/menu/useMenuItem.js +1 -1
  121. package/dist/private/menu/useMenuItem.js.map +1 -1
  122. package/dist/private/menu/useMenuItem.mjs +1 -1
  123. package/dist/private/menu/useMenuItem.mjs.map +1 -1
  124. package/dist/private/menu/useMenuTrigger.cjs.map +1 -1
  125. package/dist/private/menu/useMenuTrigger.js.map +1 -1
  126. package/dist/private/menu/useMenuTrigger.mjs.map +1 -1
  127. package/dist/private/menu/utils.cjs.map +1 -1
  128. package/dist/private/menu/utils.js.map +1 -1
  129. package/dist/private/menu/utils.mjs.map +1 -1
  130. package/dist/private/numberfield/useNumberField.cjs.map +1 -1
  131. package/dist/private/numberfield/useNumberField.js.map +1 -1
  132. package/dist/private/numberfield/useNumberField.mjs.map +1 -1
  133. package/dist/private/overlays/DismissButton.cjs.map +1 -1
  134. package/dist/private/overlays/DismissButton.js.map +1 -1
  135. package/dist/private/overlays/DismissButton.mjs.map +1 -1
  136. package/dist/private/overlays/calculatePosition.cjs +7 -7
  137. package/dist/private/overlays/calculatePosition.cjs.map +1 -1
  138. package/dist/private/overlays/calculatePosition.js +7 -7
  139. package/dist/private/overlays/calculatePosition.js.map +1 -1
  140. package/dist/private/overlays/calculatePosition.mjs +7 -7
  141. package/dist/private/overlays/calculatePosition.mjs.map +1 -1
  142. package/dist/private/overlays/useOverlayPosition.cjs +3 -2
  143. package/dist/private/overlays/useOverlayPosition.cjs.map +1 -1
  144. package/dist/private/overlays/useOverlayPosition.js +3 -2
  145. package/dist/private/overlays/useOverlayPosition.js.map +1 -1
  146. package/dist/private/overlays/useOverlayPosition.mjs +3 -2
  147. package/dist/private/overlays/useOverlayPosition.mjs.map +1 -1
  148. package/dist/private/searchfield/useSearchField.cjs.map +1 -1
  149. package/dist/private/searchfield/useSearchField.js.map +1 -1
  150. package/dist/private/searchfield/useSearchField.mjs.map +1 -1
  151. package/dist/private/select/useSelect.cjs +1 -2
  152. package/dist/private/select/useSelect.cjs.map +1 -1
  153. package/dist/private/select/useSelect.js +1 -2
  154. package/dist/private/select/useSelect.js.map +1 -1
  155. package/dist/private/select/useSelect.mjs +1 -2
  156. package/dist/private/select/useSelect.mjs.map +1 -1
  157. package/dist/private/selection/ListKeyboardDelegate.cjs +31 -3
  158. package/dist/private/selection/ListKeyboardDelegate.cjs.map +1 -1
  159. package/dist/private/selection/ListKeyboardDelegate.js +31 -3
  160. package/dist/private/selection/ListKeyboardDelegate.js.map +1 -1
  161. package/dist/private/selection/ListKeyboardDelegate.mjs +31 -3
  162. package/dist/private/selection/ListKeyboardDelegate.mjs.map +1 -1
  163. package/dist/private/selection/useSelectableCollection.cjs +20 -14
  164. package/dist/private/selection/useSelectableCollection.cjs.map +1 -1
  165. package/dist/private/selection/useSelectableCollection.js +26 -19
  166. package/dist/private/selection/useSelectableCollection.js.map +1 -1
  167. package/dist/private/selection/useSelectableCollection.mjs +20 -14
  168. package/dist/private/selection/useSelectableCollection.mjs.map +1 -1
  169. package/dist/private/selection/useTypeSelect.cjs +50 -18
  170. package/dist/private/selection/useTypeSelect.cjs.map +1 -1
  171. package/dist/private/selection/useTypeSelect.js +51 -19
  172. package/dist/private/selection/useTypeSelect.js.map +1 -1
  173. package/dist/private/selection/useTypeSelect.mjs +51 -19
  174. package/dist/private/selection/useTypeSelect.mjs.map +1 -1
  175. package/dist/private/spinbutton/useSpinButton.cjs.map +1 -1
  176. package/dist/private/spinbutton/useSpinButton.js.map +1 -1
  177. package/dist/private/spinbutton/useSpinButton.mjs.map +1 -1
  178. package/dist/private/steplist/useStepList.cjs.map +1 -1
  179. package/dist/private/steplist/useStepList.js.map +1 -1
  180. package/dist/private/steplist/useStepList.mjs.map +1 -1
  181. package/dist/private/table/useTable.cjs.map +1 -1
  182. package/dist/private/table/useTable.js.map +1 -1
  183. package/dist/private/table/useTable.mjs.map +1 -1
  184. package/dist/private/table/useTableColumnHeader.cjs.map +1 -1
  185. package/dist/private/table/useTableColumnHeader.js.map +1 -1
  186. package/dist/private/table/useTableColumnHeader.mjs.map +1 -1
  187. package/dist/private/table/useTableColumnResize.cjs.map +1 -1
  188. package/dist/private/table/useTableColumnResize.js.map +1 -1
  189. package/dist/private/table/useTableColumnResize.mjs.map +1 -1
  190. package/dist/private/table/useTableRow.cjs.map +1 -1
  191. package/dist/private/table/useTableRow.js.map +1 -1
  192. package/dist/private/table/useTableRow.mjs.map +1 -1
  193. package/dist/private/table/useTableSelectionCheckbox.cjs.map +1 -1
  194. package/dist/private/table/useTableSelectionCheckbox.js.map +1 -1
  195. package/dist/private/table/useTableSelectionCheckbox.mjs.map +1 -1
  196. package/dist/private/tabs/TabsKeyboardDelegate.cjs +2 -2
  197. package/dist/private/tabs/TabsKeyboardDelegate.cjs.map +1 -1
  198. package/dist/private/tabs/TabsKeyboardDelegate.js +2 -2
  199. package/dist/private/tabs/TabsKeyboardDelegate.js.map +1 -1
  200. package/dist/private/tabs/TabsKeyboardDelegate.mjs +2 -2
  201. package/dist/private/tabs/TabsKeyboardDelegate.mjs.map +1 -1
  202. package/dist/private/tag/useTag.cjs.map +1 -1
  203. package/dist/private/tag/useTag.js.map +1 -1
  204. package/dist/private/tag/useTag.mjs.map +1 -1
  205. package/dist/private/toast/useToast.cjs.map +1 -1
  206. package/dist/private/toast/useToast.js.map +1 -1
  207. package/dist/private/toast/useToast.mjs.map +1 -1
  208. package/dist/private/toast/useToastRegion.cjs.map +1 -1
  209. package/dist/private/toast/useToastRegion.js.map +1 -1
  210. package/dist/private/toast/useToastRegion.mjs.map +1 -1
  211. package/dist/private/toolbar/useToolbar.cjs +0 -1
  212. package/dist/private/toolbar/useToolbar.cjs.map +1 -1
  213. package/dist/private/toolbar/useToolbar.js +0 -1
  214. package/dist/private/toolbar/useToolbar.js.map +1 -1
  215. package/dist/private/toolbar/useToolbar.mjs +0 -1
  216. package/dist/private/toolbar/useToolbar.mjs.map +1 -1
  217. package/dist/private/tree/useTree.cjs.map +1 -1
  218. package/dist/private/tree/useTree.js.map +1 -1
  219. package/dist/private/tree/useTree.mjs.map +1 -1
  220. package/dist/private/tree/useTreeItem.cjs.map +1 -1
  221. package/dist/private/tree/useTreeItem.js.map +1 -1
  222. package/dist/private/tree/useTreeItem.mjs.map +1 -1
  223. package/dist/private/utils/isElementVisible.cjs +1 -1
  224. package/dist/private/utils/isElementVisible.cjs.map +1 -1
  225. package/dist/private/utils/isElementVisible.js +1 -1
  226. package/dist/private/utils/isElementVisible.js.map +1 -1
  227. package/dist/private/utils/isElementVisible.mjs +1 -1
  228. package/dist/private/utils/isElementVisible.mjs.map +1 -1
  229. package/dist/private/utils/isFocusable.cjs +3 -1
  230. package/dist/private/utils/isFocusable.cjs.map +1 -1
  231. package/dist/private/utils/isFocusable.js +3 -1
  232. package/dist/private/utils/isFocusable.js.map +1 -1
  233. package/dist/private/utils/isFocusable.mjs +3 -1
  234. package/dist/private/utils/isFocusable.mjs.map +1 -1
  235. package/dist/types/src/dnd/utils.d.ts +2 -2
  236. package/dist/types/src/gridlist/useGridList.d.ts +7 -0
  237. package/dist/types/src/menu/useMenu.d.ts +1 -1
  238. package/dist/types/src/menu/utils.d.ts +1 -1
  239. package/dist/types/src/overlays/calculatePosition.d.ts +1 -0
  240. package/dist/types/src/overlays/useOverlayPosition.d.ts +8 -0
  241. package/dist/types/src/selection/ListKeyboardDelegate.d.ts +1 -0
  242. package/dist/types/src/selection/useSelectableCollection.d.ts +7 -0
  243. package/dist/types/src/tree/useTree.d.ts +1 -1
  244. package/package.json +4 -4
@@ -1,4 +1,5 @@
1
1
  import {DOMLayoutDelegate as $b97f9e0227e72afb$export$8f5ed9ff9f511381} from "./DOMLayoutDelegate.js";
2
+ import {getItemElement as $8f207f199487227b$export$c3d8340acf92597f} from "./utils.js";
2
3
  import {isScrollable as $46e0700f90dc2e20$export$2bb74740c4e19def} from "../utils/isScrollable.js";
3
4
 
4
5
  /*
@@ -13,6 +14,7 @@ import {isScrollable as $46e0700f90dc2e20$export$2bb74740c4e19def} from "../util
13
14
  * governing permissions and limitations under the License.
14
15
  */
15
16
 
17
+
16
18
  class $abb04fbee71f000f$export$a05409b8bb224a5a {
17
19
  isDisabled(item) {
18
20
  var _item_props, _item_props1;
@@ -56,12 +58,34 @@ class $abb04fbee71f000f$export$a05409b8bb224a5a {
56
58
  isSameColumn(prevRect, itemRect) {
57
59
  return prevRect.x === itemRect.x || prevRect.y !== itemRect.y;
58
60
  }
61
+ // checks to see if the next/prev key is spatially above/below the current key. If not, that means we are in
62
+ // a reversed column layout and need to adjust appropriately
63
+ // TODO: still need to see how this works with virtualizer once there is handling for the reverse layout
64
+ // this felt like a simpler approach then changing getKeyAbove/Below to be purely spatial calculations
65
+ isReversed(key) {
66
+ let nextKey = this.getNextKey(key);
67
+ let currentEl = (0, $8f207f199487227b$export$c3d8340acf92597f)(this.ref, key);
68
+ if (nextKey != null) {
69
+ let nextEl = (0, $8f207f199487227b$export$c3d8340acf92597f)(this.ref, nextKey);
70
+ if (!currentEl || !nextEl) return false;
71
+ return currentEl.getBoundingClientRect().top > nextEl.getBoundingClientRect().top;
72
+ }
73
+ let prevKey = this.getPreviousKey(key);
74
+ if (prevKey != null) {
75
+ let prevEl = (0, $8f207f199487227b$export$c3d8340acf92597f)(this.ref, prevKey);
76
+ if (!currentEl || !prevEl) return false;
77
+ return prevEl.getBoundingClientRect().top > currentEl.getBoundingClientRect().top;
78
+ }
79
+ return false;
80
+ }
59
81
  getKeyBelow(key, options) {
60
82
  if (this.layout === 'grid' && this.orientation === 'vertical') return this.findKey(key, (key)=>this.getNextKey(key, options), this.isSameRow);
83
+ else if (this.orientation === 'vertical') return this.isReversed(key) ? this.getPreviousKey(key, options) : this.getNextKey(key, options);
61
84
  else return this.getNextKey(key, options);
62
85
  }
63
86
  getKeyAbove(key, options) {
64
87
  if (this.layout === 'grid' && this.orientation === 'vertical') return this.findKey(key, (key)=>this.getPreviousKey(key, options), this.isSameRow);
88
+ else if (this.orientation === 'vertical') return this.isReversed(key) ? this.getNextKey(key, options) : this.getPreviousKey(key, options);
65
89
  else return this.getPreviousKey(key, options);
66
90
  }
67
91
  getNextColumn(key, right, options) {
@@ -105,6 +129,7 @@ class $abb04fbee71f000f$export$a05409b8bb224a5a {
105
129
  let menu = this.ref.current;
106
130
  let itemRect = this.layoutDelegate.getItemRect(key);
107
131
  if (!itemRect) return null;
132
+ let reversed = this.isReversed(key);
108
133
  if (menu && !(0, $46e0700f90dc2e20$export$2bb74740c4e19def)(menu)) return this.getFirstKey();
109
134
  let nextKey = key;
110
135
  if (this.orientation === 'horizontal') {
@@ -114,18 +139,21 @@ class $abb04fbee71f000f$export$a05409b8bb224a5a {
114
139
  itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);
115
140
  }
116
141
  } else {
117
- let pageY = Math.max(0, itemRect.y + itemRect.height - this.layoutDelegate.getVisibleRect().height);
142
+ let visibleRect = this.layoutDelegate.getVisibleRect();
143
+ // column reverse makes y negative for items so we need to instead do current pos - height instead
144
+ let pageY = reversed ? itemRect.y - visibleRect.height : Math.max(0, itemRect.y + itemRect.height - visibleRect.height);
118
145
  while(itemRect && itemRect.y > pageY && nextKey != null){
119
146
  nextKey = this.getKeyAbove(nextKey);
120
147
  itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);
121
148
  }
122
149
  }
123
- return nextKey !== null && nextKey !== void 0 ? nextKey : this.getFirstKey();
150
+ return nextKey !== null && nextKey !== void 0 ? nextKey : reversed ? this.getLastKey() : this.getFirstKey();
124
151
  }
125
152
  getKeyPageBelow(key) {
126
153
  let menu = this.ref.current;
127
154
  let itemRect = this.layoutDelegate.getItemRect(key);
128
155
  if (!itemRect) return null;
156
+ let reversed = this.isReversed(key);
129
157
  if (menu && !(0, $46e0700f90dc2e20$export$2bb74740c4e19def)(menu)) return this.getLastKey();
130
158
  let nextKey = key;
131
159
  if (this.orientation === 'horizontal') {
@@ -141,7 +169,7 @@ class $abb04fbee71f000f$export$a05409b8bb224a5a {
141
169
  itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);
142
170
  }
143
171
  }
144
- return nextKey !== null && nextKey !== void 0 ? nextKey : this.getLastKey();
172
+ return nextKey !== null && nextKey !== void 0 ? nextKey : reversed ? this.getFirstKey() : this.getLastKey();
145
173
  }
146
174
  getKeyForSearch(search, fromKey) {
147
175
  if (!this.collator) return null;
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/react-aria/src/selection/ListKeyboardDelegate.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection,\n Direction,\n DisabledBehavior,\n Key,\n KeyboardDelegate,\n LayoutDelegate,\n Node,\n Orientation,\n Rect,\n RefObject\n} from '@react-types/shared';\nimport {DOMLayoutDelegate} from './DOMLayoutDelegate';\nimport {isScrollable} from '../utils/isScrollable';\n\ninterface ListKeyboardDelegateOptions<T> {\n collection: Collection<Node<T>>;\n ref: RefObject<HTMLElement | null>;\n collator?: Intl.Collator;\n layout?: 'stack' | 'grid';\n orientation?: Orientation;\n direction?: Direction;\n disabledKeys?: Set<Key>;\n disabledBehavior?: DisabledBehavior;\n layoutDelegate?: LayoutDelegate;\n}\n\nexport class ListKeyboardDelegate<T> implements KeyboardDelegate {\n private collection: Collection<Node<T>>;\n private disabledKeys: Set<Key>;\n private disabledBehavior: DisabledBehavior;\n private ref: RefObject<HTMLElement | null>;\n private collator: Intl.Collator | undefined;\n private layout: 'stack' | 'grid';\n private orientation?: Orientation;\n private direction?: Direction;\n private layoutDelegate: LayoutDelegate;\n\n constructor(\n collection: Collection<Node<T>>,\n disabledKeys: Set<Key>,\n ref: RefObject<HTMLElement | null>,\n collator?: Intl.Collator,\n expandedKeys?: Set<Key>\n );\n constructor(options: ListKeyboardDelegateOptions<T>);\n constructor(...args: any[]) {\n if (args.length === 1) {\n let opts = args[0] as ListKeyboardDelegateOptions<T>;\n this.collection = opts.collection;\n this.ref = opts.ref;\n this.collator = opts.collator;\n this.disabledKeys = opts.disabledKeys || new Set();\n this.disabledBehavior = opts.disabledBehavior || 'all';\n this.orientation = opts.orientation || 'vertical';\n this.direction = opts.direction;\n this.layout = opts.layout || 'stack';\n this.layoutDelegate = opts.layoutDelegate || new DOMLayoutDelegate(opts.ref);\n } else {\n this.collection = args[0];\n this.disabledKeys = args[1];\n this.ref = args[2];\n this.collator = args[3];\n this.layout = 'stack';\n this.orientation = 'vertical';\n this.disabledBehavior = 'all';\n this.layoutDelegate = new DOMLayoutDelegate(this.ref);\n }\n\n // If this is a vertical stack, remove the left/right methods completely\n // so they aren't called by useDroppableCollection.\n if (this.layout === 'stack' && this.orientation === 'vertical') {\n this.getKeyLeftOf = undefined;\n this.getKeyRightOf = undefined;\n }\n }\n\n private isDisabled(item: Node<unknown>) {\n return (\n this.disabledBehavior === 'all' &&\n (item.props?.isDisabled || this.disabledKeys.has(item.key)) &&\n item.props?.disabledBehavior !== 'selection'\n );\n }\n\n private findNextNonDisabled(\n key: Key | null,\n getNext: (key: Key) => Key | null,\n includeDisabled = false\n ): Key | null {\n let nextKey = key;\n while (nextKey != null) {\n let item = this.collection.getItem(nextKey);\n if (item?.type === 'item' && (includeDisabled || !this.isDisabled(item))) {\n return nextKey;\n }\n\n nextKey = getNext(nextKey);\n }\n\n return null;\n }\n\n getNextKey(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let nextKey: Key | null = key;\n nextKey = this.collection.getKeyAfter(nextKey);\n return this.findNextNonDisabled(\n nextKey,\n key => this.collection.getKeyAfter(key),\n options?.includeDisabled\n );\n }\n\n getPreviousKey(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let nextKey: Key | null = key;\n nextKey = this.collection.getKeyBefore(nextKey);\n return this.findNextNonDisabled(\n nextKey,\n key => this.collection.getKeyBefore(key),\n options?.includeDisabled\n );\n }\n\n private findKey(\n key: Key,\n nextKey: (key: Key) => Key | null,\n shouldSkip: (prevRect: Rect, itemRect: Rect) => boolean\n ) {\n let tempKey: Key | null = key;\n let itemRect = this.layoutDelegate.getItemRect(tempKey);\n if (!itemRect || tempKey == null) {\n return null;\n }\n\n // Find the item above or below in the same column.\n let prevRect = itemRect;\n do {\n tempKey = nextKey(tempKey);\n if (tempKey == null) {\n break;\n }\n itemRect = this.layoutDelegate.getItemRect(tempKey);\n } while (itemRect && shouldSkip(prevRect, itemRect) && tempKey != null);\n\n return tempKey;\n }\n\n private isSameRow(prevRect: Rect, itemRect: Rect) {\n return prevRect.y === itemRect.y || prevRect.x !== itemRect.x;\n }\n\n private isSameColumn(prevRect: Rect, itemRect: Rect) {\n return prevRect.x === itemRect.x || prevRect.y !== itemRect.y;\n }\n\n getKeyBelow(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n if (this.layout === 'grid' && this.orientation === 'vertical') {\n return this.findKey(key, key => this.getNextKey(key, options), this.isSameRow);\n } else {\n return this.getNextKey(key, options);\n }\n }\n\n getKeyAbove(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n if (this.layout === 'grid' && this.orientation === 'vertical') {\n return this.findKey(key, key => this.getPreviousKey(key, options), this.isSameRow);\n } else {\n return this.getPreviousKey(key, options);\n }\n }\n\n private getNextColumn(key: Key, right: boolean, options?: {includeDisabled?: boolean}) {\n return right ? this.getPreviousKey(key, options) : this.getNextKey(key, options);\n }\n\n getKeyRightOf?(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n // This is a temporary solution for CardView until we refactor useSelectableCollection.\n // https://github.com/orgs/adobe/projects/19/views/32?pane=issue&itemId=77825042\n let layoutDelegateMethod = this.direction === 'ltr' ? 'getKeyRightOf' : 'getKeyLeftOf';\n if (this.layoutDelegate[layoutDelegateMethod]) {\n key = this.layoutDelegate[layoutDelegateMethod](key);\n return this.findNextNonDisabled(\n key,\n key => this.layoutDelegate[layoutDelegateMethod](key),\n options?.includeDisabled\n );\n }\n\n if (this.layout === 'grid') {\n if (this.orientation === 'vertical') {\n return this.getNextColumn(key, this.direction === 'rtl', options);\n } else {\n return this.findKey(\n key,\n key => this.getNextColumn(key, this.direction === 'rtl', options),\n this.isSameColumn\n );\n }\n } else if (this.orientation === 'horizontal') {\n return this.getNextColumn(key, this.direction === 'rtl', options);\n }\n\n return null;\n }\n\n getKeyLeftOf?(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let layoutDelegateMethod = this.direction === 'ltr' ? 'getKeyLeftOf' : 'getKeyRightOf';\n if (this.layoutDelegate[layoutDelegateMethod]) {\n key = this.layoutDelegate[layoutDelegateMethod](key);\n return this.findNextNonDisabled(\n key,\n key => this.layoutDelegate[layoutDelegateMethod](key),\n options?.includeDisabled\n );\n }\n\n if (this.layout === 'grid') {\n if (this.orientation === 'vertical') {\n return this.getNextColumn(key, this.direction === 'ltr', options);\n } else {\n return this.findKey(\n key,\n key => this.getNextColumn(key, this.direction === 'ltr', options),\n this.isSameColumn\n );\n }\n } else if (this.orientation === 'horizontal') {\n return this.getNextColumn(key, this.direction === 'ltr', options);\n }\n\n return null;\n }\n\n getFirstKey(): Key | null {\n let key = this.collection.getFirstKey();\n return this.findNextNonDisabled(key, key => this.collection.getKeyAfter(key));\n }\n\n getLastKey(): Key | null {\n let key = this.collection.getLastKey();\n return this.findNextNonDisabled(key, key => this.collection.getKeyBefore(key));\n }\n\n getKeyPageAbove(key: Key): Key | null {\n let menu = this.ref.current;\n let itemRect = this.layoutDelegate.getItemRect(key);\n if (!itemRect) {\n return null;\n }\n\n if (menu && !isScrollable(menu)) {\n return this.getFirstKey();\n }\n\n let nextKey: Key | null = key;\n if (this.orientation === 'horizontal') {\n let pageX = Math.max(\n 0,\n itemRect.x + itemRect.width - this.layoutDelegate.getVisibleRect().width\n );\n\n while (itemRect && itemRect.x > pageX && nextKey != null) {\n nextKey = this.getKeyAbove(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n } else {\n let pageY = Math.max(\n 0,\n itemRect.y + itemRect.height - this.layoutDelegate.getVisibleRect().height\n );\n\n while (itemRect && itemRect.y > pageY && nextKey != null) {\n nextKey = this.getKeyAbove(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n }\n\n return nextKey ?? this.getFirstKey();\n }\n\n getKeyPageBelow(key: Key): Key | null {\n let menu = this.ref.current;\n let itemRect = this.layoutDelegate.getItemRect(key);\n if (!itemRect) {\n return null;\n }\n\n if (menu && !isScrollable(menu)) {\n return this.getLastKey();\n }\n\n let nextKey: Key | null = key;\n if (this.orientation === 'horizontal') {\n let pageX = Math.min(\n this.layoutDelegate.getContentSize().width,\n itemRect.x - itemRect.width + this.layoutDelegate.getVisibleRect().width\n );\n\n while (itemRect && itemRect.x < pageX && nextKey != null) {\n nextKey = this.getKeyBelow(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n } else {\n let pageY = Math.min(\n this.layoutDelegate.getContentSize().height,\n itemRect.y - itemRect.height + this.layoutDelegate.getVisibleRect().height\n );\n\n while (itemRect && itemRect.y < pageY && nextKey != null) {\n nextKey = this.getKeyBelow(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n }\n\n return nextKey ?? this.getLastKey();\n }\n\n getKeyForSearch(search: string, fromKey?: Key): Key | null {\n if (!this.collator) {\n return null;\n }\n\n let collection = this.collection;\n let key = fromKey || this.getFirstKey();\n while (key != null) {\n let item = collection.getItem(key);\n if (!item) {\n return null;\n }\n let substring = item.textValue.slice(0, search.length);\n if (item.textValue && this.collator.compare(substring, search) === 0) {\n return key;\n }\n\n key = this.getNextKey(key);\n }\n\n return null;\n }\n}\n"],"names":[],"version":3,"file":"ListKeyboardDelegate.js.map"}
1
+ {"mappings":"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","sources":["packages/react-aria/src/selection/ListKeyboardDelegate.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection,\n Direction,\n DisabledBehavior,\n Key,\n KeyboardDelegate,\n LayoutDelegate,\n Node,\n Orientation,\n Rect,\n RefObject\n} from '@react-types/shared';\nimport {DOMLayoutDelegate} from './DOMLayoutDelegate';\nimport {getItemElement} from './utils';\nimport {isScrollable} from '../utils/isScrollable';\n\ninterface ListKeyboardDelegateOptions<T> {\n collection: Collection<Node<T>>;\n ref: RefObject<HTMLElement | null>;\n collator?: Intl.Collator;\n layout?: 'stack' | 'grid';\n orientation?: Orientation;\n direction?: Direction;\n disabledKeys?: Set<Key>;\n disabledBehavior?: DisabledBehavior;\n layoutDelegate?: LayoutDelegate;\n}\n\nexport class ListKeyboardDelegate<T> implements KeyboardDelegate {\n private collection: Collection<Node<T>>;\n private disabledKeys: Set<Key>;\n private disabledBehavior: DisabledBehavior;\n private ref: RefObject<HTMLElement | null>;\n private collator: Intl.Collator | undefined;\n private layout: 'stack' | 'grid';\n private orientation?: Orientation;\n private direction?: Direction;\n private layoutDelegate: LayoutDelegate;\n\n constructor(\n collection: Collection<Node<T>>,\n disabledKeys: Set<Key>,\n ref: RefObject<HTMLElement | null>,\n collator?: Intl.Collator,\n expandedKeys?: Set<Key>\n );\n constructor(options: ListKeyboardDelegateOptions<T>);\n constructor(...args: any[]) {\n if (args.length === 1) {\n let opts = args[0] as ListKeyboardDelegateOptions<T>;\n this.collection = opts.collection;\n this.ref = opts.ref;\n this.collator = opts.collator;\n this.disabledKeys = opts.disabledKeys || new Set();\n this.disabledBehavior = opts.disabledBehavior || 'all';\n this.orientation = opts.orientation || 'vertical';\n this.direction = opts.direction;\n this.layout = opts.layout || 'stack';\n this.layoutDelegate = opts.layoutDelegate || new DOMLayoutDelegate(opts.ref);\n } else {\n this.collection = args[0];\n this.disabledKeys = args[1];\n this.ref = args[2];\n this.collator = args[3];\n this.layout = 'stack';\n this.orientation = 'vertical';\n this.disabledBehavior = 'all';\n this.layoutDelegate = new DOMLayoutDelegate(this.ref);\n }\n\n // If this is a vertical stack, remove the left/right methods completely\n // so they aren't called by useDroppableCollection.\n if (this.layout === 'stack' && this.orientation === 'vertical') {\n this.getKeyLeftOf = undefined;\n this.getKeyRightOf = undefined;\n }\n }\n\n private isDisabled(item: Node<unknown>) {\n return (\n this.disabledBehavior === 'all' &&\n (item.props?.isDisabled || this.disabledKeys.has(item.key)) &&\n item.props?.disabledBehavior !== 'selection'\n );\n }\n\n private findNextNonDisabled(\n key: Key | null,\n getNext: (key: Key) => Key | null,\n includeDisabled = false\n ): Key | null {\n let nextKey = key;\n while (nextKey != null) {\n let item = this.collection.getItem(nextKey);\n if (item?.type === 'item' && (includeDisabled || !this.isDisabled(item))) {\n return nextKey;\n }\n\n nextKey = getNext(nextKey);\n }\n\n return null;\n }\n\n getNextKey(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let nextKey: Key | null = key;\n nextKey = this.collection.getKeyAfter(nextKey);\n return this.findNextNonDisabled(\n nextKey,\n key => this.collection.getKeyAfter(key),\n options?.includeDisabled\n );\n }\n\n getPreviousKey(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let nextKey: Key | null = key;\n nextKey = this.collection.getKeyBefore(nextKey);\n return this.findNextNonDisabled(\n nextKey,\n key => this.collection.getKeyBefore(key),\n options?.includeDisabled\n );\n }\n\n private findKey(\n key: Key,\n nextKey: (key: Key) => Key | null,\n shouldSkip: (prevRect: Rect, itemRect: Rect) => boolean\n ) {\n let tempKey: Key | null = key;\n let itemRect = this.layoutDelegate.getItemRect(tempKey);\n if (!itemRect || tempKey == null) {\n return null;\n }\n\n // Find the item above or below in the same column.\n let prevRect = itemRect;\n do {\n tempKey = nextKey(tempKey);\n if (tempKey == null) {\n break;\n }\n itemRect = this.layoutDelegate.getItemRect(tempKey);\n } while (itemRect && shouldSkip(prevRect, itemRect) && tempKey != null);\n\n return tempKey;\n }\n\n private isSameRow(prevRect: Rect, itemRect: Rect) {\n return prevRect.y === itemRect.y || prevRect.x !== itemRect.x;\n }\n\n private isSameColumn(prevRect: Rect, itemRect: Rect) {\n return prevRect.x === itemRect.x || prevRect.y !== itemRect.y;\n }\n\n // checks to see if the next/prev key is spatially above/below the current key. If not, that means we are in\n // a reversed column layout and need to adjust appropriately\n // TODO: still need to see how this works with virtualizer once there is handling for the reverse layout\n // this felt like a simpler approach then changing getKeyAbove/Below to be purely spatial calculations\n private isReversed(key: Key): boolean {\n let nextKey = this.getNextKey(key);\n let currentEl = getItemElement(this.ref, key);\n if (nextKey != null) {\n let nextEl = getItemElement(this.ref, nextKey);\n if (!currentEl || !nextEl) {\n return false;\n }\n return currentEl.getBoundingClientRect().top > nextEl.getBoundingClientRect().top;\n }\n let prevKey = this.getPreviousKey(key);\n if (prevKey != null) {\n let prevEl = getItemElement(this.ref, prevKey);\n if (!currentEl || !prevEl) {\n return false;\n }\n return prevEl.getBoundingClientRect().top > currentEl.getBoundingClientRect().top;\n }\n return false;\n }\n\n getKeyBelow(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n if (this.layout === 'grid' && this.orientation === 'vertical') {\n return this.findKey(key, key => this.getNextKey(key, options), this.isSameRow);\n } else if (this.orientation === 'vertical') {\n return this.isReversed(key)\n ? this.getPreviousKey(key, options)\n : this.getNextKey(key, options);\n } else {\n return this.getNextKey(key, options);\n }\n }\n\n getKeyAbove(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n if (this.layout === 'grid' && this.orientation === 'vertical') {\n return this.findKey(key, key => this.getPreviousKey(key, options), this.isSameRow);\n } else if (this.orientation === 'vertical') {\n return this.isReversed(key)\n ? this.getNextKey(key, options)\n : this.getPreviousKey(key, options);\n } else {\n return this.getPreviousKey(key, options);\n }\n }\n\n private getNextColumn(key: Key, right: boolean, options?: {includeDisabled?: boolean}) {\n return right ? this.getPreviousKey(key, options) : this.getNextKey(key, options);\n }\n\n getKeyRightOf?(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n // This is a temporary solution for CardView until we refactor useSelectableCollection.\n // https://github.com/orgs/adobe/projects/19/views/32?pane=issue&itemId=77825042\n let layoutDelegateMethod = this.direction === 'ltr' ? 'getKeyRightOf' : 'getKeyLeftOf';\n if (this.layoutDelegate[layoutDelegateMethod]) {\n key = this.layoutDelegate[layoutDelegateMethod](key);\n return this.findNextNonDisabled(\n key,\n key => this.layoutDelegate[layoutDelegateMethod](key),\n options?.includeDisabled\n );\n }\n\n if (this.layout === 'grid') {\n if (this.orientation === 'vertical') {\n return this.getNextColumn(key, this.direction === 'rtl', options);\n } else {\n return this.findKey(\n key,\n key => this.getNextColumn(key, this.direction === 'rtl', options),\n this.isSameColumn\n );\n }\n } else if (this.orientation === 'horizontal') {\n return this.getNextColumn(key, this.direction === 'rtl', options);\n }\n\n return null;\n }\n\n getKeyLeftOf?(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let layoutDelegateMethod = this.direction === 'ltr' ? 'getKeyLeftOf' : 'getKeyRightOf';\n if (this.layoutDelegate[layoutDelegateMethod]) {\n key = this.layoutDelegate[layoutDelegateMethod](key);\n return this.findNextNonDisabled(\n key,\n key => this.layoutDelegate[layoutDelegateMethod](key),\n options?.includeDisabled\n );\n }\n\n if (this.layout === 'grid') {\n if (this.orientation === 'vertical') {\n return this.getNextColumn(key, this.direction === 'ltr', options);\n } else {\n return this.findKey(\n key,\n key => this.getNextColumn(key, this.direction === 'ltr', options),\n this.isSameColumn\n );\n }\n } else if (this.orientation === 'horizontal') {\n return this.getNextColumn(key, this.direction === 'ltr', options);\n }\n\n return null;\n }\n\n getFirstKey(): Key | null {\n let key = this.collection.getFirstKey();\n return this.findNextNonDisabled(key, key => this.collection.getKeyAfter(key));\n }\n\n getLastKey(): Key | null {\n let key = this.collection.getLastKey();\n return this.findNextNonDisabled(key, key => this.collection.getKeyBefore(key));\n }\n\n getKeyPageAbove(key: Key): Key | null {\n let menu = this.ref.current;\n let itemRect = this.layoutDelegate.getItemRect(key);\n if (!itemRect) {\n return null;\n }\n\n let reversed = this.isReversed(key);\n if (menu && !isScrollable(menu)) {\n return this.getFirstKey();\n }\n\n let nextKey: Key | null = key;\n if (this.orientation === 'horizontal') {\n let pageX = Math.max(\n 0,\n itemRect.x + itemRect.width - this.layoutDelegate.getVisibleRect().width\n );\n\n while (itemRect && itemRect.x > pageX && nextKey != null) {\n nextKey = this.getKeyAbove(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n } else {\n let visibleRect = this.layoutDelegate.getVisibleRect();\n // column reverse makes y negative for items so we need to instead do current pos - height instead\n let pageY = reversed\n ? itemRect.y - visibleRect.height\n : Math.max(0, itemRect.y + itemRect.height - visibleRect.height);\n\n while (itemRect && itemRect.y > pageY && nextKey != null) {\n nextKey = this.getKeyAbove(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n }\n\n return nextKey ?? (reversed ? this.getLastKey() : this.getFirstKey());\n }\n\n getKeyPageBelow(key: Key): Key | null {\n let menu = this.ref.current;\n let itemRect = this.layoutDelegate.getItemRect(key);\n if (!itemRect) {\n return null;\n }\n\n let reversed = this.isReversed(key);\n if (menu && !isScrollable(menu)) {\n return this.getLastKey();\n }\n\n let nextKey: Key | null = key;\n if (this.orientation === 'horizontal') {\n let pageX = Math.min(\n this.layoutDelegate.getContentSize().width,\n itemRect.x - itemRect.width + this.layoutDelegate.getVisibleRect().width\n );\n\n while (itemRect && itemRect.x < pageX && nextKey != null) {\n nextKey = this.getKeyBelow(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n } else {\n let pageY = Math.min(\n this.layoutDelegate.getContentSize().height,\n itemRect.y - itemRect.height + this.layoutDelegate.getVisibleRect().height\n );\n\n while (itemRect && itemRect.y < pageY && nextKey != null) {\n nextKey = this.getKeyBelow(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n }\n\n return nextKey ?? (reversed ? this.getFirstKey() : this.getLastKey());\n }\n\n getKeyForSearch(search: string, fromKey?: Key): Key | null {\n if (!this.collator) {\n return null;\n }\n\n let collection = this.collection;\n let key = fromKey || this.getFirstKey();\n while (key != null) {\n let item = collection.getItem(key);\n if (!item) {\n return null;\n }\n let substring = item.textValue.slice(0, search.length);\n if (item.textValue && this.collator.compare(substring, search) === 0) {\n return key;\n }\n\n key = this.getNextKey(key);\n }\n\n return null;\n }\n}\n"],"names":[],"version":3,"file":"ListKeyboardDelegate.js.map"}
@@ -1,4 +1,5 @@
1
1
  import {DOMLayoutDelegate as $a83747cc3f035330$export$8f5ed9ff9f511381} from "./DOMLayoutDelegate.mjs";
2
+ import {getItemElement as $22bbea12c2567021$export$c3d8340acf92597f} from "./utils.mjs";
2
3
  import {isScrollable as $901761b40e390936$export$2bb74740c4e19def} from "../utils/isScrollable.mjs";
3
4
 
4
5
  /*
@@ -13,6 +14,7 @@ import {isScrollable as $901761b40e390936$export$2bb74740c4e19def} from "../util
13
14
  * governing permissions and limitations under the License.
14
15
  */
15
16
 
17
+
16
18
  class $ae8f8d98b2b18f2f$export$a05409b8bb224a5a {
17
19
  constructor(...args){
18
20
  if (args.length === 1) {
@@ -84,12 +86,34 @@ class $ae8f8d98b2b18f2f$export$a05409b8bb224a5a {
84
86
  isSameColumn(prevRect, itemRect) {
85
87
  return prevRect.x === itemRect.x || prevRect.y !== itemRect.y;
86
88
  }
89
+ // checks to see if the next/prev key is spatially above/below the current key. If not, that means we are in
90
+ // a reversed column layout and need to adjust appropriately
91
+ // TODO: still need to see how this works with virtualizer once there is handling for the reverse layout
92
+ // this felt like a simpler approach then changing getKeyAbove/Below to be purely spatial calculations
93
+ isReversed(key) {
94
+ let nextKey = this.getNextKey(key);
95
+ let currentEl = (0, $22bbea12c2567021$export$c3d8340acf92597f)(this.ref, key);
96
+ if (nextKey != null) {
97
+ let nextEl = (0, $22bbea12c2567021$export$c3d8340acf92597f)(this.ref, nextKey);
98
+ if (!currentEl || !nextEl) return false;
99
+ return currentEl.getBoundingClientRect().top > nextEl.getBoundingClientRect().top;
100
+ }
101
+ let prevKey = this.getPreviousKey(key);
102
+ if (prevKey != null) {
103
+ let prevEl = (0, $22bbea12c2567021$export$c3d8340acf92597f)(this.ref, prevKey);
104
+ if (!currentEl || !prevEl) return false;
105
+ return prevEl.getBoundingClientRect().top > currentEl.getBoundingClientRect().top;
106
+ }
107
+ return false;
108
+ }
87
109
  getKeyBelow(key, options) {
88
110
  if (this.layout === 'grid' && this.orientation === 'vertical') return this.findKey(key, (key)=>this.getNextKey(key, options), this.isSameRow);
111
+ else if (this.orientation === 'vertical') return this.isReversed(key) ? this.getPreviousKey(key, options) : this.getNextKey(key, options);
89
112
  else return this.getNextKey(key, options);
90
113
  }
91
114
  getKeyAbove(key, options) {
92
115
  if (this.layout === 'grid' && this.orientation === 'vertical') return this.findKey(key, (key)=>this.getPreviousKey(key, options), this.isSameRow);
116
+ else if (this.orientation === 'vertical') return this.isReversed(key) ? this.getNextKey(key, options) : this.getPreviousKey(key, options);
93
117
  else return this.getPreviousKey(key, options);
94
118
  }
95
119
  getNextColumn(key, right, options) {
@@ -133,6 +157,7 @@ class $ae8f8d98b2b18f2f$export$a05409b8bb224a5a {
133
157
  let menu = this.ref.current;
134
158
  let itemRect = this.layoutDelegate.getItemRect(key);
135
159
  if (!itemRect) return null;
160
+ let reversed = this.isReversed(key);
136
161
  if (menu && !(0, $901761b40e390936$export$2bb74740c4e19def)(menu)) return this.getFirstKey();
137
162
  let nextKey = key;
138
163
  if (this.orientation === 'horizontal') {
@@ -142,18 +167,21 @@ class $ae8f8d98b2b18f2f$export$a05409b8bb224a5a {
142
167
  itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);
143
168
  }
144
169
  } else {
145
- let pageY = Math.max(0, itemRect.y + itemRect.height - this.layoutDelegate.getVisibleRect().height);
170
+ let visibleRect = this.layoutDelegate.getVisibleRect();
171
+ // column reverse makes y negative for items so we need to instead do current pos - height instead
172
+ let pageY = reversed ? itemRect.y - visibleRect.height : Math.max(0, itemRect.y + itemRect.height - visibleRect.height);
146
173
  while(itemRect && itemRect.y > pageY && nextKey != null){
147
174
  nextKey = this.getKeyAbove(nextKey);
148
175
  itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);
149
176
  }
150
177
  }
151
- return nextKey ?? this.getFirstKey();
178
+ return nextKey ?? (reversed ? this.getLastKey() : this.getFirstKey());
152
179
  }
153
180
  getKeyPageBelow(key) {
154
181
  let menu = this.ref.current;
155
182
  let itemRect = this.layoutDelegate.getItemRect(key);
156
183
  if (!itemRect) return null;
184
+ let reversed = this.isReversed(key);
157
185
  if (menu && !(0, $901761b40e390936$export$2bb74740c4e19def)(menu)) return this.getLastKey();
158
186
  let nextKey = key;
159
187
  if (this.orientation === 'horizontal') {
@@ -169,7 +197,7 @@ class $ae8f8d98b2b18f2f$export$a05409b8bb224a5a {
169
197
  itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);
170
198
  }
171
199
  }
172
- return nextKey ?? this.getLastKey();
200
+ return nextKey ?? (reversed ? this.getFirstKey() : this.getLastKey());
173
201
  }
174
202
  getKeyForSearch(search, fromKey) {
175
203
  if (!this.collator) return null;
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/react-aria/src/selection/ListKeyboardDelegate.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection,\n Direction,\n DisabledBehavior,\n Key,\n KeyboardDelegate,\n LayoutDelegate,\n Node,\n Orientation,\n Rect,\n RefObject\n} from '@react-types/shared';\nimport {DOMLayoutDelegate} from './DOMLayoutDelegate';\nimport {isScrollable} from '../utils/isScrollable';\n\ninterface ListKeyboardDelegateOptions<T> {\n collection: Collection<Node<T>>;\n ref: RefObject<HTMLElement | null>;\n collator?: Intl.Collator;\n layout?: 'stack' | 'grid';\n orientation?: Orientation;\n direction?: Direction;\n disabledKeys?: Set<Key>;\n disabledBehavior?: DisabledBehavior;\n layoutDelegate?: LayoutDelegate;\n}\n\nexport class ListKeyboardDelegate<T> implements KeyboardDelegate {\n private collection: Collection<Node<T>>;\n private disabledKeys: Set<Key>;\n private disabledBehavior: DisabledBehavior;\n private ref: RefObject<HTMLElement | null>;\n private collator: Intl.Collator | undefined;\n private layout: 'stack' | 'grid';\n private orientation?: Orientation;\n private direction?: Direction;\n private layoutDelegate: LayoutDelegate;\n\n constructor(\n collection: Collection<Node<T>>,\n disabledKeys: Set<Key>,\n ref: RefObject<HTMLElement | null>,\n collator?: Intl.Collator,\n expandedKeys?: Set<Key>\n );\n constructor(options: ListKeyboardDelegateOptions<T>);\n constructor(...args: any[]) {\n if (args.length === 1) {\n let opts = args[0] as ListKeyboardDelegateOptions<T>;\n this.collection = opts.collection;\n this.ref = opts.ref;\n this.collator = opts.collator;\n this.disabledKeys = opts.disabledKeys || new Set();\n this.disabledBehavior = opts.disabledBehavior || 'all';\n this.orientation = opts.orientation || 'vertical';\n this.direction = opts.direction;\n this.layout = opts.layout || 'stack';\n this.layoutDelegate = opts.layoutDelegate || new DOMLayoutDelegate(opts.ref);\n } else {\n this.collection = args[0];\n this.disabledKeys = args[1];\n this.ref = args[2];\n this.collator = args[3];\n this.layout = 'stack';\n this.orientation = 'vertical';\n this.disabledBehavior = 'all';\n this.layoutDelegate = new DOMLayoutDelegate(this.ref);\n }\n\n // If this is a vertical stack, remove the left/right methods completely\n // so they aren't called by useDroppableCollection.\n if (this.layout === 'stack' && this.orientation === 'vertical') {\n this.getKeyLeftOf = undefined;\n this.getKeyRightOf = undefined;\n }\n }\n\n private isDisabled(item: Node<unknown>) {\n return (\n this.disabledBehavior === 'all' &&\n (item.props?.isDisabled || this.disabledKeys.has(item.key)) &&\n item.props?.disabledBehavior !== 'selection'\n );\n }\n\n private findNextNonDisabled(\n key: Key | null,\n getNext: (key: Key) => Key | null,\n includeDisabled = false\n ): Key | null {\n let nextKey = key;\n while (nextKey != null) {\n let item = this.collection.getItem(nextKey);\n if (item?.type === 'item' && (includeDisabled || !this.isDisabled(item))) {\n return nextKey;\n }\n\n nextKey = getNext(nextKey);\n }\n\n return null;\n }\n\n getNextKey(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let nextKey: Key | null = key;\n nextKey = this.collection.getKeyAfter(nextKey);\n return this.findNextNonDisabled(\n nextKey,\n key => this.collection.getKeyAfter(key),\n options?.includeDisabled\n );\n }\n\n getPreviousKey(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let nextKey: Key | null = key;\n nextKey = this.collection.getKeyBefore(nextKey);\n return this.findNextNonDisabled(\n nextKey,\n key => this.collection.getKeyBefore(key),\n options?.includeDisabled\n );\n }\n\n private findKey(\n key: Key,\n nextKey: (key: Key) => Key | null,\n shouldSkip: (prevRect: Rect, itemRect: Rect) => boolean\n ) {\n let tempKey: Key | null = key;\n let itemRect = this.layoutDelegate.getItemRect(tempKey);\n if (!itemRect || tempKey == null) {\n return null;\n }\n\n // Find the item above or below in the same column.\n let prevRect = itemRect;\n do {\n tempKey = nextKey(tempKey);\n if (tempKey == null) {\n break;\n }\n itemRect = this.layoutDelegate.getItemRect(tempKey);\n } while (itemRect && shouldSkip(prevRect, itemRect) && tempKey != null);\n\n return tempKey;\n }\n\n private isSameRow(prevRect: Rect, itemRect: Rect) {\n return prevRect.y === itemRect.y || prevRect.x !== itemRect.x;\n }\n\n private isSameColumn(prevRect: Rect, itemRect: Rect) {\n return prevRect.x === itemRect.x || prevRect.y !== itemRect.y;\n }\n\n getKeyBelow(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n if (this.layout === 'grid' && this.orientation === 'vertical') {\n return this.findKey(key, key => this.getNextKey(key, options), this.isSameRow);\n } else {\n return this.getNextKey(key, options);\n }\n }\n\n getKeyAbove(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n if (this.layout === 'grid' && this.orientation === 'vertical') {\n return this.findKey(key, key => this.getPreviousKey(key, options), this.isSameRow);\n } else {\n return this.getPreviousKey(key, options);\n }\n }\n\n private getNextColumn(key: Key, right: boolean, options?: {includeDisabled?: boolean}) {\n return right ? this.getPreviousKey(key, options) : this.getNextKey(key, options);\n }\n\n getKeyRightOf?(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n // This is a temporary solution for CardView until we refactor useSelectableCollection.\n // https://github.com/orgs/adobe/projects/19/views/32?pane=issue&itemId=77825042\n let layoutDelegateMethod = this.direction === 'ltr' ? 'getKeyRightOf' : 'getKeyLeftOf';\n if (this.layoutDelegate[layoutDelegateMethod]) {\n key = this.layoutDelegate[layoutDelegateMethod](key);\n return this.findNextNonDisabled(\n key,\n key => this.layoutDelegate[layoutDelegateMethod](key),\n options?.includeDisabled\n );\n }\n\n if (this.layout === 'grid') {\n if (this.orientation === 'vertical') {\n return this.getNextColumn(key, this.direction === 'rtl', options);\n } else {\n return this.findKey(\n key,\n key => this.getNextColumn(key, this.direction === 'rtl', options),\n this.isSameColumn\n );\n }\n } else if (this.orientation === 'horizontal') {\n return this.getNextColumn(key, this.direction === 'rtl', options);\n }\n\n return null;\n }\n\n getKeyLeftOf?(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let layoutDelegateMethod = this.direction === 'ltr' ? 'getKeyLeftOf' : 'getKeyRightOf';\n if (this.layoutDelegate[layoutDelegateMethod]) {\n key = this.layoutDelegate[layoutDelegateMethod](key);\n return this.findNextNonDisabled(\n key,\n key => this.layoutDelegate[layoutDelegateMethod](key),\n options?.includeDisabled\n );\n }\n\n if (this.layout === 'grid') {\n if (this.orientation === 'vertical') {\n return this.getNextColumn(key, this.direction === 'ltr', options);\n } else {\n return this.findKey(\n key,\n key => this.getNextColumn(key, this.direction === 'ltr', options),\n this.isSameColumn\n );\n }\n } else if (this.orientation === 'horizontal') {\n return this.getNextColumn(key, this.direction === 'ltr', options);\n }\n\n return null;\n }\n\n getFirstKey(): Key | null {\n let key = this.collection.getFirstKey();\n return this.findNextNonDisabled(key, key => this.collection.getKeyAfter(key));\n }\n\n getLastKey(): Key | null {\n let key = this.collection.getLastKey();\n return this.findNextNonDisabled(key, key => this.collection.getKeyBefore(key));\n }\n\n getKeyPageAbove(key: Key): Key | null {\n let menu = this.ref.current;\n let itemRect = this.layoutDelegate.getItemRect(key);\n if (!itemRect) {\n return null;\n }\n\n if (menu && !isScrollable(menu)) {\n return this.getFirstKey();\n }\n\n let nextKey: Key | null = key;\n if (this.orientation === 'horizontal') {\n let pageX = Math.max(\n 0,\n itemRect.x + itemRect.width - this.layoutDelegate.getVisibleRect().width\n );\n\n while (itemRect && itemRect.x > pageX && nextKey != null) {\n nextKey = this.getKeyAbove(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n } else {\n let pageY = Math.max(\n 0,\n itemRect.y + itemRect.height - this.layoutDelegate.getVisibleRect().height\n );\n\n while (itemRect && itemRect.y > pageY && nextKey != null) {\n nextKey = this.getKeyAbove(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n }\n\n return nextKey ?? this.getFirstKey();\n }\n\n getKeyPageBelow(key: Key): Key | null {\n let menu = this.ref.current;\n let itemRect = this.layoutDelegate.getItemRect(key);\n if (!itemRect) {\n return null;\n }\n\n if (menu && !isScrollable(menu)) {\n return this.getLastKey();\n }\n\n let nextKey: Key | null = key;\n if (this.orientation === 'horizontal') {\n let pageX = Math.min(\n this.layoutDelegate.getContentSize().width,\n itemRect.x - itemRect.width + this.layoutDelegate.getVisibleRect().width\n );\n\n while (itemRect && itemRect.x < pageX && nextKey != null) {\n nextKey = this.getKeyBelow(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n } else {\n let pageY = Math.min(\n this.layoutDelegate.getContentSize().height,\n itemRect.y - itemRect.height + this.layoutDelegate.getVisibleRect().height\n );\n\n while (itemRect && itemRect.y < pageY && nextKey != null) {\n nextKey = this.getKeyBelow(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n }\n\n return nextKey ?? this.getLastKey();\n }\n\n getKeyForSearch(search: string, fromKey?: Key): Key | null {\n if (!this.collator) {\n return null;\n }\n\n let collection = this.collection;\n let key = fromKey || this.getFirstKey();\n while (key != null) {\n let item = collection.getItem(key);\n if (!item) {\n return null;\n }\n let substring = item.textValue.slice(0, search.length);\n if (item.textValue && this.collator.compare(substring, search) === 0) {\n return key;\n }\n\n key = this.getNextKey(key);\n }\n\n return null;\n }\n}\n"],"names":[],"version":3,"file":"ListKeyboardDelegate.mjs.map"}
1
+ {"mappings":"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","sources":["packages/react-aria/src/selection/ListKeyboardDelegate.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection,\n Direction,\n DisabledBehavior,\n Key,\n KeyboardDelegate,\n LayoutDelegate,\n Node,\n Orientation,\n Rect,\n RefObject\n} from '@react-types/shared';\nimport {DOMLayoutDelegate} from './DOMLayoutDelegate';\nimport {getItemElement} from './utils';\nimport {isScrollable} from '../utils/isScrollable';\n\ninterface ListKeyboardDelegateOptions<T> {\n collection: Collection<Node<T>>;\n ref: RefObject<HTMLElement | null>;\n collator?: Intl.Collator;\n layout?: 'stack' | 'grid';\n orientation?: Orientation;\n direction?: Direction;\n disabledKeys?: Set<Key>;\n disabledBehavior?: DisabledBehavior;\n layoutDelegate?: LayoutDelegate;\n}\n\nexport class ListKeyboardDelegate<T> implements KeyboardDelegate {\n private collection: Collection<Node<T>>;\n private disabledKeys: Set<Key>;\n private disabledBehavior: DisabledBehavior;\n private ref: RefObject<HTMLElement | null>;\n private collator: Intl.Collator | undefined;\n private layout: 'stack' | 'grid';\n private orientation?: Orientation;\n private direction?: Direction;\n private layoutDelegate: LayoutDelegate;\n\n constructor(\n collection: Collection<Node<T>>,\n disabledKeys: Set<Key>,\n ref: RefObject<HTMLElement | null>,\n collator?: Intl.Collator,\n expandedKeys?: Set<Key>\n );\n constructor(options: ListKeyboardDelegateOptions<T>);\n constructor(...args: any[]) {\n if (args.length === 1) {\n let opts = args[0] as ListKeyboardDelegateOptions<T>;\n this.collection = opts.collection;\n this.ref = opts.ref;\n this.collator = opts.collator;\n this.disabledKeys = opts.disabledKeys || new Set();\n this.disabledBehavior = opts.disabledBehavior || 'all';\n this.orientation = opts.orientation || 'vertical';\n this.direction = opts.direction;\n this.layout = opts.layout || 'stack';\n this.layoutDelegate = opts.layoutDelegate || new DOMLayoutDelegate(opts.ref);\n } else {\n this.collection = args[0];\n this.disabledKeys = args[1];\n this.ref = args[2];\n this.collator = args[3];\n this.layout = 'stack';\n this.orientation = 'vertical';\n this.disabledBehavior = 'all';\n this.layoutDelegate = new DOMLayoutDelegate(this.ref);\n }\n\n // If this is a vertical stack, remove the left/right methods completely\n // so they aren't called by useDroppableCollection.\n if (this.layout === 'stack' && this.orientation === 'vertical') {\n this.getKeyLeftOf = undefined;\n this.getKeyRightOf = undefined;\n }\n }\n\n private isDisabled(item: Node<unknown>) {\n return (\n this.disabledBehavior === 'all' &&\n (item.props?.isDisabled || this.disabledKeys.has(item.key)) &&\n item.props?.disabledBehavior !== 'selection'\n );\n }\n\n private findNextNonDisabled(\n key: Key | null,\n getNext: (key: Key) => Key | null,\n includeDisabled = false\n ): Key | null {\n let nextKey = key;\n while (nextKey != null) {\n let item = this.collection.getItem(nextKey);\n if (item?.type === 'item' && (includeDisabled || !this.isDisabled(item))) {\n return nextKey;\n }\n\n nextKey = getNext(nextKey);\n }\n\n return null;\n }\n\n getNextKey(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let nextKey: Key | null = key;\n nextKey = this.collection.getKeyAfter(nextKey);\n return this.findNextNonDisabled(\n nextKey,\n key => this.collection.getKeyAfter(key),\n options?.includeDisabled\n );\n }\n\n getPreviousKey(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let nextKey: Key | null = key;\n nextKey = this.collection.getKeyBefore(nextKey);\n return this.findNextNonDisabled(\n nextKey,\n key => this.collection.getKeyBefore(key),\n options?.includeDisabled\n );\n }\n\n private findKey(\n key: Key,\n nextKey: (key: Key) => Key | null,\n shouldSkip: (prevRect: Rect, itemRect: Rect) => boolean\n ) {\n let tempKey: Key | null = key;\n let itemRect = this.layoutDelegate.getItemRect(tempKey);\n if (!itemRect || tempKey == null) {\n return null;\n }\n\n // Find the item above or below in the same column.\n let prevRect = itemRect;\n do {\n tempKey = nextKey(tempKey);\n if (tempKey == null) {\n break;\n }\n itemRect = this.layoutDelegate.getItemRect(tempKey);\n } while (itemRect && shouldSkip(prevRect, itemRect) && tempKey != null);\n\n return tempKey;\n }\n\n private isSameRow(prevRect: Rect, itemRect: Rect) {\n return prevRect.y === itemRect.y || prevRect.x !== itemRect.x;\n }\n\n private isSameColumn(prevRect: Rect, itemRect: Rect) {\n return prevRect.x === itemRect.x || prevRect.y !== itemRect.y;\n }\n\n // checks to see if the next/prev key is spatially above/below the current key. If not, that means we are in\n // a reversed column layout and need to adjust appropriately\n // TODO: still need to see how this works with virtualizer once there is handling for the reverse layout\n // this felt like a simpler approach then changing getKeyAbove/Below to be purely spatial calculations\n private isReversed(key: Key): boolean {\n let nextKey = this.getNextKey(key);\n let currentEl = getItemElement(this.ref, key);\n if (nextKey != null) {\n let nextEl = getItemElement(this.ref, nextKey);\n if (!currentEl || !nextEl) {\n return false;\n }\n return currentEl.getBoundingClientRect().top > nextEl.getBoundingClientRect().top;\n }\n let prevKey = this.getPreviousKey(key);\n if (prevKey != null) {\n let prevEl = getItemElement(this.ref, prevKey);\n if (!currentEl || !prevEl) {\n return false;\n }\n return prevEl.getBoundingClientRect().top > currentEl.getBoundingClientRect().top;\n }\n return false;\n }\n\n getKeyBelow(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n if (this.layout === 'grid' && this.orientation === 'vertical') {\n return this.findKey(key, key => this.getNextKey(key, options), this.isSameRow);\n } else if (this.orientation === 'vertical') {\n return this.isReversed(key)\n ? this.getPreviousKey(key, options)\n : this.getNextKey(key, options);\n } else {\n return this.getNextKey(key, options);\n }\n }\n\n getKeyAbove(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n if (this.layout === 'grid' && this.orientation === 'vertical') {\n return this.findKey(key, key => this.getPreviousKey(key, options), this.isSameRow);\n } else if (this.orientation === 'vertical') {\n return this.isReversed(key)\n ? this.getNextKey(key, options)\n : this.getPreviousKey(key, options);\n } else {\n return this.getPreviousKey(key, options);\n }\n }\n\n private getNextColumn(key: Key, right: boolean, options?: {includeDisabled?: boolean}) {\n return right ? this.getPreviousKey(key, options) : this.getNextKey(key, options);\n }\n\n getKeyRightOf?(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n // This is a temporary solution for CardView until we refactor useSelectableCollection.\n // https://github.com/orgs/adobe/projects/19/views/32?pane=issue&itemId=77825042\n let layoutDelegateMethod = this.direction === 'ltr' ? 'getKeyRightOf' : 'getKeyLeftOf';\n if (this.layoutDelegate[layoutDelegateMethod]) {\n key = this.layoutDelegate[layoutDelegateMethod](key);\n return this.findNextNonDisabled(\n key,\n key => this.layoutDelegate[layoutDelegateMethod](key),\n options?.includeDisabled\n );\n }\n\n if (this.layout === 'grid') {\n if (this.orientation === 'vertical') {\n return this.getNextColumn(key, this.direction === 'rtl', options);\n } else {\n return this.findKey(\n key,\n key => this.getNextColumn(key, this.direction === 'rtl', options),\n this.isSameColumn\n );\n }\n } else if (this.orientation === 'horizontal') {\n return this.getNextColumn(key, this.direction === 'rtl', options);\n }\n\n return null;\n }\n\n getKeyLeftOf?(key: Key, options?: {includeDisabled?: boolean}): Key | null {\n let layoutDelegateMethod = this.direction === 'ltr' ? 'getKeyLeftOf' : 'getKeyRightOf';\n if (this.layoutDelegate[layoutDelegateMethod]) {\n key = this.layoutDelegate[layoutDelegateMethod](key);\n return this.findNextNonDisabled(\n key,\n key => this.layoutDelegate[layoutDelegateMethod](key),\n options?.includeDisabled\n );\n }\n\n if (this.layout === 'grid') {\n if (this.orientation === 'vertical') {\n return this.getNextColumn(key, this.direction === 'ltr', options);\n } else {\n return this.findKey(\n key,\n key => this.getNextColumn(key, this.direction === 'ltr', options),\n this.isSameColumn\n );\n }\n } else if (this.orientation === 'horizontal') {\n return this.getNextColumn(key, this.direction === 'ltr', options);\n }\n\n return null;\n }\n\n getFirstKey(): Key | null {\n let key = this.collection.getFirstKey();\n return this.findNextNonDisabled(key, key => this.collection.getKeyAfter(key));\n }\n\n getLastKey(): Key | null {\n let key = this.collection.getLastKey();\n return this.findNextNonDisabled(key, key => this.collection.getKeyBefore(key));\n }\n\n getKeyPageAbove(key: Key): Key | null {\n let menu = this.ref.current;\n let itemRect = this.layoutDelegate.getItemRect(key);\n if (!itemRect) {\n return null;\n }\n\n let reversed = this.isReversed(key);\n if (menu && !isScrollable(menu)) {\n return this.getFirstKey();\n }\n\n let nextKey: Key | null = key;\n if (this.orientation === 'horizontal') {\n let pageX = Math.max(\n 0,\n itemRect.x + itemRect.width - this.layoutDelegate.getVisibleRect().width\n );\n\n while (itemRect && itemRect.x > pageX && nextKey != null) {\n nextKey = this.getKeyAbove(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n } else {\n let visibleRect = this.layoutDelegate.getVisibleRect();\n // column reverse makes y negative for items so we need to instead do current pos - height instead\n let pageY = reversed\n ? itemRect.y - visibleRect.height\n : Math.max(0, itemRect.y + itemRect.height - visibleRect.height);\n\n while (itemRect && itemRect.y > pageY && nextKey != null) {\n nextKey = this.getKeyAbove(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n }\n\n return nextKey ?? (reversed ? this.getLastKey() : this.getFirstKey());\n }\n\n getKeyPageBelow(key: Key): Key | null {\n let menu = this.ref.current;\n let itemRect = this.layoutDelegate.getItemRect(key);\n if (!itemRect) {\n return null;\n }\n\n let reversed = this.isReversed(key);\n if (menu && !isScrollable(menu)) {\n return this.getLastKey();\n }\n\n let nextKey: Key | null = key;\n if (this.orientation === 'horizontal') {\n let pageX = Math.min(\n this.layoutDelegate.getContentSize().width,\n itemRect.x - itemRect.width + this.layoutDelegate.getVisibleRect().width\n );\n\n while (itemRect && itemRect.x < pageX && nextKey != null) {\n nextKey = this.getKeyBelow(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n } else {\n let pageY = Math.min(\n this.layoutDelegate.getContentSize().height,\n itemRect.y - itemRect.height + this.layoutDelegate.getVisibleRect().height\n );\n\n while (itemRect && itemRect.y < pageY && nextKey != null) {\n nextKey = this.getKeyBelow(nextKey);\n itemRect = nextKey == null ? null : this.layoutDelegate.getItemRect(nextKey);\n }\n }\n\n return nextKey ?? (reversed ? this.getFirstKey() : this.getLastKey());\n }\n\n getKeyForSearch(search: string, fromKey?: Key): Key | null {\n if (!this.collator) {\n return null;\n }\n\n let collection = this.collection;\n let key = fromKey || this.getFirstKey();\n while (key != null) {\n let item = collection.getItem(key);\n if (!item) {\n return null;\n }\n let substring = item.textValue.slice(0, search.length);\n if (item.textValue && this.collator.compare(substring, search) === 0) {\n return key;\n }\n\n key = this.getNextKey(key);\n }\n\n return null;\n }\n}\n"],"names":[],"version":3,"file":"ListKeyboardDelegate.mjs.map"}
@@ -55,7 +55,7 @@ $parcel$export(module.exports, "useSelectableCollection", function () { return $
55
55
 
56
56
  function $df9ba3e9a7210056$export$d6daf82dcd84e87c(options) {
57
57
  let { selectionManager: manager, keyboardDelegate: delegate, ref: ref, autoFocus: autoFocus = false, shouldFocusWrap: shouldFocusWrap = false, disallowEmptySelection: disallowEmptySelection = false, disallowSelectAll: disallowSelectAll = false, escapeKeyBehavior: escapeKeyBehavior = 'clearSelection', selectOnFocus: selectOnFocus = manager.selectionBehavior === 'replace', disallowTypeAhead: disallowTypeAhead = false, shouldUseVirtualFocus: shouldUseVirtualFocus, allowsTabNavigation: allowsTabNavigation = false, scrollRef: // If no scrollRef is provided, assume the collection ref is the scrollable region
58
- scrollRef = ref, linkBehavior: linkBehavior = 'action' } = options;
58
+ scrollRef = ref, linkBehavior: linkBehavior = 'action', UNSTABLE_focusOnEntry: UNSTABLE_focusOnEntry } = options;
59
59
  let { direction: direction } = (0, $2522e612fa919664$exports.useLocale)();
60
60
  let router = (0, $75bd88aab025820b$exports.useRouter)();
61
61
  let onKeyDown = (e)=>{
@@ -228,14 +228,20 @@ function $df9ba3e9a7210056$export$d6daf82dcd84e87c(options) {
228
228
  }
229
229
  // Focus events can bubble through portals. Ignore these events.
230
230
  if (!(0, $da02ee888921bc9e$exports.nodeContains)(e.currentTarget, (0, $da02ee888921bc9e$exports.getEventTarget)(e))) return;
231
+ let modality = (0, $d0df89f3abe2c2ca$exports.getInteractionModality)();
231
232
  manager.setFocused(true);
232
- if (manager.focusedKey == null) {
233
- let navigateToKey = (key)=>{
234
- if (key != null) {
235
- manager.setFocusedKey(key);
236
- if (selectOnFocus && !manager.isSelected(key)) manager.replaceSelection(key);
237
- }
238
- };
233
+ let navigateToKey = (key)=>{
234
+ if (key != null) {
235
+ manager.setFocusedKey(key);
236
+ if (selectOnFocus && !manager.isSelected(key)) manager.replaceSelection(key);
237
+ }
238
+ };
239
+ // we need the "virtual" modality case checks here because shift tabbing from the prompt field's attachment card back into the
240
+ // thread is a virtual focus event (the tab handler in onKeyDown focuses the ref of the AttachementList aka TagGroup via a focus() call, hence the virtual modality)
241
+ if (UNSTABLE_focusOnEntry && (modality === 'keyboard' || modality === 'virtual')) // always go to the first item in the Thread when tabbing forwards/backwards into the collection
242
+ // since it is probably more important to the user to see the new prompt reply rather than go to the last focused key
243
+ navigateToKey(UNSTABLE_focusOnEntry === 'first' ? delegate.getFirstKey?.() : delegate.getLastKey?.());
244
+ else if (manager.focusedKey == null) {
239
245
  // If the user hasn't yet interacted with the collection, there will be no focusedKey set.
240
246
  // Attempt to detect whether the user is tabbing forward or backward into the collection
241
247
  // and either focus the first or last item accordingly.
@@ -253,8 +259,7 @@ function $df9ba3e9a7210056$export$d6daf82dcd84e87c(options) {
253
259
  if (element instanceof HTMLElement) {
254
260
  // This prevents a flash of focus on the first/last element in the collection, or the collection itself.
255
261
  if (!(0, $da02ee888921bc9e$exports.isFocusWithin)(element) && !shouldUseVirtualFocus) (0, $4b9e9ed3f006ad27$exports.focusWithoutScrolling)(element);
256
- let modality = (0, $d0df89f3abe2c2ca$exports.getInteractionModality)();
257
- if (modality === 'keyboard') (0, $9a1324d6ffd8bbb0$exports.scrollIntoViewport)(element, {
262
+ if (modality === 'keyboard' || UNSTABLE_focusOnEntry && modality === 'virtual') (0, $9a1324d6ffd8bbb0$exports.scrollIntoViewport)(element, {
258
263
  containingElement: ref.current
259
264
  });
260
265
  }
@@ -279,12 +284,12 @@ function $df9ba3e9a7210056$export$d6daf82dcd84e87c(options) {
279
284
  if (detail?.focusStrategy === 'first') shouldVirtualFocusFirst.current = true;
280
285
  });
281
286
  // update active descendant
287
+ let firstKey = delegate.getFirstKey?.() ?? null;
282
288
  (0, $826bcd7bc2ba42c6$exports.useUpdateLayoutEffect)(()=>{
283
289
  if (shouldVirtualFocusFirst.current) {
284
- let keyToFocus = delegate.getFirstKey?.() ?? null;
285
290
  // If no focusable items exist in the list, make sure to clear any activedescendant that may still exist and move focus back to
286
291
  // the original active element (e.g. the autocomplete input)
287
- if (keyToFocus == null) {
292
+ if (firstKey == null) {
288
293
  let previousActiveElement = (0, $da02ee888921bc9e$exports.getActiveElement)();
289
294
  (0, $4f541c01c875ab4e$exports.moveVirtualFocus)(ref.current);
290
295
  (0, $4f541c01c875ab4e$exports.dispatchVirtualFocus)(previousActiveElement, null);
@@ -292,7 +297,7 @@ function $df9ba3e9a7210056$export$d6daf82dcd84e87c(options) {
292
297
  // Reset shouldVirtualFocusFirst so that we don't erronously autofocus an item when the collection is filtered again.
293
298
  if (manager.collection.size > 0) shouldVirtualFocusFirst.current = false;
294
299
  } else {
295
- manager.setFocusedKey(keyToFocus);
300
+ manager.setFocusedKey(firstKey);
296
301
  // Only set shouldVirtualFocusFirst to false if we've successfully set the first key as the focused key
297
302
  // If there wasn't a key to focus, we might be in a temporary loading state so we'll want to still focus the first key
298
303
  // after the collection updates after load
@@ -300,7 +305,8 @@ function $df9ba3e9a7210056$export$d6daf82dcd84e87c(options) {
300
305
  }
301
306
  }
302
307
  }, [
303
- manager.collection
308
+ firstKey,
309
+ manager.collection.size
304
310
  ]);
305
311
  // reset focus first flag
306
312
  (0, $826bcd7bc2ba42c6$exports.useUpdateLayoutEffect)(()=>{