@workday/canvas-kit-react 13.0.0-alpha.944-next.0 → 13.0.0-alpha.950-next.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 (458) hide show
  1. package/collection/index.ts +3 -0
  2. package/collection/lib/focusOnCurrentCursor.ts +55 -0
  3. package/collection/lib/listItemRemove.ts +21 -0
  4. package/collection/lib/useListItemRemoveOnDeleteKey.tsx +40 -0
  5. package/collection/lib/useListItemRovingFocus.tsx +8 -34
  6. package/collection/lib/useListLoader.ts +2 -0
  7. package/collection/lib/useListResetCursorOnBlur.tsx +16 -2
  8. package/collection/lib/useOverflowListItemMeasure.tsx +6 -2
  9. package/collection/lib/useOverflowListMeasure.ts +1 -1
  10. package/collection/lib/useOverflowListModel.tsx +90 -51
  11. package/collection/lib/useOverflowListTarget.tsx +5 -1
  12. package/collection/lib/useSelectionListModel.tsx +10 -0
  13. package/combobox/lib/hooks/useComboboxInput.ts +7 -10
  14. package/dist/commonjs/action-bar/lib/ActionBar.d.ts +676 -0
  15. package/dist/commonjs/action-bar/lib/ActionBar.d.ts.map +1 -1
  16. package/dist/commonjs/action-bar/lib/ActionBarItem.d.ts +51 -0
  17. package/dist/commonjs/action-bar/lib/ActionBarItem.d.ts.map +1 -1
  18. package/dist/commonjs/action-bar/lib/ActionBarList.d.ts +51 -0
  19. package/dist/commonjs/action-bar/lib/ActionBarList.d.ts.map +1 -1
  20. package/dist/commonjs/action-bar/lib/ActionBarOverflowButton.d.ts +56 -0
  21. package/dist/commonjs/action-bar/lib/ActionBarOverflowButton.d.ts.map +1 -1
  22. package/dist/commonjs/action-bar/lib/useActionBarModel.d.ts +531 -0
  23. package/dist/commonjs/action-bar/lib/useActionBarModel.d.ts.map +1 -1
  24. package/dist/commonjs/avatar/lib/Avatar.js +21 -21
  25. package/dist/commonjs/badge/lib/CountBadge.js +3 -3
  26. package/dist/commonjs/breadcrumbs/lib/Breadcrumbs.d.ts +759 -385
  27. package/dist/commonjs/breadcrumbs/lib/Breadcrumbs.d.ts.map +1 -1
  28. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsCurrentItem.d.ts +56 -0
  29. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsCurrentItem.d.ts.map +1 -1
  30. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsItem.d.ts +51 -0
  31. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsItem.d.ts.map +1 -1
  32. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsList.d.ts +28 -0
  33. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsList.d.ts.map +1 -1
  34. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsMenu.d.ts +112 -0
  35. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsMenu.d.ts.map +1 -1
  36. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsOverflowButton.d.ts +56 -0
  37. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsOverflowButton.d.ts.map +1 -1
  38. package/dist/commonjs/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts +531 -0
  39. package/dist/commonjs/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts.map +1 -1
  40. package/dist/commonjs/button/lib/BaseButton.js +21 -21
  41. package/dist/commonjs/button/lib/DeleteButton.js +1 -1
  42. package/dist/commonjs/button/lib/PrimaryButton.js +2 -2
  43. package/dist/commonjs/button/lib/SecondaryButton.js +2 -2
  44. package/dist/commonjs/button/lib/TertiaryButton.js +18 -18
  45. package/dist/commonjs/card/lib/Card.js +1 -1
  46. package/dist/commonjs/card/lib/CardBody.js +1 -1
  47. package/dist/commonjs/card/lib/CardHeading.js +1 -1
  48. package/dist/commonjs/checkbox/lib/CheckBackground.js +3 -3
  49. package/dist/commonjs/checkbox/lib/CheckboxCheck.js +5 -5
  50. package/dist/commonjs/checkbox/lib/CheckboxContainer.js +1 -1
  51. package/dist/commonjs/checkbox/lib/CheckboxInput.js +5 -5
  52. package/dist/commonjs/checkbox/lib/CheckboxRipple.js +1 -1
  53. package/dist/commonjs/collection/index.d.ts +3 -0
  54. package/dist/commonjs/collection/index.d.ts.map +1 -1
  55. package/dist/commonjs/collection/index.js +3 -0
  56. package/dist/commonjs/collection/lib/ListBox.d.ts +78 -0
  57. package/dist/commonjs/collection/lib/ListBox.d.ts.map +1 -1
  58. package/dist/commonjs/collection/lib/ListBox.js +3 -3
  59. package/dist/commonjs/collection/lib/focusOnCurrentCursor.d.ts +3 -0
  60. package/dist/commonjs/collection/lib/focusOnCurrentCursor.d.ts.map +1 -0
  61. package/dist/commonjs/collection/lib/focusOnCurrentCursor.js +45 -0
  62. package/dist/commonjs/collection/lib/listItemRemove.d.ts +3 -0
  63. package/dist/commonjs/collection/lib/listItemRemove.d.ts.map +1 -0
  64. package/dist/commonjs/collection/lib/listItemRemove.js +19 -0
  65. package/dist/commonjs/collection/lib/useGridModel.d.ts +73 -0
  66. package/dist/commonjs/collection/lib/useGridModel.d.ts.map +1 -1
  67. package/dist/commonjs/collection/lib/useListItemAllowChildStrings.d.ts +5 -0
  68. package/dist/commonjs/collection/lib/useListItemAllowChildStrings.d.ts.map +1 -1
  69. package/dist/commonjs/collection/lib/useListItemRegister.d.ts +5 -0
  70. package/dist/commonjs/collection/lib/useListItemRegister.d.ts.map +1 -1
  71. package/dist/commonjs/collection/lib/useListItemRemoveOnDeleteKey.d.ts +86 -0
  72. package/dist/commonjs/collection/lib/useListItemRemoveOnDeleteKey.d.ts.map +1 -0
  73. package/dist/commonjs/collection/lib/useListItemRemoveOnDeleteKey.js +40 -0
  74. package/dist/commonjs/collection/lib/useListItemRovingFocus.d.ts +1 -1
  75. package/dist/commonjs/collection/lib/useListItemRovingFocus.d.ts.map +1 -1
  76. package/dist/commonjs/collection/lib/useListItemRovingFocus.js +6 -29
  77. package/dist/commonjs/collection/lib/useListItemSelect.d.ts +5 -0
  78. package/dist/commonjs/collection/lib/useListItemSelect.d.ts.map +1 -1
  79. package/dist/commonjs/collection/lib/useListLoader.d.ts.map +1 -1
  80. package/dist/commonjs/collection/lib/useListLoader.js +2 -0
  81. package/dist/commonjs/collection/lib/useListModel.d.ts +73 -0
  82. package/dist/commonjs/collection/lib/useListModel.d.ts.map +1 -1
  83. package/dist/commonjs/collection/lib/useListResetCursorOnBlur.d.ts +5 -0
  84. package/dist/commonjs/collection/lib/useListResetCursorOnBlur.d.ts.map +1 -1
  85. package/dist/commonjs/collection/lib/useListResetCursorOnBlur.js +13 -1
  86. package/dist/commonjs/collection/lib/useOverflowListItemMeasure.d.ts +23 -0
  87. package/dist/commonjs/collection/lib/useOverflowListItemMeasure.d.ts.map +1 -1
  88. package/dist/commonjs/collection/lib/useOverflowListItemMeasure.js +5 -2
  89. package/dist/commonjs/collection/lib/useOverflowListMeasure.d.ts +23 -0
  90. package/dist/commonjs/collection/lib/useOverflowListMeasure.d.ts.map +1 -1
  91. package/dist/commonjs/collection/lib/useOverflowListMeasure.js +1 -1
  92. package/dist/commonjs/collection/lib/useOverflowListModel.d.ts +945 -1
  93. package/dist/commonjs/collection/lib/useOverflowListModel.d.ts.map +1 -1
  94. package/dist/commonjs/collection/lib/useOverflowListModel.js +73 -35
  95. package/dist/commonjs/collection/lib/useOverflowListTarget.d.ts +23 -0
  96. package/dist/commonjs/collection/lib/useOverflowListTarget.d.ts.map +1 -1
  97. package/dist/commonjs/collection/lib/useOverflowListTarget.js +4 -1
  98. package/dist/commonjs/collection/lib/useSelectionListModel.d.ts +94 -0
  99. package/dist/commonjs/collection/lib/useSelectionListModel.d.ts.map +1 -1
  100. package/dist/commonjs/collection/lib/useSelectionListModel.js +10 -0
  101. package/dist/commonjs/combobox/lib/Combobox.d.ts +113 -0
  102. package/dist/commonjs/combobox/lib/Combobox.d.ts.map +1 -1
  103. package/dist/commonjs/combobox/lib/ComboboxCard.d.ts +10 -0
  104. package/dist/commonjs/combobox/lib/ComboboxCard.d.ts.map +1 -1
  105. package/dist/commonjs/combobox/lib/ComboboxInput.d.ts +5 -0
  106. package/dist/commonjs/combobox/lib/ComboboxInput.d.ts.map +1 -1
  107. package/dist/commonjs/combobox/lib/ComboboxMenu.d.ts +25 -0
  108. package/dist/commonjs/combobox/lib/ComboboxMenu.d.ts.map +1 -1
  109. package/dist/commonjs/combobox/lib/ComboboxMenuItem.d.ts +5 -0
  110. package/dist/commonjs/combobox/lib/ComboboxMenuItem.d.ts.map +1 -1
  111. package/dist/commonjs/combobox/lib/ComboboxMenuList.d.ts +10 -0
  112. package/dist/commonjs/combobox/lib/ComboboxMenuList.d.ts.map +1 -1
  113. package/dist/commonjs/combobox/lib/ComboboxMenuList.js +1 -1
  114. package/dist/commonjs/combobox/lib/ComboboxPopper.d.ts +5 -0
  115. package/dist/commonjs/combobox/lib/ComboboxPopper.d.ts.map +1 -1
  116. package/dist/commonjs/combobox/lib/hooks/useComboboxInput.d.ts +5 -0
  117. package/dist/commonjs/combobox/lib/hooks/useComboboxInput.d.ts.map +1 -1
  118. package/dist/commonjs/combobox/lib/hooks/useComboboxInput.js +5 -9
  119. package/dist/commonjs/combobox/lib/hooks/useComboboxInputArbitrary.d.ts +5 -0
  120. package/dist/commonjs/combobox/lib/hooks/useComboboxInputArbitrary.d.ts.map +1 -1
  121. package/dist/commonjs/combobox/lib/hooks/useComboboxInputConstrained.d.ts +5 -0
  122. package/dist/commonjs/combobox/lib/hooks/useComboboxInputConstrained.d.ts.map +1 -1
  123. package/dist/commonjs/combobox/lib/hooks/useComboboxInputOpenWithArrowKeys.d.ts +5 -0
  124. package/dist/commonjs/combobox/lib/hooks/useComboboxInputOpenWithArrowKeys.d.ts.map +1 -1
  125. package/dist/commonjs/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts +5 -0
  126. package/dist/commonjs/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts.map +1 -1
  127. package/dist/commonjs/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts +5 -0
  128. package/dist/commonjs/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts.map +1 -1
  129. package/dist/commonjs/combobox/lib/hooks/useComboboxModel.d.ts +101 -0
  130. package/dist/commonjs/combobox/lib/hooks/useComboboxModel.d.ts.map +1 -1
  131. package/dist/commonjs/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts +5 -0
  132. package/dist/commonjs/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts.map +1 -1
  133. package/dist/commonjs/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts +5 -0
  134. package/dist/commonjs/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts.map +1 -1
  135. package/dist/commonjs/combobox/lib/hooks/useSetPopupWidth.d.ts +5 -0
  136. package/dist/commonjs/combobox/lib/hooks/useSetPopupWidth.d.ts.map +1 -1
  137. package/dist/commonjs/common/lib/AccessibleHide.js +1 -1
  138. package/dist/commonjs/common/lib/CanvasProvider.js +1 -1
  139. package/dist/commonjs/form-field/lib/FormFieldContainer.js +1 -1
  140. package/dist/commonjs/form-field/lib/FormFieldField.js +1 -1
  141. package/dist/commonjs/form-field/lib/FormFieldGroupLabel.js +5 -5
  142. package/dist/commonjs/form-field/lib/FormFieldGroupList.js +3 -3
  143. package/dist/commonjs/form-field/lib/FormFieldHint.js +3 -3
  144. package/dist/commonjs/form-field/lib/FormFieldLabel.js +6 -6
  145. package/dist/commonjs/form-field/lib/formFieldStencil.js +8 -8
  146. package/dist/commonjs/icon/lib/AccentIcon.js +2 -2
  147. package/dist/commonjs/icon/lib/AppletIcon.js +1 -1
  148. package/dist/commonjs/icon/lib/Graphic.js +2 -2
  149. package/dist/commonjs/icon/lib/Svg.js +2 -2
  150. package/dist/commonjs/icon/lib/SystemIcon.js +1 -1
  151. package/dist/commonjs/icon/lib/SystemIconCircle.js +1 -1
  152. package/dist/commonjs/loading-dots/lib/LoadingDots.js +2 -2
  153. package/dist/commonjs/menu/lib/Menu.d.ts +112 -0
  154. package/dist/commonjs/menu/lib/Menu.d.ts.map +1 -1
  155. package/dist/commonjs/menu/lib/MenuCard.d.ts +10 -0
  156. package/dist/commonjs/menu/lib/MenuCard.d.ts.map +1 -1
  157. package/dist/commonjs/menu/lib/MenuCard.js +1 -1
  158. package/dist/commonjs/menu/lib/MenuContextTarget.d.ts +15 -0
  159. package/dist/commonjs/menu/lib/MenuContextTarget.d.ts.map +1 -1
  160. package/dist/commonjs/menu/lib/MenuItem.d.ts +11 -1
  161. package/dist/commonjs/menu/lib/MenuItem.d.ts.map +1 -1
  162. package/dist/commonjs/menu/lib/MenuItem.js +1 -1
  163. package/dist/commonjs/menu/lib/MenuList.d.ts +10 -0
  164. package/dist/commonjs/menu/lib/MenuList.d.ts.map +1 -1
  165. package/dist/commonjs/menu/lib/MenuList.js +3 -3
  166. package/dist/commonjs/menu/lib/MenuOption.d.ts +10 -0
  167. package/dist/commonjs/menu/lib/MenuOption.d.ts.map +1 -1
  168. package/dist/commonjs/menu/lib/MenuOption.js +1 -1
  169. package/dist/commonjs/menu/lib/MenuPopper.d.ts +5 -0
  170. package/dist/commonjs/menu/lib/MenuPopper.d.ts.map +1 -1
  171. package/dist/commonjs/menu/lib/MenuTarget.d.ts +25 -0
  172. package/dist/commonjs/menu/lib/MenuTarget.d.ts.map +1 -1
  173. package/dist/commonjs/menu/lib/useMenuModel.d.ts +87 -0
  174. package/dist/commonjs/menu/lib/useMenuModel.d.ts.map +1 -1
  175. package/dist/commonjs/modal/lib/ModalBody.js +1 -1
  176. package/dist/commonjs/modal/lib/ModalCard.js +1 -1
  177. package/dist/commonjs/modal/lib/ModalHeading.js +1 -1
  178. package/dist/commonjs/modal/lib/ModalOverflowOverlay.js +1 -1
  179. package/dist/commonjs/modal/lib/ModalOverlay.js +2 -2
  180. package/dist/commonjs/popup/lib/PopupBody.js +1 -1
  181. package/dist/commonjs/popup/lib/PopupCard.js +2 -2
  182. package/dist/commonjs/popup/lib/PopupCloseIcon.js +1 -1
  183. package/dist/commonjs/popup/lib/PopupHeading.js +1 -1
  184. package/dist/commonjs/select/lib/Select.d.ts +118 -0
  185. package/dist/commonjs/select/lib/Select.d.ts.map +1 -1
  186. package/dist/commonjs/select/lib/SelectCard.d.ts +10 -0
  187. package/dist/commonjs/select/lib/SelectCard.d.ts.map +1 -1
  188. package/dist/commonjs/select/lib/SelectCard.js +1 -1
  189. package/dist/commonjs/select/lib/SelectInput.d.ts +5 -0
  190. package/dist/commonjs/select/lib/SelectInput.d.ts.map +1 -1
  191. package/dist/commonjs/select/lib/SelectInput.js +3 -3
  192. package/dist/commonjs/select/lib/SelectItem.d.ts +10 -0
  193. package/dist/commonjs/select/lib/SelectItem.d.ts.map +1 -1
  194. package/dist/commonjs/select/lib/hooks/useSelectCard.d.ts +5 -0
  195. package/dist/commonjs/select/lib/hooks/useSelectCard.d.ts.map +1 -1
  196. package/dist/commonjs/select/lib/hooks/useSelectInput.d.ts +5 -0
  197. package/dist/commonjs/select/lib/hooks/useSelectInput.d.ts.map +1 -1
  198. package/dist/commonjs/select/lib/hooks/useSelectModel.d.ts +93 -0
  199. package/dist/commonjs/select/lib/hooks/useSelectModel.d.ts.map +1 -1
  200. package/dist/commonjs/switch/lib/Switch.js +7 -7
  201. package/dist/commonjs/table/lib/Table.js +1 -1
  202. package/dist/commonjs/table/lib/TableBody.js +1 -1
  203. package/dist/commonjs/table/lib/TableCaption.js +1 -1
  204. package/dist/commonjs/table/lib/TableCell.js +1 -1
  205. package/dist/commonjs/table/lib/TableFooter.js +1 -1
  206. package/dist/commonjs/table/lib/TableHead.js +1 -1
  207. package/dist/commonjs/table/lib/TableHeader.js +1 -1
  208. package/dist/commonjs/table/lib/TableRow.js +1 -1
  209. package/dist/commonjs/tabs/lib/Tabs.d.ts +891 -44
  210. package/dist/commonjs/tabs/lib/Tabs.d.ts.map +1 -1
  211. package/dist/commonjs/tabs/lib/TabsItem.d.ts +57 -1
  212. package/dist/commonjs/tabs/lib/TabsItem.d.ts.map +1 -1
  213. package/dist/commonjs/tabs/lib/TabsList.d.ts +56 -0
  214. package/dist/commonjs/tabs/lib/TabsList.d.ts.map +1 -1
  215. package/dist/commonjs/tabs/lib/TabsMenuPopper.d.ts +5 -0
  216. package/dist/commonjs/tabs/lib/TabsMenuPopper.d.ts.map +1 -1
  217. package/dist/commonjs/tabs/lib/TabsOverflowButton.d.ts +56 -0
  218. package/dist/commonjs/tabs/lib/TabsOverflowButton.d.ts.map +1 -1
  219. package/dist/commonjs/tabs/lib/TabsPanel.d.ts +56 -0
  220. package/dist/commonjs/tabs/lib/TabsPanel.d.ts.map +1 -1
  221. package/dist/commonjs/tabs/lib/TabsPanels.d.ts +28 -0
  222. package/dist/commonjs/tabs/lib/TabsPanels.d.ts.map +1 -1
  223. package/dist/commonjs/tabs/lib/useTabsModel.d.ts +867 -74
  224. package/dist/commonjs/tabs/lib/useTabsModel.d.ts.map +1 -1
  225. package/dist/commonjs/text/lib/LabelText.js +6 -6
  226. package/dist/commonjs/text/lib/Text.js +16 -16
  227. package/dist/commonjs/text/lib/TypeLevelComponents.js +4 -4
  228. package/dist/commonjs/text-area/lib/TextArea.js +5 -5
  229. package/dist/commonjs/text-input/lib/InputGroup.js +6 -6
  230. package/dist/commonjs/text-input/lib/TextInput.js +5 -5
  231. package/dist/commonjs/toast/lib/Toast.js +1 -1
  232. package/dist/commonjs/toast/lib/ToastBody.js +1 -1
  233. package/dist/commonjs/toast/lib/ToastCloseIcon.js +1 -1
  234. package/dist/commonjs/toast/lib/ToastIcon.js +1 -1
  235. package/dist/commonjs/toast/lib/ToastMessage.js +1 -1
  236. package/dist/es6/action-bar/lib/ActionBar.d.ts +676 -0
  237. package/dist/es6/action-bar/lib/ActionBar.d.ts.map +1 -1
  238. package/dist/es6/action-bar/lib/ActionBarItem.d.ts +51 -0
  239. package/dist/es6/action-bar/lib/ActionBarItem.d.ts.map +1 -1
  240. package/dist/es6/action-bar/lib/ActionBarList.d.ts +51 -0
  241. package/dist/es6/action-bar/lib/ActionBarList.d.ts.map +1 -1
  242. package/dist/es6/action-bar/lib/ActionBarOverflowButton.d.ts +56 -0
  243. package/dist/es6/action-bar/lib/ActionBarOverflowButton.d.ts.map +1 -1
  244. package/dist/es6/action-bar/lib/useActionBarModel.d.ts +531 -0
  245. package/dist/es6/action-bar/lib/useActionBarModel.d.ts.map +1 -1
  246. package/dist/es6/avatar/lib/Avatar.js +21 -21
  247. package/dist/es6/badge/lib/CountBadge.js +3 -3
  248. package/dist/es6/breadcrumbs/lib/Breadcrumbs.d.ts +759 -385
  249. package/dist/es6/breadcrumbs/lib/Breadcrumbs.d.ts.map +1 -1
  250. package/dist/es6/breadcrumbs/lib/BreadcrumbsCurrentItem.d.ts +56 -0
  251. package/dist/es6/breadcrumbs/lib/BreadcrumbsCurrentItem.d.ts.map +1 -1
  252. package/dist/es6/breadcrumbs/lib/BreadcrumbsItem.d.ts +51 -0
  253. package/dist/es6/breadcrumbs/lib/BreadcrumbsItem.d.ts.map +1 -1
  254. package/dist/es6/breadcrumbs/lib/BreadcrumbsList.d.ts +28 -0
  255. package/dist/es6/breadcrumbs/lib/BreadcrumbsList.d.ts.map +1 -1
  256. package/dist/es6/breadcrumbs/lib/BreadcrumbsMenu.d.ts +112 -0
  257. package/dist/es6/breadcrumbs/lib/BreadcrumbsMenu.d.ts.map +1 -1
  258. package/dist/es6/breadcrumbs/lib/BreadcrumbsOverflowButton.d.ts +56 -0
  259. package/dist/es6/breadcrumbs/lib/BreadcrumbsOverflowButton.d.ts.map +1 -1
  260. package/dist/es6/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts +531 -0
  261. package/dist/es6/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts.map +1 -1
  262. package/dist/es6/button/lib/BaseButton.js +21 -21
  263. package/dist/es6/button/lib/DeleteButton.js +1 -1
  264. package/dist/es6/button/lib/PrimaryButton.js +2 -2
  265. package/dist/es6/button/lib/SecondaryButton.js +2 -2
  266. package/dist/es6/button/lib/TertiaryButton.js +18 -18
  267. package/dist/es6/card/lib/Card.js +1 -1
  268. package/dist/es6/card/lib/CardBody.js +1 -1
  269. package/dist/es6/card/lib/CardHeading.js +1 -1
  270. package/dist/es6/checkbox/lib/CheckBackground.js +3 -3
  271. package/dist/es6/checkbox/lib/CheckboxCheck.js +5 -5
  272. package/dist/es6/checkbox/lib/CheckboxContainer.js +1 -1
  273. package/dist/es6/checkbox/lib/CheckboxInput.js +5 -5
  274. package/dist/es6/checkbox/lib/CheckboxRipple.js +1 -1
  275. package/dist/es6/collection/index.d.ts +3 -0
  276. package/dist/es6/collection/index.d.ts.map +1 -1
  277. package/dist/es6/collection/index.js +3 -0
  278. package/dist/es6/collection/lib/ListBox.d.ts +78 -0
  279. package/dist/es6/collection/lib/ListBox.d.ts.map +1 -1
  280. package/dist/es6/collection/lib/ListBox.js +3 -3
  281. package/dist/es6/collection/lib/focusOnCurrentCursor.d.ts +3 -0
  282. package/dist/es6/collection/lib/focusOnCurrentCursor.d.ts.map +1 -0
  283. package/dist/es6/collection/lib/focusOnCurrentCursor.js +41 -0
  284. package/dist/es6/collection/lib/listItemRemove.d.ts +3 -0
  285. package/dist/es6/collection/lib/listItemRemove.d.ts.map +1 -0
  286. package/dist/es6/collection/lib/listItemRemove.js +15 -0
  287. package/dist/es6/collection/lib/useGridModel.d.ts +73 -0
  288. package/dist/es6/collection/lib/useGridModel.d.ts.map +1 -1
  289. package/dist/es6/collection/lib/useListItemAllowChildStrings.d.ts +5 -0
  290. package/dist/es6/collection/lib/useListItemAllowChildStrings.d.ts.map +1 -1
  291. package/dist/es6/collection/lib/useListItemRegister.d.ts +5 -0
  292. package/dist/es6/collection/lib/useListItemRegister.d.ts.map +1 -1
  293. package/dist/es6/collection/lib/useListItemRemoveOnDeleteKey.d.ts +86 -0
  294. package/dist/es6/collection/lib/useListItemRemoveOnDeleteKey.d.ts.map +1 -0
  295. package/dist/es6/collection/lib/useListItemRemoveOnDeleteKey.js +37 -0
  296. package/dist/es6/collection/lib/useListItemRovingFocus.d.ts +1 -1
  297. package/dist/es6/collection/lib/useListItemRovingFocus.d.ts.map +1 -1
  298. package/dist/es6/collection/lib/useListItemRovingFocus.js +6 -29
  299. package/dist/es6/collection/lib/useListItemSelect.d.ts +5 -0
  300. package/dist/es6/collection/lib/useListItemSelect.d.ts.map +1 -1
  301. package/dist/es6/collection/lib/useListLoader.d.ts.map +1 -1
  302. package/dist/es6/collection/lib/useListLoader.js +2 -0
  303. package/dist/es6/collection/lib/useListModel.d.ts +73 -0
  304. package/dist/es6/collection/lib/useListModel.d.ts.map +1 -1
  305. package/dist/es6/collection/lib/useListResetCursorOnBlur.d.ts +5 -0
  306. package/dist/es6/collection/lib/useListResetCursorOnBlur.d.ts.map +1 -1
  307. package/dist/es6/collection/lib/useListResetCursorOnBlur.js +14 -2
  308. package/dist/es6/collection/lib/useOverflowListItemMeasure.d.ts +23 -0
  309. package/dist/es6/collection/lib/useOverflowListItemMeasure.d.ts.map +1 -1
  310. package/dist/es6/collection/lib/useOverflowListItemMeasure.js +5 -2
  311. package/dist/es6/collection/lib/useOverflowListMeasure.d.ts +23 -0
  312. package/dist/es6/collection/lib/useOverflowListMeasure.d.ts.map +1 -1
  313. package/dist/es6/collection/lib/useOverflowListMeasure.js +1 -1
  314. package/dist/es6/collection/lib/useOverflowListModel.d.ts +945 -1
  315. package/dist/es6/collection/lib/useOverflowListModel.d.ts.map +1 -1
  316. package/dist/es6/collection/lib/useOverflowListModel.js +73 -35
  317. package/dist/es6/collection/lib/useOverflowListTarget.d.ts +23 -0
  318. package/dist/es6/collection/lib/useOverflowListTarget.d.ts.map +1 -1
  319. package/dist/es6/collection/lib/useOverflowListTarget.js +4 -1
  320. package/dist/es6/collection/lib/useSelectionListModel.d.ts +94 -0
  321. package/dist/es6/collection/lib/useSelectionListModel.d.ts.map +1 -1
  322. package/dist/es6/collection/lib/useSelectionListModel.js +10 -0
  323. package/dist/es6/combobox/lib/Combobox.d.ts +113 -0
  324. package/dist/es6/combobox/lib/Combobox.d.ts.map +1 -1
  325. package/dist/es6/combobox/lib/ComboboxCard.d.ts +10 -0
  326. package/dist/es6/combobox/lib/ComboboxCard.d.ts.map +1 -1
  327. package/dist/es6/combobox/lib/ComboboxInput.d.ts +5 -0
  328. package/dist/es6/combobox/lib/ComboboxInput.d.ts.map +1 -1
  329. package/dist/es6/combobox/lib/ComboboxMenu.d.ts +25 -0
  330. package/dist/es6/combobox/lib/ComboboxMenu.d.ts.map +1 -1
  331. package/dist/es6/combobox/lib/ComboboxMenuItem.d.ts +5 -0
  332. package/dist/es6/combobox/lib/ComboboxMenuItem.d.ts.map +1 -1
  333. package/dist/es6/combobox/lib/ComboboxMenuList.d.ts +10 -0
  334. package/dist/es6/combobox/lib/ComboboxMenuList.d.ts.map +1 -1
  335. package/dist/es6/combobox/lib/ComboboxMenuList.js +1 -1
  336. package/dist/es6/combobox/lib/ComboboxPopper.d.ts +5 -0
  337. package/dist/es6/combobox/lib/ComboboxPopper.d.ts.map +1 -1
  338. package/dist/es6/combobox/lib/hooks/useComboboxInput.d.ts +5 -0
  339. package/dist/es6/combobox/lib/hooks/useComboboxInput.d.ts.map +1 -1
  340. package/dist/es6/combobox/lib/hooks/useComboboxInput.js +5 -9
  341. package/dist/es6/combobox/lib/hooks/useComboboxInputArbitrary.d.ts +5 -0
  342. package/dist/es6/combobox/lib/hooks/useComboboxInputArbitrary.d.ts.map +1 -1
  343. package/dist/es6/combobox/lib/hooks/useComboboxInputConstrained.d.ts +5 -0
  344. package/dist/es6/combobox/lib/hooks/useComboboxInputConstrained.d.ts.map +1 -1
  345. package/dist/es6/combobox/lib/hooks/useComboboxInputOpenWithArrowKeys.d.ts +5 -0
  346. package/dist/es6/combobox/lib/hooks/useComboboxInputOpenWithArrowKeys.d.ts.map +1 -1
  347. package/dist/es6/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts +5 -0
  348. package/dist/es6/combobox/lib/hooks/useComboboxKeyboardTypeAhead.d.ts.map +1 -1
  349. package/dist/es6/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts +5 -0
  350. package/dist/es6/combobox/lib/hooks/useComboboxListKeyboardHandler.d.ts.map +1 -1
  351. package/dist/es6/combobox/lib/hooks/useComboboxModel.d.ts +101 -0
  352. package/dist/es6/combobox/lib/hooks/useComboboxModel.d.ts.map +1 -1
  353. package/dist/es6/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts +5 -0
  354. package/dist/es6/combobox/lib/hooks/useComboboxMoveCursorToSelected.d.ts.map +1 -1
  355. package/dist/es6/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts +5 -0
  356. package/dist/es6/combobox/lib/hooks/useComboboxResetCursorToSelected.d.ts.map +1 -1
  357. package/dist/es6/combobox/lib/hooks/useSetPopupWidth.d.ts +5 -0
  358. package/dist/es6/combobox/lib/hooks/useSetPopupWidth.d.ts.map +1 -1
  359. package/dist/es6/common/lib/AccessibleHide.js +1 -1
  360. package/dist/es6/common/lib/CanvasProvider.js +1 -1
  361. package/dist/es6/form-field/lib/FormFieldContainer.js +1 -1
  362. package/dist/es6/form-field/lib/FormFieldField.js +1 -1
  363. package/dist/es6/form-field/lib/FormFieldGroupLabel.js +5 -5
  364. package/dist/es6/form-field/lib/FormFieldGroupList.js +3 -3
  365. package/dist/es6/form-field/lib/FormFieldHint.js +3 -3
  366. package/dist/es6/form-field/lib/FormFieldLabel.js +6 -6
  367. package/dist/es6/form-field/lib/formFieldStencil.js +8 -8
  368. package/dist/es6/icon/lib/AccentIcon.js +2 -2
  369. package/dist/es6/icon/lib/AppletIcon.js +1 -1
  370. package/dist/es6/icon/lib/Graphic.js +2 -2
  371. package/dist/es6/icon/lib/Svg.js +2 -2
  372. package/dist/es6/icon/lib/SystemIcon.js +1 -1
  373. package/dist/es6/icon/lib/SystemIconCircle.js +1 -1
  374. package/dist/es6/loading-dots/lib/LoadingDots.js +2 -2
  375. package/dist/es6/menu/lib/Menu.d.ts +112 -0
  376. package/dist/es6/menu/lib/Menu.d.ts.map +1 -1
  377. package/dist/es6/menu/lib/MenuCard.d.ts +10 -0
  378. package/dist/es6/menu/lib/MenuCard.d.ts.map +1 -1
  379. package/dist/es6/menu/lib/MenuCard.js +1 -1
  380. package/dist/es6/menu/lib/MenuContextTarget.d.ts +15 -0
  381. package/dist/es6/menu/lib/MenuContextTarget.d.ts.map +1 -1
  382. package/dist/es6/menu/lib/MenuItem.d.ts +11 -1
  383. package/dist/es6/menu/lib/MenuItem.d.ts.map +1 -1
  384. package/dist/es6/menu/lib/MenuItem.js +1 -1
  385. package/dist/es6/menu/lib/MenuList.d.ts +10 -0
  386. package/dist/es6/menu/lib/MenuList.d.ts.map +1 -1
  387. package/dist/es6/menu/lib/MenuList.js +3 -3
  388. package/dist/es6/menu/lib/MenuOption.d.ts +10 -0
  389. package/dist/es6/menu/lib/MenuOption.d.ts.map +1 -1
  390. package/dist/es6/menu/lib/MenuOption.js +1 -1
  391. package/dist/es6/menu/lib/MenuPopper.d.ts +5 -0
  392. package/dist/es6/menu/lib/MenuPopper.d.ts.map +1 -1
  393. package/dist/es6/menu/lib/MenuTarget.d.ts +25 -0
  394. package/dist/es6/menu/lib/MenuTarget.d.ts.map +1 -1
  395. package/dist/es6/menu/lib/useMenuModel.d.ts +87 -0
  396. package/dist/es6/menu/lib/useMenuModel.d.ts.map +1 -1
  397. package/dist/es6/modal/lib/ModalBody.js +1 -1
  398. package/dist/es6/modal/lib/ModalCard.js +1 -1
  399. package/dist/es6/modal/lib/ModalHeading.js +1 -1
  400. package/dist/es6/modal/lib/ModalOverflowOverlay.js +1 -1
  401. package/dist/es6/modal/lib/ModalOverlay.js +2 -2
  402. package/dist/es6/popup/lib/PopupBody.js +1 -1
  403. package/dist/es6/popup/lib/PopupCard.js +2 -2
  404. package/dist/es6/popup/lib/PopupCloseIcon.js +1 -1
  405. package/dist/es6/popup/lib/PopupHeading.js +1 -1
  406. package/dist/es6/select/lib/Select.d.ts +118 -0
  407. package/dist/es6/select/lib/Select.d.ts.map +1 -1
  408. package/dist/es6/select/lib/SelectCard.d.ts +10 -0
  409. package/dist/es6/select/lib/SelectCard.d.ts.map +1 -1
  410. package/dist/es6/select/lib/SelectCard.js +1 -1
  411. package/dist/es6/select/lib/SelectInput.d.ts +5 -0
  412. package/dist/es6/select/lib/SelectInput.d.ts.map +1 -1
  413. package/dist/es6/select/lib/SelectInput.js +3 -3
  414. package/dist/es6/select/lib/SelectItem.d.ts +10 -0
  415. package/dist/es6/select/lib/SelectItem.d.ts.map +1 -1
  416. package/dist/es6/select/lib/hooks/useSelectCard.d.ts +5 -0
  417. package/dist/es6/select/lib/hooks/useSelectCard.d.ts.map +1 -1
  418. package/dist/es6/select/lib/hooks/useSelectInput.d.ts +5 -0
  419. package/dist/es6/select/lib/hooks/useSelectInput.d.ts.map +1 -1
  420. package/dist/es6/select/lib/hooks/useSelectModel.d.ts +93 -0
  421. package/dist/es6/select/lib/hooks/useSelectModel.d.ts.map +1 -1
  422. package/dist/es6/switch/lib/Switch.js +7 -7
  423. package/dist/es6/table/lib/Table.js +1 -1
  424. package/dist/es6/table/lib/TableBody.js +1 -1
  425. package/dist/es6/table/lib/TableCaption.js +1 -1
  426. package/dist/es6/table/lib/TableCell.js +1 -1
  427. package/dist/es6/table/lib/TableFooter.js +1 -1
  428. package/dist/es6/table/lib/TableHead.js +1 -1
  429. package/dist/es6/table/lib/TableHeader.js +1 -1
  430. package/dist/es6/table/lib/TableRow.js +1 -1
  431. package/dist/es6/tabs/lib/Tabs.d.ts +891 -44
  432. package/dist/es6/tabs/lib/Tabs.d.ts.map +1 -1
  433. package/dist/es6/tabs/lib/TabsItem.d.ts +57 -1
  434. package/dist/es6/tabs/lib/TabsItem.d.ts.map +1 -1
  435. package/dist/es6/tabs/lib/TabsList.d.ts +56 -0
  436. package/dist/es6/tabs/lib/TabsList.d.ts.map +1 -1
  437. package/dist/es6/tabs/lib/TabsMenuPopper.d.ts +5 -0
  438. package/dist/es6/tabs/lib/TabsMenuPopper.d.ts.map +1 -1
  439. package/dist/es6/tabs/lib/TabsOverflowButton.d.ts +56 -0
  440. package/dist/es6/tabs/lib/TabsOverflowButton.d.ts.map +1 -1
  441. package/dist/es6/tabs/lib/TabsPanel.d.ts +56 -0
  442. package/dist/es6/tabs/lib/TabsPanel.d.ts.map +1 -1
  443. package/dist/es6/tabs/lib/TabsPanels.d.ts +28 -0
  444. package/dist/es6/tabs/lib/TabsPanels.d.ts.map +1 -1
  445. package/dist/es6/tabs/lib/useTabsModel.d.ts +867 -74
  446. package/dist/es6/tabs/lib/useTabsModel.d.ts.map +1 -1
  447. package/dist/es6/text/lib/LabelText.js +6 -6
  448. package/dist/es6/text/lib/Text.js +16 -16
  449. package/dist/es6/text/lib/TypeLevelComponents.js +4 -4
  450. package/dist/es6/text-area/lib/TextArea.js +5 -5
  451. package/dist/es6/text-input/lib/InputGroup.js +6 -6
  452. package/dist/es6/text-input/lib/TextInput.js +5 -5
  453. package/dist/es6/toast/lib/Toast.js +1 -1
  454. package/dist/es6/toast/lib/ToastBody.js +1 -1
  455. package/dist/es6/toast/lib/ToastCloseIcon.js +1 -1
  456. package/dist/es6/toast/lib/ToastIcon.js +1 -1
  457. package/dist/es6/toast/lib/ToastMessage.js +1 -1
  458. package/package.json +4 -4
