@vygruppen/spor-react 11.3.9 → 12.0.0

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 +32 -11
  2. package/.turbo/turbo-typegen.log +23 -0
  3. package/CHANGELOG.md +245 -0
  4. package/dist/index.d.mts +2552 -8319
  5. package/dist/index.d.ts +2552 -8319
  6. package/dist/index.js +9609 -8607
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +9487 -8454
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +21 -13
  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 +68 -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 -100
  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 +34 -19
  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,4 +1,5 @@
1
- import { BoxProps, useFormControlContext } from "@chakra-ui/react";
1
+ "use client";
2
+ import { BoxProps, useFieldContext } from "@chakra-ui/react";
2
3
  import { CalendarDateTime } from "@internationalized/date";
3
4
  import { TimeValue } from "@react-types/datepicker";
4
5
  import {
@@ -11,6 +12,7 @@ import { IconButton, createTexts, useTranslation } from "..";
11
12
  import { StyledField } from "./StyledField";
12
13
  import { TimeField } from "./TimeField";
13
14
  import { getCurrentTime, useCurrentLocale } from "./utils";
15
+ import { Field } from "@/input/Field";
14
16
 
15
17
  type TimePickerProps = Omit<BoxProps, "defaultValue" | "onChange"> & {
16
18
  /** The label. Defaults to a localized version of "Time" */
@@ -40,7 +42,7 @@ type TimePickerProps = Omit<BoxProps, "defaultValue" | "onChange"> & {
40
42
  */
41
43
  minuteInterval?: number;
42
44
  /** Whether or not the field is disabled */
43
- isDisabled?: boolean;
45
+ disabled?: boolean;
44
46
  };
45
47
  /** A time picker component.
46
48
  *
@@ -66,13 +68,13 @@ export const TimePicker = ({
66
68
  defaultValue = getCurrentTime(),
67
69
  onChange = () => {},
68
70
  minuteInterval = 30,
69
- isDisabled: isDisabledExternally = false,
71
+ disabled: isDisabledExternally = false,
70
72
  name,
71
73
  ...boxProps
72
74
  }: TimePickerProps) => {
73
- const { isDisabled: isFormControlDisabled, isInvalid: isFormControlInvalid } =
74
- useFormControlContext() ?? {};
75
- const isDisabled = isDisabledExternally ?? isFormControlDisabled ?? false;
75
+ const { disabled: fieldDisabled, invalid: fieldInvalid } =
76
+ useFieldContext() ?? {};
77
+ const isDisabled = isDisabledExternally ?? fieldDisabled ?? false;
76
78
  const { t } = useTranslation();
77
79
  const locale = useCurrentLocale();
78
80
  const label = externalLabel ?? t(texts.time);
@@ -83,7 +85,7 @@ export const TimePicker = ({
83
85
  locale,
84
86
  isDisabled,
85
87
  label,
86
- validationState: isFormControlInvalid ? "invalid" : "valid",
88
+ validationState: fieldInvalid ? "invalid" : "valid",
87
89
  });
88
90
 
89
91
  const dateTime = state.value as CalendarDateTime | null;
@@ -124,44 +126,45 @@ export const TimePicker = ({
124
126
  texts.selectedTimeIs(`${dateTime?.hour ?? 0} ${dateTime?.minute ?? 0}`),
125
127
  )}`;
126
128
  return (
127
- <StyledField
128
- variant="base"
129
- width="fit-content"
130
- paddingX={2}
131
- alignItems="center"
132
- justifyContent="space-between"
133
- gap={2}
134
- opacity={isDisabled ? 0.5 : 1}
135
- pointerEvents={isDisabled ? "none" : "auto"}
136
- aria-disabled={isDisabled}
137
- aria-live="assertive"
138
- aria-label={ariaLabel}
139
- {...boxProps}
140
- >
141
- <IconButton
142
- variant="ghost"
143
- size="xs"
144
- borderRadius="xs"
145
- aria-label={backwardsLabel}
146
- title={backwardsLabel}
147
- icon={<DropdownLeftFill18Icon />}
148
- onClick={handleBackwardsClick}
149
- isDisabled={isDisabled}
150
- style={isDisabled ? { backgroundColor: "transparent" } : {}}
151
- />
152
- <TimeField label={label} state={state} name={name} />
153
- <IconButton
154
- variant="ghost"
155
- size="xs"
156
- borderRadius="xs"
157
- aria-label={forwardsLabel}
158
- title={forwardsLabel}
159
- icon={<DropdownRightFill18Icon />}
160
- onClick={handleForwardClick}
161
- isDisabled={isDisabled}
162
- style={isDisabled ? { backgroundColor: "transparent" } : {}}
163
- />
164
- </StyledField>
129
+ <Field as="time" {...boxProps}>
130
+ <StyledField
131
+ width="fit-content"
132
+ paddingX={2}
133
+ alignItems="center"
134
+ justifyContent="space-between"
135
+ gap={2}
136
+ opacity={isDisabled ? 0.5 : 1}
137
+ pointerEvents={isDisabled ? "none" : "auto"}
138
+ aria-disabled={isDisabled}
139
+ aria-live="assertive"
140
+ aria-label={ariaLabel}
141
+ {...boxProps}
142
+ >
143
+ <IconButton
144
+ variant="ghost"
145
+ size="xs"
146
+ borderRadius="xs"
147
+ aria-label={backwardsLabel}
148
+ title={backwardsLabel}
149
+ icon={<DropdownLeftFill18Icon />}
150
+ onClick={handleBackwardsClick}
151
+ disabled={isDisabled}
152
+ style={isDisabled ? { backgroundColor: "transparent" } : {}}
153
+ />
154
+ <TimeField label={label} state={state} name={name} />
155
+ <IconButton
156
+ variant="ghost"
157
+ size="xs"
158
+ borderRadius="xs"
159
+ aria-label={forwardsLabel}
160
+ title={forwardsLabel}
161
+ icon={<DropdownRightFill18Icon />}
162
+ onClick={handleForwardClick}
163
+ disabled={isDisabled}
164
+ style={isDisabled ? { backgroundColor: "transparent" } : {}}
165
+ />
166
+ </StyledField>
167
+ </Field>
165
168
  );
166
169
  };
167
170
 
@@ -0,0 +1,5 @@
1
+ import { ConditionalValue } from "@chakra-ui/react";
2
+
3
+ export type CalendarVariants = {
4
+ variant?: ConditionalValue<"core" | "floating" | "ghost">;
5
+ };
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { Dialog as ChakraDialog, Portal } from "@chakra-ui/react";
3
+ import * as React from "react";
4
+ import { CloseButton } from "../button";
5
+
6
+ interface DialogContentProps extends ChakraDialog.ContentProps {
7
+ portalled?: boolean;
8
+ portalRef?: React.RefObject<HTMLElement>;
9
+ backdrop?: boolean;
10
+ children?: React.ReactNode;
11
+ }
12
+
13
+ export const DialogContent = React.forwardRef<
14
+ HTMLDivElement,
15
+ DialogContentProps
16
+ >((props, ref) => {
17
+ const {
18
+ children,
19
+ portalled = true,
20
+ portalRef,
21
+ backdrop = true,
22
+ ...rest
23
+ } = props;
24
+
25
+ return (
26
+ <Portal disabled={!portalled} container={portalRef}>
27
+ {backdrop && <ChakraDialog.Backdrop />}
28
+ <ChakraDialog.Positioner>
29
+ <ChakraDialog.Content ref={ref} {...rest} asChild={false}>
30
+ {children}
31
+ </ChakraDialog.Content>
32
+ </ChakraDialog.Positioner>
33
+ </Portal>
34
+ );
35
+ });
36
+
37
+ export const DialogCloseTrigger = React.forwardRef<
38
+ HTMLButtonElement,
39
+ ChakraDialog.CloseTriggerProps
40
+ >(function DialogCloseTrigger(props, ref) {
41
+ return (
42
+ <ChakraDialog.CloseTrigger ref={ref} {...props} asChild>
43
+ <CloseButton size="md" />
44
+ </ChakraDialog.CloseTrigger>
45
+ );
46
+ });
47
+
48
+ export const DialogRoot = ChakraDialog.Root;
49
+ export const DialogFooter = ChakraDialog.Footer;
50
+ export const DialogHeader = ChakraDialog.Header;
51
+ export const DialogBody = ChakraDialog.Body;
52
+ export const DialogBackdrop = ChakraDialog.Backdrop;
53
+ export const DialogTitle = ChakraDialog.Title;
54
+ export const DialogDescription = ChakraDialog.Description;
55
+ export const DialogTrigger = ChakraDialog.Trigger;
56
+ export const DialogActionTrigger = ChakraDialog.ActionTrigger;
@@ -0,0 +1,187 @@
1
+ "use client";
2
+
3
+ import {
4
+ Box,
5
+ Drawer as ChakraDrawer,
6
+ createContext,
7
+ Grid,
8
+ GridItem,
9
+ Portal,
10
+ } from "@chakra-ui/react";
11
+ import {
12
+ ArrowLeftFill24Icon,
13
+ CloseFill24Icon,
14
+ } from "@vygruppen/spor-icon-react";
15
+ import React, { forwardRef } from "react";
16
+ import { Button, CloseButton } from "../button";
17
+ import { createTexts, useTranslation } from "../i18n";
18
+ import {
19
+ DrawerContentProps,
20
+ DrawerFullScreenHeaderProps,
21
+ DrawerProps,
22
+ } from "./types";
23
+
24
+ /**
25
+ * A drawer is a panel that slides in from the side of the screen. It is used to display additional content without taking up too much space.
26
+ *
27
+ * Basic example:
28
+ *
29
+ * ```tsx
30
+ * <Drawer placement="bottom" size="md">
31
+ * <DrawerTrigger asChild>
32
+ * <Button variant="primary">Open drawer</Button>
33
+ * </DrawerTrigger>
34
+ * <DrawerContent>
35
+ * <DrawerHeader>
36
+ * <DrawerCloseTrigger />
37
+ * <DrawerTitle>Drawer title</DrawerTitle>
38
+ * </DrawerHeader>
39
+ * <DrawerBody>
40
+ * Drawer content
41
+ * </DrawerBody>
42
+ * </DrawerContent>
43
+ * </Drawer>
44
+ * ```
45
+ */
46
+
47
+ type DrawerContextProps = ChakraDrawer.RootProps;
48
+
49
+ const [RootDrawerProvider, useRootDrawerProps] =
50
+ createContext<DrawerContextProps>({
51
+ name: "RootDrawerProvider",
52
+ });
53
+
54
+ export const DrawerContent = forwardRef<HTMLDivElement, DrawerContentProps>(
55
+ (props, ref) => {
56
+ const { children, portalled = true, portalRef, ...rest } = props;
57
+ const { size, placement } = useRootDrawerProps();
58
+ const sizeNotFull = size !== "full";
59
+ return (
60
+ <Portal disabled={!portalled} container={portalRef}>
61
+ <ChakraDrawer.Positioner>
62
+ <ChakraDrawer.Content ref={ref} {...rest}>
63
+ {sizeNotFull && placement === "bottom" && <CloseDrawerLine />}
64
+ {children}
65
+ {sizeNotFull && placement === "top" && <CloseDrawerLine />}
66
+ </ChakraDrawer.Content>
67
+ </ChakraDrawer.Positioner>
68
+ </Portal>
69
+ );
70
+ },
71
+ );
72
+
73
+ export const CloseDrawerLine = forwardRef<HTMLButtonElement, {}>(
74
+ (props, ref) => {
75
+ const { t } = useTranslation();
76
+ return (
77
+ <ChakraDrawer.CloseTrigger
78
+ {...props}
79
+ ref={ref}
80
+ position="relative"
81
+ insetEnd="unset"
82
+ aria-label={t(texts.close)}
83
+ cursor="pointer"
84
+ top={0}
85
+ paddingY={2}
86
+ >
87
+ <Box
88
+ width={7}
89
+ height={1}
90
+ backgroundColor="silver"
91
+ borderRadius="xs"
92
+ marginX="auto"
93
+ />
94
+ </ChakraDrawer.CloseTrigger>
95
+ );
96
+ },
97
+ );
98
+
99
+ export const DrawerCloseTrigger = forwardRef<
100
+ HTMLButtonElement,
101
+ ChakraDrawer.CloseTriggerProps
102
+ >(function DrawerCloseTrigger(props, ref) {
103
+ const { size } = useRootDrawerProps();
104
+ const { t } = useTranslation();
105
+ return (
106
+ <ChakraDrawer.CloseTrigger ref={ref} {...props} asChild>
107
+ {size === "full" ? (
108
+ <Button variant="ghost" leftIcon={<CloseFill24Icon />}>
109
+ {t(texts.close)}
110
+ </Button>
111
+ ) : (
112
+ <CloseButton size="md" />
113
+ )}
114
+ </ChakraDrawer.CloseTrigger>
115
+ );
116
+ });
117
+
118
+ export const DrawerBackTrigger = forwardRef<
119
+ HTMLButtonElement,
120
+ ChakraDrawer.CloseTriggerProps
121
+ >((props, ref) => {
122
+ const { t } = useTranslation();
123
+ return (
124
+ <ChakraDrawer.CloseTrigger asChild {...props} ref={ref} top="0">
125
+ <Button variant="ghost" leftIcon={<ArrowLeftFill24Icon />}>
126
+ {t(texts.back)}
127
+ </Button>
128
+ </ChakraDrawer.CloseTrigger>
129
+ );
130
+ });
131
+
132
+ export const DrawerFullScreenHeader = forwardRef<
133
+ HTMLDivElement,
134
+ DrawerFullScreenHeaderProps
135
+ >((props, ref) => {
136
+ const { backTrigger = true, title } = props;
137
+ return (
138
+ <ChakraDrawer.Header {...props} ref={ref} asChild>
139
+ <Grid templateColumns="1fr auto 1fr" height="auto" paddingX="8">
140
+ <GridItem width="full" alignSelf="center">
141
+ {backTrigger && <DrawerBackTrigger />}
142
+ </GridItem>
143
+ <GridItem width="full" alignSelf="end" asChild>
144
+ {title && <DrawerTitle>{title}</DrawerTitle>}
145
+ </GridItem>
146
+ <GridItem width="full" alignSelf="end">
147
+ <DrawerCloseTrigger justifySelf="end" top="0" />
148
+ </GridItem>
149
+ </Grid>
150
+ </ChakraDrawer.Header>
151
+ );
152
+ });
153
+
154
+ export const Drawer = (props: DrawerProps) => {
155
+ const { children, placement, size = "md", ...rest } = props;
156
+ return (
157
+ <RootDrawerProvider value={props}>
158
+ <ChakraDrawer.Root {...rest} placement={placement} size={size}>
159
+ <DrawerBackdrop />
160
+ {children}
161
+ </ChakraDrawer.Root>
162
+ </RootDrawerProvider>
163
+ );
164
+ };
165
+
166
+ export const DrawerTrigger = ChakraDrawer.Trigger;
167
+ export const DrawerFooter = ChakraDrawer.Footer;
168
+ export const DrawerBody = ChakraDrawer.Body;
169
+ export const DrawerBackdrop = ChakraDrawer.Backdrop;
170
+ export const DrawerTitle = ChakraDrawer.Title;
171
+ export const DrawerActionTrigger = ChakraDrawer.ActionTrigger;
172
+ export const DrawerHeader = ChakraDrawer.Header;
173
+
174
+ const texts = createTexts({
175
+ back: {
176
+ en: "Back",
177
+ nb: "Tilbake",
178
+ nn: "Tilbake",
179
+ sv: "Tillbaka",
180
+ },
181
+ close: {
182
+ en: "Close",
183
+ nb: "Lukk",
184
+ nn: "Lukk",
185
+ sv: "Stäng",
186
+ },
187
+ });
@@ -0,0 +1,2 @@
1
+ export * from "./Drawer";
2
+ export * from "./Dialog";
@@ -0,0 +1,26 @@
1
+ import { drawerSlotRecipe } from "@/theme/slot-recipes/drawer";
2
+ import { RecipeVariantProps, Drawer as ChakraDrawer } from "@chakra-ui/react";
3
+ import { PropsWithChildren } from "react";
4
+
5
+ export type DrawerVariantProps = RecipeVariantProps<typeof drawerSlotRecipe>;
6
+
7
+ export type DrawerContentProps = ChakraDrawer.ContentProps &
8
+ PropsWithChildren<DrawerVariantProps> & {
9
+ children: React.ReactNode;
10
+ portalled?: boolean;
11
+ portalRef?: React.RefObject<HTMLElement>;
12
+ };
13
+
14
+ export type DrawerProps = Omit<
15
+ ChakraDrawer.RootProps,
16
+ "colorPalette" | "contained" | "unstyled"
17
+ > &
18
+ ChakraDrawer.RootProps &
19
+ PropsWithChildren<DrawerVariantProps> & {
20
+ children: React.ReactNode;
21
+ };
22
+
23
+ export type DrawerFullScreenHeaderProps = ChakraDrawer.HeaderProps & {
24
+ backTrigger?: boolean;
25
+ title?: string;
26
+ };
@@ -1,2 +1,2 @@
1
- export { Image, Img } from "@chakra-ui/react";
2
- export type { ImageProps, ImgProps } from "@chakra-ui/react";
1
+ export { Image } from "@chakra-ui/react";
2
+ export type { ImageProps } from "@chakra-ui/react";
package/src/index.tsx CHANGED
@@ -3,7 +3,10 @@ export * from "./accordion";
3
3
  export * from "./alert";
4
4
  export * from "./breadcrumb";
5
5
  export * from "./button";
6
+ export * from "./color-mode";
6
7
  export * from "./datepicker";
8
+ export * from "./theme/brand";
9
+ export * from "./theme";
7
10
  export * from "./i18n";
8
11
  export * from "./image";
9
12
  export * from "./input";
@@ -14,7 +17,7 @@ export * from "./list";
14
17
  export * from "./loader";
15
18
  export * from "./logo";
16
19
  export * from "./media-controller";
17
- export * from "./modal";
20
+ export * from "./dialog";
18
21
  export * from "./nudge";
19
22
  export * from "./pagination";
20
23
  export * from "./progress-indicator";
@@ -22,9 +25,8 @@ export * from "./provider";
22
25
  export * from "./stepper";
23
26
  export * from "./tab";
24
27
  export * from "./table";
25
- export * from "./theme";
26
28
  export * from "./toast";
27
- export * from "./tooltip";
28
29
  export * from "./transition";
29
30
  export * from "./typography";
30
31
  export * from "./util";
32
+ export * from "./popover";
@@ -1,7 +1,10 @@
1
- import React from "react";
2
- import { Flex, FlexProps } from "..";
1
+ "use client";
2
+
3
+ import React, { forwardRef, PropsWithChildren } from "react";
4
+ import { chakra, Group, RecipeVariantProps, useRecipe } from "@chakra-ui/react";
5
+ import { attachedInputsRecipe } from "@/theme/recipes/attached-inputs";
6
+ import { InputGroupProps } from "./InputGroup";
3
7
 
4
- type AttachedInputsProps = FlexProps;
5
8
  /**
6
9
  * Attaches several inputs together, so that they look like one input.
7
10
  *
@@ -14,42 +17,14 @@ type AttachedInputsProps = FlexProps;
14
17
  * </AttachedInputs>
15
18
  * ```
16
19
  */
17
- export const AttachedInputs = ({
18
- flexDirection = "row",
19
- ...rest
20
- }: AttachedInputsProps) => {
21
- const attachedStyles = {
22
- horizontal: {
23
- "> *:first-of-type:not(:last-of-type) [data-attachable]": {
24
- borderEndRadius: 0,
25
- },
26
- "> *:not(:first-of-type):not(:last-of-type) [data-attachable]": {
27
- borderRadius: 0,
28
- },
29
- "> *:not(:first-of-type):last-of-type [data-attachable]": {
30
- borderStartRadius: 0,
31
- },
32
- },
33
- vertical: {
34
- "> *:first-of-type:not(:last-of-type) [data-attachable]": {
35
- borderBottomRadius: 0,
36
- },
37
- "> *:not(:first-of-type):not(:last-of-type) [data-attachable]": {
38
- borderRadius: 0,
39
- },
40
- "> *:not(:first-of-type):last-of-type [data-attachable]": {
41
- borderTopRadius: 0,
42
- },
43
- },
44
- };
45
- const direction = flexDirection === "row" ? "horizontal" : "vertical";
46
- return (
47
- <Flex
48
- role="group"
49
- __css={attachedStyles[direction]}
50
- display="flex"
51
- flexDirection={flexDirection}
52
- {...rest}
53
- />
54
- );
55
- };
20
+
21
+ export type AttachedInputsProps = RecipeVariantProps<
22
+ typeof attachedInputsRecipe
23
+ > &
24
+ InputGroupProps;
25
+
26
+ const StyledGroup = chakra(Group, attachedInputsRecipe);
27
+
28
+ export const AttachedInputs = forwardRef<HTMLDivElement, AttachedInputsProps>(
29
+ (props, ref) => <StyledGroup ref={ref} attached {...props} />,
30
+ );