no-frills-ui 0.0.14-alpha.3 → 0.0.14-alpha.5

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 (146) hide show
  1. package/dist/index.js +1622 -539
  2. package/dist/index.js.map +1 -1
  3. package/lib-esm/components/Accordion/AccordionStep.d.ts.map +1 -1
  4. package/lib-esm/components/Accordion/AccordionStep.js +27 -38
  5. package/lib-esm/components/Accordion/AccordionStep.js.map +1 -1
  6. package/lib-esm/components/Badge/Badge.js +7 -7
  7. package/lib-esm/components/Badge/Badge.js.map +1 -1
  8. package/lib-esm/components/Button/ActionButton.d.ts.map +1 -1
  9. package/lib-esm/components/Button/ActionButton.js +12 -11
  10. package/lib-esm/components/Button/ActionButton.js.map +1 -1
  11. package/lib-esm/components/Button/Button.d.ts +2 -2
  12. package/lib-esm/components/Button/Button.d.ts.map +1 -1
  13. package/lib-esm/components/Button/Button.js +19 -14
  14. package/lib-esm/components/Button/Button.js.map +1 -1
  15. package/lib-esm/components/Button/IconButton.d.ts.map +1 -1
  16. package/lib-esm/components/Button/IconButton.js +15 -14
  17. package/lib-esm/components/Button/IconButton.js.map +1 -1
  18. package/lib-esm/components/Button/LinkButton.d.ts.map +1 -1
  19. package/lib-esm/components/Button/LinkButton.js +7 -6
  20. package/lib-esm/components/Button/LinkButton.js.map +1 -1
  21. package/lib-esm/components/Button/RaisedButton.d.ts.map +1 -1
  22. package/lib-esm/components/Button/RaisedButton.js +15 -14
  23. package/lib-esm/components/Button/RaisedButton.js.map +1 -1
  24. package/lib-esm/components/Card/Card.d.ts.map +1 -1
  25. package/lib-esm/components/Card/Card.js +4 -4
  26. package/lib-esm/components/Card/Card.js.map +1 -1
  27. package/lib-esm/components/Chip/Chip.d.ts +5 -2
  28. package/lib-esm/components/Chip/Chip.d.ts.map +1 -1
  29. package/lib-esm/components/Chip/Chip.js +20 -14
  30. package/lib-esm/components/Chip/Chip.js.map +1 -1
  31. package/lib-esm/components/ChipInput/ChipInput.d.ts +9 -0
  32. package/lib-esm/components/ChipInput/ChipInput.d.ts.map +1 -1
  33. package/lib-esm/components/ChipInput/ChipInput.js +63 -24
  34. package/lib-esm/components/ChipInput/ChipInput.js.map +1 -1
  35. package/lib-esm/components/Dialog/AlertDialog.d.ts.map +1 -1
  36. package/lib-esm/components/Dialog/AlertDialog.js +4 -1
  37. package/lib-esm/components/Dialog/AlertDialog.js.map +1 -1
  38. package/lib-esm/components/Dialog/Dialog.d.ts +32 -2
  39. package/lib-esm/components/Dialog/Dialog.d.ts.map +1 -1
  40. package/lib-esm/components/Dialog/Dialog.js +84 -1
  41. package/lib-esm/components/Dialog/Dialog.js.map +1 -1
  42. package/lib-esm/components/DragAndDrop/DragAndDrop.d.ts +24 -0
  43. package/lib-esm/components/DragAndDrop/DragAndDrop.d.ts.map +1 -1
  44. package/lib-esm/components/DragAndDrop/DragAndDrop.js +85 -3
  45. package/lib-esm/components/DragAndDrop/DragAndDrop.js.map +1 -1
  46. package/lib-esm/components/DragAndDrop/DragItem.d.ts +4 -0
  47. package/lib-esm/components/DragAndDrop/DragItem.d.ts.map +1 -1
  48. package/lib-esm/components/DragAndDrop/DragItem.js +92 -12
  49. package/lib-esm/components/DragAndDrop/DragItem.js.map +1 -1
  50. package/lib-esm/components/DragAndDrop/types.d.ts +19 -0
  51. package/lib-esm/components/DragAndDrop/types.d.ts.map +1 -1
  52. package/lib-esm/components/DragAndDrop/types.js.map +1 -1
  53. package/lib-esm/components/Drawer/Drawer.d.ts +76 -1
  54. package/lib-esm/components/Drawer/Drawer.d.ts.map +1 -1
  55. package/lib-esm/components/Drawer/Drawer.js +158 -24
  56. package/lib-esm/components/Drawer/Drawer.js.map +1 -1
  57. package/lib-esm/components/Groups/Group.d.ts.map +1 -1
  58. package/lib-esm/components/Groups/Group.js +10 -8
  59. package/lib-esm/components/Groups/Group.js.map +1 -1
  60. package/lib-esm/components/Groups/GroupLabel.d.ts.map +1 -1
  61. package/lib-esm/components/Groups/GroupLabel.js +3 -3
  62. package/lib-esm/components/Groups/GroupLabel.js.map +1 -1
  63. package/lib-esm/components/Input/Checkbox.d.ts.map +1 -1
  64. package/lib-esm/components/Input/Checkbox.js +63 -58
  65. package/lib-esm/components/Input/Checkbox.js.map +1 -1
  66. package/lib-esm/components/Input/Dropdown.d.ts +8 -0
  67. package/lib-esm/components/Input/Dropdown.d.ts.map +1 -1
  68. package/lib-esm/components/Input/Dropdown.js +54 -31
  69. package/lib-esm/components/Input/Dropdown.js.map +1 -1
  70. package/lib-esm/components/Input/Input.d.ts.map +1 -1
  71. package/lib-esm/components/Input/Input.js +27 -22
  72. package/lib-esm/components/Input/Input.js.map +1 -1
  73. package/lib-esm/components/Input/Radio.d.ts.map +1 -1
  74. package/lib-esm/components/Input/Radio.js +58 -42
  75. package/lib-esm/components/Input/Radio.js.map +1 -1
  76. package/lib-esm/components/Input/RadioButton.d.ts.map +1 -1
  77. package/lib-esm/components/Input/RadioButton.js +12 -12
  78. package/lib-esm/components/Input/RadioButton.js.map +1 -1
  79. package/lib-esm/components/Input/Select.d.ts.map +1 -1
  80. package/lib-esm/components/Input/Select.js +27 -22
  81. package/lib-esm/components/Input/Select.js.map +1 -1
  82. package/lib-esm/components/Input/TextArea.d.ts.map +1 -1
  83. package/lib-esm/components/Input/TextArea.js +27 -22
  84. package/lib-esm/components/Input/TextArea.js.map +1 -1
  85. package/lib-esm/components/Input/Toggle.d.ts.map +1 -1
  86. package/lib-esm/components/Input/Toggle.js +17 -14
  87. package/lib-esm/components/Input/Toggle.js.map +1 -1
  88. package/lib-esm/components/Menu/Menu.d.ts +13 -1
  89. package/lib-esm/components/Menu/Menu.d.ts.map +1 -1
  90. package/lib-esm/components/Menu/Menu.js +98 -3
  91. package/lib-esm/components/Menu/Menu.js.map +1 -1
  92. package/lib-esm/components/Menu/MenuItem.d.ts +6 -3
  93. package/lib-esm/components/Menu/MenuItem.d.ts.map +1 -1
  94. package/lib-esm/components/Menu/MenuItem.js +10 -10
  95. package/lib-esm/components/Menu/MenuItem.js.map +1 -1
  96. package/lib-esm/components/Modal/Modal.d.ts +70 -1
  97. package/lib-esm/components/Modal/Modal.d.ts.map +1 -1
  98. package/lib-esm/components/Modal/Modal.js +145 -11
  99. package/lib-esm/components/Modal/Modal.js.map +1 -1
  100. package/lib-esm/components/Notification/Notification.d.ts +11 -7
  101. package/lib-esm/components/Notification/Notification.d.ts.map +1 -1
  102. package/lib-esm/components/Notification/Notification.js +54 -25
  103. package/lib-esm/components/Notification/Notification.js.map +1 -1
  104. package/lib-esm/components/Notification/NotificationManager.d.ts +11 -1
  105. package/lib-esm/components/Notification/NotificationManager.d.ts.map +1 -1
  106. package/lib-esm/components/Notification/NotificationManager.js +43 -8
  107. package/lib-esm/components/Notification/NotificationManager.js.map +1 -1
  108. package/lib-esm/components/Notification/style.d.ts +4 -0
  109. package/lib-esm/components/Notification/style.d.ts.map +1 -1
  110. package/lib-esm/components/Notification/style.js +30 -15
  111. package/lib-esm/components/Notification/style.js.map +1 -1
  112. package/lib-esm/components/Notification/types.d.ts +2 -0
  113. package/lib-esm/components/Notification/types.d.ts.map +1 -1
  114. package/lib-esm/components/Notification/types.js.map +1 -1
  115. package/lib-esm/components/Popover/Popover.d.ts.map +1 -1
  116. package/lib-esm/components/Popover/Popover.js +17 -2
  117. package/lib-esm/components/Popover/Popover.js.map +1 -1
  118. package/lib-esm/components/Spinner/Spinner.d.ts +3 -0
  119. package/lib-esm/components/Spinner/Spinner.d.ts.map +1 -1
  120. package/lib-esm/components/Spinner/Spinner.js +19 -4
  121. package/lib-esm/components/Spinner/Spinner.js.map +1 -1
  122. package/lib-esm/components/Stepper/Stepper.d.ts.map +1 -1
  123. package/lib-esm/components/Stepper/Stepper.js +29 -10
  124. package/lib-esm/components/Stepper/Stepper.js.map +1 -1
  125. package/lib-esm/components/Tabs/Tabs.d.ts.map +1 -1
  126. package/lib-esm/components/Tabs/Tabs.js +45 -12
  127. package/lib-esm/components/Tabs/Tabs.js.map +1 -1
  128. package/lib-esm/components/Toast/Toast.d.ts +25 -4
  129. package/lib-esm/components/Toast/Toast.d.ts.map +1 -1
  130. package/lib-esm/components/Toast/Toast.js +114 -18
  131. package/lib-esm/components/Toast/Toast.js.map +1 -1
  132. package/lib-esm/components/Tooltip/Tooltip.d.ts.map +1 -1
  133. package/lib-esm/components/Tooltip/Tooltip.js +16 -5
  134. package/lib-esm/components/Tooltip/Tooltip.js.map +1 -1
  135. package/lib-esm/shared/LayerManager.d.ts.map +1 -1
  136. package/lib-esm/shared/LayerManager.js +63 -1
  137. package/lib-esm/shared/LayerManager.js.map +1 -1
  138. package/lib-esm/shared/constants.d.ts +58 -27
  139. package/lib-esm/shared/constants.d.ts.map +1 -1
  140. package/lib-esm/shared/constants.js +88 -25
  141. package/lib-esm/shared/constants.js.map +1 -1
  142. package/lib-esm/shared/styles.d.ts +1 -1
  143. package/lib-esm/shared/styles.d.ts.map +1 -1
  144. package/lib-esm/shared/styles.js +5 -3
  145. package/lib-esm/shared/styles.js.map +1 -1
  146. package/package.json +1 -1
