@elliemae/ds-controlled-form 2.4.2-rc.0 → 2.4.2-rc.12

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 (231) hide show
  1. package/cjs/autocomplete/config/useAutocomplete.js +1 -3
  2. package/cjs/autocomplete/parts/A11yFocusedOption.js +43 -0
  3. package/cjs/autocomplete/parts/container/Container.js +36 -24
  4. package/cjs/autocomplete/parts/container/styled.js +2 -2
  5. package/cjs/autocomplete/parts/menu-list/MenuList.js +4 -2
  6. package/cjs/autocomplete/parts/styled.js +2 -0
  7. package/cjs/autocomplete/utils/listHelper.js +1 -1
  8. package/cjs/checkbox/ControlledCheckbox.js +49 -33
  9. package/cjs/checkbox/exported-related/data-test-ids.js +10 -0
  10. package/cjs/checkbox/exported-related/index.js +12 -0
  11. package/cjs/checkbox/exported-related/theming.js +13 -0
  12. package/cjs/checkbox/react-desc-prop-types.js +2 -2
  13. package/cjs/checkbox/styles.js +28 -15
  14. package/cjs/combobox/ComboBoxCTX.js +7 -4
  15. package/cjs/combobox/ComboboxDataTestids.js +1 -1
  16. package/cjs/combobox/config/useComboBox.js +21 -8
  17. package/cjs/combobox/index.js +5 -0
  18. package/cjs/combobox/parts/A11yFocusedOption.js +14 -6
  19. package/cjs/combobox/parts/A11ySelectedValues.js +0 -2
  20. package/cjs/combobox/parts/DropdownIndicator.js +4 -4
  21. package/cjs/combobox/parts/container/Container.js +14 -17
  22. package/cjs/combobox/parts/container/styled.js +13 -7
  23. package/cjs/combobox/parts/controls/Controls.js +22 -14
  24. package/cjs/combobox/parts/controls/styled.js +22 -13
  25. package/cjs/combobox/parts/controls/useOnPillsNavigation.js +3 -3
  26. package/cjs/combobox/parts/controls-input/ControlsInput.js +3 -3
  27. package/cjs/combobox/parts/controls-input/styled.js +7 -3
  28. package/cjs/combobox/parts/controls-input/useControlsInput.js +5 -5
  29. package/cjs/combobox/parts/controls-input/useKeyboardNavigation.js +37 -29
  30. package/cjs/combobox/parts/controls-input/useMaskedOnChange.js +6 -6
  31. package/cjs/combobox/parts/dropdown-indicator/DropdownIndicator.js +2 -2
  32. package/cjs/combobox/parts/header-list/HeaderList.js +4 -3
  33. package/cjs/combobox/parts/header-list/useHeaderListHandlers.js +11 -7
  34. package/cjs/combobox/parts/menu-list/MenuList.js +10 -5
  35. package/cjs/combobox/parts/menu-list/styled.js +16 -9
  36. package/cjs/combobox/parts/menu-list/useItemRenderer.js +17 -15
  37. package/cjs/combobox/parts/multi-selected-values-container/MultiSelectedValuesContainer.js +1 -1
  38. package/cjs/combobox/parts/multi-selected-values-container/RemovableSelectedValuePill.js +2 -0
  39. package/cjs/combobox/parts/multi-selected-values-container/useGroupPills.js +13 -10
  40. package/cjs/combobox/react-desc-prop-types.js +3 -2
  41. package/cjs/combobox/theming.js +13 -0
  42. package/cjs/combobox/utils/listHelper.js +12 -1
  43. package/cjs/date-time-picker/config/useChangeHandlers.js +8 -12
  44. package/cjs/date-time-picker/config/useControlledDateTimePicker.js +13 -9
  45. package/cjs/date-time-picker/config/useFocusTracker.js +136 -0
  46. package/cjs/date-time-picker/config/useGetReferences.js +40 -19
  47. package/cjs/date-time-picker/config/useGlobalKeyHandlers.js +8 -12
  48. package/cjs/date-time-picker/parts/ClearButton/ClearButton.js +12 -2
  49. package/cjs/date-time-picker/parts/ClearButton/useClearButton.js +12 -25
  50. package/cjs/date-time-picker/parts/ControlledDateTimePickerContent.js +4 -7
  51. package/cjs/date-time-picker/parts/DateInputs/DDInput.js +8 -2
  52. package/cjs/date-time-picker/parts/DateInputs/DateInputs.js +9 -4
  53. package/cjs/date-time-picker/parts/DateInputs/MMInput.js +8 -2
  54. package/cjs/date-time-picker/parts/DateInputs/YYYYInput.js +8 -2
  55. package/cjs/date-time-picker/parts/DateInputs/useDateInputs.js +76 -95
  56. package/cjs/date-time-picker/parts/Pickers/Calendar/CalendarHead.js +31 -5
  57. package/cjs/date-time-picker/parts/Pickers/Calendar/Day.js +16 -10
  58. package/cjs/date-time-picker/parts/Pickers/Calendar/useConfigCalendarCTX.js +12 -12
  59. package/cjs/date-time-picker/parts/Pickers/Calendar/useFocusLogic.js +2 -38
  60. package/cjs/date-time-picker/parts/Pickers/Calendar/useKeyboardHandlers.js +40 -73
  61. package/cjs/date-time-picker/parts/Pickers/Calendar/usePopperTriggerLogic.js +18 -27
  62. package/cjs/date-time-picker/parts/Pickers/CalendarWithTimeWheel/CalendarWithTimeWheelIconTrigger.js +1 -0
  63. package/cjs/date-time-picker/parts/Pickers/CalendarWithTimeWheel/useConfigCalendarWithTimeWheelCTX.js +17 -23
  64. package/cjs/date-time-picker/parts/Pickers/TimeWheel/HoursList.js +13 -7
  65. package/cjs/date-time-picker/parts/Pickers/TimeWheel/MeridiemList.js +14 -8
  66. package/cjs/date-time-picker/parts/Pickers/TimeWheel/MinutesList.js +13 -7
  67. package/cjs/date-time-picker/parts/Pickers/TimeWheel/useKeyboardHandlers.js +36 -230
  68. package/cjs/date-time-picker/parts/Pickers/TimeWheel/usePopperTriggerLogic.js +11 -13
  69. package/cjs/date-time-picker/parts/TimeInputs/HHInput.js +8 -2
  70. package/cjs/date-time-picker/parts/TimeInputs/MeridiemInput.js +8 -2
  71. package/cjs/date-time-picker/parts/TimeInputs/MinutesInput.js +8 -2
  72. package/cjs/date-time-picker/parts/TimeInputs/TimeInputs.js +11 -6
  73. package/cjs/date-time-picker/parts/TimeInputs/useTimeInputs.js +44 -74
  74. package/cjs/date-time-picker/utils/constants.js +0 -12
  75. package/cjs/date-time-picker/utils/hooks/useGetStartingFocusedDay.js +38 -36
  76. package/cjs/index.js +16 -7
  77. package/cjs/input-group/InputGroup.js +70 -0
  78. package/cjs/input-group/InputGroupDataTestIds.js +12 -0
  79. package/cjs/input-group/exported-related/data-test-ids.js +12 -0
  80. package/cjs/input-group/exported-related/index.js +12 -0
  81. package/cjs/input-group/exported-related/theming.js +13 -0
  82. package/cjs/input-group/index.js +12 -0
  83. package/cjs/input-group/react-desc-prop-types.js +14 -0
  84. package/cjs/input-group/styled.js +47 -0
  85. package/cjs/mask-hook/hooks/index.js +0 -1
  86. package/cjs/mask-hook/hooks/usePhoneMask.js +2 -2
  87. package/cjs/mask-hook/hooks/useRegExpMask.js +0 -1
  88. package/cjs/mask-hook/index.js +0 -1
  89. package/cjs/text-input/styled/borders.js +1 -1
  90. package/esm/autocomplete/config/useAutocomplete.js +1 -3
  91. package/esm/autocomplete/parts/A11yFocusedOption.js +32 -0
  92. package/esm/autocomplete/parts/container/Container.js +39 -27
  93. package/esm/autocomplete/parts/container/styled.js +2 -2
  94. package/esm/autocomplete/parts/menu-list/MenuList.js +5 -3
  95. package/esm/autocomplete/parts/styled.js +1 -0
  96. package/esm/autocomplete/utils/listHelper.js +1 -1
  97. package/esm/checkbox/ControlledCheckbox.js +52 -36
  98. package/esm/checkbox/exported-related/data-test-ids.js +6 -0
  99. package/esm/checkbox/exported-related/index.js +2 -0
  100. package/esm/checkbox/exported-related/theming.js +8 -0
  101. package/esm/checkbox/react-desc-prop-types.js +2 -2
  102. package/esm/checkbox/styles.js +26 -15
  103. package/esm/combobox/ComboBoxCTX.js +7 -4
  104. package/esm/combobox/ComboboxDataTestids.js +1 -1
  105. package/esm/combobox/config/useComboBox.js +22 -9
  106. package/esm/combobox/index.js +2 -0
  107. package/esm/combobox/parts/A11yFocusedOption.js +15 -7
  108. package/esm/combobox/parts/A11ySelectedValues.js +0 -2
  109. package/esm/combobox/parts/DropdownIndicator.js +4 -4
  110. package/esm/combobox/parts/container/Container.js +16 -19
  111. package/esm/combobox/parts/container/styled.js +13 -6
  112. package/esm/combobox/parts/controls/Controls.js +22 -14
  113. package/esm/combobox/parts/controls/styled.js +22 -13
  114. package/esm/combobox/parts/controls/useOnPillsNavigation.js +3 -3
  115. package/esm/combobox/parts/controls-input/ControlsInput.js +3 -3
  116. package/esm/combobox/parts/controls-input/styled.js +7 -3
  117. package/esm/combobox/parts/controls-input/useControlsInput.js +5 -5
  118. package/esm/combobox/parts/controls-input/useKeyboardNavigation.js +38 -30
  119. package/esm/combobox/parts/controls-input/useMaskedOnChange.js +6 -6
  120. package/esm/combobox/parts/dropdown-indicator/DropdownIndicator.js +2 -2
  121. package/esm/combobox/parts/header-list/HeaderList.js +4 -3
  122. package/esm/combobox/parts/header-list/useHeaderListHandlers.js +11 -7
  123. package/esm/combobox/parts/menu-list/MenuList.js +10 -5
  124. package/esm/combobox/parts/menu-list/styled.js +16 -10
  125. package/esm/combobox/parts/menu-list/useItemRenderer.js +19 -17
  126. package/esm/combobox/parts/multi-selected-values-container/MultiSelectedValuesContainer.js +1 -1
  127. package/esm/combobox/parts/multi-selected-values-container/RemovableSelectedValuePill.js +2 -0
  128. package/esm/combobox/parts/multi-selected-values-container/useGroupPills.js +13 -10
  129. package/esm/combobox/react-desc-prop-types.js +3 -2
  130. package/esm/combobox/theming.js +8 -0
  131. package/esm/combobox/utils/listHelper.js +12 -2
  132. package/esm/date-time-picker/config/useChangeHandlers.js +8 -12
  133. package/esm/date-time-picker/config/useControlledDateTimePicker.js +13 -9
  134. package/esm/date-time-picker/config/useFocusTracker.js +132 -0
  135. package/esm/date-time-picker/config/useGetReferences.js +41 -20
  136. package/esm/date-time-picker/config/useGlobalKeyHandlers.js +8 -12
  137. package/esm/date-time-picker/parts/ClearButton/ClearButton.js +12 -2
  138. package/esm/date-time-picker/parts/ClearButton/useClearButton.js +12 -25
  139. package/esm/date-time-picker/parts/ControlledDateTimePickerContent.js +4 -7
  140. package/esm/date-time-picker/parts/DateInputs/DDInput.js +8 -2
  141. package/esm/date-time-picker/parts/DateInputs/DateInputs.js +9 -4
  142. package/esm/date-time-picker/parts/DateInputs/MMInput.js +8 -2
  143. package/esm/date-time-picker/parts/DateInputs/YYYYInput.js +8 -2
  144. package/esm/date-time-picker/parts/DateInputs/useDateInputs.js +77 -96
  145. package/esm/date-time-picker/parts/Pickers/Calendar/CalendarHead.js +32 -6
  146. package/esm/date-time-picker/parts/Pickers/Calendar/Day.js +16 -10
  147. package/esm/date-time-picker/parts/Pickers/Calendar/useConfigCalendarCTX.js +12 -12
  148. package/esm/date-time-picker/parts/Pickers/Calendar/useFocusLogic.js +3 -39
  149. package/esm/date-time-picker/parts/Pickers/Calendar/useKeyboardHandlers.js +40 -73
  150. package/esm/date-time-picker/parts/Pickers/Calendar/usePopperTriggerLogic.js +18 -27
  151. package/esm/date-time-picker/parts/Pickers/CalendarWithTimeWheel/CalendarWithTimeWheelIconTrigger.js +1 -0
  152. package/esm/date-time-picker/parts/Pickers/CalendarWithTimeWheel/useConfigCalendarWithTimeWheelCTX.js +17 -23
  153. package/esm/date-time-picker/parts/Pickers/TimeWheel/HoursList.js +14 -8
  154. package/esm/date-time-picker/parts/Pickers/TimeWheel/MeridiemList.js +15 -9
  155. package/esm/date-time-picker/parts/Pickers/TimeWheel/MinutesList.js +14 -8
  156. package/esm/date-time-picker/parts/Pickers/TimeWheel/useKeyboardHandlers.js +36 -230
  157. package/esm/date-time-picker/parts/Pickers/TimeWheel/usePopperTriggerLogic.js +11 -13
  158. package/esm/date-time-picker/parts/TimeInputs/HHInput.js +8 -2
  159. package/esm/date-time-picker/parts/TimeInputs/MeridiemInput.js +8 -2
  160. package/esm/date-time-picker/parts/TimeInputs/MinutesInput.js +8 -2
  161. package/esm/date-time-picker/parts/TimeInputs/TimeInputs.js +11 -6
  162. package/esm/date-time-picker/parts/TimeInputs/useTimeInputs.js +44 -74
  163. package/esm/date-time-picker/utils/constants.js +1 -7
  164. package/esm/date-time-picker/utils/hooks/useGetStartingFocusedDay.js +38 -36
  165. package/esm/index.js +5 -1
  166. package/esm/input-group/InputGroup.js +60 -0
  167. package/esm/input-group/InputGroupDataTestIds.js +8 -0
  168. package/esm/input-group/exported-related/data-test-ids.js +8 -0
  169. package/esm/input-group/exported-related/index.js +2 -0
  170. package/esm/input-group/exported-related/theming.js +8 -0
  171. package/esm/input-group/index.js +2 -0
  172. package/esm/input-group/react-desc-prop-types.js +10 -0
  173. package/esm/input-group/styled.js +36 -0
  174. package/esm/mask-hook/hooks/index.js +1 -1
  175. package/esm/mask-hook/hooks/usePhoneMask.js +2 -2
  176. package/esm/mask-hook/hooks/useRegExpMask.js +1 -1
  177. package/esm/mask-hook/index.js +1 -1
  178. package/esm/text-input/styled/borders.js +1 -1
  179. package/package.json +75 -19
  180. package/types/autocomplete/parts/A11yFocusedOption.d.ts +5 -0
  181. package/types/autocomplete/parts/container/styled.d.ts +1 -1
  182. package/types/autocomplete/parts/styled.d.ts +0 -0
  183. package/types/autocomplete/utils/listHelper.d.ts +5 -5
  184. package/types/checkbox/exported-related/data-test-ids.d.ts +4 -0
  185. package/types/checkbox/exported-related/index.d.ts +2 -0
  186. package/types/checkbox/exported-related/theming.d.ts +6 -0
  187. package/types/checkbox/react-desc-prop-types.d.ts +4 -4
  188. package/types/checkbox/styles.d.ts +6 -5
  189. package/types/combobox/ComboboxDataTestids.d.ts +1 -1
  190. package/types/combobox/index.d.ts +2 -0
  191. package/types/combobox/parts/container/styled.d.ts +1 -2
  192. package/types/combobox/parts/menu-list/styled.d.ts +1 -0
  193. package/types/combobox/react-desc-prop-types.d.ts +8 -6
  194. package/types/combobox/sharedTypes.d.ts +3 -2
  195. package/types/combobox/theming.d.ts +6 -0
  196. package/types/combobox/utils/listHelper.d.ts +1 -0
  197. package/types/date-time-picker/config/useChangeHandlers.d.ts +3 -1
  198. package/types/date-time-picker/config/useControlledDateTimePicker.d.ts +2 -5
  199. package/types/date-time-picker/config/useFocusTracker.d.ts +38 -0
  200. package/types/date-time-picker/config/useGetPropsBasedOnType.d.ts +6 -6
  201. package/types/date-time-picker/config/useGetReferences.d.ts +30 -36
  202. package/types/date-time-picker/config/useGlobalKeyHandlers.d.ts +3 -1
  203. package/types/date-time-picker/parts/DateInputs/DDInput.d.ts +2 -1
  204. package/types/date-time-picker/parts/DateInputs/MMInput.d.ts +2 -1
  205. package/types/date-time-picker/parts/DateInputs/YYYYInput.d.ts +2 -1
  206. package/types/date-time-picker/parts/Pickers/Calendar/useConfigCalendarCTX.d.ts +14 -0
  207. package/types/date-time-picker/parts/Pickers/Calendar/useFocusLogic.d.ts +1 -2
  208. package/types/date-time-picker/parts/Pickers/Calendar/usePopperTriggerLogic.d.ts +19 -0
  209. package/types/date-time-picker/parts/Pickers/TimeWheel/useKeyboardHandlers.d.ts +0 -6
  210. package/types/date-time-picker/parts/Pickers/TimeWheel/usePopperTriggerLogic.d.ts +14 -0
  211. package/types/date-time-picker/parts/TimeInputs/HHInput.d.ts +2 -1
  212. package/types/date-time-picker/parts/TimeInputs/MeridiemInput.d.ts +2 -1
  213. package/types/date-time-picker/parts/TimeInputs/MinutesInput.d.ts +2 -1
  214. package/types/date-time-picker/propTypes.d.ts +117 -0
  215. package/types/date-time-picker/sharedTypes.d.ts +1 -1
  216. package/types/date-time-picker/utils/constants.d.ts +0 -6
  217. package/types/index.d.ts +1 -0
  218. package/types/input-group/InputGroup.d.ts +5 -0
  219. package/types/input-group/InputGroupDataTestIds.d.ts +6 -0
  220. package/types/input-group/exported-related/data-test-ids.d.ts +6 -0
  221. package/types/input-group/exported-related/index.d.ts +2 -0
  222. package/types/input-group/exported-related/theming.d.ts +6 -0
  223. package/types/input-group/index.d.ts +2 -0
  224. package/types/input-group/react-desc-prop-types.d.ts +19 -0
  225. package/types/input-group/styled.d.ts +4 -0
  226. package/types/input-group/tests/DSInputGroup.test.d.ts +1 -0
  227. package/types/mask-hook/hooks/useRegExpMask.d.ts +0 -1
  228. package/types/text-input/config/useInputText.d.ts +6 -6
  229. package/cjs/combobox/parts/menu-list/useMenuListSetFocusOption.js +0 -51
  230. package/esm/combobox/parts/menu-list/useMenuListSetFocusOption.js +0 -47
  231. package/types/combobox/parts/menu-list/useMenuListSetFocusOption.d.ts +0 -1
