@vygruppen/spor-react 11.3.10 → 12.0.1

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 (322) hide show
  1. package/.turbo/turbo-build.log +33 -11
  2. package/.turbo/turbo-typegen.log +22 -0
  3. package/CHANGELOG.md +247 -0
  4. package/dist/index.d.mts +2589 -8303
  5. package/dist/index.d.ts +2589 -8303
  6. package/dist/index.js +9609 -8608
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +9487 -8455
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +23 -15
  11. package/src/accordion/Accordion.tsx +96 -45
  12. package/src/accordion/Expandable.tsx +54 -127
  13. package/src/accordion/helpers.ts +31 -0
  14. package/src/accordion/types.ts +60 -0
  15. package/src/alert/Alert.tsx +101 -0
  16. package/src/alert/AlertIcon.tsx +63 -45
  17. package/src/alert/ExpandableAlert.tsx +96 -64
  18. package/src/alert/ServiceAlert.tsx +127 -125
  19. package/src/alert/{index.tsx → index.ts} +1 -2
  20. package/src/breadcrumb/Breadcrumb.tsx +39 -24
  21. package/src/button/Button.tsx +86 -105
  22. package/src/button/ButtonGroup.tsx +45 -20
  23. package/src/button/Clipboard.tsx +82 -0
  24. package/src/button/CloseButton.tsx +4 -3
  25. package/src/button/FloatingActionButton.tsx +35 -41
  26. package/src/button/IconButton.tsx +34 -30
  27. package/src/button/index.tsx +1 -0
  28. package/src/color-mode/color-mode.tsx +75 -0
  29. package/src/color-mode/index.ts +1 -0
  30. package/src/datepicker/Calendar.tsx +17 -8
  31. package/src/datepicker/CalendarCell.tsx +20 -13
  32. package/src/datepicker/CalendarGrid.tsx +18 -10
  33. package/src/datepicker/CalendarHeader.tsx +2 -0
  34. package/src/datepicker/CalendarNavigationButton.tsx +1 -0
  35. package/src/datepicker/CalendarTriggerButton.tsx +43 -45
  36. package/src/datepicker/DateField.tsx +21 -12
  37. package/src/datepicker/DatePicker.tsx +61 -58
  38. package/src/datepicker/DateRangePicker.tsx +52 -58
  39. package/src/datepicker/DateTimeSegment.tsx +13 -5
  40. package/src/datepicker/RangeCalendar.tsx +13 -7
  41. package/src/datepicker/StyledField.tsx +25 -17
  42. package/src/datepicker/TimeField.tsx +10 -8
  43. package/src/datepicker/TimePicker.tsx +48 -45
  44. package/src/datepicker/types.ts +5 -0
  45. package/src/dialog/Dialog.tsx +56 -0
  46. package/src/dialog/Drawer.tsx +187 -0
  47. package/src/dialog/index.ts +2 -0
  48. package/src/dialog/types.ts +26 -0
  49. package/src/image/index.tsx +2 -2
  50. package/src/index.tsx +5 -3
  51. package/src/input/AttachedInputs.tsx +17 -42
  52. package/src/input/CardSelect.tsx +75 -162
  53. package/src/input/Checkbox.tsx +30 -6
  54. package/src/input/CheckboxGroup.tsx +25 -16
  55. package/src/input/ChoiceChip.tsx +58 -77
  56. package/src/input/Combobox.tsx +172 -172
  57. package/src/input/CountryCodeSelect.tsx +42 -28
  58. package/src/input/Dialog.tsx +1 -0
  59. package/src/input/Field.tsx +71 -0
  60. package/src/input/Fieldset.tsx +7 -0
  61. package/src/input/Input.tsx +68 -73
  62. package/src/input/InputGroup.tsx +66 -0
  63. package/src/input/ListBox.tsx +83 -70
  64. package/src/input/NativeSelect.tsx +70 -33
  65. package/src/input/NumericStepper.tsx +173 -171
  66. package/src/input/PasswordInput.tsx +99 -52
  67. package/src/input/PhoneNumberInput.tsx +69 -72
  68. package/src/input/Popover.tsx +1 -0
  69. package/src/input/Radio.tsx +37 -17
  70. package/src/input/SearchInput.tsx +24 -86
  71. package/src/input/Select.tsx +237 -0
  72. package/src/input/Switch.tsx +60 -18
  73. package/src/input/Textarea.tsx +53 -101
  74. package/src/input/{index.tsx → index.ts} +2 -8
  75. package/src/layout/PressableCard.tsx +12 -21
  76. package/src/layout/RadioCard.tsx +68 -101
  77. package/src/layout/Separator.tsx +32 -0
  78. package/src/layout/StaticCard.tsx +13 -33
  79. package/src/layout/index.tsx +3 -7
  80. package/src/linjetag/InfoTag.tsx +16 -9
  81. package/src/linjetag/LineIcon.tsx +74 -28
  82. package/src/linjetag/TravelTag.tsx +38 -27
  83. package/src/link/TextLink.tsx +25 -16
  84. package/src/list/index.tsx +24 -2
  85. package/src/loader/ClientOnly.tsx +8 -7
  86. package/src/loader/ColorInlineLoader.tsx +4 -3
  87. package/src/loader/ColorSpinner.tsx +5 -4
  88. package/src/loader/ContentLoader.tsx +6 -4
  89. package/src/loader/DarkFullScreenLoader.tsx +11 -3
  90. package/src/loader/DarkInlineLoader.tsx +5 -3
  91. package/src/loader/DarkSpinner.tsx +7 -3
  92. package/src/loader/LightFullScreenLoader.tsx +11 -3
  93. package/src/loader/LightInlineLoader.tsx +11 -3
  94. package/src/loader/LightSpinner.tsx +5 -3
  95. package/src/loader/Lottie.tsx +3 -3
  96. package/src/loader/ProgressBar.tsx +83 -84
  97. package/src/loader/ProgressLoader.tsx +120 -75
  98. package/src/loader/Skeleton.tsx +94 -19
  99. package/src/loader/index.tsx +0 -2
  100. package/src/loader/useHydrated.tsx +1 -0
  101. package/src/loader/useRotatingLabel.tsx +2 -1
  102. package/src/logo/CargonetLogo.tsx +89 -89
  103. package/src/logo/VyLogo.tsx +61 -42
  104. package/src/logo/VyLogoPride.tsx +137 -139
  105. package/src/media-controller/JumpButton.tsx +48 -38
  106. package/src/media-controller/PlayPauseButton.tsx +31 -29
  107. package/src/media-controller/SkipButton.tsx +38 -37
  108. package/src/nudge/Nudge.tsx +195 -123
  109. package/src/nudge/index.tsx +0 -1
  110. package/src/pagination/Pagination.tsx +221 -118
  111. package/src/pagination/types.ts +23 -0
  112. package/src/popover/index.tsx +67 -0
  113. package/src/progress-indicator/ProgressDot.tsx +11 -10
  114. package/src/progress-indicator/ProgressIndicator.tsx +28 -15
  115. package/src/provider/SporProvider.tsx +17 -14
  116. package/src/stepper/Stepper.tsx +88 -85
  117. package/src/stepper/StepperContext.tsx +2 -1
  118. package/src/stepper/StepperStep.tsx +28 -21
  119. package/src/tab/Tabs.tsx +62 -12
  120. package/src/tab/index.tsx +1 -9
  121. package/src/table/Table.tsx +35 -30
  122. package/src/table/index.tsx +11 -7
  123. package/src/theme/brand.ts +7 -0
  124. package/src/theme/index.ts +45 -37
  125. package/src/theme/recipes/attached-inputs.ts +43 -0
  126. package/src/theme/recipes/badge.ts +104 -0
  127. package/src/theme/recipes/button.ts +124 -0
  128. package/src/theme/recipes/choice-chip.ts +144 -0
  129. package/src/theme/recipes/close-button.ts +41 -0
  130. package/src/theme/recipes/code.ts +14 -0
  131. package/src/theme/recipes/group.ts +19 -0
  132. package/src/theme/recipes/index.ts +29 -0
  133. package/src/theme/recipes/input.ts +89 -0
  134. package/src/theme/recipes/link.ts +64 -0
  135. package/src/theme/recipes/nudge.ts +12 -0
  136. package/src/theme/recipes/pressable-card.ts +83 -0
  137. package/src/theme/recipes/progress-loader.ts +14 -0
  138. package/src/theme/recipes/separator.ts +85 -0
  139. package/src/theme/recipes/skeleton.ts +57 -0
  140. package/src/theme/recipes/static-card.ts +39 -0
  141. package/src/theme/recipes/textarea.ts +27 -0
  142. package/src/theme/semantic-tokens/colors.ts +22 -0
  143. package/src/theme/semantic-tokens/index.ts +24 -0
  144. package/src/theme/semantic-tokens/radii.ts +14 -0
  145. package/src/theme/semantic-tokens/shadows.ts +17 -0
  146. package/src/theme/slot-recipes/accordion.ts +131 -0
  147. package/src/theme/slot-recipes/alert-expandable.ts +133 -0
  148. package/src/theme/slot-recipes/alert-service.ts +66 -0
  149. package/src/theme/slot-recipes/alert.ts +72 -0
  150. package/src/theme/slot-recipes/anatomy.ts +269 -0
  151. package/src/theme/slot-recipes/breadcrumb.ts +61 -0
  152. package/src/theme/slot-recipes/checkbox.ts +89 -0
  153. package/src/theme/slot-recipes/datepicker.ts +214 -0
  154. package/src/theme/slot-recipes/dialog.ts +221 -0
  155. package/src/theme/slot-recipes/drawer.ts +205 -0
  156. package/src/theme/slot-recipes/field.ts +79 -0
  157. package/src/theme/slot-recipes/floating-action-button.ts +131 -0
  158. package/src/theme/slot-recipes/index.ts +65 -0
  159. package/src/theme/slot-recipes/info-tag.ts +62 -0
  160. package/src/theme/slot-recipes/line-icon.ts +140 -0
  161. package/src/theme/slot-recipes/list.ts +45 -0
  162. package/src/theme/slot-recipes/listbox.ts +72 -0
  163. package/src/theme/slot-recipes/media-controller-button.ts +131 -0
  164. package/src/theme/slot-recipes/native-select.ts +54 -0
  165. package/src/theme/slot-recipes/numeric-stepper.ts +65 -0
  166. package/src/theme/slot-recipes/pagination.ts +41 -0
  167. package/src/theme/slot-recipes/popover.ts +78 -0
  168. package/src/theme/slot-recipes/progress-bar.ts +39 -0
  169. package/src/theme/slot-recipes/progress-indicator.ts +22 -0
  170. package/src/theme/slot-recipes/radio-card.ts +112 -0
  171. package/src/theme/slot-recipes/radio.ts +80 -0
  172. package/src/theme/slot-recipes/select.ts +243 -0
  173. package/src/theme/slot-recipes/stepper.ts +92 -0
  174. package/src/theme/slot-recipes/switch.ts +147 -0
  175. package/src/theme/slot-recipes/table.ts +200 -0
  176. package/src/theme/slot-recipes/tabs.ts +169 -0
  177. package/src/theme/slot-recipes/toast.ts +56 -0
  178. package/src/theme/slot-recipes/travel-tag.ts +192 -0
  179. package/src/theme/tokens/animation-styles.ts +50 -0
  180. package/src/theme/tokens/animations.ts +22 -0
  181. package/src/theme/tokens/aspect-ratios.ts +22 -0
  182. package/src/theme/tokens/blurs.ts +28 -0
  183. package/src/theme/tokens/borders.ts +26 -0
  184. package/src/theme/{foundations → tokens}/breakpoints.ts +0 -1
  185. package/src/theme/tokens/colors.ts +10 -0
  186. package/src/theme/tokens/config.ts +10 -0
  187. package/src/theme/tokens/cursor.ts +28 -0
  188. package/src/theme/tokens/durations.ts +25 -0
  189. package/src/theme/tokens/easings.ts +16 -0
  190. package/src/theme/tokens/font-sizes.ts +30 -0
  191. package/src/theme/tokens/font-weights.ts +31 -0
  192. package/src/theme/tokens/fonts.ts +8 -0
  193. package/src/theme/tokens/global-css.ts +18 -0
  194. package/src/theme/tokens/index.ts +37 -0
  195. package/src/theme/tokens/keyframes.ts +255 -0
  196. package/src/theme/tokens/letter-spacings.ts +19 -0
  197. package/src/theme/tokens/line-heights.ts +19 -0
  198. package/src/theme/tokens/radii.ts +13 -0
  199. package/src/theme/tokens/sizes.ts +51 -0
  200. package/src/theme/tokens/spacing.ts +20 -0
  201. package/src/theme/tokens/text-styles.ts +89 -0
  202. package/src/theme/tokens/z-index.ts +17 -0
  203. package/src/theme/utils/accent-utils.ts +8 -21
  204. package/src/theme/utils/bg-utils.ts +4 -6
  205. package/src/theme/utils/brand-utils.ts +6 -19
  206. package/src/theme/utils/core-utils.ts +91 -0
  207. package/src/theme/utils/floating-utils.ts +20 -39
  208. package/src/theme/utils/ghost-utils.ts +7 -21
  209. package/src/theme/utils/input-utils.ts +32 -37
  210. package/src/theme/utils/outline-utils.ts +4 -11
  211. package/src/theme/utils/surface-utils.ts +5 -19
  212. package/src/theme/utils/types.ts +1 -0
  213. package/src/toast/index.tsx +1 -1
  214. package/src/toast/toast.tsx +105 -0
  215. package/src/transition/index.ts +2 -8
  216. package/src/typography/Badge.tsx +15 -61
  217. package/src/typography/Code.tsx +16 -28
  218. package/src/typography/Heading.tsx +36 -21
  219. package/src/typography/Text.tsx +9 -6
  220. package/src/typography/{index.tsx → index.ts} +1 -0
  221. package/src/util/externals.tsx +13 -27
  222. package/tsconfig.json +5 -1
  223. package/src/accordion/Accordion.test.tsx +0 -20
  224. package/src/alert/BaseAlert.test.tsx +0 -37
  225. package/src/alert/BaseAlert.tsx +0 -34
  226. package/src/alert/ClosableAlert.test.tsx +0 -37
  227. package/src/alert/ClosableAlert.tsx +0 -85
  228. package/src/alert/ExpandableAlert.test.tsx +0 -84
  229. package/src/alert/StaticAlert.tsx +0 -33
  230. package/src/button/Button.test.tsx +0 -23
  231. package/src/datepicker/TimePicker.test.tsx +0 -74
  232. package/src/input/FormControl.tsx +0 -2
  233. package/src/input/FormErrorMessage.tsx +0 -95
  234. package/src/input/FormLabel.tsx +0 -11
  235. package/src/input/InfoSelect.tsx +0 -274
  236. package/src/input/InputElement.tsx +0 -44
  237. package/src/input/RadioGroup.tsx +0 -47
  238. package/src/layout/Divider.tsx +0 -27
  239. package/src/layout/RadioCardGroup.tsx +0 -79
  240. package/src/layout/Stack.tsx +0 -42
  241. package/src/loader/SkeletonCircle.tsx +0 -13
  242. package/src/loader/SkeletonText.tsx +0 -14
  243. package/src/media-controller/index.test.tsx +0 -59
  244. package/src/modal/Drawer.tsx +0 -120
  245. package/src/modal/FullScreenDrawer.tsx +0 -239
  246. package/src/modal/Modal.tsx +0 -15
  247. package/src/modal/ModalHeader.tsx +0 -31
  248. package/src/modal/SimpleDrawer.tsx +0 -51
  249. package/src/modal/index.tsx +0 -5
  250. package/src/nudge/WizardNudge.tsx +0 -107
  251. package/src/theme/components/accordion.ts +0 -102
  252. package/src/theme/components/alert-expandable.ts +0 -125
  253. package/src/theme/components/alert-service.ts +0 -98
  254. package/src/theme/components/alert.ts +0 -71
  255. package/src/theme/components/badge.ts +0 -109
  256. package/src/theme/components/breadcrumb.ts +0 -60
  257. package/src/theme/components/button.ts +0 -125
  258. package/src/theme/components/card-select.ts +0 -117
  259. package/src/theme/components/checkbox.ts +0 -88
  260. package/src/theme/components/choice-chip.ts +0 -161
  261. package/src/theme/components/close-button.ts +0 -48
  262. package/src/theme/components/code.ts +0 -17
  263. package/src/theme/components/datepicker.ts +0 -198
  264. package/src/theme/components/divider.ts +0 -50
  265. package/src/theme/components/drawer.ts +0 -95
  266. package/src/theme/components/fab.ts +0 -109
  267. package/src/theme/components/form-label.ts +0 -17
  268. package/src/theme/components/form.ts +0 -27
  269. package/src/theme/components/index.ts +0 -45
  270. package/src/theme/components/info-select.ts +0 -85
  271. package/src/theme/components/info-tag.ts +0 -63
  272. package/src/theme/components/input.ts +0 -28
  273. package/src/theme/components/line-icon.ts +0 -129
  274. package/src/theme/components/link.ts +0 -78
  275. package/src/theme/components/list.ts +0 -23
  276. package/src/theme/components/listbox.ts +0 -77
  277. package/src/theme/components/media-controller-button.ts +0 -97
  278. package/src/theme/components/modal.ts +0 -96
  279. package/src/theme/components/numeric-stepper.ts +0 -65
  280. package/src/theme/components/pagination.ts +0 -74
  281. package/src/theme/components/popover.ts +0 -68
  282. package/src/theme/components/pressable-card.ts +0 -72
  283. package/src/theme/components/progress-bar.ts +0 -47
  284. package/src/theme/components/progress-indicator.ts +0 -44
  285. package/src/theme/components/radio-card.ts +0 -134
  286. package/src/theme/components/radio.ts +0 -68
  287. package/src/theme/components/select.ts +0 -74
  288. package/src/theme/components/skeleton.ts +0 -40
  289. package/src/theme/components/static-card.ts +0 -82
  290. package/src/theme/components/stepper.ts +0 -100
  291. package/src/theme/components/switch.ts +0 -112
  292. package/src/theme/components/table.ts +0 -161
  293. package/src/theme/components/tabs.ts +0 -135
  294. package/src/theme/components/textarea.ts +0 -33
  295. package/src/theme/components/toast.ts +0 -28
  296. package/src/theme/components/travel-tag.ts +0 -256
  297. package/src/theme/foundations/borders.ts +0 -11
  298. package/src/theme/foundations/colors.ts +0 -12
  299. package/src/theme/foundations/config.ts +0 -5
  300. package/src/theme/foundations/fontSizes.ts +0 -29
  301. package/src/theme/foundations/fontWeights.ts +0 -5
  302. package/src/theme/foundations/fonts.ts +0 -7
  303. package/src/theme/foundations/index.ts +0 -15
  304. package/src/theme/foundations/lineHeights.ts +0 -6
  305. package/src/theme/foundations/radii.ts +0 -12
  306. package/src/theme/foundations/shadows.ts +0 -8
  307. package/src/theme/foundations/sizes.ts +0 -36
  308. package/src/theme/foundations/spacing.ts +0 -31
  309. package/src/theme/foundations/styles.ts +0 -12
  310. package/src/theme/foundations/textStyles.ts +0 -74
  311. package/src/theme/foundations/zIndices.ts +0 -17
  312. package/src/theme/utils/base-utils.ts +0 -104
  313. package/src/theme/utils/focus-utils.ts +0 -10
  314. package/src/toast/ActionToast.test.tsx +0 -22
  315. package/src/toast/ActionToast.tsx +0 -28
  316. package/src/toast/BaseToast.test.tsx +0 -27
  317. package/src/toast/BaseToast.tsx +0 -75
  318. package/src/toast/ClosableToast.test.tsx +0 -17
  319. package/src/toast/ClosableToast.tsx +0 -40
  320. package/src/toast/useToast.tsx +0 -121
  321. package/src/tooltip/Tooltip.tsx +0 -70
  322. package/src/tooltip/index.tsx +0 -1
