@vygruppen/spor-react 9.11.4 → 9.12.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.
@@ -1,16 +1,16 @@
1
1
  import tokens11__default from '@vygruppen/spor-design-tokens';
2
2
  import * as tokens11 from '@vygruppen/spor-design-tokens';
3
3
  export { tokens11 as tokens };
4
- import { forwardRef, Divider as Divider$1, Stack as Stack$1, useMultiStyleConfig, Box, chakra, useStyleConfig, Accordion as Accordion$1, Flex, Checkbox as Checkbox$1, useCheckbox, FormControl as FormControl$1, FormLabel as FormLabel$1, useFormControlContext, InputGroup, InputLeftElement, Input as Input$1, InputRightElement, Select, useDisclosure, Button, useControllableState, Radio as Radio$1, RadioGroup as RadioGroup$1, IconButton as IconButton$1, Switch as Switch$1, Textarea as Textarea$1, Skeleton as Skeleton$1, useButtonGroup, Center, ButtonGroup as ButtonGroup$1, Badge as Badge$1, Code as Code$1, Text, PopoverAnchor, PopoverContent, PopoverArrow, PopoverBody, FocusLock, Popover as Popover$1, PopoverTrigger, Portal, Link, ModalHeader as ModalHeader$1, useModalContext, DrawerContent as DrawerContent$1, Tabs as Tabs$1, Table as Table$1, defineStyleConfig as defineStyleConfig$1, createMultiStyleConfigHelpers as createMultiStyleConfigHelpers$1, useRadioGroup, AccordionItem, AccordionButton, AccordionIcon, AccordionPanel, Heading, CheckboxGroup as CheckboxGroup$1, List, ListItem, useColorModeValue, useFormControlProps, useFormControl, useColorMode, SkeletonCircle as SkeletonCircle$1, SkeletonText as SkeletonText$1, Breadcrumb as Breadcrumb$1, BreadcrumbItem as BreadcrumbItem$1, BreadcrumbLink as BreadcrumbLink$1, Drawer as Drawer$1, DrawerOverlay, DrawerBody, DrawerHeader, useMediaQuery, DrawerCloseButton, DarkMode, PopoverCloseButton, usePopoverContext, UnorderedList, ChakraProvider, useToast as useToast$1, useInterval } from '@chakra-ui/react';
4
+ import { forwardRef, Divider as Divider$1, Stack as Stack$1, Box, useMultiStyleConfig, chakra, Flex, Checkbox as Checkbox$1, useCheckbox, FormControl as FormControl$1, FormLabel as FormLabel$1, useFormControlContext, InputGroup, InputLeftElement, Input as Input$1, InputRightElement, Select, useDisclosure, Button, useControllableState, Radio as Radio$1, RadioGroup as RadioGroup$1, IconButton as IconButton$1, Switch as Switch$1, Textarea as Textarea$1, useStyleConfig, Accordion as Accordion$1, Skeleton as Skeleton$1, useButtonGroup, Center, ButtonGroup as ButtonGroup$1, Badge as Badge$1, Code as Code$1, Text, PopoverAnchor, PopoverContent, PopoverArrow, PopoverBody, FocusLock, Popover as Popover$1, PopoverTrigger, Portal, Link, ModalHeader as ModalHeader$1, useModalContext, DrawerContent as DrawerContent$1, Tabs as Tabs$1, Table as Table$1, defineStyleConfig as defineStyleConfig$1, createMultiStyleConfigHelpers as createMultiStyleConfigHelpers$1, Heading, CheckboxGroup as CheckboxGroup$1, List, ListItem, useColorModeValue, useFormControlProps, useFormControl, AccordionItem, AccordionButton, AccordionIcon, AccordionPanel, useColorMode, SkeletonCircle as SkeletonCircle$1, SkeletonText as SkeletonText$1, Breadcrumb as Breadcrumb$1, BreadcrumbItem as BreadcrumbItem$1, BreadcrumbLink as BreadcrumbLink$1, Drawer as Drawer$1, DrawerOverlay, DrawerBody, DrawerHeader, useMediaQuery, DrawerCloseButton, DarkMode, PopoverCloseButton, usePopoverContext, UnorderedList, ChakraProvider, useToast as useToast$1, useInterval } from '@chakra-ui/react';
5
5
  export { AccordionButton, AccordionIcon, AccordionItem, AccordionPanel, Box, Center, Collapse, Container, DarkMode, DrawerBody, DrawerCloseButton, DrawerFooter, DrawerOverlay, Fade, Flex, FormHelperText, Grid, GridItem, HStack, Image, Img, InputGroup, LightMode, ListItem, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalOverlay, OrderedList, Portal, ScaleFade, SimpleGrid, Slide, SlideFade, Spacer, Tab, TabList, TabPanel, TabPanels, TableCaption, Tbody, Td, Tfoot, Th, Thead, Tr, UnorderedList, VStack, Wrap, WrapItem, defineStyleConfig, extendTheme, useBreakpointValue, useClipboard, useColorMode, useColorModePreference, useColorModeValue, useControllableProp, useDisclosure, useMediaQuery, useMergeRefs, useOutsideClick, usePrefersReducedMotion, useTheme, useToken } from '@chakra-ui/react';
6
6
  import * as React87 from 'react';
