@workday/canvas-kit-react 9.0.0-alpha.418-next.20 → 9.0.0-alpha.420-next.22

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 (269) hide show
  1. package/breadcrumbs/lib/BreadcrumbsItem.tsx +1 -1
  2. package/collection/index.ts +2 -0
  3. package/collection/lib/ListBox.tsx +12 -10
  4. package/collection/lib/useBaseListModel.tsx +6 -4
  5. package/collection/lib/useCursorListModel.tsx +1 -1
  6. package/collection/lib/useListActiveDescendant.ts +24 -0
  7. package/collection/lib/useListItemAllowChildStrings.ts +2 -1
  8. package/collection/lib/useListItemRegister.tsx +10 -3
  9. package/collection/lib/useListItemSelect.tsx +1 -1
  10. package/collection/lib/useListKeyboardHandler.ts +28 -0
  11. package/collection/lib/useListLoader.ts +116 -54
  12. package/collection/lib/useOverflowListItemMeasure.tsx +2 -2
  13. package/collection/lib/useOverflowListMeasure.ts +11 -13
  14. package/collection/lib/useOverflowListTarget.tsx +28 -30
  15. package/collection/lib/useSelectionListModel.tsx +1 -0
  16. package/combobox/LICENSE +52 -0
  17. package/combobox/README.md +7 -0
  18. package/combobox/index.ts +8 -0
  19. package/combobox/lib/Combobox.tsx +32 -0
  20. package/combobox/lib/ComboboxCard.tsx +33 -0
  21. package/combobox/lib/ComboboxInput.tsx +104 -0
  22. package/combobox/lib/ComboboxMenu.tsx +67 -0
  23. package/combobox/lib/ComboboxMenuItem.tsx +74 -0
  24. package/combobox/lib/ComboboxMenuList.tsx +45 -0
  25. package/combobox/lib/useComboboxInputOpenWithArrowKeys.ts +21 -0
  26. package/combobox/lib/useComboboxLoader.ts +72 -0
  27. package/combobox/lib/useComboboxModel.tsx +85 -0
  28. package/combobox/package.json +6 -0
  29. package/common/lib/utils/components.ts +20 -16
  30. package/common/lib/utils/models.ts +2 -2
  31. package/dist/commonjs/action-bar/lib/ActionBar.d.ts +2 -2
  32. package/dist/commonjs/action-bar/lib/ActionBarList.d.ts +1 -1
  33. package/dist/commonjs/action-bar/lib/useActionBarModel.d.ts +2 -2
  34. package/dist/commonjs/breadcrumbs/lib/Breadcrumbs.d.ts +2 -2
  35. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsMenu.d.ts +1 -1
  36. package/dist/commonjs/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts +2 -2
  37. package/dist/commonjs/collection/index.d.ts +2 -0
  38. package/dist/commonjs/collection/index.d.ts.map +1 -1
  39. package/dist/commonjs/collection/index.js +2 -0
  40. package/dist/commonjs/collection/lib/ListBox.d.ts +7 -6
  41. package/dist/commonjs/collection/lib/ListBox.d.ts.map +1 -1
  42. package/dist/commonjs/collection/lib/ListBox.js +5 -3
  43. package/dist/commonjs/collection/lib/useBaseListModel.d.ts.map +1 -1
  44. package/dist/commonjs/collection/lib/useBaseListModel.js +4 -4
  45. package/dist/commonjs/collection/lib/useCursorListModel.d.ts +0 -34
  46. package/dist/commonjs/collection/lib/useCursorListModel.d.ts.map +1 -1
  47. package/dist/commonjs/collection/lib/useCursorListModel.js +1 -1
  48. package/dist/commonjs/collection/lib/useListActiveDescendant.d.ts +68 -0
  49. package/dist/commonjs/collection/lib/useListActiveDescendant.d.ts.map +1 -0
  50. package/dist/commonjs/collection/lib/useListActiveDescendant.js +25 -0
  51. package/dist/commonjs/collection/lib/useListItemAllowChildStrings.d.ts +2 -1
  52. package/dist/commonjs/collection/lib/useListItemAllowChildStrings.d.ts.map +1 -1
  53. package/dist/commonjs/collection/lib/useListItemAllowChildStrings.js +2 -1
  54. package/dist/commonjs/collection/lib/useListItemRegister.d.ts.map +1 -1
  55. package/dist/commonjs/collection/lib/useListItemRegister.js +5 -1
  56. package/dist/commonjs/collection/lib/useListKeyboardHandler.d.ts +66 -0
  57. package/dist/commonjs/collection/lib/useListKeyboardHandler.d.ts.map +1 -0
  58. package/dist/commonjs/collection/lib/useListKeyboardHandler.js +27 -0
  59. package/dist/commonjs/collection/lib/useListLoader.d.ts +46 -7
  60. package/dist/commonjs/collection/lib/useListLoader.d.ts.map +1 -1
  61. package/dist/commonjs/collection/lib/useListLoader.js +61 -35
  62. package/dist/commonjs/collection/lib/useOverflowListMeasure.d.ts +1 -1
  63. package/dist/commonjs/collection/lib/useOverflowListMeasure.d.ts.map +1 -1
  64. package/dist/commonjs/collection/lib/useOverflowListTarget.d.ts +5 -2
  65. package/dist/commonjs/collection/lib/useOverflowListTarget.d.ts.map +1 -1
  66. package/dist/commonjs/collection/lib/useOverflowListTarget.js +1 -1
  67. package/dist/commonjs/collection/lib/useSelectionListModel.d.ts.map +1 -1
  68. package/dist/commonjs/collection/lib/useSelectionListModel.js +1 -0
  69. package/dist/commonjs/combobox/index.d.ts +9 -0
  70. package/dist/commonjs/combobox/index.d.ts.map +1 -0
  71. package/dist/commonjs/combobox/index.js +19 -0
  72. package/dist/commonjs/combobox/lib/Combobox.d.ts +2075 -0
  73. package/dist/commonjs/combobox/lib/Combobox.d.ts.map +1 -0
  74. package/dist/commonjs/combobox/lib/Combobox.js +29 -0
  75. package/dist/commonjs/combobox/lib/ComboboxCard.d.ts +166 -0
  76. package/dist/commonjs/combobox/lib/ComboboxCard.d.ts.map +1 -0
  77. package/dist/commonjs/combobox/lib/ComboboxCard.js +25 -0
  78. package/dist/commonjs/combobox/lib/ComboboxInput.d.ts +186 -0
  79. package/dist/commonjs/combobox/lib/ComboboxInput.d.ts.map +1 -0
  80. package/dist/commonjs/combobox/lib/ComboboxInput.js +84 -0
  81. package/dist/commonjs/combobox/lib/ComboboxMenu.d.ts +428 -0
  82. package/dist/commonjs/combobox/lib/ComboboxMenu.d.ts.map +1 -0
  83. package/dist/commonjs/combobox/lib/ComboboxMenu.js +63 -0
  84. package/dist/commonjs/combobox/lib/ComboboxMenuItem.d.ts +178 -0
  85. package/dist/commonjs/combobox/lib/ComboboxMenuItem.d.ts.map +1 -0
  86. package/dist/commonjs/combobox/lib/ComboboxMenuItem.js +50 -0
  87. package/dist/commonjs/combobox/lib/ComboboxMenuList.d.ts +164 -0
  88. package/dist/commonjs/combobox/lib/ComboboxMenuList.d.ts.map +1 -0
  89. package/dist/commonjs/combobox/lib/ComboboxMenuList.js +31 -0
  90. package/dist/commonjs/combobox/lib/useComboboxInputOpenWithArrowKeys.d.ts +84 -0
  91. package/dist/commonjs/combobox/lib/useComboboxInputOpenWithArrowKeys.d.ts.map +1 -0
  92. package/dist/commonjs/combobox/lib/useComboboxInputOpenWithArrowKeys.js +20 -0
  93. package/dist/commonjs/combobox/lib/useComboboxLoader.d.ts +28 -0
  94. package/dist/commonjs/combobox/lib/useComboboxLoader.d.ts.map +1 -0
  95. package/dist/commonjs/combobox/lib/useComboboxLoader.js +65 -0
  96. package/dist/commonjs/combobox/lib/useComboboxModel.d.ts +1998 -0
  97. package/dist/commonjs/combobox/lib/useComboboxModel.d.ts.map +1 -0
  98. package/dist/commonjs/combobox/lib/useComboboxModel.js +82 -0
  99. package/dist/commonjs/common/lib/utils/components.d.ts +9 -23
  100. package/dist/commonjs/common/lib/utils/components.d.ts.map +1 -1
  101. package/dist/commonjs/common/lib/utils/components.js +6 -2
  102. package/dist/commonjs/common/lib/utils/models.js +2 -2
  103. package/dist/commonjs/index.d.ts +1 -0
  104. package/dist/commonjs/index.d.ts.map +1 -1
  105. package/dist/commonjs/index.js +1 -0
  106. package/dist/commonjs/menu/index.d.ts +1 -1
  107. package/dist/commonjs/menu/index.d.ts.map +1 -1
  108. package/dist/commonjs/menu/index.js +2 -1
  109. package/dist/commonjs/menu/lib/Menu.d.ts +7 -5
  110. package/dist/commonjs/menu/lib/Menu.d.ts.map +1 -1
  111. package/dist/commonjs/menu/lib/Menu.js +6 -4
  112. package/dist/commonjs/menu/lib/MenuContextTarget.d.ts +2 -2
  113. package/dist/commonjs/menu/lib/MenuItem.d.ts +7 -1
  114. package/dist/commonjs/menu/lib/MenuItem.d.ts.map +1 -1
  115. package/dist/commonjs/menu/lib/MenuItem.js +9 -11
  116. package/dist/commonjs/menu/lib/MenuList.d.ts +3 -3
  117. package/dist/commonjs/menu/lib/MenuList.d.ts.map +1 -1
  118. package/dist/commonjs/menu/lib/MenuList.js +3 -2
  119. package/dist/commonjs/menu/lib/MenuPopper.d.ts +1 -1
  120. package/dist/commonjs/menu/lib/MenuTarget.d.ts +2 -2
  121. package/dist/commonjs/menu/lib/useMenuModel.d.ts +2 -2
  122. package/dist/commonjs/menu/lib/useMenuModel.d.ts.map +1 -1
  123. package/dist/commonjs/menu/lib/useMenuModel.js +3 -5
  124. package/dist/commonjs/popup/lib/hooks/usePopupPopper.d.ts +1 -1
  125. package/dist/commonjs/popup/lib/hooks/usePopupTarget.d.ts +1 -1
  126. package/dist/commonjs/popup/lib/hooks/usePopupTargetContext.d.ts +1 -1
  127. package/dist/commonjs/tabs/lib/Tabs.d.ts +18 -120
  128. package/dist/commonjs/tabs/lib/Tabs.d.ts.map +1 -1
  129. package/dist/commonjs/tabs/lib/TabsItem.d.ts +0 -1
  130. package/dist/commonjs/tabs/lib/TabsItem.d.ts.map +1 -1
  131. package/dist/commonjs/tabs/lib/TabsItem.js +0 -1
  132. package/dist/commonjs/tabs/lib/TabsList.d.ts +1 -1
  133. package/dist/commonjs/tabs/lib/TabsMenuPopper.d.ts +1 -1
  134. package/dist/commonjs/tabs/lib/TabsPanel.d.ts.map +1 -1
  135. package/dist/commonjs/tabs/lib/useTabsModel.d.ts +8 -20
  136. package/dist/commonjs/tabs/lib/useTabsModel.d.ts.map +1 -1
  137. package/dist/commonjs/tabs/lib/useTabsModel.js +1 -0
  138. package/dist/commonjs/text-input/index.d.ts +1 -1
  139. package/dist/commonjs/text-input/index.d.ts.map +1 -1
  140. package/dist/commonjs/text-input/index.js +2 -1
  141. package/dist/commonjs/text-input/lib/InputGroup.d.ts +94 -9
  142. package/dist/commonjs/text-input/lib/InputGroup.d.ts.map +1 -1
  143. package/dist/commonjs/text-input/lib/InputGroup.js +129 -63
  144. package/dist/es6/action-bar/lib/ActionBar.d.ts +2 -2
  145. package/dist/es6/action-bar/lib/ActionBarList.d.ts +1 -1
  146. package/dist/es6/action-bar/lib/useActionBarModel.d.ts +2 -2
  147. package/dist/es6/breadcrumbs/lib/Breadcrumbs.d.ts +2 -2
  148. package/dist/es6/breadcrumbs/lib/BreadcrumbsMenu.d.ts +1 -1
  149. package/dist/es6/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts +2 -2
  150. package/dist/es6/collection/index.d.ts +2 -0
  151. package/dist/es6/collection/index.d.ts.map +1 -1
  152. package/dist/es6/collection/index.js +2 -0
  153. package/dist/es6/collection/lib/ListBox.d.ts +7 -6
  154. package/dist/es6/collection/lib/ListBox.d.ts.map +1 -1
  155. package/dist/es6/collection/lib/ListBox.js +6 -4
  156. package/dist/es6/collection/lib/useBaseListModel.d.ts.map +1 -1
  157. package/dist/es6/collection/lib/useBaseListModel.js +4 -4
  158. package/dist/es6/collection/lib/useCursorListModel.d.ts +0 -34
  159. package/dist/es6/collection/lib/useCursorListModel.d.ts.map +1 -1
  160. package/dist/es6/collection/lib/useCursorListModel.js +1 -1
  161. package/dist/es6/collection/lib/useListActiveDescendant.d.ts +68 -0
  162. package/dist/es6/collection/lib/useListActiveDescendant.d.ts.map +1 -0
  163. package/dist/es6/collection/lib/useListActiveDescendant.js +22 -0
  164. package/dist/es6/collection/lib/useListItemAllowChildStrings.d.ts +2 -1
  165. package/dist/es6/collection/lib/useListItemAllowChildStrings.d.ts.map +1 -1
  166. package/dist/es6/collection/lib/useListItemAllowChildStrings.js +2 -1
  167. package/dist/es6/collection/lib/useListItemRegister.d.ts.map +1 -1
  168. package/dist/es6/collection/lib/useListItemRegister.js +5 -1
  169. package/dist/es6/collection/lib/useListKeyboardHandler.d.ts +66 -0
  170. package/dist/es6/collection/lib/useListKeyboardHandler.d.ts.map +1 -0
  171. package/dist/es6/collection/lib/useListKeyboardHandler.js +24 -0
  172. package/dist/es6/collection/lib/useListLoader.d.ts +46 -7
  173. package/dist/es6/collection/lib/useListLoader.d.ts.map +1 -1
  174. package/dist/es6/collection/lib/useListLoader.js +61 -35
  175. package/dist/es6/collection/lib/useOverflowListMeasure.d.ts +1 -1
  176. package/dist/es6/collection/lib/useOverflowListMeasure.d.ts.map +1 -1
  177. package/dist/es6/collection/lib/useOverflowListTarget.d.ts +5 -2
  178. package/dist/es6/collection/lib/useOverflowListTarget.d.ts.map +1 -1
  179. package/dist/es6/collection/lib/useOverflowListTarget.js +1 -1
  180. package/dist/es6/collection/lib/useSelectionListModel.d.ts.map +1 -1
  181. package/dist/es6/collection/lib/useSelectionListModel.js +1 -0
  182. package/dist/es6/combobox/index.d.ts +9 -0
  183. package/dist/es6/combobox/index.d.ts.map +1 -0
  184. package/dist/es6/combobox/index.js +8 -0
  185. package/dist/es6/combobox/lib/Combobox.d.ts +2075 -0
  186. package/dist/es6/combobox/lib/Combobox.d.ts.map +1 -0
  187. package/dist/es6/combobox/lib/Combobox.js +23 -0
  188. package/dist/es6/combobox/lib/ComboboxCard.d.ts +166 -0
  189. package/dist/es6/combobox/lib/ComboboxCard.d.ts.map +1 -0
  190. package/dist/es6/combobox/lib/ComboboxCard.js +19 -0
  191. package/dist/es6/combobox/lib/ComboboxInput.d.ts +186 -0
  192. package/dist/es6/combobox/lib/ComboboxInput.d.ts.map +1 -0
  193. package/dist/es6/combobox/lib/ComboboxInput.js +78 -0
  194. package/dist/es6/combobox/lib/ComboboxMenu.d.ts +428 -0
  195. package/dist/es6/combobox/lib/ComboboxMenu.d.ts.map +1 -0
  196. package/dist/es6/combobox/lib/ComboboxMenu.js +57 -0
  197. package/dist/es6/combobox/lib/ComboboxMenuItem.d.ts +178 -0
  198. package/dist/es6/combobox/lib/ComboboxMenuItem.d.ts.map +1 -0
  199. package/dist/es6/combobox/lib/ComboboxMenuItem.js +44 -0
  200. package/dist/es6/combobox/lib/ComboboxMenuList.d.ts +164 -0
  201. package/dist/es6/combobox/lib/ComboboxMenuList.d.ts.map +1 -0
  202. package/dist/es6/combobox/lib/ComboboxMenuList.js +25 -0
  203. package/dist/es6/combobox/lib/useComboboxInputOpenWithArrowKeys.d.ts +84 -0
  204. package/dist/es6/combobox/lib/useComboboxInputOpenWithArrowKeys.d.ts.map +1 -0
  205. package/dist/es6/combobox/lib/useComboboxInputOpenWithArrowKeys.js +17 -0
  206. package/dist/es6/combobox/lib/useComboboxLoader.d.ts +28 -0
  207. package/dist/es6/combobox/lib/useComboboxLoader.d.ts.map +1 -0
  208. package/dist/es6/combobox/lib/useComboboxLoader.js +58 -0
  209. package/dist/es6/combobox/lib/useComboboxModel.d.ts +1998 -0
  210. package/dist/es6/combobox/lib/useComboboxModel.d.ts.map +1 -0
  211. package/dist/es6/combobox/lib/useComboboxModel.js +76 -0
  212. package/dist/es6/common/lib/utils/components.d.ts +9 -23
  213. package/dist/es6/common/lib/utils/components.d.ts.map +1 -1
  214. package/dist/es6/common/lib/utils/components.js +6 -2
  215. package/dist/es6/common/lib/utils/models.js +2 -2
  216. package/dist/es6/index.d.ts +1 -0
  217. package/dist/es6/index.d.ts.map +1 -1
  218. package/dist/es6/index.js +1 -0
  219. package/dist/es6/menu/index.d.ts +1 -1
  220. package/dist/es6/menu/index.d.ts.map +1 -1
  221. package/dist/es6/menu/index.js +1 -1
  222. package/dist/es6/menu/lib/Menu.d.ts +7 -5
  223. package/dist/es6/menu/lib/Menu.d.ts.map +1 -1
  224. package/dist/es6/menu/lib/Menu.js +6 -4
  225. package/dist/es6/menu/lib/MenuContextTarget.d.ts +2 -2
  226. package/dist/es6/menu/lib/MenuItem.d.ts +7 -1
  227. package/dist/es6/menu/lib/MenuItem.d.ts.map +1 -1
  228. package/dist/es6/menu/lib/MenuItem.js +8 -10
  229. package/dist/es6/menu/lib/MenuList.d.ts +3 -3
  230. package/dist/es6/menu/lib/MenuList.d.ts.map +1 -1
  231. package/dist/es6/menu/lib/MenuList.js +4 -3
  232. package/dist/es6/menu/lib/MenuPopper.d.ts +1 -1
  233. package/dist/es6/menu/lib/MenuTarget.d.ts +2 -2
  234. package/dist/es6/menu/lib/useMenuModel.d.ts +2 -2
  235. package/dist/es6/menu/lib/useMenuModel.d.ts.map +1 -1
  236. package/dist/es6/menu/lib/useMenuModel.js +4 -6
  237. package/dist/es6/popup/lib/hooks/usePopupPopper.d.ts +1 -1
  238. package/dist/es6/popup/lib/hooks/usePopupTarget.d.ts +1 -1
  239. package/dist/es6/popup/lib/hooks/usePopupTargetContext.d.ts +1 -1
  240. package/dist/es6/tabs/lib/Tabs.d.ts +18 -120
  241. package/dist/es6/tabs/lib/Tabs.d.ts.map +1 -1
  242. package/dist/es6/tabs/lib/TabsItem.d.ts +0 -1
  243. package/dist/es6/tabs/lib/TabsItem.d.ts.map +1 -1
  244. package/dist/es6/tabs/lib/TabsItem.js +0 -1
  245. package/dist/es6/tabs/lib/TabsList.d.ts +1 -1
  246. package/dist/es6/tabs/lib/TabsMenuPopper.d.ts +1 -1
  247. package/dist/es6/tabs/lib/TabsPanel.d.ts.map +1 -1
  248. package/dist/es6/tabs/lib/useTabsModel.d.ts +8 -20
  249. package/dist/es6/tabs/lib/useTabsModel.d.ts.map +1 -1
  250. package/dist/es6/tabs/lib/useTabsModel.js +1 -0
  251. package/dist/es6/text-input/index.d.ts +1 -1
  252. package/dist/es6/text-input/index.d.ts.map +1 -1
  253. package/dist/es6/text-input/index.js +1 -1
  254. package/dist/es6/text-input/lib/InputGroup.d.ts +94 -9
  255. package/dist/es6/text-input/lib/InputGroup.d.ts.map +1 -1
  256. package/dist/es6/text-input/lib/InputGroup.js +129 -63
  257. package/index.ts +1 -0
  258. package/menu/index.ts +1 -1
  259. package/menu/lib/Menu.tsx +6 -4
  260. package/menu/lib/MenuItem.tsx +9 -12
  261. package/menu/lib/MenuList.tsx +16 -10
  262. package/menu/lib/useMenuModel.tsx +4 -7
  263. package/modal/lib/hooks/useModalHeading.ts +2 -2
  264. package/package.json +3 -3
  265. package/tabs/lib/TabsItem.tsx +10 -13
  266. package/tabs/lib/TabsPanel.tsx +1 -5
  267. package/tabs/lib/useTabsModel.tsx +1 -0
  268. package/text-input/index.ts +1 -1
  269. package/text-input/lib/InputGroup.tsx +177 -95