@@ -20,7 +20,6 @@ exports.UseSSNMaskWithSchema = useSSNMask.UseSSNMaskWithSchema;
20
20
  exports.getSSNMaskedValue = useSSNMask.getSSNMaskedValue;
21
21
  exports.useSSNMask = useSSNMask.useSSNMask;
22
22
  exports.UseRegExpMaskWithSchema = useRegExpMask.UseRegExpMaskWithSchema;
23
- exports.isRegExp = useRegExpMask.isRegExp;
24
23
  exports.useRegExpMask = useRegExpMask.useRegExpMask;
25
24
  exports.UseZipCodeMaskWithSchema = useZipCodeMask.UseZipCodeMaskWithSchema;
26
25
  exports.getUseZipMaskedValue = useZipCodeMask.getUseZipMaskedValue;
@@ -22,8 +22,8 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
22
22
  var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties);
23
23
 
24
24
  const _excluded = ["valueSetter", "onChange", "onKeyDown", "onBlur"];
25
- const phoneSpecialChars = [['(', 0], [') ', 4], ['-', 9]];
26
- const internationalPhoneSpecialChars = [['+1 (', 0], [') ', 7], ['-', 12]];
25
+ const phoneSpecialChars = [['(', 0], [') ', 4], [' - ', 9]];
26
+ const internationalPhoneSpecialChars = [['+1 (', 0], [') ', 7], [' - ', 12]];
27
27
 