7
- import React87__default, { useId, createContext, forwardRef as forwardRef$1, useRef, useState, useEffect, Suspense, useContext, useCallback, useMemo, useLayoutEffect } from 'react';
7
+ import React87__default, { forwardRef as forwardRef$1, useRef, useState, useEffect, useId, Suspense, useContext, createContext, useCallback, useMemo, useLayoutEffect } from 'react';
8
8
  import { CloseOutline24Icon, SearchOutline24Icon, CloseFill30Icon, CloseFill24Icon, CloseFill18Icon, CalendarOutline24Icon, InformationFill24Icon, InformationFill18Icon, WarningFill24Icon, WarningFill18Icon, ErrorFill24Icon, ErrorFill18Icon, LinkOutOutline24Icon, DropdownDownFill18Icon, DropdownDownFill24Icon, DropdownUpFill24Icon, DropdownRightFill18Icon, DropdownLeftFill18Icon, Forward15MediaControllerFill30Icon, Backward15MediaControllerFill30Icon, PauseMediaControllerFill24Icon, PlayMediaControllerFill24Icon, NextMediaControllerFill30Icon, PreviousMediaControllerFill30Icon, ArrowRightFill18Icon, ArrowLeftFill24Icon, ArrowLeftOutline24Icon, ArrowRightOutline24Icon, ErrorOutline24Icon, AltTransportOutline24Icon, WarningOutline24Icon, SuccessOutline24Icon, InformationOutline24Icon, TrainFill18Icon, TrainFill24Icon, TrainFill30Icon, ExpressBusFill18Icon, ExpressBusFill24Icon, ExpressBusFill30Icon, BusFill18Icon, BusFill24Icon, BusFill30Icon, FerryFill18Icon, FerryFill24Icon, FerryFill30Icon, SubwayFill18Icon, SubwayFill24Icon, SubwayFill30Icon, TramFill18Icon, TramFill24Icon, TramFill30Icon, AltTransportFill18Icon, AltTransportFill24Icon, AltTransportFill30Icon, WalkFill18Icon, WalkFill24Icon, WalkFill30Icon } from '@vygruppen/spor-icon-react';
9
- import { inlineLoaderColorPrideData, inlineLoaderColorData, spinnerColorPrideData, spinnerColorData, contentLoaderPrideData, contentLoaderData, fullScreenLoaderWhiteData, inlineLoaderDarkData, vyLogoPrideData, fullScreenLoaderBlackData, inlineLoaderLightData, spinnerLightData, spinnerDarkData } from '@vygruppen/spor-loader';
10
- import { useLottie } from 'lottie-react';
11
9
  import { usePopover, DismissButton, Overlay, useOverlayTrigger, useButton, useDateSegment, useDateField, useDatePicker, I18nProvider, useDialog, useFilter, useComboBox, useListBox, useOption, useListBoxSection, useSelect, HiddenSelect, useProgressBar, useCalendar, useDateRangePicker, useCalendarGrid, useRangeCalendar, useTimeField, useCalendarCell } from 'react-aria';
12
10
  import { useOverlayTriggerState, Item, useDateFieldState, useDatePickerState, useComboBoxState, useSelectState, useCalendarState, useDateRangePickerState, useTimeFieldState, useRangeCalendarState } from 'react-stately';
13
11
  export { Item, Section } from 'react-stately';
12
+ import { inlineLoaderColorPrideData, inlineLoaderColorData, spinnerColorPrideData, spinnerColorData, contentLoaderPrideData, contentLoaderData, fullScreenLoaderWhiteData, inlineLoaderDarkData, vyLogoPrideData, fullScreenLoaderBlackData, inlineLoaderLightData, spinnerLightData, spinnerDarkData } from '@vygruppen/spor-loader';
13
+ import { useLottie } from 'lottie-react';
14
14
  import { motion } from 'framer-motion';
15
15
  import { createCalendar, GregorianCalendar, parseTime, endOfMonth, getWeeksInMonth, getLocalTimeZone, isSameMonth, isToday } from '@internationalized/date';
16
16
  export { Time } from '@internationalized/date';
@@ -778,295 +778,6 @@ var Stack = forwardRef(
778
778
  return /* @__PURE__ */ React87__default.createElement(Stack$1, { ...props, direction: flexDirection, ref });
779
779
  }
780
780
  );
