no-frills-ui 0.0.14-alpha.1 → 0.0.14-alpha.11
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.
- package/README.md +28 -22
- package/dist/index.js +3418 -2772
- package/dist/index.js.map +1 -1
- package/lib-esm/components/Accordion/Accordion.d.ts +11 -16
- package/lib-esm/components/Accordion/Accordion.js +25 -29
- package/lib-esm/components/Accordion/Accordion.js.map +1 -1
- package/lib-esm/components/Accordion/AccordionStep.d.ts +22 -22
- package/lib-esm/components/Accordion/AccordionStep.js +111 -109
- package/lib-esm/components/Accordion/AccordionStep.js.map +1 -1
- package/lib-esm/components/Badge/Badge.d.ts +13 -16
- package/lib-esm/components/Badge/Badge.js +31 -51
- package/lib-esm/components/Badge/Badge.js.map +1 -1
- package/lib-esm/components/Button/ActionButton.d.ts +9 -5
- package/lib-esm/components/Button/ActionButton.js +18 -38
- package/lib-esm/components/Button/ActionButton.js.map +1 -1
- package/lib-esm/components/Button/Button.d.ts +9 -5
- package/lib-esm/components/Button/Button.js +18 -40
- package/lib-esm/components/Button/Button.js.map +1 -1
- package/lib-esm/components/Button/IconButton.d.ts +9 -5
- package/lib-esm/components/Button/IconButton.js +18 -42
- package/lib-esm/components/Button/IconButton.js.map +1 -1
- package/lib-esm/components/Button/LinkButton.d.ts +9 -5
- package/lib-esm/components/Button/LinkButton.js +18 -32
- package/lib-esm/components/Button/LinkButton.js.map +1 -1
- package/lib-esm/components/Button/RaisedButton.d.ts +9 -5
- package/lib-esm/components/Button/RaisedButton.js +18 -46
- package/lib-esm/components/Button/RaisedButton.js.map +1 -1
- package/lib-esm/components/Card/Card.d.ts +4 -6
- package/lib-esm/components/Card/Card.js +18 -13
- package/lib-esm/components/Card/Card.js.map +1 -1
- package/lib-esm/components/Chip/Chip.d.ts +6 -3
- package/lib-esm/components/Chip/Chip.js +44 -43
- package/lib-esm/components/Chip/Chip.js.map +1 -1
- package/lib-esm/components/ChipInput/ChipInput.d.ts +28 -30
- package/lib-esm/components/ChipInput/ChipInput.js +121 -139
- package/lib-esm/components/ChipInput/ChipInput.js.map +1 -1
- package/lib-esm/components/Dialog/AlertDialog.d.ts +11 -12
- package/lib-esm/components/Dialog/AlertDialog.js +44 -28
- package/lib-esm/components/Dialog/AlertDialog.js.map +1 -1
- package/lib-esm/components/Dialog/ConfirmDialog.d.ts +13 -14
- package/lib-esm/components/Dialog/ConfirmDialog.js +49 -33
- package/lib-esm/components/Dialog/ConfirmDialog.js.map +1 -1
- package/lib-esm/components/Dialog/Dialog.d.ts +40 -18
- package/lib-esm/components/Dialog/Dialog.js +125 -70
- package/lib-esm/components/Dialog/Dialog.js.map +1 -1
- package/lib-esm/components/Dialog/PromptDialog.d.ts +18 -19
- package/lib-esm/components/Dialog/PromptDialog.js +78 -49
- package/lib-esm/components/Dialog/PromptDialog.js.map +1 -1
- package/lib-esm/components/DragAndDrop/DragAndDrop.d.ts +43 -41
- package/lib-esm/components/DragAndDrop/DragAndDrop.js +104 -31
- package/lib-esm/components/DragAndDrop/DragAndDrop.js.map +1 -1
- package/lib-esm/components/DragAndDrop/DragItem.d.ts +5 -1
- package/lib-esm/components/DragAndDrop/DragItem.js +171 -92
- package/lib-esm/components/DragAndDrop/DragItem.js.map +1 -1
- package/lib-esm/components/DragAndDrop/types.d.ts +22 -3
- package/lib-esm/components/DragAndDrop/types.js +9 -6
- package/lib-esm/components/DragAndDrop/types.js.map +1 -1
- package/lib-esm/components/Drawer/Drawer.d.ts +86 -22
- package/lib-esm/components/Drawer/Drawer.js +176 -97
- package/lib-esm/components/Drawer/Drawer.js.map +1 -1
- package/lib-esm/components/Drawer/index.d.ts +1 -1
- package/lib-esm/components/Groups/Group.d.ts +5 -8
- package/lib-esm/components/Groups/Group.js +34 -79
- package/lib-esm/components/Groups/Group.js.map +1 -1
- package/lib-esm/components/Groups/GroupLabel.js +8 -17
- package/lib-esm/components/Groups/GroupLabel.js.map +1 -1
- package/lib-esm/components/Input/Checkbox.d.ts +12 -15
- package/lib-esm/components/Input/Checkbox.js +51 -118
- package/lib-esm/components/Input/Checkbox.js.map +1 -1
- package/lib-esm/components/Input/Dropdown.d.ts +11 -12
- package/lib-esm/components/Input/Dropdown.js +133 -52
- package/lib-esm/components/Input/Dropdown.js.map +1 -1
- package/lib-esm/components/Input/Input.d.ts +3 -3
- package/lib-esm/components/Input/Input.js +61 -109
- package/lib-esm/components/Input/Input.js.map +1 -1
- package/lib-esm/components/Input/Radio.d.ts +4 -8
- package/lib-esm/components/Input/Radio.js +35 -79
- package/lib-esm/components/Input/Radio.js.map +1 -1
- package/lib-esm/components/Input/RadioButton.d.ts +4 -8
- package/lib-esm/components/Input/RadioButton.js +34 -71
- package/lib-esm/components/Input/RadioButton.js.map +1 -1
- package/lib-esm/components/Input/Select.d.ts +6 -13
- package/lib-esm/components/Input/Select.js +75 -122
- package/lib-esm/components/Input/Select.js.map +1 -1
- package/lib-esm/components/Input/TextArea.d.ts +6 -13
- package/lib-esm/components/Input/TextArea.js +64 -108
- package/lib-esm/components/Input/TextArea.js.map +1 -1
- package/lib-esm/components/Input/Toggle.d.ts +4 -9
- package/lib-esm/components/Input/Toggle.js +31 -80
- package/lib-esm/components/Input/Toggle.js.map +1 -1
- package/lib-esm/components/Menu/Menu.d.ts +8 -6
- package/lib-esm/components/Menu/Menu.js +116 -31
- package/lib-esm/components/Menu/Menu.js.map +1 -1
- package/lib-esm/components/Menu/MenuContext.d.ts +11 -5
- package/lib-esm/components/Menu/MenuContext.js +6 -2
- package/lib-esm/components/Menu/MenuContext.js.map +1 -1
- package/lib-esm/components/Menu/MenuItem.d.ts +7 -4
- package/lib-esm/components/Menu/MenuItem.js +46 -47
- package/lib-esm/components/Menu/MenuItem.js.map +1 -1
- package/lib-esm/components/Modal/Modal.d.ts +75 -16
- package/lib-esm/components/Modal/Modal.js +146 -51
- package/lib-esm/components/Modal/Modal.js.map +1 -1
- package/lib-esm/components/Notification/Notification.d.ts +46 -39
- package/lib-esm/components/Notification/Notification.js +80 -87
- package/lib-esm/components/Notification/Notification.js.map +1 -1
- package/lib-esm/components/Notification/NotificationManager.d.ts +19 -5
- package/lib-esm/components/Notification/NotificationManager.js +177 -79
- package/lib-esm/components/Notification/NotificationManager.js.map +1 -1
- package/lib-esm/components/Notification/style.d.ts +6 -3
- package/lib-esm/components/Notification/style.js +64 -140
- package/lib-esm/components/Notification/style.js.map +1 -1
- package/lib-esm/components/Notification/types.d.ts +2 -0
- package/lib-esm/components/Notification/types.js +9 -10
- package/lib-esm/components/Notification/types.js.map +1 -1
- package/lib-esm/components/Popover/Popover.d.ts +21 -20
- package/lib-esm/components/Popover/Popover.js +159 -126
- package/lib-esm/components/Popover/Popover.js.map +1 -1
- package/lib-esm/components/Spinner/Spinner.d.ts +14 -12
- package/lib-esm/components/Spinner/Spinner.js +22 -27
- package/lib-esm/components/Spinner/Spinner.js.map +1 -1
- package/lib-esm/components/Stepper/Step.d.ts +15 -12
- package/lib-esm/components/Stepper/Step.js +18 -25
- package/lib-esm/components/Stepper/Step.js.map +1 -1
- package/lib-esm/components/Stepper/Stepper.d.ts +11 -17
- package/lib-esm/components/Stepper/Stepper.js +104 -102
- package/lib-esm/components/Stepper/Stepper.js.map +1 -1
- package/lib-esm/components/Tabs/Tab.d.ts +10 -16
- package/lib-esm/components/Tabs/Tab.js +9 -15
- package/lib-esm/components/Tabs/Tab.js.map +1 -1
- package/lib-esm/components/Tabs/Tabs.d.ts +11 -22
- package/lib-esm/components/Tabs/Tabs.js +96 -55
- package/lib-esm/components/Tabs/Tabs.js.map +1 -1
- package/lib-esm/components/Toast/Toast.d.ts +34 -7
- package/lib-esm/components/Toast/Toast.js +200 -109
- package/lib-esm/components/Toast/Toast.js.map +1 -1
- package/lib-esm/components/Toast/ToastStory.d.ts +21 -24
- package/lib-esm/components/Tooltip/Tooltip.d.ts +11 -14
- package/lib-esm/components/Tooltip/Tooltip.js +52 -67
- package/lib-esm/components/Tooltip/Tooltip.js.map +1 -1
- package/lib-esm/components/index.d.ts +1 -0
- package/lib-esm/icons/CheckCircle.d.ts +1 -1
- package/lib-esm/icons/CheckCircle.js +22 -4
- package/lib-esm/icons/CheckCircle.js.map +1 -1
- package/lib-esm/icons/Close.d.ts +1 -1
- package/lib-esm/icons/Close.js +22 -4
- package/lib-esm/icons/Close.js.map +1 -1
- package/lib-esm/icons/DragIndicator.d.ts +1 -1
- package/lib-esm/icons/DragIndicator.js +22 -4
- package/lib-esm/icons/DragIndicator.js.map +1 -1
- package/lib-esm/icons/ErrorOutline.d.ts +1 -1
- package/lib-esm/icons/ErrorOutline.js +16 -4
- package/lib-esm/icons/ErrorOutline.js.map +1 -1
- package/lib-esm/icons/ExpandMore.d.ts +1 -1
- package/lib-esm/icons/ExpandMore.js +22 -4
- package/lib-esm/icons/ExpandMore.js.map +1 -1
- package/lib-esm/icons/FiberManualRecord.d.ts +1 -1
- package/lib-esm/icons/FiberManualRecord.js +24 -4
- package/lib-esm/icons/FiberManualRecord.js.map +1 -1
- package/lib-esm/icons/Info.d.ts +1 -1
- package/lib-esm/icons/Info.js +22 -4
- package/lib-esm/icons/Info.js.map +1 -1
- package/lib-esm/icons/ReportProblem.d.ts +1 -1
- package/lib-esm/icons/ReportProblem.js +22 -4
- package/lib-esm/icons/ReportProblem.js.map +1 -1
- package/lib-esm/index.js +43 -2
- package/lib-esm/index.js.map +1 -1
- package/lib-esm/shared/LayerManager.d.ts +34 -4
- package/lib-esm/shared/LayerManager.js +248 -114
- package/lib-esm/shared/LayerManager.js.map +1 -1
- package/lib-esm/shared/constants.d.ts +58 -27
- package/lib-esm/shared/constants.js +62 -26
- package/lib-esm/shared/constants.js.map +1 -1
- package/lib-esm/shared/styles.d.ts +1 -1
- package/lib-esm/shared/styles.js +21 -24
- package/lib-esm/shared/styles.js.map +1 -1
- package/package.json +130 -74
- package/lib-esm/components/Accordion/index.js +0 -3
- package/lib-esm/components/Accordion/index.js.map +0 -1
- package/lib-esm/components/Badge/index.js +0 -2
- package/lib-esm/components/Badge/index.js.map +0 -1
- package/lib-esm/components/Button/index.js +0 -6
- package/lib-esm/components/Button/index.js.map +0 -1
- package/lib-esm/components/Card/index.js +0 -3
- package/lib-esm/components/Card/index.js.map +0 -1
- package/lib-esm/components/Chip/index.js +0 -2
- package/lib-esm/components/Chip/index.js.map +0 -1
- package/lib-esm/components/ChipInput/index.js +0 -2
- package/lib-esm/components/ChipInput/index.js.map +0 -1
- package/lib-esm/components/Dialog/index.js +0 -5
- package/lib-esm/components/Dialog/index.js.map +0 -1
- package/lib-esm/components/DragAndDrop/index.js +0 -3
- package/lib-esm/components/DragAndDrop/index.js.map +0 -1
- package/lib-esm/components/Drawer/index.js +0 -2
- package/lib-esm/components/Drawer/index.js.map +0 -1
- package/lib-esm/components/Groups/index.js +0 -3
- package/lib-esm/components/Groups/index.js.map +0 -1
- package/lib-esm/components/Input/index.js +0 -9
- package/lib-esm/components/Input/index.js.map +0 -1
- package/lib-esm/components/Menu/index.js +0 -3
- package/lib-esm/components/Menu/index.js.map +0 -1
- package/lib-esm/components/Modal/index.js +0 -2
- package/lib-esm/components/Modal/index.js.map +0 -1
- package/lib-esm/components/Notification/index.js +0 -3
- package/lib-esm/components/Notification/index.js.map +0 -1
- package/lib-esm/components/Popover/index.js +0 -2
- package/lib-esm/components/Popover/index.js.map +0 -1
- package/lib-esm/components/Spinner/index.js +0 -2
- package/lib-esm/components/Spinner/index.js.map +0 -1
- package/lib-esm/components/Stepper/index.js +0 -4
- package/lib-esm/components/Stepper/index.js.map +0 -1
- package/lib-esm/components/Tabs/index.js +0 -3
- package/lib-esm/components/Tabs/index.js.map +0 -1
- package/lib-esm/components/Toast/ToastStory.js +0 -35
- package/lib-esm/components/Toast/ToastStory.js.map +0 -1
- package/lib-esm/components/Toast/index.js +0 -2
- package/lib-esm/components/Toast/index.js.map +0 -1
- package/lib-esm/components/Tooltip/index.js +0 -2
- package/lib-esm/components/Tooltip/index.js.map +0 -1
- package/lib-esm/components/index.js +0 -20
- package/lib-esm/components/index.js.map +0 -1
- package/lib-esm/icons/index.js +0 -9
- package/lib-esm/icons/index.js.map +0 -1
|
@@ -1,121 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useCallback } from 'react';
|
|
3
|
-
import PropTypes from 'prop-types';
|
|
1
|
+
import { jsxs, jsx } from '@emotion/react/jsx-runtime';
|
|
2
|
+
import React, { useCallback } from 'react';
|
|
4
3
|
import styled from '@emotion/styled';
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
content: '';
|
|
32
|
-
width: 3px;
|
|
33
|
-
height: 10px;
|
|
34
|
-
border-right: 2px solid #fff;
|
|
35
|
-
border-bottom: 2px solid #fff;
|
|
36
|
-
transform: translate(-16px, 1px);
|
|
37
|
-
opacity: 0;
|
|
38
|
-
transition: transform .3s ease;
|
|
39
|
-
position: absolute;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** checked */
|
|
43
|
-
&:checked::before {
|
|
44
|
-
content: '';
|
|
45
|
-
background-color: var(--primary, ${constants.PRIMARY});
|
|
46
|
-
border-color: var(--primary, ${constants.PRIMARY});
|
|
47
|
-
color: #fff;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
&:checked::after {
|
|
51
|
-
opacity: 1;
|
|
52
|
-
transform: translate(-16px, 2px) rotate(45deg);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** indeterminate */
|
|
56
|
-
&:indeterminate::before {
|
|
57
|
-
content: '';
|
|
58
|
-
background-color: var(--primary, ${constants.PRIMARY});
|
|
59
|
-
border-color: var(--primary, ${constants});
|
|
60
|
-
color: #fff;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
&:indeterminate::after {
|
|
64
|
-
width: 0;
|
|
65
|
-
opacity: 1;
|
|
66
|
-
transform: translate(-15px, 3px) rotate(90deg);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** active and focus */
|
|
70
|
-
&:enabled:active::before, &:focus::before {
|
|
71
|
-
border-color: var(--primary, ${constants.PRIMARY});
|
|
72
|
-
box-shadow: 0 0 0 3px var(--primary, ${constants.PRIMARY_LIGHT});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
&:enabled:active + span, &:focus + span {
|
|
76
|
-
color: var(--primary, ${constants.PRIMARY});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** hover */
|
|
80
|
-
&:enabled:hover::before {
|
|
81
|
-
border-color: var(--primary, ${constants.PRIMARY});
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
&:enabled:hover + span {
|
|
85
|
-
color: var(--primary, ${constants.PRIMARY});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/** disabled */
|
|
89
|
-
&:disabled::before {
|
|
90
|
-
border-color: #aaa;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
&:disabled + span {
|
|
94
|
-
color: #aaa;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
&:checked:disabled::before, &:indeterminate:disabled::before {
|
|
98
|
-
background-color: #aaa;
|
|
99
|
-
}
|
|
100
|
-
`;
|
|
101
|
-
export default function Checkbox(props) {
|
|
102
|
-
const ref = useCallback((node) => {
|
|
103
|
-
if (node !== null) {
|
|
104
|
-
if (props.indeterminate) {
|
|
105
|
-
node.indeterminate = true;
|
|
106
|
-
}
|
|
4
|
+
import { getThemeValue, THEME_NAME } from '../../shared/constants.js';
|
|
5
|
+
|
|
6
|
+
const Label$2 = /*#__PURE__*/ styled("label", {
|
|
7
|
+
target: "e11g7h820",
|
|
8
|
+
label: "Label"
|
|
9
|
+
})("margin:5px 0;position:relative;display:inline-flex;align-items:center;cursor:pointer;");
|
|
10
|
+
const StyledCheckmark = /*#__PURE__*/ styled("span", {
|
|
11
|
+
target: "e11g7h821",
|
|
12
|
+
label: "StyledCheckmark"
|
|
13
|
+
})("width:16px;height:16px;border:1px solid ", getThemeValue(THEME_NAME.BORDER_COLOR), ";display:inline-block;border-radius:3px;margin-right:5px;background-color:", getThemeValue(THEME_NAME.BACKGROUND), ";transition:all 0.3s ease;position:relative;flex-shrink:0;&::after{content:'';width:3px;height:10px;border-right:2px solid ", getThemeValue(THEME_NAME.TEXT_COLOR_LIGHT), ";border-bottom:2px solid ", getThemeValue(THEME_NAME.TEXT_COLOR_LIGHT), ";position:absolute;top:1px;left:6px;opacity:0;transform:rotate(45deg) scale(0);transition:all 0.2s ease;}");
|
|
14
|
+
const HiddenInput$1 = /*#__PURE__*/ styled("input", {
|
|
15
|
+
target: "e11g7h822",
|
|
16
|
+
label: "HiddenInput"
|
|
17
|
+
})("opacity:0;width:0;height:0;position:absolute;margin:0;&:checked + ", StyledCheckmark, "{background-color:", getThemeValue(THEME_NAME.PRIMARY), ";border-color:", getThemeValue(THEME_NAME.PRIMARY), ";}&:checked + ", StyledCheckmark, "::after{opacity:1;transform:rotate(45deg) scale(1);}&:indeterminate + ", StyledCheckmark, "{background-color:", getThemeValue(THEME_NAME.PRIMARY), ";border-color:", getThemeValue(THEME_NAME.PRIMARY), ";}&:indeterminate + ", StyledCheckmark, "::after{opacity:1;height:0;width:8px;border-right:none;border-bottom:2px solid ", getThemeValue(THEME_NAME.TEXT_COLOR_LIGHT), ";transform:rotate(0deg) scale(1);top:7px;left:4px;}&:enabled:active + ", StyledCheckmark, ",&:focus + ", StyledCheckmark, "{border-color:", getThemeValue(THEME_NAME.PRIMARY), ";box-shadow:0 0 0 3px ", getThemeValue(THEME_NAME.PRIMARY_LIGHT), ";}&:enabled:active ~ span,&:focus ~ span{color:", getThemeValue(THEME_NAME.PRIMARY), ";}&:enabled:hover + ", StyledCheckmark, "{border-color:", getThemeValue(THEME_NAME.PRIMARY), ";}&:enabled:hover ~ span{color:", getThemeValue(THEME_NAME.PRIMARY), ";}&:disabled + ", StyledCheckmark, "{border-color:", getThemeValue(THEME_NAME.DISABLED_BORDER), ";cursor:not-allowed;}&:disabled ~ span{color:", getThemeValue(THEME_NAME.DISABLED), ";cursor:not-allowed;}&:checked:disabled + ", StyledCheckmark, ",&:indeterminate:disabled + ", StyledCheckmark, "{background-color:", getThemeValue(THEME_NAME.DISABLED), ";}");
|
|
18
|
+
function CheckboxComponent(props, fwdRef) {
|
|
19
|
+
const { label = '', indeterminate = false, checked, ...rest } = props;
|
|
20
|
+
const ref = useCallback((node)=>{
|
|
21
|
+
// Ensure the DOM `indeterminate` flag always matches the prop
|
|
22
|
+
if (node) {
|
|
23
|
+
node.indeterminate = !!indeterminate;
|
|
24
|
+
}
|
|
25
|
+
// Forward the node (or null) to the parent ref (supports function or ref object)
|
|
26
|
+
if (typeof fwdRef === 'function') {
|
|
27
|
+
fwdRef(node);
|
|
28
|
+
} else if (fwdRef) {
|
|
29
|
+
fwdRef.current = node;
|
|
107
30
|
}
|
|
108
|
-
}, [
|
|
109
|
-
|
|
31
|
+
}, [
|
|
32
|
+
indeterminate,
|
|
33
|
+
fwdRef
|
|
34
|
+
]);
|
|
35
|
+
return /*#__PURE__*/ jsxs(Label$2, {
|
|
36
|
+
children: [
|
|
37
|
+
/*#__PURE__*/ jsx(HiddenInput$1, {
|
|
38
|
+
...rest,
|
|
39
|
+
ref: ref,
|
|
40
|
+
type: "checkbox",
|
|
41
|
+
checked: checked,
|
|
42
|
+
"aria-checked": indeterminate ? 'mixed' : checked
|
|
43
|
+
}),
|
|
44
|
+
/*#__PURE__*/ jsx(StyledCheckmark, {}),
|
|
45
|
+
/*#__PURE__*/ jsx("span", {
|
|
46
|
+
children: label
|
|
47
|
+
})
|
|
48
|
+
]
|
|
49
|
+
});
|
|
110
50
|
}
|
|
111
|
-
Checkbox
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
indeterminate: PropTypes.bool,
|
|
116
|
-
};
|
|
117
|
-
Checkbox.defaultProps = {
|
|
118
|
-
indeterminate: false,
|
|
119
|
-
label: ''
|
|
120
|
-
};
|
|
121
|
-
//# sourceMappingURL=Checkbox.js.map
|
|
51
|
+
const Checkbox = /*#__PURE__*/ React.forwardRef(CheckboxComponent);
|
|
52
|
+
|
|
53
|
+
export { Checkbox as default };
|
|
54
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.js","
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/Input/Checkbox.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport styled from '@emotion/styled';\nimport { getThemeValue, THEME_NAME } from '../../shared/constants';\n\nconst Label = styled.label`\n margin: 5px 0;\n position: relative;\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n`;\n\nconst StyledCheckmark = styled.span`\n width: 16px;\n height: 16px;\n border: 1px solid ${getThemeValue(THEME_NAME.BORDER_COLOR)};\n display: inline-block;\n border-radius: 3px;\n margin-right: 5px;\n background-color: ${getThemeValue(THEME_NAME.BACKGROUND)};\n transition: all 0.3s ease;\n position: relative;\n flex-shrink: 0;\n\n &::after {\n content: '';\n width: 3px;\n height: 10px;\n border-right: 2px solid ${getThemeValue(THEME_NAME.TEXT_COLOR_LIGHT)};\n border-bottom: 2px solid ${getThemeValue(THEME_NAME.TEXT_COLOR_LIGHT)};\n position: absolute;\n top: 1px;\n left: 6px;\n opacity: 0;\n transform: rotate(45deg) scale(0);\n transition: all 0.2s ease;\n }\n`;\n\nconst HiddenInput = styled.input`\n opacity: 0;\n width: 0;\n height: 0;\n position: absolute;\n margin: 0;\n\n /** checked */\n &:checked + ${StyledCheckmark} {\n background-color: ${getThemeValue(THEME_NAME.PRIMARY)};\n border-color: ${getThemeValue(THEME_NAME.PRIMARY)};\n }\n\n &:checked + ${StyledCheckmark}::after {\n opacity: 1;\n transform: rotate(45deg) scale(1);\n }\n\n /** indeterminate */\n &:indeterminate + ${StyledCheckmark} {\n background-color: ${getThemeValue(THEME_NAME.PRIMARY)};\n border-color: ${getThemeValue(THEME_NAME.PRIMARY)};\n }\n\n &:indeterminate + ${StyledCheckmark}::after {\n opacity: 1;\n height: 0;\n width: 8px;\n border-right: none;\n border-bottom: 2px solid ${getThemeValue(THEME_NAME.TEXT_COLOR_LIGHT)};\n transform: rotate(0deg) scale(1);\n top: 7px;\n left: 4px;\n }\n\n /** active and focus */\n &:enabled:active + ${StyledCheckmark}, &:focus + ${StyledCheckmark} {\n border-color: ${getThemeValue(THEME_NAME.PRIMARY)};\n box-shadow: 0 0 0 3px ${getThemeValue(THEME_NAME.PRIMARY_LIGHT)};\n }\n\n &:enabled:active ~ span,\n &:focus ~ span {\n color: ${getThemeValue(THEME_NAME.PRIMARY)};\n }\n\n /** hover */\n &:enabled:hover + ${StyledCheckmark} {\n border-color: ${getThemeValue(THEME_NAME.PRIMARY)};\n }\n\n &:enabled:hover ~ span {\n color: ${getThemeValue(THEME_NAME.PRIMARY)};\n }\n\n /** disabled */\n &:disabled + ${StyledCheckmark} {\n border-color: ${getThemeValue(THEME_NAME.DISABLED_BORDER)};\n cursor: not-allowed;\n }\n\n &:disabled ~ span {\n color: ${getThemeValue(THEME_NAME.DISABLED)};\n cursor: not-allowed;\n }\n\n &:checked:disabled + ${StyledCheckmark}, &:indeterminate:disabled + ${StyledCheckmark} {\n background-color: ${getThemeValue(THEME_NAME.DISABLED)};\n }\n`;\n\ntype CheckboxProps = {\n /**\n * Label for the field\n * @default ''\n */\n label?: string;\n /**\n * If the field is in indeterminate state\n * @default false\n */\n indeterminate?: boolean;\n} & React.InputHTMLAttributes<HTMLInputElement>;\n\nfunction CheckboxComponent(props: CheckboxProps, fwdRef: React.Ref<HTMLInputElement>) {\n const { label = '', indeterminate = false, checked, ...rest } = props;\n\n const ref = useCallback(\n (node: HTMLInputElement | null) => {\n // Ensure the DOM `indeterminate` flag always matches the prop\n if (node) {\n node.indeterminate = !!indeterminate;\n }\n\n // Forward the node (or null) to the parent ref (supports function or ref object)\n if (typeof fwdRef === 'function') {\n fwdRef(node);\n } else if (fwdRef) {\n (fwdRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n },\n [indeterminate, fwdRef],\n );\n\n return (\n <Label>\n <HiddenInput\n {...rest}\n ref={ref}\n type=\"checkbox\"\n checked={checked}\n aria-checked={indeterminate ? 'mixed' : checked}\n />\n <StyledCheckmark />\n <span>{label}</span>\n </Label>\n );\n}\n\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(CheckboxComponent);\n\nexport default Checkbox;\n"],"names":["Label","styled","StyledCheckmark","getThemeValue","THEME_NAME","BORDER_COLOR","BACKGROUND","TEXT_COLOR_LIGHT","HiddenInput","PRIMARY","PRIMARY_LIGHT","DISABLED_BORDER","DISABLED","CheckboxComponent","props","fwdRef","label","indeterminate","checked","rest","ref","useCallback","node","current","_jsxs","_jsx","type","aria-checked","span","Checkbox","React","forwardRef"],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
2
|
+
declare const Dropdown: React.ForwardRefExoticComponent<{
|
|
3
3
|
/** Value of the control */
|
|
4
|
-
value?:
|
|
5
|
-
/**
|
|
6
|
-
|
|
4
|
+
value?: object | object[] | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* If multiple elements can be selected
|
|
7
|
+
* @default false
|
|
8
|
+
*/
|
|
9
|
+
multiSelect?: boolean;
|
|
7
10
|
/** Change handler */
|
|
8
|
-
onChange?: (v:
|
|
11
|
+
onChange?: ((v: object | object[]) => void) | undefined;
|
|
9
12
|
/** Label of the control */
|
|
10
13
|
label?: string;
|
|
11
14
|
/** Error message */
|
|
@@ -14,11 +17,7 @@ type DropdownProps<T> = {
|
|
|
14
17
|
required?: boolean;
|
|
15
18
|
/** Disables the field */
|
|
16
19
|
disabled?: boolean;
|
|
17
|
-
} &
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var defaultProps: {
|
|
21
|
-
multiSelect: boolean;
|
|
22
|
-
};
|
|
23
|
-
}
|
|
20
|
+
} & {
|
|
21
|
+
children?: React.ReactNode | undefined;
|
|
22
|
+
} & React.InputHTMLAttributes<HTMLInputElement> & React.RefAttributes<HTMLInputElement>>;
|
|
24
23
|
export default Dropdown;
|
|
@@ -1,66 +1,147 @@
|
|
|
1
|
-
import { jsx
|
|
2
|
-
import {
|
|
1
|
+
import { jsx, jsxs, Fragment } from '@emotion/react/jsx-runtime';
|
|
2
|
+
import React, { useState, useEffect } from 'react';
|
|
3
3
|
import styled from '@emotion/styled';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
4
|
+
import Input from './Input.js';
|
|
5
|
+
import Popover, { POPOVER_POSITION } from '../Popover/Popover.js';
|
|
6
|
+
import Menu from '../Menu/Menu.js';
|
|
7
|
+
import ExpandMore from '../../icons/ExpandMore.js';
|
|
8
|
+
|
|
9
|
+
const ArrowContainer = /*#__PURE__*/ styled("span", {
|
|
10
|
+
target: "eqzh0a30",
|
|
11
|
+
label: "ArrowContainer"
|
|
12
|
+
})("position:absolute;right:12px;top:16px;pointer-events:none;");
|
|
13
|
+
/**
|
|
14
|
+
* Dropdown component that allows selection from a list of options.
|
|
15
|
+
* Supports single and multi-select modes.
|
|
16
|
+
*
|
|
17
|
+
* @template T - The type of the value(s) in the dropdown.
|
|
18
|
+
* @param props - The properties for the Dropdown component.
|
|
19
|
+
* @returns The rendered Dropdown component.
|
|
20
|
+
*/ function DropdownComponent(props, outerRef) {
|
|
21
|
+
const { multiSelect = false, onChange, children, value: propValue, label, errorText, required, disabled, ...rest } = props;
|
|
16
22
|
const [open, setOpen] = useState(false);
|
|
17
|
-
const [value, setValue] = useState(
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
prev === null || prev === void 0 ? void 0 : prev.focus();
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
const next = (_b = currentBtn === null || currentBtn === void 0 ? void 0 : currentBtn.nextElementSibling) === null || _b === void 0 ? void 0 : _b.closest('button');
|
|
35
|
-
next === null || next === void 0 ? void 0 : next.focus();
|
|
23
|
+
const [value, setValue] = useState(propValue);
|
|
24
|
+
const id = React.useId();
|
|
25
|
+
const menuId = `${id}-menu`;
|
|
26
|
+
const menuRef = React.useRef(null);
|
|
27
|
+
const triggerRef = React.useRef(null);
|
|
28
|
+
// Focus menu when opened
|
|
29
|
+
useEffect(()=>{
|
|
30
|
+
if (open) {
|
|
31
|
+
// Wait for Popover to fully open and focus itself first
|
|
32
|
+
// Then move focus to the first menu item
|
|
33
|
+
const timer = setTimeout(()=>{
|
|
34
|
+
const firstItem = menuRef.current?.querySelector('[role="option"]');
|
|
35
|
+
if (firstItem) {
|
|
36
|
+
firstItem.focus();
|
|
36
37
|
}
|
|
37
|
-
}
|
|
38
|
-
return
|
|
38
|
+
}, 100); // Wait after Popover has set initial focus
|
|
39
|
+
return ()=>clearTimeout(timer);
|
|
39
40
|
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (
|
|
41
|
+
}, [
|
|
42
|
+
open
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* Handles keydown events on the input trigger.
|
|
46
|
+
* Opens the menu on 'Enter', 'Space', 'ArrowDown', or 'ArrowUp'.
|
|
47
|
+
*
|
|
48
|
+
* @param {React.KeyboardEvent<HTMLInputElement>} e - The keyboard event.
|
|
49
|
+
*/ const onKeyDown = (e)=>{
|
|
50
|
+
if ([
|
|
51
|
+
'ArrowDown',
|
|
52
|
+
'ArrowUp',
|
|
53
|
+
'Enter',
|
|
54
|
+
' '
|
|
55
|
+
].includes(e.key)) {
|
|
56
|
+
e.preventDefault();
|
|
50
57
|
setOpen(true);
|
|
51
58
|
}
|
|
52
59
|
};
|
|
53
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Handles changes to the dropdown value.
|
|
62
|
+
* Updates local state and calls the external onChange handler.
|
|
63
|
+
* Closes the dropdown if not in multi-select mode.
|
|
64
|
+
*
|
|
65
|
+
* @param {T | T[]} val - The new value(s).
|
|
66
|
+
*/ const changeHandler = (val)=>{
|
|
54
67
|
setValue(val);
|
|
55
|
-
onChange
|
|
68
|
+
onChange?.(val);
|
|
56
69
|
// Close dropdown after selection if not multiSelect
|
|
57
70
|
if (!multiSelect) {
|
|
58
71
|
setOpen(false);
|
|
72
|
+
triggerRef.current?.focus();
|
|
59
73
|
}
|
|
60
74
|
};
|
|
61
|
-
|
|
75
|
+
/**
|
|
76
|
+
* Toggles the dropdown open state on click.
|
|
77
|
+
*/ const clickHandler = ()=>setOpen(true);
|
|
78
|
+
const TriggerElement = /*#__PURE__*/ React.forwardRef((passedProps, ref)=>{
|
|
79
|
+
// Helper to assign both internal triggerRef and external forwarded ref
|
|
80
|
+
const assignRefs = (node)=>{
|
|
81
|
+
triggerRef.current = node;
|
|
82
|
+
if (!outerRef) return;
|
|
83
|
+
if (typeof outerRef === 'function') {
|
|
84
|
+
outerRef(node);
|
|
85
|
+
} else {
|
|
86
|
+
outerRef.current = node;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
// Combine the ref passed by parent with our assignRefs so both are updated
|
|
90
|
+
const combinedRef = (node)=>{
|
|
91
|
+
assignRefs(node);
|
|
92
|
+
if (typeof ref === 'function') {
|
|
93
|
+
ref(node);
|
|
94
|
+
} else if (ref) {
|
|
95
|
+
ref.current = node;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
return /*#__PURE__*/ jsxs(Fragment, {
|
|
99
|
+
children: [
|
|
100
|
+
/*#__PURE__*/ jsx(Input, {
|
|
101
|
+
...rest,
|
|
102
|
+
...passedProps,
|
|
103
|
+
ref: combinedRef,
|
|
104
|
+
type: "text",
|
|
105
|
+
value: value && String(value),
|
|
106
|
+
label: label,
|
|
107
|
+
errorText: errorText,
|
|
108
|
+
onClick: clickHandler,
|
|
109
|
+
onKeyDown: onKeyDown,
|
|
110
|
+
required: required,
|
|
111
|
+
disabled: disabled,
|
|
112
|
+
readOnly: true,
|
|
113
|
+
role: "combobox",
|
|
114
|
+
"aria-haspopup": "listbox",
|
|
115
|
+
"aria-expanded": open,
|
|
116
|
+
"aria-controls": menuId
|
|
117
|
+
}),
|
|
118
|
+
/*#__PURE__*/ jsx(ArrowContainer, {
|
|
119
|
+
"aria-hidden": "true",
|
|
120
|
+
children: /*#__PURE__*/ jsx(ExpandMore, {})
|
|
121
|
+
})
|
|
122
|
+
]
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
TriggerElement.displayName = 'DropdownTrigger';
|
|
126
|
+
return /*#__PURE__*/ jsx(Popover, {
|
|
127
|
+
position: POPOVER_POSITION.BOTTOM_LEFT,
|
|
128
|
+
open: open,
|
|
129
|
+
element: TriggerElement,
|
|
130
|
+
onClose: ()=>{
|
|
131
|
+
setOpen(false);
|
|
132
|
+
triggerRef.current?.focus();
|
|
133
|
+
},
|
|
134
|
+
children: /*#__PURE__*/ jsx(Menu, {
|
|
135
|
+
ref: menuRef,
|
|
136
|
+
id: menuId,
|
|
137
|
+
value: value,
|
|
138
|
+
multiSelect: multiSelect,
|
|
139
|
+
onChange: changeHandler,
|
|
140
|
+
children: children
|
|
141
|
+
})
|
|
142
|
+
});
|
|
62
143
|
}
|
|
63
|
-
Dropdown
|
|
64
|
-
|
|
65
|
-
};
|
|
66
|
-
//# sourceMappingURL=Dropdown.js.map
|
|
144
|
+
const Dropdown = /*#__PURE__*/ React.forwardRef(DropdownComponent);
|
|
145
|
+
|
|
146
|
+
export { Dropdown as default };
|
|
147
|
+
//# sourceMappingURL=Dropdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../../src/components/Input/Dropdown.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../../../src/components/Input/Dropdown.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport styled from '@emotion/styled';\nimport { ExpandMore } from '../../icons';\nimport { Menu } from '../Menu';\nimport { Popover, POPOVER_POSITION } from '../Popover';\nimport Input from './Input';\n\ntype DropdownProps<T> = React.PropsWithChildren<{\n /** Value of the control */\n value?: T | T[];\n /**\n * If multiple elements can be selected\n * @default false\n */\n multiSelect?: boolean;\n /** Change handler */\n onChange?: (v: T | T[]) => void;\n /** Label of the control */\n label?: string;\n /** Error message */\n errorText?: string;\n /** Makes field required */\n required?: boolean;\n /** Disables the field */\n disabled?: boolean;\n}> &\n React.InputHTMLAttributes<HTMLInputElement>;\n\nconst ArrowContainer = styled.span`\n position: absolute;\n right: 12px;\n top: 16px;\n pointer-events: none;\n`;\n\n/**\n * Dropdown component that allows selection from a list of options.\n * Supports single and multi-select modes.\n *\n * @template T - The type of the value(s) in the dropdown.\n * @param props - The properties for the Dropdown component.\n * @returns The rendered Dropdown component.\n */\nfunction DropdownComponent<T extends object>(\n props: DropdownProps<T>,\n outerRef: React.Ref<HTMLInputElement>,\n) {\n const {\n multiSelect = false,\n onChange,\n children,\n value: propValue,\n label,\n errorText,\n required,\n disabled,\n ...rest\n } = props;\n const [open, setOpen] = useState(false);\n const [value, setValue] = useState<T | T[] | undefined>(propValue);\n const id = React.useId();\n const menuId = `${id}-menu`;\n const menuRef = React.useRef<HTMLDivElement | null>(null);\n const triggerRef = React.useRef<HTMLInputElement | null>(null);\n\n // Focus menu when opened\n useEffect(() => {\n if (open) {\n // Wait for Popover to fully open and focus itself first\n // Then move focus to the first menu item\n const timer = setTimeout(() => {\n const firstItem = menuRef.current?.querySelector('[role=\"option\"]') as HTMLElement;\n if (firstItem) {\n firstItem.focus();\n }\n }, 100); // Wait after Popover has set initial focus\n return () => clearTimeout(timer);\n }\n }, [open]);\n\n /**\n * Handles keydown events on the input trigger.\n * Opens the menu on 'Enter', 'Space', 'ArrowDown', or 'ArrowUp'.\n *\n * @param {React.KeyboardEvent<HTMLInputElement>} e - The keyboard event.\n */\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(e.key)) {\n e.preventDefault();\n setOpen(true);\n }\n };\n\n /**\n * Handles changes to the dropdown value.\n * Updates local state and calls the external onChange handler.\n * Closes the dropdown if not in multi-select mode.\n *\n * @param {T | T[]} val - The new value(s).\n */\n const changeHandler = (val: T | T[]) => {\n setValue(val);\n onChange?.(val);\n\n // Close dropdown after selection if not multiSelect\n if (!multiSelect) {\n setOpen(false);\n triggerRef.current?.focus();\n }\n };\n\n /**\n * Toggles the dropdown open state on click.\n */\n const clickHandler = () => setOpen(true);\n\n const TriggerElement = React.forwardRef<HTMLInputElement>((passedProps, ref) => {\n // Helper to assign both internal triggerRef and external forwarded ref\n const assignRefs = (node: HTMLInputElement | null) => {\n triggerRef.current = node;\n\n if (!outerRef) return;\n if (typeof outerRef === 'function') {\n outerRef(node);\n } else {\n (outerRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n };\n\n // Combine the ref passed by parent with our assignRefs so both are updated\n const combinedRef: React.Ref<HTMLInputElement> = (node) => {\n assignRefs(node);\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n };\n\n return (\n <>\n <Input\n {...rest}\n {...passedProps}\n ref={combinedRef}\n type=\"text\"\n value={value && String(value)}\n label={label}\n errorText={errorText}\n onClick={clickHandler}\n onKeyDown={onKeyDown}\n required={required}\n disabled={disabled}\n readOnly\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={menuId}\n />\n <ArrowContainer aria-hidden=\"true\">\n <ExpandMore />\n </ArrowContainer>\n </>\n );\n });\n TriggerElement.displayName = 'DropdownTrigger';\n\n return (\n <Popover\n position={POPOVER_POSITION.BOTTOM_LEFT}\n open={open}\n element={TriggerElement}\n onClose={() => {\n setOpen(false);\n triggerRef.current?.focus();\n }}\n >\n <Menu\n ref={menuRef}\n id={menuId}\n value={value}\n multiSelect={multiSelect}\n onChange={changeHandler}\n >\n {children}\n </Menu>\n </Popover>\n );\n}\n\nconst Dropdown = React.forwardRef(DropdownComponent);\nexport default Dropdown;\n"],"names":["ArrowContainer","styled","DropdownComponent","props","outerRef","multiSelect","onChange","children","value","propValue","label","errorText","required","disabled","rest","open","setOpen","useState","setValue","id","React","useId","menuId","menuRef","useRef","triggerRef","useEffect","timer","setTimeout","firstItem","current","querySelector","focus","clearTimeout","onKeyDown","e","includes","key","preventDefault","changeHandler","val","clickHandler","TriggerElement","forwardRef","passedProps","ref","assignRefs","node","combinedRef","_jsxs","_Fragment","_jsx","Input","type","String","onClick","readOnly","role","aria-haspopup","aria-expanded","aria-controls","aria-hidden","ExpandMore","displayName","Popover","position","POPOVER_POSITION","BOTTOM_LEFT","element","onClose","Menu","Dropdown"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
type InputProps =
|
|
2
|
+
type InputProps = {
|
|
3
3
|
/** Label for the field */
|
|
4
4
|
label?: string;
|
|
5
|
-
/** Error
|
|
5
|
+
/** Error text to be shown below the field */
|
|
6
6
|
errorText?: string;
|
|
7
|
-
}
|
|
7
|
+
} & React.AllHTMLAttributes<HTMLInputElement>;
|
|
8
8
|
declare const Input: React.ForwardRefExoticComponent<Omit<InputProps, "as"> & React.RefAttributes<HTMLInputElement>>;
|
|
9
9
|
export default Input;
|