@monolith-forensics/monolith-ui 1.0.7 → 1.0.9

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