@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,146 +1,218 @@
1
+ "use client";
2
+ import React, {
3
+ forwardRef,
4
+ PropsWithChildren,
5
+ useEffect,
6
+ useRef,
7
+ useState,
8
+ } from "react";
1
9
  import {
2
- Box,
3
- DarkMode,
10
+ Button,
11
+ createTexts,
4
12
  Popover,
5
- PopoverAnchor,
6
- PopoverArrow,
7
- PopoverBody,
8
- PopoverCloseButton,
9
13
  PopoverContent,
14
+ PopoverProps,
15
+ PopoverTrigger,
16
+ ProgressIndicator,
17
+ useColorMode,
18
+ useTranslation,
19
+ } from "..";
20
+
21
+ import {
22
+ Box,
23
+ BoxProps,
24
+ chakra,
25
+ Popover as ChakraPopover,
26
+ PopoverRootProps,
10
27
  } from "@chakra-ui/react";
11
- import React from "react";
12
- import { Button, ButtonGroup, createTexts, useTranslation } from "..";
13
- import { TooltipProps } from "../tooltip";
28
+ import { ArrowRightFill18Icon } from "@vygruppen/spor-icon-react";
29
+ import {
30
+ PopoverCloseTrigger,
31
+ usePopover,
32
+ usePopoverContext,
33
+ } from "@ark-ui/react";
34
+
35
+ const EXPIRATION_DELAY_MS = 30 * 24 * 60 * 60 * 1000; // 30 days in milliseconds
36
+
37
+ const isNudgeExpired = (
38
+ introducedDate: string,
39
+ delay = EXPIRATION_DELAY_MS,
40
+ ): boolean => {
41
+ const expirationTime = new Date(introducedDate).getTime() + delay;
42
+ return expirationTime < Date.now();
43
+ };
44
+
45
+ const logExpirationWarning = () => {
46
+ if (process.env.NODE_ENV === "development") {
47
+ console.warn(
48
+ `The nudge has been used for longer than 30 days. Please remove it from the codebase.
49
+ This is a development-only warning and will not appear in production.`,
50
+ );
51
+ }
52
+ };
14
53
 