28
28
  const conformValue = (rawValue, cursorPos, lastKeyCode, opts) => {
29
29
  const characters = rawValue.split(''); // Work with digits only
@@ -118,5 +118,4 @@ const UseRegExpMaskWithSchema = dsPropsHelpers.describe(useRegExpMask);
118
118
  UseRegExpMaskWithSchema.propTypes = reactDescPropTypes.DSMaskRegExpHookPropsTypes;
119
119
 
120
120
  exports.UseRegExpMaskWithSchema = UseRegExpMaskWithSchema;
121
- exports.isRegExp = isRegExp;
122
121
  exports.useRegExpMask = useRegExpMask;
@@ -20,7 +20,6 @@ exports.UseSSNMaskWithSchema = useSSNMask.UseSSNMaskWithSchema;
20
20
  exports.getSSNMaskedValue = useSSNMask.getSSNMaskedValue;
21
21
  exports.useSSNMask = useSSNMask.useSSNMask;
22
22
  exports.UseRegExpMaskWithSchema = useRegExpMask.UseRegExpMaskWithSchema;
23
- exports.isRegExp = useRegExpMask.isRegExp;
24
23
  exports.useRegExpMask = useRegExpMask.useRegExpMask;
25
24
  exports.UseZipCodeMaskWithSchema = useZipCodeMask.UseZipCodeMaskWithSchema;
26
25
  exports.getUseZipMaskedValue = useZipCodeMask.getUseZipMaskedValue;
@@ -15,7 +15,7 @@ const readOnlyBorderCss = dsSystem.css(_templateObject2 || (_templateObject2 = _
15
15
  const disabledBorderCss = commonBorderCss;
16
16
  const hasErrorBorderCss = dsSystem.css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral__default["default"](["\n border: 1px solid ", ";\n"])), dsSystem.th.color('danger-900'));
17
17
  const hoverBorderCss = dsSystem.css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral__default["default"](["\n border: 1px solid ", ";\n"])), dsSystem.th.color('brand-700'));
