{"version":3,"file":"StudyPortfolioSectionBlock.chunk.06751940d9cd74bc7747.js","mappings":"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","sources":["webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/PortfolioCallToAction/PortfolioCallToAction.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/PortfolioCallToAction/PortfolioCallToAction.module.css?8e13","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/PortfolioItem/PortfolioItemInfo/PortfolioItemInfo.module.css?a1bc","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/PortfolioItem/PortfolioItemInfo/PortfolioItemInfo.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/PortfolioItem/PortfolioItem.module.css?1f6b","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/PortfolioItem/Utils/portfolioItemsUtils.ts","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/PortfolioItem/PortfolioItem.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/StudyPortfolioSection.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/StudyPortfolioSection.module.css?800b","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyPortfolioSection/StudyPortfolioSection.items.module.css?9c74","webpack://Kristiania.Web/./Features/Blocks/StudyPortfolioSectionBlock/ViewModel/PortfolioItemType.csharp.ts","webpack://Kristiania.Web/./Features/Blocks/StudyPortfolioSectionBlock/View/Utils/PortfolioItemsUtils.ts","webpack://Kristiania.Web/./Features/Blocks/StudyPortfolioSectionBlock/View/StudyPortfolioSectionBlock.tsx","webpack://Kristiania.Web/./Features/Layouts/Components/PageSection/PageSection.tsx","webpack://Kristiania.Web/./Features/Layouts/Components/PageSection/PageSection.module.css?557e","webpack://Kristiania.Web/./Features/Layouts/Components/PageSectionHeading/PageSectionHeading.tsx","webpack://Kristiania.Web/./Features/Layouts/Components/PageSectionHeading/PageSectionHeading.module.css?ed34","webpack://Kristiania.Web/./Features/Utils/MouseButton.ts","webpack://Kristiania.Web/./Features/Utils/Hooks/useClickProxyAllowingTextSelection.ts"],"sourcesContent":["import classNames from 'classnames';\nimport * as React from 'react';\nimport type { PortfolioTheme } from '../PortfolioItem/types';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport { ButtonSize } from '~/Partials/Button/ButtonSize.csharp';\nimport { ButtonTier } from '~/Partials/Button/ButtonTier.csharp';\nimport { Link } from '~/Partials/Link/Link';\nimport { LinkType } from '~/Partials/Link/LinkType.csharp';\nimport type { LinkViewModel } from '~/Partials/Link/LinkViewModel.csharp';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport styles from './PortfolioCallToAction.module.css';\n\nexport interface PortfolioCallToActionProps {\n    callToActionLink: LinkViewModel;\n    description?: string;\n    theme?: PortfolioTheme;\n}\n\nexport const PortfolioCallToAction: React.FC<PortfolioCallToActionProps> = props => {\n    const contextualTheme = useTheme();\n    const { description, callToActionLink, theme = contextualTheme } = props;\n\n    const { withRoundedCorners } = theme;\n\n    return (\n        <div className={classNames(styles.PortfolioCallToAction, withRoundedCorners && styles['Variant--rounded'])}>\n            {description && <div className={styles.Description}>{description}</div>}\n            <Link\n                {...callToActionLink}\n                className={styles.Link}\n                type={LinkType.Button}\n                buttonTier={ButtonTier.Primary}\n                buttonSize={ButtonSize.ResponsiveFromSmallToMedium}\n                theme={theme}\n                showIsExternal={false}\n            >\n                <span>{callToActionLink.label}</span>\n                <SvgIcon iconName=\"arrow-right\" />\n            </Link>\n        </div>\n    );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"PortfolioCallToAction\":\"qYi24uBym7aZ9bV1Dw1c\",\"Description\":\"OLLGiGuxLc9wTqkMQPbL\",\"Link\":\"MRlQkiu1Mdteq_EefGH9\",\"Variant--rounded\":\"ZiV_pbi2dmr8WWmMB29l\"};","// extracted by mini-css-extract-plugin\nexport default {\"PortfolioItemInfo\":\"BNAfc54g0J03ydAhK9Tl\",\"Title\":\"y92h1QcKH9ifsM8elUj8\",\"Variant--visibleOnInteractOnly\":\"st07ccj5wNaeXB9Y4Dqw\",\"Link\":\"qZPLN8RAtOldsdgz0jVh\",\"VisibleOnInteractOnlyContainer\":\"HuwFiB0Vkd6mPM9EtyRn\",\"Caption\":\"nxEu0HPfJ4cq4HswfPLN\",\"IconWrapper\":\"KVcXmhm9VNM86o03E7VR\",\"Icon\":\"nf4v32IKEcrP1llPTS_m\",\"Orientation--vertical\":\"hvg8Co5pgJCzMwuorQ60\",\"Orientation--horizontal\":\"JBFSDJXW2ok2RfS0fEqa\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { LinkProps } from '~/Partials/Link/Link';\nimport { Link } from '~/Partials/Link/Link';\nimport { LinkType } from '~/Partials/Link/LinkType.csharp';\nimport type { IconName } from '~/Partials/SvgIcon/SvgIcon';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport styles from './PortfolioItemInfo.module.css';\n\nexport interface PortfolioItemInfoProps {\n    linkRef: React.RefObject<HTMLAnchorElement>;\n    title?: string;\n    link?: LinkProps;\n    visibleOnInteractOnly?: boolean;\n    caption?: string;\n    iconName?: IconName;\n    orientation?: 'vertical' | 'horizontal';\n}\n\nexport const PortfolioItemInfo: React.FC<PortfolioItemInfoProps> = props => {\n    const { title, linkRef, link, caption, iconName, visibleOnInteractOnly = false, orientation = 'vertical' } = props;\n\n    const getTitleElement = () => {\n        const titleText = title || (link && 'label' in link && link.label) || '';\n\n        if (titleText && link) {\n            return (\n                <Link ref={linkRef} {...link} showIsExternal={false} type={LinkType.Clear} className={styles.Link}>\n                    <div className={styles.Title}>{titleText}</div>\n                </Link>\n            );\n        }\n\n        if (titleText) {\n            return <div className={styles.Title}>{titleText}</div>;\n        }\n\n        return null;\n    };\n\n    const titleElement = getTitleElement();\n    const captionElement = caption ? <div className={styles.Caption}>{caption}</div> : null;\n    const iconElement = iconName ? <SvgIcon iconName={iconName} className={styles.Icon} /> : null;\n\n    const topClassName = classNames(\n        styles.PortfolioItemInfo,\n        styles[`Orientation--${orientation}`],\n        visibleOnInteractOnly && styles['Variant--visibleOnInteractOnly']\n    );\n\n    if (titleElement && captionElement && iconElement) {\n        return (\n            <div className={topClassName}>\n                {titleElement}\n                <div className={styles.IconWrapper}>\n                    {captionElement}\n                    {iconElement}\n                </div>\n            </div>\n        );\n    }\n\n    if (!iconElement) {\n        return (\n            <div className={topClassName}>\n                {titleElement}\n                {captionElement}\n            </div>\n        );\n    }\n\n    return (\n        <div className={topClassName}>\n            <div className={styles.IconWrapper}>\n                {titleElement || captionElement}\n                {iconElement}\n            </div>\n        </div>\n    );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"PortfolioItem\":\"cebw0X3OhBm1h7iQsiYf\",\"Info\":\"SkW9abafH6X8KqtaoReu\",\"Content\":\"sPTS1rMd8cfKEfPWR1Ls\",\"Overlay\":\"Pmg09aY_TfqRZuMur5zk\",\"Overlay--initialTransparent\":\"QJzMpJy28o1qXfXyEydw\",\"TypeIcon\":\"bb8Dm_nUe5QNENNcsbAA\",\"Variant--rounded\":\"vXp_Fkav2sqPTRRNnREp\",\"Variant--withLink\":\"BQNFUP7onZ3DlFRnNk81\",\"Variant--withOverlayAnimation\":\"mPz0mRIinDxP5lStpF2M\",\"Variant--1x1\":\"MptMwV7D4ebzTDX344jW\",\"Variant--2x3\":\"AHvdxAqrOEdY6oPXqEiQ\",\"Variant--3x2\":\"nVCNJ_7Vd2IBYiFJKg1X\",\"Variant--3x4\":\"xQxY95hx66ZQCnhSYnJt\",\"Variant--4x3\":\"jRAbYcc_Ca5ikHZ3X0gH\",\"Variant--9x16\":\"fXvSda0tOAJGVKHnjqOx\",\"Variant--16x9\":\"EsE9RThZNAFgiUOaDSqu\",\"Variant--red\":\"wMuS4HdNuokhPArBVgPC\",\"Variant--yellow\":\"JyoVoMKDeTAoce4TEAbA\",\"Variant--teal\":\"_TUh72FguMtNtuli4gA7\",\"Variant--steelblue\":\"qHJZe89E_acWHXtW2pIY\",\"Variant--white\":\"MFwJo9IABAtEGREXwGVu\",\"Variant--burgundy\":\"Vy0nMiUMerW2dtPDGg7N\"};","import type { PortfolioItemProps } from '../PortfolioItem';\nimport { assertNever } from '~/Partials/Utils/typeUtils';\n\nexport const getTypeIcon = (type: PortfolioItemProps['item']['type']) => {\n    switch (type) {\n        case 'audio':\n            return 'headphones';\n        case 'video':\n            return 'film';\n        case 'image':\n            return undefined;\n        default:\n            assertNever(type);\n    }\n};\n\nexport const getActionIcon = (type: PortfolioItemProps['item']['type']) => {\n    switch (type) {\n        case 'audio':\n        case 'video':\n            return 'play-circle';\n        case 'image':\n            return undefined;\n        default:\n            assertNever(type);\n    }\n};\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport { PortfolioItemInfo } from '~/Features/StudyPage/Campus/Sections/StudyPortfolioSection/PortfolioItem/PortfolioItemInfo/PortfolioItemInfo';\nimport type { AspectRatio } from '~/Partials/Picture/AspectRatios';\nimport { Picture } from '~/Partials/Picture/Picture';\nimport { PictureProfiles } from '~/Partials/Picture/PictureProfiles';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport { assertNever } from '~/Partials/Utils/typeUtils';\nimport { useClickProxyAllowingTextSelection } from '~/Utils/Hooks/useClickProxyAllowingTextSelection';\nimport styles from './PortfolioItem.module.css';\nimport itemStyles from './PortfolioItemInfo/PortfolioItemInfo.module.css';\nimport { getActionIcon, getTypeIcon } from './Utils/portfolioItemsUtils';\nimport type {\n    AudioPortfolioItem,\n    ImagePortfolioItem,\n    PortfolioBackground,\n    PortfolioTheme,\n    VideoPortfolioItem,\n} from './types';\n\nexport type PortfolioItemDetails = ImagePortfolioItem | VideoPortfolioItem | AudioPortfolioItem;\n\nexport interface PortfolioItemProps {\n    item: PortfolioItemDetails;\n    background: PortfolioBackground;\n    ratio: AspectRatio;\n    theme?: PortfolioTheme;\n}\n\nconst getOrientation = (ratio: AspectRatio) => {\n    switch (ratio) {\n        case '1x1':\n        case '2x3':\n        case '3x4':\n        case '9x16':\n            return 'vertical';\n        case '3x2':\n        case '4x3':\n        case '16x9':\n            return 'horizontal';\n        default:\n            assertNever(ratio);\n    }\n};\n\nexport const PortfolioItem: React.FC<PortfolioItemProps> = props => {\n    const contextualTheme = useTheme();\n    const { item, background, ratio, theme = contextualTheme } = props;\n    const { type, title, caption, image, link } = item;\n\n    const { withRoundedCorners } = theme;\n\n    const { clickableRef, onProxyMouseDown, onProxyMouseUp } = useClickProxyAllowingTextSelection<HTMLAnchorElement>();\n\n    const typeIcon = getTypeIcon(type);\n    const infoVisibleOnInteractOnly = type === 'image';\n    const hasInfo = !!title || !!caption;\n\n    return (\n        <div\n            {...(link && { role: 'link', onMouseDown: onProxyMouseDown, onMouseUp: onProxyMouseUp, tabIndex: -1 })}\n            className={classNames(\n                styles.PortfolioItem,\n                styles[`Variant--${ratio}`],\n                !image && styles[`Variant--${background}`],\n                link && styles['Variant--withLink'],\n                (link || (infoVisibleOnInteractOnly && hasInfo)) && styles['Variant--withOverlayAnimation'],\n                withRoundedCorners && styles['Variant--rounded'],\n                infoVisibleOnInteractOnly && itemStyles.VisibleOnInteractOnlyContainer\n            )}\n        >\n            {image && <Picture {...image} profile={PictureProfiles.studyPortfolioItem} theme={theme} />}\n            <div\n                className={classNames(\n                    styles.Overlay,\n                    infoVisibleOnInteractOnly && styles['Overlay--initialTransparent']\n                )}\n            />\n            <div className={styles.Content}>\n                {typeIcon && <SvgIcon iconName={typeIcon} className={styles.TypeIcon} />}\n                <div className={styles.Info}>\n                    <PortfolioItemInfo\n                        title={title}\n                        linkRef={clickableRef}\n                        link={link}\n                        caption={caption}\n                        visibleOnInteractOnly={infoVisibleOnInteractOnly}\n                        iconName={getActionIcon(type)}\n                        orientation={getOrientation(ratio)}\n                    />\n                </div>\n            </div>\n        </div>\n    );\n};\n","import classNames from 'classnames';\nimport uniqueId from 'lodash/uniqueId';\nimport * as React from 'react';\nimport { PageSection } from '~/Features/Layouts/Components/PageSection/PageSection';\nimport { PageSectionHeading } from '~/Features/Layouts/Components/PageSectionHeading/PageSectionHeading';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\nimport { HtmlDiv } from '~/Partials/Controls/HtmlDiv';\nimport { List } from '~/Partials/List/List';\nimport type { StrictOmit, WithId } from '~/Partials/Utils/typeUtils';\nimport type { Theme } from '~/Utils/Theme';\nimport type { PortfolioCallToActionProps } from './PortfolioCallToAction/PortfolioCallToAction';\nimport { PortfolioCallToAction } from './PortfolioCallToAction/PortfolioCallToAction';\nimport type { PortfolioItemDetails, PortfolioItemProps } from './PortfolioItem/PortfolioItem';\nimport { PortfolioItem } from './PortfolioItem/PortfolioItem';\nimport itemStyles from './StudyPortfolioSection.items.module.css';\nimport styles from './StudyPortfolioSection.module.css';\n\nexport type PortfolioItemDetailsWithId = WithId<PortfolioItemDetails>;\n\nexport interface StudyPortfolioSectionProps {\n    id: string;\n    items: PortfolioItemDetailsWithId[];\n    callToAction: StrictOmit<PortfolioCallToActionProps, 'theme'>;\n    title?: HtmlString;\n    teaser?: HtmlString;\n    theme?: Theme;\n}\n\nconst allowedNumberOfItems = 6;\n\nconst getIndexBasedProps = (index: number): Pick<PortfolioItemProps, 'background' | 'ratio'> => {\n    switch (index) {\n        case 0:\n            return {\n                ratio: '16x9',\n                background: 'red',\n            };\n        case 1:\n            return {\n                ratio: '1x1',\n                background: 'yellow',\n            };\n        case 2:\n            return {\n                ratio: '3x2',\n                background: 'teal',\n            };\n        case 3:\n            return {\n                ratio: '3x4',\n                background: 'steelblue',\n            };\n        case 4:\n            return {\n                ratio: '2x3',\n                background: 'white',\n            };\n        default:\n            return {\n                ratio: '16x9',\n                background: 'burgundy',\n            };\n    }\n};\n\nexport const StudyPortfolioSection: React.FC<StudyPortfolioSectionProps> = props => {\n    const contextualTheme = useTheme();\n\n    const { id, title, items, callToAction, teaser, theme = contextualTheme } = props;\n\n    if (items.length !== allowedNumberOfItems) {\n        throw new Error(`Portfolio can accept exactly ${allowedNumberOfItems} items`);\n    }\n\n    const ctaItem = {\n        id: uniqueId('portfolioCTA_'),\n        type: 'CTA',\n        ...callToAction,\n    } as const;\n\n    const extendedItems = [...items, ctaItem];\n\n    return (\n        <PageSection id={id} className={styles.StudyPortfolioSection}>\n            <div className={styles.Information}>\n                {title && <PageSectionHeading heading={title} className={styles.Title} />}\n                {teaser && (\n                    <div className={styles.TeaserWrapper}>\n                        <HtmlDiv\n                            html={teaser}\n                            className={classNames(styles.Teaser, 'RichtextContent', `RichtextContent--light`)}\n                        />\n                    </div>\n                )}\n            </div>\n            <List\n                className={itemStyles.Items}\n                items={extendedItems}\n                renderItem={(item, index) => (\n                    <li key={item.id} className={itemStyles.Item}>\n                        {item.type === 'CTA' ? (\n                            <PortfolioCallToAction {...item} theme={theme} />\n                        ) : (\n                            <PortfolioItem {...getIndexBasedProps(index)} item={item} theme={theme} />\n                        )}\n                    </li>\n                )}\n            />\n        </PageSection>\n    );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"StudyPortfolioSection\":\"pFTWXiiPpytGWLiKLpv9\",\"Information\":\"S2f6deV1yP8g5eUszWRn\",\"Title\":\"UGfnqOV55kXJ4kMKpeEI\",\"TeaserWrapper\":\"iadlztdFwcV0nqnyj_1B\",\"Teaser\":\"ZIEayLuChE50GXCcqJ3_\"};","// extracted by mini-css-extract-plugin\nexport default {\"Items\":\"YEXvUjfm6kfiJ5E0RUmA\",\"Item\":\"BJhDL1ivRTBTTz1M1jNJ\"};","//     This code was generated by a Reinforced.Typings tool.\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n\nexport enum PortfolioItemType {\n\tImage = \"image\",\n\tVideo = \"video\",\n\tAudio = \"audio\"\n}\n","import type { AudioPortfolioItemViewModel } from '../../ViewModel/AudioPortfolioItemViewModel.csharp';\nimport type { IPortfolioItemViewModel } from '../../ViewModel/IPortfolioItemViewModel.csharp';\nimport type { ImagePortfolioItemViewModel } from '../../ViewModel/ImagePortfolioItemViewModel.csharp';\nimport { PortfolioItemType } from '../../ViewModel/PortfolioItemType.csharp';\nimport type { VideoPortfolioItemViewModel } from '../../ViewModel/VideoPortfolioItemViewModel.csharp';\nimport type { PortfolioItemDetailsWithId } from '~/Features/StudyPage/Campus/Sections/StudyPortfolioSection/StudyPortfolioSection';\n\nconst isAudioItem = (item: IPortfolioItemViewModel): item is AudioPortfolioItemViewModel =>\n    item.type === PortfolioItemType.Audio;\n\nconst isVideoItem = (item: IPortfolioItemViewModel): item is VideoPortfolioItemViewModel =>\n    item.type === PortfolioItemType.Video;\n\nconst isImageItem = (item: IPortfolioItemViewModel): item is ImagePortfolioItemViewModel =>\n    item.type === PortfolioItemType.Image;\n\nexport const mapToPortfolioItems = (items: IPortfolioItemViewModel[]): PortfolioItemDetailsWithId[] =>\n    items.map(item => {\n        if (isImageItem(item)) {\n            return {\n                type: 'image',\n                id: item.id,\n                title: item.title,\n                caption: item.caption,\n                image: item.image,\n                link: item.link,\n            };\n        }\n\n        if (isVideoItem(item)) {\n            return {\n                type: 'video',\n                id: item.id,\n                title: item.title,\n                caption: item.caption,\n                image: item.image,\n                link: item.link,\n            };\n        }\n\n        if (isAudioItem(item)) {\n            return {\n                type: 'audio',\n                id: item.id,\n                title: item.title,\n                caption: item.caption,\n                image: item.image,\n                link: item.link,\n            };\n        }\n\n        throw new Error(`Not supported item type: ${item.type}`);\n    });\n","import * as React from 'react';\nimport type { StudyPortfolioSectionBlockViewModel } from '../ViewModel/StudyPortfolioSectionBlockViewModel.csharp';\nimport { StudyPortfolioSection } from '~/Features/StudyPage/Campus/Sections/StudyPortfolioSection/StudyPortfolioSection';\nimport { mapToPortfolioItems } from './Utils/PortfolioItemsUtils';\n\nexport const StudyPortfolioSectionBlock: React.FC<StudyPortfolioSectionBlockViewModel> = props => {\n    const { id, title, teaser, portfolioItems, callToAction } = props;\n\n    return (\n        <StudyPortfolioSection\n            id={id}\n            title={title}\n            teaser={teaser}\n            items={mapToPortfolioItems(portfolioItems)}\n            callToAction={callToAction}\n        />\n    );\n};\n","import * as React from 'react';\nimport styles from './PageSection.module.css';\n\nexport interface PageSectionProps {\n    id?: string;\n    className?: string;\n}\n\nexport const PageSection: React.FC<React.PropsWithChildren<PageSectionProps>> = props => {\n    const { id, className, children } = props;\n\n    return (\n        <section id={id} className={className}>\n            <div className={styles.Wrapper}>\n                <div className={styles.Inner}>{children}</div>\n            </div>\n        </section>\n    );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"Wrapper\":\"Fov3KMlE7osNR74JI44t\",\"Inner\":\"Wf6h4ZdN2S9XvO6RoMCf\"};","import classNames from 'classnames';\nimport React from 'react';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\nimport { HtmlHeading } from '~/Partials/Controls/HtmlHeading';\nimport styles from './PageSectionHeading.module.css';\n\ninterface PageSectionHeadingProps {\n    heading: HtmlString;\n    className?: string;\n}\n\nexport const PageSectionHeading: React.FC<PageSectionHeadingProps> = props => {\n    const { heading, className } = props;\n\n    return <HtmlHeading type=\"h2\" className={classNames(styles.PageSectionHeading, className)} html={heading} />;\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"PageSectionHeading\":\"FrR9v_ssranAjR5kDzwF\"};","export const enum MouseButton {\n    Left = 0,\n    Middle = 1,\n    Right = 2,\n}\n","import isEmpty from 'lodash/isEmpty';\nimport * as React from 'react';\nimport { findClosestParent } from '~/Partials/Utils/utils';\nimport { MouseButton } from '~/Utils/MouseButton';\n\nconst isNonEmpty = (selection: Selection | null): selection is Selection => !isEmpty(selection?.toString());\n\nconst isLabel = (element: Element): element is HTMLLabelElement => element.tagName.toLowerCase() === 'label';\n\nconst willBeHandledByAssociatedElement = (eventTarget: Element, clickableElement: HTMLElement) => {\n    const nearestLabel = findClosestParent(eventTarget, isLabel);\n\n    if (nearestLabel === null) {\n        return false;\n    }\n\n    const associatedElementId = nearestLabel.getAttribute('for');\n\n    if (!associatedElementId) {\n        return false;\n    }\n\n    return associatedElementId === clickableElement.id;\n};\n\nconst portalContainerId = 'portal-container';\n\n// Due to event propagation from portal to React tree we have to manually exclude these events.\n// https://github.com/facebook/react/issues/11387\nconst willBubbleOutsideOfPortal = (eventTarget: Node | null, clickableElement: HTMLElement) => {\n    let potentialPortalContainer = eventTarget;\n    let previouslyCheckedElement: Node | null = null;\n\n    while (potentialPortalContainer) {\n        if (potentialPortalContainer instanceof HTMLElement && potentialPortalContainer.id === portalContainerId) {\n            // If we find a container, we are sure that the previous element is a root element for one of the portals.\n            // Then we only check whether the clickable element is part of that particular portal's tree so that\n            // multiple portals do not interfere with each other.\n            // If previouslyCheckedElement is null it means that event target is portal container itself.\n            // Then we treat an event as if it would bubble outside the portal.\n            return !previouslyCheckedElement || !previouslyCheckedElement.contains(clickableElement);\n        }\n\n        previouslyCheckedElement = potentialPortalContainer;\n        potentialPortalContainer = potentialPortalContainer.parentElement;\n    }\n\n    return false;\n};\n\nconst shouldIgnoreEvent = (eventTarget: EventTarget, clickableElement: HTMLElement | null) =>\n    clickableElement === null ||\n    !(eventTarget instanceof Element) ||\n    clickableElement.contains(eventTarget) ||\n    willBeHandledByAssociatedElement(eventTarget, clickableElement) ||\n    willBubbleOutsideOfPortal(eventTarget, clickableElement);\n\nexport const useClickProxyAllowingTextSelection = <TClickableElement extends HTMLElement>() => {\n    const clickableRef = React.useRef<TClickableElement>(null);\n\n    const onProxyMouseDown = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n        if (shouldIgnoreEvent(event.target, clickableRef.current)) {\n            return;\n        }\n\n        if (event.button === MouseButton.Left) {\n            const userSelection = getSelection();\n\n            if (isNonEmpty(userSelection)) {\n                userSelection.removeAllRanges();\n            }\n        }\n\n        if (event.button === MouseButton.Middle) {\n            event.preventDefault();\n        }\n    };\n\n    const onProxyMouseUp = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n        if (shouldIgnoreEvent(event.target, clickableRef.current)) {\n            return;\n        }\n\n        if (event.button === MouseButton.Left) {\n            if (isNonEmpty(getSelection())) {\n                return;\n            }\n\n            clickableRef.current?.click();\n            clickableRef.current?.focus();\n        }\n\n        if (event.button === MouseButton.Middle) {\n            const eventCopy = new MouseEvent('click', { button: event.button, bubbles: true });\n\n            clickableRef.current?.dispatchEvent(eventCopy);\n        }\n    };\n\n    return { clickableRef, onProxyMouseDown, onProxyMouseUp };\n};\n"],"names":["PortfolioCallToAction","props","contextualTheme","useTheme","description","callToActionLink","theme","withRoundedCorners","React","className","classNames","Link","_extends","type","LinkType","Button","buttonTier","ButtonTier","Primary","buttonSize","ButtonSize","ResponsiveFromSmallToMedium","showIsExternal","label","SvgIcon","iconName","PortfolioItemInfo","title","linkRef","link","caption","visibleOnInteractOnly","orientation","titleElement","getTitleElement","titleText","ref","Clear","styles","Title","captionElement","Caption","iconElement","Icon","topClassName","concat","IconWrapper","getActionIcon","assertNever","getOrientation","ratio","PortfolioItem","item","background","image","clickableRef","onProxyMouseDown","onProxyMouseUp","useClickProxyAllowingTextSelection","typeIcon","getTypeIcon","infoVisibleOnInteractOnly","hasInfo","role","onMouseDown","onMouseUp","tabIndex","itemStyles","VisibleOnInteractOnlyContainer","Picture","profile","PictureProfiles","studyPortfolioItem","Overlay","Content","TypeIcon","Info","StudyPortfolioSection","id","items","callToAction","teaser","length","Error","ctaItem","_objectSpread","uniqueId","extendedItems","PageSection","PageSectionHeading","heading","HtmlDiv","html","List","renderItem","index","key","getIndexBasedProps","PortfolioItemType","StudyPortfolioSectionBlock","portfolioItems","map","Image","isImageItem","Video","isVideoItem","Audio","isAudioItem","children","HtmlHeading","MouseButton","isNonEmpty","selection","isEmpty","toString","isLabel","element","tagName","toLowerCase","shouldIgnoreEvent","eventTarget","clickableElement","Element","contains","willBeHandledByAssociatedElement","nearestLabel","findClosestParent","associatedElementId","getAttribute","willBubbleOutsideOfPortal","potentialPortalContainer","previouslyCheckedElement","HTMLElement","parentElement","event","target","current","button","Left","userSelection","getSelection","removeAllRanges","Middle","preventDefault","_clickableRef$current","_clickableRef$current2","click","focus","_clickableRef$current3","eventCopy","MouseEvent","bubbles","dispatchEvent"],"sourceRoot":""}