@@ -2,103 +2,108 @@ import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
2
  import { useCallback } from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import styled from '@emotion/styled';
5
- import constants from '../../shared/constants';
5
+ import { getThemeValue, THEME_NAME } from '../../shared/constants';
6
6
  const Label = styled.label `
7
7
  margin: 5px 0;
8
8
  position: relative;
9
+ display: inline-flex;
10
+ align-items: center;
11
+ cursor: pointer;
9
12
  `;
10
- const Input = styled.input `
11
- appearance: none;
13
+ const StyledCheckmark = styled.span `
14
+ width: 16px;
15
+ height: 16px;
16
+ border: 1px solid ${getThemeValue(THEME_NAME.BORDER_COLOR)};
17
+ display: inline-block;
18
+ border-radius: 3px;
19
+ margin-right: 5px;
20
+ background-color: ${getThemeValue(THEME_NAME.BACKGROUND)};
21
+ transition: all 0.3s ease;
12
22
  position: relative;
13
- margin: 0;
14
-
15
- &::before {
16
- content: '';
17
- width: 16px;
18
- height: 16px;
19
- border: 1px solid var(--border-color, ${constants.BORDER_COLOR});
20
- display: inline-block;
21
- border-radius: 3px;
22
- vertical-align: bottom;
23
- margin: 0 5px;
24
- text-align: center;
25
- line-height: 16px;
26
- background-color: var(--background, ${constants.BACKGROUND});
27
- transition: background-color 0.3s ease;
28
- }
23
+ flex-shrink: 0;
29
24
 
30
25
  &::after {
31
26
  content: '';
32
27
  width: 3px;
33
28
  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 0.3s ease;
29
+ border-right: 2px solid ${getThemeValue(THEME_NAME.TEXT_COLOR_LIGHT)};
30
+ border-bottom: 2px solid ${getThemeValue(THEME_NAME.TEXT_COLOR_LIGHT)};
39
31
  position: absolute;
32
+ top: 1px;
33
+ left: 6px;
34
+ opacity: 0;
35
+ transform: rotate(45deg) scale(0);
36
+ transition: all 0.2s ease;
40
37
  }
38
+ `;
39
+ const HiddenInput = styled.input `
40
+ opacity: 0;
41
+ width: 0;
42
+ height: 0;
43
+ position: absolute;
44
+ margin: 0;
41
45
 
42
46
  /** checked */