18
- const focusBorderCss = dsSystem.css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral__default["default"](["\n border: 1px solid transparent;\n outline: 2px solid ", ";\n outline-offset: -1px;\n"])), dsSystem.th.color('brand-700'));
18
+ const focusBorderCss = dsSystem.css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral__default["default"](["\n border: 1px solid transparent;\n outline: 2px solid ", ";\n outline-offset: -2px;\n"])), dsSystem.th.color('brand-700'));
19
19
  const getBorderCss = props => {
20
20
  if (props.isDisabled) return disabledBorderCss;
21
21
  if (props.hasFocus) return focusBorderCss;
@@ -27,7 +27,6 @@ const useAutocomplete = props => {
27
27
  const [focusOptionIdx, setCurrentOption] = useState('');
28
28
  const inputRef = useRef(null);
29
29
  const listRef = useRef(null);
30
- const selectedOptionsRef = useRef(null);
31
30
  const {
32
31
  options,
33
32
  filter
@@ -66,12 +65,11 @@ const useAutocomplete = props => {
66
65
  inputRef,
67
66
  listRef,
68
67
  focusOptionIdx,
69
- selectedOptionsRef,
70
68
  setCurrentOption,
71
69
  scrollOptionIntoView,
72
70
  setReferenceElement,
73
71
  setShowPopover
74
- }), [scrollOptionIntoView, propsWithDefault, virtualListHelpers, focusOptionIdx, showPopover, referenceElement, inputRef, selectedOptionsRef, listRef]);
72
+ }), [scrollOptionIntoView, propsWithDefault, virtualListHelpers, focusOptionIdx, showPopover, referenceElement, inputRef, listRef]);
75
73
  return ctx;
76
74
  };
77
75
 
