@redsift/design-system 11.5.0 → 11.6.0-alpha.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 (285) hide show
  1. package/_internal/Alert2.js +197 -0
  2. package/_internal/Alert2.js.map +1 -0
  3. package/_internal/AppBar.js +248 -0
  4. package/_internal/AppBar.js.map +1 -0
  5. package/_internal/AppContainer.js +142 -0
  6. package/_internal/AppContainer.js.map +1 -0
  7. package/_internal/AppContent.js +92 -0
  8. package/_internal/AppContent.js.map +1 -0
  9. package/_internal/Badge2.js +142 -0
  10. package/_internal/Badge2.js.map +1 -0
  11. package/_internal/BreadcrumbItem.js +91 -0
  12. package/_internal/BreadcrumbItem.js.map +1 -0
  13. package/_internal/Breadcrumbs2.js +94 -0
  14. package/_internal/Breadcrumbs2.js.map +1 -0
  15. package/_internal/Button2.js +91 -0
  16. package/_internal/Button2.js.map +1 -0
  17. package/_internal/ButtonGroup.js +181 -0
  18. package/_internal/ButtonGroup.js.map +1 -0
  19. package/_internal/ButtonLink.js +84 -0
  20. package/_internal/ButtonLink.js.map +1 -0
  21. package/_internal/Card2.js +157 -0
  22. package/_internal/Card2.js.map +1 -0
  23. package/_internal/CardActions.js +44 -0
  24. package/_internal/CardActions.js.map +1 -0
  25. package/_internal/CardBody.js +42 -0
  26. package/_internal/CardBody.js.map +1 -0
  27. package/_internal/CardHeader.js +83 -0
  28. package/_internal/CardHeader.js.map +1 -0
  29. package/_internal/Checkbox2.js +244 -0
  30. package/_internal/Checkbox2.js.map +1 -0
  31. package/_internal/CheckboxGroup.js +188 -0
  32. package/_internal/CheckboxGroup.js.map +1 -0
  33. package/_internal/ConditionalWrapper.js +13 -0
  34. package/_internal/ConditionalWrapper.js.map +1 -0
  35. package/_internal/DetailedCard.js +6916 -0
  36. package/_internal/DetailedCard.js.map +1 -0
  37. package/_internal/DetailedCardCollapsibleSectionItems.js +64 -0
  38. package/_internal/DetailedCardCollapsibleSectionItems.js.map +1 -0
  39. package/_internal/DetailedCardHeader.js +67 -0
  40. package/_internal/DetailedCardHeader.js.map +1 -0
  41. package/_internal/DetailedCardSection.js +172 -0
  42. package/_internal/DetailedCardSection.js.map +1 -0
  43. package/_internal/DetailedCardSectionItem.js +94 -0
  44. package/_internal/DetailedCardSectionItem.js.map +1 -0
  45. package/_internal/Flexbox2.js +93 -0
  46. package/_internal/Flexbox2.js.map +1 -0
  47. package/_internal/Grid2.js +95 -0
  48. package/_internal/Grid2.js.map +1 -0
  49. package/_internal/GridItem.js +40 -0
  50. package/_internal/GridItem.js.map +1 -0
  51. package/_internal/Heading2.js +113 -0
  52. package/_internal/Heading2.js.map +1 -0
  53. package/_internal/Icon2.js +211 -0
  54. package/_internal/Icon2.js.map +1 -0
  55. package/_internal/IconButton.js +80 -0
  56. package/_internal/IconButton.js.map +1 -0
  57. package/_internal/IconButtonLink.js +75 -0
  58. package/_internal/IconButtonLink.js.map +1 -0
  59. package/_internal/Item2.js +399 -0
  60. package/_internal/Item2.js.map +1 -0
  61. package/_internal/Link2.js +67 -0
  62. package/_internal/Link2.js.map +1 -0
  63. package/_internal/LinkButton.js +66 -0
  64. package/_internal/LinkButton.js.map +1 -0
  65. package/_internal/Listbox2.js +274 -0
  66. package/_internal/Listbox2.js.map +1 -0
  67. package/_internal/Number2.js +111 -0
  68. package/_internal/Number2.js.map +1 -0
  69. package/_internal/NumberField.js +3974 -0
  70. package/_internal/NumberField.js.map +1 -0
  71. package/_internal/Pill2.js +405 -0
  72. package/_internal/Pill2.js.map +1 -0
  73. package/_internal/ProgressBar.js +69 -0
  74. package/_internal/ProgressBar.js.map +1 -0
  75. package/_internal/Radio2.js +237 -0
  76. package/_internal/Radio2.js.map +1 -0
  77. package/_internal/RadioGroup.js +176 -0
  78. package/_internal/RadioGroup.js.map +1 -0
  79. package/_internal/Shield2.js +225 -0
  80. package/_internal/Shield2.js.map +1 -0
  81. package/_internal/SideNavigationMenu.js +591 -0
  82. package/_internal/SideNavigationMenu.js.map +1 -0
  83. package/_internal/SideNavigationMenuItem.js +304 -0
  84. package/_internal/SideNavigationMenuItem.js.map +1 -0
  85. package/_internal/Skeleton2.js +42 -0
  86. package/_internal/Skeleton2.js.map +1 -0
  87. package/_internal/SkeletonCircle.js +58 -0
  88. package/_internal/SkeletonCircle.js.map +1 -0
  89. package/_internal/SkeletonText.js +77 -0
  90. package/_internal/SkeletonText.js.map +1 -0
  91. package/_internal/Spinner2.js +333 -0
  92. package/_internal/Spinner2.js.map +1 -0
  93. package/_internal/Switch2.js +320 -0
  94. package/_internal/Switch2.js.map +1 -0
  95. package/_internal/SwitchGroup.js +188 -0
  96. package/_internal/SwitchGroup.js.map +1 -0
  97. package/_internal/Text2.js +51 -0
  98. package/_internal/Text2.js.map +1 -0
  99. package/_internal/TextArea.js +444 -0
  100. package/_internal/TextArea.js.map +1 -0
  101. package/_internal/TextField.js +473 -0
  102. package/_internal/TextField.js.map +1 -0
  103. package/_internal/_rollupPluginBabelHelpers.js +133 -0
  104. package/_internal/_rollupPluginBabelHelpers.js.map +1 -0
  105. package/_internal/alert.js +2 -0
  106. package/_internal/alert.js.map +1 -0
  107. package/_internal/app-bar.js +2 -0
  108. package/_internal/app-bar.js.map +1 -0
  109. package/_internal/app-container.js +3 -0
  110. package/_internal/app-container.js.map +1 -0
  111. package/_internal/app-content.js +2 -0
  112. package/_internal/app-content.js.map +1 -0
  113. package/_internal/app-side-panel.js +3 -0
  114. package/_internal/app-side-panel.js.map +1 -0
  115. package/_internal/badge.js +2 -0
  116. package/_internal/badge.js.map +1 -0
  117. package/_internal/breadcrumb-item.js +2 -0
  118. package/_internal/breadcrumb-item.js.map +1 -0
  119. package/_internal/breadcrumbs.js +2 -0
  120. package/_internal/breadcrumbs.js.map +1 -0
  121. package/_internal/button-group.js +2 -0
  122. package/_internal/button-group.js.map +1 -0
  123. package/_internal/button-link.js +2 -0
  124. package/_internal/button-link.js.map +1 -0
  125. package/_internal/button.js +3 -0
  126. package/_internal/button.js.map +1 -0
  127. package/_internal/card-actions.js +2 -0
  128. package/_internal/card-actions.js.map +1 -0
  129. package/_internal/card-body.js +2 -0
  130. package/_internal/card-body.js.map +1 -0
  131. package/_internal/card-header.js +2 -0
  132. package/_internal/card-header.js.map +1 -0
  133. package/_internal/card.js +2 -0
  134. package/_internal/card.js.map +1 -0
  135. package/_internal/checkbox-group.js +2 -0
  136. package/_internal/checkbox-group.js.map +1 -0
  137. package/_internal/checkbox.js +2 -0
  138. package/_internal/checkbox.js.map +1 -0
  139. package/_internal/colors.js +98 -0
  140. package/_internal/colors.js.map +1 -0
  141. package/_internal/conditional-wrapper.js +2 -0
  142. package/_internal/conditional-wrapper.js.map +1 -0
  143. package/_internal/context.js +6 -0
  144. package/_internal/context.js.map +1 -0
  145. package/_internal/context2.js +300 -0
  146. package/_internal/context2.js.map +1 -0
  147. package/_internal/context3.js +6 -0
  148. package/_internal/context3.js.map +1 -0
  149. package/_internal/context4.js +6 -0
  150. package/_internal/context4.js.map +1 -0
  151. package/_internal/context5.js +6 -0
  152. package/_internal/context5.js.map +1 -0
  153. package/_internal/detailed-card-collapsible-section-items.js +2 -0
  154. package/_internal/detailed-card-collapsible-section-items.js.map +1 -0
  155. package/_internal/detailed-card-header.js +2 -0
  156. package/_internal/detailed-card-header.js.map +1 -0
  157. package/_internal/detailed-card-section-item.js +2 -0
  158. package/_internal/detailed-card-section-item.js.map +1 -0
  159. package/_internal/detailed-card-section.js +2 -0
  160. package/_internal/detailed-card-section.js.map +1 -0
  161. package/_internal/detailed-card.js +2 -0
  162. package/_internal/detailed-card.js.map +1 -0
  163. package/_internal/filterComponents.js +24 -0
  164. package/_internal/filterComponents.js.map +1 -0
  165. package/_internal/flexbox.js +2 -0
  166. package/_internal/flexbox.js.map +1 -0
  167. package/_internal/focus-within-group.js +3 -0
  168. package/_internal/focus-within-group.js.map +1 -0
  169. package/_internal/fonts.js +10 -0
  170. package/_internal/fonts.js.map +1 -0
  171. package/_internal/gradient-border.js +38 -0
  172. package/_internal/gradient-border.js.map +1 -0
  173. package/_internal/grid-item.js +2 -0
  174. package/_internal/grid-item.js.map +1 -0
  175. package/_internal/grid.js +2 -0
  176. package/_internal/grid.js.map +1 -0
  177. package/_internal/heading.js +3 -0
  178. package/_internal/heading.js.map +1 -0
  179. package/_internal/icon-button-link.js +2 -0
  180. package/_internal/icon-button-link.js.map +1 -0
  181. package/_internal/icon-button.js +3 -0
  182. package/_internal/icon-button.js.map +1 -0
  183. package/_internal/icon.js +2 -0
  184. package/_internal/icon.js.map +1 -0
  185. package/_internal/isComponent.js +15 -0
  186. package/_internal/isComponent.js.map +1 -0
  187. package/_internal/item.js +2 -0
  188. package/_internal/item.js.map +1 -0
  189. package/_internal/link-button.js +2 -0
  190. package/_internal/link-button.js.map +1 -0
  191. package/_internal/link.js +3 -0
  192. package/_internal/link.js.map +1 -0
  193. package/_internal/listbox.js +3 -0
  194. package/_internal/listbox.js.map +1 -0
  195. package/_internal/number-field.js +2 -0
  196. package/_internal/number-field.js.map +1 -0
  197. package/_internal/number.js +2 -0
  198. package/_internal/number.js.map +1 -0
  199. package/_internal/partitionComponents.js +26 -0
  200. package/_internal/partitionComponents.js.map +1 -0
  201. package/_internal/pill.js +2 -0
  202. package/_internal/pill.js.map +1 -0
  203. package/_internal/progress-bar.js +2 -0
  204. package/_internal/progress-bar.js.map +1 -0
  205. package/_internal/radio-group.js +2 -0
  206. package/_internal/radio-group.js.map +1 -0
  207. package/_internal/radio.js +2 -0
  208. package/_internal/radio.js.map +1 -0
  209. package/_internal/redsift-design-tokens.js +1391 -0
  210. package/_internal/redsift-design-tokens.js.map +1 -0
  211. package/_internal/shared.js +2 -0
  212. package/_internal/shared.js.map +1 -0
  213. package/_internal/shield.js +2 -0
  214. package/_internal/shield.js.map +1 -0
  215. package/_internal/side-navigation-menu-bar.js +3 -0
  216. package/_internal/side-navigation-menu-bar.js.map +1 -0
  217. package/_internal/side-navigation-menu-item.js +2 -0
  218. package/_internal/side-navigation-menu-item.js.map +1 -0
  219. package/_internal/side-navigation-menu.js +2 -0
  220. package/_internal/side-navigation-menu.js.map +1 -0
  221. package/_internal/skeleton-circle.js +2 -0
  222. package/_internal/skeleton-circle.js.map +1 -0
  223. package/_internal/skeleton-text.js +3 -0
  224. package/_internal/skeleton-text.js.map +1 -0
  225. package/_internal/skeleton.js +2 -0
  226. package/_internal/skeleton.js.map +1 -0
  227. package/_internal/spinner.js +2 -0
  228. package/_internal/spinner.js.map +1 -0
  229. package/_internal/styles.js +235 -0
  230. package/_internal/styles.js.map +1 -0
  231. package/_internal/styles2.js +47 -0
  232. package/_internal/styles2.js.map +1 -0
  233. package/_internal/styles3.js +145 -0
  234. package/_internal/styles3.js.map +1 -0
  235. package/_internal/styles4.js +250 -0
  236. package/_internal/styles4.js.map +1 -0
  237. package/_internal/styles5.js +143 -0
  238. package/_internal/styles5.js.map +1 -0
  239. package/_internal/styles6.js +84 -0
  240. package/_internal/styles6.js.map +1 -0
  241. package/_internal/switch-group.js +2 -0
  242. package/_internal/switch-group.js.map +1 -0
  243. package/_internal/switch.js +2 -0
  244. package/_internal/switch.js.map +1 -0
  245. package/_internal/text-area.js +2 -0
  246. package/_internal/text-area.js.map +1 -0
  247. package/_internal/text-field.js +2 -0
  248. package/_internal/text-field.js.map +1 -0
  249. package/_internal/text.js +3 -0
  250. package/_internal/text.js.map +1 -0
  251. package/_internal/theme.js +2 -0
  252. package/_internal/theme.js.map +1 -0
  253. package/_internal/types.js +15 -0
  254. package/_internal/types.js.map +1 -0
  255. package/_internal/types2.js +26 -0
  256. package/_internal/types2.js.map +1 -0
  257. package/_internal/types3.js +20 -0
  258. package/_internal/types3.js.map +1 -0
  259. package/_internal/useAppSidePanel.js +337 -0
  260. package/_internal/useAppSidePanel.js.map +1 -0
  261. package/_internal/useFocusOnList.js +541 -0
  262. package/_internal/useFocusOnList.js.map +1 -0
  263. package/_internal/useFocusOnListItem.js +203 -0
  264. package/_internal/useFocusOnListItem.js.map +1 -0
  265. package/_internal/useFocusRing.js +669 -0
  266. package/_internal/useFocusRing.js.map +1 -0
  267. package/_internal/useId.js +42 -0
  268. package/_internal/useId.js.map +1 -0
  269. package/_internal/useIsLoaded.js +14 -0
  270. package/_internal/useIsLoaded.js.map +1 -0
  271. package/_internal/useListboxItem.js +129 -0
  272. package/_internal/useListboxItem.js.map +1 -0
  273. package/_internal/useMessageFormatter.js +143 -0
  274. package/_internal/useMessageFormatter.js.map +1 -0
  275. package/_internal/useNumberFormatter.js +239 -0
  276. package/_internal/useNumberFormatter.js.map +1 -0
  277. package/_internal/useSideNavigationMenuBar.js +373 -0
  278. package/_internal/useSideNavigationMenuBar.js.map +1 -0
  279. package/_internal/useTheme.js +15 -0
  280. package/_internal/useTheme.js.map +1 -0
  281. package/_internal/warnIfNoAccessibleLabelFound.js +20 -0
  282. package/_internal/warnIfNoAccessibleLabelFound.js.map +1 -0
  283. package/index.js +315 -24243
  284. package/index.js.map +1 -1
  285. package/package.json +3 -3
