@bspk/ui 1.3.20 → 1.3.22

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 (290) hide show
  1. package/dist/components/Accordion/Accordion.js +1 -1
  2. package/dist/components/Accordion/Accordion.js.map +1 -1
  3. package/dist/components/Accordion/accordion.css +19 -12
  4. package/dist/components/Accordion/accordion.css.js +19 -12
  5. package/dist/components/BottomNavigation/BottomNavigation.d.ts +0 -1
  6. package/dist/components/BottomNavigation/BottomNavigation.js +0 -1
  7. package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
  8. package/dist/components/BottomNavigation/bottom-navigation.css +1 -0
  9. package/dist/components/BottomNavigation/bottom-navigation.css.js +1 -0
  10. package/dist/components/Button/button.css +4 -0
  11. package/dist/components/Button/button.css.js +4 -0
  12. package/dist/components/Checkbox/Checkbox.js +3 -3
  13. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  14. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +4 -5
  15. package/dist/components/CheckboxGroup/CheckboxGroup.js +8 -13
  16. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
  17. package/dist/components/CheckboxGroup/CheckboxGroupExample.js +5 -0
  18. package/dist/components/CheckboxGroup/CheckboxGroupExample.js.map +1 -1
  19. package/dist/components/CheckboxGroup/checkbox-group.css +2 -0
  20. package/dist/components/CheckboxGroup/checkbox-group.css.js +2 -0
  21. package/dist/components/CheckboxGroupField/CheckboxGroupField.d.ts +3 -3
  22. package/dist/components/CheckboxGroupField/CheckboxGroupField.js +6 -4
  23. package/dist/components/CheckboxGroupField/CheckboxGroupField.js.map +1 -1
  24. package/dist/components/ChipGroup/ChipGroup.d.ts +0 -1
  25. package/dist/components/ChipGroup/ChipGroup.js +0 -1
  26. package/dist/components/ChipGroup/ChipGroup.js.map +1 -1
  27. package/dist/components/ChipGroup/chip-group.css +3 -0
  28. package/dist/components/ChipGroup/chip-group.css.js +3 -0
  29. package/dist/components/DatePicker/DatePicker.d.ts +4 -8
  30. package/dist/components/DatePicker/DatePicker.js +6 -18
  31. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  32. package/dist/components/DatePicker/DatePickerExample.js +3 -3
  33. package/dist/components/DatePicker/DatePickerExample.js.map +1 -1
  34. package/dist/components/DatePickerField/DatePickerField.d.ts +4 -4
  35. package/dist/components/DatePickerField/DatePickerField.js +6 -4
  36. package/dist/components/DatePickerField/DatePickerField.js.map +1 -1
  37. package/dist/components/Dialog/Dialog.d.ts +2 -3
  38. package/dist/components/Dialog/Dialog.js +2 -3
  39. package/dist/components/Dialog/Dialog.js.map +1 -1
  40. package/dist/components/Fab/Fab.d.ts +8 -5
  41. package/dist/components/Fab/Fab.js +8 -5
  42. package/dist/components/Fab/Fab.js.map +1 -1
  43. package/dist/components/Fab/fab.css +1 -0
  44. package/dist/components/Fab/fab.css.js +1 -0
  45. package/dist/components/Field/Field.d.ts +32 -18
  46. package/dist/components/Field/Field.js +8 -38
  47. package/dist/components/Field/Field.js.map +1 -1
  48. package/dist/components/Field/FieldExample.d.ts +1 -0
  49. package/dist/components/Field/FieldExample.js +10 -3
  50. package/dist/components/Field/FieldExample.js.map +1 -1
  51. package/dist/components/Field/Fieldset.d.ts +40 -0
  52. package/dist/components/Field/Fieldset.js +44 -0
  53. package/dist/components/Field/Fieldset.js.map +1 -0
  54. package/dist/components/Field/field.css +5 -7
  55. package/dist/components/Field/field.css.js +5 -7
  56. package/dist/components/Field/index.d.ts +1 -3
  57. package/dist/components/Field/index.js +1 -3
  58. package/dist/components/Field/index.js.map +1 -1
  59. package/dist/components/Field/utils.d.ts +8 -38
  60. package/dist/components/Field/utils.js +6 -33
  61. package/dist/components/Field/utils.js.map +1 -1
  62. package/dist/components/FileUpload/FileUpload.js +1 -1
  63. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  64. package/dist/components/FileUploadItem/FileUploadItem.js +1 -1
  65. package/dist/components/FileUploadItem/FileUploadItem.js.map +1 -1
  66. package/dist/components/Flex/Flex.d.ts +11 -7
  67. package/dist/components/Flex/Flex.js +12 -8
  68. package/dist/components/Flex/Flex.js.map +1 -1
  69. package/dist/components/InlineAlert/InlineAlert.d.ts +2 -2
  70. package/dist/components/InlineAlert/InlineAlert.js +2 -2
  71. package/dist/components/InlineAlert/InlineAlert.js.map +1 -1
  72. package/dist/components/Input/Input.d.ts +60 -15
  73. package/dist/components/Input/Input.js +42 -25
  74. package/dist/components/Input/Input.js.map +1 -1
  75. package/dist/components/Input/InputExample.js +4 -4
  76. package/dist/components/Input/InputExample.js.map +1 -1
  77. package/dist/components/Input/index.d.ts +0 -1
  78. package/dist/components/Input/index.js +0 -1
  79. package/dist/components/Input/index.js.map +1 -1
  80. package/dist/components/InputField/InputField.d.ts +4 -4
  81. package/dist/components/InputField/InputField.js +6 -4
  82. package/dist/components/InputField/InputField.js.map +1 -1
  83. package/dist/components/InputNumber/InputNumber.d.ts +8 -7
  84. package/dist/components/InputNumber/InputNumber.js +9 -16
  85. package/dist/components/InputNumber/InputNumber.js.map +1 -1
  86. package/dist/components/InputNumber/InputNumberExample.js +3 -3
  87. package/dist/components/InputNumber/InputNumberExample.js.map +1 -1
  88. package/dist/components/InputNumber/input-number.css +1 -0
  89. package/dist/components/InputNumber/input-number.css.js +1 -0
  90. package/dist/components/InputNumberField/InputNumberField.d.ts +4 -4
  91. package/dist/components/InputNumberField/InputNumberField.js +6 -4
  92. package/dist/components/InputNumberField/InputNumberField.js.map +1 -1
  93. package/dist/components/InputPhone/InputPhone.d.ts +8 -8
  94. package/dist/components/InputPhone/InputPhone.js +12 -18
  95. package/dist/components/InputPhone/InputPhone.js.map +1 -1
  96. package/dist/components/InputPhone/InputPhoneExample.js +3 -3
  97. package/dist/components/InputPhone/InputPhoneExample.js.map +1 -1
  98. package/dist/components/InputPhone/input-phone.css +1 -0
  99. package/dist/components/InputPhone/input-phone.css.js +1 -0
  100. package/dist/components/InputPhoneField/InputPhoneField.d.ts +4 -4
  101. package/dist/components/InputPhoneField/InputPhoneField.js +6 -4
  102. package/dist/components/InputPhoneField/InputPhoneField.js.map +1 -1
  103. package/dist/components/ListItem/list-item.css +1 -0
  104. package/dist/components/ListItem/list-item.css.js +1 -0
  105. package/dist/components/Modal/Modal.js +22 -26
  106. package/dist/components/Modal/Modal.js.map +1 -1
  107. package/dist/components/Modal/ModalExample.js +4 -1
  108. package/dist/components/Modal/ModalExample.js.map +1 -1
  109. package/dist/components/Modal/modal.css +4 -2
  110. package/dist/components/Modal/modal.css.js +4 -2
  111. package/dist/components/OTPInput/otp-input.css +1 -0
  112. package/dist/components/OTPInput/otp-input.css.js +1 -0
  113. package/dist/components/Pagination/Pagination.js +2 -2
  114. package/dist/components/Pagination/Pagination.js.map +1 -1
  115. package/dist/components/Password/Password.d.ts +9 -7
  116. package/dist/components/Password/Password.js +13 -17
  117. package/dist/components/Password/Password.js.map +1 -1
  118. package/dist/components/Password/PasswordExample.js +3 -3
  119. package/dist/components/Password/PasswordExample.js.map +1 -1
  120. package/dist/components/PasswordField/PasswordField.d.ts +4 -4
  121. package/dist/components/PasswordField/PasswordField.js +6 -4
  122. package/dist/components/PasswordField/PasswordField.js.map +1 -1
  123. package/dist/components/Popover/Popover.d.ts +0 -1
  124. package/dist/components/Popover/Popover.js +0 -1
  125. package/dist/components/Popover/Popover.js.map +1 -1
  126. package/dist/components/RadioGroup/RadioGroup.d.ts +1 -2
  127. package/dist/components/RadioGroup/RadioGroup.js +5 -11
  128. package/dist/components/RadioGroup/RadioGroup.js.map +1 -1
  129. package/dist/components/RadioGroupField/RadioGroupField.d.ts +3 -3
  130. package/dist/components/RadioGroupField/RadioGroupField.js +6 -4
  131. package/dist/components/RadioGroupField/RadioGroupField.js.map +1 -1
  132. package/dist/components/SearchBar/SearchBar.d.ts +0 -1
  133. package/dist/components/SearchBar/SearchBar.js +0 -1
  134. package/dist/components/SearchBar/SearchBar.js.map +1 -1
  135. package/dist/components/SegmentedControl/SegmentedControl.d.ts +0 -1
  136. package/dist/components/SegmentedControl/SegmentedControl.js +0 -1
  137. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  138. package/dist/components/Select/Select.d.ts +7 -6
  139. package/dist/components/Select/Select.js +10 -15
  140. package/dist/components/Select/Select.js.map +1 -1
  141. package/dist/components/Select/SelectExample.js +3 -3
  142. package/dist/components/Select/SelectExample.js.map +1 -1
  143. package/dist/components/SelectField/SelectField.d.ts +4 -4
  144. package/dist/components/SelectField/SelectField.js +6 -4
  145. package/dist/components/SelectField/SelectField.js.map +1 -1
  146. package/dist/components/Slider/Slider.d.ts +1 -2
  147. package/dist/components/Slider/Slider.js +1 -2
  148. package/dist/components/Slider/Slider.js.map +1 -1
  149. package/dist/components/Snackbar/Snackbar.d.ts +0 -1
  150. package/dist/components/Snackbar/Snackbar.js +0 -1
  151. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  152. package/dist/components/Switch/Switch.d.ts +0 -1
  153. package/dist/components/Switch/Switch.js +0 -1
  154. package/dist/components/Switch/Switch.js.map +1 -1
  155. package/dist/components/TabGroup/TabGroup.d.ts +0 -1
  156. package/dist/components/TabGroup/TabGroup.js +0 -1
  157. package/dist/components/TabGroup/TabGroup.js.map +1 -1
  158. package/dist/components/TabList/TabList.d.ts +0 -1
  159. package/dist/components/TabList/TabList.js +0 -1
  160. package/dist/components/TabList/TabList.js.map +1 -1
  161. package/dist/components/TabList/tab-list.css +1 -0
  162. package/dist/components/TabList/tab-list.css.js +1 -0
  163. package/dist/components/Table/table.css +2 -1
  164. package/dist/components/Table/table.css.js +2 -1
  165. package/dist/components/Textarea/Textarea.d.ts +4 -7
  166. package/dist/components/Textarea/Textarea.js +5 -16
  167. package/dist/components/Textarea/Textarea.js.map +1 -1
  168. package/dist/components/Textarea/TextareaExample.js +3 -3
  169. package/dist/components/Textarea/TextareaExample.js.map +1 -1
  170. package/dist/components/TextareaField/TextareaField.d.ts +4 -4
  171. package/dist/components/TextareaField/TextareaField.js +6 -4
  172. package/dist/components/TextareaField/TextareaField.js.map +1 -1
  173. package/dist/components/TimePicker/TimePicker.d.ts +8 -6
  174. package/dist/components/TimePicker/TimePicker.js +10 -14
  175. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  176. package/dist/components/TimePicker/TimePickerExample.js +3 -3
  177. package/dist/components/TimePicker/TimePickerExample.js.map +1 -1
  178. package/dist/components/TimePickerField/TimePickerField.d.ts +4 -4
  179. package/dist/components/TimePickerField/TimePickerField.js +6 -4
  180. package/dist/components/TimePickerField/TimePickerField.js.map +1 -1
  181. package/dist/types/common.d.ts +2 -0
  182. package/dist/types/common.js.map +1 -1
  183. package/dist/utils/demo.js +1 -1
  184. package/dist/utils/demo.js.map +1 -1
  185. package/package.json +3 -4
  186. package/src/components/Accordion/Accordion.tsx +2 -2
  187. package/src/components/Accordion/accordion.scss +10 -1
  188. package/src/components/BottomNavigation/BottomNavigation.tsx +0 -1
  189. package/src/components/BottomNavigation/bottom-navigation.scss +1 -0
  190. package/src/components/Button/button.scss +4 -0
  191. package/src/components/Checkbox/Checkbox.tsx +3 -3
  192. package/src/components/CheckboxGroup/CheckboxGroup.tsx +37 -52
  193. package/src/components/CheckboxGroup/CheckboxGroupExample.tsx +6 -0
  194. package/src/components/CheckboxGroup/checkbox-group.scss +2 -0
  195. package/src/components/CheckboxGroupField/CheckboxGroupField.tsx +15 -11
  196. package/src/components/ChipGroup/ChipGroup.tsx +0 -1
  197. package/src/components/ChipGroup/chip-group.scss +4 -0
  198. package/src/components/DatePicker/DatePicker.tsx +9 -20
  199. package/src/components/DatePicker/DatePickerExample.tsx +3 -5
  200. package/src/components/DatePickerField/DatePickerField.rtl.test.tsx +1 -1
  201. package/src/components/DatePickerField/DatePickerField.tsx +10 -6
  202. package/src/components/Dialog/Dialog.tsx +2 -3
  203. package/src/components/Fab/Fab.tsx +8 -5
  204. package/src/components/Fab/fab.scss +1 -0
  205. package/src/components/Field/Field.rtl.test.tsx +8 -6
  206. package/src/components/Field/Field.tsx +64 -61
  207. package/src/components/Field/FieldExample.tsx +27 -5
  208. package/src/components/Field/Fieldset.tsx +78 -0
  209. package/src/components/Field/field.scss +23 -27
  210. package/src/components/Field/index.tsx +1 -3
  211. package/src/components/Field/utils.ts +15 -77
  212. package/src/components/FileUpload/FileUpload.tsx +1 -1
  213. package/src/components/FileUploadItem/FileUploadItem.tsx +1 -1
  214. package/src/components/Flex/Flex.tsx +12 -7
  215. package/src/components/InlineAlert/InlineAlert.rtl.test.tsx +1 -1
  216. package/src/components/InlineAlert/InlineAlert.tsx +3 -3
  217. package/src/components/Input/Input.tsx +140 -48
  218. package/src/components/Input/InputExample.tsx +4 -6
  219. package/src/components/Input/index.tsx +0 -1
  220. package/src/components/InputField/InputField.tsx +10 -6
  221. package/src/components/InputNumber/InputNumber.tsx +11 -16
  222. package/src/components/InputNumber/InputNumberExample.tsx +7 -4
  223. package/src/components/InputNumber/input-number.scss +1 -0
  224. package/src/components/InputNumberField/InputNumberField.tsx +10 -6
  225. package/src/components/InputPhone/InputPhone.tsx +14 -18
  226. package/src/components/InputPhone/InputPhoneExample.tsx +7 -6
  227. package/src/components/InputPhone/input-phone.scss +1 -0
  228. package/src/components/InputPhoneField/InputPhoneField.tsx +10 -6
  229. package/src/components/ListItem/list-item.scss +1 -0
  230. package/src/components/Modal/Modal.tsx +26 -30
  231. package/src/components/Modal/ModalExample.tsx +7 -2
  232. package/src/components/Modal/modal.scss +1 -1
  233. package/src/components/OTPInput/otp-input.scss +1 -0
  234. package/src/components/Pagination/Pagination.tsx +2 -2
  235. package/src/components/Password/Password.tsx +15 -17
  236. package/src/components/Password/PasswordExample.tsx +13 -5
  237. package/src/components/PasswordField/PasswordField.tsx +10 -6
  238. package/src/components/Popover/Popover.tsx +0 -1
  239. package/src/components/RadioGroup/RadioGroup.tsx +14 -20
  240. package/src/components/RadioGroupField/RadioGroupField.tsx +16 -11
  241. package/src/components/SearchBar/SearchBar.tsx +0 -1
  242. package/src/components/SegmentedControl/SegmentedControl.tsx +0 -1
  243. package/src/components/Select/Select.tsx +13 -14
  244. package/src/components/Select/SelectExample.tsx +7 -4
  245. package/src/components/SelectField/SelectField.rtl.test.tsx +7 -18
  246. package/src/components/SelectField/SelectField.tsx +10 -6
  247. package/src/components/Slider/Slider.tsx +1 -2
  248. package/src/components/Snackbar/Snackbar.tsx +0 -1
  249. package/src/components/Switch/Switch.tsx +0 -1
  250. package/src/components/TabGroup/TabGroup.tsx +0 -1
  251. package/src/components/TabList/TabList.tsx +0 -1
  252. package/src/components/TabList/tab-list.scss +1 -0
  253. package/src/components/Table/table.scss +2 -1
  254. package/src/components/Textarea/Textarea.tsx +8 -17
  255. package/src/components/Textarea/TextareaExample.tsx +3 -5
  256. package/src/components/TextareaField/TextareaField.tsx +10 -6
  257. package/src/components/TimePicker/TimePicker.tsx +12 -15
  258. package/src/components/TimePicker/TimePickerExample.tsx +3 -5
  259. package/src/components/TimePickerField/TimePickerField.tsx +10 -6
  260. package/src/types/common.ts +8 -0
  261. package/src/utils/demo.ts +1 -1
  262. package/dist/components/Field/FieldDescription.d.ts +0 -9
  263. package/dist/components/Field/FieldDescription.js +0 -13
  264. package/dist/components/Field/FieldDescription.js.map +0 -1
  265. package/dist/components/Field/FieldError.d.ts +0 -11
  266. package/dist/components/Field/FieldError.js +0 -14
  267. package/dist/components/Field/FieldError.js.map +0 -1
  268. package/dist/components/Field/FieldLabel.d.ts +0 -21
  269. package/dist/components/Field/FieldLabel.js +0 -14
  270. package/dist/components/Field/FieldLabel.js.map +0 -1
  271. package/dist/components/FormField/FormField.d.ts +0 -66
  272. package/dist/components/FormField/FormField.js +0 -31
  273. package/dist/components/FormField/FormField.js.map +0 -1
  274. package/dist/components/FormField/FormFieldExample.d.ts +0 -9
  275. package/dist/components/FormField/FormFieldExample.js +0 -99
  276. package/dist/components/FormField/FormFieldExample.js.map +0 -1
  277. package/dist/components/FormField/index.d.ts +0 -1
  278. package/dist/components/FormField/index.js +0 -2
  279. package/dist/components/FormField/index.js.map +0 -1
  280. package/dist/components/Input/InputElement.d.ts +0 -82
  281. package/dist/components/Input/InputElement.js +0 -64
  282. package/dist/components/Input/InputElement.js.map +0 -1
  283. package/src/components/Field/FieldDescription.tsx +0 -17
  284. package/src/components/Field/FieldError.tsx +0 -25
  285. package/src/components/Field/FieldLabel.tsx +0 -44
  286. package/src/components/FormField/FormField.rtl.test.tsx +0 -20
  287. package/src/components/FormField/FormField.tsx +0 -95
  288. package/src/components/FormField/FormFieldExample.tsx +0 -277
  289. package/src/components/FormField/index.tsx +0 -1
  290. package/src/components/Input/InputElement.tsx +0 -192