43
- &:checked::before {
44
- content: '';
45
- background-color: var(--primary, ${constants.PRIMARY});
46
- border-color: var(--primary, ${constants.PRIMARY});
47
- color: #fff;
47
+ &:checked + ${StyledCheckmark} {
48
+ background-color: ${getThemeValue(THEME_NAME.PRIMARY)};
49
+ border-color: ${getThemeValue(THEME_NAME.PRIMARY)};
48
50
  }
49
51
 
50
- &:checked::after {
52
+ &:checked + ${StyledCheckmark}::after {
51
53
  opacity: 1;
52
- transform: translate(-16px, 2px) rotate(45deg);
54
+ transform: rotate(45deg) scale(1);
53
55
  }
54
56
 
55
57
  /** indeterminate */
56
- &:indeterminate::before {
57
- content: '';
58
- background-color: var(--primary, ${constants.PRIMARY});
59
- border-color: var(--primary, ${constants});
60
- color: #fff;
58
+ &:indeterminate + ${StyledCheckmark} {
59
+ background-color: ${getThemeValue(THEME_NAME.PRIMARY)};
60
+ border-color: ${getThemeValue(THEME_NAME.PRIMARY)};
61
61
  }
62
62
 
63
- &:indeterminate::after {
64
- width: 0;
63
+ &:indeterminate + ${StyledCheckmark}::after {
65
64
  opacity: 1;
66
- transform: translate(-15px, 3px) rotate(90deg);
65
+ height: 0;
66
+ width: 8px;
67
+ border-right: none;
68
+ border-bottom: 2px solid ${getThemeValue(THEME_NAME.TEXT_COLOR_LIGHT)};
69
+ transform: rotate(0deg) scale(1);
70
+ top: 7px;
71
+ left: 4px;
67
72
  }
68
73
 
69
74
  /** active and focus */
70
- &:enabled:active::before,
71
- &:focus::before {
72
- border-color: var(--primary, ${constants.PRIMARY});
73
- box-shadow: 0 0 0 3px var(--primary, ${constants.PRIMARY_LIGHT});
75
+ &:enabled:active + ${StyledCheckmark}, &:focus + ${StyledCheckmark} {
76
+ border-color: ${getThemeValue(THEME_NAME.PRIMARY)};
77
+ box-shadow: 0 0 0 3px ${getThemeValue(THEME_NAME.PRIMARY_LIGHT)};
74
78
  }
75
79
 
76
- &:enabled:active + span,
77
- &:focus + span {
78
- color: var(--primary, ${constants.PRIMARY});
80
+ &:enabled:active ~ span,
81
+ &:focus ~ span {
82
+ color: ${getThemeValue(THEME_NAME.PRIMARY)};
79
83
  }
80
84
 
81
85
  /** hover */
82
- &:enabled:hover::before {
83
- border-color: var(--primary, ${constants.PRIMARY});
86
+ &:enabled:hover + ${StyledCheckmark} {
87
+ border-color: ${getThemeValue(THEME_NAME.PRIMARY)};
84
88
  }
85
89
 
86
- &:enabled:hover + span {
87
- color: var(--primary, ${constants.PRIMARY});
90
+ &:enabled:hover ~ span {
91
+ color: ${getThemeValue(THEME_NAME.PRIMARY)};
88
92
  }
89
93
 
90
94
  /** disabled */
91
- &:disabled::before {
92
- border-color: #aaa;
95
+ &:disabled + ${StyledCheckmark} {
96
+ border-color: ${getThemeValue(THEME_NAME.DISABLED_BORDER)};
97
+ cursor: not-allowed;
93
98
  }
94
99
 
95
- &:disabled + span {
96
- color: #aaa;
100
+ &:disabled ~ span {
101
+ color: ${getThemeValue(THEME_NAME.DISABLED)};
102
+ cursor: not-allowed;
97
103
  }
98
104
 
99
- &:checked:disabled::before,
100
- &:indeterminate:disabled::before {
101
- background-color: #aaa;
105
+ &:checked:disabled + ${StyledCheckmark}, &:indeterminate:disabled + ${StyledCheckmark} {
106
+ background-color: ${getThemeValue(THEME_NAME.DISABLED)};
102
107
  }
103
108
  `;
104
109
  export default function Checkbox(props) {
@@ -109,7 +114,7 @@ export default function Checkbox(props) {
109
114
  }
110
115
  }
111
116
  }, [props.indeterminate]);
112
- return (_jsxs(Label, { children: [_jsx(Input, Object.assign({}, props, { ref: ref, type: "checkbox" })), _jsx("span", { children: props.label })] }));
117
+ return (_jsxs(Label, { children: [_jsx(HiddenInput, Object.assign({}, props, { ref: ref, type: "checkbox", "aria-checked": props.indeterminate ? 'mixed' : props.checked })), _jsx(StyledCheckmark, {}), _jsx("span", { children: props.label })] }));
113
118
  }
114
119
  Checkbox.propTypes = {
115
120
  /** Label for the field */
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.js","sourceRoot":"","sources":["../../../src/components/Input/Checkbox.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAE/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;;;CAGzB,CAAC;AAEF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;;;;;;;;;gDASsB,SAAS,CAAC,YAAY;;;;;;;8CAOxB,SAAS,CAAC,UAAU;;;;;;;;;;;;;;;;;;;2CAmBvB,SAAS,CAAC,OAAO;uCACrB,SAAS,CAAC,OAAO;;;;;;;;;;;;2CAYb,SAAS,CAAC,OAAO;uCACrB,SAAS;;;;;;;;;;;;;uCAaT,SAAS,CAAC,OAAO;+CACT,SAAS,CAAC,aAAa;;;;;gCAKtC,SAAS,CAAC,OAAO;;;;;uCAKV,SAAS,CAAC,OAAO;;;;gCAIxB,SAAS,CAAC,OAAO;;;;;;;;;;;;;;;;CAgBhD,CAAC;AAKF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAoB;IACjD,MAAM,GAAG,GAAG,WAAW,CACnB,CAAC,IAAa,EAAE,EAAE;QACd,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAyB,CAAC,aAAa,GAAG,IAAI,CAAC;YACpD,CAAC;QACL,CAAC;IACL,CAAC,EACD,CAAC,KAAK,CAAC,aAAa,CAAC,CACxB,CAAC;IAEF,OAAO,CACH,MAAC,KAAK,eACF,KAAC,KAAK,oBAAK,KAAK,IAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAC,UAAU,IAAG,EAC9C,yBAAO,KAAK,CAAC,KAAK,GAAQ,IACtB,CACX,CAAC;AACN,CAAC;AAED,QAAQ,CAAC,SAAS,GAAG;IACjB,0BAA0B;IAC1B,KAAK,EAAE,SAAS,CAAC,MAAM;IACvB,6CAA6C;IAC7C,aAAa,EAAE,SAAS,CAAC,IAAI;CAChC,CAAC;AAEF,QAAQ,CAAC,YAAY,GAAG;IACpB,aAAa,EAAE,KAAK;IACpB,KAAK,EAAE,EAAE;CACZ,CAAC","sourcesContent":["import React, { useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from '@emotion/styled';\nimport constants from '../../shared/constants';\n\nconst Label = styled.label`\n margin: 5px 0;\n position: relative;\n`;\n\nconst Input = styled.input`\n appearance: none;\n position: relative;\n margin: 0;\n\n &::before {\n content: '';\n width: 16px;\n height: 16px;\n border: 1px solid var(--border-color, ${constants.BORDER_COLOR});\n display: inline-block;\n border-radius: 3px;\n vertical-align: bottom;\n margin: 0 5px;\n text-align: center;\n line-height: 16px;\n background-color: var(--background, ${constants.BACKGROUND});\n transition: background-color 0.3s ease;\n }\n\n &::after {\n content: '';\n width: 3px;\n height: 10px;\n border-right: 2px solid #fff;\n border-bottom: 2px solid #fff;\n transform: translate(-16px, 1px);\n opacity: 0;\n transition: transform 0.3s ease;\n position: absolute;\n }\n\n /** checked */\n &:checked::before {\n content: '';\n background-color: var(--primary, ${constants.PRIMARY});\n border-color: var(--primary, ${constants.PRIMARY});\n color: #fff;\n }\n\n &:checked::after {\n opacity: 1;\n transform: translate(-16px, 2px) rotate(45deg);\n }\n\n /** indeterminate */\n &:indeterminate::before {\n content: '';\n background-color: var(--primary, ${constants.PRIMARY});\n border-color: var(--primary, ${constants});\n color: #fff;\n }\n\n &:indeterminate::after {\n width: 0;\n opacity: 1;\n transform: translate(-15px, 3px) rotate(90deg);\n }\n\n /** active and focus */\n &:enabled:active::before,\n &:focus::before {\n border-color: var(--primary, ${constants.PRIMARY});\n box-shadow: 0 0 0 3px var(--primary, ${constants.PRIMARY_LIGHT});\n }\n\n &:enabled:active + span,\n &:focus + span {\n color: var(--primary, ${constants.PRIMARY});\n }\n\n /** hover */\n &:enabled:hover::before {\n border-color: var(--primary, ${constants.PRIMARY});\n }\n\n &:enabled:hover + span {\n color: var(--primary, ${constants.PRIMARY});\n }\n\n /** disabled */\n &:disabled::before {\n border-color: #aaa;\n }\n\n &:disabled + span {\n color: #aaa;\n }\n\n &:checked:disabled::before,\n &:indeterminate:disabled::before {\n background-color: #aaa;\n }\n`;\n\ntype CheckboxProps = Omit<React.HTMLProps<HTMLInputElement>, 'as'> &\n PropTypes.InferProps<typeof Checkbox.propTypes>;\n\nexport default function Checkbox(props: CheckboxProps) {\n const ref = useCallback(\n (node: unknown) => {\n if (node !== null) {\n if (props.indeterminate) {\n (node as HTMLInputElement).indeterminate = true;\n }\n }\n },\n [props.indeterminate],\n );\n\n return (\n <Label>\n <Input {...props} ref={ref} type=\"checkbox\" />\n <span>{props.label}</span>\n </Label>\n );\n}\n\nCheckbox.propTypes = {\n /** Label for the field */\n label: PropTypes.string,\n /** If the field is in indeterminate state */\n indeterminate: PropTypes.bool,\n};\n\nCheckbox.defaultProps = {\n indeterminate: false,\n label: '',\n};\n"]}
1
+ {"version":3,"file":"Checkbox.js","sourceRoot":"","sources":["../../../src/components/Input/Checkbox.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEnE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;;;;;;CAMzB,CAAC;AAEF,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAA;;;wBAGX,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC;;;;wBAItC,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC;;;;;;;;;kCAS1B,aAAa,CAAC,UAAU,CAAC,gBAAgB,CAAC;mCACzC,aAAa,CAAC,UAAU,CAAC,gBAAgB,CAAC;;;;;;;;CAQ5E,CAAC;AAEF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAA;;;;;;;;kBAQd,eAAe;4BACL,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;wBACrC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;;;kBAGvC,eAAe;;;;;;wBAMT,eAAe;4BACX,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;wBACrC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;;;wBAGjC,eAAe;;;;;mCAKJ,aAAa,CAAC,UAAU,CAAC,gBAAgB,CAAC;;;;;;;yBAOpD,eAAe,eAAe,eAAe;wBAC9C,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;gCACzB,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC;;;;;iBAKtD,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;;;;wBAI1B,eAAe;wBACf,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;;;;iBAIxC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;;;;mBAI/B,eAAe;wBACV,aAAa,CAAC,UAAU,CAAC,eAAe,CAAC;;;;;iBAKhD,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;;;;2BAIxB,eAAe,gCAAgC,eAAe;4BAC7D,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAE7D,CAAC;AAKF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAoB;IACjD,MAAM,GAAG,GAAG,WAAW,CACnB,CAAC,IAAa,EAAE,EAAE;QACd,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAyB,CAAC,aAAa,GAAG,IAAI,CAAC;YACpD,CAAC;QACL,CAAC;IACL,CAAC,EACD,CAAC,KAAK,CAAC,aAAa,CAAC,CACxB,CAAC;IAEF,OAAO,CACH,MAAC,KAAK,eACF,KAAC,WAAW,oBACJ,KAAK,IACT,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,UAAU,kBACD,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAC7D,EACF,KAAC,eAAe,KAAG,EACnB,yBAAO,KAAK,CAAC,KAAK,GAAQ,IACtB,CACX,CAAC;AACN,CAAC;AAED,QAAQ,CAAC,SAAS,GAAG;IACjB,0BAA0B;IAC1B,KAAK,EAAE,SAAS,CAAC,MAAM;IACvB,6CAA6C;IAC7C,aAAa,EAAE,SAAS,CAAC,IAAI;CAChC,CAAC;AAEF,QAAQ,CAAC,YAAY,GAAG;IACpB,aAAa,EAAE,KAAK;IACpB,KAAK,EAAE,EAAE;CACZ,CAAC","sourcesContent":["import React, { useCallback } from 'react';\nimport PropTypes from 'prop-types';\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 = Omit<React.HTMLProps<HTMLInputElement>, 'as'> &\n PropTypes.InferProps<typeof Checkbox.propTypes>;\n\nexport default function Checkbox(props: CheckboxProps) {\n const ref = useCallback(\n (node: unknown) => {\n if (node !== null) {\n if (props.indeterminate) {\n (node as HTMLInputElement).indeterminate = true;\n }\n }\n },\n [props.indeterminate],\n );\n\n return (\n <Label>\n <HiddenInput\n {...props}\n ref={ref}\n type=\"checkbox\"\n aria-checked={props.indeterminate ? 'mixed' : props.checked}\n />\n <StyledCheckmark />\n <span>{props.label}</span>\n </Label>\n );\n}\n\nCheckbox.propTypes = {\n /** Label for the field */\n label: PropTypes.string,\n /** If the field is in indeterminate state */\n indeterminate: PropTypes.bool,\n};\n\nCheckbox.defaultProps = {\n indeterminate: false,\n label: '',\n};\n"]}
@@ -15,6 +15,14 @@ type DropdownProps<T> = {
15
15
  /** Disables the field */
16
16
  disabled?: boolean;
17
17
  } & React.PropsWithChildren<unknown>;
18
+ /**
19
+ * Dropdown component that allows selection from a list of options.
20
+ * Supports single and multi-select modes.
21
+ *
22
+ * @template T - The type of the value(s) in the dropdown.
23
+ * @param {DropdownProps<T>} props - The properties for the Dropdown component.
24
+ * @returns {JSX.Element} The rendered Dropdown component.
25
+ */
18
26
  declare function Dropdown<T extends object>(props: DropdownProps<T>): import("@emotion/react/jsx-runtime").JSX.Element;
19
27
  declare namespace Dropdown {
20
28
  var defaultProps: {
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Dropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAOnD,KAAK,aAAa,CAAC,CAAC,IAAI;IACpB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAChB,2CAA2C;IAC3C,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AASrC,iBAAwB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,oDA+EzE;kBA/EuB,QAAQ;;;;;eAAR,QAAQ"}
1
+ {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Dropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAOnD,KAAK,aAAa,CAAC,CAAC,IAAI;IACpB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAChB,2CAA2C;IAC3C,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AASrC;;;;;;;GAOG;AACH,iBAAwB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,oDA2GzE;kBA3GuB,QAAQ;;;;;eAAR,QAAQ"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
2
+ import React, { useEffect, useState } from 'react';
3
3
  import styled from '@emotion/styled';
4
4
  import { ExpandMore } from '../../icons';
5
5
  import { Menu } from '../Menu';
@@ -11,54 +11,77 @@ const ArrowContainer = styled.span `
11
11
  top: 16px;
12
12
  pointer-events: none;
13
13
  `;
14
+ /**
15
+ * Dropdown component that allows selection from a list of options.
16
+ * Supports single and multi-select modes.
17
+ *
18
+ * @template T - The type of the value(s) in the dropdown.
19
+ * @param {DropdownProps<T>} props - The properties for the Dropdown component.
20
+ * @returns {JSX.Element} The rendered Dropdown component.
21
+ */
14
22
  export default function Dropdown(props) {
15
23
  const { multiSelect, onChange } = props;
16
24
  const [open, setOpen] = useState(false);
17
25
  const [value, setValue] = useState(props.value);
26
+ const id = React.useId();
27
+ const menuId = `${id}-menu`;
28
+ const menuRef = React.useRef(null);
29
+ const triggerRef = React.useRef(null);
30
+ // Focus menu when opened
18
31
  useEffect(() => {
19
- const focusHandler = (e) => {
20
- var _a, _b;
21
- if (open && (e.keyCode === 38 || e.keyCode === 40)) {
22
- e.preventDefault();
23
- const current = document.querySelector(':focus');
24
- if (current.tagName === 'DIV') {
25
- const firstBtn = current.querySelector('button');
26
- firstBtn === null || firstBtn === void 0 ? void 0 : firstBtn.focus();
32
+ if (open) {
33
+ // Wait for Popover to fully open and focus itself first
34
+ // Then move focus to the first menu item
35
+ const timer = setTimeout(() => {
36
+ var _a;
37
+ const firstItem = (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('[role="option"]');
38
+ if (firstItem) {
39
+ firstItem.focus();
27
40
  }
28
- else {
29
- const currentBtn = current.closest('button');
30
- if (e.keyCode === 38) {
31
- const prev = (_a = currentBtn === null || currentBtn === void 0 ? void 0 : currentBtn.previousElementSibling) === null || _a === void 0 ? void 0 : _a.closest('button');
32
- prev === null || prev === void 0 ? void 0 : prev.focus();
33
- }
34
- else {
35
- const next = (_b = currentBtn === null || currentBtn === void 0 ? void 0 : currentBtn.nextElementSibling) === null || _b === void 0 ? void 0 : _b.closest('button');
36
- next === null || next === void 0 ? void 0 : next.focus();
37
- }
38
- }
39
- return false;
40
- }
41
- };
42
- document.addEventListener('keydown', focusHandler);
43
- return () => {
44
- document.removeEventListener('keydown', focusHandler);
45
- };
41
+ }, 100); // Wait after Popover has set initial focus
42
+ return () => clearTimeout(timer);
43
+ }
46
44
  }, [open]);
47
- const clickHandler = () => setOpen(true);
48
- const keyUp = (e) => {
49
- if (e.keyCode === 40) {
45
+ /**
46
+ * Handles keydown events on the input trigger.
47
+ * Opens the menu on 'Enter', 'Space', 'ArrowDown', or 'ArrowUp'.
48
+ *
49
+ * @param {React.KeyboardEvent<HTMLInputElement>} e - The keyboard event.
50
+ */
51
+ const onKeyDown = (e) => {
52
+ if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(e.key)) {
53
+ e.preventDefault();
50
54
  setOpen(true);
51
55
  }
52
56
  };
57
+ /**
58
+ * Handles changes to the dropdown value.
59
+ * Updates local state and calls the external onChange handler.
60
+ * Closes the dropdown if not in multi-select mode.
61
+ *
62
+ * @param {T | T[]} val - The new value(s).
63
+ */
53
64
  const changeHandler = (val) => {
65
+ var _a;
54
66
  setValue(val);
55
67
  onChange === null || onChange === void 0 ? void 0 : onChange(val);
56
68
  // Close dropdown after selection if not multiSelect
57
69
  if (!multiSelect) {
58
70
  setOpen(false);
71
+ (_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
59
72
  }
60
73
  };
61
- return (_jsx(Popover, { position: POPOVER_POSITION.BOTTOM_LEFT, open: open, element: () => (_jsxs(_Fragment, { children: [_jsx(Input, { type: "text", value: value && String(value), label: props.label, errorText: props.errorText, onClick: clickHandler, onKeyUp: keyUp, required: props.required, disabled: props.disabled }), _jsx(ArrowContainer, { children: _jsx(ExpandMore, {}) })] })), onClose: () => setOpen(false), children: _jsx(Menu, { value: value, multiSelect: multiSelect, onChange: changeHandler, children: props.children }) }));
74
+ /**
75
+ * Toggles the dropdown open state on click.
76
+ */
77
+ const clickHandler = () => setOpen(true);
78
+ const TriggerElement = React.forwardRef((passedProps, ref) => (_jsxs(_Fragment, { children: [_jsx(Input, Object.assign({}, passedProps, { ref: ref, type: "text", value: value && String(value), label: props.label, errorText: props.errorText, onClick: clickHandler, onKeyDown: onKeyDown, required: props.required, disabled: props.disabled, readOnly: true, role: "combobox", "aria-haspopup": "listbox", "aria-expanded": open, "aria-controls": menuId })), _jsx(ArrowContainer, { "aria-hidden": "true", children: _jsx(ExpandMore, {}) })] })));
79
+ TriggerElement.displayName = 'DropdownTrigger';
80
+ return (_jsx(Popover, { position: POPOVER_POSITION.BOTTOM_LEFT, open: open, element: TriggerElement, onClose: () => {
81
+ var _a;
82
+ setOpen(false);
83
+ (_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
84
+ }, children: _jsx(Menu, { ref: menuRef, id: menuId, value: value, multiSelect: multiSelect, onChange: changeHandler, children: props.children }) }));
62
85
  }
63
86
  Dropdown.defaultProps = {
64
87
  multiSelect: false,
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../../src/components/Input/Dropdown.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,MAAM,SAAS,CAAC;AAmB5B,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAA;;;;;CAKjC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAmB,KAAuB;IACtE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,YAAY,GAAG,CAAC,CAAgB,EAAE,EAAE;;YACtC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,EAAE,CAAC;gBACjD,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACjD,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBACjD,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,EAAE,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACJ,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAC7C,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;wBACnB,MAAM,IAAI,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,sBAAsB,0CAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;wBACnE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,EAAE,CAAC;oBAClB,CAAC;yBAAM,CAAC;wBACJ,MAAM,IAAI,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,kBAAkB,0CAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;wBAC/D,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,EAAE,CAAC;oBAClB,CAAC;gBACL,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAEnD,OAAO,GAAG,EAAE;YACR,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,CAAC,CAAwC,EAAE,EAAE;QACvD,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,GAAY,EAAE,EAAE;QACnC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACd,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,GAAG,CAAC,CAAC;QAEhB,oDAAoD;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CACH,KAAC,OAAO,IACJ,QAAQ,EAAE,gBAAgB,CAAC,WAAW,EACtC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,GAAG,EAAE,CAAC,CACX,8BACI,KAAC,KAAK,IACF,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,EAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,KAAK,EACd,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAC1B,EACF,KAAC,cAAc,cACX,KAAC,UAAU,KAAG,GACD,IAClB,CACN,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,YAE7B,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,YAChE,KAAK,CAAC,QAAQ,GACZ,GACD,CACb,CAAC;AACN,CAAC;AAED,QAAQ,CAAC,YAAY,GAAG;IACpB,WAAW,EAAE,KAAK;CACrB,CAAC","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> = {\n /** Value of the control */\n value?: T | T[];\n /** If multiple elements can be selected */\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} & React.PropsWithChildren<unknown>;\n\nconst ArrowContainer = styled.span`\n position: absolute;\n right: 12px;\n top: 16px;\n pointer-events: none;\n`;\n\nexport default function Dropdown<T extends object>(props: DropdownProps<T>) {\n const { multiSelect, onChange } = props;\n const [open, setOpen] = useState(false);\n const [value, setValue] = useState(props.value);\n\n useEffect(() => {\n const focusHandler = (e: KeyboardEvent) => {\n if (open && (e.keyCode === 38 || e.keyCode === 40)) {\n e.preventDefault();\n const current = document.querySelector(':focus');\n if (current.tagName === 'DIV') {\n const firstBtn = current.querySelector('button');\n firstBtn?.focus();\n } else {\n const currentBtn = current.closest('button');\n if (e.keyCode === 38) {\n const prev = currentBtn?.previousElementSibling?.closest('button');\n prev?.focus();\n } else {\n const next = currentBtn?.nextElementSibling?.closest('button');\n next?.focus();\n }\n }\n return false;\n }\n };\n document.addEventListener('keydown', focusHandler);\n\n return () => {\n document.removeEventListener('keydown', focusHandler);\n };\n }, [open]);\n\n const clickHandler = () => setOpen(true);\n\n const keyUp = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.keyCode === 40) {\n setOpen(true);\n }\n };\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 }\n };\n\n return (\n <Popover\n position={POPOVER_POSITION.BOTTOM_LEFT}\n open={open}\n element={() => (\n <>\n <Input\n type=\"text\"\n value={value && String(value)}\n label={props.label}\n errorText={props.errorText}\n onClick={clickHandler}\n onKeyUp={keyUp}\n required={props.required}\n disabled={props.disabled}\n />\n <ArrowContainer>\n <ExpandMore />\n </ArrowContainer>\n </>\n )}\n onClose={() => setOpen(false)}\n >\n <Menu value={value} multiSelect={multiSelect} onChange={changeHandler}>\n {props.children}\n </Menu>\n </Popover>\n );\n}\n\nDropdown.defaultProps = {\n multiSelect: false,\n};\n"]}
1
+ {"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../../src/components/Input/Dropdown.tsx"],"names":[],"mappings":"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","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> = {\n /** Value of the control */\n value?: T | T[];\n /** If multiple elements can be selected */\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} & React.PropsWithChildren<unknown>;\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 {DropdownProps<T>} props - The properties for the Dropdown component.\n * @returns {JSX.Element} The rendered Dropdown component.\n */\nexport default function Dropdown<T extends object>(props: DropdownProps<T>) {\n const { multiSelect, onChange } = props;\n const [open, setOpen] = useState(false);\n const [value, setValue] = useState(props.value);\n const id = React.useId();\n const menuId = `${id}-menu`;\n const menuRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLInputElement>(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 <>\n <Input\n {...passedProps}\n ref={ref}\n type=\"text\"\n value={value && String(value)}\n label={props.label}\n errorText={props.errorText}\n onClick={clickHandler}\n onKeyDown={onKeyDown}\n required={props.required}\n disabled={props.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 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 {props.children}\n </Menu>\n </Popover>\n );\n}\n\nDropdown.defaultProps = {\n multiSelect: false,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,KAAK,UAAU,GAAG,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG;IAC1D,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AA6HF,QAAA,MAAM,KAAK,iGAkCT,CAAC;AAIH,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqC,MAAM,OAAO,CAAC;AAK1D,KAAK,UAAU,GAAG,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG;IAC1D,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AA4HF,QAAA,MAAM,KAAK,iGA4CT,CAAC;AAIH,eAAe,KAAK,CAAC"}
@@ -1,12 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
- import React, { useState } from 'react';
2
+ import React, { useState, useEffect, useId } from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import styled from '@emotion/styled';
5
- import constants from '../../shared/constants';
5
+ import { getThemeValue, THEME_NAME } from '../../shared/constants';
6
6
  const Label = styled.label `
7
7
  display: inline-flex;
8
8
  flex-direction: column;
9
- flex: 1;
10
9
  position: relative;
11
10
  margin: 10px 5px;
12
11
  `;
@@ -18,46 +17,46 @@ const TextField = styled.input `
18
17
  min-height: 30px;
19
18
  width: 250px;
20
19
  border-radius: 3px;
21
- border: 1px solid var(--border-color, ${constants.BORDER_COLOR});
20
+ border: 1px solid ${getThemeValue(THEME_NAME.BORDER_COLOR)};
22
21
  display: inline-block;
23
- background-color: var(--background, ${constants.BACKGROUND});
22
+ background-color: ${getThemeValue(THEME_NAME.BACKGROUND)};
24
23
 
25
24
  /** Focused */
26
25
  &:focus,
27
26
  &:active {
28
- border-color: var(--primary, ${constants.PRIMARY});
29
- box-shadow: 0 0 0 4px var(--primary-light, ${constants.PRIMARY_LIGHT});
27
+ border-color: ${getThemeValue(THEME_NAME.PRIMARY)};
28
+ box-shadow: 0 0 0 4px ${getThemeValue(THEME_NAME.PRIMARY_LIGHT)};
30
29
  }
31
30
 
32
31
  &:focus + span,
33
32
  &:active + span {
34
- color: var(--primary, ${constants.PRIMARY});
33
+ color: ${getThemeValue(THEME_NAME.PRIMARY)};
35
34
  }
36
35
 
37
36
  /** Disabled */
38
37
  &:disabled {
39
- border-color: var(--disabled-border, ${constants.DISABLED_BORDER});
40
- background-color: var(--disabled-background, ${constants.DISABLED_BACKGROUND});
38
+ border-color: ${getThemeValue(THEME_NAME.DISABLED_BORDER)};
39
+ background-color: ${getThemeValue(THEME_NAME.DISABLED_BACKGROUND)};
41
40
  }
42
41
 
43
42
  &:disabled + span {
44
- color: #777;
43
+ color: ${getThemeValue(THEME_NAME.DISABLED)};
45
44
  }
46
45
 
47
46
  /** Invalid */
48
47
  &:focus:invalid {
49
- border-color: var(--error, ${constants.ERROR});
50
- box-shadow: 0 0 0 4px var(--error-light, ${constants.ERROR_LIGHT});
48
+ border-color: ${getThemeValue(THEME_NAME.ERROR)};
49
+ box-shadow: 0 0 0 4px ${getThemeValue(THEME_NAME.ERROR_LIGHT)};
51
50
  }
52
51
 
53
52
  ${(props) => props.touched
54
53
  ? `
55
54
  &:invalid {
56
- border-color: var(--error, ${constants.ERROR});
55
+ border-color: ${getThemeValue(THEME_NAME.ERROR)};
57
56
  }
58
57
 
59
58
  &:invalid + span {
60
- color: var(--error, ${constants.ERROR});
59
+ color: ${getThemeValue(THEME_NAME.ERROR)};
61
60
  }
62
61
  `
63
62
  : ''}
@@ -65,10 +64,10 @@ const TextField = styled.input `
65
64
  /** Error */
66
65
  ${(props) => props.errorText
67
66
  ? `
68
- border-color: var(--error, ${constants.ERROR});
67
+ border-color: ${getThemeValue(THEME_NAME.ERROR)};
69
68
 
70
69
  & + span {
71
- color: var(--error, ${constants.ERROR});
70
+ color: ${getThemeValue(THEME_NAME.ERROR)};
72
71
  }
73
72
  `
74
73
  : ''}
@@ -77,7 +76,7 @@ const TextField = styled.input `
77
76
  &:required + span:after {
78
77
  content: '*';
79
78
  margin-left: 2px;
80
- color: var(--error, ${constants.ERROR});
79
+ color: ${getThemeValue(THEME_NAME.ERROR)};
81
80
  }
82
81
 
83
82
  /** Label Animation */
@@ -95,7 +94,7 @@ const TextField = styled.input `
95
94
  ? `
96
95
  & + span {
97
96
  top: -8px;
98
- background: var(--background, ${constants.BACKGROUND});
97
+ background: ${getThemeValue(THEME_NAME.BACKGROUND)};
99
98
  font-size: 12px;
100
99
  line-height: 14px;
101
100
  }
@@ -104,13 +103,13 @@ const TextField = styled.input `
104
103
 
105
104
  &:focus + span, &:placeholder-shown + span {
106
105
  top: -8px;
107
- background: var(--background, ${constants.BACKGROUND});
106
+ background: ${getThemeValue(THEME_NAME.BACKGROUND)};
108
107
  font-size: 12px;
109
108
  line-height: 14px;
110
109
  }
111
110
  `;
112
111
  const ErrorContainer = styled.div `
113
- color: var(--error, ${constants.ERROR});
112
+ color: ${getThemeValue(THEME_NAME.ERROR)};
114
113
  padding-top: 3px;
115
114
  font-size: 12px;
116
115
  line-height: 14px;
@@ -119,6 +118,12 @@ const ErrorContainer = styled.div `
119
118
  const Input = React.forwardRef((props, ref) => {
120
119
  const [touched, setTouched] = useState(false);
121
120
  const [value, setValue] = useState(props.value || '');
121
+ const errorId = useId();
122
+ useEffect(() => {
123
+ if (props.value !== undefined) {
124
+ setValue(props.value);
125
+ }
126
+ }, [props.value]);
122
127
  const handleFocus = (e) => {
123
128
  setTouched(true);
124
129
  if (props.onFocus) {
@@ -134,7 +139,7 @@ const Input = React.forwardRef((props, ref) => {
134
139
  setValue(e.target.value);
135
140
  }
136
141
  };
137
- return (_jsxs(Label, { children: [_jsx(TextField, Object.assign({}, props, { ref: ref, value: value, onChange: onChangeHandler, onFocus: handleFocus, touched: touched })), _jsx("span", { children: props.label }), props.errorText && _jsx(ErrorContainer, { children: props.errorText })] }));
142
+ return (_jsxs(Label, { children: [_jsx(TextField, Object.assign({}, props, { ref: ref, value: value, onChange: onChangeHandler, onFocus: handleFocus, touched: touched, "aria-invalid": !!props.errorText, "aria-required": props.required, "aria-describedby": props.errorText ? errorId : undefined })), _jsx("span", { children: props.label }), props.errorText && _jsx(ErrorContainer, { id: errorId, children: props.errorText })] }));
138
143
  });
139
144
  Input.displayName = 'Input';
140
145
  export default Input;
@@ -1 +1 @@
1
- {"version":3,"file":"Input.js","sourceRoot":"","sources":["../../../src/components/Input/Input.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from '@emotion/styled';\nimport constants from '../../shared/constants';\n\ntype InputProps = React.AllHTMLAttributes<HTMLInputElement> & {\n /** Label for the field */\n label?: string;\n /** Error message for the field */\n errorText?: string;\n};\n\ntype InputInternalProps = InputProps & {\n touched: boolean;\n};\n\nconst Label = styled.label`\n display: inline-flex;\n flex-direction: column;\n flex: 1;\n position: relative;\n margin: 10px 5px;\n`;\n\nconst TextField = styled.input<InputInternalProps>`\n outline: none;\n color: inherit;\n padding: 0 8px;\n line-height: 30px;\n min-height: 30px;\n width: 250px;\n border-radius: 3px;\n border: 1px solid var(--border-color, ${constants.BORDER_COLOR});\n display: inline-block;\n background-color: var(--background, ${constants.BACKGROUND});\n\n /** Focused */\n &:focus,\n &:active {\n border-color: var(--primary, ${constants.PRIMARY});\n box-shadow: 0 0 0 4px var(--primary-light, ${constants.PRIMARY_LIGHT});\n }\n\n &:focus + span,\n &:active + span {\n color: var(--primary, ${constants.PRIMARY});\n }\n\n /** Disabled */\n &:disabled {\n border-color: var(--disabled-border, ${constants.DISABLED_BORDER});\n background-color: var(--disabled-background, ${constants.DISABLED_BACKGROUND});\n }\n\n &:disabled + span {\n color: #777;\n }\n\n /** Invalid */\n &:focus:invalid {\n border-color: var(--error, ${constants.ERROR});\n box-shadow: 0 0 0 4px var(--error-light, ${constants.ERROR_LIGHT});\n }\n\n ${(props) =>\n props.touched\n ? `\n &:invalid {\n border-color: var(--error, ${constants.ERROR});\n }\n\n &:invalid + span {\n color: var(--error, ${constants.ERROR});\n }\n `\n : ''}\n\n /** Error */\n ${(props) =>\n props.errorText\n ? `\n border-color: var(--error, ${constants.ERROR});\n\n & + span {\n color: var(--error, ${constants.ERROR});\n }\n `\n : ''}\n\n /** Required */\n &:required + span:after {\n content: '*';\n margin-left: 2px;\n color: var(--error, ${constants.ERROR});\n }\n\n /** Label Animation */\n & + span {\n position: absolute;\n padding: 0 5px;\n top: 0px;\n left: 4px;\n font-size: 14px;\n line-height: 32px;\n transition: all 300ms ease;\n }\n\n ${(props) =>\n props.value !== ''\n ? `\n & + span {\n top: -8px;\n background: var(--background, ${constants.BACKGROUND});\n font-size: 12px;\n line-height: 14px;\n }\n `\n : ''}\n\n &:focus + span, &:placeholder-shown + span {\n top: -8px;\n background: var(--background, ${constants.BACKGROUND});\n font-size: 12px;\n line-height: 14px;\n }\n`;\n\nconst ErrorContainer = styled.div`\n color: var(--error, ${constants.ERROR});\n padding-top: 3px;\n font-size: 12px;\n line-height: 14px;\n margin-left: 3px;\n`;\n\nconst Input = React.forwardRef<HTMLInputElement, Omit<InputProps, 'as'>>((props, ref) => {\n const [touched, setTouched] = useState(false);\n const [value, setValue] = useState(props.value || '');\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true);\n if (props.onFocus) {\n props.onFocus(e);\n }\n };\n\n const onChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (props.onChange) {\n setValue(e.target.value);\n props.onChange(e);\n } else {\n setValue(e.target.value);\n }\n };\n\n return (\n <Label>\n <TextField\n {...props}\n ref={ref}\n value={value}\n onChange={onChangeHandler}\n onFocus={handleFocus}\n touched={touched}\n />\n <span>{props.label}</span>\n {props.errorText && <ErrorContainer>{props.errorText}</ErrorContainer>}\n </Label>\n );\n});\n\nInput.displayName = 'Input';\n\nexport default Input;\n\nInput.propTypes = {\n /** Label for the field */\n label: PropTypes.string,\n /** Error text to be shown below the field */\n errorText: PropTypes.string,\n};\n"]}
1
+ {"version":3,"file":"Input.js","sourceRoot":"","sources":["../../../src/components/Input/Input.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useId } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from '@emotion/styled';\nimport { getThemeValue, THEME_NAME } from '../../shared/constants';\n\ntype InputProps = React.AllHTMLAttributes<HTMLInputElement> & {\n /** Label for the field */\n label?: string;\n /** Error message for the field */\n errorText?: string;\n};\n\ntype InputInternalProps = InputProps & {\n touched: boolean;\n};\n\nconst Label = styled.label`\n display: inline-flex;\n flex-direction: column;\n position: relative;\n margin: 10px 5px;\n`;\n\nconst TextField = styled.input<InputInternalProps>`\n outline: none;\n color: inherit;\n padding: 0 8px;\n line-height: 30px;\n min-height: 30px;\n width: 250px;\n border-radius: 3px;\n border: 1px solid ${getThemeValue(THEME_NAME.BORDER_COLOR)};\n display: inline-block;\n background-color: ${getThemeValue(THEME_NAME.BACKGROUND)};\n\n /** Focused */\n &:focus,\n &:active {\n border-color: ${getThemeValue(THEME_NAME.PRIMARY)};\n box-shadow: 0 0 0 4px ${getThemeValue(THEME_NAME.PRIMARY_LIGHT)};\n }\n\n &:focus + span,\n &:active + span {\n color: ${getThemeValue(THEME_NAME.PRIMARY)};\n }\n\n /** Disabled */\n &:disabled {\n border-color: ${getThemeValue(THEME_NAME.DISABLED_BORDER)};\n background-color: ${getThemeValue(THEME_NAME.DISABLED_BACKGROUND)};\n }\n\n &:disabled + span {\n color: ${getThemeValue(THEME_NAME.DISABLED)};\n }\n\n /** Invalid */\n &:focus:invalid {\n border-color: ${getThemeValue(THEME_NAME.ERROR)};\n box-shadow: 0 0 0 4px ${getThemeValue(THEME_NAME.ERROR_LIGHT)};\n }\n\n ${(props) =>\n props.touched\n ? `\n &:invalid {\n border-color: ${getThemeValue(THEME_NAME.ERROR)};\n }\n\n &:invalid + span {\n color: ${getThemeValue(THEME_NAME.ERROR)};\n }\n `\n : ''}\n\n /** Error */\n ${(props) =>\n props.errorText\n ? `\n border-color: ${getThemeValue(THEME_NAME.ERROR)};\n\n & + span {\n color: ${getThemeValue(THEME_NAME.ERROR)};\n }\n `\n : ''}\n\n /** Required */\n &:required + span:after {\n content: '*';\n margin-left: 2px;\n color: ${getThemeValue(THEME_NAME.ERROR)};\n }\n\n /** Label Animation */\n & + span {\n position: absolute;\n padding: 0 5px;\n top: 0px;\n left: 4px;\n font-size: 14px;\n line-height: 32px;\n transition: all 300ms ease;\n }\n\n ${(props) =>\n props.value !== ''\n ? `\n & + span {\n top: -8px;\n background: ${getThemeValue(THEME_NAME.BACKGROUND)};\n font-size: 12px;\n line-height: 14px;\n }\n `\n : ''}\n\n &:focus + span, &:placeholder-shown + span {\n top: -8px;\n background: ${getThemeValue(THEME_NAME.BACKGROUND)};\n font-size: 12px;\n line-height: 14px;\n }\n`;\n\nconst ErrorContainer = styled.div`\n color: ${getThemeValue(THEME_NAME.ERROR)};\n padding-top: 3px;\n font-size: 12px;\n line-height: 14px;\n margin-left: 3px;\n`;\n\nconst Input = React.forwardRef<HTMLInputElement, Omit<InputProps, 'as'>>((props, ref) => {\n const [touched, setTouched] = useState(false);\n const [value, setValue] = useState(props.value || '');\n const errorId = useId();\n\n useEffect(() => {\n if (props.value !== undefined) {\n setValue(props.value);\n }\n }, [props.value]);\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true);\n if (props.onFocus) {\n props.onFocus(e);\n }\n };\n\n const onChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (props.onChange) {\n setValue(e.target.value);\n props.onChange(e);\n } else {\n setValue(e.target.value);\n }\n };\n\n return (\n <Label>\n <TextField\n {...props}\n ref={ref}\n value={value}\n onChange={onChangeHandler}\n onFocus={handleFocus}\n touched={touched}\n aria-invalid={!!props.errorText}\n aria-required={props.required}\n aria-describedby={props.errorText ? errorId : undefined}\n />\n <span>{props.label}</span>\n {props.errorText && <ErrorContainer id={errorId}>{props.errorText}</ErrorContainer>}\n </Label>\n );\n});\n\nInput.displayName = 'Input';\n\nexport default Input;\n\nInput.propTypes = {\n /** Label for the field */\n label: PropTypes.string,\n /** Error text to be shown below the field */\n errorText: PropTypes.string,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Radio.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Radio.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,SAAS,MAAM,YAAY,CAAC;AA2EnC,iBAAS,KAAK,CACV,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,OAAO,KAAK,CAAC,SAAS,CAAC,oDAQlG;kBATQ,KAAK;;QAYV,0BAA0B;;;;AAI9B,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Radio.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Radio.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,SAAS,MAAM,YAAY,CAAC;AA4FnC,iBAAS,KAAK,CACV,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,OAAO,KAAK,CAAC,SAAS,CAAC,oDASlG;kBAVQ,KAAK;;QAaV,0BAA0B;;;;AAI9B,eAAe,KAAK,CAAC"}