@@ -1,3 +1,3 @@
1
1
  export * from './lib/InputIconContainer';
2
2
  export * from './lib/TextInput';
3
- export {InputGroup} from './lib/InputGroup';
3
+ export {InputGroup, useInputGroupModel} from './lib/InputGroup';
@@ -1,49 +1,126 @@
1
1
  import React from 'react';
2
2
 
3
3
  import {space} from '@workday/canvas-kit-react/tokens';
4
- import {createComponent, ExtractProps, useIsRTL} from '@workday/canvas-kit-react/common';
4
+ import {
5
+ createContainer,
6
+ createElemPropsHook,
7
+ createModelHook,
8
+ createSubcomponent,
9
+ dispatchInputEvent,
10
+ ExtractProps,
11
+ useForkRef,
12
+ useIsRTL,
13
+ } from '@workday/canvas-kit-react/common';
5
14
  import {Flex} from '@workday/canvas-kit-react/layout';
15
+ import {TertiaryButton} from '@workday/canvas-kit-react/button';
16
+ import {xSmallIcon} from '@workday/canvas-system-icons-web';
6
17
 
7
18
  import {TextInput} from './TextInput';
8
19
 
9
- export const InputGroupInnerStart = createComponent('div')({
10
- Component(elemProps: ExtractProps<typeof Flex>, ref, Element) {
11
- return (
12
- <Flex
13
- ref={ref}
14
- as={Element}
15
- position="absolute"
16
- alignItems="center"
17
- justifyContent="center"
18
- height="xl"
19
- width="xl"
20
- {...elemProps}
21
- />
22
- );
23
- },
20
+ export const useInputGroupModel = createModelHook({})(() => {
21
+ const inputRef = React.useRef<HTMLInputElement>(null);
22
+
23
+ return {
24
+ state: {
25
+ inputRef,
26
+ },
27
+ events: {},
28
+ };
24
29
  });
25
30
 
26
- export const InputGroupInnerEnd = createComponent('div')({
27
- Component(elemProps: ExtractProps<typeof Flex>, ref, Element) {
28
- return (
29
- <Flex
30
- ref={ref}
31
- as={Element}
32
- position="absolute"
33
- alignItems="center"
34
- justifyContent="center"
35
- height="xl"
36
- width="xl"
37
- {...elemProps}
38
- />
39
- );
40
- },
31
+ export const InputGroupInnerStart = createSubcomponent('div')({
32
+ modelHook: useInputGroupModel,
33
+ })<ExtractProps<typeof Flex, never>>((elemProps, Element) => {
34
+ return (
35
+ <Flex
36
+ as={Element}
37
+ position="absolute"
38
+ alignItems="center"
39
+ justifyContent="center"
40
+ height="xl"
41
+ width="xl"
42
+ {...elemProps}
43
+ />
44
+ );
41
45
  });
42
46
 
43
- export const InputGroupInput = createComponent(TextInput)({
44
- Component(elemProps: ExtractProps<typeof Flex>, ref, Element) {
45
- return <Flex ref={ref} as={Element} width="100%" {...elemProps} />;
46
- },
47
+ export const InputGroupInnerEnd = createSubcomponent('div')({
48
+ modelHook: useInputGroupModel,
49
+ })<ExtractProps<typeof Flex, never>>((elemProps, Element) => {
50
+ return (
51
+ <Flex
52
+ as={Element}
53
+ position="absolute"
54
+ alignItems="center"
55
+ justifyContent="center"
56
+ height="xl"
57
+ width="xl"
58
+ {...elemProps}
59
+ />
60
+ );
61
+ });
62
+
63
+ const useInputGroupInput = createElemPropsHook(useInputGroupModel)((model, ref) => {
64
+ const elementRef = useForkRef(ref, model.state.inputRef);
65
+
66
+ return {
67
+ ref: elementRef,
68
+ };
69
+ });
70
+
71
+ export const InputGroupInput = createSubcomponent(TextInput)({
72
+ modelHook: useInputGroupModel,
73
+ elemPropsHook: useInputGroupInput,
74
+ })<ExtractProps<typeof Flex, never>>((elemProps, Element) => {
75
+ return <Flex as={Element} width="100%" {...elemProps} />;
76
+ });
77
+
78
+ export const useClearButton = createElemPropsHook(useInputGroupModel)(model => {
79
+ const [inputHasValue, setInputHasValue] = React.useState(false);
80
+
81
+ React.useLayoutEffect(() => {
82
+ const input = model.state.inputRef.current;
83
+
84
+ if (input) {
85
+ input.addEventListener('input', () => {
86
+ setInputHasValue(!!input.value);
87
+ });
88
+ }
89
+ }, [model.state.inputRef]);
90
+
91
+ return {
92
+ // This element does not need to be accessible via screen reader. The user can already clear
93
+ // an input
94
+ role: 'presentation',
95
+ // A clear input button doesn't need focus. There's already keyboard keys to clear an input
96
+ tabIndex: -1,
97
+ icon: xSmallIcon,
98
+ // "small" is needed to render correctly within a `TextInput`
99
+ size: 'small',
100
+ transition: 'opacity 300ms ease',
101
+ // prevent a focus change to the button. Focus should stay in the input.
102
+ onMouseDown(event: React.MouseEvent) {
103
+ event.preventDefault();
104
+ },
105
+ onClick() {
106
+ // This will clear the input's value
107
+ dispatchInputEvent(model.state.inputRef.current, '');
108
+ },
109
+ style: {
110
+ opacity: inputHasValue ? 1 : 0,
111
+ pointerEvents: inputHasValue ? 'auto' : 'none',
112
+ },
113
+ } as const;
114
+ });
115
+
116
+ /**
117
+ * A clear input button. This can be a component later.
118
+ */
119
+ export const ClearButton = createSubcomponent(TertiaryButton)({
120
+ modelHook: useInputGroupModel,
121
+ elemPropsHook: useClearButton,
122
+ })<ExtractProps<typeof TertiaryButton, never>>((elemProps, Element) => {
123
+ return <Element {...elemProps} />;
47
124
  });
48
125
 
49
126
  // make sure we always use pixels if the input is a number - this is required for `calc`
@@ -83,67 +160,9 @@ const wrapInCalc = (values: (string | number)[]): string | number | undefined =>
83
160
  * </InputGroup>
84
161
  * ```
85
162
  */
86
- export const InputGroup = createComponent('div')({
163
+ export const InputGroup = createContainer('div')({
87
164
  displayName: 'InputGroup',
88
- Component({children, ...elemProps}: ExtractProps<typeof Flex>, ref, Element) {
89
- const isRTL = useIsRTL();
90
- const offsetsStart: (string | number)[] = [];
91
- const offsetsEnd: (string | number)[] = [];
92
-
93
- // Collect the widths of the `InnerStart` and `InnerEnd` components into `offsetStart` and
94
- // `offsetEnd` arrays
95
- React.Children.forEach(children, child => {
96
- if (React.isValidElement<any>(child) && child.type === InputGroupInnerStart) {
97
- const width = child.props.width || space.xl;
98
- offsetsStart.push(width);
99
- }
100
- if (React.isValidElement<any>(child) && child.type === InputGroupInnerEnd) {
101
- const width = child.props.width || space.xl;
102
- offsetsEnd.push(width);
103
- }
104
- });
105
-
106
- // keep track of the index offsets to make sure we calculate the correct position offset
107
- let indexStart = 0;
108
- let indexEnd = 0;
109
-
110
- // Loop over all the children and set the correct padding and positions
111
- const mappedChildren = React.Children.map(children, child => {
112
- if (React.isValidElement<any>(child)) {
113
- if (child.type === InputGroupInput) {
114
- return React.cloneElement(child, {
115
- paddingInlineStart: wrapInCalc(offsetsStart),
116
- paddingInlineEnd: wrapInCalc(offsetsEnd),
117
- });
118
- }
119
- if (child.type === InputGroupInnerStart) {
120
- const offset = wrapInCalc(offsetsStart.slice(0, indexStart)) || 0;
121
- indexStart++;
122
-
123
- return React.cloneElement(child, {
124
- left: isRTL ? undefined : offset,
125
- right: isRTL ? offset : undefined,
126
- });
127
- }
128
- if (child.type === InputGroupInnerEnd) {
129
- const offset = wrapInCalc(offsetsEnd.slice(indexEnd, -1)) || 0;
130
- indexEnd++;
131
-
132
- return React.cloneElement(child, {
133
- left: isRTL ? offset : undefined,
134
- right: isRTL ? undefined : offset,
135
- });
136
- }
137
- }
138
- return child;
139
- });
140
-
141
- return (
142
- <Flex ref={ref} as={Element} position="relative" {...elemProps}>
143
- {mappedChildren}
144
- </Flex>
145
- );
146
- },
165
+ modelHook: useInputGroupModel,
147
166
  subComponents: {
148
167
  /**
149
168
  * A component to show inside and at the start of the input. The input's padding will be
@@ -164,5 +183,68 @@ export const InputGroup = createComponent('div')({
164
183
  * within the input.
165
184
  */
166
185
  InnerEnd: InputGroupInnerEnd,
186
+ /**
187
+ * A component that can be added to an input group that will clear the input. It will only render
188
+ * when the input has a value and will fade when a value is entered.
189
+ */
190
+ ClearButton: ClearButton,
167
191
  },
192
+ })<ExtractProps<typeof Flex, never>>(({children, ...elemProps}, Element) => {
193
+ const isRTL = useIsRTL();
194
+ const offsetsStart: (string | number)[] = [];
195
+ const offsetsEnd: (string | number)[] = [];
196
+
197
+ // Collect the widths of the `InnerStart` and `InnerEnd` components into `offsetStart` and
198
+ // `offsetEnd` arrays
199
+ React.Children.forEach(children, child => {
200
+ if (React.isValidElement<any>(child) && child.type === InputGroupInnerStart) {
201
+ const width = child.props.width || space.xl;
202
+ offsetsStart.push(width);
203
+ }
204
+ if (React.isValidElement<any>(child) && child.type === InputGroupInnerEnd) {
205
+ const width = child.props.width || space.xl;
206
+ offsetsEnd.push(width);
207
+ }
208
+ });
209
+
210
+ // keep track of the index offsets to make sure we calculate the correct position offset
211
+ let indexStart = 0;
212
+ let indexEnd = 0;
213
+
214
+ // Loop over all the children and set the correct padding and positions
215
+ const mappedChildren = React.Children.map(children, child => {
216
+ if (React.isValidElement<any>(child)) {
217
+ if (child.type === InputGroupInput) {
218
+ return React.cloneElement(child, {
219
+ paddingInlineStart: wrapInCalc(offsetsStart),
220
+ paddingInlineEnd: wrapInCalc(offsetsEnd),
221
+ });
222
+ }
223
+ if (child.type === InputGroupInnerStart) {
224
+ const offset = wrapInCalc(offsetsStart.slice(0, indexStart)) || 0;
225
+ indexStart++;
226
+
227
+ return React.cloneElement(child, {
228
+ left: isRTL ? undefined : offset,
229
+ right: isRTL ? offset : undefined,
230
+ });
231
+ }
232
+ if (child.type === InputGroupInnerEnd) {
233
+ const offset = wrapInCalc(offsetsEnd.slice(indexEnd, -1)) || 0;
234
+ indexEnd++;
235
+
236
+ return React.cloneElement(child, {
237
+ left: isRTL ? offset : undefined,
238
+ right: isRTL ? undefined : offset,
239
+ });
240
+ }
241
+ }
242
+ return child;
243
+ });
244
+
245
+ return (
246
+ <Flex as={Element} position="relative" {...elemProps}>
247
+ {mappedChildren}
248
+ </Flex>
249
+ );
168
250
  });