{"version":3,"file":"scrolling-DWd1NuUi.js","sources":["../../meteomaps-api/client/core/ApiError.ts","../../meteomaps-api/client/core/CancelablePromise.ts","../../meteomaps-api/client/core/request.ts","../../src/utils/scrolling.ts"],"sourcesContent":["/* generated using openapi-typescript-codegen -- do not edit */\n/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { ApiRequestOptions } from './ApiRequestOptions';\nimport type { ApiResult } from './ApiResult';\n\nexport class ApiError extends Error {\n public readonly url: string;\n public readonly status: number;\n public readonly statusText: string;\n public readonly body: any;\n public readonly request: ApiRequestOptions;\n\n constructor(request: ApiRequestOptions, response: ApiResult, message: string) {\n super(message);\n\n this.name = 'ApiError';\n this.url = response.url;\n this.status = response.status;\n this.statusText = response.statusText;\n this.body = response.body;\n this.request = request;\n }\n}\n","/* generated using openapi-typescript-codegen -- do not edit */\n/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nexport class CancelError extends Error {\n\n constructor(message: string) {\n super(message);\n this.name = 'CancelError';\n }\n\n public get isCancelled(): boolean {\n return true;\n }\n}\n\nexport interface OnCancel {\n readonly isResolved: boolean;\n readonly isRejected: boolean;\n readonly isCancelled: boolean;\n\n (cancelHandler: () => void): void;\n}\n\nexport class CancelablePromise implements Promise {\n #isResolved: boolean;\n #isRejected: boolean;\n #isCancelled: boolean;\n readonly #cancelHandlers: (() => void)[];\n readonly #promise: Promise;\n #resolve?: (value: T | PromiseLike) => void;\n #reject?: (reason?: any) => void;\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike) => void,\n reject: (reason?: any) => void,\n onCancel: OnCancel\n ) => void\n ) {\n this.#isResolved = false;\n this.#isRejected = false;\n this.#isCancelled = false;\n this.#cancelHandlers = [];\n this.#promise = new Promise((resolve, reject) => {\n this.#resolve = resolve;\n this.#reject = reject;\n\n const onResolve = (value: T | PromiseLike): void => {\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\n return;\n }\n this.#isResolved = true;\n if (this.#resolve) this.#resolve(value);\n };\n\n const onReject = (reason?: any): void => {\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\n return;\n }\n this.#isRejected = true;\n if (this.#reject) this.#reject(reason);\n };\n\n const onCancel = (cancelHandler: () => void): void => {\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\n return;\n }\n this.#cancelHandlers.push(cancelHandler);\n };\n\n Object.defineProperty(onCancel, 'isResolved', {\n get: (): boolean => this.#isResolved,\n });\n\n Object.defineProperty(onCancel, 'isRejected', {\n get: (): boolean => this.#isRejected,\n });\n\n Object.defineProperty(onCancel, 'isCancelled', {\n get: (): boolean => this.#isCancelled,\n });\n\n return executor(onResolve, onReject, onCancel as OnCancel);\n });\n }\n\n get [Symbol.toStringTag]() {\n return \"Cancellable Promise\";\n }\n\n public then(\n onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null,\n onRejected?: ((reason: any) => TResult2 | PromiseLike) | null\n ): Promise {\n return this.#promise.then(onFulfilled, onRejected);\n }\n\n public catch(\n onRejected?: ((reason: any) => TResult | PromiseLike) | null\n ): Promise {\n return this.#promise.catch(onRejected);\n }\n\n public finally(onFinally?: (() => void) | null): Promise {\n return this.#promise.finally(onFinally);\n }\n\n public cancel(): void {\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\n return;\n }\n this.#isCancelled = true;\n if (this.#cancelHandlers.length) {\n try {\n for (const cancelHandler of this.#cancelHandlers) {\n cancelHandler();\n }\n } catch (error) {\n console.warn('Cancellation threw an error', error);\n return;\n }\n }\n this.#cancelHandlers.length = 0;\n if (this.#reject) this.#reject(new CancelError('Request aborted'));\n }\n\n public get isCancelled(): boolean {\n return this.#isCancelled;\n }\n}\n","/* generated using openapi-typescript-codegen -- do not edit */\n/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport { ApiError } from './ApiError';\nimport type { ApiRequestOptions } from './ApiRequestOptions';\nimport type { ApiResult } from './ApiResult';\nimport { CancelablePromise } from './CancelablePromise';\nimport type { OnCancel } from './CancelablePromise';\nimport type { OpenAPIConfig } from './OpenAPI';\n\nexport const isDefined = (value: T | null | undefined): value is Exclude => {\n return value !== undefined && value !== null;\n};\n\nexport const isString = (value: any): value is string => {\n return typeof value === 'string';\n};\n\nexport const isStringWithValue = (value: any): value is string => {\n return isString(value) && value !== '';\n};\n\nexport const isBlob = (value: any): value is Blob => {\n return (\n typeof value === 'object' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.constructor === 'function' &&\n typeof value.constructor.name === 'string' &&\n /^(Blob|File)$/.test(value.constructor.name) &&\n /^(Blob|File)$/.test(value[Symbol.toStringTag])\n );\n};\n\nexport const isFormData = (value: any): value is FormData => {\n return value instanceof FormData;\n};\n\nexport const base64 = (str: string): string => {\n try {\n return btoa(str);\n } catch (err) {\n // @ts-ignore\n return Buffer.from(str).toString('base64');\n }\n};\n\nexport const getQueryString = (params: Record): string => {\n const qs: string[] = [];\n\n const append = (key: string, value: any) => {\n qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n };\n\n const process = (key: string, value: any) => {\n if (isDefined(value)) {\n if (Array.isArray(value)) {\n value.forEach(v => {\n process(key, v);\n });\n } else if (typeof value === 'object') {\n Object.entries(value).forEach(([k, v]) => {\n process(`${key}[${k}]`, v);\n });\n } else {\n append(key, value);\n }\n }\n };\n\n Object.entries(params).forEach(([key, value]) => {\n process(key, value);\n });\n\n if (qs.length > 0) {\n return `?${qs.join('&')}`;\n }\n\n return '';\n};\n\nconst getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {\n const encoder = config.ENCODE_PATH || encodeURI;\n\n const path = options.url\n .replace('{api-version}', config.VERSION)\n .replace(/{(.*?)}/g, (substring: string, group: string) => {\n if (options.path?.hasOwnProperty(group)) {\n return encoder(String(options.path[group]));\n }\n return substring;\n });\n\n const url = `${config.BASE}${path}`;\n if (options.query) {\n return `${url}${getQueryString(options.query)}`;\n }\n return url;\n};\n\nexport const getFormData = (options: ApiRequestOptions): FormData | undefined => {\n if (options.formData) {\n const formData = new FormData();\n\n const process = (key: string, value: any) => {\n if (isString(value) || isBlob(value)) {\n formData.append(key, value);\n } else {\n formData.append(key, JSON.stringify(value));\n }\n };\n\n Object.entries(options.formData)\n .filter(([_, value]) => isDefined(value))\n .forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach(v => process(key, v));\n } else {\n process(key, value);\n }\n });\n\n return formData;\n }\n return undefined;\n};\n\ntype Resolver = (options: ApiRequestOptions) => Promise;\n\nexport const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => {\n if (typeof resolver === 'function') {\n return (resolver as Resolver)(options);\n }\n return resolver;\n};\n\nexport const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => {\n const [token, username, password, additionalHeaders] = await Promise.all([\n resolve(options, config.TOKEN),\n resolve(options, config.USERNAME),\n resolve(options, config.PASSWORD),\n resolve(options, config.HEADERS),\n ]);\n\n const headers = Object.entries({\n Accept: 'application/json',\n ...additionalHeaders,\n ...options.headers,\n })\n .filter(([_, value]) => isDefined(value))\n .reduce((headers, [key, value]) => ({\n ...headers,\n [key]: String(value),\n }), {} as Record);\n\n if (isStringWithValue(token)) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n if (isStringWithValue(username) && isStringWithValue(password)) {\n const credentials = base64(`${username}:${password}`);\n headers['Authorization'] = `Basic ${credentials}`;\n }\n\n if (options.body !== undefined) {\n if (options.mediaType) {\n headers['Content-Type'] = options.mediaType;\n } else if (isBlob(options.body)) {\n headers['Content-Type'] = options.body.type || 'application/octet-stream';\n } else if (isString(options.body)) {\n headers['Content-Type'] = 'text/plain';\n } else if (!isFormData(options.body)) {\n headers['Content-Type'] = 'application/json';\n }\n }\n\n return new Headers(headers);\n};\n\nexport const getRequestBody = (options: ApiRequestOptions): any => {\n if (options.body !== undefined) {\n if (options.mediaType?.includes('/json')) {\n return JSON.stringify(options.body)\n } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {\n return options.body;\n } else {\n return JSON.stringify(options.body);\n }\n }\n return undefined;\n};\n\nexport const sendRequest = async (\n config: OpenAPIConfig,\n options: ApiRequestOptions,\n url: string,\n body: any,\n formData: FormData | undefined,\n headers: Headers,\n onCancel: OnCancel\n): Promise => {\n const controller = new AbortController();\n\n const request: RequestInit = {\n headers,\n body: body ?? formData,\n method: options.method,\n signal: controller.signal,\n };\n\n if (config.WITH_CREDENTIALS) {\n request.credentials = config.CREDENTIALS;\n }\n\n onCancel(() => controller.abort());\n\n return await fetch(url, request);\n};\n\nexport const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => {\n if (responseHeader) {\n const content = response.headers.get(responseHeader);\n if (isString(content)) {\n return content;\n }\n }\n return undefined;\n};\n\nexport const getResponseBody = async (response: Response): Promise => {\n if (response.status !== 204) {\n try {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n const jsonTypes = ['application/json', 'application/problem+json']\n const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type));\n if (isJSON) {\n return await response.json();\n } else {\n return await response.text();\n }\n }\n } catch (error) {\n console.error(error);\n }\n }\n return undefined;\n};\n\nexport const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => {\n const errors: Record = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n ...options.errors,\n }\n\n const error = errors[result.status];\n if (error) {\n throw new ApiError(options, result, error);\n }\n\n if (!result.ok) {\n const errorStatus = result.status ?? 'unknown';\n const errorStatusText = result.statusText ?? 'unknown';\n const errorBody = (() => {\n try {\n return JSON.stringify(result.body, null, 2);\n } catch (e) {\n return undefined;\n }\n })();\n\n throw new ApiError(options, result,\n `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`\n );\n }\n};\n\n/**\n * Request method\n * @param config The OpenAPI configuration object\n * @param options The request options from the service\n * @returns CancelablePromise\n * @throws ApiError\n */\nexport const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => {\n return new CancelablePromise(async (resolve, reject, onCancel) => {\n try {\n const url = getUrl(config, options);\n const formData = getFormData(options);\n const body = getRequestBody(options);\n const headers = await getHeaders(config, options);\n\n if (!onCancel.isCancelled) {\n const response = await sendRequest(config, options, url, body, formData, headers, onCancel);\n const responseBody = await getResponseBody(response);\n const responseHeader = getResponseHeader(response, options.responseHeader);\n\n const result: ApiResult = {\n url,\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n body: responseHeader ?? responseBody,\n };\n\n catchErrorCodes(options, result);\n\n resolve(result.body);\n }\n } catch (error) {\n reject(error);\n }\n });\n};\n","import { isReduceMotionEnabled } from \"@Utils/accessibility\";\nimport { forceMoveFlyingFocus } from \"@Utils/flyingFocus\";\nimport { RefObject } from \"react\";\n\nconst DEFAULT_SCROLL_TIME = 600; // milliseconds\nconst MINIMAL_SCROLL_TIME = 200; // milliseconds\n\nexport const scrollElementToViewport = (\n element: HTMLLIElement,\n padding = 0,\n keyboardNavigationRef?: RefObject,\n) => {\n const container = element.parentElement;\n if (!container) {\n return;\n }\n const containerRect = container.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n let scrollAmount = 0;\n if (elementRect.right > containerRect.right) {\n // Element is partially or fully to the right of the viewport\n scrollAmount = elementRect.right - containerRect.right + padding; // Add some padding to see a fraction of the next day\n } else if (elementRect.left < containerRect.left) {\n scrollAmount = elementRect.left - containerRect.left - padding; // Subtract some padding to see a fraction of the previous day\n }\n\n if (scrollAmount !== 0) {\n container.scrollTo({\n left: container.scrollLeft + scrollAmount,\n behavior: \"smooth\",\n });\n container.addEventListener(\n \"scrollend\",\n () => {\n if (keyboardNavigationRef?.current) {\n forceMoveFlyingFocus();\n keyboardNavigationRef.current = false;\n }\n },\n { once: true },\n );\n }\n};\n\nexport const animateScrollToPosition = (\n element: HTMLElement,\n targetPosition: number,\n animate = true,\n) => {\n if (isReduceMotionEnabled() || !animate) {\n element.scrollLeft = targetPosition;\n return;\n }\n\n const currentPosition = element.scrollLeft;\n const distance = Math.abs(currentPosition - targetPosition);\n\n // Make the time needed depend on the covered distance. This makes\n // sure that longer distances take longer to scroll over than short\n // distances. But it should take at least 200ms\n // Taken from CMS: https://github.com/mmz-srf/ezpublish-community/blob/7b3523f96500041075722bc1892d16462f4d6573/src/SRF/CMSSiteBundle/Resources/assets/frontend-components/frontend/modules/containers/swipeable-area/swipeable-area.js#L525-L543\n let duration = DEFAULT_SCROLL_TIME;\n duration = (duration / 1200) * distance;\n duration = Math.max(duration, MINIMAL_SCROLL_TIME);\n\n let startTime: number | null = null;\n\n const step = (currentTime: number) => {\n if (startTime === null) {\n startTime = currentTime;\n }\n const elapsedTime = currentTime - startTime;\n\n if (elapsedTime < duration) {\n const progress = easeInOutSine(elapsedTime / duration);\n const newPosition =\n currentPosition + (targetPosition - currentPosition) * progress;\n element.scrollLeft = newPosition;\n requestAnimationFrame(step);\n } else {\n element.scrollLeft = targetPosition;\n }\n\n // Update data-scroll-position attribute to keep track of the scroll position for E2E tests\n element.dataset.scrollPosition = element.scrollLeft.toString();\n };\n\n element.style.scrollBehavior = \"auto\";\n requestAnimationFrame(step);\n};\n\n// Easing function for smooth animation\n// Source: https://easings.net/#easeInOutSine\nconst easeInOutSine = (t: number): number => {\n return -(Math.cos(Math.PI * t) - 1) / 2;\n};\n"],"names":["ApiError","request","response","message","__publicField","CancelError","CancelablePromise","executor","__privateAdd","_isResolved","_isRejected","_isCancelled","_cancelHandlers","_promise","_resolve","_reject","__privateSet","resolve","reject","onResolve","value","__privateGet","onReject","reason","onCancel","cancelHandler","onFulfilled","onRejected","onFinally","error","isDefined","isString","isStringWithValue","isBlob","isFormData","base64","str","getQueryString","params","qs","append","key","process","v","k","getUrl","config","options","encoder","path","substring","group","_a","url","getFormData","formData","_","resolver","getHeaders","token","username","password","additionalHeaders","headers","credentials","getRequestBody","sendRequest","body","controller","getResponseHeader","responseHeader","content","getResponseBody","contentType","type","catchErrorCodes","result","errorStatus","errorStatusText","errorBody","responseBody","DEFAULT_SCROLL_TIME","MINIMAL_SCROLL_TIME","scrollElementToViewport","element","padding","keyboardNavigationRef","container","containerRect","elementRect","scrollAmount","forceMoveFlyingFocus","animateScrollToPosition","targetPosition","animate","isReduceMotionEnabled","currentPosition","distance","duration","startTime","step","currentTime","elapsedTime","progress","easeInOutSine","newPosition"],"mappings":"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"}