My personal website

refactor: Tailwind and Preact

Pug is dead. Long live Preact?

Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>

+1343 -886
+9
global.css
··· 1 + @import "tailwindcss"; 2 + @import "@fontsource/fira-sans"; 3 + @import "@fontsource/josefin-sans"; 4 + 5 + @theme { 6 + --font-sans: "Fira Sans", sans-serif; 7 + --font-display: "Josefin Sans", sans-serif; 8 + --color-primary: #d63333; 9 + }
-31
include/contact.pug
··· 1 - mixin contact(icon, title, href, button_text) 2 - div.col-med-6.flex.flex-column.flex-justify-between 3 - div 4 - h3.text-center 5 - i(class=`icon-${icon}`) 6 - | 7 - | 8 - =title 9 - 10 - p: block 11 - div 12 - +link(true, false)(href=href).btn.btn-primary 13 - =button_text 14 - 15 - div.row 16 - div.col 17 - h2 Contact 18 - p You can find and contact me on many platforms. Choose the one you like below. 19 - 20 - +contact("phone", "Phone", "tel:+4915678614220", "Call me") 21 - | Give me a call at #[b +49 (0) 15678 614-220] for inquiries. 22 - +contact("mail", "Email", "mailto:contact@scrumplex.net", "Write an email") 23 - | Write me an email at #[b contact@scrumplex.net] for questions or help. 24 - | PGP: 25 - | 26 - +link(true, true)(href="https://keys.openpgp.org/search?q=contact%40scrumplex.net") 27 - code E13DFD4B47127951 28 - +contact("matrix", "Matrix", "https://matrix.to/#/@scrumplex:duckhub.io", "Message me on Matrix") 29 - | Contact me on Matrix via #[b @scrumplex:duckhub.io] and have a conversation with me. 30 - +contact("telegram", "Telegram", "https://telegram.me/Scrumplex", "Message me on Telegram") 31 - | Contact me on Telegram at #[b @Scrumplex] and have a conversation with me.
-29
include/footer.pug
··· 1 - - 2 - let footerLinks = [ 3 - { 4 - href: "#projects", 5 - text: "Projects", 6 - scroll: "#projects" 7 - }, 8 - { 9 - href: "#contact", 10 - text: "Contact", 11 - scroll: "#contact" 12 - }, 13 - { 14 - href: "#privacypolicy", 15 - text: "Privacy Policy", 16 - scroll: "#privacy" 17 - }, 18 - { 19 - href: "https://stats.uptimerobot.com/83xx6s98Y", 20 - text: "Status", 21 - external: true 22 - } 23 - ]; 24 - 25 - 26 - div.col.text-right 27 - each link, index in footerLinks 28 - span= index > 0 ? " · " : "" 29 - +link(link.external, false, scroll=link.scroll)(href=link.href)= link.text
-21
include/link.pug
··· 1 - - 2 - function isExternalURL(href) { 3 - return href.startsWith("http://") || href.startsWith("https://") || href.startsWith("//") 4 - } 5 - 6 - 7 - mixin link(external, hideExternalIcon, scroll) 8 - if (external) 9 - a(href!=attributes.href, class!=attributes.class, title=attributes.title, target="_blank", rel="noopener") 10 - if (!hideExternalIcon) 11 - i.icon-new_tab 12 - | &nbsp; 13 - block 14 - else 15 - a(href!=attributes.href, class!=attributes.class, title!=attributes.title, data-scroll=scroll) 16 - block 17 - 18 - 19 - mixin icon-link(name, title, href) 20 - +link(true, true)(href=href class=`link link-${name}`, title=title) 21 - i.icon-2x(class=`icon-${name}`)
-11
include/main.pug
··· 1 - p.text-justify. 2 - Hello there,#[br] 3 - I am Scrumplex, but you can call me Scrum, Scrump or Sefa. 4 - I am an enthusiastic developer from <b>Germany</b>, and I invest lots of my time into playing around with many technologies. 5 - Linux is my primary interest, as I maintain multiple servers and contribute to various open source technologies around the Linux space. 6 - As for programming languages, I primarily use C/C++, Python, Bash, Go, Rust and Kotlin. 7 - But I always try to incorporate other languages as well, if they fit the use-case.<br> 8 - I know my way around CI/CD professionally, especially working with GitLab CI, Flux CD, Kubernetes and all the technologies around these. 9 - And in an effort to apply my DevOps skills at home, I also do lots of #[+link(true, false)(href="https://nixos.org") Nix] stuff. 10 - My daily computing is shaped by #[+link(true, false)(href="https://gnu.org/philosophy/free-sw.html") free software] and in an effort to ensure that it stays that way I generally publish all my work under a copyleft license. 11 - If you want to see what I am working on right now, go to any of the code forges linked on this page.
-6
include/noscript.pug
··· 1 - noscript 2 - link(href="scss/noscript.scss", rel="stylesheet") 3 - | Enable JavaScript for best experience. Source code of this website is available at 4 - | 5 - a(href="https://codeberg.org/Scrumplex/website", target="_blank", rel="noopener") Codeberg 6 - | .
-46
include/projects.pug
··· 1 - mixin project(title, logoImage, logoAlt, websiteHref, sourceHref) 2 - div.col-smol-6.col-med-4.flex.flex-column.flex-justify-between 3 - div 4 - img.m-center(src=logoImage, alt=logoAlt, title=title, style="height: 70px", loading="lazy") 5 - h3.text-center= title 6 - p: block 7 - 8 - div 9 - if (websiteHref) 10 - +link(true, false)(href=websiteHref).btn.btn-primary 11 - | Website 12 - if (sourceHref) 13 - +link(true, false)(href=sourceHref).btn.btn-accent 14 - | Source Code 15 - 16 - 17 - div.row 18 - div.col 19 - h2 Current Projects 20 - 21 - div.row 22 - +project("Prism Launcher", "prismlauncher.svg", "Prism Launcher Logo", "https://prismlauncher.org", "https://github.com/PrismLauncher/PrismLauncher") 23 - | A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once. 24 - 25 - +project("nixpkgs", "nixos.svg", "NixOS Logo", "https://nixos.org", "https://github.com/NixOS/nixpkgs") 26 - | A reproducible toolchain for package management, system configuration and more. 27 - 28 - +project("libvibrant", "vibrant.svg", "libvibrant Logo", null, "https://github.com/libvibrant") 29 - | A collection of software to adjust color vibrancy and other color correction settings on Linux display servers. 30 - 31 - div.row 32 - div.col 33 - h2 Legacy Projects 34 - 35 - div.row 36 - +project("PASSY", "passy.svg", "PASSY Logo", null, "https://gitlab.com/PASSYpw/PASSY") 37 - | A beautiful password manager utilizing modern web technologies. 38 - 39 - +project("Waves.js", "waves.js.svg", "Waves.js Logo", null, "https://gitlab.com/PASSYpw/Waves.js") 40 - | A JQuery plugin providing authentic Material Design ripples. 41 - 42 - +project("Sprummlbot", "sprummlbot.png", "Sprummlbot Logo", "https://scrumplex.rocks/cloud/sprummlbot-archive.tar.bz2", "https://gitlab.com/Scrumplex/Sprummlbot") 43 - | A lightweight TeamSpeak 3 ServerAdmin Bot, adding many missing features to TeamSpeak 3 servers. 44 - 45 - +project("ExitNow", "exitnow.png", "ExitNow Logo", "", "https://codeberg.org/Scrumplex/ExitNow") 46 - | A simple application, providing an easy method to kill foreground windows with a shortcut.
+16 -2
index.html
··· 5 5 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 6 6 7 7 <title>Scrumplex &middot; A passionate developer</title> 8 + <link rel="stylesheet" href="global.css" /> 8 9 <link rel="stylesheet" href="scss/application.scss" /> 9 10 10 11 <meta ··· 69 70 content="Hello there, my name is Sefa. Learn more on my website" 70 71 /> 71 72 <meta name="page-topic" content="Scrumplex" /> 72 - <script type="module" src="js/application.js"></script> 73 73 </head> 74 - <pug src="index.pug" /> 74 + <body class="bg-primary scroll-smooth"> 75 + <noscript> 76 + <link href="scss/noscript.scss" rel="stylesheet" /> 77 + Enable JavaScript for best experience. Source code of this website 78 + is available at 79 + <a 80 + href="https://codeberg.org/Scrumplex/website" 81 + target="_blank" 82 + rel="noopener" 83 + >Codeberg</a 84 + >. 85 + </noscript> 86 + <div id="app"></div> 87 + <script prerender type="module" src="src/main.tsx"></script> 88 + </body> 75 89 </html>
-58
index.pug
··· 1 - include include/link 2 - body.scroll 3 - include include/noscript 4 - 5 - div.container.wrapper#wrapper 6 - div.sheet.sheet-splash.wavy#main 7 - div.row 8 - div.col-med-5.text-center.flex.flex-column.flex-justify-between 9 - div.row 10 - div.col 11 - img.scrumplex-logo(src="scrumplex.svg", alt="Scrumplex Logo", title="Scrumplex", height=200, width=200) 12 - h1 Scrumplex 13 - strong he/him, they/them 14 - div.row 15 - div.col-med-6 16 - h2 Development 17 - +icon-link("codeberg", "Codeberg", "https://codeberg.org/Scrumplex") 18 - +icon-link("github", "GitHub", "https://github.com/Scrumplex") 19 - +icon-link("gitlab", "GitLab.com", "https://gitlab.com/Scrumplex") 20 - div.col-med-6 21 - h2 Donate 22 - +icon-link("github_sponsors", "GitHub Sponsors", "https://github.com/sponsors/Scrumplex") 23 - +icon-link("liberapay", "Liberapay", "https://liberapay.com/Scrumplex/donate") 24 - +icon-link("paypal", "PayPal", "https://www.paypal.me/Scrumplex") 25 - +icon-link("ko-fi", "Ko-Fi", "https://ko-fi.com/scrumplex") 26 - div.col-med-7 27 - blockquote.text-right 28 - | Converting coffee to code... 29 - | 30 - span.text-spinner#text-spinner(hidden) | 31 - include include/main 32 - 33 - div.row 34 - include include/footer 35 - 36 - div.sheet.wavy#projects(hidden) 37 - include include/projects 38 - 39 - div.sheet.wavy#contact(hidden) 40 - include include/contact 41 - 42 - div.sheet.wavy#privacy(hidden) 43 - div.row: div.col 44 - h1 Privacy Policy 45 - p. 46 - Privacy information for services hosted on #[code scrumplex.net], #[code sefa.cloud] and #[code duckhub.io] (and all subdomains) 47 - 48 - div.row: div.col: p. 49 - Every service collects log-data. This includes IP addresses, browser user-agents and visited sites. 50 - These are not used to track the user, but are only collected for operation purposes. #[br] 51 - Some services may require you to enter some kind of username or email-address to access them. 52 - These services can not operate without this information. 53 - You may choose to use anonymous or pseudonymous usernames or email addresses. 54 - All personal data (such as, but not limited to names, addresses or telephone numbers) shall always be in line with the General Data Protection Regulation. #[br] 55 - No data is ever processed to track user activity. 56 - 57 - div.scroll-indicator 58 - h1.text-center ▾
-6
js/_utils.js
··· 1 - export default function ready() { 2 - return new Promise((resolve) => { 3 - if (document.readyState !== "loading") resolve(); 4 - else document.addEventListener("DOMContentLoaded", resolve); 5 - }); 6 - }
-131
js/application.js
··· 1 - /*! 2 - * Personal website of Sefa Eyeoglu 3 - * Copyright (C) 2018-2022 Sefa Eyeoglu <contact@scrumplex.net> 4 - * 5 - * This program is free software: you can redistribute it and/or modify 6 - * it under the terms of the GNU Affero General Public License as published by 7 - * the Free Software Foundation, either version 3 of the License, or 8 - * (at your option) any later version. 9 - * 10 - * This program is distributed in the hope that it will be useful, 11 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 - * GNU Affero General Public License for more details. 14 - * 15 - * You should have received a copy of the GNU Affero General Public License 16 - * along with this program. If not, see <https://www.gnu.org/licenses/>. 17 - */ 18 - 19 - import ready from "./_utils"; 20 - 21 - const mainElem = document.getElementById("main"); 22 - 23 - document.querySelectorAll(".scrumplex-logo").forEach((elem) => { 24 - elem.addEventListener("dblclick", () => { 25 - const randomRotation = Math.floor(Math.random() * 360); 26 - elem.style.transform = `rotate(${randomRotation}deg)`; 27 - }); 28 - }); 29 - 30 - document.querySelectorAll("*[data-scroll]").forEach((elem) => { 31 - elem.addEventListener("click", (e) => { 32 - e.preventDefault(); 33 - const targetSelector = elem.getAttribute("data-scroll"); 34 - applyScrollSpecial(targetSelector); 35 - }); 36 - }); 37 - 38 - mainElem.addEventListener("animationend", applyScrollInitially); 39 - 40 - function applyScrollInitially() { 41 - mainElem.removeEventListener("animationend", applyScrollInitially); 42 - 43 - window.addEventListener("scroll", applyScrollConditionally); 44 - 45 - if (location.hash.startsWith("#")) { 46 - const result = applyScrollSpecial(location.hash); 47 - if (result) return; 48 - } 49 - applyScrollConditionally(); 50 - } 51 - 52 - function applyScrollConditionally() { 53 - if ( 54 - mainElem.getBoundingClientRect().top <= 0 || // offset to top window border 55 - mainElem.getBoundingClientRect().height >= window.innerHeight 56 - ) 57 - applyScroll(); 58 - } 59 - 60 - function applyScrollSpecial(targetSelector) { 61 - if (!targetSelector) return false; 62 - const targetElem = document.querySelector(targetSelector); 63 - if (!targetElem) return false; 64 - const offset = applyScroll(targetElem); 65 - window.scrollTo({ top: offset, behavior: "smooth" }); 66 - history.pushState({ hash: targetSelector }, "", targetSelector); 67 - return true; 68 - } 69 - 70 - function applyScroll(scrollTarget = null) { 71 - // Black magic ahead! 72 - // We sometimes need this method to show all sheets and then scroll to one of them. 73 - // To achieve this we need to have a way to get the target position (like pixels) of 74 - // the sheet we want to scroll to (in this case it's scrollTarget). 75 - // As the bounding box always includes current transforms (so our translateY in the 76 - // fade-in animation) we need to somehow get the boundingBox while our sheet is not 77 - // being transformed. A hacky way to do this is to modify the behavior of .sheet[hidden] 78 - // depending on the state of this method. In this case we are adding .scrolled to body 79 - // which will cause all hidden sheets to instead be transparent. 80 - // Additionally we will stop any animations that would be playing then. 81 - // Now the element should be at it's target position so we just grab the position before 82 - // un-hiding the elements and voila! 83 - // One caveat: if the content changes after this method returned, the scroll might be a 84 - // bit offset. 85 - 86 - let offset = getElementScrollOffset(scrollTarget); 87 - if (document.body.classList.contains("scrolled")) return offset; 88 - 89 - const hiddenElems = document.querySelectorAll(".sheet[hidden]"), 90 - posMain = getElementScrollOffset(mainElem); // offset to top rel. to document 91 - 92 - document.getElementById("wrapper").style.paddingTop = `${posMain}px`; 93 - document.body.classList.add("scrolled"); 94 - 95 - mainElem.classList.add("sheet-splashed"); 96 - mainElem.classList.remove("sheet-splash"); 97 - if (scrollTarget) 98 - // recalculate, as it probably changed because of body.scrolled 99 - offset = getElementScrollOffset(scrollTarget); 100 - 101 - hiddenElems.forEach((elem) => { 102 - elem.removeAttribute("hidden"); 103 - }); 104 - 105 - window.removeEventListener("scroll", applyScrollConditionally); 106 - return offset; 107 - } 108 - 109 - function startSpinningChars(fps = 4) { 110 - const spinningChars = ["|", "/", "-", "\\"], 111 - spinnerElement = document.getElementById("text-spinner"); 112 - 113 - let currentIndex = 0; 114 - 115 - setInterval(() => { 116 - spinnerElement.innerText = spinningChars[currentIndex]; 117 - currentIndex++; 118 - if (currentIndex >= spinningChars.length) currentIndex = 0; 119 - }, 1000 / fps); 120 - 121 - spinnerElement.removeAttribute("hidden"); 122 - } 123 - 124 - function getElementScrollOffset(elem) { 125 - if (elem) return window.pageYOffset + elem.getBoundingClientRect().top; 126 - return -1; 127 - } 128 - 129 - ready().then(() => { 130 - startSpinningChars(); 131 - });
+7 -3
package.json
··· 16 16 "devDependencies": { 17 17 "@eslint/css": "^0.14.1", 18 18 "@eslint/js": "^10.0.1", 19 - "@types/pug": "^2.0.10", 19 + "@preact/preset-vite": "^2.10.3", 20 + "@tailwindcss/vite": "^4.2.1", 20 21 "eslint": "10.0.3", 21 22 "fantasticon": "3.0.0", 22 23 "globals": "^17.4.0", 23 24 "jiti": "^2.6.1", 25 + "preact": "^10.28.4", 26 + "preact-iso": "^2.11.1", 24 27 "prettier": "3.8.1", 25 28 "sass": "^1.97.3", 26 29 "sharp": "0.34.5", 27 30 "svgo": "^4.0.1", 31 + "tailwindcss": "^4.2.1", 32 + "typescript": "^5.9.3", 28 33 "typescript-eslint": "^8.56.1", 29 34 "vite": "8.0.0-beta.16", 30 35 "vite-imagetools": "^10.0.0", 31 - "vite-plugin-image-optimizer": "^2.0.3", 32 - "vite-plugin-pug": "^0.4.1" 36 + "vite-plugin-image-optimizer": "^2.0.3" 33 37 }, 34 38 "author": { 35 39 "name": "Sefa Eyeoglu",
+709 -359
pnpm-lock.yaml
··· 21 21 '@eslint/js': 22 22 specifier: ^10.0.1 23 23 version: 10.0.1(eslint@10.0.3(jiti@2.6.1)) 24 - '@types/pug': 25 - specifier: ^2.0.10 26 - version: 2.0.10 24 + '@preact/preset-vite': 25 + specifier: ^2.10.3 26 + version: 2.10.3(@babel/core@7.29.0)(preact@10.28.4)(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3)) 27 + '@tailwindcss/vite': 28 + specifier: ^4.2.1 29 + version: 4.2.1(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3)) 27 30 eslint: 28 31 specifier: 10.0.3 29 32 version: 10.0.3(jiti@2.6.1) ··· 36 39 jiti: 37 40 specifier: ^2.6.1 38 41 version: 2.6.1 42 + preact: 43 + specifier: ^10.28.4 44 + version: 10.28.4 45 + preact-iso: 46 + specifier: ^2.11.1 47 + version: 2.11.1(preact-render-to-string@6.6.6(preact@10.28.4))(preact@10.28.4) 39 48 prettier: 40 49 specifier: 3.8.1 41 50 version: 3.8.1 ··· 48 57 svgo: 49 58 specifier: ^4.0.1 50 59 version: 4.0.1 60 + tailwindcss: 61 + specifier: ^4.2.1 62 + version: 4.2.1 63 + typescript: 64 + specifier: ^5.9.3 65 + version: 5.9.3 51 66 typescript-eslint: 52 67 specifier: ^8.56.1 53 68 version: 8.56.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) ··· 60 75 vite-plugin-image-optimizer: 61 76 specifier: ^2.0.3 62 77 version: 2.0.3(sharp@0.34.5)(svgo@4.0.1)(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3)) 63 - vite-plugin-pug: 64 - specifier: ^0.4.1 65 - version: 0.4.1 66 78 67 79 packages: 68 80 81 + '@babel/code-frame@7.29.0': 82 + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} 83 + engines: {node: '>=6.9.0'} 84 + 85 + '@babel/compat-data@7.29.0': 86 + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} 87 + engines: {node: '>=6.9.0'} 88 + 89 + '@babel/core@7.29.0': 90 + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} 91 + engines: {node: '>=6.9.0'} 92 + 93 + '@babel/generator@7.29.1': 94 + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} 95 + engines: {node: '>=6.9.0'} 96 + 97 + '@babel/helper-annotate-as-pure@7.27.3': 98 + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} 99 + engines: {node: '>=6.9.0'} 100 + 101 + '@babel/helper-compilation-targets@7.28.6': 102 + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} 103 + engines: {node: '>=6.9.0'} 104 + 105 + '@babel/helper-globals@7.28.0': 106 + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 107 + engines: {node: '>=6.9.0'} 108 + 109 + '@babel/helper-module-imports@7.28.6': 110 + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} 111 + engines: {node: '>=6.9.0'} 112 + 113 + '@babel/helper-module-transforms@7.28.6': 114 + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} 115 + engines: {node: '>=6.9.0'} 116 + peerDependencies: 117 + '@babel/core': ^7.0.0 118 + 119 + '@babel/helper-plugin-utils@7.28.6': 120 + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} 121 + engines: {node: '>=6.9.0'} 122 + 69 123 '@babel/helper-string-parser@7.27.1': 70 124 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 71 125 engines: {node: '>=6.9.0'} ··· 74 128 resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 75 129 engines: {node: '>=6.9.0'} 76 130 131 + '@babel/helper-validator-option@7.27.1': 132 + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 133 + engines: {node: '>=6.9.0'} 134 + 135 + '@babel/helpers@7.28.6': 136 + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} 137 + engines: {node: '>=6.9.0'} 138 + 77 139 '@babel/parser@7.29.0': 78 140 resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} 79 141 engines: {node: '>=6.0.0'} 80 142 hasBin: true 143 + 144 + '@babel/plugin-syntax-jsx@7.28.6': 145 + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} 146 + engines: {node: '>=6.9.0'} 147 + peerDependencies: 148 + '@babel/core': ^7.0.0-0 149 + 150 + '@babel/plugin-transform-react-jsx-development@7.27.1': 151 + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} 152 + engines: {node: '>=6.9.0'} 153 + peerDependencies: 154 + '@babel/core': ^7.0.0-0 155 + 156 + '@babel/plugin-transform-react-jsx@7.28.6': 157 + resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} 158 + engines: {node: '>=6.9.0'} 159 + peerDependencies: 160 + '@babel/core': ^7.0.0-0 161 + 162 + '@babel/template@7.28.6': 163 + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} 164 + engines: {node: '>=6.9.0'} 165 + 166 + '@babel/traverse@7.29.0': 167 + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} 168 + engines: {node: '>=6.9.0'} 81 169 82 170 '@babel/types@7.29.0': 83 171 resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} ··· 202 290 resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} 203 291 cpu: [arm64] 204 292 os: [linux] 293 + libc: [glibc] 205 294 206 295 '@img/sharp-libvips-linux-arm@1.2.4': 207 296 resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} 208 297 cpu: [arm] 209 298 os: [linux] 299 + libc: [glibc] 210 300 211 301 '@img/sharp-libvips-linux-ppc64@1.2.4': 212 302 resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} 213 303 cpu: [ppc64] 214 304 os: [linux] 305 + libc: [glibc] 215 306 216 307 '@img/sharp-libvips-linux-riscv64@1.2.4': 217 308 resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} 218 309 cpu: [riscv64] 219 310 os: [linux] 311 + libc: [glibc] 220 312 221 313 '@img/sharp-libvips-linux-s390x@1.2.4': 222 314 resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} 223 315 cpu: [s390x] 224 316 os: [linux] 317 + libc: [glibc] 225 318 226 319 '@img/sharp-libvips-linux-x64@1.2.4': 227 320 resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} 228 321 cpu: [x64] 229 322 os: [linux] 323 + libc: [glibc] 230 324 231 325 '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 232 326 resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} 233 327 cpu: [arm64] 234 328 os: [linux] 329 + libc: [musl] 235 330 236 331 '@img/sharp-libvips-linuxmusl-x64@1.2.4': 237 332 resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} 238 333 cpu: [x64] 239 334 os: [linux] 335 + libc: [musl] 240 336 241 337 '@img/sharp-linux-arm64@0.34.5': 242 338 resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} 243 339 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 244 340 cpu: [arm64] 245 341 os: [linux] 342 + libc: [glibc] 246 343 247 344 '@img/sharp-linux-arm@0.34.5': 248 345 resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} 249 346 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 250 347 cpu: [arm] 251 348 os: [linux] 349 + libc: [glibc] 252 350 253 351 '@img/sharp-linux-ppc64@0.34.5': 254 352 resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} 255 353 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 256 354 cpu: [ppc64] 257 355 os: [linux] 356 + libc: [glibc] 258 357 259 358 '@img/sharp-linux-riscv64@0.34.5': 260 359 resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} 261 360 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 262 361 cpu: [riscv64] 263 362 os: [linux] 363 + libc: [glibc] 264 364 265 365 '@img/sharp-linux-s390x@0.34.5': 266 366 resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} 267 367 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 268 368 cpu: [s390x] 269 369 os: [linux] 370 + libc: [glibc] 270 371 271 372 '@img/sharp-linux-x64@0.34.5': 272 373 resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} 273 374 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 274 375 cpu: [x64] 275 376 os: [linux] 377 + libc: [glibc] 276 378 277 379 '@img/sharp-linuxmusl-arm64@0.34.5': 278 380 resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} 279 381 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 280 382 cpu: [arm64] 281 383 os: [linux] 384 + libc: [musl] 282 385 283 386 '@img/sharp-linuxmusl-x64@0.34.5': 284 387 resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} 285 388 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 286 389 cpu: [x64] 287 390 os: [linux] 391 + libc: [musl] 288 392 289 393 '@img/sharp-wasm32@0.34.5': 290 394 resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} ··· 313 417 resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 314 418 engines: {node: '>=12'} 315 419 420 + '@jridgewell/gen-mapping@0.3.13': 421 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 422 + 423 + '@jridgewell/remapping@2.3.5': 424 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 425 + 426 + '@jridgewell/resolve-uri@3.1.2': 427 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 428 + engines: {node: '>=6.0.0'} 429 + 430 + '@jridgewell/sourcemap-codec@1.5.5': 431 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 432 + 433 + '@jridgewell/trace-mapping@0.3.31': 434 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 435 + 316 436 '@napi-rs/wasm-runtime@1.1.1': 317 437 resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} 318 438 ··· 361 481 engines: {node: '>= 10.0.0'} 362 482 cpu: [arm] 363 483 os: [linux] 484 + libc: [glibc] 364 485 365 486 '@parcel/watcher-linux-arm-musl@2.5.6': 366 487 resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} 367 488 engines: {node: '>= 10.0.0'} 368 489 cpu: [arm] 369 490 os: [linux] 491 + libc: [musl] 370 492 371 493 '@parcel/watcher-linux-arm64-glibc@2.5.6': 372 494 resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} 373 495 engines: {node: '>= 10.0.0'} 374 496 cpu: [arm64] 375 497 os: [linux] 498 + libc: [glibc] 376 499 377 500 '@parcel/watcher-linux-arm64-musl@2.5.6': 378 501 resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} 379 502 engines: {node: '>= 10.0.0'} 380 503 cpu: [arm64] 381 504 os: [linux] 505 + libc: [musl] 382 506 383 507 '@parcel/watcher-linux-x64-glibc@2.5.6': 384 508 resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} 385 509 engines: {node: '>= 10.0.0'} 386 510 cpu: [x64] 387 511 os: [linux] 512 + libc: [glibc] 388 513 389 514 '@parcel/watcher-linux-x64-musl@2.5.6': 390 515 resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} 391 516 engines: {node: '>= 10.0.0'} 392 517 cpu: [x64] 393 518 os: [linux] 519 + libc: [musl] 394 520 395 521 '@parcel/watcher-win32-arm64@2.5.6': 396 522 resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} ··· 418 544 resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 419 545 engines: {node: '>=14'} 420 546 547 + '@preact/preset-vite@2.10.3': 548 + resolution: {integrity: sha512-1SiS+vFItpkNdBs7q585PSAIln0wBeBdcpJYbzPs1qipsb/FssnkUioNXuRsb8ZnU8YEQHr+3v8+/mzWSnTQmg==} 549 + peerDependencies: 550 + '@babel/core': 7.x 551 + vite: 2.x || 3.x || 4.x || 5.x || 6.x || 7.x 552 + 553 + '@prefresh/babel-plugin@0.5.3': 554 + resolution: {integrity: sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==} 555 + 556 + '@prefresh/core@1.5.9': 557 + resolution: {integrity: sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==} 558 + peerDependencies: 559 + preact: ^10.0.0 || ^11.0.0-0 560 + 561 + '@prefresh/utils@1.2.1': 562 + resolution: {integrity: sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==} 563 + 564 + '@prefresh/vite@2.4.12': 565 + resolution: {integrity: sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==} 566 + peerDependencies: 567 + preact: ^10.4.0 || ^11.0.0-0 568 + vite: '>=2.0.0' 569 + 421 570 '@rolldown/binding-android-arm64@1.0.0-rc.6': 422 571 resolution: {integrity: sha512-kvjTSWGcrv+BaR2vge57rsKiYdVR8V8CoS0vgKrc570qRBfty4bT+1X0z3j2TaVV+kAYzA0PjeB9+mdZyqUZlg==} 423 572 engines: {node: ^20.19.0 || >=22.12.0} ··· 453 602 engines: {node: ^20.19.0 || >=22.12.0} 454 603 cpu: [arm64] 455 604 os: [linux] 605 + libc: [glibc] 456 606 457 607 '@rolldown/binding-linux-arm64-musl@1.0.0-rc.6': 458 608 resolution: {integrity: sha512-elPpdevtCdUOqziemR86C4CSCr/5sUxalzDrf/CJdMT+kZt2C556as++qHikNOz0vuFf52h+GJNXZM08eWgGPQ==} 459 609 engines: {node: ^20.19.0 || >=22.12.0} 460 610 cpu: [arm64] 461 611 os: [linux] 612 + libc: [musl] 462 613 463 614 '@rolldown/binding-linux-x64-gnu@1.0.0-rc.6': 464 615 resolution: {integrity: sha512-IBwXsf56o3xhzAyaZxdM1CX8UFiBEUFCjiVUgny67Q8vPIqkjzJj0YKhd3TbBHanuxThgBa59f6Pgutg2OGk5A==} 465 616 engines: {node: ^20.19.0 || >=22.12.0} 466 617 cpu: [x64] 467 618 os: [linux] 619 + libc: [glibc] 468 620 469 621 '@rolldown/binding-linux-x64-musl@1.0.0-rc.6': 470 622 resolution: {integrity: sha512-vOk7G8V9Zm+8a6PL6JTpCea61q491oYlGtO6CvnsbhNLlKdf0bbCPytFzGQhYmCKZDKkEbmnkcIprTEGCURnwg==} 471 623 engines: {node: ^20.19.0 || >=22.12.0} 472 624 cpu: [x64] 473 625 os: [linux] 626 + libc: [musl] 474 627 475 628 '@rolldown/binding-openharmony-arm64@1.0.0-rc.6': 476 629 resolution: {integrity: sha512-ASjEDI4MRv7XCQb2JVaBzfEYO98JKCGrAgoW6M03fJzH/ilCnC43Mb3ptB9q/lzsaahoJyIBoAGKAYEjUvpyvQ==} ··· 498 651 '@rolldown/pluginutils@1.0.0-rc.6': 499 652 resolution: {integrity: sha512-Y0+JT8Mi1mmW08K6HieG315XNRu4L0rkfCpA364HtytjgiqYnMYRdFPcxRl+BQQqNXzecL2S9nii+RUpO93XIA==} 500 653 654 + '@rollup/pluginutils@4.2.1': 655 + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} 656 + engines: {node: '>= 8.0.0'} 657 + 501 658 '@rollup/pluginutils@5.3.0': 502 659 resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} 503 660 engines: {node: '>=14.0.0'} ··· 507 664 rollup: 508 665 optional: true 509 666 667 + '@tailwindcss/node@4.2.1': 668 + resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} 669 + 670 + '@tailwindcss/oxide-android-arm64@4.2.1': 671 + resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} 672 + engines: {node: '>= 20'} 673 + cpu: [arm64] 674 + os: [android] 675 + 676 + '@tailwindcss/oxide-darwin-arm64@4.2.1': 677 + resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} 678 + engines: {node: '>= 20'} 679 + cpu: [arm64] 680 + os: [darwin] 681 + 682 + '@tailwindcss/oxide-darwin-x64@4.2.1': 683 + resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} 684 + engines: {node: '>= 20'} 685 + cpu: [x64] 686 + os: [darwin] 687 + 688 + '@tailwindcss/oxide-freebsd-x64@4.2.1': 689 + resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} 690 + engines: {node: '>= 20'} 691 + cpu: [x64] 692 + os: [freebsd] 693 + 694 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': 695 + resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} 696 + engines: {node: '>= 20'} 697 + cpu: [arm] 698 + os: [linux] 699 + 700 + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': 701 + resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} 702 + engines: {node: '>= 20'} 703 + cpu: [arm64] 704 + os: [linux] 705 + libc: [glibc] 706 + 707 + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': 708 + resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} 709 + engines: {node: '>= 20'} 710 + cpu: [arm64] 711 + os: [linux] 712 + libc: [musl] 713 + 714 + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': 715 + resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} 716 + engines: {node: '>= 20'} 717 + cpu: [x64] 718 + os: [linux] 719 + libc: [glibc] 720 + 721 + '@tailwindcss/oxide-linux-x64-musl@4.2.1': 722 + resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} 723 + engines: {node: '>= 20'} 724 + cpu: [x64] 725 + os: [linux] 726 + libc: [musl] 727 + 728 + '@tailwindcss/oxide-wasm32-wasi@4.2.1': 729 + resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} 730 + engines: {node: '>=14.0.0'} 731 + cpu: [wasm32] 732 + bundledDependencies: 733 + - '@napi-rs/wasm-runtime' 734 + - '@emnapi/core' 735 + - '@emnapi/runtime' 736 + - '@tybys/wasm-util' 737 + - '@emnapi/wasi-threads' 738 + - tslib 739 + 740 + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': 741 + resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} 742 + engines: {node: '>= 20'} 743 + cpu: [arm64] 744 + os: [win32] 745 + 746 + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': 747 + resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} 748 + engines: {node: '>= 20'} 749 + cpu: [x64] 750 + os: [win32] 751 + 752 + '@tailwindcss/oxide@4.2.1': 753 + resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} 754 + engines: {node: '>= 20'} 755 + 756 + '@tailwindcss/vite@4.2.1': 757 + resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==} 758 + peerDependencies: 759 + vite: ^5.2.0 || ^6 || ^7 760 + 510 761 '@tootallnate/once@2.0.0': 511 762 resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} 512 763 engines: {node: '>= 10'} ··· 522 773 523 774 '@types/json-schema@7.0.15': 524 775 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 525 - 526 - '@types/pug@2.0.10': 527 - resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} 528 776 529 777 '@typescript-eslint/eslint-plugin@8.56.1': 530 778 resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} ··· 598 846 peerDependencies: 599 847 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 600 848 601 - acorn@7.4.1: 602 - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 603 - engines: {node: '>=0.4.0'} 604 - hasBin: true 605 - 606 849 acorn@8.16.0: 607 850 resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} 608 851 engines: {node: '>=0.4.0'} ··· 654 897 argparse@2.0.1: 655 898 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 656 899 657 - asap@2.0.6: 658 - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} 659 - 660 - assert-never@1.4.0: 661 - resolution: {integrity: sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==} 662 - 663 - babel-walk@3.0.0-canary-5: 664 - resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} 665 - engines: {node: '>= 10.0.0'} 900 + babel-plugin-transform-hook-names@1.0.2: 901 + resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} 902 + peerDependencies: 903 + '@babel/core': ^7.12.10 666 904 667 905 balanced-match@1.0.2: 668 906 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} ··· 671 909 resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} 672 910 engines: {node: 18 || 20 || >=22} 673 911 912 + baseline-browser-mapping@2.10.0: 913 + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} 914 + engines: {node: '>=6.0.0'} 915 + hasBin: true 916 + 674 917 bindings@1.5.0: 675 918 resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 676 919 ··· 686 929 brace-expansion@5.0.4: 687 930 resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} 688 931 engines: {node: 18 || 20 || >=22} 932 + 933 + browserslist@4.28.1: 934 + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} 935 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 936 + hasBin: true 689 937 690 938 bufferstreams@3.0.0: 691 939 resolution: {integrity: sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA==} ··· 695 943 resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} 696 944 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 697 945 698 - call-bind-apply-helpers@1.0.2: 699 - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 700 - engines: {node: '>= 0.4'} 701 - 702 - call-bound@1.0.4: 703 - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 704 - engines: {node: '>= 0.4'} 946 + caniuse-lite@1.0.30001777: 947 + resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} 705 948 706 949 case@1.6.3: 707 950 resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} 708 951 engines: {node: '>= 0.8.0'} 709 - 710 - character-parser@2.2.0: 711 - resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} 712 952 713 953 chokidar@4.0.3: 714 954 resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} ··· 755 995 console-control-strings@1.1.0: 756 996 resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} 757 997 758 - constantinople@4.0.1: 759 - resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} 998 + convert-source-map@2.0.0: 999 + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 760 1000 761 1001 cross-spawn@7.0.6: 762 1002 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} ··· 807 1047 resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 808 1048 engines: {node: '>=8'} 809 1049 810 - doctypes@1.1.0: 811 - resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} 812 - 813 1050 dom-serializer@2.0.0: 814 1051 resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 815 1052 ··· 823 1060 domutils@3.2.2: 824 1061 resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 825 1062 826 - dunder-proto@1.0.1: 827 - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 828 - engines: {node: '>= 0.4'} 829 - 830 1063 eastasianwidth@0.2.0: 831 1064 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 832 1065 1066 + electron-to-chromium@1.5.307: 1067 + resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} 1068 + 833 1069 emoji-regex@8.0.0: 834 1070 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 835 1071 ··· 839 1075 encoding@0.1.13: 840 1076 resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} 841 1077 1078 + enhanced-resolve@5.20.0: 1079 + resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} 1080 + engines: {node: '>=10.13.0'} 1081 + 842 1082 entities@4.5.0: 843 1083 resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 844 1084 engines: {node: '>=0.12'} ··· 850 1090 err-code@2.0.3: 851 1091 resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 852 1092 853 - es-define-property@1.0.1: 854 - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 855 - engines: {node: '>= 0.4'} 856 - 857 - es-errors@1.3.0: 858 - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 859 - engines: {node: '>= 0.4'} 860 - 861 - es-object-atoms@1.1.1: 862 - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 863 - engines: {node: '>= 0.4'} 864 - 865 1093 es5-ext@0.10.64: 866 1094 resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} 867 1095 engines: {node: '>=0.10'} ··· 875 1103 876 1104 es6-weak-map@2.0.3: 877 1105 resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} 1106 + 1107 + escalade@3.2.0: 1108 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1109 + engines: {node: '>=6'} 878 1110 879 1111 escape-string-regexp@4.0.0: 880 1112 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} ··· 995 1227 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 996 1228 os: [darwin] 997 1229 998 - function-bind@1.1.2: 999 - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1000 - 1001 1230 gauge@4.0.4: 1002 1231 resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} 1003 1232 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1004 1233 deprecated: This package is no longer supported. 1005 1234 1006 - get-intrinsic@1.3.0: 1007 - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 1008 - engines: {node: '>= 0.4'} 1009 - 1010 - get-proto@1.0.1: 1011 - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 1012 - engines: {node: '>= 0.4'} 1235 + gensync@1.0.0-beta.2: 1236 + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1237 + engines: {node: '>=6.9.0'} 1013 1238 1014 1239 glob-parent@6.0.2: 1015 1240 resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} ··· 1033 1258 resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} 1034 1259 engines: {node: '>=18'} 1035 1260 1036 - gopd@1.2.0: 1037 - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 1038 - engines: {node: '>= 0.4'} 1039 - 1040 1261 graceful-fs@4.2.11: 1041 1262 resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1042 1263 ··· 1045 1266 engines: {node: '>=0.4.7'} 1046 1267 hasBin: true 1047 1268 1048 - has-symbols@1.1.0: 1049 - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 1050 - engines: {node: '>= 0.4'} 1051 - 1052 - has-tostringtag@1.0.2: 1053 - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 1054 - engines: {node: '>= 0.4'} 1055 - 1056 1269 has-unicode@2.0.1: 1057 1270 resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} 1058 1271 1059 - hasown@2.0.2: 1060 - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1061 - engines: {node: '>= 0.4'} 1272 + he@1.2.0: 1273 + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 1274 + hasBin: true 1062 1275 1063 1276 http-cache-semantics@4.2.0: 1064 1277 resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} ··· 1115 1328 resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} 1116 1329 engines: {node: '>= 12'} 1117 1330 1118 - is-core-module@2.16.1: 1119 - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1120 - engines: {node: '>= 0.4'} 1121 - 1122 - is-expression@4.0.0: 1123 - resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} 1124 - 1125 1331 is-extglob@2.1.1: 1126 1332 resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1127 1333 engines: {node: '>=0.10.0'} ··· 1140 1346 is-promise@2.2.2: 1141 1347 resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} 1142 1348 1143 - is-regex@1.2.1: 1144 - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1145 - engines: {node: '>= 0.4'} 1146 - 1147 1349 isexe@2.0.0: 1148 1350 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1149 1351 ··· 1154 1356 resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 1155 1357 hasBin: true 1156 1358 1157 - js-stringify@1.0.2: 1158 - resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} 1359 + js-tokens@4.0.0: 1360 + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1361 + 1362 + jsesc@3.1.0: 1363 + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1364 + engines: {node: '>=6'} 1365 + hasBin: true 1159 1366 1160 1367 json-buffer@3.0.1: 1161 1368 resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} ··· 1166 1373 json-stable-stringify-without-jsonify@1.0.1: 1167 1374 resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1168 1375 1169 - jstransformer@1.0.0: 1170 - resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} 1376 + json5@2.2.3: 1377 + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1378 + engines: {node: '>=6'} 1379 + hasBin: true 1171 1380 1172 1381 keyv@4.5.4: 1173 1382 resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1383 + 1384 + kolorist@1.8.0: 1385 + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 1174 1386 1175 1387 levn@0.4.1: 1176 1388 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} ··· 1211 1423 engines: {node: '>= 12.0.0'} 1212 1424 cpu: [arm64] 1213 1425 os: [linux] 1426 + libc: [glibc] 1214 1427 1215 1428 lightningcss-linux-arm64-musl@1.31.1: 1216 1429 resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} 1217 1430 engines: {node: '>= 12.0.0'} 1218 1431 cpu: [arm64] 1219 1432 os: [linux] 1433 + libc: [musl] 1220 1434 1221 1435 lightningcss-linux-x64-gnu@1.31.1: 1222 1436 resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} 1223 1437 engines: {node: '>= 12.0.0'} 1224 1438 cpu: [x64] 1225 1439 os: [linux] 1440 + libc: [glibc] 1226 1441 1227 1442 lightningcss-linux-x64-musl@1.31.1: 1228 1443 resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} 1229 1444 engines: {node: '>= 12.0.0'} 1230 1445 cpu: [x64] 1231 1446 os: [linux] 1447 + libc: [musl] 1232 1448 1233 1449 lightningcss-win32-arm64-msvc@1.31.1: 1234 1450 resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} ··· 1256 1472 lru-cache@10.4.3: 1257 1473 resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1258 1474 1475 + lru-cache@5.1.1: 1476 + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1477 + 1259 1478 lru-cache@7.18.3: 1260 1479 resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} 1261 1480 engines: {node: '>=12'} ··· 1263 1482 lru-queue@0.1.0: 1264 1483 resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} 1265 1484 1485 + magic-string@0.30.21: 1486 + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1487 + 1266 1488 make-fetch-happen@10.2.1: 1267 1489 resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} 1268 1490 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1269 - 1270 - math-intrinsics@1.1.0: 1271 - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1272 - engines: {node: '>= 0.4'} 1273 1491 1274 1492 mdn-data@2.0.28: 1275 1493 resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} ··· 1378 1596 engines: {node: ^12.13 || ^14.13 || >=16} 1379 1597 hasBin: true 1380 1598 1599 + node-html-parser@6.1.13: 1600 + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} 1601 + 1602 + node-releases@2.0.36: 1603 + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} 1604 + 1381 1605 nopt@6.0.0: 1382 1606 resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} 1383 1607 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} ··· 1390 1614 1391 1615 nth-check@2.1.1: 1392 1616 resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 1393 - 1394 - object-assign@4.1.1: 1395 - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1396 - engines: {node: '>=0.10.0'} 1397 1617 1398 1618 once@1.4.0: 1399 1619 resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} ··· 1431 1651 path-key@3.1.1: 1432 1652 resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1433 1653 engines: {node: '>=8'} 1434 - 1435 - path-parse@1.0.7: 1436 - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1437 1654 1438 1655 path-scurry@1.11.1: 1439 1656 resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} ··· 1445 1662 picocolors@1.1.1: 1446 1663 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1447 1664 1665 + picomatch@2.3.1: 1666 + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1667 + engines: {node: '>=8.6'} 1668 + 1448 1669 picomatch@4.0.3: 1449 1670 resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1450 1671 engines: {node: '>=12'} ··· 1453 1674 resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} 1454 1675 engines: {node: ^10 || ^12 || >=14} 1455 1676 1677 + preact-iso@2.11.1: 1678 + resolution: {integrity: sha512-rLy0RmzP/hrDjnFdnEblxFgKtzUj4njkHrpGJBGS7S4QuYw1zv0lA38qsWpeAAB10JAz/hF2CsHrLen9ufCtbw==} 1679 + peerDependencies: 1680 + preact: '>=10 || >= 11.0.0-0' 1681 + preact-render-to-string: '>=6.4.0' 1682 + 1683 + preact-render-to-string@6.6.6: 1684 + resolution: {integrity: sha512-EfqZJytnjJldV+YaaqhthU2oXsEf5e+6rDv957p+zxAvNfFLQOPfvBOTncscQ+akzu6Wrl7s3Pa0LjUQmWJsGQ==} 1685 + peerDependencies: 1686 + preact: '>=10 || >= 11.0.0-0' 1687 + 1688 + preact@10.28.4: 1689 + resolution: {integrity: sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==} 1690 + 1456 1691 prelude-ls@1.2.1: 1457 1692 resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1458 1693 engines: {node: '>= 0.8.0'} ··· 1474 1709 resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} 1475 1710 engines: {node: '>=10'} 1476 1711 1477 - promise@7.3.1: 1478 - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} 1479 - 1480 - pug-attrs@3.0.0: 1481 - resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} 1482 - 1483 - pug-code-gen@3.0.3: 1484 - resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==} 1485 - 1486 - pug-error@2.1.0: 1487 - resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} 1488 - 1489 - pug-filters@4.0.0: 1490 - resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} 1491 - 1492 - pug-lexer@5.0.1: 1493 - resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} 1494 - 1495 - pug-linker@4.0.0: 1496 - resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} 1497 - 1498 - pug-load@3.0.0: 1499 - resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} 1500 - 1501 - pug-parser@6.0.0: 1502 - resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} 1503 - 1504 - pug-runtime@3.0.1: 1505 - resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} 1506 - 1507 - pug-strip-comments@2.0.0: 1508 - resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} 1509 - 1510 - pug-walk@2.0.0: 1511 - resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} 1512 - 1513 - pug@3.0.3: 1514 - resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} 1515 - 1516 1712 punycode@2.3.1: 1517 1713 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1518 1714 engines: {node: '>=6'} ··· 1525 1721 resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1526 1722 engines: {node: '>= 14.18.0'} 1527 1723 1528 - resolve@1.22.11: 1529 - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} 1530 - engines: {node: '>= 0.4'} 1531 - hasBin: true 1532 - 1533 1724 retry@0.12.0: 1534 1725 resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 1535 1726 engines: {node: '>= 4'} ··· 1558 1749 sax@1.5.0: 1559 1750 resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==} 1560 1751 engines: {node: '>=11.0.0'} 1752 + 1753 + semver@6.3.1: 1754 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1755 + hasBin: true 1561 1756 1562 1757 semver@7.7.4: 1563 1758 resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} ··· 1586 1781 resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1587 1782 engines: {node: '>=14'} 1588 1783 1784 + simple-code-frame@1.3.0: 1785 + resolution: {integrity: sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==} 1786 + 1589 1787 slugify@1.6.6: 1590 1788 resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} 1591 1789 engines: {node: '>=8.0.0'} ··· 1610 1808 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1611 1809 engines: {node: '>=0.10.0'} 1612 1810 1811 + source-map@0.7.6: 1812 + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} 1813 + engines: {node: '>= 12'} 1814 + 1613 1815 ssri@9.0.1: 1614 1816 resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} 1615 1817 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1616 1818 1819 + stack-trace@1.0.0-pre2: 1820 + resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} 1821 + engines: {node: '>=16'} 1822 + 1617 1823 string-width@4.2.3: 1618 1824 resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1619 1825 engines: {node: '>=8'} ··· 1633 1839 resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} 1634 1840 engines: {node: '>=12'} 1635 1841 1636 - supports-preserve-symlinks-flag@1.0.0: 1637 - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1638 - engines: {node: '>= 0.4'} 1639 - 1640 1842 svg-pathdata@6.0.3: 1641 1843 resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} 1642 1844 engines: {node: '>=12.0.0'} ··· 1658 1860 svgpath@2.6.0: 1659 1861 resolution: {integrity: sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==} 1660 1862 1863 + tailwindcss@4.2.1: 1864 + resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} 1865 + 1866 + tapable@2.3.0: 1867 + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} 1868 + engines: {node: '>=6'} 1869 + 1661 1870 tar@6.2.1: 1662 1871 resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} 1663 1872 engines: {node: '>=10'} ··· 1670 1879 tinyglobby@0.2.15: 1671 1880 resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1672 1881 engines: {node: '>=12.0.0'} 1673 - 1674 - token-stream@1.0.0: 1675 - resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} 1676 1882 1677 1883 ts-api-utils@2.4.0: 1678 1884 resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} ··· 1728 1934 resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} 1729 1935 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1730 1936 1937 + update-browserslist-db@1.2.3: 1938 + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} 1939 + hasBin: true 1940 + peerDependencies: 1941 + browserslist: '>= 4.21.0' 1942 + 1731 1943 uri-js@4.4.1: 1732 1944 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1733 1945 ··· 1753 1965 svgo: 1754 1966 optional: true 1755 1967 1756 - vite-plugin-pug@0.4.1: 1757 - resolution: {integrity: sha512-2M4qNpIgUV+zA63w566jyp3LpaIuSBMfghOzue7PYnFTms48Ux78Bp/ccRSaGRbFW9BkTxdqgi5h7xvBN7YruQ==} 1968 + vite-prerender-plugin@0.5.12: 1969 + resolution: {integrity: sha512-EiwhbMn+flg14EysbLTmZSzq8NGTxhytgK3bf4aGRF1evWLGwZiHiUJ1KZDvbxgKbMf2pG6fJWGEa3UZXOnR1g==} 1970 + peerDependencies: 1971 + vite: 5.x || 6.x || 7.x 1758 1972 1759 1973 vite@8.0.0-beta.16: 1760 1974 resolution: {integrity: sha512-c0t7hYkxsjws89HH+BUFh/sL3BpPNhNsL9CJrTpMxBmwKQBRSa5OJ5w4o9O0bQVI/H/vx7UpUUIevvXa37NS/Q==} ··· 1798 2012 optional: true 1799 2013 yaml: 1800 2014 optional: true 1801 - 1802 - void-elements@3.1.0: 1803 - resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} 1804 - engines: {node: '>=0.10.0'} 1805 2015 1806 2016 which@2.0.2: 1807 2017 resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} ··· 1811 2021 wide-align@1.1.5: 1812 2022 resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 1813 2023 1814 - with@7.0.2: 1815 - resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} 1816 - engines: {node: '>= 10.0.0'} 1817 - 1818 2024 word-wrap@1.2.5: 1819 2025 resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1820 2026 engines: {node: '>=0.10.0'} ··· 1833 2039 wrappy@1.0.2: 1834 2040 resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1835 2041 2042 + yallist@3.1.1: 2043 + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2044 + 1836 2045 yallist@4.0.0: 1837 2046 resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1838 2047 ··· 1842 2051 1843 2052 snapshots: 1844 2053 2054 + '@babel/code-frame@7.29.0': 2055 + dependencies: 2056 + '@babel/helper-validator-identifier': 7.28.5 2057 + js-tokens: 4.0.0 2058 + picocolors: 1.1.1 2059 + 2060 + '@babel/compat-data@7.29.0': {} 2061 + 2062 + '@babel/core@7.29.0': 2063 + dependencies: 2064 + '@babel/code-frame': 7.29.0 2065 + '@babel/generator': 7.29.1 2066 + '@babel/helper-compilation-targets': 7.28.6 2067 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) 2068 + '@babel/helpers': 7.28.6 2069 + '@babel/parser': 7.29.0 2070 + '@babel/template': 7.28.6 2071 + '@babel/traverse': 7.29.0 2072 + '@babel/types': 7.29.0 2073 + '@jridgewell/remapping': 2.3.5 2074 + convert-source-map: 2.0.0 2075 + debug: 4.4.3 2076 + gensync: 1.0.0-beta.2 2077 + json5: 2.2.3 2078 + semver: 6.3.1 2079 + transitivePeerDependencies: 2080 + - supports-color 2081 + 2082 + '@babel/generator@7.29.1': 2083 + dependencies: 2084 + '@babel/parser': 7.29.0 2085 + '@babel/types': 7.29.0 2086 + '@jridgewell/gen-mapping': 0.3.13 2087 + '@jridgewell/trace-mapping': 0.3.31 2088 + jsesc: 3.1.0 2089 + 2090 + '@babel/helper-annotate-as-pure@7.27.3': 2091 + dependencies: 2092 + '@babel/types': 7.29.0 2093 + 2094 + '@babel/helper-compilation-targets@7.28.6': 2095 + dependencies: 2096 + '@babel/compat-data': 7.29.0 2097 + '@babel/helper-validator-option': 7.27.1 2098 + browserslist: 4.28.1 2099 + lru-cache: 5.1.1 2100 + semver: 6.3.1 2101 + 2102 + '@babel/helper-globals@7.28.0': {} 2103 + 2104 + '@babel/helper-module-imports@7.28.6': 2105 + dependencies: 2106 + '@babel/traverse': 7.29.0 2107 + '@babel/types': 7.29.0 2108 + transitivePeerDependencies: 2109 + - supports-color 2110 + 2111 + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': 2112 + dependencies: 2113 + '@babel/core': 7.29.0 2114 + '@babel/helper-module-imports': 7.28.6 2115 + '@babel/helper-validator-identifier': 7.28.5 2116 + '@babel/traverse': 7.29.0 2117 + transitivePeerDependencies: 2118 + - supports-color 2119 + 2120 + '@babel/helper-plugin-utils@7.28.6': {} 2121 + 1845 2122 '@babel/helper-string-parser@7.27.1': {} 1846 2123 1847 2124 '@babel/helper-validator-identifier@7.28.5': {} 1848 2125 2126 + '@babel/helper-validator-option@7.27.1': {} 2127 + 2128 + '@babel/helpers@7.28.6': 2129 + dependencies: 2130 + '@babel/template': 7.28.6 2131 + '@babel/types': 7.29.0 2132 + 1849 2133 '@babel/parser@7.29.0': 1850 2134 dependencies: 1851 2135 '@babel/types': 7.29.0 2136 + 2137 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': 2138 + dependencies: 2139 + '@babel/core': 7.29.0 2140 + '@babel/helper-plugin-utils': 7.28.6 2141 + 2142 + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.29.0)': 2143 + dependencies: 2144 + '@babel/core': 7.29.0 2145 + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) 2146 + transitivePeerDependencies: 2147 + - supports-color 2148 + 2149 + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0)': 2150 + dependencies: 2151 + '@babel/core': 7.29.0 2152 + '@babel/helper-annotate-as-pure': 7.27.3 2153 + '@babel/helper-module-imports': 7.28.6 2154 + '@babel/helper-plugin-utils': 7.28.6 2155 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) 2156 + '@babel/types': 7.29.0 2157 + transitivePeerDependencies: 2158 + - supports-color 2159 + 2160 + '@babel/template@7.28.6': 2161 + dependencies: 2162 + '@babel/code-frame': 7.29.0 2163 + '@babel/parser': 7.29.0 2164 + '@babel/types': 7.29.0 2165 + 2166 + '@babel/traverse@7.29.0': 2167 + dependencies: 2168 + '@babel/code-frame': 7.29.0 2169 + '@babel/generator': 7.29.1 2170 + '@babel/helper-globals': 7.28.0 2171 + '@babel/parser': 7.29.0 2172 + '@babel/template': 7.28.6 2173 + '@babel/types': 7.29.0 2174 + debug: 4.4.3 2175 + transitivePeerDependencies: 2176 + - supports-color 1852 2177 1853 2178 '@babel/types@7.29.0': 1854 2179 dependencies: ··· 2047 2372 wrap-ansi: 8.1.0 2048 2373 wrap-ansi-cjs: wrap-ansi@7.0.0 2049 2374 2375 + '@jridgewell/gen-mapping@0.3.13': 2376 + dependencies: 2377 + '@jridgewell/sourcemap-codec': 1.5.5 2378 + '@jridgewell/trace-mapping': 0.3.31 2379 + 2380 + '@jridgewell/remapping@2.3.5': 2381 + dependencies: 2382 + '@jridgewell/gen-mapping': 0.3.13 2383 + '@jridgewell/trace-mapping': 0.3.31 2384 + 2385 + '@jridgewell/resolve-uri@3.1.2': {} 2386 + 2387 + '@jridgewell/sourcemap-codec@1.5.5': {} 2388 + 2389 + '@jridgewell/trace-mapping@0.3.31': 2390 + dependencies: 2391 + '@jridgewell/resolve-uri': 3.1.2 2392 + '@jridgewell/sourcemap-codec': 1.5.5 2393 + 2050 2394 '@napi-rs/wasm-runtime@1.1.1': 2051 2395 dependencies: 2052 2396 '@emnapi/core': 1.8.1 ··· 2132 2476 '@pkgjs/parseargs@0.11.0': 2133 2477 optional: true 2134 2478 2479 + '@preact/preset-vite@2.10.3(@babel/core@7.29.0)(preact@10.28.4)(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3))': 2480 + dependencies: 2481 + '@babel/core': 7.29.0 2482 + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) 2483 + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) 2484 + '@prefresh/vite': 2.4.12(preact@10.28.4)(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3)) 2485 + '@rollup/pluginutils': 5.3.0 2486 + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0) 2487 + debug: 4.4.3 2488 + picocolors: 1.1.1 2489 + vite: 8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3) 2490 + vite-prerender-plugin: 0.5.12(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3)) 2491 + transitivePeerDependencies: 2492 + - preact 2493 + - rollup 2494 + - supports-color 2495 + 2496 + '@prefresh/babel-plugin@0.5.3': {} 2497 + 2498 + '@prefresh/core@1.5.9(preact@10.28.4)': 2499 + dependencies: 2500 + preact: 10.28.4 2501 + 2502 + '@prefresh/utils@1.2.1': {} 2503 + 2504 + '@prefresh/vite@2.4.12(preact@10.28.4)(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3))': 2505 + dependencies: 2506 + '@babel/core': 7.29.0 2507 + '@prefresh/babel-plugin': 0.5.3 2508 + '@prefresh/core': 1.5.9(preact@10.28.4) 2509 + '@prefresh/utils': 1.2.1 2510 + '@rollup/pluginutils': 4.2.1 2511 + preact: 10.28.4 2512 + vite: 8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3) 2513 + transitivePeerDependencies: 2514 + - supports-color 2515 + 2135 2516 '@rolldown/binding-android-arm64@1.0.0-rc.6': 2136 2517 optional: true 2137 2518 ··· 2175 2556 2176 2557 '@rolldown/pluginutils@1.0.0-rc.6': {} 2177 2558 2559 + '@rollup/pluginutils@4.2.1': 2560 + dependencies: 2561 + estree-walker: 2.0.2 2562 + picomatch: 2.3.1 2563 + 2178 2564 '@rollup/pluginutils@5.3.0': 2179 2565 dependencies: 2180 2566 '@types/estree': 1.0.8 2181 2567 estree-walker: 2.0.2 2182 2568 picomatch: 4.0.3 2183 2569 2570 + '@tailwindcss/node@4.2.1': 2571 + dependencies: 2572 + '@jridgewell/remapping': 2.3.5 2573 + enhanced-resolve: 5.20.0 2574 + jiti: 2.6.1 2575 + lightningcss: 1.31.1 2576 + magic-string: 0.30.21 2577 + source-map-js: 1.2.1 2578 + tailwindcss: 4.2.1 2579 + 2580 + '@tailwindcss/oxide-android-arm64@4.2.1': 2581 + optional: true 2582 + 2583 + '@tailwindcss/oxide-darwin-arm64@4.2.1': 2584 + optional: true 2585 + 2586 + '@tailwindcss/oxide-darwin-x64@4.2.1': 2587 + optional: true 2588 + 2589 + '@tailwindcss/oxide-freebsd-x64@4.2.1': 2590 + optional: true 2591 + 2592 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': 2593 + optional: true 2594 + 2595 + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': 2596 + optional: true 2597 + 2598 + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': 2599 + optional: true 2600 + 2601 + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': 2602 + optional: true 2603 + 2604 + '@tailwindcss/oxide-linux-x64-musl@4.2.1': 2605 + optional: true 2606 + 2607 + '@tailwindcss/oxide-wasm32-wasi@4.2.1': 2608 + optional: true 2609 + 2610 + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': 2611 + optional: true 2612 + 2613 + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': 2614 + optional: true 2615 + 2616 + '@tailwindcss/oxide@4.2.1': 2617 + optionalDependencies: 2618 + '@tailwindcss/oxide-android-arm64': 4.2.1 2619 + '@tailwindcss/oxide-darwin-arm64': 4.2.1 2620 + '@tailwindcss/oxide-darwin-x64': 4.2.1 2621 + '@tailwindcss/oxide-freebsd-x64': 4.2.1 2622 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1 2623 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1 2624 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.1 2625 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.1 2626 + '@tailwindcss/oxide-linux-x64-musl': 4.2.1 2627 + '@tailwindcss/oxide-wasm32-wasi': 4.2.1 2628 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 2629 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 2630 + 2631 + '@tailwindcss/vite@4.2.1(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3))': 2632 + dependencies: 2633 + '@tailwindcss/node': 4.2.1 2634 + '@tailwindcss/oxide': 4.2.1 2635 + tailwindcss: 4.2.1 2636 + vite: 8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3) 2637 + 2184 2638 '@tootallnate/once@2.0.0': {} 2185 2639 2186 2640 '@tybys/wasm-util@0.10.1': ··· 2193 2647 '@types/estree@1.0.8': {} 2194 2648 2195 2649 '@types/json-schema@7.0.15': {} 2196 - 2197 - '@types/pug@2.0.10': {} 2198 2650 2199 2651 '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': 2200 2652 dependencies: ··· 2295 2747 dependencies: 2296 2748 acorn: 8.16.0 2297 2749 2298 - acorn@7.4.1: {} 2299 - 2300 2750 acorn@8.16.0: {} 2301 2751 2302 2752 agent-base@6.0.2: ··· 2342 2792 2343 2793 argparse@2.0.1: {} 2344 2794 2345 - asap@2.0.6: {} 2346 - 2347 - assert-never@1.4.0: {} 2348 - 2349 - babel-walk@3.0.0-canary-5: 2795 + babel-plugin-transform-hook-names@1.0.2(@babel/core@7.29.0): 2350 2796 dependencies: 2351 - '@babel/types': 7.29.0 2797 + '@babel/core': 7.29.0 2352 2798 2353 2799 balanced-match@1.0.2: {} 2354 2800 2355 2801 balanced-match@4.0.4: {} 2802 + 2803 + baseline-browser-mapping@2.10.0: {} 2356 2804 2357 2805 bindings@1.5.0: 2358 2806 dependencies: ··· 2373 2821 dependencies: 2374 2822 balanced-match: 4.0.4 2375 2823 2824 + browserslist@4.28.1: 2825 + dependencies: 2826 + baseline-browser-mapping: 2.10.0 2827 + caniuse-lite: 1.0.30001777 2828 + electron-to-chromium: 1.5.307 2829 + node-releases: 2.0.36 2830 + update-browserslist-db: 1.2.3(browserslist@4.28.1) 2831 + 2376 2832 bufferstreams@3.0.0: 2377 2833 dependencies: 2378 2834 readable-stream: 3.6.2 ··· 2400 2856 transitivePeerDependencies: 2401 2857 - bluebird 2402 2858 2403 - call-bind-apply-helpers@1.0.2: 2404 - dependencies: 2405 - es-errors: 1.3.0 2406 - function-bind: 1.1.2 2407 - 2408 - call-bound@1.0.4: 2409 - dependencies: 2410 - call-bind-apply-helpers: 1.0.2 2411 - get-intrinsic: 1.3.0 2859 + caniuse-lite@1.0.30001777: {} 2412 2860 2413 2861 case@1.6.3: {} 2414 2862 2415 - character-parser@2.2.0: 2416 - dependencies: 2417 - is-regex: 1.2.1 2418 - 2419 2863 chokidar@4.0.3: 2420 2864 dependencies: 2421 2865 readdirp: 4.1.2 ··· 2450 2894 2451 2895 console-control-strings@1.1.0: {} 2452 2896 2453 - constantinople@4.0.1: 2454 - dependencies: 2455 - '@babel/parser': 7.29.0 2456 - '@babel/types': 7.29.0 2897 + convert-source-map@2.0.0: {} 2457 2898 2458 2899 cross-spawn@7.0.6: 2459 2900 dependencies: ··· 2502 2943 2503 2944 detect-libc@2.1.2: {} 2504 2945 2505 - doctypes@1.1.0: {} 2506 - 2507 2946 dom-serializer@2.0.0: 2508 2947 dependencies: 2509 2948 domelementtype: 2.3.0 ··· 2522 2961 domelementtype: 2.3.0 2523 2962 domhandler: 5.0.3 2524 2963 2525 - dunder-proto@1.0.1: 2526 - dependencies: 2527 - call-bind-apply-helpers: 1.0.2 2528 - es-errors: 1.3.0 2529 - gopd: 1.2.0 2964 + eastasianwidth@0.2.0: {} 2530 2965 2531 - eastasianwidth@0.2.0: {} 2966 + electron-to-chromium@1.5.307: {} 2532 2967 2533 2968 emoji-regex@8.0.0: {} 2534 2969 ··· 2539 2974 iconv-lite: 0.6.3 2540 2975 optional: true 2541 2976 2977 + enhanced-resolve@5.20.0: 2978 + dependencies: 2979 + graceful-fs: 4.2.11 2980 + tapable: 2.3.0 2981 + 2542 2982 entities@4.5.0: {} 2543 2983 2544 2984 env-paths@2.2.1: {} 2545 2985 2546 2986 err-code@2.0.3: {} 2547 - 2548 - es-define-property@1.0.1: {} 2549 - 2550 - es-errors@1.3.0: {} 2551 - 2552 - es-object-atoms@1.1.1: 2553 - dependencies: 2554 - es-errors: 1.3.0 2555 2987 2556 2988 es5-ext@0.10.64: 2557 2989 dependencies: ··· 2577 3009 es5-ext: 0.10.64 2578 3010 es6-iterator: 2.0.3 2579 3011 es6-symbol: 3.1.4 3012 + 3013 + escalade@3.2.0: {} 2580 3014 2581 3015 escape-string-regexp@4.0.0: {} 2582 3016 ··· 2725 3159 fsevents@2.3.3: 2726 3160 optional: true 2727 3161 2728 - function-bind@1.1.2: {} 2729 - 2730 3162 gauge@4.0.4: 2731 3163 dependencies: 2732 3164 aproba: 2.1.0 ··· 2738 3170 strip-ansi: 6.0.1 2739 3171 wide-align: 1.1.5 2740 3172 2741 - get-intrinsic@1.3.0: 2742 - dependencies: 2743 - call-bind-apply-helpers: 1.0.2 2744 - es-define-property: 1.0.1 2745 - es-errors: 1.3.0 2746 - es-object-atoms: 1.1.1 2747 - function-bind: 1.1.2 2748 - get-proto: 1.0.1 2749 - gopd: 1.2.0 2750 - has-symbols: 1.1.0 2751 - hasown: 2.0.2 2752 - math-intrinsics: 1.1.0 2753 - 2754 - get-proto@1.0.1: 2755 - dependencies: 2756 - dunder-proto: 1.0.1 2757 - es-object-atoms: 1.1.1 3173 + gensync@1.0.0-beta.2: {} 2758 3174 2759 3175 glob-parent@6.0.2: 2760 3176 dependencies: ··· 2788 3204 2789 3205 globals@17.4.0: {} 2790 3206 2791 - gopd@1.2.0: {} 2792 - 2793 3207 graceful-fs@4.2.11: {} 2794 3208 2795 3209 handlebars@4.7.8: ··· 2801 3215 optionalDependencies: 2802 3216 uglify-js: 3.19.3 2803 3217 2804 - has-symbols@1.1.0: {} 2805 - 2806 - has-tostringtag@1.0.2: 2807 - dependencies: 2808 - has-symbols: 1.1.0 2809 - 2810 3218 has-unicode@2.0.1: {} 2811 3219 2812 - hasown@2.0.2: 2813 - dependencies: 2814 - function-bind: 1.1.2 3220 + he@1.2.0: {} 2815 3221 2816 3222 http-cache-semantics@4.2.0: {} 2817 3223 ··· 2862 3268 2863 3269 ip-address@10.1.0: {} 2864 3270 2865 - is-core-module@2.16.1: 2866 - dependencies: 2867 - hasown: 2.0.2 2868 - 2869 - is-expression@4.0.0: 2870 - dependencies: 2871 - acorn: 7.4.1 2872 - object-assign: 4.1.1 2873 - 2874 3271 is-extglob@2.1.1: {} 2875 3272 2876 3273 is-fullwidth-code-point@3.0.0: {} ··· 2883 3280 2884 3281 is-promise@2.2.2: {} 2885 3282 2886 - is-regex@1.2.1: 2887 - dependencies: 2888 - call-bound: 1.0.4 2889 - gopd: 1.2.0 2890 - has-tostringtag: 1.0.2 2891 - hasown: 2.0.2 2892 - 2893 3283 isexe@2.0.0: {} 2894 3284 2895 3285 jackspeak@3.4.3: ··· 2900 3290 2901 3291 jiti@2.6.1: {} 2902 3292 2903 - js-stringify@1.0.2: {} 3293 + js-tokens@4.0.0: {} 3294 + 3295 + jsesc@3.1.0: {} 2904 3296 2905 3297 json-buffer@3.0.1: {} 2906 3298 ··· 2908 3300 2909 3301 json-stable-stringify-without-jsonify@1.0.1: {} 2910 3302 2911 - jstransformer@1.0.0: 2912 - dependencies: 2913 - is-promise: 2.2.2 2914 - promise: 7.3.1 3303 + json5@2.2.3: {} 2915 3304 2916 3305 keyv@4.5.4: 2917 3306 dependencies: 2918 3307 json-buffer: 3.0.1 3308 + 3309 + kolorist@1.8.0: {} 2919 3310 2920 3311 levn@0.4.1: 2921 3312 dependencies: ··· 2979 3370 2980 3371 lru-cache@10.4.3: {} 2981 3372 3373 + lru-cache@5.1.1: 3374 + dependencies: 3375 + yallist: 3.1.1 3376 + 2982 3377 lru-cache@7.18.3: {} 2983 3378 2984 3379 lru-queue@0.1.0: 2985 3380 dependencies: 2986 3381 es5-ext: 0.10.64 3382 + 3383 + magic-string@0.30.21: 3384 + dependencies: 3385 + '@jridgewell/sourcemap-codec': 1.5.5 2987 3386 2988 3387 make-fetch-happen@10.2.1: 2989 3388 dependencies: ··· 3007 3406 - bluebird 3008 3407 - supports-color 3009 3408 3010 - math-intrinsics@1.1.0: {} 3011 - 3012 3409 mdn-data@2.0.28: {} 3013 3410 3014 3411 mdn-data@2.23.0: {} ··· 3119 3516 - bluebird 3120 3517 - supports-color 3121 3518 3519 + node-html-parser@6.1.13: 3520 + dependencies: 3521 + css-select: 5.2.2 3522 + he: 1.2.0 3523 + 3524 + node-releases@2.0.36: {} 3525 + 3122 3526 nopt@6.0.0: 3123 3527 dependencies: 3124 3528 abbrev: 1.1.1 ··· 3134 3538 dependencies: 3135 3539 boolbase: 1.0.0 3136 3540 3137 - object-assign@4.1.1: {} 3138 - 3139 3541 once@1.4.0: 3140 3542 dependencies: 3141 3543 wrappy: 1.0.2 ··· 3171 3573 3172 3574 path-key@3.1.1: {} 3173 3575 3174 - path-parse@1.0.7: {} 3175 - 3176 3576 path-scurry@1.11.1: 3177 3577 dependencies: 3178 3578 lru-cache: 10.4.3 ··· 3182 3582 3183 3583 picocolors@1.1.1: {} 3184 3584 3585 + picomatch@2.3.1: {} 3586 + 3185 3587 picomatch@4.0.3: {} 3186 3588 3187 3589 postcss@8.5.8: ··· 3190 3592 picocolors: 1.1.1 3191 3593 source-map-js: 1.2.1 3192 3594 3595 + preact-iso@2.11.1(preact-render-to-string@6.6.6(preact@10.28.4))(preact@10.28.4): 3596 + dependencies: 3597 + preact: 10.28.4 3598 + preact-render-to-string: 6.6.6(preact@10.28.4) 3599 + 3600 + preact-render-to-string@6.6.6(preact@10.28.4): 3601 + dependencies: 3602 + preact: 10.28.4 3603 + 3604 + preact@10.28.4: {} 3605 + 3193 3606 prelude-ls@1.2.1: {} 3194 3607 3195 3608 prettier@3.8.1: {} ··· 3201 3614 err-code: 2.0.3 3202 3615 retry: 0.12.0 3203 3616 3204 - promise@7.3.1: 3205 - dependencies: 3206 - asap: 2.0.6 3207 - 3208 - pug-attrs@3.0.0: 3209 - dependencies: 3210 - constantinople: 4.0.1 3211 - js-stringify: 1.0.2 3212 - pug-runtime: 3.0.1 3213 - 3214 - pug-code-gen@3.0.3: 3215 - dependencies: 3216 - constantinople: 4.0.1 3217 - doctypes: 1.1.0 3218 - js-stringify: 1.0.2 3219 - pug-attrs: 3.0.0 3220 - pug-error: 2.1.0 3221 - pug-runtime: 3.0.1 3222 - void-elements: 3.1.0 3223 - with: 7.0.2 3224 - 3225 - pug-error@2.1.0: {} 3226 - 3227 - pug-filters@4.0.0: 3228 - dependencies: 3229 - constantinople: 4.0.1 3230 - jstransformer: 1.0.0 3231 - pug-error: 2.1.0 3232 - pug-walk: 2.0.0 3233 - resolve: 1.22.11 3234 - 3235 - pug-lexer@5.0.1: 3236 - dependencies: 3237 - character-parser: 2.2.0 3238 - is-expression: 4.0.0 3239 - pug-error: 2.1.0 3240 - 3241 - pug-linker@4.0.0: 3242 - dependencies: 3243 - pug-error: 2.1.0 3244 - pug-walk: 2.0.0 3245 - 3246 - pug-load@3.0.0: 3247 - dependencies: 3248 - object-assign: 4.1.1 3249 - pug-walk: 2.0.0 3250 - 3251 - pug-parser@6.0.0: 3252 - dependencies: 3253 - pug-error: 2.1.0 3254 - token-stream: 1.0.0 3255 - 3256 - pug-runtime@3.0.1: {} 3257 - 3258 - pug-strip-comments@2.0.0: 3259 - dependencies: 3260 - pug-error: 2.1.0 3261 - 3262 - pug-walk@2.0.0: {} 3263 - 3264 - pug@3.0.3: 3265 - dependencies: 3266 - pug-code-gen: 3.0.3 3267 - pug-filters: 4.0.0 3268 - pug-lexer: 5.0.1 3269 - pug-linker: 4.0.0 3270 - pug-load: 3.0.0 3271 - pug-parser: 6.0.0 3272 - pug-runtime: 3.0.1 3273 - pug-strip-comments: 2.0.0 3274 - 3275 3617 punycode@2.3.1: {} 3276 3618 3277 3619 readable-stream@3.6.2: ··· 3282 3624 3283 3625 readdirp@4.1.2: {} 3284 3626 3285 - resolve@1.22.11: 3286 - dependencies: 3287 - is-core-module: 2.16.1 3288 - path-parse: 1.0.7 3289 - supports-preserve-symlinks-flag: 1.0.0 3290 - 3291 3627 retry@0.12.0: {} 3292 3628 3293 3629 rimraf@3.0.2: ··· 3327 3663 '@parcel/watcher': 2.5.6 3328 3664 3329 3665 sax@1.5.0: {} 3666 + 3667 + semver@6.3.1: {} 3330 3668 3331 3669 semver@7.7.4: {} 3332 3670 ··· 3373 3711 3374 3712 signal-exit@4.1.0: {} 3375 3713 3714 + simple-code-frame@1.3.0: 3715 + dependencies: 3716 + kolorist: 1.8.0 3717 + 3376 3718 slugify@1.6.6: {} 3377 3719 3378 3720 smart-buffer@4.2.0: {} ··· 3394 3736 3395 3737 source-map@0.6.1: {} 3396 3738 3739 + source-map@0.7.6: {} 3740 + 3397 3741 ssri@9.0.1: 3398 3742 dependencies: 3399 3743 minipass: 3.3.6 3400 3744 3745 + stack-trace@1.0.0-pre2: {} 3746 + 3401 3747 string-width@4.2.3: 3402 3748 dependencies: 3403 3749 emoji-regex: 8.0.0 ··· 3421 3767 strip-ansi@7.2.0: 3422 3768 dependencies: 3423 3769 ansi-regex: 6.2.2 3424 - 3425 - supports-preserve-symlinks-flag@1.0.0: {} 3426 3770 3427 3771 svg-pathdata@6.0.3: {} 3428 3772 ··· 3454 3798 3455 3799 svgpath@2.6.0: {} 3456 3800 3801 + tailwindcss@4.2.1: {} 3802 + 3803 + tapable@2.3.0: {} 3804 + 3457 3805 tar@6.2.1: 3458 3806 dependencies: 3459 3807 chownr: 2.0.0 ··· 3472 3820 dependencies: 3473 3821 fdir: 6.5.0(picomatch@4.0.3) 3474 3822 picomatch: 4.0.3 3475 - 3476 - token-stream@1.0.0: {} 3477 3823 3478 3824 ts-api-utils@2.4.0(typescript@5.9.3): 3479 3825 dependencies: ··· 3531 3877 dependencies: 3532 3878 imurmurhash: 0.1.4 3533 3879 3880 + update-browserslist-db@1.2.3(browserslist@4.28.1): 3881 + dependencies: 3882 + browserslist: 4.28.1 3883 + escalade: 3.2.0 3884 + picocolors: 1.1.1 3885 + 3534 3886 uri-js@4.4.1: 3535 3887 dependencies: 3536 3888 punycode: 2.3.1 ··· 3555 3907 sharp: 0.34.5 3556 3908 svgo: 4.0.1 3557 3909 3558 - vite-plugin-pug@0.4.1: 3910 + vite-prerender-plugin@0.5.12(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3)): 3559 3911 dependencies: 3560 - picocolors: 1.1.1 3561 - pug: 3.0.3 3912 + kolorist: 1.8.0 3913 + magic-string: 0.30.21 3914 + node-html-parser: 6.1.13 3915 + simple-code-frame: 1.3.0 3916 + source-map: 0.7.6 3917 + stack-trace: 1.0.0-pre2 3918 + vite: 8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3) 3562 3919 3563 3920 vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3): 3564 3921 dependencies: ··· 3573 3930 jiti: 2.6.1 3574 3931 sass: 1.97.3 3575 3932 3576 - void-elements@3.1.0: {} 3577 - 3578 3933 which@2.0.2: 3579 3934 dependencies: 3580 3935 isexe: 2.0.0 ··· 3583 3938 dependencies: 3584 3939 string-width: 4.2.3 3585 3940 3586 - with@7.0.2: 3587 - dependencies: 3588 - '@babel/parser': 7.29.0 3589 - '@babel/types': 7.29.0 3590 - assert-never: 1.4.0 3591 - babel-walk: 3.0.0-canary-5 3592 - 3593 3941 word-wrap@1.2.5: {} 3594 3942 3595 3943 wordwrap@1.0.0: {} ··· 3607 3955 strip-ansi: 7.2.0 3608 3956 3609 3957 wrappy@1.0.2: {} 3958 + 3959 + yallist@3.1.1: {} 3610 3960 3611 3961 yallist@4.0.0: {} 3612 3962
-1
scss/_base.scss
··· 1 1 @import "variables"; 2 2 3 3 body { 4 - background-color: $colorBrand; 5 4 overflow-x: hidden; 6 5 } 7 6
-2
scss/_buttons.scss
··· 17 17 transition: 18 18 background 0.3s cubic-bezier(0.215, 0.61, 0.355, 1), 19 19 box-shadow 0.3s cubic-bezier(0.215, 0.61, 0.355, 1); 20 - 21 - @include alt-font; 22 20 } 23 21 24 22 @each $name, $color in $btnColors {
-4
scss/_grid.scss
··· 8 8 9 9 .container { 10 10 width: 100%; 11 - padding-right: 0; 12 - padding-left: 0; 13 - margin-right: auto; 14 - margin-left: auto; 15 11 16 12 @media (min-width: map_get($responsiveThresholds, tiny)) { 17 13 max-width: 540px;
-72
scss/_normalize.scss
··· 1 - html { 2 - -ms-text-size-adjust: 100%; 3 - -webkit-text-size-adjust: 100%; 4 - box-sizing: border-box; 5 - } 6 - 7 - *, 8 - *::before, 9 - *::after { 10 - box-sizing: inherit; 11 - } 12 - 13 - body { 14 - margin: 0; 15 - } 16 - 17 - a { 18 - text-decoration: none; 19 - } 20 - 21 - a:active, 22 - a:hover { 23 - outline: 0; 24 - text-decoration: underline; 25 - } 26 - 27 - b, 28 - strong { 29 - font-weight: bold; 30 - } 31 - 32 - sub, 33 - sup { 34 - font-size: 75%; 35 - line-height: 0; 36 - position: relative; 37 - vertical-align: baseline; 38 - } 39 - 40 - sup { 41 - top: -0.5em; 42 - } 43 - 44 - sub { 45 - bottom: -0.25em; 46 - } 47 - 48 - img { 49 - border: 0; 50 - } 51 - 52 - svg:not(:root) { 53 - overflow: hidden; 54 - } 55 - 56 - hr { 57 - -moz-box-sizing: content-box; 58 - box-sizing: content-box; 59 - height: 0; 60 - } 61 - 62 - pre { 63 - overflow: auto; 64 - } 65 - 66 - code, 67 - kbd, 68 - pre, 69 - samp { 70 - font-family: monospace, monospace; 71 - font-size: 1em; 72 - }
-33
scss/_scrollbar.scss
··· 1 1 @import "variables"; 2 2 3 - ::-webkit-scrollbar { 4 - height: 10px; 5 - width: 10px; 6 - background-color: $colorScrollbarTrack; 7 - } 8 - 9 - ::-webkit-scrollbar-track { 10 - background-color: $colorScrollbarTrack; 11 - box-sizing: content-box; 12 - } 13 - 14 - ::-webkit-scrollbar-thumb { 15 - background-color: transparentize($colorScrollbarThumb, 0.5); 16 - border: none; 17 - background-clip: content-box; 18 - width: 5px !important; 19 - box-sizing: content-box; 20 - min-height: 30px; 21 - } 22 - 23 - ::-webkit-scrollbar-thumb:hover { 24 - background-color: transparentize($colorScrollbarThumb, 0.25); 25 - } 26 - 27 - ::-webkit-scrollbar-thumb:active { 28 - background-color: $colorScrollbarThumb; 29 - } 30 - 31 - ::-webkit-scrollbar-corner { 32 - background-color: $colorScrollbarTrack; 33 - } 34 - 35 3 html { 36 4 scrollbar-color: $colorScrollbarThumb $colorScrollbarTrack; 37 - scrollbar-width: thin; 38 5 }
-56
scss/_typography.scss
··· 1 - @use "@fontsource/fira-sans"; 2 - @use "@fontsource/josefin-sans"; 3 - 4 1 @import "variables"; 5 2 6 3 body { ··· 8 5 font-size: 20px; 9 6 font-weight: 400; 10 7 line-height: 1.375; 11 - @include main-font; 12 - 13 8 @media (prefers-color-scheme: dark) { 14 9 color: $colorTextPrimaryDark; 15 10 } 16 11 } 17 12 18 - .text-center { 19 - text-align: center; 20 - } 21 - 22 - .text-justify { 23 - text-align: justify; 24 - overflow-wrap: break-word; 25 - } 26 - 27 - .text-right { 28 - text-align: right; 29 - } 30 - 31 - h1, 32 - h2, 33 - h3, 34 - h4, 35 - h5, 36 - h6 { 37 - margin-top: 0; 38 - margin-bottom: 0.5rem; 39 - font-weight: 500; 40 - line-height: 1.2; 41 - @include alt-font; 42 - } 43 - 44 - h1 { 45 - font-size: 2.5rem; 46 - } 47 - 48 - h2 { 49 - font-size: 2rem; 50 - } 51 - 52 - h3 { 53 - font-size: 1.75rem; 54 - } 55 - 56 - h4 { 57 - font-size: 1.5rem; 58 - } 59 - 60 - h5 { 61 - font-size: 1.25rem; 62 - } 63 - 64 - h6 { 65 - font-size: 1rem; 66 - } 67 - 68 13 p { 69 14 margin-top: 0; 70 15 margin-bottom: 1rem; ··· 73 18 blockquote { 74 19 margin-left: 0; 75 20 margin-right: 0; 76 - @extend h5; 77 21 } 78 22 79 23 a {
-9
scss/_variables.scss
··· 42 42 med: 992px, 43 43 big: 1300px, 44 44 ); 45 - 46 - @mixin main-font { 47 - font-family: "Fira Sans", "Helvetica Neue", "Arial", sans-serif; 48 - } 49 - 50 - @mixin alt-font { 51 - font-family: 52 - "Josefin Sans", "Fira Sans", "Helvetica Neue", "Arial", sans-serif; 53 - }
-1
scss/application.scss
··· 18 18 19 19 @import "variables"; 20 20 21 - @import "normalize"; 22 21 @import "typography"; 23 22 @import "grid"; 24 23 @import "base";
+433
src/App.tsx
··· 1 + import { type ComponentChildren } from "preact"; 2 + import { useCallback, useEffect, useRef, useState } from "preact/hooks"; 3 + import { Footer } from "./Footer"; 4 + import { ConsoleSpinner } from "./ConsoleSpinner"; 5 + import { Avatar } from "./Avatar"; 6 + 7 + const Project = ({ 8 + title, 9 + imgPath, 10 + children, 11 + websiteHref, 12 + sourceHref, 13 + }: { 14 + title: string; 15 + imgPath: string; 16 + children: ComponentChildren; 17 + websiteHref?: string; 18 + sourceHref?: string; 19 + }) => { 20 + return ( 21 + <div className="flex flex-col justify-between"> 22 + <div> 23 + <img 24 + src={imgPath} 25 + alt={`${title} Logo`} 26 + title={title} 27 + loading="lazy" 28 + className="m-center h-20" 29 + /> 30 + <h3 className="font-display text-3xl text-center">{title}</h3> 31 + {children} 32 + </div> 33 + <div> 34 + {websiteHref && ( 35 + <a 36 + href={websiteHref} 37 + target="_blank" 38 + rel="noopener" 39 + className="btn btn-primary font-display" 40 + > 41 + <i class="icon-new_tab" /> Website 42 + </a> 43 + )} 44 + {sourceHref && ( 45 + <a 46 + href={sourceHref} 47 + target="_blank" 48 + rel="noopener" 49 + className="btn btn-accent font-display" 50 + > 51 + <i class="icon-new_tab" /> Source 52 + </a> 53 + )} 54 + </div> 55 + </div> 56 + ); 57 + }; 58 + 59 + const ContactTile = ({ 60 + title, 61 + iconName, 62 + children, 63 + href, 64 + buttonText, 65 + }: { 66 + title: string; 67 + iconName: string; 68 + children: ComponentChildren; 69 + href: string; 70 + buttonText: string; 71 + }) => { 72 + return ( 73 + <div className="flex flex-col justify-between"> 74 + <div> 75 + <h3 className="font-display text-3xl text-center"> 76 + <i className={`icon-${iconName}`} /> {title} 77 + </h3> 78 + {children} 79 + </div> 80 + <div> 81 + <a 82 + href={href} 83 + target="_blank" 84 + rel="noopener" 85 + className="btn btn-primary font-display" 86 + > 87 + {buttonText} 88 + </a> 89 + </div> 90 + </div> 91 + ); 92 + }; 93 + 94 + export const App = () => { 95 + const developmentLinks = [ 96 + { 97 + iconName: "codeberg", 98 + title: "Codeberg", 99 + href: "https://codeberg.org/Scrumplex", 100 + }, 101 + { 102 + iconName: "github", 103 + title: "GitHub", 104 + href: "https://github.com/Scrumplex", 105 + }, 106 + { 107 + iconName: "gitlab", 108 + title: "GitLab.com", 109 + href: "https://gitlab.com/Scrumplex", 110 + }, 111 + ]; 112 + 113 + const donateLinks = [ 114 + { 115 + iconName: "github_sponsors", 116 + title: "GitHub Sponsors", 117 + href: "https://github.com/sponsors/Scrumplex", 118 + }, 119 + { 120 + iconName: "liberapay", 121 + title: "Liberapay", 122 + href: "https://liberapay.com/Scrumplex/donate", 123 + }, 124 + { 125 + iconName: "paypal", 126 + title: "PayPal", 127 + href: "https://www.paypal.me/Scrumplex", 128 + }, 129 + { 130 + iconName: "ko-fi", 131 + title: "Ko-Fi", 132 + href: "https://ko-fi.com/scrumplex", 133 + }, 134 + ]; 135 + 136 + const mainRef = useRef<HTMLDivElement>(null); 137 + 138 + const [mainOffset, setMainOffset] = useState(0); 139 + 140 + const expandConditionally = useCallback( 141 + (force?: boolean) => { 142 + if (mainOffset > 0) { 143 + return; 144 + } 145 + 146 + const rect = mainRef.current!.getBoundingClientRect(); 147 + if ( 148 + rect.top <= 0 || // offset to top window border 149 + rect.height >= window.innerHeight || 150 + force 151 + ) { 152 + setMainOffset(window.pageYOffset + rect.top); 153 + } 154 + }, 155 + [mainRef], 156 + ); 157 + 158 + useEffect(() => { 159 + if (mainOffset || !mainRef.current) { 160 + return; 161 + } 162 + 163 + const onScroll = () => expandConditionally(); 164 + window.addEventListener("scroll", onScroll); 165 + 166 + const onHashChange = () => { 167 + expandConditionally(true); 168 + setTimeout(() => { 169 + location.href = location.hash; 170 + }, 1); 171 + }; 172 + window.addEventListener("hashchange", onHashChange); 173 + return () => { 174 + window.removeEventListener("scroll", onScroll); 175 + window.removeEventListener("hashchange", onHashChange); 176 + }; 177 + }, [mainRef, mainOffset, setMainOffset]); 178 + 179 + return ( 180 + <> 181 + <div className="container wrapper mx-auto grow" id="wrapper"> 182 + <div 183 + ref={mainRef} 184 + className={`sheet ${!mainOffset ? "sheet-splash" : "sheet-splashed"} wavy`} 185 + style={mainOffset ? { marginTop: mainOffset } : {}} 186 + onAnimationEnd={() => { 187 + if (location.hash) { 188 + expandConditionally(true); 189 + location.href = location.hash; 190 + } 191 + }} 192 + > 193 + <div className="row"> 194 + <div className="col-med-5 text-center flex flex-col justify-between"> 195 + <div className="row"> 196 + <div className="col flex flex-col items-center"> 197 + <Avatar /> 198 + <h1 className="font-display text-5xl"> 199 + Scrumplex 200 + </h1> 201 + <strong>he/him or any</strong> 202 + </div> 203 + </div> 204 + <div className="row"> 205 + <div className="col-med-6"> 206 + <h2 className="font-display text-4xl"> 207 + Development 208 + </h2> 209 + {developmentLinks.map((link) => ( 210 + <a 211 + href={link.href} 212 + target="_blank" 213 + rel="noopener" 214 + className={`link link-${link.iconName}`} 215 + title={link.title} 216 + > 217 + <i 218 + className={`icon-2x icon-${link.iconName}`} 219 + /> 220 + </a> 221 + ))} 222 + </div> 223 + <div className="col-med-6"> 224 + <h2 className="font-display text-4xl"> 225 + Donate 226 + </h2> 227 + {donateLinks.map((link) => ( 228 + <a 229 + href={link.href} 230 + target="_blank" 231 + rel="noopener" 232 + className={`link link-${link.iconName}`} 233 + title={link.title} 234 + > 235 + <i 236 + className={`icon-2x icon-${link.iconName}`} 237 + /> 238 + </a> 239 + ))} 240 + </div> 241 + </div> 242 + </div> 243 + <div className="col-med-7"> 244 + <blockquote className="text-right"> 245 + Converting coffee to code... <ConsoleSpinner /> 246 + </blockquote> 247 + <p className="text-justify"> 248 + Hello there, 249 + <br />I am Scrumplex, but you can call me Scrum, 250 + Scrump or Sefa. I am an enthusiastic developer 251 + from <b>Germany</b>, and I invest lots of my 252 + time into playing around with many technologies. 253 + Linux is my primary interest, as I maintain 254 + multiple servers and contribute to various open 255 + source technologies around the Linux space. As 256 + for programming languages, I primarily use 257 + C/C++, Python, Bash, Go, Rust and Kotlin. But I 258 + always try to incorporate other languages as 259 + well, if they fit the use-case. 260 + <br />I know my way around CI/CD professionally, 261 + especially working with GitLab CI, Flux CD, 262 + Kubernetes and all the technologies around 263 + these. And in an effort to apply my DevOps 264 + skills at home, I also do lots of{" "} 265 + <a 266 + href="https://nixos.org" 267 + target="_blank" 268 + rel="noopener" 269 + > 270 + <i className="icon-new_tab"></i> Nix 271 + </a>{" "} 272 + stuff. My daily computing is shaped by{" "} 273 + <a 274 + href="https://gnu.org/philosophy/free-sw.html" 275 + target="_blank" 276 + rel="noopener" 277 + > 278 + <i className="icon-new_tab"></i> free 279 + software 280 + </a>{" "} 281 + and in an effort to ensure that it stays that 282 + way I generally publish all my work under a 283 + copyleft license. If you want to see what I am 284 + working on right now, go to any of the code 285 + forges linked on this page. 286 + </p> 287 + </div> 288 + </div> 289 + <div className="row"> 290 + <div className="col text-right"> 291 + <Footer /> 292 + </div> 293 + </div> 294 + </div> 295 + <div className="sheet wavy" id="projects" hidden={!mainOffset}> 296 + <h2 className="font-display text-4xl">Current Projects</h2> 297 + <div className="grid grid-cols-2 md:grid-cols-3"> 298 + <Project 299 + title="Prism Launcher" 300 + imgPath="prismlauncher.svg" 301 + websiteHref="https://prismlauncher.org" 302 + sourceHref="https://github.com/PrismLauncher/PrismLauncher" 303 + > 304 + A custom launcher for Minecraft that allows you to 305 + easily manage multiple installations of Minecraft at 306 + once. 307 + </Project> 308 + <Project 309 + title="nixpkgs" 310 + imgPath="nixos.svg" 311 + websiteHref="https://nixos.org" 312 + sourceHref="https://github.com/NixOS/nixpkgs" 313 + > 314 + A reproducible toolchain for package management, 315 + system configuration and more. 316 + </Project> 317 + <Project 318 + title="libvibrant" 319 + imgPath="vibrant.svg" 320 + sourceHref="https://github.com/libvibrant" 321 + > 322 + A collection of software to adjust color vibrancy 323 + and other color correction settings on Linux display 324 + servers. 325 + </Project> 326 + </div> 327 + <h2 className="font-display text-4xl">Legacy Projects</h2> 328 + <div className="grid grid-cols-2 md:grid-cols-3"> 329 + <Project 330 + title="PASSY" 331 + imgPath="passy.svg" 332 + sourceHref="https://gitlab.com/PASSYpw/PASSY" 333 + > 334 + A beautiful password manager utilizing modern web 335 + technologies. 336 + </Project> 337 + <Project 338 + title="Waves.js" 339 + imgPath="waves.js.svg" 340 + sourceHref="https://gitlab.com/PASSYpw/Waves.js" 341 + > 342 + A JQuery plugin providing authentic Material Design 343 + ripples. 344 + </Project> 345 + <Project 346 + title="Sprummlbot" 347 + imgPath="sprummlbot.svg" 348 + sourceHref="https://gitlab.com/Scrumplex/Sprummlbot" 349 + > 350 + A lightweight TeamSpeak 3 ServerAdmin Bot, adding 351 + many missing features to TeamSpeak 3 servers. 352 + </Project> 353 + <Project 354 + title="ExitNow" 355 + imgPath="exitnow.png" 356 + sourceHref="https://codeberg.org/Scrumplex/ExitNow" 357 + > 358 + A simple application, providing an easy method to 359 + kill foreground windows with a shortcut. 360 + </Project> 361 + </div> 362 + </div> 363 + <div className="sheet wavy" id="contact" hidden={!mainOffset}> 364 + <h2 className="font-display text-4xl">Contact</h2> 365 + <div className="grid grid-cols-1 md:grid-cols-2"> 366 + <ContactTile 367 + title="Email" 368 + iconName="mail" 369 + href="mailto:contact@scrumplex.net" 370 + buttonText="Write an email" 371 + > 372 + Send me an email at <b>contact@scrumplex.net</b> for 373 + questions or help. PGP:{" "} 374 + <a 375 + href="https://keys.openpgp.org/search?q=contact%40scrumplex.net" 376 + target="_blank" 377 + rel="noopener" 378 + > 379 + <code>E13DFD4B47127951</code> 380 + </a> 381 + </ContactTile> 382 + <ContactTile 383 + title="Matrix" 384 + iconName="matrix" 385 + href="https://matrix.to/#/@scrumplex:duckhub.io" 386 + buttonText="Message me on Matrix" 387 + > 388 + Contact me on Matrix via{" "} 389 + <b>@scrumplex:duckhub.io</b> and have a conversation 390 + with me. 391 + </ContactTile> 392 + <ContactTile 393 + title="Telegram" 394 + iconName="telegram" 395 + href="https://telegram.me/Scrumplex" 396 + buttonText="Message me on Telegram" 397 + > 398 + Contact me on Telegram at <b>@Scrumplex</b> and have 399 + a conversation with me. 400 + </ContactTile> 401 + </div> 402 + </div> 403 + <div className="sheet wavy" id="privacy" hidden={!mainOffset}> 404 + <h2 className="font-display text-4xl">Privacy Policy</h2> 405 + <p> 406 + Privacy information for services hosted on{" "} 407 + <code>scrumplex.net</code>, <code>sefa.cloud</code> and{" "} 408 + <code>duckhub.io</code> (and all subdomains) 409 + </p> 410 + <p> 411 + Every service collects log-data. This includes IP 412 + addresses, browser user-agents and visited sites. These 413 + are not used to track the user, but are only collected 414 + for operation purposes. 415 + <br /> 416 + Some services may require you to enter some kind of 417 + username or email-address to access them These services 418 + can not operate without this information. You may choose 419 + to use anonymous or pseudonymous usernames or email 420 + addresses. All personal data (such as, but not limited 421 + to names, addresses or telephone numbers) shall always 422 + be in line with the General Data Protection Regulation. 423 + <br /> 424 + No data is ever processed to track user activity. 425 + </p> 426 + </div> 427 + </div> 428 + <div className="scroll-indicator"> 429 + <h1 className="text-center">▾</h1> 430 + </div> 431 + </> 432 + ); 433 + };
+20
src/Avatar.tsx
··· 1 + import { useState } from "preact/hooks"; 2 + 3 + export const Avatar = () => { 4 + const [rotate, setRotate] = useState(0); 5 + 6 + return ( 7 + <> 8 + <img 9 + src="scrumplex.svg" 10 + className="scrumplex-logo" 11 + alt="Scrumplex Logo" 12 + title="Scrumplex" 13 + height={200} 14 + width={200} 15 + style={{ transform: `rotate(${rotate}deg)` }} 16 + onDblClick={() => setRotate(Math.floor(Math.random() * 360))} 17 + /> 18 + </> 19 + ); 20 + };
+17
src/ConsoleSpinner.tsx
··· 1 + import { useEffect, useState } from "preact/hooks"; 2 + 3 + export const ConsoleSpinner = () => { 4 + const chars = "|/-\\"; 5 + 6 + const [current, setCurrent] = useState(0); 7 + 8 + useEffect(() => { 9 + const i = setInterval( 10 + () => setCurrent((current + 1) % chars.length), 11 + 250, 12 + ); 13 + return () => clearInterval(i); 14 + }, [current, setCurrent]); 15 + 16 + return <span className="text-spinner">{chars[current]}</span>; 17 + };
+43
src/Footer.tsx
··· 1 + export const Footer = () => { 2 + const footerLinks = [ 3 + { 4 + href: "#projects", 5 + text: "Projects", 6 + }, 7 + { 8 + href: "#contact", 9 + text: "Contact", 10 + }, 11 + { 12 + href: "#privacy", 13 + text: "Privacy Policy", 14 + }, 15 + { 16 + href: "https://stats.uptimerobot.com/83xx6s98Y", 17 + text: "Status", 18 + external: true, 19 + }, 20 + ]; 21 + 22 + return ( 23 + <> 24 + {footerLinks.map((link, index) => ( 25 + <> 26 + {index > 0 && " · "} 27 + <a 28 + href={link.href} 29 + target={link.external ? "_blank" : undefined} 30 + rel={link.external ? "noopener" : undefined} 31 + > 32 + {link.external && ( 33 + <> 34 + <i className="icon-new_tab"></i>{" "} 35 + </> 36 + )} 37 + {link.text} 38 + </a> 39 + </> 40 + ))} 41 + </> 42 + ); 43 + };
+10
src/main.tsx
··· 1 + import { hydrate, prerender as ssr } from "preact-iso"; 2 + import { App } from "./App.tsx"; 3 + 4 + if (typeof window !== "undefined") { 5 + hydrate(<App />, document.getElementById("app")!); 6 + } 7 + 8 + export async function prerender(data) { 9 + return await ssr(<App {...data} />); 10 + }
+33
tsconfig.app.json
··· 1 + { 2 + "compilerOptions": { 3 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 + "target": "ES2023", 5 + "useDefineForClassFields": true, 6 + "module": "ESNext", 7 + "lib": ["ES2023", "DOM", "DOM.Iterable"], 8 + "types": ["vite/client"], 9 + "skipLibCheck": true, 10 + "paths": { 11 + "react": ["./node_modules/preact/compat/"], 12 + "react-dom": ["./node_modules/preact/compat/"] 13 + }, 14 + 15 + /* Bundler mode */ 16 + "moduleResolution": "bundler", 17 + "allowImportingTsExtensions": true, 18 + "verbatimModuleSyntax": true, 19 + "moduleDetection": "force", 20 + "noEmit": true, 21 + "jsx": "react-jsx", 22 + "jsxImportSource": "preact", 23 + 24 + /* Linting */ 25 + "strict": true, 26 + "noUnusedLocals": true, 27 + "noUnusedParameters": true, 28 + "erasableSyntaxOnly": true, 29 + "noFallthroughCasesInSwitch": true, 30 + "noUncheckedSideEffectImports": true 31 + }, 32 + "include": ["src"] 33 + }
+7
tsconfig.json
··· 1 + { 2 + "files": [], 3 + "references": [ 4 + { "path": "./tsconfig.app.json" }, 5 + { "path": "./tsconfig.node.json" } 6 + ] 7 + }
+26
tsconfig.node.json
··· 1 + { 2 + "compilerOptions": { 3 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 + "target": "ES2023", 5 + "lib": ["ES2023"], 6 + "module": "ESNext", 7 + "types": ["node"], 8 + "skipLibCheck": true, 9 + 10 + /* Bundler mode */ 11 + "moduleResolution": "bundler", 12 + "allowImportingTsExtensions": true, 13 + "verbatimModuleSyntax": true, 14 + "moduleDetection": "force", 15 + "noEmit": true, 16 + 17 + /* Linting */ 18 + "strict": true, 19 + "noUnusedLocals": true, 20 + "noUnusedParameters": true, 21 + "erasableSyntaxOnly": true, 22 + "noFallthroughCasesInSwitch": true, 23 + "noUncheckedSideEffectImports": true 24 + }, 25 + "include": ["vite.config.ts"] 26 + }
+13 -5
vite.config.ts
··· 1 1 import { defineConfig } from "vite"; 2 - import pugPlugin from "vite-plugin-pug"; 3 2 import { imagetools } from "vite-imagetools"; 4 3 import { ViteImageOptimizer } from "vite-plugin-image-optimizer"; 5 - 6 - const options = { pretty: true }; 7 - const locals = { name: "My Pug" }; 4 + import tailwindcss from "@tailwindcss/vite"; 5 + import preact from "@preact/preset-vite"; 8 6 9 7 export default defineConfig({ 10 - plugins: [pugPlugin(options, locals), imagetools(), ViteImageOptimizer()], 8 + plugins: [ 9 + preact({ 10 + prerender: { 11 + enabled: true, 12 + renderTarget: "#app", 13 + }, 14 + }), 15 + imagetools(), 16 + ViteImageOptimizer(), 17 + tailwindcss(), 18 + ], 11 19 });