{"version":3,"file":"forside-libs-chunk-154dad7d44f9400a62fd.js","mappings":"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","sources":["webpack://dh-sexguiden/./src/components/common/responsive-image.js","webpack://dh-sexguiden/./src/lib/emneknagg.js","webpack://dh-sexguiden/./src/navigation.js","webpack://dh-sexguiden/./src/components/common/stillingskort/stillingkort.html.js","webpack://dh-sexguiden/./src/components/main/sok/resultat/sokeresultat.html.js","webpack://dh-sexguiden/./src/components/main/sok/sok.js","webpack://dh-sexguiden/./src/components/main/sok/emneknagger/emneknagger.js","webpack://dh-sexguiden/./src/components/main/sok/resultat/sokeresultat.js","webpack://dh-sexguiden/./src/client-forside-libs.js","webpack://dh-sexguiden/./src/lib/html.js"],"sourcesContent":["import { html } from '../../lib/html'\n\nfunction byWidth(a, b) {\n return a.width - b.width\n}\n\nconst defaultBackgroundColor = '#e3e3e3'\n\nexport function renderResponsiveImage(image, sizes, priority) {\n if (!image?.crops?.length) {\n return ''\n }\n const selectedFormat = image.selectedFormats?.[0] ?? image.originalFormat ?? '5:4'\n const [w, h] = selectedFormat.split(':')\n\n const crops = image.crops.filter((crop) => crop.format === selectedFormat).sort(byWidth)\n const fallbackImage = crops[0]\n\n const backgroundColor = image.averageColor?.hex ?? defaultBackgroundColor\n const altTextColor = image.averageColor?.isDark ? '#fff' : '#000'\n return html` `${crop.url} ${crop.width}w`).join(', ')}\"\n alt=\"${image.description}\"\n width=\"${w * 1000}\"\n height=\"${h * 1000}\"\n ${sizes ? `sizes=\"${sizes}\"` : ''}\n style=\"background-color:${backgroundColor}; color: ${altTextColor}\"\n ${priority ? 'fetchpriority=\"high\"' : 'loading=\"lazy\"'}\n />`\n}\n","export function toSlug(emneknagg) {\n if (emneknagg && typeof emneknagg === 'object') {\n return emneknagg.slug?.current ?? emneknagg.slug\n } else {\n return emneknagg\n }\n}\n\nexport function jaccardIndex(listA, listB) {\n const setA = new Set(listA)\n const setB = new Set(listB)\n const intersection = new Set([...setA].filter((value) => setB.has(value)))\n const union = new Set([...setA, ...setB])\n return intersection.size / union.size\n}\n\nexport function sortEmneknagger(emneknagger) {\n return [...emneknagger].sort((a, b) => {\n if (a.prioritering !== b.prioritering) {\n return b.prioritering - a.prioritering\n } else {\n return a.navn > b.navn ? 1 : -1\n }\n })\n}\n\nexport function addCounts(emneknagger, emneknaggCounts) {\n return emneknagger.map((emneknagg) => ({\n ...emneknagg,\n count: emneknaggCounts[emneknagg.slug] ?? 0,\n }))\n}\n","import { toSlug } from './lib/emneknagg'\n\nexport function equals(emneknaggA, emneknaggB) {\n return toSlug(emneknaggA) === toSlug(emneknaggB)\n}\n\nexport function emneknaggList(valgteEmneknagger) {\n return valgteEmneknagger.map(toSlug).sort().join(';')\n}\n\nexport function emneknaggUrl(baseUrl, valgteEmneknagger) {\n if (!valgteEmneknagger?.length) {\n return `${baseUrl || '/'}`\n }\n return `${baseUrl}/emneknagger/${emneknaggList(valgteEmneknagger)}`\n}\n\nexport function stillingUrl(baseUrl, slug, valgteEmneknagger) {\n const emneknaggParam = valgteEmneknagger?.length\n ? `?emneknagger=${emneknaggList(valgteEmneknagger)}`\n : ''\n return `${baseUrl}/stilling/${slug}${emneknaggParam}`\n}\n\nexport function apiUrl(baseUrl, sok = {}) {\n const { valgteEmneknagger = [] } = sok\n return `${baseUrl}/api/sok/${valgteEmneknagger.join(';')}`\n}\n","import { nrkChevronRight } from '@nrk/core-icons'\nimport { html } from '../../../lib/html'\nimport { renderResponsiveImage } from '../responsive-image'\nimport { stillingUrl } from '../../../navigation'\nimport { toSlug } from '../../../lib/emneknagg'\nimport styles from './stillingkort.module.css'\n\nexport function byRelevance(sok) {\n const sokSlugs = sok?.valgteEmneknagger?.map(toSlug) ?? []\n const numberOfRelevantEmneknagg = (image) => {\n const { emneknagger = [] } = image\n return emneknagger.map(toSlug).filter((slug) => sokSlugs.includes(slug)).length\n }\n\n return (a, b) => {\n return numberOfRelevantEmneknagg(b) - numberOfRelevantEmneknagg(a)\n }\n}\n\nexport function renderStillingkort(stilling, index, sok, baseUrl, priority) {\n const tempBilder = [...(stilling.bilder ?? [])]\n const bilde = tempBilder.sort(byRelevance(sok))[0]\n\n return html`
\n \n
\n
\n

${stilling.navn}

\n

${stilling.kortBeskrivelse}

\n
\n ${nrkChevronRight}\n
\n ${renderResponsiveImage(bilde, '(min-width: 758px) 350px, calc(100vw - 28px)', priority)}\n
\n
`\n}\n","import { html } from '../../../../lib/html'\nimport { renderStillingkort } from '../../../common/stillingskort/stillingkort.html'\nimport styles from './sokeresultat.module.css'\nimport { toSlug } from '../../../../lib/emneknagg'\n\nexport function renderSokeresultat(sok, emneknagger, baseUrl) {\n if (sok.stillinger?.length) {\n return html`\n ${renderBeskrivelse(sok, emneknagger)}\n \n `\n } else {\n return html`
\n ${renderBeskrivelse(sok, emneknagger)}\n

Oops!

\n

\n Vi klarte ikke å tilfredstille dine behov denne gangen. Det ser ut som du må fjerne noen\n emneknagger for å få treff.\n

\n
`\n }\n}\n\nexport function renderHenter(sok) {\n return html`
\n ${renderBeskrivelse(sok)}\n
\n
Henter stillinger...
\n
\n
`\n}\n\nfunction createResultatbeskrivelse(sok) {\n if (sok.valgteEmneknagger.length) {\n const navn = sok.emneknagger\n .filter((emneknagg) => sok.valgteEmneknagger.includes(toSlug(emneknagg)))\n .map((emneknagg) => emneknagg.navn.toLowerCase())\n\n if (navn.length > 1) {\n return `Kategorier: ${navn.join(', ')}`\n } else {\n return `Kategori: ${navn.join(', ')}`\n }\n } else {\n return 'Alle stillinger'\n }\n}\n\nfunction createAntallText(sok) {\n if (!sok.stillinger) {\n return 'Laster...'\n } else if (sok.stillinger.length === 1) {\n return `Viser 1 stilling`\n } else {\n return `Viser ${sok.stillinger.length} stillinger`\n }\n}\n\nexport function renderBeskrivelse(sok) {\n return html`
\n

${createResultatbeskrivelse(sok)}

\n
\n ${createAntallText(sok)} \n
\n
`\n}\n","/* eslint-disable compat/compat */\nimport { renderHenter, renderSokeresultat } from './resultat/sokeresultat.html'\nimport { apiUrl, emneknaggList, emneknaggUrl } from '../../../navigation'\nimport { getElementTag } from '@nrk/dh-server-libs/get-element-tag'\n\nconst tag = getElementTag(__APP_NAME__, __APP_VERSION__)\n\nexport class SexguidenSok extends HTMLElement {\n /*\n static get observedAttributes() {\n return ['data-emneknagger']\n }\n */\n\n connectedCallback() {\n // Remember original state for history api\n const originalState = { valgteEmneknagger: this.emneknaggElement.valgteEmneknagger }\n window.onpopstate = (e) => {\n const state = e.state || originalState\n this.emneknaggElement.valgteEmneknagger = state.valgteEmneknagger\n this._logTagsChanged()\n this._updateResults()\n }\n\n this.addEventListener('dh-sexguiden-emneknagger-updated', this._handleEmneknaggerUpdated)\n }\n\n _handleEmneknaggerUpdated = () => {\n this._updateHistory()\n this._logTagsChanged()\n this._updateResults()\n }\n\n _logTagsChanged() {\n const valgteEmneknagger = this.emneknaggElement.valgteEmneknagger\n this.appElement.sendGaEvent({\n eventAction: 'TAGS-CHANGED',\n eventLabel: emneknaggList(valgteEmneknagger),\n })\n }\n\n _updateHistory() {\n try {\n const valgteEmneknagger = this.emneknaggElement.valgteEmneknagger\n window.history.pushState(\n { valgteEmneknagger },\n '',\n emneknaggUrl(this.baseUrl, valgteEmneknagger)\n )\n } catch {\n // Not possible to set history in google translated page\n }\n }\n\n async _updateResults() {\n // Abort active requests\n if (this._abortController) {\n this._abortController.abort()\n }\n const emneknaggElement = this.emneknaggElement\n const valgteEmneknagger = emneknaggElement.valgteEmneknagger\n const sok = { valgteEmneknagger, emneknagger: emneknaggElement.alleEmneknagger }\n this.resultsElement.innerHTML = renderHenter(sok)\n\n this._abortController = new AbortController()\n const signal = this._abortController.signal\n try {\n const response = await fetch(apiUrl(this.baseUrl, sok), {\n signal,\n mode: 'cors',\n })\n const { stillinger, emneknagger } = await response.json()\n sok.stillinger = stillinger\n sok.emneknagger = emneknagger\n emneknaggElement.alleEmneknagger = emneknagger\n\n this.setAttribute('updated', '')\n this.resultsElement.innerHTML = renderSokeresultat(\n sok,\n emneknaggElement.alleEmneknagger,\n this.baseUrl\n )\n } catch (e) {\n if (valgteEmneknagger !== emneknaggElement.valgteEmneknagger) {\n // Emneknagger has changed since request was sent\n } else {\n this.resultsElement.innerHTML = 'En feil oppstod'\n }\n }\n\n delete this._abortController\n }\n\n get appElement() {\n return this.closest(tag)\n }\n\n get resultsElement() {\n return this.querySelector('[data-results]')\n }\n\n get baseUrl() {\n return this.getAttribute('data-base-url')\n }\n\n /*\n * Attributes\n * */\n\n get emneknaggElement() {\n return this.querySelector('dh-sexguiden-emneknagger')\n }\n\n get images() {\n return this.querySelectorAll('img')\n }\n}\n","import fromEntries from 'fromentries'\nimport { toSlug } from '../../../../lib/emneknagg'\n/*\n * Handles valgte emneknagger and calculates masonry layout on mobile\n *\n * Layout for emneknagger.\n * Emneknagger are positioned with horisontal masonry on mobile devices, and with regular inline flow on desktop.\n *\n * Once support for masonry gains support in css this should be replaced with pure css.\n * */\nexport class Emneknagger extends HTMLElement {\n static get observedAttributes() {\n return ['data-valgte-emneknagger', 'data-alle-emneknagger']\n }\n\n currentLayout\n\n connectedCallback() {\n window.addEventListener('resize', this._layout)\n // eslint-disable-next-line compat/compat\n document.fonts?.ready?.then(this._layout)\n\n this._layout()\n for (const link of this.links) {\n link.addEventListener('click', this._handleLinkClick)\n link.addEventListener('keydown', this._handleLinkClick)\n\n /* Disable links */\n link.removeAttribute('href')\n }\n this._updateDisabledEmneknagger()\n }\n\n attributeChangedCallback(attributeName) {\n if (attributeName === 'data-valgte-emneknagger') {\n this._updateValgteEmneknagger()\n } else if (attributeName === 'data-alle-emneknagger') {\n this._updateDisabledEmneknagger()\n }\n }\n\n _layout = () => {\n if (document.documentElement.clientWidth >= 900) {\n this._layoutDesktop()\n } else {\n this._layoutMobile()\n }\n }\n\n _layoutDesktop() {\n if (this.currentLayout === 'desktop') {\n return\n }\n for (let item of this.items) {\n item.style.position = 'static'\n }\n this.currentLayout = 'desktop'\n }\n\n _layoutMobile() {\n const gutter = 7\n let row1 = 0\n let row2 = 0\n let rowHeight = 0\n let paddingTop = 0\n let width = 0\n for (let item of this.items) {\n item.style.position = 'absolute'\n const itemWidth = item.offsetWidth\n if (row1 <= row2) {\n item.style.top = `${paddingTop}px`\n item.style.left = `${row1}px`\n row1 += itemWidth + gutter\n\n if (rowHeight === 0) {\n rowHeight = item.offsetHeight\n }\n } else {\n item.style.top = `${paddingTop + rowHeight + gutter}px`\n item.style.left = `${row2}px`\n row2 += itemWidth + gutter\n }\n width = Math.max(row1, row2) - gutter\n }\n this.list.style.setProperty('--mobile-width', `${width}px`)\n this.currentLayout = 'mobile'\n }\n\n _handleLinkClick = (e) => {\n if (e.type === 'keydown' && e.keyCode !== 13 && e.keyCode !== 32) {\n // Ignore keydown from keys other than space and enter\n return\n }\n e.preventDefault()\n const link = e.target\n if (link.getAttribute('aria-disabled')) {\n return\n }\n const currentEmneknagg = link.getAttribute('data-emneknagg')\n if (this.valgteEmneknagger.includes(currentEmneknagg)) {\n this.valgteEmneknagger = this.valgteEmneknagger.filter(\n (emneknagg) => emneknagg !== currentEmneknagg\n )\n } else {\n this.valgteEmneknagger = [...this.valgteEmneknagger, currentEmneknagg]\n }\n\n let event\n if (typeof CustomEvent === 'function') {\n event = new CustomEvent('dh-sexguiden-emneknagger-updated', {\n bubbles: true,\n cancelable: true,\n })\n } else {\n event = document.createEvent('CustomEvent')\n event.initEvent('dh-sexguiden-emneknagger-updated', true, true)\n }\n this.dispatchEvent(event)\n }\n\n _updateValgteEmneknagger() {\n for (const link of this.links) {\n const emneknagg = link.getAttribute('data-emneknagg')\n const active = this.valgteEmneknagger.includes(emneknagg)\n link.setAttribute('aria-pressed', active.toString())\n }\n }\n\n _updateDisabledEmneknagger() {\n /* Create map for fast lookup */\n const emneknaggerMap = fromEntries(\n this.alleEmneknagger.map((emneknagg) => [toSlug(emneknagg), emneknagg])\n )\n\n for (const link of this.links) {\n const emneknagg = link.getAttribute('data-emneknagg')\n const active = this.valgteEmneknagger.includes(emneknagg)\n const disabled = !active && !emneknaggerMap[emneknagg]?.count\n if (disabled) {\n link.setAttribute('aria-disabled', 'true')\n link.removeAttribute('tabindex')\n } else {\n link.removeAttribute('aria-disabled')\n link.setAttribute('tabindex', '0')\n }\n }\n }\n\n get links() {\n return Array.from(this.querySelectorAll('a[data-emneknagg]'))\n }\n\n get list() {\n return this.querySelector('ul')\n }\n\n get items() {\n return Array.from(this.querySelectorAll('li'))\n }\n\n get valgteEmneknagger() {\n const emneknaggString = this.getAttribute('data-valgte-emneknagger') ?? ''\n return emneknaggString.split(';').filter(Boolean)\n }\n\n set valgteEmneknagger(val) {\n this.setAttribute('data-valgte-emneknagger', val.sort().join(';'))\n }\n\n get alleEmneknagger() {\n return JSON.parse(this.getAttribute('data-alle-emneknagger') ?? '')\n }\n\n set alleEmneknagger(value) {\n this.setAttribute('data-alle-emneknagger', JSON.stringify(value))\n }\n}\n","import debounce from 'debounce'\n\n/*\n * Handle masonry layout of sokeresultat.\n *\n * Once css masonry gets wide support, this element can be removed.\n * */\nexport class SexguidenSokeresultat extends HTMLElement {\n _columnWidth = 350\n _columnGap = 30\n _rowGap = 27\n _rowGapSmall = 14\n\n connectedCallback() {\n this._updatePositions()\n this._debouncedUpdatePositions = debounce(this._updatePositions, 300)\n window.addEventListener('resize', this._debouncedUpdatePositions)\n this.images.forEach((img) => {\n img.addEventListener('load', this._debouncedUpdatePositions)\n })\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this._debouncedUpdatePositions)\n this.images.forEach((img) => {\n img.removeEventListener('load', this._debouncedUpdatePositions)\n })\n }\n\n _updatePositions = () => {\n const containerWidth = this.stillingContainer.offsetWidth\n const nrOfColumns = Math.max(\n 1,\n Math.floor((containerWidth + this._columnGap) / (this._columnWidth + this._columnGap))\n )\n const rowGap = nrOfColumns === 1 ? this._rowGapSmall : this._rowGap\n const columnStarts = [...new Array(nrOfColumns)].map(() => 0)\n const columnWidth = (containerWidth + this._columnGap) / nrOfColumns - this._columnGap\n\n const stillinger = [...this.stillinger]\n /* Size elements */\n for (const stilling of stillinger) {\n stilling.style.position = 'absolute'\n stilling.style.width = `${columnWidth}px`\n }\n\n /* Measure heights */\n const heights = stillinger.map((stilling) => stilling.offsetHeight)\n\n /* Position elements */\n // eslint-disable-next-line compat/compat\n for (const [idx, stilling] of Object.entries(stillinger)) {\n const minStartPosition = Math.min(...columnStarts)\n const columnIndex = columnStarts.findIndex((start) => start === minStartPosition)\n stilling.style.top = `${columnStarts[columnIndex]}px`\n stilling.style.left = `${columnIndex * (columnWidth + this._columnGap)}px`\n /* Update column column start position */\n const stillingHeight = heights[idx]\n columnStarts[columnIndex] += stillingHeight + rowGap\n }\n\n /* Size container */\n this.stillingContainer.style.height = `${Math.max(...columnStarts)}px`\n }\n\n get stillingContainer() {\n return this.querySelector('ul')\n }\n\n get stillinger() {\n return this.querySelectorAll('li')\n }\n\n get images() {\n return this.querySelectorAll('li img')\n }\n}\n","import { SexguidenSok } from './components/main/sok/sok'\nimport { Emneknagger } from './components/main/sok/emneknagger/emneknagger'\nimport { SexguidenSokeresultat } from './components/main/sok/resultat/sokeresultat'\n\nif (!customElements.get('dh-sexguiden-emneknagger')) {\n customElements.define('dh-sexguiden-emneknagger', Emneknagger)\n}\n\nif (!customElements.get('dh-sexguiden-sok')) {\n customElements.define('dh-sexguiden-sok', SexguidenSok)\n}\n\nif (!customElements.get('dh-sexguiden-sokeresultat')) {\n customElements.define('dh-sexguiden-sokeresultat', SexguidenSokeresultat)\n}\n\n;(async function loadLibsLazy() {\n const { default: CoreScroll } = await import('@nrk/core-scroll')\n if (!customElements.get('core-scroll')) {\n customElements.define('core-scroll', CoreScroll)\n }\n})()\n","function serialize(value) {\n if (value === null || value === undefined) {\n return ''\n } else if (Array.isArray(value)) {\n return value.join('')\n } else {\n return `${value}`\n }\n}\n\n/**\n * Concats a template literal and interpolates values correctly, as well as removes formatting whitespace and HTML comments\n * Does not output null or undefined.\n * Concatenates lists with no comma.\n */\nexport function html(strings, ...interpolations) {\n let str = strings[0]\n for (let i = 0; i < interpolations.length; i++) {\n str += serialize(interpolations[i])\n str += strings[i + 1]\n }\n\n return str.replace(/>\\s+<').replace(//, '')\n}\n"],"names":["byWidth","a","b","width","toSlug","emneknagg","slug","current","emneknaggList","valgteEmneknagger","map","sort","join","renderStillingkort","stilling","index","sok","baseUrl","priority","bilde","bilder","sokSlugs","numberOfRelevantEmneknagg","image","emneknagger","filter","includes","length","byRelevance","html","styles","stillingUrl","navn","kortBeskrivelse","nrkChevronRight","sizes","crops","selectedFormat","selectedFormats","originalFormat","w","h","split","crop","format","fallbackImage","backgroundColor","averageColor","hex","altTextColor","isDark","url","description","renderResponsiveImage","renderBeskrivelse","toLowerCase","createResultatbeskrivelse","stillinger","createAntallText","tag","getElementTag","__APP_NAME__","__APP_VERSION__","SexguidenSok","HTMLElement","_handleEmneknaggerUpdated","this","_updateHistory","_logTagsChanged","_updateResults","connectedCallback","originalState","emneknaggElement","window","onpopstate","e","state","addEventListener","appElement","sendGaEvent","eventAction","eventLabel","history","pushState","emneknaggUrl","async","_abortController","abort","alleEmneknagger","resultsElement","innerHTML","renderHenter","AbortController","signal","response","fetch","apiUrl","mode","json","setAttribute","renderSokeresultat","closest","querySelector","getAttribute","images","querySelectorAll","Emneknagger","currentLayout","_layout","document","documentElement","clientWidth","_layoutDesktop","_layoutMobile","_handleLinkClick","type","keyCode","preventDefault","link","target","currentEmneknagg","event","CustomEvent","bubbles","cancelable","createEvent","initEvent","dispatchEvent","observedAttributes","fonts","ready","then","links","removeAttribute","_updateDisabledEmneknagger","attributeChangedCallback","attributeName","_updateValgteEmneknagger","item","items","style","position","row1","row2","rowHeight","itemWidth","offsetWidth","top","left","offsetHeight","Math","max","list","setProperty","active","toString","emneknaggerMap","fromEntries","count","Array","from","Boolean","val","JSON","parse","value","stringify","SexguidenSokeresultat","_columnWidth","_columnGap","_rowGap","_rowGapSmall","_updatePositions","containerWidth","stillingContainer","nrOfColumns","floor","rowGap","columnStarts","columnWidth","heights","idx","Object","entries","minStartPosition","min","columnIndex","findIndex","start","stillingHeight","height","_debouncedUpdatePositions","debounce","forEach","img","disconnectedCallback","removeEventListener","customElements","get","define","default","CoreScroll","strings","interpolations","str","i","isArray","replace"],"sourceRoot":""}