{"version":3,"file":"coopse.script.6122.8713c3f5.chunk.js","mappings":"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","sources":["webpack:///./src/microApps/base/components/MainPageLayout/MainPageLayoutContext.ts","webpack:///./src/microApps/base/components/MainPageLayout/MainPageLayout.tsx","webpack:///./src/microApps/common/components/atoms/PageHead/PageHead.tsx","webpack:///./src/microApps/common/components/molecules/PageProperties/PageProperties.utils.ts","webpack:///./src/microApps/common/components/molecules/PageProperties/PageProperties.hooks.ts","webpack:///./src/microApps/common/components/molecules/PageProperties/PageProperties.tsx","webpack:///./src/microApps/common/components/molecules/SideMenu/SideMenu.module.less","webpack:///./src/microApps/common/components/molecules/SideMenu/SideMenuItem.tsx","webpack:///./src/microApps/common/components/molecules/SideMenu/SideMenu.tsx","webpack:///./src/microApps/common/components/organisms/SideBarMenu/SideBarMenu.tsx","webpack:///./src/microApps/common/components/organisms/SideBarMenu/SideBarMenuLoader.tsx","webpack:///./src/microApps/common/components/organisms/SideBarMenu/SideBarMenu.hooks.ts","webpack:///./src/microApps/common/components/organisms/SideBarMenu/SideBarMenu.utils.ts","webpack:///./src/microApps/common/hooks/useDocumentHeadIsPreparedForReactHelmet.ts","webpack:///./src/microApps/common/hooks/useMenuState.ts","webpack:///./src/microApps/common/hooks/useSavedInRef.ts","webpack:///./src/microApps/common/utils/metaUtils.ts"],"sourcesContent":["import * as React from 'react';\n\nexport const MainPageLayoutContext = React.createContext<\n    | {\n          /**\n           * Example: ArticlePage or BlockListingPage used under EcommerceLayout\n           */\n          isInsideAnotherLayout: boolean;\n      }\n    | undefined\n>(undefined);\n","import classNames from 'classnames';\nimport * as React from 'react';\n\nimport { useAppSelector } from '../../../common/hooks/useThunkDispatch';\nimport { SkipLinkTarget } from '../SkipLink';\nimport { MainPageLayoutContext } from './MainPageLayoutContext';\n\n/**\n * This is a layout component that should be used by all Coop.se pages, to ensure a consistent layout.\n */\nconst MainPageLayout = (\n    props: React.PropsWithChildren<{\n        heroSlot?: React.ReactNode;\n        heroEdgeToEdge?: boolean;\n        heroBleedViewport?: boolean;\n\n        subHeroSlot?: React.ReactNode;\n        sideMenuSlot?: React.ReactNode;\n\n        disablePaddingOnMobile?: boolean;\n    }>,\n) => {\n    const hasSideBar =\n        useAppSelector((state) => state.ui.shared.hasSideBar) && !!props.sideMenuSlot;\n\n    const id = React.useId();\n\n    const topMargin = classNames('u-marginTmd u-lg-marginTxlg');\n\n    const parentContext = React.useContext(MainPageLayoutContext);\n    const thisContext = React.useMemo(\n        () => ({\n            isInsideAnotherLayout: parentContext !== undefined,\n        }),\n        [parentContext],\n    );\n\n    if (thisContext.isInsideAnotherLayout) {\n        return (\n            <MainPageLayoutContext.Provider value={thisContext}>\n                {!!props.heroSlot && (\n                    <LayoutHero\n                        id={id}\n                        edgeToEdge\n                        bleedViewport={props.heroBleedViewport}\n                        topMargin={undefined}\n                        disablePaddingOnMobile={props.disablePaddingOnMobile}\n                    >\n                        {props.heroSlot}\n                    </LayoutHero>\n                )}\n\n                <div id={`LayoutContentWrapper_${id}`}>\n                    <LayoutContent\n                        id={id}\n                        subHeroSlot={props.subHeroSlot}\n                        sideMenuSlot={props.sideMenuSlot}\n                        topMargin={props.heroSlot ? topMargin : undefined}\n                    >\n                        {props.children}\n                    </LayoutContent>\n                </div>\n            </MainPageLayoutContext.Provider>\n        );\n    }\n\n    return (\n        <MainPageLayoutContext.Provider value={thisContext}>\n            {!!props.heroSlot && (\n                <LayoutHero\n                    id={id}\n                    edgeToEdge={props.heroEdgeToEdge}\n                    bleedViewport={props.heroBleedViewport}\n                    topMargin={topMargin}\n                    disablePaddingOnMobile={props.disablePaddingOnMobile}\n                >\n                    {props.heroSlot}\n                </LayoutHero>\n            )}\n\n            <div\n                id={`LayoutContentWrapper_${id}`}\n                className={classNames(\n                    'Main-container',\n                    'Main-container--padding',\n                    hasSideBar && 'Main-container--full',\n                    props.disablePaddingOnMobile && 'Main-container--noPaddingOnMobile',\n                    topMargin,\n                    'u-marginBxlg',\n                )}\n            >\n                <LayoutContent\n                    id={id}\n                    subHeroSlot={props.subHeroSlot}\n                    sideMenuSlot={props.sideMenuSlot}\n                    topMargin={topMargin}\n                >\n                    {props.children}\n                </LayoutContent>\n            </div>\n        </MainPageLayoutContext.Provider>\n    );\n};\n\nconst LayoutHero = (\n    props: React.PropsWithChildren<{\n        id: string;\n        edgeToEdge: boolean | undefined;\n        bleedViewport: boolean | undefined;\n        topMargin: string | undefined;\n        disablePaddingOnMobile: boolean | undefined;\n    }>,\n) => (\n    <div\n        id={`LayoutHero_${props.id}`}\n        className={classNames(\n            'Main-container',\n            'Main-container--fullBleed',\n            props.edgeToEdge || props.bleedViewport\n                ? 'Main-container--fullBleedViewport'\n                : 'Main-container--padding Main-container--fullBleedXXlg',\n            !props.edgeToEdge && props.topMargin,\n            props.disablePaddingOnMobile && 'Main-container--noPaddingOnMobile',\n        )}\n    >\n        {props.children}\n    </div>\n);\n\nconst LayoutContent = (\n    props: React.PropsWithChildren<{\n        id: string;\n        subHeroSlot: React.ReactNode | undefined;\n        sideMenuSlot: React.ReactNode | undefined;\n        topMargin: string | undefined;\n    }>,\n) => {\n    return (\n        <>\n            {!!props.subHeroSlot && props.subHeroSlot}\n\n            {props.sideMenuSlot ? (\n                <div\n                    id={`LayoutContent_${props.id}`}\n                    className={classNames(\n                        'Grid Grid--gutterHxlg Grid--dynamicWidth',\n                        props.topMargin,\n                    )}\n                >\n                    <div className=\"Grid-cell Grid-cell--fixedWidth u-hidden u-lg-block\">\n                        {props.sideMenuSlot}\n                    </div>\n                    <div className=\"Grid-cell Grid-cell--grownWidth u-block\">\n                        <SkipLinkTarget id=\"pageContent\">{props.children}</SkipLinkTarget>\n                    </div>\n                </div>\n            ) : (\n                <div id={`LayoutContent_${props.id}`} className={props.topMargin}>\n                    {props.children}\n                </div>\n            )}\n        </>\n    );\n};\n\nexport default MainPageLayout;\n","import type { FC } from 'react';\nimport Helmet from 'react-helmet';\n\nimport { isProductionEnvironment } from '../../../../../utility/environments';\nimport useDocumentHeadIsPreparedForReactHelmet from '../../../hooks/useDocumentHeadIsPreparedForReactHelmet';\nimport { getCanonical, getNextPage, getPrevPage } from '../../../utils/metaUtils';\nimport type { PageHeadData, PageHeadPagination } from './PageHead.types';\n\ninterface PageHeadProps {\n    data: PageHeadData;\n    pagination?: PageHeadPagination;\n}\n\nconst PageHead: FC<React.PropsWithChildren<PageHeadProps>> = (props) => {\n    const link = { ...props.data.link };\n    const meta = { ...props.data.meta };\n\n    if (link && link.canonical) {\n        link.canonical = getCanonical({\n            path: link.canonical,\n            page: props.pagination?.currentPage,\n        });\n    }\n\n    let hasPrevPage = false;\n    let hasNextPage = false;\n\n    if (props.pagination) {\n        hasPrevPage = props.pagination.currentPage !== 1;\n        if (props.pagination.totalItems) {\n            hasNextPage =\n                props.pagination.pageSize * props.pagination.currentPage <=\n                props.pagination.totalItems;\n        }\n    }\n\n    if (hasPrevPage && link && props.pagination) {\n        link.prevPage = getPrevPage(props.pagination.currentPage);\n    }\n\n    if (hasNextPage && link && props.pagination) {\n        link.nextPage = getNextPage(props.pagination.currentPage);\n    }\n\n    const linkData =\n        link &&\n        Object.entries(link).filter(\n            (item) => item[1] !== '' && item[1] !== undefined && item[1] !== null,\n        );\n\n    const metaData =\n        meta &&\n        Object.entries(meta).filter(\n            (item) => item[1] !== '' && item[1] !== undefined && item[1] !== null,\n        );\n\n    let options: Parameters<typeof useDocumentHeadIsPreparedForReactHelmet>[0] = {\n        link: linkData?.map(([key]) => ({ property: 'rel', value: key })),\n    };\n\n    if (metaData) {\n        options = {\n            ...options,\n            meta: metaData.map(([key]) => ({ property: 'name', value: key })),\n        };\n    }\n\n    const isDocumentHeadReadyForReactHelmet = useDocumentHeadIsPreparedForReactHelmet(options);\n\n    return (\n        // eslint-disable-next-line react/jsx-no-useless-fragment\n        <>\n            {isDocumentHeadReadyForReactHelmet && (\n                <Helmet>\n                    {props.data.title && (\n                        <title>\n                            {props.data.title +\n                                (!isProductionEnvironment ? ' - NOT FOR COMMERCIAL USE' : '')}\n                        </title>\n                    )}\n                    {metaData?.map(([property, value]) => (\n                        <meta key={property} name={property} content={value} />\n                    ))}\n\n                    {linkData?.map(([property, value]) => (\n                        <link key={property} rel={property} href={value} />\n                    ))}\n\n                    {props.children}\n                </Helmet>\n            )}\n        </>\n    );\n};\n\nexport default PageHead;\n","const defaultQueryKeys = ['page'];\n\n/**\n * Filter current query string to only contain certain keys that are relevant for GA's virtual page view\n * @param queryString The complete query string of a location\n * @param keys List of allowed query string keys\n */\nexport const getFilteredQueryStringForVirtualPageView = (\n    queryString: string,\n    keys: string[] = [],\n) => {\n    const triggerKeys = [...defaultQueryKeys, ...keys];\n\n    const searchParams = new URLSearchParams(queryString);\n\n    const filteredSearchParams = Array.from(searchParams.entries())\n        .filter(([key]) => triggerKeys.includes(key))\n        .reduce((acc, [key, value]) => {\n            acc.set(key, value.toString());\n            return acc;\n        }, new URLSearchParams());\n\n    return filteredSearchParams.toString();\n};\n","import { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { useSavedInRef } from '../../../hooks/useSavedInRef';\nimport { useAppDispatch } from '../../../hooks/useThunkDispatch';\nimport { currentPageActions } from '../../../store/slices/currentPage/currentPageSlice';\nimport { getFilteredQueryStringForVirtualPageView } from './PageProperties.utils';\n\ninterface GaVirtualPageParams {\n    pageTitle: string;\n    canonicalUrl?: string;\n    pageTypeName?: string;\n    /**\n     * Used to specify what key must have been changed in URL's query string to trigger Virtual Page View\n     * By defualt, pagination's \"page\" is always a trigger, rest of the triggers are set on page-to-page basis\n     */\n    queryStringTriggers?: string[];\n}\n\nexport const useGaVirtualPageView = (options?: GaVirtualPageParams) => {\n    const { search } = useLocation();\n    const dispatch = useAppDispatch();\n\n    const canonicalUrl =\n        options &&\n        options.canonicalUrl &&\n        new URL(options.canonicalUrl, window.location.origin).toString();\n\n    // used only in dependency array to trigger effect\n    const triggerString = getFilteredQueryStringForVirtualPageView(\n        search,\n        (options && options.queryStringTriggers) || [],\n    );\n\n    const enable = !!options;\n\n    const sendEvent = useSavedInRef(() => {\n        if (canonicalUrl) {\n            dispatch(\n                currentPageActions.setPageGaData({\n                    canonicalUrl,\n                    gaPageTypeName: options && options.pageTypeName,\n                    title: options && options.pageTitle,\n                    queryString: window.location.search,\n                }),\n            );\n        }\n    });\n\n    useEffect(() => {\n        if (enable && canonicalUrl) {\n            sendEvent.current();\n        }\n    }, [dispatch, enable, canonicalUrl, triggerString, sendEvent]);\n\n    return {\n        sendEvent,\n    };\n};\n","import { type FC, useEffect } from 'react';\n\nimport { useAppDispatch } from '../../../hooks/useThunkDispatch';\nimport { currentPageActions } from '../../../store/slices/currentPage/currentPageSlice';\nimport type { PageHeadData, PageHeadPagination } from '../../atoms/PageHead';\nimport PageHead from '../../atoms/PageHead';\nimport { useGaVirtualPageView } from './PageProperties.hooks';\n\ninterface PagePropertiesProps {\n    headData: PageHeadData;\n    headPagination?: PageHeadPagination;\n    pageTypeNameForAnalytics?: string;\n\n    /** @see useGaVirtualPageView comments */\n    virtualPageViewQueryStringTriggers?: string[];\n}\n\nconst PageProperties: FC<React.PropsWithChildren<PagePropertiesProps>> = (props) => {\n    useGaVirtualPageView({\n        canonicalUrl: props.headData.link?.canonical,\n        pageTitle: props.headData.title,\n        pageTypeName: props.pageTypeNameForAnalytics,\n        queryStringTriggers: props.virtualPageViewQueryStringTriggers,\n    });\n\n    const dispatch = useAppDispatch();\n    useEffect(() => {\n        dispatch(currentPageActions.setTitle(props.headData.title));\n    }, [dispatch, props.headData.title]);\n\n    return <PageHead data={props.headData} pagination={props.headPagination} />;\n};\n\nexport default PageProperties;\n","// extracted by mini-css-extract-plugin\nexport default {\"SideMenu\":\"qFbjensz\",\"Item\":\"KjcKmlNH\",\"Content\":\"LfnZpaCS\",\"Sub\":\"kJ1tt61g\",\"SubItem\":\"O7J2dMg2\",\"Trigger\":\"h8Sht4dF\",\"Chevron\":\"XZkrc9mW\",\"Link\":\"FJPk6w0B\",\"Active\":\"SIHshF8o\",\"Empty\":\"F_G33wow\"};","/* eslint-disable unused-imports/no-unused-vars */\nimport { Accordion } from '@coop/components';\nimport classnames from 'classnames';\nimport type { FC } from 'react';\nimport * as React from 'react';\n\nimport { type MenuKey, type MenuNode, type MenuNodeType } from '../../../hooks/useMenuState';\nimport { isAriaCurrentPage } from '../../../utils/accessibilityUtils';\nimport styles from './SideMenu.module.less';\nimport type { ChildrenRenderBehavior } from './SideMenu.types';\n\ninterface MenuItemProps {\n    currentPath: string;\n    activeNodesTrail: MenuKey[];\n    expandedNodesTrail: MenuKey[];\n    onExpandClick: (\n        e: React.MouseEvent<HTMLElement>,\n        id: MenuKey,\n        parentId: MenuKey | undefined,\n        level: number,\n        hasChildren: boolean,\n        type: MenuNodeType,\n        name: string | null,\n    ) => void;\n    onLinkClick: (\n        e: React.MouseEvent<HTMLAnchorElement>,\n        url: string,\n        id: MenuKey,\n        parentId: MenuKey | undefined,\n        hasChildren: boolean,\n        type: MenuNodeType,\n        name: string | null,\n    ) => void;\n    parentId?: MenuKey;\n    level: number;\n    childrenRenderBehavior: ChildrenRenderBehavior;\n}\n\n// Wrapper component to remove some of accordion controls when Accordion item is a link\nconst Link = React.forwardRef<HTMLAnchorElement, React.ComponentPropsWithoutRef<'a'>>(\n    (props, ref) => {\n        const {\n            'aria-expanded': ariaExpanded,\n            'aria-controls': ariaControls,\n            type,\n            ...rest\n        } = props;\n\n        return (\n            // eslint-disable-next-line react/jsx-props-no-spreading\n            <a {...rest} ref={ref}>\n                {props.children}\n            </a>\n        );\n    },\n);\n\nconst SideMenuItem: FC<React.PropsWithChildren<MenuNode & MenuItemProps>> = ({\n    currentPath,\n    id,\n    url,\n    name,\n    onExpandClick,\n    onLinkClick,\n    nodes,\n    activeNodesTrail,\n    expandedNodesTrail,\n    parentId,\n    level,\n    type,\n    childrenRenderBehavior,\n}) => {\n    const hasChildren = !!nodes?.length;\n    const expandedNodeId = nodes.find((node) => expandedNodesTrail.includes(node.id))?.id as\n        | string\n        | undefined;\n\n    const active = activeNodesTrail[activeNodesTrail.length - 1] === id;\n    const ariaCurrentPage = active && isAriaCurrentPage(url || '', currentPath);\n\n    return (\n        <Accordion.Item value={id as string} asChild>\n            <li className={classnames(styles.Item, level > 1 && styles.SubItem)}>\n                <Accordion.Header asChild>\n                    {hasChildren ? (\n                        <Accordion.Trigger\n                            onClick={(e) =>\n                                onExpandClick(e, id, parentId, level, hasChildren, type, name)\n                            }\n                            className={classnames(styles.Trigger)}\n                            iconClassName={styles.Chevron}\n                        >\n                            <span>{name}</span>\n                        </Accordion.Trigger>\n                    ) : (\n                        <Accordion.Trigger asChild withChevron={false}>\n                            <Link\n                                href={url}\n                                className={classnames(\n                                    styles.Trigger,\n                                    styles.Link,\n                                    active && styles.Active,\n                                )}\n                                onClick={(e) => {\n                                    onLinkClick(e, url!, id, parentId, hasChildren, type, name);\n                                }}\n                                aria-current={ariaCurrentPage}\n                            >\n                                <span>{name}</span>\n                            </Link>\n                        </Accordion.Trigger>\n                    )}\n                </Accordion.Header>\n\n                {hasChildren && (\n                    <Accordion.Content\n                        className={classnames(styles.Content, level >= 2 && styles.Sub)}\n                    >\n                        <Accordion.Root collapsible type=\"single\" asChild value={expandedNodeId}>\n                            <ul>\n                                {/* repeated node to be able to go to it as link */}\n                                <Accordion.Item value={`${id}_repeated`} asChild>\n                                    <li\n                                        className={classnames(\n                                            styles.Item,\n                                            level + 1 > 1 && styles.SubItem,\n                                        )}\n                                    >\n                                        <Accordion.Header asChild>\n                                            <Accordion.Trigger asChild withChevron={false}>\n                                                <Link\n                                                    href={url}\n                                                    className={classnames(\n                                                        styles.Trigger,\n                                                        styles.Link,\n                                                        active && styles.Active,\n                                                    )}\n                                                    onClick={(e) => {\n                                                        onLinkClick(\n                                                            e,\n                                                            url!,\n                                                            id,\n                                                            parentId,\n                                                            hasChildren,\n                                                            type,\n                                                            name,\n                                                        );\n                                                    }}\n                                                    aria-current={ariaCurrentPage}\n                                                >\n                                                    <span>{name}</span>\n                                                </Link>\n                                            </Accordion.Trigger>\n                                        </Accordion.Header>\n                                    </li>\n                                </Accordion.Item>\n                                {nodes?.map((item) => (\n                                    <SideMenuItem\n                                        currentPath={currentPath}\n                                        key={item.id}\n                                        id={item.id}\n                                        name={item.name}\n                                        url={item.url}\n                                        segmentUrl={item.segmentUrl}\n                                        onExpandClick={onExpandClick}\n                                        onLinkClick={onLinkClick}\n                                        ancestors={item.ancestors}\n                                        nodes={item.nodes}\n                                        activeNodesTrail={activeNodesTrail}\n                                        expandedNodesTrail={expandedNodesTrail}\n                                        parentId={id}\n                                        level={level + 1}\n                                        type={item.type}\n                                        childrenRenderBehavior={childrenRenderBehavior}\n                                    />\n                                ))}\n                            </ul>\n                        </Accordion.Root>\n                    </Accordion.Content>\n                )}\n            </li>\n        </Accordion.Item>\n    );\n};\n\nexport default SideMenuItem;\n","import { Accordion } from '@coop/components';\nimport type { FC } from 'react';\n\nimport type { MenuKey, MenuNode, MenuNodeType } from '../../../hooks/useMenuState';\nimport styles from './SideMenu.module.less';\nimport type { ChildrenRenderBehavior } from './SideMenu.types';\nimport SideMenuItem from './SideMenuItem';\n\ninterface MenuProps {\n    currentPath: string;\n    label: string;\n    rootNode: MenuNode;\n    activeNodesTrail: MenuKey[];\n    expandedNodesTrail: MenuKey[];\n    onLinkClick: (\n        e: React.MouseEvent<HTMLAnchorElement>,\n        url: string,\n        id: MenuKey,\n        parentId: MenuKey | undefined,\n        hasChildren: boolean,\n        type: MenuNodeType,\n        name: string | null,\n    ) => void;\n    onExpandClick: (\n        e: React.MouseEvent<HTMLElement>,\n        id: MenuKey,\n        parentId: MenuKey | undefined,\n        level: number,\n        hasChildren: boolean,\n        type: MenuNodeType,\n        name: string | null,\n    ) => void;\n    childrenRenderBehavior?: ChildrenRenderBehavior;\n}\n\nconst SideMenu: FC<React.PropsWithChildren<MenuProps>> = ({\n    currentPath,\n    label,\n    rootNode,\n    activeNodesTrail,\n    expandedNodesTrail,\n    onLinkClick,\n    onExpandClick,\n    children,\n    childrenRenderBehavior = 'onExpand',\n}) => {\n    const expandedNodeId = rootNode?.nodes.find((node) => expandedNodesTrail.includes(node.id))\n        ?.id as string | undefined;\n\n    return (\n        <nav className={styles.SideMenu} aria-label={label}>\n            <Accordion.Root collapsible type=\"single\" asChild value={expandedNodeId}>\n                <ul>\n                    {rootNode?.nodes?.map((node) => (\n                        <SideMenuItem\n                            currentPath={currentPath}\n                            key={node.id}\n                            id={node.id}\n                            url={node.url}\n                            segmentUrl={node.segmentUrl}\n                            name={node.name}\n                            onExpandClick={onExpandClick}\n                            onLinkClick={onLinkClick}\n                            ancestors={node.ancestors}\n                            nodes={node.nodes}\n                            activeNodesTrail={activeNodesTrail}\n                            expandedNodesTrail={expandedNodesTrail}\n                            level={1}\n                            type={node.type}\n                            childrenRenderBehavior={childrenRenderBehavior}\n                        />\n                    ))}\n                    {children}\n                </ul>\n            </Accordion.Root>\n        </nav>\n    );\n};\n\nexport default SideMenu;\n","import type { FC } from 'react';\nimport { useEffect } from 'react';\n\nimport { BrowserSize } from '../../../../../utility/browser';\nimport { SkipLink, SkipLinkLayout } from '../../../../base/components/SkipLink';\nimport { useCurrentEpiPage } from '../../../../episerver/components/hooks/useCurrentEpiPage';\nimport type { MenuKey, MenuNode, MenuNodeType } from '../../../hooks/useMenuState';\nimport useMenuState from '../../../hooks/useMenuState';\nimport { ga4NavigationTracking } from '../../../tracking/ga4/navigation';\nimport tracking from '../../../tracking/tracking';\nimport { safeSplit } from '../../../utils/stringUtils';\nimport { useFromBrowserMediaQuery } from '../../atoms/ResponsiveBreakpoints';\nimport SideMenu from '../../molecules/SideMenu/SideMenu';\n\ninterface SideBarMenuProps {\n    menu: MenuNode | null;\n    menuLoadError: boolean;\n    menuLoadErrorMessage: string;\n}\n\n// its up to the rendering page to setup correct menu roots and current page, since we have pages that have different picking logic for menu root, ex: article pages vs brand pages\nconst SideBarMenu: FC<SideBarMenuProps> = (props) => {\n    const isFromLarge = useFromBrowserMediaQuery(BrowserSize.lg);\n\n    const {\n        activeNodesTrail,\n        expandedNodesTrail,\n        toggleExpandedNode,\n        setActiveNodesTrailByUrlSegments,\n        setExpandedNodesTrailByUrlSegments,\n    } = useMenuState(props.menu || undefined);\n\n    // temporary to see errors from backend\n    useEffect(() => {\n        if (props.menuLoadError) {\n            // eslint-disable-next-line no-console\n            console.error(props.menuLoadErrorMessage);\n        }\n    }, [props.menuLoadError, props.menuLoadErrorMessage]);\n\n    const currentPage = useCurrentEpiPage();\n    const epiPageUrl = currentPage.data?.url;\n\n    useEffect(() => {\n        if (epiPageUrl) {\n            const urlSegments = safeSplit(epiPageUrl, '/', { removeEmptyEntries: true });\n            setExpandedNodesTrailByUrlSegments(urlSegments);\n            setActiveNodesTrailByUrlSegments(urlSegments);\n        }\n    }, [\n        props.menu,\n        epiPageUrl,\n        setExpandedNodesTrailByUrlSegments,\n        setActiveNodesTrailByUrlSegments,\n    ]);\n\n    const onLinkClick = (\n        e: React.MouseEvent<HTMLAnchorElement>,\n        url: string,\n        id: MenuKey,\n        parentId: MenuKey | undefined,\n        hasChildren: boolean,\n        type: MenuNodeType,\n        name: string | null,\n    ) => {\n        if (props.menu) {\n            ga4NavigationTracking.sideMenu.click(name || '', e.currentTarget.href);\n\n            tracking.common.interaction.clickWithCustomerSegment({\n                eventCategory: props.menu.name || '',\n                eventAction: 'Sidnavigering',\n                eventLabel: name || '',\n            });\n        }\n    };\n\n    const onExpandClick = (\n        e: React.MouseEvent<HTMLElement>,\n        id: MenuKey,\n        parentId: MenuKey | undefined,\n        level: number,\n        hasChildren: boolean,\n        type: MenuNodeType,\n        name: string | null,\n    ) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        if (props.menu) {\n            const eventLabel =\n                (expandedNodesTrail.includes(id) ? `${name} - Stäng flik` : name) || '';\n\n            tracking.common.interaction.clickWithCustomerSegment({\n                eventCategory: props.menu.name || '',\n                eventAction: 'Sidnavigering',\n                eventLabel,\n            });\n        }\n\n        toggleExpandedNode(id, parentId);\n    };\n\n    if (!props.menu) {\n        return null;\n    }\n\n    return (\n        isFromLarge && (\n            <SkipLinkLayout\n                skipTriggerSlot={\n                    <SkipLink href=\"#pageContent\" align=\"center\">\n                        Hoppa över kategorier\n                    </SkipLink>\n                }\n            >\n                <SideMenu\n                    currentPath={epiPageUrl || ''}\n                    label=\"Kategorier\"\n                    activeNodesTrail={activeNodesTrail}\n                    expandedNodesTrail={expandedNodesTrail}\n                    rootNode={props.menu}\n                    onLinkClick={onLinkClick}\n                    onExpandClick={onExpandClick}\n                    childrenRenderBehavior=\"always\"\n                />\n            </SkipLinkLayout>\n        )\n    );\n};\n\nexport default SideBarMenu;\n","import type { FC } from 'react';\n\nimport SideBarMenu from './SideBarMenu';\nimport { useSideBarMenuQuery } from './SideBarMenu.hooks';\n\ninterface SideBarMenuLoaderProps {\n    menuPageContentId: number;\n}\n\nconst SideBarMenuLoader: FC<SideBarMenuLoaderProps> = (props) => {\n    const { data: menu, error } = useSideBarMenuQuery(props.menuPageContentId.toString());\n\n    if (!menu) return null;\n\n    return (\n        <SideBarMenu\n            menu={menu}\n            menuLoadError={!!error}\n            menuLoadErrorMessage={`SideBarNav get menu error, menu Root: ${props.menuPageContentId}`}\n        />\n    );\n};\n\nexport default SideBarMenuLoader;\n","import { useQuery } from '@tanstack/react-query';\n\nimport { contentDeliveryApi } from '../../../../episerver/api/contentDeliveryApi';\nimport { sideBarMenuQueryKeys } from './SideBarMenu.utils';\n\nexport const useSideBarMenuQuery = (menuPageContentId: string) => {\n    const query = useQuery({\n        queryKey: sideBarMenuQueryKeys.pageMenuByContentId(menuPageContentId),\n        queryFn: () => contentDeliveryApi.getMenu(menuPageContentId.toString(), 3, false),\n    });\n\n    return query;\n};\n","export const sideBarMenuQueryKeys = {\n    pageMenuByContentId: (contentId: string) => ['PageMenuByContentId', contentId],\n};\n","import { useEffect, useState } from 'react';\n\ninterface ElementsToUpdate {\n    [tag: string]: { property: string; value: string }[];\n}\n\n/**\n * React helmet only handles elements inside the head tag that contain data-react-helmet=\"true\"\n */\nconst useDocumentHeadIsPreparedForReactHelmet = (elementsToUpdateByTag: ElementsToUpdate) => {\n    const [readyForReactHelmet, setReadyForReactHelmet] = useState(false);\n\n    const stringifiedElements = JSON.stringify(elementsToUpdateByTag);\n\n    useEffect(() => {\n        const parsedElementsToUpdateByTag = JSON.parse(stringifiedElements) as ElementsToUpdate;\n        if (parsedElementsToUpdateByTag) {\n            const childrenOfHead = Array.from(document.getElementsByTagName('head')[0].children);\n\n            childrenOfHead.forEach((child) => {\n                const tagName = child?.tagName?.toLowerCase();\n\n                parsedElementsToUpdateByTag[tagName]?.forEach((tagEl) => {\n                    if (child.getAttribute(tagEl.property) === tagEl.value) {\n                        child.setAttribute('data-react-helmet', 'true');\n                    }\n                });\n            });\n\n            setReadyForReactHelmet(true);\n        }\n    }, [stringifiedElements]);\n\n    return readyForReactHelmet;\n};\n\nexport default useDocumentHeadIsPreparedForReactHelmet;\n","import { useCallback, useMemo, useState } from 'react';\n\nexport type MenuKey = string | number;\n\nexport type MenuNodeType = 'Link' | 'Shortcut' | 'Container';\n\nexport interface MenuNode {\n    id: MenuKey;\n    parentId?: MenuKey;\n    name: string;\n    url: string | undefined;\n    segmentUrl: string | undefined;\n    ancestors: MenuNode[];\n    nodes: MenuNode[];\n    type: MenuNodeType;\n}\n\nconst toggle = (expanded: MenuKey[], toExpandId: MenuKey, parentId: MenuKey | undefined) => {\n    let removalCount = expanded.length;\n    for (let i = expanded.length - 1; i >= 0; i -= 1) {\n        // if previous is a parent for current expand, just expand yourself\n        if (expanded[i] === parentId) {\n            const prevExpands = expanded.slice(0, removalCount);\n            return [...prevExpands, toExpandId];\n        }\n\n        // if previous is the same for current expand, remove expand\n        if (expanded[i] === toExpandId) {\n            return expanded.slice(0, i);\n        }\n\n        // if previous is not a parent for current expand, that means we have expanded something from above, set index and check another previous\n        removalCount = i;\n    }\n\n    return [...expanded.slice(0, removalCount), toExpandId];\n};\n\nconst getNodesTrailById = (\n    rootNode: MenuNode | null,\n    toExpandId: MenuKey,\n    trail: MenuKey[] = [],\n): MenuKey[] => {\n    if (!rootNode) {\n        return [];\n    }\n\n    const nodes = rootNode?.nodes || [];\n\n    if (rootNode.id === toExpandId) {\n        return [...trail, toExpandId];\n    }\n\n    let expanded: MenuKey[] = [];\n    for (let i = 0; expanded.length === 0 && i < nodes.length; i += 1) {\n        expanded = getNodesTrailById(nodes[i], toExpandId, [...trail, rootNode.id]);\n    }\n    return expanded;\n};\n\nconst resolveNodeTrailByUrlSegments = (\n    node: MenuNode,\n    urlSegments: string[],\n    idTrail: MenuKey[],\n    // strict matching type ensures that the match of segments is exact from top to bottom, used for fully loaded menus that may include the same segments several times inside different nodes.\n    // lenient just traverses down the line while not ensuring the parents paths are correct, needed for partial menus like global menu\n    matchingType: 'strict' | 'lenient',\n) => {\n    if (!node || !urlSegments?.length) {\n        return;\n    }\n\n    const segments = [...urlSegments];\n\n    if (\n        matchingType === 'strict' &&\n        node.segmentUrl?.toLocaleLowerCase() !== segments[0].toLocaleLowerCase()\n    ) {\n        return;\n    }\n\n    for (let i = 0; i < segments.length; i += 1) {\n        if (node.segmentUrl?.toLocaleLowerCase() === segments[i]?.toLocaleLowerCase()) {\n            idTrail.push(node.id);\n            segments.splice(i, 1);\n        }\n    }\n\n    if (segments.length) {\n        node.nodes.forEach((x) =>\n            resolveNodeTrailByUrlSegments(x, segments, idTrail, matchingType),\n        );\n    }\n};\n\nconst traverseAndMap = (node: MenuNode, map: Map<MenuKey, MenuNode>) => {\n    // Add the current node to the map\n    map.set(node.id, node);\n\n    // Recursively call this function for each child node\n    node.nodes.forEach((_node) => traverseAndMap(_node, map));\n};\n\nexport const createNodeMap = (root: MenuNode) => {\n    const map = new Map<MenuKey, MenuNode>();\n    traverseAndMap(root, map);\n    return map;\n};\n\nconst getNodesTrailByUrlSegments = (\n    rootNode: MenuNode | null,\n    urlSegments: string[],\n    matchingType: 'strict' | 'lenient' = 'lenient',\n) => {\n    if (!rootNode) return [];\n\n    const idTrail: number[] = [];\n    resolveNodeTrailByUrlSegments(rootNode, urlSegments, idTrail, matchingType);\n    return idTrail;\n};\n\nconst useMenuState = (rootMenuNode: MenuNode | undefined) => {\n    const [expandedNodesTrail, setExpandedNodesTrail] = useState<MenuKey[]>([]);\n    const [activeNodesTrail, setActiveNodesTrail] = useState<MenuKey[]>([]);\n\n    const setExpandedNodesTrailById = useCallback(\n        (activeId: MenuKey) => {\n            if (rootMenuNode) {\n                setExpandedNodesTrail(getNodesTrailById(rootMenuNode, activeId));\n            }\n        },\n        [rootMenuNode],\n    );\n\n    const setActiveNodesTrailById = useCallback(\n        (activeId: MenuKey) => {\n            if (rootMenuNode) {\n                setActiveNodesTrail(getNodesTrailById(rootMenuNode, activeId));\n            }\n        },\n        [rootMenuNode],\n    );\n\n    const setExpandedNodesTrailByUrlSegments = useCallback(\n        (_urlSegments: string[], matchingType: 'strict' | 'lenient' = 'lenient') => {\n            if (rootMenuNode) {\n                setExpandedNodesTrail(\n                    getNodesTrailByUrlSegments(rootMenuNode, _urlSegments, matchingType),\n                );\n            }\n        },\n        [rootMenuNode],\n    );\n\n    const setActiveNodesTrailByUrlSegments = useCallback(\n        (_urlSegments: string[], matchingType: 'strict' | 'lenient' = 'lenient') => {\n            if (rootMenuNode) {\n                setActiveNodesTrail(\n                    getNodesTrailByUrlSegments(rootMenuNode, _urlSegments, matchingType),\n                );\n            }\n        },\n        [rootMenuNode],\n    );\n\n    const toggleExpandedNode = useCallback((id: MenuKey, parentId: MenuKey | undefined) => {\n        setExpandedNodesTrail((activeNodeId) => toggle(activeNodeId, id, parentId));\n    }, []);\n\n    const nodeMap = useMemo(() => {\n        if (rootMenuNode) {\n            return createNodeMap(rootMenuNode);\n        }\n\n        return new Map<MenuKey, MenuNode>();\n    }, [rootMenuNode]);\n\n    return {\n        nodeMap,\n        activeNodesTrail,\n        expandedNodesTrail,\n        toggleExpandedNode,\n        setExpandedNodesTrailById,\n        setActiveNodesTrailById,\n        setExpandedNodesTrailByUrlSegments,\n        setActiveNodesTrailByUrlSegments,\n    };\n};\n\nexport default useMenuState;\n","import { useLayoutEffect, useRef } from 'react';\n\nexport const useSavedInRef = <T>(value: T) => {\n    const ref = useRef<T>(value);\n\n    useLayoutEffect(() => {\n        ref.current = value;\n    });\n\n    return ref;\n};\n","import { addQueryParamsToUrl } from './urlUtils';\n\nexport const getRobotsContent = (noIndex?: boolean, noFollow?: boolean) => {\n    if (noIndex && noFollow) {\n        return 'NOINDEX,NOFOLLOW';\n    }\n\n    if (noIndex) {\n        return 'NOINDEX';\n    }\n\n    if (noFollow) {\n        return 'NOFOLLOW';\n    }\n\n    return undefined;\n};\n\nexport const getCanonical = ({ path, page }: { path: string; page?: number }) => {\n    const url = new URL(path, window.location.origin).toString();\n\n    return Number.isInteger(page) && page !== 1\n        ? addQueryParamsToUrl(url, { page: String(page) })\n        : url;\n};\n\nexport const getNextPage = (currentPage: number) => {\n    const searchParams = new URLSearchParams();\n    searchParams.set('page', (currentPage + 1).toString());\n\n    const newUrl = `${\n        window.location.origin + window.location.pathname\n    }?${searchParams.toString()}`;\n\n    return newUrl;\n};\n\nexport const getPrevPage = (currentPage: number) => {\n    const searchParams = new URLSearchParams();\n    const prevPage = currentPage - 1;\n    if (prevPage > 1) {\n        searchParams.set('page', prevPage.toString());\n    } else {\n        searchParams.delete('page');\n    }\n    const stringifiedParams = searchParams.toString();\n\n    const newUrl =\n        window.location.origin +\n        window.location.pathname +\n        (stringifiedParams ? `?${searchParams.toString()}` : '');\n\n    return newUrl;\n};\n"],"names":["MainPageLayoutContext","undefined","LayoutHero","props","id","className","edgeToEdge","bleedViewport","topMargin","disablePaddingOnMobile","children","LayoutContent","subHeroSlot","sideMenuSlot","SkipLink","hasSideBar","state","ui","shared","parentContext","thisContext","isInsideAnotherLayout","Provider","value","heroSlot","heroBleedViewport","heroEdgeToEdge","link","data","meta","canonical","path","page","pagination","currentPage","hasPrevPage","hasNextPage","totalItems","pageSize","prevPage","nextPage","linkData","Object","entries","filter","item","metaData","options","map","key","property","isDocumentHeadReadyForReactHelmet","useDocumentHeadIsPreparedForReactHelmet","Helmet","title","name","content","rel","href","defaultQueryKeys","useGaVirtualPageView","search","dispatch","canonicalUrl","URL","window","location","origin","toString","triggerString","queryString","keys","triggerKeys","searchParams","URLSearchParams","Array","from","includes","reduce","acc","set","getFilteredQueryStringForVirtualPageView","queryStringTriggers","enable","sendEvent","useSavedInRef","c","setPageGaData","gaPageTypeName","pageTypeName","pageTitle","useEffect","current","headData","pageTypeNameForAnalytics","virtualPageViewQueryStringTriggers","setTitle","headPagination","Link","ref","ariaExpanded","ariaControls","type","rest","SideMenuItem","currentPath","url","onExpandClick","onLinkClick","nodes","activeNodesTrail","expandedNodesTrail","parentId","level","childrenRenderBehavior","hasChildren","length","expandedNodeId","find","node","active","ariaCurrentPage","Accordion","A","Item","asChild","Header","Trigger","onClick","e","iconClassName","withChevron","Content","Root","collapsible","segmentUrl","ancestors","label","rootNode","isFromLarge","lg","toggleExpandedNode","setActiveNodesTrailByUrlSegments","setExpandedNodesTrailByUrlSegments","menu","menuLoadError","console","error","menuLoadErrorMessage","epiPageUrl","urlSegments","removeEmptyEntries","skipTriggerSlot","align","sideMenu","click","currentTarget","common","interaction","clickWithCustomerSegment","eventCategory","eventAction","eventLabel","preventDefault","stopPropagation","menuPageContentId","useQuery","queryKey","contentId","queryFn","contentDeliveryApi","getMenu","SideBarMenu","elementsToUpdateByTag","readyForReactHelmet","setReadyForReactHelmet","useState","stringifiedElements","JSON","stringify","parsedElementsToUpdateByTag","parse","document","getElementsByTagName","forEach","child","tagName","toLowerCase","tagEl","getAttribute","setAttribute","getNodesTrailById","toExpandId","trail","expanded","i","resolveNodeTrailByUrlSegments","idTrail","matchingType","segments","toLocaleLowerCase","push","splice","x","traverseAndMap","_node","getNodesTrailByUrlSegments","rootMenuNode","setExpandedNodesTrail","setActiveNodesTrail","setExpandedNodesTrailById","useCallback","activeId","setActiveNodesTrailById","_urlSegments","activeNodeId","removalCount","slice","toggle","nodeMap","useMemo","root","Map","createNodeMap","useRef","useLayoutEffect","getRobotsContent","noIndex","noFollow","getCanonical","Number","isInteger","String","getNextPage","pathname","getPrevPage","delete","stringifiedParams"],"sourceRoot":""}