@@ -0,0 +1,541 @@
1
+ import { _ as _objectSpread2 } from './_rollupPluginBabelHelpers.js';
2
+ import React__default, { useReducer, useEffect, useMemo, useContext, useCallback } from 'react';
3
+ import { F as FocusWithinGroupActionType, N as Navigation, E as EventKey, a as FOCUS_WITHING_GROUP_INITIAL_STATE, b as FocusWithinGroupContext } from './useFocusOnListItem.js';
4
+
5
+ const DOCUMENT_POSITION_FOLLOWING = 4;
6
+ const FocusWithinGroupReducer = (state, action) => {
7
+ switch (action.type) {
8
+ case FocusWithinGroupActionType.REGISTER_TAB_STOP:
9
+ {
10
+ const newTabStop = action.payload;
11
+ if (!newTabStop.domElementRef.current) {
12
+ return state;
13
+ }
14
+
15
+ // Iterate backwards through state.tabStops since it is
16
+ // most likely that the tab stop will need to be inserted
17
+ // at the end of that array.
18
+ let indexToInsertAt = -1;
19
+ for (let i = state.tabStops.length - 1; i >= 0; --i) {
20
+ const loopTabStop = state.tabStops[i];
21
+ if (loopTabStop.id === newTabStop.id) {
22
+ // console.warn(false, `'${newTabStop.id}' tab stop already registered`);
23
+ return state;
24
+ }
25
+ // The compareDocumentPosition condition is true
26
+ // if newTabStop follows loopTabStop:
27
+ if (indexToInsertAt === -1 && loopTabStop.domElementRef.current && !!(loopTabStop.domElementRef.current.compareDocumentPosition(newTabStop.domElementRef.current) & DOCUMENT_POSITION_FOLLOWING)) {
28
+ indexToInsertAt = i + 1;
29
+ break;
30
+ }
31
+ }
32
+
33
+ // The indexToInsertAt is -1 when newTabStop should be inserted
34
+ // at the start of tabStops (the compareDocumentPosition condition
35
+ // always returns false in that case).
36
+ if (indexToInsertAt === -1) {
37
+ indexToInsertAt = 0;
38
+ }
39
+ const newTabStops = state.tabStops.slice();
40
+ newTabStops.splice(indexToInsertAt, 0, newTabStop);
41
+ return _objectSpread2(_objectSpread2({}, state), {}, {
42
+ selectedId: state.focusOnInit ? getUpdatedSelectedId(newTabStops, state.selectedId) : null,
43
+ tabStops: newTabStops,
44
+ rowStartMap: null
45
+ });
46
+ }
47
+ case FocusWithinGroupActionType.UNREGISTER_TAB_STOP:
48
+ {
49
+ const id = action.payload.id;
50
+ const newTabStops = state.tabStops.filter(tabStop => tabStop.id !== id);
51
+ if (newTabStops.length === state.tabStops.length) {
52
+ // console.warn(false, `'${id}' tab stop already unregistered`);
53
+ return state;
54
+ }
55
+ return _objectSpread2(_objectSpread2({}, state), {}, {
56
+ selectedId: state.focusOnInit ? getUpdatedSelectedId(newTabStops, state.selectedId) : null,
57
+ tabStops: newTabStops,
58
+ rowStartMap: null
59
+ });
60
+ }
61
+ case FocusWithinGroupActionType.TAB_STOP_UPDATED:
62
+ {
63
+ const {
64
+ id,
65
+ rowIndex,
66
+ isDisabled,
67
+ value
68
+ } = action.payload;
69
+ const index = state.tabStops.findIndex(tabStop => tabStop.id === id);
70
+ if (index === -1) {
71
+ console.warn(false, `'${id}' tab stop not registered`);
72
+ return state;
73
+ }
74
+ const tabStop = state.tabStops[index];
75
+ if (tabStop.isDisabled === isDisabled && tabStop.rowIndex === rowIndex && tabStop.value === value) {
76
+ // Nothing to do so short-circuit.
77
+ return state;
78
+ }
79
+ const newTabStop = _objectSpread2(_objectSpread2({}, tabStop), {}, {
80
+ rowIndex,
81
+ isDisabled,
82
+ value
83
+ });
84
+ const newTabStops = state.tabStops.slice();
85
+ newTabStops.splice(index, 1, newTabStop);
86
+ return _objectSpread2(_objectSpread2({}, state), {}, {
87
+ selectedId: state.focusOnInit ? getUpdatedSelectedId(newTabStops, state.selectedId) : null,
88
+ tabStops: newTabStops,
89
+ rowStartMap: null
90
+ });
91
+ }
92
+ case FocusWithinGroupActionType.KEY_DOWN_ON_ITEM:
93
+ {
94
+ const {
95
+ id,
96
+ key,
97
+ ctrlKey
98
+ } = action.payload;
99
+ const index = state.tabStops.findIndex(tabStop => tabStop.id === id);
100
+ if (index === -1) {
101
+ console.warn(false, `'${id}' tab stop not registered`);
102
+ return state;
103
+ }
104
+ return moveSelectionFromKey(state, index, key, ctrlKey);
105
+ }
106
+ case FocusWithinGroupActionType.CLICK_ON_ITEM:
107
+ {
108
+ const id = action.payload.id;
109
+ const index = state.tabStops.findIndex(tabStop => tabStop.id === id);
110
+ if (index === -1) {
111
+ console.warn(false, `'${id}' tab stop not registered`);
112
+ return state;
113
+ }
114
+ const currentTabStop = state.tabStops[index];
115
+ return currentTabStop.isDisabled ? state : selectTabStop(state, currentTabStop, undefined, state.focusOnClick);
116
+ }
117
+ case FocusWithinGroupActionType.FOCUS_ON_LIST:
118
+ {
119
+ var _action$payload$id, _state$tabStops$;
120
+ const id = (_action$payload$id = action.payload.id) !== null && _action$payload$id !== void 0 ? _action$payload$id : (_state$tabStops$ = state.tabStops[0]) === null || _state$tabStops$ === void 0 ? void 0 : _state$tabStops$.id;
121
+ const index = state.tabStops.findIndex(tabStop => tabStop.id === id);
122
+ if (index === -1) {
123
+ return state;
124
+ }
125
+ const currentTabStop = state.tabStops[index];
126
+ return currentTabStop.isDisabled ? _objectSpread2(_objectSpread2({}, state), {}, {
127
+ delayedAction: undefined
128
+ }, action.payload) : selectTabStop(_objectSpread2(_objectSpread2({}, state), {}, {
129
+ delayedAction: undefined
130
+ }, action.payload), currentTabStop, undefined, state.focusOnClick);
131
+ }
132
+ case FocusWithinGroupActionType.BLUR_ON_LIST:
133
+ {
134
+ return _objectSpread2(_objectSpread2({}, state), {}, {
135
+ activedescendant: ['', '']
136
+ });
137
+ }
138
+ case FocusWithinGroupActionType.KEY_DOWN_ON_LIST:
139
+ {
140
+ const {
141
+ key,
142
+ ctrlKey
143
+ } = action.payload;
144
+ let index = state.tabStops.findIndex(tabStop => tabStop.id === state.selectedId);
145
+ if (index === -1) {
146
+ if (state.focusOnInit) {
147
+ console.warn(false, `'${state.selectedId}' tab stop not registered`);
148
+ return _objectSpread2(_objectSpread2({}, state), {}, {
149
+ delayedAction: undefined
150
+ });
151
+ } else {
152
+ index = 0;
153
+ }
154
+ }
155
+ return moveSelectionFromKey(_objectSpread2(_objectSpread2({}, state), {}, {
156
+ delayedAction: undefined
157
+ }), index, key, ctrlKey);
158
+ }
159
+ case FocusWithinGroupActionType.OPTIONS_UPDATED:
160
+ return _objectSpread2(_objectSpread2({}, state), action.payload);
161
+ case FocusWithinGroupActionType.FILTER_LIST:
162
+ return _objectSpread2(_objectSpread2({}, state), {}, {
163
+ selectedId: null
164
+ }, action.payload);
165
+ case FocusWithinGroupActionType.DELAY_ACTION:
166
+ return _objectSpread2(_objectSpread2({}, state), {}, {
167
+ delayedAction: action.payload
168
+ });
169
+ /* istanbul ignore next */
170
+ default:
171
+ return state;
172
+ }
173
+ };
174
+ function findIndexOfVeryFirstActiveTabStop(tabStops) {
175
+ return tabStops.findIndex(tabStop => !tabStop.isDisabled);
176
+ }
177
+ function findIndexOfVeryLastActiveTabStop(tabStops) {
178
+ for (let i = tabStops.length - 1; i >= 0; --i) {
179
+ const tabStop = tabStops[i];
180
+ if (!tabStop.isDisabled) {
181
+ return i;
182
+ }
183
+ }
184
+ return -1;
185
+ }
186
+
187
+ // Determine the updated value for selectedId:
188
+ function getUpdatedSelectedId(tabStops, currentSelectedId) {
189
+ if (currentSelectedId === null) {
190
+ // There is not currently selected tab stop, so find
191
+ // the first tab stop that is not isDisabled and return
192
+ // its id, otherwise return null.
193
+ const index = tabStops.findIndex(tabStop => !tabStop.isDisabled);
194
+ return index === -1 ? null : tabStops[index].id;
195
+ }
196
+ let index = tabStops.findIndex(tabStop => tabStop.id === currentSelectedId);
197
+ if (index !== -1 && !tabStops[index].isDisabled) {
198
+ // The current selected id is still valid, so return it.
199
+ return currentSelectedId;
200
+ }
201
+
202
+ // Finds the first tab stop that is not isDisabled and return
203
+ // its id, otherwise return null.
204
+ index = tabStops.findIndex(tabStop => !tabStop.isDisabled);
205
+ return index === -1 ? null : tabStops[index].id;
206
+ }
207
+
208
+ // Translates the user key down event info into a navigation instruction.
209
+ function getNavigationValue(key, ctrlKey, isGrid, direction, loopAround, isFirst, isLast) {
210
+ switch (key) {
211
+ case EventKey.ArrowLeft:
212
+ if (isGrid || direction === 'horizontal' || direction === 'both') {
213
+ return !isGrid && loopAround && isFirst ? Navigation.VERY_LAST : Navigation.PREVIOUS;
214
+ }
215
+ return null;
216
+ case EventKey.ArrowRight:
217
+ if (isGrid || direction === 'horizontal' || direction === 'both') {
218
+ return !isGrid && loopAround && isLast ? Navigation.VERY_FIRST : Navigation.NEXT;
219
+ }
220
+ return null;
221
+ case EventKey.ArrowUp:
222
+ if (isGrid) {
223
+ return Navigation.PREVIOUS_ROW;
224
+ } else if (direction === 'vertical' || direction === 'both') {
225
+ return loopAround && isFirst ? Navigation.VERY_LAST : Navigation.PREVIOUS;
226
+ }
227
+ return null;
228
+ case EventKey.ArrowDown:
229
+ if (isGrid) {
230
+ return Navigation.NEXT_ROW;
231
+ } else if (direction === 'vertical' || direction === 'both') {
232
+ return loopAround && isLast ? Navigation.VERY_FIRST : Navigation.NEXT;
233
+ }
234
+ return null;
235
+ case EventKey.Home:
236
+ return !isGrid || ctrlKey ? Navigation.VERY_FIRST : Navigation.FIRST_IN_ROW;
237
+ case EventKey.End:
238
+ return !isGrid || ctrlKey ? Navigation.VERY_LAST : Navigation.LAST_IN_ROW;
239
+ /* istanbul ignore next */
240
+ default:
241
+ return null;
242
+ }
243
+ }
244
+
245
+ // Creates the new state for a tab stop when it becomes the selected one.
246
+ function selectTabStop(state, tabStop, rowStartMap) {
247
+ let allowFocusing = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
248
+ return _objectSpread2(_objectSpread2({}, state), {}, {
249
+ allowFocusing,
250
+ selectedId: tabStop.id,
251
+ rowStartMap: rowStartMap || state.rowStartMap,
252
+ activedescendant: state.focusType === 'virtual-focus' ? [tabStop.id, tabStop.value] : undefined
253
+ });
254
+ }
255
+
256
+ // Creates the row start index lookup map
257
+ // for the currently registered tab stops.
258
+ function createRowStartMap(state) {
259
+ const map = new Map();
260
+ for (let i = 0; i < state.tabStops.length; ++i) {
261
+ const {
262
+ rowIndex
263
+ } = state.tabStops[i];
264
+ if (rowIndex !== null && !map.has(rowIndex)) {
265
+ map.set(rowIndex, i);
266
+ }
267
+ }
268
+ return map;
269
+ }
270
+ function moveSelectionFromKey(state, index, key, ctrlKey) {
271
+ const currentTabStop = state.tabStops[index];
272
+ if (currentTabStop.isDisabled) {
273
+ return state;
274
+ }
275
+ const isGrid = currentTabStop.rowIndex !== null;
276
+ const isFirst = index === findIndexOfVeryFirstActiveTabStop(state.tabStops);
277
+ const isLast = index === findIndexOfVeryLastActiveTabStop(state.tabStops);
278
+ const navigation = getNavigationValue(key, ctrlKey, isGrid, state.direction, state.loopAround, isFirst, isLast);
279
+ if (!navigation) {
280
+ return state;
281
+ }
282
+ switch (navigation) {
283
+ case Navigation.NEXT:
284
+ {
285
+ for (let i = index + 1; i < state.tabStops.length; ++i) {
286
+ const tabStop = state.tabStops[i];
287
+ if (isGrid && tabStop.rowIndex !== currentTabStop.rowIndex) {
288
+ break;
289
+ }
290
+ if (!tabStop.isDisabled) {
291
+ return selectTabStop(state, tabStop);
292
+ }
293
+ }
294
+ }
295
+ break;
296
+ case Navigation.PREVIOUS:
297
+ {
298
+ for (let i = index - 1; i >= 0; --i) {
299
+ const tabStop = state.tabStops[i];
300
+ if (isGrid && tabStop.rowIndex !== currentTabStop.rowIndex) {
301
+ break;
302
+ }
303
+ if (!tabStop.isDisabled) {
304
+ return selectTabStop(state, tabStop);
305
+ }
306
+ }
307
+ }
308
+ break;
309
+ case Navigation.VERY_FIRST:
310
+ {
311
+ const index = findIndexOfVeryFirstActiveTabStop(state.tabStops);
312
+ if (index > -1) {
313
+ return selectTabStop(state, state.tabStops[index]);
314
+ }
315
+ }
316
+ break;
317
+ case Navigation.VERY_LAST:
318
+ {
319
+ const index = findIndexOfVeryLastActiveTabStop(state.tabStops);
320
+ if (index > -1) {
321
+ return selectTabStop(state, state.tabStops[index]);
322
+ }
323
+ }
324
+ break;
325
+ case Navigation.PREVIOUS_ROW:
326
+ {
327
+ if (currentTabStop.rowIndex === null || currentTabStop.rowIndex === 0) {
328
+ return state;
329
+ }
330
+ const rowStartMap = state.rowStartMap || createRowStartMap(state);
331
+ const rowStartIndex = rowStartMap.get(currentTabStop.rowIndex);
332
+ if (rowStartIndex === undefined) {
333
+ return state;
334
+ }
335
+ const columnOffset = index - rowStartIndex;
336
+ for (let i = currentTabStop.rowIndex - 1; i >= 0; --i) {
337
+ const rowStartIndex = rowStartMap.get(i);
338
+ if (rowStartIndex === undefined) {
339
+ return state;
340
+ }
341
+ const rowTabStop = state.tabStops[rowStartIndex + columnOffset];
342
+ if (rowTabStop && !rowTabStop.isDisabled) {
343
+ return selectTabStop(state, rowTabStop, rowStartMap);
344
+ }
345
+ }
346
+ return _objectSpread2(_objectSpread2({}, state), {}, {
347
+ allowFocusing: true,
348
+ rowStartMap
349
+ });
350
+ }
351
+ case Navigation.NEXT_ROW:
352
+ {
353
+ const maxRowIndex = state.tabStops[state.tabStops.length - 1].rowIndex;
354
+ if (currentTabStop.rowIndex === null || maxRowIndex === null || currentTabStop.rowIndex === maxRowIndex) {
355
+ return state;
356
+ }
357
+ const rowStartMap = state.rowStartMap || createRowStartMap(state);
358
+ const rowStartIndex = rowStartMap.get(currentTabStop.rowIndex);
359
+ if (rowStartIndex === undefined) {
360
+ return state;
361
+ }
362
+ const columnOffset = index - rowStartIndex;
363
+ for (let i = currentTabStop.rowIndex + 1; i <= maxRowIndex; ++i) {
364
+ const rowStartIndex = rowStartMap.get(i);
365
+ if (rowStartIndex === undefined) {
366
+ return state;
367
+ }
368
+ const rowTabStop = state.tabStops[rowStartIndex + columnOffset];
369
+ if (rowTabStop && !rowTabStop.isDisabled) {
370
+ return selectTabStop(state, rowTabStop, rowStartMap);
371
+ }
372
+ }
373
+ return _objectSpread2(_objectSpread2({}, state), {}, {
374
+ allowFocusing: true,
375
+ rowStartMap
376
+ });
377
+ }
378
+ case Navigation.FIRST_IN_ROW:
379
+ {
380
+ if (currentTabStop.rowIndex === null) {
381
+ return state;
382
+ }
383
+ const rowStartMap = state.rowStartMap || createRowStartMap(state);
384
+ const rowStartIndex = rowStartMap.get(currentTabStop.rowIndex);
385
+ if (rowStartIndex === undefined) {
386
+ return state;
387
+ }
388
+ for (let i = rowStartIndex; i < state.tabStops.length; ++i) {
389
+ const tabStop = state.tabStops[i];
390
+ if (tabStop.rowIndex !== currentTabStop.rowIndex) {
391
+ break;
392
+ } else if (!tabStop.isDisabled) {
393
+ return selectTabStop(state, state.tabStops[i], rowStartMap);
394
+ }
395
+ }
396
+ }
397
+ break;
398
+ case Navigation.LAST_IN_ROW:
399
+ {
400
+ if (currentTabStop.rowIndex === null) {
401
+ return state;
402
+ }
403
+ const rowStartMap = state.rowStartMap || createRowStartMap(state);
404
+ const rowEndIndex = rowStartMap.has(currentTabStop.rowIndex + 1) ? (rowStartMap.get(currentTabStop.rowIndex + 1) || 0) - 1 : state.tabStops.length - 1;
405
+ for (let i = rowEndIndex; i >= 0; --i) {
406
+ const tabStop = state.tabStops[i];
407
+ if (tabStop.rowIndex !== currentTabStop.rowIndex) {
408
+ break;
409
+ } else if (!tabStop.isDisabled) {
410
+ return selectTabStop(state, state.tabStops[i], rowStartMap);
411
+ }
412
+ }
413
+ }
414
+ break;
415
+ }
416
+ return state;
417
+ }
418
+
419
+ /**
420
+ * The FocusWithinGroup component.
421
+ *
422
+ * @param {ReactNode} children - The child content, which will
423
+ * include the DOM elements to rove between using the tab key.
424
+ * @param {KeyDirection} direction - An optional direction value
425
+ * that only applies when the roving tabindex is not being
426
+ * used within a grid. This value specifies the arrow key behaviour.
427
+ * The default value is 'horizontal'.
428
+ * When set to 'horizontal' then only the ArrowLeft and ArrowRight
429
+ * keys move to the previous and next tab stop respectively.
430
+ * When set to 'vertical' then only the ArrowUp and ArrowDown keys
431
+ * move to the previous and next tab stop respectively. When set
432
+ * to 'both' then both the ArrowLeft and ArrowUp keys can be used
433
+ * to move to the previous tab stop, and both the ArrowRight
434
+ * and ArrowDown keys can be used to move to the next tab stop.
435
+ * If you do not pass an explicit value then the 'horizontal'
436
+ * behaviour applies.
437
+ * @param {boolean} focusOnClick - An optional flag for indicating
438
+ * if `focus()` should invoked on an item in the roving tabindex
439
+ * when it is clicked. The default value for this flag is `false`,
440
+ * meaning that `focus()` will not be invoked on click.
441
+ * Browsers are
442
+ * [inconsistent in their behaviour](https://zellwk.com/blog/inconsistent-button-behavior/)
443
+ * when a button is clicked so you will see some variation between
444
+ * the browsers with the default value. Prior to version 3 of this library,
445
+ * the behaviour was to always invoke `focus()` on click; this behaviour
446
+ * can be maintained by passing `true`.
447
+ * @param {boolean} loopAround - An optional flag that,
448
+ * when set to `true`, will loop the tabindex around when the user
449
+ * tries to tab to the first or last elements in the roving tabindex,
450
+ * rather than stopping. The default value is `false` (no looping).
451
+ * Note that this option does not apply if the roving tabindex
452
+ * is being used on a grid.
453
+ */
454
+ const FocusWithinGroup = props => {
455
+ const {
456
+ children,
457
+ direction,
458
+ focusOnClick,
459
+ loopAround,
460
+ focusType,
461
+ listRole,
462
+ focusOnInit,
463
+ activedescendant,
464
+ maxOptionsLength
465
+ } = props;
466
+ const [state, dispatch] = useReducer(FocusWithinGroupReducer, _objectSpread2(_objectSpread2({}, FOCUS_WITHING_GROUP_INITIAL_STATE), {}, {
467
+ direction,
468
+ focusOnClick,
469
+ loopAround,
470
+ focusType,
471
+ listRole,
472
+ focusOnInit,
473
+ activedescendant,
474
+ maxOptionsLength
475
+ }));
476
+
477
+ // Update the options whenever they change:
478
+ useEffect(() => {
479
+ dispatch({
480
+ type: FocusWithinGroupActionType.OPTIONS_UPDATED,
481
+ payload: {
482
+ direction: direction !== null && direction !== void 0 ? direction : FOCUS_WITHING_GROUP_INITIAL_STATE.direction,
483
+ focusOnClick: focusOnClick !== null && focusOnClick !== void 0 ? focusOnClick : FOCUS_WITHING_GROUP_INITIAL_STATE.focusOnClick,
484
+ loopAround: loopAround !== null && loopAround !== void 0 ? loopAround : FOCUS_WITHING_GROUP_INITIAL_STATE.loopAround,
485
+ focusType: focusType !== null && focusType !== void 0 ? focusType : FOCUS_WITHING_GROUP_INITIAL_STATE.focusType,
486
+ listRole: listRole !== null && listRole !== void 0 ? listRole : FOCUS_WITHING_GROUP_INITIAL_STATE.listRole,
487
+ focusOnInit: focusOnInit !== null && focusOnInit !== void 0 ? focusOnInit : FOCUS_WITHING_GROUP_INITIAL_STATE.focusOnInit,
488
+ activedescendant: activedescendant !== null && activedescendant !== void 0 ? activedescendant : FOCUS_WITHING_GROUP_INITIAL_STATE.activedescendant,
489
+ maxOptionsLength: maxOptionsLength !== null && maxOptionsLength !== void 0 ? maxOptionsLength : FOCUS_WITHING_GROUP_INITIAL_STATE.maxOptionsLength
490
+ }
491
+ });
492
+ }, [direction, focusOnClick, focusOnInit, loopAround, focusType, listRole, activedescendant, maxOptionsLength]);
493
+ const context = useMemo(() => ({
494
+ state,
495
+ dispatch
496
+ }), [state]);
497
+ return /*#__PURE__*/React__default.createElement(FocusWithinGroupContext.Provider, {
498
+ value: context
499
+ }, children);
500
+ };
501
+
502
+ function useFocusOnList() {
503
+ const context = useContext(FocusWithinGroupContext);
504
+ const handleKeyDown = useCallback(event => {
505
+ const key = EventKey[event.key];
506
+ if (!key) {
507
+ return;
508
+ }
509
+ context.dispatch({
510
+ type: FocusWithinGroupActionType.KEY_DOWN_ON_LIST,
511
+ payload: {
512
+ key,
513
+ ctrlKey: event.ctrlKey
514
+ }
515
+ });
516
+ event.preventDefault();
517
+ }, []);
518
+ const handleFocus = useCallback(() => {
519
+ context.dispatch({
520
+ type: FocusWithinGroupActionType.FOCUS_ON_LIST,
521
+ payload: {
522
+ id: context.state.selectedId
523
+ }
524
+ });
525
+ }, [context.state.selectedId]);
526
+ const handleBlur = useCallback(() => {
527
+ context.dispatch({
528
+ type: FocusWithinGroupActionType.BLUR_ON_LIST,
529
+ payload: {}
530
+ });
531
+ }, []);
532
+ return {
533
+ activedescendant: context.state.activedescendant,
534
+ handleKeyDown,
535
+ handleFocus,
536
+ handleBlur
537
+ };
538
+ }
539
+
540
+ export { FocusWithinGroup as F, FocusWithinGroupReducer as a, useFocusOnList as u };
541
+ //# sourceMappingURL=useFocusOnList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFocusOnList.js","sources":["../../src/components/focus-within-group/reducer.ts","../../src/components/focus-within-group/FocusWithinGroup.tsx","../../src/components/focus-within-group/useFocusOnList.ts"],"sourcesContent":["import {\n FocusWithinGroupState,\n FocusWithinGroupAction,\n FocusWithinGroupActionType,\n TabStop,\n RowStartMap,\n EventKey,\n Navigation,\n} from './types';\n\nconst DOCUMENT_POSITION_FOLLOWING = 4;\n\nexport const FocusWithinGroupReducer = (\n state: FocusWithinGroupState,\n action: FocusWithinGroupAction\n): FocusWithinGroupState => {\n switch (action.type) {\n case FocusWithinGroupActionType.REGISTER_TAB_STOP: {\n const newTabStop = action.payload;\n if (!newTabStop.domElementRef.current) {\n return state;\n }\n\n // Iterate backwards through state.tabStops since it is\n // most likely that the tab stop will need to be inserted\n // at the end of that array.\n let indexToInsertAt = -1;\n for (let i = state.tabStops.length - 1; i >= 0; --i) {\n const loopTabStop = state.tabStops[i];\n if (loopTabStop.id === newTabStop.id) {\n // console.warn(false, `'${newTabStop.id}' tab stop already registered`);\n return state;\n }\n // The compareDocumentPosition condition is true\n // if newTabStop follows loopTabStop:\n if (\n indexToInsertAt === -1 &&\n loopTabStop.domElementRef.current &&\n !!(\n loopTabStop.domElementRef.current.compareDocumentPosition(newTabStop.domElementRef.current) &\n DOCUMENT_POSITION_FOLLOWING\n )\n ) {\n indexToInsertAt = i + 1;\n break;\n }\n }\n\n // The indexToInsertAt is -1 when newTabStop should be inserted\n // at the start of tabStops (the compareDocumentPosition condition\n // always returns false in that case).\n if (indexToInsertAt === -1) {\n indexToInsertAt = 0;\n }\n\n const newTabStops = state.tabStops.slice();\n newTabStops.splice(indexToInsertAt, 0, newTabStop);\n\n return {\n ...state,\n selectedId: state.focusOnInit ? getUpdatedSelectedId(newTabStops, state.selectedId) : null,\n tabStops: newTabStops,\n rowStartMap: null,\n };\n }\n case FocusWithinGroupActionType.UNREGISTER_TAB_STOP: {\n const id = action.payload.id;\n const newTabStops = state.tabStops.filter((tabStop) => tabStop.id !== id);\n if (newTabStops.length === state.tabStops.length) {\n // console.warn(false, `'${id}' tab stop already unregistered`);\n return state;\n }\n return {\n ...state,\n selectedId: state.focusOnInit ? getUpdatedSelectedId(newTabStops, state.selectedId) : null,\n tabStops: newTabStops,\n rowStartMap: null,\n };\n }\n case FocusWithinGroupActionType.TAB_STOP_UPDATED: {\n const { id, rowIndex, isDisabled, value } = action.payload;\n const index = state.tabStops.findIndex((tabStop) => tabStop.id === id);\n if (index === -1) {\n console.warn(false, `'${id}' tab stop not registered`);\n return state;\n }\n\n const tabStop = state.tabStops[index];\n if (tabStop.isDisabled === isDisabled && tabStop.rowIndex === rowIndex && tabStop.value === value) {\n // Nothing to do so short-circuit.\n return state;\n }\n\n const newTabStop = { ...tabStop, rowIndex, isDisabled, value };\n const newTabStops = state.tabStops.slice();\n newTabStops.splice(index, 1, newTabStop);\n\n return {\n ...state,\n selectedId: state.focusOnInit ? getUpdatedSelectedId(newTabStops, state.selectedId) : null,\n tabStops: newTabStops,\n rowStartMap: null,\n };\n }\n case FocusWithinGroupActionType.KEY_DOWN_ON_ITEM: {\n const { id, key, ctrlKey } = action.payload;\n const index = state.tabStops.findIndex((tabStop) => tabStop.id === id);\n if (index === -1) {\n console.warn(false, `'${id}' tab stop not registered`);\n return state;\n }\n return moveSelectionFromKey(state, index, key, ctrlKey);\n }\n case FocusWithinGroupActionType.CLICK_ON_ITEM: {\n const id = action.payload.id;\n const index = state.tabStops.findIndex((tabStop) => tabStop.id === id);\n if (index === -1) {\n console.warn(false, `'${id}' tab stop not registered`);\n return state;\n }\n const currentTabStop = state.tabStops[index];\n return currentTabStop.isDisabled ? state : selectTabStop(state, currentTabStop, undefined, state.focusOnClick);\n }\n case FocusWithinGroupActionType.FOCUS_ON_LIST: {\n const id = action.payload.id ?? state.tabStops[0]?.id;\n const index = state.tabStops.findIndex((tabStop) => tabStop.id === id);\n if (index === -1) {\n return state;\n }\n const currentTabStop = state.tabStops[index];\n return currentTabStop.isDisabled\n ? { ...state, delayedAction: undefined, ...action.payload }\n : selectTabStop(\n { ...state, delayedAction: undefined, ...action.payload },\n currentTabStop,\n undefined,\n state.focusOnClick\n );\n }\n case FocusWithinGroupActionType.BLUR_ON_LIST: {\n return { ...state, activedescendant: ['', ''] };\n }\n case FocusWithinGroupActionType.KEY_DOWN_ON_LIST: {\n const { key, ctrlKey } = action.payload;\n let index = state.tabStops.findIndex((tabStop) => tabStop.id === state.selectedId);\n if (index === -1) {\n if (state.focusOnInit) {\n console.warn(false, `'${state.selectedId}' tab stop not registered`);\n return { ...state, delayedAction: undefined };\n } else {\n index = 0;\n }\n }\n return moveSelectionFromKey({ ...state, delayedAction: undefined }, index, key, ctrlKey);\n }\n case FocusWithinGroupActionType.OPTIONS_UPDATED:\n return { ...state, ...action.payload };\n case FocusWithinGroupActionType.FILTER_LIST:\n return { ...state, selectedId: null, ...action.payload };\n case FocusWithinGroupActionType.DELAY_ACTION:\n return { ...state, delayedAction: action.payload };\n /* istanbul ignore next */\n default:\n return state;\n }\n};\n\nfunction findIndexOfVeryFirstActiveTabStop(tabStops: FocusWithinGroupState['tabStops']): number {\n return tabStops.findIndex((tabStop) => !tabStop.isDisabled);\n}\n\nfunction findIndexOfVeryLastActiveTabStop(tabStops: FocusWithinGroupState['tabStops']): number {\n for (let i = tabStops.length - 1; i >= 0; --i) {\n const tabStop = tabStops[i];\n if (!tabStop.isDisabled) {\n return i;\n }\n }\n return -1;\n}\n\n// Determine the updated value for selectedId:\nfunction getUpdatedSelectedId(\n tabStops: FocusWithinGroupState['tabStops'],\n currentSelectedId: FocusWithinGroupState['selectedId']\n): FocusWithinGroupState['selectedId'] {\n if (currentSelectedId === null) {\n // There is not currently selected tab stop, so find\n // the first tab stop that is not isDisabled and return\n // its id, otherwise return null.\n const index = tabStops.findIndex((tabStop) => !tabStop.isDisabled);\n return index === -1 ? null : tabStops[index].id;\n }\n\n let index = tabStops.findIndex((tabStop) => tabStop.id === currentSelectedId);\n if (index !== -1 && !tabStops[index].isDisabled) {\n // The current selected id is still valid, so return it.\n return currentSelectedId;\n }\n\n // Finds the first tab stop that is not isDisabled and return\n // its id, otherwise return null.\n index = tabStops.findIndex((tabStop) => !tabStop.isDisabled);\n return index === -1 ? null : tabStops[index].id;\n}\n\n// Translates the user key down event info into a navigation instruction.\nfunction getNavigationValue(\n key: EventKey,\n ctrlKey: boolean,\n isGrid: boolean,\n direction: string,\n loopAround: boolean,\n isFirst: boolean,\n isLast: boolean\n): Navigation | null {\n switch (key) {\n case EventKey.ArrowLeft:\n if (isGrid || direction === 'horizontal' || direction === 'both') {\n return !isGrid && loopAround && isFirst ? Navigation.VERY_LAST : Navigation.PREVIOUS;\n }\n return null;\n case EventKey.ArrowRight:\n if (isGrid || direction === 'horizontal' || direction === 'both') {\n return !isGrid && loopAround && isLast ? Navigation.VERY_FIRST : Navigation.NEXT;\n }\n return null;\n case EventKey.ArrowUp:\n if (isGrid) {\n return Navigation.PREVIOUS_ROW;\n } else if (direction === 'vertical' || direction === 'both') {\n return loopAround && isFirst ? Navigation.VERY_LAST : Navigation.PREVIOUS;\n }\n return null;\n case EventKey.ArrowDown:\n if (isGrid) {\n return Navigation.NEXT_ROW;\n } else if (direction === 'vertical' || direction === 'both') {\n return loopAround && isLast ? Navigation.VERY_FIRST : Navigation.NEXT;\n }\n return null;\n case EventKey.Home:\n return !isGrid || ctrlKey ? Navigation.VERY_FIRST : Navigation.FIRST_IN_ROW;\n case EventKey.End:\n return !isGrid || ctrlKey ? Navigation.VERY_LAST : Navigation.LAST_IN_ROW;\n /* istanbul ignore next */\n default:\n return null;\n }\n}\n\n// Creates the new state for a tab stop when it becomes the selected one.\nfunction selectTabStop(\n state: FocusWithinGroupState,\n tabStop: TabStop,\n rowStartMap?: RowStartMap,\n allowFocusing = true\n) {\n return {\n ...state,\n allowFocusing,\n selectedId: tabStop.id,\n rowStartMap: rowStartMap || state.rowStartMap,\n activedescendant:\n state.focusType === 'virtual-focus' ? ([tabStop.id, tabStop.value] as [string, string]) : undefined,\n };\n}\n\n// Creates the row start index lookup map\n// for the currently registered tab stops.\nfunction createRowStartMap(state: FocusWithinGroupState) {\n const map: RowStartMap = new Map();\n for (let i = 0; i < state.tabStops.length; ++i) {\n const { rowIndex } = state.tabStops[i];\n if (rowIndex !== null && !map.has(rowIndex)) {\n map.set(rowIndex, i);\n }\n }\n return map;\n}\n\nfunction moveSelectionFromKey(state: FocusWithinGroupState, index: number, key: EventKey, ctrlKey: boolean) {\n const currentTabStop = state.tabStops[index];\n if (currentTabStop.isDisabled) {\n return state;\n }\n const isGrid = currentTabStop.rowIndex !== null;\n const isFirst = index === findIndexOfVeryFirstActiveTabStop(state.tabStops);\n const isLast = index === findIndexOfVeryLastActiveTabStop(state.tabStops);\n const navigation = getNavigationValue(key, ctrlKey, isGrid, state.direction, state.loopAround, isFirst, isLast);\n if (!navigation) {\n return state;\n }\n\n switch (navigation) {\n case Navigation.NEXT:\n {\n for (let i = index + 1; i < state.tabStops.length; ++i) {\n const tabStop = state.tabStops[i];\n if (isGrid && tabStop.rowIndex !== currentTabStop.rowIndex) {\n break;\n }\n if (!tabStop.isDisabled) {\n return selectTabStop(state, tabStop);\n }\n }\n }\n break;\n case Navigation.PREVIOUS:\n {\n for (let i = index - 1; i >= 0; --i) {\n const tabStop = state.tabStops[i];\n if (isGrid && tabStop.rowIndex !== currentTabStop.rowIndex) {\n break;\n }\n if (!tabStop.isDisabled) {\n return selectTabStop(state, tabStop);\n }\n }\n }\n break;\n case Navigation.VERY_FIRST:\n {\n const index = findIndexOfVeryFirstActiveTabStop(state.tabStops);\n if (index > -1) {\n return selectTabStop(state, state.tabStops[index]);\n }\n }\n break;\n case Navigation.VERY_LAST:\n {\n const index = findIndexOfVeryLastActiveTabStop(state.tabStops);\n if (index > -1) {\n return selectTabStop(state, state.tabStops[index]);\n }\n }\n break;\n case Navigation.PREVIOUS_ROW: {\n if (currentTabStop.rowIndex === null || currentTabStop.rowIndex === 0) {\n return state;\n }\n const rowStartMap = state.rowStartMap || createRowStartMap(state);\n const rowStartIndex = rowStartMap.get(currentTabStop.rowIndex);\n if (rowStartIndex === undefined) {\n return state;\n }\n const columnOffset = index - rowStartIndex;\n for (let i = currentTabStop.rowIndex - 1; i >= 0; --i) {\n const rowStartIndex = rowStartMap.get(i);\n if (rowStartIndex === undefined) {\n return state;\n }\n const rowTabStop = state.tabStops[rowStartIndex + columnOffset];\n if (rowTabStop && !rowTabStop.isDisabled) {\n return selectTabStop(state, rowTabStop, rowStartMap);\n }\n }\n return { ...state, allowFocusing: true, rowStartMap };\n }\n case Navigation.NEXT_ROW: {\n const maxRowIndex = state.tabStops[state.tabStops.length - 1].rowIndex;\n if (currentTabStop.rowIndex === null || maxRowIndex === null || currentTabStop.rowIndex === maxRowIndex) {\n return state;\n }\n const rowStartMap = state.rowStartMap || createRowStartMap(state);\n const rowStartIndex = rowStartMap.get(currentTabStop.rowIndex);\n if (rowStartIndex === undefined) {\n return state;\n }\n const columnOffset = index - rowStartIndex;\n for (let i = currentTabStop.rowIndex + 1; i <= maxRowIndex; ++i) {\n const rowStartIndex = rowStartMap.get(i);\n if (rowStartIndex === undefined) {\n return state;\n }\n const rowTabStop = state.tabStops[rowStartIndex + columnOffset];\n if (rowTabStop && !rowTabStop.isDisabled) {\n return selectTabStop(state, rowTabStop, rowStartMap);\n }\n }\n return { ...state, allowFocusing: true, rowStartMap };\n }\n case Navigation.FIRST_IN_ROW:\n {\n if (currentTabStop.rowIndex === null) {\n return state;\n }\n const rowStartMap = state.rowStartMap || createRowStartMap(state);\n const rowStartIndex = rowStartMap.get(currentTabStop.rowIndex);\n if (rowStartIndex === undefined) {\n return state;\n }\n for (let i = rowStartIndex; i < state.tabStops.length; ++i) {\n const tabStop = state.tabStops[i];\n if (tabStop.rowIndex !== currentTabStop.rowIndex) {\n break;\n } else if (!tabStop.isDisabled) {\n return selectTabStop(state, state.tabStops[i], rowStartMap);\n }\n }\n }\n break;\n case Navigation.LAST_IN_ROW:\n {\n if (currentTabStop.rowIndex === null) {\n return state;\n }\n const rowStartMap = state.rowStartMap || createRowStartMap(state);\n const rowEndIndex = rowStartMap.has(currentTabStop.rowIndex + 1)\n ? (rowStartMap.get(currentTabStop.rowIndex + 1) || 0) - 1\n : state.tabStops.length - 1;\n for (let i = rowEndIndex; i >= 0; --i) {\n const tabStop = state.tabStops[i];\n if (tabStop.rowIndex !== currentTabStop.rowIndex) {\n break;\n } else if (!tabStop.isDisabled) {\n return selectTabStop(state, state.tabStops[i], rowStartMap);\n }\n }\n }\n break;\n }\n return state;\n}\n","import React, { useEffect, useMemo, useReducer } from 'react';\nimport {\n FocusWithinGroupActionType,\n FocusWithinGroupContextProps,\n FocusWithinGroupProps,\n FocusWithinGroupState,\n} from './types';\nimport { FOCUS_WITHING_GROUP_INITIAL_STATE, FocusWithinGroupContext } from './context';\nimport { FocusWithinGroupReducer } from './reducer';\n\n/**\n * The FocusWithinGroup component.\n *\n * @param {ReactNode} children - The child content, which will\n * include the DOM elements to rove between using the tab key.\n * @param {KeyDirection} direction - An optional direction value\n * that only applies when the roving tabindex is not being\n * used within a grid. This value specifies the arrow key behaviour.\n * The default value is 'horizontal'.\n * When set to 'horizontal' then only the ArrowLeft and ArrowRight\n * keys move to the previous and next tab stop respectively.\n * When set to 'vertical' then only the ArrowUp and ArrowDown keys\n * move to the previous and next tab stop respectively. When set\n * to 'both' then both the ArrowLeft and ArrowUp keys can be used\n * to move to the previous tab stop, and both the ArrowRight\n * and ArrowDown keys can be used to move to the next tab stop.\n * If you do not pass an explicit value then the 'horizontal'\n * behaviour applies.\n * @param {boolean} focusOnClick - An optional flag for indicating\n * if `focus()` should invoked on an item in the roving tabindex\n * when it is clicked. The default value for this flag is `false`,\n * meaning that `focus()` will not be invoked on click.\n * Browsers are\n * [inconsistent in their behaviour](https://zellwk.com/blog/inconsistent-button-behavior/)\n * when a button is clicked so you will see some variation between\n * the browsers with the default value. Prior to version 3 of this library,\n * the behaviour was to always invoke `focus()` on click; this behaviour\n * can be maintained by passing `true`.\n * @param {boolean} loopAround - An optional flag that,\n * when set to `true`, will loop the tabindex around when the user\n * tries to tab to the first or last elements in the roving tabindex,\n * rather than stopping. The default value is `false` (no looping).\n * Note that this option does not apply if the roving tabindex\n * is being used on a grid.\n */\nexport const FocusWithinGroup: React.FC<FocusWithinGroupProps> = (props) => {\n const {\n children,\n direction,\n focusOnClick,\n loopAround,\n focusType,\n listRole,\n focusOnInit,\n activedescendant,\n maxOptionsLength,\n } = props;\n\n const [state, dispatch] = useReducer(FocusWithinGroupReducer, {\n ...FOCUS_WITHING_GROUP_INITIAL_STATE,\n direction,\n focusOnClick,\n loopAround,\n focusType,\n listRole,\n focusOnInit,\n activedescendant,\n maxOptionsLength,\n } as FocusWithinGroupState);\n\n // Update the options whenever they change:\n useEffect(() => {\n dispatch({\n type: FocusWithinGroupActionType.OPTIONS_UPDATED,\n payload: {\n direction: direction ?? FOCUS_WITHING_GROUP_INITIAL_STATE.direction,\n focusOnClick: focusOnClick ?? FOCUS_WITHING_GROUP_INITIAL_STATE.focusOnClick,\n loopAround: loopAround ?? FOCUS_WITHING_GROUP_INITIAL_STATE.loopAround,\n focusType: focusType ?? FOCUS_WITHING_GROUP_INITIAL_STATE.focusType,\n listRole: listRole ?? FOCUS_WITHING_GROUP_INITIAL_STATE.listRole,\n focusOnInit: focusOnInit ?? FOCUS_WITHING_GROUP_INITIAL_STATE.focusOnInit,\n activedescendant: activedescendant ?? FOCUS_WITHING_GROUP_INITIAL_STATE.activedescendant,\n maxOptionsLength: maxOptionsLength ?? FOCUS_WITHING_GROUP_INITIAL_STATE.maxOptionsLength,\n },\n });\n }, [direction, focusOnClick, focusOnInit, loopAround, focusType, listRole, activedescendant, maxOptionsLength]);\n\n const context = useMemo<FocusWithinGroupContextProps>(\n () => ({\n state,\n dispatch,\n }),\n [state]\n );\n\n return <FocusWithinGroupContext.Provider value={context}>{children}</FocusWithinGroupContext.Provider>;\n};\n","import { useCallback, useContext, KeyboardEvent } from 'react';\nimport { FocusWithinGroupContext } from './context';\nimport { FocusWithinGroupActionType, EventKey, UseFocusGroupProps } from './types';\n\nexport function useFocusOnList(): UseFocusGroupProps {\n const context = useContext(FocusWithinGroupContext);\n\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n const key = EventKey[event.key as EventKey];\n if (!key) {\n return;\n }\n context.dispatch({\n type: FocusWithinGroupActionType.KEY_DOWN_ON_LIST,\n payload: { key, ctrlKey: event.ctrlKey },\n });\n event.preventDefault();\n }, []);\n\n const handleFocus = useCallback(() => {\n context.dispatch({\n type: FocusWithinGroupActionType.FOCUS_ON_LIST,\n payload: {\n id: context.state.selectedId!,\n },\n });\n }, [context.state.selectedId]);\n\n const handleBlur = useCallback(() => {\n context.dispatch({\n type: FocusWithinGroupActionType.BLUR_ON_LIST,\n payload: {},\n });\n }, []);\n\n return {\n activedescendant: context.state.activedescendant,\n handleKeyDown,\n handleFocus,\n handleBlur,\n };\n}\n"],"names":["DOCUMENT_POSITION_FOLLOWING","FocusWithinGroupReducer","state","action","type","FocusWithinGroupActionType","REGISTER_TAB_STOP","newTabStop","payload","domElementRef","current","indexToInsertAt","i","tabStops","length","loopTabStop","id","compareDocumentPosition","newTabStops","slice","splice","_objectSpread","selectedId","focusOnInit","getUpdatedSelectedId","rowStartMap","UNREGISTER_TAB_STOP","filter","tabStop","TAB_STOP_UPDATED","rowIndex","isDisabled","value","index","findIndex","console","warn","KEY_DOWN_ON_ITEM","key","ctrlKey","moveSelectionFromKey","CLICK_ON_ITEM","currentTabStop","selectTabStop","undefined","focusOnClick","FOCUS_ON_LIST","_action$payload$id","_state$tabStops$","delayedAction","BLUR_ON_LIST","activedescendant","KEY_DOWN_ON_LIST","OPTIONS_UPDATED","FILTER_LIST","DELAY_ACTION","findIndexOfVeryFirstActiveTabStop","findIndexOfVeryLastActiveTabStop","currentSelectedId","getNavigationValue","isGrid","direction","loopAround","isFirst","isLast","EventKey","ArrowLeft","Navigation","VERY_LAST","PREVIOUS","ArrowRight","VERY_FIRST","NEXT","ArrowUp","PREVIOUS_ROW","ArrowDown","NEXT_ROW","Home","FIRST_IN_ROW","End","LAST_IN_ROW","allowFocusing","arguments","focusType","createRowStartMap","map","Map","has","set","navigation","rowStartIndex","get","columnOffset","rowTabStop","maxRowIndex","rowEndIndex","FocusWithinGroup","props","children","listRole","maxOptionsLength","dispatch","useReducer","FOCUS_WITHING_GROUP_INITIAL_STATE","useEffect","context","useMemo","React","createElement","FocusWithinGroupContext","Provider","useFocusOnList","useContext","handleKeyDown","useCallback","event","preventDefault","handleFocus","handleBlur"],"mappings":"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"}