@bspk/ui 1.3.21 → 1.3.23

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 (307) 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 +5 -0
  20. package/dist/components/CheckboxGroup/checkbox-group.css.js +5 -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 +39 -20
  46. package/dist/components/Field/Field.js +10 -40
  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 +9 -7
  55. package/dist/components/Field/field.css.js +9 -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 +10 -6
  67. package/dist/components/Flex/Flex.js +10 -6
  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 +59 -15
  73. package/dist/components/Input/Input.js +40 -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/Link/Link.d.ts +0 -1
  104. package/dist/components/Link/Link.js +0 -1
  105. package/dist/components/Link/Link.js.map +1 -1
  106. package/dist/components/ListItem/list-item.css +1 -0
  107. package/dist/components/ListItem/list-item.css.js +1 -0
  108. package/dist/components/Modal/Modal.js +22 -26
  109. package/dist/components/Modal/Modal.js.map +1 -1
  110. package/dist/components/Modal/ModalExample.js +4 -1
  111. package/dist/components/Modal/ModalExample.js.map +1 -1
  112. package/dist/components/Modal/modal.css +4 -2
  113. package/dist/components/Modal/modal.css.js +4 -2
  114. package/dist/components/OTPInput/otp-input.css +1 -0
  115. package/dist/components/OTPInput/otp-input.css.js +1 -0
  116. package/dist/components/Pagination/Pagination.js +2 -2
  117. package/dist/components/Pagination/Pagination.js.map +1 -1
  118. package/dist/components/Password/Password.d.ts +9 -7
  119. package/dist/components/Password/Password.js +13 -17
  120. package/dist/components/Password/Password.js.map +1 -1
  121. package/dist/components/Password/PasswordExample.js +3 -3
  122. package/dist/components/Password/PasswordExample.js.map +1 -1
  123. package/dist/components/PasswordField/PasswordField.d.ts +4 -4
  124. package/dist/components/PasswordField/PasswordField.js +6 -4
  125. package/dist/components/PasswordField/PasswordField.js.map +1 -1
  126. package/dist/components/Popover/Popover.d.ts +0 -1
  127. package/dist/components/Popover/Popover.js +0 -1
  128. package/dist/components/Popover/Popover.js.map +1 -1
  129. package/dist/components/RadioGroup/RadioGroup.d.ts +1 -2
  130. package/dist/components/RadioGroup/RadioGroup.js +5 -11
  131. package/dist/components/RadioGroup/RadioGroup.js.map +1 -1
  132. package/dist/components/RadioGroup/radio-group.css +3 -0
  133. package/dist/components/RadioGroup/radio-group.css.js +3 -0
  134. package/dist/components/RadioGroupField/RadioGroupField.d.ts +3 -3
  135. package/dist/components/RadioGroupField/RadioGroupField.js +6 -4
  136. package/dist/components/RadioGroupField/RadioGroupField.js.map +1 -1
  137. package/dist/components/SearchBar/SearchBar.d.ts +0 -1
  138. package/dist/components/SearchBar/SearchBar.js +0 -1
  139. package/dist/components/SearchBar/SearchBar.js.map +1 -1
  140. package/dist/components/SegmentedControl/SegmentedControl.d.ts +0 -1
  141. package/dist/components/SegmentedControl/SegmentedControl.js +0 -1
  142. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  143. package/dist/components/Select/Select.d.ts +7 -6
  144. package/dist/components/Select/Select.js +10 -15
  145. package/dist/components/Select/Select.js.map +1 -1
  146. package/dist/components/Select/SelectExample.js +3 -3
  147. package/dist/components/Select/SelectExample.js.map +1 -1
  148. package/dist/components/Select/select.css +0 -10
  149. package/dist/components/Select/select.css.js +0 -10
  150. package/dist/components/SelectField/SelectField.d.ts +4 -4
  151. package/dist/components/SelectField/SelectField.js +6 -4
  152. package/dist/components/SelectField/SelectField.js.map +1 -1
  153. package/dist/components/Slider/Slider.d.ts +1 -2
  154. package/dist/components/Slider/Slider.js +1 -2
  155. package/dist/components/Slider/Slider.js.map +1 -1
  156. package/dist/components/Snackbar/Snackbar.d.ts +0 -1
  157. package/dist/components/Snackbar/Snackbar.js +0 -1
  158. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  159. package/dist/components/Switch/Switch.d.ts +0 -1
  160. package/dist/components/Switch/Switch.js +0 -1
  161. package/dist/components/Switch/Switch.js.map +1 -1
  162. package/dist/components/TabGroup/TabGroup.d.ts +0 -1
  163. package/dist/components/TabGroup/TabGroup.js +0 -1
  164. package/dist/components/TabGroup/TabGroup.js.map +1 -1
  165. package/dist/components/TabList/TabList.d.ts +0 -1
  166. package/dist/components/TabList/TabList.js +0 -1
  167. package/dist/components/TabList/TabList.js.map +1 -1
  168. package/dist/components/TabList/tab-list.css +1 -0
  169. package/dist/components/TabList/tab-list.css.js +1 -0
  170. package/dist/components/Table/table.css +2 -1
  171. package/dist/components/Table/table.css.js +2 -1
  172. package/dist/components/Textarea/Textarea.d.ts +4 -7
  173. package/dist/components/Textarea/Textarea.js +5 -16
  174. package/dist/components/Textarea/Textarea.js.map +1 -1
  175. package/dist/components/Textarea/TextareaExample.js +3 -3
  176. package/dist/components/Textarea/TextareaExample.js.map +1 -1
  177. package/dist/components/TextareaField/TextareaField.d.ts +4 -4
  178. package/dist/components/TextareaField/TextareaField.js +6 -4
  179. package/dist/components/TextareaField/TextareaField.js.map +1 -1
  180. package/dist/components/TimePicker/TimePicker.d.ts +8 -6
  181. package/dist/components/TimePicker/TimePicker.js +10 -14
  182. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  183. package/dist/components/TimePicker/TimePickerExample.js +3 -3
  184. package/dist/components/TimePicker/TimePickerExample.js.map +1 -1
  185. package/dist/components/TimePickerField/TimePickerField.d.ts +4 -4
  186. package/dist/components/TimePickerField/TimePickerField.js +6 -4
  187. package/dist/components/TimePickerField/TimePickerField.js.map +1 -1
  188. package/dist/hooks/useFloating.d.ts +0 -6
  189. package/dist/hooks/useFloating.js +0 -6
  190. package/dist/hooks/useFloating.js.map +1 -1
  191. package/dist/styles/base.css +71 -81
  192. package/dist/styles/base.css.js +71 -81
  193. package/dist/types/common.d.ts +3 -0
  194. package/dist/types/common.js.map +1 -1
  195. package/package.json +3 -4
  196. package/src/components/Accordion/Accordion.tsx +2 -2
  197. package/src/components/Accordion/accordion.scss +10 -1
  198. package/src/components/BottomNavigation/BottomNavigation.tsx +0 -1
  199. package/src/components/BottomNavigation/bottom-navigation.scss +1 -0
  200. package/src/components/Button/button.scss +4 -0
  201. package/src/components/Checkbox/Checkbox.tsx +3 -3
  202. package/src/components/CheckboxGroup/CheckboxGroup.tsx +37 -52
  203. package/src/components/CheckboxGroup/CheckboxGroupExample.tsx +6 -0
  204. package/src/components/CheckboxGroup/checkbox-group.scss +6 -0
  205. package/src/components/CheckboxGroupField/CheckboxGroupField.tsx +16 -11
  206. package/src/components/ChipGroup/ChipGroup.tsx +0 -1
  207. package/src/components/ChipGroup/chip-group.scss +4 -0
  208. package/src/components/DatePicker/DatePicker.tsx +9 -20
  209. package/src/components/DatePicker/DatePickerExample.tsx +3 -5
  210. package/src/components/DatePickerField/DatePickerField.rtl.test.tsx +1 -1
  211. package/src/components/DatePickerField/DatePickerField.tsx +11 -6
  212. package/src/components/Dialog/Dialog.tsx +2 -3
  213. package/src/components/Fab/Fab.tsx +8 -5
  214. package/src/components/Fab/fab.scss +1 -0
  215. package/src/components/Field/Field.rtl.test.tsx +8 -6
  216. package/src/components/Field/Field.tsx +71 -63
  217. package/src/components/Field/FieldExample.tsx +27 -5
  218. package/src/components/Field/Fieldset.tsx +82 -0
  219. package/src/components/Field/field.scss +27 -26
  220. package/src/components/Field/index.tsx +1 -3
  221. package/src/components/Field/utils.ts +15 -77
  222. package/src/components/FileUpload/FileUpload.tsx +1 -1
  223. package/src/components/FileUploadItem/FileUploadItem.tsx +1 -1
  224. package/src/components/Flex/Flex.tsx +10 -6
  225. package/src/components/InlineAlert/InlineAlert.rtl.test.tsx +1 -1
  226. package/src/components/InlineAlert/InlineAlert.tsx +3 -3
  227. package/src/components/Input/Input.tsx +135 -48
  228. package/src/components/Input/InputExample.tsx +4 -6
  229. package/src/components/Input/index.tsx +0 -1
  230. package/src/components/InputField/InputField.tsx +11 -6
  231. package/src/components/InputNumber/InputNumber.tsx +11 -16
  232. package/src/components/InputNumber/InputNumberExample.tsx +7 -4
  233. package/src/components/InputNumber/input-number.scss +1 -0
  234. package/src/components/InputNumberField/InputNumberField.tsx +11 -6
  235. package/src/components/InputPhone/InputPhone.tsx +14 -18
  236. package/src/components/InputPhone/InputPhoneExample.tsx +7 -6
  237. package/src/components/InputPhone/input-phone.scss +1 -0
  238. package/src/components/InputPhoneField/InputPhoneField.tsx +11 -6
  239. package/src/components/Link/Link.tsx +0 -1
  240. package/src/components/ListItem/list-item.scss +1 -0
  241. package/src/components/Modal/Modal.tsx +26 -30
  242. package/src/components/Modal/ModalExample.tsx +7 -2
  243. package/src/components/Modal/modal.scss +1 -1
  244. package/src/components/OTPInput/otp-input.scss +1 -0
  245. package/src/components/Pagination/Pagination.tsx +2 -2
  246. package/src/components/Password/Password.tsx +15 -17
  247. package/src/components/Password/PasswordExample.tsx +13 -5
  248. package/src/components/PasswordField/PasswordField.tsx +11 -6
  249. package/src/components/Popover/Popover.tsx +0 -1
  250. package/src/components/RadioGroup/RadioGroup.tsx +14 -20
  251. package/src/components/RadioGroup/radio-group.scss +4 -0
  252. package/src/components/RadioGroupField/RadioGroupField.tsx +16 -11
  253. package/src/components/SearchBar/SearchBar.tsx +0 -1
  254. package/src/components/SegmentedControl/SegmentedControl.tsx +0 -1
  255. package/src/components/Select/Select.tsx +13 -14
  256. package/src/components/Select/SelectExample.tsx +7 -4
  257. package/src/components/Select/select.scss +0 -12
  258. package/src/components/SelectField/SelectField.rtl.test.tsx +7 -18
  259. package/src/components/SelectField/SelectField.tsx +11 -6
  260. package/src/components/Slider/Slider.tsx +1 -2
  261. package/src/components/Snackbar/Snackbar.tsx +0 -1
  262. package/src/components/Switch/Switch.tsx +0 -1
  263. package/src/components/TabGroup/TabGroup.tsx +0 -1
  264. package/src/components/TabList/TabList.tsx +0 -1
  265. package/src/components/TabList/tab-list.scss +1 -0
  266. package/src/components/Table/table.scss +2 -1
  267. package/src/components/Textarea/Textarea.tsx +8 -17
  268. package/src/components/Textarea/TextareaExample.tsx +3 -5
  269. package/src/components/TextareaField/TextareaField.tsx +11 -6
  270. package/src/components/TimePicker/TimePicker.tsx +12 -15
  271. package/src/components/TimePicker/TimePickerExample.tsx +3 -5
  272. package/src/components/TimePickerField/TimePickerField.tsx +11 -6
  273. package/src/hooks/useFloating.ts +0 -6
  274. package/src/styles/base.scss +109 -87
  275. package/src/types/common.ts +9 -0
  276. package/dist/components/Field/FieldDescription.d.ts +0 -9
  277. package/dist/components/Field/FieldDescription.js +0 -13
  278. package/dist/components/Field/FieldDescription.js.map +0 -1
  279. package/dist/components/Field/FieldError.d.ts +0 -11
  280. package/dist/components/Field/FieldError.js +0 -14
  281. package/dist/components/Field/FieldError.js.map +0 -1
  282. package/dist/components/Field/FieldLabel.d.ts +0 -21
  283. package/dist/components/Field/FieldLabel.js +0 -14
  284. package/dist/components/Field/FieldLabel.js.map +0 -1
  285. package/dist/components/FormField/FormField.d.ts +0 -66
  286. package/dist/components/FormField/FormField.js +0 -31
  287. package/dist/components/FormField/FormField.js.map +0 -1
  288. package/dist/components/FormField/FormFieldExample.d.ts +0 -9
  289. package/dist/components/FormField/FormFieldExample.js +0 -99
  290. package/dist/components/FormField/FormFieldExample.js.map +0 -1
  291. package/dist/components/FormField/index.d.ts +0 -1
  292. package/dist/components/FormField/index.js +0 -2
  293. package/dist/components/FormField/index.js.map +0 -1
  294. package/dist/components/Input/InputElement.d.ts +0 -82
  295. package/dist/components/Input/InputElement.js +0 -64
  296. package/dist/components/Input/InputElement.js.map +0 -1
  297. package/dist/components/Link/link.css +0 -18
  298. package/dist/components/Link/link.css.js +0 -23
  299. package/src/components/Field/FieldDescription.tsx +0 -17
  300. package/src/components/Field/FieldError.tsx +0 -25
  301. package/src/components/Field/FieldLabel.tsx +0 -44
  302. package/src/components/FormField/FormField.rtl.test.tsx +0 -20
  303. package/src/components/FormField/FormField.tsx +0 -95
  304. package/src/components/FormField/FormFieldExample.tsx +0 -277
  305. package/src/components/FormField/index.tsx +0 -1
  306. package/src/components/Input/InputElement.tsx +0 -192
  307. package/src/components/Link/link.scss +0 -21