@@ -1,277 +0,0 @@
1
- import { useState } from 'react';
2
- import { FormField, FormFieldProps } from '.';
3
- import { Button } from '-/components/Button';
4
- import { CheckboxGroup } from '-/components/CheckboxGroup';
5
- import { DatePicker } from '-/components/DatePicker';
6
- import { Input } from '-/components/Input';
7
- import { InputNumber } from '-/components/InputNumber';
8
- import { InputPhone } from '-/components/InputPhone';
9
- import { Password } from '-/components/Password';
10
- import { RadioGroup } from '-/components/RadioGroup';
11
- import { Select } from '-/components/Select';
12
- import { SwitchOption } from '-/components/SwitchOption';
13
- import { Textarea } from '-/components/Textarea';
14
- import { TimePicker } from '-/components/TimePicker';
15
- import { FieldControlProps } from '-/types/common';
16
- import { ComponentExample, Preset, Syntax } from '-/utils/demo';
17
-
18
- export type ExampleProps = Partial<FieldControlProps & FormFieldProps>;
19
-
20
- export const presets: Preset<Partial<ExampleProps>>[] = [
21
- {
22
- label: 'Control Disabled',
23
- propState: { disabled: true },
24
- },
25
- ];
26
-
27
- export const FormFieldExample: ComponentExample<ExampleProps> = {
28
- defaultState: {},
29
- disableProps: [],
30
- presets: presets as Preset<ExampleProps>[],
31
- render: ({ props, Component }) => (
32
- <Component {...props}>
33
- <Input name="input" onChange={() => {}} placeholder="Example input" value="" />
34
- </Component>
35
- ),
36
- sections: [
37
- {
38
- title: 'Form Field Example',
39
- content: ({ Syntax: syntax, props }) => (
40
- <>
41
- <p>
42
- This example demonstrates the FormField component wrapping various form controls including
43
- CheckboxGroup, RadioGroup, DatePicker, Input, InputNumber, InputPhone, Password, Select,
44
- Textarea, and TimePicker. It showcases how to manage state and handle form submissions.
45
- </p>
46
- <p>
47
- All the controls have a HTML input element inside of them so they will work with form
48
- submissions natively. You can see the raw submitted{' '}
49
- <a href="https://developer.mozilla.org/en-US/docs/Web/API/FormData">FormData</a> at the bottom
50
- after clicking the Submit button.
51
- </p>
52
- <FormFieldExampleRender {...props} syntax={syntax} />
53
- </>
54
- ),
55
- location: 'afterDemo',
56
- },
57
- ],
58
- variants: false,
59
- };
60
-
61
- export function FormFieldExampleRender({ ...props }: ExampleProps & { syntax?: Syntax }) {
62
- const [value, setValueState] = useState<{ [key: string]: unknown }>({});
63
-
64
- const setValue = (next: { [key: string]: unknown }) => {
65
- setValueState((prev) => ({ ...prev, ...next }));
66
- };
67
-
68
- const [formValues, setFormValues] = useState<{ [key: string]: unknown }>({});
69
-
70
- const [disabled, setDisabled] = useState(!!props.disabled);
71
- const [required, setRequired] = useState(!!props.required);
72
-
73
- const [fieldProps, setFieldProps] = useState<{
74
- errorMessage: boolean;
75
- description: boolean;
76
- }>({
77
- errorMessage: false,
78
- description: false,
79
- });
80
-
81
- const internalProps = (label: string) => {
82
- return {
83
- errorMessage: fieldProps.errorMessage ? `This is an error message for the ${label}.` : undefined,
84
- helperText: fieldProps.description ? `This is a description for the ${label}.` : undefined,
85
- label,
86
- };
87
- };
88
-
89
- return (
90
- <>
91
- <div
92
- style={{
93
- display: 'flex',
94
- flexDirection: 'row',
95
- }}
96
- >
97
- <SwitchOption
98
- checked={fieldProps.errorMessage}
99
- label="Has Error"
100
- name="hasError"
101
- onChange={(checked) => setFieldProps((prev) => ({ ...prev, errorMessage: checked }))}
102
- value="hasError"
103
- />
104
- <SwitchOption
105
- checked={disabled}
106
- label="Disabled"
107
- name="disabled"
108
- onChange={setDisabled}
109
- value="disabled"
110
- />
111
- <SwitchOption
112
- checked={required}
113
- label="Required"
114
- name="required"
115
- onChange={setRequired}
116
- value="required"
117
- />
118
- <SwitchOption
119
- checked={!!fieldProps.description}
120
- label="With Description"
121
- name="description"
122
- onChange={(checked) => setFieldProps((prev) => ({ ...prev, description: checked }))}
123
- value="description"
124
- />
125
- </div>
126
- <form
127
- onReset={() => {
128
- setValueState({});
129
- setFormValues({});
130
- }}
131
- onSubmit={(e) => {
132
- e.preventDefault();
133
- const formData = new FormData(e.currentTarget);
134
- const next: { [key: string]: unknown[] | unknown } = {};
135
- // handle multiple form entries with the same name
136
- formData.forEach((fieldValue, key) => {
137
- if (next[key]) {
138
- if (Array.isArray(next[key])) {
139
- (next[key] as unknown[]).push(fieldValue);
140
- } else {
141
- next[key] = [next[key], fieldValue];
142
- }
143
- } else {
144
- next[key] = fieldValue;
145
- }
146
- });
147
- setFormValues(next);
148
- }}
149
- style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-sizing-04)', width: '400px' }}
150
- >
151
- <FormField {...props} as="fieldset" {...internalProps('CheckboxGroup')}>
152
- <CheckboxGroup
153
- disabled={disabled}
154
- name="checkbox-group"
155
- onChange={(next) => setValue({ 'checkbox-group': next })}
156
- options={[
157
- { label: 'Option 1', value: 'option1' },
158
- { label: 'Option 2', value: 'option2' },
159
- { label: 'Option 3', value: 'option3' },
160
- ]}
161
- required={required}
162
- value={value['checkbox-group'] as string[]}
163
- />
164
- </FormField>
165
- <FormField {...props} as="fieldset" {...internalProps('RadioGroup')}>
166
- <RadioGroup
167
- disabled={disabled}
168
- name="radio-group"
169
- onChange={(next) => setValue({ 'radio-group': next })}
170
- options={[
171
- { label: 'Option 1', value: 'option1' },
172
- { label: 'Option 2', value: 'option2' },
173
- { label: 'Option 3', value: 'option3' },
174
- ]}
175
- required={required}
176
- value={value['radio-group'] as string}
177
- />
178
- </FormField>
179
- <FormField {...props} {...internalProps('DatePicker')}>
180
- <DatePicker
181
- disabled={disabled}
182
- name="date-picker"
183
- onChange={(next) => setValue({ 'date-picker': next })}
184
- placeholder="Example input"
185
- required={required}
186
- value={value['date-picker'] as string}
187
- />
188
- </FormField>
189
- <FormField {...props} {...internalProps('Input')}>
190
- <Input
191
- disabled={disabled}
192
- name="input"
193
- onChange={(next) => setValue({ input: next })}
194
- placeholder="Example input"
195
- required={required}
196
- value={value['input'] as string}
197
- />
198
- </FormField>
199
- <FormField {...props} {...internalProps('InputNumber')}>
200
- <InputNumber
201
- disabled={disabled}
202
- name="input-number"
203
- onChange={(next) => setValue({ 'input-number': next })}
204
- required={required}
205
- value={value['input-number'] as number}
206
- />
207
- </FormField>
208
- <FormField {...props} {...internalProps('InputPhone')}>
209
- <InputPhone
210
- disabled={disabled}
211
- name="input-phone"
212
- onChange={(next) => setValue({ 'input-phone': next })}
213
- required={required}
214
- value={value['input-phone'] as string}
215
- />
216
- </FormField>
217
- <FormField {...props} {...internalProps('Password')}>
218
- <Password
219
- disabled={disabled}
220
- name="password"
221
- onChange={(next) => setValue({ password: next })}
222
- required={required}
223
- value={value['password'] as string}
224
- />
225
- </FormField>
226
- <FormField {...props} {...internalProps('Select')}>
227
- <Select
228
- disabled={disabled}
229
- name="select"
230
- onChange={(next) => setValue({ select: next })}
231
- options={[
232
- { label: 'Option 1', value: 'option1' },
233
- { label: 'Option 2', value: 'option2' },
234
- { label: 'Option 3', value: 'option3' },
235
- ]}
236
- placeholder="Example input"
237
- required={required}
238
- value={value['select'] as string}
239
- />
240
- </FormField>
241
- <FormField {...props} {...internalProps('Textarea')}>
242
- <Textarea
243
- disabled={disabled}
244
- name="textarea"
245
- onChange={(next) => setValue({ textarea: next })}
246
- placeholder="Example input"
247
- required={required}
248
- value={value['textarea'] as string}
249
- />
250
- </FormField>
251
- <FormField {...props} {...internalProps('TimePicker')}>
252
- <TimePicker
253
- disabled={disabled}
254
- name="time-picker"
255
- onChange={(next) => setValue({ 'time-picker': next })}
256
- required={required}
257
- value={value['time-picker'] as string}
258
- />
259
- </FormField>
260
- <div style={{ display: 'flex', flexDirection: 'row', gap: 'var(--spacing-sizing-02)' }}>
261
- <Button label="Reset" type="reset" variant="secondary" />
262
- <Button label="Submit" type="submit" variant="primary" />
263
- </div>
264
- <code
265
- style={{
266
- background: 'var(--surface-neutral-t3-low)',
267
- // fontWeight: 'bold',
268
- padding: 'var(--spacing-sizing-02)',
269
- borderRadius: 'var(--radius-sm)',
270
- }}
271
- >
272
- <pre>{`// Raw FormData\n\n${JSON.stringify(formValues, null, 2)}`}</pre>
273
- </code>
274
- </form>
275
- </>
276
- );
277
- }
@@ -1 +0,0 @@
1
- export * from './FormField';
@@ -1,192 +0,0 @@
1
- import './input.scss';
2
- import { SvgCancel } from '@bspk/icons/Cancel';
3
- import { HTMLInputTypeAttribute, ReactNode, useMemo, useRef } from 'react';
4
- import { Button } from '-/components/Button';
5
- import { FieldContextProps } from '-/components/Field';
6
- import { useTimeout } from '-/hooks/useTimeout';
7
- import { CommonProps, ElementProps, SetRef, FieldControlProps } from '-/types/common';
8
-
9
- export const DEFAULT = {
10
- size: 'medium',
11
- value: '',
12
- type: 'text' as Extract<HTMLInputTypeAttribute, 'number' | 'text'>,
13
- autoComplete: 'off',
14
- } as const;
15
-
16
- export type InputElementBaseProps = CommonProps<'owner' | 'size'> &
17
- FieldControlProps &
18
- Pick<FieldContextProps, 'ariaDescribedBy' | 'ariaErrorMessage'> & {
19
- /** The ref of the container. */
20
- containerRef?: SetRef<HTMLDivElement>;
21
- /** The ref of the input. */
22
- inputRef?: SetRef<HTMLInputElement>;
23
- /**
24
- * The trailing element to display in the field.
25
- *
26
- * @exampleType string
27
- */
28
- trailing?: ReactNode;
29
- /**
30
- * The leading element to display in the field.
31
- *
32
- * @exampleType string
33
- */
34
- leading?: ReactNode;
35
- /** The placeholder of the field. */
36
- placeholder?: string;
37
- /**
38
- * The type of the input.
39
- *
40
- * @default text
41
- */
42
- type?: Extract<HTMLInputTypeAttribute, 'number' | 'password' | 'text'>;
43
- /**
44
- * Specifies if user agent has any permission to provide automated assistance in filling out form field values
45
- *
46
- * @default off
47
- */
48
- autoComplete?: 'off' | 'on';
49
- /**
50
- * Specifies if the clear button should be shown. This should almost always be true, but can be set to false.
51
- *
52
- * @default true
53
- */
54
- showClearButton?: boolean;
55
- };
56
-
57
- export type InputElementProps = InputElementBaseProps & {
58
- inputProps?: Omit<React.InputHTMLAttributes<HTMLInputElement>, keyof InputElementBaseProps>;
59
- };
60
-
61
- /**
62
- * An input that allows users to enter text, numbers or symbols in a singular line. This is a utility element and is not
63
- * intended to be used directly but rather through the Input, and other components.
64
- *
65
- * @example
66
- * import { useState } from 'react';
67
- * import { InputElement } from '@bspk/ui/InputElement';
68
- * import { Field, FieldLabel } from '@bspk/ui/Field';
69
- *
70
- * () => {
71
- * const [value, setValue] = useState('');
72
- *
73
- * return (
74
- * <>
75
- * // standalone input element example
76
- * <InputElement name="example-name" onChange={setValue} value={value} />
77
- * <br />
78
- * // input element used within a field
79
- * <Field>
80
- * <FieldLabel>Example Label</FieldLabel>
81
- * <InputElement name="example-name" onChange={setValue} value={value} />
82
- * </Field>
83
- * </>
84
- * );
85
- * };
86
- *
87
- * @name InputElement
88
- * @phase Utility
89
- */
90
- export function InputElement({
91
- invalid,
92
- onChange,
93
- size = DEFAULT.size,
94
- value = DEFAULT.value,
95
- name,
96
- 'aria-label': ariaLabel = 'Input',
97
- inputRef,
98
- required = false,
99
- placeholder,
100
- id,
101
- leading,
102
- trailing,
103
- type = DEFAULT.type,
104
- readOnly,
105
- disabled,
106
- autoComplete = DEFAULT.autoComplete,
107
- containerRef,
108
- showClearButton: showClearButtonProp = true,
109
- owner,
110
- inputProps,
111
- ariaDescribedBy,
112
- ariaErrorMessage,
113
- ...props
114
- }: ElementProps<InputElementProps, 'div'>) {
115
- const showClearButton = useMemo(
116
- () => showClearButtonProp !== false && !readOnly && !disabled && !!value?.toString().length,
117
- [showClearButtonProp, readOnly, disabled, value],
118
- );
119
-
120
- const inputRefInternal = useRef<HTMLInputElement | null>(null);
121
-
122
- const focusTimeout = useTimeout();
123
-
124
- return (
125
- <div
126
- {...props}
127
- data-bspk="input"
128
- data-bspk-owner={owner || undefined}
129
- data-disabled={disabled || undefined}
130
- data-empty={!value.toString().length || undefined}
131
- data-invalid={invalid || undefined}
132
- data-readonly={readOnly || undefined}
133
- data-show-clear-button={showClearButton || undefined}
134
- data-size={size}
135
- ref={containerRef}
136
- >
137
- {leading && <span data-leading>{leading}</span>}
138
-
139
- <input
140
- {...inputProps}
141
- aria-describedby={ariaDescribedBy || undefined}
142
- aria-errormessage={ariaErrorMessage || undefined}
143
- aria-invalid={invalid || undefined}
144
- aria-label={ariaLabel}
145
- autoComplete={autoComplete}
146
- data-main-input
147
- disabled={disabled || undefined}
148
- id={id}
149
- name={name}
150
- onBlur={(event) => {
151
- inputProps?.onBlur?.(event);
152
- }}
153
- onChange={(event) => {
154
- onChange(event.target.value, event);
155
- }}
156
- onFocus={(event) => {
157
- inputProps?.onFocus?.(event);
158
- }}
159
- placeholder={placeholder || ' '}
160
- readOnly={readOnly || undefined}
161
- ref={(node) => {
162
- if (!node) return;
163
- inputRef?.(node);
164
- inputRefInternal.current = node;
165
- }}
166
- required={required || undefined}
167
- type={type}
168
- value={value || ''}
169
- />
170
- {trailing && <span data-trailing>{trailing}</span>}
171
- {showClearButton && (
172
- <Button
173
- data-clear-button
174
- icon={<SvgCancel />}
175
- iconOnly
176
- label="Clear"
177
- onClick={() => {
178
- onChange('');
179
- inputRefInternal.current?.focus();
180
- }}
181
- onFocus={() => {
182
- focusTimeout.clear();
183
- }}
184
- size={size}
185
- variant="tertiary"
186
- />
187
- )}
188
- </div>
189
- );
190
- }
191
-
192
- /** Copyright 2025 Anywhere Real Estate - CC BY 4.0 */