{"version":3,"file":"ArticleListBlock.chunk.bc34b28756daad8459ae.js","mappings":"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","sources":["webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/ArticleList/ArticleList.module.css?ccd3","webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/ArticleList/Utils/ArticleListUtils.ts","webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/ArticleList/ArticleList.tsx","webpack://Kristiania.Web/./Features/Blocks/ArticleListBlock/View/ArticleListBlock.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/StudyPage/Campus/Components/ArticleList/ArticleCard/ArticleCard.module.css?3f81","webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/ArticleList/ArticleCard/ArticleCard.tsx","webpack://Kristiania.Web/./Features/Utils/MouseButton.ts","webpack://Kristiania.Web/./Features/Utils/Hooks/useClickProxyAllowingTextSelection.ts","webpack://Kristiania.Web/./Features/Utils/Hooks/useWindowWidthDetection.ts","webpack://Kristiania.Web/./Features/Utils/MediaBreakpoints.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"ArticleList\":\"SHBxpvluhwQoYymI1DIv\",\"Header\":\"E2phzNy8djlaFTH4WR6x\",\"Heading\":\"su0JfkSU5NqW5XwuRQWW\",\"Teaser\":\"RPUz6nNc5vk8nn5q_nNC\",\"List\":\"FB3DZGmtcCVAhhcz68G0\",\"ListItem\":\"Gr8VYbsydqQjuQuxwqK5\",\"Variant--dark\":\"iVlFZsPdf7GCgOU8gGjH\",\"ListVariant--oneColumn\":\"u7jkooW2ASzCn_M1PG5A\",\"ListVariant--twoColumns\":\"CUBScmSRDwWUSmX7M5oY\",\"ListVariant--threeColumns\":\"CthI_MDUDXaFm3Q7ylnw\"};","import type { ArticleCardProps } from '../ArticleCard/ArticleCard';\nimport styles from '../ArticleList.module.css';\nimport { PictureProfiles } from '~/Partials/Picture/PictureProfiles';\n\nexport const MAX_ITEMS_TO_DISPLAY = 3;\n\nexport const resolveCardDisplayProps = (\n currentIndex: number,\n totalCount: number,\n isMobile: boolean\n): Required> => {\n if (isMobile) {\n return {\n layout: 'vertical',\n pictureRatio: currentIndex === 0 ? '3x4' : '16x9',\n pictureProfile: currentIndex === 0 ? PictureProfiles.vertical : PictureProfiles.horizontal,\n };\n }\n\n switch (totalCount) {\n case 1:\n return {\n layout: 'horizontal',\n pictureRatio: '16x9',\n pictureProfile: PictureProfiles.horizontal,\n };\n case 2:\n return currentIndex === 0\n ? {\n layout: 'fullWidth',\n pictureRatio: '16x9',\n pictureProfile: PictureProfiles.horizontal,\n }\n : {\n layout: 'vertical',\n pictureRatio: '3x4',\n pictureProfile: PictureProfiles.vertical,\n };\n case 3:\n if (currentIndex === 0) {\n return {\n layout: 'vertical',\n pictureRatio: '16x9',\n pictureProfile: PictureProfiles.horizontal,\n };\n }\n\n if (currentIndex === 1) {\n return {\n layout: 'vertical',\n pictureRatio: '3x4',\n pictureProfile: PictureProfiles.vertical,\n };\n }\n\n return {\n layout: 'vertical',\n pictureRatio: '2x3',\n pictureProfile: PictureProfiles.vertical,\n };\n default:\n throw new Error(`Invalid number of items: ${totalCount}`);\n }\n};\n\nexport const resolveListLayoutClass = (totalCount: number) => {\n switch (totalCount) {\n case 1:\n return styles['ListVariant--oneColumn'];\n case 2:\n return styles['ListVariant--twoColumns'];\n default:\n return styles['ListVariant--threeColumns'];\n }\n};\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport { PageSection } from '~/Features/Layouts/Components/PageSection/PageSection';\nimport { PageSectionHeading } from '~/Features/Layouts/Components/PageSectionHeading/PageSectionHeading';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\nimport { HtmlDiv } from '~/Partials/Controls/HtmlDiv';\nimport { List } from '~/Partials/List/List';\nimport { omitProperty } from '~/Partials/Utils/utils';\nimport { useWindowWidthDetection } from '~/Utils/Hooks/useWindowWidthDetection';\nimport { MediaBreakpoints } from '~/Utils/MediaBreakpoints';\nimport type { ArticleCardProps } from './ArticleCard/ArticleCard';\nimport { ArticleCard } from './ArticleCard/ArticleCard';\nimport styles from './ArticleList.module.css';\nimport type { ArticleListVariant } from './ArticleListVariant';\nimport { MAX_ITEMS_TO_DISPLAY, resolveCardDisplayProps, resolveListLayoutClass } from './Utils/ArticleListUtils';\n\nexport interface ArticleListItemProps extends Pick {\n id: string;\n}\n\nexport interface ArticleListProps {\n id: string;\n items: ArticleListItemProps[];\n heading?: HtmlString;\n teaser?: HtmlString;\n variant?: ArticleListVariant;\n}\n\nexport const ArticleList: React.FC = props => {\n const { id, heading, items, teaser, variant = 'default' } = props;\n\n const isMobile = useWindowWidthDetection({ condition: 'lessThan', breakpoint: MediaBreakpoints.Tablet });\n const filteredItems = items.slice(0, MAX_ITEMS_TO_DISPLAY);\n\n const richtextVariant = variant === 'dark' ? 'light' : 'dark';\n\n return (\n \n
\n {heading && }\n {teaser && (\n \n )}\n
\n (\n
  • \n \n
  • \n )}\n />\n \n );\n};\n","import * as React from 'react';\nimport type { ArticleListBlockViewModel } from '../ViewModel/ArticleListBlockViewModel.csharp';\nimport type { ArticleListItemViewModel } from '../ViewModel/ArticleListItemViewModel.csharp';\nimport type { ArticleListItemProps } from '~/Features/StudyPage/Campus/Components/ArticleList/ArticleList';\nimport { ArticleList } from '~/Features/StudyPage/Campus/Components/ArticleList/ArticleList';\n\nexport const ArticleListBlock: React.FC = props => {\n const { id, heading, teaser, articles } = props;\n\n const mapArticle = (article: ArticleListItemViewModel): ArticleListItemProps => ({\n id: article.id,\n title: article.title,\n description: article.description,\n articleUrl: article.url,\n image: article.image,\n });\n\n return ;\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> = props => {\n const { id, className, children } = props;\n\n return (\n
    \n
    \n
    {children}
    \n
    \n
    \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 = props => {\n const { heading, className } = props;\n\n return ;\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"PageSectionHeading\":\"FrR9v_ssranAjR5kDzwF\"};","// extracted by mini-css-extract-plugin\nexport default {\"ArticleCard\":\"lWrPSruci5J1Pct9eV_o\",\"Picture\":\"Rk4XtUg82KBc97x_ZRFE\",\"Picture--16x9\":\"bdvXUDwmjTRBe1N3RN_T\",\"Picture--3x4\":\"A1reRVHVrrT7Lt9R_8TS\",\"Picture--2x3\":\"QcU24my_eJv9CEdQJFrz\",\"Heading\":\"c_Td561uP1rvuAN4AIF0\",\"Description\":\"upokinR30SLCCFTdntv0\",\"LetterIcon\":\"PVmLk9OPaS3teC0Olseh\",\"Variant--fullInfo\":\"q5hkvvHSqXSnC8c0ON1s\",\"Info\":\"yMY00st3GGEGBJtEvQ73\",\"Variant--smallTypography\":\"b3JSpHCPkJRpylgdiTos\",\"Variant--vertical\":\"g60OJyzhnb0WaPJax3FT\",\"Variant--fullWidth\":\"zdMqUHHFSTVzMR253tYf\",\"AdditionalInfo\":\"jEZzvXBk9gXoSYGacZ1a\",\"Variant--horizontal\":\"r_dYUsqLir_V2WZJ1e1d\",\"PictureContainer\":\"MgyILGUp5ZXfXioJozjl\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\nimport { HtmlDiv } from '~/Partials/Controls/HtmlDiv';\nimport { Link } from '~/Partials/Link/Link';\nimport { LinkType } from '~/Partials/Link/LinkType.csharp';\nimport type { BaseImage, PictureProfile } from '~/Partials/Picture/Picture';\nimport { Picture } from '~/Partials/Picture/Picture';\nimport { PictureProfiles } from '~/Partials/Picture/PictureProfiles';\nimport { PicturePlaceholder } from '~/Partials/Picture/Placeholder/PicturePlaceholder';\nimport type { IconName } from '~/Partials/SvgIcon/SvgIcon';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport { useClickProxyAllowingTextSelection } from '~/Utils/Hooks/useClickProxyAllowingTextSelection';\nimport type { Theme } from '~/Utils/Theme';\nimport styles from './ArticleCard.module.css';\nimport type { ArticleCardInfoLayout } from './ArticleCardInfoLayout';\nimport type { ArticleCardLayout } from './ArticleCardLayout';\nimport type { ArticleCardPictureRatio } from './ArticleCardPictureRatio';\nimport type { ArticleCardTypography } from './ArticleCardTypography';\n\nexport interface ArticleCardProps {\n articleUrl: string;\n pictureRatio: ArticleCardPictureRatio;\n title?: HtmlString;\n infoLayout?: ArticleCardInfoLayout;\n image?: BaseImage;\n pictureProfile?: PictureProfile;\n description?: HtmlString;\n layout?: ArticleCardLayout;\n typography?: ArticleCardTypography;\n theme?: Pick;\n}\n\nexport const ArticleCard: React.FC = props => {\n const contextualTheme = useTheme();\n const {\n title,\n articleUrl,\n pictureRatio,\n image,\n description,\n pictureProfile = PictureProfiles.contentCard,\n layout = 'vertical',\n typography = 'large',\n infoLayout = 'limited',\n theme = contextualTheme,\n } = props;\n const { clickableRef, onProxyMouseDown, onProxyMouseUp } = useClickProxyAllowingTextSelection();\n\n const firstLetter = title?.value.charAt(0).toLowerCase() as IconName;\n\n const pictureClassNames = classNames(styles.Picture, styles[`Picture--${pictureRatio}`]);\n\n return (\n \n
    \n {image ? (\n \n ) : (\n \n )}\n
    \n
    \n

    \n \n {title && }\n \n

    \n
    \n {description && }\n {firstLetter && }\n
    \n
    \n \n );\n};\n","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 = () => {\n const clickableRef = React.useRef(null);\n\n const onProxyMouseDown = (event: React.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) => {\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","import * as React from 'react';\nimport { assertNever } from '~/Partials/Utils/typeUtils';\n\nconst CheckIfWidthMatchesOptions = (width: number, options: WindowWidthDetectionOptions) => {\n switch (options.condition) {\n case 'greaterThan':\n return width > options.breakpoint;\n case 'greaterOrEqual':\n return width >= options.breakpoint;\n case 'lessThan':\n return width < options.breakpoint;\n case 'lessOrEqual':\n return width <= options.breakpoint;\n case 'inRange':\n return width >= options.lowerBreakpoint && width <= options.upperBreakpoint;\n case 'inRangeExclusive':\n return width > options.lowerBreakpoint && width < options.upperBreakpoint;\n default:\n assertNever(options);\n }\n};\n\ninterface WindowWidthDetectionOptionsSingleArgument {\n condition: 'greaterThan' | 'lessThan' | 'greaterOrEqual' | 'lessOrEqual';\n breakpoint: number;\n}\n\ninterface WindowWidthDetectionOptionsTwoArguments {\n condition: 'inRange' | 'inRangeExclusive';\n lowerBreakpoint: number;\n upperBreakpoint: number;\n}\n\nexport type WindowWidthDetectionOptions =\n | WindowWidthDetectionOptionsSingleArgument\n | WindowWidthDetectionOptionsTwoArguments;\n\nexport const useWindowWidthDetection = (options: WindowWidthDetectionOptions) => {\n const [matchesOptions, setMatchesOptions] = React.useState();\n\n const getDependencies = () => {\n switch (options.condition) {\n case 'greaterThan':\n case 'greaterOrEqual':\n case 'lessThan':\n case 'lessOrEqual':\n return [options.condition, options.breakpoint];\n case 'inRange':\n case 'inRangeExclusive':\n return [options.condition, options.lowerBreakpoint, options.upperBreakpoint];\n\n default:\n assertNever(options);\n }\n };\n\n React.useEffect(() => {\n const getWindowSize = () => {\n const { innerWidth: width, innerHeight: height } = window;\n\n return {\n width,\n height,\n };\n };\n\n const handleResize = () => {\n const size = getWindowSize();\n const matches = CheckIfWidthMatchesOptions(size.width, options);\n\n setMatchesOptions(matches);\n };\n\n window.addEventListener('resize', handleResize);\n handleResize();\n\n return () => window.removeEventListener('resize', handleResize);\n }, getDependencies());\n\n return matchesOptions;\n};\n","export class MediaBreakpoints {\n static readonly Mobile = 375;\n\n static readonly Tablet = 768;\n\n static readonly Desktop = 1024;\n\n static readonly DesktopHD = 1440;\n}\n"],"names":["resolveListLayoutClass","totalCount","styles","ArticleList","props","id","heading","items","teaser","variant","isMobile","useWindowWidthDetection","condition","breakpoint","MediaBreakpoints","Tablet","filteredItems","slice","richtextVariant","React","PageSection","className","classNames","concat","Header","PageSectionHeading","Heading","HtmlDiv","html","Teaser","List","length","renderItem","item","index","key","ListItem","ArticleCard","_extends","omitProperty","resolveCardDisplayProps","currentIndex","layout","pictureRatio","pictureProfile","PictureProfiles","vertical","horizontal","Error","typography","ArticleListBlock","articles","map","article","title","description","articleUrl","url","image","children","HtmlHeading","type","contextualTheme","useTheme","contentCard","infoLayout","theme","clickableRef","onProxyMouseDown","onProxyMouseUp","useClickProxyAllowingTextSelection","firstLetter","value","charAt","toLowerCase","pictureClassNames","Picture","role","onMouseDown","onMouseUp","tabIndex","PictureContainer","profile","PicturePlaceholder","Info","Link","href","LinkType","Clear","ref","AdditionalInfo","Description","SvgIcon","iconName","LetterIcon","MouseButton","isNonEmpty","selection","isEmpty","toString","isLabel","element","tagName","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","options","matchesOptions","setMatchesOptions","handleResize","matches","CheckIfWidthMatchesOptions","width","lowerBreakpoint","upperBreakpoint","assertNever","getWindowSize","innerWidth","innerHeight","height","window","addEventListener","removeEventListener","getDependencies","Mobile","Desktop","DesktopHD"],"sourceRoot":""}