@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.
- package/.turbo/turbo-build.log +32 -11
- package/.turbo/turbo-typegen.log +23 -0
- package/CHANGELOG.md +245 -0
- package/dist/index.d.mts +2552 -8319
- package/dist/index.d.ts +2552 -8319
- package/dist/index.js +9609 -8607
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9487 -8454
- 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 -100
- 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
@@ -1,4 +1,5 @@
|
|
1
|
-
|
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
|
-
|
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
|
-
|
71
|
+
disabled: isDisabledExternally = false,
|
70
72
|
name,
|
71
73
|
...boxProps
|
72
74
|
}: TimePickerProps) => {
|
73
|
-
const {
|
74
|
-
|
75
|
-
const isDisabled = isDisabledExternally ??
|
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:
|
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
|
-
<
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
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,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,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
|
+
};
|
package/src/image/index.tsx
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export { Image
|
2
|
-
export type { ImageProps
|
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 "./
|
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
|
-
|
2
|
-
|
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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
+
);
|