{"version":3,"file":"OnComponents.mjs","sources":["../../Scripts/intersectionObserver.ts","../../Scripts/utilities.ts","../../Scripts/topScrolledElement.ts","../../Scripts/popoverDialog.js","../../Scripts/dialog.js","../../Scripts/rightPanel.js","../../Scripts/datePicker.js","../../Scripts/tabSwitch.js","../../Scripts/file-preview.js","../../Scripts/dropdownPopover.js","../../Scripts/tooltip.js","../../Scripts/index.ts"],"sourcesContent":["import IDisposable from \"./IDisposable\";\r\n\r\n/**\r\n * Adds and creates intersection observers\r\n * @param {HTMLElement} element The element to observe. Must be a descendent of `root`.\r\n * @param {HTMLElement | null} root The root element to be intersected with. If not set, the `body` element will be the root.\r\n * @param {string} handle Handle for the containing element owned by Blazor\r\n * @param {string} callbackMethodName The function name called back to Blazor when an intersection happens\r\n * @param {object} dotNet Dotnet handle */\r\nconst createIntersectionObserver = (element: HTMLElement, root: HTMLElement | null, handle: string, callbackMethodName: string, dotNet: any): IDisposable => {\r\n const intersectionObserver = new IntersectionObserver(\r\n (result) => {\r\n dotNet.invokeMethodAsync(callbackMethodName, handle, result);\r\n }, {root: root ?? document.body});\r\n intersectionObserver.observe(element);\r\n return {\r\n dispose: () => {\r\n intersectionObserver.disconnect();\r\n }\r\n }\r\n};\r\n\r\nexport default createIntersectionObserver;\r\n","import IDisposable from \"./IDisposable\";\r\n\r\n/**\r\n * Scrolls the root element to the target element.\r\n * @param {HTMLElement} root Root element\r\n * @param {string | HTMLElement} elementOrId\r\n */\r\nconst scrollTo = (root: HTMLElement, elementOrId: string | HTMLElement) => {\r\n const el =\r\n typeof elementOrId === \"string\"\r\n ? document.getElementById(elementOrId)\r\n : elementOrId;\r\n if (!!el) {\r\n root.scrollTo({ top: el.offsetTop, behavior: \"smooth\" });\r\n }\r\n};\r\n\r\ntype AnchorBlock = \"top\" | \"bottom\" | \"center\";\r\ntype AnchorInline = \"left\" | \"right\" | \"center\";\r\nconst inlineOpposite = (inline: AnchorInline) =>\r\n inline === \"left\" ? \"right\" : inline === \"right\" ? \"left\" : inline;\r\nconst blockOpposite = (block: AnchorBlock) =>\r\n block === \"top\" ? \"bottom\" : block === \"bottom\" ? \"top\" : block;\r\n\r\ntype Anchor = `${AnchorBlock}-${AnchorInline}`;\r\ntype AnchorTuple = [AnchorBlock, AnchorInline];\r\ntype Relative = {\r\n el: HTMLElement;\r\n elementAnchor: Anchor;\r\n anchor: Anchor;\r\n constrainInView: boolean;\r\n};\r\ntype Position = {\r\n x: number;\r\n y: number;\r\n anchor: Anchor;\r\n constrainInView: boolean;\r\n};\r\n\r\nconst blockToOffset: Record = {\r\n top: 1,\r\n center: 0,\r\n bottom: -1,\r\n};\r\n\r\nconst inlineToOffset: Record = {\r\n left: 1,\r\n center: 0,\r\n right: -1,\r\n};\r\n\r\nconst getPosition = (\r\n rect: DOMRect,\r\n elementRect: DOMRect,\r\n [selfBlock, selfInline]: AnchorTuple,\r\n [elementBlock, elementInline]: AnchorTuple\r\n): DOMRect => {\r\n const { width: currentWidth, height: currentHeight } = rect;\r\n const { x, y, width: elementWidth, height: elementHeight } = elementRect;\r\n return new DOMRect(\r\n x +\r\n (currentWidth * (inlineToOffset[selfInline] - 1.0)) / 2.0 +\r\n (elementWidth * (1.0 - inlineToOffset[elementInline])) / 2.0,\r\n y +\r\n (currentHeight * (blockToOffset[selfBlock] - 1.0)) / 2.0 +\r\n (elementHeight * (1.0 - blockToOffset[elementBlock])) / 2.0,\r\n currentWidth,\r\n currentHeight\r\n );\r\n};\r\n\r\nconst constrainInView = (\r\n rect: DOMRect,\r\n elementRect: DOMRect,\r\n [selfBlock, selfInline]: AnchorTuple,\r\n [elementBlock, elementInline]: AnchorTuple\r\n) => {\r\n const screenWidth = window.innerWidth,\r\n screenHeight = window.innerHeight;\r\n let position = DOMRect.fromRect(rect);\r\n if (\r\n rect.width < screenWidth &&\r\n (rect.left < 0 || rect.right >= screenWidth)\r\n ) {\r\n position = getPosition(\r\n position,\r\n elementRect,\r\n [selfBlock, inlineOpposite(selfInline)],\r\n [elementBlock, inlineOpposite(elementInline)]\r\n );\r\n }\r\n if (\r\n rect.height < screenHeight &&\r\n (rect.top < 0 || rect.bottom >= screenHeight)\r\n ) {\r\n position = getPosition(\r\n position,\r\n elementRect,\r\n [blockOpposite(selfBlock), selfInline],\r\n [blockOpposite(elementBlock), elementInline]\r\n );\r\n }\r\n return position;\r\n};\r\n\r\nconst setPosition = (el: HTMLElement, position: Position | Relative) => {\r\n const anchor = position.anchor.split(\"-\") as AnchorTuple;\r\n const elementAnchor = (\r\n \"elementAnchor\" in position\r\n ? position.elementAnchor.split(\"-\")\r\n : [\"top\", \"left\"]\r\n ) as AnchorTuple;\r\n const rect = el.getBoundingClientRect();\r\n const elementRect =\r\n \"el\" in position\r\n ? position.el.getBoundingClientRect()\r\n : new DOMRect(position.x, position.y, 0, 0);\r\n\r\n let calculatedPosition = getPosition(\r\n rect,\r\n elementRect,\r\n anchor,\r\n elementAnchor\r\n );\r\n if (position.constrainInView) {\r\n calculatedPosition = constrainInView(\r\n calculatedPosition,\r\n elementRect,\r\n anchor,\r\n elementAnchor\r\n );\r\n }\r\n\r\n Object.assign(el.style, {\r\n left: `${calculatedPosition.x}px`,\r\n top: `${calculatedPosition.y}px`,\r\n });\r\n};\r\n\r\nconst addEventOutsideListener = (\r\n el: HTMLElement | Array,\r\n handle: string,\r\n callbackMethodName: string,\r\n eventName: string,\r\n dotNet: any\r\n): IDisposable => {\r\n const eventListener = (event: Event) => {\r\n const elements = Array.isArray(el) ? el : [el];\r\n if (elements.find((el) => el.contains(event.target as Node))) return;\r\n dotNet.invokeMethodAsync(callbackMethodName, handle);\r\n };\r\n document.addEventListener(eventName, eventListener, true);\r\n return {\r\n dispose(): void {\r\n document.removeEventListener(eventName, eventListener);\r\n },\r\n };\r\n};\r\n\r\nfunction getBoundingClientRectById(elementId: string) {\r\n const el = document.getElementById(elementId);\r\n if (!el) return null;\r\n const rect = el.getBoundingClientRect();\r\n return {\r\n top: rect.top,\r\n left: rect.left,\r\n width: rect.width,\r\n height: rect.height,\r\n bottom: rect.bottom,\r\n right: rect.right,\r\n };\r\n}\r\n\r\nfunction ensureElementId(element: HTMLElement): string {\r\n if (!element.id) {\r\n element.id = \"on-tooltip-\" + Math.random().toString(36).substr(2, 9);\r\n }\r\n return element.id;\r\n}\r\n\r\nexport {\r\n scrollTo,\r\n setPosition,\r\n addEventOutsideListener,\r\n getBoundingClientRectById,\r\n ensureElementId,\r\n};\r\n","import IDisposable from \"./IDisposable\";\r\n\r\n/**\r\n * Adds a listener for detecting when an element is in view within the root. The targeted element must have the\r\n * data-attribute ´data-scrollTarget´ set to some string identifier. Further, `data-hasScrollTarget` is set if the\r\n * element currently is active in view.\r\n * @param {string} handle Handle for the containing element owned by Blazor\r\n * @param {HTMLElement} root Container element\r\n * @param {string} callbackMethodName The function name called back to Blazor when scroll target changes\r\n * @param {object} dotNet Dotnet handle\r\n * @returns {(function(): void)|*}\r\n */\r\nconst addCurrentTopScrolledElementListener = (handle: string, root: HTMLElement, callbackMethodName: string, dotNet: any): IDisposable => {\r\n\r\n const callback = (id: string) => {\r\n dotNet.invokeMethodAsync(callbackMethodName, handle, id);\r\n }\r\n\r\n /* todo: make this an option and implement relative offset as well. */\r\n const offsetHeight = 10;\r\n\r\n const selectItem = (element: HTMLElement, target: HTMLElement) => (element.offsetTop + offsetHeight) >= target.scrollTop && (element.offsetTop + offsetHeight < target.scrollTop + target.clientHeight);\r\n\r\n const current = Array.from(root.children).find((element) => (element.getAttribute(\"data-scrollTarget\") && selectItem(element as HTMLElement, root)));\r\n if (current) {\r\n current.setAttribute(\"data-hasScrollTarget\", \"true\");\r\n callback(current.getAttribute(\"data-scrollTarget\")!);\r\n }\r\n\r\n const isHTMLElement = (eventTarget: EventTarget): eventTarget is HTMLElement => \"children\" in eventTarget && typeof eventTarget.children === \"object\";\r\n\r\n const eventListener: EventListener = (event) => {\r\n const eventTarget = event.target;\r\n if(!eventTarget || !isHTMLElement(eventTarget)) return;\r\n const children = Array.from(eventTarget.querySelectorAll(\"[data-scrollTarget]\"));\r\n const current = children.find(s => s.getAttribute(\"data-hasScrollTarget\"));\r\n const next = children\r\n .find((element) => selectItem(element as HTMLElement, eventTarget));\r\n if (current !== next) {\r\n current?.removeAttribute(\"data-hasScrollTarget\");\r\n next?.setAttribute(\"data-hasScrollTarget\", \"true\");\r\n const nextId = next?.getAttribute(\"data-scrollTarget\");\r\n if (nextId) {\r\n callback(nextId);\r\n }\r\n }\r\n };\r\n\r\n root.addEventListener(\"scroll\", eventListener);\r\n \r\n return {\r\n dispose: () => {\r\n root.removeEventListener(\"scroll\", eventListener);\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default addCurrentTopScrolledElementListener;","export function calculatePopoverPosition(\r\n targetId,\r\n popoverId,\r\n position,\r\n offset\r\n) {\r\n const targetElement = document.getElementById(targetId);\r\n const popoverElement = document.getElementById(popoverId);\r\n\r\n if (!targetElement || !popoverElement) {\r\n return;\r\n }\r\n\r\n const targetRect = targetElement.getBoundingClientRect();\r\n const popoverRect = popoverElement.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n\r\n // Default position styles\r\n let top = 0;\r\n let left = 0;\r\n let originalPosition = position;\r\n\r\n // First attempt to place popover at preferred position\r\n // Calculate position based on the specified side\r\n switch (position) {\r\n case \"Top\":\r\n top = targetRect.top - popoverRect.height - offset;\r\n left = targetRect.right - popoverRect.width;\r\n\r\n // If not enough space on top, try bottom\r\n if (top < 0) {\r\n position = \"Bottom\";\r\n }\r\n break;\r\n\r\n case \"Right\":\r\n top = targetRect.top + targetRect.height / 2 - popoverRect.height / 2;\r\n left = targetRect.right + offset;\r\n\r\n // If not enough space on right, try left\r\n if (left + popoverRect.width > viewportWidth) {\r\n position = \"Left\";\r\n }\r\n break;\r\n\r\n case \"Bottom\":\r\n top = targetRect.bottom + offset;\r\n left = targetRect.right - popoverRect.width;\r\n\r\n // If not enough space at bottom, try top\r\n if (top + popoverRect.height > viewportHeight) {\r\n position = \"Top\";\r\n }\r\n break;\r\n\r\n case \"Left\":\r\n top = targetRect.top + targetRect.height / 2 - popoverRect.height / 2;\r\n left = targetRect.left - popoverRect.width - offset;\r\n\r\n // If not enough space on left, try right\r\n if (left < 0) {\r\n position = \"Right\";\r\n }\r\n break;\r\n\r\n default:\r\n // Default to Bottom\r\n position = \"Bottom\";\r\n top = targetRect.bottom + offset;\r\n left = targetRect.right - popoverRect.width;\r\n }\r\n\r\n // If position changed due to space constraints, recalculate\r\n if (position !== originalPosition) {\r\n switch (position) {\r\n case \"Top\":\r\n top = targetRect.top - popoverRect.height - offset;\r\n left = targetRect.right - popoverRect.width;\r\n break;\r\n\r\n case \"Right\":\r\n top = targetRect.top + targetRect.height / 2 - popoverRect.height / 2;\r\n left = targetRect.right + offset;\r\n break;\r\n\r\n case \"Bottom\":\r\n top = targetRect.bottom + offset;\r\n left = targetRect.right - popoverRect.width;\r\n break;\r\n\r\n case \"Left\":\r\n top = targetRect.top + targetRect.height / 2 - popoverRect.height / 2;\r\n left = targetRect.left - popoverRect.width - offset;\r\n break;\r\n }\r\n }\r\n\r\n // Adjust horizontal position to ensure the popover remains within the viewport\r\n if (left < 0) {\r\n left = offset;\r\n } else if (left + popoverRect.width > viewportWidth) {\r\n left = viewportWidth - popoverRect.width - offset;\r\n }\r\n\r\n // Adjust vertical position to ensure the popover remains within the viewport\r\n if (top < 0) {\r\n top = offset;\r\n } else if (top + popoverRect.height > viewportHeight) {\r\n top = viewportHeight - popoverRect.height - offset;\r\n }\r\n\r\n // Update the popover's position\r\n popoverElement.style.top = `${top}px`;\r\n popoverElement.style.left = `${left}px`;\r\n\r\n return { top, left };\r\n}\r\n\r\nexport function addPopoverEventListeners(targetId, popoverId, dotNetReference) {\r\n const handleResize = () => {\r\n dotNetReference.invokeMethodAsync(\"UpdatePosition\");\r\n };\r\n\r\n // Add resize event listener\r\n window.addEventListener(\"resize\", handleResize);\r\n\r\n // Add scroll event listener to handle repositioning when scrolling\r\n window.addEventListener(\"scroll\", handleResize, true);\r\n\r\n // Return an object with a dispose method\r\n return {\r\n dispose: function () {\r\n window.removeEventListener(\"resize\", handleResize);\r\n window.removeEventListener(\"scroll\", handleResize, true);\r\n },\r\n };\r\n}\r\n\r\nexport function getBoundingClientRect(elementId) {\r\n const element = document.getElementById(elementId);\r\n if (!element) {\r\n return null;\r\n }\r\n const rect = element.getBoundingClientRect();\r\n return {\r\n left: rect.left,\r\n top: rect.top,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n}\r\n\r\nexport function getViewportWidth() {\r\n return window.innerWidth;\r\n}\r\n\r\nexport function getViewportHeight() {\r\n return window.innerHeight;\r\n}\r\n\r\nexport function setPosition(popoverId, x, y) {\r\n const popoverElement = document.getElementById(popoverId);\r\n if (!popoverElement) {\r\n return;\r\n }\r\n\r\n popoverElement.style.position = \"absolute\";\r\n popoverElement.style.left = `${x}px`;\r\n popoverElement.style.top = `${y}px`;\r\n}\r\n\r\nexport function initPointerEvents(popoverId, dotNetObject) {\r\n const onMove = (e) => {\r\n dotNetObject.invokeMethodAsync(\"OnPointerMove\", e.clientX, e.clientY);\r\n };\r\n\r\n const onUp = () => {\r\n dotNetObject.invokeMethodAsync(\"OnPointerUp\");\r\n window.removeEventListener(\"pointermove\", onMove);\r\n window.removeEventListener(\"pointerup\", onUp);\r\n document.body.classList.remove(\"on-popover-dragging\");\r\n };\r\n\r\n // Add the class to prevent text selection when dragging starts\r\n document.body.classList.add(\"on-popover-dragging\");\r\n\r\n window.addEventListener(\"pointermove\", onMove);\r\n window.addEventListener(\"pointerup\", onUp);\r\n}\r\n","/**\r\n * Add event listeners for dialog components\r\n *\r\n * @param {string} targetId - ID of the target element\r\n * @param {string} dialogId - ID of the dialog element\r\n * @param {object} dotNetReference - Reference to the .NET component\r\n * @returns {object} - Object with a dispose method to clean up event listeners\r\n */\r\nexport function addDialogEventListeners(targetId, dialogId, dotNetReference) {\r\n const dialogElement = document.getElementById(dialogId);\r\n const dialogContent = dialogElement?.querySelector(\".on-base-dialog\");\r\n\r\n // Store the element that had focus before the dialog opened\r\n let previouslyFocusedElement = null;\r\n\r\n // Get all focusable elements within the dialog\r\n const getFocusableElements = () => {\r\n if (!dialogContent) return [];\r\n\r\n return Array.from(\r\n dialogContent.querySelectorAll(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"]), [contenteditable=\"true\"]'\r\n )\r\n ).filter((el) => {\r\n // Filter out disabled and hidden elements\r\n return (\r\n !el.disabled &&\r\n !el.hidden &&\r\n el.offsetParent !== null &&\r\n window.getComputedStyle(el).visibility !== \"hidden\"\r\n );\r\n });\r\n };\r\n\r\n const handleKeyDown = (event) => {\r\n if (event.key === \"Escape\") {\r\n dotNetReference.invokeMethodAsync(\"HandleEscapeKey\");\r\n return;\r\n }\r\n\r\n // Handle tab key for focus trapping\r\n if (event.key === \"Tab\" && dialogContent) {\r\n const focusableElements = getFocusableElements();\r\n\r\n if (focusableElements.length === 0) {\r\n // If no focusable elements, prevent tabbing\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const firstElement = focusableElements[0];\r\n const lastElement = focusableElements[focusableElements.length - 1];\r\n const activeElement = document.activeElement;\r\n\r\n // Check if the active element is within the dialog\r\n const isActiveElementInDialog = dialogContent.contains(activeElement);\r\n\r\n if (event.shiftKey) {\r\n // Shift + Tab: move backwards\r\n if (!isActiveElementInDialog || activeElement === firstElement) {\r\n event.preventDefault();\r\n lastElement.focus();\r\n }\r\n } else {\r\n // Tab: move forwards\r\n if (!isActiveElementInDialog || activeElement === lastElement) {\r\n event.preventDefault();\r\n firstElement.focus();\r\n }\r\n }\r\n }\r\n };\r\n\r\n // Focus management when dialog opens\r\n const handleDialogOpen = () => {\r\n if (dialogContent) {\r\n // Store the currently focused element\r\n previouslyFocusedElement = document.activeElement;\r\n\r\n // Find the first focusable element in the dialog\r\n const focusableElements = getFocusableElements();\r\n if (focusableElements.length > 0) {\r\n // Focus the first focusable element\r\n focusableElements[0].focus();\r\n } else {\r\n // If no focusable elements, focus the dialog itself\r\n dialogContent.focus();\r\n }\r\n }\r\n };\r\n\r\n // Focus management when dialog closes\r\n const handleDialogClose = () => {\r\n // Restore focus to the previously focused element\r\n if (\r\n previouslyFocusedElement &&\r\n typeof previouslyFocusedElement.focus === \"function\"\r\n ) {\r\n previouslyFocusedElement.focus();\r\n }\r\n previouslyFocusedElement = null;\r\n };\r\n\r\n // Set up event listeners\r\n window.addEventListener(\"keydown\", handleKeyDown);\r\n\r\n // Handle dialog open\r\n handleDialogOpen();\r\n\r\n return {\r\n dispose: function () {\r\n window.removeEventListener(\"keydown\", handleKeyDown);\r\n handleDialogClose();\r\n },\r\n };\r\n}\r\n","/**\r\n * Document-level Escape listener for OnRightPanel (capture phase so it works\r\n * when focus is outside the panel, e.g. main page or embedded PDF viewer chrome).\r\n */\r\nexport function addEscapeKeyListener(dotNetReference) {\r\n const handleKeyDown = (event) => {\r\n if (event.key !== \"Escape\") {\r\n return;\r\n }\r\n\r\n void dotNetReference.invokeMethodAsync(\"HandleEscapeKey\");\r\n };\r\n\r\n window.addEventListener(\"keydown\", handleKeyDown, true);\r\n\r\n return {\r\n dispose() {\r\n window.removeEventListener(\"keydown\", handleKeyDown, true);\r\n },\r\n };\r\n}\r\n","/**\r\n * Escape mens kalenderen i OnLabeledDate er åpen: lukk bare kalenderen.\r\n *\r\n * Lytteren står på window i CAPTURE-fasen, så den går før OnBaseDialog sin\r\n * Escape-lytter (bubble-fasen på window). stopPropagation hindrer at dialogen\r\n * lukkes og at skjemaet brukeren holder på med, forkastes. Blazors egen\r\n * @onkeydown:stopPropagation stopper bare Blazors interne bobling, ikke\r\n * hendelsen i nettleseren, og kan derfor ikke brukes til dette.\r\n */\r\nexport function addEscapeKeyListener(dotNetReference) {\r\n const handleKeyDown = (event) => {\r\n if (event.key !== \"Escape\") {\r\n return;\r\n }\r\n\r\n event.stopPropagation();\r\n dotNetReference.invokeMethodAsync(\"CloseCalendarFromEscape\").catch(() => {\r\n // Komponenten er fjernet før lytteren ble ryddet. Ingenting å lukke.\r\n });\r\n };\r\n\r\n window.addEventListener(\"keydown\", handleKeyDown, true);\r\n\r\n return {\r\n dispose() {\r\n window.removeEventListener(\"keydown\", handleKeyDown, true);\r\n },\r\n };\r\n}\r\n","/**\r\n * Handles the sliding background animation for OnTabSwitch components.\r\n * This script positions a sliding background element under the active tab button.\r\n */\r\nexport function initTabSwitches() {\r\n const tabSwitches = document.querySelectorAll(\".on-tab-switch\");\r\n\r\n tabSwitches.forEach((tabSwitch) => {\r\n const tabGroup = tabSwitch.querySelector(\".tab-group\");\r\n const tabButtons = tabSwitch.querySelectorAll(\".tab-button\");\r\n\r\n // Initial positioning of the sliding background\r\n updateTabBackgroundPosition(tabGroup, tabButtons);\r\n\r\n // Add click listeners to all tab buttons\r\n tabButtons.forEach((button) => {\r\n button.addEventListener(\"click\", (e) => {\r\n // Update based on which button was clicked, without waiting for the active class\r\n updateTabBackgroundPositionForButton(tabGroup, button);\r\n });\r\n\r\n // Add keyboard accessibility\r\n button.addEventListener(\"keydown\", (e) => {\r\n // Handle left and right arrow keys for keyboard navigation\r\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\") {\r\n e.preventDefault();\r\n\r\n const index = parseInt(button.getAttribute(\"data-tab-index\"));\r\n const nextIndex =\r\n e.key === \"ArrowRight\"\r\n ? (index + 1) % tabButtons.length\r\n : (index - 1 + tabButtons.length) % tabButtons.length;\r\n\r\n // Focus the next/previous button\r\n tabButtons[nextIndex].focus();\r\n }\r\n });\r\n });\r\n\r\n // Make the sliding background visible after initialization\r\n if (tabGroup && tabGroup.querySelector(\".tab-button.active\")) {\r\n updateTabBackgroundPosition(tabGroup, tabButtons);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Updates the position and size of the sliding background element based on the active button.\r\n * @param {HTMLElement} tabGroup - The tab group container\r\n * @param {NodeListOf} tabButtons - The collection of tab buttons\r\n */\r\nfunction updateTabBackgroundPosition(tabGroup, tabButtons) {\r\n if (!tabGroup) return;\r\n\r\n const activeButton = tabGroup.querySelector(\".tab-button.active\");\r\n\r\n if (activeButton) {\r\n updateTabBackgroundPositionForButton(tabGroup, activeButton);\r\n }\r\n}\r\n\r\n/**\r\n * Updates the position and size of the sliding background element for a specific button.\r\n * This is used both for the active button and when a button is clicked.\r\n * @param {HTMLElement} tabGroup - The tab group container\r\n * @param {HTMLElement} button - The button element to position the background under\r\n */\r\nfunction updateTabBackgroundPositionForButton(tabGroup, button) {\r\n if (!tabGroup || !button) return;\r\n\r\n // Get the position and size of the button\r\n const buttonRect = button.getBoundingClientRect();\r\n const groupRect = tabGroup.getBoundingClientRect();\r\n\r\n // Calculate the left position relative to the tab group\r\n const leftPosition = button.offsetLeft;\r\n\r\n // Apply the position and width to the pseudo-element using a custom property\r\n tabGroup.style.setProperty(\"--slide-left\", `${leftPosition}px`);\r\n tabGroup.style.setProperty(\"--slide-width\", `${buttonRect.width}px`);\r\n\r\n // Add a class to trigger the animation\r\n if (!tabGroup.classList.contains(\"has-active-tab\")) {\r\n tabGroup.classList.add(\"has-active-tab\");\r\n }\r\n}\r\n\r\n// Initialize tab switches when the DOM is loaded\r\ndocument.addEventListener(\"DOMContentLoaded\", initTabSwitches);\r\n\r\n// For Blazor components that may be dynamically loaded\r\nif (window.Blazor) {\r\n window.Blazor.addEventListener(\"afterStarted\", initTabSwitches);\r\n} else {\r\n // If Blazor object is not yet available, set up to initialize later\r\n window._onBlazorStarted = window._onBlazorStarted || [];\r\n window._onBlazorStarted.push(initTabSwitches);\r\n}\r\n\r\n/**\r\n * Updates the sliding background for a specific tab switch component.\r\n * This can be called directly when a tab is clicked, even before the active class is updated.\r\n * @param {string} tabSwitchSelector - CSS selector for the tab switch component\r\n * @param {number} [tabIndex] - Optional index of the clicked tab\r\n */\r\nexport function updateTabSwitch(tabSwitchSelector, tabIndex) {\r\n const tabSwitch = document.querySelector(tabSwitchSelector);\r\n if (!tabSwitch) return;\r\n\r\n const tabGroup = tabSwitch.querySelector(\".tab-group\");\r\n const tabButtons = tabSwitch.querySelectorAll(\".tab-button\");\r\n\r\n if (\r\n typeof tabIndex === \"number\" &&\r\n tabIndex >= 0 &&\r\n tabIndex < tabButtons.length\r\n ) {\r\n // If a tab index is provided, use that tab\r\n updateTabBackgroundPositionForButton(tabGroup, tabButtons[tabIndex]);\r\n } else {\r\n // Otherwise find the clicked button (it will be the event target or a parent)\r\n const clickedButton =\r\n tabSwitch.querySelector(\".tab-button:active\") ||\r\n document.activeElement.closest(`${tabSwitchSelector} .tab-button`);\r\n\r\n if (clickedButton) {\r\n updateTabBackgroundPositionForButton(tabGroup, clickedButton);\r\n } else {\r\n // Fall back to looking for .active if no click is detected\r\n updateTabBackgroundPosition(tabGroup, tabButtons);\r\n }\r\n }\r\n\r\n // Note: we don't force focus in this function to allow natural browser focus behavior\r\n}\r\n\r\n// Export a function to manually initialize on demand\r\nexport function reinitTabSwitches() {\r\n initTabSwitches();\r\n}\r\n","// Unified file download function for the OnFilePreviewSidebar component\r\nwindow.downloadFile = function (url, fileName) {\r\n // Check if required helper functions are available\r\n const isMobileDevice = typeof clientIsPhone === \"function\" && clientIsPhone();\r\n const isEdgeBrowser = typeof browserIsEdge === \"function\" && browserIsEdge();\r\n const isTabletDevice =\r\n typeof clientIsTablet === \"function\" && clientIsTablet();\r\n const isIOSDevice = typeof clientIsiOS === \"function\" && clientIsiOS();\r\n\r\n // Fallback detection if helper functions are not available\r\n const isMobile =\r\n isMobileDevice ||\r\n isTabletDevice ||\r\n isIOSDevice ||\r\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\r\n navigator.userAgent\r\n );\r\n const isEdge = isEdgeBrowser || /Edge/.test(navigator.userAgent);\r\n\r\n // Use simple download for mobile devices and Edge\r\n if (isMobile || isEdge) {\r\n try {\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = fileName;\r\n link.target = \"_blank\"; // Open in new tab for mobile\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n } catch (error) {\r\n console.error(\"Error downloading file (mobile/edge):\", error);\r\n // Fallback: open in new window\r\n window.open(url, \"_blank\");\r\n }\r\n } else {\r\n // Use fetch for desktop browsers\r\n fetch(url, {\r\n method: \"GET\",\r\n credentials: \"same-origin\", // Include cookies for authentication\r\n })\r\n .then((resp) => {\r\n if (!resp.ok) {\r\n throw new Error(`HTTP error! status: ${resp.status}`);\r\n }\r\n return resp.blob();\r\n })\r\n .then((blob) => {\r\n const downloadUrl = window.URL.createObjectURL(blob);\r\n const a = document.createElement(\"a\");\r\n a.style.display = \"none\";\r\n a.href = downloadUrl;\r\n a.download = fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n window.URL.revokeObjectURL(downloadUrl);\r\n document.body.removeChild(a);\r\n })\r\n .catch((error) => {\r\n console.error(\"Error downloading file:\", error);\r\n\r\n // Safe error notification\r\n if (\r\n typeof onPortal !== \"undefined\" &&\r\n onPortal.Notify &&\r\n typeof onPortal.Notify.error === \"function\"\r\n ) {\r\n onPortal.Notify.error(\"Kunne ikke laste ned filen\");\r\n } else {\r\n // Fallback error handling\r\n alert(\"Kunne ikke laste ned filen. Vennligst prøv igjen.\");\r\n }\r\n\r\n // Fallback: try direct link\r\n try {\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = fileName;\r\n link.target = \"_blank\";\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n } catch (fallbackError) {\r\n console.error(\"Fallback download also failed:\", fallbackError);\r\n }\r\n });\r\n }\r\n};\r\n","// Helper for OnDropdownPopover\r\nconst openPopovers = new Map(); // Track open popovers and their handlers\r\n\r\nfunction applyPopoverWidth(popover, targetRect, width) {\r\n if (!width || width === \"match-trigger\") {\r\n popover.style.width = `${targetRect.width}px`;\r\n return;\r\n }\r\n\r\n if (width !== \"auto\") {\r\n popover.style.width = width;\r\n return;\r\n }\r\n\r\n popover.style.removeProperty(\"width\");\r\n}\r\n\r\nfunction calculatePopoverPosition(targetRect, popoverRect, placement) {\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n const edgeMargin = 8;\r\n const gap = 6;\r\n\r\n let left = targetRect.left;\r\n let top;\r\n\r\n switch (placement) {\r\n case \"top\":\r\n top = targetRect.top - popoverRect.height - gap;\r\n break;\r\n case \"right\":\r\n left = targetRect.right + gap;\r\n top = targetRect.top;\r\n break;\r\n case \"left\":\r\n left = targetRect.left - popoverRect.width - gap;\r\n top = targetRect.top;\r\n break;\r\n case \"auto\":\r\n case \"bottom\":\r\n default:\r\n top = targetRect.bottom + gap;\r\n break;\r\n }\r\n\r\n // Keep the popover anchored to trigger, but never outside viewport.\r\n const maxLeft = Math.max(edgeMargin, viewportWidth - popoverRect.width - edgeMargin);\r\n left = Math.min(Math.max(left, edgeMargin), maxLeft);\r\n\r\n const overflowsBottom = top + popoverRect.height > viewportHeight - edgeMargin;\r\n if ((placement === \"bottom\" || placement === \"auto\") && overflowsBottom) {\r\n top = targetRect.top - popoverRect.height - gap;\r\n }\r\n\r\n const maxTop = Math.max(edgeMargin, viewportHeight - popoverRect.height - edgeMargin);\r\n top = Math.min(Math.max(top, edgeMargin), maxTop);\r\n\r\n return { left, top };\r\n}\r\n\r\nfunction positionPopover(popover, target, width, placement) {\r\n const targetRect = target.getBoundingClientRect();\r\n\r\n popover.style.position = \"fixed\";\r\n popover.style.display = \"block\";\r\n popover.style.visibility = \"hidden\";\r\n\r\n applyPopoverWidth(popover, targetRect, width);\r\n\r\n const popoverRect = popover.getBoundingClientRect();\r\n const { left, top } = calculatePopoverPosition(targetRect, popoverRect, placement);\r\n\r\n popover.style.left = `${left}px`;\r\n popover.style.top = `${top}px`;\r\n popover.style.visibility = \"visible\";\r\n popover.style.zIndex = \"2000\";\r\n}\r\n\r\nexport function showDropdownPopover(\r\n popoverId,\r\n targetId,\r\n width,\r\n placement,\r\n keepOpenContainerId,\r\n dotNetObjectRef\r\n) {\r\n const popover = document.getElementById(popoverId);\r\n const target = document.getElementById(targetId);\r\n if (!popover || !target) return;\r\n\r\n // Move popover to body\r\n document.body.appendChild(popover);\r\n\r\n const resolvedPlacement = placement || \"bottom\";\r\n positionPopover(popover, target, width, resolvedPlacement);\r\n\r\n const updatePositionHandler = () => {\r\n if (popover.style.display !== \"none\") {\r\n positionPopover(popover, target, width, resolvedPlacement);\r\n }\r\n };\r\n window.addEventListener(\"resize\", updatePositionHandler);\r\n window.addEventListener(\"scroll\", updatePositionHandler, true);\r\n\r\n const outsideClickHandler = (event) => {\r\n const clickedElement = event.target;\r\n if (!clickedElement) {\r\n return;\r\n }\r\n\r\n const clickedInsidePopover = popover.contains(clickedElement);\r\n const clickedTarget = target.contains(clickedElement);\r\n if (clickedInsidePopover || clickedTarget) {\r\n return;\r\n }\r\n\r\n let shouldKeepOpen = false;\r\n if (keepOpenContainerId) {\r\n const keepOpenContainer = document.getElementById(keepOpenContainerId);\r\n if (keepOpenContainer?.contains(clickedElement)) {\r\n shouldKeepOpen = true;\r\n }\r\n }\r\n\r\n if (!shouldKeepOpen) {\r\n dotNetObjectRef?.invokeMethodAsync(\"CloseFromJs\");\r\n }\r\n };\r\n document.addEventListener(\"click\", outsideClickHandler);\r\n\r\n // Add touch gesture support for mobile\r\n let touchStartY = 0;\r\n let touchStartX = 0;\r\n\r\n const touchStartHandler = function (event) {\r\n touchStartY = event.touches[0].clientY;\r\n touchStartX = event.touches[0].clientX;\r\n };\r\n\r\n const touchEndHandler = function (event) {\r\n const touchEndY = event.changedTouches[0].clientY;\r\n const touchEndX = event.changedTouches[0].clientX;\r\n const deltaY = touchEndY - touchStartY;\r\n const deltaX = touchEndX - touchStartX;\r\n\r\n // Swipe down gesture to close popover (common mobile UX pattern)\r\n if (deltaY > 50 && Math.abs(deltaX) < 50) {\r\n if (dotNetObjectRef) {\r\n dotNetObjectRef.invokeMethodAsync(\"CloseFromJs\");\r\n }\r\n }\r\n };\r\n\r\n popover.addEventListener(\"touchstart\", touchStartHandler, { passive: true });\r\n popover.addEventListener(\"touchend\", touchEndHandler, { passive: true });\r\n const targetDialog = target.closest(\".on-base-dialog, [role='dialog']\");\r\n openPopovers.set(popoverId, {\r\n targetDialog,\r\n dotNetRef: dotNetObjectRef,\r\n outsideClickHandler,\r\n updatePositionHandler,\r\n touchStartHandler,\r\n touchEndHandler,\r\n });\r\n}\r\n\r\n/** Removes listeners registered in showDropdownPopover; hides the popover if present. */\r\nfunction removePopoverListeners(popoverId, popoverState) {\r\n if (!popoverState) {\r\n return;\r\n }\r\n\r\n window.removeEventListener(\"resize\", popoverState.updatePositionHandler);\r\n window.removeEventListener(\"scroll\", popoverState.updatePositionHandler, true);\r\n document.removeEventListener(\"click\", popoverState.outsideClickHandler);\r\n\r\n const popover = document.getElementById(popoverId);\r\n if (popover) {\r\n popover.removeEventListener(\"touchstart\", popoverState.touchStartHandler);\r\n popover.removeEventListener(\"touchend\", popoverState.touchEndHandler);\r\n popover.style.display = \"none\";\r\n }\r\n}\r\n\r\nexport function hideDropdownPopover(popoverId) {\r\n const popoverState = openPopovers.get(popoverId);\r\n removePopoverListeners(popoverId, popoverState);\r\n openPopovers.delete(popoverId);\r\n}\r\n\r\n/**\r\n * Rydder popoveren helt: lyttere, sporing og selve DOM-noden.\r\n * Kalles fra komponentens DisposeAsync. hideDropdownPopover er ikke nok der, fordi\r\n * showDropdownPopover flytter noden til . Da følger den ikke med når Blazor river ut\r\n * containeren den opprinnelig lå i, og blir liggende igjen som en skjult rest i body.\r\n */\r\nexport function disposeDropdownPopover(popoverId) {\r\n const popoverState = openPopovers.get(popoverId);\r\n removePopoverListeners(popoverId, popoverState);\r\n openPopovers.delete(popoverId);\r\n\r\n const popover = document.getElementById(popoverId);\r\n // Bare noder vi selv har flyttet ut skal fjernes her. Ligger noden fortsatt der Blazor\r\n // plasserte den, eier Blazor den og rydder den selv når komponenten rives ut.\r\n if (popover && popover.parentElement === document.body) {\r\n popover.remove();\r\n }\r\n}\r\n\r\n// Function to close all popovers that were opened from within a specific dialog\r\nexport function closePopoversForDialog(dialogElement) {\r\n if (!dialogElement) return;\r\n\r\n for (const [popoverId, popoverInfo] of Array.from(openPopovers.entries())) {\r\n if (popoverInfo.targetDialog === dialogElement) {\r\n removePopoverListeners(popoverId, popoverInfo);\r\n if (popoverInfo.dotNetRef) {\r\n popoverInfo.dotNetRef.invokeMethodAsync(\"CloseFromJs\");\r\n }\r\n openPopovers.delete(popoverId);\r\n }\r\n }\r\n}\r\n\r\n// Function to close all open popovers\r\nexport function closeAllPopovers() {\r\n for (const [popoverId, popoverInfo] of Array.from(openPopovers.entries())) {\r\n removePopoverListeners(popoverId, popoverInfo);\r\n if (popoverInfo.dotNetRef) {\r\n popoverInfo.dotNetRef.invokeMethodAsync(\"CloseFromJs\");\r\n }\r\n }\r\n openPopovers.clear();\r\n}\r\n\r\n// Function to check if there are any open popovers\r\nexport function hasOpenPopovers() {\r\n return openPopovers.size > 0;\r\n}\r\n\r\n// Function to get count of open popovers\r\nexport function getOpenPopoverCount() {\r\n return openPopovers.size;\r\n}\r\n\r\nwindow.showDropdownPopover = showDropdownPopover;\r\nwindow.hideDropdownPopover = hideDropdownPopover;\r\nwindow.disposeDropdownPopover = disposeDropdownPopover;\r\nwindow.closePopoversForDialog = closePopoversForDialog;\r\nwindow.closeAllPopovers = closeAllPopovers;\r\nwindow.hasOpenPopovers = hasOpenPopovers;\r\nwindow.getOpenPopoverCount = getOpenPopoverCount;\r\n","// tooltip.js - Dedicated tooltip positioning for OnTooltip\r\n\r\nexport function positionTooltip(\r\n targetId,\r\n tooltipId,\r\n placement = \"Bottom\",\r\n offset = 8\r\n) {\r\n const target = document.getElementById(targetId);\r\n const tooltip = document.getElementById(tooltipId);\r\n if (!target || !tooltip) return;\r\n\r\n const targetRect = target.getBoundingClientRect();\r\n const tooltipRect = tooltip.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n\r\n let top = 0,\r\n left = 0;\r\n if (placement === \"Top\") {\r\n top = targetRect.top - tooltipRect.height - offset;\r\n left = targetRect.left + (targetRect.width - tooltipRect.width) / 2;\r\n if (top < 0) top = targetRect.bottom + offset; // fallback to bottom\r\n } else {\r\n // Default to Bottom\r\n top = targetRect.bottom + offset;\r\n left = targetRect.left + (targetRect.width - tooltipRect.width) / 2;\r\n if (top + tooltipRect.height > viewportHeight)\r\n top = targetRect.top - tooltipRect.height - offset; // fallback to top\r\n }\r\n // Clamp horizontally\r\n if (left < 0) left = offset;\r\n if (left + tooltipRect.width > viewportWidth)\r\n left = viewportWidth - tooltipRect.width - offset;\r\n\r\n tooltip.style.position = \"fixed\";\r\n tooltip.style.left = `${left}px`;\r\n tooltip.style.top = `${top}px`;\r\n tooltip.style.pointerEvents = \"none\";\r\n}\r\n","import intersectionObserver from \"./intersectionObserver\";\r\nimport * as utilities from \"./utilities\";\r\nimport topScrolledElement from \"./topScrolledElement\";\r\nimport * as popoverDialog from \"./popoverDialog\";\r\nimport * as dialog from \"./dialog\";\r\nimport * as rightPanel from \"./rightPanel\";\r\nimport * as datePicker from \"./datePicker\";\r\nimport * as tabSwitch from \"./tabSwitch\";\r\nimport \"./file-preview.js\";\r\nimport * as dropdownPopover from \"./dropdownPopover\";\r\nimport * as tooltip from \"./tooltip\";\r\n\r\nconst OnComponents = {\r\n intersectionObserver,\r\n utilities,\r\n topScrolledElement,\r\n popoverDialog,\r\n dialog,\r\n rightPanel,\r\n datePicker,\r\n tabSwitch,\r\n dropdownPopover,\r\n tooltip,\r\n};\r\n\r\n(window as any).OnComponents = OnComponents;\r\n"],"names":["createIntersectionObserver","element","root","handle","callbackMethodName","dotNet","intersectionObserver","result","scrollTo","elementOrId","el","inlineOpposite","inline","blockOpposite","block","blockToOffset","inlineToOffset","getPosition","rect","elementRect","selfBlock","selfInline","elementBlock","elementInline","currentWidth","currentHeight","x","y","elementWidth","elementHeight","constrainInView","screenWidth","screenHeight","position","setPosition","anchor","elementAnchor","calculatedPosition","addEventOutsideListener","eventName","eventListener","event","getBoundingClientRectById","elementId","ensureElementId","addCurrentTopScrolledElementListener","callback","id","selectItem","target","current","isHTMLElement","eventTarget","children","s","next","nextId","calculatePopoverPosition","targetId","popoverId","offset","targetElement","popoverElement","targetRect","popoverRect","viewportWidth","viewportHeight","top","left","originalPosition","addPopoverEventListeners","dotNetReference","handleResize","getBoundingClientRect","getViewportWidth","getViewportHeight","initPointerEvents","dotNetObject","onMove","e","onUp","addDialogEventListeners","dialogId","dialogElement","dialogContent","previouslyFocusedElement","getFocusableElements","handleKeyDown","focusableElements","firstElement","lastElement","activeElement","isActiveElementInDialog","handleDialogOpen","handleDialogClose","addEscapeKeyListener","initTabSwitches","tabSwitch","tabGroup","tabButtons","updateTabBackgroundPosition","button","updateTabBackgroundPositionForButton","index","nextIndex","activeButton","buttonRect","leftPosition","updateTabSwitch","tabSwitchSelector","tabIndex","clickedButton","reinitTabSwitches","url","fileName","isMobileDevice","isEdgeBrowser","isTabletDevice","isIOSDevice","isMobile","isEdge","link","error","resp","blob","downloadUrl","a","fallbackError","openPopovers","applyPopoverWidth","popover","width","placement","edgeMargin","gap","maxLeft","overflowsBottom","maxTop","positionPopover","showDropdownPopover","keepOpenContainerId","dotNetObjectRef","resolvedPlacement","updatePositionHandler","outsideClickHandler","clickedElement","clickedInsidePopover","clickedTarget","shouldKeepOpen","keepOpenContainer","touchStartY","touchStartX","touchStartHandler","touchEndHandler","touchEndY","touchEndX","deltaY","deltaX","targetDialog","removePopoverListeners","popoverState","hideDropdownPopover","disposeDropdownPopover","closePopoversForDialog","popoverInfo","closeAllPopovers","hasOpenPopovers","getOpenPopoverCount","positionTooltip","tooltipId","tooltip","tooltipRect","OnComponents","utilities","topScrolledElement","popoverDialog","dialog","rightPanel","datePicker","dropdownPopover"],"mappings":"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"}