@@ -0,0 +1,32 @@
1
+ import _jsx from '@babel/runtime/helpers/esm/jsx';
2
+ import _taggedTemplateLiteral from '@babel/runtime/helpers/esm/taggedTemplateLiteral';
3
+ import 'core-js/modules/esnext.async-iterator.find.js';
4
+ import 'core-js/modules/esnext.iterator.constructor.js';
5
+ import 'core-js/modules/esnext.iterator.find.js';
6
+ import { useContext, useMemo } from 'react';
7
+ import { styled } from '@elliemae/ds-system';
8
+ import { AutocompleteContext } from '../AutocompleteCTX.js';
9
+ import { getSelectableOptions } from '../utils/listHelper.js';
10
+
11
+ var _templateObject;
12
+ const isSeparator = el => (el === null || el === void 0 ? void 0 : el.type) === 'separator';
13
+ const StyledA11ySelectedValues = styled.span(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: 1px;\n height: 1px;\n position: absolute;\n clip: rect(1px, 1px, 1px, 1px);\n"])));
14
+ const A11yFocusedOption = () => {
15
+ const {
16
+ props: {
17
+ options
18
+ },
19
+ focusOptionIdx,
20
+ showPopover
21
+ } = useContext(AutocompleteContext);
22
+ return useMemo(() => {
23
+ const selectabledOptions = getSelectableOptions(options);
24
+ const focusOption = options.find(option => !isSeparator(option) && option.dsId === focusOptionIdx);
25
+ const focusSelectableOptionIdx = selectabledOptions.findIndex(option => option.dsId === focusOptionIdx);
26
+ return /*#__PURE__*/_jsx(StyledA11ySelectedValues, {
27
+ "aria-live": "polite"
28
+ }, void 0, !isSeparator(focusOption) && showPopover && focusOption && "option ".concat(focusOption.label, " focused.").concat(focusSelectableOptionIdx + 1, " of ").concat(selectabledOptions.length, "\n "));
29
+ }, [options, showPopover, focusOptionIdx]);
30
+ };
31
+
32
+ export { A11yFocusedOption, StyledA11ySelectedValues, isSeparator };
@@ -2,19 +2,21 @@ import _jsx from '@babel/runtime/helpers/esm/jsx';
2
2
  import 'core-js/modules/esnext.async-iterator.filter.js';
3
3
  import 'core-js/modules/esnext.iterator.constructor.js';
4
4
  import 'core-js/modules/esnext.iterator.filter.js';
5
- import React, { useContext, useEffect, useCallback } from 'react';
5
+ import React, { useContext, useEffect, useCallback, useMemo } from 'react';
6
6
  import { DSPopperJS } from '@elliemae/ds-popperjs';
7
7
  import { AutocompleteContext } from '../../AutocompleteCTX.js';
8
- import { StyledContainerWithPopper, StyledPopperWrapper } from './styled.js';
8
+ import { StyledContainer, StyledPopperWrapper } from './styled.js';
9
9
  import { MenuList } from '../menu-list/MenuList.js';
10
10
  import { useKeyboardNavigation } from './useKeyboardNavigation.js';
11
11
  import { AutocompleteDataTestid } from '../../AutocompleteDataTestids.js';
12
- import { jsxs } from 'react/jsx-runtime';
12
+ import { A11yFocusedOption } from '../A11yFocusedOption.js';
13
+ import { jsxs, Fragment } from 'react/jsx-runtime';
13
14
 
14
- var _StyledPopperWrapper;
15
+ var _A11yFocusedOption, _StyledPopperWrapper;
15
16
  const Container = () => {
16
17
  const {
17
18
  props: {
19
+ id,
18
20
  startPlacementPreference,
19
21
  children,
20
22
  filter,
@@ -23,6 +25,7 @@ const Container = () => {
23
25
  showPopover,
24
26
  setReferenceElement,
25
27
  setShowPopover,
28
+ focusOptionIdx,
26
29
  referenceElement
27
30
  } = useContext(AutocompleteContext);
28
31
  useEffect(() => {
@@ -38,32 +41,41 @@ const Container = () => {
38
41
  const handleCloseMenu = useCallback(() => {
39
42
  setShowPopover(false);
40
43
  }, [setShowPopover]);
41
- const input = React.Children.only(children);
42
44
  const {
43
45
  onInputKeyDown
44
46
  } = useKeyboardNavigation();
45
- return /*#__PURE__*/jsxs(StyledContainerWithPopper, {
46
- ref: setReferenceElement,
47
- role: "combobox",
48
- "aria-autocomplete": "list",
49
- "aria-controls": "autocomplete-listbox",
50
- "aria-expanded": showPopover,
51
- onKeyDown: onInputKeyDown,
52
- "data-testid": AutocompleteDataTestid.CONTAINER,
53
- children: [input, filter && /*#__PURE__*/_jsx(DSPopperJS, {
54
- customOffset: [0, 5],
55
- closeContextMenu: handleCloseMenu,
56
- referenceElement: referenceElement,
57
- showPopover: showPopover,
58
- startPlacementPreference: startPlacementPreference,
59
- placementOrderPreference: placementOrderPreference,
60
- withoutPortal: true,
61
- withoutArrow: true,
62
- withoutAnimation: true,
63
- zIndex: 10
64
- }, void 0, _StyledPopperWrapper || (_StyledPopperWrapper = /*#__PURE__*/_jsx(StyledPopperWrapper, {
65
- tabIndex: -1
66
- }, void 0, /*#__PURE__*/_jsx(MenuList, {}))))]
47
+ const input = React.Children.only(children);
48
+ const childrenWithProps = /*#__PURE__*/React.isValidElement(input) ? /*#__PURE__*/React.cloneElement(input, {
49
+ 'aria-activedescendant': focusOptionIdx
50
+ }) : input;
51
+ const idList = useMemo(() => "".concat(id ? "".concat(id, "-") : '', "listbox"), [id]);
52
+ return /*#__PURE__*/jsxs(Fragment, {
53
+ children: [_A11yFocusedOption || (_A11yFocusedOption = /*#__PURE__*/_jsx(A11yFocusedOption, {})), /*#__PURE__*/jsxs(StyledContainer, {
54
+ id: id,
55
+ ref: setReferenceElement,
56
+ role: "combobox",
57
+ "aria-autocomplete": "list",
58
+ "aria-controls": "autocomplete-listbox",
59
+ "aria-expanded": showPopover,
60
+ "aria-haspopup": "listbox",
61
+ "aria-owns": idList,
62
+ onKeyDown: onInputKeyDown,
63
+ "data-testid": AutocompleteDataTestid.CONTAINER,
64
+ children: [childrenWithProps, filter && /*#__PURE__*/_jsx(DSPopperJS, {
65
+ customOffset: [0, 5],
66
+ closeContextMenu: handleCloseMenu,
67
+ referenceElement: referenceElement,
68
+ showPopover: showPopover,
69
+ startPlacementPreference: startPlacementPreference,
70
+ placementOrderPreference: placementOrderPreference,
71
+ withoutPortal: true,
72
+ withoutArrow: true,
73
+ withoutAnimation: true,
74
+ zIndex: 10
75
+ }, void 0, _StyledPopperWrapper || (_StyledPopperWrapper = /*#__PURE__*/_jsx(StyledPopperWrapper, {
76
+ tabIndex: -1
77
+ }, void 0, /*#__PURE__*/_jsx(MenuList, {}))))]
78
+ })]
67
79
  });
68
80
  };
69
81
 
@@ -1,10 +1,10 @@
1
1
  import styled from 'styled-components';
2
2
 
3
- const StyledContainerWithPopper = /*#__PURE__*/styled.div.withConfig({
3
+ const StyledContainer = /*#__PURE__*/styled.div.withConfig({
4
4
  componentId: "sc-xupfk9-0"
5
5
  })(["width:100%;height:28px;position:relative;"]);
6
6
  const StyledPopperWrapper = /*#__PURE__*/styled.div.withConfig({
7
7
  componentId: "sc-xupfk9-1"
8
8
  })(["background:#fff;overflow:auto;position:relative;"]);
9
9
 
10
- export { StyledContainerWithPopper, StyledPopperWrapper };
10
+ export { StyledContainer, StyledPopperWrapper };
@@ -1,5 +1,5 @@
1
1
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
- import { useContext, useCallback } from 'react';
2
+ import { useContext, useCallback, useMemo } from 'react';
3
3
  import { StyledListWrapper, StyledVirtualListWrapper, StyledList } from './styled.js';
4
4
  import { AutocompleteDataTestid } from '../../AutocompleteDataTestids.js';
5
5
  import { AutocompleteContext } from '../../AutocompleteCTX.js';
@@ -9,7 +9,8 @@ import { jsx } from 'react/jsx-runtime';
9
9
  const MenuList = () => {
10
10
  const {
11
11
  props: {
12
- options
12
+ options,
13
+ id
13
14
  },
14
15
  referenceElement,
15
16
  inputRef,
@@ -25,11 +26,12 @@ const MenuList = () => {
25
26
 
26
27
  (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
27
28
  }, [inputRef]);
29
+ const idList = useMemo(() => "".concat(id ? "".concat(id, "-") : '', "listbox"), [id]);
28
30
  return /*#__PURE__*/_jsx(StyledListWrapper, {
29
31
  tabIndex: -1,
30
32
  onMouseDown: e => e.preventDefault(),
31
33
  minWidth: referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth,
32
- id: "autocomplete-listbox",
34
+ id: idList,
33
35
  role: "listbox"
34
36
  }, void 0, options.length > 0 && /*#__PURE__*/jsx(StyledVirtualListWrapper, {
35
37
  tabIndex: -1,
@@ -0,0 +1 @@
1
+
@@ -9,7 +9,7 @@ const isSelectedValueMultiple = value => Array.isArray(value);
9
9
  const findInCircularList = function (list, from, criteria) {
10
10
  let step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
11
11
 
12
- for (let i = (from + step + list.length) % list.length; i !== from; i = (i + step + list.length) % list.length) {
12
+ for (let i = (from + step + list.length) % list.length; i !== from && from > -1; i = (i + step + list.length) % list.length) {
13
13
  if (criteria(list[i])) return i;
14
14
  }
15
15
 
@@ -7,15 +7,15 @@ import _jsx from '@babel/runtime/helpers/esm/jsx';
7
7
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
8
8
  import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';
9
9
  import { useRef, useCallback } from 'react';
10
- import { describe, useMemoMergePropsWithDefault, useGetGlobalAttributes } from '@elliemae/ds-props-helpers';
10
+ import { describe, useMemoMergePropsWithDefault, useGetGlobalAttributes, useGetXstyledProps } from '@elliemae/ds-props-helpers';
11
11
  import { SimpleTruncatedTooltipText } from '@elliemae/ds-truncated-tooltip-text';
12
- import { StyledContainer, StyledCheckBox, StyledInput, StyledLabel } from './styles.js';
12
+ import { StyledContainer, StyledCheckBox, StyledInputMixed, StyledInput, StyledLabel, StyledWrapLabel } from './styles.js';
13
13
  import { propTypes, defaultProps } from './react-desc-prop-types.js';
14
14
  import { setMultipleRefs } from './utils/setMultipleRefs.js';
15
15
  import { useValidateProps } from './config/useValidateProps.js';
16
- import { jsx } from 'react/jsx-runtime';
16
+ import { jsxs, jsx } from 'react/jsx-runtime';
17
17
 
18
- const _excluded = ["id", "disabled", "readOnly", "label", "aria-label", "aria-controls", "onKeyDown", "className"];
18
+ const _excluded = ["id", "disabled", "readOnly", "label", "aria-label", "aria-controls", "onKeyDown", "className", "onChange"];
19
19
 
20
20
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
21
 
@@ -31,10 +31,8 @@ const DSControlledCheckbox = props => {
31
31
  hasError,
32
32
  innerRef,
33
33
  wrapLabel,
34
- tabIndex,
35
34
  ariaLabel: legacyAriaLabel,
36
- ariaControls: legacyAriaControls,
37
- 'data-testid': dataTestid = 'ds-checkbox-container'
35
+ ariaControls: legacyAriaControls
38
36
  } = propsWithDefault;
39
37
 
40
38
  const _useGetGlobalAttribut = useGetGlobalAttributes(propsWithDefault),
@@ -46,10 +44,12 @@ const DSControlledCheckbox = props => {
46
44
  'aria-label': ariaLabel,
47
45
  'aria-controls': ariaControls,
48
46
  onKeyDown: userOnKeyDown,
49
- className
47
+ className,
48
+ onChange
50
49
  } = _useGetGlobalAttribut,
51
50
  restGlobals = _objectWithoutProperties(_useGetGlobalAttribut, _excluded);
52
51
 
52
+ const xstyledProps = useGetXstyledProps(propsWithDefault);
53
53
  const handleOnKeyDown = useCallback(e => {
54
54
  if (checkboxRef.current && e.key === 'Enter') {
55
55
  checkboxRef.current.click();
@@ -57,35 +57,51 @@ const DSControlledCheckbox = props => {
57
57
 
58
58
  if (userOnKeyDown) userOnKeyDown(e);
59
59
  }, [userOnKeyDown]);
60
- return /*#__PURE__*/_jsx(StyledContainer, {
61
- "data-testid": dataTestid,
60
+ return /*#__PURE__*/jsxs(StyledContainer, _objectSpread(_objectSpread({
61
+ "data-testid": "ds-checkbox-container",
62
62
  className: className
63
- }, void 0, /*#__PURE__*/_jsx(StyledCheckBox, {
64
- checked: checked,
65
- hasError: hasError,
66
- disabled: disabled,
67
- readOnly: readOnly
68
- }, void 0, /*#__PURE__*/jsx(StyledInput, _objectSpread(_objectSpread({}, restGlobals), {}, {
69
- "data-testid": "ds-checkbox",
70
- id: id,
71
- ref: ref => setMultipleRefs([checkboxRef, innerRef])(ref),
72
- onKeyDown: handleOnKeyDown,
73
- type: "checkbox",
74
- checked: checked !== 'mixed' ? checked : undefined,
75
- "aria-label": ariaLabel || legacyAriaLabel || label,
76
- "aria-controls": ariaControls || legacyAriaControls,
77
- tabIndex: tabIndex,
78
- disabled: disabled,
79
- readOnly: readOnly
80
- }))), label && /*#__PURE__*/_jsx(StyledLabel, {
81
- htmlFor: id,
82
- disabled: disabled,
83
- readOnly: readOnly,
84
- checked: checked,
85
- "data-testid": "ds-checkbox-label"
86
- }, void 0, wrapLabel ? label : /*#__PURE__*/_jsx(SimpleTruncatedTooltipText, {
87
- value: label
88
- })));
63
+ }, xstyledProps), {}, {
64
+ children: [/*#__PURE__*/_jsx(StyledCheckBox, {
65
+ checked: checked,
66
+ hasError: hasError,
67
+ disabled: disabled,
68
+ readOnly: readOnly
69
+ }, void 0, ariaControls || legacyAriaControls ? /*#__PURE__*/jsx(StyledInputMixed, _objectSpread(_objectSpread({
70
+ role: "checkbox",
71
+ "data-testid": "ds-checkbox",
72
+ id: id,
73
+ ref: ref => setMultipleRefs([checkboxRef, innerRef])(ref),
74
+ onKeyDown: handleOnKeyDown,
75
+ "aria-label": ariaLabel || legacyAriaLabel || label,
76
+ "aria-controls": ariaControls || legacyAriaControls,
77
+ disabled: disabled,
78
+ readOnly: readOnly,
79
+ onClick: onChange,
80
+ "aria-checked": checked
81
+ }, restGlobals), {}, {
82
+ tabIndex: 0
83
+ })) : /*#__PURE__*/jsx(StyledInput, _objectSpread({
84
+ "data-testid": "ds-checkbox",
85
+ id: id,
86
+ ref: ref => setMultipleRefs([checkboxRef, innerRef])(ref),
87
+ onKeyDown: handleOnKeyDown,
88
+ type: "checkbox",
89
+ checked: checked,
90
+ "aria-label": ariaLabel || legacyAriaLabel || label,
91
+ disabled: disabled,
92
+ readOnly: readOnly,
93
+ onChange: onChange
94
+ }, restGlobals))), label && /*#__PURE__*/_jsx(StyledLabel, {
95
+ htmlFor: id,
96
+ disabled: disabled,
97
+ readOnly: readOnly,
98
+ checked: checked,
99
+ "data-testid": "ds-checkbox-label",
100
+ wrapLabel: wrapLabel
101
+ }, void 0, wrapLabel ? /*#__PURE__*/_jsx(StyledWrapLabel, {}, void 0, label) : /*#__PURE__*/_jsx(SimpleTruncatedTooltipText, {
102
+ value: label
103
+ }))]
104
+ }));
89
105
  };
90
106
 
91
107
  const DSControlledCheckboxWithSchema = describe(DSControlledCheckbox);
@@ -0,0 +1,6 @@
1
+ const DSCheckboxDataTestIds = {
2
+ CONTAINER: 'ds-checkbox-container',
3
+ INPUT: 'ds-checkbox'
4
+ };
5
+
6
+ export { DSCheckboxDataTestIds };
@@ -0,0 +1,2 @@
1
+ export { DSCheckboxDataTestIds } from './data-test-ids.js';
2
+ export { DSCheckboxName, DSCheckboxSlots } from './theming.js';
@@ -0,0 +1,8 @@
1
+ const DSCheckboxName = 'ds-checkbox';
2
+ const DSCheckboxSlots = {
3
+ CONTAINER: 'root',
4
+ INPUT: 'input',
5
+ LABEL: 'label'
6
+ };
7
+
8
+ export { DSCheckboxName, DSCheckboxSlots };
@@ -17,9 +17,9 @@ const defaultProps = {
17
17
  };
18
18
  const propTypes = _objectSpread(_objectSpread({}, globalAttributesPropTypes), {}, {
19
19
  label: PropTypes.string.description('Checkbox Label property. This label is also going to be used as an aria-label for screen readers.'),
20
- wrapLabel: PropTypes.bool.description('Whether to wrap or truncate label'),
21
20
  hasError: PropTypes.bool.description('Whether the checkbox has error or not.'),
22
- innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]).description('Checkbox input ref.')
21
+ innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]).description('Checkbox input ref.'),
22
+ wrapLabel: PropTypes.bool.description('Whether to wrap or truncate the label')
23
23
  });
24
24
 
25
25
  export { defaultProps, propTypes };
@@ -1,17 +1,19 @@
1
- import styled from 'styled-components';
1
+ import _taggedTemplateLiteral from '@babel/runtime/helpers/esm/taggedTemplateLiteral';
2
+ import { styled, css } from '@elliemae/ds-system';
2
3
  import { handleBackgroundColor, handleCheckmark } from './utils/styleHelpers.js';
4
+ import { DSCheckboxName, DSCheckboxSlots } from './exported-related/theming.js';
3
5
 
4
- const StyledContainer = /*#__PURE__*/styled.div.withConfig({
5
- componentId: "sc-flv7d2-0"
6
- })(["display:inline-grid;grid-template-rows:min-content;grid-template-columns:", " auto;align-items:center;"], _ref => {
6
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7;
7
+ const StyledContainer = styled('div', {
8
+ name: DSCheckboxName,
9
+ slot: DSCheckboxSlots.CONTAINER
10
+ })(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: inline-grid;\n grid-template-rows: min-content;\n grid-template-columns: ", " auto;\n align-items: center;\n"])), _ref => {
7
11
  let {
8
12
  theme
9
13
  } = _ref;
10
14
  return theme.space.xs;
11
15
  });
12
- const StyledCheckBox = /*#__PURE__*/styled.span.withConfig({
13
- componentId: "sc-flv7d2-1"
14
- })(["width:", ";height:", ";border:1px solid ", ";border-radius:2px;position:relative;background:", ";", " &:focus-within{", ";&:hover{", "}}&:hover{background:", ";", ";}"], _ref2 => {
16
+ const StyledCheckBox = styled('span')(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n width: ", ";\n height: ", ";\n border: 1px solid ", ";\n border-radius: 2px;\n position: relative;\n background: ", ";\n ", "\n &:focus-within {\n ", ";\n &:hover {\n ", "\n }\n }\n &:hover {\n background: ", ";\n ", ";\n }\n"])), _ref2 => {
15
17
  let {
16
18
  theme
17
19
  } = _ref2;
@@ -74,16 +76,24 @@ const StyledCheckBox = /*#__PURE__*/styled.span.withConfig({
74
76
  } = _ref10;
75
77
  return !hasError && !disabled && !readOnly ? " border: 1px solid ".concat(theme.colors.brand[600]) : undefined;
76
78
  });
77
- const StyledInput = /*#__PURE__*/styled.input.withConfig({
78
- componentId: "sc-flv7d2-2"
79
- })(["&:hover{cursor:pointer;}&:disabled{cursor:not-allowed;}height:100%;position:absolute;top:0;left:0;opacity:0;"]);
80
- const StyledLabel = /*#__PURE__*/styled.label.withConfig({
81
- componentId: "sc-flv7d2-3"
82
- })(["&:hover{cursor:pointer;}padding-left:", ";color:", ";font-size:13px;line-height:13px;display:inherit;"], _ref11 => {
79
+ const checkboxStyles = css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n &:hover {\n cursor: pointer;\n }\n &:disabled {\n cursor: not-allowed;\n }\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n"])));
80
+ const StyledInput = styled('input', {
81
+ name: DSCheckboxName,
82
+ slot: DSCheckboxSlots.INPUT
83
+ })(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n ", "\n"])), checkboxStyles);
84
+ const StyledInputMixed = styled('div', {
85
+ name: DSCheckboxName,
86
+ slot: DSCheckboxSlots.INPUT
87
+ })(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n ", "\n"])), checkboxStyles);
88
+ const StyledLabel = styled('label', {
89
+ name: DSCheckboxName,
90
+ slot: DSCheckboxSlots.LABEL
91
+ })(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n &:hover {\n cursor: pointer;\n }\n ", ";\n\n color: ", ";\n font-size: 13px;\n line-height: 13px;\n display: inherit;\n"])), _ref11 => {
83
92
  let {
93
+ wrapLabel,
84
94
  theme
85
95
  } = _ref11;
86
- return theme.space.xxs;
96
+ return wrapLabel ? 'padding: 8px 0px 8px 8px;' : "padding-left: ".concat(theme.space.xxs);
87
97
  }, _ref12 => {
88
98
  let {
89
99
  theme,
@@ -93,5 +103,6 @@ const StyledLabel = /*#__PURE__*/styled.label.withConfig({
93
103
  } = _ref12;
94
104
  return disabled && checked !== true || readOnly ? theme.colors.neutral[500] : theme.colors.neutral[800];
95
105
  });
106
+ const StyledWrapLabel = styled('span')(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral([""])));
96
107
 
97
- export { StyledCheckBox, StyledContainer, StyledInput, StyledLabel };
108
+ export { StyledCheckBox, StyledContainer, StyledInput, StyledInputMixed, StyledLabel, StyledWrapLabel };
@@ -6,18 +6,20 @@ function noop() {}
6
6
  const defaultProps = {
7
7
  hasError: false,
8
8
  inline: false,
9
- withoutPortal: true,
9
+ withoutPortal: false,
10
10
  zIndex: 10,
11
11
  disabled: false,
12
12
  useMask: noop,
13
13
  innerRef: /*#__PURE__*/createRef(),
14
14
  startPlacementPreference: 'bottom-start',
15
- placementOrderPreference: ['bottom-start', 'bottom-end'] // override in useCombobox to avoid ref duplications when more than one cb is used
15
+ placementOrderPreference: ['bottom-start', 'bottom-end'],
16
+ noOptionsMessage: 'No Matches Found',
17
+ filteredOptions: [] // override in useCombobox to avoid ref duplications when more than one cb is used
16
18
 
17
19
  };
18
20
  const defaultContext = {
19
21
  props: defaultProps,
20
- showPopover: false,
22
+ menuState: false,
21
23
  hasFocus: false,
22
24
  referenceElement: null,
23
25
  inputValue: '',
@@ -36,7 +38,8 @@ const defaultContext = {
36
38
  setInputValue: noop,
37
39
  setReferenceElement: noop,
38
40
  setFocusOptionIdx: noop,
39
- setShowSelectedOptions: noop
41
+ setShowSelectedOptions: noop,
42
+ setMenuState: noop
40
43
  };
41
44
  /** Context for cross component communication */
42
45
 
@@ -1,6 +1,6 @@
1
1
  const ComboboxDataTestid = {
2
2
  MULTISELECT: {
3
- SELECT_ALL_CHECKBOX: 'combobox-select-all-checkbox',
3
+ HEADER_LIST: 'combobox-header-list',
4
4
  SHOW_SELECTED_OPTIONS_TOGGLE: 'combobox-selected-options-toggle'
5
5
  },
6
6
  CONTROLS_WRAPPER: 'combobox-controls-wrapper',
@@ -5,7 +5,7 @@ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
5
  import 'core-js/modules/esnext.iterator.for-each.js';
6
6
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
7
  import 'core-js/modules/web.dom-collections.iterator.js';
8
- import { useRef, useState, useCallback, useEffect, useMemo } from 'react';
8
+ import { useRef, useState, useMemo, useCallback, useEffect } from 'react';
9
9
  import { useVirtual } from 'react-virtual';
10
10
  import { useMemoMergePropsWithDefault, useValidateTypescriptPropTypes } from '@elliemae/ds-props-helpers';
11
11
  import { defaultProps } from '../ComboBoxCTX.js';
@@ -36,8 +36,18 @@ const useComboBox = props => {
36
36
  const toggleSelectionButtonRef = useRef(null);
37
37
  const pillGroupRef = useRef(null);
38
38
  const {
39
- selectedValues
40
- } = propsWithDefaults; // ---------------------------------------------------------------------------
39
+ selectedValues,
40
+ isMenuOpen,
41
+ onMenuChange
42
+ } = propsWithDefaults;
43
+ const menuState = useMemo(() => {
44
+ if (isMenuOpen !== undefined) return isMenuOpen;
45
+ return showPopover;
46
+ }, [showPopover, isMenuOpen]);
47
+ const setMenuState = useCallback((newState, reason, e) => {
48
+ if (onMenuChange !== undefined) onMenuChange(newState, reason, e);
49
+ setShowPopover(newState);
50
+ }, [onMenuChange]); // ---------------------------------------------------------------------------
41
51
  // Options with creatable option + filtered by selected
42
52
  // ---------------------------------------------------------------------------
43
53
 
@@ -66,17 +76,19 @@ const useComboBox = props => {
66
76
 
67
77
  const [focusOptionIdx, setFocusOptionIdx] = useState('');
68
78
  useEffect(() => {
69
- // we are updating the focus option only when we have focus on the input and
70
- // we are in the selected option view or we are typing to force first option always
79
+ // this code calculate the option to be focused when opening the menu
80
+ // when losing focus we remove the focused one
81
+ // when focus adquired again getFirstOption calculate the correct one
82
+ if (!hasFocus) setFocusOptionIdx('');
83
+
71
84
  if (hasFocus && (focusOptionIdx === '' || inputValue !== '' || showSelectedOptions)) {
72
85
  const focusedValue = getFirstOption(correctOptions, selectedValues, inputValue);
73
86
  setFocusOptionIdx(focusedValue);
74
87
  scrollOptionIntoView(focusedValue, {
75
88
  align: 'center'
76
89
  });
77
- }
90
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
78
91
 
79
- if (!hasFocus) setFocusOptionIdx(''); // eslint-disable-next-line react-hooks/exhaustive-deps
80
92
  }, [showPopover, hasFocus, correctOptions, selectedValues, inputValue]);
81
93
  useEffect(() => {
82
94
  if (!showPopover) {
@@ -89,7 +101,7 @@ const useComboBox = props => {
89
101
  filteredOptions: correctOptions
90
102
  }),
91
103
  virtualListHelpers,
92
- showPopover,
104
+ menuState,
93
105
  referenceElement,
94
106
  listRef,
95
107
  focusOptionIdx,
@@ -98,6 +110,7 @@ const useComboBox = props => {
98
110
  selectAllCheckboxRef,
99
111
  inputValue,
100
112
  setInputValue,
113
+ setMenuState,
101
114
  hasFocus,
102
115
  toggleSelectionButtonRef,
103
116
  pillGroupRef,
@@ -109,7 +122,7 @@ const useComboBox = props => {
109
122
  scrollOptionIntoView,
110
123
  setReferenceElement,
111
124
  setShowPopover
112
- }), [scrollOptionIntoView, correctOptions, hasFocus, propsWithDefaults, virtualListHelpers, inputValue, focusOptionIdx, wrapperListRef, showSelectedOptions, showPopover, pillGroupRef, referenceElement, selectedOptionsRef, controlsWrapperRef, selectAllCheckboxRef, toggleSelectionButtonRef, listRef]);
125
+ }), [scrollOptionIntoView, setMenuState, correctOptions, hasFocus, propsWithDefaults, virtualListHelpers, inputValue, focusOptionIdx, wrapperListRef, showSelectedOptions, menuState, pillGroupRef, referenceElement, selectedOptionsRef, controlsWrapperRef, selectAllCheckboxRef, toggleSelectionButtonRef, listRef]);
113
126
  return ctx;
114
127
  };
115
128
 
@@ -1 +1,3 @@
1
1
  export { DSComboBox, DSComboBox as DSComboBoxV3, DSComboBoxWithSchema } from './ComboBox.js';
2
+ export { DSComboBoxName, DSComboboxSlots } from './theming.js';
3
+ export { ComboboxDataTestid } from './ComboboxDataTestids.js';