@@ -1,7 +1,8 @@
1
- import { FormField, FormFieldControlProps } from '-/components/FormField';
1
+ import { Field, ComposedFieldProps, propsWithAria } from '-/components/Field';
2
2
  import { Select, SelectProps } from '-/components/Select';
3
+ import { useId } from '-/hooks/useId';
3
4
 
4
- export type SelectFieldProps = FormFieldControlProps<SelectProps>;
5
+ export type SelectFieldProps = ComposedFieldProps<SelectProps>;
5
6
 
6
7
  /**
7
8
  * A field wrapper for the Select component.
@@ -9,7 +10,7 @@ export type SelectFieldProps = FormFieldControlProps<SelectProps>;
9
10
  * This component takes properties from the FormField and Select components.
10
11
  *
11
12
  * @name SelectField
12
- * @phase Stable
13
+ * @phase UXReview
13
14
  *
14
15
  * @generated
15
16
  */
@@ -19,18 +20,22 @@ export function SelectField({
19
20
  labelTrailing,
20
21
  errorMessage,
21
22
  style,
23
+ id: idProp,
22
24
  ...controlProps
23
25
  }: SelectFieldProps) {
26
+ const id = useId(idProp);
24
27
  return (
25
- <FormField
28
+ <Field
29
+ controlId={id}
26
30
  errorMessage={errorMessage}
27
31
  helperText={helperText}
28
32
  label={label}
29
33
  labelTrailing={labelTrailing}
34
+ required={controlProps.required}
30
35
  style={style}
31
36
  >
32
- <Select {...controlProps} />
33
- </FormField>
37
+ <Select {...propsWithAria({ id, controlProps, errorMessage, helperText })} />
38
+ </Field>
34
39
  );
35
40
  }
