{"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":""}