@@ -1,45 +1,37 @@
1
- import React, { useEffect, useId, useRef, useState } from "react";
1
+ "use client";
2
+ import React, {
3
+ forwardRef,
4
+ ReactNode,
5
+ useEffect,
6
+ useId,
7
+ useRef,
8
+ useState,
9
+ } from "react";
2
10
  import { AriaComboBoxProps, useComboBox, useFilter } from "react-aria";
3
11
  import { useComboBoxState } from "react-stately";
4
12
  import { ColorSpinner, Input, InputProps, ListBox } from "..";
5
13
  import { Popover } from "./Popover";
6
14
 
7
- type OverridableInputProps = Pick<
15
+ export type ComboboxProps<T> = Exclude<
8
16
  InputProps,
9
- | "marginTop"
10
- | "marginBottom"
11
- | "marginRight"
12
- | "marginLeft"
13
- | "marginY"
14
- | "marginX"
15
- | "paddingTop"
16
- | "paddingBottom"
17
- | "paddingLeft"
18
- | "paddingRight"
19
- | "paddingY"
20
- | "paddingX"
21
- | "leftIcon"
22
- | "rightIcon"
23
- | "borderTopRightRadius"
24
- | "borderTopLeftRadius"
25
- | "borderBottomRightRadius"
26
- | "borderBottomLeftRadius"
27
- | "onFocus"
28
- >;
29
-
30
- export type ComboboxProps<T> = AriaComboBoxProps<T> & {
31
- /** The label of the combobox */
32
- label: string;
33
- /** Whether or not the combobox is waiting for new suggestions */
34
- isLoading?: boolean;
35
- /** Optional UI to show when there are no matching items */
36
- emptyContent?: React.ReactNode;
37
- /** A ref to the input field */
38
- inputRef?: React.RefObject<HTMLInputElement>;
39
- /** If you want to allow an empty collection */
40
- allowsEmptyCollection?: boolean;
41
- variant?: "base" | "floating";
42
- } & OverridableInputProps;
17
+ "variant" | "colorPalette" | "size"
18
+ > &
19
+ AriaComboBoxProps<T> & {
20
+ /** The label of the combobox */
21
+ label: string;
22
+ /** Whether or not the combobox is waiting for new suggestions */
23
+ loading?: boolean;
24
+ /** Optional UI to show when there are no matching items */
25
+ emptyContent?: React.ReactNode;
26
+ /** A ref to the input field */
27
+ inputRef?: React.RefObject<HTMLInputElement>;
28
+ /** If you want to allow an empty collection */
29
+ allowsEmptyCollection?: boolean;
30
+ lefticon?: ReactNode;
31
+ righticon?: ReactNode;
32
+ variant?: "core" | "floating";
33
+ children?: React.ReactNode;
34
+ };
43
35
  /**
44
36
  * A combobox is a combination of an input and a list of suggestions.
45
37
  *
@@ -64,150 +56,158 @@ export type ComboboxProps<T> = AriaComboBoxProps<T> & {
64
56
  * ```
65
57
  */
