@transferwise/components 0.0.0-experimental-bcfa03a → 0.0.0-experimental-3cdcd93

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 (197) hide show
  1. package/build/dateInput/DateInput.js +3 -6
  2. package/build/dateInput/DateInput.js.map +1 -1
  3. package/build/dateInput/DateInput.mjs +2 -5
  4. package/build/dateInput/DateInput.mjs.map +1 -1
  5. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js +3 -5
  6. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js.map +1 -1
  7. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs +1 -3
  8. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs.map +1 -1
  9. package/build/index.js +3 -5
  10. package/build/index.js.map +1 -1
  11. package/build/index.mjs +1 -3
  12. package/build/index.mjs.map +1 -1
  13. package/build/inputs/SelectInput.js +821 -0
  14. package/build/inputs/SelectInput.js.map +1 -0
  15. package/build/inputs/SelectInput.messages.js.map +1 -0
  16. package/build/inputs/SelectInput.messages.mjs.map +1 -0
  17. package/build/inputs/SelectInput.mjs +813 -0
  18. package/build/inputs/SelectInput.mjs.map +1 -0
  19. package/build/main.css +70 -65
  20. package/build/moneyInput/MoneyInput.js +2 -5
  21. package/build/moneyInput/MoneyInput.js.map +1 -1
  22. package/build/moneyInput/MoneyInput.mjs +1 -4
  23. package/build/moneyInput/MoneyInput.mjs.map +1 -1
  24. package/build/phoneNumberInput/PhoneNumberInput.js +2 -5
  25. package/build/phoneNumberInput/PhoneNumberInput.js.map +1 -1
  26. package/build/phoneNumberInput/PhoneNumberInput.mjs +1 -4
  27. package/build/phoneNumberInput/PhoneNumberInput.mjs.map +1 -1
  28. package/build/styles/inputs/{SelectInput/SelectInput.css → SelectInput.css} +70 -65
  29. package/build/styles/main.css +70 -65
  30. package/build/tabs/Tabs.js +14 -171
  31. package/build/tabs/Tabs.js.map +1 -1
  32. package/build/tabs/Tabs.mjs +16 -173
  33. package/build/tabs/Tabs.mjs.map +1 -1
  34. package/build/tabs/utils.js +0 -18
  35. package/build/tabs/utils.js.map +1 -1
  36. package/build/tabs/utils.mjs +1 -17
  37. package/build/tabs/utils.mjs.map +1 -1
  38. package/build/types/inputs/{SelectInput/SelectInput.types.d.ts → SelectInput.d.ts} +7 -10
  39. package/build/types/inputs/SelectInput.d.ts.map +1 -0
  40. package/build/types/inputs/SelectInput.messages.d.ts.map +1 -0
  41. package/build/types/tabs/Tabs.d.ts +2 -24
  42. package/build/types/tabs/Tabs.d.ts.map +1 -1
  43. package/build/types/tabs/utils.d.ts +0 -2
  44. package/build/types/tabs/utils.d.ts.map +1 -1
  45. package/package.json +3 -4
  46. package/src/inputs/{SelectInput/SelectInput.css → SelectInput.css} +70 -65
  47. package/src/inputs/{SelectInput/SelectInput.docs.mdx → SelectInput.docs.mdx} +1 -0
  48. package/src/inputs/SelectInput.less +219 -0
  49. package/src/inputs/{SelectInput/SelectInput.story.tsx → SelectInput.story.tsx} +7 -7
  50. package/src/inputs/SelectInput.tsx +1190 -0
  51. package/src/main.css +70 -65
  52. package/src/main.less +1 -1
  53. package/src/tabs/Tabs.story.tsx +1 -45
  54. package/src/tabs/Tabs.test.tsx +0 -22
  55. package/src/tabs/Tabs.tsx +23 -240
  56. package/src/tabs/utils.test.ts +0 -58
  57. package/src/tabs/utils.ts +0 -20
  58. package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.js +0 -26
  59. package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.js.map +0 -1
  60. package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.mjs +0 -24
  61. package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.mjs.map +0 -1
  62. package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.js +0 -54
  63. package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.js.map +0 -1
  64. package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.mjs +0 -52
  65. package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.mjs.map +0 -1
  66. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.js +0 -41
  67. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.js.map +0 -1
  68. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs +0 -38
  69. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs.map +0 -1
  70. package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.js +0 -50
  71. package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.js.map +0 -1
  72. package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.mjs +0 -48
  73. package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.mjs.map +0 -1
  74. package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.js +0 -45
  75. package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.js.map +0 -1
  76. package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.mjs +0 -41
  77. package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.mjs.map +0 -1
  78. package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.js +0 -50
  79. package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.js.map +0 -1
  80. package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.mjs +0 -48
  81. package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.mjs.map +0 -1
  82. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.js +0 -48
  83. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.js.map +0 -1
  84. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.mjs +0 -46
  85. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.mjs.map +0 -1
  86. package/build/inputs/SelectInput/Options/SelectInputOptions.js +0 -270
  87. package/build/inputs/SelectInput/Options/SelectInputOptions.js.map +0 -1
  88. package/build/inputs/SelectInput/Options/SelectInputOptions.mjs +0 -268
  89. package/build/inputs/SelectInput/Options/SelectInputOptions.mjs.map +0 -1
  90. package/build/inputs/SelectInput/SelectInput.constants.js +0 -6
  91. package/build/inputs/SelectInput/SelectInput.constants.js.map +0 -1
  92. package/build/inputs/SelectInput/SelectInput.constants.mjs +0 -4
  93. package/build/inputs/SelectInput/SelectInput.constants.mjs.map +0 -1
  94. package/build/inputs/SelectInput/SelectInput.helpers.js +0 -115
  95. package/build/inputs/SelectInput/SelectInput.helpers.js.map +0 -1
  96. package/build/inputs/SelectInput/SelectInput.helpers.mjs +0 -109
  97. package/build/inputs/SelectInput/SelectInput.helpers.mjs.map +0 -1
  98. package/build/inputs/SelectInput/SelectInput.js +0 -216
  99. package/build/inputs/SelectInput/SelectInput.js.map +0 -1
  100. package/build/inputs/SelectInput/SelectInput.messages.js.map +0 -1
  101. package/build/inputs/SelectInput/SelectInput.messages.mjs.map +0 -1
  102. package/build/inputs/SelectInput/SelectInput.mjs +0 -210
  103. package/build/inputs/SelectInput/SelectInput.mjs.map +0 -1
  104. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.js +0 -41
  105. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.js.map +0 -1
  106. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.mjs +0 -34
  107. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.mjs.map +0 -1
  108. package/build/styles/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.css +0 -17
  109. package/build/styles/inputs/SelectInput/OptionContent/SelectInputOptionContent.css +0 -37
  110. package/build/styles/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.css +0 -33
  111. package/build/styles/inputs/SelectInput/Options/ItemView/SelectInputItemView.css +0 -44
  112. package/build/styles/inputs/SelectInput/Options/SelectInputOptions.css +0 -125
  113. package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.d.ts +0 -5
  114. package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.d.ts.map +0 -1
  115. package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/index.d.ts +0 -2
  116. package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/index.d.ts.map +0 -1
  117. package/build/types/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.d.ts +0 -9
  118. package/build/types/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.d.ts.map +0 -1
  119. package/build/types/inputs/SelectInput/DefaultTrigger/index.d.ts +0 -2
  120. package/build/types/inputs/SelectInput/DefaultTrigger/index.d.ts.map +0 -1
  121. package/build/types/inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts +0 -9
  122. package/build/types/inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts.map +0 -1
  123. package/build/types/inputs/SelectInput/OptionContent/index.d.ts +0 -3
  124. package/build/types/inputs/SelectInput/OptionContent/index.d.ts.map +0 -1
  125. package/build/types/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.d.ts +0 -3
  126. package/build/types/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.d.ts.map +0 -1
  127. package/build/types/inputs/SelectInput/Options/GroupItemView/index.d.ts +0 -2
  128. package/build/types/inputs/SelectInput/Options/GroupItemView/index.d.ts.map +0 -1
  129. package/build/types/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.d.ts +0 -10
  130. package/build/types/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.d.ts.map +0 -1
  131. package/build/types/inputs/SelectInput/Options/ItemView/Option/index.d.ts +0 -2
  132. package/build/types/inputs/SelectInput/Options/ItemView/Option/index.d.ts.map +0 -1
  133. package/build/types/inputs/SelectInput/Options/ItemView/SelectInputItemView.d.ts +0 -3
  134. package/build/types/inputs/SelectInput/Options/ItemView/SelectInputItemView.d.ts.map +0 -1
  135. package/build/types/inputs/SelectInput/Options/ItemView/index.d.ts +0 -2
  136. package/build/types/inputs/SelectInput/Options/ItemView/index.d.ts.map +0 -1
  137. package/build/types/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.d.ts +0 -6
  138. package/build/types/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.d.ts.map +0 -1
  139. package/build/types/inputs/SelectInput/Options/OptionsContainer/index.d.ts +0 -2
  140. package/build/types/inputs/SelectInput/Options/OptionsContainer/index.d.ts.map +0 -1
  141. package/build/types/inputs/SelectInput/Options/SelectInputOptions.d.ts +0 -15
  142. package/build/types/inputs/SelectInput/Options/SelectInputOptions.d.ts.map +0 -1
  143. package/build/types/inputs/SelectInput/Options/index.d.ts +0 -2
  144. package/build/types/inputs/SelectInput/Options/index.d.ts.map +0 -1
  145. package/build/types/inputs/SelectInput/SelectInput.constants.d.ts +0 -2
  146. package/build/types/inputs/SelectInput/SelectInput.constants.d.ts.map +0 -1
  147. package/build/types/inputs/SelectInput/SelectInput.d.ts +0 -3
  148. package/build/types/inputs/SelectInput/SelectInput.d.ts.map +0 -1
  149. package/build/types/inputs/SelectInput/SelectInput.helpers.d.ts +0 -28
  150. package/build/types/inputs/SelectInput/SelectInput.helpers.d.ts.map +0 -1
  151. package/build/types/inputs/SelectInput/SelectInput.messages.d.ts.map +0 -1
  152. package/build/types/inputs/SelectInput/SelectInput.types.d.ts.map +0 -1
  153. package/build/types/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.d.ts +0 -15
  154. package/build/types/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.d.ts.map +0 -1
  155. package/build/types/inputs/SelectInput/TriggerButton/index.d.ts +0 -3
  156. package/build/types/inputs/SelectInput/TriggerButton/index.d.ts.map +0 -1
  157. package/build/types/inputs/SelectInput/index.d.ts +0 -5
  158. package/build/types/inputs/SelectInput/index.d.ts.map +0 -1
  159. package/src/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.tsx +0 -25
  160. package/src/inputs/SelectInput/DefaultTrigger/ClearButton/index.ts +0 -1
  161. package/src/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.css +0 -17
  162. package/src/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.less +0 -15
  163. package/src/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.tsx +0 -56
  164. package/src/inputs/SelectInput/DefaultTrigger/index.ts +0 -1
  165. package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.css +0 -37
  166. package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.less +0 -38
  167. package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.tsx +0 -67
  168. package/src/inputs/SelectInput/OptionContent/index.ts +0 -5
  169. package/src/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.tsx +0 -53
  170. package/src/inputs/SelectInput/Options/GroupItemView/index.ts +0 -1
  171. package/src/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.css +0 -33
  172. package/src/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.less +0 -32
  173. package/src/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.tsx +0 -51
  174. package/src/inputs/SelectInput/Options/ItemView/Option/index.ts +0 -5
  175. package/src/inputs/SelectInput/Options/ItemView/SelectInputItemView.css +0 -44
  176. package/src/inputs/SelectInput/Options/ItemView/SelectInputItemView.less +0 -14
  177. package/src/inputs/SelectInput/Options/ItemView/SelectInputItemView.tsx +0 -37
  178. package/src/inputs/SelectInput/Options/ItemView/index.ts +0 -1
  179. package/src/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.tsx +0 -55
  180. package/src/inputs/SelectInput/Options/OptionsContainer/index.ts +0 -1
  181. package/src/inputs/SelectInput/Options/SelectInputOptions.css +0 -125
  182. package/src/inputs/SelectInput/Options/SelectInputOptions.less +0 -78
  183. package/src/inputs/SelectInput/Options/SelectInputOptions.tsx +0 -372
  184. package/src/inputs/SelectInput/Options/index.ts +0 -1
  185. package/src/inputs/SelectInput/SelectInput.constants.ts +0 -1
  186. package/src/inputs/SelectInput/SelectInput.helpers.ts +0 -152
  187. package/src/inputs/SelectInput/SelectInput.less +0 -40
  188. package/src/inputs/SelectInput/SelectInput.test.tsx +0 -606
  189. package/src/inputs/SelectInput/SelectInput.tsx +0 -247
  190. package/src/inputs/SelectInput/SelectInput.types.ts +0 -127
  191. package/src/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.tsx +0 -39
  192. package/src/inputs/SelectInput/TriggerButton/index.ts +0 -5
  193. package/src/inputs/SelectInput/index.ts +0 -13
  194. /package/build/inputs/{SelectInput/SelectInput.messages.js → SelectInput.messages.js} +0 -0
  195. /package/build/inputs/{SelectInput/SelectInput.messages.mjs → SelectInput.messages.mjs} +0 -0
  196. /package/build/types/inputs/{SelectInput/SelectInput.messages.d.ts → SelectInput.messages.d.ts} +0 -0
  197. /package/src/inputs/{SelectInput/SelectInput.messages.ts → SelectInput.messages.ts} +0 -0
