{
  "version": 3,
  "sources": ["../../src/components/menus/MenuItem.ts", "../../src/components/menus/TopMenu.ts", "../../src/lib/errors.ts", "../../src/lib/routing/NavigateRouteEvent.ts", "../../src/lib/routing/routeTargetRegistry.ts", "../../src/lib/routing/RoutingTarget.ts", "../../src/lib/routing/types.ts", "../../src/lib/routing/routeMatching.ts", "../../src/lib/routing/navigation.ts", "../../src/lib/routing/RouteLink.ts", "../../src/components/lists/Table.ts", "../../src/components/lists/TreeView.ts"],
  "sourcesContent": ["import {Route} from \"../../lib/routing/types\"\r\nexport class MenuItem {\r\n    constructor(\r\n        public title: string,\r\n        public actionName?: string,\r\n        public submenu?: SubMenuItem[],\r\n        public requiredClaims?: string[],\r\n        public route?: Route\r\n    ) {}\r\n}\r\n\r\nexport class SubMenuItem {\r\n    constructor(\r\n        public title: string,\r\n        public actionName?: string,\r\n        public componentName?: string,\r\n        public requiredClaims?: string[]\r\n    ) {}\r\n}\r\n\r\nexport class MenuEvent extends Event {\r\n    public static readonly SELECTED_EVENT = 'rlx.menuSelected';\r\n    public static readonly ADDED_EVENT = 'rlx.menuAdded';\r\n    public static readonly REMOVED_EVENT = 'rlx.menuRemoved';\r\n\r\n    public menuItem: MenuItem;\r\n\r\n    constructor(\r\n        type: string,\r\n        menuItem: MenuItem,\r\n        options?: EventInit\r\n    ) {\r\n        super(type, options);\r\n        this.menuItem = menuItem;\r\n    }\r\n}\r\n\r\ndeclare global {\r\n  interface HTMLElementEventMap {\r\n      'rlx.menuAdded': MenuEvent;\r\n      'rlx.menuSelected': MenuEvent;\r\n      'rlx.menuRemoved': MenuEvent;\r\n  }\r\n}\r\n", "import { MenuEvent, MenuItem } from './MenuItem';\r\n\r\nexport class TopMenu extends HTMLElement {\r\n    private menuItems: MenuItem[] = [];\r\n    private menu: HTMLElement;\r\n    private submenu: HTMLElement;\r\n\r\n    constructor() {\r\n        super();\r\n        this.attachShadow({ mode: 'open' });\r\n\r\n        const template = document.createElement('template');\r\n        template.innerHTML = `\r\n            <style>\r\n                :host {\r\n                    --menu-bg-color: radial-gradient(ellipse at top left, #161616, #1f1f2c, #16161f);\r\n                    --menu-text-color: #fff;\r\n                    --submenu-bg-color: linear-gradient(13deg, rgba(26,26,26,1) 0%, rgba(30,30,32,1) 100%);\r\n                    --chevron-size: 16px;\r\n                    --menu-shadow: 0 4px 10px rgba(0, 0, 0, 0.8);\r\n                    --menu-glow: 0px 0px 15px rgba(255, 255, 255, 0.5);\r\n                    display: block;\r\n                }\r\n\r\n                @keyframes kenburns-top-normal {\r\n                    0% { transform: scale(1) translateY(0); transform-origin: 50% 16%; }\r\n                    100% { transform: scale(1.10) translateY(-3px); transform-origin: top; }\r\n                }\r\n\r\n                .container {\r\n                    position: relative;\r\n                    overflow: hidden;\r\n                    width: 100%;\r\n                    height: 2rem;\r\n                    background: var(--menu-bg-color);\r\n                    box-shadow: var(--menu-shadow);\r\n                    display: flex;\r\n                    align-items: center;\r\n                    justify-content: space-between;\r\n                    color: var(--menu-text-color);\r\n                }\r\n\r\n                .menu,\r\n                .submenu {\r\n                    display: flex;\r\n                    list-style: none;\r\n                    margin: 0;\r\n                    padding: 0;\r\n                    position: absolute;\r\n                    top: 0;\r\n                    width: 100%;\r\n                    height: 100%;\r\n                    align-items: center;\r\n                    transition: transform 0.5s ease-in-out;\r\n\r\n                    &.align-left { justify-content: flex-start; }\r\n                    &.align-center { justify-content: center; }\r\n                    &.align-right { justify-content: flex-end; }\r\n                }\r\n\r\n                .menu {\r\n                    transform: translateX(0);\r\n                }\r\n\r\n                .submenu {\r\n                    transform: translateX(100%);\r\n                    background: var(--submenu-bg-color);\r\n                }\r\n\r\n                li {\r\n                    cursor: pointer;\r\n                    padding: 0.1rem 0.3rem;\r\n                    border-radius: 5px;\r\n                    transition: background 0.3s, box-shadow 0.3s;\r\n\r\n                    &:hover {\r\n                        background: rgba(255, 255, 255, 0.1);\r\n                        box-shadow: var(--menu-glow);\r\n                        animation: kenburns-top-normal 0.2s ease 0s 1 normal none;\r\n                    }\r\n                }\r\n\r\n                .chevron {\r\n                    font-size: var(--chevron-size);\r\n                    cursor: pointer;\r\n                    display: flex;\r\n                    align-items: center;\r\n                    padding: 0 1rem;\r\n                    transition: background 0.3s;\r\n\r\n                    &:hover {\r\n                        background: rgba(255, 255, 255, 0.1);\r\n                        border-radius: 5px;\r\n                        box-shadow: var(--menu-glow);\r\n                    }\r\n                }\r\n            </style>\r\n            <div class=\"container\">\r\n                <ul class=\"menu\"></ul>\r\n                <ul class=\"submenu\"></ul>\r\n            </div>\r\n        `;\r\n        this.shadowRoot?.appendChild(template.content.cloneNode(true));\r\n\r\n        // Lookup menu and submenu once\r\n        this.menu = this.shadowRoot?.querySelector('.menu')!;\r\n        this.submenu = this.shadowRoot?.querySelector('.submenu')!;\r\n    }\r\n\r\n    static get observedAttributes() {\r\n        return ['align'];\r\n    }\r\n\r\n    attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n        if (name === 'align') {\r\n            this.updateAlignment(newValue);\r\n        }\r\n    }\r\n\r\n    connectedCallback() {\r\n        // Apply default alignment if not set\r\n        const alignment = this.getAttribute('align') || 'center';\r\n        this.updateAlignment(alignment);\r\n    }\r\n\r\n    private updateAlignment(alignment: string): void {\r\n        const alignClass = `align-${alignment}`;\r\n        ['align-left', 'align-center', 'align-right'].forEach((cls) => {\r\n            this.menu.classList.remove(cls);\r\n            this.submenu.classList.remove(cls);\r\n        });\r\n        this.menu.classList.add(alignClass);\r\n        this.submenu.classList.add(alignClass);\r\n    }\r\n\r\n    setItems(menuItems: MenuItem[]): void {\r\n        this.menuItems = menuItems;\r\n        console.log('assiugned items');\r\n        this.renderMenu();\r\n    }\r\n\r\n    private renderMenu(): void {\r\n        this.menu.innerHTML = '';\r\n\r\n        this.menuItems.forEach((item, index) => {\r\n            const li = document.createElement('li');\r\n            li.textContent = item.title;\r\n            if (item.submenu && item.submenu.length > 0) {\r\n                li.addEventListener('click', () => this.navigate(item));\r\n            } else {\r\n                li.addEventListener('click', () => this.showSubmenu(item));\r\n            }\r\n\r\n            this.menu.appendChild(li);\r\n        });\r\n    }\r\n\r\n    private showSubmenu(parentMenu: MenuItem): void {\r\n        this.submenu.innerHTML = '';\r\n\r\n        const backChevron = document.createElement('li');\r\n        backChevron.className = 'chevron';\r\n        backChevron.textContent = '\u2B05 Back';\r\n        backChevron.addEventListener('click', () => this.resetMenu());\r\n        this.submenu.appendChild(backChevron);\r\n\r\n        parentMenu.submenu!.forEach((subItem) => {\r\n            const li = document.createElement('li');\r\n            li.textContent = subItem.title;\r\n            li.addEventListener('click', () => {\r\n                this.navigate(subItem);\r\n            });\r\n            this.submenu.appendChild(li);\r\n        });\r\n\r\n        // Trigger the animation\r\n        this.menu.style.transform = 'translateX(-100%)';\r\n        this.submenu.style.transform = 'translateX(0)';\r\n    }\r\n\r\n    public resetMenu(): void {\r\n        this.menu.style.transform = 'translateX(0)';\r\n        this.submenu.style.transform = 'translateX(100%)';\r\n    }\r\n\r\n    navigate(item: MenuItem) {\r\n        this.dispatchEvent(\r\n            new MenuEvent(MenuEvent.SELECTED_EVENT, item, {\r\n                bubbles: true,\r\n                composed: true\r\n            })\r\n        );\r\n    }\r\n}\r\n// Guard against duplicate registration during HMR, which re-executes module-level code\r\nif (!customElements.get('r-top-menu')) {\r\n    customElements.define('r-top-menu', TopMenu);\r\n}\r\n", "/**\r\n * Global error handling for Relaxjs.\r\n * Register a handler with `onError()` to intercept errors before they throw.\r\n * Call `ctx.suppress()` in the handler to prevent the error from being thrown.\r\n *\r\n * @example\r\n * import { onError } from 'relaxjs';\r\n *\r\n * onError((error, ctx) => {\r\n *     logToService(error.message, error.context);\r\n *     showToast(error.message);\r\n *     ctx.suppress();\r\n * });\r\n */\r\n\r\n/**\r\n * Passed to error handlers to control error behavior.\r\n * Call `suppress()` to prevent the error from being thrown.\r\n */\r\nexport interface ErrorContext {\r\n    suppress(): void;\r\n}\r\n\r\n/**\r\n * Error with structured context for debugging.\r\n * The `context` record contains details like route name, component tag, route data.\r\n *\r\n * @example\r\n * onError((error, ctx) => {\r\n *     console.log(error.context.route);\r\n *     console.log(error.context.componentTagName);\r\n * });\r\n */\r\nexport class RelaxError extends Error {\r\n    constructor(\r\n        message: string,\r\n        public context: Record<string, unknown>,\r\n    ) {\r\n        super(message);\r\n    }\r\n}\r\n\r\ntype ErrorHandler = (error: RelaxError, ctx: ErrorContext) => void;\r\n\r\nlet handler: ErrorHandler | null = null;\r\n\r\n/**\r\n * Registers a global error handler for Relaxjs errors.\r\n * The handler receives the error and an `ErrorContext`.\r\n * Call `ctx.suppress()` to prevent the error from being thrown.\r\n * Only one handler can be active at a time; subsequent calls replace the previous handler.\r\n *\r\n * @example\r\n * onError((error, ctx) => {\r\n *     if (error.context.route === 'optional-panel') {\r\n *         ctx.suppress();\r\n *         return;\r\n *     }\r\n *     showErrorDialog(error.message);\r\n * });\r\n */\r\nexport function onError(fn: ErrorHandler) {\r\n    handler = fn;\r\n}\r\n\r\n/**\r\n * Reports an error through the global handler.\r\n * Returns the `RelaxError` if it should be thrown, or `null` if the handler suppressed it.\r\n * The caller is responsible for throwing the returned error.\r\n *\r\n * @param message - Human-readable error description\r\n * @param context - Structured data for debugging (route, component, params, cause, etc.)\r\n * @returns The error to throw, or `null` if suppressed\r\n *\r\n * @example\r\n * const error = reportError('Failed to load route component', {\r\n *     route: 'user',\r\n *     componentTagName: 'user-profile',\r\n *     routeData: { id: 123 },\r\n * });\r\n * if (error) throw error;\r\n */\r\nexport function reportError(message: string, context: Record<string, unknown>): RelaxError | null {\r\n    const error = new RelaxError(message, context);\r\n    if (handler) {\r\n        let suppressed = false;\r\n        const ctx: ErrorContext = {\r\n            suppress() { suppressed = true; },\r\n        };\r\n        handler(error, ctx);\r\n        if (suppressed) {\r\n            return null;\r\n        }\r\n    }\r\n    return error;\r\n}\r\n", "import type { Route, RouteData } from './types';\r\n\r\n/**\r\n * Event sent to routing targets when a new route should be displayed.\r\n */\r\nexport class NavigateRouteEvent extends Event {\r\n    static NAME: string = 'rlx.navigateRoute';\r\n    constructor(\r\n        /**\r\n         * Matched route.\r\n         */\r\n        public route: Route,\r\n\r\n        /**\r\n         * The generated url sements which can be used to push the url into the browser history.\r\n         */\r\n        public urlSegments: string[],\r\n\r\n        /**\r\n         * Data supplied to the route.\r\n         */\r\n        public routeData?: RouteData,\r\n\r\n        /**\r\n         * The target can differ from the default target that is defined in the route.\r\n         *\r\n         * undefined means that the default (unnamed) target should be used.\r\n         */\r\n        public routeTarget?: string,\r\n\r\n        eventInit?: EventInit\r\n    ) {\r\n        super(NavigateRouteEvent.NAME, eventInit);\r\n    }\r\n}\r\n\r\ndeclare global {\r\n    interface HTMLElementEventMap {\r\n        'rlx.navigateRoute': NavigateRouteEvent;\r\n    }\r\n    interface DocumentEventMap {\r\n        'rlx.navigateRoute': NavigateRouteEvent;\r\n    }\r\n}\r\n", "import { reportError } from '../errors';\r\nimport { NavigateRouteEvent } from './NavigateRouteEvent';\r\n\r\ntype RouteTargetHandler = (evt: NavigateRouteEvent) => void;\r\nconst targetHandlers = new Map<string | undefined, RouteTargetHandler>();\r\nconst pendingEvents = new Map<string | undefined, NavigateRouteEvent>();\r\n\r\n/**\r\n * Registers a route target handler.\r\n * When a navigation event targets this name, the handler is called directly.\r\n * If a pending event exists for this target, it is replayed immediately.\r\n *\r\n * @param name - Target name, or `undefined` for the default (unnamed) target\r\n * @param handler - Callback that receives the `NavigateRouteEvent`\r\n *\r\n * @example\r\n * registerRouteTarget('sidebar', (evt) => renderComponent(evt));\r\n */\r\nexport function registerRouteTarget(\r\n    name: string | undefined,\r\n    handler: RouteTargetHandler,\r\n) {\r\n    initRouteTargetListener();\r\n    if (targetHandlers.has(name)) {\r\n        const error = reportError('Duplicate route target', {\r\n            target: name ?? 'default',\r\n        });\r\n        if (error) throw error;\r\n        return;\r\n    }\r\n    targetHandlers.set(name, handler);\r\n\r\n    const pending = pendingEvents.get(name);\r\n    if (pending) {\r\n        pendingEvents.delete(name);\r\n        handler(pending);\r\n    }\r\n}\r\n\r\n/**\r\n * Unregisters a previously registered route target handler.\r\n *\r\n * @param name - Target name that was passed to `registerRouteTarget`\r\n */\r\nexport function unregisterRouteTarget(name: string | undefined) {\r\n    targetHandlers.delete(name);\r\n}\r\n\r\nexport function clearPendingNavigations() {\r\n    pendingEvents.clear();\r\n    targetHandlers.clear();\r\n}\r\n\r\nfunction dispatchToTarget(evt: NavigateRouteEvent) {\r\n    const handler = targetHandlers.get(evt.routeTarget);\r\n    if (handler) {\r\n        handler(evt);\r\n    } else {\r\n        pendingEvents.set(evt.routeTarget, evt);\r\n    }\r\n}\r\n\r\nlet listenerAttached = false;\r\n\r\nexport function initRouteTargetListener() {\r\n    if (listenerAttached) return;\r\n    listenerAttached = true;\r\n    document.addEventListener(NavigateRouteEvent.NAME, (evt) => {\r\n        dispatchToTarget(evt as NavigateRouteEvent);\r\n    });\r\n}\r\n", "import { registerRouteTarget, unregisterRouteTarget } from './routeTargetRegistry';\r\nimport type { NavigateRouteEvent } from './NavigateRouteEvent';\r\nimport type { RouteData, LoadRoute } from './types';\r\nimport { RelaxError, reportError } from '../errors';\r\n\r\n/**\r\n * WebComponent that listens on the `NavigateRouteEvent` event to be able to switch route.\r\n *\r\n * Use the \"name\" attribute to make this non-default target.\r\n * Use the \"dialog\" attribute to render routes inside a native `<dialog>` element\r\n * with built-in focus trapping, backdrop, and Escape-to-close.\r\n *\r\n * @example\r\n * <r-route-target></r-route-target>\r\n * <r-route-target name=\"modal\" dialog></r-route-target>\r\n */\r\nexport class RouteTarget extends HTMLElement {\r\n    name?: string = undefined;\r\n    private dialog?: HTMLDialogElement;\r\n\r\n    connectedCallback() {\r\n        this.name = this.getAttribute('name') ?? undefined;\r\n\r\n        if (this.hasAttribute('dialog')) {\r\n            this.dialog = document.createElement('dialog');\r\n            this.dialog.addEventListener('close', () => {\r\n                this.dialog!.replaceChildren();\r\n            });\r\n            this.appendChild(this.dialog);\r\n        }\r\n\r\n        registerRouteTarget(this.name, (evt) => this.onNavigate(evt));\r\n        console.log('registered');\r\n    }\r\n\r\n    disconnectedCallback() {\r\n        unregisterRouteTarget(this.name);\r\n    }\r\n\r\n    private onNavigate(evt: NavigateRouteEvent) {\r\n        console.log('got nav', evt);\r\n        this.loadComponent(evt).catch((error) => {\r\n            if (!(error instanceof RelaxError)) {\r\n                error = reportError('Route navigation failed', {\r\n                    route: evt.route.name,\r\n                    routeTarget: evt.routeTarget,\r\n                    cause: error,\r\n                });\r\n            }\r\n            if (error) {\r\n                console.error(error);\r\n            }\r\n        });\r\n    }\r\n\r\n    private async loadComponent(evt: NavigateRouteEvent) {\r\n        const tagName = evt.route.componentTagName\r\n            ?? customElements.getName(evt.route.component);\r\n\r\n        if (!tagName) {\r\n            const error = reportError('Failed to find component for route', {\r\n                route: evt.route.name,\r\n                componentTagName: evt.route.componentTagName,\r\n                component: evt.route.component?.name,\r\n                routeData: evt.routeData,\r\n            });\r\n            if (error) throw error;\r\n            return;\r\n        }\r\n\r\n        await customElements.whenDefined(tagName);\r\n        const element = document.createElement(tagName);\r\n\r\n        await this.applyRouteData(element, evt.routeData);\r\n\r\n        if (this.dialog) {\r\n            this.dialog.replaceChildren(element);\r\n            if (!this.dialog.open) {\r\n                this.dialog.showModal();\r\n            }\r\n        } else if (document.startViewTransition) {\r\n            document.startViewTransition(() => this.replaceChildren(element));\r\n        } else {\r\n            this.replaceChildren(element);\r\n        }\r\n    }\r\n\r\n    /** Closes the dialog (only applies to dialog targets). */\r\n    close() {\r\n        this.dialog?.close();\r\n    }\r\n\r\n    private async applyRouteData(element: Element, data?: RouteData) {\r\n        if ('loadRoute' in element) {\r\n            const routeData = data\r\n                ?? { error: 'loadRoute function without mapped route data in the routes' };\r\n            await (element as unknown as LoadRoute).loadRoute(routeData);\r\n        }\r\n\r\n        if (data) {\r\n            (element as any).routeData = data;\r\n        }\r\n    }\r\n}\r\n", "type WebComponentConstructor = new (...args: any[]) => HTMLElement;\r\n\r\nexport enum GuardResult {\r\n    /**\r\n     * Handle route without checking more guards.\r\n     */\r\n    Allow,\r\n\r\n    /**\r\n     * Throw a RouteGuardError.\r\n     */\r\n    Deny,\r\n\r\n    /**\r\n     * Resume and check other guards.\r\n     */\r\n    Continue,\r\n\r\n    /**\r\n     * Do not invoke the rooute nor other guards.\r\n     */\r\n    Stop\r\n}\r\n\r\nexport interface RouteGuard {\r\n    check(route: RouteMatchResult): GuardResult;\r\n}\r\n\r\nexport interface Route {\r\n    name?: string;\r\n    target?: string;\r\n    path: string;\r\n\r\n    /**\r\n     * HTML file name (without extension).\r\n     *\r\n     * Define for instance if you have a route that requires a more limited layout. The library\r\n     * will automatically load that HTML file and rewrite URL history so that the correct url is displayed.\r\n     */\r\n    layout?: string;\r\n\r\n    /**\r\n     * Name of the tag for your web component.\r\n     */\r\n    componentTagName?: string;\r\n\r\n    /**\r\n     * Guards used to check if this route can be visited.\r\n     */\r\n    guards?: RouteGuard[];\r\n\r\n    component?: WebComponentConstructor;\r\n}\r\n\r\nexport type RouteParamType = string | number;\r\nexport type RouteData = Record<string, RouteParamType>;\r\n\r\n/**\r\n * Implement to receive typed route parameters via a `routeData` property.\r\n * RouteTarget assigns `routeData` after element creation but before DOM insertion.\r\n * Optional since it's not available at construction time.\r\n *\r\n * For convention-based usage without undefined checks, skip the interface\r\n * and declare `routeData` directly on your component.\r\n *\r\n * @example\r\n * class UserProfile extends HTMLElement implements Routable<{ userName: string }> {\r\n *     routeData?: { userName: string };\r\n * }\r\n */\r\nexport interface Routable<T extends RouteData = RouteData> {\r\n    routeData?: T;\r\n}\r\n\r\n/**\r\n * Implement to run async initialization before the component is added to the DOM.\r\n * RouteTarget calls `loadRoute()` and awaits it before inserting the element.\r\n *\r\n * @example\r\n * class OrderDetail extends HTMLElement implements LoadRoute<{ orderId: number }> {\r\n *     async loadRoute(data: { orderId: number }) {\r\n *         this.order = await fetchOrder(data.orderId);\r\n *     }\r\n * }\r\n */\r\nexport interface LoadRoute<T extends RouteData = RouteData> {\r\n    loadRoute(data: T): void | Promise<void>;\r\n}\r\n\r\n/**\r\n * Result from route matching operations.\r\n * Contains all information needed for navigation and rendering.\r\n */\r\nexport type RouteMatchResult = {\r\n    /**\r\n     * Matched route configuration\r\n     */\r\n    route: Route;\r\n\r\n    /**\r\n     * URL segments used for history state\r\n     */\r\n    urlSegments: string[];\r\n\r\n    /**\r\n     * Extracted and type-converted parameters\r\n     */\r\n    params: RouteData;\r\n};\r\n\r\n/**\r\n * Supported types of route segments\r\n */\r\nexport type RouteSegmentType = 'string' | 'number' | 'path' | 'regex';\r\n\r\n/**\r\n * Strongly typed route segment value\r\n */\r\nexport interface RouteValue {\r\n    /**\r\n     * Type of parameter for validation\r\n     */\r\n    type: RouteSegmentType;\r\n\r\n    /**\r\n     * Actual parameter value\r\n     */\r\n    value: any;\r\n}\r\n\r\nexport class RouteError extends Error {}\r\nexport class RouteGuardError extends RouteError {\r\n    isGuard;\r\n}\r\n\r\nexport interface NavigateOptions {\r\n    /**\r\n     * Optional parameters when using route name\r\n     */\r\n    params?: Record<string, string | number>;\r\n\r\n    /**\r\n     * override for route's default target\r\n     */\r\n    target?: string;\r\n\r\n    /**\r\n     * When you want to override routes from the globally registered ones.\r\n     */\r\n    routes?: Route[];\r\n}\r\n", "import type { Route, RouteData, RouteParamType, RouteMatchResult } from './types';\r\n\r\n/**\r\n * Route segment matcher interface.\r\n * Each segment type (string, number, path) implements this\r\n * for parameter extraction and validation.\r\n */\r\ninterface RouteSegment {\r\n    /**\r\n     * Parameter name when segment is dynamic (:name or ;id)\r\n     */\r\n    paramName?: string;\r\n\r\n    /**\r\n     * Validates if URL segment matches pattern\r\n     * @param value Segment from URL to validate\r\n     */\r\n    isMatch(value: string): boolean;\r\n\r\n    /**\r\n     * Converts URL segment to typed parameter\r\n     * @param pathValue Raw value from URL\r\n     */\r\n    getValue(pathValue: string): RouteParamType;\r\n}\r\n\r\n/**\r\n * Number parameter segment matcher.\r\n * Used for ;id style parameters that must be numbers.\r\n */\r\nclass NumberRouteSegment implements RouteSegment {\r\n    constructor(public paramName: string) {}\r\n    isMatch(value: string): boolean {\r\n        if (/^\\d+$/.test(value)) {\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    getValue(pathValue: string): RouteParamType {\r\n        if (/^\\d+$/.test(pathValue) === false) {\r\n            throw new Error(\r\n                `Path is not a number, parameter name '${this.paramName}', value: '${pathValue}'.`\r\n            );\r\n        }\r\n        return parseInt(pathValue);\r\n    }\r\n}\r\n\r\n/**\r\n * String parameter segment matcher.\r\n * Used for :name style parameters.\r\n */\r\nclass StringRouteSegment implements RouteSegment {\r\n    constructor(public paramName: string) {}\r\n    isMatch(value: string): boolean {\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param pathValue the route data (for route by name) or segment extracted from the url (for url routing).\r\n     * @returns\r\n     */\r\n    getValue(pathValue: string): RouteParamType {\r\n        return pathValue;\r\n    }\r\n}\r\n\r\n/**\r\n * Static path segment matcher.\r\n * Used for fixed URL parts like 'users' in /users/:id\r\n */\r\nclass PathRouteSegment implements RouteSegment {\r\n    constructor(public value: string) {}\r\n    isMatch(value: string): boolean {\r\n        return value == this.value;\r\n    }\r\n\r\n    getValue(_pathValue: string): RouteParamType {\r\n        return this.value;\r\n    }\r\n}\r\n\r\n/**\r\n * Internal route implementation that handles segment matching\r\n * and parameter extraction.\r\n */\r\nclass RouteImp {\r\n    constructor(public route: Route, private segments: RouteSegment[]) {}\r\n\r\n    /**\r\n     * Attempts to match URL segments against route pattern\r\n     * @param segments URL parts to match\r\n     * @returns Match result with parameters if successful\r\n     */\r\n    match(segments: string[]): RouteMatchResult | null {\r\n        if (segments.length != this.segments.length) {\r\n            return null;\r\n        }\r\n\r\n        const generatedSegments: string[] = [];\r\n        var params: RouteData = {};\r\n        for (let index = 0; index < segments.length; index++) {\r\n            const urlSegment = segments[index];\r\n            const ourSegment = this.segments[index];\r\n\r\n            if (!ourSegment.isMatch(urlSegment)) {\r\n                return null;\r\n            }\r\n\r\n            if (ourSegment.paramName) {\r\n                const value = ourSegment.getValue(urlSegment);\r\n                params[ourSegment.paramName] = value;\r\n                generatedSegments.push(value.toString());\r\n            } else {\r\n                generatedSegments.push(urlSegment);\r\n            }\r\n        }\r\n\r\n        return { route: this.route, params, urlSegments: generatedSegments };\r\n    }\r\n\r\n    /**\r\n     * Routing by name and route data, so generate the url segments.\r\n     * @param routeData Data to use in the URL.\r\n     * @returns Match result with parameters if successful\r\n     */\r\n    buildUrl(routeData: RouteData): RouteMatchResult | null {\r\n        const urlSegments: string[] = [];\r\n        for (let index = 0; index < this.segments.length; index++) {\r\n            const ourSegment = this.segments[index];\r\n            if (ourSegment.paramName) {\r\n                var value = routeData[ourSegment.paramName];\r\n                if (!value) {\r\n                    throw new Error(\r\n                        `Route \"${\r\n                            this.route.name\r\n                        }\" did not get value for parameter \"${\r\n                            ourSegment.paramName\r\n                        } from the provided routeData: \"${JSON.stringify(\r\n                            routeData\r\n                        )}\".`\r\n                    );\r\n                }\r\n\r\n                urlSegments.push(value.toString());\r\n            } else {\r\n                urlSegments.push(ourSegment.getValue('').toString());\r\n            }\r\n        }\r\n\r\n        return { route: this.route, params: routeData, urlSegments };\r\n    }\r\n\r\n    /**\r\n     * Converts string parameters to proper types\r\n     * @param routeParams Raw string parameters to convert\r\n     */\r\n    parseParameters(routeParams: Record<string, string>): RouteData {\r\n        const d: Record<string, any> = {};\r\n\r\n        this.segments.forEach((segment) => {\r\n            if (!segment.paramName) {\r\n                return;\r\n            }\r\n\r\n            if (!segment.isMatch(providedValue)) {\r\n                throw new Error(\r\n                    `Failed to convert parameter ${segment.paramName}, or missing value: ${providedValue}, route: ${this.route.name}.`\r\n                );\r\n            }\r\n\r\n            var providedValue = routeParams[segment.paramName];\r\n            if (!providedValue) {\r\n                throw new Error(\r\n                    `Parameter  ${segment.paramName} was not provided, route: ${this.route.name}.`\r\n                );\r\n            }\r\n\r\n            var convertedValue = segment.getValue(providedValue);\r\n            d[segment.paramName] = convertedValue;\r\n        });\r\n\r\n        return d;\r\n    }\r\n}\r\n\r\n/**\r\n * Match route by either name or URL pattern\r\n * @param routes Available routes\r\n * @param routeNameOrUrl Route name or URL to match\r\n * @param routeData Optional parameters for named routes\r\n */\r\nexport function matchRoute(\r\n    routes: Route[],\r\n    routeNameOrUrl: string,\r\n    routeData?: Record<string, string | any>\r\n): RouteMatchResult | null {\r\n    if (routeNameOrUrl === '' || routeNameOrUrl.indexOf('/') >= 0) {\r\n        return findRouteByUrl(routes, routeNameOrUrl || '/');\r\n    } else {\r\n        return findRouteByName(routes, routeNameOrUrl, routeData!);\r\n    }\r\n}\r\n\r\n/**\r\n * Find route by name and apply parameters\r\n * @param routes Available routes\r\n * @param name Route name to find\r\n * @param routeData Parameters to apply\r\n */\r\nexport function findRouteByName(\r\n    routes: Route[],\r\n    name: string,\r\n    routeData?: Record<string, string | any>\r\n): RouteMatchResult | null {\r\n    var route = routes.find((x) => x.name === name);\r\n    if (!route) {\r\n        return null;\r\n    }\r\n\r\n    var imp = generateRouteImp(route);\r\n    var result = imp.buildUrl(routeData);\r\n    return result;\r\n}\r\n\r\n/**\r\n * Find route matching URL pattern\r\n * @param routes Available routes\r\n * @param path URL to match\r\n */\r\nexport function findRouteByUrl(\r\n    routes: Route[],\r\n    path: string\r\n): RouteMatchResult | null {\r\n    const urlSegments = path.replace(/^\\/|\\/$/g, '').split('/');\r\n    const routeImps = generateRouteImps(routes);\r\n\r\n    for (let index = 0; index < routeImps.length; index++) {\r\n        const element = routeImps[index];\r\n        const m = element.match(urlSegments);\r\n        if (m) {\r\n            return m;\r\n        }\r\n    }\r\n    return null;\r\n}\r\n\r\n/**\r\n * Generate implementations for all routes\r\n */\r\nfunction generateRouteImps(routes: Route[]) {\r\n    const routeImps: RouteImp[] = [];\r\n    routes.forEach((route) => {\r\n        var imp = generateRouteImp(route);\r\n        routeImps.push(imp);\r\n    });\r\n\r\n    return routeImps;\r\n}\r\n\r\n/**\r\n * Generate implementation for single route\r\n * Parses URL pattern into segment matchers\r\n */\r\nfunction generateRouteImp(route: Route): RouteImp {\r\n    var impSegments = [];\r\n    const segments = route.path.replace(/^\\/|\\/$/g, '').split('/');\r\n    segments.forEach((segment) => {\r\n        if (segment.substring(0, 1) == ':') {\r\n            impSegments.push(new StringRouteSegment(segment.substring(1)));\r\n        } else if (segment.substring(0, 1) === ';') {\r\n            impSegments.push(new NumberRouteSegment(segment.substring(1)));\r\n        } else if (segment.substring(0, 1) === '{') {\r\n        } else {\r\n            impSegments.push(new PathRouteSegment(segment));\r\n        }\r\n    });\r\n\r\n    var imp = new RouteImp(route, impSegments);\r\n    return imp;\r\n}\r\n", "/**\r\n * Single Page Application routing system with multiple target support.\r\n * Designed for scenarios where you need:\r\n * - Multiple navigation targets (main content, modals, sidebars)\r\n * - Strongly typed route parameters\r\n * - History management with back/forward support\r\n *\r\n * @example\r\n * // Configure routes\r\n * const routes = [\r\n *   { name: 'user', path: '/users/:id' },          // String parameter\r\n *   { name: 'order', path: '/orders/;orderId' },   // Number parameter\r\n *   { name: 'modal', path: '/detail/:id', target: 'modal' }  // Custom target\r\n * ];\r\n */\r\n\r\nimport { reportError } from '../errors';\r\nimport {\r\n    GuardResult,\r\n    RouteError,\r\n    RouteGuardError,\r\n    type Route,\r\n    type RouteData,\r\n    type RouteParamType,\r\n    type RouteMatchResult,\r\n    type NavigateOptions,\r\n} from './types';\r\nimport { NavigateRouteEvent } from './NavigateRouteEvent';\r\nimport { matchRoute } from './routeMatching';\r\nimport { initRouteTargetListener } from './routeTargetRegistry';\r\nimport { RouteLink } from './RouteLink';\r\nimport { RouteTarget } from './RoutingTarget';\r\n\r\n/**\r\n * Used to keep track of current main HTML file,\r\n * used when different layouts are supported.\r\n *\r\n * The default page is ALWAYS loaded initially,\r\n * which means that we need to switch layout page\r\n * if someone else is configured for the route.\r\n */\r\nvar currentLayout = getLayout() ?? 'default';\r\nfunction getLayout() {\r\n    const path = window.location.pathname;\r\n    if (path == '/index.html') {\r\n        return 'default';\r\n    }\r\n\r\n    return path.endsWith('.html') ? path.slice(1, -5) : null;\r\n}\r\n\r\nexport const internalRoutes: Route[] = [];\r\n\r\nexport const MyData = {\r\n    routes: []\r\n};\r\n\r\n/**\r\n * Debug helper to print all registered routes to console.\r\n */\r\nexport function printRoutes() {\r\n    console.log(internalRoutes);\r\n}\r\n\r\n/**\r\n * Registers application routes with the router.\r\n * Call this at application startup before routing begins.\r\n *\r\n * @param appRoutes - Array of route configurations\r\n * @throws Error if referenced components are not registered\r\n *\r\n * @example\r\n * const routes: Route[] = [\r\n *     { name: 'home', path: '/', componentTagName: 'app-home' },\r\n *     { name: 'user', path: '/users/:id', componentTagName: 'user-profile' },\r\n *     { name: 'login', path: '/auth/', componentTagName: 'login-form', layout: 'noauth' }\r\n * ];\r\n * defineRoutes(routes);\r\n */\r\nexport function defineRoutes(appRoutes: Route[]) {\r\n    console.log('defining routes1', appRoutes);\r\n    initRouteTargetListener();\r\n    if (!customElements.get('r-route-target')) {\r\n        customElements.define('r-route-target', RouteTarget);\r\n    }\r\n    if (!customElements.get('r-link')) {\r\n        customElements.define('r-link', RouteLink);\r\n    }\r\n    console.log('defining routes', appRoutes);\r\n    internalRoutes.length = 0;\r\n    internalRoutes.push(...appRoutes);\r\n\r\n    var errs = [];\r\n    appRoutes.forEach((route) => {\r\n        if (\r\n            route.componentTagName &&\r\n            !customElements.get(route.componentTagName)\r\n        ) {\r\n            errs.push(\r\n                `Component with tagName '${route.componentTagName}' is not defined in customElements.`\r\n            );\r\n        }\r\n        if (route.component && !customElements.getName(route.component)) {\r\n            errs.push(\r\n                `Component '${route.component.name}' is not defined in customElements. Used in route '${JSON.stringify(route)}'.`\r\n            );\r\n        }\r\n        if (route.layout === '') {\r\n            console.log('should not use empty string layout.', route);\r\n            route.layout = undefined;\r\n        }\r\n    });\r\n\r\n    if (errs.length > 0) {\r\n        throw new Error(errs.join('\\n'));\r\n    }\r\n}\r\n\r\n/**\r\n * Initializes routing and navigates to the current URL.\r\n * Call this after DOM is ready and routes are defined.\r\n *\r\n * @example\r\n * // In your main application component\r\n * connectedCallback() {\r\n *     defineRoutes(routes);\r\n *     startRouting();\r\n * }\r\n */\r\nexport function startRouting() {\r\n    let newPage = false;\r\n    if (currentLayout == '') {\r\n        const path = window.location.pathname;\r\n        const match = path.match(/\\/([^\\/]+)\\.html$/);\r\n        if (match && match[1] !== '') {\r\n            console.log('setting current layut', match[1]);\r\n            currentLayout = match[1];\r\n            newPage = true;\r\n        } else {\r\n            console.log('Setting default layout name');\r\n            currentLayout = 'default';\r\n        }\r\n    }\r\n\r\n    if (tryLoadRouteFromLayoutNavigation()) {\r\n        return;\r\n    }\r\n\r\n    const currentUrl = window.location.pathname.replace(/^\\/|\\/$/g, '') || '/';\r\n    const routeResult = findRoute(currentUrl, {});\r\n\r\n    const searchParams = new URLSearchParams(window.location.search);\r\n    if (searchParams.size > 0) {\r\n        routeResult.params ??= {};\r\n        searchParams.forEach((value, key) => {\r\n            routeResult.params[key] = value;\r\n        });\r\n    }\r\n\r\n    if (navigateToLayout(routeResult)) {\r\n        return;\r\n    }\r\n\r\n    history.replaceState(\r\n        routeResult.urlSegments,\r\n        '',\r\n        '/' + routeResult.urlSegments.join('/')\r\n    );\r\n\r\n    const e = new NavigateRouteEvent(\r\n        routeResult.route,\r\n        routeResult.urlSegments,\r\n        routeResult.params,\r\n        routeResult.route.target\r\n    );\r\n    document.dispatchEvent(e);\r\n}\r\n\r\n/**\r\n * Navigates to a route by name or URL.\r\n * Updates browser history and dispatches navigation events.\r\n *\r\n * @param routeNameOrUrl - Route name or URL path to navigate to\r\n * @param options - Navigation options including params and target\r\n *\r\n * @example\r\n * // Navigate by route name\r\n * navigate('user', { params: { id: '123' } });\r\n *\r\n * // Navigate by URL\r\n * navigate('/users/123');\r\n *\r\n * // Navigate to specific target\r\n * navigate('detail', { params: { id: '42' }, target: 'modal' });\r\n */\r\nexport function navigate(routeNameOrUrl: string, options?: NavigateOptions) {\r\n    console.log('navigating to ', routeNameOrUrl, options);\r\n    const routeResult = findRoute(routeNameOrUrl, options);\r\n    if (navigateToLayout(routeResult)) {\r\n        return;\r\n    }\r\n\r\n    const target = options?.target ?? routeResult.route.target;\r\n    const ourUrl = routeResult.urlSegments.join('/');\r\n    const currentUrl = window.location.pathname.replace(/^\\/|\\/$/g, '');\r\n    if (currentUrl != ourUrl) {\r\n        history.pushState(\r\n            routeResult.urlSegments,\r\n            '',\r\n            '/' + routeResult.urlSegments.join('/')\r\n        );\r\n    }\r\n    const e = new NavigateRouteEvent(\r\n        routeResult.route,\r\n        routeResult.urlSegments,\r\n        routeResult.params,\r\n        target\r\n    );\r\n    document.dispatchEvent(e);\r\n}\r\n\r\nfunction findRoute(routeNameOrUrl: string, options?: NavigateOptions) {\r\n    const theRoutes = options?.routes ?? internalRoutes;\r\n    const params = options?.params;\r\n\r\n    const routeResult = matchRoute(theRoutes, routeNameOrUrl, params);\r\n    if (!routeResult) {\r\n        const errorMsg = generateErrorMessage(\r\n            routeNameOrUrl,\r\n            params,\r\n            theRoutes\r\n        );\r\n        console.error(errorMsg);\r\n        throw new RouteError(errorMsg);\r\n    }\r\n\r\n    if (!checkRouteGuards(routeResult)) {\r\n        throw new RouteGuardError('Route guards stopped navigation for route ' + routeNameOrUrl);\r\n    }\r\n\r\n    return routeResult;\r\n}\r\n\r\nfunction navigateToLayout(routeResult: RouteMatchResult): boolean {\r\n    if (!routeResult) {\r\n        console.error('Route result is null, cannot navigate to layout.');\r\n    }\r\n\r\n    const wantedLayout = (routeResult.route.layout ?? 'default').replace(\r\n        /\\.html?$/,\r\n        ''\r\n    );\r\n    if (wantedLayout === currentLayout) {\r\n        return false;\r\n    }\r\n\r\n    console.log(\r\n        'Current layout: ' + currentLayout,\r\n        'Wanted layout: ' + wantedLayout\r\n    );\r\n\r\n    // The hash means that we attempted to redirect to the same layout once,\r\n    // so if it's there and another redirect is requsted, something is wrong.\r\n    //\r\n    // Because the push history should remove it if everything worked out.\r\n    if (window.location.hash) {\r\n        throw Error(\r\n            'A redirect failed, does the requsted layout exist? \"' +\r\n                wantedLayout +\r\n                '\"?'\r\n        );\r\n    }\r\n\r\n    console.log(\r\n        `requires layout switch from ${currentLayout} to ${wantedLayout}`\r\n    );\r\n    const navigationState = {\r\n        routeName: routeResult.route.name,\r\n        params: routeResult.params || {}\r\n    };\r\n\r\n    sessionStorage.setItem('layoutNavigation', JSON.stringify(navigationState));\r\n    const layoutUrl =\r\n        wantedLayout.indexOf('.htm') > -1\r\n            ? `/${wantedLayout}#layout`\r\n            : `/${wantedLayout}.html#layout`;\r\n    console.log('redirecting to ', layoutUrl);\r\n    window.location.href = layoutUrl;\r\n    return true;\r\n}\r\n/**\r\n * Checks session storage for route information and initiates proper navigation\r\n * Should be called when page loads to handle layout transitions\r\n *\r\n * @returns Whether navigation was initiated from session storage\r\n *\r\n * @example\r\n * // Call on page load\r\n * document.addEventListener('DOMContentLoaded', () => {\r\n *   if (handleLayoutNavigation()) {\r\n *     console.log('Navigation handled from session storage');\r\n *   }\r\n * });\r\n */\r\nfunction tryLoadRouteFromLayoutNavigation(): boolean {\r\n    try {\r\n        const navigationStateJson = sessionStorage.getItem('layoutNavigation');\r\n        if (!navigationStateJson) {\r\n            return false;\r\n        }\r\n\r\n        const navigationState = JSON.parse(navigationStateJson);\r\n        sessionStorage.removeItem('layoutNavigation');\r\n        console.log('session store navigation ', navigationState);\r\n        navigate(navigationState.routeName, {\r\n            params: navigationState.params\r\n        });\r\n\r\n        return true;\r\n    } catch (error) {\r\n        sessionStorage.removeItem('layoutNavigation');\r\n        reportError('Failed to navigate from session storage', {\r\n            cause: error,\r\n        });\r\n        return false;\r\n    }\r\n}\r\n\r\nfunction generateErrorMessage(\r\n    routeNameOrUrl: string,\r\n    routeParams: Record<string, RouteParamType>,\r\n    allRoutes: Route[]\r\n): string {\r\n    var routeData = '';\r\n    if (routeParams) {\r\n        routeData += Object.entries(routeParams)\r\n            .map(([key, value]) => `${key}=${value}`)\r\n            .join(', ');\r\n    } else {\r\n        routeData = '.';\r\n    }\r\n\r\n    var routesStr = allRoutes.map(\r\n        (x) =>\r\n            ` * Name: '${x.name}', path: '${x.path}', target: ${\r\n                x.target ?? 'default'\r\n            }\\n`\r\n    );\r\n    return `No route matched '${routeNameOrUrl}${routeData}'. Available routes:\\n${routesStr}`;\r\n}\r\n\r\nfunction checkRouteGuards(routeResult: RouteMatchResult): boolean {\r\n    if (\r\n        !routeResult ||\r\n        !routeResult.route.guards ||\r\n        routeResult.route.guards.length == 0\r\n    ) {\r\n        return true;\r\n    }\r\n\r\n    for (let index = 0; index < routeResult.route.guards.length; index++) {\r\n        const element = routeResult.route.guards[index];\r\n        var result = element.check(routeResult);\r\n        if (result == GuardResult.Allow) {\r\n            return true;\r\n        }\r\n\r\n        if (result == GuardResult.Stop) {\r\n            return false;\r\n        }\r\n\r\n        if (result == GuardResult.Deny) {\r\n            throw new RouteGuardError(\r\n                `Guard ${element.constructor.name} said 'Deny' for ${routeResult.route.name}`\r\n            );\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n", "import { navigate, printRoutes } from './navigation';\r\nimport { RelaxError, reportError } from '../errors';\r\n\r\nexport class RouteLink extends HTMLElement {\r\n    static get observedAttributes() {\r\n        return ['name', 'target', 'params'];\r\n    }\r\n\r\n    constructor() {\r\n        super();\r\n        this.addEventListener('click', e => this.handleClick(e));\r\n    }\r\n\r\n    private handleClick(e: MouseEvent)  {\r\n        e.preventDefault();\r\n        \r\n        const name = this.getAttribute('name');\r\n        if (!name) return;\r\n\r\n        console.log('Calling printRoutes from RouteLink in relaxjs/components');\r\n        printRoutes();\r\n        \r\n        const params: Record<string, string> = {};\r\n        for (const attr of Array.from(this.attributes)) {\r\n            if (attr.name.startsWith('param-')) {\r\n                const paramName = attr.name.substring(6);\r\n                params[paramName] = attr.value;\r\n            }\r\n        }\r\n\r\n        const paramsAttr = this.getAttribute('params');\r\n        let additionalParams: Record<string, string | number> | undefined;\r\n        if (paramsAttr) {\r\n            try {\r\n                const parsed = JSON.parse(paramsAttr);\r\n                additionalParams = parsed as Record<string, string | number>;\r\n            } catch (error) {\r\n                const err = reportError('Failed to parse route params', {\r\n                    element: 'r-link',\r\n                    params: paramsAttr,\r\n                    cause: error,\r\n                });\r\n                if (err) throw err;\r\n            }\r\n        }\r\n\r\n        const target = this.getAttribute('target');\r\n        if (additionalParams){\r\n            Object.assign(params, additionalParams);\r\n        }\r\n\r\n        try {\r\n            navigate(name, { params, target: target || undefined });\r\n        } catch (error) {\r\n            if (error instanceof RelaxError) throw error;\r\n            const reported = reportError('Navigation failed', {\r\n                element: 'r-link',\r\n                route: name,\r\n                params,\r\n                target,\r\n                cause: error,\r\n            });\r\n            if (reported) throw reported;\r\n        }\r\n    }\r\n\r\n    connectedCallback() {\r\n        if (!this.hasAttribute('tabindex')) {\r\n            this.setAttribute('tabindex', '0');\r\n        }\r\n        \r\n        this.style.cursor = 'pointer';\r\n        this.role = 'link';\r\n    }\r\n\r\n    disconnectedCallback() {\r\n        this.removeEventListener('click', this.handleClick);\r\n    }\r\n}", "export interface ColumnDefinition {\r\n    /**\r\n     * With specifier, like \"10px\", \"10%\" or \"*\"\r\n     */\r\n    width?: string;\r\n\r\n    sortOrder?: 'ascending' | 'descending';\r\n\r\n    title: string;\r\n\r\n    property: string;\r\n}\r\n\r\nexport class Table extends HTMLElement {\r\n    private table: HTMLTableElement = document.createElement('table');\r\n    private tBody: HTMLTableSectionElement;\r\n    private pages: Map<number, Record<string, unknown>[]> = new Map();\r\n\r\n    constructor(private columns: ColumnDefinition[]) {\r\n        super();\r\n        this.appendChild(this.table);\r\n\r\n        //        this.table.setAttribute('part', 'table');\r\n\r\n        this.tBody = document.createElement('tbody');\r\n        //this.tBody.setAttribute('part', \"tbody\");\r\n        this.table.appendChild(this.tBody);\r\n        //copyAttributes(this, this.table, ['style']);\r\n        //this.tBody.innerHTML = \"<tr><td colspan='2'>&nbsp;sss</td></tr>\";\r\n\r\n    }\r\n\r\n    pageLoader: (pageNumber: number) => Promise<Record<string, unknown>[]>;\r\n\r\n    template?: DocumentFragment;\r\n\r\n    connectedCallback() {\r\n        const template = this.querySelector('template')?.content;\r\n        if (template) {\r\n            this.template = template;\r\n\r\n            const columnsTemplate = template.querySelector('r-columns');\r\n            if (columnsTemplate) {\r\n                this.columns = this.extractColumnsFromTemplate(template);\r\n                this.renderColumns();\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        const columnsTemplate = this.querySelector('r-columns');\r\n        if (columnsTemplate) {\r\n            this.columns = this.extractColumnsFromTemplate(columnsTemplate);\r\n            columnsTemplate.remove();\r\n            this.renderColumns();\r\n        }\r\n    }\r\n\r\n    setData(data: unknown[]) {\r\n        if (!this.isConnected) {\r\n            console.log('NOT CONNECTED');\r\n        }\r\n        this.render(data);\r\n    }\r\n\r\n    addRow(x: unknown) {\r\n        const row = document.createElement('tr');\r\n        this.columns.forEach(column => {\r\n            const td = document.createElement('td');\r\n            var value=x[column.property];\r\n            if (!value){\r\n                console.log('missing ', x[column.property]);\r\n            }\r\n\r\n            td.innerText = (value ?? '').toString();\r\n            row.appendChild(td);\r\n\r\n        });\r\n\r\n        this.tBody.appendChild(row);\r\n    }\r\n\r\n    render(data: unknown[]) {\r\n        if (!this.table.tHead) {\r\n            this.renderColumns();\r\n        }\r\n\r\n        const newRows: HTMLTableRowElement[] = [];\r\n        data.forEach((x: Record<string, unknown>) => {\r\n            this.addRow(x);\r\n        });\r\n\r\n        //this.tBody.replaceChildren(...newRows);       \r\n    }\r\n\r\n    page(pageNumber: number) {\r\n        const wantedPage = this.pages.get(pageNumber);\r\n        if (wantedPage) {\r\n            this.render(wantedPage);\r\n            return;\r\n        }\r\n\r\n        this.pageLoader(pageNumber).then((result) => {\r\n            this.pages[pageNumber] = result;\r\n            this.render(result);\r\n        });\r\n    }\r\n\r\n    private extractColumnsFromTemplate(\r\n        template: ParentNode\r\n    ): ColumnDefinition[] {\r\n        const columns: ColumnDefinition[] = [];\r\n        const columnElements = template.querySelectorAll('r-column');\r\n        Array.from(columnElements).forEach((col) => {\r\n            const title = col.textContent;\r\n            const property = col.getAttribute('name') || '';\r\n            const width = col.getAttribute('width');\r\n            const sortOrder = col.getAttribute('sortOrder') as\r\n                | 'ascending'\r\n                | 'descending'\r\n                | undefined;\r\n\r\n            if (title && property) {\r\n                columns.push({ title, property, width, sortOrder });\r\n            }\r\n        });\r\n\r\n        return columns;\r\n    }\r\n\r\n    /**\r\n     * Should only be done initially.\r\n     */\r\n    private renderColumns() {\r\n        if (this.columns.length == 0) {\r\n            if (this.template) {\r\n                this.extractColumnsFromTemplate(this.template);\r\n            } else {\r\n                this.columns = [{ title: 'Name', property: 'name' }];\r\n            }\r\n        }\r\n\r\n        const thead = document.createElement('thead');\r\n        //thead.setAttribute('part', 'thead');\r\n        const tr = document.createElement('tr');\r\n        thead.appendChild(tr);\r\n        this.table.tHead = thead;\r\n\r\n        this.columns.forEach((column) => {\r\n            const th = document.createElement('th');\r\n            //  th.setAttribute('part', 'th');\r\n            th.innerText = column.title;\r\n            tr.appendChild(th);\r\n        });\r\n\r\n        this.table.tHead = thead;\r\n    }\r\n}\r\n\r\n/**\r\n * Defines the columns for the table.\r\n * @element columns\r\n * @slot - Contains child `<column>` elements.\r\n */\r\nexport class ColumnsElement extends HTMLElement {\r\n    private observer: MutationObserver;\r\n\r\n    constructor() {\r\n        super();\r\n\r\n        this.observer = new MutationObserver(() => {\r\n            this.updateColumns();\r\n        });\r\n    }\r\n\r\n    connectedCallback() {\r\n        this.observer.observe(this, { childList: true, subtree: false });\r\n        this.updateColumns();\r\n    }\r\n\r\n    disconnectedCallback() {\r\n        this.observer.disconnect();\r\n    }\r\n\r\n    get columns(): ColumnElement[] {\r\n        return Array.from(this.querySelectorAll('column'));\r\n    }\r\n\r\n    set columns(value: ColumnElement[]) {\r\n        this.innerHTML = '';\r\n        value.forEach((column) => this.appendChild(column));\r\n        this.updateColumns();\r\n    }\r\n\r\n    private updateColumns() {\r\n        console.log('Columns updated:', this.columns);\r\n    }\r\n}\r\n\r\n/**\r\n * A single column definition for a table.\r\n *\r\n * @element column\r\n * @attribute {string} name - Maps to a property in the data array.\r\n * @attribute {string} [mutators] - Optional transformations to apply to the data.\r\n */\r\nexport class ColumnElement extends HTMLElement {\r\n    static get observedAttributes() {\r\n        return ['name', 'transformer'];\r\n    }\r\n\r\n    get name(): string | null {\r\n        return this.getAttribute('name');\r\n    }\r\n\r\n    set name(value: string | null) {\r\n        if (value) {\r\n            this.setAttribute('name', value);\r\n        } else {\r\n            this.removeAttribute('name');\r\n        }\r\n    }\r\n\r\n    get transformer(): string | null {\r\n        return this.getAttribute('transformer');\r\n    }\r\n\r\n    set transformer(value: string | null) {\r\n        if (value) {\r\n            this.setAttribute('transformer', value);\r\n        } else {\r\n            this.removeAttribute('transformer');\r\n        }\r\n    }\r\n\r\n    get displayName(): string {\r\n        return this.innerText;\r\n    }\r\n\r\n    set displayName(value: string) {\r\n        this.innerText = value;\r\n    }\r\n\r\n    attributeChangedCallback(\r\n        name: string,\r\n        oldValue: string | null,\r\n        newValue: string | null\r\n    ) {\r\n        console.log(\r\n            `Attribute changed: ${name}, Old: ${oldValue}, New: ${newValue}`\r\n        );\r\n    }\r\n}\r\n\r\n\r\ncustomElements.define(\"r-table\", Table);\r\ncustomElements.define(\"r-column\", ColumnElement);\r\ncustomElements.define(\"r-columns\", ColumnsElement);", "export interface TreeNode {\r\n    label: string; // The display label of the node\r\n    children?: TreeNode[]; // Optional array of child nodes\r\n    expanded?: boolean; // Optional property to track if the node is expanded\r\n    parent?: TreeNode;\r\n    data: any;\r\n}\r\n\r\nexport class FindResult<T> {\r\n    constructor(public data: T, public node: TreeNode) {}\r\n}\r\n\r\nexport interface TreeFindResult {}\r\n\r\nexport class TreeNodeNavigated extends Event {\r\n    static NAME = 'TreeNodeNavigated';\r\n    constructor(public node: TreeNode, eventInit?: EventInit) {\r\n        super(TreeNodeNavigated.NAME, eventInit);\r\n    }\r\n}\r\n\r\nexport class TreeView extends HTMLElement {\r\n    private root: HTMLUListElement;\r\n    private elementToNode = new Map<HTMLLIElement, TreeNode>();\r\n    private nodeToElement = new Map<TreeNode, HTMLLIElement>();\r\n    private nodes: TreeNode[] = [];\r\n\r\n    constructor() {\r\n        super();\r\n    }\r\n\r\n    connectedCallback() {\r\n        const style = document.createElement('style');\r\n        style.textContent = `\r\n            :host {\r\n                display: block;\r\n                font-family: Arial, sans-serif;\r\n            }\r\n            .tree-node {\r\n                cursor: pointer;\r\n                align-items: center;\r\n                user-select: none;\r\n                margin-left: 1rem;\r\n            }\r\n            .tree-icon {\r\n                margin-right: 0.5rem;\r\n                font-size: 0.9rem;\r\n            }\r\n            .tree-children {\r\n                display: none;\r\n                padding-left: 1rem;\r\n            }\r\n            .tree-node.expanded + .tree-children {\r\n                display: block;\r\n            }\r\n            .treeview {\r\n                list-style-type: none;\r\n                padding-left: 0;\r\n            }\r\n            .treeview ul {\r\n                list-style-type: none;\r\n            }\r\n            .selected > div {\r\n                background-color: #f0f0f0;\r\n            }\r\n        `;\r\n        this.appendChild(style);\r\n        this.root = document.createElement('ul');\r\n        this.root.className = 'treeview';\r\n        this.appendChild(this.root);\r\n        var template = this.querySelector('template[name=\"data\"]');\r\n        if (template && template.textContent) {\r\n            const data = JSON.parse(template.textContent);\r\n            this.renderTreeImp(data);\r\n        }\r\n    }\r\n\r\n    selected?: TreeNode;\r\n\r\n    render(nodes: TreeNode[]) {\r\n        this.root.innerHTML = '';\r\n        this.elementToNode.clear();\r\n        this.nodes.length = 0;\r\n        this.renderTreeImp(nodes, null);\r\n    }\r\n\r\n    add(node: TreeNode) {\r\n        if (!node) {\r\n            throw Error('node was not specified');\r\n        }\r\n\r\n        this.addNode(node);\r\n    }\r\n\r\n    addToParent(node: TreeNode, parent: TreeNode, addAlphabetically?: boolean) {\r\n        if (!parent) {\r\n            throw Error('Parent was not specified');\r\n        }\r\n\r\n        if (!node) {\r\n            throw Error('node was not specified');\r\n        }\r\n\r\n        this.addNode(node, parent, addAlphabetically);\r\n    }\r\n\r\n    /**\r\n     * Finds nodes in the tree that match the provided filter\r\n     *\r\n     * @param filter - Function to test each node's data\r\n     * @param parent - Optional parent node to limit search scope\r\n     * @returns Array of FindResult objects containing matches\r\n     *\r\n     * @example\r\n     * // Find all nodes with data type User and name \"John\"\r\n     * treeView.find(data => data.type === 'User' && data.name === 'John');\r\n     *\r\n     * @example\r\n     * // Find nodes under a specific parent\r\n     * treeView.find(data => data.isActive, parentNode);\r\n     */\r\n    find<T>(filter: (data: T) => boolean, parent?: TreeNode): FindResult<T>[] {\r\n        if (parent) {\r\n            const matches: FindResult<T>[] = [];\r\n            this.findInSubtree(parent, filter, matches);\r\n            return matches;\r\n        }\r\n\r\n        // This loop goes through this.nodes which contains all\r\n        // and not just parent nodes.\r\n        const matches: FindResult<T>[] = [];\r\n        for (const node of this.nodes) {\r\n            if (filter(node.data)) {\r\n                matches.push(new FindResult(node.data, node));\r\n            }\r\n        }\r\n        return matches;\r\n    }\r\n\r\n    /**\r\n     * Selects a node in the tree and ensures all parent nodes are expanded\r\n     *\r\n     * @param node - The node to select\r\n     * @returns True if node was successfully selected, false otherwise\r\n     *\r\n     * @example\r\n     * // Select a node obtained from a find operation\r\n     * const results = treeView.find(data => data.id === 42);\r\n     * if (results.length > 0) {\r\n     *   treeView.select(results[0].node);\r\n     * }\r\n     */\r\n    select(node: TreeNode): boolean {\r\n        if (!this.nodeToElement.has(node)) {\r\n            return false;\r\n        }\r\n\r\n        this.expandPathToNode(node);\r\n        this.selectNode(node);\r\n        this.dispatchEvent(new TreeNodeNavigated(node, { bubbles: true }));\r\n        return true;\r\n    }\r\n\r\n    private findInSubtree<T>(\r\n        parentNode: TreeNode,\r\n        filter: (data: T) => boolean,\r\n        results: FindResult<T>[]\r\n    ) {\r\n        if (!parentNode.children || parentNode.children.length == 0) {\r\n            return;\r\n        }\r\n        \r\n        for (const child of parentNode.children) {\r\n            if (filter(child.data)) {\r\n                results.push(new FindResult(child.data, child));\r\n            }\r\n\r\n            this.findInSubtree(child, filter, results);\r\n        }\r\n    }\r\n\r\n    private expandPathToNode(node: TreeNode) {\r\n        const path: TreeNode[] = [];\r\n        let current: TreeNode | undefined = node.parent;\r\n\r\n        while (current) {\r\n            path.unshift(current);\r\n            current = current.parent;\r\n        }\r\n\r\n        for (const pathNode of path) {\r\n            pathNode.expanded = true;\r\n            const element = this.nodeToElement.get(pathNode);\r\n            if (element) {\r\n                const treeNode = element.querySelector(\r\n                    '.tree-node'\r\n                ) as HTMLDivElement;\r\n                const icon = treeNode.querySelector(\r\n                    '.tree-icon'\r\n                ) as HTMLElement;\r\n\r\n                if (!treeNode.classList.contains('expanded')) {\r\n                    treeNode.classList.add('expanded');\r\n                    icon.className = 'tree-icon fa-regular fa-square-minus';\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private renderTreeImp(data: TreeNode[], parent?: TreeNode) {\r\n        data.forEach((node) => {\r\n            this.addNode(node, parent);\r\n        });\r\n    }\r\n\r\n    private addNode(\r\n        node: TreeNode,\r\n        parentNode?: TreeNode,\r\n        addAlphabetically?: boolean\r\n    ) {\r\n        let container: HTMLUListElement;\r\n        if (parentNode) {\r\n            const parentElement = this.nodeToElement.get(parentNode);\r\n            if (!parentElement) {\r\n                console.log(\r\n                    'Failed to find parent element for parent ',\r\n                    parentNode\r\n                );\r\n                throw Error(\r\n                    'Failed to find parent element for parent ' +\r\n                        parentNode.label\r\n                );\r\n            }\r\n            container = parentElement.querySelector('ul');\r\n            node.parent = parentNode;\r\n            if (!parentNode.children){\r\n                parentNode.children = [node];\r\n            }\r\n            else{\r\n                parentNode.children.push(node);\r\n            }\r\n        } else {\r\n            container = this.root;\r\n        }\r\n\r\n        const nodeElement = document.createElement('li');\r\n        this.elementToNode.set(nodeElement, node);\r\n        this.nodeToElement.set(node, nodeElement);\r\n        this.nodes.push(node);\r\n        \r\n\r\n        const iconStr =\r\n            node.children && node.children.length > 0\r\n                ? 'fa-square-plus'\r\n                : 'fa-circle';\r\n        nodeElement.innerHTML = `\r\n                <div class=\"tree-node\"><i class=\"tree-icon fa-regular ${iconStr}\"></i> ${node.label}</div>\r\n                <ul class=\"tree-children\"></ul>\r\n            `;\r\n\r\n        if (addAlphabetically) [container];\r\n        container.appendChild(nodeElement);\r\n\r\n        const treeNode = nodeElement.querySelector(\r\n            '.tree-node'\r\n        ) as HTMLDivElement;\r\n        const treeChildren = nodeElement.querySelector(\r\n            '.tree-children'\r\n        ) as HTMLUListElement;\r\n        const icon = treeNode.querySelector('.tree-icon') as HTMLElement;\r\n\r\n        if (node.children && node.children.length > 0) {\r\n            treeNode.classList.add('expandable');\r\n            treeNode.addEventListener('click', () => {\r\n                const isExpanded = treeNode.classList.toggle('expanded');\r\n                if (isExpanded) {\r\n                    this.dispatchEvent(\r\n                        new TreeNodeNavigated(node, { bubbles: true })\r\n                    );\r\n                }\r\n\r\n                this.selectNode(node);\r\n                if (node.children && node.children.length > 0) {\r\n                    icon.className = isExpanded\r\n                        ? 'tree-icon fa-regular fa-square-minus'\r\n                        : 'tree-icon fa-regular fa-square-plus';\r\n                } else {\r\n                    icon.className = 'tree-icon fa-solid fa-plus';\r\n                }\r\n            });\r\n            this.renderTreeImp(node.children, node);\r\n        } else {\r\n            icon.className = 'tree-icon fas fa-angle-right'; // Leaf node icon\r\n            treeNode.addEventListener('click', () => {\r\n                this.selectNode(node);\r\n                this.dispatchEvent(\r\n                    new TreeNodeNavigated(node, { bubbles: true })\r\n                );\r\n            });\r\n        }\r\n    }\r\n\r\n    private selectNode(node: TreeNode) {\r\n        if (this.selected) {\r\n            this.nodeToElement.get(this.selected).classList.remove('selected');\r\n        }\r\n\r\n        this.nodeToElement.get(node).classList.add('selected');\r\n        this.selected = node;\r\n    }\r\n\r\n    private implementsInterface<T>(\r\n        obj: any,\r\n        properties: (keyof T)[]\r\n    ): obj is T {\r\n        if (typeof obj !== 'object' || obj === null) {\r\n            return false;\r\n        }\r\n\r\n        return properties.every((prop) => prop in obj);\r\n    }\r\n}\r\n\r\ncustomElements.define('r-treeview', TreeView);\r\n"],
  "mappings": "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",
  "names": ["MenuItem", "title", "actionName", "submenu", "requiredClaims", "route", "SubMenuItem", "componentName", "MenuEvent", "type", "menuItem", "options", "TopMenu", "template", "name", "oldValue", "newValue", "alignment", "alignClass", "cls", "menuItems", "item", "index", "li", "parentMenu", "backChevron", "subItem", "MenuEvent", "RelaxError", "message", "context", "handler", "reportError", "message", "context", "error", "RelaxError", "handler", "suppressed", "NavigateRouteEvent", "_NavigateRouteEvent", "route", "urlSegments", "routeData", "routeTarget", "eventInit", "targetHandlers", "pendingEvents", "registerRouteTarget", "name", "handler", "initRouteTargetListener", "error", "reportError", "pending", "unregisterRouteTarget", "dispatchToTarget", "evt", "handler", "targetHandlers", "pendingEvents", "listenerAttached", "initRouteTargetListener", "NavigateRouteEvent", "RouteTarget", "registerRouteTarget", "evt", "unregisterRouteTarget", "error", "RelaxError", "reportError", "tagName", "element", "data", "routeData", "RouteError", "RouteGuardError", "NumberRouteSegment", "paramName", "value", "pathValue", "StringRouteSegment", "PathRouteSegment", "_pathValue", "RouteImp", "route", "segments", "generatedSegments", "params", "index", "urlSegment", "ourSegment", "routeData", "urlSegments", "routeParams", "d", "segment", "providedValue", "convertedValue", "matchRoute", "routes", "routeNameOrUrl", "findRouteByUrl", "findRouteByName", "name", "x", "imp", "generateRouteImp", "result", "path", "routeImps", "generateRouteImps", "m", "impSegments", "currentLayout", "getLayout", "path", "internalRoutes", "printRoutes", "internalRoutes", "navigate", "routeNameOrUrl", "options", "routeResult", "findRoute", "navigateToLayout", "target", "ourUrl", "e", "NavigateRouteEvent", "theRoutes", "internalRoutes", "params", "matchRoute", "errorMsg", "generateErrorMessage", "RouteError", "checkRouteGuards", "RouteGuardError", "wantedLayout", "currentLayout", "navigationState", "layoutUrl", "generateErrorMessage", "routeNameOrUrl", "routeParams", "allRoutes", "routeData", "key", "value", "routesStr", "x", "checkRouteGuards", "routeResult", "index", "element", "result", "RouteGuardError", "RouteLink", "e", "name", "printRoutes", "params", "attr", "paramName", "paramsAttr", "additionalParams", "error", "err", "reportError", "target", "navigate", "RelaxError", "reported", "Table", "columns", "template", "columnsTemplate", "data", "x", "row", "column", "td", "value", "newRows", "pageNumber", "wantedPage", "result", "columnElements", "col", "title", "property", "width", "sortOrder", "thead", "tr", "th", "ColumnsElement", "ColumnElement", "name", "oldValue", "newValue", "FindResult", "data", "node", "TreeNodeNavigated", "_TreeNodeNavigated", "eventInit", "TreeView", "style", "template", "nodes", "parent", "addAlphabetically", "filter", "matches", "parentNode", "results", "child", "path", "current", "pathNode", "element", "treeNode", "icon", "container", "parentElement", "nodeElement", "iconStr", "treeChildren", "isExpanded", "obj", "properties", "prop"]
}
