@monolith-forensics/monolith-ui 1.0.12 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/Button/Button.tsx +382 -0
  2. package/Button/index.ts +2 -0
  3. package/{src/components/Calendar/Calendar.js → Calendar/Calendar.tsx} +104 -93
  4. package/{src/components/Calendar/CalendarStyles.js → Calendar/CalendarStyles.tsx} +26 -36
  5. package/{src/components/Calendar/calendarHelpers.js → Calendar/calendarHelpers.ts} +10 -8
  6. package/Calendar/index.ts +1 -0
  7. package/CheckBox/CheckBox.tsx +61 -0
  8. package/CheckBox/index.ts +1 -0
  9. package/{src/components/DateInput/DateInput.js → DateInput/DateInput.tsx} +227 -93
  10. package/DateInput/index.ts +1 -0
  11. package/DropDownMenu/DropDownMenu.tsx +402 -0
  12. package/DropDownMenu/index.ts +1 -0
  13. package/Error/Error.tsx +51 -0
  14. package/Error/index.ts +1 -0
  15. package/{src/components/FieldLabel → FieldLabel}/FieldLabel.tsx +25 -22
  16. package/{src/components/FileInputField/FileInputField.js → FileInputField/FileInputField.tsx} +23 -15
  17. package/FileInputField/index.ts +1 -0
  18. package/Flyout/Flyout.tsx +172 -0
  19. package/Flyout/FlyoutHeader.tsx +14 -0
  20. package/Flyout/FlyoutTitle.tsx +10 -0
  21. package/Flyout/index.ts +3 -0
  22. package/FormSection/FormSection.tsx +71 -0
  23. package/FormSection/index.ts +1 -0
  24. package/Grid/Grid.tsx +18 -0
  25. package/Grid/index.ts +1 -0
  26. package/IconButton/IconButton.tsx +27 -0
  27. package/IconButton/index.ts +1 -0
  28. package/{src/components/Input → Input}/Input.tsx +57 -34
  29. package/Modal/Modal.tsx +172 -0
  30. package/Modal/index.ts +1 -0
  31. package/{src/components/Pill → Pill}/Pill.tsx +41 -11
  32. package/SelectBox/SelectBox.tsx +745 -0
  33. package/SelectBox/index.ts +1 -0
  34. package/Switch/Switch.tsx +204 -0
  35. package/Switch/index.ts +1 -0
  36. package/TagBox/TagBox.tsx +694 -0
  37. package/TagBox/TagBoxStyles.tsx +116 -0
  38. package/TagBox/index.ts +1 -0
  39. package/{src/components/TextArea → TextArea}/TextArea.tsx +35 -13
  40. package/{src/components/TextAreaInput → TextAreaInput}/TextAreaInput.tsx +11 -13
  41. package/{src/components/TextInput → TextInput}/TextInput.tsx +11 -13
  42. package/Tooltip/Tooltip.tsx +68 -0
  43. package/Tooltip/index.ts +1 -0
  44. package/{src/components/ArrowButton → core}/ArrowButton.tsx +17 -20
  45. package/core/ClearButton.tsx +51 -0
  46. package/core/StyledContent.tsx +50 -0
  47. package/core/StyledFloatContainer.tsx +7 -0
  48. package/core/Types/Size.ts +3 -0
  49. package/core/Types/Variant.ts +10 -0
  50. package/core/index.ts +6 -0
  51. package/dist/Button/Button.d.ts +19 -0
  52. package/dist/Button/Button.js +332 -0
  53. package/dist/Button/index.d.ts +2 -0
  54. package/dist/Button/index.js +8 -0
  55. package/dist/Calendar/Calendar.d.ts +15 -0
  56. package/dist/Calendar/Calendar.js +232 -0
  57. package/dist/Calendar/CalendarStyles.d.ts +36 -0
  58. package/dist/Calendar/CalendarStyles.js +170 -0
  59. package/dist/Calendar/calendarHelpers.d.ts +53 -0
  60. package/dist/Calendar/calendarHelpers.js +181 -0
  61. package/dist/Calendar/index.d.ts +1 -0
  62. package/dist/Calendar/index.js +8 -0
  63. package/dist/CheckBox/CheckBox.d.ts +11 -0
  64. package/dist/CheckBox/CheckBox.js +34 -0
  65. package/dist/CheckBox/index.d.ts +1 -0
  66. package/dist/CheckBox/index.js +8 -0
  67. package/dist/DateInput/DateInput.d.ts +24 -0
  68. package/dist/DateInput/DateInput.js +511 -0
  69. package/dist/DateInput/index.d.ts +1 -0
  70. package/dist/DateInput/index.js +8 -0
  71. package/dist/DropDownMenu/DropDownMenu.d.ts +36 -0
  72. package/dist/DropDownMenu/DropDownMenu.js +212 -0
  73. package/dist/DropDownMenu/index.d.ts +1 -0
  74. package/dist/DropDownMenu/index.js +8 -0
  75. package/dist/Error/Error.d.ts +4 -0
  76. package/dist/Error/Error.js +38 -0
  77. package/dist/Error/index.d.ts +1 -0
  78. package/dist/Error/index.js +8 -0
  79. package/dist/FieldLabel/FieldLabel.d.ts +19 -0
  80. package/dist/FieldLabel/FieldLabel.js +119 -0
  81. package/dist/FieldLabel/index.d.ts +1 -0
  82. package/dist/FieldLabel/index.js +8 -0
  83. package/dist/FileInputField/FileInputField.d.ts +18 -0
  84. package/dist/FileInputField/FileInputField.js +116 -0
  85. package/dist/FileInputField/index.d.ts +1 -0
  86. package/dist/FileInputField/index.js +8 -0
  87. package/dist/Flyout/Flyout.d.ts +10 -0
  88. package/dist/Flyout/Flyout.js +111 -0
  89. package/dist/Flyout/FlyoutHeader.d.ts +5 -0
  90. package/dist/Flyout/FlyoutHeader.js +12 -0
  91. package/dist/Flyout/FlyoutTitle.d.ts +2 -0
  92. package/dist/Flyout/FlyoutTitle.js +13 -0
  93. package/dist/Flyout/index.d.ts +3 -0
  94. package/dist/Flyout/index.js +12 -0
  95. package/dist/FormSection/FormSection.d.ts +9 -0
  96. package/dist/FormSection/FormSection.js +51 -0
  97. package/dist/FormSection/index.d.ts +1 -0
  98. package/dist/FormSection/index.js +8 -0
  99. package/dist/Grid/Grid.d.ts +6 -0
  100. package/dist/Grid/Grid.js +15 -0
  101. package/dist/Grid/index.d.ts +1 -0
  102. package/dist/Grid/index.js +8 -0
  103. package/dist/IconButton/IconButton.d.ts +5 -0
  104. package/dist/IconButton/IconButton.js +30 -0
  105. package/dist/IconButton/index.d.ts +1 -0
  106. package/dist/IconButton/index.js +8 -0
  107. package/dist/Input/Input.d.ts +21 -0
  108. package/dist/Input/Input.js +148 -0
  109. package/dist/Input/index.d.ts +1 -0
  110. package/dist/Input/index.js +8 -0
  111. package/dist/Modal/Modal.d.ts +14 -0
  112. package/dist/Modal/Modal.js +134 -0
  113. package/dist/Modal/index.d.ts +1 -0
  114. package/dist/Modal/index.js +8 -0
  115. package/dist/Pill/Pill.d.ts +11 -0
  116. package/dist/Pill/Pill.js +146 -0
  117. package/dist/Pill/index.d.ts +1 -0
  118. package/dist/Pill/index.js +8 -0
  119. package/dist/SelectBox/SelectBox.d.ts +45 -0
  120. package/dist/SelectBox/SelectBox.js +469 -0
  121. package/dist/SelectBox/index.d.ts +1 -0
  122. package/dist/SelectBox/index.js +8 -0
  123. package/dist/Switch/Switch.d.ts +18 -0
  124. package/dist/Switch/Switch.js +157 -0
  125. package/dist/Switch/index.d.ts +1 -0
  126. package/dist/Switch/index.js +8 -0
  127. package/dist/TagBox/TagBox.d.ts +38 -0
  128. package/dist/TagBox/TagBox.js +440 -0
  129. package/dist/TagBox/TagBoxStyles.d.ts +11 -0
  130. package/dist/TagBox/TagBoxStyles.js +113 -0
  131. package/dist/TagBox/index.d.ts +1 -0
  132. package/dist/TagBox/index.js +8 -0
  133. package/dist/TextArea/TextArea.d.ts +16 -0
  134. package/dist/TextArea/TextArea.js +80 -0
  135. package/dist/TextArea/index.d.ts +1 -0
  136. package/dist/TextArea/index.js +8 -0
  137. package/dist/TextAreaInput/TextAreaInput.d.ts +12 -0
  138. package/dist/TextAreaInput/TextAreaInput.js +23 -0
  139. package/dist/TextAreaInput/index.d.ts +1 -0
  140. package/dist/TextAreaInput/index.js +8 -0
  141. package/dist/TextInput/TextInput.d.ts +12 -0
  142. package/dist/TextInput/TextInput.js +30 -0
  143. package/dist/TextInput/index.d.ts +1 -0
  144. package/dist/TextInput/index.js +8 -0
  145. package/dist/Tooltip/Tooltip.d.ts +12 -0
  146. package/dist/Tooltip/Tooltip.js +53 -0
  147. package/dist/Tooltip/index.d.ts +1 -0
  148. package/dist/Tooltip/index.js +8 -0
  149. package/dist/core/ArrowButton.d.ts +6 -0
  150. package/dist/core/ArrowButton.js +48 -0
  151. package/dist/core/ClearButton.d.ts +6 -0
  152. package/dist/core/ClearButton.js +48 -0
  153. package/dist/core/StyledContent.d.ts +7 -0
  154. package/dist/core/StyledContent.js +46 -0
  155. package/dist/core/StyledFloatContainer.d.ts +2 -0
  156. package/dist/core/StyledFloatContainer.js +10 -0
  157. package/dist/core/Types/Size.d.ts +2 -0
  158. package/dist/core/Types/Size.js +2 -0
  159. package/dist/core/Types/Variant.d.ts +2 -0
  160. package/dist/core/Types/Variant.js +2 -0
  161. package/dist/core/index.d.ts +6 -0
  162. package/dist/core/index.js +14 -0
  163. package/dist/index.d.ts +22 -0
  164. package/dist/index.js +51 -0
  165. package/index.ts +22 -0
  166. package/package.json +12 -20
  167. package/{src/components/theme → theme}/components.js +0 -2
  168. package/{src/components/theme → theme}/index.js +0 -1
  169. package/{src/components/theme → theme}/variants.js +0 -1
  170. package/tsconfig.json +11 -11
  171. package/.gitattributes +0 -2
  172. package/rollup.config.js +0 -10
  173. package/src/components/ArrowButton/index.tsx +0 -1
  174. package/src/components/Button/Button.tsx +0 -278
  175. package/src/components/Button/index.ts +0 -1
  176. package/src/components/SelectBox/SelectBox.js +0 -543
  177. package/src/components/TagBox/TagBox.js +0 -563
  178. package/src/components/index.ts +0 -7
  179. package/src/index.ts +0 -1
  180. /package/{src/components/FieldLabel → FieldLabel}/index.ts +0 -0
  181. /package/{src/components/Input/index.tsx → Input/index.ts} +0 -0
  182. /package/{src/components/Pill → Pill}/index.ts +0 -0
  183. /package/{src/components/TextArea → TextArea}/index.ts +0 -0
  184. /package/{src/components/TextAreaInput → TextAreaInput}/index.ts +0 -0
  185. /package/{src/components/TextInput/index.tsx → TextInput/index.ts} +0 -0
  186. /package/{src/components/core/index.js → core/MonolithThemeProvider.js} +0 -0
  187. /package/{src/components/theme → theme}/breakpoints.js +0 -0
  188. /package/{src/components/theme → theme}/shadows.js +0 -0
  189. /package/{src/components/theme → theme}/typography.js +0 -0