66
58
 
67
- export function Combobox<T extends object>({
68
- label,
69
- isLoading,
70
- leftIcon,
71
- rightIcon,
72
- borderBottomLeftRadius = "sm",
73
- borderBottomRightRadius = "sm",
74
- borderTopLeftRadius = "sm",
75
- borderTopRightRadius = "sm",
76
- marginBottom,
77
- marginTop,
78
- marginX,
79
- marginY,
80
- marginRight,
81
- marginLeft,
82
- paddingBottom,
83
- paddingRight,
84
- paddingTop,
85
- paddingLeft,
86
- paddingX,
87
- paddingY,
88
- emptyContent,
89
- inputRef: externalInputRef,
90
- allowsEmptyCollection,
91
- variant,
92
- ...rest
93
- }: ComboboxProps<T>) {
94
- const { contains } = useFilter({ sensitivity: "base" });
59
+ export const Combobox = forwardRef<HTMLDivElement, ComboboxProps<object>>(
60
+ (props) => {
61
+ const {
62
+ label,
63
+ loading,
64
+ lefticon,
65
+ righticon,
66
+ borderBottomLeftRadius = "sm",
67
+ borderBottomRightRadius = "sm",
68
+ borderTopLeftRadius = "sm",
69
+ borderTopRightRadius = "sm",
70
+ marginBottom,
71
+ marginTop,
72
+ marginX,
73
+ marginY,
74
+ marginRight,
75
+ marginLeft,
76
+ paddingBottom,
77
+ paddingRight,
78
+ paddingTop,
79
+ paddingLeft,
80
+ paddingX,
81
+ paddingY,
82
+ emptyContent,
83
+ inputRef: externalInputRef,
84
+ allowsEmptyCollection /* Is this being used? */,
85
+ children,
86
+ variant,
87
+ } = props;
88
+ const { contains } = useFilter({ sensitivity: "base" });
95
89
 
96
- const fallbackInputRef = useRef<HTMLInputElement>(null);
97
- const inputRef = externalInputRef ?? fallbackInputRef;
98
- const listBoxRef = useRef<HTMLUListElement>(null);
99
- const popoverRef = useRef(null);
90
+ const fallbackInputRef = useRef<HTMLInputElement>(null);
91
+ const inputRef = externalInputRef ?? fallbackInputRef;
92
+ const listBoxRef = useRef<HTMLUListElement>(null);
93
+ const popoverRef = useRef(null);
100
94
 
101
- const listboxId = `${useId()}-listbox`;
95
+ const listboxId = `${useId()}-listbox`;
102
96
 
103
- const inputWidth = useInputWidth(inputRef);
97
+ const inputWidth = useInputWidth(inputRef);
104
98
 
105
- const state = useComboBoxState({
106
- allowsEmptyCollection: Boolean(emptyContent),
107
- defaultFilter: contains,
108
- shouldCloseOnBlur: true,
109
- ...rest,
110
- });
99
+ const state = useComboBoxState({
100
+ defaultFilter: contains,
101
+ shouldCloseOnBlur: true,
102
+ ...props,
103
+ });
111
104
 
112
- const comboBoxProps: OverridableInputProps = {
113
- borderTopLeftRadius,
114
- borderTopRightRadius,
115
- marginBottom,
116
- marginTop,
117
- marginRight,
118
- marginLeft,
119
- marginX,
120
- marginY,
121
- paddingBottom,
122
- paddingRight,
123
- paddingTop,
124
- paddingLeft,
125
- paddingX,
126
- paddingY,
127
- leftIcon,
128
- };
105
+ const comboBoxProps = {
106
+ borderTopLeftRadius,
107
+ borderTopRightRadius,
108
+ marginBottom,
109
+ marginTop,
110
+ marginRight,
111
+ marginLeft,
112
+ marginX,
113
+ marginY,
114
+ paddingBottom,
115
+ paddingRight,
116
+ paddingTop,
117
+ paddingLeft,
118
+ paddingX,
119
+ paddingY,
120
+ lefticon,
121
+ };
129
122
 
130
- const {
131
- inputProps: { size, ...inputProps },
132
- listBoxProps,
133
- } = useComboBox(
134
- {
135
- ...rest,
136
- inputRef,
137
- listBoxRef,
138
- popoverRef,
139
- label,
140
- },
141
- state,
142
- );
143
-
144
- return (
145
- <>
146
- <Input
147
- {...styleProps(comboBoxProps)}
148
- aria-haspopup="listbox"
149
- ref={inputRef}
150
- role="combobox"
151
- label={label}
152
- variant={variant}
153
- aria-expanded={state.isOpen}
154
- aria-autocomplete="list"
155
- aria-controls={listboxId}
156
- borderBottomLeftRadius={
157
- state.isOpen && !isLoading ? 0 : borderBottomLeftRadius
158
- }
159
- borderBottomRightRadius={
160
- state.isOpen && !isLoading ? 0 : borderBottomRightRadius
161
- }
162
- {...inputProps}
163
- rightIcon={
164
- isLoading ? (
165
- <ColorSpinner
166
- width="1.5rem"
167
- alignSelf="center"
168
- paddingRight={paddingRight}
169
- css={{
170
- div: {
171
- display: "flex",
172
- alignItems: "center",
173
- },
174
- }}
175
- />
176
- ) : (
177
- rightIcon
178
- )
179
- }
180
- />
181
- <span aria-hidden="true" data-trigger="multiselect"></span>
182
- {state.isOpen && !isLoading && (
183
- <Popover
184
- state={state}
185
- triggerRef={inputRef as any}
186
- ref={popoverRef}
187
- isNonModal
188
- placement="bottom start"
189
- shouldFlip={false}
190
- hasBackdrop={false}
191
- // The minimum padding should be 0, because the popover always should be
192
- // aligned with the input field regardless of the left padding in the container.
193
- containerPadding={0}
194
- >
195
- <ListBox
196
- {...listBoxProps}
123
+ const {
124
+ inputProps: { size, ...inputProps },
125
+ listBoxProps,
126
+ } = useComboBox(
127
+ {
128
+ ...props,
129
+ inputRef,
130
+ listBoxRef,
131
+ popoverRef,
132
+ label,
133
+ },
134
+ state,
135
+ );
136
+ return (
137
+ <>
138
+ <Input
139
+ {...styleProps(comboBoxProps)}
140
+ aria-haspopup="listbox"
141
+ ref={inputRef}
142
+ role="combobox"
143
+ label={label}
144
+ variant={variant}
145
+ aria-expanded={state.isOpen}
146
+ aria-autocomplete="list"
147
+ aria-controls={listboxId}
148
+ borderBottomLeftRadius={
149
+ state.isOpen && !loading ? 0 : borderBottomLeftRadius
150
+ }
151
+ borderBottomRightRadius={
152
+ state.isOpen && !loading ? 0 : borderBottomRightRadius
153
+ }
154
+ _active={{ backgroundColor: "core.surface.active" }}
155
+ {...inputProps}
156
+ endElement={
157
+ loading ? (
158
+ <ColorSpinner
159
+ width="1.5rem"
160
+ alignSelf="center"
161
+ paddingRight={paddingRight}
162
+ css={{
163
+ div: {
164
+ display: "flex",
165
+ alignItems: "center",
166
+ },
167
+ }}
168
+ />
169
+ ) : (
170
+ righticon
171
+ )
172
+ }
173
+ placeholder=""
174
+ />
175
+ <span aria-hidden="true" data-trigger="multiselect"></span>
176
+ {state.isOpen && !loading && (
177
+ <Popover
197
178
  state={state}
198
- id={listboxId}
199
- listBoxRef={listBoxRef}
200
- emptyContent={emptyContent}
201
- maxWidth={inputWidth}
202
- variant={variant}
179
+ triggerRef={inputRef as any}
180
+ ref={popoverRef}
181
+ isNonModal
182
+ placement="bottom start"
183
+ shouldFlip={false}
184
+ hasBackdrop={false}
185
+ // The minimum padding should be 0, because the popover always should be
186
+ // aligned with the input field regardless of the left padding in the container.
187
+ containerPadding={0}
203
188
  >
204
- {rest.children}
205
- </ListBox>
206
- </Popover>
207
- )}
208
- </>
209
- );
210
- }
189
+ <ListBox
190
+ {...{
191
+ autoFocus:
192
+ typeof listBoxProps.autoFocus === "boolean"
193
+ ? listBoxProps.autoFocus
194
+ : undefined,
195
+ }}
196
+ state={state}
197
+ id={listboxId}
198
+ listBoxRef={listBoxRef}
199
+ emptyContent={emptyContent}
200
+ maxWidth={inputWidth}
201
+ variant={variant}
202
+ >
203
+ {children}
204
+ </ListBox>
205
+ </Popover>
206
+ )}
207
+ </>
208
+ );
209
+ },
210
+ );
211
211
 