781
- var RadioCard = forwardRef(
782
- ({ children, variant = "base", isChecked, onChange, ...props }, ref) => {
783
- const styles3 = useMultiStyleConfig("RadioCard", { variant });
784
- const id = `radio-card-${useId()}`;
785
- const handleChange = (event) => {
786
- onChange && onChange(event);
787
- };
788
- return /* @__PURE__ */ React87__default.createElement(Box, { as: "label", htmlFor: id, "aria-label": String(children), ref }, /* @__PURE__ */ React87__default.createElement(
789
- chakra.input,
790
- {
791
- type: "radio",
792
- id,
793
- checked: isChecked,
794
- onChange: handleChange,
795
- ...props,
796
- sx: styles3.radioInput
797
- }
798
- ), /* @__PURE__ */ React87__default.createElement(
799
- Box,
800
- {
801
- ...props,
802
- __css: {
803
- ...styles3.container,
804
- ...isChecked && styles3.checked
805
- }
806
- },
807
- children
808
- ));
809
- }
810
- );
811
- var RadioCardGroup = ({
812
- children,
813
- name,
814
- direction: direction2 = "row",
815
- onChange,
816
- defaultValue,
817
- variant = "base",
818
- ...props
819
- }) => {
820
- const { getRootProps, getRadioProps } = useRadioGroup({
821
- defaultValue,
822
- name,
823
- onChange,
824
- ...props
825
- });
826
- const rootProps = getRootProps();
827
- return /* @__PURE__ */ React87__default.createElement(Stack$1, { direction: direction2, ...rootProps }, recursiveMap(children, (child) => {
828
- if (child.type === RadioCard) {
829
- const radioProps = getRadioProps({ value: child.props.value });
830
- const variantValue = variant;
831
- return React87__default.cloneElement(
832
- child,
833
- {
834
- ...radioProps,
835
- variant: variantValue,
836
- ...props
837
- }
838
- );
839
- }
840
- return child;
841
- }));
842
- };
843
- function recursiveMap(children, fn) {
844
- return React87__default.Children.map(children, (child) => {
845
- if (React87__default.isValidElement(child) && child.props.children) {
846
- child = React87__default.cloneElement(child, {
847
- children: recursiveMap(child.props.children, fn)
848
- });
849
- }
850
- if (React87__default.isValidElement(child)) {
851
- return fn(child);
852
- }
853
- return child;
854
- });
855
- }
856
- var StaticCard = forwardRef(
857
- ({ colorScheme = "white", children, ...props }, ref) => {
858
- const styles3 = useStyleConfig("StaticCard", {
859
- colorScheme
860
- });
861
- return /* @__PURE__ */ React87__default.createElement(Box, { __css: styles3, ...props, ref }, children);
862
- }
863
- );
864
- var PressableCard = forwardRef(
865
- ({ children, variant = "floating", ...props }, ref) => {
866
- const styles3 = useStyleConfig("PressableCard", {
867
- variant
868
- });
869
- return /* @__PURE__ */ React87__default.createElement(Box, { __css: styles3, ...props, ref }, children);
870
- }
871
- );
872
- var AccordionContext = React87__default.createContext(null);
873
- var AccordionProvider = ({
874
- size: size2,
875
- ...props
876
- }) => {
877
- return /* @__PURE__ */ React87__default.createElement(AccordionContext.Provider, { value: { size: size2 }, ...props });
878
- };
879
- var useAccordionContext = () => {
880
- const context = React87__default.useContext(AccordionContext);
881
- if (context === null) {
882
- throw new Error(
883
- "useAccordionContext must be used within AccordionProvider"
884
- );
885
- }
886
- return context;
887
- };
888
- var Accordion = forwardRef(
889
- ({ children, spacing: spacing3 = 2, ...props }, ref) => {
890
- const defaultIndex = typeof props.defaultIndex === "number" && props.allowMultiple ? [props.defaultIndex] : props.defaultIndex;
891
- return /* @__PURE__ */ React87__default.createElement(AccordionProvider, { size: props.size }, /* @__PURE__ */ React87__default.createElement(
892
- Accordion$1,
893
- {
894
- ...props,
895
- ref,
896
- defaultIndex
897
- },
898
- /* @__PURE__ */ React87__default.createElement(Stack, { spacing: spacing3 }, children)
899
- ));
900
- }
901
- );
902
- var Expandable = ({
903
- children,
904
- headingLevel,
905
- title,
906
- leftIcon,
907
- size: size2 = "md",
908
- defaultOpen,
909
- isOpen,
910
- onChange = () => {
911
- },
912
- ...rest
913
- }) => {
914
- return /* @__PURE__ */ React87__default.createElement(
915
- Accordion,
916
- {
917
- ...rest,
918
- index: isOpen ? 0 : void 0,
919
- defaultIndex: defaultOpen ? 0 : void 0,
920
- allowMultiple: true,
921
- size: size2,
922
- onChange: (expandedIndex) => onChange(expandedIndex === 0)
923
- },
924
- /* @__PURE__ */ React87__default.createElement(
925
- ExpandableItem,
926
- {
927
- headingLevel,
928
- title,
929
- leftIcon
930
- },
931
- children
932
- )
933
- );
934
- };
935
- var ExpandableItem = ({
936
- children,
937
- title,
938
- headingLevel = "h3",
939
- leftIcon,
940
- ...rest
941
- }) => {
942
- const { size: size2 } = useAccordionContext();
943
- warnAboutMismatchingIcon({ icon: leftIcon, size: size2 });
944
- return /* @__PURE__ */ React87__default.createElement(AccordionItem, { ...rest }, /* @__PURE__ */ React87__default.createElement(Box, { as: headingLevel }, /* @__PURE__ */ React87__default.createElement(AccordionButton, null, /* @__PURE__ */ React87__default.createElement(Flex, { alignItems: "center" }, leftIcon && /* @__PURE__ */ React87__default.createElement(Box, { marginRight: 1 }, leftIcon), title), /* @__PURE__ */ React87__default.createElement(AccordionIcon, null))), /* @__PURE__ */ React87__default.createElement(AccordionPanel, null, children));
945
- };
946
- var warnAboutMismatchingIcon = ({ icon, size: size2 }) => {
947
- var _a6, _b5;
948
- if (process.env.NODE_ENV !== "production") {
949
- const displayName = (_b5 = (_a6 = icon == null ? void 0 : icon.type) == null ? void 0 : _a6.render) == null ? void 0 : _b5.displayName;
950
- if (!displayName) {
951
- return;
952
- }
953
- if (displayName.includes("Fill")) {
954
- console.warn(
955
- `You passed a filled icon. This component requires outlined icons. You passed ${displayName}, replace it with ${displayName.replace(
956
- "Fill",
957
- "Outline"
958
- )}.`
959
- );
960
- return;
961
- }
962
- if (size2 === "lg" && !displayName.includes("30Icon")) {
963
- console.warn(
964
- `The icon you passed was of the wrong size for the lg size. You passed ${displayName}, replace it with ${displayName.replace(
965
- /(\d{2})Icon/,
966
- "30Icon"
967
- )}.`
968
- );
969
- return;
970
- }
971
- if (["md"].includes(size2) && !displayName.includes("24Icon")) {
972
- console.warn(
973
- `The icon you passed was of the wrong size for the ${size2} size. You passed ${displayName}, replace it with ${displayName.replace(
974
- /(\d{2})Icon/,
975
- "24Icon"
976
- )}.`
977
- );
978
- }
979
- }
980
- };
981
- var Language = /* @__PURE__ */ ((Language3) => {
982
- Language3["NorwegianBokmal"] = "nb";
983
- Language3["NorwegianNynorsk"] = "nn";
984
- Language3["Swedish"] = "sv";
985
- Language3["English"] = "en";
986
- return Language3;
987
- })(Language || {});
988
- var LanguageContext = createContext(void 0);
989
- function LanguageProvider({
990
- language,
991
- children
992
- }) {
993
- return /* @__PURE__ */ React87__default.createElement(LanguageContext.Provider, { value: language }, children);
994
- }
995
- function useLanguage() {
996
- const language = useContext(LanguageContext);
997
- if (!language) {
998
- throw new Error("Please wrap your application in a LanguageProvider");
999
- }
1000
- return language;
1001
- }
1002
- function useTranslation() {
1003
- const language = useLanguage();
1004
- const t2 = (text) => {
1005
- return text[language];
1006
- };
1007
- return { t: t2, language };
1008
- }
1009
- function createTexts(texts28) {
1010
- return texts28;
1011
- }
1012
- var hydrating = true;
1013
- function useHydrated() {
1014
- let [hydrated, setHydrated] = useState(() => !hydrating);
1015
- useEffect(function hydrate() {
1016
- hydrating = false;
1017
- setHydrated(true);
1018
- }, []);
1019
- return hydrated;
1020
- }
1021
-
1022
- // src/loader/ClientOnly.tsx
1023
- var ClientOnly = ({ children, fallback = null }) => {
1024
- const isHydrated = useHydrated();
1025
- return /* @__PURE__ */ React87__default.createElement(React87__default.Fragment, null, isHydrated ? children() : fallback);
1026
- };
1027
- function Lottie({ animationData }) {
1028
- const { View } = useLottie({ animationData, loop: true });
1029
- return /* @__PURE__ */ React87__default.createElement(React87__default.Fragment, null, View);
1030
- }
1031
- var PrideContext = createContext(void 0);
1032
- var PrideProvider = ({
1033
- children
1034
- }) => {
1035
- const isBrowser2 = typeof window !== "undefined";
1036
- const key = "spor__isPride";
1037
- const [isPride, setIsPride] = useState(() => {
1038
- if (isBrowser2) {
1039
- const savedState = localStorage.getItem(key);
1040
- return savedState ? JSON.parse(savedState) : true;
1041
- }
1042
- return true;
1043
- });
1044
- const togglePride = () => {
1045
- setIsPride((prev) => {
1046
- const newState = !prev;
1047
- if (isBrowser2) {
1048
- localStorage.setItem(key, JSON.stringify(newState));
1049
- }
1050
- return newState;
1051
- });
1052
- };
1053
- useEffect(() => {
1054
- if (isBrowser2) {
1055
- const savedState = localStorage.getItem(key);
1056
- if (savedState) {
1057
- setIsPride(JSON.parse(savedState));
1058
- }
1059
- }
1060
- }, [isBrowser2]);
1061
- return /* @__PURE__ */ React87__default.createElement(PrideContext.Provider, { value: { isPride, togglePride } }, children);
1062
- };
1063
- var usePride = () => {
1064
- const context = useContext(PrideContext);
1065
- if (context === void 0) {
1066
- throw new Error("usePride must be used within a PrideProvider");
1067
- }
1068
- return context;
1069
- };
1070
781
  var AttachedInputs = ({
1071
782
  flexDirection = "row",
1072
783
  ...rest
@@ -2041,7 +1752,7 @@ var texts4 = createTexts({
2041
1752
  sv: "Telefonnummer"
2042
1753
  }
2043
1754
  });
2044
- var LazyCountryCodeSelect = React87__default.lazy(() => import('./CountryCodeSelect-5Z5ATLWK.mjs'));
1755
+ var LazyCountryCodeSelect = React87__default.lazy(() => import('./CountryCodeSelect-Q33DXFQF.mjs'));
2045
1756
  var Radio = forwardRef((props, ref) => {
2046
1757
  return /* @__PURE__ */ React87__default.createElement(Radio$1, { ...props, ref });
2047
1758
  });
@@ -2088,95 +1799,409 @@ var SearchInput = forwardRef(
2088
1799
  )));