@@ -1,543 +0,0 @@
1
- import styled from "styled-components";
2
- import { useFloating, flip, offset } from "@floating-ui/react";
3
- import { useCallback, useEffect, useRef, useState } from "react";
4
- import { X } from "lucide-react";
5
- import FieldLabel from "../FieldLabel/FieldLabel.js";
6
- import ArrowButton from "../ArrowButton";
7
-
8
- export const StyledInputContainer = styled.div`
9
- position: relative;
10
- display: flex;
11
- flex-direction: row;
12
- border: none;
13
- outline: none;
14
- height: fit-content;
15
-
16
- width: ${({ width }) => {
17
- if (typeof width === "undefined") return "100%";
18
- if (width === null) return "100%";
19
- if (typeof width === "string") return width;
20
- if (typeof width === "number") return `${width}px`;
21
- }};
22
- `;
23
-
24
- const StyledInput = styled.input`
25
- pointer-events: all;
26
- outline: none;
27
-
28
- border-radius: 5px;
29
- transition: border 0.1s ease-in-out;
30
- border: 1px solid
31
- ${({ theme, variant }) => {
32
- switch (variant) {
33
- case "filled":
34
- return "transparent";
35
- case "outlined":
36
- return theme.palette.input.border;
37
- case "text":
38
- return "transparent";
39
- default:
40
- return theme.palette.input.border;
41
- }
42
- }};
43
- font-weight: 500;
44
- color: ${(props) => props.theme.palette.text.primary};
45
- font-size: ${({ size }) =>
46
- size === "xs"
47
- ? "12px"
48
- : size === "sm"
49
- ? "14px"
50
- : size === "md"
51
- ? "16px"
52
- : size === "lg"
53
- ? "18px"
54
- : size === "xl"
55
- ? "20px"
56
- : "12px"};
57
-
58
- width: 100%;
59
- height: ${({ size }) =>
60
- size === "xs"
61
- ? "26px"
62
- : size === "sm"
63
- ? "30px"
64
- : size === "md"
65
- ? "36px"
66
- : size === "lg"
67
- ? "42px"
68
- : size === "xl"
69
- ? "50px"
70
- : "26px"};
71
-
72
- padding: ${({ size }) =>
73
- size === "xs"
74
- ? "0px 8px"
75
- : size === "sm"
76
- ? "0px 10px"
77
- : size === "md"
78
- ? "0px 12px"
79
- : size === "lg"
80
- ? "0px 14px"
81
- : size === "xl"
82
- ? "0px 16px"
83
- : "0px 8px"};
84
-
85
- &[data-button-right="true"] {
86
- padding-right: 36px;
87
- }
88
-
89
- background-color: ${({ theme, variant }) => {
90
- switch (variant) {
91
- case "filled":
92
- return theme.palette.input.background;
93
- case "outlined":
94
- return theme.palette.input.background;
95
- case "text":
96
- return "transparent";
97
- default:
98
- return theme.palette.input.background;
99
- }
100
- }};
101
-
102
- &[readOnly] {
103
- cursor: pointer;
104
- }
105
-
106
- ::placeholder {
107
- font-size: ${({ size }) =>
108
- size === "xs"
109
- ? "10px"
110
- : size === "sm"
111
- ? "12px"
112
- : size === "md"
113
- ? "14px"
114
- : size === "lg"
115
- ? "16px"
116
- : size === "xl"
117
- ? "18px"
118
- : "10px"};
119
- }
120
-
121
- &:focus {
122
- border: 1px solid ${(props) => props.theme.palette.primary.main};
123
- }
124
- `;
125
-
126
- export const StyledFloatContainer = styled.div`
127
- z-index: 100000;
128
- `;
129
-
130
- export const StyledContent = styled.div`
131
- position: relative;
132
- display: flex;
133
- flex-direction: column;
134
- overflow-y: hidden;
135
- overflow-x: hidden;
136
-
137
- max-height: ${({ maxDropdownHeight }) =>
138
- Number.isInteger(maxDropdownHeight)
139
- ? `${maxDropdownHeight}px`
140
- : maxDropdownHeight || "250px"};
141
-
142
- background-color: ${(props) => props.theme.palette.background.default};
143
- background-color: ${({ theme, variant }) => {
144
- switch (variant) {
145
- case "filled":
146
- return theme.palette.input.background;
147
- case "outlined":
148
- return theme.palette.input.background;
149
- case "text":
150
- return "transparent";
151
- default:
152
- return theme.palette.input.background;
153
- }
154
- }};
155
-
156
- border-radius: 5px;
157
- border: 1px solid ${(props) => props.theme.palette.divider};
158
- padding: 5px;
159
- // box-shadow: 0px 10px 38px -10px rgba(22, 23, 24, 0.85),
160
- // 0px 10px 20px -15px rgba(22, 23, 24, 0.65);
161
- animation-duration: 400ms;
162
- animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
163
- will-change: transform, opacity;
164
-
165
- &[data-empty="true"] {
166
- display: none;
167
- }
168
- `;
169
-
170
- const StyledInnerItemContainer = styled.div`
171
- overflow-y: auto;
172
- `;
173
-
174
- const ActionMenu = styled.div``;
175
-
176
- const StyledItem = styled.div`
177
- color: ${(props) => props.theme.palette.text.primary};
178
- border-radius: 3px;
179
- display: flex;
180
- align-items: center;
181
- min-height: 25px;
182
- padding: 7px 10px;
183
- position: relative;
184
- user-select: none;
185
- outline: none;
186
-
187
- cursor: pointer;
188
-
189
- font-family: Arial, sans-serif;
190
- font-size: ${({ size }) =>
191
- size === "xs"
192
- ? "12px"
193
- : size === "sm"
194
- ? "14px"
195
- : size === "md"
196
- ? "16px"
197
- : size === "lg"
198
- ? "18px"
199
- : size === "xl"
200
- ? "20px"
201
- : "12px"};
202
-
203
- &[data-disabled] {
204
- color: ${(props) => props.theme.palette.text.secondary};
205
- pointer-events: "none";
206
- }
207
-
208
- &:hover {
209
- background-color: ${(props) => props.theme.palette.action.hover};
210
- color: ${(props) => props.theme.palette.text.primary};
211
- }
212
-
213
- &[data-selected="true"] {
214
- background-color: ${(props) => props.theme.palette.divider};
215
- color: ${(props) => props.theme.palette.text.primary};
216
- }
217
- `;
218
-
219
- const ClearIcon = styled(({ className, ...props }) => (
220
- <div className={className} {...props}>
221
- <X size={16} />
222
- </div>
223
- ))`
224
- color: ${(props) => props.theme.palette.text.secondary};
225
- transition: transform 0.2s ease-in-out;
226
- transform: rotate(0deg);
227
- will-change: transform;
228
-
229
- display: flex;
230
- flex-direction: column;
231
- align-items: center;
232
- justify-content: center;
233
- `;
234
-
235
- export const ClearButton = styled(({ className, ...props }) => (
236
- <button
237
- className={className}
238
- {...props}
239
- tabIndex={-1}
240
- data-default-btn={true}
241
- >
242
- <ClearIcon />
243
- </button>
244
- ))`
245
- position: absolute;
246
- right: 0;
247
- height: 100%;
248
- padding-inline: 10px;
249
- background: none;
250
- border: none;
251
- cursor: pointer;
252
- margin: 0;
253
- outline: none;
254
- `;
255
-
256
- const SelectBox = styled(
257
- ({
258
- className,
259
- data = [],
260
- placeholder = "Select...",
261
- arrow = true,
262
- onChange,
263
- onItemAdded,
264
- size = "xs",
265
- variant = "filled",
266
- width = "100%",
267
- allowCustomValue = false,
268
- searchable = false,
269
- clearable = false,
270
- label = null,
271
- description = null,
272
- required = false,
273
- error = false,
274
- renderOption,
275
- actionComponent,
276
- }) => {
277
- const [isOpen, setIsOpen] = useState(false);
278
- const [selected, setSelected] = useState(null);
279
- const [searchValue, setSearchValue] = useState("");
280
- const [customItems, setCustomItems] = useState([]);
281
- const inputRef = useRef(null);
282
-
283
- const isObjectArray = Object.keys(data?.[0] || {})?.includes("label");
284
-
285
- const filteredItems = data
286
- .concat(customItems) // Add custom items to the list
287
- .filter((item) =>
288
- isObjectArray
289
- ? item.label.toLowerCase().includes(searchValue.toLowerCase())
290
- : item.toLowerCase().includes(searchValue.toLowerCase())
291
- );
292
-
293
- const { refs, floatingStyles } = useFloating({
294
- open: isOpen,
295
- onOpenChange: setIsOpen,
296
- placement: "bottom-start",
297
- strategy: "absolute",
298
- // Handle collisions with the viewport
299
- middleware: [flip(), offset(5)],
300
- });
301
-
302
- const toggleOpen = () => {
303
- setIsOpen((prev) => {
304
- if (!prev) {
305
- inputRef.current.focus();
306
- }
307
- return !prev;
308
- });
309
- };
310
-
311
- const handleClear = (e) => {
312
- e.preventDefault();
313
- e.stopPropagation();
314
-
315
- inputRef.current.value = "";
316
- handleChangeSelection(null);
317
- setSelected(null);
318
- setSearchValue("");
319
- setIsOpen(false);
320
- };
321
-
322
- const handleItemClick = (event, item) => {
323
- inputRef.current.value = item?.label || item;
324
- handleChangeSelection(item);
325
- setIsOpen(false);
326
- };
327
-
328
- const handleChangeSelection = useCallback(
329
- (option) => {
330
- setSelected(option);
331
- onChange?.(option?.value || option, option);
332
- },
333
- [onChange, isObjectArray]
334
- );
335
-
336
- const handleAddItem = useCallback(
337
- (newItem) => {
338
- const isNewItem = data.every(
339
- (item) => item.label.toLowerCase() !== newItem.toLowerCase()
340
- );
341
- if (isNewItem) {
342
- const newValue = isObjectArray
343
- ? { label: newItem, value: newItem }
344
- : newItem;
345
- setCustomItems((prev) => {
346
- prev.push(newValue);
347
- return prev;
348
- });
349
- handleChangeSelection(newValue);
350
- onItemAdded?.(newValue);
351
- } else {
352
- const item = data.find((item) =>
353
- isObjectArray
354
- ? item.label.toLowerCase() === newItem.toLowerCase()
355
- : item.toLowerCase() === newItem.toLowerCase()
356
- );
357
- handleChangeSelection(item);
358
- }
359
- },
360
- [onItemAdded, isObjectArray]
361
- );
362
-
363
- const handleKeyDown = (e) => {
364
- const currentInputValue = inputRef.current.value;
365
-
366
- // Escape key
367
- if (e.key === "Escape") {
368
- refs?.reference?.current?.blur();
369
- setSearchValue("");
370
- setIsOpen(false);
371
- }
372
-
373
- // Enter key
374
- if (e.key === "Enter") {
375
- if (currentInputValue === "") {
376
- return;
377
- }
378
- if (allowCustomValue) {
379
- handleAddItem(currentInputValue);
380
- setSearchValue("");
381
- } else {
382
- const item = data.find((item) =>
383
- isObjectArray
384
- ? item.label.toLowerCase() === currentInputValue.toLowerCase()
385
- : item.toLowerCase() === currentInputValue.toLowerCase()
386
- );
387
- if (!item) {
388
- inputRef.current.value = "";
389
- handleChangeSelection(null);
390
- }
391
- }
392
-
393
- setIsOpen(false);
394
- }
395
-
396
- // Arrow down
397
- if (e.key === "ArrowDown") {
398
- e.preventDefault();
399
- setSelected((prev) => {
400
- let newItem = filteredItems[0]; // Loop back to the first item
401
- const index = filteredItems.findIndex((item) =>
402
- isObjectArray ? item.value === prev?.value : item === prev
403
- );
404
- if (index < filteredItems.length - 1) {
405
- newItem = filteredItems[index + 1];
406
- }
407
- inputRef.current.value = newItem.label;
408
- onChange?.(newItem?.value || newItem, newItem);
409
- return newItem;
410
- });
411
- }
412
-
413
- // Arrow up
414
- if (e.key === "ArrowUp") {
415
- e.preventDefault();
416
- setSelected((prev) => {
417
- let newItem = filteredItems[filteredItems.length - 1]; // Loop back to the last item
418
- const index = filteredItems.findIndex((item) =>
419
- isObjectArray ? item.value === prev?.value : item === prev
420
- );
421
- if (index > 0) {
422
- newItem = filteredItems[index - 1];
423
- }
424
- inputRef.current.value = newItem.label;
425
- onChange?.(newItem?.value || newItem, newItem);
426
- return newItem;
427
- });
428
- }
429
-
430
- // Tab key
431
- if (e.key === "Tab") {
432
- if (currentInputValue === "") {
433
- return;
434
- }
435
- if (allowCustomValue) {
436
- handleAddItem(currentInputValue);
437
- setSearchValue("");
438
- }
439
- setIsOpen(false);
440
- }
441
- };
442
-
443
- const handleOnChange = (e) => {
444
- // Simulate clear event when the input is changed to an empty string
445
- if (e.target.value === "") {
446
- handleClear(e);
447
- return;
448
- }
449
-
450
- setSearchValue(e.target.value);
451
- };
452
-
453
- // Close on outside click
454
- useEffect(() => {
455
- const close = (e) => {
456
- if (
457
- refs.floating.current && // Check if the floating element exists
458
- e.target !== refs.reference.current && // Check if the target is not the reference (input)
459
- !refs.reference.current.contains(e.target) && // Check if the target is not inside the reference (input)
460
- !refs.floating.current.contains(e.target) // Check if the target is not inside the floating element (content)
461
- ) {
462
- setIsOpen(false);
463
- }
464
- };
465
- document.addEventListener("click", close);
466
- return () => document.removeEventListener("click", close);
467
- }, [refs.floating]);
468
-
469
- const contentWidth =
470
- refs?.reference?.current?.getClientRects?.()?.[0]?.width || "100%";
471
-
472
- return (
473
- <div>
474
- {label && (
475
- <FieldLabel
476
- error={error}
477
- asterisk={required}
478
- size={size}
479
- description={description}
480
- >
481
- {label}
482
- </FieldLabel>
483
- )}
484
- <StyledInputContainer
485
- ref={refs.setReference}
486
- onClick={toggleOpen}
487
- size={size}
488
- variant={variant}
489
- width={width}
490
- onKeyDown={handleKeyDown}
491
- >
492
- <StyledInput
493
- ref={inputRef}
494
- onChange={handleOnChange}
495
- placeholder={placeholder}
496
- size={size}
497
- readOnly={!searchable}
498
- data-button-right={arrow || clearable}
499
- />
500
- {clearable && selected ? (
501
- <ClearButton onClick={handleClear} />
502
- ) : arrow ? (
503
- <ArrowButton />
504
- ) : null}
505
- </StyledInputContainer>
506
- {isOpen && (
507
- <StyledFloatContainer
508
- ref={refs.setFloating}
509
- style={floatingStyles}
510
- className="mfFloating"
511
- >
512
- <StyledContent
513
- className="mfFloatingContent"
514
- style={{ width: contentWidth, maxWidth: contentWidth }}
515
- variant={variant}
516
- data-empty={filteredItems.length === 0}
517
- >
518
- {actionComponent && <ActionMenu>{actionComponent}</ActionMenu>}
519
- <StyledInnerItemContainer>
520
- {filteredItems.map((item, index) => (
521
- <StyledItem
522
- key={index}
523
- className="mfFloatingItem"
524
- onClick={(e) => handleItemClick(e, item)}
525
- data-selected={selected?.value === (item?.value || item)}
526
- size={size}
527
- >
528
- {renderOption ? renderOption(item) : item?.label || item}
529
- </StyledItem>
530
- ))}
531
- </StyledInnerItemContainer>
532
- </StyledContent>
533
- </StyledFloatContainer>
534
- )}
535
- </div>
536
- );
537
- }
538
- )`
539
- position: relative;
540
- cursor: pointer;
541
- `;
542
-
543
- export default SelectBox;