212
212
  const useInputWidth = (inputRef: React.RefObject<HTMLInputElement>) => {
213
213
  const [inputWidth, setInputWidth] = useState("auto");
@@ -1,50 +1,64 @@
1
- import React from "react";
2
- import { BoxProps, InfoSelect, Item, createTexts, useTranslation } from "..";
1
+ "use client";
3
2
 
3
+ import { createListCollection } from "@chakra-ui/react";
4
4
  import { getSupportedCallingCodes } from "awesome-phonenumber";
5
+ import React, { forwardRef } from "react";
6
+ import {
7
+ Select,
8
+ SelectItem,
9
+ SelectProps,
10
+ createTexts,
11
+ useTranslation,
12
+ } from "..";
5
13
 
6
14
  const prioritizedCountryCodes = [
7
- { key: "+47", value: "+47" },
8
- { key: "+46", value: "+46" },
9
- { key: "+45", value: "+45" },
15
+ { label: "+47", value: "+47" },
16
+ { label: "+46", value: "+46" },
17
+ { label: "+45", value: "+45" },
10
18
  ];
11
19
 
12
20
  const sortedCallingCodes = getSupportedCallingCodes()
13
21
  .sort((a, b) => Number(a) - Number(b))
14
22
  .map((code) => ({
15
- key: `+${code}`,
23
+ label: `+${code}`,
16
24
  value: `+${code}`,
17
25
  }))
18
26
  .filter(
19
- (code) => !prioritizedCountryCodes.some((pCode) => pCode.key === code.key),
27
+ (code) =>
28
+ !prioritizedCountryCodes.some((pCode) => pCode.label === code.label),
20
29
  );
21
- const callingCodes = [...prioritizedCountryCodes, ...sortedCallingCodes];
22
-
23
- type CountryCodeSelectProps = {
24
- value: string;
25
- onChange: (value: string | number) => void;
26
- name: string;
27
- width?: BoxProps["width"];
28
- height?: BoxProps["height"];
29
- variant?: "base" | "floating";
30
- };
31
- export const CountryCodeSelect = (props: CountryCodeSelectProps) => {
30
+
31
+ export const callingCodes = createListCollection({
32
+ items: [...prioritizedCountryCodes, ...sortedCallingCodes],
33
+ });
34
+
35
+ type CountryCodeSelectProps = Omit<SelectProps, "label" | "collection">;
36
+
37
+ export const CountryCodeSelect = forwardRef<
38
+ HTMLDivElement,
39
+ CountryCodeSelectProps
40
+ >((props, ref) => {
32
41
  const { t } = useTranslation();
42
+ const invalid = props.invalid;
33
43
 
34
44
  return (
35
- <InfoSelect
36
- label={t(texts.countryCode)}
37
- isLabelSrOnly={true}
38
- items={callingCodes}
39
- variant={props.variant}
45
+ <Select
40
46
  {...props}
47
+ ref={ref}
48
+ positioning={{ placement: "bottom", flip: false }}
49
+ collection={callingCodes}
50
+ lazyMount
51
+ aria-label={t(texts.countryCode)}
52
+ variant={"rightSideSquare"}
41
53
  >
42
- {(item) => <Item key={item.key}>{item.key}</Item>}
43
- </InfoSelect>
54
+ {callingCodes.items.map((code) => (
55
+ <SelectItem key={code.label} item={code}>
56
+ {code.label}
57
+ </SelectItem>
58
+ ))}
59
+ </Select>
44
60
  );
45
- };
46
-
47
- export default CountryCodeSelect;
61
+ });
48
62
 
49
63
  const texts = createTexts({
50
64
  countryCode: {
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { Box, Heading } from "@chakra-ui/react";
2
3
  import React, { useRef } from "react";
3
4
  import { AriaDialogProps, useDialog } from "react-aria";
@@ -0,0 +1,71 @@
1
+ "use client";
2
+
3
+ import {
4
+ Field as ChakraField,
5
+ RecipeVariantProps,
6
+ useSlotRecipe,
7
+ } from "@chakra-ui/react";
8
+ import * as React from "react";
9
+ import { fieldSlotRecipe } from "../theme/slot-recipes/field";
10
+
11
+ type FieldVariantProps = RecipeVariantProps<typeof fieldSlotRecipe>;
12
+
13
+ export type FieldProps = Omit<ChakraField.RootProps, "label"> &
14
+ React.PropsWithChildren<FieldVariantProps> & {
15
+ /** Label for the component */
16
+ label?: React.ReactNode;
17
+ /** Add helpertext underneath the input */
18
+ helperText?: React.ReactNode;
19
+ /** Add error text underneath the input */
20
+ errorText?: React.ReactNode;
21
+ };
22
+
23
+ /**
24
+ *
25
+ * Field is a component that wraps around other input components, like `Input` and `Select`.
26
+ *
27
+ * It can have a label, helper text, and error text.
28
+ *
29
+ * ```tsx
30
+ *
31
+ * <Field label="E-mail">
32
+ * <Input />
33
+ * </Field>
34
+ *
35
+ * ```
36
+ *
37
+ * This component is not exported and should be used as a wrapper for other input components.
38
+ */
39
+
40
+ export const Field = React.forwardRef<HTMLDivElement, FieldProps>(
41
+ (props, ref) => {
42
+ const { label, children, helperText, errorText, ...rest } = props;
43
+ const recipe = useSlotRecipe({ key: "field" });
44
+ const styles = recipe({ label, helperText, errorText });
45
+ return (
46
+ <ChakraField.Root ref={ref} {...rest} css={styles.root}>
47
+ {children}
48
+ {helperText && (
49
+ <ChakraField.HelperText>{helperText}</ChakraField.HelperText>
50
+ )}
51
+ {label && (
52
+ <ChakraField.Label css={styles.label}>{label}</ChakraField.Label>
53
+ )}
54
+ {errorText && (
55
+ <ChakraField.ErrorText>{errorText}</ChakraField.ErrorText>
56
+ )}
57
+ </ChakraField.Root>
58
+ );
59
+ },
60
+ );
61
+
62
+ export const FieldErrorText = React.forwardRef<
63
+ HTMLDivElement,
64
+ ChakraField.ErrorTextProps
65
+ >((props, ref) => {
66
+ return (
67
+ <ChakraField.ErrorText ref={ref}>{props.children}</ChakraField.ErrorText>
68
+ );
69
+ });
70
+
71
+ export const FieldLabel = ChakraField.Label;
@@ -0,0 +1,7 @@
1
+ import { Fieldset as ChakraFieldset } from "@chakra-ui/react";
2
+
3
+ export const Fieldset = ChakraFieldset.Root;
4
+ export const FieldsetLegend = ChakraFieldset.Legend;
5
+ export const FieldsetContent = ChakraFieldset.Content;
6
+ export const FieldsetHelperText = ChakraFieldset.HelperText;
7
+ export const FieldsetErrorText = ChakraFieldset.ErrorText;