@@ -15,6 +15,9 @@ export * from './lib/useGridModel';
15
15
  export * from './lib/useListActiveDescendant';
16
16
  export * from './lib/useListItemActiveDescendant';
17
17
  export * from './lib/useListItemAllowChildStrings';
18
+ export * from './lib/useListItemRemoveOnDeleteKey';
19
+ export * from './lib/focusOnCurrentCursor';
20
+ export * from './lib/listItemRemove';
18
21
  export {ListBox, ListBoxProps} from './lib/ListBox';
19
22
  export {keyboardEventToCursorEvents} from './lib/keyUtils';
20
23
  export {
@@ -0,0 +1,55 @@
1
+ import {useCursorListModel} from './useCursorListModel';
2
+
3
+ // retry a function each frame so we don't rely on the timing mechanism of React's render cycle.
4
+ const retryEachFrame = (cb: () => boolean, iterations: number, reject?: (reason?: any) => void) => {
5
+ if (cb() === false && iterations > 1) {
6
+ requestAnimationFrame(() => retryEachFrame(cb, iterations - 1));
7
+ }
8
+ reject?.('Retry timeout');
9
+ };
10
+
11
+ export const focusOnCurrentCursor = (
12
+ model: ReturnType<typeof useCursorListModel>,
13
+ nextId: string,
14
+ /**
15
+ * This can be any element in the list. It is used only to get the client-id from the element in
16
+ * case it is different than the server ID when DOM is hydrated.
17
+ */
18
+ element?: HTMLElement
19
+ ) => {
20
+ return new Promise<HTMLElement | null>((resolve, reject) => {
21
+ // Attempt to extract the ID from the DOM element. This fixes issues where the server and client
22
+ // do not agree on a generated ID
23
+ const clientId = (element?.dataset?.focusId || '').split('-')[0] || model.state.id;
24
+
25
+ const item = model.navigation.getItem(nextId, model);
26
+
27
+ if (item) {
28
+ // If the list is virtualized, we need to manually call out to the virtual list's
29
+ // `scrollToIndex`
30
+ if (model.state.isVirtualized) {
31
+ model.state.UNSTABLE_virtual.scrollToIndex(item.index);
32
+ }
33
+
34
+ const getElement = (id?: string) => {
35
+ return document.querySelector<HTMLElement>(`[data-focus-id="${`${id}-${item.id}`}"]`);
36
+ };
37
+
38
+ // In React concurrent mode, there could be several render attempts before the element we're
39
+ // looking for could be available in the DOM
40
+ retryEachFrame(
41
+ () => {
42
+ const element = getElement(clientId) || getElement(model.state.id);
43
+
44
+ if (element) {
45
+ element.focus();
46
+ resolve(element);
47
+ }
48
+ return !!element;
49
+ },
50
+ 5,
51
+ reject
52
+ ); // 5 should be enough, right?!
53
+ }
54
+ });
55
+ };
@@ -0,0 +1,21 @@
1
+ import {useSelectionListModel} from './useSelectionListModel';
2
+
3
+ export const listItemRemove = (
4
+ id: string,
5
+ model: ReturnType<typeof useSelectionListModel>
6
+ ): string | undefined => {
7
+ // bail early if an ID isn't available
8
+ if (!id) {
9
+ return;
10
+ }
11
+
12
+ const index = model.state.items.findIndex(item => item.id === model.state.cursorId);
13
+ const nextIndex = index === model.state.items.length - 1 ? index - 1 : index + 1;
14
+ const nextId = model.state.items[nextIndex]?.id;
15
+ if (nextId && model.state.cursorId === id) {
16
+ // We're removing the currently focused item. Focus next item
17
+ model.events.goTo({id: nextId});
18
+ }
19
+
20
+ return nextId;
21
+ };
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import {createElemPropsHook} from '@workday/canvas-kit-react/common';
3
+
4
+ import {useSelectionListModel} from './useSelectionListModel';
5
+ import {focusOnCurrentCursor} from './focusOnCurrentCursor';
6
+ import {listItemRemove} from './listItemRemove';
7
+
8
+ /**
9
+ * This elemProps hook is used when a menu item is expected to be removed. It will advance the cursor to
10
+ * another item.
11
+ * This elemProps hook is used for cursor navigation by using [Roving
12
+ * Tabindex](https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#kbd_roving_tabindex). Only a single item in the
13
+ * collection has a tab stop. Pressing an arrow key moves the tab stop to a different item in the
14
+ * corresponding direction. See the [Roving Tabindex](#roving-tabindex) example. This elemProps hook
15
+ * should be applied to an `*.Item` component.
16
+ *
17
+ * ```ts
18
+ * const useMyItem = composeHooks(
19
+ * useListItemRovingFocus, // adds the roving tabindex support
20
+ * useListItemRegister
21
+ * );
22
+ * ```
23
+ */
24
+ export const useListItemRemoveOnDeleteKey = createElemPropsHook(useSelectionListModel)(model => {
25
+ return {
26
+ onKeyDown(event: React.KeyboardEvent<HTMLElement>) {
27
+ if (event.key === 'Backspace' || event.key === 'Delete') {
28
+ const id = event.currentTarget.dataset.id || '';
29
+ const nextId = listItemRemove(id, model);
30
+ model.events.remove({id, nextId, event});
31
+ if (nextId) {
32
+ // use an animation frame to wait for any other model changes that may happen
33
+ requestAnimationFrame(() => {
34
+ focusOnCurrentCursor(model, nextId, event.currentTarget);
35
+ });
36
+ }
37
+ }
38
+ },
39
+ };
40
+ });
@@ -3,13 +3,7 @@ import {useIsRTL, createElemPropsHook} from '@workday/canvas-kit-react/common';
3
3
 
4
4
  import {useCursorListModel} from './useCursorListModel';
5
5
  import {keyboardEventToCursorEvents} from './keyUtils';
6
-
7
- // retry a function each frame so we don't rely on the timing mechanism of React's render cycle.
8
- const retryEachFrame = (cb: () => boolean, iterations: number) => {
9
- if (cb() === false && iterations > 1) {
10
- requestAnimationFrame(() => retryEachFrame(cb, iterations - 1));
11
- }
12
- };
6
+ import {focusOnCurrentCursor} from './focusOnCurrentCursor';
13
7
 
14
8
  /**
15
9
  * This elemProps hook is used for cursor navigation by using [Roving
@@ -33,36 +27,16 @@ export const useListItemRovingFocus = createElemPropsHook(useCursorListModel)(
33
27
  const stateRef = React.useRef(model.state);
34
28
  stateRef.current = model.state;
35
29
 
36
- const keyElementRef = React.useRef<Element | null>(null);
30
+ const keyElementRef = React.useRef<HTMLElement | null>(null);
37
31
  const isRTL = useIsRTL();
38
32
 
39
33
  React.useEffect(() => {
34
+ // If the cursor change was triggered by this hook, we should change focus
40
35
  if (keyElementRef.current) {
41
- const item = model.navigation.getItem(model.state.cursorId, model);
42
- if (item) {
43
- if (model.state.isVirtualized) {
44
- model.state.UNSTABLE_virtual.scrollToIndex(item.index);
45
- }
46
-
47
- const selector = (id?: string) => {
48
- return document.querySelector<HTMLElement>(`[data-focus-id="${`${id}-${item.id}`}"]`);
49
- };
50
-
51
- // In React concurrent mode, there could be several render attempts before the element we're
52
- // looking for could be available in the DOM
53
- retryEachFrame(() => {
54
- // Attempt to extract the ID from the DOM element. This fixes issues where the server and client
55
- // do not agree on a generated ID
56
- const clientId = keyElementRef.current?.getAttribute('data-focus-id')?.split('-')[0];
57
- const element = selector(clientId) || selector(model.state.id);
58
-
59
- element?.focus();
60
- if (element) {
61
- keyElementRef.current = null;
62
- }
63
- return !!element;
64
- }, 5); // 5 should be enough, right?!
65
- }
36
+ focusOnCurrentCursor(model, model.state.cursorId, keyElementRef.current).then(() => {
37
+ // Reset key element since focus was successful
38
+ keyElementRef.current = null;
39
+ });
66
40
  }
67
41
  // we only want to run this effect if the cursor changes and not any other time
68
42
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -76,7 +50,7 @@ export const useListItemRovingFocus = createElemPropsHook(useCursorListModel)(
76
50
  }, [model.state.cursorId, model.state.items, model.events]);
77
51
 
78
52
  return {
79
- onKeyDown(event: React.KeyboardEvent) {
53
+ onKeyDown(event: React.KeyboardEvent<HTMLElement>) {
80
54
  const handled = keyboardEventToCursorEvents(event, model, isRTL);
81
55
  if (handled) {
82
56
  event.preventDefault();
@@ -269,6 +269,8 @@ export function useListLoader<
269
269
 
270
270
  const model = modelHook(
271
271
  modelHook.mergeConfig(config, {
272
+ // Loaders should virtualize by default. If they do not, it is an infinite scroll list
273
+ shouldVirtualize: true,
272
274
  items,
273
275
  shouldGoToNext: shouldLoadIndex('getNext', 'goToNext'),
274
276
  shouldGoToPrevious: shouldLoadIndex('getPrevious', 'goToPrevious'),
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
 
3
- import {createElemPropsHook} from '@workday/canvas-kit-react/common';
3
+ import {createElemPropsHook, useMountLayout} from '@workday/canvas-kit-react/common';
4
4
  import {orientationKeyMap} from './keyUtils';
5
5
  import {useListModel} from './useListModel';
6
6
 
@@ -20,6 +20,15 @@ import {useListModel} from './useListModel';
20
20
  */
21
21
  export const useListResetCursorOnBlur = createElemPropsHook(useListModel)(({state, events}) => {
22
22
  const programmaticFocusRef = React.useRef(false);
23
+ const requestAnimationFrameRef = React.useRef(0);
24
+
25
+ useMountLayout(() => {
26
+ return () => {
27
+ // Cancelling the animation frame prevents React unmount errors
28
+ cancelAnimationFrame(requestAnimationFrameRef.current);
29
+ };
30
+ });
31
+
23
32
  return {
24
33
  onKeyDown(event: React.KeyboardEvent) {
25
34
  // Programmatic focus only on any focus change via keyboard
@@ -32,7 +41,12 @@ export const useListResetCursorOnBlur = createElemPropsHook(useListModel)(({stat
32
41
  },
33
42
  onBlur() {
34
43
  if (!programmaticFocusRef.current) {
35
- events.goTo({id: state.selectedIds[0]});
44
+ // use an animation frame to wait for any other model changes that may happen on a blur
45
+ requestAnimationFrameRef.current = requestAnimationFrame(() => {
46
+ if (state.selectedIds[0] !== state.cursorId) {
47
+ events.goTo({id: state.selectedIds[0]});
48
+ }
49
+ });
36
50
  }
37
51
  },
38
52
  };
@@ -26,17 +26,21 @@ export const useOverflowListItemMeasure = createElemPropsHook(useOverflowListMod
26
26
  useMountLayout(() => {
27
27
  if (localRef.current) {
28
28
  const styles = getComputedStyle(localRef.current);
29
- model.events.addItemWidth({
29
+ model.events.addItemSize({
30
30
  id: name,
31
31
  width:
32
32
  localRef.current.offsetWidth +
33
33
  parseFloat(styles.marginLeft) +
34
34
  parseFloat(styles.marginRight),
35
+ height:
36
+ localRef.current.offsetHeight +
37
+ parseFloat(styles.marginTop) +
38
+ parseFloat(styles.marginBottom),
35
39
  });
36
40
  }
37
41
 
38
42
  return () => {
39
- model.events.removeItemWidth({id: name});
43
+ model.events.removeItemSize({id: name});
40
44
  };
41
45
  });
42
46
 
@@ -19,7 +19,7 @@ export const useOverflowListMeasure = createElemPropsHook(useOverflowListModel)(
19
19
 
20
20
  useResizeObserver({
21
21
  ref: localRef,
22
- onResize: model.events.setContainerWidth,
22
+ onResize: model.events.setContainerSize,
23
23
  });
24
24
  useMountLayout(() => {
25
25
  if (localRef.current) {
@@ -5,17 +5,17 @@ import {useSelectionListModel} from './useSelectionListModel';
5
5
  import {Item} from './useBaseListModel';
6
6
 
7
7
  export function getHiddenIds(
8
- containerWidth: number,
8
+ containerSize: number,
9
9
  containerGap: number,
10
- overflowTargetWidth: number,
11
- itemWidthCache: Record<string, number>,
10
+ overflowTargetSize: number,
11
+ itemSizeCache: Record<string, number>,
12
12
  selectedIds: string[] | 'all',
13
13
  items: Item<any>[]
14
14
  ): string[] {
15
15
  /** Allows us to prioritize showing the selected item */
16
16
  let selectedKey: undefined | string;
17
17
  /** Tally of combined item widths. We'll add items that fit until the container is full */
18
- let itemWidth = 0;
18
+ let itemSize = 0;
19
19
  /** Tally ids that won't fit inside the container. These will be used by components to hide
20
20
  * elements that won't fit in the container */
21
21
  const hiddenIds: string[] = [];
@@ -31,31 +31,31 @@ export function getHiddenIds(
31
31
  }
32
32
 
33
33
  if (
34
- Object.keys(itemWidthCache).reduce(
35
- (sum, key, index) => sum + itemWidthCache[key] + (index > 0 ? containerGap : 0),
34
+ Object.keys(itemSizeCache).reduce(
35
+ (sum, key, index) => sum + itemSizeCache[key] + (index > 0 ? containerGap : 0),
36
36
  0
37
- ) <= containerWidth
37
+ ) <= containerSize
38
38
  ) {
39
39
  // All items fit, return empty array
40
40
  return [];
41
41
  } else if (selectedKey) {
42
- if (itemWidthCache[selectedKey] + overflowTargetWidth > containerWidth) {
42
+ if (itemSizeCache[selectedKey] + overflowTargetSize > containerSize) {
43
43
  // If the selected item doesn't fit, only show overflow (all items hidden)
44
- return Object.keys(itemWidthCache);
44
+ return Object.keys(itemSizeCache);
45
45
  } else {
46
46
  // at least the selected item and overflow target fit. Update our itemWidth with the sum
47
- itemWidth += itemWidthCache[selectedKey] + overflowTargetWidth;
47
+ itemSize += itemSizeCache[selectedKey] + overflowTargetSize;
48
48
  shouldAddGap = true;
49
49
  }
50
50
  } else {
51
- itemWidth += overflowTargetWidth;
51
+ itemSize += overflowTargetSize;
52
52
  }
53
53
 
54
- for (const key in itemWidthCache) {
54
+ for (const key in itemSizeCache) {
55
55
  if (key !== selectedKey) {
56
- itemWidth += itemWidthCache[key] + (shouldAddGap ? containerGap : 0);
56
+ itemSize += itemSizeCache[key] + (shouldAddGap ? containerGap : 0);
57
57
  shouldAddGap = true;
58
- if (itemWidth > containerWidth) {
58
+ if (itemSize > containerSize) {
59
59
  hiddenIds.push(key);
60
60
  }
61
61
  }
@@ -81,13 +81,13 @@ export const useOverflowListModel = createModelHook({
81
81
  const shouldCalculateOverflow =
82
82
  config.shouldCalculateOverflow === undefined ? true : config.shouldCalculateOverflow;
83
83
  const [hiddenIds, setHiddenIds] = React.useState(config.initialHiddenIds);
84
- const [itemWidthCache, setItemWidthCache] = React.useState<Record<string, number>>({});
85
- const [containerWidth, setContainerWidth] = React.useState(0);
84
+ const [itemSizeCache, setItemSizeCache] = React.useState<Record<string, number>>({});
85
+ const [containerSize, setContainerSize] = React.useState(0);
86
86
  const [containerGap, setContainerGap] = React.useState(0);
87
- const containerWidthRef = React.useRef(0);
88
- const itemWidthCacheRef = React.useRef(itemWidthCache);
87
+ const containerSizeRef = React.useRef(0);
88
+ const itemSizeCacheRef = React.useRef(itemSizeCache);
89
89
  const [overflowTargetWidth, setOverflowTargetWidth] = React.useState(0);
90
- const overflowTargetWidthRef = React.useRef(0);
90
+ const overflowTargetSizeRef = React.useRef(0);
91
91
 
92
92
  const internalHiddenIds = shouldCalculateOverflow ? hiddenIds : [];
93
93
 
@@ -103,8 +103,16 @@ export const useOverflowListModel = createModelHook({
103
103
  const state = {
104
104
  ...model.state,
105
105
  hiddenIds: internalHiddenIds,
106
- itemWidthCache,
107
- containerWidth,
106
+ itemSizeCache,
107
+ /**
108
+ * @deprecated Use `itemSizeCache` instead
109
+ */
110
+ itemWidthCache: itemSizeCache,
111
+ containerSize,
112
+ /**
113
+ * @deprecated Use `containerSize` instead
114
+ */
115
+ containerWidth: containerSize,
108
116
  containerGap,
109
117
  overflowTargetWidth,
110
118
  };
@@ -114,10 +122,10 @@ export const useOverflowListModel = createModelHook({
114
122
  select(data: Parameters<typeof model.events.select>[0]) {
115
123
  const {selectedIds} = model.selection.select(data.id, state);
116
124
  const ids = getHiddenIds(
117
- containerWidthRef.current,
125
+ containerSizeRef.current,
118
126
  containerGap,
119
- overflowTargetWidthRef.current,
120
- itemWidthCacheRef.current,
127
+ overflowTargetSizeRef.current,
128
+ itemSizeCacheRef.current,
121
129
  selectedIds,
122
130
  config.items
123
131
  );
@@ -125,69 +133,93 @@ export const useOverflowListModel = createModelHook({
125
133
 
126
134
  setHiddenIds(ids);
127
135
  },
128
- setContainerWidth(data: {width?: number}) {
129
- containerWidthRef.current = data.width || 0;
130
- setContainerWidth(data.width || 0);
131
-
136
+ setContainerSize(data: {width?: number; height?: number}) {
137
+ containerSizeRef.current =
138
+ model.state.orientation === 'horizontal' ? data.width || 0 : data.height || 0;
139
+ setContainerSize(containerSizeRef.current);
132
140
  const ids = getHiddenIds(
133
- containerWidthRef.current,
141
+ containerSizeRef.current,
134
142
  containerGap,
135
- overflowTargetWidthRef.current,
136
- itemWidthCacheRef.current,
143
+ overflowTargetSizeRef.current,
144
+ itemSizeCacheRef.current,
137
145
  state.selectedIds,
138
146
  config.items
139
147
  );
140
-
141
148
  setHiddenIds(ids);
142
149
  },
150
+ /**
151
+ * @deprecated Use `setContainerSize` instead and pass both `width` and `height`
152
+ */
153
+ setContainerWidth(data: {width?: number}) {
154
+ events.setContainerSize({width: data.width, height: 0});
155
+ },
143
156
  setContainerGap(data: {size: number}) {
144
157
  setContainerGap(data.size);
145
158
 
146
159
  const ids = getHiddenIds(
147
- containerWidthRef.current,
160
+ containerSizeRef.current,
148
161
  data.size,
149
- overflowTargetWidthRef.current,
150
- itemWidthCacheRef.current,
162
+ overflowTargetSizeRef.current,
163
+ itemSizeCacheRef.current,
151
164
  state.selectedIds,
152
165
  config.items
153
166
  );
154
167
 
155
168
  setHiddenIds(ids);
156
169
  },
170
+ setOverflowTargetSize(data: {width: number; height: number}) {
171
+ overflowTargetSizeRef.current =
172
+ model.state.orientation === 'horizontal' ? data.width || 0 : data.height || 0;
173
+ setOverflowTargetWidth(overflowTargetSizeRef.current);
174
+ },
175
+
176
+ /**
177
+ *
178
+ * @deprecated `setOverflowTargetWidth` is deprecated. Please use `setOverflowTargetSize` and pass in the `width` and set `height` to `0`.
179
+ */
157
180
  setOverflowTargetWidth(data: {width: number}) {
158
- overflowTargetWidthRef.current = data.width;
159
- setOverflowTargetWidth(data.width);
181
+ overflowTargetSizeRef.current = data.width;
182
+ events.setOverflowTargetSize({width: overflowTargetSizeRef.current, height: 0});
160
183
  },
184
+
185
+ /**
186
+ *
187
+ * @deprecated `addItemWidth` is deprecated. Please use `addItemSize` and set the `width`
188
+ */
161
189
  addItemWidth(data: {id: string; width: number}) {
162
- itemWidthCacheRef.current = {
163
- ...itemWidthCacheRef.current,
164
- [data.id]: data.width,
190
+ events.addItemSize({id: data.id, width: data.width, height: 0});
191
+ },
192
+ addItemSize(data: {id: string; width: number; height: number}) {
193
+ itemSizeCacheRef.current = {
194
+ ...itemSizeCacheRef.current,
195
+ [data.id]: model.state.orientation === 'horizontal' ? data.width : data.height,
165
196
  };
166
197
 
167
- setItemWidthCache(itemWidthCacheRef.current);
198
+
199
+ setItemSizeCache(itemSizeCacheRef.current);
168
200
 
169
201
  const ids = getHiddenIds(
170
- containerWidthRef.current,
202
+ containerSizeRef.current,
171
203
  containerGap,
172
- overflowTargetWidthRef.current,
173
- itemWidthCacheRef.current,
204
+ overflowTargetSizeRef.current,
205
+ itemSizeCacheRef.current,
174
206
  state.selectedIds,
175
207
  config.items
176
208
  );
177
209
 
178
210
  setHiddenIds(ids);
179
211
  },
180
- removeItemWidth(data: {id: string}) {
181
- const newCache = {...itemWidthCacheRef.current};
212
+ removeItemSize(data: {id: string}) {
213
+ const newCache = {...itemSizeCacheRef.current};
182
214
  delete newCache[data.id];
183
- itemWidthCacheRef.current = newCache;
184
- setItemWidthCache(itemWidthCacheRef.current);
215
+ itemSizeCacheRef.current = newCache;
216
+ setItemSizeCache(itemSizeCacheRef.current);
185
217
 
186
218
  const ids = getHiddenIds(
187
- containerWidthRef.current,
219
+ containerSizeRef.current,
188
220
  containerGap,
189
- overflowTargetWidthRef.current,
190
- itemWidthCacheRef.current,
221
+ overflowTargetSizeRef.current,
222
+ itemSizeCacheRef.current,
191
223
  state.selectedIds !== 'all'
192
224
  ? state.selectedIds.filter(sId => data.id !== sId)
193
225
  : state.selectedIds,
@@ -196,6 +228,13 @@ export const useOverflowListModel = createModelHook({
196
228
 
197
229
  setHiddenIds(ids);
198
230
  },
231
+ /**
232
+ *
233
+ * @deprecated `removeItemWidth` is deprecated. Please use `removeItemSize`.
234
+ */
235
+ removeItemWidth(data: {id: string}) {
236
+ events.removeItemSize({id: data.id});
237
+ },
199
238
  addHiddenKey(data: {id: string}) {
200
239
  setHiddenIds(ids => ids.concat(data.id));
201
240
  },
@@ -24,11 +24,15 @@ export const useOverflowListTarget = createElemPropsHook(useOverflowListModel)((
24
24
  if (localRef.current) {
25
25
  const styles = getComputedStyle(localRef.current);
26
26
 
27
- model.events.setOverflowTargetWidth({
27
+ model.events.setOverflowTargetSize({
28
28
  width:
29
29
  localRef.current.offsetWidth +
30
30
  parseFloat(styles.marginLeft) +
31
31
  parseFloat(styles.marginRight),
32
+ height:
33
+ localRef.current.offsetWidth +
34
+ parseFloat(styles.marginTop) +
35
+ parseFloat(styles.marginBottom),
32
36
  });
33
37
  }
34
38
  });
@@ -109,6 +109,16 @@ export const useSelectionListModel = createModelHook({
109
109
  setSelectedIds(ids: 'all' | string[]) {
110
110
  setSelectedIds(ids);
111
111
  },
112
+ /**
113
+ * The `remove` event can be called by Behavior Hooks based on user interaction. The `onRemove`
114
+ * can be added to the model config to signal the user wishes to remove the item in the list.
115
+ * The `remove` event requires the dynamic API where `items` are passed to the model. It is up
116
+ * to you to remove the item from the list. Focus redirection should be automatically managed,
117
+ * if necessary.
118
+ */
119
+ remove(data: {id: string; nextId?: string; event?: Event | React.SyntheticEvent}) {
120
+ // nothing to do here. It is a signal event
121
+ },
112
122
  };
113
123
 
114
124
  return {...cursor, state, events, selection};
@@ -26,16 +26,13 @@ export const useComboboxInput = composeHooks(
26
26
  if (model.state.isVirtualized && item) {
27
27
  model.state.UNSTABLE_virtual.scrollToIndex(item.index);
28
28
  } else {
29
- const listboxId = model.state.inputRef.current?.getAttribute('aria-controls');
30
- if (listboxId) {
31
- const menuItem = document.querySelector(
32
- `[id="${listboxId}"] [data-id="${model.state.cursorId}"]`
33
- );
34
- if (menuItem) {
35
- requestAnimationFrame(() => {
36
- menuItem.scrollIntoView({block: 'nearest'});
37
- });
38
- }
29
+ const menuItem = document.querySelector(
30
+ `[id="${model.state.id}-list"] [data-id="${model.state.cursorId}"]`
31
+ );
32
+ if (menuItem) {
33
+ requestAnimationFrame(() => {
34
+ menuItem.scrollIntoView({block: 'nearest'});
35
+ });
39
36
  }
40
37
  }
41
38
  }