2089
1800
  }
2090
1801
  );
2091
- var texts5 = createTexts({
2092
- label: {
2093
- nb: "S\xF8k",
2094
- nn: "S\xF8k",
2095
- sv: "S\xF6k",
2096
- en: "Search"
1802
+ var texts5 = createTexts({
1803
+ label: {
1804
+ nb: "S\xF8k",
1805
+ nn: "S\xF8k",
1806
+ sv: "S\xF6k",
1807
+ en: "Search"
1808
+ },
1809
+ reset: {
1810
+ nb: "T\xF8m s\xF8kefeltet",
1811
+ nn: "T\xF8m s\xF8kefelt",
1812
+ sv: "Rensa s\xF6krutan",
1813
+ en: "Reset search field"
1814
+ }
1815
+ });
1816
+ var Switch = forwardRef(
1817
+ ({ size: size2 = "md", ...props }, ref) => {
1818
+ return /* @__PURE__ */ React87__default.createElement(Switch$1, { size: size2, ...props, ref });
1819
+ }
1820
+ );
1821
+ var Textarea = forwardRef((props, ref) => {
1822
+ const {
1823
+ spacingProps,
1824
+ remainingProps: { label, ...rest }
1825
+ } = getSpacingProps(props);
1826
+ const formControlProps = useFormControlContext();
1827
+ const fallbackId = `textarea-${useId()}`;
1828
+ const inputId = props.id ?? (formControlProps == null ? void 0 : formControlProps.id) ?? fallbackId;
1829
+ return /* @__PURE__ */ React87__default.createElement(InputGroup, { position: "relative", ...spacingProps }, /* @__PURE__ */ React87__default.createElement(Textarea$1, { ...rest, id: inputId, ref, placeholder: " " }), label && /* @__PURE__ */ React87__default.createElement(FormLabel$1, { htmlFor: inputId, id: `${inputId}-label` }, label));
1830
+ });
1831
+ function getSpacingProps(props) {
1832
+ const {
1833
+ mt,
1834
+ mr,
1835
+ mb,
1836
+ ml,
1837
+ mx,
1838
+ my,
1839
+ marginTop,
1840
+ marginRight,
1841
+ marginBottom,
1842
+ marginLeft,
1843
+ marginX,
1844
+ marginY,
1845
+ pt,
1846
+ pr,
1847
+ pb,
1848
+ pl,
1849
+ px,
1850
+ py,
1851
+ paddingTop,
1852
+ paddingRight,
1853
+ paddingBottom,
1854
+ paddingLeft,
1855
+ paddingX,
1856
+ paddingY,
1857
+ ...remainingProps
1858
+ } = props;
1859
+ return {
1860
+ spacingProps: {
1861
+ mt,
1862
+ mr,
1863
+ mb,
1864
+ ml,
1865
+ mx,
1866
+ my,
1867
+ marginTop,
1868
+ marginRight,
1869
+ marginBottom,
1870
+ marginLeft,
1871
+ marginX,
1872
+ marginY,
1873
+ pt,
1874
+ pr,
1875
+ pb,
1876
+ pl,
1877
+ px,
1878
+ py,
1879
+ paddingTop,
1880
+ paddingRight,
1881
+ paddingBottom,
1882
+ paddingLeft,
1883
+ paddingX,
1884
+ paddingY
1885
+ },
1886
+ remainingProps
1887
+ };
1888
+ }
1889
+
1890
+ // src/layout/RadioCardGroup.tsx
1891
+ var RadioCardGroupContext = React87__default.createContext(null);
1892
+ var RadioCardGroup = ({
1893
+ children,
1894
+ name,
1895
+ variant = "base",
1896
+ direction: direction2 = "row",
1897
+ groupLabel,
1898
+ defaultValue,
1899
+ ...props
1900
+ }) => {
1901
+ const [selectedValue, setSelectedValue] = useState(
1902
+ defaultValue || ""
1903
+ );
1904
+ const handleChange = (value) => {
1905
+ setSelectedValue(value);
1906
+ };
1907
+ return /* @__PURE__ */ React87__default.createElement(
1908
+ RadioCardGroupContext.Provider,
1909
+ {
1910
+ value: {
1911
+ name,
1912
+ selectedValue,
1913
+ onChange: handleChange,
1914
+ variant,
1915
+ defaultValue: defaultValue || ""
1916
+ }
1917
+ },
1918
+ /* @__PURE__ */ React87__default.createElement(
1919
+ Stack$1,
1920
+ {
1921
+ as: "fieldset",
1922
+ direction: direction2,
1923
+ "aria-labelledby": groupLabel || name,
1924
+ role: "radiogroup",
1925
+ tabIndex: 0,
1926
+ ...props
1927
+ },
1928
+ groupLabel && /* @__PURE__ */ React87__default.createElement(FormLabel, { as: "legend", id: groupLabel }, groupLabel),
1929
+ children
1930
+ )
1931
+ );
1932
+ };
1933
+
1934
+ // src/layout/RadioCard.tsx
1935
+ var RadioCard = forwardRef(
1936
+ ({ children, value = "base", isDisabled, ...props }, ref) => {
1937
+ const context = useContext(RadioCardGroupContext);
1938
+ if (!context) {
1939
+ throw new Error(
1940
+ "RadioCard components must be wrapped in a RadioCardGroup component"
1941
+ );
1942
+ }
1943
+ const { name, selectedValue, onChange, variant } = context;
1944
+ const styles3 = useMultiStyleConfig("RadioCard", { variant });
1945
+ const isChecked = selectedValue === value;
1946
+ const radioCardId = `radio-card-${useId()}`;
1947
+ useEffect(() => {
1948
+ if (isChecked && typeof ref !== "function" && (ref == null ? void 0 : ref.current)) {
1949
+ ref.current.focus();
1950
+ }
1951
+ }, [isChecked]);
1952
+ const handleKeyDown = (event) => {
1953
+ if (event.key === "Enter" || event.key === " ") {
1954
+ onChange(value);
1955
+ }
1956
+ if (event.key === "ArrowRight" || event.key === "ArrowDown" || event.key === "ArrowLeft" || event.key === "ArrowUp") {
1957
+ const nextRadioCard = event.currentTarget.nextElementSibling;
1958
+ nextRadioCard.focus();
1959
+ }
1960
+ };
1961
+ return /* @__PURE__ */ React87__default.createElement(Box, { as: "label", "aria-label": String(children), onKeyDown: handleKeyDown }, /* @__PURE__ */ React87__default.createElement(
1962
+ chakra.input,
1963
+ {
1964
+ type: "radio",
1965
+ id: radioCardId,
1966
+ ref,
1967
+ value,
1968
+ name,
1969
+ checked: isChecked,
1970
+ onChange: () => onChange(value),
1971
+ disabled: isDisabled,
1972
+ __css: styles3.radioInput
1973
+ }
1974
+ ), /* @__PURE__ */ React87__default.createElement(
1975
+ Box,
1976
+ {
1977
+ ...props,
1978
+ tabIndex: 0,
1979
+ ref,
1980
+ role: "radio",
1981
+ "aria-checked": isChecked,
1982
+ "aria-labelledby": radioCardId,
1983
+ __css: { ...styles3.container, ...isChecked && styles3.checked },
1984
+ "data-checked": isChecked,
1985
+ "data-disabled": isDisabled
1986
+ },
1987
+ children
1988
+ ));
1989
+ }
1990
+ );
1991
+ var StaticCard = forwardRef(
1992
+ ({ colorScheme = "white", children, ...props }, ref) => {
1993
+ const styles3 = useStyleConfig("StaticCard", {
1994
+ colorScheme
1995
+ });
1996
+ return /* @__PURE__ */ React87__default.createElement(Box, { __css: styles3, ...props, ref }, children);
1997
+ }
1998
+ );
1999
+ var PressableCard = forwardRef(
2000
+ ({ children, variant = "floating", ...props }, ref) => {
2001
+ const styles3 = useStyleConfig("PressableCard", {
2002
+ variant
2003
+ });
2004
+ return /* @__PURE__ */ React87__default.createElement(Box, { __css: styles3, ...props, ref }, children);
2005
+ }
2006
+ );
2007
+ var AccordionContext = React87__default.createContext(null);
2008
+ var AccordionProvider = ({
2009
+ size: size2,
2010
+ ...props
2011
+ }) => {
2012
+ return /* @__PURE__ */ React87__default.createElement(AccordionContext.Provider, { value: { size: size2 }, ...props });
2013
+ };
2014
+ var useAccordionContext = () => {
2015
+ const context = React87__default.useContext(AccordionContext);
2016
+ if (context === null) {
2017
+ throw new Error(
2018
+ "useAccordionContext must be used within AccordionProvider"
2019
+ );
2020
+ }
2021
+ return context;
2022
+ };
2023
+ var Accordion = forwardRef(
2024
+ ({ children, spacing: spacing3 = 2, ...props }, ref) => {
2025
+ const defaultIndex = typeof props.defaultIndex === "number" && props.allowMultiple ? [props.defaultIndex] : props.defaultIndex;
2026
+ return /* @__PURE__ */ React87__default.createElement(AccordionProvider, { size: props.size }, /* @__PURE__ */ React87__default.createElement(
2027
+ Accordion$1,
2028
+ {
2029
+ ...props,
2030
+ ref,
2031
+ defaultIndex
2032
+ },
2033
+ /* @__PURE__ */ React87__default.createElement(Stack, { spacing: spacing3 }, children)
2034
+ ));
2035
+ }
2036
+ );
2037
+ var Expandable = ({
2038
+ children,
2039
+ headingLevel,
2040
+ title,
2041
+ leftIcon,
2042
+ size: size2 = "md",
2043
+ defaultOpen,
2044
+ isOpen,
2045
+ onChange = () => {
2097
2046
  },
2098
- reset: {
2099
- nb: "T\xF8m s\xF8kefeltet",
2100
- nn: "T\xF8m s\xF8kefelt",
2101
- sv: "Rensa s\xF6krutan",
2102
- en: "Reset search field"
2047
+ ...rest
2048
+ }) => {
2049
+ return /* @__PURE__ */ React87__default.createElement(
2050
+ Accordion,
2051
+ {
2052
+ ...rest,
2053
+ index: isOpen ? 0 : void 0,
2054
+ defaultIndex: defaultOpen ? 0 : void 0,
2055
+ allowMultiple: true,
2056
+ size: size2,
2057
+ onChange: (expandedIndex) => onChange(expandedIndex === 0)
2058
+ },
2059
+ /* @__PURE__ */ React87__default.createElement(
2060
+ ExpandableItem,
2061
+ {
2062
+ headingLevel,
2063
+ title,
2064
+ leftIcon
2065
+ },
2066
+ children
2067
+ )
2068
+ );
2069
+ };
2070
+ var ExpandableItem = ({
2071
+ children,
2072
+ title,
2073
+ headingLevel = "h3",
2074
+ leftIcon,
2075
+ ...rest
2076
+ }) => {
2077
+ const { size: size2 } = useAccordionContext();
2078
+ warnAboutMismatchingIcon({ icon: leftIcon, size: size2 });
2079
+ return /* @__PURE__ */ React87__default.createElement(AccordionItem, { ...rest }, /* @__PURE__ */ React87__default.createElement(Box, { as: headingLevel }, /* @__PURE__ */ React87__default.createElement(AccordionButton, null, /* @__PURE__ */ React87__default.createElement(Flex, { alignItems: "center" }, leftIcon && /* @__PURE__ */ React87__default.createElement(Box, { marginRight: 1 }, leftIcon), title), /* @__PURE__ */ React87__default.createElement(AccordionIcon, null))), /* @__PURE__ */ React87__default.createElement(AccordionPanel, null, children));
2080
+ };
2081
+ var warnAboutMismatchingIcon = ({ icon, size: size2 }) => {
2082
+ var _a6, _b5;
2083
+ if (process.env.NODE_ENV !== "production") {
2084
+ const displayName = (_b5 = (_a6 = icon == null ? void 0 : icon.type) == null ? void 0 : _a6.render) == null ? void 0 : _b5.displayName;
2085
+ if (!displayName) {
2086
+ return;
2087
+ }
2088
+ if (displayName.includes("Fill")) {
2089
+ console.warn(
2090
+ `You passed a filled icon. This component requires outlined icons. You passed ${displayName}, replace it with ${displayName.replace(
2091
+ "Fill",
2092
+ "Outline"
2093
+ )}.`
2094
+ );
2095
+ return;
2096
+ }
2097
+ if (size2 === "lg" && !displayName.includes("30Icon")) {
2098
+ console.warn(
2099
+ `The icon you passed was of the wrong size for the lg size. You passed ${displayName}, replace it with ${displayName.replace(
2100
+ /(\d{2})Icon/,
2101
+ "30Icon"
2102
+ )}.`
2103
+ );
2104
+ return;
2105
+ }
2106
+ if (["md"].includes(size2) && !displayName.includes("24Icon")) {
2107
+ console.warn(
2108
+ `The icon you passed was of the wrong size for the ${size2} size. You passed ${displayName}, replace it with ${displayName.replace(
2109
+ /(\d{2})Icon/,
2110
+ "24Icon"
2111
+ )}.`
2112
+ );
2113
+ }
2103
2114
  }
2104
- });
2105
- var Switch = forwardRef(
2106
- ({ size: size2 = "md", ...props }, ref) => {
2107
- return /* @__PURE__ */ React87__default.createElement(Switch$1, { size: size2, ...props, ref });
2115
+ };
2116
+ var Language = /* @__PURE__ */ ((Language3) => {
2117
+ Language3["NorwegianBokmal"] = "nb";
2118
+ Language3["NorwegianNynorsk"] = "nn";
2119
+ Language3["Swedish"] = "sv";
2120
+ Language3["English"] = "en";
2121
+ return Language3;
2122
+ })(Language || {});
2123
+ var LanguageContext = createContext(void 0);
2124
+ function LanguageProvider({
2125
+ language,
2126
+ children
2127
+ }) {
2128
+ return /* @__PURE__ */ React87__default.createElement(LanguageContext.Provider, { value: language }, children);
2129
+ }
2130
+ function useLanguage() {
2131
+ const language = useContext(LanguageContext);
2132
+ if (!language) {
2133
+ throw new Error("Please wrap your application in a LanguageProvider");
2108
2134
  }
2109
- );
2110
- var Textarea = forwardRef((props, ref) => {
2111
- const {
2112
- spacingProps,
2113
- remainingProps: { label, ...rest }
2114
- } = getSpacingProps(props);
2115
- const formControlProps = useFormControlContext();
2116
- const fallbackId = `textarea-${useId()}`;
2117
- const inputId = props.id ?? (formControlProps == null ? void 0 : formControlProps.id) ?? fallbackId;
2118
- return /* @__PURE__ */ React87__default.createElement(InputGroup, { position: "relative", ...spacingProps }, /* @__PURE__ */ React87__default.createElement(Textarea$1, { ...rest, id: inputId, ref, placeholder: " " }), label && /* @__PURE__ */ React87__default.createElement(FormLabel$1, { htmlFor: inputId, id: `${inputId}-label` }, label));
2119
- });
2120
- function getSpacingProps(props) {
2121
- const {
2122
- mt,
2123
- mr,
2124
- mb,
2125
- ml,
2126
- mx,
2127
- my,
2128
- marginTop,
2129
- marginRight,
2130
- marginBottom,
2131
- marginLeft,
2132
- marginX,
2133
- marginY,
2134
- pt,
2135
- pr,
2136
- pb,
2137
- pl,
2138
- px,
2139
- py,
2140
- paddingTop,
2141
- paddingRight,
2142
- paddingBottom,
2143
- paddingLeft,
2144
- paddingX,
2145
- paddingY,
2146
- ...remainingProps
2147
- } = props;
2148
- return {
2149
- spacingProps: {
2150
- mt,
2151
- mr,
2152
- mb,
2153
- ml,
2154
- mx,
2155
- my,
2156
- marginTop,
2157
- marginRight,
2158
- marginBottom,
2159
- marginLeft,
2160
- marginX,
2161
- marginY,
2162
- pt,
2163
- pr,
2164
- pb,
2165
- pl,
2166
- px,
2167
- py,
2168
- paddingTop,
2169
- paddingRight,
2170
- paddingBottom,
2171
- paddingLeft,
2172
- paddingX,
2173
- paddingY
2174
- },
2175
- remainingProps
2135
+ return language;
2136
+ }
2137
+ function useTranslation() {
2138
+ const language = useLanguage();
2139
+ const t2 = (text) => {
2140
+ return text[language];
2176
2141
  };
2142
+ return { t: t2, language };
2143
+ }
2144
+ function createTexts(texts28) {
2145
+ return texts28;
2146
+ }
2147
+ var hydrating = true;
2148
+ function useHydrated() {
2149
+ let [hydrated, setHydrated] = useState(() => !hydrating);
2150
+ useEffect(function hydrate() {
2151
+ hydrating = false;
2152
+ setHydrated(true);
2153
+ }, []);
2154
+ return hydrated;
2177
2155
  }
2178
2156
 
2179
- // src/pride/TogglePride.tsx
2157
+ // src/loader/ClientOnly.tsx
2158
+ var ClientOnly = ({ children, fallback = null }) => {
2159
+ const isHydrated = useHydrated();
2160
+ return /* @__PURE__ */ React87__default.createElement(React87__default.Fragment, null, isHydrated ? children() : fallback);
2161
+ };
2162
+ function Lottie({ animationData }) {
2163
+ const { View } = useLottie({ animationData, loop: true });
2164
+ return /* @__PURE__ */ React87__default.createElement(React87__default.Fragment, null, View);
2165
+ }
2166
+ var PrideContext = createContext(void 0);
2167
+ var PrideProvider = ({
2168
+ children
2169
+ }) => {
2170
+ const isBrowser2 = typeof window !== "undefined";
2171
+ const key = "spor__isPride";
2172
+ const [isPride, setIsPride] = useState(() => {
2173
+ if (isBrowser2) {
2174
+ const savedState = localStorage.getItem(key);
2175
+ return savedState ? JSON.parse(savedState) : true;
2176
+ }
2177
+ return true;
2178
+ });
2179
+ const togglePride = () => {
2180
+ setIsPride((prev) => {
2181
+ const newState = !prev;
2182
+ if (isBrowser2) {
2183
+ localStorage.setItem(key, JSON.stringify(newState));
2184
+ }
2185
+ return newState;
2186
+ });
2187
+ };
2188
+ useEffect(() => {
2189
+ if (isBrowser2) {
2190
+ const savedState = localStorage.getItem(key);
2191
+ if (savedState) {
2192
+ setIsPride(JSON.parse(savedState));
2193
+ }
2194
+ }
2195
+ }, [isBrowser2]);
2196
+ return /* @__PURE__ */ React87__default.createElement(PrideContext.Provider, { value: { isPride, togglePride } }, children);
2197
+ };
2198
+ var usePride = () => {
2199
+ const context = useContext(PrideContext);
2200
+ if (context === void 0) {
2201
+ throw new Error("usePride must be used within a PrideProvider");
2202
+ }
2203
+ return context;
2204
+ };
2180
2205
  var TogglePride = ({ label }) => {
2181
2206
  const { isPride, togglePride } = usePride();
2182
2207
  return /* @__PURE__ */ React87__default.createElement(FormControl, { display: "flex", alignItems: "center", gap: 3 }, /* @__PURE__ */ React87__default.createElement(FormLabel, { margin: "0" }, label), /* @__PURE__ */ React87__default.createElement(
@@ -13241,7 +13266,6 @@ var helpers24 = createMultiStyleConfigHelpers$1(parts17.keys);
13241
13266
  var config33 = helpers24.defineMultiStyleConfig({
13242
13267
  baseStyle: (props) => ({
13243
13268
  container: {
13244
- appearance: "none",
13245
13269
  border: "none",
13246
13270
  overflow: "hidden",
13247
13271
  fontSize: "inherit",
@@ -13283,6 +13307,9 @@ var config33 = helpers24.defineMultiStyleConfig({
13283
13307
  _active: {
13284
13308
  ...baseBackground("active", props),
13285
13309
  ...baseBorder("active", props)
13310
+ },
13311
+ _focus: {
13312
+ ...outlineBorder("focus", props)
13286
13313
  }
13287
13314
  },
13288
13315
  checked: {
@@ -13292,13 +13319,17 @@ var config33 = helpers24.defineMultiStyleConfig({
13292
13319
  _active: {
13293
13320
  ...baseBackground("active", props),
13294
13321
  ...baseBorder("active", props)
13322
+ },
13323
+ _focus: {
13324
+ outline: "4px solid",
13325
+ outlineStyle: "double",
13326
+ ...outlineBorder("focus", props),
13327
+ outlineOffset: "-1px"
13295
13328
  }
13296
13329
  }
13297
13330
  }),
13298
13331
  floating: (props) => ({
13299
13332
  container: {
13300
- ...baseText("default", props),
13301
- ...baseBackground("default", props),
13302
13333
  ...floatingBackground("default", props),
13303
13334
  ...floatingBorder("default", props),
13304
13335
  boxShadow: "sm",
@@ -13310,16 +13341,25 @@ var config33 = helpers24.defineMultiStyleConfig({
13310
13341
  _active: {
13311
13342
  ...floatingBackground("active", props),
13312
13343
  ...floatingBorder("active", props)
13344
+ },
13345
+ _focus: {
13346
+ ...outlineBorder("focus", props)
13313
13347
  }
13314
13348
  },
13315
13349
  checked: {
13316
- cursor: "normal",
13317
13350
  _hover: {
13318
- ...floatingBorder("hover", props)
13351
+ ...floatingBorder("hover", props),
13352
+ boxShadow: "md"
13319
13353
  },
13320
13354
  _active: {
13321
13355
  ...floatingBackground("active", props),
13322
13356
  ...floatingBorder("active", props)
13357
+ },
13358
+ _focus: {
13359
+ outline: "4px solid",
13360
+ outlineStyle: "double",
13361
+ ...outlineBorder("focus", props),
13362
+ outlineOffset: "-1px"
13323
13363
  }
13324
13364
  }
13325
13365
  })
@@ -14447,4 +14487,4 @@ function slugify(text, maxLength = 50) {
14447
14487
  return text.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[\u00C6\u00E6]/g, "ae").replace(/[\u00D8\u00F8]/g, "oe").replace(/[\u00C5\u00E5]/g, "aa").toLowerCase().replace(/\s+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+/, "").replace(/-+$/, "").substring(0, maxLength);
14448
14488
  }
14449
14489
 
14450
- export { Accordion, AttachedInputs, Badge, Brand, Breadcrumb, BreadcrumbItem, BreadcrumbLink, Button2 as Button, ButtonGroup, Card2 as Card, CardSelect, Checkbox, CheckboxGroup, ChoiceChip, ClosableAlert, CloseButton, Code, ColorInlineLoader, ColorSpinner, Combobox, ContentLoader, DarkFullScreenLoader, DarkInlineLoader, DarkSpinner, DatePicker, DateRangePicker, Divider, Drawer, DrawerContent, Expandable, ExpandableAlert, ExpandableItem, FloatingActionButton, FormControl, FormErrorMessage, FormLabel, FullScreenDrawer, Heading2 as Heading, IconButton, InfoSelect, InfoTag, Input, InputLeftElement2 as InputLeftElement, InputRightElement2 as InputRightElement, ItemDescription, ItemLabel, JumpButton, Language, LanguageProvider, LightFullScreenLoader, LightInlineLoader, LightSpinner, LineIcon, ListBox, ModalHeader, NativeSelect, Nudge, NumericStepper, Pagination, PasswordInput, PhoneNumberInput, PlayPauseButton, PressableCard, PrideProvider, ProgressBar, ProgressIndicator, ProgressLoader, Radio, RadioCard, RadioCardGroup, RadioGroup, SearchInput, SimpleDrawer, Skeleton, SkeletonCircle, SkeletonText, SkipButton, SporProvider, Stack, StaticAlert, StaticCard, Stepper, StepperStep, Switch, Table, Tabs, Text4 as Text, TextLink, Textarea, TimePicker, TogglePride, Tooltip, TravelTag, VyLogo, VyLogoDefault, VyLogoPride, WizardNudge, brandTheme, createTexts, fontFaces, slugify, theme, usePride, useSize, useToast, useTranslation };
14490
+ export { Accordion, AttachedInputs, Badge, Brand, Breadcrumb, BreadcrumbItem, BreadcrumbLink, Button2 as Button, ButtonGroup, Card2 as Card, CardSelect, Checkbox, CheckboxGroup, ChoiceChip, ClosableAlert, CloseButton, Code, ColorInlineLoader, ColorSpinner, Combobox, ContentLoader, DarkFullScreenLoader, DarkInlineLoader, DarkSpinner, DatePicker, DateRangePicker, Divider, Drawer, DrawerContent, Expandable, ExpandableAlert, ExpandableItem, FloatingActionButton, FormControl, FormErrorMessage, FormLabel, FullScreenDrawer, Heading2 as Heading, IconButton, InfoSelect, InfoTag, Input, InputLeftElement2 as InputLeftElement, InputRightElement2 as InputRightElement, ItemDescription, ItemLabel, JumpButton, Language, LanguageProvider, LightFullScreenLoader, LightInlineLoader, LightSpinner, LineIcon, ListBox, ModalHeader, NativeSelect, Nudge, NumericStepper, Pagination, PasswordInput, PhoneNumberInput, PlayPauseButton, PressableCard, PrideProvider, ProgressBar, ProgressIndicator, ProgressLoader, Radio, RadioCard, RadioCardGroup, RadioCardGroupContext, RadioGroup, SearchInput, SimpleDrawer, Skeleton, SkeletonCircle, SkeletonText, SkipButton, SporProvider, Stack, StaticAlert, StaticCard, Stepper, StepperStep, Switch, Table, Tabs, Text4 as Text, TextLink, Textarea, TimePicker, TogglePride, Tooltip, TravelTag, VyLogo, VyLogoDefault, VyLogoPride, WizardNudge, brandTheme, createTexts, fontFaces, slugify, theme, usePride, useSize, useToast, useTranslation };