{
  "version": 3,
  "sources": ["../../../ts/utils/Timeline.ts", "../../../ts/utils/Background.ts", "../../../ts/utils/NavDropdown.ts", "../../../ts/svg/views/homepage/FancyText.ts", "../../../ts/svg/construct/calculations/CalcCircleProperties.ts", "../../../ts/svg/construct/core/SVG.ts", "../../../ts/svg/construct/core/SVGCreate.ts", "../../../ts/svg/construct/core/SVGFactory.ts", "../../../ts/svg/homepage/factory/profile_pic/ProfilePicFactory.ts", "../../../ts/svg/construct/calculations/CalcResizeContainer.ts", "../../../ts/svg/construct/calculations/CalcPathProperties.ts", "../../../ts/svg/construct/DeconstructPath.ts", "../../../ts/svg/construct/CreateSides.ts", "../../../ts/svg/construct/InnerPath.ts", "../../../ts/svg/homepage/factory/programming_languages/main/LanguageAddedFeatures.ts", "../../../ts/svg/construct/gradient/CreateGradient.ts", "../../../ts/svg/construct/gradient/DrawSegments.ts", "../../../ts/svg/construct/gradient/OffsetVector.ts", "../../../ts/svg/homepage/factory/programming_languages/main/LanguageMainSVG.ts", "../../../ts/svg/homepage/factory/programming_languages/main/LanguagesFactory.ts", "../../../ts/endpoints/utils/Fetch.ts", "../../../ts/endpoints/service/LanguageService.ts", "../../../ts/svg/homepage/factory/programming_languages/small/LanguageSmallFactory.ts", "../../../ts/endpoints/service/FetchProjects.ts", "../../../ts/svg/construct/PathFigures.ts", "../../../ts/svg/projects/Project.ts", "../../../ts/svg/sharedHexStyling/HexaStyling.ts", "../../../ts/svg/projects/factory/ProjectsFactory.ts", "../../../ts/svg/projects/factory/ProjectsButton.ts", "../../../ts/svg/projects/factory/ProjectsContent.ts", "../../../ts/svg/projects/factory/ProjectsInnerHTML.ts", "../../../ts/svg/projects/factory/ProjectsStackBanners.ts", "../../../ts/svg/projects/factory/ProjectsHexa.ts", "../../../ts/svg/projects/projectsInit.ts", "../../../ts/endpoints/service/FetchProject.ts", "../../../ts/svg/project/contributors/ProjectContributorFactory.ts", "../../../ts/svg/project/contributors/contributorInit.ts", "../../../ts/svg/project/description/ProjectDescriptionParagraphTitle.ts", "../../../ts/svg/project/description/ProjectDescriptionFactory.ts", "../../../ts/svg/project/slideshow/nav/SlideshowBlockNav.ts", "../../../ts/svg/project/slideshow/main/factory/SlideshowInnerContent.ts", "../../../ts/svg/project/slideshow/main/SlideshowContext.ts", "../../../ts/svg/project/slideshow/main/factory/SlideshowMainSVG.ts", "../../../ts/svg/project/slideshow/main/factory/calculation/CalcBoxValues.ts", "../../../ts/svg/project/slideshow/main/factory/calculation/CalcPathDifferenceInCoords.ts", "../../../ts/svg/project/slideshow/main/factory/calculation/CalcMirrorPathVertical.ts", "../../../ts/svg/project/slideshow/main/factory/calculation/CalcPathPositionInBox.ts", "../../../ts/svg/project/slideshow/main/factory/decoration/SlideshowCornerDecoration.ts", "../../../ts/svg/project/slideshow/main/factory/decoration/SlideshowTopDecoration.ts", "../../../ts/svg/project/slideshow/main/factory/SlideshowBox.ts", "../../../ts/svg/project/slideshow/nav/SlideshowState.ts", "../../../ts/svg/project/slideshow/nav/main/SlideshowMainFunctionality.ts", "../../../ts/svg/project/slideshow/small/factory/SlideshowSmallSVG.ts", "../../../ts/svg/project/slideshow/slideshowInit.ts", "../../../ts/svg/project/specifications/ProjectSpecificationFactory.ts", "../../../ts/svg/project/specifications/specInit.ts", "../../../ts/svg/project/projectInit.ts", "../../../ts/utils/Console.ts", "../../../ts/utils/LoadingScreen.ts", "../../../ts/utils/loading_screen/WaitForAssets.ts", "../../../ts/main.ts"],
  "sourcesContent": ["export class TimelineAnimation \n{\n  private timeline: HTMLElement | null;\n  private elements: HTMLElement[];\n  private observer: IntersectionObserver | null = null;\n\n  constructor(timelineSelector: string = '.timeline', contentSelector: string = '.timeline-content') \n  {\n    this.timeline = document.querySelector(timelineSelector);\n    this.elements = Array.from(document.querySelectorAll(contentSelector)) as HTMLElement[];\n    this.initialize();\n  }\n\n  private initialize(): void \n  {\n    this.elements.forEach((el, i) => \n    {\n      el.dataset.srIndex = i.toString();\n      el.style.opacity = '0';\n      el.style.transform = 'translateX(0)';\n      (el as any)._isVisible = false;\n    });\n\n    if (!('IntersectionObserver' in window)) \n    {\n      this.fallback();\n      return;\n    }\n\n    this.observer = new IntersectionObserver(\n      (entries) => \n      {\n        entries.forEach((entry) => \n        {\n          const el = entry.target as HTMLElement;\n          const index = parseInt(el.dataset.srIndex || '0', 10);\n          const delay = index * 120;\n\n          if (entry.isIntersecting && !(el as any)._isVisible) \n          {\n            setTimeout(() => \n            {\n              el.style.opacity = '1';\n              el.style.transform = 'translateX(0)';\n              const img = el.previousElementSibling as HTMLElement | null;\n\n              if (img && img.classList.contains('timeline-img')) \n              {\n                img.classList.add('active');\n              }\n\n              (el as any)._isVisible = true;\n\n              if (index < this.elements.length - 1) \n              {\n                this.drawLineForItem(index);\n              }\n            }, delay);\n          }\n\n          if (!document.body.contains(el)) \n          {\n            this.observer?.unobserve(el);\n          }\n        });\n      },\n      {\n        root: null,\n        rootMargin: '0px',\n        threshold: 0.5,\n      }\n    );\n\n    this.elements.forEach((el) => this.observer?.observe(el));\n  }\n\n  private drawLineForItem(index: number): void \n  {\n    const timelineItems = Array.from(document.querySelectorAll('.timeline-item')) as HTMLElement[];\n    const currentItem = timelineItems[index];\n    const nextItem = timelineItems[index + 1];\n\n    if (!currentItem || !nextItem) \n    {\n      // console.warn(`Item ${index}: Missing current or next item`);\n      return;\n    }\n\n    const currentDot = currentItem.querySelector('.timeline-img') as HTMLElement | null;\n    const nextDot = nextItem.querySelector('.timeline-img') as HTMLElement | null;\n\n    if (currentDot && nextDot) \n    {\n      const top = currentDot.offsetTop + currentDot.offsetHeight + 15;\n      let height = nextDot.offsetTop - (currentDot.offsetTop + currentDot.offsetHeight) - 30;\n\n      const lineLeft = currentDot.offsetLeft + currentDot.offsetWidth / 2 - 2.5;\n\n      const line = document.createElement('div');\n      line.className = 'timeline-line-segment';\n      line.style.top = `${top}px`;\n      line.style.left = `${lineLeft}px`;\n\n      if (this.timeline) \n      {\n        this.timeline.appendChild(line);\n        setTimeout(() => \n        {\n          line.style.height = `${height}px`;\n          line.style.opacity = '1';\n        }, 10);\n      } \n    } \n  }\n\n  private drawLines(): void \n  {\n    const timelineItems = Array.from(document.querySelectorAll('.timeline-item')) as HTMLElement[];\n\n    for (let index = 0; index < timelineItems.length - 1; index++) \n    {\n      this.drawLineForItem(index);\n    }\n  }\n\n  private fallback(): void \n  {\n    this.elements.forEach((el) => \n    {\n      el.style.opacity = '1';\n      el.style.transform = 'translateX(0)';\n      const img = el.previousElementSibling as HTMLElement | null;\n\n      if (img && img.classList.contains('timeline-img')) \n      {\n        img.classList.add('active');\n      }\n      (el as any)._isVisible = true;\n    });\n    this.drawLines();\n  }\n\n  public destroy(): void \n  {\n    this.elements.forEach((el) => this.observer?.unobserve(el));\n    this.observer?.disconnect();\n  }\n}", "import { Star } from \"../interfaces/utils/StarInterface\"\n\nexport class Background\n{\n    private canvas: HTMLCanvasElement;\n    private ctx: CanvasRenderingContext2D;\n    private stars: Star[] = [];\n    private numStars: number;\n\n    constructor(canvasId: string, numStars: number = 50) \n    {\n        const canvasEl = document.getElementById(canvasId) as HTMLCanvasElement;\n        if (!canvasEl) \n            throw new Error(\"Canvas not found\");\n\n        const context = canvasEl.getContext(\"2d\");\n        if (!context) \n            throw new Error(\"2D context not supported\");\n\n        this.canvas = canvasEl;\n        this.ctx = context;\n        this.numStars = numStars;\n\n        this.initStars();\n        this.resizeCanvas();\n        window.addEventListener(\"resize\", () => this.resizeCanvas());\n        this.draw();\n    }\n\n    private resizeCanvas(): void \n    {\n        this.canvas.width = window.innerWidth;\n        this.canvas.height = window.innerHeight;\n    }\n\n    private initStars(): void \n    {\n        for (let i = 0; i < this.numStars; i++) \n        {\n            this.stars.push({\n                x: Math.random() * window.innerWidth,\n                y: Math.random() * window.innerHeight,\n                radius: Math.random() * 2,\n                speedX: (Math.random() - 0.5) * 0.2,\n                speedY: (Math.random() - 0.5) * 0.5,\n                alpha: Math.random() * 0.8 + 0.2\n            });\n        }\n    }\n\n    private drawStars(): void \n    {\n        for (let star of this.stars) \n        {\n            star.x += star.speedX;\n            star.y += star.speedY;\n\n            if (star.x < 0) \n                star.x = this.canvas.width;\n            if (star.x > this.canvas.width) \n                star.x = 0;\n            if (star.y < 0) \n                star.y = this.canvas.height;\n            if (star.y > this.canvas.height) \n                star.y = 0;\n\n            this.ctx.beginPath();\n            this.ctx.arc(star.x, star.y, star.radius, 0, Math.PI * 2);\n            this.ctx.fillStyle = `rgba(46, 204, 113, ${star.alpha})`;\n            this.ctx.shadowColor = \"rgba(46, 204, 113, 0.8)\";\n            this.ctx.shadowBlur = 10;\n            this.ctx.fill();\n        }\n    }\n\n    private draw = (): void => \n    {\n        this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n        this.drawStars();\n        requestAnimationFrame(this.draw);\n    }\n}\n", "export class Dropdown\n{\n    private dropdownMenuHTML: HTMLElement;\n    private toggleButtonDropdownHTML: HTMLButtonElement;\n    private headerHTML: HTMLElement;\n\n    constructor()\n    {\n        this.dropdownMenuHTML = document.querySelector<HTMLElement>(\".mobile-dropdown-menu\")!;\n        this.toggleButtonDropdownHTML = document.querySelector<HTMLButtonElement>(\".nav-toggle-button\")!;\n        this.headerHTML = document.querySelector<HTMLElement>(\"header\")!;\n        this.toggleDropdown = this.toggleDropdown.bind(this);\n    }\n\n    toggleDropdown(): void\n    {\n        if (this.dropdownMenuHTML && this.headerHTML && this.toggleButtonDropdownHTML)\n        {\n            const isOpen = this.dropdownMenuHTML.style.display === \"block\";\n\n            this.dropdownMenuHTML.style.display = isOpen ? \"none\" : \"block\";\n\n            if (isOpen)\n            {\n                this.headerHTML.classList.remove(\"dropdown-active\")\n            }\n            else\n            {\n                this.headerHTML.classList.add(\"dropdown-active\");\n            }\n        }\n    }\n\n    checkForButton(): void\n    {\n        if (this.toggleButtonDropdownHTML) \n        {\n            this.toggleButtonDropdownHTML.addEventListener(\"click\", this.toggleDropdown);\n        }\n    }\n}", "export class FancyText\n{\n    private element: HTMLElement = document.querySelector(\"[data-target-resolver]\") as HTMLElement;\n    private strings: string[] = [\"hey, mijn naam is <span class='green-name'>Atilla Oomen</span>\"];\n    private counter: number = 0;\n    private options: \n    {\n        offset: number;\n        timeout: number;\n        iterations: number;\n        characters: string[];\n        resolveString?: string;\n        element?: HTMLElement;\n    };\n    private delay: number = 50000;\n\n    constructor(options: Partial<typeof this.options> = {}, delay: number)\n    {\n        this.delay = delay;\n\n        this.options = Object.assign(\n        {\n            offset: 0,\n            timeout: 5,\n            iterations: 10,\n            characters: \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!?- \".split(\"\")\n        }, options);\n    }\n\n    private getRandomInteger(min: number, max: number): number\n    {\n        return Math.floor(Math.random() * (max - min + 1)) + min;\n    }\n\n    private randomCharacter(characters: string[]): string\n    {\n        return characters[this.getRandomInteger(0, characters.length - 1)];\n    }\n\n    private getPartialString(str: string, offset: number): string\n    {\n        let result = \"\";\n        let count = 0;\n        let inTag = false;\n\n        for (let i = 0; i < str.length && count < offset; i++)\n        {\n            const char = str[i];\n            result += char;\n            if (char === \"<\") inTag = true;\n            if (char === \">\") inTag = false;\n            if (!inTag) count++;\n        }\n\n        return result;\n    }\n\n    private doRandomiserEffect(options: any, callback?: () => void): void\n    {\n        setTimeout(() =>\n        {\n            if (options.iterations >= 0)\n            {\n                const nextOptions = Object.assign({}, options, { iterations: options.iterations - 1 });\n\n                if (options.element)\n                {\n                    options.element.innerHTML = options.iterations === 0\n                        ? options.partialString\n                        : options.partialString.substring(0, options.partialString.length - 1) +\n                          this.randomCharacter(options.characters);\n                }\n\n                this.doRandomiserEffect(nextOptions, callback);\n            }\n            else if (typeof callback === \"function\")\n            {\n                callback();\n            }\n        }, options.timeout);\n    }\n\n    private doResolverEffect(options: any, callback?: () => void): void\n    {\n        const partialString = this.getPartialString(options.resolveString, options.offset);\n\n        const combinedOptions = Object.assign({}, options, { partialString: partialString });\n\n        this.doRandomiserEffect(combinedOptions, () =>\n        {\n            const nextOptions = Object.assign({}, options, { offset: options.offset + 1 });\n\n            if (options.offset <= options.resolveString.length)\n            {\n                this.doResolverEffect(nextOptions, callback);\n            }\n            else if (typeof callback === \"function\")\n            {\n                callback();\n            }\n        });\n    }\n\n    public start(): void\n    {\n        const run = () =>\n        {\n            this.options.resolveString = this.strings[this.counter];\n            this.options.element = this.element;\n\n            this.doResolverEffect(this.options, () =>\n            {\n                setTimeout(() =>\n                {\n                    this.counter++;\n                    if (this.counter >= this.strings.length) this.counter = 0;\n                    run();\n                }, this.delay);\n            });\n        };\n\n        run();\n    }\n}", "/**\n * CalcCircleProperties\n * \n * Biedt statische methoden om eigenschappen van cirkels te berekenen, zoals:\n * omtrek, stroke-dasharray, en de aanpassing van radius bij stroke-width.\n */\nexport class CalcCircleProperties\n{\n    // Bereken de omtrek van een cirkel op basis van de straal.\n    // Rond het resultaat af op twee decimalen voor precisie bij SVG-berekeningen.\n    public static calcCircleCircumference(radius: number): number\n    {\n        const circumference = radius * 2 * Math.PI;\n        return parseFloat(circumference.toFixed(2));\n    }\n\n    // Bereken de stroke-dasharray string voor een SVG-cirkel.\n    // De eerste waarde is de lengte van het zichtbare segment,\n    // de tweede waarde is de resterende lengte van de cirkel (gap).\n    public static calcStrokeDasharray(dasharrayElement: number, circumference: number): string\n    {\n        const availableRoom = circumference - dasharrayElement;\n        return `${dasharrayElement} ${availableRoom}`;\n    }\n\n    // Bereken de effectieve straal van een cirkel inclusief de helft van de stroke-width.\n    // Dit is nodig voor correcte positionering in SVG zodat de stroke binnen het gewenste gebied valt.\n    public static calcRadiusDifferenceAndWidth(strokeWidth: number, basicRadius: number): number\n    {\n        return (strokeWidth / 2) + basicRadius;\n    }\n}\n", "/**\n * SVG\n * \n * Basisclass voor het beheren van SVG-elementen in de DOM.\n * Behandelt:\n * - de SVG namespace\n * - het ophalen van SVG-elementen via een HTML-ID\n * - het instellen van attributen zoals width, height, viewBox\n * - optioneel toepassen van standaard styling op het SVG-element\n * - het teruggeven van interne SVG-ID en attributen voor gebruik in subklassen\n */\nexport class SVG\n{\n    // Namespace vereist voor het genereren en manipuleren van SVG-elementen\n    private static readonly SVG_NS: string = \"http://www.w3.org/2000/svg\";\n\n    // ID van het doel-SVG-element in de HTML\n    private SVGHTMLID: string;\n\n    // Attributen die op het SVG-element worden toegepast (bijv. width, height, viewBox)\n    private SVGAttributes: Record<string, string | number> = {};\n\n    // Geeft aan of standaard styling toegepast moet worden\n    public SVGIsDefaultStyling: boolean = true;\n\n    // Initialiseert een SVG-instantie met een HTML-ID, attributen en standaard styling-instellingen\n    constructor(\n        SVGHTMLID: string, \n        SVGAttributes: Record<string, string | number>,\n        SVGDefaultStyling: boolean\n    )\n    {\n        this.SVGHTMLID = SVGHTMLID;\n        this.SVGAttributes = SVGAttributes;\n        this.SVGIsDefaultStyling = SVGDefaultStyling;\n    }\n    \n    // Geeft de SVG-namespace terug voor intern gebruik bij elementcreatie\n    protected static getSVG_NS(): string\n    {\n        return this.SVG_NS;\n    }\n\n    // Stelt de HTML-ID opnieuw in voor dynamische aanpassingen\n    protected setSVGHTMLID(SVGHTMLID: string): void\n    { \n        this.SVGHTMLID = SVGHTMLID;\n    }\n\n    // Haalt het SVG-element op uit de DOM, valideert het type en past attributen en styling toe\n    protected getSVGHTMLIDElement(): SVGSVGElement | null\n    {\n        const HTMLElement = document.getElementById(this.SVGHTMLID);\n        \n        if (!HTMLElement)\n        {\n            console.error(\"Not found an element with the ID: \" + this.SVGHTMLID);\n            return null;\n        }\n\n        if (!(HTMLElement instanceof SVGSVGElement)) {\n            console.error(\"Found element is not an SVGSVGElement!\");\n            return null;\n        }\n\n        // Pas alle gedefinieerde attributen toe op het SVG-element\n        if (this.SVGAttributes)\n        {\n            for (const [key, value] of Object.entries(this.SVGAttributes))\n                HTMLElement.setAttribute(key, String(value));\n        }\n\n        // Indien standaard styling gewenst is, toepassen op het SVG-element\n        if (this.SVGIsDefaultStyling && HTMLElement)\n            this.addDefaultStyling(HTMLElement);\n            \n        return HTMLElement;\n    }\n\n    // Toepassen van basis styling: SVG vult de breedte van de container en schaalt automatisch\n    private addDefaultStyling(HTMLElement: HTMLElement): HTMLElement | null\n    {   \n        HTMLElement.style.width = \"100%\";\n        HTMLElement.style.height = \"auto\";\n        HTMLElement.style.display = \"block\";\n\n        return HTMLElement;\n    }\n\n    // Geeft de interne SVG-ID terug voor externe klassen\n    protected get getSVGID(): string \n    {\n        return this.SVGHTMLID;\n    }\n\n    // Geeft de interne attributen terug zoals ingesteld in de constructor\n    protected get getSVGAttributes(): Record<string, string | number>\n    {\n        return this.SVGAttributes;\n    }\n}\n", "import { SVG } from \"./SVG.js\";\n\nimport { SVGGlobalAttributes } from \"../../../types/attributes.global.type.js\";\n\n/**\n * CreateSVG\n * \n * Basisclass voor het maken van een nieuwe SVG container.\n * Beheert de HTML-element referentie, viewBox en default styling.\n */\nexport class CreateSVG extends SVG \n{\n    // Houdt de hoofdreferentie naar het root <svg>-element vast\n    private root: SVGSVGElement | null = null;\n\n    // Initialiseert de SVG via de basis-klasse en bouwt daarna direct het root-element\n    constructor(\n        SVGHTMLID: string,\n        SVGAttributes: SVGGlobalAttributes,\n        SVGIsDefaultStyling: boolean\n    ) \n    {\n        super(SVGHTMLID, SVGAttributes, SVGIsDefaultStyling);\n        // this.createRootSVG();\n    }\n\n    // Zorgt dat er altijd een geldig root-SVG bestaat.\n    // Controleert eerst of een SVG met deze ID al in de DOM staat.\n    // Zo niet, wordt er een nieuwe SVG aangemaakt met namespace en attributen.\n    public createRootSVG(htmlID: string): void\n    {\n        const currentSVG = document.getElementById(this.getSVGID);\n\n        if (currentSVG) \n        {\n            // Als het element al bestaat, wordt het opnieuw gekoppeld\n            this.root = currentSVG as unknown as SVGSVGElement;\n        } \n        else \n        {\n            // Maak een nieuwe <svg> aan indien deze nog niet bestaat\n            const SVGElement = document.createElementNS(SVG.getSVG_NS(), \"svg\") as SVGSVGElement;\n            SVGElement.setAttribute(\"id\", this.getSVGID);\n\n            // Pas alle meegegeven attributen toe op het nieuwe SVG-element\n            for (const [key, value] of Object.entries(this.getSVGAttributes)) \n                SVGElement.setAttribute(key, String(value));\n\n            // Voeg de nieuwe SVG toe aan de body\n            // document.body.appendChild(SVGElement);\n            document.getElementById(htmlID)?.appendChild(SVGElement)\n            this.root = SVGElement;\n        }\n    }\n\n    // Maakt een nieuw SVG-element aan met de juiste namespace.\n    // Controleert of de tagnaam geldig is voordat het element wordt aangemaakt.\n    private static createSVG_NS<K extends keyof SVGElementTagNameMap>(elementName: K): SVGElementTagNameMap[K] | null \n    {\n        if (!elementName) \n        {\n            console.error(\"No element found!\");\n            return null;\n        }\n\n        return document.createElementNS(SVG.getSVG_NS(), elementName) as unknown as SVGElementTagNameMap[K];\n    }\n\n    // Utility-functie om willekeurige SVG-elementen te maken met optionele attributen.\n    // Geeft null terug als de tagnaam ongeldig is.\n    public static createSVGElement<K extends keyof SVGElementTagNameMap>(\n        elementName: K, \n        options?: Record<string, string | number>\n    ): SVGElementTagNameMap[K] | null \n    {\n        const element = this.createSVG_NS(elementName);\n\n        if (!element) \n        {\n            console.error(\"There is no (elementName) available!\");\n            return null;\n        }\n\n        if (options) \n        {\n            for (const [key, value] of Object.entries(options)) \n                element.setAttribute(key, String(value));\n        }\n\n        return element;\n    }\n\n    // Geeft het root-SVG element terug. \n    // Roept intern de SVG-basisfunctionaliteit aan die attribuutinstellingen toepast.\n    public get getSVGElementRoot(): SVGElement | null \n    {\n        return this.getSVGHTMLIDElement() as SVGElement ?? null;\n    }\n}\n", "import { CreateSVG } from \"./SVGCreate.js\";\n\n/**\n * SVGFactory\n * \n * Algemene factory class voor het cre\u00EBren van SVG elementen binnen een container:\n * - ondersteunt circle, path, rect, text, image, foreignObject, g\n * - kan attributen en styles instellen\n */\nexport class SVGFactory<T extends Record<string, string | number> = Record<string, string | number>>\n{\n    private SVGElement: SVGElement | null = null;\n\n    constructor(\n        private parentSVG: CreateSVG | SVGElement | SVGFactory | null,\n        private SVGNSParam: keyof SVGElementTagNameMap,\n        private options?: T\n    )\n    {\n        this.SVGNSParam = SVGNSParam;\n        this.options = options;\n    }\n\n    // Produceert een nieuw SVG-element aan de hand van de opgegeven tagnaam en attributen.\n    // Wanneer het element nog niet eerder is aangemaakt, wordt het opgebouwd via CreateSVG.createSVGElement().\n    // Vervolgens wordt bepaald welke ouder gebruikt moet worden:\n    // - de root-SVG wanneer parentSVG een CreateSVG-instantie is,\n    // - het reeds gecre\u00EBerde element van een andere SVGFactory,\n    // - of een direct meegegeven SVGElement.\n    // Alleen wanneer er een geldig parent-element gevonden wordt, wordt het nieuwe SVG-element toegevoegd.\n    public createSvgTag(): SVGElement | null\n    {\n        if (!this.SVGElement)\n        {\n            this.SVGElement = CreateSVG.createSVGElement(this.SVGNSParam, this.options);\n\n            if (!this.SVGElement)\n            {\n                console.error(`Can't create <${this.SVGNSParam}> tag or parent SVG is missing.`);\n                return null;\n            }\n\n            let parent: CreateSVG | SVGElement | null = null;\n\n            if (this.parentSVG instanceof CreateSVG) \n            {   \n                parent = this.parentSVG.getSVGElementRoot;\n            } \n            else if (this.parentSVG instanceof SVGFactory) \n            {\n                parent = this.parentSVG.getSVGElement;\n            } \n            else if (this.parentSVG instanceof SVGElement) \n            {\n                parent = this.parentSVG;\n            }\n\n            if (!parent) \n            {\n                return null;\n            }\n\n            parent.appendChild(this.SVGElement);\n        }\n\n        return this.SVGElement;\n    }\n\n    public get getSVGElement(): SVGElement | null\n    {\n        return this.SVGElement as SVGElement | null;\n    }\n}\n", "import { SVGCircleAttributes, SVGClipPathAttributes, SVGGroupAttributes, SVGImageAttributes } from \"../../../../types/attributes\";\n\nimport { CalcCircleProperties } from \"../../../construct/calculations/CalcCircleProperties.js\";\nimport { CreateSVG } from \"../../../construct/core/SVGCreate.js\";\nimport { SVGFactory } from \"../../../construct/core/SVGFactory.js\";\n\nexport class ProfilePicFactory\n{\n    private SVGElement: CreateSVG | null = null;\n    private HTMLIDElement: string = \"homepage-banner-profile-pic-svg\";\n    private viewboxSize: string = \"0 0 1200 1200\";\n    private preserveAspectRatio: string = \"xMidYMid meet\"\n\n    private innerRadius: number = 375;\n    private innerCircumference: number = CalcCircleProperties.calcCircleCircumference(this.innerRadius); \n\n    private smallRadius: number = 390;\n    private mediumRadius: number = 395;\n    private largeRadius: number = 400; \n\n    private createClipPath(): void\n    {\n        const newClipPathElement = new SVGFactory<SVGClipPathAttributes>(this.SVGElement, \"clipPath\", \n        {\n            id: \"circle-inner\"\n        });\n        newClipPathElement.createSvgTag();\n    \n        const newCircleInClipPath = new SVGFactory<SVGCircleAttributes>(newClipPathElement, \"circle\", \n        {\n            cx: 600,\n            cy: 600,\n            r: 300\n        });\n        newCircleInClipPath.createSvgTag();  \n    }\n\n    // Dunne binnenrand van de profielfoto\n    private createThinInnerBorder(): void\n    {\n        const thinInnerGroupFactory = new SVGFactory<SVGGroupAttributes>(this.SVGElement, \"g\",\n        {\n            class: \"thin-inner-border-group\"\n        });\n    \n        const thinInnerGroup = thinInnerGroupFactory.createSvgTag();\n    \n        // Eerste cirkel\n        const firstCircleBlockFactory = new SVGFactory<SVGCircleAttributes>(thinInnerGroup, \"circle\", \n        {\n            class: \"thin-line-first\",\n            cx: \"600\",\n            cy: \"600\",\n            r: this.innerRadius,\n            stroke: \"rgba(46, 204, 113, 0.5)\",\n            \"stroke-width\": \"30\",\n            fill: \"none\",\n            \"stroke-dasharray\": CalcCircleProperties.calcStrokeDasharray(600, this.innerCircumference),\n        });\n        firstCircleBlockFactory.createSvgTag();\n    \n        // Tweede cirkel met dashoffset\n        const secondCircleBlockFactory = new SVGFactory<SVGCircleAttributes>(thinInnerGroup, \"circle\",\n        {\n            class: \"thin-line-second\",\n            cx: \"600\",\n            cy: \"600\",\n            r: this.innerRadius,\n            stroke: \"rgba(46, 204, 113, 0.5)\",\n            \"stroke-width\": \"30\",\n            fill: \"none\",\n            \"stroke-dasharray\": CalcCircleProperties.calcStrokeDasharray(300, this.innerCircumference),\n            \"stroke-dashoffset\": 600,\n        });\n        secondCircleBlockFactory.createSvgTag();\n    \n        // Derde cirkel met dashoffset\n        const thirdCircleBlock = new SVGFactory<SVGCircleAttributes>(thinInnerGroup, \"circle\",\n        {\n            class: \"thin-line-third\",\n            cx: \"600\",\n            cy: \"600\",\n            r: this.innerRadius,\n            stroke: \"rgba(46, 204, 113, 0.5)\",\n            \"stroke-width\": \"30\",\n            fill: \"none\",\n            \"stroke-dasharray\": CalcCircleProperties.calcStrokeDasharray(600, this.innerCircumference),\n            \"stroke-dashoffset\": 1500,\n        });\n        thirdCircleBlock.createSvgTag();\n    }\n\n    // Dikke binnenrand van de profielfoto\n    private createBigInnerBorder(): void\n    {\n        const bigInnerGroupFactory = new SVGFactory<SVGGroupAttributes>(this.SVGElement, \"g\",\n        {\n            class: \"big-inner-border-group\"\n        });\n        const bigInnerGroup = bigInnerGroupFactory.createSvgTag();\n    \n        const firstCircleBlock = new SVGFactory<SVGCircleAttributes>(bigInnerGroup, \"circle\",\n        {\n            class: \"big-line-first\",\n            cx: \"600\",\n            cy: \"600\",\n            r: this.innerRadius,\n            stroke: \"rgba(46, 204, 113, 1)\",\n            \"stroke-width\": \"60\",\n            fill: \"none\",\n            \"stroke-dasharray\": CalcCircleProperties.calcStrokeDasharray(600, this.innerCircumference),\n        });\n        firstCircleBlock.createSvgTag();\n    \n        const secondCircleBlock = new SVGFactory<SVGCircleAttributes>(bigInnerGroup, \"circle\",\n        {\n            class: \"big-line-second\",\n            cx: \"600\",\n            cy: \"600\",\n            r: this.innerRadius,\n            stroke: \"rgba(46, 204, 113, 1)\",\n            \"stroke-width\": \"60\",\n            fill: \"none\",\n            \"stroke-dasharray\": CalcCircleProperties.calcStrokeDasharray(200, this.innerCircumference),\n            \"stroke-dashoffset\": 750\n        });\n        secondCircleBlock.createSvgTag();\n    }\n\n    // Achtergrondcirkels rond de profielfoto\n    private createBackgroundBlocks(): void\n    {\n        const backgroundGroupFactory = new SVGFactory<SVGGroupAttributes>(this.SVGElement, \"g\", \n        {\n            class: \"background-group\"\n        });\n        const backgroundGroup = backgroundGroupFactory.createSvgTag();\n    \n        // Herhaalde achtergrondcirkels met verschillende stroke-width, radius en dashoffset\n        const circleConfigs = [\n            { r: this.innerRadius, width: 140, dash: 100, offset: 0, class: \"background-first bg-child\" },\n            { r: this.smallRadius, width: 360, dash: 120, offset: 135, class: \"background-second bg-child\" },\n            { r: this.mediumRadius, width: 120, dash: 120, offset: 270, class: \"background-third bg-child\" },\n            { r: this.mediumRadius, width: 220, dash: 120, offset: 400, class: \"background-fourth bg-child\" },\n            { r: this.largeRadius, width: 80, dash: 120, offset: 535, class: \"background-fifth bg-child\" },\n            { r: this.largeRadius, width: 270, dash: 120, offset: 665, class: \"background-sixth bg-child\" },\n            { r: this.largeRadius, width: 120, dash: 120, offset: 795, class: \"background-seventh bg-child\" },\n            { r: this.largeRadius, width: 60, dash: 120, offset: 925, class: \"background-eigth bg-child\" },\n            { r: this.innerRadius, width: 400, dash: 120, offset: 1000, class: \"background-ninth bg-child\" },\n            { r: this.mediumRadius, width: 60, dash: 80, offset: 1145, class: \"background-tenth bg-child\" },\n            { r: this.largeRadius, width: 400, dash: 100, offset: 1270, class: \"background-eleventh bg-child\" },\n            { r: this.largeRadius, width: 180, dash: 100, offset: 1380, class: \"background-twelfth bg-child\" },\n            { r: this.largeRadius, width: 80, dash: 120, offset: 1510, class: \"background-thirtheenth bg-child\" },\n            { r: this.largeRadius, width: 380, dash: 120, offset: 1640, class: \"background-fourteenth bg-child\" },\n            { r: this.largeRadius, width: 60, dash: 140, offset: 1790, class: \"background-fifteenth bg-child\" },\n            { r: this.largeRadius, width: 120, dash: 140, offset: 1940, class: \"background-sixteenth bg-child\" },\n            { r: this.largeRadius, width: 350, dash: 140, offset: 2090, class: \"background-seventeenth bg-child\" },\n            { r: this.largeRadius, width: 80, dash: 140, offset: 2240, class: \"background-eigthteenth bg-child\" },\n            { r: this.largeRadius, width: 60, dash: 140, offset: 2395, class: \"background-nineteenth bg-child\" }\n        ];\n    \n        for (const cfg of circleConfigs)\n        {\n            const circle = new SVGFactory<SVGCircleAttributes>(backgroundGroup, \"circle\", \n            {\n                class: cfg.class,\n                cx: \"600\",\n                cy: \"600\",\n                r: cfg.r,\n                stroke: \"rgba(46, 204, 113, 0.1)\",\n                \"stroke-width\": cfg.width,\n                fill: \"none\",\n                \"stroke-dasharray\": CalcCircleProperties.calcStrokeDasharray(cfg.dash, CalcCircleProperties.calcCircleCircumference(cfg.r)),\n                \"stroke-dashoffset\": cfg.offset\n            });\n            circle.createSvgTag();\n        }\n    }\n    \n    // Voeg afbeelding toe binnen clipPath\n    private imageElement(): void\n    {\n        const image = new SVGFactory<SVGImageAttributes>(this.SVGElement, \"image\",\n        {\n            class: \"svg-image\",\n            // href: \"./static/images/myself.webp\",\n            href: \"../static/images/me_HH.png\",\n            x: 300,\n            y: 300,\n            width: 600,\n            height: 600,\n            \"clip-path\": \"url(#circle-inner)\",\n            preserveAspectRatio: \"xMidYMid slice\"\n        });\n        image.createSvgTag();\n    }\n\n    public init()\n    {\n        this.SVGElement = new CreateSVG(\n            this.HTMLIDElement,\n            {\n                viewBox: this.viewboxSize,\n                preserveAspectRatio: this.preserveAspectRatio\n            },\n            true\n        );\n\n        this.createClipPath();\n        this.createThinInnerBorder();\n        this.createBigInnerBorder();\n        this.createBackgroundBlocks();\n        this.imageElement();\n    }\n}", "/**\n * CalcResizeContainer\n * \n * Meet en bewaart de breedte en hoogte van een HTML-element en past deze aan bij window-resize events.\n */\nexport class CalcResizeContainer\n{\n    // Houdt een referentie bij naar het doel-HTML-element en slaat de huidige afmetingen op\n    private contentSelector: string\n    private content: HTMLElement | Element | null = null\n    private contentWidth: number | null = null\n    private contentHeight: number | null = null\n\n    // Initialiseert de container door een element te selecteren via CSS-selector\n    // en leest direct de initi\u00EBle breedte en hoogte uit\n    constructor(contentSelector: string)\n    {\n        this.contentSelector = contentSelector\n    }\n\n    public getDOMContent(): void\n    {\n        const getElement = document.querySelector(`${this.contentSelector}`)\n        \n        if (!getElement)\n            console.error(`Can't find element: ${getElement}`)\n        \n        this.content = getElement\n        this.contentWidth = this.content!.getBoundingClientRect().width\n        this.contentHeight = this.content!.getBoundingClientRect().height\n    }\n\n    // Luistert naar window resize events en update de breedte en hoogte dynamisch\n    public getContentSize(): void\n    {   \n        window.addEventListener(\"resize\", () => {\n            this.contentWidth = this.content!.getBoundingClientRect().width\n            this.contentHeight = this.content!.getBoundingClientRect().height\n        })\n    }   \n \n    // Geeft de huidige hoogte van het element terug\n    public get getContentHeight() : number | null\n    {\n        return this.contentHeight ? this.contentHeight : null\n    }\n}\n", "import { CalcResizeContainer } from \"./CalcResizeContainer.js\"\nimport { Points } from \"../../../types/path.properties.type.js\"\n\n/**\n * CalcPathProperties\n * \n * Biedt methoden om SVG path eigenschappen te berekenen, zoals:\n * innerHeight van een container, viewbox aanpassingen en halfway Y-co\u00F6rdinaten.\n */\nexport class CalcPathProperties\n{\n    // Haalt de hoogte van een gegeven HTML-element of container op via CalcResizeContainer.\n    // Wordt gebruikt om de visuele hoogte van een innerlijke SVG- of contentcontainer te bepalen.\n    public static getInnerHeight(innerContent: string)\n    {\n        const svgHTMLInnerContainer = new CalcResizeContainer(`${innerContent}`)\n        svgHTMLInnerContainer.getDOMContent()\n        const svgHTMLInnerContainerHeight = svgHTMLInnerContainer.getContentHeight\n        return svgHTMLInnerContainerHeight\n    }\n\n    // Converteert de innerHeight (in pixels) naar de bijbehorende SVG viewBox-hoogte\n    // rekening houdend met de viewBox-to-PX ratio.\n    public static changeInnerHeigtToViewbox(innerHeight: number, viewboxToPXRatio: number)\n    {\n        return innerHeight / viewboxToPXRatio\n    }\n\n    // Berekent het verschil tussen de totale viewBox hoogte en de som van innerHeight + andere elementen.\n    // Wordt gebruikt om de ruimte over te houden of correcties toe te passen in het SVG-pad.\n    public static calcSubstractionViewbox(viewboxHeight: number, changedViewboxHeight: number, allButInnerHeight: number)\n    {\n        return Math.round(viewboxHeight - (changedViewboxHeight + allButInnerHeight))\n    }\n\n    // Geeft de halve Y-waarde terug van de hoogste Y-positie in een pad.\n    // Wordt gebruikt als referentiepunt om punten boven of onder de helft van het pad te manipuleren.\n    public static getHalfwayYPointValues(pathParts: Points): number | null\n    {\n        if (!pathParts)\n            return null\n\n        const maxValue = Math.max(...pathParts.map(obj => obj.y))\n        return maxValue / 2\n    }\n}\n", "import { Points } from \"../../types/path.properties.type.js\";\nimport { CalcPathProperties } from \"./calculations/CalcPathProperties.js\";\n\n/**\n * DeconstructPath\n * \n * Beheert het ontleden en aanpassen van SVG path data:\n * - splitst een path op in losse co\u00F6rdinaten\n * - verandert Y-co\u00F6rdinaten\n * - bouwt nieuwe path strings\n */\nexport class DeconstructPath\n{\n    // Parseert een SVG-padstring en extraheert alleen de co\u00F6rdinaatparen achter 'M' en 'L'.\n    // Elke keer dat een pad-commando wordt herkend, wordt het verzamelde co\u00F6rdinaatblok\n    // omgezet naar een {x, y}-object. Aan het einde wordt het laatste blok ook verwerkt.\n    // Output: een lijst met puntobjecten in de volgorde waarin ze in het pad voorkomen.\n    public static getPathParts(path: string) \n    {\n        const pathValues = [\"M\", \"L\"];\n        const pathParts: Array<{ x: number; y: number }> = [];\n\n        let currentValues = \"\";\n\n        for (const char of path) \n        {\n            if (pathValues.includes(char)) \n            {\n                if (currentValues.trim() !== \"\") \n                {\n                    const [px, py] = currentValues.split(\",\").map(s => Number(s.trim()));\n                    pathParts.push({ x: px, y: py });\n                }\n                currentValues = \"\";\n                continue;\n            }\n\n            currentValues += char;\n        }\n\n        if (currentValues.trim() !== \"\") \n        {\n            const [px, py] = currentValues.split(\",\").map(s => Number(s.trim()));\n            pathParts.push({ x: px, y: py });\n        }\n        return pathParts;\n    }   \n\n    // Bouwt uit een lijst punten een valide SVG-pathstring op.\n    // Het eerste punt wordt via een M-commando geplaatst en alle volgende\n    // punten worden met L-commando\u2019s verbonden. Hiermee ontstaat een gesloten of open polyline.\n    public static createNewSVGPathString(points: Array<{ x: number; y: number }>): string\n    {\n        if (points.length === 0) \n            return \"\"\n\n        const parts = [];\n        const first = points[0];\n\n        parts.push(`M${first.x},${first.y}`);\n\n        for (let i = 1; i < points.length; i++) \n        {\n            const p = points[i];\n            parts.push(`L${p.x},${p.y}`);\n        }\n\n        return parts.join(\" \");\n    }\n\n    // Past alleen de Y-waarden aan van punten die boven een berekende drempel liggen.\n    // De drempel (getHalfwayYPointValues) bepaalt vanaf welke hoogte punten moeten zakken.\n    // Elk punt waarvan de Y-waarde groter is dan deze drempel wordt met \u2018substraction\u2019\n    // verlaagd. Daarna wordt een nieuwe pathstring opgebouwd op basis van de aangepaste punten.\n    public static changeY(pathParts: Points, substraction: number): string | null\n    {\n        const newPathParts: Points = [];\n        const getMaxValueY = CalcPathProperties.getHalfwayYPointValues(pathParts)\n\n        if (!getMaxValueY)\n            return null\n\n        for (let i = 0; i < pathParts.length; i++) \n        {\n            const current = { ...pathParts[i] };\n\n            if (i < pathParts.length && current.y > getMaxValueY)\n            {\n                current.y -= substraction\n                newPathParts.push(current);\n                continue;\n            }\n\n            newPathParts.push(current);\n        }\n\n        const newStringPath = DeconstructPath.createNewSVGPathString(newPathParts)\n        return newStringPath;\n    }\n}", "import { FourSides, FourSidesInner } from \"../../types/path.properties.type.js\"\nimport { DeconstructPath } from \"./DeconstructPath.js\"\n\nexport class CreateSides\n{\n    // Haalt alle punten uit het oorspronkelijke pad op en verdeelt deze in vier zijdes:\n    // top, right, bottom en left. Zorgt dat het pad sluit zonder dubbele laatste punten.\n    public static getEachSide(path: string): FourSides | null \n    {\n        const basePath = path\n\n        if (!basePath)\n            return null\n\n        const outerPathArray = DeconstructPath.getPathParts(basePath) // Parse de volledige PATH-string naar losse punten\n        const filteredLastItem = [...outerPathArray]\n\n        // Verwijder het laatste punt als dit exact gelijk is aan het beginpunt\n        if (\n            filteredLastItem.length > 1 && \n            filteredLastItem[0].x === filteredLastItem[filteredLastItem.length - 1].x &&\n            filteredLastItem[0].y === filteredLastItem[filteredLastItem.length - 1].y \n        )\n        {\n            filteredLastItem.pop()\n        }\n\n        const borderTop =    []\n        const borderRight =  []\n        const borderBottom = []\n        const borderLeft =   []\n\n        const xPoints = outerPathArray.map(p => p.x) // Verzamel alle X-co\u00F6rdinaten\n        const yPoints = outerPathArray.map(p => p.y) // Verzamel alle Y-co\u00F6rdinaten\n\n        const minX = Math.min(...xPoints) // Linkergrens\n        const maxX = Math.max(...xPoints) // Rechtergrens\n        const minY = Math.min(...yPoints) // Bovengrens\n        const maxY = Math.max(...yPoints) // Ondergrens\n\n        // Doorloop alle punten en bepaal per punt tot welke zijde het hoort.\n        // Voor elk punt wordt de afstand berekend tot de vier uiterste grenzen (minY, maxY, minX, maxX).\n        // De zijde met de kleinste afstand bepaalt waar het punt geometrisch het dichtst bij ligt,\n        // waardoor het punt wordt toegewezen aan top, right, bottom of left.\n        for (let i = 0; i < filteredLastItem.length; i++)\n        {\n            const point = filteredLastItem[i]\n        \n            const distanceTop    = Math.abs(point.y - minY)\n            const distanceBottom = Math.abs(point.y - maxY)\n            const dLeft          = Math.abs(point.x - minX)\n            const distanceRight  = Math.abs(point.x - maxX)\n        \n            const smallest = Math.min(distanceTop, distanceBottom, dLeft, distanceRight)\n\n            // Kleinste afstand bepaalt tot welke zijde het punt behoort\n            switch (smallest) \n            {\n                case distanceTop:\n                    borderTop.push(point)\n                    continue\n\n                case distanceRight:\n                    borderRight.push(point)\n                    continue\n\n                case distanceBottom:\n                    borderBottom.push(point)\n                    continue\n\n                default:\n                    borderLeft.push(point)\n            }\n        }\n\n        return {\n            top: borderTop,\n            right: borderRight,\n            bottom: borderBottom,\n            left: borderLeft\n        }\n    }\n    \n    // Berekent de offset-versie van alle zijdes en geeft nieuwe punten terug voor de binnenste contour\n    public static mutateOffsetPath(sides: FourSides, offset: number): FourSidesInner \n    {\n        const minYTop  = Math.min(...sides.top.map(p => p.y)) // Hoogste punt van de bovenrand\n        const maxXRight = Math.max(...sides.right.map(p => p.x)) // Verst uitstekende X op de rechterrand\n        const maxYBottom = Math.max(...sides.bottom.map(p => p.y)) // Laagste punt van de onderrand\n        const minXLeft = Math.min(...sides.left.map(p => p.x)) // Verst naar links uitstekende X op de linkerrand\n    \n        const innerTop = []\n        const innerRight = []\n        const innerBottom = []\n        const innerLeft = []\n\n        // Verwerk alle punten van de bovenkant en verschuif ze naar binnen\n        if (sides.top)\n        {\n            // Als er maar 1 item in de Array staat\n            if (sides.top.length <= 1)\n            {\n                const newPoints = {\n                    x: sides.top[0].x - offset * 2, // Compenseert horizontale inwaartse verschuiving (2 = niet correct!@#$)\n                    y: sides.top[0].y + offset // Schuift lijn naar beneden\n                }\n                innerTop.push(newPoints)\n            }\n\n            for (let i = 0; i < sides.top.length - 1; i++)\n            {\n                if (sides.top[i].y === sides.top[i + 1].y) // Alleen verwerken als lijn horizontaal is\n                {\n                    if (sides.top[i].y === minYTop && sides.top[i + 1].y === minYTop)\n                    {\n                        const newFirstPoints = { \n                            x: sides.top[i].x + offset, \n                            y: sides.top[i].y + offset * 2 // Duwt de volledige bovenrand naar binnen\n                        }\n                        const newSecondPoints = { \n                            x: sides.top[i + 1].x - offset, \n                            y: sides.top[i + 1].y + offset * 2 \n                        }\n\n                        innerTop.push(newFirstPoints, newSecondPoints)\n                    }\n                    else\n                    {\n                        const newFirstPoints = { \n                            x: sides.top[i].x - offset, \n                            y: sides.top[i].y + offset * 2 // Corrigeert afwijkende vormen in de bovenrand\n                        }               \n                        const newSecondPoints = { \n                            x: sides.top[i + 1].x + offset, \n                            y: sides.top[i + 1].y + offset * 2\n                        }\n\n                        innerTop.push(newFirstPoints, newSecondPoints)\n                    }\n                }\n            }\n        }\n        \n        // Verwerk rechterkant en verschuif verticaal naar binnen\n        if (sides.right)\n        {\n            if (sides.right.length <= 1)\n            {\n                const newPoints = {\n                    x: sides.right[0].x - offset * 2, // Schuift rechterrand naar links\n                    y: sides.right[0].y - offset // Past verticale richting aan\n                }\n                innerRight.push(newPoints)\n            }\n\n            for (let i = 0; i < sides.right.length - 1; i++)\n            {\n                if (sides.right[i].x ===  sides.right[i + 1].x) // Alleen verticale lijnen\n                {\n                    if (sides.right[i].x === maxXRight && sides.right[i + 1].x === maxXRight)\n                    {\n                        const newFirstPoints = { \n                            x: sides.right[i].x - offset * 2, \n                            y: sides.right[i].y + offset\n                        }\n                        const newSecondPoints = { \n                            x: sides.right[i + 1].x - offset * 2, \n                            y: sides.right[i + 1].y - offset\n                        }\n\n                        innerRight.push(newFirstPoints, newSecondPoints)\n                    }\n                    else\n                    {\n                        const newFirstPoints = { \n                            x: sides.right[i].x - offset * 2, \n                            y: sides.right[i].y - offset\n                        }               \n                        const newSecondPoints = { \n                            x: sides.right[i + 1].x - offset * 2, \n                            y: sides.right[i + 1].y + offset\n                        }\n\n                        innerRight.push(newFirstPoints, newSecondPoints)\n                    }\n                }\n            }\n        }\n\n        // Verwerk onderkant en verschuif naar boven\n        if (sides.bottom)\n        {\n            if (sides.bottom.length <= 1)\n            {\n                const newPoints = {\n                    x: sides.bottom[0].x + offset,  // Schuift horizontaal naar binnen\n                    y: sides.bottom[0].y - offset * 2 // Duwt onderrand omhoog\n                }\n                innerBottom.push(newPoints)\n            }\n\n            for (let i = 0; i < sides.bottom.length - 1; i++)\n            {\n                if (sides.bottom[i].y === sides.bottom[i + 1].y)\n                {       \n                    if (\n                        sides.bottom[i].y === maxYBottom && \n                        sides.bottom[i + 1].y === maxYBottom\n                    )\n                    {\n                        const newFirstPoints = { \n                            x: sides.bottom[i].x - offset, \n                            y: sides.bottom[i].y - offset * 2 \n                        }\n                        const newSecondPoints = { \n                            x: sides.bottom[i + 1].x + offset, \n                            y: sides.bottom[i + 1].y - offset * 2 \n                        }\n\n                        innerBottom.push(newFirstPoints, newSecondPoints)\n                    }\n                    else\n                    {\n                        const newFirstPoints = { \n                            x: sides.bottom[i].x + offset, \n                            y: sides.bottom[i].y - offset * 2\n                        }               \n                        const newSecondPoints = { \n                            x: sides.bottom[i + 1].x - offset, \n                            y: sides.bottom[i + 1].y - offset * 2\n                        }\n\n                        innerBottom.push(newFirstPoints, newSecondPoints)\n                    }\n                }\n            }\n        }\n\n        // Verwerk linkerkant en verschuif naar rechts\n        if (sides.left)\n        {\n            if (sides.left.length <= 1)\n            {\n                const newPoints = {\n                    x: sides.left[0].x + offset * 2, // Duwt linkerrand naar rechts\n                    y: sides.left[0].y - offset // Corrigeert verticaal\n                }\n                innerLeft.push(newPoints)\n            }\n            \n            for (let i = 0; i < sides.left.length - 1; i++)\n            {\n                if (sides.left[i].x ===  sides.left[i + 1].x)\n                {\n                    if (\n                        sides.left[i].x === minXLeft && \n                        sides.left[i + 1].x === minXLeft\n                    )\n                    {\n                        const newFirstPoints = { \n                            x: sides.left[i].x + offset * 2, \n                            y: sides.left[i].y - offset\n                        }\n                        const newSecondPoints = { \n                            x: sides.left[i + 1].x + offset * 2, \n                            y: sides.left[i + 1].y + offset\n                        }\n\n                        innerLeft.push(newFirstPoints, newSecondPoints)\n                    }\n                    else\n                    {\n                        const newFirstPoints = { \n                            x: sides.left[i].x + offset * 2, \n                            y: sides.left[i].y + offset\n                        }               \n                        const newSecondPoints = { \n                            x: sides.left[i + 1].x + offset * 2, \n                            y: sides.left[i + 1].y - offset\n                        }\n\n                        innerLeft.push(newFirstPoints, newSecondPoints)\n                    }\n                }\n            }\n\n            // Sluit de binnenste contour aan op het eerste punt van de bovenrand\n            innerLeft.push(innerTop[0])\n        }\n\n        return { innerTop, innerRight, innerBottom, innerLeft }\n    }\n\n    // Merge alle nieuwe inner waardes tot 1 Array\n    public static mergePathArray(sides: FourSidesInner): Array<{ x: number, y: number }>\n    {\n        const newPath: Array<{ x: number, y: number }> = [\n            ...sides.innerTop,\n            ...sides.innerRight,\n            ...sides.innerBottom,\n            ...sides.innerLeft\n        ]\n\n        return newPath\n    }\n}", "import { FourSides, FourSidesInner } from \"../../types/path.properties.type\"\nimport { DeconstructPath } from \"./DeconstructPath.js\"\nimport { CreateSides } from \"./CreateSides.js\"\n\nexport class InnerPath \n{\n    // Maak nieuwe Offset PATH string van de gegeven PATH en padding\n    // Zie het als een border om het gegeven PATH heen\n    public static buildOffsetPath(path: string, padding: number): string\n    {\n        const eachSideObjects = CreateSides.getEachSide(path)\n        const mutateOffsetPath =  CreateSides.mutateOffsetPath(eachSideObjects!, padding)\n        const mergeArrayOfObjects = CreateSides.mergePathArray(mutateOffsetPath)\n        const createStringPath = DeconstructPath.createNewSVGPathString(mergeArrayOfObjects)\n\n        return createStringPath\n    }\n\n    public static buildOffsetPathHexagon(path: string, padding: number): string {\n        const eachSideObjects = DeconstructPath.getPathParts(path)\n    \n        // Verwijder laatste punt als het dubbel is\n        if (\n            eachSideObjects[0].x === eachSideObjects[eachSideObjects.length - 1].x &&\n            eachSideObjects[0].y === eachSideObjects[eachSideObjects.length - 1].y\n        ) {\n            eachSideObjects.pop()\n        }\n    \n        const n = eachSideObjects.length\n        const newInnerValues = []\n    \n        // Hulpfuncties\n        function normalize(v: { x: number; y: number }) \n        {\n            const len = Math.hypot(v.x, v.y)\n            return { x: v.x / len, y: v.y / len }\n        }\n    \n        function intersect(a: any, b: any, c: any, d: any) \n        {\n            const det = (a.x - b.x) * (c.y - d.y) - (a.y - b.y) * (c.x - d.x)\n            if (det === 0) return null\n            const t =((a.x - c.x) * (c.y - d.y) - (a.y - c.y) * (c.x - d.x)) / det\n            return { x: a.x + t * (b.x - a.x), y: a.y + t * (b.y - a.y) }\n        }\n    \n        for (let i = 0; i < n; i++) \n        {\n            const prev = eachSideObjects[(i - 1 + n) % n]\n            const curr = eachSideObjects[i]\n            const next = eachSideObjects[(i + 1) % n]\n        \n            // Vorige zijde vector\n            const dx1 = curr.x - prev.x\n            const dy1 = curr.y - prev.y\n            // const normal1 = normalize({ x: dy1, y: -dx1 }) // naar binnen loodrecht\n        \n            // Volgende zijde vector\n            const dx2 = next.x - curr.x\n            const dy2 = next.y - curr.y\n            // const normal2 = normalize({ x: dy2, y: -dx2 }) // naar binnen loodrecht\n\n            const normal1 = normalize({ x: dy1, y: -dx1 }) // altijd naar binnen\n            const normal2 = normalize({ x: dy2, y: -dx2 }) // altijd naar binnen\n\n            // inner padding naar binnen toepassen\n            const a1 = { x: prev.x - normal1.x * padding, y: prev.y - normal1.y * padding }\n            const b1 = { x: curr.x - normal1.x * padding, y: curr.y - normal1.y * padding }\n            const a2 = { x: curr.x - normal2.x * padding, y: curr.y - normal2.y * padding }\n            const b2 = { x: next.x - normal2.x * padding, y: next.y - normal2.y * padding }\n        \n            const p = intersect(a1, b1, a2, b2)\n            if (p) newInnerValues.push(p)\n        }\n    \n        const newPath = DeconstructPath.createNewSVGPathString(newInnerValues)\n\n        return newPath\n    }\n\n\n}\n", "import { CreateSVG } from \"../../../../construct/core/SVGCreate.js\";\nimport { SVGFactory } from \"../../../../construct/core/SVGFactory.js\";\n\n/**\n * LanguageAddedFeatures\n * \n * Voegt extra visuele features toe aan een hoofd-SVG container:\n * - Zijbalken\n * - Tekstblokken (foreignObject)\n */\nexport class LanguageAddedFeatures\n{\n    // Cre\u00EBert de zijbalken aan de linker- en rechterkant van het hoofd-SVG container\n    public static createSideBars(container: CreateSVG): void \n    {\n        // Maak een <g> groep aan voor de zijbalken\n        const sidebarGroupFactory = new SVGFactory(container, \"g\",\n        {\n            class: \"big-main-border-group\",\n        });\n\n        const sidebarGroup = sidebarGroupFactory.createSvgTag();\n\n        // Definieer de SVG pad-co\u00F6rdinaten voor linker- en rechterzijbalk\n        const barLeftPath = \"M10,515 L25,500 L25,175 L10,160 Z\";\n        const barRightPath = \"M990,160 L975,175 L975,500 L990,515 Z\";\n\n        // Maak linkerzijbalk\n        const leftBar = new SVGFactory(sidebarGroup, \"path\",\n        {\n            id: \"big-sidebar-left\",\n            d: barLeftPath,\n            fill: \"#2ecc71\",\n            stroke: \"rgba(6, 10, 18, 0.7)\",\n            \"stroke-opacity\": \"1\",\n            \"stroke-width\": 8\n        });\n        leftBar.createSvgTag();\n\n        // Maak rechterzijbalk\n        const rightBar = new SVGFactory(sidebarGroup, \"path\",\n        {\n            id: \"big-sidebar-right\",\n            d: barRightPath,\n            fill: \"#2ecc71\",\n            stroke: \"rgba(6, 10, 18, 0.7)\",\n            \"stroke-opacity\": \"1\",\n            \"stroke-width\": 8\n        });\n        rightBar.createSvgTag();\n    }\n\n    // Cre\u00EBert een tekstblok in het hoofd-SVG container\n    public static createTextInSVG(container: CreateSVG): void \n    {\n        // Maak een <g> groep aan voor de tekst\n        const textGroupFactory = new SVGFactory(container, \"g\",\n        {\n            class: \"main-border-text-group\"\n        });\n        \n        const textGroup = textGroupFactory.createSvgTag(); \n\n        // Voeg een foreignObject toe om HTML content binnen SVG te plaatsen\n        const foreignObject = new SVGFactory(textGroup, \"foreignObject\",\n            {\n                x: 50,\n                y: 50,\n                width: 900,\n                height: 580\n            });\n\n        foreignObject.createSvgTag();\n\n        // Plaats een <div> binnen de foreignObject om tekst te stylen\n        if (foreignObject.getSVGElement) {\n            const div = document.createElement(\"div\");\n            div.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\");\n            div.style.width = \"100%\";\n            div.style.height = \"100%\";\n            div.style.padding = \"2.5rem\";\n            div.style.display = \"flex\";\n            div.style.lineHeight = \"1.5\";\n            div.style.justifyContent = \"center\";\n            div.style.alignItems = \"center\";\n            div.style.fontStyle = \"italic\";\n            div.style.fontSize = \"54px\";\n            div.style.fontFamily = \"Courier Prime, monospace\";\n            div.style.color = \"rgba(51, 81, 142, 1)\";\n            div.innerText = '\"Ik beschik over een goede basis in meerdere programmeertalen, vooral in Python en JavaScript. En ik blijf mijn kennis verder uitbreiden.\"';\n\n            foreignObject.getSVGElement.appendChild(div);\n        }\n    }\n}\n", "import { SVGFactory } from \"../core/SVGFactory.js\";\n\nexport class CreateGradient\n{\n    // Maak linear gradient voor segment\n    public static createSegmentGradient(\n        defs: SVGElement, \n        firstPoint: {x:number, y:number}, \n        offset: {x:number, y:number}, \n        index: number\n    )\n    {\n        const gradId = `innerGlowGrad_${index}`;\n        const grad = new SVGFactory(defs, \"linearGradient\", {\n            id: gradId,\n            x1: firstPoint.x.toString(),\n            y1: firstPoint.y.toString(),\n            x2: (firstPoint.x + offset.x).toString(),\n            y2: (firstPoint.y + offset.y).toString(),\n            gradientUnits: \"userSpaceOnUse\"\n        }).createSvgTag();\n    \n        new SVGFactory(grad, \"stop\", \n            { \n                offset: \"0%\", \n                \"stop-color\": \"rgba(2, 10, 26, 0.4)\"\n                // \"stop-color\": \"rgba(51, 81, 142, 0.05)\" \n            }).createSvgTag();\n        new SVGFactory(grad, \"stop\", { offset: \"60%\", \"stop-color\": \"rgba(10,20,35,0)\" }).createSvgTag();\n        \n        return gradId;\n    }\n}", "import { CreateSVG } from \"../core/SVGCreate.js\";\nimport { SVGFactory } from \"../core/SVGFactory.js\";\n\nexport class DrawSegments\n{\n    // Teken segment tussen outer en inner points\n    public static drawSegment(container: CreateSVG, firstPoint:{x:number,y:number}, secondPoint:{x:number,y:number}, firstPointNextP:{x:number,y:number}, secondPointNextP:{x:number,y:number}, gradId: string)\n    {\n        const segmentPath =\n            `M ${firstPoint.x},${firstPoint.y} \n             L ${secondPoint.x},${secondPoint.y} \n             L ${secondPointNextP.x},${secondPointNextP.y} \n             L ${firstPointNextP.x},${firstPointNextP.y} Z`;\n    \n        new SVGFactory(container, \"path\", {\n            d: segmentPath,\n            fill: `url(#${gradId})`,\n            pointerEvents: \"none\"\n        }).createSvgTag();\n    }\n}", "export class OffsetVector\n{\n    // Bereken offset vector (loodrecht op segment, lengte = OFFSET)\n    public static computeOffsetVector(p0: {x:number, y:number}, p1: {x:number, y:number}, offset: number)\n    {\n        let nx = -(p1.y - p0.y);\n        let ny = p1.x - p0.x;\n        const len = Math.sqrt(nx*nx + ny*ny);\n        if(len === 0) return {x:0, y:0};\n        nx /= len; ny /= len;\n        return { x: nx * offset, y: ny * offset };\n    }\n}", "import { CreateSVG } from \"../../../../construct/core/SVGCreate.js\";\nimport { SVGFactory } from \"../../../../construct/core/SVGFactory.js\";\nimport { DeconstructPath } from \"../../../../construct/DeconstructPath.js\";\nimport { CreateGradient } from \"../../../../construct/gradient/CreateGradient.js\";\nimport { DrawSegments } from \"../../../../construct/gradient/DrawSegments.js\";\nimport { OffsetVector } from \"../../../../construct/gradient/OffsetVector.js\";\n\nexport class LanguageMainSVG\n{\n    public static createOuterBorder(svg: CreateSVG, path: string, innerPath: string): void\n    {\n        new SVGFactory(svg, \"path\", {\n            d: path,\n            stroke: \"rgba(51, 81, 142, 0.0)\",\n            // stroke: \"none\",\n            \"stroke-width\": 2,\n            // fill: \"rgba(51, 81, 142, 0.05)\"\n            fill: \"rgba(22, 44, 88, 0.05)\"\n            // fill: \"none\"\n        }).createSvgTag()\n\n        const defs = new SVGFactory(svg, \"defs\").createSvgTag();\n\n        const OFFSET = 50;\n\n        const outerPoints = DeconstructPath.getPathParts(path);\n        const innerPoints = DeconstructPath.getPathParts(innerPath);\n\n        for (let i = 0; i < outerPoints.length - 1; i++)\n        {\n            const [p0, p1] = [outerPoints[i], outerPoints[i + 1]];\n            const [p0A, p1A] = [innerPoints[i], innerPoints[i + 1]];\n\n            const offsetVector = OffsetVector.computeOffsetVector(p0, p1, OFFSET)\n            const gradId = CreateGradient.createSegmentGradient(defs!, p0, offsetVector, i);\n            DrawSegments.drawSegment(svg, p0, p1, p0A, p1A, gradId);\n        }\n    }\n}", "import { InitPath } from \"../../../../construct/InitPath.js\"\nimport { InnerPath } from \"../../../../construct/InnerPath.js\"\nimport { CreateSVG } from \"../../../../construct/core/SVGCreate.js\"\n\nimport { LanguageAddedFeatures } from \"./LanguageAddedFeatures.js\"\nimport { LanguageMainSVG } from \"./LanguageMainSVG.js\"\n\nexport const outerPath = \"M25,0 L200,0 L250,50 L750,50 L800,0 L975,0 L1000,25 L1000,150 L975,175 L975,500 L1000,525 L1000,650 L975,675 L800,675 L775,650 L225,650 L200,675 L25,675 L0,650 L0,525 L25,500 L25,175 L0,150 L0,25 L25,0\"\n\n\nconst viewboxWidth = 1006 \nconst viewboxHeight = 682\n\nconst HARDCODED_OUTER_PADDING = 60\n\nconst createStringInnerContainerPath = InnerPath.buildOffsetPath(outerPath, HARDCODED_OUTER_PADDING)\n\nlet mainContainer: CreateSVG | null = null\n\nconst svgElement = document.getElementById(\"homepage-language-main-svg\")\n\nif (svgElement) {\n    mainContainer = new CreateSVG(\n        \"homepage-language-main-svg\",\n        {\n            viewBox: `-5 -5 ${viewboxWidth} ${viewboxHeight}`,\n            preserveAspectRatio: \"xMidYMid meet\"\n        },\n        true\n    )\n}\n\nexport function exportClass(): null | void\n{\n    if (!mainContainer) \n        return null\n\n\n    LanguageAddedFeatures.createSideBars(mainContainer)\n\n    // InitPath.createBorderParts(mainContainer, outerPath, createStringInnerContainerPath, \"language\")\n\n    LanguageMainSVG.createOuterBorder(mainContainer, outerPath, createStringInnerContainerPath)\n\n    LanguageAddedFeatures.createTextInSVG(mainContainer)\n}", "export class Fetch\n{\n    static async fetchList<T>(endpoint: string): Promise<T[]>\n    {\n        const response = await fetch(`/api/${endpoint}`)\n        \n        if (!response.ok) \n            throw new Error(endpoint)\n        \n        return response.json() as Promise<T[]>\n    }\n\n    static async fetchDetail<T>(endpoint: string): Promise<T>\n    {\n        const response= await fetch(`/api/${endpoint}`)\n        \n        if (!response.ok) \n            throw new Error(endpoint)\n        \n        return response.json() as Promise<T>\n    }\n}", "import { LanguageInterface } from \"../../interfaces/api/LanguageInterface\";\nimport { Fetch } from \"../utils/Fetch.js\";\n\nexport class LanguageService\n{\n    private static readonly filteredItems: Array<string> = [\"MicroPython\", \"HTML\", \"CSS\", \"JavaScript\"]\n\n    public static async filterItems(): Promise<LanguageInterface[]>\n    {\n        const languages = await Fetch.fetchList<LanguageInterface>(\"languages\");\n        return languages.filter(row => !this.filteredItems.includes(row.name))\n    } \n}", "import { LanguageInterface } from \"../../../../../interfaces/api/LanguageInterface\";\nimport { CreateSVG } from \"../../../../construct/core/SVGCreate.js\"; \nimport { InitPath } from \"../../../../construct/InitPath.js\";\nimport { InnerPath } from \"../../../../construct/InnerPath.js\";\n\nimport { LanguageService } from \"../../../../../endpoints/service/LanguageService.js\";\nimport { SVGFactory } from \"../../../../construct/core/SVGFactory.js\";\nimport { DeconstructPath } from \"../../../../construct/DeconstructPath.js\";\nimport { OffsetVector } from \"../../../../construct/gradient/OffsetVector.js\";\nimport { CreateGradient } from \"../../../../construct/gradient/CreateGradient.js\";\nimport { DrawSegments } from \"../../../../construct/gradient/DrawSegments.js\";\n\n\nconst cornerPoint = 50;\n\n// SVG pad voor de buitenrand van een klein taalcontainer SVG\nconst outerPath = `M60,0 L200,0 L250,50 L750,50 L800,0 L940,0 L1000,${cornerPoint} L1000,150 L950,175 L950,500 L1000,525 L1000,625 L940,675 L800,675 L775,650 L225,650 L200,675 L60,675 L0,625 L0,525 L${cornerPoint},500 L${cornerPoint},175 L0,150 L0,${cornerPoint} L60,0 M1000,175 L965,195 L965,275 L1000,255 L1000,175 M1000,275 L965,295 L965,375 L1000,355 L1000,275`;\n\n// M1000,175 L965,195 L965,275 L1000,255 L1000,175\n// M1000,275 L965,295 L965,375 L1000,355 L1000,275\n// M1000,375 L965,395 L965,475 L1000,455 L1000,375\n\n\n\n/**\n * LanguageSmallContainerHTML\n * \n * Cre\u00EBert kleine SVG containers voor elke taal, inclusief een foreignObject met icon en label.\n * Haalt data op uit een API endpoint.\n */\nclass LanguageSmallContainerHTML\n{\n    private languageName: LanguageInterface[] = [];\n\n    // Maakt de kleine SVG containers aan op basis van API-data\n    public async createSmallSVGContainers(): Promise<SVGElement[] | null> \n    {\n        const container = document.querySelector(\".homepage-languages-small\");\n\n        if (!container) \n            return null;\n\n        const data = await this.getAPIData();\n        const svgElements: SVGElement[] = [];\n\n        // Voor elke taal een SVG container en bijbehorende div maken\n        for (const lang of data) \n        {\n            const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n            svg.id = `${lang.name}-svg`;\n            svg.classList.add(\"homepage-small-svg\");\n            container.appendChild(svg);\n            svgElements.push(svg);\n\n            // Binnen de SVG een foreignObject toevoegen voor HTML content\n            this.createDivContainer(lang, svg);\n        }\n\n        return svgElements;\n    }\n\n    // Voegt een foreignObject toe met icon en label in de SVG\n    private createDivContainer(language: LanguageInterface, svg: SVGElement)\n    {\n        const foreign = document.createElementNS(\"http://www.w3.org/2000/svg\", \"foreignObject\");\n        foreign.setAttribute(\"width\", \"100%\");\n        foreign.setAttribute(\"height\", \"100%\");\n\n        // Wrapper div voor styling van icon en label\n        const wrapper = document.createElement(\"div\");\n        wrapper.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\");\n        wrapper.style.cssText = `\n            width:100%; height:100%; display:flex;\n            flex-direction:column; align-items:center;\n            justify-content:center; gap:10px;\n        `;\n\n        // Icon div met devicon class\n        const icon = document.createElement(\"div\");\n        icon.className = `devicon-${language.svg_url.toLowerCase()}-plain`;\n        icon.style.cssText = \"font-size:60px; color:rgba(51, 81, 142, 1);\";\n\n        // Label met taalnaam\n        const label = document.createElement(\"p\");\n        label.style.cssText = \"margin:0; font-size:28px; color:rgba(51, 81, 142, 1);\";\n        label.textContent = language.name === \"azuresqldatabase\" ? \"SQL\" : language.name;\n        // Voeg icon en label toe aan wrapper en wrapper aan foreignObject\n        wrapper.append(icon, label);\n        foreign.appendChild(wrapper);\n\n        // Sla foreignObject op als property van de SVG element\n        (svg as any)._foreignObject = foreign;\n    }\n\n    // Haalt talen data op van API\n    public async getAPIData(): Promise<LanguageInterface[]>\n    {\n        // const fetcher = await Fetch.fetchJSON<LanguageInterface>(\"languages\");\n        const fetcher = await LanguageService.filterItems()\n        // const result = await fetcher.fetchJsonData();\n        this.languageName = fetcher;\n\n        return fetcher;\n    }\n}\n\n/**\n * LanguageSmallBorder\n * \n * Beheert het tekenen van inner paths binnen kleine taal-SVG containers.\n * Zorgt voor schaling van de path naar nieuwe afmetingen.\n */\nexport class LanguageSmallBorder\n{\n    // Haalt de SVG elementen op\n    public async getHTMLElement(): Promise<SVGElement[] | null> \n    {\n        const container = new LanguageSmallContainerHTML();\n        const elements = await container.createSmallSVGContainers();\n        return elements && elements.length > 0 ? elements : null;\n    }\n\n    // Cre\u00EBert binnenrand pad voor elke kleine SVG container\n    public async createInnerPath(): Promise<void | null>\n    {\n        const svgElements = (await this.getHTMLElement())?.filter(\n            (el): el is SVGElement => el instanceof SVGElement\n        );\n\n        if (!svgElements) return null;\n\n        for (const svg of svgElements) \n        {\n            const newW = 300;\n            const newH = 225;\n\n            // Schaal het pad naar nieuwe afmetingen van de kleine SVG\n            const scaledPath = this.dynamicPathScale(outerPath, 1006, 682, newW, newH);\n\n            // Maak een MainBorder instantie voor deze kleine SVG\n            const main = new CreateSVG(\n                svg.id,\n                { viewBox: `-1 -1 ${newW} ${newH}`, preserveAspectRatio: \"xMidYMid meet\" },\n                true\n            );\n\n\n            new SVGFactory(main, \"path\", {\n                d: scaledPath,\n                stroke: \"rgba(51, 81, 142, 0.25)\",\n                // stroke: \"none\",\n                // stroke: \"none\",\n                \"stroke-width\": 1,\n                fill: \"rgba(22, 44, 88, 0.05)\"\n            }).createSvgTag()\n\n\n            // const innerPath = InnerPath.buildOffsetPath(scaledPath, 5)\n\n            // this.createGradientSmall(main, scaledPath, innerPath)\n\n\n            // Voeg het foreignObject met HTML content toe aan de SVG\n            const foreign = (svg as any)._foreignObject;\n            svg.appendChild(foreign);\n        }\n    }\n\n\n    // WERKT NIET!@$@ --- INNERSHADOW WORDT NIET CORRECT TOEGEVOEGD!\n    public createGradientSmall(svg: CreateSVG, path: string, innerPath: string): void\n    {\n        const defs = new SVGFactory(svg, \"defs\").createSvgTag();\n\n        const OFFSET = 1000;\n\n        const outerPoints = DeconstructPath.getPathParts(path);\n        const innerPoints = DeconstructPath.getPathParts(innerPath);\n\n        for (let i = 0; i < outerPoints.length - 1; i++)\n        {\n            const [p0, p1] = [outerPoints[i], outerPoints[i + 1]];\n            const [p0A, p1A] = [innerPoints[i], innerPoints[i + 1]];\n\n            const offsetVector = OffsetVector.computeOffsetVector(p0, p1, OFFSET)\n            const gradId = CreateGradient.createSegmentGradient(defs!, p0, offsetVector, i);\n            DrawSegments.drawSegment(svg, p0, p1, p0A, p1A, gradId);\n        }\n    }\n\n    /**\n     * Schaalt een SVG-path proportioneel naar een nieuwe breedte en hoogte.\n     *\n     * Wat dit doet:\n     * - Neemt een SVG path-string met absolute M- en L-commando\u2019s\n     * - Berekent schaalfactoren op basis van oude en nieuwe afmetingen\n     * - Vermenigvuldigt elke x- en y-co\u00F6rdinaat met deze factoren\n     * - Geeft een nieuwe path-string terug die exact dezelfde vorm heeft,\n     *   maar geschaald is naar het nieuwe formaat\n     *\n     * Beperkingen:\n     * - Werkt alleen met absolute SVG-commando\u2019s (M, L)\n     * - Ondersteunt geen curves (C, Q, A, etc.)\n     */\n    private dynamicPathScale(\n        path: string,\n        origW: number,\n        origH: number,\n        newW: number,\n        newH: number\n    ): string\n    {\n        // Bepaal de horizontale schaalfactor\n        // Bijvoorbeeld: 300 / 1000 = 0.3\n        const scaleX = newW / origW;\n\n        // Bepaal de verticale schaalfactor\n        // Bijvoorbeeld: 225 / 750 = 0.3\n        const scaleY = newH / origH;\n\n        /**\n         * Regex-uitleg:\n         * ([ML])        \u2192 vangt het SVG-commando M of L\n         * \\s*           \u2192 optionele spaties\n         * ([\\d.]+)      \u2192 x-co\u00F6rdinaat (getal)\n         * ,             \u2192 komma\n         * ([\\d.]+)      \u2192 y-co\u00F6rdinaat (getal)\n         *\n         * Voorbeeld match:\n         * \"L250,50\"\n         * cmd = \"L\"\n         * x   = \"250\"\n         * y   = \"50\"\n         */\n        return path.replace(\n            /([ML])\\s*([\\d.]+),([\\d.]+)/g,\n            (_, cmd, x, y) =>\n            {\n                // Zet strings om naar getallen en schaal ze\n                const scaledX = parseFloat(x) * scaleX;\n                const scaledY = parseFloat(y) * scaleY;\n\n                // Bouw het SVG-commando opnieuw op\n                return `${cmd}${scaledX},${scaledY}`;\n            }\n        );\n    }\n}\n", "// import { FetchData } from \"../../../edpoints/services/FetchData.js\"\nimport { Fetch } from \"../../endpoints/utils/Fetch.js\"\nimport { ProjectsInterface } from \"../../interfaces/api/ProjectsInterface.js\"\nimport { ProjectsType } from \"../../types/projects.type.js\"\n\n\nexport class FetchProjects \n{\n    private projects: ProjectsType = []\n\n    public async getAPIData(): Promise<ProjectsType> \n    {\n        const fetchProjects = await Fetch.fetchList<ProjectsInterface>(\"projects\")\n\n        this.projects = fetchProjects.map(proj => ({\n            title: proj.title, \n            subtitle: proj.subtitle,\n            description: proj.description,\n            link: proj.link,\n            year: proj.year,\n            datetime: proj.datetime,\n            github: proj.github,\n            featured: proj.featured,\n            in_progress: proj.in_progress,\n            languages: proj.languages ?? [],\n            frameworks: proj.frameworks,\n            images: proj.images,\n            specifications: proj.specifications,\n            paragraphs: proj.paragraphs,\n            contributors: proj.contributors,\n\n            logo: proj.images.find(img => img.is_logo) ?? null,\n            mainImages: proj.images.filter(img => img.is_main_image) ?? [],\n        }));\n\n        return this.projects\n    }\n\n    public getProjects(): ProjectsType \n    {\n        return this.projects\n    }\n}", "import { DeconstructPath } from \"./DeconstructPath.js\"\n\n/**\n * CalcPathFigures\n * \n * Bevat methoden voor geometrische berekeningen voor SVG paths en shapes:\n * - berekening van offsets\n * - het bepalen van punten en afstanden\n */\nexport class PathFigures\n{\n    // Vormt uit twee paden (inner en outer) afzonderlijke vierhoeken door\n    // telkens de huidige en volgende punten van beide paden te combineren.\n    // Elk vierhoek bestaat uit: currentOuter \u2192 currentInner \u2192 nextInner \u2192 nextOuter.\n    // De vierhoeken worden sequentieel opgebouwd en opgeslagen in een Map,\n    // waarna alle waardes worden teruggegeven als geneste array van puntobjecten.\n    public static createFigures(innerPath: string, outerPath: string): Array<Array<{ x: number, y:  number }>> | null\n    {\n            const firgurePositions = new Map()\n    \n            if (!innerPath)\n                return null\n            \n            const outerPathValues = DeconstructPath.getPathParts(outerPath)\n            const innerPathValues = DeconstructPath.getPathParts(innerPath)\n            \n            let counter = 1\n            \n            for (let i = 0; i < outerPathValues.length; i++) \n            {\n                const figureArray: any[] = []              \n\n                const nextOuter = outerPathValues[i + 1] ?? outerPathValues[0]\n                const nextInner = innerPathValues[i + 1] ?? innerPathValues[0]\n            \n                const currentOuter = outerPathValues[i]\n                const currentInner = innerPathValues[i]\n            \n                if (!currentOuter || !currentInner || !nextOuter || !nextInner || i == outerPathValues.length - 1) \n                    continue\n\n                figureArray.push(currentOuter, currentInner, nextInner, nextOuter)\n            \n                firgurePositions.set(counter, figureArray)\n                counter++\n            }\n\n            const allValues = [...firgurePositions.values()]\n            return allValues\n    }\n\n    public static createFigurePathString(innerPath: string, outerPath: string): Array<string> | null\n    {\n        const createArrayWithPathFigures = []\n        const eachPathPositionArray = this.createFigures(innerPath, outerPath)\n\n        if (!eachPathPositionArray)\n            return null\n\n        for (const figures of eachPathPositionArray)\n        {\n            const getFigureStringPath = DeconstructPath.createNewSVGPathString(figures)\n            createArrayWithPathFigures.push(getFigureStringPath)\n        }\n\n        return createArrayWithPathFigures\n    }\n}", "import { ProjectParagraph, ProjectSpecification } from \"../../interfaces/api/ProjectsInterface.js\"\nimport { ProjectType, ProjectFrameworkType, ProjectImageType, ProjectLanguageType } from \"../../types/projects.type.js\"\n\nexport class Project \n{\n    public title: string\n    public subtitle: string | null\n    public description: string | null\n    public link: string\n    public year: number\n    public datetime: string\n    public github: string\n    public featured: boolean\n    public inProgress: boolean\n    public languages: ProjectLanguageType[]\n    public frameworks: ProjectFrameworkType[]\n    public images: ProjectImageType[]\n    public specifications: ProjectSpecification[]\n    public paragraphs: ProjectParagraph[]\n    \n    public mainImages: ProjectImageType[]\n    public logo: ProjectImageType | null\n    \n    constructor(data: ProjectType) \n    {\n        this.title = data.title\n        this.subtitle = data.subtitle\n        this.description = data.description\n        this.link = data.link\n        this.year = data.year\n        this.datetime = data.datetime\n        this.github = data.github\n        this.featured = data.featured\n        this.inProgress = data.in_progress\n        this.languages = data.languages\n        this.frameworks = data.frameworks\n        this.images= data.images\n        this.specifications = data.specifications\n        this.paragraphs = data.paragraphs\n\n        this.logo = data.logo\n        this.mainImages = data.mainImages\n    }\n\n    /**\n     * Retourneer \u00E9\u00E9n willekeurige afbeelding uit mainImages\n     */\n    public getRandomOtherImage(): ProjectImageType | null \n    {\n        if (!this.mainImages.length) return null\n\n        const index = Math.floor(Math.random() * this.mainImages.length)\n        return this.mainImages[index]\n    }\n\n    /**\n     * Optioneel: retourneer de eerste N favorieten afbeeldingen\n     */\n    public getFavoriteImages(count = 3): ProjectImageType[] \n    {\n        return this.mainImages.slice(0, count)\n    }\n}\n", "import { ProjectImageSlideshowType } from \"../../types/projects.type.js\";\nimport { SVGFactory } from \"../construct/core/SVGFactory.js\";\nimport { DeconstructPath } from \"../construct/DeconstructPath.js\";\n\nexport class HexaStyling\n{\n    public static createInnerShadowDefs(\n        defs: SVGElement | null,\n        projectName: string\n    ): void\n    {\n        // Anders werkt het toekennen van de <defs> niet voor de inner shadow\n        if (projectName == \"smart garden (desktop)\")\n            projectName = \"smartgarden-desktop\"\n        if (projectName == \"smart garden (mobiel)\")\n            projectName = \"smartgarden-mobiel\"\n\n        const shadowGradient = new SVGFactory(defs, \"linearGradient\", {\n            id: `hexa-shadow-${projectName}`,\n            x1: \"0%\",\n            y1: \"0%\",\n            x2: \"100%\",\n            y2: \"100%\"\n        }).createSvgTag();\n\n        new SVGFactory(shadowGradient, \"stop\", {\n            offset: \"0%\",\n            \"stop-color\": \"black\",\n            \"stop-opacity\": \"0.9\"\n        }).createSvgTag();\n\n        new SVGFactory(shadowGradient, \"stop\", {\n            offset: \"30%\",\n            \"stop-color\": \"black\",\n            \"stop-opacity\": \"0.55\"\n        }).createSvgTag();\n\n        new SVGFactory(shadowGradient, \"stop\", {\n            offset: \"70%\",\n            \"stop-color\": \"black\",\n            \"stop-opacity\": \"0.1\"\n        }).createSvgTag();\n\n        new SVGFactory(shadowGradient, \"stop\", {\n            offset: \"100%\",\n            \"stop-color\": \"black\",\n            \"stop-opacity\": \"0\"\n        }).createSvgTag();\n\n        const shadowBlur = new SVGFactory(defs, \"filter\", {\n            id: `hexa-blur-${projectName}`,\n            x: \"-50%\",\n            y: \"-50%\",\n            width: \"200%\",\n            height: \"200%\"\n        }).createSvgTag();\n\n        new SVGFactory(shadowBlur, \"feGaussianBlur\", {\n            in: \"SourceGraphic\",\n            stdDeviation: \"12\"\n        }).createSvgTag();\n    }\n\n    public static createInnerShadow(\n        group: SVGElement | null,\n        x: number,\n        y: number,\n        projectName: string,\n        imageSize: string\n    ): void\n    {\n        if (!group)\n            return;\n\n        // Moet dynamischer (DRY), maar veel hoofdpijn...\n        if (imageSize == \"small\")\n        {\n            new SVGFactory(group, \"path\", {\n                d: `\n                    M${x + 90},${y + 5}\n                    L${x + 230},${y + 5}\n                    L${x + 245},${y + 55}\n                    L${x + 140},${y + 45}\n                    L${x + 65},${y + 180}\n                    L${x + 40},${y + 150}\n                    Z\n                `,\n                fill: `url(#hexa-shadow-${projectName})`,\n                filter: `url(#hexa-blur-${projectName})`,\n                \"pointer-events\": \"none\"\n            }).createSvgTag();\n        }\n        else\n        {\n            new SVGFactory(group, \"path\", {\n                d: `\n                    M${x - 10},${y + 167}\n                    L${x + 250},${y - 10}\n                    L${x + 325},${y + 50}\n                    L${x + 55},${y + 205}\n                    L${x + 55},${y + 475}\n                    L${x - 10},${y + 433}\n                    Z\n                `,\n                fill: `url(#hexa-shadow-${projectName})`,\n                filter: `url(#hexa-blur-${projectName})`,\n                \"pointer-events\": \"none\"\n            }).createSvgTag();\n        }\n    }\n\n    public static activeImageStyling(\n        img: ProjectImageSlideshowType,\n        group: SVGElement | null,\n        coords: Array<{ x: number; y: number }>,\n        counter: number\n    )\n    {\n        const path = \"M110,15 L210,15 L260,115 L210,215 L110,215 L60,115 L110,15\"\n\n        const hashPath = DeconstructPath.getPathParts(path)\n\n        const overlayCoords = hashPath.map(c => ({\n            x: c.x + coords[counter].x,\n            y: c.y + coords[counter].y\n        }))\n\n        const overlayPath = DeconstructPath.createNewSVGPathString(overlayCoords)\n\n        new SVGFactory(group, \"path\", {\n            d: overlayPath,\n            fill: img.is_active\n                ? \"transparent\"\n                : \"rgba(0,0,0, 0.35)\"\n        }).createSvgTag()\n\n        if (!img.is_active)\n        {\n            const outlinePath = DeconstructPath.createNewSVGPathString(overlayCoords)\n\n            new SVGFactory(group, \"path\", {\n                d: outlinePath,\n                fill: \"none\",\n                stroke: \"transparent\",\n                \"stroke-width\": \"6\",\n                class: \"hex-outline\",\n                \"pointer-events\": \"none\"\n            }).createSvgTag()\n        }\n    }\n}", "import { CreateSVG } from \"../../construct/core/SVGCreate.js\"\nimport { SVGFactory } from \"../../construct/core/SVGFactory.js\"\nimport { InnerPath } from \"../../construct/InnerPath.js\"\nimport { DeconstructPath } from \"../../construct/DeconstructPath.js\"\nimport { Project } from \"../Project.js\"\n\nimport { ProjectsType } from \"../../../types/projects.type.js\"\nimport { HexaStyling } from \"../../sharedHexStyling/HexaStyling.js\"\n\nexport class ProjectsRootElement\n{\n    public static createMany(projectsData: ProjectsType): Project[] \n    {\n        const mapData = projectsData.map(data => new Project(data))\n\n        return mapData\n    }\n\n    public static createRootElement(projectNameID: string): CreateSVG | null\n    {\n        if (!projectNameID)\n            return null\n\n        const projectContainer = new CreateSVG(\n            `${projectNameID}`,\n            {\n                viewBox: `-50 -50 3670 1160`,\n                preserveAspectRatio: \"xMidYMid\"\n            },\n            true\n        )\n\n        projectContainer.createRootSVG(\"projects\")\n\n        return projectContainer\n    }\n\n\n    public static createDefs(\n        container: CreateSVG | null,\n        projectName: string\n    ): SVGElement | null\n    {\n        if (!container)\n            return null;\n\n        const defs = new SVGFactory(\n            container,\n            \"defs\",\n            {}\n        ).createSvgTag();\n\n        HexaStyling.createInnerShadowDefs(\n            defs,\n            projectName\n        );\n\n        return defs;\n    }\n\n    public static createInnerHexaPath(): string\n    {\n        const HexagonPath = \"M250,0 L500,166.667 L500,433.333 L250,600 L0,433.333 L0,166.667 L250,0\"\n        const logoPath = InnerPath.buildOffsetPathHexagon(HexagonPath, 25)\n        return logoPath\n    }\n\n    public static addClipPathToDefs(defs: SVGElement | null, projectName: string, path: string): void\n    {\n        // FIRST\n        const firstPath = ProjectsRootElement.createPaths(1, ProjectsRootElement.createInnerHexaPath())\n\n        const firstClipPath = new SVGFactory(defs, \"clipPath\", {\n            id: `hex-1-${projectName}`,\n            clipPathUnits: \"userSpaceOnUse\"\n        }).createSvgTag()\n\n        new SVGFactory(firstClipPath, \"path\", {\n            d: firstPath\n        }).createSvgTag()\n\n        // SECOND\n        const secondPath = ProjectsRootElement.createPaths(2, path)\n\n        const secondClipPath = new SVGFactory(defs, \"clipPath\", {\n            id: `hex-2-${projectName}`,\n            clipPathUnits: \"userSpaceOnUse\",\n        }).createSvgTag()\n\n        new SVGFactory(secondClipPath, \"path\", {\n            d: secondPath\n        }).createSvgTag()\n\n        // THIRD\n        const thirdPath = ProjectsRootElement.createPaths(3, path)\n\n        const thirdClipPath = new SVGFactory(defs, \"clipPath\", {\n            id: `hex-3-${projectName}`,\n            clipPathUnits: \"userSpaceOnUse\"\n        }).createSvgTag()\n\n        new SVGFactory(thirdClipPath, \"path\", {\n            d: thirdPath\n        }).createSvgTag()\n\n        // FOURTH\n        const fourthPath = ProjectsRootElement.createPaths(4, path)\n\n        const fourthClipPath = new SVGFactory(defs, \"clipPath\", {\n            id: `hex-4-${projectName}`,\n            clipPathUnits: \"userSpaceOnUse\"\n        }).createSvgTag()\n\n        new SVGFactory(fourthClipPath, \"path\", {\n            d: fourthPath\n        }).createSvgTag()\n    }\n\n    public static createPaths(positionNumber: number, path: string): string\n    {\n        const hashedPath = DeconstructPath.getPathParts(path)\n        const padding = 20\n\n        if (positionNumber === 1)\n        {\n            return path\n        }\n        else if (positionNumber === 2)\n        {\n            const secondTransformedPath = hashedPath.map(point => ({\n                ...point,\n                x: point.x + 500 + padding,\n                y: point.y\n            }))\n            return DeconstructPath.createNewSVGPathString(secondTransformedPath)\n        }\n        else if (positionNumber === 3)\n        {\n            const thirdTransformedPath = hashedPath.map(point => ({\n                ...point,\n                x: point.x + 240 + 20, // Waardes kloppen niet!\n                y: point.y + 433.333 + padding // Waardes kloppen niet!\n            }))\n            return DeconstructPath.createNewSVGPathString(thirdTransformedPath)\n        }\n        else\n        {\n            const HARDCODED_PATH = DeconstructPath.getPathParts(\"M1030,453.333 L1260,630 L1260,886.666 L1010,1053.333 L780,886.666 L780,620 L1030,453.333\") // Bovenstaande code werkt om een of andere reden niet.\n            return DeconstructPath.createNewSVGPathString(HARDCODED_PATH)\n        }\n    }\n\n    public static createLogo(container: CreateSVG | null, logoURL: string, projectName: string)\n    {\n        new SVGFactory(container, \"image\", {\n            href: `../static/images/${logoURL}`,\n            x: 20,\n            y: 0,\n            width: 470,\n            height: 570,\n            \"clip-path\": `url(#hex-1-${projectName})`,\n            preserveAspectRatio: \"xMidYMid meet\",\n        }).createSvgTag()\n    }\n\n    public static createHexImages(\n        container: CreateSVG | null,\n        imageURL: string[],\n        projectName: string\n    )\n    {\n        let counter = 2;\n        let xValue = 520;\n        let yValue = 0;\n\n        for (const url of imageURL)\n        {\n            switch (counter)\n            {\n                case 3:\n                    xValue = 270;\n                    yValue = 450;\n                    break;\n                case 4:\n                    xValue = 770;\n                    yValue = 450;\n                    break;\n            }\n\n            const group = new SVGFactory(container, \"g\", {\n                \"clip-path\": `url(#hex-${counter}-${projectName})`\n            }).createSvgTag();\n\n            new SVGFactory(group, \"image\", {\n                href: `../static/images/${url}`,\n                x: xValue,\n                y: yValue,\n                width: 500,\n                height: 600,\n                // preserveAspectRatio: \"xMidYMid meet\"\n                // preserveAspectRatio: \"xMidYMin slice\"\n                preserveAspectRatio: \"xMidYMax slice\"\n            }).createSvgTag();\n\n            new SVGFactory(group, \"rect\", {\n                x: xValue - 5,\n                y: yValue - 5,\n                width: 510,\n                height: 610,\n                fill: \"black\",\n                opacity: 0.4\n            }).createSvgTag();\n\n            HexaStyling.createInnerShadow(\n                group,\n                xValue,\n                yValue,\n                projectName,\n                \"large\"\n            );\n            \n            counter++;\n        }\n    }\n}", "import { CreateSVG } from \"../../construct/core/SVGCreate.js\"\nimport { SVGFactory } from \"../../construct/core/SVGFactory.js\"\n\nexport class ProjectsButton\n{\n    private static startContainer: number = 3050\n\n    private static getLinkHref(container: CreateSVG | null, projectName: string)\n    {\n        const link = new SVGFactory(container, \"a\", {\n            href: `/projecten/${projectName.toLowerCase()}`,\n            class: \"projects-button-link\"\n        }).createSvgTag()\n\n        return link\n    }\n\n    private static createButtonPaths(link: SVGElement | null)\n    {\n        const group = new SVGFactory(link, \"g\", {\n            class: \"projects-button-group\"\n        }).createSvgTag()\n\n        const paths = [\n            \"M3140,925 L3430,925 L3340,1060 L3050,1060 Z\",\n            \"M3460,925 L3500,925 L3410,1060 L3370,1060 Z\",\n            \"M3530,925 L3570,925 L3480,1060 L3440,1060 Z\",\n            \"M3570,970 L3570,1060 L3510,1060 Z\"\n        ]\n\n        paths.forEach((d, i) =>\n        {\n            new SVGFactory(group, \"path\", {\n                d,\n                class: `projects-button-path part-${i}`,\n                stroke: \"rgb(51, 81, 142)\",\n                \"stroke-width\": 3,\n                fill: \"rgba(22, 38, 70, 0.25)\"\n            }).createSvgTag()\n        })\n    }\n\n    private static buttonHTML(link: SVGElement | null)\n    {\n        const foreign = new SVGFactory(link, \"foreignObject\", {\n            x: this.startContainer,\n            y: 925,\n            width: 520,\n            height: 135\n        }).createSvgTag()\n\n        const wrapper = document.createElement(\"div\")\n        wrapper.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\")\n        wrapper.style.cssText = `\n            width:100%;\n            height:100%;\n            display:flex;\n            align-items:center;\n            justify-content:flex-start;\n            padding-left:140px;\n            pointer-events:none;\n        `\n\n        const text = document.createElement(\"p\");\n        text.classList.add(\"projects-button-text\");\n        text.textContent = \"GO\";\n        text.style.cssText = `\n            margin:0;\n            font-size:74px;\n            color:rgb(51, 81, 142);\n            font-weight:bold;\n            font-family:\"Ubuntu\", sans-serif;\n        `\n\n        wrapper.appendChild(text)\n        foreign?.appendChild(wrapper)\n    }\n\n    public static linkInstance(container: CreateSVG | null, projectName: string)\n    {\n        if (!container)\n            return\n\n        const link = ProjectsButton.getLinkHref(container, projectName)\n\n        if (!link)\n            return \n\n        // Maak de style van de buttons\n        ProjectsButton.createButtonPaths(link)\n\n        // Zorg dat de inner html de precies even groot is\n        ProjectsButton.buttonHTML(link)\n\n        // Hover effecht voor de projects buttons\n        link.addEventListener(\"mouseenter\", () =>\n        {\n            link.querySelectorAll(\".projects-button-path\").forEach(p => \n            {\n                p.setAttribute(\"stroke\", \"#2ecc71\")\n                p.setAttribute(\"fill\", \"rgba(46, 204, 113, 0.1)\")\n            })\n        \n            const text = link.querySelector(\".projects-button-text\") as HTMLElement\n            text.style.color = \"#2ecc71\"\n        })\n\n        link.addEventListener(\"mouseleave\", () =>\n        {\n            link.querySelectorAll(\".projects-button-path\").forEach(p => \n            {\n                p.setAttribute(\"stroke\", \"rgb(51, 81, 142)\")\n                p.setAttribute(\"fill\", \"rgba(22, 38, 70, 0.25)\")\n            })\n\n            const text = link.querySelector(\".projects-button-text\") as HTMLElement\n            text.style.color = \"rgb(51, 81, 142)\"\n        })\n    }\n}\n", "import { CreateSVG } from \"../../construct/core/SVGCreate.js\"\nimport { SVGFactory } from \"../../construct/core/SVGFactory.js\"\nimport { Project } from \"../Project.js\"\n\nexport class ProjectsContent\n{\n    public static drawBorder(\n        container: CreateSVG | null, \n        path: string, \n        options?: Record<string, number | string>,\n        project?: Project,\n        index?: number\n    )\n    {\n        const projectSecondSection = new SVGFactory(container, \"path\", {\n            d: path,\n            stroke: \"rgb(51, 81, 142)\",\n            opacity: options?.opacity ?? 1,\n            fill: \"none\",\n            \"stroke-width\": 3\n        }).createSvgTag()\n\n        ProjectsContent.drawCircles(container)\n        ProjectsContent.drawInitials(container, project, index)\n    }\n\n    private static drawCircles(container: CreateSVG | null)\n    {\n        const circlesData = [\n            { cx: 1940, stroke: \"rgba(51, 81, 142, 0.5)\", fill: \"none\", \"stroke-width\": 6 },\n            { cx: 2000, stroke: \"rgba(51, 81, 142, 0.5)\", fill: \"none\", \"stroke-width\": 6 },\n            { cx: 2060, stroke: \"rgba(51, 81, 142, 0.75)\", fill: \"none\", \"stroke-width\": 6 },\n            { cx: 2120, stroke: \"none\", fill: \"rgba(51, 81, 142, 0.5)\" },\n            { cx: 2180, stroke: \"none\", fill: \"rgb(51, 81, 142)\" }\n        ]\n\n        circlesData.forEach(data => {\n            new SVGFactory(container, \"circle\", {\n                cx: data.cx,\n                cy: 1060,\n                r: 17,\n                stroke: data.stroke,\n                \"stroke-width\": data[\"stroke-width\"]!,\n                fill: data.fill,\n                opacity: 0.5\n            }).createSvgTag()\n        })\n\n    }\n\n    private static drawInitials(\n        container: CreateSVG | null,\n        project?: Project,\n        index?: number\n    )\n    {\n        const projectLang = project?.languages[0].name.toLowerCase()\n        const year = project?.year\n\n        let shortName = \"\"\n        if (projectLang != undefined)\n        {\n            switch (projectLang) \n            {\n                case \"python\":\n                    shortName = \"PY\"\n                    break;\n                case \"java\":\n                    shortName = \"JV\"\n                    break;\n                case \"php\":\n                    shortName = \"PH\"\n                    break;\n                case \"typescript\":\n                    shortName = \"TS\"\n                default:\n                    break;\n            }\n        }\n\n        const textBorder = new SVGFactory(container, \"text\", {\n            x: 2225,\n            y: 1060,\n            fill: \"white\",\n            \"font-size\": \"38\",\n            \"font-family\": \"Courier Prime\",\n            \"dominant-baseline\": \"middle\",\n            opacity: 0.25\n        }).createSvgTag()\n              \n        if (!index)\n            return\n        \n        let projectCount = \"\"\n        if (index < 10)\n             projectCount = `000${index}`\n        else if (index < 100)\n            projectCount = `00${index}`\n        else\n            projectCount = index!.toString()\n\n        textBorder!.textContent = `${shortName}.${year}.${projectCount}`\n    }\n}", "import { CreateSVG } from \"../../construct/core/SVGCreate.js\"\nimport { SVGFactory } from \"../../construct/core/SVGFactory.js\"\nimport { DeconstructPath } from \"../../construct/DeconstructPath.js\"\nimport { CreateGradient } from \"../../construct/gradient/CreateGradient.js\"\nimport { DrawSegments } from \"../../construct/gradient/DrawSegments.js\"\nimport { OffsetVector } from \"../../construct/gradient/OffsetVector.js\"\n\nexport class ProjectsInnerHTMLContent\n{\n    public static createWrapper(projectTitle: string, projectText: string)\n    {\n        const wrapper = document.createElement(\"div\")\n        wrapper.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\")\n        wrapper.style.cssText = `\n            width:100%;\n            height:100%;\n            display:flex;\n            flex-direction:column;\n            align-items:center;\n            justify-content:center;\n            gap:10px;\n        `\n    \n        const title = document.createElement(\"h2\")\n\n        title.style.fontSize = \"100px\"\n        title.style.fontFamily = \"Goldman, sans-serif\"    \n        title.style.color = \"transparent\"\n        title.style.webkitTextFillColor = \"transparent\"\n        title.style.webkitTextStroke = \"5px rgb(51, 81, 142)\"\n        title.style.textShadow = \"24px 24px 0 rgba(6, 10, 18, 1)\"\n        title.textContent = projectTitle.toUpperCase()\n\n        const content = document.createElement(\"p\")\n        content.style.fontSize = \"54px\"\n        content.style.lineHeight = \"2\"\n        content.style.fontStyle = \"italic\"\n        content.style.color = \"rgba(51, 81, 142, 1)\"\n        content.style.textAlign = \"center\"\n        content.style.textShadow = \"15px 15px 0 rgba(6, 10, 18, 1)\";\n        content.textContent = projectText\n\n        wrapper.append(title)\n        wrapper.append(content)\n        return wrapper\n    } \n\n    public static createInnerPath(container: CreateSVG | null, path?: string, innerPath?: string): SVGPathElement | null\n    {\n        if (!container) \n            return null;\n\n        const pathElement = new SVGFactory(container, \"path\", {\n            d: path!,\n            stroke: \"rgba(51, 81, 142, 0.55)\",\n            fill: \"rgba(51, 81, 142, 0.025)\"\n        }).createSvgTag()\n\n        // Voeg glow toe op basis van dit path\n        ProjectsInnerHTMLContent.createShadow(container, path!, innerPath!)\n\n        return pathElement as SVGPathElement\n    }\n\n    public static initContent(container: CreateSVG | null, pathElement: SVGPathElement | null, projectTitle: string, projectText: string)\n    {\n        if (!container || !pathElement) \n            return null\n\n        const foreign = new SVGFactory(container, \"foreignObject\", {\n            x: 1500,\n            y: 100,\n            width: 1750,\n            height: 775\n        }).createSvgTag()\n\n        const wrapper = ProjectsInnerHTMLContent.createWrapper(projectTitle, projectText)\n        foreign?.appendChild(wrapper)\n    }\n\n    public static createShadow(container: CreateSVG | null, outerPath: string, innerPath: string)\n    {\n        if (!container) return;\n\n        const defs = new SVGFactory(container, \"defs\").createSvgTag();\n\n        const OFFSET = 200;\n\n        const outerPoints = DeconstructPath.getPathParts(outerPath);\n        const innerPoints = DeconstructPath.getPathParts(innerPath);\n\n        for (let i = 0; i < outerPoints.length - 1; i++)\n        {\n            const [p0, p1] = [outerPoints[i], outerPoints[i + 1]];\n            const [p0A, p1A] = [innerPoints[i], innerPoints[i + 1]];\n\n            const offsetVector = OffsetVector.computeOffsetVector(p0, p1, OFFSET)\n            const gradId = CreateGradient.createSegmentGradient(defs!, p0, offsetVector, i);\n            DrawSegments.drawSegment(container, p0, p1, p0A, p1A, gradId);\n        }\n    }\n}", "import { CreateSVG } from \"../../construct/core/SVGCreate.js\";\nimport { SVGFactory } from \"../../construct/core/SVGFactory.js\";\n\nexport class ProjectsStackBanners\n{\n    public static createLanguagePaths(container: CreateSVG | null, index: number, path?: string): SVGPathElement | null\n    {\n        if (!container) \n            return null;\n\n        if (!path)\n        {\n            path = \"M1450,-20 L1560,-20 L1560,90 L1505,125 L1450,90 L1450,-20\" \n        }\n\n        const offsetX = index * 175\n\n        const pathElement = new SVGFactory(container, \"path\", {\n            d: path,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"rgba(0, 8, 25, 1)\",\n            transform: `translate(${offsetX},0)`\n        }).createSvgTag() as SVGPathElement\n\n        return pathElement\n    }\n\n\n    public static getDevIcons(container: CreateSVG | null, languageOrFramework: string, pathElement: SVGPathElement | null, index: number)\n    {\n        if (!container|| !pathElement) \n            return null\n\n        const bbox = pathElement.getBBox()\n        const offsetX = bbox.x + bbox.width / 2 - 100 + index * 175;\n        const offsetY = bbox.y + bbox.height / 2 - 100;\n\n        const foreign = new SVGFactory(container, \"foreignObject\", {\n            x: offsetX,\n            y: offsetY,\n            width: 200,\n            height: 200\n        }).createSvgTag()\n\n        const wrapper = this.createXHTMLWrapper(languageOrFramework)\n        foreign?.appendChild(wrapper)\n    }\n\n    private static createXHTMLWrapper(language: string): HTMLElement\n    {\n        const wrapper = document.createElement(\"div\")\n        wrapper.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\")\n        wrapper.style.cssText = `\n            width:100%;\n            height:100%;\n            display:flex;\n            flex-direction:column;\n            align-items:center;\n            justify-content:center;\n            gap:10px;\n        `\n\n        const icon = document.createElement(\"div\")\n        const deviconMap: Record<string,string> = {\n            \"react native\": \"react\",\n            \"node.js\": \"nodejs\",\n            \"electron\": \"electron\" \n        }\n\n        let iconLanguage = deviconMap[language.toLowerCase()] ?? language.toLowerCase()\n\n        if (iconLanguage === \"react native\") iconLanguage = \"react-native\"\n\n        if (iconLanguage === \"electron\")\n        {\n            icon.className = `devicon-${iconLanguage}-original`\n        }\n        else\n        {\n            icon.className = `devicon-${iconLanguage}-plain`\n        }\n        icon.style.cssText = \"font-size:60px; color:rgb(51, 81, 142);\"\n\n        wrapper.append(icon)\n        return wrapper\n    }\n}", "import { CreateSVG } from \"../../construct/core/SVGCreate.js\";\nimport { SVGFactory } from \"../../construct/core/SVGFactory.js\";\n\nexport class ProjectsHexa\n{\n    public static styleLogo(container: CreateSVG, figures: Array<string>): void\n    {\n        let counter = 0\n\n        figures.forEach((path) => {\n            const borders = new SVGFactory(container, \"path\", {\n                d: path,\n                stroke: counter <= 2 ? \"none\" : \"rgb(51, 81, 142)\",\n                fill: counter <= 2 ? \"rgb(51, 81, 142)\" : \"none\"\n            }).createSvgTag()\n\n            counter++\n        })\n    }\n}", "import { FetchProjects } from \"../../endpoints/service/FetchProjects.js\"\n\nimport { PathFigures } from \"../construct/PathFigures.js\"\n\nimport { Project } from \"./Project.js\"\n\nimport { ProjectsRootElement } from \"./factory/ProjectsFactory.js\"\nimport { ProjectsButton } from \"./factory/ProjectsButton.js\"\nimport { ProjectsContent } from \"./factory/ProjectsContent.js\"\nimport { ProjectsInnerHTMLContent } from \"./factory/ProjectsInnerHTML.js\"\nimport { ProjectsStackBanners } from \"./factory/ProjectsStackBanners.js\"\nimport { ProjectsHexa } from \"./factory/ProjectsHexa.js\"\n\n\nexport async function initProjects()\n{\n    const HexagonPath = \"M250,0 L500,166.667 L500,433.333 L250,600 L0,433.333 L0,166.667 L250,0\"\n\n    const pathContent = \"M1300,0 L3570,0 L3570,900 L3125,900 L3020,1060 L2525,1060 M1900,1060 L1500,1060 L1280,886.666 L1280,620 L1040,433.333 L1040,166.667 L1300,0\"\n    \n    const pathContentInner = \"M1320,35 L3535,35 L3535,870 L3045,870 L2945,1025 L1520,1025 L1315,866.666 L1315,595 L1075,413.333 L1075,191.667 L1320,35\"\n    const pathContentInnerGradientPath = \"M1420,135 L3435,135 L3435,770 L2945,770 L2845,925 L1620,925 L1415,766.666 L1415,495 L1175,313.333 L1175,291.667 L1420,135\";\n    \n    const pathLanguages = \"M1450,-20 L1560,-20 L1560,90 L1505,125 L1450,90 L1450,-20\" \n\n    const fetcher = new FetchProjects() \n\n    const projectDataArray = await fetcher.getAPIData()\n\n    const projects: Project[] = ProjectsRootElement.createMany(projectDataArray)\n    \n    const rootElements = projects.map(projectName => ProjectsRootElement.createRootElement(projectName.title))\n\n    for (let i = 0; i < rootElements.length; i++)\n    {\n        const root = rootElements[i]\n        const project = projects[i]\n        const projectName = projects[i].title.toLocaleLowerCase()\n\n        const defs = ProjectsRootElement.createDefs(root, projectName)\n        \n        // CONTENT\n        ProjectsContent.drawBorder(rootElements[i], pathContent)\n        ProjectsContent.drawBorder(rootElements[i], pathContentInner, {opacity: 0.5}, project, rootElements.length - i)\n\n        const figures = PathFigures.createFigurePathString(HexagonPath, ProjectsRootElement.createInnerHexaPath());\n        ProjectsHexa.styleLogo(root!, figures!)\n\n        const pathElement = ProjectsInnerHTMLContent.createInnerPath(root!, pathContentInner, pathContentInnerGradientPath)\n        ProjectsInnerHTMLContent.initContent(root!, pathElement, projectName, project.description!)\n\n        // LANGUAGES AND FRAMEWORKS\n        const languagesAndFrameworks = project.languages.filter(lang => lang.name.toLowerCase() !== \"micropython\").concat(project.frameworks);\n\n        for (const [index, lf] of languagesAndFrameworks.entries()) \n        {\n            const languagePath = ProjectsStackBanners.createLanguagePaths(root, index);\n            ProjectsStackBanners.getDevIcons(root, lf.svg_url, languagePath, index);\n        }\n\n        ProjectsButton.linkInstance(root!, project.link)\n\n        ProjectsRootElement.addClipPathToDefs(defs, projects[i].link, HexagonPath)\n        \n        ProjectsRootElement.createLogo(root, project.logo!.image_url, projects[i].link)\n        ProjectsRootElement.createHexImages(\n            root,\n            project.mainImages.map((img: { image_url: string }) => img.image_url),\n            projects[i].link\n        )\n    }\n}", "import { Fetch } from \"../utils/Fetch.js\"\nimport { ProjectsInterface } from \"../../interfaces/api/ProjectsInterface.js\";\nimport { ProjectType } from \"../../types/projects.type.js\"\n\nexport class FetchProject\n{\n    private static cache: Map<string, ProjectType> = new Map();\n\n    public async getProjectData(projectName: string | undefined): Promise<ProjectType>\n    {\n        if (!projectName)\n            throw new Error(\"Project name is required\");\n\n        if (FetchProject.cache.has(projectName))\n            return FetchProject.cache.get(projectName)!;\n\n        const fetchProject = await Fetch.fetchDetail<ProjectsInterface>(`project/${projectName}`);\n\n        const project: ProjectType = {\n            title: fetchProject.title,\n            subtitle: fetchProject.subtitle,\n            description: fetchProject.description,\n            link: fetchProject.link,\n            year: fetchProject.year,\n            datetime: fetchProject.datetime,\n            github: fetchProject.github,\n            featured: fetchProject.featured,\n            in_progress: fetchProject.in_progress,\n            languages: fetchProject.languages ?? [],\n            frameworks: fetchProject.frameworks ?? [],\n            images: fetchProject.images ?? [],\n            specifications: fetchProject.specifications ?? [],\n            paragraphs: fetchProject.paragraphs ?? [],\n            contributors: fetchProject.contributors ?? [],\n\n            logo: fetchProject.images.find(img => img.is_logo) ?? null,\n            mainImages: fetchProject.images.filter(img => img.is_main_image) ?? [],\n        };\n\n        FetchProject.cache.set(projectName, project);\n\n        return project;\n    }\n}\n", "import { ProjectContributorType, ProjectType } from \"../../../types/projects.type\";\n\n\nexport class ProjectContributorFactory\n{\n    constructor(\n        private HTMLID: string,\n        private projectContributor: ProjectType\n    ) {}\n\n    public createEachSpecification(): void\n    {\n        if (!this.HTMLID) return\n\n        const htmlContainer = document.getElementById(this.HTMLID)\n        if (!htmlContainer) return\n\n        for (const contributor of this.projectContributor.contributors)\n        {\n            const contributorSVG = new ProjectContributorSVG(contributor)\n            htmlContainer.appendChild(contributorSVG.init())\n        }\n    }\n}\n\n\nexport class ProjectContributorSVG\n{\n    private svg!: SVGSVGElement\n\n    constructor(private contributor: ProjectContributorType) {}\n\n    public init(): SVGSVGElement\n    {\n        this.createSVG()\n        this.createHexagonImage()\n        this.createName()\n        return this.svg\n    }\n\n    private createSVG(): void\n    {\n        this.svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n        this.svg.setAttribute(\"viewBox\", \"0 0 400 600\")\n        this.svg.classList.add(\"contributor-svg\")\n    }\n\n    private createHexagonImage(): void\n    {\n        const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\")\n\n        // Clip-path voor hexagon\n        const clipPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"clipPath\")\n        clipPath.setAttribute(\"id\", `hex-${this.contributor.name.replace(/\\s/g,\"\")}`)\n        const polygon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\")\n        polygon.setAttribute(\"points\", \"200,50 330,125 330,275 200,350 70,275 70,125\")\n        clipPath.appendChild(polygon)\n        defs.appendChild(clipPath)\n\n        // Linear gradient voor border\n        const gradient = document.createElementNS(\"http://www.w3.org/2000/svg\", \"linearGradient\")\n        gradient.setAttribute(\"id\", `hex-border-gradient-${this.contributor.name.replace(/\\s/g,\"\")}`)\n        gradient.setAttribute(\"x1\", \"70\")\n        gradient.setAttribute(\"y1\", \"200\")\n        gradient.setAttribute(\"x2\", \"330\")\n        gradient.setAttribute(\"y2\", \"200\")\n        gradient.setAttribute(\"gradientUnits\", \"userSpaceOnUse\")\n\n        const stop1 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"stop\")\n        stop1.setAttribute(\"offset\", \"0%\")\n        stop1.setAttribute(\"stop-color\", \"rgb(51, 81, 142)\")\n        gradient.appendChild(stop1)\n\n        const stop2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"stop\")\n        stop2.setAttribute(\"offset\", \"100%\")\n        stop2.setAttribute(\"stop-color\", \"rgb(51, 81, 142)\")\n        gradient.appendChild(stop2)\n\n        defs.appendChild(gradient)\n\n        // Mask\n        const mask = document.createElementNS(\"http://www.w3.org/2000/svg\", \"mask\")\n        mask.setAttribute(\"id\", `hex-mask-${this.contributor.name.replace(/\\s/g,\"\")}`)\n        const maskRect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\")\n        maskRect.setAttribute(\"x\", \"70\")\n        maskRect.setAttribute(\"y\", \"50\")\n        maskRect.setAttribute(\"width\", \"260\")\n        maskRect.setAttribute(\"height\", \"300\")\n        maskRect.setAttribute(\"fill\", \"white\")\n        mask.appendChild(maskRect)\n        defs.appendChild(mask)\n\n        this.svg.appendChild(defs)\n\n        // Border\n        const border = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\")\n        border.setAttribute(\"points\", \"200,50 330,125 330,275 200,350 70,275 70,125\")\n        border.setAttribute(\"fill\", \"none\")\n        border.setAttribute(\"stroke\", `url(#hex-border-gradient-${this.contributor.name.replace(/\\s/g,\"\")})`)\n        border.setAttribute(\"stroke-width\", \"2\")\n        border.setAttribute(\"stroke-linecap\", \"round\")\n        this.svg.appendChild(border)\n\n        // Groep\n        const g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n        g.setAttribute(\"clip-path\", `url(#hex-${this.contributor.name.replace(/\\s/g,\"\")})`)\n\n        const image = document.createElementNS(\"http://www.w3.org/2000/svg\", \"image\")\n        image.setAttribute(\"href\", `../static/images/${this.contributor.git_image}`)\n        image.setAttribute(\"x\", \"70\")\n        image.setAttribute(\"y\", \"50\")\n        image.setAttribute(\"width\", \"260\")\n        image.setAttribute(\"height\", \"300\")\n        image.setAttribute(\"preserveAspectRatio\", \"xMidYMid slice\")\n\n        g.setAttribute(\"transform\", \"translate(200,200) scale(0.8) translate(-200,-200)\")\n        g.appendChild(image)\n\n        // Donkere overlay\n        const overlay = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\")\n        overlay.setAttribute(\"x\", \"70\")\n        overlay.setAttribute(\"y\", \"50\")\n        overlay.setAttribute(\"width\", \"260\")\n        overlay.setAttribute(\"height\", \"300\")\n        overlay.setAttribute(\"fill\", \"rgba(0,0,0,0.3)\")\n        g.appendChild(overlay)\n\n        // <a> link\n        const link = document.createElementNS(\"http://www.w3.org/2000/svg\", \"a\")\n        link.setAttribute(\"href\", this.contributor.git_url)\n        link.setAttribute(\"target\", \"_blank\")\n        link.appendChild(g)\n        this.svg.appendChild(link)\n    }\n\n    private createName(): void\n    {\n        const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\")\n        text.setAttribute(\"x\", \"200\")\n        text.setAttribute(\"y\", \"420\")\n        text.setAttribute(\"text-anchor\", \"middle\")\n        text.setAttribute(\"fill\", \"white\")\n        text.setAttribute(\"font-size\", \"36\")\n        text.setAttribute(\"font-weight\", \"bold\")\n        text.textContent = this.contributor.name\n        this.svg.appendChild(text)\n    }\n}", "import { ProjectType } from \"../../../types/projects.type\";\nimport { ProjectContributorFactory } from \"./ProjectContributorFactory.js\";\n\nexport function contributorInit(projectData: ProjectType)\n{\n    const createContributors = new ProjectContributorFactory(\"project-detail-contributors-svg\", projectData)\n    createContributors.createEachSpecification()\n}", "import { ProjectSVGInterface } from \"../../../interfaces/ProjectSVGInterface\"\n\nimport { CreateSVG } from \"../../construct/core/SVGCreate.js\"\nimport { SVGFactory } from \"../../construct/core/SVGFactory.js\"\n\nexport class CreateProjectDescriptionParagraphTitleSVG\n{\n    private SVGElement: CreateSVG | null = null\n\n    private viewboxSize: string = \"0 0 1200 160\"\n    private preserveAspectRatio: string = \"xMidYMid meet\"\n\n    private paragraphTitle: SVGTextElement | null = null\n    private startPoint: number | null = null\n\n    private side: string = \"left\"\n    // private isMobile: boolean = false\n\n    constructor(\n        private paragraphDiv: HTMLElement,\n        private svgID: string\n    ) {}\n\n    public getSVGElement()\n    {\n        return this.SVGElement\n    }\n\n    private createSVGElement(): void\n    {\n        this.SVGElement = new CreateSVG(\n            this.svgID,\n            {\n                viewBox: this.viewboxSize,\n                preserveAspectRatio: this.preserveAspectRatio\n            },\n            true\n        )\n    }\n\n    private appendSVGToDOM(): void\n    {\n        if (!this.SVGElement)\n            return\n\n        this.SVGElement.createRootSVG(\n            this.paragraphDiv.id\n        )\n    }\n\n    private getViewBoxSize()\n    {\n        const svgElement = document.getElementById(this.svgID)\n\n        if (!(svgElement instanceof SVGSVGElement))\n            return\n\n        const width = svgElement.viewBox.baseVal.width\n        const height = svgElement.viewBox.baseVal.height\n\n        return {\n            viewboxWidth: width,\n            viewboxHeight: height\n        }\n    }\n    \n    private createGroup(\n        parent: CreateSVG | SVGElement | null, \n        classSelector: string\n    )\n    {\n        return new SVGFactory(parent, \"g\", {\n            class: classSelector\n        }).createSvgTag()\n    }\n\n    private drawPathParts(\n        parent: SVGElement | null,\n        pathData: ProjectSVGInterface\n    )\n    {\n        new SVGFactory(parent, \"path\", {\n            d: pathData[\"d\"],\n            fill: pathData[\"fill\"],\n            stroke: pathData[\"stroke\"],\n            \"stroke-width\": pathData[\"stroke-width\"]\n        }).createSvgTag()\n    }\n\n    private get middleHeight()\n    {\n        return this.getViewBoxSize()!.viewboxHeight / 2\n    }\n\n    private get middleWidth()\n    {\n        return this.getViewBoxSize()!.viewboxWidth / 2\n    }\n\n    private get paragraphTitleWidth()\n    {\n        if (!this.paragraphTitle)\n            return\n\n        return Math.floor(this.paragraphTitle.getComputedTextLength())\n    } \n    \n    public dynamicStartPoints(side: string)\n    {\n        const viewBoxWidth = this.getViewBoxSize()?.viewboxWidth\n        const textWidth = this.paragraphTitleWidth\n    \n        const startPointLeft = (viewBoxWidth! / 2) - (textWidth! / 2) - 25\n        const startPointRight = (viewBoxWidth! / 2) + (textWidth! / 2) + 25\n    \n        this.side = side\n    \n        if (side === \"left\")\n            this.startPoint = startPointLeft\n        else\n            this.startPoint = startPointRight\n    }\n\n    private createGreenPart(parent: SVGElement | null)\n    {\n        const SVGMiddleHeight = this.middleHeight\n\n        if (!this.startPoint)\n            return\n\n        const operator = this.side === \"left\" ? -1 : 1\n\n        const data = {\n            d: `M ${this.startPoint + (operator * 140)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 90)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 70)} ${SVGMiddleHeight - 20}\n                L ${this.startPoint + (operator * 50)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 70)} ${SVGMiddleHeight + 20}\n                L ${this.startPoint + (operator * 90)} ${SVGMiddleHeight}\n\n                M ${this.startPoint + (operator * 50)} ${SVGMiddleHeight}\n                L ${this.startPoint} ${SVGMiddleHeight}\n            `,\n            fill: \"none\",\n            stroke: \"rgba(51, 81, 142, 1)\",\n            \"stroke-width\": \"1\"\n        }\n\n        this.drawPathParts(parent, data)\n    }\n\n    private createGreenInnerGlowPart(parent: SVGElement | null)\n    {\n        const SVGMiddleHeight = this.middleHeight\n\n        if (!this.startPoint)\n            return\n\n        const operator = this.side === \"left\" ? -1 : 1\n\n        const data = {\n            d: `M ${this.startPoint + (operator * 80)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 70)} ${SVGMiddleHeight - 10}\n                L ${this.startPoint + (operator * 60)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 70)} ${SVGMiddleHeight + 10}\n                L ${this.startPoint + (operator * 80)} ${SVGMiddleHeight}\n            `,\n            stroke: \"rgba(10, 60, 31, 1)\",\n            fill: \"rgba(46, 204, 113, 0.75)\",\n            \"stroke-width\": \"1\"\n        }\n\n        this.drawPathParts(parent, data)\n    }\n\n    private createHollowPart(parent: SVGElement | null)\n    {\n        const SVGMiddleHeight = this.middleHeight\n\n        if (!this.startPoint)\n            return\n\n        const operator = this.side === \"left\" ? -1 : 1\n\n        const data = {\n            d: `M ${this.startPoint + (operator * 290)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 240)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 230)} ${SVGMiddleHeight - 10}\n                L ${this.startPoint + (operator * 220)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 230)} ${SVGMiddleHeight + 10}\n                L ${this.startPoint + (operator * 240)} ${SVGMiddleHeight}\n            `,\n            fill: \"none\",\n            stroke: \"rgba(51, 81, 142, 1)\",\n            \"stroke-width\": \"1\"\n        }\n\n        this.drawPathParts(parent, data)\n    }\n\n    private createFilledPart(parent: SVGElement | null)\n    {\n        const SVGMiddleHeight = this.middleHeight\n\n        if (!this.startPoint)\n            return\n\n        const operator = this.side === \"left\" ? -1 : 1\n\n        const data = {\n            d: `M ${this.startPoint + (operator * 220)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 170)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 155)} ${SVGMiddleHeight - 15}\n                L ${this.startPoint + (operator * 140)} ${SVGMiddleHeight}\n                L ${this.startPoint + (operator * 155)} ${SVGMiddleHeight + 15}\n                L ${this.startPoint + (operator * 170)} ${SVGMiddleHeight}\n            `,\n            fill: \"rgba(51, 81, 142, 0.25)\",\n            stroke: \"rgba(51, 81, 142, 1)\",\n            \"stroke-width\": \"1\"\n        }\n\n        this.drawPathParts(parent, data)\n    }\n\n    public createParagraphTitle(\n        parent: SVGElement | CreateSVG | null,\n        title: string\n    )\n    {\n        const isMobile = window.innerWidth > 768\n\n        this.paragraphTitle = new SVGFactory(parent, \"text\", {\n            class: \"paragraph-title\",\n            x: this.middleWidth,\n            y: isMobile ? this.middleHeight : this.middleHeight - 30,\n            \"text-anchor\": \"middle\",\n            \"dominant-baseline\": \"middle\",\n            fill: isMobile ? \"none\" : \"rgba(51, 81, 142, 1)\",\n            stroke: \"rgba(51, 81, 142, 1)\",\n            \"stroke-width\": 2,\n            \"font-size\": isMobile ? \"2rem\" : \"7rem\"\n\n        }).createSvgTag() as SVGTextElement\n\n        if (!this.paragraphTitle)\n            return\n    \n        this.paragraphTitle.textContent = title\n    }\n\n    public createParts(): void\n    {\n        const side = this.side === \"left\" ? \"left-side\" : \"right-side\"\n\n        const leftSide = this.createGroup(\n            this.SVGElement,\n            side\n        )\n\n        const hollowDiamond = this.createGroup(\n            leftSide,\n            \"hollow-diamond\"\n        )\n\n        const filledDiamond = this.createGroup(\n            leftSide,\n            \"filled-diamond\"\n        )\n\n        const greenDiamond = this.createGroup(\n            leftSide,\n            \"green-diamond\"\n        )\n\n        if (window.innerWidth > 768)\n        {\n            this.createHollowPart(hollowDiamond)\n            this.createFilledPart(filledDiamond)\n            this.createGreenPart(greenDiamond)\n            this.createGreenInnerGlowPart(greenDiamond)\n        }\n    }\n    \n    public init(): void\n    {\n        this.createSVGElement()\n        this.appendSVGToDOM()\n    }\n}", "import { ProjectType } from \"../../../types/projects.type\"\n\nimport { CreateProjectDescriptionParagraphTitleSVG } from \"./ProjectDescriptionParagraphTitle.js\"\n\nexport class ProjectDescriptionFactory\n{\n    private htmlElement: HTMLElement | null = document.getElementById(\"project-detail-section-description\")\n\n    constructor(\n        private projectName: string,\n        private projectData: ProjectType\n    ) {}\n\n    public addToParentElement(): void\n    {\n        if (!this.htmlElement || !this.projectData)\n            return\n\n        for (let i = 0; i < this.projectData.paragraphs.length; i++)\n        {\n            const paragraph = this.projectData.paragraphs[i]\n\n            const paragraphDiv = document.createElement(\"div\")\n\n            paragraphDiv.className = \"project-description-div\"\n            paragraphDiv.id = `project-description-${i}`\n\n            // Voeg parent van SVG toe aan de DOM\n            this.htmlElement.appendChild(paragraphDiv)\n\n            // Maak de SVG\n            const descriptionSVGClass = new CreateProjectDescriptionParagraphTitleSVG(\n                paragraphDiv,\n                `project-description-svg-${i}`\n            )\n            descriptionSVGClass.init()\n                    \n            descriptionSVGClass.createParagraphTitle(\n                descriptionSVGClass.getSVGElement(),\n                paragraph.title\n            )\n\n            descriptionSVGClass.dynamicStartPoints(\"left\")\n            descriptionSVGClass.createParts()\n\n            descriptionSVGClass.dynamicStartPoints(\"right\")\n            descriptionSVGClass.createParts()\n            \n            for (const subParagraph of paragraph.subparagraphs)\n            {\n                const paragraphP = document.createElement(\"p\")\n            \n                paragraphP.textContent = subParagraph.content\n                paragraphP.style.textAlign = \"center\"\n            \n                paragraphDiv.appendChild(paragraphP)\n            }\n        }\n    }\n}", "import { SVGFactory } from \"../../../construct/core/SVGFactory.js\";\nimport { SlideshowContext } from \"../main/SlideshowContext.js\";\n\n\nexport class SlideshowBlockNav\n{\n    constructor(protected context: SlideshowContext) {}\n    \n    public createNavBlocks(projectName: string): void\n    {\n        const group = new SVGFactory(this.context.svg.svg, \"g\", {\n            class: `block-navigation-group-${projectName}`\n        }).createSvgTag()\n\n        // Top\n        new SVGFactory(group, \"path\", {\n            d: \"M685,100 L745,45 L1075,45 L1135,100 L685,100 Z\",\n            id: \"slideshow-previous-button\",\n            class: \"slideshow-nav-button\",\n            stroke: \"rgb(51, 81, 142)\",\n            fill: \"rgba(51, 81, 142, 0.1)\", // Moet transparent zijn, anders werkt klikken niet????\n            \"stroke-width\": 3\n        }).createSvgTag()\n\n        // Top Arrow\n        new SVGFactory(group, \"path\", {\n            d: \"M910,60 L925,85 L895,85 L910,60 Z\",\n            class: \"slideshow-nav-arrow\",\n            stroke: \"none\",\n            fill: \"rgb(51, 81, 142)\"\n        }).createSvgTag()\n\n        // Bottom\n        new SVGFactory(group, \"path\", {\n            d: \"M685,1300 L1135,1300 L1075,1355 L745,1355 L685,1300 Z\",\n            id: \"slideshow-next-button\",\n            class: \"slideshow-nav-button\",\n            stroke: \"rgb(51, 81, 142)\",\n            fill: \"rgba(51, 81, 142, 0.1)\",\n            \"stroke-width\": 3\n        }).createSvgTag()\n        \n        // Bottom Arrow\n        new SVGFactory(group, \"path\", {\n            d: \"M910,1340 L925,1315 L895,1315 L910,1340 Z\",\n            class: \"slideshow-nav-arrow\",\n            stroke: \"none\",\n            fill: \"rgb(51, 81, 142)\"\n        }).createSvgTag()\n    }\n}", "import { SVGFactory } from \"../../../../construct/core/SVGFactory.js\";\nimport { DeconstructPath } from \"../../../../construct/DeconstructPath.js\";\nimport { CreateGradient } from \"../../../../construct/gradient/CreateGradient.js\";\nimport { DrawSegments } from \"../../../../construct/gradient/DrawSegments.js\";\nimport { OffsetVector } from \"../../../../construct/gradient/OffsetVector.js\";\nimport { SlideshowContext } from \"../SlideshowContext.js\";\nimport { SlideshowState } from \"../../nav/SlideshowState.js\";\nimport { SlideshowMainFunctionality } from \"../../nav/main/SlideshowMainFunctionality.js\";\n\n/**\n * Tekent de inner border, masked image en gradients van een slideshow\n */\nexport class SlideshowInnerContent \n{\nprivate innerPath = \"M30,120 L1790,120 L1790,165 L1770,180 L1770,260 L1760,270 L1760,1200 L1750,1210 L1750,1280 L70,1280 L70,1220 L60,1210 L60,270 L50,260 L50,180 L30,165 L30,120\";\n\nprivate innerInnerPath = \"M70,160 L1730,160 L1730,160 L1710,160 L1710,200 L1700,210 L1700,1150 L1690,1150 L1690,1220 L130,1220 L130,1160 L120,1150 L120,210 L110,200 L110,160 L90,160 L70,160\";\n\n    private imageElement: SVGImageElement | null = null;\n\n    constructor(private context: SlideshowContext) {}\n\n    public async drawInnerContentBorder(projectName: string, slideshow: SlideshowMainFunctionality, state: SlideshowState) \n    {\n        this.addInnerMaskToDefs(projectName);\n        await this.addMaskedImage(projectName, slideshow, state);\n\n        const { svg } = this.context;\n        new SVGFactory(svg.svg, \"path\", {\n            d: this.innerPath,\n            stroke: \"rgb(51, 81, 142)\",\n            fill: \"rgba(0,0,0,0.5)\",\n            \"stroke-width\": 2\n        }).createSvgTag();\n    }\n\n    private addInnerMaskToDefs(projectName: string) \n    {\n        const { svg } = this.context;\n        \n        const defs = new SVGFactory(svg.svg, \"defs\", {}).createSvgTag();\n        const mask = new SVGFactory(defs, \"mask\", { \n            id: `inner-mask-${projectName}`, \n            maskUnits: \"userSpaceOnUse\" \n        }).createSvgTag();\n\n        new SVGFactory(mask, \"rect\", {\n            x: 0,\n            y: 0,\n            width: this.context.svg.viewboxWidth,\n            height: this.context.svg.viewboxHeight,\n            fill: \"black\"\n        }).createSvgTag();\n\n        new SVGFactory(mask, \"path\", { \n            d: this.innerPath, \n            fill: \"white\" \n        }).createSvgTag();\n\n        const OFFSET = 75;\n        const innerPoints = DeconstructPath.getPathParts(this.innerInnerPath);\n        const outerPoints = DeconstructPath.getPathParts(this.innerPath);\n\n        for (let i = 0; i < Math.min(outerPoints.length - 1, innerPoints.length - 1); i++) \n        {\n            const [p0, p1] = [outerPoints[i], outerPoints[i + 1]];\n            const [p0A, p1A] = [innerPoints[i], innerPoints[i + 1]];\n\n            const offsetVector = OffsetVector.computeOffsetVector(p0, p1, OFFSET);\n            const gradId = CreateGradient.createSegmentGradient(defs!, p0, offsetVector, i);\n            DrawSegments.drawSegment(svg.svg, p0, p1, p0A, p1A, gradId);\n        }\n    }\n\n    private async addMaskedImage(\n        projectName: string,\n        slideshow: SlideshowMainFunctionality,\n        state: SlideshowState\n    ) \n    {\n        const { svg } = this.context;\n        const imageURL = state.getCurrent()?.image_url;\n\n        const defs = new SVGFactory(svg.svg, \"defs\", {}).createSvgTag();\n\n        const backgroundGradient = new SVGFactory(\n            defs,\n            \"radialGradient\",\n            {\n                id: `image-background-${projectName}`,\n                cx: \"50%\",\n                cy: \"50%\",\n                r: \"70%\"\n            }\n        ).createSvgTag();\n\n        new SVGFactory(backgroundGradient, \"stop\", {\n            offset: \"0%\",\n            \"stop-color\": \"rgba(51, 81, 142, 0.05)\"\n        }).createSvgTag();\n\n        new SVGFactory(backgroundGradient, \"stop\", {\n            offset: \"40%\",\n            \"stop-color\": \"rgba(51, 81, 142, 0.2)\"\n        }).createSvgTag();\n\n        // new SVGFactory(backgroundGradient, \"stop\", {\n        //     offset: \"75%\",\n        //     \"stop-color\": \"rgba(51, 81, 142, 0.1)\"\n        // }).createSvgTag();\n        \n        new SVGFactory(backgroundGradient, \"stop\", {\n            offset: \"100%\",\n            \"stop-color\": \"rgba(51, 81, 142, 0.2)\"\n        }).createSvgTag();\n\n        new SVGFactory(svg.svg, \"path\", {\n            d: this.innerPath,\n            fill: `url(#image-background-${projectName})`\n        }).createSvgTag();\n\n        this.imageElement = new SVGFactory(svg.svg, \"image\", {\n            href: `/static/images/${imageURL}`,\n            x: 0,\n            y: 0,\n            width: this.context.svg.viewboxWidth,\n            height: this.context.svg.viewboxHeight,\n            mask: `url(#inner-mask-${projectName})`,\n            preserveAspectRatio: \"xMidYMid meet\",\n            \"pointer-events\": \"none\"\n        }).createSvgTag() as SVGImageElement;\n\n        slideshow.setImageElement(this.imageElement);\n        slideshow.bindNavigation();\n    }\n}", "import { SlideshowBox } from \"./factory/SlideshowBox.js\"\n// import { SlideshowMainDecoration } from \"./factory/SlideshowMainDecoration.js\"\nimport { SlideshowMainDrawLines, SlideshowMainInstance } from \"./factory/SlideshowMainSVG.js\"\n\nexport class SlideshowContext\n{\n    svg: SlideshowMainInstance\n    boxes: SlideshowBox[] = []\n    // decorations: SlideshowMainDecoration[] = []\n    lines: SlideshowMainDrawLines[] = []\n\n    constructor(svg: SlideshowMainInstance)\n    {\n        this.svg = svg\n    }\n}", "import { CreateSVG } from \"../../../../construct/core/SVGCreate.js\"\nimport { SVGFactory } from \"../../../../construct/core/SVGFactory.js\"\nimport { SlideshowContext } from \"../SlideshowContext.js\"\n\n\nexport class SlideshowMainInstance\n{\n    private SVG: CreateSVG | null = null\n    protected HTMLID: string = \"svg-slideshow-main\"\n    public viewboxWidth: number = 1820\n    public viewboxHeight: number = 1390\n\n    private createSVGElement(): CreateSVG\n    {\n        return new CreateSVG(\n            this.HTMLID,\n            {\n                viewBox: `0 0 ${this.viewboxWidth} ${this.viewboxHeight}`,\n                preserveAspectRatio: \"xMidYMid meet\"\n            },\n            true\n        )\n    }\n\n    public get svg(): CreateSVG\n    {\n        if (!this.SVG)\n            this.SVG = this.createSVGElement()\n\n        return this.SVG\n    }\n}\n\n\nexport class SlideshowMainDrawLines\n{\n    constructor(\n        private context: SlideshowContext,\n        private path: string\n    )\n    {\n        context.lines.push(this)\n    }\n\n    public drawContour(): void\n    {\n        new SVGFactory(this.context.svg.svg, \"path\", {\n            d: this.path,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"none\"\n        }).createSvgTag()\n    }\n}\n", "import { BoxValues } from \"../../../../../../types/slideshow.type\";\n\nimport { SlideshowContext } from \"../../SlideshowContext.js\";\n\n\nexport class CalcBoxSizeValues\n{\n    public static calcSize(context: SlideshowContext): BoxValues\n    {\n        return {\n            width: context.svg.viewboxWidth,\n            height: context.svg.viewboxHeight,\n            halfwayWidth: context.svg.viewboxWidth / 2,\n            halfwayHeight: context.svg.viewboxHeight / 2\n        }\n    }\n}", "import { Point } from \"../../../../../../types/path.properties.type\"\n\nimport { SlideshowContext } from \"../../SlideshowContext.js\"\nimport { CalcBoxSizeValues } from \"./CalcBoxValues.js\"\n\n\nexport class CalcPathDifferenceInCoords\n{\n    public static calcDifference(context: SlideshowContext, pathPoints: Point[]): Point[]\n    {\n        const newPosition = pathPoints.map(p => ({\n            x: CalcBoxSizeValues.calcSize(context).width - p.x,\n            y: p.y\n        }))\n\n        return newPosition\n    }\n}", "import { Point } from \"../../../../../../types/path.properties.type\"\n\nimport { DeconstructPath } from \"../../../../../construct/DeconstructPath.js\"\nimport { SlideshowContext } from \"../../SlideshowContext.js\"\nimport { CalcPathDifferenceInCoords } from \"./CalcPathDifferenceInCoords.js\"\n\n\nexport class CalcMirrorPathVertical\n{\n    public static mirrorPathVertical(context: SlideshowContext, pathPoints: Point[]): string\n    {    \n            const newXPosition = CalcPathDifferenceInCoords.calcDifference(context, pathPoints)\n            \n            return DeconstructPath.createNewSVGPathString(newXPosition)\n        }\n}", "import { Point } from \"../../../../../../types/path.properties.type\"\n\nimport { DeconstructPath } from \"../../../../../construct/DeconstructPath.js\"\nimport { SlideshowContext } from \"../../SlideshowContext.js\"\nimport { CalcMirrorPathVertical } from \"./CalcMirrorPathVertical.js\"\n\n\nexport class CalcPathPositionsInBox\n{\n    public static calcPosition(context: SlideshowContext, id: number, path: string): string\n    {\n        const listPathPoints: Point[] = DeconstructPath.getPathParts(path)\n\n        if (id === 1)\n            return CalcMirrorPathVertical.mirrorPathVertical(context, listPathPoints)!\n\n        return path\n    }\n}", "import { SVGFactory } from \"../../../../../construct/core/SVGFactory.js\"\nimport { SlideshowContext } from \"../../SlideshowContext.js\"\nimport { CalcPathPositionsInBox } from \"../calculation/CalcPathPositionInBox.js\"\n\n\nexport class SlideshowCornerDecoration\n{\n    private cornerOrnamentPaths: Record<string, string> = \n    {\n        LeftTopCorner: \"M10,170 L30,190 L30,270 L10,250\",\n        leftBottomCorner: \"M35,1205 L55,1225 L55,1300 L35,1300\"\n    } \n\n    constructor(private context: SlideshowContext) {}\n\n    public createCornerDecoration(\n        group: SVGElement | null,\n        id: number\n    )\n    {\n        const newLeftTopCorner = CalcPathPositionsInBox.calcPosition(this.context, id, this.cornerOrnamentPaths.LeftTopCorner)\n        const newLeftBottomCorner = CalcPathPositionsInBox.calcPosition(this.context, id, this.cornerOrnamentPaths.leftBottomCorner)\n\n        new SVGFactory(group, \"path\", {\n            d: id === 0 ? this.cornerOrnamentPaths.LeftTopCorner : newLeftTopCorner,\n            stroke: \"rgba(51, 81, 142, 1)\",\n            fill: \"rgba(51, 81, 142, 0.1)\",\n            \"stroke-width\": 3\n        }).createSvgTag()\n\n        new SVGFactory(group, \"path\", {\n            d: id === 0 ? this.cornerOrnamentPaths.leftBottomCorner : newLeftBottomCorner,\n            stroke: \"rgba(51, 81, 142, 1)\",\n            fill: \"rgba(51, 81, 142, 0.1)\",\n            \"stroke-width\": 3\n        }).createSvgTag()\n    }\n}", "import { SVGFactory } from \"../../../../../construct/core/SVGFactory.js\";\nimport { SlideshowContext } from \"../../SlideshowContext.js\";\nimport { CalcPathPositionsInBox } from \"../calculation/CalcPathPositionInBox.js\";\n\n\nexport class SlideshowTopDecoration\n{\n    private decorationLines: Record<string, string> = \n    {\n        ornamentUnderline: \"M730,5 L645,85 L335,85\",\n        ornamentUpperline: \"M690,15 L510,15 L455,70 L385,70\"\n    }\n\n    private decorationOrnamentBlocks: Record<string, string> =\n    {\n        ornamentFirstBlock: \"M703,30 L645,85 L615,85 L673,30 L703,30\",\n        ornamentSeconBlock: \"M653,30 L595,85 L565,85 L623,30 L653,30\",\n        ornamentThirdBlock: \"M603,30 L545,85 L515,85 L573,30 L603,30\",\n        ornamentFourtBlock: \"M553,30 L495,85 L465,85 L523,30 L553,30\"\n    }\n\n    private decorationLayingBlocks: Record<string, string> = \n    {\n        ornamentFirstLayBlock: \"M310,85 L235,85 L225,75 L300,75 L310,85\",\n        ornamentSeconLayBlock: \"M210,85 L135,85 L125,75 L200,75 L210,85\",\n    }\n\n    constructor(private context: SlideshowContext) {}\n\n    public createTopDecoration(group: SVGElement | null, id: number): void\n    {\n        // De 2 lijnen boven en onder de ornament aan de bovenkant vand e SVG\n        this.underlineUpperline(group, id)\n\n        // De 4 schuine blokken binnenin het ornament\n        this.ornamentBlocks(id)\n\n        // De 2 liggende blokken van het ornament\n        this.layingBlocks(id)\n    }\n\n    public underlineUpperline(group: SVGElement | null, id: number): void\n    {\n        const newOrnamentUnderline = CalcPathPositionsInBox.calcPosition(this.context, id, this.decorationLines.ornamentUnderline)\n        const newOrnamentUpperline = CalcPathPositionsInBox.calcPosition(this.context, id, this.decorationLines.ornamentUpperline)\n        \n        // Top underline\n        new SVGFactory(group, \"path\", {\n            d: id === 0 ? this.decorationLines.ornamentUnderline : newOrnamentUnderline,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"none\"\n        }).createSvgTag()\n\n        // Top upperline\n        new SVGFactory(this.context.svg.svg, \"path\", {\n            d: newOrnamentUpperline,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"none\"\n        }).createSvgTag()\n    }\n\n    private ornamentBlocks(id: number): void\n    {\n        const newFirstBlock: string = CalcPathPositionsInBox.calcPosition(this.context, id, this.decorationOrnamentBlocks.ornamentFirstBlock)\n        const newSeconBlock: string = CalcPathPositionsInBox.calcPosition(this.context, id, this.decorationOrnamentBlocks.ornamentSeconBlock)\n        const newThirdBlock: string = CalcPathPositionsInBox.calcPosition(this.context, id, this.decorationOrnamentBlocks.ornamentThirdBlock)\n        const newFourtBlock: string = CalcPathPositionsInBox.calcPosition(this.context, id, this.decorationOrnamentBlocks.ornamentFourtBlock)\n\n        // Eerst schuine blok (vanaf rechts)\n        new SVGFactory(this.context.svg.svg, \"path\", {\n            d: id === 0 ? this.decorationOrnamentBlocks.ornamentFirstBlock : newFirstBlock,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"rgba(8, 63, 174, 0.1)\"\n        }).createSvgTag()\n\n        // Tweede schuine blok\n        new SVGFactory(this.context.svg.svg, \"path\", {\n            d: id === 0 ? this.decorationOrnamentBlocks.ornamentSeconBlock : newSeconBlock,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"rgba(8, 63, 174, 0.1)\"\n        }).createSvgTag()\n\n        // Derde schuine blok\n        new SVGFactory(this.context.svg.svg, \"path\", {\n            d: id === 0 ? this.decorationOrnamentBlocks.ornamentThirdBlock : newThirdBlock,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"rgba(8, 63, 174, 0.1)\"\n        }).createSvgTag()\n\n        // Vierdde schuine blok\n        new SVGFactory(this.context.svg.svg, \"path\", {\n            d: id === 0 ? this.decorationOrnamentBlocks.ornamentFourtBlock : newFourtBlock,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"rgba(8, 63, 174, 0.1)\"\n        }).createSvgTag()\n    }\n\n    private layingBlocks(id: number): void\n    {\n        const newFirstLayBlock: string = CalcPathPositionsInBox.calcPosition(this.context, id, this.decorationLayingBlocks.ornamentFirstLayBlock)\n        const newSeconLayBlock: string = CalcPathPositionsInBox.calcPosition(this.context, id, this.decorationLayingBlocks.ornamentSeconLayBlock)\n\n        // Eerst liggen blok (vanaf rechts in box 0)\n        new SVGFactory(this.context.svg.svg, \"path\", {\n            d: id === 0 ? this.decorationLayingBlocks.ornamentFirstLayBlock : newFirstLayBlock,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"rgba(8, 63, 174, 0.1)\"\n        }).createSvgTag()\n\n        new SVGFactory(this.context.svg.svg, \"path\", {\n            d: id === 0 ? this.decorationLayingBlocks.ornamentSeconLayBlock : newSeconLayBlock,\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": 3,\n            fill: \"rgba(8, 63, 174, 0.2\"\n        }).createSvgTag()\n    }\n}", "import { SVGFactory } from \"../../../../construct/core/SVGFactory.js\"\nimport { SlideshowContext } from \"../SlideshowContext.js\"\nimport { SlideshowCornerDecoration } from \"./decoration/SlideshowCornerDecoration.js\"\nimport { SlideshowTopDecoration } from \"./decoration/SlideshowTopDecoration.js\"\n\n\nexport class SlideshowBox\n{\n    public id: number\n    private static boxPosition = 0\n\n    constructor(protected context: SlideshowContext)\n    {\n        this.id = SlideshowBox.boxPosition\n        SlideshowBox.boxPosition += 1\n        context.boxes.push(this)\n\n        this.drawBoxDecorations() \n    }\n\n    public createGroup(): SVGElement | null\n    {\n        const group = new SVGFactory(this.context.svg.svg, \"g\", {\n            class: `slideshow-svg-box-decoartion-${this.id}`\n        }).createSvgTag()\n\n        return group\n    }\n\n    private drawBoxDecorations(): void\n    {\n        const group = this.createGroup()\n\n        const cornersDecoration = new SlideshowCornerDecoration(this.context)\n        cornersDecoration.createCornerDecoration(group, this.id)\n\n        const topDecoration = new SlideshowTopDecoration(this.context)\n        topDecoration.createTopDecoration(group, this.id)\n\n        // const navBlocks = new SlideshowBlockNav()\n        // navBlocks.createTopDecoration(group)\n    }\n}\n", "import { ProjectImageSlideshowType } from \"../../../../types/projects.type\";\n\n\n/**\n * SlideshowState houd bij welke afbeelding er wordt getoond\n */\nexport class SlideshowState \n{\n    public projectImages: ProjectImageSlideshowType[] = [];\n    public currentIndex: number = 0;\n    public windowStartIndex: number = 0 // Slideing window\n    private listeners: (() => void)[] = [];\n\n    constructor(images: ProjectImageSlideshowType[]) \n    {\n        this.projectImages = images;\n        this.setActive(0);\n    }\n\n    public setActive(index: number) \n    {\n        this.projectImages.forEach((img, i) => img.is_active = i === index)\n        this.currentIndex = index\n    \n        const maxVisible = 7\n    \n        if (this.currentIndex >= this.windowStartIndex + maxVisible) \n            this.windowStartIndex = this.currentIndex - maxVisible + 1\n    \n        if (this.currentIndex < this.windowStartIndex)\n            this.windowStartIndex = this.currentIndex\n    \n        if (this.currentIndex === 0) \n            this.windowStartIndex = 0\n    \n        this.notify()\n    }\n\n    public next() \n    { \n        const newIndex = (this.currentIndex + 1) % this.projectImages.length;\n        this.setActive(newIndex); \n    }\n\n    public previous() \n    { \n        const newIndex = (this.currentIndex - 1 + this.projectImages.length) % this.projectImages.length;\n        this.setActive(newIndex); \n    }\n\n    public getCurrent() \n    { \n        return this.projectImages[this.currentIndex] ?? null; \n    }\n\n    public subscribe(callback: () => void) \n    {\n        this.listeners.push(callback);\n    }\n\n    private notify() \n    {\n        this.listeners.forEach(callbackF => callbackF());\n    }\n}", "import { SlideshowState } from \"../SlideshowState\";\n\n/**\n * SlideshowMainFunctionality koppelt de slideshow-state aan een SVGImageElement en knoppen\n */\nexport class SlideshowMainFunctionality\n{\n    private imageElement: SVGImageElement | null = null;\n    private handleNext = () => this.state.next();\n    private handlePrev = () => this.state.previous();\n\n    constructor(private state: SlideshowState) \n    {\n        this.state.subscribe(() => this.updateDOM());\n    }\n\n    public setImageElement(el: SVGImageElement) \n    {\n        this.imageElement = el;\n    }\n\n    private updateDOM() \n    {\n        const current = this.state.getCurrent();\n\n        if (this.imageElement && current) \n            this.imageElement.setAttribute(\"href\", `/static/images/${current.image_url}`);\n    }\n\n    public bindNavigation(nextId = \"slideshow-next-button\", prevId = \"slideshow-previous-button\") \n    {    \n        const next = document.getElementById(nextId);\n        const prev = document.getElementById(prevId);\n\n        if (next) \n            next.onclick = this.handleNext;\n\n        if (prev)\n            prev.onclick = this.handlePrev;\n    }\n\n}\n", "import { ProjectImageSlideshowType } from \"../../../../../types/projects.type.js\";\nimport { SVGFactory } from \"../../../../construct/core/SVGFactory.js\"\nimport { DeconstructPath } from \"../../../../construct/DeconstructPath.js\";\nimport { HexaStyling } from \"../../../../sharedHexStyling/HexaStyling.js\";\nimport { SlideshowState } from \"../../nav/SlideshowState.js\"\n\nexport abstract class AbstractSmallSlideshow\n{\n    protected container: HTMLElement | null = document.getElementById(\"svg-images-list-container\");\n\n    protected SVG: SVGElement | null = null;\n    protected defs: SVGElement | null = null;\n    protected coords: Array<{ x: number; y: number }> | null = null\n\n    constructor(\n        protected state: SlideshowState,\n        protected projectName: string\n    )\n    {\n        this.state.subscribe(() => this.render());\n        this.render();\n    }\n\n    private render()\n    {\n        if (!this.container) \n            return null;\n\n        this.container.replaceChildren();\n        this.build();\n    }\n\n    protected abstract build(): void;\n}\n\nexport class SmallSVGSlideshow extends AbstractSmallSlideshow\n{\n    protected build(): void\n    {\n        if (!this.container) \n            return;\n\n        this.createMainSVG();\n        this.createDefs();\n        this.createDynamicPathCoords()\n        this.drawRaster()\n        this.drawImages();\n    }\n\n    private createMainSVG(): void\n    {\n        this.SVG = document.createElementNS(\n            \"http://www.w3.org/2000/svg\",\n            \"svg\"\n        );\n\n        this.SVG.setAttribute(\"viewBox\", \"0 -75 500 1125\");\n        this.SVG.classList.add(\"slideshow-small-main-svg\");\n\n        this.container?.appendChild(this.SVG);\n    }\n\n    private createDefs(): void\n    {\n        this.defs = new SVGFactory(this.SVG, \"defs\", {\n            id: `small-slideshow-defs-${this.projectName}`\n        }).createSvgTag()\n\n        HexaStyling.createInnerShadowDefs(this.defs, this.projectName)\n    }\n\n    private createDynamicPathCoords(): void\n    {\n        const maxSlots = Math.min(this.state.projectImages.length, 8)\n        this.coords = SmallSVGImagesSlideshow.calcNewCoords(maxSlots)\n    }\n\n    private drawImages(): void\n    {\n        if (!this.SVG || !this.coords) \n            return;\n\n        const maxVisible = 7;\n        const totalImages = this.state.projectImages.length;\n\n        const start = this.state.windowStartIndex;\n        const end = Math.min(start + maxVisible, totalImages);\n        const visibleImages = this.state.projectImages.slice(start, end);\n\n        let counter = 0;\n\n        visibleImages.forEach(img => {\n            SmallSVGImagesSlideshow.createClipPaths(\n                this.defs,\n                this.projectName,\n                counter,\n                this.coords!\n            )\n\n            SmallSVGImagesSlideshow.createSmallImages(\n                this.SVG,\n                this.projectName,\n                counter,\n                img,\n                this.coords!,\n                start + counter,\n                this.state\n            )\n\n            counter++;\n        });\n\n        if (totalImages > maxVisible) \n        {\n            const remaining = totalImages - maxVisible;\n            const overflowIndex = counter;\n\n            SmallSVGImagesSlideshow.createClipPaths(\n                this.defs,\n                this.projectName,\n                overflowIndex,\n                this.coords!\n            )\n\n            SmallSVGImagesSlideshow.createOverflowTile(\n                this.SVG,\n                this.projectName,\n                overflowIndex,\n                remaining,\n                this.coords!\n            )\n        }\n    }\n\n    private drawRaster(): void \n    {\n        if (!this.SVG || !this.coords) \n            return\n\n        const hexPath = [\n            { x: 110, y: 15 },\n            { x: 210, y: 15 },\n            { x: 260, y: 115 },\n            { x: 210, y: 215 },\n            { x: 110, y: 215 },\n            { x: 60, y: 115 },\n            { x: 110, y: 15 }\n        ];\n\n        const offsetX = 60; \n        const offsetY = 60;\n\n        let rasterPath = \"\";\n\n        this.coords.forEach(coord => {\n            hexPath.forEach((p, idx) => {\n                const x = p.x + coord.x + offsetX;\n                const y = p.y + coord.y + offsetY;\n\n                rasterPath += (idx === 0 ? \"M\" : \"L\") + `${x},${y} `;\n            });\n        });\n\n        const pathEl = document.createElementNS(\n            \"http://www.w3.org/2000/svg\",\n            \"path\"\n        );\n\n        pathEl.setAttribute(\"d\", rasterPath.trim());\n        pathEl.setAttribute(\"fill\", \"none\");\n        pathEl.setAttribute(\"stroke\", \"rgba(51, 81, 142, 0.5)\");\n        pathEl.setAttribute(\"stroke-width\", \"2\");\n\n        this.SVG.appendChild(pathEl);\n    }\n}\n\nexport class SmallSVGImagesSlideshow\n{\n    public static createClipPaths(\n        defs: SVGElement | null, \n        projectName: string, \n        counter: number,\n        coords: Array<{ x: number; y: number }>\n    ): void\n    {\n        const path = \"M110,15 L210,15 L260,115 L210,215 L110,215 L60,115 L110,15\"\n\n        const hashPath = DeconstructPath.getPathParts(path)\n\n        const newCoords = hashPath.map(c => ({\n            x: c.x + coords[counter].x,\n            y: c.y + coords[counter].y\n        }));\n\n        const newPath = DeconstructPath.createNewSVGPathString(newCoords)\n\n        const clipPath = new SVGFactory(defs, \"clipPath\", {\n            id: `hex-image-${projectName}-${counter}`,\n            clipPathUnits: \"userSpaceOnUse\"\n        }).createSvgTag()\n\n        new SVGFactory(clipPath, \"path\", {\n            d: newPath\n        }).createSvgTag()\n    }\n\n    public static createSmallImages(\n        SVG: SVGElement | null,\n        projectName: string, \n        counter: number,\n        img: ProjectImageSlideshowType,\n        coords: Array<{ x: number; y: number }>,\n        imageIndex: number,\n        state: SlideshowState\n    ): void\n    {\n        const offsetX = 60;\n        const offsetY = 15;\n\n        const group = new SVGFactory(SVG, \"g\", {\n            \"clip-path\": `url(#hex-image-${projectName}-${counter})`,\n            class: \"hexa-image\",\n            cursor: \"pointer\"\n        }).createSvgTag()\n\n        group?.addEventListener(\"click\", () =>\n        {\n            state.setActive(imageIndex)\n        })\n\n        new SVGFactory(group, \"image\", {\n            href: `../static/images/${img.image_url}`,\n            x: coords[counter].x + offsetX,\n            y: coords[counter].y + offsetY,\n            width: 200,\n            height: 200,\n            preserveAspectRatio: \"xMidYMid slice\"\n        }).createSvgTag()\n\n        HexaStyling.activeImageStyling(\n            img,\n            group,\n            coords,\n            counter\n        )\n\n        // Alle images een inner shadow, behalve de active image\n        if (!img.is_active)\n        {\n            HexaStyling.createInnerShadow(\n                group,\n                coords[counter].x,\n                coords[counter].y,\n                projectName,\n                \"small\"\n            );\n        }\n    }\n    \n    public static createOverflowTile(\n        SVG: SVGElement | null,\n        projectName: string,\n        counter: number,\n        remaining: number,\n        coords: Array<{ x: number; y: number }>\n    ): void\n    {\n        const group = new SVGFactory(SVG, \"g\", {\n            \"clip-path\": `url(#hex-image-${projectName}-${counter})`,\n        }).createSvgTag();\n\n        const path = \"M110,15 L210,15 L260,115 L210,215 L110,215 L60,115 L110,15\";\n\n        const hashPath = DeconstructPath.getPathParts(path);\n\n        const newCoords = hashPath.map(c => ({\n            x: c.x + coords[counter].x,\n            y: c.y + coords[counter].y\n        }));\n\n        const newPath = DeconstructPath.createNewSVGPathString(newCoords);\n\n        new SVGFactory(group, \"path\", {\n            d: newPath,\n            fill: \"rgba(51, 81, 142, 0.2)\",\n            stroke: \"rgb(51, 81, 142)\",\n            \"stroke-width\": \"6\"\n        }).createSvgTag();\n\n        const textEl = new SVGFactory(group, \"text\", {\n            x: coords[counter].x + 160,\n            y: coords[counter].y + 125,\n            \"text-anchor\": \"middle\",\n            \"font-size\": \"34\",\n            \"font-weight\": \"bold\",\n            fill: \"rgb(51, 81, 142)\",\n        }).createSvgTag();\n\n        if (textEl) \n        {\n            textEl.textContent = `${remaining} meer...`;\n            textEl.style.userSelect = \"none\"\n        }\n    }\n\n    public static calcNewCoords(\n        count: number\n    ): Array<{ x: number; y: number }> \n    {\n        const width = 200;\n        const height = 200;\n\n        const coords: { x: number; y: number }[] = [];\n\n        for (let i = 0; i < count; i++) \n        {\n            const col = i % 2;\n            const row = Math.floor(i);\n\n            const x = col * (width * 0.85);\n            const y = row * (height * 0.55);\n\n            coords.push({ x, y });\n        }\n\n        return coords;\n    }\n}", "import { SlideshowBlockNav } from \"./nav/SlideshowBlockNav.js\";\nimport { SlideshowInnerContent } from \"./main/factory/SlideshowInnerContent.js\";\nimport { SlideshowContext } from \"./main/SlideshowContext.js\";\nimport { SlideshowMainDrawLines, SlideshowMainInstance } from \"./main/factory/SlideshowMainSVG.js\";\nimport { SlideshowBox } from \"./main/factory/SlideshowBox.js\";\nimport { SlideshowState } from \"./nav/SlideshowState.js\";\nimport { SlideshowMainFunctionality } from \"./nav/main/SlideshowMainFunctionality.js\";\nimport { SmallSVGSlideshow } from \"./small/factory/SlideshowSmallSVG.js\";\nimport { ProjectType } from \"../../../types/projects.type.js\";\n\n\nexport async function initSlideshow(projectName: string, projectData: ProjectType): Promise<void> \n{\n    const svg = new SlideshowMainInstance();\n    const context = new SlideshowContext(svg);\n\n    const pathMain = \"M10,100 L655,100 L735,25 L1085,25 L1165,100 L1810,100 L1810,250 L1785,275 L1785,1300 L1165,1300 L1085,1375 L735,1375 L655,1300 L35,1300 L35,275 L10,250 L10,100 Z\";\n    const lines = new SlideshowMainDrawLines(context, pathMain);\n    lines.drawContour();\n\n    // Verdeel de SVG in 2 boxes voor duplicate designs\n    new SlideshowBox(context);\n    new SlideshowBox(context);\n\n    const navBlocks = new SlideshowBlockNav(context);\n    navBlocks.createNavBlocks(projectName);\n\n    // const fetcher = new FetchProject();\n    // const projectData = await fetcher.getProjectData(projectName);\n\n    const images = projectData.images\n        .filter(img => !img.is_logo)\n        .map((img, index) => ({ ...img, is_active: index === 0 }));\n\n    const slideshowState = new SlideshowState(images);\n\n    const mainSlideshow = new SlideshowMainFunctionality(slideshowState);\n    mainSlideshow.bindNavigation();\n\n    const smallSlideshow = new SmallSVGSlideshow(slideshowState, projectName);\n    // smallSlideshow.initSmallSVGSlideshow();\n    // smallSlideshow.initSmallImages()\n\n    const innerContent = new SlideshowInnerContent(context);\n    await innerContent.drawInnerContentBorder(projectName, mainSlideshow, slideshowState);\n}\n", "import { ProjectType } from \"../../../types/projects.type\"\n\nexport class ProjectSpecificationFactory\n{\n    constructor(\n        private allSpecNames: Array<string>,\n        private HTMLID: string,\n        private projectData: ProjectType\n    ) {}\n\n    public createEachSpecification(): void\n    {\n        if (!this.HTMLID) return\n\n        const htmlContainer = document.getElementById(this.HTMLID)\n        if (!htmlContainer) return\n\n        for (const specName of this.allSpecNames)\n        {\n            const hasSpecs = this.projectData.specifications.some(\n                s => s.category.toLowerCase() === specName.toLowerCase()\n            )\n\n            if (!hasSpecs) \n                continue\n\n            const specification = new ProjectSpecificationUnit(specName)\n            specification.setProjectData(this.projectData)\n            htmlContainer.appendChild(specification.createHTMLElement())\n        }\n    }\n}\n\nexport class ProjectSpecificationUnit\n{\n    private projectData: ProjectType | null = null\n\n    constructor(private specificationName: string) {}\n\n    public setProjectData(projectData: ProjectType): void\n    {\n        this.projectData = projectData\n    }\n\n    public createHTMLElement(): HTMLElement\n    {\n        const wrapper = document.createElement(\"div\")\n        wrapper.className = \"spec-accordion-item\"\n\n        const contentDiv = this.buildContent()\n\n        const svgComponent = new ProjectSpecificationSVG(wrapper)\n        svgComponent.init(this.specificationName, contentDiv)\n\n        return wrapper\n    }\n\n    private buildContent(): HTMLElement\n    {\n        const contentDiv = document.createElement(\"div\")\n        contentDiv.className = \"spec-html-content\"\n\n        const ul = document.createElement(\"ul\")\n\n        const scale = window.matchMedia(\"(max-width: 768px)\").matches ? 2 : 1\n\n        for (const spec of this.projectData!.specifications)\n        {\n            if (this.specificationName.toLowerCase() === spec.category.toLowerCase())\n            {\n                const li = document.createElement(\"li\")\n                li.textContent = spec.specification\n\n                if (scale === 2)\n                {\n                    li.style.fontSize = \"1.2rem\"\n                    li.style.lineHeight = \"1.6\"\n                }\n\n                ul.appendChild(li)\n            }\n        }\n\n        contentDiv.appendChild(ul)\n        return contentDiv\n    }\n}\n\nexport class ProjectSpecificationSVG\n{\n    private svgNS = \"http://www.w3.org/2000/svg\"\n\n    private svg!: SVGSVGElement\n    private border!: SVGRectElement\n    private headerPath!: SVGPathElement\n    private foreign!: SVGForeignObjectElement\n\n    private scale = window.matchMedia(\"(max-width: 768px)\").matches ? 2 : 1\n\n    private headerHeight = 30 * this.scale\n    private baseHeight = 40 * this.scale\n\n    constructor(private wrapper: HTMLElement) {}\n\n    public init(title: string, htmlContent: HTMLElement): void\n    {\n        this.createSVG()\n        this.createBorder()\n        this.createHeaderPath(title)\n        this.createForeignObject(htmlContent)\n    }\n\n    private createSVGElement<T extends keyof SVGElementTagNameMap>(\n        tag: T\n    ): SVGElementTagNameMap[T]\n    {\n        return document.createElementNS(this.svgNS, tag) as SVGElementTagNameMap[T]\n    }\n\n    private createSVG(): void\n    {\n        this.svg = this.createSVGElement(\"svg\")\n        this.svg.setAttribute(\"viewBox\", `-5 -5 610 ${this.baseHeight + 10}`)\n        this.svg.classList.add(\"spec-accordion-svg\")\n        this.wrapper.appendChild(this.svg)\n    }\n\n    private createBorder(): void\n    {\n        this.border = this.createSVGElement(\"rect\")\n        this.border.setAttribute(\"x\", \"0\")\n        this.border.setAttribute(\"y\", \"0\")\n        this.border.setAttribute(\"width\", \"600\")\n        this.border.setAttribute(\"height\", this.baseHeight.toString())\n        this.border.classList.add(\"spec-border\")\n        this.svg.appendChild(this.border)\n    }\n\n    private createHeaderPath(title: string): void\n    {\n        const group = this.createSVGElement(\"g\")\n        group.setAttribute(\"class\", \"accordion-header-group\")\n        // group.setAttribute(\"transform\", `scale(1 ${this.scale})`)\n        const headerScale = this.scale * 0.8\n        group.setAttribute(\"transform\", `scale(1 ${headerScale})`)\n\n        const firstArrowLeft = \"M0,20 L20,0 L25,0 L5,20 L25,40 L20,40 L0,20\"\n        const secondArrowLeft = \"M15,20 L35,0 L40,0 L20,20 L40,40 L35,40 L15,20\"\n        const midPart = \"M30,20 L50,0 L550,0 L570,20 L550,40 L50,40 L30,20\"\n        const firstArrowRight = \"M580,20 L560,0 L565,0 L585,20 L565,40 L560,40 L580,20\"\n        const secondArrowRight = \"M595,20 L575,0 L580,0 L600,20 L580,40 L575,40 L595,20\"\n    \n        const mainPathE = this.createSVGElement(\"path\")\n        mainPathE.setAttribute(\"class\", \"accordion-header-path\")\n        mainPathE.setAttribute(\"d\", `${firstArrowLeft} ${secondArrowLeft} ${midPart} ${firstArrowRight} ${secondArrowRight}`)\n        mainPathE.setAttribute(\"stroke\", \"rgba(51, 81, 142, 1)\")\n        mainPathE.setAttribute(\"stroke-width\", \"2\")\n        mainPathE.setAttribute(\"vector-effect\", \"non-scaling-stroke\")\n    \n        const text = this.createSVGElement(\"text\")\n        text.setAttribute(\"class\", \"accordion-title\")\n        text.setAttribute(\"x\", \"300\")\n        text.setAttribute(\n            \"y\",\n            ((this.headerHeight / 2) / headerScale).toString()\n        )\n        text.setAttribute(\"dominant-baseline\", \"middle\")\n        text.setAttribute(\"text-anchor\", \"middle\")\n\n        text.setAttribute(\"fill\", \"rgba(51, 81, 142, 1)\")\n        // text.setAttribute(\"stroke\", \"rgba(51, 81, 142, 1)\")\n        // text.setAttribute(\"stroke-width\", \"1\")\n\n        text.textContent = title.toUpperCase()\n        text.style.userSelect = \"none\"\n\n        if (this.scale === 2)\n        {\n            text.style.fontSize = \"1rem\"\n            text.style.letterSpacing = \"0.1em\"\n        }\n    \n        group.appendChild(mainPathE)\n        group.appendChild(text)\n    \n        group.addEventListener(\"click\", () => this.toggleContent())\n    \n        this.svg.appendChild(group)\n    }\n\n    private createForeignObject(htmlContent: HTMLElement): void\n    {\n        this.foreign = this.createSVGElement(\"foreignObject\")\n        this.foreign.setAttribute(\"x\", \"0\")\n        this.foreign.setAttribute(\"y\", this.headerHeight.toString())\n        this.foreign.setAttribute(\"width\", \"600\")\n        this.foreign.setAttribute(\"height\", \"0\")\n        this.foreign.classList.add(\"spec-content\")\n        this.foreign.appendChild(htmlContent)\n        this.svg.appendChild(this.foreign)\n    }\n\n    private toggleContent(): void\n    {\n        const isOpen = this.svg.classList.toggle(\"open\")\n\n        const htmlContent = this.foreign.firstElementChild as HTMLElement\n        if (!htmlContent) return\n\n        if (isOpen)\n        {\n            requestAnimationFrame(() =>\n            {\n                const contentHeight = htmlContent.scrollHeight\n                const totalHeight = this.headerHeight + contentHeight\n                const extra = 4\n\n                this.foreign.setAttribute(\"height\", (contentHeight + extra).toString())\n\n                this.svg.setAttribute(\n                    \"viewBox\",\n                    `-5 -5 610 ${totalHeight + 10 + extra}`\n                )\n\n                this.border.setAttribute(\"height\", totalHeight.toString())\n            })\n        }\n        else\n        {\n            this.foreign.setAttribute(\"height\", \"0\")\n\n            this.svg.setAttribute(\n                \"viewBox\",\n                `-5 -5 610 ${this.baseHeight + 10}`\n            )\n\n            this.border.setAttribute(\"height\", this.baseHeight.toString())\n        }\n    }\n}", "import { ProjectType } from \"../../../types/projects.type.js\"\nimport { ProjectSpecificationFactory } from \"./ProjectSpecificationFactory.js\"\n\nexport function specInit(projectData: ProjectType)\n{\n    const specNames = [\n    \"Hardware\", // fysieke componenten (printplaten, controllers, drivers)\n    \"Software\", // applicaties, backend, frontend\n    \"Communicatie\", // CAN, I2C, SPI, UART, netwerk\n    \"Protocol\", // berichtstructuur, datadefinitie, encoding\n    \"Sensor\",\n    \"Beveiliging\", // encryptie, authenticatie, noodstop, failsafe, fysieke risico\u2019s\n    \"Interface\", // UI, API, fysieke bediening\n    \"Dataformat\"\n]\n\n    const specInstance = new ProjectSpecificationFactory(specNames, \"project-detail-section-specification\", projectData)\n    specInstance.createEachSpecification()\n}", "import { FetchProject } from \"../../endpoints/service/FetchProject.js\";\nimport { ProjectType } from \"../../types/projects.type\";\nimport { contributorInit } from \"./contributors/contributorInit.js\";\nimport { ProjectDescriptionFactory } from \"./description/ProjectDescriptionFactory.js\";\nimport { initSlideshow } from \"./slideshow/slideshowInit.js\";\nimport { specInit } from \"./specifications/specInit.js\";\n\nexport async function fetchProject(projectName: string): Promise<ProjectType>\n{\n    const fetcher = new FetchProject();\n    return await fetcher.getProjectData(projectName);\n}\n\nexport function projectInit(projectName: string, projectData: ProjectType)\n{   \n    initSlideshow(projectName, projectData)\n    const projectDescription = new ProjectDescriptionFactory(projectName, projectData)\n    projectDescription.addToParentElement()\n    specInit(projectData)\n    contributorInit(projectData)\n}", "export class Console\n{\n    public static logoInConsole()\n    {\n        const logo = String.raw`\n     ///\\\\\\ \\\\ \\\\ \\\\\\\n    ///  \\\\\\       \\\\\\\n   ///    \\\\\\       \\\\\\\n  /// |||| \\\\\\       \\\\\\\n ///        \\\\\\       \\\\\\\n///          \\\\\\ \\\\ \\\\ \\\\\\\n`\n        console.log(logo)\n    }\n}", "import { CreateSVG } from \"../svg/construct/core/SVGCreate.js\";\nimport { SVGFactory } from \"../svg/construct/core/SVGFactory.js\";\nimport { SVGCircleAttributes } from \"../types/attributes.js\";\n\nexport class LoadingScreen\n{\n    private SVGElement: CreateSVG | null = null\n    private viewboxSize: string = \"0 0 400 400\"\n    private preserveAspectRatio: string = \"xMidYMid meet\"\n\n    private circles: Element[] = []\n    private activeIndex: number = 0\n    private cycleInterval: number | null = null\n\n    constructor(\n        private svgID: string\n    ) {}\n\n    private createSVGElement(): void\n    {\n        this.SVGElement = new CreateSVG(\n            this.svgID,\n            {\n                viewBox: this.viewboxSize,\n                preserveAspectRatio: this.preserveAspectRatio\n            },\n            true\n        )\n    }\n\n    private appendSVGToDOM(): void\n    {\n        if (!this.SVGElement)\n            return\n\n        this.SVGElement.createRootSVG(\"page-loader-content\")\n    }\n\n    private createLoadingCircle()\n    {\n        const circleCount = 16\n        const radius = 180\n        const circumference = 2 * Math.PI * radius\n        const segmentLength = circumference / circleCount\n        const visibleLength = segmentLength * 0.6\n\n        for (let i = 0; i < circleCount; i++)\n        {\n            const factory = new SVGFactory<SVGCircleAttributes>(this.SVGElement,\n                \"circle\",\n                {\n                    class: \"inactive-loading-circle\",\n                    cx: 200,\n                    cy: 200,\n                    r: radius,\n                    \"stroke-width\": 20,\n                    fill: \"none\",\n                    \"stroke-dasharray\": `${visibleLength} ${circumference - visibleLength}`,\n                    \"stroke-dashoffset\": -segmentLength * i\n                }\n            )\n            const el = factory.createSvgTag()\n            this.circles.push(el as Element)\n        }\n    }\n\n    private assignColors(): void\n    {\n        this.circles.forEach((circle, i) => {\n            circle.classList.remove(\n                \"active-loading-circle\",\n                \"second-loading-circle\",\n                \"third-loading-circle\",\n                \"fourth-loading-circle\",\n                \"inactive-loading-circle\"\n            )\n\n            if (i === this.activeIndex) \n                circle.classList.add(\"active-loading-circle\")\n            else if (i === (this.activeIndex + 1) % this.circles.length)\n                circle.classList.add(\"second-loading-circle\")\n            else if (i === (this.activeIndex + 2) % this.circles.length)\n                circle.classList.add(\"third-loading-circle\")\n            else if (i === (this.activeIndex + 3) % this.circles.length)\n                circle.classList.add(\"fourth-loading-circle\")\n            else\n                circle.classList.add(\"inactive-loading-circle\")\n        })\n\n        this.activeIndex = (this.activeIndex + 1) % this.circles.length\n    }\n\n    private startColorCycle(): void\n    {\n        this.assignColors()\n\n        this.cycleInterval = window.setInterval(() => {\n            this.assignColors()\n        }, 100)\n    }\n\n    public init()\n    {\n        // Do not show the scrollbar when loading screen is active\n        document.documentElement.classList.add(\"is-loading\")\n\n        this.createSVGElement()\n        this.appendSVGToDOM()\n        this.createLoadingCircle()\n        this.startColorCycle()\n    }\n\n    public finish(): void\n    {\n        if (this.cycleInterval !== null)\n            window.clearInterval(this.cycleInterval)\n    \n        document.documentElement.classList.remove(\"is-loading\")\n        document.getElementById(\"page-loader\")?.classList.add(\"loaded\")\n    }\n}", "export class LoadAssets\n{\n    static async waitForAssets(): Promise<void>\n    {\n        const images = Array.from(document.images)\n\n        await Promise.all(\n            images.map((image) =>\n            {\n                if (image.complete)\n                    return Promise.resolve()\n\n                return new Promise<void>((resolve) =>\n                {\n                    image.addEventListener(\"load\", () => resolve(), { once: true })\n                    image.addEventListener(\"error\", () => resolve(), { once: true })\n                })\n            })\n        )\n\n        await document.fonts.ready\n    }\n}", "// import { initEndpoints, initProjectService } from \"./endpoints/initEndpoints.js\";\n\nimport { TimelineAnimation } from \"./utils/Timeline.js\";\nimport { Background } from \"./utils/Background.js\";\nimport { Dropdown } from \"./utils/NavDropdown.js\";\n\nimport { FancyText } from \"./svg/views/homepage/FancyText.js\";\n\nimport { ProfilePicFactory } from \"./svg/homepage/factory/profile_pic/ProfilePicFactory.js\";\nimport { exportClass } from \"./svg/homepage/factory/programming_languages/main/LanguagesFactory.js\";\nimport { LanguageSmallBorder } from \"./svg/homepage/factory/programming_languages/small/LanguageSmallFactory.js\";\n\nimport { initProjects } from \"./svg/projects/projectsInit.js\"\nimport { initSlideshow } from \"./svg/project/slideshow/slideshowInit.js\"\nimport { fetchProject, projectInit } from \"./svg/project/projectInit.js\";\nimport { ProjectType } from \"./types/projects.type.js\";\nimport { Console } from \"./utils/Console.js\";\nimport { LoadingScreen } from \"./utils/LoadingScreen.js\";\nimport { LoadAssets } from \"./utils/loading_screen/WaitForAssets.js\";\n\n// Website background\nnew Background(\"stars\", 50);\n\n// Loading screen background\nnew Background(\"page-loader-stars\", 50);\n\nconst navDropdown = new Dropdown();\n\nnew TimelineAnimation();\n\n\ndocument.addEventListener(\"DOMContentLoaded\", async () => \n{\n    const loadingScreen = new LoadingScreen(\"page-loader-svg-animation\")\n    loadingScreen.init()\n\n    navDropdown.checkForButton();\n\n    // Funny extra thing in the console\n    Console.logoInConsole()\n\n    // Check which page is shown\n    const whichPage = document.body.dataset.page\n\n    // Project naam (URL friendly)\n    const projectName = document.body.dataset.project_name\n\n    // Homepage\n    if (window.location.pathname === \"/\")\n    {\n        // Banner\n        new FancyText({ timeout: 5, iterations: 10 }, 50000).start();\n        const profilePicSVG = new ProfilePicFactory;\n        profilePicSVG.init();\n\n        // Third section -- Programming Languages main container\n        exportClass();\n\n        // Third section -- Programming Languages 8 smaller containers\n        new LanguageSmallBorder().createInnerPath();\n    }\n\n    if (window.location.pathname === \"/projecten/\")\n    {\n        await initProjects()\n    }\n\n    if (whichPage === \"project_detail_page\") // ---- ALLE PAGINA'S MOETEN OP DEZE MANIER@#%^%$#$@\n    {\n        const project = await fetchProject(projectName!)\n        projectInit(projectName!, project)\n    }\n\n    // Wait for al content to be loaded\n    // When finished, hide loading screen\n    await LoadAssets.waitForAssets()\n    loadingScreen.finish()\n})"],
  "mappings": "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",
  "names": ["TimelineAnimation", "timelineSelector", "contentSelector", "el", "i", "entries", "entry", "index", "delay", "img", "timelineItems", "currentItem", "nextItem", "currentDot", "nextDot", "top", "height", "lineLeft", "line", "Background", "canvasId", "numStars", "canvasEl", "context", "i", "star", "Dropdown", "isOpen", "FancyText", "options", "delay", "min", "max", "characters", "str", "offset", "result", "count", "inTag", "i", "char", "callback", "nextOptions", "partialString", "combinedOptions", "run", "CalcCircleProperties", "radius", "circumference", "dasharrayElement", "availableRoom", "strokeWidth", "basicRadius", "SVG", "SVGHTMLID", "SVGAttributes", "SVGDefaultStyling", "HTMLElement", "key", "value", "CreateSVG", "SVG", "SVGHTMLID", "SVGAttributes", "SVGIsDefaultStyling", "htmlID", "currentSVG", "SVGElement", "key", "value", "elementName", "options", "element", "SVGFactory", "_SVGFactory", "parentSVG", "SVGNSParam", "options", "CreateSVG", "parent", "ProfilePicFactory", "CalcCircleProperties", "newClipPathElement", "SVGFactory", "thinInnerGroup", "bigInnerGroup", "backgroundGroup", "circleConfigs", "cfg", "CreateSVG", "CalcResizeContainer", "contentSelector", "getElement", "CalcPathProperties", "innerContent", "svgHTMLInnerContainer", "CalcResizeContainer", "innerHeight", "viewboxToPXRatio", "viewboxHeight", "changedViewboxHeight", "allButInnerHeight", "pathParts", "obj", "DeconstructPath", "_DeconstructPath", "path", "pathValues", "pathParts", "currentValues", "char", "px", "py", "s", "points", "parts", "first", "p", "substraction", "newPathParts", "getMaxValueY", "CalcPathProperties", "i", "current", "CreateSides", "path", "basePath", "outerPathArray", "DeconstructPath", "filteredLastItem", "borderTop", "borderRight", "borderBottom", "borderLeft", "xPoints", "p", "yPoints", "minX", "maxX", "minY", "maxY", "i", "point", "distanceTop", "distanceBottom", "dLeft", "distanceRight", "sides", "offset", "minYTop", "maxXRight", "maxYBottom", "minXLeft", "innerTop", "innerRight", "innerBottom", "innerLeft", "newPoints", "newFirstPoints", "newSecondPoints", "InnerPath", "path", "padding", "eachSideObjects", "CreateSides", "mutateOffsetPath", "mergeArrayOfObjects", "DeconstructPath", "n", "newInnerValues", "normalize", "v", "len", "intersect", "a", "b", "c", "d", "det", "t", "i", "prev", "curr", "next", "dx1", "dy1", "dx2", "dy2", "normal1", "normal2", "a1", "b1", "a2", "b2", "p", "LanguageAddedFeatures", "container", "sidebarGroup", "SVGFactory", "barLeftPath", "barRightPath", "textGroup", "foreignObject", "div", "CreateGradient", "defs", "firstPoint", "offset", "index", "gradId", "grad", "SVGFactory", "DrawSegments", "container", "firstPoint", "secondPoint", "firstPointNextP", "secondPointNextP", "gradId", "segmentPath", "SVGFactory", "OffsetVector", "p0", "p1", "offset", "nx", "ny", "len", "LanguageMainSVG", "svg", "path", "innerPath", "SVGFactory", "defs", "OFFSET", "outerPoints", "DeconstructPath", "innerPoints", "i", "p0", "p1", "p0A", "p1A", "offsetVector", "OffsetVector", "gradId", "CreateGradient", "DrawSegments", "outerPath", "viewboxWidth", "viewboxHeight", "HARDCODED_OUTER_PADDING", "createStringInnerContainerPath", "InnerPath", "mainContainer", "svgElement", "CreateSVG", "exportClass", "LanguageAddedFeatures", "LanguageMainSVG", "Fetch", "endpoint", "response", "LanguageService", "Fetch", "row", "cornerPoint", "outerPath", "LanguageSmallContainerHTML", "container", "data", "svgElements", "lang", "svg", "language", "foreign", "wrapper", "icon", "label", "fetcher", "LanguageService", "LanguageSmallBorder", "elements", "el", "scaledPath", "main", "CreateSVG", "SVGFactory", "path", "innerPath", "defs", "OFFSET", "outerPoints", "DeconstructPath", "innerPoints", "i", "p0", "p1", "p0A", "p1A", "offsetVector", "OffsetVector", "gradId", "CreateGradient", "DrawSegments", "origW", "origH", "newW", "newH", "scaleX", "scaleY", "_", "cmd", "x", "y", "scaledX", "scaledY", "FetchProjects", "fetchProjects", "Fetch", "proj", "img", "PathFigures", "innerPath", "outerPath", "firgurePositions", "outerPathValues", "DeconstructPath", "innerPathValues", "counter", "i", "figureArray", "nextOuter", "nextInner", "currentOuter", "currentInner", "createArrayWithPathFigures", "eachPathPositionArray", "figures", "getFigureStringPath", "Project", "data", "index", "count", "HexaStyling", "defs", "projectName", "shadowGradient", "SVGFactory", "shadowBlur", "group", "x", "y", "imageSize", "img", "coords", "counter", "overlayCoords", "DeconstructPath", "c", "overlayPath", "outlinePath", "ProjectsRootElement", "_ProjectsRootElement", "projectsData", "data", "Project", "projectNameID", "projectContainer", "CreateSVG", "container", "projectName", "defs", "SVGFactory", "HexaStyling", "InnerPath", "path", "firstPath", "firstClipPath", "secondPath", "secondClipPath", "thirdPath", "thirdClipPath", "fourthPath", "fourthClipPath", "positionNumber", "hashedPath", "DeconstructPath", "padding", "secondTransformedPath", "point", "thirdTransformedPath", "HARDCODED_PATH", "logoURL", "imageURL", "counter", "xValue", "yValue", "url", "group", "ProjectsButton", "_ProjectsButton", "container", "projectName", "SVGFactory", "link", "group", "d", "i", "foreign", "wrapper", "text", "p", "ProjectsContent", "_ProjectsContent", "container", "path", "options", "project", "index", "projectSecondSection", "SVGFactory", "data", "projectLang", "year", "shortName", "textBorder", "projectCount", "ProjectsInnerHTMLContent", "_ProjectsInnerHTMLContent", "projectTitle", "projectText", "wrapper", "title", "content", "container", "path", "innerPath", "pathElement", "SVGFactory", "foreign", "outerPath", "defs", "OFFSET", "outerPoints", "DeconstructPath", "innerPoints", "i", "p0", "p1", "p0A", "p1A", "offsetVector", "OffsetVector", "gradId", "CreateGradient", "DrawSegments", "ProjectsStackBanners", "container", "index", "path", "offsetX", "SVGFactory", "languageOrFramework", "pathElement", "bbox", "offsetY", "foreign", "wrapper", "language", "icon", "iconLanguage", "ProjectsHexa", "container", "figures", "counter", "path", "borders", "SVGFactory", "initProjects", "HexagonPath", "pathContent", "pathContentInner", "pathContentInnerGradientPath", "pathLanguages", "projectDataArray", "FetchProjects", "projects", "ProjectsRootElement", "rootElements", "projectName", "i", "root", "project", "defs", "ProjectsContent", "figures", "PathFigures", "ProjectsHexa", "pathElement", "ProjectsInnerHTMLContent", "languagesAndFrameworks", "lang", "index", "lf", "languagePath", "ProjectsStackBanners", "ProjectsButton", "img", "FetchProject", "_FetchProject", "projectName", "fetchProject", "Fetch", "project", "img", "ProjectContributorFactory", "HTMLID", "projectContributor", "htmlContainer", "contributor", "contributorSVG", "ProjectContributorSVG", "defs", "clipPath", "polygon", "gradient", "stop1", "stop2", "mask", "maskRect", "border", "g", "image", "overlay", "link", "text", "contributorInit", "projectData", "ProjectContributorFactory", "CreateProjectDescriptionParagraphTitleSVG", "paragraphDiv", "svgID", "CreateSVG", "svgElement", "width", "height", "parent", "classSelector", "SVGFactory", "pathData", "side", "viewBoxWidth", "textWidth", "startPointLeft", "startPointRight", "SVGMiddleHeight", "operator", "data", "title", "isMobile", "leftSide", "hollowDiamond", "filledDiamond", "greenDiamond", "ProjectDescriptionFactory", "projectName", "projectData", "i", "paragraph", "paragraphDiv", "descriptionSVGClass", "CreateProjectDescriptionParagraphTitleSVG", "subParagraph", "paragraphP", "SlideshowBlockNav", "context", "projectName", "group", "SVGFactory", "SlideshowInnerContent", "context", "projectName", "slideshow", "state", "svg", "SVGFactory", "defs", "mask", "OFFSET", "innerPoints", "DeconstructPath", "outerPoints", "i", "p0", "p1", "p0A", "p1A", "offsetVector", "OffsetVector", "gradId", "CreateGradient", "DrawSegments", "imageURL", "backgroundGradient", "SlideshowContext", "svg", "SlideshowMainInstance", "CreateSVG", "SlideshowMainDrawLines", "context", "path", "SVGFactory", "CalcBoxSizeValues", "context", "CalcPathDifferenceInCoords", "context", "pathPoints", "p", "CalcBoxSizeValues", "CalcMirrorPathVertical", "context", "pathPoints", "newXPosition", "CalcPathDifferenceInCoords", "DeconstructPath", "CalcPathPositionsInBox", "context", "id", "path", "listPathPoints", "DeconstructPath", "CalcMirrorPathVertical", "SlideshowCornerDecoration", "context", "group", "id", "newLeftTopCorner", "CalcPathPositionsInBox", "newLeftBottomCorner", "SVGFactory", "SlideshowTopDecoration", "context", "group", "id", "newOrnamentUnderline", "CalcPathPositionsInBox", "newOrnamentUpperline", "SVGFactory", "newFirstBlock", "newSeconBlock", "newThirdBlock", "newFourtBlock", "newFirstLayBlock", "newSeconLayBlock", "SlideshowBox", "_SlideshowBox", "context", "SVGFactory", "group", "SlideshowCornerDecoration", "SlideshowTopDecoration", "SlideshowState", "images", "index", "img", "maxVisible", "newIndex", "callback", "callbackF", "SlideshowMainFunctionality", "state", "el", "current", "nextId", "prevId", "next", "prev", "AbstractSmallSlideshow", "state", "projectName", "SmallSVGSlideshow", "SVGFactory", "HexaStyling", "maxSlots", "SmallSVGImagesSlideshow", "maxVisible", "totalImages", "start", "end", "visibleImages", "counter", "img", "remaining", "overflowIndex", "hexPath", "offsetX", "offsetY", "rasterPath", "coord", "p", "idx", "x", "y", "pathEl", "defs", "coords", "newCoords", "DeconstructPath", "c", "newPath", "clipPath", "SVG", "imageIndex", "group", "textEl", "count", "i", "col", "row", "initSlideshow", "projectName", "projectData", "svg", "SlideshowMainInstance", "context", "SlideshowContext", "pathMain", "SlideshowMainDrawLines", "SlideshowBox", "SlideshowBlockNav", "images", "img", "index", "slideshowState", "SlideshowState", "mainSlideshow", "SlideshowMainFunctionality", "smallSlideshow", "SmallSVGSlideshow", "SlideshowInnerContent", "ProjectSpecificationFactory", "allSpecNames", "HTMLID", "projectData", "htmlContainer", "specName", "s", "specification", "ProjectSpecificationUnit", "specificationName", "wrapper", "contentDiv", "ProjectSpecificationSVG", "ul", "scale", "spec", "li", "title", "htmlContent", "tag", "group", "headerScale", "firstArrowLeft", "secondArrowLeft", "midPart", "firstArrowRight", "secondArrowRight", "mainPathE", "text", "isOpen", "contentHeight", "totalHeight", "extra", "specInit", "projectData", "specNames", "ProjectSpecificationFactory", "fetchProject", "projectName", "FetchProject", "projectInit", "projectData", "initSlideshow", "ProjectDescriptionFactory", "specInit", "contributorInit", "Console", "logo", "LoadingScreen", "svgID", "CreateSVG", "circumference", "segmentLength", "visibleLength", "i", "el", "SVGFactory", "circle", "LoadAssets", "images", "image", "resolve", "Background", "navDropdown", "Dropdown", "TimelineAnimation", "loadingScreen", "LoadingScreen", "Console", "whichPage", "projectName", "FancyText", "ProfilePicFactory", "exportClass", "LanguageSmallBorder", "initProjects", "project", "fetchProject", "projectInit", "LoadAssets"]
}
