{"version":3,"file":"CampusStudyPageHero.chunk.32b05434a615c8538125.js","mappings":"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","sources":["webpack://Kristiania.Web/./Features/ApplicationEvents/ApplicationEvents.ts","webpack://Kristiania.Web/./Features/Blocks/AlertSectionBlock/AlertSectionVariant.csharp.ts","webpack://Kristiania.Web/./Features/CampusApplication/CampusApplicationProcessState.ts","webpack://Kristiania.Web/./Features/CampusApplication/CampusApplicationProcessUtils.ts","webpack://Kristiania.Web/./Features/CampusApplication/Events/CampusApplicationEvents.ts","webpack://Kristiania.Web/./Features/CampusApplication/Utils/campusApplicationUtils.ts","webpack://Kristiania.Web/./Features/Configuration/Utils/languageUtils.ts","webpack://Kristiania.Web/./Features/ExecutionContext.ts","webpack://Kristiania.Web/./Features/Messaging/MessageBroker.ts","webpack://Kristiania.Web/./Features/Messaging/types.ts","webpack://Kristiania.Web/./Features/Messaging/useMessageHandler.ts","webpack://Kristiania.Web/./Features/OnlineApplication/OnlineApplicationProcessUtils.ts","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/AdmissionCallToAction/AdmissionCallToAction.module.css?8135","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/CampusCardCheckbox/CampusCardCheckbox.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/CampusCardCheckbox/CampusCardCheckbox.module.css?0559","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/AdmissionCallToAction/AdmissionCallToActionCardsList/AdmissionCallToActionCardsList.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/AdmissionCallToAction/AdmissionCallToActionCardsList/AdmissionCallToActionCardsList.module.css?b6b0","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/AdmissionCallToAction/AdmissionCallToActionOverlay/AdmissionCallToActionOverlay.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/AdmissionCallToAction/AdmissionCallToAction.tsx","webpack://Kristiania.Web/./Features/Blocks/StudyAdmissionCallToActionBlock/View/StudyAdmissionCallToActionBlock.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/StudyPageInfoBox/StudyPageInfoBox.module.css?6dce","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/StudyPageInfoBox/StudyPageInfoBox.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/StudyPageAdmissionInfoBox/StudyPageAdmissionInfoBox.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyHero/StudyHero.module.css?358d","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyHero/StudyHero.tsx","webpack://Kristiania.Web/./Features/Pages/CampusStudyPage/View/Components/CampusStudyPageHero/CampusStudyPageHero.tsx","webpack://Kristiania.Web/./Features/Partials/AlertSection/AlertSection.module.css?50a7","webpack://Kristiania.Web/./Features/Partials/AlertSection/AlertSection.tsx","webpack://Kristiania.Web/./Features/Partials/BackgroundMediaSection/BackgroundMediaSection.module.css?b2a6","webpack://Kristiania.Web/./Features/Partials/BackgroundMediaSection/BackgroundMediaSection.tsx","webpack://Kristiania.Web/./Features/Partials/Breadcrumbs/Breadcrumbs.tsx","webpack://Kristiania.Web/./Features/Partials/Breadcrumbs/Breadcrumbs.module.css?241b","webpack://Kristiania.Web/./Features/Partials/Button/Button.tsx","webpack://Kristiania.Web/./Features/Partials/Button/ButtonSize.csharp.ts","webpack://Kristiania.Web/./Features/Partials/Button/ButtonTier.csharp.ts","webpack://Kristiania.Web/./Features/Partials/Button/ButtonType.csharp.ts","webpack://Kristiania.Web/./Features/Partials/Collapse/useCollapse.ts","webpack://Kristiania.Web/./Features/Partials/Collapse/Collapse.tsx","webpack://Kristiania.Web/./Features/Partials/Controls/HtmlDiv.tsx","webpack://Kristiania.Web/./Features/Partials/Controls/Utils/isHtmlString.ts","webpack://Kristiania.Web/./Features/Partials/FetchData/axiosWrapper.ts","webpack://Kristiania.Web/./Features/Partials/FormFields/validators.ts","webpack://Kristiania.Web/./Features/Partials/GoogleTagManager/Analytics/CampusAnalytics.ts","webpack://Kristiania.Web/./Features/Partials/GoogleTagManager/AnalyticsConstants.ts","webpack://Kristiania.Web/./Features/Partials/GoogleTagManager/GtmCommerceEventsHandler.ts","webpack://Kristiania.Web/./Features/Partials/GoogleTagManager/GtmEventsBase.ts","webpack://Kristiania.Web/./Features/Partials/LazyCollapse/LazyCollapse.tsx","webpack://Kristiania.Web/./Features/Partials/Link/Link.module.css?85a8","webpack://Kristiania.Web/./Features/Partials/Link/Link.tsx","webpack://Kristiania.Web/./Features/Partials/Link/LinkType.csharp.ts","webpack://Kristiania.Web/./Features/Partials/Link/LinkVariant.csharp.ts","webpack://Kristiania.Web/./Features/Partials/List/List.tsx","webpack://Kristiania.Web/./Features/Partials/Modal/ClientSidePortal.tsx","webpack://Kristiania.Web/./Features/Partials/Modal/Portal.tsx","webpack://Kristiania.Web/./Features/Partials/ModalWrapper/ModalWrapper.tsx","webpack://Kristiania.Web/./Features/Utils/Hooks/useCloseHandlersWithoutDuplicatedCalls.ts","webpack://Kristiania.Web/./Features/Partials/Picture/Utils/constructImageSharpUrl.tsx","webpack://Kristiania.Web/./Features/Partials/Picture/Picture.tsx","webpack://Kristiania.Web/./Features/Partials/Picture/Picture.module.css?5ded","webpack://Kristiania.Web/./Features/Partials/Picture/PictureProfiles.ts","webpack://Kristiania.Web/./Features/Partials/Picture/Placeholder/PicturePlaceholder.module.css?0bc4","webpack://Kristiania.Web/./Features/Partials/Picture/Placeholder/PicturePlaceholder.tsx","webpack://Kristiania.Web/./Features/Partials/PillTag/PillTag.module.css?bb60","webpack://Kristiania.Web/./Features/Partials/PillTag/PillTag.tsx","webpack://Kristiania.Web/./Features/Partials/RadioGroup/RadioGroupContext.tsx","webpack://Kristiania.Web/./Features/Partials/SvgIcon/SvgIcon.tsx","webpack://Kristiania.Web/./Features/Partials/SvgIcon/SvgIconBase.tsx","webpack://Kristiania.Web/./Features/Partials/SvgIcon/Utils/Utils.ts","webpack://Kristiania.Web/./Features/Partials/Utils/HttpRequest/makePostRequest.tsx","webpack://Kristiania.Web/./Features/Partials/Utils/utils.ts","webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/Overlay/Overlay.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/Overlay/Overlay.module.css?6508","webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/Overlay/WithOverlay.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/AdmissionCallToAction/Events/AdmissionCallToActionOverlayStatusChanged.ts","webpack://Kristiania.Web/./Features/StudyPage/Campus/Partials/Navigation/Events/NavigationApplyClick.ts","webpack://Kristiania.Web/./Features/StudyPage/Campus/Utils/Hooks/useStudyPageGtmEvents.tsx","webpack://Kristiania.Web/./Features/Utils/AnimationsUtils.ts","webpack://Kristiania.Web/./Features/Utils/MouseButton.ts","webpack://Kristiania.Web/./Features/Utils/Hooks/useClickProxyAllowingTextSelection.ts","webpack://Kristiania.Web/./Features/Utils/Hooks/useIsMounted.ts","webpack://Kristiania.Web/./Features/Utils/Hooks/useVariableWithStableRef.ts","webpack://Kristiania.Web/./Features/Utils/Logging/TelemetryLogger.ts","webpack://Kristiania.Web/./Features/Utils/ScrollLock/ScrollLock.tsx","webpack://Kristiania.Web/./Features/Utils/ScrollLock/ScrollLock.module.css?3254","webpack://Kristiania.Web/./Features/Utils/ScrollLock/ScrollLockUpdated.ts","webpack://Kristiania.Web/./Features/Partials/Button/Button.module.css?462a"],"sourcesContent":["import { Event } from '~/Features/Messaging/types';\n\nexport class ApplicationEvent extends Event {\n constructor(\n public readonly currentChoicesNumber: number,\n id: string\n ) {\n super(id);\n }\n}\n\nexport class AddingDifferentApplicationTypeAttempt extends Event {\n public static readonly id = 'AddingDifferentApplicationTypeAttempt';\n\n constructor() {\n super(AddingDifferentApplicationTypeAttempt.id);\n }\n}\n","// 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 AlertSectionVariant {\n\tWarning = \"warning\",\n\tError = \"error\",\n\tInfo = \"info\",\n\tSuccess = \"success\"\n}\n","import ExecutionContext from '../ExecutionContext';\nimport type { ApplicationChoiceDto } from '../Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\nimport { AddingDifferentApplicationTypeAttempt } from '~/Features/ApplicationEvents/ApplicationEvents';\nimport {\n AddingAnotherOptionAttempt,\n AddingExistingItemAttempt,\n CampusApplicationItemAdded,\n CampusApplicationItemRemoved,\n MaxNumberOfChoicesExceeded,\n} from '~/Features/CampusApplication/Events/CampusApplicationEvents';\nimport { MessageBroker } from '~/Features/Messaging/MessageBroker';\nimport { getStoredOnlineApplicationChoices } from '~/Features/OnlineApplication/OnlineApplicationProcessUtils';\nimport { CampusAnalytics } from '~/Partials/GoogleTagManager/Analytics/CampusAnalytics';\nimport {\n CampusApplicationStateStorageKey,\n getStoredCampusApplicationChoices,\n MaxChoicesNumber,\n} from './CampusApplicationProcessUtils';\n\nexport interface ICampusApplicationProcessState {\n append(item: ApplicationChoiceDto): boolean;\n\n getAll(): ApplicationChoiceDto[];\n\n clear(): void;\n\n remove(id: string): void;\n\n setAll(choices: ApplicationChoiceDto[]): boolean;\n\n isItemsLimitReached(): boolean;\n\n isOnlineApplicationInProgress(): boolean;\n}\n\nexport const CampusApplicationProcessState: () => ICampusApplicationProcessState = () => {\n const isOnlineApplicationInProgress = () => getStoredOnlineApplicationChoices().length > 0;\n\n const append = (newChoice: ApplicationChoiceDto): boolean => {\n ExecutionContext.ThrowIfServerSide();\n\n if (isOnlineApplicationInProgress()) {\n MessageBroker.publish(new AddingDifferentApplicationTypeAttempt());\n\n return false;\n }\n\n const currentChoices = getAll();\n\n for (const choice of currentChoices) {\n if (choice.id === newChoice.id) {\n MessageBroker.publish(new AddingExistingItemAttempt(currentChoices.length));\n\n return false;\n }\n\n if (choice.studyCode === newChoice.studyCode && choice.variantCode === newChoice.variantCode) {\n MessageBroker.publish(new AddingAnotherOptionAttempt(currentChoices.length));\n\n return false;\n }\n }\n\n if (currentChoices.length === MaxChoicesNumber) {\n MessageBroker.publish(new MaxNumberOfChoicesExceeded(MaxChoicesNumber));\n\n return false;\n }\n\n currentChoices.push(newChoice);\n localStorage.setItem(CampusApplicationStateStorageKey, JSON.stringify(currentChoices));\n\n MessageBroker.publish(new CampusApplicationItemAdded(currentChoices.length));\n\n // TODO: verify with handleSelectedChoiceChange implementation, considering setAll\n CampusAnalytics.addProducts([newChoice]);\n\n return true;\n };\n\n const getAll = getStoredCampusApplicationChoices;\n\n const clear = () => {\n ExecutionContext.ThrowIfServerSide();\n localStorage.removeItem(CampusApplicationStateStorageKey);\n MessageBroker.publish(new CampusApplicationItemRemoved(0));\n };\n\n const remove = (id: string) => {\n ExecutionContext.ThrowIfServerSide();\n let currentChoices: ApplicationChoiceDto[] = getAll();\n\n currentChoices = currentChoices.filter(item => item.id !== id);\n\n localStorage.setItem(CampusApplicationStateStorageKey, JSON.stringify(currentChoices));\n MessageBroker.publish(new CampusApplicationItemRemoved(currentChoices.length));\n };\n\n const setAll = (newChoices: ApplicationChoiceDto[]): boolean => {\n ExecutionContext.ThrowIfServerSide();\n\n const currentChoices = getAll();\n\n if (newChoices.length >= currentChoices.length && isOnlineApplicationInProgress()) {\n MessageBroker.publish(new AddingDifferentApplicationTypeAttempt());\n\n return false;\n }\n\n localStorage.setItem(CampusApplicationStateStorageKey, JSON.stringify(newChoices));\n MessageBroker.publish(new CampusApplicationItemAdded(newChoices.length));\n\n return true;\n };\n\n const isItemsLimitReached = () => {\n if (ExecutionContext.IsServerSide()) {\n return false;\n }\n\n return getAll().length >= MaxChoicesNumber;\n };\n\n return {\n append,\n getAll,\n clear,\n remove,\n setAll,\n isItemsLimitReached,\n isOnlineApplicationInProgress,\n };\n};\n","import ExecutionContext from '~/Features/ExecutionContext';\nimport type { ApplicationChoiceDto } from '~/Features/Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\n\nexport const CampusApplicationStateStorageKey = 'campusApplicationState';\nexport const MaxChoicesNumber = 3;\n\nexport const getStoredCampusApplicationChoices = (): ApplicationChoiceDto[] => {\n if (ExecutionContext.IsServerSide()) {\n return [];\n }\n\n const currentStateJson = localStorage.getItem(CampusApplicationStateStorageKey);\n\n if (currentStateJson) {\n return JSON.parse(currentStateJson);\n }\n\n return [];\n};\n","import { Event } from '~/Features/Messaging/types';\n\nexport class CampusApplicationEvent extends Event {\n constructor(\n public readonly currentChoicesNumber: number,\n id: string\n ) {\n super(id);\n }\n}\n\nexport class CampusApplicationItemRemoved extends CampusApplicationEvent {\n public static readonly id = 'CampusApplicationItemRemoved';\n\n constructor(currentChoicesNumber: number) {\n super(currentChoicesNumber, CampusApplicationItemRemoved.id);\n }\n}\n\nexport class CampusApplicationItemAdded extends CampusApplicationEvent {\n public static readonly id = 'CampusApplicationItemAdded';\n\n constructor(currentChoicesNumber: number) {\n super(currentChoicesNumber, CampusApplicationItemAdded.id);\n }\n}\n\nexport class AddingExistingItemAttempt extends CampusApplicationEvent {\n public static readonly id = 'AddingExistingItemAttempt';\n\n constructor(currentChoicesNumber: number) {\n super(currentChoicesNumber, AddingExistingItemAttempt.id);\n }\n}\n\nexport class AddingAnotherOptionAttempt extends CampusApplicationEvent {\n public static readonly id = 'AddingAnotherOptionAttempt';\n\n constructor(currentChoicesNumber: number) {\n super(currentChoicesNumber, AddingAnotherOptionAttempt.id);\n }\n}\n\nexport class MaxNumberOfChoicesExceeded extends CampusApplicationEvent {\n public static readonly id = 'MaxNumberOfChoicesExceeded';\n\n constructor(maxChoicesNumber: number) {\n super(maxChoicesNumber, MaxNumberOfChoicesExceeded.id);\n }\n}\n","import type { ApplicationChoiceDto } from '../../Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\nimport type { ApplicationChoiceSearchCriteria } from '~/Features/Search/ApplicationChoice/ApplicationChoiceSearchCriteria.csharp';\nimport { isNotEmptyArray, isNotEmptyObject, isNotEmptyString } from '~/Partials/FormFields/validators';\n\nexport const isItemAdded = (id: string, currentChoices: ApplicationChoiceDto[]): boolean =>\n currentChoices.some(choice => choice.id === id);\n\nexport const areAllItemsAdded = (choices: ApplicationChoiceDto[], currentChoices: ApplicationChoiceDto[]): boolean =>\n choices.every(choice => isItemAdded(choice.id, currentChoices));\n\nexport const isNotEmptySearchParams = (params: any) =>\n isNotEmptyObject(params) && (isNotEmptyString(params.phrase) || isNotEmptyArray(params.levels));\n\n/*\nconverts params to query string.\nFrom: { phrase: 'test', levels: ['BAC', 'MAC'] }\nTo: '?phrase=test&levels=BAC&levels=MAC'\n*/\nexport const mapSearchParamsToQueryString = ({ levels = [], phrase = '' }: ApplicationChoiceSearchCriteria) => {\n if (isNotEmptySearchParams({ levels, phrase })) {\n return [`?phrase=${phrase}`, ['', ...levels].join('&levels=')].join('');\n }\n\n return '';\n};\n","import { GlobalContextProvider } from '~/Features/Configuration/GlobalContextProvider';\nimport { mapToLocale } from '~/Partials/Locale/Locale';\n\nexport const getContentLanguage = () => GlobalContextProvider.getContentLanguage();\n\nexport const getContentLocale = () => mapToLocale(getContentLanguage());\n","class ExecutionContext {\n public static IsServerSide(): boolean {\n // Episerver Spa Core defines window shim on server side but does not assign `window` property to itself\n return typeof window === 'undefined' || typeof window.window === 'undefined';\n }\n\n public static ThrowIfServerSide(): void {\n if (ExecutionContext.IsServerSide()) {\n throw new Error(\"Method shouldn't be used in server side\");\n }\n }\n}\n\nexport default ExecutionContext;\n","import type { Message, MessageHandler } from '~/Features/Messaging/types';\n\nexport class MessageBroker {\n private static MessageHandlersByMessageId: { [id: string]: MessageHandler[] } = {};\n\n public static subscribe(handler: MessageHandler, messageId: string): void {\n const handlers = this.MessageHandlersByMessageId[messageId];\n\n if (handlers) {\n handlers.push(handler);\n } else {\n this.MessageHandlersByMessageId[messageId] = [handler];\n }\n }\n\n public static unsubscribe(handler: MessageHandler, messageId: string): void {\n const handlers = this.MessageHandlersByMessageId[messageId];\n\n if (handlers) {\n this.MessageHandlersByMessageId[messageId] = handlers.filter(h => h !== handler);\n }\n }\n\n public static publish(message: Message): void {\n const handlers = this.GetMessageHandlers(message.id);\n\n handlers.forEach(handler => handler.handle(message));\n }\n\n public static schedulePublish(message: Message, delay: number): void {\n setTimeout(() => MessageBroker.publish(message), delay);\n }\n\n private static GetMessageHandlers(messageId: string): MessageHandler[] {\n return this.MessageHandlersByMessageId[messageId] || [];\n }\n}\n","export abstract class Message {\n protected constructor(public readonly id: string) {}\n}\n\nexport abstract class Event extends Message {}\n\nexport interface MessageHandler {\n handle(message: Message): void;\n}\n\nexport interface EventHandler {\n handle: ((event: TEvent) => void) | (() => void);\n}\n","import { useLayoutEffect } from 'react';\nimport { MessageBroker } from '~/Features/Messaging/MessageBroker';\nimport type { Message, MessageHandler } from '~/Features/Messaging/types';\nimport { useVariableWithStableRef } from '~/Utils/Hooks/useVariableWithStableRef';\n\nexport const useMessageHandler = (messageId: string, onMessage: MessageHandler['handle']) => {\n const onMessageRef = useVariableWithStableRef(onMessage);\n\n // We use LayoutEffect here because it is important that the handler is subscribed before the first message is published.\n // It could happen if the children of the component that uses this hook publish a message in their useEffect.\n useLayoutEffect(() => {\n const handler = {\n handle: (event: Message) => onMessageRef.current(event),\n };\n\n MessageBroker.subscribe(handler, messageId);\n\n return () => MessageBroker.unsubscribe(handler, messageId);\n }, [onMessageRef, messageId]);\n};\n","import ExecutionContext from '~/Features/ExecutionContext';\nimport type { OnlineApplicationChoice } from './Model';\n\nexport const OnlineApplicationStateStorageKey = 'onlineApplicationState';\n\nexport const getStoredOnlineApplicationChoices = (): OnlineApplicationChoice[] => {\n if (ExecutionContext.IsServerSide()) {\n return [];\n }\n\n const currentStateJson = localStorage.getItem(OnlineApplicationStateStorageKey);\n\n if (currentStateJson) {\n return JSON.parse(currentStateJson) as OnlineApplicationChoice[];\n }\n\n return [];\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"AdmissionCallToAction\":\"PlXu6XGjQfq8mUeuzx0w\",\"Content\":\"x49Y7nL445CW5tSw7bdy\",\"Content--open\":\"Zrp2jG14NLqP8oRQO77h\",\"SubLabel\":\"TZ9LbsRlIWRiE19aTJvJ\",\"Content--closed\":\"aTb_YJEx2CO9oYEB5nB1\",\"Label\":\"EfutlXMAWLs8gDh_wIuT\",\"Action\":\"rieLLDnZbAEJhRxVP9Ww\",\"Variant--shadowed\":\"yr0oeOsEkjwkVXXUNphs\",\"Variant--rounded\":\"u0qYYx7rR_hoBd7b5gIa\"};","import classNames from 'classnames';\nimport uniqueId from 'lodash/uniqueId';\nimport * as React from 'react';\nimport type { ReactNode } 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 type { BaseImage } from '~/Partials/Picture/Picture';\nimport { Picture } from '~/Partials/Picture/Picture';\nimport { PictureProfiles } from '~/Partials/Picture/PictureProfiles';\nimport { PicturePlaceholder } from '~/Partials/Picture/Placeholder/PicturePlaceholder';\nimport { useRadioGroupContext } from '~/Partials/RadioGroup/RadioGroupContext';\nimport { useClickProxyAllowingTextSelection } from '~/Utils/Hooks/useClickProxyAllowingTextSelection';\nimport type { Theme } from '~/Utils/Theme';\nimport styles from './CampusCardCheckbox.module.css';\n\nexport interface CampusCardCheckboxProps {\n title: string;\n value: string;\n subtitle?: string | ReactNode;\n description?: HtmlString;\n image?: BaseImage;\n theme?: Pick;\n}\n\nexport const CampusCardCheckbox: React.FC = props => {\n const contextualTheme = useTheme();\n const { title, subtitle, description, value, image, theme = contextualTheme } = props;\n const { currentValue, onChange, name } = useRadioGroupContext();\n const checked = value === currentValue;\n\n const { withRoundedCorners } = theme;\n\n const { clickableRef, onProxyMouseDown, onProxyMouseUp } = useClickProxyAllowingTextSelection();\n\n const htmlId = uniqueId('FormComponents__radio__');\n\n return (\n \n
\n {image ? (\n \n ) : (\n \n )}\n
\n \n onChange(value)}\n name={name}\n />\n \n
\n

{title}

\n {subtitle && {subtitle}}\n
\n {description && (\n \n )}\n \n \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"CampusCardCheckbox\":\"M04al1HcRVUSEETO5cTi\",\"Description\":\"HrjFnubbJWm6pxeTrwBQ\",\"SubTitle\":\"iOnougcmZF542yv6neHy\",\"Input\":\"TXUxWDQmndYcSEmx07Oi\",\"LabelInner\":\"LgRU9T_sFoW2ARD7LRFF\",\"Image\":\"admZVlu6B0KuLmpInfZP\",\"Content\":\"ubFXBm_nl2hhG9Jfj0he\",\"Title\":\"USh0uG_yXrBNaeH2ebvX\",\"Label\":\"EEGIt34IyHC3VJqn1Uui\",\"Variant--selected\":\"izgPdcwe0xoCvEEWKYrm\",\"Variant--rounded\":\"dTQSQN_AA105laTjuce7\"};","import * as React from 'react';\nimport { CampusCardCheckbox } from '../../CampusCardCheckbox/CampusCardCheckbox';\nimport { AlertSectionVariant } from '~/Blocks/AlertSectionBlock/AlertSectionVariant.csharp';\nimport type { CampusCardBlockViewModel } from '~/Blocks/CampusCardBlock/ViewModel/CampusCardBlockViewModel.csharp';\nimport { CampusApplicationProcessState } from '~/Features/CampusApplication/CampusApplicationProcessState';\nimport { isItemAdded } from '~/Features/CampusApplication/Utils/campusApplicationUtils';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport type { ApplicationChoiceDto } from '~/Features/Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\nimport { AlertSection } from '~/Partials/AlertSection/AlertSection';\nimport { Button } from '~/Partials/Button/Button';\nimport { ButtonSize } from '~/Partials/Button/ButtonSize.csharp';\nimport { ButtonTier } from '~/Partials/Button/ButtonTier.csharp';\nimport { ButtonType } from '~/Partials/Button/ButtonType.csharp';\nimport { LazyCollapse } from '~/Partials/LazyCollapse/LazyCollapse';\nimport { List } from '~/Partials/List/List';\nimport { RadioGroupProvider } from '~/Partials/RadioGroup/RadioGroupContext';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport { redirect } from '~/Partials/Utils/utils';\nimport type { Theme } from '~/Utils/Theme';\nimport styles from './AdmissionCallToActionCardsList.module.css';\n\ninterface AdmissionCallToActionCardsListProps {\n choices: ApplicationChoiceDto[];\n cards: CampusCardBlockViewModel[];\n submitButtonLabel: string;\n campusApplicationUrl: string;\n variantAlreadyInBasketAlertMessage: string;\n theme?: Theme;\n}\n\nexport const AdmissionCallToActionCardsList: React.FC = props => {\n const contextualTheme = useTheme();\n const {\n cards,\n choices,\n campusApplicationUrl,\n submitButtonLabel,\n theme = contextualTheme,\n variantAlreadyInBasketAlertMessage,\n } = props;\n\n const [currentSelection, setCurrentSelection] = React.useState('');\n const [isVariantInCart, setIsVariantInCart] = React.useState(false);\n\n const processState = CampusApplicationProcessState();\n\n React.useEffect(() => {\n const selectedLocation = choices.find(\n choice => choice.variantCity.toLowerCase() === currentSelection.toLowerCase()\n );\n\n setIsVariantInCart(selectedLocation !== undefined && isItemAdded(selectedLocation.id, processState.getAll()));\n }, [currentSelection, choices]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n const selectedLocation = choices.find(\n choice => choice.variantCity.toLowerCase() === currentSelection.toLowerCase()\n );\n\n if (!selectedLocation) {\n return;\n }\n\n const isSuccessfullyAdded = processState.append(selectedLocation);\n\n if (isSuccessfullyAdded) {\n redirect(campusApplicationUrl);\n\n return;\n }\n };\n\n const handleOnChange = (checkedValue: string) => {\n setCurrentSelection(checkedValue);\n };\n\n const picks = cards.map(card => ({ ...card, value: card.location }));\n\n return (\n
\n
\n \n (\n
  • \n \n
  • \n )}\n />\n \n \n {variantAlreadyInBasketAlertMessage}\n \n \n\n \n {submitButtonLabel}\n \n \n
    \n
    \n
    \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"Picker\":\"S2LyTj3AFq20pKSHv6jM\",\"Pick\":\"b4RpiTQpRibNum1ymK3B\",\"Button\":\"P2d1YlbrBtFvAXCxxlbz\",\"Alert\":\"RgCkbqKm0tDAeMsFAjXh\"};","import * as React from 'react';\nimport { NavigationApplyClick } from '../../Navigation/Events/NavigationApplyClick';\nimport styles from '../AdmissionCallToAction.module.css';\nimport type { AdmissionCallToActionStatus } from '../AdmissionCallToActionStatus';\nimport { AdmissionCallToActionOverlayStatusChanged } from '../Events/AdmissionCallToActionOverlayStatusChanged';\nimport type { ICampusApplicationProcessState } from '~/Features/CampusApplication/CampusApplicationProcessState';\nimport { CampusApplicationProcessState } from '~/Features/CampusApplication/CampusApplicationProcessState';\nimport { areAllItemsAdded, isItemAdded } from '~/Features/CampusApplication/Utils/campusApplicationUtils';\nimport { MessageBroker } from '~/Features/Messaging/MessageBroker';\nimport { useMessageHandler } from '~/Features/Messaging/useMessageHandler';\nimport type { ApplicationChoiceDto } from '~/Features/Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\nimport { WithOverlay } from '~/Features/StudyPage/Campus/Components/Overlay/WithOverlay';\nimport { Button } from '~/Partials/Button/Button';\nimport { ButtonSize } from '~/Partials/Button/ButtonSize.csharp';\nimport { ButtonTier } from '~/Partials/Button/ButtonTier.csharp';\nimport { ButtonType } from '~/Partials/Button/ButtonType.csharp';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport { redirect } from '~/Partials/Utils/utils';\nimport type { Theme } from '~/Utils/Theme';\n\ninterface AdmissionCallToActionOverlayProps {\n heading: string;\n closeLabel: string;\n buttonLabel: string;\n theme: Theme;\n choices: ApplicationChoiceDto[];\n campusApplicationUrl: string;\n status?: AdmissionCallToActionStatus;\n}\n\nexport const AdmissionCallToActionOverlay: React.FC<\n React.PropsWithChildren\n> = props => {\n const { heading, buttonLabel, closeLabel, status, theme, campusApplicationUrl, choices, children } = props;\n\n const [shouldDisableButton, setShouldDisableButton] = React.useState(false);\n const [processState, setProcessState] = React.useState(null);\n const buttonRef = React.useRef(null);\n\n const isButtonDisabled = status !== 'open' || shouldDisableButton || choices.length === 0;\n\n React.useEffect(() => {\n const applicationProcess = CampusApplicationProcessState();\n setProcessState(applicationProcess);\n }, []);\n\n React.useEffect(() => {\n if (processState) {\n if (processState.isOnlineApplicationInProgress() || processState.isItemsLimitReached()) {\n setShouldDisableButton(true);\n\n return;\n }\n\n const currentChoices = processState.getAll();\n\n const isProductMultiVariant = choices.length > 1;\n\n if (isProductMultiVariant) {\n const areAllVariantsAlreadyAdded = areAllItemsAdded(choices, currentChoices);\n setShouldDisableButton(areAllVariantsAlreadyAdded);\n\n return;\n }\n\n const isProductSingleVariant = choices.length === 1;\n\n if (isProductSingleVariant) {\n const isVariantAlreadyAdded = isItemAdded(choices[0].id, currentChoices);\n setShouldDisableButton(isVariantAlreadyAdded);\n\n return;\n }\n\n setShouldDisableButton(false);\n }\n }, [choices, processState]);\n\n useMessageHandler(NavigationApplyClick.id, () => {\n buttonRef.current && buttonRef.current.click();\n });\n\n React.useEffect(() => {\n MessageBroker.schedulePublish(new AdmissionCallToActionOverlayStatusChanged('disabled', isButtonDisabled), 0);\n }, [isButtonDisabled]);\n\n const handleClick = (overlayClick: () => void) => {\n if (processState && choices.length === 1) {\n const [applicationChoice] = choices;\n const isSuccessfullyAdded = processState.append(applicationChoice);\n\n if (isSuccessfullyAdded) {\n redirect(campusApplicationUrl);\n\n return;\n }\n\n return;\n }\n\n overlayClick();\n };\n\n return (\n \n

    {heading}

    \n {children}\n \n }\n closeLabel={closeLabel}\n >\n {buttonProps => (\n handleClick(buttonProps.onClick)}\n >\n {buttonLabel}\n \n \n )}\n \n );\n};\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport { NavigationApplyClick } from '../Navigation/Events/NavigationApplyClick';\nimport type { CampusCardBlockViewModel } from '~/Blocks/CampusCardBlock/ViewModel/CampusCardBlockViewModel.csharp';\nimport type { StudyAdmissionCallToActionTranslations } from '~/Blocks/StudyAdmissionCallToActionBlock/ViewModel/StudyAdmissionCallToActionTranslations.csharp';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport { MessageBroker } from '~/Features/Messaging/MessageBroker';\nimport type { ApplicationChoiceDto } from '~/Features/Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\nimport { AdmissionCallToActionOverlayStatusChanged } from '~/Features/StudyPage/Campus/Partials/AdmissionCallToAction/Events/AdmissionCallToActionOverlayStatusChanged';\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 { redirect } from '~/Partials/Utils/utils';\nimport type { Theme } from '~/Utils/Theme';\nimport styles from './AdmissionCallToAction.module.css';\nimport { AdmissionCallToActionCardsList } from './AdmissionCallToActionCardsList/AdmissionCallToActionCardsList';\nimport { AdmissionCallToActionOverlay } from './AdmissionCallToActionOverlay/AdmissionCallToActionOverlay';\nimport type { AdmissionCallToActionStatus } from './AdmissionCallToActionStatus';\n\nexport interface AdmissionCallToActionProps {\n mainLabel: string;\n helperLabel: string;\n translations: StudyAdmissionCallToActionTranslations;\n campusCards: CampusCardBlockViewModel[];\n campusApplicationUrl: string;\n status: AdmissionCallToActionStatus;\n choices?: ApplicationChoiceDto[];\n theme?: Theme;\n link?: Pick;\n}\n\nexport const AdmissionCallToAction: React.FC = props => {\n const contextualTheme = useTheme();\n const {\n mainLabel,\n helperLabel,\n choices,\n campusApplicationUrl,\n campusCards,\n status,\n translations,\n link,\n theme = contextualTheme,\n } = props;\n\n const { withBoxShadow, withRoundedCorners } = theme;\n\n React.useEffect(() => {\n if (link) {\n const handler = {\n handle: () => {\n redirect(link.href);\n },\n };\n\n MessageBroker.subscribe(handler, NavigationApplyClick.id);\n\n return () => {\n MessageBroker.unsubscribe(handler, NavigationApplyClick.id);\n };\n }\n }, [link]);\n\n React.useEffect(() => {\n const isNonApplicableLink = !!link && status === 'closed';\n\n MessageBroker.schedulePublish(\n new AdmissionCallToActionOverlayStatusChanged('nonApplicableLink', isNonApplicableLink),\n 0\n );\n }, [status, link]);\n\n return (\n \n
    \n {mainLabel}\n {helperLabel}\n
    \n
    \n {link ? (\n \n {link.label ?? translations.similarStudies}\n \n \n ) : (\n choices && (\n 1\n ? translations.applyForStudyMultipleLocations\n : translations.applyForStudy\n }\n closeLabel={translations.closeOverlay}\n campusApplicationUrl={campusApplicationUrl}\n choices={choices}\n status={status}\n theme={theme}\n >\n \n \n )\n )}\n
    \n \n );\n};\n","import * as React from 'react';\nimport type { StudyAdmissionCallToActionViewModel } from '../ViewModel/StudyAdmissionCallToActionViewModel.csharp';\nimport { AdmissionCallToAction } from '~/Features/StudyPage/Campus/Partials/AdmissionCallToAction/AdmissionCallToAction';\nimport { useStudyPageGtmEvents } from '~/Features/StudyPage/Campus/Utils/Hooks/useStudyPageGtmEvents';\n\nexport const StudyAdmissionCallToActionBlock: React.FC = props => {\n const { choices, link, status, translations, helperLabel, mainLabel, campusCards, campusApplicationUrl } = props;\n\n useStudyPageGtmEvents(choices);\n\n const mapToCTAStatus = () => {\n if (status === undefined) {\n return 'closed';\n }\n\n return status;\n };\n\n return (\n \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"StudyPageInfoBox\":\"upySpT3En7Nr6Lw3amEi\",\"Content\":\"gLMf1nRmaQLxziVqxFTg\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport type { AlertSectionVariant } from '~/Blocks/AlertSectionBlock/AlertSectionVariant.csharp';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\nimport { AlertSection } from '~/Partials/AlertSection/AlertSection';\nimport { HtmlDiv } from '~/Partials/Controls/HtmlDiv';\nimport { isHtmlString } from '~/Partials/Controls/Utils/isHtmlString';\nimport styles from './StudyPageInfoBox.module.css';\n\nexport interface StudyPageInfoBoxProps {\n header: string;\n variant: AlertSectionVariant;\n body?: HtmlString | ReactNode;\n}\n\nexport const StudyPageInfoBox: React.FC = props => {\n const { header, body, variant } = props;\n\n const renderBody = () => {\n if (isHtmlString(body)) {\n return (\n \n );\n }\n\n if (body) {\n return
    {body}
    ;\n }\n };\n\n return (\n
    \n \n {renderBody()}\n \n
    \n );\n};\n","import * as React from 'react';\nimport type { StudyPageInfoBoxProps } from '../StudyPageInfoBox/StudyPageInfoBox';\nimport { StudyPageInfoBox } from '../StudyPageInfoBox/StudyPageInfoBox';\nimport { AlertSectionVariant } from '~/Blocks/AlertSectionBlock/AlertSectionVariant.csharp';\nimport type { ICampusApplicationProcessState } from '~/Features/CampusApplication/CampusApplicationProcessState';\nimport { CampusApplicationProcessState } from '~/Features/CampusApplication/CampusApplicationProcessState';\nimport { areAllItemsAdded, isItemAdded } from '~/Features/CampusApplication/Utils/campusApplicationUtils';\nimport type { ApplicationChoiceDto } from '~/Features/Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\nimport { Link } from '~/Partials/Link/Link';\nimport { LinkVariant } from '~/Partials/Link/LinkVariant.csharp';\n\ninterface StudyPageAdmissionInfoBoxTranslations {\n basketLimitHeading: string;\n basketLimitBody: string;\n ongoingOnlineHeading: string;\n ongoingOnlineBody: string;\n studyAlreadyAddedHeading: string;\n see: string;\n yourApplication: string;\n}\n\nexport interface StudyPageAdmissionInfoBoxProps {\n editorialInfo: StudyPageInfoBoxProps;\n translations: StudyPageAdmissionInfoBoxTranslations;\n campusApplicationUrl: string;\n choices?: ApplicationChoiceDto[];\n}\n\nexport const StudyPageAdmissionInfoBox: React.FC = props => {\n const { editorialInfo, choices, translations, campusApplicationUrl } = props;\n\n const [processState, setProcessState] = React.useState(null);\n\n React.useEffect(() => {\n setProcessState(CampusApplicationProcessState());\n }, []);\n\n const mapModelToProps = () => {\n if (processState) {\n if (processState.isOnlineApplicationInProgress()) {\n return {\n header: translations.ongoingOnlineHeading,\n body: translations.ongoingOnlineBody,\n variant: AlertSectionVariant.Error,\n };\n }\n\n const isProductMultiVariant = choices && choices.length > 1;\n const isProductSingleVariant = choices && choices.length === 1;\n\n const currentChoices = processState.getAll();\n\n const areAllVariantsAdded =\n (isProductMultiVariant && areAllItemsAdded(choices, currentChoices)) ||\n (isProductSingleVariant && isItemAdded(choices[0].id, currentChoices));\n\n if (areAllVariantsAdded) {\n return {\n header: translations.studyAlreadyAddedHeading,\n body: (\n <>\n {`${translations.see} `}\n \n \n ),\n variant: AlertSectionVariant.Info,\n };\n }\n\n if (processState.isItemsLimitReached()) {\n return {\n header: translations.basketLimitHeading,\n body: translations.basketLimitBody,\n variant: AlertSectionVariant.Error,\n };\n }\n }\n\n if (editorialInfo.header && editorialInfo.body) {\n return editorialInfo;\n }\n\n return undefined;\n };\n\n const infoProps = mapModelToProps();\n\n return infoProps ? : null;\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"StudyHero\":\"KJDNoJnc8nmQLXLpWXM9\",\"MediaSectionMedia\":\"LNV9B5sW_RNCiPFf92Q6\",\"LeftContent\":\"sQOnuUCDf8DbvKUuTB0Q\",\"RightContent\":\"GCqd8XpGnEcHYxgmuBF9\",\"Breadcrumbs\":\"Klz4gcaNRbMm89gWZVSp\",\"MediaSectionWrapper\":\"qaoNeVKsZoygsFanW82x\",\"MediaSectionContent\":\"VJURLgb0RJ9Hh3D_ov85\",\"Content\":\"KIDkAMrlmNAq3dU1CSjx\",\"Inner\":\"W8HzMiRy4yInQnLLak6N\",\"ImageWrapper\":\"x05YclzW3slngqwm_Ujt\",\"Title\":\"JNnXG9xDjScwxmZ_3AQO\",\"Summary\":\"_0WxV0oYRumfK20H44yr\",\"TagsWrapper\":\"zVeF4AvTCO11RC3riNAw\",\"TagLabel\":\"klvmATVZ5T0aI0AqqSJW\",\"TagDuration\":\"PmP01KtQ6ACRV8Mac1W2\",\"ChildrenWrapper\":\"rH26ynp0X_VEqpcsEq9s\"};","import * as React from 'react';\nimport type { BreadcrumbsViewModel } from '~/Features/Breadcrumbs/BreadcrumbsViewModel.csharp';\nimport { PillTag } from '~/Features/Partials/PillTag/PillTag';\nimport { BackgroundMediaSection } from '~/Partials/BackgroundMediaSection/BackgroundMediaSection';\nimport { Breadcrumbs } from '~/Partials/Breadcrumbs/Breadcrumbs';\nimport type { LinkViewModel } from '~/Partials/Link/LinkViewModel.csharp';\nimport type { BaseImage } from '~/Partials/Picture/Picture';\nimport { Picture } from '~/Partials/Picture/Picture';\nimport { PictureProfiles } from '~/Partials/Picture/PictureProfiles';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport { stripFromHTMLNode } from '~/Partials/Utils/utils';\nimport styles from './StudyHero.module.css';\n\ninterface StudyHeroPillTag {\n tagValue: string;\n link?: Pick;\n}\n\ninterface StudyHeroProps {\n title: string;\n summary: string;\n info: {\n duration: string;\n level: StudyHeroPillTag;\n locations: StudyHeroPillTag[];\n };\n translations: {\n studyDuration: string;\n };\n breadcrumbs: BreadcrumbsViewModel;\n image: BaseImage;\n}\n\nexport const StudyHero: React.FC> = props => {\n const { title, summary, image, info, breadcrumbs, translations, children } = props;\n\n const renderLeftContent = () => (\n
    \n
    \n {info.level && (\n \n \n {info.level.tagValue}\n \n )}\n {info.duration && (\n \n \n {translations.studyDuration}:\n {info.duration}\n \n \n )}\n
    \n

    \n {summary}\n
    \n );\n\n const renderRightContent = () => (\n
    \n {info.locations && info.locations.length > 0 && (\n
    \n {info.locations.map(location => (\n \n \n {location.tagValue}\n \n ))}\n
    \n )}\n
    {children}
    \n
    \n );\n\n return (\n \n
    \n \n
    \n \n
    \n
    \n {renderLeftContent()}\n {renderRightContent()}\n
    \n
    \n \n );\n};\n","import * as React from 'react';\nimport { StudyAdmissionCallToActionBlock } from '~/Blocks/StudyAdmissionCallToActionBlock/View/StudyAdmissionCallToActionBlock';\nimport { StudyPageAdmissionInfoBox } from '~/Features/StudyPage/Campus/Partials/StudyPageAdmissionInfoBox/StudyPageAdmissionInfoBox';\nimport { StudyHero } from '~/Features/StudyPage/Campus/Sections/StudyHero/StudyHero';\nimport type { CampusStudyPageHeroViewModel } from '~/Pages/CampusStudyPage/ViewModel/Hero/CampusStudyPageHeroViewModel.csharp';\n\nexport const CampusStudyPageHero: React.FC = props => {\n const {\n title,\n summary,\n additionalInfo,\n imageViewModel,\n breadcrumbs,\n translations,\n admissionCallToAction,\n studyPageInfoBoxBlockViewModel,\n } = props;\n\n return (\n \n \n \n \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"AlertSection\":\"ubQCbWhJc3hTn5JzyODW\",\"Body\":\"KOYtHaO3ZySwd7AAuwtl\",\"Header\":\"q6a0sWIrDNdhJaZ7s7B2\",\"Variant--rounded\":\"sOcldyfvZ3q_x5wL8s9H\",\"Variant--small\":\"WTg4xe_9Wds7PqkD8sWF\",\"Icon\":\"NMWWA2c_TbVqaT8RVw37\",\"Variant--medium\":\"cwgwZSPL1fXyBUHY44_g\",\"Variant--large\":\"AAhxH6tZklOLP8HnhG3_\",\"Variant--noHeader\":\"IqtbFQ1LZwu5rell2V3T\",\"Variant--info\":\"c8seYQAsAAZHWtOnSCdz\",\"Variant--success\":\"ffEtX6PEYkK3Jw4dZQUH\",\"Variant--warning\":\"bbXkgW_3B89_Ps1b41Cj\",\"Variant--error\":\"xr9pXcvDECF6dHyPwIlv\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport { AlertSectionVariant } from '~/Blocks/AlertSectionBlock/AlertSectionVariant.csharp';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport type { Theme } from '~/Utils/Theme';\nimport styles from './AlertSection.module.css';\nimport type { AlertSectionSizeVariant } from './AlertSectionSizeVariant';\n\nexport interface AlertSectionProps {\n variant: AlertSectionVariant;\n sizeVariant?: AlertSectionSizeVariant;\n header?: string;\n headerType?: keyof Pick;\n children?: ReactNode;\n className?: string;\n headerClassName?: string;\n theme?: Theme;\n}\n\nexport const AlertSection: React.FC> = props => {\n const contextualTheme = useTheme();\n const {\n variant,\n sizeVariant = 'large',\n header,\n children,\n className,\n headerClassName,\n headerType = 'h2',\n theme = contextualTheme,\n } = props;\n\n const { withRoundedCorners } = theme;\n\n const getIconName = () => {\n switch (variant) {\n case AlertSectionVariant.Success:\n return 'check-circle';\n case AlertSectionVariant.Warning:\n return 'triangle';\n case AlertSectionVariant.Error:\n return 'error-sign';\n default:\n return 'info-circle';\n }\n };\n\n return (\n \n \n {header &&\n React.createElement(headerType, { className: classNames(styles.Header, headerClassName) }, header)}\n {children &&
    {children}
    }\n \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"BackgroundMediaSection\":\"BHZEJUDSIPpKa0oPrsHx\",\"Wrapper\":\"bLAdaCckoHBaiIC97_jU\",\"Wrapper--grid\":\"uwdDbr8iIUnkWFMVwpIF\",\"Content\":\"eh99tHo126OqTC2jRbLr\",\"Media\":\"dabmDRgUTnFwXNJ_grkU\",\"PlaceholderLogoWrapper\":\"ao2rID4I7z5HbixkFtUo\",\"Variant--withCaption\":\"HX85CpiEVtHWECQTXiNh\",\"Figure\":\"jEirhd8enG4d6AOhcLDQ\",\"Variant--fullDark\":\"xy4iFrsV2Sz8Qp0apyvq\",\"Variant--fullLight\":\"mpJQGg0dDaijqjuWkH6Z\",\"Variant--topToBottomGreyGradient\":\"AAvVhuWR4ZqvJONVflO9\",\"Variant--leftToRightDarkGreyGradient\":\"HKWJI6twVeF2fy35QptA\",\"Variant--upperTransparentLineGradient\":\"X4a8TM_Yrz4vY4qRwPCe\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { BaseImage } from '../Picture/Picture';\nimport { Picture } from '../Picture/Picture';\nimport { PictureProfiles } from '../Picture/PictureProfiles';\nimport { PicturePlaceholder } from '~/Partials/Picture/Placeholder/PicturePlaceholder';\nimport type { BackgroundMediaLayoutVariant } from './BackgroundMediaLayoutVariant';\nimport type { BackgroundMediaOverlayVariant } from './BackgroundMediaOverlayVariant';\nimport styles from './BackgroundMediaSection.module.css';\n\nexport interface BackgroundMediaSectionProps {\n id?: string;\n image?: BaseImage;\n video?: string;\n caption?: string;\n author?: string;\n overlayVariant?: BackgroundMediaOverlayVariant;\n layout?: BackgroundMediaLayoutVariant;\n className?: string;\n wrapperClassName?: string;\n contentClassName?: string;\n mediaClassName?: string;\n}\n\nexport const BackgroundMediaSection: React.FC> = props => {\n const {\n children,\n id,\n image,\n video,\n caption,\n author,\n className,\n wrapperClassName,\n contentClassName,\n mediaClassName,\n layout = 'default',\n overlayVariant = 'topToBottomGreyGradient',\n } = props;\n\n const getMediaElement = () => {\n const mediaClass = classNames(styles.Media, mediaClassName);\n\n if (video) {\n return (\n
    \n
    \n );\n }\n\n if (image) {\n return ;\n }\n\n return ;\n };\n\n const getMediaElementWithCaption = () => {\n const mediaElement = getMediaElement();\n\n return (\n
    \n {mediaElement}\n
    \n {caption && {caption}}\n {author && {author}}\n
    \n
    \n );\n };\n\n const mediaContent = caption || author ? getMediaElementWithCaption() : getMediaElement();\n\n return (\n \n \n
    {children}
    \n \n {mediaContent}\n \n );\n};\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { BreadcrumbsViewModel } from '~/Features/Breadcrumbs/BreadcrumbsViewModel.csharp';\nimport styles from './Breadcrumbs.module.css';\n\nexport interface BreadcrumbsProps extends BreadcrumbsViewModel {\n className?: string;\n}\n\nexport const Breadcrumbs: React.FC = props => {\n const { breadcrumbs, className } = props;\n\n return (\n
      \n {breadcrumbs.map(breadcrumb => (\n
    1. \n \n {breadcrumb.name}\n \n
    2. \n ))}\n
    \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"Breadcrumbs\":\"jIjgn7qoTMH3b4e0jW3j\",\"Link\":\"QqohSkg5NSBKEgLCAL46\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport type { StrictOmit } from '../Utils/typeUtils';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport type { Theme } from '~/Utils/Theme';\nimport styles from './Button.module.css';\nimport type { ButtonSize } from './ButtonSize.csharp';\nimport type { ButtonTier } from './ButtonTier.csharp';\nimport { ButtonType } from './ButtonType.csharp';\n\ntype HtmlButtonType = 'submit' | 'reset' | 'button';\n\nexport interface DefaultButtonProps {\n children: ReactNode;\n className?: string;\n htmltype?: HtmlButtonType;\n /* STYLES PROPS */\n size?: ButtonSize;\n tier?: ButtonTier;\n type?: ButtonType;\n theme?: Theme;\n}\n\ntype NativeButtonAttributes = Pick<\n React.ButtonHTMLAttributes,\n | 'aria-selected'\n | 'aria-controls'\n | 'aria-expanded'\n | 'role'\n | 'aria-haspopup'\n | 'aria-describedby'\n | 'aria-label'\n | 'tabIndex'\n | 'title'\n | 'id'\n | 'disabled'\n | 'draggable'\n | 'onClick'\n | 'onFocus'\n | 'onMouseDown'\n>;\n\nexport type ButtonProps = DefaultButtonProps & NativeButtonAttributes;\n\nexport const Button = React.forwardRef((props, ref) => {\n const { children, theme, ...passThroughProps } = props;\n const { type } = passThroughProps;\n\n if (type && type !== ButtonType.Clear) {\n return (\n \n {children}\n \n );\n }\n\n return (\n \n {children}\n \n );\n});\n\ntype RawButtonProps = StrictOmit;\n\nconst RawButton = React.forwardRef((props, ref) => {\n const { className, children, size, tier, type, htmltype = 'button', ...otherProps } = props;\n\n const getButtonClassName = () =>\n classNames(\n type && styles[`Variant--${type}`],\n tier && styles[`Variant--${tier}`],\n size && styles[`Variant--${size}`],\n className\n );\n\n return (\n \n );\n});\n\nconst ThemedButton = React.forwardRef((props, ref) => {\n const contextualTheme = useTheme();\n const { children, className, theme = contextualTheme, ...additionalProps } = props;\n\n const { withBoxShadow, withRoundedCorners } = theme;\n\n return (\n \n {children}\n \n );\n});\n","// 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 ButtonSize {\n\tXSmall = \"xSmall\",\n\tResponsiveFromXSmallToSmall = \"responsiveFromXSmallToSmall\",\n\tSmall = \"small\",\n\tResponsiveFromSmallToMedium = \"responsiveFromSmallToMedium\",\n\tResponsiveFromSmallToLarge = \"responsiveFromSmallToLarge\",\n\tResponsiveFromMediumToSmall = \"responsiveFromMediumToSmall\",\n\tMedium = \"medium\",\n\tResponsiveFromMediumToLarge = \"responsiveFromMediumToLarge\",\n\tResponsiveFromLargeToSmall = \"responsiveFromLargeToSmall\",\n\tLarge = \"large\",\n\tResponsiveFromLargeToXLarge = \"responsiveFromLargeToXLarge\",\n\tXLarge = \"xLarge\"\n}\n","// 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 ButtonTier {\n\tPrimary = \"primary\",\n\tSecondary = \"secondary\",\n\tTertiary = \"tertiary\",\n\tRed = \"red\",\n\tLegacyPrimary = \"legacyPrimary\"\n}\n","// 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 ButtonType {\n\tSolid = \"solid\",\n\tOutline = \"outline\",\n\tClear = \"clear\"\n}\n","import type { RefObject } from 'react';\nimport { useEffect, useState } from 'react';\nimport { useIsMounted } from '~/Utils/Hooks/useIsMounted';\n\nexport interface UseCollapseProps {\n isOpen: boolean;\n content: RefObject;\n}\n\n// In case of nested collapse components, we need to inherit the visibility from the parent so that\n// focusable children inside expanded collapses nested inside collapsed collapses are not focusable.\n// Unfortunately, jest is not able to simulate this behavior thus we are not able to test it.\ntype InheritVisibility = undefined;\n\ntype Visibility = 'hidden' | InheritVisibility;\ntype Overflow = 'hidden' | 'visible';\n\nconst getHeight = (content: RefObject) => {\n if (content && content.current && content.current.scrollHeight) {\n return `${content.current.scrollHeight}px`;\n }\n\n return '0px';\n};\n\nexport const useCollapse = (props: UseCollapseProps) => {\n const { isOpen, content } = props;\n\n const [height, setHeight] = useState(isOpen ? 'auto' : '0');\n const [overflow, setOverflow] = useState(isOpen ? 'visible' : 'hidden');\n const [visibility, setVisibility] = useState(isOpen ? undefined : 'hidden');\n const isMounted = useIsMounted();\n\n const toggleStyles = () => {\n if (isOpen) {\n setHeight('auto');\n setOverflow('visible');\n setVisibility(undefined);\n } else {\n setVisibility('hidden');\n }\n };\n\n useEffect(() => {\n if (isOpen) {\n setVisibility(undefined);\n\n if (!isMounted) {\n setHeight('auto');\n setOverflow('visible');\n } else {\n setHeight(getHeight(content));\n }\n } else if (isMounted) {\n setHeight(getHeight(content));\n\n // The magic:\n // Setting collapsed style after setting height to enable smooth transition based on height.\n // It must be wrapped with setTimeout to ensure that the state update is not batched with the height update.\n setTimeout(() => {\n window.requestAnimationFrame(() => {\n setOverflow('hidden');\n setHeight('0');\n });\n });\n }\n }, [isOpen]);\n\n return {\n toggleStyles,\n style: {\n overflow,\n visibility,\n height,\n },\n };\n};\n","/*\n * Based on: https://github.com/SparebankenVest/react-css-collapse\n */\n\nimport * as React from 'react';\nimport type { AriaAttributes } from 'react';\nimport { useCollapse } from './useCollapse';\n\nexport interface CollapseProps extends AriaAttributes {\n children: React.ReactNode;\n isOpen?: boolean;\n onRest?: () => void;\n className?: string;\n withMarginTransition?: boolean;\n}\n\nexport const Collapse: React.FC = props => {\n const { children, onRest, isOpen = false, className, withMarginTransition, ...rest } = props;\n\n const content = React.useRef(null);\n\n const { toggleStyles, style } = useCollapse({\n isOpen,\n content,\n });\n\n const onTransitionEnd = (event: React.TransitionEvent) => {\n if (event.target === content.current && event.propertyName === 'height') {\n toggleStyles();\n\n onRest?.();\n }\n };\n\n const styles = {\n willChange: withMarginTransition ? 'height, margin' : 'height',\n ...style,\n };\n\n return (\n
    \n {children}\n
    \n );\n};\n","import * as React from 'react';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\n\ntype NativeDivAttributes = Pick, 'id'>;\n\nexport interface HtmlDivProps extends NativeDivAttributes {\n html: HtmlString;\n className?: string;\n}\n\nexport const HtmlDiv: React.FC = props => {\n const { html, className, ...restDivProps } = props;\n\n return
    ;\n};\n","import type { HtmlString } from '~/Features/Types/HtmlString.csharp';\n\nexport function isHtmlString(content: unknown): content is HtmlString {\n return !!content && typeof content === 'object' && 'value' in content && typeof content.value === 'string';\n}\n","import axios from 'axios';\nimport { getContentLanguage } from '~/Features/Configuration/Utils/languageUtils';\n\nexport const axiosWrapper = axios.create({\n paramsSerializer: {\n indexes: null, // key=value instead of key[]=value\n },\n});\n\naxiosWrapper.interceptors.request.use(config => {\n const contentLanguage = getContentLanguage();\n\n if (contentLanguage) {\n config.headers.set('X-Api-Language', contentLanguage);\n }\n\n return config;\n});\n","import type { FormikProps } from 'formik';\nimport { getIn } from 'formik';\nimport type { ReactChild } from 'react';\nimport { makePostRequest } from '../Utils/HttpRequest/makePostRequest';\nimport type { PersonalNumberValidationRequestDto } from '~/Features/Api/PersonalNumber/PersonalNumberValidationRequestDto.csharp';\n\nexport type ValidateOptions = {\n /* options to be passed to every validator. Ex: number of choice items */\n personalNumberValidationUrl?: string;\n};\n\nexport type ValidatorFunction = (arg: T, options?: O) => boolean | Promise;\n\nexport type Validation = [ValidatorFunction, string | ReactChild];\n\nexport type FormFieldValidate = (val: T) => Promise;\n\n/*\n every ASYNC form wizard validator (actually Formik validator) should return:\n - undefined if no errors\n - string with the error message if there's an error.\n*/\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const combineValidators =\n (validations: Validation[]) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async (val: T, ...combinedValidatorOptions: any[]): Promise>>> => {\n // eslint-disable-next-line no-restricted-syntax\n for (const [validator, errorMessage = '--error--'] of validations) {\n const didPassValidator = await validator(val, ...combinedValidatorOptions);\n\n if (!didPassValidator) {\n return errorMessage;\n }\n }\n\n return undefined;\n };\n\nexport const isValidStudyVariantsList: ValidatorFunction, unknown> = val =>\n Array.isArray(val) && !!val.length;\n\nexport const isNotNull: ValidatorFunction = val => val !== null;\n\nexport const isString: ValidatorFunction = val => typeof val === 'string';\n\nexport const isNotEmptyString: ValidatorFunction = val => !!val;\n\nexport const isNotEmptyObject: ValidatorFunction = val =>\n !!val && typeof val === 'object' && val !== null && !!Object.keys(val).length;\n\nexport const isNotEmptyArray: ValidatorFunction, unknown> = val => !!val && !!val.length;\n\nexport const isNumericString: ValidatorFunction = val => !val || val === String(parseInt(val, 10)); // empty string is valid\n\nexport const isAlphaNumericString: ValidatorFunction = val => !val || HasOnlyDigitsAndLetters(val); // empty string is valid\n\nconst HasOnlyDigitsAndLetters = (val: string) => {\n const onlyDigitsAndLettersPattern = '^[A-Za-z0-9]+$';\n const matches = val.match(onlyDigitsAndLettersPattern);\n\n return !!matches && matches.length > 0;\n};\n\ntype PersonalNumberResponseType = { isValid: boolean };\n\nexport const isPersonalNumberValidAsync = async (\n val: PersonalNumberValidationRequestDto,\n options: Pick\n) => {\n if (!isString(val.personalNumber)) {\n return false;\n }\n\n if (!val.personalNumber) {\n return true; // no validation for emtpy string\n }\n\n if (!val.firstName || !val.lastName) {\n return true; // no validation for empty firstname or lastname\n }\n\n const defaultValidationResult = true;\n\n if (options.personalNumberValidationUrl) {\n const response = await makePostRequest(options.personalNumberValidationUrl, val);\n switch (response.state) {\n case 'Success':\n if (!response.data.isValid) {\n // Invalid only if \"false\" provided from validating endpoint [#285]\n return false;\n }\n\n return defaultValidationResult;\n\n default:\n return defaultValidationResult;\n }\n }\n\n return defaultValidationResult;\n};\n\nconst REGEXP_EMAIL = /^(?:(?:[A-Z0-9_%+-]\\.?)+[A-Z0-9_%+-]|[A-Z0-9_%+-])@(?:[A-Z0-9-]+\\.)+[A-Z]{2,4}$/i;\nexport const isEmail: ValidatorFunction = val => !val || REGEXP_EMAIL.test(val); // no validation for empty string\n\nexport const isShallowEqual = ({ a, b }: { a: T; b: T }) => a === b;\n\nexport const isTrue: ValidatorFunction = val => val === true;\n\nconst REGEXP_COUNTRY_CODE = /^([1-9]{1})([0-9]{1,4})$/;\nexport const isValidCountryCodeFormat: ValidatorFunction = val =>\n !val || REGEXP_COUNTRY_CODE.test(val);\n\nconst REGEXP_PHONE_NUMBER = /^([1-9]{1})([0-9]{0,11}$)/;\nexport const isValidPhoneNumber: ValidatorFunction = val => !val || REGEXP_PHONE_NUMBER.test(val);\n\nconst REGEXP_NORWEGIAN_PHONE_NUMBER = /^(4|9{1})([0-9]{7}$)/;\nexport const isValidNorwegianPhoneNumber: ValidatorFunction = val =>\n !val || REGEXP_NORWEGIAN_PHONE_NUMBER.test(val);\n\nexport const isRequired: ValidatorFunction = val => val;\n\n/* helper */\nexport function readValidationErrorFromFormik(\n formikErrors: FormikProps['errors'],\n formikTouched: FormikProps['touched'],\n fieldPath: string | string[],\n submitCount: number\n) {\n const fieldError = getIn(formikErrors, fieldPath);\n const fieldTouched = getIn(formikTouched, fieldPath) || submitCount > 0;\n\n if (fieldTouched && fieldError) {\n return fieldError;\n }\n\n // no error\n return undefined;\n}\n","import sumBy from 'lodash/sumBy';\nimport type { CampusApplicationFormSubmissionResult } from '../../../Api/CampusApplicationForm/CampusApplicationFormSubmissionResult.csharp';\nimport type { ApplicationChoiceDto } from '../../../Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\nimport type { GoogleTagManagerEcommerceProduct } from '../GoogleTagManagerModels';\nimport { GtmCommerceEventsHandler } from '../GtmCommerceEventsHandler';\nimport { CampusBrand, VocationalSchoolBrand } from '~/Partials/GoogleTagManager/AnalyticsConstants';\n\nexport class CampusAnalytics {\n public static addProducts = (items: ApplicationChoiceDto[]) => {\n const products = items.map(CampusAnalytics.createProductFromApplicationChoice);\n const actionField = CampusAnalytics.createBaseActionFieldFromApplicationChoice(items);\n\n if (products.length > 0) {\n GtmCommerceEventsHandler.pushAddProducts(products, actionField);\n }\n };\n\n public static removeProducts = (items: ApplicationChoiceDto[]) => {\n const products = items.map(CampusAnalytics.createProductFromApplicationChoice);\n const actionField = CampusAnalytics.createBaseActionFieldFromApplicationChoice(items);\n\n if (products.length > 0) {\n GtmCommerceEventsHandler.pushRemoveProducts(products, actionField);\n }\n };\n\n public static checkout = (stepNumber: number, items: ApplicationChoiceDto[]) => {\n const products = items.map(CampusAnalytics.createProductFromApplicationChoice);\n const baseActionField = CampusAnalytics.createBaseActionFieldFromApplicationChoice(items);\n\n if (products.length > 0) {\n if (stepNumber === 1) {\n GtmCommerceEventsHandler.pushBeginCheckout(products, baseActionField);\n } else {\n const checkoutActionField = {\n ...baseActionField,\n checkout_step: stepNumber,\n };\n GtmCommerceEventsHandler.pushCheckout(products, checkoutActionField);\n }\n }\n };\n\n public static applicationResult = (data: CampusApplicationFormSubmissionResult) => {\n const products = data.choices.map(CampusAnalytics.createProductFromApplicationChoice);\n const actionField = CampusAnalytics.createPurchaseActionFieldFromCampusApplication(data);\n\n GtmCommerceEventsHandler.pushPurchase(products, actionField);\n };\n\n private static createBaseActionFieldFromApplicationChoice = (items: ApplicationChoiceDto[]) => ({\n currency: '',\n value: sumBy(items, item => item.price ?? 0),\n });\n\n private static createProductFromApplicationChoice = (choice: ApplicationChoiceDto) => {\n const studyType = choice.level === VocationalSchoolBrand ? VocationalSchoolBrand : CampusBrand;\n\n return {\n item_id: choice.id,\n item_name: choice.name,\n affiliation: studyType,\n // `?.` added to prevent errors in case of form progress stored in local storage.\n // We can probably wait 1-2 semesters to be completely safe and remove that.\n item_brand: choice.educationCategories?.join(', ') ?? '',\n item_category: choice.studyFormType,\n item_category2: choice.points,\n item_category3: choice.label,\n item_variant: choice.level,\n // default values set on a base of consultations with client\n price: 100,\n quantity: 1,\n } satisfies GoogleTagManagerEcommerceProduct;\n };\n\n private static createPurchaseActionFieldFromCampusApplication = (\n result: CampusApplicationFormSubmissionResult\n ) => ({\n currency: '',\n value: sumBy(result.choices, item => item.price ?? 0),\n transaction_id: result.requestId,\n coupon: '',\n shipping: 0,\n tax: 0,\n });\n}\n","export const OnlineStudyBrand = 'Nettstudier';\n\nexport const SingleSubject = 'Enkeltemne';\n\nexport const VocationalSchoolBrand = 'Fagskole';\n\nexport const CampusBrand = 'Stedsbasert';\n\nexport const SchoolName = 'Høyskolen Kristiania';\n","import type { ApplicationChoiceDto } from '../../Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\nimport { CampusBrand, OnlineStudyBrand, VocationalSchoolBrand } from '~/Partials/GoogleTagManager/AnalyticsConstants';\nimport { TelemetryLogger } from '~/Utils/Logging/TelemetryLogger';\nimport type {\n GoogleTagManagerEcommerceAdd,\n GoogleTagManagerEcommerceBaseActionField,\n GoogleTagManagerEcommerceBeginCheckout,\n GoogleTagManagerEcommerceCheckout,\n GoogleTagManagerEcommerceCheckoutActionField,\n GoogleTagManagerEcommerceCheckoutOption,\n GoogleTagManagerEcommerceProduct,\n GoogleTagManagerEcommerceProductDetail,\n GoogleTagManagerEcommercePurchase,\n GoogleTagManagerEcommercePurchaseActionField,\n GoogleTagManagerEcommerceRemove,\n} from './GoogleTagManagerModels';\nimport { GtmEventsBase } from './GtmEventsBase';\n\nexport class GtmCommerceEventsHandler extends GtmEventsBase {\n public static pushPurchase = (\n items: GoogleTagManagerEcommerceProduct[],\n actionField: GoogleTagManagerEcommercePurchaseActionField\n ) => {\n const ecommerce: GoogleTagManagerEcommercePurchase = {\n ...actionField,\n items,\n };\n\n GtmEventsBase.push({ event: 'purchase', ecommerce });\n };\n\n public static pushAddProducts = (\n items: GoogleTagManagerEcommerceProduct[],\n actionField: GoogleTagManagerEcommerceBaseActionField\n ) => {\n const ecommerce: GoogleTagManagerEcommerceAdd = {\n ...actionField,\n items,\n };\n GtmEventsBase.push({ event: 'add_to_cart', ecommerce });\n };\n\n public static pushRemoveProducts = (\n items: GoogleTagManagerEcommerceProduct[],\n actionField: GoogleTagManagerEcommerceBaseActionField\n ) => {\n const ecommerce: GoogleTagManagerEcommerceRemove = {\n ...actionField,\n items,\n };\n GtmEventsBase.push({ event: 'remove_from_cart', ecommerce });\n };\n\n public static pushBeginCheckout = (\n items: GoogleTagManagerEcommerceProduct[],\n actionField: GoogleTagManagerEcommerceBaseActionField\n ) => {\n const ecommerce: GoogleTagManagerEcommerceBeginCheckout = {\n ...actionField,\n items,\n };\n GtmEventsBase.push({ event: 'begin_checkout', ecommerce });\n };\n\n public static pushCheckout = (\n items: GoogleTagManagerEcommerceProduct[],\n actionField: GoogleTagManagerEcommerceCheckoutActionField\n ) => {\n const ecommerce: GoogleTagManagerEcommerceCheckout = {\n ...actionField,\n items,\n };\n GtmEventsBase.push({ event: 'checkout', ecommerce });\n };\n\n public static pushCheckoutOption = (checkout_step: number, option?: string) => {\n const eventName = 'checkout_option';\n const ecommerce: GoogleTagManagerEcommerceCheckoutOption = {\n checkout_option: {\n actionField: { checkout_step, option: option || eventName },\n },\n };\n\n GtmEventsBase.push({ event: eventName, ecommerce });\n };\n\n public static pushProductDetail = (newChoices: ApplicationChoiceDto[]) => {\n const ecommerce = {\n detail: {\n items: newChoices.map(GtmCommerceEventsHandler.createProductFromApplicationChoice),\n actionField: '',\n },\n } satisfies GoogleTagManagerEcommerceProductDetail;\n GtmEventsBase.push({ event: 'product_detail', ecommerce });\n };\n\n private static createProductFromApplicationChoice = (choice: ApplicationChoiceDto) => {\n const studyType =\n choice.level === VocationalSchoolBrand\n ? VocationalSchoolBrand\n : choice.variantCity === OnlineStudyBrand\n ? OnlineStudyBrand\n : CampusBrand;\n\n if (!choice.educationCategories) {\n TelemetryLogger.errorMessage(`Missing education categories for subject ${choice.id}`);\n choice.educationCategories = [];\n }\n\n return {\n item_id: choice.id,\n item_name: choice.name,\n affiliation: studyType,\n item_brand: choice.educationCategories.join(', '),\n item_category: choice.studyFormType,\n item_category2: choice.points,\n item_category3: choice.label,\n item_variant: choice.level,\n // default values set on a base of consultations with client\n price: choice.price ?? 100,\n quantity: 1,\n } satisfies GoogleTagManagerEcommerceProduct;\n };\n}\n","import ExecutionContext from '../../ExecutionContext';\nimport type { GtmPageStatsViewModel } from '../GtmPageStats/GtmPageStatsViewModel.csharp';\nimport type { GoogleTagManagerData, GoogleTagManagerProperties } from './GoogleTagManagerModels';\n\ntype DataLayerModel = GoogleTagManagerData | GoogleTagManagerProperties;\n\nexport class GtmEventsBase {\n public static pushGtmPageStats = (gtmPageStatsViewModel: GtmPageStatsViewModel) => {\n GtmEventsBase.push(gtmPageStatsViewModel.properties);\n };\n\n public static pushEvent = (eventName: string, payLoad: GoogleTagManagerProperties = []) => {\n GtmEventsBase.push({ event: eventName, ...payLoad });\n };\n\n protected static push(data: DataLayerModel) {\n if (ExecutionContext.IsServerSide()) {\n return;\n }\n\n const { dataLayer } = window as any;\n dataLayer && dataLayer.push(data);\n }\n}\n","import * as React from 'react';\nimport type { CollapseProps } from '~/Partials/Collapse/Collapse';\nimport { Collapse } from '~/Partials/Collapse/Collapse';\n\nexport const LazyCollapse: React.FC = props => {\n const { isOpen, children, ...restProps } = props;\n\n const [isBeforeCollapsing, setIsBeforeCollapsing] = React.useState(isOpen);\n\n const handleOnRest = () => setIsBeforeCollapsing(isOpen);\n\n const shouldContentBeRendered = isOpen || isBeforeCollapsing;\n\n // Effect that trigger only when `isOpen` changes.\n // It compares it with the internal state to determine if the transition is about to start.\n React.useEffect(() => {\n if (isBeforeCollapsing !== isOpen) {\n setIsBeforeCollapsing(true);\n }\n }, [isOpen]);\n\n return (\n \n {shouldContentBeRendered && children}\n \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"Link\":\"XezMfDvRba8HKhHr79wm\",\"Variant--button\":\"UssovIOXlEuxxbOHY4c4\",\"Label\":\"DdPYOTimBd1c8zDeoFgi\",\"Variant--default\":\"BaRcrU5NpyAMFJiitXyJ\",\"Variant--clear\":\"B5Z4_vbRcPt248iwmQXi\",\"ExternalIcon\":\"STANzowJsaT4J9r68lKO\",\"Variant--primaryVariant\":\"Ao72_5IgozgF9TjFNNMg\",\"Variant--secondaryVariant\":\"LJeoDEcvQBM1fqdwcmyQ\",\"Variant--lightBlackVariant\":\"acIUmsBFtHkURrDJnial\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport buttonStyles from '../Button/Button.module.css';\nimport { ButtonSize } from '../Button/ButtonSize.csharp';\nimport { ButtonTier } from '../Button/ButtonTier.csharp';\nimport { ButtonType } from '../Button/ButtonType.csharp';\nimport { SvgIcon } from '../SvgIcon/SvgIcon';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport type { StrictOmit } from '~/Partials/Utils/typeUtils';\nimport { omitProperty } from '~/Partials/Utils/utils';\nimport type { Theme } from '~/Utils/Theme';\nimport styles from './Link.module.css';\nimport { LinkType } from './LinkType.csharp';\nimport { LinkVariant } from './LinkVariant.csharp';\nimport type { StyledLinkViewModel } from './StyledLinkViewModel.csharp';\n\nexport interface BaseLinkProps extends StrictOmit {\n theme?: Theme;\n labelClassName?: string;\n}\n\ninterface LinkWithLabel extends BaseLinkProps {\n label: string;\n}\n\ninterface LinkWithChildren extends BaseLinkProps {\n children: ReactNode;\n}\n\ntype NativeLinkAttributes = Pick<\n React.AnchorHTMLAttributes,\n | 'aria-selected'\n | 'aria-controls'\n | 'aria-expanded'\n | 'role'\n | 'aria-haspopup'\n | 'aria-describedby'\n | 'aria-label'\n | 'tabIndex'\n | 'onClick'\n | 'lang'\n | 'download'\n | 'title'\n>;\n\nexport type LinkProps = (LinkWithChildren | LinkWithLabel) & NativeLinkAttributes;\n\nexport const Link = React.forwardRef>((props, ref) => {\n const { children, theme, ...passThroughProps } = props;\n const { type, buttonType } = passThroughProps;\n\n const filteredProps = 'label' in passThroughProps ? omitProperty(passThroughProps, 'label') : passThroughProps;\n\n const elementToRender = children ?? ('label' in props && props.label);\n\n if (type === LinkType.Button && buttonType !== ButtonType.Clear) {\n return ;\n }\n\n return ;\n});\n\ninterface RawLinkProps extends StrictOmit, NativeLinkAttributes {\n elementToRender: ReactNode;\n}\n\nconst RawLink = React.forwardRef((props, ref) => {\n const {\n elementToRender,\n className,\n labelClassName,\n type = LinkType.Default,\n variant = LinkVariant.Default,\n buttonType = ButtonType.Solid,\n buttonTier = ButtonTier.LegacyPrimary,\n buttonSize = ButtonSize.Large,\n external = false,\n showIsExternal = true,\n ...additionalProps\n } = props;\n\n const getLinkClassName = () => {\n if (type === LinkType.Button) {\n return classNames(\n styles.Link,\n styles['Variant--button'],\n buttonStyles[`Variant--${buttonType}`],\n buttonStyles[`Variant--${buttonTier}`],\n buttonStyles[`Variant--${buttonSize}`],\n className\n );\n }\n\n return classNames(\n styles.Link,\n styles[`Variant--${type}`],\n variant !== 'default' && styles[`Variant--${variant}Variant`],\n className\n );\n };\n\n return (\n \n
    {elementToRender}
    \n {external && showIsExternal && }\n \n );\n});\n\ninterface ThemedButtonLinkProps extends RawLinkProps {\n theme?: Theme;\n}\n\nconst ThemedButtonLink = React.forwardRef((props, ref) => {\n const contextualTheme = useTheme();\n const { className, theme = contextualTheme, ...additionalProps } = props;\n\n const { withBoxShadow, withRoundedCorners } = theme;\n\n return (\n \n );\n});\n","// 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 LinkType {\n\tDefault = \"default\",\n\tButton = \"button\",\n\tClear = \"clear\"\n}\n","// 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 LinkVariant {\n\tDefault = \"default\",\n\tPrimary = \"primary\",\n\tSecondary = \"secondary\",\n\tLightBlack = \"lightBlack\"\n}\n","import * as React from 'react';\nimport type { ReactNode } from 'react';\n\ninterface ListProps extends Pick, 'role' | 'tabIndex' | 'onKeyDown'> {\n items: ReadonlyArray;\n renderItem: (item: T, index: number) => ReactNode;\n className?: string;\n}\n\nconst ListComponent = (props: ListProps, ref?: React.Ref) => {\n const { items, renderItem, className, ...otherProps } = props;\n\n return (\n
      \n {items.map((item, index) => renderItem(item, index))}\n
    \n );\n};\n\ntype GenericForwardRefList = (\n props: ListProps & { ref?: React.Ref }\n) => React.ReactElement;\n\nexport const List = React.forwardRef(ListComponent) as GenericForwardRefList;\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\n\nconst portalContainerId = 'portal-container';\n\nexport const ClientSidePortal: React.FC = props => {\n const { children } = props;\n\n const portalContainer = document.getElementById(portalContainerId);\n const [isAttachedToDOM, setIsAttachedToDOM] = React.useState(false);\n\n if (!portalContainer) {\n throw new Error(`Portal requires element with id '${portalContainerId}' to be present in DOM`);\n }\n\n const elementReference = React.useRef(null);\n\n if (!elementReference.current) {\n elementReference.current = document.createElement('div');\n }\n\n React.useEffect(() => {\n if (elementReference.current) {\n portalContainer.appendChild(elementReference.current);\n setIsAttachedToDOM(true);\n }\n\n return () => {\n if (elementReference.current) {\n portalContainer.removeChild(elementReference.current);\n setIsAttachedToDOM(false);\n }\n };\n }, [portalContainer]);\n\n const portalContent = isAttachedToDOM && children;\n\n return createPortal(portalContent, elementReference.current);\n};\n","import * as React from 'react';\nimport { useIsMounted } from '~/Utils/Hooks/useIsMounted';\nimport { ClientSidePortal } from './ClientSidePortal';\n\nexport const Portal: React.FC = props => {\n const { children } = props;\n const isMounted = useIsMounted();\n\n return isMounted ? {children} : null;\n};\n","import { FocusTrap } from 'focus-trap-react';\nimport type { FC, ReactNode } from 'react';\nimport React from 'react';\nimport { useCloseHandlersWithoutDuplicatedCalls } from '~/Utils/Hooks/useCloseHandlersWithoutDuplicatedCalls';\nimport { ScrollLock } from '~/Utils/ScrollLock/ScrollLock';\n\nexport interface ModalWrapperProps {\n isScrollLocked: boolean;\n isFocusTrapActive: boolean;\n children: (buttonClickClose: () => void) => ReactNode;\n close: () => void;\n shouldHideMainScrollBar?: boolean;\n}\n\nexport const ModalWrapper: FC = props => {\n const { isFocusTrapActive, isScrollLocked, children, close, shouldHideMainScrollBar } = props;\n\n const { focusTrapDeactivationClose, buttonClickClose } = useCloseHandlersWithoutDuplicatedCalls(\n close,\n isFocusTrapActive\n );\n\n return (\n <>\n \n \n {/*\n * TabIndex is needed here, because by default, when clicking on non-focusable element inside modal\n * browser focuses body element: https://github.com/focus-trap/focus-trap/issues/587.\n */}\n
    {children(buttonClickClose)}
    \n \n \n );\n};\n","import * as React from 'react';\nimport { useVariableWithStableRef } from './useVariableWithStableRef';\n\nexport function useCloseHandlersWithoutDuplicatedCalls(close: () => void, isOpened: boolean) {\n const closeRef = useVariableWithStableRef(close);\n const shouldDeactivateInvokeCloseRef = React.useRef(false);\n\n React.useEffect(() => {\n if (isOpened) {\n shouldDeactivateInvokeCloseRef.current = true;\n }\n }, [isOpened]);\n\n const focusTrapDeactivationClose = () => shouldDeactivateInvokeCloseRef.current && closeRef.current?.();\n\n const buttonClickClose = () => {\n shouldDeactivateInvokeCloseRef.current = false;\n close();\n };\n\n return { focusTrapDeactivationClose, buttonClickClose };\n}\n","export const constructImageSharpUrl = (baseUrl: string, width: number) => `${baseUrl}?width=${width}`;\n","import classNames from 'classnames';\nimport clamp from 'lodash/clamp';\nimport * as React from 'react';\nimport type { Theme } from '~/Utils/Theme';\nimport { themeDefaultValues } from '~/Utils/Theme';\nimport styles from './Picture.module.css';\nimport { constructImageSharpUrl } from './Utils/constructImageSharpUrl';\n\nexport interface PictureSource {\n allowedWidths: number[];\n sizes: string[];\n}\n\nexport interface PictureProfile {\n sources: PictureSource[];\n defaultWidth: number;\n}\n\nexport interface FocalPoint {\n x: number;\n y: number;\n}\n\nexport interface BaseImage {\n url: string;\n alt: string;\n focalPoint?: FocalPoint;\n lazyLoading?: boolean;\n}\n\nexport interface PictureDefinition extends BaseImage {\n profile: PictureProfile;\n}\n\nexport interface PictureProps extends PictureDefinition {\n theme?: Pick;\n className?: string;\n}\n\nexport const Picture: React.FC> = props => {\n const { url, alt, focalPoint, profile, className, theme = themeDefaultValues, lazyLoading = true } = props;\n\n const { withRoundedCorners } = theme;\n\n const createPicture = (pictureUrl: string, pictureAlt: string, pictureProfile: PictureProfile) => {\n const [mainSource] = pictureProfile.sources;\n const sourceSizes = mainSource.sizes.join(', ');\n const sourceSrcSets = mainSource.allowedWidths\n .map(width => `${constructImageSharpUrl(pictureUrl, width)} ${width}w`)\n .join(', ');\n\n const getPosition = (point: FocalPoint) => {\n const xPosition = clamp(point.x, 0, 1);\n const yPosition = clamp(point.y, 0, 1);\n\n return `${xPosition * 100}% ${yPosition * 100}%`;\n };\n\n return (\n \n \n \n \n );\n };\n\n return (\n
    \n {createPicture(url, alt, profile)}\n
    \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"Picture\":\"slJnKPGAAIKofsQwQBjL\",\"Variant--rounded\":\"vPKYJ9xnnqorRitmkm3i\"};","import type { PictureProfile } from '~/Partials/Picture/Picture';\n\nexport class PictureProfiles {\n static readonly threeColumnsElement: PictureProfile = {\n defaultWidth: 500,\n sources: [\n {\n allowedWidths: [175, 375, 500, 768],\n sizes: ['(min-width: 1920px) 500px', '(min-width: 768px) 25vw', '100vw'],\n },\n ],\n };\n\n static readonly fourColumnsElement: PictureProfile = {\n defaultWidth: 500,\n sources: [\n {\n allowedWidths: [375, 500, 768],\n sizes: ['(min-width: 768px) 33vw', '100vw'],\n },\n ],\n };\n\n static readonly sixColumnsElement: PictureProfile = {\n defaultWidth: 500,\n sources: [\n {\n allowedWidths: [375, 500, 768, 1024],\n sizes: ['(min-width: 768px) 50vw', '100vw'],\n },\n ],\n };\n\n static readonly fullWidth: PictureProfile = {\n defaultWidth: 1440,\n sources: [\n {\n allowedWidths: [375, 768, 1024, 1440, 1920],\n sizes: ['100vw'],\n },\n ],\n };\n\n static readonly horizontal: PictureProfile = {\n defaultWidth: 1440,\n sources: [\n {\n allowedWidths: [375, 768, 1440],\n sizes: ['(min-width: 1440px) 1440px', '100vw'],\n },\n ],\n };\n\n static readonly vertical: PictureProfile = {\n defaultWidth: 552,\n sources: [\n {\n allowedWidths: [375, 768, 1536],\n sizes: ['(max-width: 767px) 100vw', '(min-width: 768px) 552px'],\n },\n ],\n };\n\n static readonly callout: PictureProfile = {\n defaultWidth: 258,\n sources: [\n {\n allowedWidths: [120, 240],\n sizes: ['(max-width: 767px) 100vw', '(min-width: 768) 120px'],\n },\n ],\n };\n\n static readonly contentCard: PictureProfile = {\n defaultWidth: 1440,\n sources: [\n {\n allowedWidths: [375, 768, 1136],\n sizes: ['(min-width: 1024px) 1136px', '(min-width: 768px) 768px', '100vw'],\n },\n ],\n };\n\n static readonly studyPortfolioItem: PictureProfile = {\n defaultWidth: 630,\n sources: [\n {\n allowedWidths: [260, 340, 410, 560, 675, 710, 810, 870],\n sizes: ['(max-width: 767px) 90vw', '(min-width: 768px) 45vw'],\n },\n ],\n };\n\n static readonly galleryItemSquare: PictureProfile = {\n defaultWidth: 480,\n sources: [\n {\n allowedWidths: [300, 380, 480],\n sizes: ['(min-width: 476px) 380px', '(min-width: 768px) 480px', '300px'],\n },\n ],\n };\n\n static readonly galleryItemVertical: PictureProfile = {\n defaultWidth: 360,\n sources: [\n {\n allowedWidths: [360, 520],\n sizes: ['(max-width: 767px) 100vw', '(min-width: 768px) 360px'],\n },\n ],\n };\n\n static readonly galleryItemHorizontal: PictureProfile = {\n defaultWidth: 640,\n sources: [\n {\n allowedWidths: [640],\n sizes: ['(max-width: 767px) 80vw', '(min-width: 768px) 640px'],\n },\n ],\n };\n\n static readonly mainPosterVertical: PictureProfile = {\n defaultWidth: 500,\n sources: [\n {\n allowedWidths: [500, 768, 1024, 1300],\n sizes: ['(min-width: 768px) 70vw', '100vw'],\n },\n ],\n };\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"LogoWrapper\":\"rLPb41_nB0G4MecZ4mE5\",\"Logo\":\"tZgaCxFP4U3Uwa4Sad4N\",\"Variant--default\":\"ZSbIyUzr6rSK_5dXtkvi\",\"Variant--light\":\"CEuKCgcYyO4PiyJodS9w\",\"Variant--rounded\":\"ubaUESvsjg4uza8S1zV9\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { Theme } from '~/Utils/Theme';\nimport { themeDefaultValues } from '~/Utils/Theme';\nimport styles from './PicturePlaceholder.module.css';\nimport type { PlaceholderVariant } from './PlaceholderVariant';\n\nexport interface PicturePlaceholderProps {\n variant?: PlaceholderVariant;\n className?: string;\n logoWrapperClassName?: string;\n theme?: Theme;\n}\n\nexport const PicturePlaceholder: React.FC> = props => {\n const { className, logoWrapperClassName, theme = themeDefaultValues, variant = 'default' } = props;\n\n const { withRoundedCorners } = theme;\n\n return (\n \n
    \n
    \n
    \n
    \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"PillTag\":\"QfpSu3R9osOn5mtmUmRN\",\"Variant--basic\":\"Iga6BKVCOIbIKJLg1wb5\",\"Variant--xSmall\":\"CGu3fo6V4n8rvQtY5dQ5\",\"Variant--link\":\"CBFAt9vEsMs6Ef1NVotO\",\"LinkLabel\":\"EQIhE5ieMUG9tN9YN86_\",\"Variant--small\":\"jno52DfczcFYoXwAJOAu\",\"Variant--normal\":\"_YiOaSqqzZqBucsGKGGx\",\"Variant--responsiveFromXSmallToSmall\":\"i_x18TfEx_kjFRYVMYNV\",\"Variant--defaultFont\":\"K10DrQZg0Ljzn8q06yUL\",\"Variant--lightFont\":\"EPjsXy4Ah89AtUfpopbN\",\"Variant--redFont\":\"CSqw44gNAWUuQn5nAEDg\",\"Variant--brightRedFont\":\"JFZKwCm93ZF9b4QZBloi\",\"Variant--turquoiseFont\":\"ho_AsZp7pnyvU0aEuiI0\",\"Variant--greyFont\":\"Fc3YhwM3qiZ1A4FTXcCA\",\"Variant--blueFont\":\"kqVAYZpkW0vdVQ8mxp75\",\"Variant--lightBlueFont\":\"YVmiq1HSMu0b9TAQm1mJ\",\"Variant--greenFont\":\"T27rBKbJ7mt07BMDlGo9\",\"Variant--lightGreenFont\":\"O9H6rk53o1ekQFNAuxWg\",\"Variant--yellowFont\":\"ODEi7cyEjUP9PIIDRonC\",\"Variant--lightGreyFont\":\"Ntivk05C5UEuvDQtWztK\",\"Variant--darkRedFont\":\"qhi17gMD2ROz0R8OqUYS\",\"Variant--default\":\"RN56_8vnmQNwz00mGyCO\",\"Variant--solid\":\"U9uDXh99G9DWi_Yh96aO\",\"Variant--dark\":\"lgn5jtFtWmCfY3jJKvE1\",\"Variant--red\":\"VsFopTmCCmSApXbdhQom\",\"Variant--brightRed\":\"ftxYN6Cf0R37irTe8gq3\",\"Variant--turquoise\":\"YuIlrFavmOORgYZil8jK\",\"Variant--grey\":\"AK7QRdIj4UViy_jglQrq\",\"Variant--blue\":\"_rP1cjzAVdEGnSpmwJ5n\",\"Variant--lightBlue\":\"RXdTHCoDDivjBtluNb06\",\"Variant--green\":\"nspvq7AyQk0C3uXdkIyc\",\"Variant--lightGreen\":\"C_ZIPBTbyPsC8bGWagOy\",\"Variant--yellow\":\"uEQY40QHJ5d4r2ff9Bja\",\"Variant--lightGrey\":\"qdmgS7umAD2PiOGAaUYw\",\"Variant--darkRed\":\"Ec8DIxS1MzwW3YxrCTHq\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport { Link } from '~/Partials/Link/Link';\nimport { LinkType } from '~/Partials/Link/LinkType.csharp';\nimport styles from './PillTag.module.css';\nimport type { PillTagFontColor } from './PillTagFontColor';\nimport type { PillTagSize } from './PillTagSize';\nimport type { PillTagType } from './PillTagType';\nimport type { PillTagVariant } from './PillTagVariant';\n\nexport interface PillTagProps {\n title?: string;\n variant?: PillTagVariant;\n type?: PillTagType;\n size?: PillTagSize;\n href?: string;\n fontColor?: PillTagFontColor;\n className?: string;\n}\n\nexport const PillTag: React.FC> = props => {\n const {\n title,\n href,\n children,\n className,\n variant = 'default',\n size = 'normal',\n type = 'solid',\n fontColor = 'default',\n } = props;\n\n const baseProps = {\n className: classNames(\n styles.PillTag,\n styles[`Variant--${variant}`],\n styles[`Variant--${size}`],\n styles[`Variant--${type}`],\n styles[`Variant--${fontColor}Font`],\n href ? styles['Variant--link'] : styles['Variant--basic'],\n className\n ),\n title,\n };\n\n if (href) {\n return (\n \n {children}\n \n );\n }\n\n return
    {children}
    ;\n};\n","import * as React from 'react';\nimport type { ReactNode } from 'react';\nimport type { StrictOmit } from '~/Partials/Utils/typeUtils';\nimport type { RadioGroupBaseProps } from './RadioGroup';\n\ntype RadioGroupContextProps = StrictOmit;\n\ninterface RadioGroupProviderProps extends RadioGroupContextProps {\n children: ReactNode;\n}\n\nconst radioGroupContext = React.createContext({\n name: '',\n onChange: () => {},\n});\n\nexport const useRadioGroupContext = () => {\n const context = React.useContext(radioGroupContext);\n\n if (!context) {\n throw new Error(`Cannot render RadioGroup component`);\n }\n\n return context;\n};\n\nexport const RadioGroupProvider = (props: RadioGroupProviderProps) => {\n const { Provider } = radioGroupContext;\n const { children } = props;\n\n return {children};\n};\n","import * as React from 'react';\nimport type { IconsEnum } from '~/Features/IconsEnum.csharp';\nimport { SvgIconBase } from './SvgIconBase';\nimport { assetPathBuilder } from './Utils/Utils';\n\nexport type IconName = `${IconsEnum}`;\n\nexport interface SvgIconProps {\n iconName: `${IconsEnum}`;\n className?: string;\n}\n\nexport const SvgIcon: React.FC> = props => {\n const { iconName, className } = props;\n const iconPath = assetPathBuilder(iconName);\n\n return ;\n};\n","import classNames from 'classnames';\nimport type { FC } from 'react';\nimport React from 'react';\n\ninterface SvgIconBaseProps {\n path: string;\n className?: string;\n}\n\nexport const SvgIconBase: FC> = props => {\n const { path, className } = props;\n\n return (\n \n \n \n \n \n );\n};\n","export const assetPathBuilder = (iconName: string, filled = false) => {\n const formattedIconName = iconNameMapper(iconName);\n const formattedAssetsPath = formatPath(assetsPath, false);\n const formattedBuildHash = formatPath(buildHash);\n const filledResources = filled ? 'Filled' : '';\n\n return `${formattedAssetsPath}/iconsSprite${filledResources}${formattedBuildHash}.svg#sprite-${formattedIconName}`;\n};\n\nconst formatPath = (path?: string, withDot = true) => (path ? `${withDot ? '.' : ''}${path}` : '');\n\nexport const iconNameMapper = (iconName: string) => {\n switch (iconName) {\n case 'å':\n return 'aring';\n case 'æ':\n return 'ae';\n case 'ø':\n return 'oslash';\n default:\n return iconName;\n }\n};\n","import { isAxiosError } from 'axios';\nimport { axiosWrapper } from '../../FetchData/axiosWrapper';\n\nexport const makePostRequest = async (\n url: string,\n payload: TRequestPayload\n): Promise | ClientError | ServerError | RequestError | UndefinedError> => {\n try {\n const result = await axiosWrapper.post(url, payload);\n\n return {\n state: 'Success',\n data: result.data,\n };\n } catch (error) {\n if (isAxiosError(error)) {\n if (error.response) {\n if (error.response.status.toString().startsWith('4')) {\n return {\n code: error.response.status,\n state: 'ClientError',\n message: error.response.data?.message || error.message,\n };\n }\n\n if (error.response.status.toString().startsWith('5')) {\n return {\n code: error.response.status,\n state: 'ServerError',\n };\n }\n } else if (error.request) {\n return {\n code: error.request.status,\n state: 'RequestError',\n };\n }\n }\n\n return {\n state: 'UndefinedError',\n };\n }\n};\n\nexport type ResultStatus = SuccessState | ClientErrorState | ServerErrorState | RequestErrorState | UndefinedState;\n\ninterface Success {\n state: SuccessState;\n data: T;\n}\n\ninterface HttpError {\n code: number;\n state: Type;\n}\n\nexport type RequestError = HttpError;\nexport type ServerError = HttpError;\nexport type UndefinedError = Pick, 'state'>;\nexport type ClientError = HttpError & { message?: string };\n\ntype SuccessState = 'Success';\ntype ClientErrorState = 'ClientError';\ntype RequestErrorState = 'RequestError';\ntype ServerErrorState = 'ServerError';\ntype UndefinedState = 'UndefinedError';\n","import type { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport omit from 'lodash/omit';\nimport type { RefObject } from 'react';\nimport ExecutionContext from '../../ExecutionContext';\nimport type { Money } from '../../Money.csharp';\nimport { axiosWrapper } from '../FetchData/axiosWrapper';\nimport { getContentLanguage } from '~/Features/Configuration/Utils/languageUtils';\nimport type { Falsy, StrictOmit } from '~/Partials/Utils/typeUtils';\n\nexport const omitProperty = (\n object: TObj,\n ...args: TArgs[]\n): StrictOmit => omit(object, args);\n\n/**\n * compare values\n * TODO: this is temporary solution.\n * make it better and faster or use some small lib\n */\nexport function checkEquals(a: T, b: T) {\n try {\n /** FIXME:\n * JSON.stringify \"ignores\" functions so there\n * is no sense to compare functions.. will always be true\n */\n return JSON.stringify(a) === JSON.stringify(b);\n } catch (e) {\n return false;\n }\n}\n\n/* TODO - needs some work with it */\n\n// Replace with new makePostRequest\nexport async function makePostRequestOld(\n url: string,\n params: ParamsType,\n config: AxiosRequestConfig = {}\n) {\n // No try-catch on purposes.\n const response = await axiosWrapper.post(url, params, config);\n\n return response as AxiosResponse;\n}\n\nexport function objectAssignToEmptyFields>(\n source: TObject,\n fields: TFields\n) {\n /* TODO: test & doc & make code more readable maybe? */\n return Object.entries(source).reduce((acc, [key, oldVal]) => {\n const newVal = fields[key as keyof TObject];\n\n // Only non-boolean \"falsy\" value will be replaced.\n const isOldValueEmpty = () => !oldVal && typeof oldVal !== 'boolean';\n\n // And only if new value is \"truthy\" or boolean\n const isNewValueNonEmpty = () => !!newVal || typeof newVal === 'boolean';\n\n return {\n ...acc,\n [key]: isOldValueEmpty() && isNewValueNonEmpty() ? newVal : oldVal,\n };\n }, {} as TObject);\n}\n\nexport function cloneArrayAndUpdateSingleItem(source: T[], item: T, updateFunction: (oldItem: T) => T) {\n const index = source.indexOf(item);\n const updatedItem = updateFunction(item);\n\n return [...source.slice(0, index), updatedItem, ...source.slice(index + 1)];\n}\n\nexport const moneyToString = (money: Money) => {\n const amountFormatted = formatAmount(money.amount);\n const currencyFormatted = formatCurrency(money.currencyCode);\n\n return money.currencyCode === 'NOK'\n ? `${currencyFormatted} ${amountFormatted}`\n : `${amountFormatted} ${currencyFormatted}`;\n};\n\nconst formatAmount = (amount: number) => {\n const parts = amount.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n\n return parts.join('.');\n};\n\nconst formatCurrency = (currency: string) => (currency === 'NOK' ? 'kr' : currency);\n\nexport const formatNumber = (value: number) => value.toLocaleString(getContentLanguage());\n\nexport const redirect = (url: string) => {\n if (ExecutionContext.IsServerSide()) {\n return;\n }\n\n window.location.href = url.indexOf('/') === 0 ? `${window.location.origin}${url}` : url;\n};\n\nexport const reload = () => {\n if (ExecutionContext.IsServerSide()) {\n return;\n }\n\n window.location.reload();\n};\n\nexport const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\nexport const getElementById = (id: string) => {\n if (!ExecutionContext.IsServerSide()) {\n return document.getElementById(id);\n }\n};\nexport const scrollToElement = (\n element: HTMLElement,\n behavior: ScrollBehavior = 'smooth',\n block?: ScrollLogicalPosition,\n inline?: ScrollLogicalPosition\n) => {\n if (!ExecutionContext.IsServerSide()) {\n element.scrollIntoView({\n behavior,\n block,\n inline,\n });\n }\n};\n\nexport const smoothScrollToSectionById = (id: string) => {\n const section = getElementById(id);\n\n if (section) {\n scrollToElement(section);\n }\n};\n\nexport const smoothScrollToSectionByRef = (ref: RefObject) => {\n if (ref.current) {\n scrollToElement(ref.current);\n }\n};\n\nexport const scrollToTop = () => scrollTo(0, 0);\n\nexport const isTruthy = (item: T | Falsy): item is T => !!item;\n\nexport const getCurrentUrl = () => (ExecutionContext.IsServerSide() ? undefined : window.location.href);\n\nexport const toUrl = (url: string) => {\n ExecutionContext.ThrowIfServerSide();\n\n return new URL(url, `${location.protocol}//${location.hostname}${location.port ? `:${location.port}` : ''}`);\n};\n\nfunction legacyCopyTextToClipboard(text: string) {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n}\n\nexport async function copyTextToClipboard(text: string) {\n // eslint-disable-next-line compat/compat -- we first check whether the browser supports the clipboard API\n navigator.clipboard ? await navigator.clipboard.writeText(text) : legacyCopyTextToClipboard(text);\n}\n\nexport function combineValidAttributeValues(...values: (string | undefined)[]) {\n const validValues = values.filter(isTruthy);\n\n return validValues.length === 0 ? undefined : validValues.join(' ');\n}\n\nexport const repeat = (item: TItem, count: number) => Array(count).fill(item);\n\nexport const repeatWithId = (item: TItem, count: number) =>\n repeat(item, count).map((element, index) => ({ id: index.toString(), ...element }));\n\nexport const createArray = (factory: (index: number) => TItem, count: number) =>\n Array.from({ length: count }).map((_, index) => factory(index));\n\nexport const replaceNotFriendlyCharacters = (str: string) => str.replace(/[ -/:-@[-`{-}]+/g, '-');\n\nexport const capitalize = (str: T) =>\n (str ? str[0].toUpperCase() + str.slice(1) : str) as Capitalize;\n\nexport const getLastElementOfArray = (array?: TItem[]) =>\n !array || array.length === 0 ? undefined : array[array.length - 1];\n\nexport const stripFromHTMLNode = (rawHtml: string, node: 'p') =>\n rawHtml.replace(new RegExp(`<${node}>|`, 'g'), '');\n\nexport const firstKey = (map: Map) => {\n const result = map.keys().next();\n\n return result.done ? undefined : result.value;\n};\n\nexport const hasAny = (items: TItem[], predicate: (item: TItem) => boolean) =>\n items.find(predicate) !== undefined;\n\nexport const areEqual = (first: string, second: string, ignoreCase = false) =>\n first.localeCompare(second, undefined, { sensitivity: ignoreCase ? 'accent' : 'variant' }) === 0;\n\nexport const isSafari = () => {\n if (ExecutionContext.IsServerSide()) {\n return false;\n }\n\n // eslint-disable-next-line compat/compat -- this is client-side code\n const userAgent = navigator.userAgent.toLowerCase();\n\n return userAgent.includes('safari') && !userAgent.includes('chrome') && !userAgent.includes('crios');\n};\n\nexport const findClosestParent = (\n element: Element,\n predicate: (element: Element) => element is TElement\n): TElement | null => {\n let potentialResult: Element | null = element;\n\n while (potentialResult) {\n if (predicate(potentialResult)) {\n return potentialResult;\n }\n\n potentialResult = potentialResult.parentElement;\n }\n\n return null;\n};\n\nexport const isInteractiveElement = (element: HTMLElement) => {\n const formTags = ['button', 'input', 'select', 'textarea'];\n const linkTags = ['a', 'area'];\n\n const normalizedTagName = element.tagName.toLowerCase();\n\n return (\n (formTags.includes(normalizedTagName) && !element.hasAttribute('disabled')) ||\n (linkTags.includes(normalizedTagName) && element.hasAttribute('href'))\n );\n};\n\nexport const hashValue = async (value: string) => {\n ExecutionContext.ThrowIfServerSide();\n\n const encoder = new TextEncoder();\n const data = encoder.encode(value);\n // eslint-disable-next-line compat/compat -- this is client-side code\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n\n return hashArray.map(num => num.toString(16).padStart(2, '0')).join('');\n};\n\nexport const isErrorWithName = (error: unknown, errorName: string) =>\n typeof error === 'object' && error !== null && 'name' in error && error.name === errorName;\n\nexport const urlJoin = (...parts: string[]) => parts.join('/').replace('//', '/');\n","import classNames from 'classnames';\nimport uniqueId from 'lodash/uniqueId';\nimport * as React from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport { Button } from '~/Partials/Button/Button';\nimport { ButtonType } from '~/Partials/Button/ButtonType.csharp';\nimport { Portal } from '~/Partials/Modal/Portal';\nimport type { ModalWrapperProps } from '~/Partials/ModalWrapper/ModalWrapper';\nimport { ModalWrapper } from '~/Partials/ModalWrapper/ModalWrapper';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport { animationDurationMs } from '~/Utils/AnimationsUtils';\nimport { useIsMounted } from '~/Utils/Hooks/useIsMounted';\nimport styles from './Overlay.module.css';\n\nexport interface OverlayProps extends Pick {\n id: string;\n overlayLabel: string;\n isActive: boolean;\n closeLabel: string;\n className?: string;\n}\n\nconst InvisibleDiv: React.FC = props => {\n const { children } = props;\n\n return
    {children}
    ;\n};\n\nexport const Overlay: React.FC> = props => {\n const { id, overlayLabel, isActive, close, closeLabel, children, className } = props;\n\n const [isAnimationInProgress, setIsAnimationInProgress] = React.useState(false);\n const animatedElement = React.useRef(null);\n const backgroundRef = React.useRef(null);\n const isMounted = useIsMounted();\n\n const isOverlayVisible = isActive || isAnimationInProgress;\n\n // Must be set as an inline style because FocusTrap update handler launches before conditional class styles\n // are applied to the element. This handler searches for tabbable element and checks if it's visible\n // (i.e. neither it nor its parents have display:none) - if not it will throw an error.\n const displayMode = isOverlayVisible ? undefined : 'none';\n\n const labelId = uniqueId('overlayLabel_');\n\n // In order to support SSR (so that the content is indexed), we cannot use the Portal component\n // which is solely client-side. Instead, we use a dummy div that is hidden from the user and after\n // the component is mounted, we replace it with the Portal.\n const WrapperElement = isMounted ? Portal : InvisibleDiv;\n\n return (\n \n \n \n
    \n \n setIsAnimationInProgress(true)}\n onExited={() => setIsAnimationInProgress(false)}\n >\n \n {buttonClickClose => (\n
    \n
    \n \n \n {closeLabel}\n \n
    \n
    \n \n {overlayLabel}\n \n {children}\n
    \n
    \n )}\n \n \n
    \n
    \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"Overlay\":\"QhFNlQLYGSl_aaOQtwwl\",\"Background\":\"lAKZZQugItoUqTlu8DRV\",\"Inner\":\"po18YUo5kkFOZqsiTnKR\",\"TopBanner\":\"eOdUoHIpgD7QwsaR1kGn\",\"Content\":\"fyYha0cYX3WzsCpMkhUB\",\"CloseButton\":\"sZg2Vy20YIsqTNv9TcIX\"};","import isFunction from 'lodash/isFunction';\nimport uniqueId from 'lodash/uniqueId';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport type { OverlayProps } from './Overlay';\nimport { Overlay } from './Overlay';\n\nexport interface OverlayContainerProps extends Pick {\n content: TContent;\n openLabel: string;\n}\n\nexport interface OverlayTriggerButtonProps\n extends Required<\n Pick, 'aria-controls' | 'aria-expanded' | 'aria-haspopup' | 'onClick'>\n > {\n 'aria-haspopup': 'dialog';\n onClick: () => void; // Overriden base 'onClick' to not expose the event\n}\n\nexport interface WithOverlayProps extends Pick {\n overlayContent: ((close: () => void, isOpen: boolean) => ReactNode) | ReactNode;\n children: (triggerButtonProps: OverlayTriggerButtonProps) => ReactNode;\n}\n\nexport const WithOverlay: React.FC = props => {\n const { overlayContent, children, ...restProps } = props;\n\n const [isActive, setIsActive] = React.useState(false);\n\n const overlayId = uniqueId('overlay_');\n\n const triggerButtonProps: OverlayTriggerButtonProps = {\n onClick: () => setIsActive(true),\n 'aria-expanded': isActive,\n 'aria-controls': overlayId,\n 'aria-haspopup': 'dialog',\n };\n\n const close = () => setIsActive(false);\n\n return (\n <>\n {children(triggerButtonProps)}\n \n {isFunction(overlayContent) ? overlayContent(close, isActive) : overlayContent}\n \n \n );\n};\n","import { Event } from '~/Features/Messaging/types';\n\nexport const AdmissionCallToActionOverlayStatuses = ['disabled', 'nonApplicableLink'] as const;\nexport type AdmissionCallToActionOverlayStatus = (typeof AdmissionCallToActionOverlayStatuses)[number];\n\nexport class AdmissionCallToActionOverlayStatusChanged extends Event {\n public static readonly id = 'AdmissionCallToActionOverlayStatusChanged';\n\n constructor(\n public readonly status: AdmissionCallToActionOverlayStatus,\n public readonly newValue: boolean\n ) {\n super(AdmissionCallToActionOverlayStatusChanged.id);\n }\n}\n","import { Event } from '~/Features/Messaging/types';\n\nexport class NavigationApplyClick extends Event {\n public static readonly id = 'NavigationApplyClick';\n\n constructor() {\n super(NavigationApplyClick.id);\n }\n}\n","import * as React from 'react';\nimport type { ApplicationChoiceDto } from '~/Features/Search/ApplicationChoice/Controller/ApplicationChoiceDto.csharp';\nimport { GtmCommerceEventsHandler } from '~/Partials/GoogleTagManager/GtmCommerceEventsHandler';\n\nexport function useStudyPageGtmEvents(choices?: ApplicationChoiceDto[]) {\n React.useEffect(() => {\n if (choices && choices.length !== 0) {\n GtmCommerceEventsHandler.pushProductDetail(choices);\n }\n }, [choices]);\n}\n","// When changing this value please remember about changing CSS transition duration accordingly\nexport const animationDurationMs = 400;\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 { useEffect, useState } from 'react';\n\nexport const useIsMounted = () => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n return isMounted;\n};\n","import { useEffect, useRef } from 'react';\n\nexport function useVariableWithStableRef(variable: T) {\n const variableRef = useRef(variable);\n\n useEffect(() => {\n variableRef.current = variable;\n }, [variable]);\n\n return variableRef;\n}\n","export class TelemetryLogger {\n public static errorMessage = (error: string) => {\n console.error(error);\n\n const { appInsights } = window as any;\n\n appInsights?.trackException(new Error(error));\n };\n\n public static error = (error: unknown) => {\n console.error(error);\n\n const { appInsights } = window as any;\n\n appInsights?.trackException(new Error(`${error}`));\n };\n}\n","import * as React from 'react';\nimport { MessageBroker } from '~/Features/Messaging/MessageBroker';\nimport { ScrollLockUpdated } from '~/Utils/ScrollLock/ScrollLockUpdated';\nimport styles from './ScrollLock.module.css';\n\ninterface ScrollLockProps {\n isLocked: boolean;\n shouldHideMainScrollBar?: boolean;\n}\n\nconst lockedClassName = styles['ScrollLock--enabled'];\nconst hiddenScrollBarClassName = styles['ScrollLock--hiddenScrollBar'];\n\nexport const ScrollLock: React.FC = props => {\n const { isLocked, shouldHideMainScrollBar } = props;\n\n const [scrollPosition, setScrollPosition] = React.useState(undefined);\n const scrollPositionRef = React.useRef();\n\n React.useEffect(() => {\n scrollPositionRef.current = scrollPosition;\n }, [scrollPosition]);\n\n React.useEffect(() => {\n const { body } = document;\n const scrollY = window.scrollY || window.pageYOffset;\n\n const lock = (position: number) => {\n // Calculated before adding locked class, because page might not have a scrollbar before that\n const scrollBarWidth = window.innerWidth - body.offsetWidth;\n\n body.classList.add(lockedClassName);\n body.style.top = `-${position}px`;\n\n if (shouldHideMainScrollBar) {\n body.classList.add(hiddenScrollBarClassName);\n body.style.paddingRight = `${scrollBarWidth}px`;\n\n MessageBroker.publish(\n new ScrollLockUpdated({\n isLocked: true,\n isScrollBarVisible: false,\n scrollBarWidth,\n })\n );\n } else {\n MessageBroker.publish(\n new ScrollLockUpdated({\n isLocked: true,\n isScrollBarVisible: true,\n })\n );\n }\n };\n\n const unlock = (position: number) => {\n body.classList.remove(lockedClassName);\n body.style.top = '';\n\n if (shouldHideMainScrollBar) {\n body.classList.remove(hiddenScrollBarClassName);\n body.style.paddingRight = '';\n }\n\n MessageBroker.publish(new ScrollLockUpdated({ isLocked: false }));\n\n window.scrollTo(0, position);\n };\n\n const shouldLock = isLocked && !body.classList.contains(lockedClassName);\n\n if (shouldLock) {\n lock(scrollY);\n setScrollPosition(scrollY);\n } else {\n if (scrollPosition !== undefined) {\n unlock(scrollPosition);\n }\n\n setScrollPosition(undefined);\n }\n\n return () => {\n if (scrollPositionRef.current !== undefined) {\n unlock(scrollPositionRef.current);\n }\n };\n }, [shouldHideMainScrollBar, isLocked]);\n\n return null;\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"ScrollLock--enabled\":\"Q0v9bFNU46mzd2ECi6p_\",\"ScrollLock--hiddenScrollBar\":\"BqUTYZ5JDn6ke9pgViA1\"};","import { Event } from '~/Features/Messaging/types';\n\ninterface LockedWithScrollBar {\n isLocked: true;\n isScrollBarVisible: true;\n}\n\ninterface LockedWithoutScrollBar {\n isLocked: true;\n isScrollBarVisible: false;\n scrollBarWidth: number;\n}\n\ninterface Unlocked {\n isLocked: false;\n}\n\nexport type ScrollLockState = LockedWithScrollBar | LockedWithoutScrollBar | Unlocked;\n\nexport class ScrollLockUpdated extends Event {\n public static readonly id = 'ScrollLockUpdated';\n\n constructor(public readonly state: ScrollLockState) {\n super(ScrollLockUpdated.id);\n }\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"Variant--solid\":\"yEK9biWpMxeKit4W3SEn\",\"Variant--primary\":\"HIBx2TMQpGodNFRbYUAk\",\"Variant--secondary\":\"hk2sUgQrAH9UK8YJmMUQ\",\"Variant--tertiary\":\"LVwfmt8Qy2xfZW7GrHx_\",\"Variant--red\":\"ivQTZ0V5t2YuYK5Qpk4D\",\"Variant--legacyPrimary\":\"qUo0GcsHJo5KTx2OLXFs\",\"Variant--outline\":\"AMdryBi_G8WFVbcuUzSv\",\"Variant--clear\":\"NtmtjnwY8FdZxOUBkRwT\",\"Variant--xSmall\":\"vig35dbpPkTmO944SAkM\",\"Variant--responsiveFromXSmallToSmall\":\"QBEt0HHyiENeo4C99_KK\",\"Variant--small\":\"HdV_AOE4D0H4dDOGneuZ\",\"Variant--responsiveFromSmallToMedium\":\"gnwHhMF21kTUQhGmA_GV\",\"Variant--responsiveFromSmallToLarge\":\"wyUhxzdCNOoIbxwuJ88A\",\"Variant--responsiveFromMediumToSmall\":\"wmwaxVhV5DtqaahJfW48\",\"Variant--responsiveFromMediumToLarge\":\"DKSTnxlifpUboSUUkkBn\",\"Variant--responsiveFromLargeToSmall\":\"Cq7zjNdjnEgUyXZm8rWy\",\"Variant--large\":\"Pf5HgbFCxXwoDDfyfLsp\",\"Variant--responsiveFromLargeToXLarge\":\"gi055KUm9OAjwL1tWkgX\",\"Variant--xLarge\":\"aRoFX7mW8Ru2eLodlj6k\",\"Variant--rounded\":\"I0dQ9KoNo8oj51pfedVE\",\"Variant--shadowed\":\"cJMgeHEGyMPOPNoeRPfY\"};"],"names":["Event","AddingDifferentApplicationTypeAttempt","constructor","super","id","AlertSectionVariant","CampusApplicationProcessState","isOnlineApplicationInProgress","getStoredOnlineApplicationChoices","length","getAll","getStoredCampusApplicationChoices","append","newChoice","ExecutionContext","ThrowIfServerSide","MessageBroker","publish","currentChoices","choice","AddingExistingItemAttempt","studyCode","variantCode","AddingAnotherOptionAttempt","MaxChoicesNumber","MaxNumberOfChoicesExceeded","push","localStorage","setItem","CampusApplicationStateStorageKey","JSON","stringify","CampusApplicationItemAdded","CampusAnalytics","addProducts","clear","removeItem","CampusApplicationItemRemoved","remove","filter","item","setAll","newChoices","isItemsLimitReached","IsServerSide","currentStateJson","getItem","parse","CampusApplicationEvent","currentChoicesNumber","maxChoicesNumber","isItemAdded","some","areAllItemsAdded","choices","every","isNotEmptySearchParams","params","isNotEmptyObject","isNotEmptyString","phrase","isNotEmptyArray","levels","mapSearchParamsToQueryString","_ref","concat","join","getContentLanguage","GlobalContextProvider","getContentLocale","mapToLocale","window","Error","subscribe","handler","messageId","handlers","this","MessageHandlersByMessageId","unsubscribe","h","message","GetMessageHandlers","forEach","handle","schedulePublish","delay","setTimeout","Message","useMessageHandler","onMessage","onMessageRef","useVariableWithStableRef","useLayoutEffect","event","current","OnlineApplicationStateStorageKey","CampusCardCheckbox","props","contextualTheme","useTheme","title","subtitle","description","value","image","theme","currentValue","onChange","name","useRadioGroupContext","checked","withRoundedCorners","clickableRef","onProxyMouseDown","onProxyMouseUp","useClickProxyAllowingTextSelection","htmlId","uniqueId","React","className","classNames","Picture","_extends","profile","PictureProfiles","contentCard","PicturePlaceholder","htmlFor","ref","type","role","tabIndex","onMouseDown","onMouseUp","HtmlDiv","html","AdmissionCallToActionCardsList","cards","campusApplicationUrl","submitButtonLabel","variantAlreadyInBasketAlertMessage","currentSelection","setCurrentSelection","isVariantInCart","setIsVariantInCart","processState","selectedLocation","find","variantCity","toLowerCase","undefined","picks","map","card","_objectSpread","location","onSubmit","e","preventDefault","redirect","RadioGroupProvider","checkedValue","List","items","renderItem","pick","key","LazyCollapse","isOpen","AlertSection","variant","Info","Button","htmltype","tier","ButtonTier","Secondary","ButtonType","Solid","size","ButtonSize","XLarge","disabled","SvgIcon","iconName","AdmissionCallToActionOverlay","heading","buttonLabel","closeLabel","status","children","shouldDisableButton","setShouldDisableButton","setProcessState","buttonRef","isButtonDisabled","applicationProcess","areAllVariantsAlreadyAdded","isVariantAlreadyAdded","NavigationApplyClick","click","AdmissionCallToActionOverlayStatusChanged","WithOverlay","overlayLabel","overlayContent","buttonProps","styles","Action","onClick","overlayClick","applicationChoice","handleClick","AdmissionCallToAction","_link$label","mainLabel","helperLabel","campusCards","translations","link","withBoxShadow","href","isNonApplicableLink","Content","Label","SubLabel","Link","LinkType","buttonTier","Primary","buttonSize","label","similarStudies","applyFor","applyForStudyMultipleLocations","applyForStudy","closeOverlay","goToBasket","variantAlreadyInBasket","StudyAdmissionCallToActionBlock","useStudyPageGtmEvents","StudyPageInfoBox","header","body","isHtmlString","StudyPageAdmissionInfoBox","editorialInfo","infoProps","mapModelToProps","ongoingOnlineHeading","ongoingOnlineBody","isProductMultiVariant","isProductSingleVariant","studyAlreadyAddedHeading","see","yourApplication","LinkVariant","LightBlack","basketLimitHeading","basketLimitBody","StudyHero","summary","info","breadcrumbs","BackgroundMediaSection","wrapperClassName","contentClassName","mediaClassName","overlayVariant","Breadcrumbs","fullWidth","level","PillTag","fontColor","_info$level$link","tagValue","duration","studyDuration","dangerouslySetInnerHTML","__html","stripFromHTMLNode","locations","_location$link","renderLeftContent","CampusStudyPageHero","additionalInfo","imageViewModel","admissionCallToAction","studyPageInfoBoxBlockViewModel","admissionInfoBox","sizeVariant","headerClassName","headerType","getIconName","Success","Warning","Icon","Header","Body","video","caption","author","layout","getMediaElement","mediaClass","Media","src","autoPlay","playsInline","muted","loop","preload","logoWrapperClassName","PlaceholderLogoWrapper","mediaContent","getMediaElementWithCaption","mediaElement","Figure","Wrapper","breadcrumb","passThroughProps","_objectWithoutProperties","_excluded","Clear","ThemedButton","RawButton","otherProps","_excluded2","additionalProps","_excluded3","getHeight","content","scrollHeight","Collapse","onRest","withMarginTransition","rest","toggleStyles","style","height","setHeight","useState","overflow","setOverflow","visibility","setVisibility","isMounted","useIsMounted","useEffect","requestAnimationFrame","useCollapse","willChange","onTransitionEnd","target","propertyName","restDivProps","axiosWrapper","axios","create","paramsSerializer","indexes","interceptors","request","use","config","contentLanguage","headers","set","combineValidators","validations","async","val","_len","arguments","combinedValidatorOptions","Array","_key","validator","errorMessage","isValidStudyVariantsList","isArray","isNotNull","Object","keys","isAlphaNumericString","HasOnlyDigitsAndLetters","matches","match","isPersonalNumberValidAsync","options","isString","personalNumber","firstName","lastName","defaultValidationResult","personalNumberValidationUrl","response","makePostRequest","state","data","isValid","REGEXP_EMAIL","isEmail","test","isShallowEqual","a","b","isTrue","REGEXP_COUNTRY_CODE","isValidCountryCodeFormat","REGEXP_PHONE_NUMBER","isValidPhoneNumber","REGEXP_NORWEGIAN_PHONE_NUMBER","isValidNorwegianPhoneNumber","readValidationErrorFromFormik","formikErrors","formikTouched","fieldPath","submitCount","fieldError","getIn","_CampusAnalytics","products","createProductFromApplicationChoice","actionField","createBaseActionFieldFromApplicationChoice","GtmCommerceEventsHandler","pushAddProducts","removeProducts","pushRemoveProducts","checkout","stepNumber","baseActionField","pushBeginCheckout","checkoutActionField","checkout_step","pushCheckout","applicationResult","createPurchaseActionFieldFromCampusApplication","pushPurchase","currency","sumBy","_item$price","price","_choice$educationCate","_choice$educationCate2","studyType","VocationalSchoolBrand","CampusBrand","item_id","item_name","affiliation","item_brand","educationCategories","item_category","studyFormType","item_category2","points","item_category3","item_variant","quantity","result","_item$price2","transaction_id","requestId","coupon","shipping","tax","OnlineStudyBrand","SingleSubject","SchoolName","GtmEventsBase","_GtmCommerceEventsHandler","ecommerce","pushCheckoutOption","option","eventName","checkout_option","pushProductDetail","detail","_choice$price","TelemetryLogger","dataLayer","_GtmEventsBase","pushGtmPageStats","gtmPageStatsViewModel","properties","pushEvent","payLoad","restProps","isBeforeCollapsing","setIsBeforeCollapsing","shouldContentBeRendered","handleOnRest","buttonType","filteredProps","omitProperty","elementToRender","ThemedButtonLink","RawLink","labelClassName","Default","LegacyPrimary","Large","external","showIsExternal","buttonStyles","rel","ExternalIcon","ListComponent","index","portalContainerId","ClientSidePortal","portalContainer","document","getElementById","isAttachedToDOM","setIsAttachedToDOM","elementReference","createElement","appendChild","removeChild","portalContent","createPortal","Portal","ModalWrapper","isFocusTrapActive","isScrollLocked","close","shouldHideMainScrollBar","focusTrapDeactivationClose","buttonClickClose","isOpened","closeRef","shouldDeactivateInvokeCloseRef","_closeRef$current","call","useCloseHandlersWithoutDuplicatedCalls","ScrollLock","isLocked","FocusTrap","active","focusTrapOptions","clickOutsideDeactivates","escapeDeactivates","onDeactivate","constructImageSharpUrl","baseUrl","width","url","alt","focalPoint","themeDefaultValues","lazyLoading","createPicture","pictureUrl","pictureAlt","pictureProfile","mainSource","sources","sourceSizes","sizes","sourceSrcSets","allowedWidths","srcSet","defaultWidth","objectPosition","point","xPosition","clamp","x","yPosition","y","getPosition","loading","threeColumnsElement","fourColumnsElement","sixColumnsElement","horizontal","vertical","callout","studyPortfolioItem","galleryItemSquare","galleryItemVertical","galleryItemHorizontal","mainPosterVertical","LogoWrapper","Logo","baseProps","LinkLabel","radioGroupContext","context","Provider","iconPath","assetPathBuilder","SvgIconBase","path","xlinkHref","filled","formattedIconName","iconNameMapper","formattedAssetsPath","formatPath","assetsPath","formattedBuildHash","buildHash","filledResources","payload","post","error","isAxiosError","_error$response$data","toString","startsWith","code","object","args","omit","checkEquals","makePostRequestOld","objectAssignToEmptyFields","source","fields","entries","reduce","acc","oldVal","newVal","cloneArrayAndUpdateSingleItem","updateFunction","indexOf","updatedItem","slice","moneyToString","money","amountFormatted","formatAmount","amount","currencyFormatted","formatCurrency","currencyCode","parts","split","replace","formatNumber","toLocaleString","origin","reload","ms","Promise","resolve","scrollToElement","element","behavior","block","inline","scrollIntoView","smoothScrollToSectionById","section","smoothScrollToSectionByRef","scrollToTop","scrollTo","isTruthy","getCurrentUrl","toUrl","URL","protocol","hostname","port","copyTextToClipboard","text","navigator","clipboard","writeText","textArea","top","left","position","focus","select","execCommand","legacyCopyTextToClipboard","combineValidAttributeValues","_len2","values","_key2","validValues","createArray","factory","count","from","_","replaceNotFriendlyCharacters","str","capitalize","toUpperCase","getLastElementOfArray","array","rawHtml","node","RegExp","firstKey","next","done","hasAny","predicate","isSafari","userAgent","includes","findClosestParent","potentialResult","parentElement","isInteractiveElement","normalizedTagName","tagName","hasAttribute","hashValue","TextEncoder","encode","hashBuffer","crypto","subtle","digest","Uint8Array","num","padStart","isErrorWithName","errorName","urlJoin","_len3","_key3","InvisibleDiv","display","Overlay","isActive","isAnimationInProgress","setIsAnimationInProgress","animatedElement","backgroundRef","isOverlayVisible","displayMode","labelId","WrapperElement","CSSTransition","nodeRef","in","appear","timeout","animationDurationMs","onEnter","onExited","setIsActive","overlayId","triggerButtonProps","isFunction","newValue","MouseButton","isNonEmpty","selection","isEmpty","isLabel","shouldIgnoreEvent","eventTarget","clickableElement","Element","contains","willBeHandledByAssociatedElement","nearestLabel","associatedElementId","getAttribute","willBubbleOutsideOfPortal","potentialPortalContainer","previouslyCheckedElement","HTMLElement","button","Left","userSelection","getSelection","removeAllRanges","Middle","_clickableRef$current","_clickableRef$current2","_clickableRef$current3","eventCopy","MouseEvent","bubbles","dispatchEvent","setIsMounted","variable","variableRef","useRef","console","appInsights","trackException","lockedClassName","hiddenScrollBarClassName","scrollPosition","setScrollPosition","scrollPositionRef","scrollY","pageYOffset","unlock","classList","paddingRight","ScrollLockUpdated","scrollBarWidth","innerWidth","offsetWidth","add","isScrollBarVisible","lock"],"sourceRoot":""}