@@ -1,247 +0,0 @@
1
- import { Listbox as ListboxBase } from '@headlessui/react';
2
- import mergeProps from 'merge-props';
3
- import { useDeferredValue, useEffect, useRef, useState } from 'react';
4
-
5
- import { useEffectEvent } from '../../common/hooks/useEffectEvent';
6
- import { useScreenSize } from '../../common/hooks/useScreenSize';
7
- import { Breakpoint } from '../../common/propsValues/breakpoint';
8
-
9
- import { BottomSheet } from '../_BottomSheet';
10
- import { Popover } from '../_Popover';
11
- import { useInputAttributes } from '../contexts';
12
- import { searchableString } from './SelectInput.helpers';
13
- import { SelectInputTriggerButtonPropsContext } from './TriggerButton';
14
- import { SelectInputOptions } from './Options';
15
- import { SelectInputOptionContentWithinTriggerContext } from './OptionContent';
16
- import { SelectInputDefaultTrigger } from './DefaultTrigger';
17
- import type { SelectInputProps } from './SelectInput.types';
18
-
19
- const noop = () => {};
20
-
21
- export function SelectInput<T = string, M extends boolean = false>({
22
- id: idProp,
23
- parentId,
24
- name,
25
- multiple,
26
- placeholder,
27
- autocomplete,
28
- items,
29
- defaultValue,
30
- value: controlledValue,
31
- compareValues,
32
- renderValue = String,
33
- renderFooter,
34
- renderTrigger = SelectInputDefaultTrigger,
35
- filterable,
36
- filterPlaceholder,
37
- sortFilteredOptions,
38
- disabled,
39
- size = 'md',
40
- className,
41
- UNSAFE_triggerButtonProps,
42
- triggerRef: externalTriggerRef,
43
- onFilterChange = noop,
44
- onChange,
45
- onOpen,
46
- onClose,
47
- onClear,
48
- }: SelectInputProps<T, M>) {
49
- const inputAttributes = useInputAttributes({ nonLabelable: true });
50
- const id = idProp ?? inputAttributes.id;
51
-
52
- const [open, setOpen] = useState(false);
53
- const initialized = useRef(false);
54
- const handleClose = useEffectEvent(onClose ?? (() => {}));
55
- const handleOpen = useEffectEvent(onOpen ?? (() => {}));
56
-
57
- useEffect(() => {
58
- if (initialized.current) {
59
- if (open) {
60
- handleOpen?.();
61
- } else {
62
- handleClose?.();
63
- }
64
- } else {
65
- initialized.current = true;
66
- }
67
- }, [handleClose, handleOpen, open]);
68
-
69
- const [filterQuery, _setFilterQuery] = useState('');
70
- const deferredFilterQuery = useDeferredValue(filterQuery);
71
- const setFilterQuery = useEffectEvent((query: string) => {
72
- _setFilterQuery(query);
73
- if (query !== filterQuery) {
74
- onFilterChange({
75
- query,
76
- queryNormalized: query ? searchableString(query) : null,
77
- });
78
- }
79
- });
80
-
81
- const internalTriggerRef = useRef<HTMLButtonElement | null>(null);
82
-
83
- const screenSm = useScreenSize(Breakpoint.SMALL);
84
- const OptionsOverlay = screenSm ? Popover : BottomSheet;
85
-
86
- const searchInputRef = useRef<HTMLInputElement>(null);
87
- const listboxRef = useRef<HTMLDivElement>(null);
88
- const controllerRef = filterable ? searchInputRef : listboxRef;
89
-
90
- /**
91
- * Attempts to resolve the `listbox` label
92
- * @see https://storybook.wise.design/?path=/docs/forms-selectinput-accessibility--docs#labelling
93
- */
94
- const getListBoxLabelProps = (): {
95
- listBoxLabel?: string;
96
- listBoxLabelledBy?: string;
97
- } => {
98
- if (UNSAFE_triggerButtonProps?.['aria-label']) {
99
- return {
100
- listBoxLabel: UNSAFE_triggerButtonProps['aria-label'],
101
- };
102
- }
103
-
104
- if (UNSAFE_triggerButtonProps?.['aria-labelledby']) {
105
- return {
106
- listBoxLabelledBy: UNSAFE_triggerButtonProps['aria-labelledby'],
107
- };
108
- }
109
-
110
- if (inputAttributes['aria-labelledby']) {
111
- return {
112
- listBoxLabelledBy: inputAttributes['aria-labelledby'],
113
- };
114
- }
115
-
116
- return {};
117
- };
118
-
119
- return (
120
- <ListboxBase
121
- name={name}
122
- multiple={multiple}
123
- defaultValue={defaultValue as M extends true ? T[] : T}
124
- value={controlledValue as M extends true ? T[] : T}
125
- by={compareValues}
126
- disabled={disabled}
127
- onChange={
128
- ((value) => {
129
- if (!multiple) {
130
- setOpen(false);
131
- }
132
- onChange?.(value);
133
- }) satisfies SelectInputProps<T, M>['onChange']
134
- }
135
- >
136
- {({ disabled: uiDisabled, value }) => {
137
- const placeholderShown =
138
- multiple && Array.isArray(value) ? value.length === 0 : value == null;
139
- return (
140
- <OptionsOverlay
141
- placement="bottom-start"
142
- open={open}
143
- renderTrigger={({ ref, getInteractionProps }) => (
144
- <SelectInputTriggerButtonPropsContext.Provider
145
- // eslint-disable-next-line react/jsx-no-constructed-context-values
146
- value={{
147
- ref: (node) => {
148
- ref(node);
149
- if (externalTriggerRef) {
150
- // eslint-disable-next-line no-param-reassign
151
- externalTriggerRef.current = node;
152
- } else {
153
- internalTriggerRef.current = node;
154
- }
155
- },
156
- ...inputAttributes,
157
- ...UNSAFE_triggerButtonProps,
158
- id,
159
- ...mergeProps(
160
- {
161
- onClick: () => {
162
- setOpen((prev) => !prev);
163
- },
164
- onKeyDown: (event: React.KeyboardEvent) => {
165
- if (
166
- event.key === ' ' ||
167
- event.key === 'Enter' ||
168
- event.key === 'ArrowDown' ||
169
- event.key === 'ArrowUp'
170
- ) {
171
- setOpen((prev) => !prev);
172
- }
173
- },
174
- },
175
- getInteractionProps(),
176
- ),
177
- }}
178
- >
179
- {renderTrigger({
180
- content: !placeholderShown ? (
181
- <SelectInputOptionContentWithinTriggerContext.Provider value>
182
- {multiple && Array.isArray(value)
183
- ? (value as readonly NonNullable<T>[])
184
- .map((option) => renderValue(option, true))
185
- .filter((node) => node != null)
186
- .join(', ')
187
- : renderValue(value as NonNullable<T>, true)}
188
- </SelectInputOptionContentWithinTriggerContext.Provider>
189
- ) : (
190
- placeholder
191
- ),
192
- placeholderShown,
193
- clear:
194
- onClear != null
195
- ? () => {
196
- onClear();
197
- (externalTriggerRef?.current ?? internalTriggerRef.current)?.focus({
198
- preventScroll: true,
199
- });
200
- }
201
- : undefined,
202
- disabled: uiDisabled,
203
- size,
204
- className,
205
- })}
206
- </SelectInputTriggerButtonPropsContext.Provider>
207
- )}
208
- initialFocusRef={controllerRef}
209
- size={filterable ? 'lg' : 'md'}
210
- padding="none"
211
- onClose={() => {
212
- setOpen(false);
213
- }}
214
- onCloseEnd={() => {
215
- setFilterQuery('');
216
- }}
217
- >
218
- <SelectInputOptions
219
- id={id ? `${id}Search` : undefined}
220
- parentId={parentId}
221
- items={items}
222
- compareValues={compareValues}
223
- renderValue={renderValue}
224
- renderFooter={renderFooter}
225
- filterable={filterable}
226
- filterPlaceholder={filterPlaceholder}
227
- sortFilteredOptions={sortFilteredOptions}
228
- searchInputRef={searchInputRef}
229
- listboxRef={listboxRef}
230
- filterQuery={deferredFilterQuery}
231
- autocomplete={autocomplete}
232
- name={name}
233
- onFilterChange={setFilterQuery}
234
- onAutocompleteSelect={(matchedValue) => {
235
- onChange?.(matchedValue as M extends true ? T[] : T);
236
- if (!multiple) {
237
- setOpen(false);
238
- }
239
- }}
240
- {...getListBoxLabelProps()}
241
- />
242
- </OptionsOverlay>
243
- );
244
- }}
245
- </ListboxBase>
246
- );
247
- }
@@ -1,127 +0,0 @@
1
- import { ReactNode } from 'react';
2
-
3
- import { Merge } from '../../utils';
4
- import { ButtonProps } from '../../button/Button.types';
5
- import { WithInputAttributesProps } from '../contexts';
6
-
7
- export interface SelectInputOptionItem<T = string> {
8
- type: 'option';
9
- value: T;
10
- filterMatchers?: readonly string[];
11
- disabled?: boolean;
12
- }
13
-
14
- export interface SelectInputGroupItem<T = string> {
15
- type: 'group';
16
- label: ReactNode;
17
- options: readonly SelectInputOptionItem<T>[];
18
- action?: {
19
- label: string;
20
- onClick: ButtonProps['onClick'];
21
- };
22
- }
23
-
24
- export interface SelectInputSeparatorItem {
25
- type: 'separator';
26
- }
27
-
28
- export type SelectInputItem<T = string> =
29
- | SelectInputOptionItem<T>
30
- | SelectInputGroupItem<T>
31
- | SelectInputSeparatorItem;
32
-
33
- export interface SelectInputProps<T = string, M extends boolean = false> {
34
- id?: string;
35
- /**
36
- * Sets the `data-wds-parent` attribute on the listbox container, which is needed for complex components like DateInput to correctly manage event handling.
37
- * @internal
38
- */
39
- parentId?: string;
40
- name?: string;
41
- multiple?: M;
42
- placeholder?: string;
43
- items: readonly SelectInputItem<NonNullable<T>>[];
44
- /**
45
- * Enables browser autocomplete integration through the search input.
46
- * Accepts standard HTML autocomplete values (e.g., "country-name", "address-level1").
47
- *
48
- * Requires `filterable={true}` to enable the search input.
49
- *
50
- * @example
51
- * <SelectInput
52
- * name="country"
53
- * autocomplete="country-name"
54
- * filterable={true}
55
- * items={[{
56
- * type: 'option',
57
- * value: 'GB',
58
- * filterMatchers: ['United Kingdom', 'UK']
59
- * }]}
60
- * />
61
- */
62
- autocomplete?: string;
63
- defaultValue?: M extends true ? readonly T[] : T;
64
- value?: M extends true ? readonly T[] : T;
65
- compareValues?:
66
- | (keyof NonNullable<T> & string)
67
- | ((a: T | undefined, b: T | undefined) => boolean);
68
- renderValue?: (value: NonNullable<T>, withinTrigger: boolean) => React.ReactNode;
69
- renderFooter?: (args: {
70
- resultsEmpty: boolean;
71
- queryNormalized: string | null | undefined;
72
- }) => React.ReactNode;
73
- renderTrigger?: (args: {
74
- content: React.ReactNode;
75
- placeholderShown: boolean;
76
- clear: (() => void) | undefined;
77
- disabled: boolean;
78
- size: 'sm' | 'md' | 'lg';
79
- className: string | undefined;
80
- }) => React.ReactNode;
81
- filterable?: boolean;
82
- filterPlaceholder?: string;
83
- sortFilteredOptions?: (
84
- a: SelectInputOptionItem<NonNullable<T>>,
85
- b: SelectInputOptionItem<NonNullable<T>>,
86
- searchQuery: string,
87
- ) => number;
88
- disabled?: boolean;
89
- size?: 'sm' | 'md' | 'lg';
90
- className?: string;
91
- UNSAFE_triggerButtonProps?: WithInputAttributesProps['inputAttributes'] & {
92
- 'aria-label'?: string;
93
- };
94
- /** Ref to the select trigger button element. */
95
- triggerRef?: React.MutableRefObject<HTMLButtonElement | null>;
96
- onFilterChange?: (args: { query: string; queryNormalized: string | null }) => void;
97
- onChange?: (value: M extends true ? T[] : T) => void;
98
- onOpen?: () => void;
99
- onClose?: () => void;
100
- onClear?: () => void;
101
- }
102
-
103
- type SelectInputTriggerButtonElementType = 'button' | React.ComponentType;
104
-
105
- export type SelectInputTriggerButtonProps<
106
- T extends SelectInputTriggerButtonElementType = 'button',
107
- > = Merge<React.ComponentPropsWithoutRef<T>, { as?: T }>;
108
-
109
- export interface SelectInputOptionContentProps {
110
- title: string;
111
- note?: string;
112
- description?: string;
113
- icon?: React.ReactNode;
114
- }
115
-
116
- export interface SelectInputItemViewProps<
117
- T = string,
118
- I extends SelectInputItem<T | undefined> = SelectInputItem<T | undefined>,
119
- > extends Required<Pick<SelectInputProps<T>, 'renderValue'>> {
120
- item: I;
121
- needle: string | null | undefined;
122
- }
123
-
124
- export interface SelectInputGroupItemViewProps<T = string> extends SelectInputItemViewProps<
125
- T,
126
- SelectInputGroupItem<T | undefined>
127
- > {}
@@ -1,39 +0,0 @@
1
- import { useContext, createContext } from 'react';
2
- import { ListboxButton } from '@headlessui/react';
3
- import mergeProps from 'merge-props';
4
-
5
- import { PolymorphicWithOverrides } from '../../../common/polymorphicWithOverrides/PolymorphicWithOverrides';
6
- import { Merge } from '../../../utils';
7
-
8
- export const SelectInputTriggerButtonPropsContext = createContext<{
9
- ref?: React.ForwardedRef<HTMLButtonElement | null>;
10
- id?: string;
11
- onClick?: (event: React.MouseEvent) => void;
12
- onKeyDown?: (event: React.KeyboardEvent) => void;
13
- [key: string]: unknown;
14
- }>({});
15
-
16
- type SelectInputTriggerButtonElementType = 'button' | React.ComponentType;
17
-
18
- export type SelectInputTriggerButtonProps<
19
- T extends SelectInputTriggerButtonElementType = 'button',
20
- > = Merge<React.ComponentPropsWithoutRef<T>, { as?: T }>;
21
-
22
- export function SelectInputTriggerButton<T extends SelectInputTriggerButtonElementType = 'button'>({
23
- as = 'button' as T,
24
- ...restProps
25
- }: SelectInputTriggerButtonProps<T>) {
26
- const { ref, onClick, onKeyDown, ...interactionProps } = useContext(
27
- SelectInputTriggerButtonPropsContext,
28
- );
29
-
30
- return (
31
- <ListboxButton
32
- ref={ref}
33
- as={PolymorphicWithOverrides}
34
- role="combobox"
35
- __overrides={{ as, ...interactionProps }}
36
- {...mergeProps({ onClick, onKeyDown }, restProps)}
37
- />
38
- );
39
- }
@@ -1,5 +0,0 @@
1
- export {
2
- SelectInputTriggerButton,
3
- SelectInputTriggerButtonPropsContext,
4
- } from './SelectInputTriggerButton';
5
- export type { SelectInputTriggerButtonProps } from './SelectInputTriggerButton';
@@ -1,13 +0,0 @@
1
- export { SelectInput } from './SelectInput';
2
- export { SelectInputOptionContent } from './OptionContent';
3
- export { SelectInputTriggerButton } from './TriggerButton';
4
-
5
- export type {
6
- SelectInputGroupItem,
7
- SelectInputItem,
8
- SelectInputOptionContentProps,
9
- SelectInputOptionItem,
10
- SelectInputProps,
11
- SelectInputSeparatorItem,
12
- SelectInputTriggerButtonProps,
13
- } from './SelectInput.types';