@vygruppen/spor-react 11.3.10 → 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.
- package/.turbo/turbo-build.log +32 -11
- package/.turbo/turbo-typegen.log +23 -0
- package/CHANGELOG.md +239 -0
- package/dist/index.d.mts +2552 -8319
- package/dist/index.d.ts +2552 -8319
- package/dist/index.js +9609 -8608
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9487 -8455
- package/dist/index.mjs.map +1 -1
- package/package.json +21 -13
- package/src/accordion/Accordion.tsx +96 -45
- package/src/accordion/Expandable.tsx +54 -127
- package/src/accordion/helpers.ts +31 -0
- package/src/accordion/types.ts +60 -0
- package/src/alert/Alert.tsx +101 -0
- package/src/alert/AlertIcon.tsx +63 -45
- package/src/alert/ExpandableAlert.tsx +96 -64
- package/src/alert/ServiceAlert.tsx +127 -125
- package/src/alert/{index.tsx → index.ts} +1 -2
- package/src/breadcrumb/Breadcrumb.tsx +39 -24
- package/src/button/Button.tsx +86 -105
- package/src/button/ButtonGroup.tsx +45 -20
- package/src/button/Clipboard.tsx +82 -0
- package/src/button/CloseButton.tsx +4 -3
- package/src/button/FloatingActionButton.tsx +35 -41
- package/src/button/IconButton.tsx +34 -30
- package/src/button/index.tsx +1 -0
- package/src/color-mode/color-mode.tsx +75 -0
- package/src/color-mode/index.ts +1 -0
- package/src/datepicker/Calendar.tsx +17 -8
- package/src/datepicker/CalendarCell.tsx +20 -13
- package/src/datepicker/CalendarGrid.tsx +18 -10
- package/src/datepicker/CalendarHeader.tsx +2 -0
- package/src/datepicker/CalendarNavigationButton.tsx +1 -0
- package/src/datepicker/CalendarTriggerButton.tsx +43 -45
- package/src/datepicker/DateField.tsx +21 -12
- package/src/datepicker/DatePicker.tsx +61 -58
- package/src/datepicker/DateRangePicker.tsx +52 -58
- package/src/datepicker/DateTimeSegment.tsx +13 -5
- package/src/datepicker/RangeCalendar.tsx +13 -7
- package/src/datepicker/StyledField.tsx +25 -17
- package/src/datepicker/TimeField.tsx +10 -8
- package/src/datepicker/TimePicker.tsx +48 -45
- package/src/datepicker/types.ts +5 -0
- package/src/dialog/Dialog.tsx +56 -0
- package/src/dialog/Drawer.tsx +187 -0
- package/src/dialog/index.ts +2 -0
- package/src/dialog/types.ts +26 -0
- package/src/image/index.tsx +2 -2
- package/src/index.tsx +5 -3
- package/src/input/AttachedInputs.tsx +17 -42
- package/src/input/CardSelect.tsx +75 -162
- package/src/input/Checkbox.tsx +30 -6
- package/src/input/CheckboxGroup.tsx +25 -16
- package/src/input/ChoiceChip.tsx +58 -77
- package/src/input/Combobox.tsx +172 -172
- package/src/input/CountryCodeSelect.tsx +42 -28
- package/src/input/Dialog.tsx +1 -0
- package/src/input/Field.tsx +71 -0
- package/src/input/Fieldset.tsx +7 -0
- package/src/input/Input.tsx +68 -73
- package/src/input/InputGroup.tsx +66 -0
- package/src/input/ListBox.tsx +83 -70
- package/src/input/NativeSelect.tsx +68 -33
- package/src/input/NumericStepper.tsx +173 -171
- package/src/input/PasswordInput.tsx +99 -52
- package/src/input/PhoneNumberInput.tsx +69 -72
- package/src/input/Popover.tsx +1 -0
- package/src/input/Radio.tsx +37 -17
- package/src/input/SearchInput.tsx +24 -86
- package/src/input/Select.tsx +237 -0
- package/src/input/Switch.tsx +60 -18
- package/src/input/Textarea.tsx +53 -101
- package/src/input/{index.tsx → index.ts} +2 -8
- package/src/layout/PressableCard.tsx +12 -21
- package/src/layout/RadioCard.tsx +68 -101
- package/src/layout/Separator.tsx +32 -0
- package/src/layout/StaticCard.tsx +13 -33
- package/src/layout/index.tsx +3 -7
- package/src/linjetag/InfoTag.tsx +16 -9
- package/src/linjetag/LineIcon.tsx +74 -28
- package/src/linjetag/TravelTag.tsx +38 -27
- package/src/link/TextLink.tsx +25 -16
- package/src/list/index.tsx +24 -2
- package/src/loader/ClientOnly.tsx +8 -7
- package/src/loader/ColorInlineLoader.tsx +4 -3
- package/src/loader/ColorSpinner.tsx +5 -4
- package/src/loader/ContentLoader.tsx +6 -4
- package/src/loader/DarkFullScreenLoader.tsx +11 -3
- package/src/loader/DarkInlineLoader.tsx +5 -3
- package/src/loader/DarkSpinner.tsx +7 -3
- package/src/loader/LightFullScreenLoader.tsx +11 -3
- package/src/loader/LightInlineLoader.tsx +11 -3
- package/src/loader/LightSpinner.tsx +5 -3
- package/src/loader/Lottie.tsx +3 -3
- package/src/loader/ProgressBar.tsx +83 -84
- package/src/loader/ProgressLoader.tsx +120 -75
- package/src/loader/Skeleton.tsx +94 -19
- package/src/loader/index.tsx +0 -2
- package/src/loader/useHydrated.tsx +1 -0
- package/src/loader/useRotatingLabel.tsx +2 -1
- package/src/logo/CargonetLogo.tsx +89 -89
- package/src/logo/VyLogo.tsx +61 -42
- package/src/logo/VyLogoPride.tsx +137 -139
- package/src/media-controller/JumpButton.tsx +48 -38
- package/src/media-controller/PlayPauseButton.tsx +31 -29
- package/src/media-controller/SkipButton.tsx +38 -37
- package/src/nudge/Nudge.tsx +195 -123
- package/src/nudge/index.tsx +0 -1
- package/src/pagination/Pagination.tsx +221 -118
- package/src/pagination/types.ts +23 -0
- package/src/popover/index.tsx +67 -0
- package/src/progress-indicator/ProgressDot.tsx +11 -10
- package/src/progress-indicator/ProgressIndicator.tsx +28 -15
- package/src/provider/SporProvider.tsx +17 -14
- package/src/stepper/Stepper.tsx +88 -85
- package/src/stepper/StepperContext.tsx +2 -1
- package/src/stepper/StepperStep.tsx +28 -21
- package/src/tab/Tabs.tsx +62 -12
- package/src/tab/index.tsx +1 -9
- package/src/table/Table.tsx +35 -30
- package/src/table/index.tsx +11 -7
- package/src/theme/brand.ts +7 -0
- package/src/theme/index.ts +45 -37
- package/src/theme/recipes/attached-inputs.ts +43 -0
- package/src/theme/recipes/badge.ts +104 -0
- package/src/theme/recipes/button.ts +124 -0
- package/src/theme/recipes/choice-chip.ts +144 -0
- package/src/theme/recipes/close-button.ts +41 -0
- package/src/theme/recipes/code.ts +14 -0
- package/src/theme/recipes/group.ts +19 -0
- package/src/theme/recipes/index.ts +29 -0
- package/src/theme/recipes/input.ts +89 -0
- package/src/theme/recipes/link.ts +64 -0
- package/src/theme/recipes/nudge.ts +12 -0
- package/src/theme/recipes/pressable-card.ts +83 -0
- package/src/theme/recipes/progress-loader.ts +14 -0
- package/src/theme/recipes/separator.ts +85 -0
- package/src/theme/recipes/skeleton.ts +57 -0
- package/src/theme/recipes/static-card.ts +39 -0
- package/src/theme/recipes/textarea.ts +27 -0
- package/src/theme/semantic-tokens/colors.ts +22 -0
- package/src/theme/semantic-tokens/index.ts +24 -0
- package/src/theme/semantic-tokens/radii.ts +14 -0
- package/src/theme/semantic-tokens/shadows.ts +17 -0
- package/src/theme/slot-recipes/accordion.ts +131 -0
- package/src/theme/slot-recipes/alert-expandable.ts +133 -0
- package/src/theme/slot-recipes/alert-service.ts +66 -0
- package/src/theme/slot-recipes/alert.ts +72 -0
- package/src/theme/slot-recipes/anatomy.ts +269 -0
- package/src/theme/slot-recipes/breadcrumb.ts +61 -0
- package/src/theme/slot-recipes/checkbox.ts +89 -0
- package/src/theme/slot-recipes/datepicker.ts +214 -0
- package/src/theme/slot-recipes/dialog.ts +221 -0
- package/src/theme/slot-recipes/drawer.ts +205 -0
- package/src/theme/slot-recipes/field.ts +79 -0
- package/src/theme/slot-recipes/floating-action-button.ts +131 -0
- package/src/theme/slot-recipes/index.ts +65 -0
- package/src/theme/slot-recipes/info-tag.ts +62 -0
- package/src/theme/slot-recipes/line-icon.ts +140 -0
- package/src/theme/slot-recipes/list.ts +45 -0
- package/src/theme/slot-recipes/listbox.ts +72 -0
- package/src/theme/slot-recipes/media-controller-button.ts +131 -0
- package/src/theme/slot-recipes/native-select.ts +54 -0
- package/src/theme/slot-recipes/numeric-stepper.ts +65 -0
- package/src/theme/slot-recipes/pagination.ts +41 -0
- package/src/theme/slot-recipes/popover.ts +78 -0
- package/src/theme/slot-recipes/progress-bar.ts +39 -0
- package/src/theme/slot-recipes/progress-indicator.ts +22 -0
- package/src/theme/slot-recipes/radio-card.ts +112 -0
- package/src/theme/slot-recipes/radio.ts +80 -0
- package/src/theme/slot-recipes/select.ts +243 -0
- package/src/theme/slot-recipes/stepper.ts +92 -0
- package/src/theme/slot-recipes/switch.ts +147 -0
- package/src/theme/slot-recipes/table.ts +200 -0
- package/src/theme/slot-recipes/tabs.ts +169 -0
- package/src/theme/slot-recipes/toast.ts +56 -0
- package/src/theme/slot-recipes/travel-tag.ts +192 -0
- package/src/theme/tokens/animation-styles.ts +50 -0
- package/src/theme/tokens/animations.ts +22 -0
- package/src/theme/tokens/aspect-ratios.ts +22 -0
- package/src/theme/tokens/blurs.ts +28 -0
- package/src/theme/tokens/borders.ts +26 -0
- package/src/theme/{foundations → tokens}/breakpoints.ts +0 -1
- package/src/theme/tokens/colors.ts +10 -0
- package/src/theme/tokens/config.ts +10 -0
- package/src/theme/tokens/cursor.ts +28 -0
- package/src/theme/tokens/durations.ts +25 -0
- package/src/theme/tokens/easings.ts +16 -0
- package/src/theme/tokens/font-sizes.ts +30 -0
- package/src/theme/tokens/font-weights.ts +31 -0
- package/src/theme/tokens/fonts.ts +8 -0
- package/src/theme/tokens/global-css.ts +18 -0
- package/src/theme/tokens/index.ts +37 -0
- package/src/theme/tokens/keyframes.ts +255 -0
- package/src/theme/tokens/letter-spacings.ts +19 -0
- package/src/theme/tokens/line-heights.ts +19 -0
- package/src/theme/tokens/radii.ts +13 -0
- package/src/theme/tokens/sizes.ts +51 -0
- package/src/theme/tokens/spacing.ts +20 -0
- package/src/theme/tokens/text-styles.ts +89 -0
- package/src/theme/tokens/z-index.ts +17 -0
- package/src/theme/utils/accent-utils.ts +8 -21
- package/src/theme/utils/bg-utils.ts +4 -6
- package/src/theme/utils/brand-utils.ts +6 -19
- package/src/theme/utils/core-utils.ts +91 -0
- package/src/theme/utils/floating-utils.ts +20 -39
- package/src/theme/utils/ghost-utils.ts +7 -21
- package/src/theme/utils/input-utils.ts +32 -37
- package/src/theme/utils/outline-utils.ts +4 -11
- package/src/theme/utils/surface-utils.ts +5 -19
- package/src/theme/utils/types.ts +1 -0
- package/src/toast/index.tsx +1 -1
- package/src/toast/toast.tsx +105 -0
- package/src/transition/index.ts +2 -8
- package/src/typography/Badge.tsx +15 -61
- package/src/typography/Code.tsx +16 -28
- package/src/typography/Heading.tsx +34 -19
- package/src/typography/Text.tsx +9 -6
- package/src/typography/{index.tsx → index.ts} +1 -0
- package/src/util/externals.tsx +13 -27
- package/tsconfig.json +5 -1
- package/src/accordion/Accordion.test.tsx +0 -20
- package/src/alert/BaseAlert.test.tsx +0 -37
- package/src/alert/BaseAlert.tsx +0 -34
- package/src/alert/ClosableAlert.test.tsx +0 -37
- package/src/alert/ClosableAlert.tsx +0 -85
- package/src/alert/ExpandableAlert.test.tsx +0 -84
- package/src/alert/StaticAlert.tsx +0 -33
- package/src/button/Button.test.tsx +0 -23
- package/src/datepicker/TimePicker.test.tsx +0 -74
- package/src/input/FormControl.tsx +0 -2
- package/src/input/FormErrorMessage.tsx +0 -95
- package/src/input/FormLabel.tsx +0 -11
- package/src/input/InfoSelect.tsx +0 -274
- package/src/input/InputElement.tsx +0 -44
- package/src/input/RadioGroup.tsx +0 -47
- package/src/layout/Divider.tsx +0 -27
- package/src/layout/RadioCardGroup.tsx +0 -79
- package/src/layout/Stack.tsx +0 -42
- package/src/loader/SkeletonCircle.tsx +0 -13
- package/src/loader/SkeletonText.tsx +0 -14
- package/src/media-controller/index.test.tsx +0 -59
- package/src/modal/Drawer.tsx +0 -120
- package/src/modal/FullScreenDrawer.tsx +0 -239
- package/src/modal/Modal.tsx +0 -15
- package/src/modal/ModalHeader.tsx +0 -31
- package/src/modal/SimpleDrawer.tsx +0 -51
- package/src/modal/index.tsx +0 -5
- package/src/nudge/WizardNudge.tsx +0 -107
- package/src/theme/components/accordion.ts +0 -102
- package/src/theme/components/alert-expandable.ts +0 -125
- package/src/theme/components/alert-service.ts +0 -98
- package/src/theme/components/alert.ts +0 -71
- package/src/theme/components/badge.ts +0 -109
- package/src/theme/components/breadcrumb.ts +0 -60
- package/src/theme/components/button.ts +0 -125
- package/src/theme/components/card-select.ts +0 -117
- package/src/theme/components/checkbox.ts +0 -88
- package/src/theme/components/choice-chip.ts +0 -161
- package/src/theme/components/close-button.ts +0 -48
- package/src/theme/components/code.ts +0 -17
- package/src/theme/components/datepicker.ts +0 -198
- package/src/theme/components/divider.ts +0 -50
- package/src/theme/components/drawer.ts +0 -95
- package/src/theme/components/fab.ts +0 -109
- package/src/theme/components/form-label.ts +0 -17
- package/src/theme/components/form.ts +0 -27
- package/src/theme/components/index.ts +0 -45
- package/src/theme/components/info-select.ts +0 -85
- package/src/theme/components/info-tag.ts +0 -63
- package/src/theme/components/input.ts +0 -28
- package/src/theme/components/line-icon.ts +0 -129
- package/src/theme/components/link.ts +0 -78
- package/src/theme/components/list.ts +0 -23
- package/src/theme/components/listbox.ts +0 -77
- package/src/theme/components/media-controller-button.ts +0 -97
- package/src/theme/components/modal.ts +0 -96
- package/src/theme/components/numeric-stepper.ts +0 -65
- package/src/theme/components/pagination.ts +0 -74
- package/src/theme/components/popover.ts +0 -68
- package/src/theme/components/pressable-card.ts +0 -72
- package/src/theme/components/progress-bar.ts +0 -47
- package/src/theme/components/progress-indicator.ts +0 -44
- package/src/theme/components/radio-card.ts +0 -134
- package/src/theme/components/radio.ts +0 -68
- package/src/theme/components/select.ts +0 -74
- package/src/theme/components/skeleton.ts +0 -40
- package/src/theme/components/static-card.ts +0 -82
- package/src/theme/components/stepper.ts +0 -100
- package/src/theme/components/switch.ts +0 -112
- package/src/theme/components/table.ts +0 -161
- package/src/theme/components/tabs.ts +0 -135
- package/src/theme/components/textarea.ts +0 -33
- package/src/theme/components/toast.ts +0 -28
- package/src/theme/components/travel-tag.ts +0 -256
- package/src/theme/foundations/borders.ts +0 -11
- package/src/theme/foundations/colors.ts +0 -12
- package/src/theme/foundations/config.ts +0 -5
- package/src/theme/foundations/fontSizes.ts +0 -29
- package/src/theme/foundations/fontWeights.ts +0 -5
- package/src/theme/foundations/fonts.ts +0 -7
- package/src/theme/foundations/index.ts +0 -15
- package/src/theme/foundations/lineHeights.ts +0 -6
- package/src/theme/foundations/radii.ts +0 -12
- package/src/theme/foundations/shadows.ts +0 -8
- package/src/theme/foundations/sizes.ts +0 -36
- package/src/theme/foundations/spacing.ts +0 -31
- package/src/theme/foundations/styles.ts +0 -12
- package/src/theme/foundations/textStyles.ts +0 -74
- package/src/theme/foundations/zIndices.ts +0 -17
- package/src/theme/utils/base-utils.ts +0 -104
- package/src/theme/utils/focus-utils.ts +0 -10
- package/src/toast/ActionToast.test.tsx +0 -22
- package/src/toast/ActionToast.tsx +0 -28
- package/src/toast/BaseToast.test.tsx +0 -27
- package/src/toast/BaseToast.tsx +0 -75
- package/src/toast/ClosableToast.test.tsx +0 -17
- package/src/toast/ClosableToast.tsx +0 -40
- package/src/toast/useToast.tsx +0 -121
- package/src/tooltip/Tooltip.tsx +0 -70
- package/src/tooltip/index.tsx +0 -1
package/src/typography/Code.tsx
CHANGED
@@ -1,32 +1,20 @@
|
|
1
|
+
"use client";
|
2
|
+
|
3
|
+
import React from "react"; // Added explicit React import
|
1
4
|
import {
|
5
|
+
chakra,
|
2
6
|
Code as ChakraCode,
|
3
|
-
CodeProps
|
4
|
-
|
7
|
+
CodeProps,
|
8
|
+
RecipeVariantProps,
|
5
9
|
} from "@chakra-ui/react";
|
6
|
-
import {
|
7
|
-
|
10
|
+
import { codeRecipie } from "../theme/recipes/code";
|
11
|
+
|
12
|
+
type CodeVariantProps = RecipeVariantProps<typeof codeRecipie> & CodeProps;
|
13
|
+
|
14
|
+
const StyledCode = chakra(ChakraCode, codeRecipie);
|
8
15
|
|
9
|
-
export
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
| "yellow"
|
15
|
-
| "light-yellow"
|
16
|
-
| "red"
|
17
|
-
| "green"
|
18
|
-
| "orange"
|
19
|
-
| "blue"
|
20
|
-
| "grey"
|
21
|
-
| "white";
|
22
|
-
/** The design variant – "solid" by default.
|
23
|
-
*
|
24
|
-
* Can be specified as `outline` to render a border around the badge. */
|
25
|
-
variant?: "solid" | "outline";
|
26
|
-
};
|
27
|
-
/**
|
28
|
-
* Shows inline code.
|
29
|
-
*/
|
30
|
-
export const Code = forwardRef<CodeProps, As>((props, ref) => (
|
31
|
-
<ChakraCode {...props} ref={ref} />
|
32
|
-
));
|
16
|
+
export const Code = React.forwardRef<HTMLElement, CodeVariantProps>(
|
17
|
+
function Code(props, ref) {
|
18
|
+
return <StyledCode {...props} ref={ref} />;
|
19
|
+
},
|
20
|
+
);
|
@@ -1,17 +1,19 @@
|
|
1
|
+
"use client";
|
1
2
|
import {
|
2
3
|
HeadingProps as ChakraHeadingProps,
|
4
|
+
ConditionalValue,
|
3
5
|
Text,
|
4
|
-
useColorModeValue,
|
5
6
|
} from "@chakra-ui/react";
|
6
|
-
import React from "react";
|
7
|
+
import React, { forwardRef } from "react";
|
7
8
|
import { slugify } from "..";
|
8
|
-
import type { textStyles } from "../theme/foundations";
|
9
9
|
|
10
10
|
export type HeadingProps = Omit<ChakraHeadingProps, "textStyle" | "as"> & {
|
11
11
|
/** The heading level, e.g. h1, h2, h3... **/
|
12
12
|
as: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
13
13
|
/** The size and style of the heading. Defaults to xl-display */
|
14
|
-
variant?:
|
14
|
+
variant?: ConditionalValue<
|
15
|
+
"sm" | "md" | "lg" | "2xl" | "xl-display" | "xl-sans" | "xs"
|
16
|
+
>;
|
15
17
|
/** If true, generate an ID based on the children */
|
16
18
|
autoId?: boolean;
|
17
19
|
};
|
@@ -38,18 +40,31 @@ export type HeadingProps = Omit<ChakraHeadingProps, "textStyle" | "as"> & {
|
|
38
40
|
* <Heading as="h1" autoId>Page heading</Heading> // Will set id="page-heading"
|
39
41
|
* ```
|
40
42
|
*/
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
43
|
+
|
44
|
+
export const Heading = forwardRef<HTMLHeadingElement, HeadingProps>(
|
45
|
+
function Heading(props, ref) {
|
46
|
+
const {
|
47
|
+
as,
|
48
|
+
variant = "xl-display",
|
49
|
+
autoId = false,
|
50
|
+
id: externalId,
|
51
|
+
...rest
|
52
|
+
} = props;
|
53
|
+
|
54
|
+
const id =
|
55
|
+
(externalId ?? (autoId && typeof rest.children === "string"))
|
56
|
+
? slugify(rest.children as string)
|
57
|
+
: undefined;
|
58
|
+
|
59
|
+
return (
|
60
|
+
<Text
|
61
|
+
as={as}
|
62
|
+
textStyle={variant}
|
63
|
+
id={id}
|
64
|
+
color={"text"}
|
65
|
+
ref={ref}
|
66
|
+
{...rest}
|
67
|
+
/>
|
68
|
+
);
|
69
|
+
},
|
70
|
+
);
|
package/src/typography/Text.tsx
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
+
"use client";
|
1
2
|
import {
|
2
3
|
Text as ChakraText,
|
3
4
|
TextProps as ChakraTextProps,
|
4
|
-
forwardRef,
|
5
5
|
} from "@chakra-ui/react";
|
6
|
-
import React from "react";
|
6
|
+
import React, { forwardRef } from "react";
|
7
7
|
|
8
8
|
export type TextProps = Omit<ChakraTextProps, "textStyle"> & {
|
9
9
|
/** The size and style of the text.
|
10
10
|
*
|
11
|
-
* Defaults to "sm"
|
11
|
+
* Defaults to "sm"
|
12
|
+
* textStyle values are: "sm" | "md" | "lg" | "2xl" | "xl-display" | "xl-sans" | "xs" */
|
12
13
|
variant?: ChakraTextProps["textStyle"];
|
13
14
|
};
|
14
15
|
|
@@ -19,8 +20,10 @@ export type TextProps = Omit<ChakraTextProps, "textStyle"> & {
|
|
19
20
|
* <Text>Welcome to this paragraph of text.</Text>
|
20
21
|
* ```
|
21
22
|
*/
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
|
24
|
+
export const Text = forwardRef<HTMLParagraphElement, TextProps>(
|
25
|
+
function Text(props, ref) {
|
26
|
+
const { variant = "sm", ...rest } = props;
|
27
|
+
return <ChakraText {...rest} textStyle={variant} ref={ref} />;
|
25
28
|
},
|
26
29
|
);
|
package/src/util/externals.tsx
CHANGED
@@ -1,36 +1,22 @@
|
|
1
1
|
/** This file works as a proxy for all Chakra UI exports */
|
2
2
|
export {
|
3
|
-
DarkMode,
|
4
|
-
LightMode,
|
5
3
|
Portal,
|
6
|
-
defineStyleConfig,
|
7
|
-
extendTheme,
|
8
4
|
useBreakpointValue,
|
9
5
|
useClipboard,
|
10
|
-
useColorMode,
|
11
|
-
useColorModePreference,
|
12
|
-
useColorModeValue,
|
13
6
|
useControllableProp,
|
14
7
|
useDisclosure,
|
15
|
-
|
16
|
-
useOutsideClick,
|
17
|
-
usePrefersReducedMotion,
|
18
|
-
useTheme,
|
8
|
+
useMediaQuery,
|
19
9
|
useToken,
|
10
|
+
defineRecipe,
|
11
|
+
defineStyle,
|
12
|
+
For,
|
13
|
+
FormatNumber,
|
14
|
+
FormatByte,
|
15
|
+
LocaleProvider,
|
16
|
+
Show,
|
17
|
+
VisuallyHidden,
|
18
|
+
createListCollection,
|
19
|
+
useCheckbox,
|
20
20
|
} from "@chakra-ui/react";
|
21
|
-
export
|
22
|
-
|
23
|
-
ComponentStyleConfig,
|
24
|
-
PortalProps,
|
25
|
-
UseClipboardOptions,
|
26
|
-
UseDisclosureProps,
|
27
|
-
UseOutsideClickProps,
|
28
|
-
} from "@chakra-ui/react";
|
29
|
-
import { useMediaQuery as useMediaQueryChakra } from "@chakra-ui/react";
|
30
|
-
|
31
|
-
/**
|
32
|
-
* @deprecated useMediaQuery is deprecated. Use CSS only to determine the media query. - SSR is not supported and usage of useMediaQuery for rendering will cause hydration errors.
|
33
|
-
*/
|
34
|
-
export const useMediaQuery = useMediaQueryChakra;
|
35
|
-
|
36
|
-
export { useSize } from "@chakra-ui/react-use-size";
|
21
|
+
export { useMap, useOnClickOutside, useIsClient } from "usehooks-ts";
|
22
|
+
export type { PortalProps, UseDisclosureProps } from "@chakra-ui/react";
|
package/tsconfig.json
CHANGED
@@ -1,20 +0,0 @@
|
|
1
|
-
import { act, render } from "@testing-library/react";
|
2
|
-
import React from "react";
|
3
|
-
import { axe } from "vitest-axe";
|
4
|
-
import { Accordion } from "./Accordion";
|
5
|
-
import { ExpandableItem } from "./Expandable";
|
6
|
-
|
7
|
-
describe("<Accordion />", () => {
|
8
|
-
it("is accessible", async () => {
|
9
|
-
const { container, getByRole } = render(
|
10
|
-
<Accordion>
|
11
|
-
<ExpandableItem title="Title">Content</ExpandableItem>
|
12
|
-
</Accordion>,
|
13
|
-
);
|
14
|
-
await act(async () => {
|
15
|
-
expect(await axe(container)).toHaveNoViolations();
|
16
|
-
getByRole("button").click();
|
17
|
-
expect(await axe(container)).toHaveNoViolations();
|
18
|
-
});
|
19
|
-
});
|
20
|
-
});
|
@@ -1,37 +0,0 @@
|
|
1
|
-
import { render } from "@testing-library/react";
|
2
|
-
import React from "react";
|
3
|
-
import { axe } from "vitest-axe";
|
4
|
-
import { BaseAlert } from "./BaseAlert";
|
5
|
-
|
6
|
-
describe("<BaseAlert />", () => {
|
7
|
-
it("is accessible as variant='success'", async () => {
|
8
|
-
const { container } = render(
|
9
|
-
<BaseAlert variant="success">Test text</BaseAlert>,
|
10
|
-
);
|
11
|
-
expect(await axe(container)).toHaveNoViolations();
|
12
|
-
});
|
13
|
-
it("is accessible as variant='info'", async () => {
|
14
|
-
const { container } = render(
|
15
|
-
<BaseAlert variant="info">Test text</BaseAlert>,
|
16
|
-
);
|
17
|
-
expect(await axe(container)).toHaveNoViolations();
|
18
|
-
});
|
19
|
-
it("is accessible as variant='warning'", async () => {
|
20
|
-
const { container } = render(
|
21
|
-
<BaseAlert variant="warning">Test text</BaseAlert>,
|
22
|
-
);
|
23
|
-
expect(await axe(container)).toHaveNoViolations();
|
24
|
-
});
|
25
|
-
it("is accessible as variant='error'", async () => {
|
26
|
-
const { container } = render(
|
27
|
-
<BaseAlert variant="error">Test text</BaseAlert>,
|
28
|
-
);
|
29
|
-
expect(await axe(container)).toHaveNoViolations();
|
30
|
-
});
|
31
|
-
it("is accessible as variant='alt-transport'", async () => {
|
32
|
-
const { container } = render(
|
33
|
-
<BaseAlert variant="alt-transport">Test text</BaseAlert>,
|
34
|
-
);
|
35
|
-
expect(await axe(container)).toHaveNoViolations();
|
36
|
-
});
|
37
|
-
});
|
package/src/alert/BaseAlert.tsx
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
import { Box, BoxProps, useMultiStyleConfig } from "@chakra-ui/react";
|
2
|
-
import React from "react";
|
3
|
-
|
4
|
-
export type BaseAlertProps = BoxProps & {
|
5
|
-
/** The color scheme and icon of the alert */
|
6
|
-
variant:
|
7
|
-
| "info"
|
8
|
-
| "success"
|
9
|
-
| "warning"
|
10
|
-
| "alt-transport"
|
11
|
-
| "error"
|
12
|
-
| "service"
|
13
|
-
| "global-deviation";
|
14
|
-
/** The body content of the alert */
|
15
|
-
children: React.ReactNode;
|
16
|
-
/** The title of the alert */
|
17
|
-
title?: string;
|
18
|
-
};
|
19
|
-
|
20
|
-
/**
|
21
|
-
* A base alert box component. Should only be composed by other alert components.
|
22
|
-
*/
|
23
|
-
export const BaseAlert = ({
|
24
|
-
variant,
|
25
|
-
children,
|
26
|
-
...boxProps
|
27
|
-
}: BaseAlertProps) => {
|
28
|
-
const styles = useMultiStyleConfig("Alert", { variant });
|
29
|
-
return (
|
30
|
-
<Box __css={styles.container} {...boxProps}>
|
31
|
-
{children}
|
32
|
-
</Box>
|
33
|
-
);
|
34
|
-
};
|
@@ -1,37 +0,0 @@
|
|
1
|
-
import { act, render } from "@testing-library/react";
|
2
|
-
import React from "react";
|
3
|
-
import { vi } from "vitest";
|
4
|
-
import { axe } from "vitest-axe";
|
5
|
-
import { ClosableAlert } from ".";
|
6
|
-
|
7
|
-
describe("<ClosableAlert />", () => {
|
8
|
-
it("closes when you click the close button", async () => {
|
9
|
-
const { getByRole, queryByRole } = render(
|
10
|
-
<ClosableAlert variant="info">Test text</ClosableAlert>,
|
11
|
-
);
|
12
|
-
act(() => {
|
13
|
-
getByRole("button").click();
|
14
|
-
});
|
15
|
-
expect(queryByRole("button")).not.toBeInTheDocument();
|
16
|
-
});
|
17
|
-
|
18
|
-
it("calls the onClose prop when closed", () => {
|
19
|
-
const handleClick = vi.fn();
|
20
|
-
const { getByRole } = render(
|
21
|
-
<ClosableAlert variant="info" onClose={handleClick}>
|
22
|
-
Test text
|
23
|
-
</ClosableAlert>,
|
24
|
-
);
|
25
|
-
act(() => {
|
26
|
-
getByRole("button").click();
|
27
|
-
});
|
28
|
-
expect(handleClick).toHaveBeenCalled();
|
29
|
-
});
|
30
|
-
|
31
|
-
it("is accessible", async () => {
|
32
|
-
const { container } = render(
|
33
|
-
<ClosableAlert variant="info">Test text</ClosableAlert>,
|
34
|
-
);
|
35
|
-
expect(await axe(container)).toHaveNoViolations();
|
36
|
-
});
|
37
|
-
});
|
@@ -1,85 +0,0 @@
|
|
1
|
-
import {
|
2
|
-
Box,
|
3
|
-
Flex,
|
4
|
-
useDisclosure,
|
5
|
-
useMultiStyleConfig,
|
6
|
-
} from "@chakra-ui/react";
|
7
|
-
import { CloseFill18Icon } from "@vygruppen/spor-icon-react";
|
8
|
-
import React from "react";
|
9
|
-
import { IconButton } from "../button";
|
10
|
-
import { createTexts, useTranslation } from "../i18n";
|
11
|
-
import { AlertIcon } from "./AlertIcon";
|
12
|
-
import { BaseAlert, BaseAlertProps } from "./BaseAlert";
|
13
|
-
|
14
|
-
type ClosableAlertProps = BaseAlertProps & {
|
15
|
-
/** Callback for when the close button is clicked */
|
16
|
-
onClose?: () => void;
|
17
|
-
};
|
18
|
-
/**
|
19
|
-
* A closable alert component.
|
20
|
-
*
|
21
|
-
* A regular alert with a close button that can be used to dismiss the alert.
|
22
|
-
*
|
23
|
-
* ```tsx
|
24
|
-
* <ClosableAlert variant="info" title="Nice to know">
|
25
|
-
* <Text>Some info here</Text>
|
26
|
-
* </ClosableAlert>
|
27
|
-
* ```
|
28
|
-
*
|
29
|
-
* You can also pass in an optional `onClose` callback, for things like analytics.
|
30
|
-
*
|
31
|
-
* ```tsx
|
32
|
-
* <ClosableAlert
|
33
|
-
* variant="info"
|
34
|
-
* title="Nice to know"
|
35
|
-
* onClose={() => analytics.track('alert-closed')}
|
36
|
-
* >
|
37
|
-
* <Text>Some info here</Text>
|
38
|
-
* </ClosableAlert>
|
39
|
-
*/
|
40
|
-
export const ClosableAlert = ({
|
41
|
-
variant,
|
42
|
-
title,
|
43
|
-
children,
|
44
|
-
onClose: externalOnClose = () => {},
|
45
|
-
...boxProps
|
46
|
-
}: ClosableAlertProps) => {
|
47
|
-
const { isOpen, onClose } = useDisclosure({ defaultIsOpen: true });
|
48
|
-
const styles = useMultiStyleConfig("Alert", { variant });
|
49
|
-
const { t } = useTranslation();
|
50
|
-
if (!isOpen) {
|
51
|
-
return null;
|
52
|
-
}
|
53
|
-
|
54
|
-
const handleClose = () => {
|
55
|
-
externalOnClose();
|
56
|
-
onClose();
|
57
|
-
};
|
58
|
-
|
59
|
-
return (
|
60
|
-
<BaseAlert variant={variant} {...boxProps}>
|
61
|
-
<IconButton
|
62
|
-
variant="ghost"
|
63
|
-
size="sm"
|
64
|
-
onClick={handleClose}
|
65
|
-
icon={<CloseFill18Icon />}
|
66
|
-
aria-label={t(texts.close)}
|
67
|
-
sx={styles.closeButton}
|
68
|
-
/>
|
69
|
-
<AlertIcon variant={variant} />
|
70
|
-
<Flex direction="column" gap={title ? 2 : undefined} textAlign="left">
|
71
|
-
{title && <Box fontWeight="bold">{title}</Box>}
|
72
|
-
<Box marginRight={1}>{children}</Box>
|
73
|
-
</Flex>
|
74
|
-
</BaseAlert>
|
75
|
-
);
|
76
|
-
};
|
77
|
-
|
78
|
-
const texts = createTexts({
|
79
|
-
close: {
|
80
|
-
nb: "Lukk",
|
81
|
-
nn: "Lukk",
|
82
|
-
sv: "Dölj",
|
83
|
-
en: "Close",
|
84
|
-
},
|
85
|
-
});
|
@@ -1,84 +0,0 @@
|
|
1
|
-
import { act, render, waitFor } from "@testing-library/react";
|
2
|
-
import React from "react";
|
3
|
-
import { vi } from "vitest";
|
4
|
-
import { axe } from "vitest-axe";
|
5
|
-
import { ExpandableAlert } from ".";
|
6
|
-
|
7
|
-
describe("<ExpandableAlert />", () => {
|
8
|
-
it("works as an expandable", async () => {
|
9
|
-
const { getByRole, getByText } = render(
|
10
|
-
<ExpandableAlert variant="info" title="Title">
|
11
|
-
Test text
|
12
|
-
</ExpandableAlert>,
|
13
|
-
);
|
14
|
-
await waitFor(() => expect(getByText("Test text")).not.toBeVisible());
|
15
|
-
act(() => {
|
16
|
-
getByRole("button").click();
|
17
|
-
});
|
18
|
-
await waitFor(() => expect(getByText("Test text")).toBeVisible());
|
19
|
-
act(() => {
|
20
|
-
getByRole("button").click();
|
21
|
-
});
|
22
|
-
await waitFor(() => expect(getByText("Test text")).not.toBeVisible());
|
23
|
-
});
|
24
|
-
|
25
|
-
it("calls onToggle when toggled", async () => {
|
26
|
-
const handleClick = vi.fn();
|
27
|
-
const { getByRole } = render(
|
28
|
-
<ExpandableAlert variant="info" title="Title" onToggle={handleClick}>
|
29
|
-
Test text
|
30
|
-
</ExpandableAlert>,
|
31
|
-
);
|
32
|
-
|
33
|
-
act(() => {
|
34
|
-
getByRole("button").click();
|
35
|
-
});
|
36
|
-
expect(handleClick).toHaveBeenCalledTimes(1);
|
37
|
-
expect(handleClick).lastCalledWith(true);
|
38
|
-
|
39
|
-
act(() => {
|
40
|
-
getByRole("button").click();
|
41
|
-
});
|
42
|
-
expect(handleClick).toHaveBeenCalledTimes(2);
|
43
|
-
expect(handleClick).lastCalledWith(false);
|
44
|
-
});
|
45
|
-
|
46
|
-
it("lets you set the heading level", async () => {
|
47
|
-
const { queryByRole, rerender } = render(
|
48
|
-
<ExpandableAlert variant="info" title="Title" headingLevel="h2">
|
49
|
-
Test text
|
50
|
-
</ExpandableAlert>,
|
51
|
-
);
|
52
|
-
expect(queryByRole("heading", { level: 2 })).toBeInTheDocument();
|
53
|
-
rerender(
|
54
|
-
<ExpandableAlert variant="info" title="Title" headingLevel="h3">
|
55
|
-
Test text
|
56
|
-
</ExpandableAlert>,
|
57
|
-
);
|
58
|
-
expect(queryByRole("heading", { level: 2 })).not.toBeInTheDocument();
|
59
|
-
expect(queryByRole("heading", { level: 3 })).toBeInTheDocument();
|
60
|
-
});
|
61
|
-
|
62
|
-
it("is accessible in all states", async () => {
|
63
|
-
const { container, getByRole } = render(
|
64
|
-
<ExpandableAlert variant="info" title="Title">
|
65
|
-
Test text
|
66
|
-
</ExpandableAlert>,
|
67
|
-
);
|
68
|
-
await act(async () => {
|
69
|
-
expect(await axe(container)).toHaveNoViolations();
|
70
|
-
});
|
71
|
-
act(() => {
|
72
|
-
getByRole("button").click();
|
73
|
-
});
|
74
|
-
await act(async () => {
|
75
|
-
expect(await axe(container)).toHaveNoViolations();
|
76
|
-
});
|
77
|
-
act(() => {
|
78
|
-
getByRole("button").click();
|
79
|
-
});
|
80
|
-
await act(async () => {
|
81
|
-
expect(await axe(container)).toHaveNoViolations();
|
82
|
-
});
|
83
|
-
});
|
84
|
-
});
|
@@ -1,33 +0,0 @@
|
|
1
|
-
import React from "react";
|
2
|
-
import { AlertIcon } from "./AlertIcon";
|
3
|
-
import { BaseAlert, BaseAlertProps } from "./BaseAlert";
|
4
|
-
import { Box, Flex } from "@chakra-ui/react";
|
5
|
-
|
6
|
-
type StaticAlertProps = BaseAlertProps;
|
7
|
-
|
8
|
-
/**
|
9
|
-
* A static alert component.
|
10
|
-
*
|
11
|
-
* This alert component cannot be closed, nor dismissed.
|
12
|
-
*
|
13
|
-
* ```tsx
|
14
|
-
* <StaticAlert variant="info" title="Nice to know">
|
15
|
-
* Thomas the Train was originally only a wooden toy made for the creator’s son.
|
16
|
-
* </StaticAlert>
|
17
|
-
* ```
|
18
|
-
*/
|
19
|
-
export const StaticAlert = ({
|
20
|
-
children,
|
21
|
-
title,
|
22
|
-
...props
|
23
|
-
}: StaticAlertProps) => {
|
24
|
-
return (
|
25
|
-
<BaseAlert {...props}>
|
26
|
-
<AlertIcon variant={props.variant} />
|
27
|
-
<Flex direction="column" gap={title ? 2 : undefined} textAlign="left">
|
28
|
-
{title && <Box fontWeight="bold">{title}</Box>}
|
29
|
-
<Box>{children}</Box>
|
30
|
-
</Flex>
|
31
|
-
</BaseAlert>
|
32
|
-
);
|
33
|
-
};
|
@@ -1,23 +0,0 @@
|
|
1
|
-
import { render } from "@testing-library/react";
|
2
|
-
import React from "react";
|
3
|
-
import { vi } from "vitest";
|
4
|
-
import { axe } from "vitest-axe";
|
5
|
-
import { Button } from ".";
|
6
|
-
|
7
|
-
describe("<Button />", () => {
|
8
|
-
it("works like a button", async () => {
|
9
|
-
const handleClick = vi.fn();
|
10
|
-
const { getByRole } = render(
|
11
|
-
<Button variant="primary" onClick={handleClick}>
|
12
|
-
Click me
|
13
|
-
</Button>,
|
14
|
-
);
|
15
|
-
getByRole("button").click();
|
16
|
-
expect(handleClick).toHaveBeenCalled();
|
17
|
-
});
|
18
|
-
|
19
|
-
it("is accessible", async () => {
|
20
|
-
const { container } = render(<Button variant="primary">Click me</Button>);
|
21
|
-
expect(await axe(container)).toHaveNoViolations();
|
22
|
-
});
|
23
|
-
});
|
@@ -1,74 +0,0 @@
|
|
1
|
-
import { Time } from "@internationalized/date";
|
2
|
-
import { act, render } from "@testing-library/react";
|
3
|
-
import React from "react";
|
4
|
-
import { axe } from "vitest-axe";
|
5
|
-
import { TimePicker } from "./TimePicker";
|
6
|
-
|
7
|
-
describe("<TimePicker />", () => {
|
8
|
-
it("is accessible", async () => {
|
9
|
-
const { container } = render(<TimePicker />);
|
10
|
-
expect(await axe(container)).toHaveNoViolations();
|
11
|
-
});
|
12
|
-
|
13
|
-
it("jumps backwards as expected", async () => {
|
14
|
-
const { getByLabelText, getByRole } = render(
|
15
|
-
<TimePicker defaultValue={new Time(13, 3)} />,
|
16
|
-
);
|
17
|
-
const backwardsButton = getByLabelText("Bakover 30 minutter");
|
18
|
-
expect(getByRole("group")).toHaveTextContent("13:03");
|
19
|
-
act(() => {
|
20
|
-
backwardsButton.click();
|
21
|
-
});
|
22
|
-
expect(getByRole("group")).toHaveTextContent("13:00");
|
23
|
-
act(() => {
|
24
|
-
backwardsButton.click();
|
25
|
-
});
|
26
|
-
expect(getByRole("group")).toHaveTextContent("12:30");
|
27
|
-
});
|
28
|
-
it("jumps forwards as expected", async () => {
|
29
|
-
const { getByLabelText, getByRole } = render(
|
30
|
-
<TimePicker defaultValue={new Time(13, 53)} />,
|
31
|
-
);
|
32
|
-
const forwardsButton = getByLabelText("Fremover 30 minutter");
|
33
|
-
expect(getByRole("group")).toHaveTextContent("13:53");
|
34
|
-
act(() => {
|
35
|
-
forwardsButton.click();
|
36
|
-
});
|
37
|
-
expect(getByRole("group")).toHaveTextContent("14:00");
|
38
|
-
act(() => {
|
39
|
-
forwardsButton.click();
|
40
|
-
});
|
41
|
-
expect(getByRole("group")).toHaveTextContent("14:30");
|
42
|
-
});
|
43
|
-
it("jumps backwards as expected when minuteInterval is set", async () => {
|
44
|
-
const { getByLabelText, getByRole } = render(
|
45
|
-
<TimePicker defaultValue={new Time(13, 3)} minuteInterval={15} />,
|
46
|
-
);
|
47
|
-
const backwardsButton = getByLabelText("Bakover 15 minutter");
|
48
|
-
expect(getByRole("group")).toHaveTextContent("13:03");
|
49
|
-
act(() => {
|
50
|
-
backwardsButton.click();
|
51
|
-
});
|
52
|
-
expect(getByRole("group")).toHaveTextContent("13:00");
|
53
|
-
act(() => {
|
54
|
-
backwardsButton.click();
|
55
|
-
});
|
56
|
-
expect(getByRole("group")).toHaveTextContent("12:45");
|
57
|
-
});
|
58
|
-
it("jumps forwards as expected when minuteInterval is set", async () => {
|
59
|
-
const { getByLabelText, getByRole } = render(
|
60
|
-
<TimePicker defaultValue={new Time(13, 49)} minuteInterval={15} />,
|
61
|
-
);
|
62
|
-
|
63
|
-
const forwardsButton = getByLabelText("Fremover 15 minutter");
|
64
|
-
expect(getByRole("group")).toHaveTextContent("13:49");
|
65
|
-
act(() => {
|
66
|
-
forwardsButton.click();
|
67
|
-
});
|
68
|
-
expect(getByRole("group")).toHaveTextContent("14:00");
|
69
|
-
act(() => {
|
70
|
-
forwardsButton.click();
|
71
|
-
});
|
72
|
-
expect(getByRole("group")).toHaveTextContent("14:15");
|
73
|
-
});
|
74
|
-
});
|