36
41
 
@@ -72,8 +72,7 @@ export type SliderProps<Value> = Pick<CommonPropsLibrary, 'disabled' | 'readOnly
72
72
  * track.
73
73
  *
74
74
  * @example
75
- * import { Slider } from '@bspk/ui/Slider';
76
- * import { useState } from 'react';
75
+ * import { Slider } from '-/components/Slider';
77
76
  *
78
77
  * () => {
79
78
  * const [value, setValue] = useState(50);
@@ -83,7 +83,6 @@ export type SnackbarProps = CommonProps<'id'> & {
83
83
  * @example
84
84
  * import { Snackbar } from '@bspk/ui/Snackbar';
85
85
  * import { Button } from '@bspk/ui/Button';
86
- * import { useState } from 'react';
87
86
  * import { sendSnackbar } from '@bspk/ui/Snackbar/Manager';
88
87
  *
89
88
  * () => {
@@ -26,7 +26,6 @@ export type SwitchProps = CommonProps<'aria-label' | 'disabled' | 'id' | 'name'>
26
26
  * will more often be used in the SwitchOption component.
27
27
  *
28
28
  * @example
29
- * import { useState } from 'react';
30
29
  * import { Switch } from '@bspk/ui/Switch';
31
30
  *
32
31
  * () => {
@@ -18,7 +18,6 @@ export type TabGroupProps = Omit<TabListProps<TabOption>, 'iconsOnly'> & {
18
18
  * Navigation tool that organizes content across different screens and views.
19
19
  *
20
20
  * @example
21
- * import { useState } from 'react';
22
21
  * import { TabGroup } from '@bspk/ui/TabGroup';
23
22
  *
24
23
  * () => {
@@ -123,7 +123,6 @@ export type TabListProps<O extends TabOption = TabOption> = {
123
123
  * See TabGroup or SegmentedControl for examples.
124
124
  *
125
125
  * @example
126
- * import { useState } from 'react';
127
126
  * import { TabList } from '@bspk/ui/TabList';
128
127
  *
129
128
  * () => {
@@ -6,6 +6,7 @@ ul[data-bspk-utility='tab-list'] {
6
6
  list-style: none;
7
7
  height: var(--height);
8
8
  font: var(--font);
9
+ width: fit-content; // default to hug content
9
10
 
10
11
  &[data-width='fill'] {
11
12
  align-items: stretch;
@@ -5,6 +5,7 @@
5
5
  --grey-background: var(--surface-neutral-t2-lowest);
6
6
  --icon-size: var(--spacing-sizing-05);
7
7
 
8
+ display: block;
8
9
  min-width: 100%;
9
10
  overflow: auto hidden;
10
11
  border-collapse: separate;
@@ -135,7 +136,7 @@
135
136
  z-index: var(--z-index-focus);
136
137
  inset: 0;
137
138
  outline: solid 2px var(--stroke-neutral-focus);
138
- outline-offset: -2px;
139
+ isolation: isolate;
139
140
  }
140
141
  }
141
142
  }
@@ -1,6 +1,5 @@
1
1
  import './textarea.scss';
2
2
  import { ChangeEvent, useRef } from 'react';
3
- import { useFieldInit } from '-/components/Field';
4
3
  import { CommonProps, FieldControlProps, SetRef } from '-/types/common';
5
4
  import { cssWithVars } from '-/utils/cwv';
6
5
 
@@ -46,18 +45,15 @@ export type TextareaProps = CommonProps<'size'> &
46
45
  * For a more complete example with field usage, see the TextareaField component.
47
46
  *
48
47
  * @example
49
- * import { useState } from 'react';
50
- * import { Textarea } from '@bspk/ui/Textarea';
48
+ * import { Textarea } from '-/components/Textarea';
51
49
  *
52
50
  * () => {
53
51
  * const [value, setValue] = useState<string | undefined>('');
54
52
  *
55
53
  * return (
56
54
  * <div style={{ width: 320 }}>
57
- * <Field>
58
- * <FieldLabel>Example Textarea</FieldLabel>
59
- * <Textarea name="example-name" onChange={setValue} value={value} />
60
- * <FieldDescription>This is an example textarea field.</FieldDescription>
55
+ * <Field controlId="example-textarea" helperText="This is an example textarea field." label="Textarea">
56
+ * <Textarea id="example-textarea" name="example-name" onChange={setValue} value={value} />
61
57
  * </Field>
62
58
  * </div>
63
59
  * );
@@ -69,30 +65,24 @@ export type TextareaProps = CommonProps<'size'> &
69
65
  * @phase Stable
70
66
  */
71
67
  export function Textarea({
72
- invalid: invalidProp,
68
+ invalid = false,
73
69
  onChange,
74
70
  size = 'medium',
75
71
  value = '',
76
72
  name,
77
73
  innerRef,
78
74
  placeholder,
79
- id: idProp,
75
+ id,
80
76
  minRows = 4,
81
77
  maxRows = 10,
82
78
  required = false,
83
79
  readOnly,
84
80
  disabled,
85
81
  'aria-label': ariaLabel,
82
+ 'aria-describedby': ariaDescribedBy,
83
+ 'aria-errormessage': ariaErrorMessage,
86
84
  ...otherProps
87
85
  }: TextareaProps) {
88
- const { id, ariaDescribedBy, ariaErrorMessage, invalid } = useFieldInit({
89
- idProp,
90
- required,
91
- disabled,
92
- readOnly,
93
- invalidProp,
94
- });
95
-
96
86
  const onInput = () => {
97
87
  const target = textareaElement.current;
98
88
  if (!target) return;
@@ -137,6 +127,7 @@ export function Textarea({
137
127
  textareaElement.current = node;
138
128
  onInput();
139
129
  }}
130
+ required={required || undefined}
140
131
  value={value}
141
132
  wrap="hard"
142
133
  />
@@ -1,6 +1,6 @@
1
1
  import { useState } from 'react';
2
2
  import { Textarea, TextareaProps } from '.';
3
- import { Field, FieldDescription, FieldLabel } from '-/components/Field';
3
+ import { Field } from '-/components/Field';
4
4
  import { ComponentExample } from '-/utils/demo';
5
5
 
6
6
  export const TextareaExample: ComponentExample<TextareaProps> = {
@@ -19,10 +19,8 @@ export const Usage = () => {
19
19
 
20
20
  return (
21
21
  <div style={{ width: 320 }}>
22
- <Field>
23
- <FieldLabel>Example Textarea</FieldLabel>
24
- <Textarea name="example-name" onChange={setValue} value={value} />
25
- <FieldDescription>This is an example textarea field.</FieldDescription>
22
+ <Field controlId="example-textarea" helperText="This is an example textarea field." label="Textarea">
23
+ <Textarea id="example-textarea" name="example-name" onChange={setValue} value={value} />
26
24
  </Field>
27
25
  </div>
28
26
  );
@@ -1,7 +1,8 @@
1
- import { FormField, FormFieldControlProps } from '-/components/FormField';
1
+ import { Field, ComposedFieldProps, propsWithAria } from '-/components/Field';
2
2
  import { Textarea, TextareaProps } from '-/components/Textarea';
3
+ import { useId } from '-/hooks/useId';
3
4
 
4
- export type TextareaFieldProps = FormFieldControlProps<TextareaProps>;
5
+ export type TextareaFieldProps = ComposedFieldProps<TextareaProps>;
5
6
 
6
7
  /**
7
8
  * A field wrapper for the Textarea component.
@@ -9,7 +10,7 @@ export type TextareaFieldProps = FormFieldControlProps<TextareaProps>;
9
10
  * This component takes properties from the FormField and Textarea components.
10
11
  *
11
12
  * @name TextareaField
12
- * @phase Stable
13
+ * @phase UXReview
13
14
  *
14
15
  * @generated
15
16
  */
@@ -19,18 +20,22 @@ export function TextareaField({
19
20
  labelTrailing,
20
21
  errorMessage,
21
22
  style,
23
+ id: idProp,
22
24
  ...controlProps
23
25
  }: TextareaFieldProps) {
26
+ const id = useId(idProp);
24
27
  return (
25
- <FormField
28
+ <Field
29
+ controlId={id}
26
30
  errorMessage={errorMessage}
27
31
  helperText={helperText}
28
32
  label={label}
29
33
  labelTrailing={labelTrailing}
34
+ required={controlProps.required}
30
35
  style={style}
31
36
  >
32
- <Textarea {...controlProps} />
33
- </FormField>
37
+ <Textarea {...propsWithAria({ id, controlProps, errorMessage, helperText })} />
38
+ </Field>
34
39
  );
35
40
  }
36
41
 
@@ -13,11 +13,11 @@ import {
13
13
  stringValueToParts,
14
14
  } from './utils';
15
15
  import { Button } from '-/components/Button';
16
- import { useFieldInit } from '-/components/Field';
17
16
  import { InputProps } from '-/components/Input';
18
17
  import { Menu } from '-/components/Menu';
19
18
  import { Portal } from '-/components/Portal';
20
19
  import { useFloating } from '-/hooks/useFloating';
20
+ import { useId } from '-/hooks/useId';
21
21
  import { useOutsideClick } from '-/hooks/useOutsideClick';
22
22
  import { ElementProps, FieldControlProps } from '-/types/common';
23
23
  import { handleKeyDown } from '-/utils/handleKeyDown';
@@ -31,17 +31,19 @@ export type TimePickerProps = FieldControlProps & Pick<InputProps, 'size'>;
31
31
  * For a more complete example with field usage, see the TimePickerField component.
32
32
  *
33
33
  * @example
34
- * import { TimePicker } from '@bspk/ui/TimePicker';
34
+ * import { TimePicker } from '-/components/TimePicker';
35
35
  *
36
36
  * () => {
37
37
  * const [value, onChange] = useState<string | undefined>('');
38
38
  *
39
39
  * return (
40
40
  * <div style={{ width: 320 }}>
41
- * <Field>
42
- * <FieldLabel>Time</FieldLabel>
43
- * <TimePicker name="time" onChange={onChange} value={value} />
44
- * <FieldDescription>The time picker allows you to select a time.</FieldDescription>
41
+ * <Field
42
+ * controlId="destination-time"
43
+ * helperText="The time picker allows you to select a time."
44
+ * label="Time"
45
+ * >
46
+ * <TimePicker id="destination-time" name="time" onChange={onChange} value={value} />
45
47
  * </Field>
46
48
  * </div>
47
49
  * );
@@ -54,22 +56,17 @@ export function TimePicker({
54
56
  value,
55
57
  disabled,
56
58
  id: idProp,
57
- invalid: invalidProp,
59
+ invalid = false,
58
60
  readOnly,
59
61
  name,
60
62
  size,
61
- required = false,
62
63
  onChange: onChangeProp,
63
64
  'aria-label': ariaLabel = 'Time picker',
65
+ 'aria-describedby': ariaDescribedBy,
66
+ 'aria-errormessage': ariaErrorMessage,
64
67
  ...props
65
68
  }: ElementProps<TimePickerProps, 'div'>) {
66
- const { id, ariaDescribedBy, ariaErrorMessage, invalid } = useFieldInit({
67
- idProp,
68
- required,
69
- disabled,
70
- readOnly,
71
- invalidProp,
72
- });
69
+ const id = useId(idProp);
73
70
 
74
71
  const menuId = `${id}-time-picker-menu`;
75
72
 
@@ -1,6 +1,6 @@
1
1
  import { useState } from 'react';
2
2
  import { TimePicker, TimePickerProps } from './TimePicker';
3
- import { Field, FieldLabel, FieldDescription } from '-/components/Field';
3
+ import { Field } from '-/components/Field';
4
4
  import { ComponentExample } from '-/utils/demo';
5
5
 
6
6
  export const TimePickerExample: ComponentExample<TimePickerProps> = {
@@ -17,10 +17,8 @@ export const Usage = () => {
17
17
 
18
18
  return (
19
19
  <div style={{ width: 320 }}>
20
- <Field>
21
- <FieldLabel>Time</FieldLabel>
22
- <TimePicker name="time" onChange={onChange} value={value} />
23
- <FieldDescription>The time picker allows you to select a time.</FieldDescription>
20
+ <Field controlId="destination-time" helperText="The time picker allows you to select a time." label="Time">
21
+ <TimePicker id="destination-time" name="time" onChange={onChange} value={value} />
24
22
  </Field>
25
23
  </div>
26
24
  );
@@ -1,7 +1,8 @@
1
- import { FormField, FormFieldControlProps } from '-/components/FormField';
1
+ import { Field, ComposedFieldProps, propsWithAria } from '-/components/Field';
2
2
  import { TimePicker, TimePickerProps } from '-/components/TimePicker';
3
+ import { useId } from '-/hooks/useId';
3
4
 
4
- export type TimePickerFieldProps = FormFieldControlProps<TimePickerProps>;
5
+ export type TimePickerFieldProps = ComposedFieldProps<TimePickerProps>;
5
6
 
6
7
  /**
7
8
  * A field wrapper for the TimePicker component.
@@ -9,7 +10,7 @@ export type TimePickerFieldProps = FormFieldControlProps<TimePickerProps>;
9
10
  * This component takes properties from the FormField and TimePicker components.
10
11
  *
11
12
  * @name TimePickerField
12
- * @phase Stable
13
+ * @phase UXReview
13
14
  *
14
15
  * @generated
15
16
  */
@@ -19,18 +20,22 @@ export function TimePickerField({
19
20
  labelTrailing,
20
21
  errorMessage,
21
22
  style,
23
+ id: idProp,
22
24
  ...controlProps
23
25
  }: TimePickerFieldProps) {
26
+ const id = useId(idProp);
24
27
  return (
25
- <FormField
28
+ <Field
29
+ controlId={id}
26
30
  errorMessage={errorMessage}
27
31
  helperText={helperText}
28
32
  label={label}
29
33
  labelTrailing={labelTrailing}
34
+ required={controlProps.required}
30
35
  style={style}
31
36
  >
32
- <TimePicker {...controlProps} />
33
- </FormField>
37
+ <TimePicker {...propsWithAria({ id, controlProps, errorMessage, helperText })} />
38
+ </Field>
34
39
  );
35
40
  }
36
41
 
@@ -79,12 +79,6 @@ export type UseFloatingElements = {
79
79
  setFloating: (element: HTMLElement | null) => void;
80
80
  };
81
81
 
82
- /**
83
- *
84
- *
85
- * @param param0
86
- * @returns
87
- */
88
82
  export function useFloating({
89
83
  placement = 'bottom-start',
90
84
  arrowRef,
@@ -68,93 +68,8 @@ body[data-bspk] {
68
68
  color: var(--foreground-neutral-on-surface);
69
69
  min-width: 343px;
70
70
 
71
- a,
72
- [data-bspk='link'] {
73
- &:not([data-bspk='button'], [data-bspk='list-item']) {
74
- color: var(--foreground-link-text-default);
75
-
76
- &:not([disabled]) {
77
- &:hover,
78
- &[data-pseudo='hover'] {
79
- color: var(--foreground-link-text-default-hovered);
80
- }
81
-
82
- &:active,
83
- &[data-pseudo='active'] {
84
- color: var(--foreground-link-text-default);
85
- filter: brightness(80%);
86
- }
87
-
88
- &:visited,
89
- &[data-pseudo='visited'] {
90
- color: var(--foreground-link-text-default-visited);
91
- }
92
- }
93
-
94
- &[disabled] {
95
- pointer-events: none;
96
- cursor: text;
97
- color: var(--foreground-link-text-default-disabled);
98
- }
99
- }
100
-
101
- &[data-subtle] {
102
- text-decoration: none;
103
- color: var(--foreground-neutral-on-surface);
104
-
105
- &:not([disabled]) {
106
- &:hover,
107
- &[data-pseudo='hover'] {
108
- text-decoration: underline;
109
- color: var(--foreground-link-text-subtle-hovered);
110
- }
111
-
112
- &:active,
113
- &[data-pseudo='active'] {
114
- text-decoration: underline;
115
- color: var(--foreground-link-text-subtle-pressed);
116
- }
117
-
118
- &:visited,
119
- &[data-pseudo='visited'] {
120
- color: var(--foreground-neutral-on-surface);
121
- }
122
- }
123
-
124
- &[disabled] {
125
- pointer-events: none;
126
- color: var(--foreground-link-text-subtle-disabled);
127
- }
128
- }
129
-
130
- &[data-subtle-inverse] {
131
- text-decoration: none;
132
- color: var(--foreground-neutral-inverse-on-surface);
133
-
134
- &:not([disabled]) {
135
- &:hover,
136
- &[data-pseudo='hover'] {
137
- text-decoration: underline;
138
- color: var(--foreground-link-text-subtle-inverse-hovered);
139
- }
140
-
141
- &:active,
142
- &[data-pseudo='active'] {
143
- text-decoration: underline;
144
- color: var(--foreground-link-text-subtle-inverse-pressed);
145
- }
146
-
147
- &:visited,
148
- &[data-pseudo='visited'] {
149
- color: var(--foreground-neutral-on-inverse-surface);
150
- }
151
- }
152
-
153
- &[disabled] {
154
- pointer-events: none;
155
- color: var(--foreground-link-text-subtle-inversed-disabled);
156
- }
157
- }
71
+ a:not([data-bspk]) {
72
+ @extend %link;
158
73
  }
159
74
  }
160
75
 
@@ -314,4 +229,111 @@ body[data-bspk] {
314
229
  display: none !important;
315
230
  }
316
231
 
232
+ [data-bspk='link'] {
233
+ @extend %link;
234
+ }
235
+
236
+ %link {
237
+ color: var(--foreground-link-text-default);
238
+ display: inline-flex;
239
+ flex-direction: row;
240
+ align-items: center;
241
+ gap: var(--spacing-sizing-01);
242
+ font: var(--labels-base);
243
+
244
+ &:not([disabled]) {
245
+ &:hover,
246
+ &[data-pseudo='hover'] {
247
+ color: var(--foreground-link-text-default-hovered);
248
+ }
249
+
250
+ &:active,
251
+ &[data-pseudo='active'] {
252
+ color: var(--foreground-link-text-default);
253
+ filter: brightness(80%);
254
+ }
255
+
256
+ &:visited,
257
+ &[data-pseudo='visited'] {
258
+ color: var(--foreground-link-text-default-visited);
259
+ }
260
+ }
261
+
262
+ &[disabled] {
263
+ pointer-events: none;
264
+ cursor: text;
265
+ color: var(--foreground-link-text-default-disabled);
266
+ }
267
+
268
+ &[data-subtle] {
269
+ text-decoration: none;
270
+ color: var(--foreground-neutral-on-surface);
271
+
272
+ &:not([disabled]) {
273
+ &:hover,
274
+ &[data-pseudo='hover'] {
275
+ text-decoration: underline;
276
+ color: var(--foreground-link-text-subtle-hovered);
277
+ }
278
+
279
+ &:active,
280
+ &[data-pseudo='active'] {
281
+ text-decoration: underline;
282
+ color: var(--foreground-link-text-subtle-pressed);
283
+ }
284
+
285
+ &:visited,
286
+ &[data-pseudo='visited'] {
287
+ color: var(--foreground-neutral-on-surface);
288
+ }
289
+ }
290
+
291
+ &[disabled] {
292
+ pointer-events: none;
293
+ color: var(--foreground-link-text-subtle-disabled);
294
+ }
295
+ }
296
+
297
+ &[data-subtle-inverse] {
298
+ text-decoration: none;
299
+ color: var(--foreground-neutral-inverse-on-surface);
300
+
301
+ &:not([disabled]) {
302
+ &:hover,
303
+ &[data-pseudo='hover'] {
304
+ text-decoration: underline;
305
+ color: var(--foreground-link-text-subtle-inverse-hovered);
306
+ }
307
+
308
+ &:active,
309
+ &[data-pseudo='active'] {
310
+ text-decoration: underline;
311
+ color: var(--foreground-link-text-subtle-inverse-pressed);
312
+ }
313
+
314
+ &:visited,
315
+ &[data-pseudo='visited'] {
316
+ color: var(--foreground-neutral-on-inverse-surface);
317
+ }
318
+ }
319
+
320
+ &[disabled] {
321
+ pointer-events: none;
322
+ color: var(--foreground-link-text-subtle-inversed-disabled);
323
+ }
324
+ }
325
+
326
+ &[data-size='large'] {
327
+ font: var(--labels-large);
328
+ }
329
+
330
+ &[data-size='small'] {
331
+ font: var(--labels-small);
332
+ }
333
+
334
+ svg {
335
+ width: var(--spacing-sizing-05);
336
+ }
337
+ }
338
+
317
339
  /** Copyright 2025 Anywhere Real Estate - CC BY 4.0 */
@@ -148,6 +148,7 @@ export type CommonProps<K extends keyof CommonPropsLibrary> = Pick<CommonPropsLi
148
148
 
149
149
  export type RequiredCommonProps<K extends keyof CommonPropsLibrary> = Required<Pick<CommonPropsLibrary, K>>;
150
150
 
151
+ /** The common properties for all input control components such as Input, TextArea, Select, etc. */
151
152
  export type FieldControlProps<
152
153
  ValueType = string,
153
154
  ChangeContext = ChangeEvent<HTMLElement> | KeyboardEvent | undefined,
@@ -164,6 +165,14 @@ export type FieldControlProps<
164
165
  * @required
165
166
  */
166
167
  onChange: (next: ValueType | undefined, event?: ChangeContext) => void;
168
+ /*
169
+ * The aria-describedby attribute for the field control.
170
+ */
171
+ 'aria-describedby'?: string;
172
+ /*
173
+ * The aria-errormessage attribute for the field control.
174
+ */
175
+ 'aria-errormessage'?: string;
167
176
  };
168
177
 
169
178
  export type Brand =
@@ -1,9 +0,0 @@
1
- /**
2
- * FieldDescription component displays a description associated with a form field.
3
- *
4
- * @name FieldDescription
5
- * @parent Field
6
- */
7
- export declare function FieldDescription({ children }: {
8
- children?: string;
9
- }): import("react/jsx-runtime").JSX.Element | null;
@@ -1,13 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useFieldContext, describedById } from './utils';
3
- /**
4
- * FieldDescription component displays a description associated with a form field.
5
- *
6
- * @name FieldDescription
7
- * @parent Field
8
- */
9
- export function FieldDescription({ children }) {
10
- const { id } = useFieldContext();
11
- return children ? (_jsx("p", { "data-bspk": "field-description", id: describedById(id), children: children })) : null;
12
- }
13
- //# sourceMappingURL=FieldDescription.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FieldDescription.js","sourceRoot":"","sources":["../../../src/components/Field/FieldDescription.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAyB;IAChE,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;IAEjC,OAAO,QAAQ,CAAC,CAAC,CAAC,CACd,yBAAa,mBAAmB,EAAC,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC,YACjD,QAAQ,GACT,CACP,CAAC,CAAC,CAAC,IAAI,CAAC;AACb,CAAC"}
@@ -1,11 +0,0 @@
1
- export type FieldErrorProps = {
2
- /** The error message text. */
3
- children?: string;
4
- };
5
- /**
6
- * FieldError component displays an error message associated with a form field.
7
- *
8
- * @name FieldError
9
- * @parent Field
10
- */
11
- export declare function FieldError({ children }: FieldErrorProps): "" | import("react/jsx-runtime").JSX.Element | undefined;