15
54
  export type NudgeProps = {
16
- /**
17
- * The ISO-formatted date of when the Nudge was introduced.
18
- *
19
- * After this date has been surpassed by 30 days, the nudge will no longer be shown,
20
- * and an error will be logged in development mode.
21
- *
22
- * ```tsx
23
- * <Nudge introducedDate="2024-02-19" {...otherProps} />
24
- * ```
25
- **/
26
55
  introducedDate: string;
27
- /**
28
- * The name of the nudge.
29
- * This will be used to check whether or not the nudge has been viewed.
30
- **/
31
- name: string;
32
- /**
33
- * The anchor of the nudge.
34
- *
35
- * The element that should be nudged toward.
36
- *
37
- * ```tsx
38
- * <Nudge content="This is a great new feature! Try it out.">
39
- * <MyFeature />
40
- * </Nudge>
41
- * ```
42
- * */
43
- children: React.ReactNode;
44
- /**
45
- * The content of the nudge.
46
- */
47
- content: React.ReactNode;
48
- /**
49
- * Any actions you want to provide. Defaults to a close button and a "Show me" button.
50
- */
51
- actions?: React.ReactNode;
52
- } & Omit<
53
- TooltipProps,
54
- | "name"
55
- | "triggerElement"
56
- | "children"
57
- | "withCloseButton"
58
- | "defaultIsOpen"
59
- | "size"
60
- | "borderRadius"
61
- >;
62
-
63
- const EXPIRATION_DELAY = 1000 * 60 * 60 * 24 * 30; // 30 days
64
-
65
- /** A nudge.
66
- *
67
- * A nudge is a way to hint of a new feature.
68
- *
69
- * You're required to set an `introducedDate` to the nudge, which is the timestamp of when the nudge was introduced. After 30 days, the nudge will no longer be shown, and an error will be logged in development mode.
70
- *
71
- * ```tsx
72
- * <Nudge
73
- * introducedDate="2024-02-19"
74
- * name="my-nudge"
75
- * content="Check out this enormous new feature!"
76
- * >
77
- * <StaticCard variant="base" padding={2} width="fit-content">My new feature</StaticCard>
78
- * </Nudge>
79
- * ```
80
- */
81
- export const Nudge = ({
82
- introducedDate,
83
- name,
84
- children,
85
- content,
86
- actions,
87
- ...props
88
- }: NudgeProps) => {
89
- const { t } = useTranslation();
90
- if (new Date(introducedDate).getTime() + EXPIRATION_DELAY < Date.now()) {
91
- if (process.env.NODE_ENV === "development") {
92
- console.warn(
93
- `The nudge ${name} has been used for longer than 30 days. Please remove it from the codebase.
94
-
95
- This is a development only warning, and will not be shown in production.`,
96
- );
97
- }
56
+ } & PopoverRootProps;
57
+
58
+ export const Nudge = (props: NudgeProps) => {
59
+ const {
60
+ introducedDate,
61
+ defaultOpen = props.open === undefined ? true : undefined, // defaultOpen defaults to true if open is undefined
62
+ size = "md",
63
+ ...rest
64
+ } = props;
65
+
66
+ if (isNudgeExpired(introducedDate)) {
67
+ logExpirationWarning();
98
68
  return null;
99
69
  }
70
+
71
+ return <Popover defaultOpen={true} size={size} {...rest} />;
72
+ };
73
+
74
+ export const NudgeTrigger = forwardRef<
75
+ HTMLButtonElement,
76
+ ChakraPopover.TriggerProps
77
+ >(({ ...props }, ref) => {
78
+ return <PopoverTrigger {...props} ref={ref} />;
79
+ });
80
+
81
+ export const NudgeContent = forwardRef<HTMLDivElement, PopoverProps>(
82
+ ({ showCloseButton = true, children, ...props }, ref) => {
83
+ const [currentStep, setCurrentStep] = useState(1);
84
+ const childrenArray = React.Children.toArray(children); // Convert children to an array
85
+
86
+ const { open } = usePopoverContext();
87
+
88
+ useEffect(() => {
89
+ setCurrentStep(1);
90
+ }, [children, open]);
91
+
92
+ const wizardPages = childrenArray.filter(
93
+ (child) =>
94
+ React.isValidElement(child) &&
95
+ (child.type as React.ComponentType).displayName === "NudgeWizardStep",
96
+ );
97
+
98
+ const restChildren = childrenArray.filter(
99
+ (child) =>
100
+ !React.isValidElement(child) ||
101
+ (child.type as React.ComponentType).displayName !== "NudgeWizardStep",
102
+ );
103
+
104
+ const totalSteps = wizardPages.length;
105
+ const isLastStep = totalSteps === currentStep;
106
+
107
+ if (!wizardPages.length) {
108
+ return (
109
+ <PopoverContent showCloseButton={showCloseButton} {...props} ref={ref}>
110
+ {children}
111
+ </PopoverContent>
112
+ );
113
+ }
114
+
115
+ return (
116
+ <PopoverContent showCloseButton={showCloseButton} {...props} ref={ref}>
117
+ {restChildren}
118
+ {wizardPages[currentStep - 1] as React.ReactElement}
119
+ <NudgeActions gap="18px">
120
+ <ProgressIndicator
121
+ activeStep={currentStep}
122
+ numberOfSteps={totalSteps}
123
+ />
124
+
125
+ <NextButton
126
+ isLastStep={isLastStep}
127
+ onNext={() => {
128
+ setCurrentStep((prev) => prev + 1);
129
+ }}
130
+ />
131
+ </NudgeActions>
132
+ </PopoverContent>
133
+ );
134
+ },
135
+ );
136
+
137
+ export const NudgeActions = ({ className, ...props }: BoxProps) => {
138
+ const { colorMode } = useColorMode();
139
+
100
140
  return (
101
- <Popover
102
- arrowSize={12}
103
- arrowShadowColor="none"
104
- defaultIsOpen={true}
141
+ <Box
142
+ className={colorMode === "dark" ? "light" : "dark"}
143
+ display="flex"
144
+ paddingTop="1rem"
145
+ alignItems="center"
146
+ gap="0.5rem"
147
+ justifyContent="between"
148
+ width="100%"
105
149
  {...props}
150
+ />
151
+ );
152
+ };
153
+
154
+ type NextOrCloseButtonProps = {
155
+ isLastStep: boolean;
156
+ onNext: () => void;
157
+ };
158
+ const NextButton = ({ isLastStep, onNext }: NextOrCloseButtonProps) => {
159
+ const { t } = useTranslation();
160
+
161
+ if (isLastStep)
162
+ return (
163
+ <PopoverCloseTrigger>
164
+ <Button variant="tertiary" size="xs">
165
+ {t(texts.close)}
166
+ </Button>
167
+ </PopoverCloseTrigger>
168
+ );
169
+
170
+ return (
171
+ <Button
172
+ variant="tertiary"
173
+ size="xs"
174
+ rightIcon={<ArrowRightFill18Icon />}
175
+ onClick={onNext}
106
176
  >
107
- <PopoverAnchor>{children}</PopoverAnchor>
108
- <PopoverContent borderRadius="sm">
109
- <DarkMode>
110
- <PopoverArrow />
111
- <PopoverCloseButton />
112
- <PopoverBody margin={1}>
113
- <Box marginRight={4}>{content}</Box>
114
- <Box marginTop={1.5}>
115
- {actions ?? (
116
- <ButtonGroup>
117
- <Button variant="tertiary" size="xs">
118
- {t(texts.close)}
119
- </Button>
120
- <Button variant="secondary" size="xs" fontWeight="bold">
121
- {t(texts.showMe)}
122
- </Button>
123
- </ButtonGroup>
124
- )}
125
- </Box>
126
- </PopoverBody>
127
- </DarkMode>
128
- </PopoverContent>
129
- </Popover>
177
+ {t(texts.nextStep)}
178
+ </Button>
130
179
  );
131
180
  };
132
181
 
133
182
  const texts = createTexts({
183
+ nextStep: {
184
+ nb: "Neste",
185
+ nn: "Neste",
186
+ sv: "Nästa",
187
+ en: "Next",
188
+ },
134
189
  close: {
135
190
  nb: "Lukk",
136
191
  nn: "Lukk",
137
192
  sv: "Stäng",
138
193
  en: "Close",
139
194
  },
140
- showMe: {
141
- nb: "Vis meg",
142
- nn: "Vis meg",
143
- sv: "Visa mig",
144
- en: "Show me",
145
- },
195
+ });
196
+
197
+ export const NudgeWizardStep = ({ children }: PropsWithChildren) => {
198
+ return (
199
+ <chakra.div display="flex" flexDirection="column" gap="1rem" width="100%">
200
+ {children}
201
+ </chakra.div>
202
+ );
203
+ };
204
+
205
+ NudgeWizardStep.displayName = "NudgeWizardStep";
206
+
207
+ export const NudgeCloseTrigger = forwardRef<
208
+ HTMLButtonElement,
209
+ ChakraPopover.TriggerProps
210
+ >(({ children, ...props }, ref) => {
211
+ const isStringChild = typeof children === "string";
212
+
213
+ return (
214
+ <ChakraPopover.CloseTrigger {...props} ref={ref} asChild={!isStringChild}>
215
+ {children}
216
+ </ChakraPopover.CloseTrigger>
217
+ );
146
218
  });
@@ -1,2 +1 @@
1
1
  export * from "./Nudge";
2
- export * from "./WizardNudge";