@vygruppen/spor-react 11.3.10 → 12.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +33 -11
- package/.turbo/turbo-typegen.log +22 -0
- package/CHANGELOG.md +247 -0
- package/dist/index.d.mts +2589 -8303
- package/dist/index.d.ts +2589 -8303
- 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 +23 -15
- 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 +70 -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 +36 -21
- 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 { Box, BoxProps, Center, VisuallyHidden } from "@chakra-ui/react";
|
2
3
|
import { inlineLoaderLightData } from "@vygruppen/spor-loader";
|
3
4
|
import React from "react";
|
4
5
|
import { ClientOnly } from "./ClientOnly";
|
@@ -14,12 +15,19 @@ export const LightInlineLoader = ({
|
|
14
15
|
...props
|
15
16
|
}: LightInlineLoaderProps) => {
|
16
17
|
return (
|
17
|
-
<Center
|
18
|
+
<Center
|
19
|
+
height="100%"
|
20
|
+
background="white"
|
21
|
+
role="status"
|
22
|
+
aria-live="polite"
|
23
|
+
{...props}
|
24
|
+
>
|
18
25
|
<Box width={width} maxWidth={maxWidth}>
|
19
26
|
<ClientOnly>
|
20
|
-
|
27
|
+
<Lottie animationData={inlineLoaderLightData} />
|
21
28
|
</ClientOnly>
|
22
29
|
</Box>
|
30
|
+
<VisuallyHidden>Loading...</VisuallyHidden>
|
23
31
|
</Center>
|
24
32
|
);
|
25
33
|
};
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
"use client";
|
2
|
+
import { Box, BoxProps, Center, VisuallyHidden } from "@chakra-ui/react";
|
2
3
|
import { spinnerLightData } from "@vygruppen/spor-loader";
|
3
4
|
import React from "react";
|
4
5
|
import { ClientOnly } from "./ClientOnly";
|
@@ -27,12 +28,13 @@ export const LightSpinner = ({
|
|
27
28
|
...props
|
28
29
|
}: LightSpinnerProps) => {
|
29
30
|
return (
|
30
|
-
<Center flexDirection="column" {...props}>
|
31
|
+
<Center flexDirection="column" role="status" aria-live="polite" {...props}>
|
31
32
|
<Box width={width} maxWidth={maxWidth}>
|
32
33
|
<ClientOnly>
|
33
|
-
|
34
|
+
<Lottie animationData={spinnerLightData} />
|
34
35
|
</ClientOnly>
|
35
36
|
</Box>
|
37
|
+
<VisuallyHidden>Loading...</VisuallyHidden>
|
36
38
|
{children && (
|
37
39
|
<Box marginTop={3} fontWeight="bold">
|
38
40
|
{children}
|
package/src/loader/Lottie.tsx
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
import { useLottie } from "lottie-react";
|
2
1
|
import React from "react";
|
3
2
|
|
3
|
+
import ReactLottie from "lottie-react";
|
4
|
+
|
4
5
|
/**
|
5
6
|
* A wrapper around Lottie to make it tree-shakeable for SSR.
|
6
7
|
*/
|
7
8
|
export default function Lottie({ animationData }: { animationData: any }) {
|
8
|
-
|
9
|
-
return <>{View}</>;
|
9
|
+
return <ReactLottie animationData={animationData} />;
|
10
10
|
}
|
@@ -1,40 +1,50 @@
|
|
1
|
-
|
2
|
-
import
|
3
|
-
|
4
|
-
|
1
|
+
"use client";
|
2
|
+
import {
|
3
|
+
BoxProps,
|
4
|
+
Progress,
|
5
|
+
UseProgressProps,
|
6
|
+
RecipeVariantProps,
|
7
|
+
useSlotRecipe,
|
8
|
+
} from "@chakra-ui/react";
|
9
|
+
import React, { forwardRef, PropsWithChildren } from "react";
|
10
|
+
import { progressBarRecipe } from "../theme/slot-recipes/progress-bar";
|
5
11
|
import { useRotatingLabel } from "./useRotatingLabel";
|
6
12
|
|
7
|
-
type
|
8
|
-
/** The percentage of progress made.
|
9
|
-
*
|
10
|
-
* The value must be between 0 and 100 */
|
11
|
-
value: number;
|
12
|
-
/** The height of the progress bar.
|
13
|
-
* Defaults to .5rem
|
14
|
-
**/
|
15
|
-
height?: BoxProps["height"];
|
16
|
-
/** The width of the progress bar.
|
17
|
-
*
|
18
|
-
* Defaults to the width of its container
|
19
|
-
**/
|
20
|
-
width?: BoxProps["width"];
|
13
|
+
type ProgressBarVariants = RecipeVariantProps<typeof progressBarRecipe>;
|
21
14
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
15
|
+
export type ProgressBarProps = BoxProps &
|
16
|
+
UseProgressProps &
|
17
|
+
PropsWithChildren<ProgressBarVariants> & {
|
18
|
+
children: React.ReactNode;
|
19
|
+
/** The height of the progress bar.
|
20
|
+
* Defaults to .5rem
|
21
|
+
**/
|
22
|
+
height?: BoxProps["height"];
|
23
|
+
/** The width of the progress bar.
|
24
|
+
*
|
25
|
+
* Defaults to the width of its container
|
26
|
+
**/
|
27
|
+
width?: BoxProps["width"];
|
34
28
|
|
35
|
-
|
36
|
-
|
37
|
-
|
29
|
+
/** Pass if no label is passed to the label */
|
30
|
+
"aria-label": string;
|
31
|
+
/** Optional text shown below the loader.
|
32
|
+
*
|
33
|
+
* If you pass an array of strings, the text will rotate every 5 seconds. If you want to change the delay, pass the delay in milliseconds to the `labelRotationDelay` prop.
|
34
|
+
*/
|
35
|
+
label: string | string[];
|
36
|
+
/** The number of milliseconds a label is shown, if an array of strings is passed to the `label` prop.
|
37
|
+
*
|
38
|
+
* Defaults to 5000 (5 seconds).
|
39
|
+
*/
|
40
|
+
labelRotationDelay?: number;
|
41
|
+
|
42
|
+
/** Pass to disable the color of the component */
|
43
|
+
isActive?: boolean;
|
44
|
+
|
45
|
+
/** Pass to show the value text */
|
46
|
+
showValueText?: boolean;
|
47
|
+
};
|
38
48
|
|
39
49
|
/**
|
40
50
|
* Shows the progress of a loading process.
|
@@ -63,57 +73,46 @@ type ProgressBarProps = BoxProps & {
|
|
63
73
|
* <ProgressBar value={50} aria-label="Loading..." />
|
64
74
|
* ```
|
65
75
|
*/
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
/>
|
101
|
-
</Box>
|
102
|
-
{currentLoadingText && (
|
103
|
-
<Text sx={styles.description} {...labelProps}>
|
76
|
+
|
77
|
+
export const ProgressBar = forwardRef<HTMLDivElement, ProgressBarProps>(
|
78
|
+
(
|
79
|
+
{
|
80
|
+
value,
|
81
|
+
colorPalette = "white",
|
82
|
+
label,
|
83
|
+
labelRotationDelay = 5000,
|
84
|
+
isActive = true,
|
85
|
+
showValueText = false,
|
86
|
+
height = "0.5rem",
|
87
|
+
"aria-label": ariaLabel,
|
88
|
+
...rest
|
89
|
+
},
|
90
|
+
ref,
|
91
|
+
) => {
|
92
|
+
const recipe = useSlotRecipe({ key: "progressbar" });
|
93
|
+
const styles = recipe({});
|
94
|
+
const currentLoadingText = useRotatingLabel({
|
95
|
+
label,
|
96
|
+
delay: labelRotationDelay,
|
97
|
+
});
|
98
|
+
|
99
|
+
return (
|
100
|
+
<Progress.Root css={styles.container} ref={ref} value={value} {...rest}>
|
101
|
+
<Progress.Track
|
102
|
+
height={height}
|
103
|
+
css={isActive ? styles.background : styles.disabledBackground}
|
104
|
+
>
|
105
|
+
<Progress.Range css={styles.progress} />
|
106
|
+
</Progress.Track>
|
107
|
+
|
108
|
+
{label && (
|
109
|
+
<Progress.Label css={styles.description}>
|
104
110
|
{currentLoadingText}
|
105
|
-
</
|
111
|
+
</Progress.Label>
|
106
112
|
)}
|
107
|
-
</Box>
|
108
|
-
</>
|
109
|
-
);
|
110
|
-
};
|
111
113
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
en: `${value}% done`,
|
118
|
-
}),
|
119
|
-
});
|
114
|
+
{showValueText && <Progress.ValueText>{value}%</Progress.ValueText>}
|
115
|
+
</Progress.Root>
|
116
|
+
);
|
117
|
+
},
|
118
|
+
);
|
@@ -1,10 +1,22 @@
|
|
1
|
-
|
2
|
-
import
|
1
|
+
"use client";
|
2
|
+
import {
|
3
|
+
Box,
|
4
|
+
BoxProps,
|
5
|
+
chakra,
|
6
|
+
RecipeVariantProps,
|
7
|
+
Text,
|
8
|
+
} from "@chakra-ui/react";
|
9
|
+
import React, { forwardRef, useId, useRef, useState, useEffect } from "react";
|
3
10
|
import { useProgressBar } from "react-aria";
|
4
11
|
import { createTexts, useTranslation } from "..";
|
5
12
|
import { useRotatingLabel } from "./useRotatingLabel";
|
13
|
+
import { progressLoaderRecipe } from "../theme/recipes/progress-loader";
|
14
|
+
export type ProgressLoaderVariantProps = RecipeVariantProps<
|
15
|
+
typeof progressLoaderRecipe
|
16
|
+
>;
|
6
17
|
|
7
|
-
type ProgressLoaderProps = BoxProps & {
|
18
|
+
export type ProgressLoaderProps = BoxProps & {
|
19
|
+
children: React.ReactNode;
|
8
20
|
/** The percentage of progress made.
|
9
21
|
*
|
10
22
|
* The value must be between 0 and 100 */
|
@@ -29,6 +41,29 @@ type ProgressLoaderProps = BoxProps & {
|
|
29
41
|
labelRotationDelay?: number;
|
30
42
|
};
|
31
43
|
|
44
|
+
/**
|
45
|
+
* Custom hook to calculate the total length of an SVG path and progress offset.
|
46
|
+
* @param value The percentage of progress made (0-100).
|
47
|
+
* @returns A ref for the path element, the calculated path length, and the progress offset.
|
48
|
+
*/
|
49
|
+
const usePathLength = (value: number) => {
|
50
|
+
const pathRef = useRef<SVGPathElement>(null);
|
51
|
+
const [pathLength, setPathLength] = useState(0);
|
52
|
+
|
53
|
+
useEffect(() => {
|
54
|
+
if (pathRef.current) {
|
55
|
+
const totalLength = pathRef.current.getTotalLength();
|
56
|
+
setPathLength(totalLength);
|
57
|
+
}
|
58
|
+
}, []);
|
59
|
+
|
60
|
+
const progressOffset = ((value - 100) / 100) * pathLength;
|
61
|
+
|
62
|
+
return { pathRef, pathLength, progressOffset };
|
63
|
+
};
|
64
|
+
|
65
|
+
const ProgressLoaderWrapper = chakra("div", progressLoaderRecipe);
|
66
|
+
|
32
67
|
/**
|
33
68
|
* Shows the progress of a loading process.
|
34
69
|
*
|
@@ -56,79 +91,89 @@ type ProgressLoaderProps = BoxProps & {
|
|
56
91
|
* <ProgressLoader value={50} aria-label="Fetching your trips..." />
|
57
92
|
* ```
|
58
93
|
*/
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
labelRotationDelay = 5000,
|
63
|
-
"aria-label": ariaLabel,
|
64
|
-
width,
|
65
|
-
...rest
|
66
|
-
}: ProgressLoaderProps) => {
|
67
|
-
const { t } = useTranslation();
|
68
|
-
const currentLoadingText = useRotatingLabel({
|
69
|
-
label,
|
70
|
-
delay: labelRotationDelay,
|
71
|
-
});
|
72
|
-
const { labelProps, progressBarProps } = useProgressBar({
|
73
|
-
isIndeterminate: value === undefined,
|
94
|
+
|
95
|
+
export const ProgressLoader = forwardRef<HTMLDivElement, ProgressLoaderProps>(
|
96
|
+
({
|
74
97
|
value,
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
}
|
98
|
+
label,
|
99
|
+
labelRotationDelay = 5000,
|
100
|
+
"aria-label": ariaLabel,
|
101
|
+
width,
|
102
|
+
...rest
|
103
|
+
}: ProgressLoaderProps) => {
|
104
|
+
const { t } = useTranslation();
|
105
|
+
const currentLoadingText = useRotatingLabel({
|
106
|
+
label,
|
107
|
+
delay: labelRotationDelay,
|
108
|
+
});
|
109
|
+
const { labelProps, progressBarProps } = useProgressBar({
|
110
|
+
isIndeterminate: value === undefined,
|
111
|
+
value,
|
112
|
+
"aria-label": ariaLabel ?? t(texts.fallbackLabel(value ?? "?")),
|
113
|
+
});
|
114
|
+
const {
|
115
|
+
pathRef,
|
116
|
+
pathLength: progressPathLength,
|
117
|
+
progressOffset,
|
118
|
+
} = usePathLength(value);
|
119
|
+
|
120
|
+
const id = useId();
|
121
|
+
|
122
|
+
return (
|
123
|
+
<ProgressLoaderWrapper
|
124
|
+
{...progressBarProps}
|
125
|
+
width={width}
|
126
|
+
role="progressbar"
|
127
|
+
aria-valuenow={value}
|
128
|
+
aria-valuemin={0}
|
129
|
+
aria-valuemax={100}
|
130
|
+
aria-label={ariaLabel ?? t(texts.fallbackLabel(value ?? "?"))}
|
131
|
+
{...rest}
|
132
|
+
>
|
133
|
+
<chakra.svg as="svg" viewBox="0 0 246 78" fill="none">
|
134
|
+
<path
|
135
|
+
id={`${id}-start-dot`}
|
136
|
+
d="M14.0479 44.8251C19.4332 44.8251 23.7988 40.5242 23.7988 35.2187C23.7988 29.9133 19.4332 25.6124 14.0479 25.6124C8.66254 25.6124 4.29688 29.9133 4.29688 35.2187C4.29688 40.5242 8.66254 44.8251 14.0479 44.8251Z"
|
137
|
+
fill="#FFB466"
|
138
|
+
/>
|
139
|
+
<path
|
140
|
+
id={`${id}-track`}
|
141
|
+
d="M204.911 39.1156C204.911 39.1156 175.012 46.8319 157.651 30.4354C140.29 14.0388 121 21.7547 110.391 47.6529C103.22 65.157 78.9634 67.0859 67.9533 47.6529C59.8376 33.3287 36.125 37.1866 36.125 37.1866"
|
142
|
+
strokeWidth="13.6469"
|
143
|
+
strokeLinecap="round"
|
144
|
+
strokeLinejoin="round"
|
145
|
+
/>
|
146
|
+
<path
|
147
|
+
id={`${id}-progress`}
|
148
|
+
d="M204.911 39.1156C204.911 39.1156 175.012 46.8319 157.651 30.4354C140.29 14.0388 121 21.7547 110.391 47.6529C103.22 65.157 78.9634 67.0859 67.9533 47.6529C59.8376 33.3287 36.125 37.1866 36.125 37.1866"
|
149
|
+
strokeWidth="13.6469"
|
150
|
+
strokeLinecap="round"
|
151
|
+
strokeLinejoin="round"
|
152
|
+
strokeDasharray={progressPathLength}
|
153
|
+
strokeDashoffset={progressOffset}
|
154
|
+
style={{ transition: "stroke-dashoffset .2s ease-out" }}
|
155
|
+
ref={pathRef}
|
156
|
+
/>
|
157
|
+
<path
|
158
|
+
id={`${id}-end-dot`}
|
159
|
+
d="M226.025 44.8251C231.411 44.8251 235.776 40.5242 235.776 35.2187C235.776 29.9133 231.411 25.6124 226.025 25.6124C220.64 25.6124 216.274 29.9133 216.274 35.2187C216.274 40.5242 220.64 44.8251 226.025 44.8251Z"
|
160
|
+
fill="#688CBA"
|
161
|
+
/>
|
162
|
+
</chakra.svg>
|
163
|
+
{currentLoadingText && (
|
164
|
+
<Text
|
165
|
+
textAlign="center"
|
166
|
+
marginTop={2}
|
167
|
+
fontWeight="bold"
|
168
|
+
{...labelProps}
|
169
|
+
>
|
170
|
+
{currentLoadingText}
|
171
|
+
</Text>
|
172
|
+
)}
|
173
|
+
</ProgressLoaderWrapper>
|
174
|
+
);
|
175
|
+
},
|
176
|
+
);
|
132
177
|
|
133
178
|
const texts = createTexts({
|
134
179
|
fallbackLabel: (value) => ({
|
package/src/loader/Skeleton.tsx
CHANGED
@@ -1,22 +1,97 @@
|
|
1
|
+
"use client";
|
2
|
+
import { skeletonRecipe } from "@/theme/recipes/skeleton";
|
3
|
+
import type {
|
4
|
+
SkeletonProps as ChakraSkeletonProps,
|
5
|
+
CircleProps,
|
6
|
+
RecipeVariantProps,
|
7
|
+
} from "@chakra-ui/react";
|
1
8
|
import {
|
2
|
-
BoxProps,
|
3
|
-
forwardRef,
|
4
9
|
Skeleton as ChakraSkeleton,
|
10
|
+
Circle,
|
11
|
+
Stack,
|
12
|
+
useRecipe,
|
5
13
|
} from "@chakra-ui/react";
|
6
|
-
import React from "react";
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
import * as React from "react";
|
15
|
+
import { forwardRef } from "react";
|
16
|
+
|
17
|
+
type SkeletonVariantProps = RecipeVariantProps<typeof skeletonRecipe>;
|
18
|
+
|
19
|
+
export type SkeletonCircleProps = ChakraSkeletonProps &
|
20
|
+
SkeletonVariantProps & {
|
21
|
+
size?: CircleProps["size"];
|
22
|
+
};
|
23
|
+
|
24
|
+
export const SkeletonCircle = React.forwardRef<
|
25
|
+
HTMLDivElement,
|
26
|
+
SkeletonCircleProps
|
27
|
+
>(function SkeletonCircle(props, ref) {
|
28
|
+
const recipe = useRecipe({ recipe: skeletonRecipe });
|
29
|
+
|
30
|
+
const [recipeProps, restProps] = recipe.splitVariantProps({
|
31
|
+
loading: true,
|
32
|
+
variant: "pulse",
|
33
|
+
...props,
|
34
|
+
});
|
35
|
+
|
36
|
+
const { size, css, ...rest } = restProps;
|
37
|
+
|
38
|
+
return (
|
39
|
+
<Circle size={size} asChild ref={ref}>
|
40
|
+
<ChakraSkeleton css={{ ...recipe(recipeProps), ...css }} {...rest} />
|
41
|
+
</Circle>
|
42
|
+
);
|
43
|
+
});
|
44
|
+
|
45
|
+
export type SkeletonTextProps = ChakraSkeletonProps &
|
46
|
+
SkeletonVariantProps & {
|
47
|
+
noOfLines?: number;
|
48
|
+
};
|
49
|
+
|
50
|
+
export const SkeletonText = forwardRef<HTMLDivElement, SkeletonTextProps>(
|
51
|
+
function SkeletonText(props, ref) {
|
52
|
+
const recipe = useRecipe({ recipe: skeletonRecipe });
|
53
|
+
const [recipeProps, restProps] = recipe.splitVariantProps({
|
54
|
+
loading: true,
|
55
|
+
variant: "pulse",
|
56
|
+
...props,
|
57
|
+
});
|
58
|
+
const { noOfLines = 3, height = "0.5rem", gap, css, ...rest } = restProps;
|
59
|
+
|
60
|
+
return (
|
61
|
+
<Stack gap={gap} width="full" ref={ref}>
|
62
|
+
{Array.from({ length: noOfLines }).map((_, index) => (
|
63
|
+
<ChakraSkeleton
|
64
|
+
height={height}
|
65
|
+
css={{ ...recipe(recipeProps), ...css }}
|
66
|
+
key={index}
|
67
|
+
_last={{ maxW: "80%" }}
|
68
|
+
{...rest}
|
69
|
+
/>
|
70
|
+
))}
|
71
|
+
</Stack>
|
72
|
+
);
|
73
|
+
},
|
74
|
+
);
|
75
|
+
|
76
|
+
export type SkeletonProps = ChakraSkeletonProps & SkeletonVariantProps;
|
77
|
+
|
78
|
+
export const Skeleton = forwardRef<HTMLDivElement, SkeletonTextProps>(
|
79
|
+
function SkeletonText(props, ref) {
|
80
|
+
const recipe = useRecipe({ recipe: skeletonRecipe });
|
81
|
+
const [recipeProps, restProps] = recipe.splitVariantProps({
|
82
|
+
loading: true,
|
83
|
+
variant: "pulse",
|
84
|
+
...props,
|
85
|
+
});
|
86
|
+
|
87
|
+
const { css, ...rest } = restProps;
|
88
|
+
|
89
|
+
return (
|
90
|
+
<ChakraSkeleton
|
91
|
+
ref={ref}
|
92
|
+
css={{ ...recipe(recipeProps), ...css }}
|
93
|
+
{...rest}
|
94
|
+
/>
|
95
|
+
);
|
96
|
+
},
|
97
|
+
);
|
package/src/loader/index.tsx
CHANGED