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 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 6 7 <title>Scrumplex &middot; A passionate developer</title> 8 <link rel="stylesheet" href="scss/application.scss" /> 9 10 <meta ··· 69 content="Hello there, my name is Sefa. Learn more on my website" 70 /> 71 <meta name="page-topic" content="Scrumplex" /> 72 - <script type="module" src="js/application.js"></script> 73 </head> 74 - <pug src="index.pug" /> 75 </html>
··· 5 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 6 7 <title>Scrumplex &middot; A passionate developer</title> 8 + <link rel="stylesheet" href="global.css" /> 9 <link rel="stylesheet" href="scss/application.scss" /> 10 11 <meta ··· 70 content="Hello there, my name is Sefa. Learn more on my website" 71 /> 72 <meta name="page-topic" content="Scrumplex" /> 73 </head> 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> 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 "devDependencies": { 17 "@eslint/css": "^0.14.1", 18 "@eslint/js": "^10.0.1", 19 - "@types/pug": "^2.0.10", 20 "eslint": "10.0.3", 21 "fantasticon": "3.0.0", 22 "globals": "^17.4.0", 23 "jiti": "^2.6.1", 24 "prettier": "3.8.1", 25 "sass": "^1.97.3", 26 "sharp": "0.34.5", 27 "svgo": "^4.0.1", 28 "typescript-eslint": "^8.56.1", 29 "vite": "8.0.0-beta.16", 30 "vite-imagetools": "^10.0.0", 31 - "vite-plugin-image-optimizer": "^2.0.3", 32 - "vite-plugin-pug": "^0.4.1" 33 }, 34 "author": { 35 "name": "Sefa Eyeoglu",
··· 16 "devDependencies": { 17 "@eslint/css": "^0.14.1", 18 "@eslint/js": "^10.0.1", 19 + "@preact/preset-vite": "^2.10.3", 20 + "@tailwindcss/vite": "^4.2.1", 21 "eslint": "10.0.3", 22 "fantasticon": "3.0.0", 23 "globals": "^17.4.0", 24 "jiti": "^2.6.1", 25 + "preact": "^10.28.4", 26 + "preact-iso": "^2.11.1", 27 "prettier": "3.8.1", 28 "sass": "^1.97.3", 29 "sharp": "0.34.5", 30 "svgo": "^4.0.1", 31 + "tailwindcss": "^4.2.1", 32 + "typescript": "^5.9.3", 33 "typescript-eslint": "^8.56.1", 34 "vite": "8.0.0-beta.16", 35 "vite-imagetools": "^10.0.0", 36 + "vite-plugin-image-optimizer": "^2.0.3" 37 }, 38 "author": { 39 "name": "Sefa Eyeoglu",
+709 -359
pnpm-lock.yaml
··· 21 '@eslint/js': 22 specifier: ^10.0.1 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 27 eslint: 28 specifier: 10.0.3 29 version: 10.0.3(jiti@2.6.1) ··· 36 jiti: 37 specifier: ^2.6.1 38 version: 2.6.1 39 prettier: 40 specifier: 3.8.1 41 version: 3.8.1 ··· 48 svgo: 49 specifier: ^4.0.1 50 version: 4.0.1 51 typescript-eslint: 52 specifier: ^8.56.1 53 version: 8.56.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) ··· 60 vite-plugin-image-optimizer: 61 specifier: ^2.0.3 62 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 67 packages: 68 69 '@babel/helper-string-parser@7.27.1': 70 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 71 engines: {node: '>=6.9.0'} ··· 74 resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 75 engines: {node: '>=6.9.0'} 76 77 '@babel/parser@7.29.0': 78 resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} 79 engines: {node: '>=6.0.0'} 80 hasBin: true 81 82 '@babel/types@7.29.0': 83 resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} ··· 202 resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} 203 cpu: [arm64] 204 os: [linux] 205 206 '@img/sharp-libvips-linux-arm@1.2.4': 207 resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} 208 cpu: [arm] 209 os: [linux] 210 211 '@img/sharp-libvips-linux-ppc64@1.2.4': 212 resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} 213 cpu: [ppc64] 214 os: [linux] 215 216 '@img/sharp-libvips-linux-riscv64@1.2.4': 217 resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} 218 cpu: [riscv64] 219 os: [linux] 220 221 '@img/sharp-libvips-linux-s390x@1.2.4': 222 resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} 223 cpu: [s390x] 224 os: [linux] 225 226 '@img/sharp-libvips-linux-x64@1.2.4': 227 resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} 228 cpu: [x64] 229 os: [linux] 230 231 '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 232 resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} 233 cpu: [arm64] 234 os: [linux] 235 236 '@img/sharp-libvips-linuxmusl-x64@1.2.4': 237 resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} 238 cpu: [x64] 239 os: [linux] 240 241 '@img/sharp-linux-arm64@0.34.5': 242 resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} 243 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 244 cpu: [arm64] 245 os: [linux] 246 247 '@img/sharp-linux-arm@0.34.5': 248 resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} 249 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 250 cpu: [arm] 251 os: [linux] 252 253 '@img/sharp-linux-ppc64@0.34.5': 254 resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} 255 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 256 cpu: [ppc64] 257 os: [linux] 258 259 '@img/sharp-linux-riscv64@0.34.5': 260 resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} 261 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 262 cpu: [riscv64] 263 os: [linux] 264 265 '@img/sharp-linux-s390x@0.34.5': 266 resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} 267 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 268 cpu: [s390x] 269 os: [linux] 270 271 '@img/sharp-linux-x64@0.34.5': 272 resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} 273 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 274 cpu: [x64] 275 os: [linux] 276 277 '@img/sharp-linuxmusl-arm64@0.34.5': 278 resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} 279 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 280 cpu: [arm64] 281 os: [linux] 282 283 '@img/sharp-linuxmusl-x64@0.34.5': 284 resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} 285 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 286 cpu: [x64] 287 os: [linux] 288 289 '@img/sharp-wasm32@0.34.5': 290 resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} ··· 313 resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 314 engines: {node: '>=12'} 315 316 '@napi-rs/wasm-runtime@1.1.1': 317 resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} 318 ··· 361 engines: {node: '>= 10.0.0'} 362 cpu: [arm] 363 os: [linux] 364 365 '@parcel/watcher-linux-arm-musl@2.5.6': 366 resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} 367 engines: {node: '>= 10.0.0'} 368 cpu: [arm] 369 os: [linux] 370 371 '@parcel/watcher-linux-arm64-glibc@2.5.6': 372 resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} 373 engines: {node: '>= 10.0.0'} 374 cpu: [arm64] 375 os: [linux] 376 377 '@parcel/watcher-linux-arm64-musl@2.5.6': 378 resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} 379 engines: {node: '>= 10.0.0'} 380 cpu: [arm64] 381 os: [linux] 382 383 '@parcel/watcher-linux-x64-glibc@2.5.6': 384 resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} 385 engines: {node: '>= 10.0.0'} 386 cpu: [x64] 387 os: [linux] 388 389 '@parcel/watcher-linux-x64-musl@2.5.6': 390 resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} 391 engines: {node: '>= 10.0.0'} 392 cpu: [x64] 393 os: [linux] 394 395 '@parcel/watcher-win32-arm64@2.5.6': 396 resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} ··· 418 resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 419 engines: {node: '>=14'} 420 421 '@rolldown/binding-android-arm64@1.0.0-rc.6': 422 resolution: {integrity: sha512-kvjTSWGcrv+BaR2vge57rsKiYdVR8V8CoS0vgKrc570qRBfty4bT+1X0z3j2TaVV+kAYzA0PjeB9+mdZyqUZlg==} 423 engines: {node: ^20.19.0 || >=22.12.0} ··· 453 engines: {node: ^20.19.0 || >=22.12.0} 454 cpu: [arm64] 455 os: [linux] 456 457 '@rolldown/binding-linux-arm64-musl@1.0.0-rc.6': 458 resolution: {integrity: sha512-elPpdevtCdUOqziemR86C4CSCr/5sUxalzDrf/CJdMT+kZt2C556as++qHikNOz0vuFf52h+GJNXZM08eWgGPQ==} 459 engines: {node: ^20.19.0 || >=22.12.0} 460 cpu: [arm64] 461 os: [linux] 462 463 '@rolldown/binding-linux-x64-gnu@1.0.0-rc.6': 464 resolution: {integrity: sha512-IBwXsf56o3xhzAyaZxdM1CX8UFiBEUFCjiVUgny67Q8vPIqkjzJj0YKhd3TbBHanuxThgBa59f6Pgutg2OGk5A==} 465 engines: {node: ^20.19.0 || >=22.12.0} 466 cpu: [x64] 467 os: [linux] 468 469 '@rolldown/binding-linux-x64-musl@1.0.0-rc.6': 470 resolution: {integrity: sha512-vOk7G8V9Zm+8a6PL6JTpCea61q491oYlGtO6CvnsbhNLlKdf0bbCPytFzGQhYmCKZDKkEbmnkcIprTEGCURnwg==} 471 engines: {node: ^20.19.0 || >=22.12.0} 472 cpu: [x64] 473 os: [linux] 474 475 '@rolldown/binding-openharmony-arm64@1.0.0-rc.6': 476 resolution: {integrity: sha512-ASjEDI4MRv7XCQb2JVaBzfEYO98JKCGrAgoW6M03fJzH/ilCnC43Mb3ptB9q/lzsaahoJyIBoAGKAYEjUvpyvQ==} ··· 498 '@rolldown/pluginutils@1.0.0-rc.6': 499 resolution: {integrity: sha512-Y0+JT8Mi1mmW08K6HieG315XNRu4L0rkfCpA364HtytjgiqYnMYRdFPcxRl+BQQqNXzecL2S9nii+RUpO93XIA==} 500 501 '@rollup/pluginutils@5.3.0': 502 resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} 503 engines: {node: '>=14.0.0'} ··· 507 rollup: 508 optional: true 509 510 '@tootallnate/once@2.0.0': 511 resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} 512 engines: {node: '>= 10'} ··· 522 523 '@types/json-schema@7.0.15': 524 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 525 - 526 - '@types/pug@2.0.10': 527 - resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} 528 529 '@typescript-eslint/eslint-plugin@8.56.1': 530 resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} ··· 598 peerDependencies: 599 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 600 601 - acorn@7.4.1: 602 - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 603 - engines: {node: '>=0.4.0'} 604 - hasBin: true 605 - 606 acorn@8.16.0: 607 resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} 608 engines: {node: '>=0.4.0'} ··· 654 argparse@2.0.1: 655 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 656 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'} 666 667 balanced-match@1.0.2: 668 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} ··· 671 resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} 672 engines: {node: 18 || 20 || >=22} 673 674 bindings@1.5.0: 675 resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 676 ··· 686 brace-expansion@5.0.4: 687 resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} 688 engines: {node: 18 || 20 || >=22} 689 690 bufferstreams@3.0.0: 691 resolution: {integrity: sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA==} ··· 695 resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} 696 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 697 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'} 705 706 case@1.6.3: 707 resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} 708 engines: {node: '>= 0.8.0'} 709 - 710 - character-parser@2.2.0: 711 - resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} 712 713 chokidar@4.0.3: 714 resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} ··· 755 console-control-strings@1.1.0: 756 resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} 757 758 - constantinople@4.0.1: 759 - resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} 760 761 cross-spawn@7.0.6: 762 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} ··· 807 resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 808 engines: {node: '>=8'} 809 810 - doctypes@1.1.0: 811 - resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} 812 - 813 dom-serializer@2.0.0: 814 resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 815 ··· 823 domutils@3.2.2: 824 resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 825 826 - dunder-proto@1.0.1: 827 - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 828 - engines: {node: '>= 0.4'} 829 - 830 eastasianwidth@0.2.0: 831 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 832 833 emoji-regex@8.0.0: 834 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 835 ··· 839 encoding@0.1.13: 840 resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} 841 842 entities@4.5.0: 843 resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 844 engines: {node: '>=0.12'} ··· 850 err-code@2.0.3: 851 resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 852 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 es5-ext@0.10.64: 866 resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} 867 engines: {node: '>=0.10'} ··· 875 876 es6-weak-map@2.0.3: 877 resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} 878 879 escape-string-regexp@4.0.0: 880 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} ··· 995 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 996 os: [darwin] 997 998 - function-bind@1.1.2: 999 - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1000 - 1001 gauge@4.0.4: 1002 resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} 1003 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1004 deprecated: This package is no longer supported. 1005 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'} 1013 1014 glob-parent@6.0.2: 1015 resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} ··· 1033 resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} 1034 engines: {node: '>=18'} 1035 1036 - gopd@1.2.0: 1037 - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 1038 - engines: {node: '>= 0.4'} 1039 - 1040 graceful-fs@4.2.11: 1041 resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1042 ··· 1045 engines: {node: '>=0.4.7'} 1046 hasBin: true 1047 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 has-unicode@2.0.1: 1057 resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} 1058 1059 - hasown@2.0.2: 1060 - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1061 - engines: {node: '>= 0.4'} 1062 1063 http-cache-semantics@4.2.0: 1064 resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} ··· 1115 resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} 1116 engines: {node: '>= 12'} 1117 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 is-extglob@2.1.1: 1126 resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1127 engines: {node: '>=0.10.0'} ··· 1140 is-promise@2.2.2: 1141 resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} 1142 1143 - is-regex@1.2.1: 1144 - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1145 - engines: {node: '>= 0.4'} 1146 - 1147 isexe@2.0.0: 1148 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1149 ··· 1154 resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 1155 hasBin: true 1156 1157 - js-stringify@1.0.2: 1158 - resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} 1159 1160 json-buffer@3.0.1: 1161 resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} ··· 1166 json-stable-stringify-without-jsonify@1.0.1: 1167 resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1168 1169 - jstransformer@1.0.0: 1170 - resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} 1171 1172 keyv@4.5.4: 1173 resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1174 1175 levn@0.4.1: 1176 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} ··· 1211 engines: {node: '>= 12.0.0'} 1212 cpu: [arm64] 1213 os: [linux] 1214 1215 lightningcss-linux-arm64-musl@1.31.1: 1216 resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} 1217 engines: {node: '>= 12.0.0'} 1218 cpu: [arm64] 1219 os: [linux] 1220 1221 lightningcss-linux-x64-gnu@1.31.1: 1222 resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} 1223 engines: {node: '>= 12.0.0'} 1224 cpu: [x64] 1225 os: [linux] 1226 1227 lightningcss-linux-x64-musl@1.31.1: 1228 resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} 1229 engines: {node: '>= 12.0.0'} 1230 cpu: [x64] 1231 os: [linux] 1232 1233 lightningcss-win32-arm64-msvc@1.31.1: 1234 resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} ··· 1256 lru-cache@10.4.3: 1257 resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1258 1259 lru-cache@7.18.3: 1260 resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} 1261 engines: {node: '>=12'} ··· 1263 lru-queue@0.1.0: 1264 resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} 1265 1266 make-fetch-happen@10.2.1: 1267 resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} 1268 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 1274 mdn-data@2.0.28: 1275 resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} ··· 1378 engines: {node: ^12.13 || ^14.13 || >=16} 1379 hasBin: true 1380 1381 nopt@6.0.0: 1382 resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} 1383 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} ··· 1390 1391 nth-check@2.1.1: 1392 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 1398 once@1.4.0: 1399 resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} ··· 1431 path-key@3.1.1: 1432 resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1433 engines: {node: '>=8'} 1434 - 1435 - path-parse@1.0.7: 1436 - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1437 1438 path-scurry@1.11.1: 1439 resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} ··· 1445 picocolors@1.1.1: 1446 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1447 1448 picomatch@4.0.3: 1449 resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1450 engines: {node: '>=12'} ··· 1453 resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} 1454 engines: {node: ^10 || ^12 || >=14} 1455 1456 prelude-ls@1.2.1: 1457 resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1458 engines: {node: '>= 0.8.0'} ··· 1474 resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} 1475 engines: {node: '>=10'} 1476 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 punycode@2.3.1: 1517 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1518 engines: {node: '>=6'} ··· 1525 resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1526 engines: {node: '>= 14.18.0'} 1527 1528 - resolve@1.22.11: 1529 - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} 1530 - engines: {node: '>= 0.4'} 1531 - hasBin: true 1532 - 1533 retry@0.12.0: 1534 resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 1535 engines: {node: '>= 4'} ··· 1558 sax@1.5.0: 1559 resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==} 1560 engines: {node: '>=11.0.0'} 1561 1562 semver@7.7.4: 1563 resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} ··· 1586 resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1587 engines: {node: '>=14'} 1588 1589 slugify@1.6.6: 1590 resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} 1591 engines: {node: '>=8.0.0'} ··· 1610 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1611 engines: {node: '>=0.10.0'} 1612 1613 ssri@9.0.1: 1614 resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} 1615 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1616 1617 string-width@4.2.3: 1618 resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1619 engines: {node: '>=8'} ··· 1633 resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} 1634 engines: {node: '>=12'} 1635 1636 - supports-preserve-symlinks-flag@1.0.0: 1637 - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1638 - engines: {node: '>= 0.4'} 1639 - 1640 svg-pathdata@6.0.3: 1641 resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} 1642 engines: {node: '>=12.0.0'} ··· 1658 svgpath@2.6.0: 1659 resolution: {integrity: sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==} 1660 1661 tar@6.2.1: 1662 resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} 1663 engines: {node: '>=10'} ··· 1670 tinyglobby@0.2.15: 1671 resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1672 engines: {node: '>=12.0.0'} 1673 - 1674 - token-stream@1.0.0: 1675 - resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} 1676 1677 ts-api-utils@2.4.0: 1678 resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} ··· 1728 resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} 1729 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1730 1731 uri-js@4.4.1: 1732 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1733 ··· 1753 svgo: 1754 optional: true 1755 1756 - vite-plugin-pug@0.4.1: 1757 - resolution: {integrity: sha512-2M4qNpIgUV+zA63w566jyp3LpaIuSBMfghOzue7PYnFTms48Ux78Bp/ccRSaGRbFW9BkTxdqgi5h7xvBN7YruQ==} 1758 1759 vite@8.0.0-beta.16: 1760 resolution: {integrity: sha512-c0t7hYkxsjws89HH+BUFh/sL3BpPNhNsL9CJrTpMxBmwKQBRSa5OJ5w4o9O0bQVI/H/vx7UpUUIevvXa37NS/Q==} ··· 1798 optional: true 1799 yaml: 1800 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 1806 which@2.0.2: 1807 resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} ··· 1811 wide-align@1.1.5: 1812 resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 1813 1814 - with@7.0.2: 1815 - resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} 1816 - engines: {node: '>= 10.0.0'} 1817 - 1818 word-wrap@1.2.5: 1819 resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1820 engines: {node: '>=0.10.0'} ··· 1833 wrappy@1.0.2: 1834 resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1835 1836 yallist@4.0.0: 1837 resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1838 ··· 1842 1843 snapshots: 1844 1845 '@babel/helper-string-parser@7.27.1': {} 1846 1847 '@babel/helper-validator-identifier@7.28.5': {} 1848 1849 '@babel/parser@7.29.0': 1850 dependencies: 1851 '@babel/types': 7.29.0 1852 1853 '@babel/types@7.29.0': 1854 dependencies: ··· 2047 wrap-ansi: 8.1.0 2048 wrap-ansi-cjs: wrap-ansi@7.0.0 2049 2050 '@napi-rs/wasm-runtime@1.1.1': 2051 dependencies: 2052 '@emnapi/core': 1.8.1 ··· 2132 '@pkgjs/parseargs@0.11.0': 2133 optional: true 2134 2135 '@rolldown/binding-android-arm64@1.0.0-rc.6': 2136 optional: true 2137 ··· 2175 2176 '@rolldown/pluginutils@1.0.0-rc.6': {} 2177 2178 '@rollup/pluginutils@5.3.0': 2179 dependencies: 2180 '@types/estree': 1.0.8 2181 estree-walker: 2.0.2 2182 picomatch: 4.0.3 2183 2184 '@tootallnate/once@2.0.0': {} 2185 2186 '@tybys/wasm-util@0.10.1': ··· 2193 '@types/estree@1.0.8': {} 2194 2195 '@types/json-schema@7.0.15': {} 2196 - 2197 - '@types/pug@2.0.10': {} 2198 2199 '@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 dependencies: ··· 2295 dependencies: 2296 acorn: 8.16.0 2297 2298 - acorn@7.4.1: {} 2299 - 2300 acorn@8.16.0: {} 2301 2302 agent-base@6.0.2: ··· 2342 2343 argparse@2.0.1: {} 2344 2345 - asap@2.0.6: {} 2346 - 2347 - assert-never@1.4.0: {} 2348 - 2349 - babel-walk@3.0.0-canary-5: 2350 dependencies: 2351 - '@babel/types': 7.29.0 2352 2353 balanced-match@1.0.2: {} 2354 2355 balanced-match@4.0.4: {} 2356 2357 bindings@1.5.0: 2358 dependencies: ··· 2373 dependencies: 2374 balanced-match: 4.0.4 2375 2376 bufferstreams@3.0.0: 2377 dependencies: 2378 readable-stream: 3.6.2 ··· 2400 transitivePeerDependencies: 2401 - bluebird 2402 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 2412 2413 case@1.6.3: {} 2414 2415 - character-parser@2.2.0: 2416 - dependencies: 2417 - is-regex: 1.2.1 2418 - 2419 chokidar@4.0.3: 2420 dependencies: 2421 readdirp: 4.1.2 ··· 2450 2451 console-control-strings@1.1.0: {} 2452 2453 - constantinople@4.0.1: 2454 - dependencies: 2455 - '@babel/parser': 7.29.0 2456 - '@babel/types': 7.29.0 2457 2458 cross-spawn@7.0.6: 2459 dependencies: ··· 2502 2503 detect-libc@2.1.2: {} 2504 2505 - doctypes@1.1.0: {} 2506 - 2507 dom-serializer@2.0.0: 2508 dependencies: 2509 domelementtype: 2.3.0 ··· 2522 domelementtype: 2.3.0 2523 domhandler: 5.0.3 2524 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 2530 2531 - eastasianwidth@0.2.0: {} 2532 2533 emoji-regex@8.0.0: {} 2534 ··· 2539 iconv-lite: 0.6.3 2540 optional: true 2541 2542 entities@4.5.0: {} 2543 2544 env-paths@2.2.1: {} 2545 2546 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 2556 es5-ext@0.10.64: 2557 dependencies: ··· 2577 es5-ext: 0.10.64 2578 es6-iterator: 2.0.3 2579 es6-symbol: 3.1.4 2580 2581 escape-string-regexp@4.0.0: {} 2582 ··· 2725 fsevents@2.3.3: 2726 optional: true 2727 2728 - function-bind@1.1.2: {} 2729 - 2730 gauge@4.0.4: 2731 dependencies: 2732 aproba: 2.1.0 ··· 2738 strip-ansi: 6.0.1 2739 wide-align: 1.1.5 2740 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 2758 2759 glob-parent@6.0.2: 2760 dependencies: ··· 2788 2789 globals@17.4.0: {} 2790 2791 - gopd@1.2.0: {} 2792 - 2793 graceful-fs@4.2.11: {} 2794 2795 handlebars@4.7.8: ··· 2801 optionalDependencies: 2802 uglify-js: 3.19.3 2803 2804 - has-symbols@1.1.0: {} 2805 - 2806 - has-tostringtag@1.0.2: 2807 - dependencies: 2808 - has-symbols: 1.1.0 2809 - 2810 has-unicode@2.0.1: {} 2811 2812 - hasown@2.0.2: 2813 - dependencies: 2814 - function-bind: 1.1.2 2815 2816 http-cache-semantics@4.2.0: {} 2817 ··· 2862 2863 ip-address@10.1.0: {} 2864 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 is-extglob@2.1.1: {} 2875 2876 is-fullwidth-code-point@3.0.0: {} ··· 2883 2884 is-promise@2.2.2: {} 2885 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 isexe@2.0.0: {} 2894 2895 jackspeak@3.4.3: ··· 2900 2901 jiti@2.6.1: {} 2902 2903 - js-stringify@1.0.2: {} 2904 2905 json-buffer@3.0.1: {} 2906 ··· 2908 2909 json-stable-stringify-without-jsonify@1.0.1: {} 2910 2911 - jstransformer@1.0.0: 2912 - dependencies: 2913 - is-promise: 2.2.2 2914 - promise: 7.3.1 2915 2916 keyv@4.5.4: 2917 dependencies: 2918 json-buffer: 3.0.1 2919 2920 levn@0.4.1: 2921 dependencies: ··· 2979 2980 lru-cache@10.4.3: {} 2981 2982 lru-cache@7.18.3: {} 2983 2984 lru-queue@0.1.0: 2985 dependencies: 2986 es5-ext: 0.10.64 2987 2988 make-fetch-happen@10.2.1: 2989 dependencies: ··· 3007 - bluebird 3008 - supports-color 3009 3010 - math-intrinsics@1.1.0: {} 3011 - 3012 mdn-data@2.0.28: {} 3013 3014 mdn-data@2.23.0: {} ··· 3119 - bluebird 3120 - supports-color 3121 3122 nopt@6.0.0: 3123 dependencies: 3124 abbrev: 1.1.1 ··· 3134 dependencies: 3135 boolbase: 1.0.0 3136 3137 - object-assign@4.1.1: {} 3138 - 3139 once@1.4.0: 3140 dependencies: 3141 wrappy: 1.0.2 ··· 3171 3172 path-key@3.1.1: {} 3173 3174 - path-parse@1.0.7: {} 3175 - 3176 path-scurry@1.11.1: 3177 dependencies: 3178 lru-cache: 10.4.3 ··· 3182 3183 picocolors@1.1.1: {} 3184 3185 picomatch@4.0.3: {} 3186 3187 postcss@8.5.8: ··· 3190 picocolors: 1.1.1 3191 source-map-js: 1.2.1 3192 3193 prelude-ls@1.2.1: {} 3194 3195 prettier@3.8.1: {} ··· 3201 err-code: 2.0.3 3202 retry: 0.12.0 3203 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 punycode@2.3.1: {} 3276 3277 readable-stream@3.6.2: ··· 3282 3283 readdirp@4.1.2: {} 3284 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 retry@0.12.0: {} 3292 3293 rimraf@3.0.2: ··· 3327 '@parcel/watcher': 2.5.6 3328 3329 sax@1.5.0: {} 3330 3331 semver@7.7.4: {} 3332 ··· 3373 3374 signal-exit@4.1.0: {} 3375 3376 slugify@1.6.6: {} 3377 3378 smart-buffer@4.2.0: {} ··· 3394 3395 source-map@0.6.1: {} 3396 3397 ssri@9.0.1: 3398 dependencies: 3399 minipass: 3.3.6 3400 3401 string-width@4.2.3: 3402 dependencies: 3403 emoji-regex: 8.0.0 ··· 3421 strip-ansi@7.2.0: 3422 dependencies: 3423 ansi-regex: 6.2.2 3424 - 3425 - supports-preserve-symlinks-flag@1.0.0: {} 3426 3427 svg-pathdata@6.0.3: {} 3428 ··· 3454 3455 svgpath@2.6.0: {} 3456 3457 tar@6.2.1: 3458 dependencies: 3459 chownr: 2.0.0 ··· 3472 dependencies: 3473 fdir: 6.5.0(picomatch@4.0.3) 3474 picomatch: 4.0.3 3475 - 3476 - token-stream@1.0.0: {} 3477 3478 ts-api-utils@2.4.0(typescript@5.9.3): 3479 dependencies: ··· 3531 dependencies: 3532 imurmurhash: 0.1.4 3533 3534 uri-js@4.4.1: 3535 dependencies: 3536 punycode: 2.3.1 ··· 3555 sharp: 0.34.5 3556 svgo: 4.0.1 3557 3558 - vite-plugin-pug@0.4.1: 3559 dependencies: 3560 - picocolors: 1.1.1 3561 - pug: 3.0.3 3562 3563 vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3): 3564 dependencies: ··· 3573 jiti: 2.6.1 3574 sass: 1.97.3 3575 3576 - void-elements@3.1.0: {} 3577 - 3578 which@2.0.2: 3579 dependencies: 3580 isexe: 2.0.0 ··· 3583 dependencies: 3584 string-width: 4.2.3 3585 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 word-wrap@1.2.5: {} 3594 3595 wordwrap@1.0.0: {} ··· 3607 strip-ansi: 7.2.0 3608 3609 wrappy@1.0.2: {} 3610 3611 yallist@4.0.0: {} 3612
··· 21 '@eslint/js': 22 specifier: ^10.0.1 23 version: 10.0.1(eslint@10.0.3(jiti@2.6.1)) 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)) 30 eslint: 31 specifier: 10.0.3 32 version: 10.0.3(jiti@2.6.1) ··· 39 jiti: 40 specifier: ^2.6.1 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) 48 prettier: 49 specifier: 3.8.1 50 version: 3.8.1 ··· 57 svgo: 58 specifier: ^4.0.1 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 66 typescript-eslint: 67 specifier: ^8.56.1 68 version: 8.56.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) ··· 75 vite-plugin-image-optimizer: 76 specifier: ^2.0.3 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)) 78 79 packages: 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 + 123 '@babel/helper-string-parser@7.27.1': 124 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 125 engines: {node: '>=6.9.0'} ··· 128 resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 129 engines: {node: '>=6.9.0'} 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 + 139 '@babel/parser@7.29.0': 140 resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} 141 engines: {node: '>=6.0.0'} 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'} 169 170 '@babel/types@7.29.0': 171 resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} ··· 290 resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} 291 cpu: [arm64] 292 os: [linux] 293 + libc: [glibc] 294 295 '@img/sharp-libvips-linux-arm@1.2.4': 296 resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} 297 cpu: [arm] 298 os: [linux] 299 + libc: [glibc] 300 301 '@img/sharp-libvips-linux-ppc64@1.2.4': 302 resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} 303 cpu: [ppc64] 304 os: [linux] 305 + libc: [glibc] 306 307 '@img/sharp-libvips-linux-riscv64@1.2.4': 308 resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} 309 cpu: [riscv64] 310 os: [linux] 311 + libc: [glibc] 312 313 '@img/sharp-libvips-linux-s390x@1.2.4': 314 resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} 315 cpu: [s390x] 316 os: [linux] 317 + libc: [glibc] 318 319 '@img/sharp-libvips-linux-x64@1.2.4': 320 resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} 321 cpu: [x64] 322 os: [linux] 323 + libc: [glibc] 324 325 '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 326 resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} 327 cpu: [arm64] 328 os: [linux] 329 + libc: [musl] 330 331 '@img/sharp-libvips-linuxmusl-x64@1.2.4': 332 resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} 333 cpu: [x64] 334 os: [linux] 335 + libc: [musl] 336 337 '@img/sharp-linux-arm64@0.34.5': 338 resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} 339 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 340 cpu: [arm64] 341 os: [linux] 342 + libc: [glibc] 343 344 '@img/sharp-linux-arm@0.34.5': 345 resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} 346 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 347 cpu: [arm] 348 os: [linux] 349 + libc: [glibc] 350 351 '@img/sharp-linux-ppc64@0.34.5': 352 resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} 353 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 354 cpu: [ppc64] 355 os: [linux] 356 + libc: [glibc] 357 358 '@img/sharp-linux-riscv64@0.34.5': 359 resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} 360 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 361 cpu: [riscv64] 362 os: [linux] 363 + libc: [glibc] 364 365 '@img/sharp-linux-s390x@0.34.5': 366 resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} 367 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 368 cpu: [s390x] 369 os: [linux] 370 + libc: [glibc] 371 372 '@img/sharp-linux-x64@0.34.5': 373 resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} 374 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 375 cpu: [x64] 376 os: [linux] 377 + libc: [glibc] 378 379 '@img/sharp-linuxmusl-arm64@0.34.5': 380 resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} 381 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 382 cpu: [arm64] 383 os: [linux] 384 + libc: [musl] 385 386 '@img/sharp-linuxmusl-x64@0.34.5': 387 resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} 388 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 389 cpu: [x64] 390 os: [linux] 391 + libc: [musl] 392 393 '@img/sharp-wasm32@0.34.5': 394 resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} ··· 417 resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 418 engines: {node: '>=12'} 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 + 436 '@napi-rs/wasm-runtime@1.1.1': 437 resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} 438 ··· 481 engines: {node: '>= 10.0.0'} 482 cpu: [arm] 483 os: [linux] 484 + libc: [glibc] 485 486 '@parcel/watcher-linux-arm-musl@2.5.6': 487 resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} 488 engines: {node: '>= 10.0.0'} 489 cpu: [arm] 490 os: [linux] 491 + libc: [musl] 492 493 '@parcel/watcher-linux-arm64-glibc@2.5.6': 494 resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} 495 engines: {node: '>= 10.0.0'} 496 cpu: [arm64] 497 os: [linux] 498 + libc: [glibc] 499 500 '@parcel/watcher-linux-arm64-musl@2.5.6': 501 resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} 502 engines: {node: '>= 10.0.0'} 503 cpu: [arm64] 504 os: [linux] 505 + libc: [musl] 506 507 '@parcel/watcher-linux-x64-glibc@2.5.6': 508 resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} 509 engines: {node: '>= 10.0.0'} 510 cpu: [x64] 511 os: [linux] 512 + libc: [glibc] 513 514 '@parcel/watcher-linux-x64-musl@2.5.6': 515 resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} 516 engines: {node: '>= 10.0.0'} 517 cpu: [x64] 518 os: [linux] 519 + libc: [musl] 520 521 '@parcel/watcher-win32-arm64@2.5.6': 522 resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} ··· 544 resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 545 engines: {node: '>=14'} 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 + 570 '@rolldown/binding-android-arm64@1.0.0-rc.6': 571 resolution: {integrity: sha512-kvjTSWGcrv+BaR2vge57rsKiYdVR8V8CoS0vgKrc570qRBfty4bT+1X0z3j2TaVV+kAYzA0PjeB9+mdZyqUZlg==} 572 engines: {node: ^20.19.0 || >=22.12.0} ··· 602 engines: {node: ^20.19.0 || >=22.12.0} 603 cpu: [arm64] 604 os: [linux] 605 + libc: [glibc] 606 607 '@rolldown/binding-linux-arm64-musl@1.0.0-rc.6': 608 resolution: {integrity: sha512-elPpdevtCdUOqziemR86C4CSCr/5sUxalzDrf/CJdMT+kZt2C556as++qHikNOz0vuFf52h+GJNXZM08eWgGPQ==} 609 engines: {node: ^20.19.0 || >=22.12.0} 610 cpu: [arm64] 611 os: [linux] 612 + libc: [musl] 613 614 '@rolldown/binding-linux-x64-gnu@1.0.0-rc.6': 615 resolution: {integrity: sha512-IBwXsf56o3xhzAyaZxdM1CX8UFiBEUFCjiVUgny67Q8vPIqkjzJj0YKhd3TbBHanuxThgBa59f6Pgutg2OGk5A==} 616 engines: {node: ^20.19.0 || >=22.12.0} 617 cpu: [x64] 618 os: [linux] 619 + libc: [glibc] 620 621 '@rolldown/binding-linux-x64-musl@1.0.0-rc.6': 622 resolution: {integrity: sha512-vOk7G8V9Zm+8a6PL6JTpCea61q491oYlGtO6CvnsbhNLlKdf0bbCPytFzGQhYmCKZDKkEbmnkcIprTEGCURnwg==} 623 engines: {node: ^20.19.0 || >=22.12.0} 624 cpu: [x64] 625 os: [linux] 626 + libc: [musl] 627 628 '@rolldown/binding-openharmony-arm64@1.0.0-rc.6': 629 resolution: {integrity: sha512-ASjEDI4MRv7XCQb2JVaBzfEYO98JKCGrAgoW6M03fJzH/ilCnC43Mb3ptB9q/lzsaahoJyIBoAGKAYEjUvpyvQ==} ··· 651 '@rolldown/pluginutils@1.0.0-rc.6': 652 resolution: {integrity: sha512-Y0+JT8Mi1mmW08K6HieG315XNRu4L0rkfCpA364HtytjgiqYnMYRdFPcxRl+BQQqNXzecL2S9nii+RUpO93XIA==} 653 654 + '@rollup/pluginutils@4.2.1': 655 + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} 656 + engines: {node: '>= 8.0.0'} 657 + 658 '@rollup/pluginutils@5.3.0': 659 resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} 660 engines: {node: '>=14.0.0'} ··· 664 rollup: 665 optional: true 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 + 761 '@tootallnate/once@2.0.0': 762 resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} 763 engines: {node: '>= 10'} ··· 773 774 '@types/json-schema@7.0.15': 775 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 776 777 '@typescript-eslint/eslint-plugin@8.56.1': 778 resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} ··· 846 peerDependencies: 847 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 848 849 acorn@8.16.0: 850 resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} 851 engines: {node: '>=0.4.0'} ··· 897 argparse@2.0.1: 898 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 899 900 + babel-plugin-transform-hook-names@1.0.2: 901 + resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} 902 + peerDependencies: 903 + '@babel/core': ^7.12.10 904 905 balanced-match@1.0.2: 906 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} ··· 909 resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} 910 engines: {node: 18 || 20 || >=22} 911 912 + baseline-browser-mapping@2.10.0: 913 + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} 914 + engines: {node: '>=6.0.0'} 915 + hasBin: true 916 + 917 bindings@1.5.0: 918 resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 919 ··· 929 brace-expansion@5.0.4: 930 resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} 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 937 938 bufferstreams@3.0.0: 939 resolution: {integrity: sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA==} ··· 943 resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} 944 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 945 946 + caniuse-lite@1.0.30001777: 947 + resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} 948 949 case@1.6.3: 950 resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} 951 engines: {node: '>= 0.8.0'} 952 953 chokidar@4.0.3: 954 resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} ··· 995 console-control-strings@1.1.0: 996 resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} 997 998 + convert-source-map@2.0.0: 999 + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1000 1001 cross-spawn@7.0.6: 1002 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} ··· 1047 resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 1048 engines: {node: '>=8'} 1049 1050 dom-serializer@2.0.0: 1051 resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 1052 ··· 1060 domutils@3.2.2: 1061 resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 1062 1063 eastasianwidth@0.2.0: 1064 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1065 1066 + electron-to-chromium@1.5.307: 1067 + resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} 1068 + 1069 emoji-regex@8.0.0: 1070 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1071 ··· 1075 encoding@0.1.13: 1076 resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} 1077 1078 + enhanced-resolve@5.20.0: 1079 + resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} 1080 + engines: {node: '>=10.13.0'} 1081 + 1082 entities@4.5.0: 1083 resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1084 engines: {node: '>=0.12'} ··· 1090 err-code@2.0.3: 1091 resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 1092 1093 es5-ext@0.10.64: 1094 resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} 1095 engines: {node: '>=0.10'} ··· 1103 1104 es6-weak-map@2.0.3: 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'} 1110 1111 escape-string-regexp@4.0.0: 1112 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} ··· 1227 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1228 os: [darwin] 1229 1230 gauge@4.0.4: 1231 resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} 1232 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1233 deprecated: This package is no longer supported. 1234 1235 + gensync@1.0.0-beta.2: 1236 + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1237 + engines: {node: '>=6.9.0'} 1238 1239 glob-parent@6.0.2: 1240 resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} ··· 1258 resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} 1259 engines: {node: '>=18'} 1260 1261 graceful-fs@4.2.11: 1262 resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1263 ··· 1266 engines: {node: '>=0.4.7'} 1267 hasBin: true 1268 1269 has-unicode@2.0.1: 1270 resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} 1271 1272 + he@1.2.0: 1273 + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 1274 + hasBin: true 1275 1276 http-cache-semantics@4.2.0: 1277 resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} ··· 1328 resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} 1329 engines: {node: '>= 12'} 1330 1331 is-extglob@2.1.1: 1332 resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1333 engines: {node: '>=0.10.0'} ··· 1346 is-promise@2.2.2: 1347 resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} 1348 1349 isexe@2.0.0: 1350 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1351 ··· 1356 resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 1357 hasBin: true 1358 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 1366 1367 json-buffer@3.0.1: 1368 resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} ··· 1373 json-stable-stringify-without-jsonify@1.0.1: 1374 resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1375 1376 + json5@2.2.3: 1377 + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1378 + engines: {node: '>=6'} 1379 + hasBin: true 1380 1381 keyv@4.5.4: 1382 resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1383 + 1384 + kolorist@1.8.0: 1385 + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 1386 1387 levn@0.4.1: 1388 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} ··· 1423 engines: {node: '>= 12.0.0'} 1424 cpu: [arm64] 1425 os: [linux] 1426 + libc: [glibc] 1427 1428 lightningcss-linux-arm64-musl@1.31.1: 1429 resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} 1430 engines: {node: '>= 12.0.0'} 1431 cpu: [arm64] 1432 os: [linux] 1433 + libc: [musl] 1434 1435 lightningcss-linux-x64-gnu@1.31.1: 1436 resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} 1437 engines: {node: '>= 12.0.0'} 1438 cpu: [x64] 1439 os: [linux] 1440 + libc: [glibc] 1441 1442 lightningcss-linux-x64-musl@1.31.1: 1443 resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} 1444 engines: {node: '>= 12.0.0'} 1445 cpu: [x64] 1446 os: [linux] 1447 + libc: [musl] 1448 1449 lightningcss-win32-arm64-msvc@1.31.1: 1450 resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} ··· 1472 lru-cache@10.4.3: 1473 resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1474 1475 + lru-cache@5.1.1: 1476 + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1477 + 1478 lru-cache@7.18.3: 1479 resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} 1480 engines: {node: '>=12'} ··· 1482 lru-queue@0.1.0: 1483 resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} 1484 1485 + magic-string@0.30.21: 1486 + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1487 + 1488 make-fetch-happen@10.2.1: 1489 resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} 1490 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1491 1492 mdn-data@2.0.28: 1493 resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} ··· 1596 engines: {node: ^12.13 || ^14.13 || >=16} 1597 hasBin: true 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 + 1605 nopt@6.0.0: 1606 resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} 1607 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} ··· 1614 1615 nth-check@2.1.1: 1616 resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 1617 1618 once@1.4.0: 1619 resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} ··· 1651 path-key@3.1.1: 1652 resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1653 engines: {node: '>=8'} 1654 1655 path-scurry@1.11.1: 1656 resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} ··· 1662 picocolors@1.1.1: 1663 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1664 1665 + picomatch@2.3.1: 1666 + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1667 + engines: {node: '>=8.6'} 1668 + 1669 picomatch@4.0.3: 1670 resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1671 engines: {node: '>=12'} ··· 1674 resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} 1675 engines: {node: ^10 || ^12 || >=14} 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 + 1691 prelude-ls@1.2.1: 1692 resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1693 engines: {node: '>= 0.8.0'} ··· 1709 resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} 1710 engines: {node: '>=10'} 1711 1712 punycode@2.3.1: 1713 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1714 engines: {node: '>=6'} ··· 1721 resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1722 engines: {node: '>= 14.18.0'} 1723 1724 retry@0.12.0: 1725 resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 1726 engines: {node: '>= 4'} ··· 1749 sax@1.5.0: 1750 resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==} 1751 engines: {node: '>=11.0.0'} 1752 + 1753 + semver@6.3.1: 1754 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1755 + hasBin: true 1756 1757 semver@7.7.4: 1758 resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} ··· 1781 resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1782 engines: {node: '>=14'} 1783 1784 + simple-code-frame@1.3.0: 1785 + resolution: {integrity: sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==} 1786 + 1787 slugify@1.6.6: 1788 resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} 1789 engines: {node: '>=8.0.0'} ··· 1808 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1809 engines: {node: '>=0.10.0'} 1810 1811 + source-map@0.7.6: 1812 + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} 1813 + engines: {node: '>= 12'} 1814 + 1815 ssri@9.0.1: 1816 resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} 1817 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1818 1819 + stack-trace@1.0.0-pre2: 1820 + resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} 1821 + engines: {node: '>=16'} 1822 + 1823 string-width@4.2.3: 1824 resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1825 engines: {node: '>=8'} ··· 1839 resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} 1840 engines: {node: '>=12'} 1841 1842 svg-pathdata@6.0.3: 1843 resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} 1844 engines: {node: '>=12.0.0'} ··· 1860 svgpath@2.6.0: 1861 resolution: {integrity: sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==} 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 + 1870 tar@6.2.1: 1871 resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} 1872 engines: {node: '>=10'} ··· 1879 tinyglobby@0.2.15: 1880 resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1881 engines: {node: '>=12.0.0'} 1882 1883 ts-api-utils@2.4.0: 1884 resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} ··· 1934 resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} 1935 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 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 + 1943 uri-js@4.4.1: 1944 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1945 ··· 1965 svgo: 1966 optional: true 1967 1968 + vite-prerender-plugin@0.5.12: 1969 + resolution: {integrity: sha512-EiwhbMn+flg14EysbLTmZSzq8NGTxhytgK3bf4aGRF1evWLGwZiHiUJ1KZDvbxgKbMf2pG6fJWGEa3UZXOnR1g==} 1970 + peerDependencies: 1971 + vite: 5.x || 6.x || 7.x 1972 1973 vite@8.0.0-beta.16: 1974 resolution: {integrity: sha512-c0t7hYkxsjws89HH+BUFh/sL3BpPNhNsL9CJrTpMxBmwKQBRSa5OJ5w4o9O0bQVI/H/vx7UpUUIevvXa37NS/Q==} ··· 2012 optional: true 2013 yaml: 2014 optional: true 2015 2016 which@2.0.2: 2017 resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} ··· 2021 wide-align@1.1.5: 2022 resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 2023 2024 word-wrap@1.2.5: 2025 resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 2026 engines: {node: '>=0.10.0'} ··· 2039 wrappy@1.0.2: 2040 resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2041 2042 + yallist@3.1.1: 2043 + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2044 + 2045 yallist@4.0.0: 2046 resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2047 ··· 2051 2052 snapshots: 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 + 2122 '@babel/helper-string-parser@7.27.1': {} 2123 2124 '@babel/helper-validator-identifier@7.28.5': {} 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 + 2133 '@babel/parser@7.29.0': 2134 dependencies: 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 2177 2178 '@babel/types@7.29.0': 2179 dependencies: ··· 2372 wrap-ansi: 8.1.0 2373 wrap-ansi-cjs: wrap-ansi@7.0.0 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 + 2394 '@napi-rs/wasm-runtime@1.1.1': 2395 dependencies: 2396 '@emnapi/core': 1.8.1 ··· 2476 '@pkgjs/parseargs@0.11.0': 2477 optional: true 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 + 2516 '@rolldown/binding-android-arm64@1.0.0-rc.6': 2517 optional: true 2518 ··· 2556 2557 '@rolldown/pluginutils@1.0.0-rc.6': {} 2558 2559 + '@rollup/pluginutils@4.2.1': 2560 + dependencies: 2561 + estree-walker: 2.0.2 2562 + picomatch: 2.3.1 2563 + 2564 '@rollup/pluginutils@5.3.0': 2565 dependencies: 2566 '@types/estree': 1.0.8 2567 estree-walker: 2.0.2 2568 picomatch: 4.0.3 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 + 2638 '@tootallnate/once@2.0.0': {} 2639 2640 '@tybys/wasm-util@0.10.1': ··· 2647 '@types/estree@1.0.8': {} 2648 2649 '@types/json-schema@7.0.15': {} 2650 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)': 2652 dependencies: ··· 2747 dependencies: 2748 acorn: 8.16.0 2749 2750 acorn@8.16.0: {} 2751 2752 agent-base@6.0.2: ··· 2792 2793 argparse@2.0.1: {} 2794 2795 + babel-plugin-transform-hook-names@1.0.2(@babel/core@7.29.0): 2796 dependencies: 2797 + '@babel/core': 7.29.0 2798 2799 balanced-match@1.0.2: {} 2800 2801 balanced-match@4.0.4: {} 2802 + 2803 + baseline-browser-mapping@2.10.0: {} 2804 2805 bindings@1.5.0: 2806 dependencies: ··· 2821 dependencies: 2822 balanced-match: 4.0.4 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 + 2832 bufferstreams@3.0.0: 2833 dependencies: 2834 readable-stream: 3.6.2 ··· 2856 transitivePeerDependencies: 2857 - bluebird 2858 2859 + caniuse-lite@1.0.30001777: {} 2860 2861 case@1.6.3: {} 2862 2863 chokidar@4.0.3: 2864 dependencies: 2865 readdirp: 4.1.2 ··· 2894 2895 console-control-strings@1.1.0: {} 2896 2897 + convert-source-map@2.0.0: {} 2898 2899 cross-spawn@7.0.6: 2900 dependencies: ··· 2943 2944 detect-libc@2.1.2: {} 2945 2946 dom-serializer@2.0.0: 2947 dependencies: 2948 domelementtype: 2.3.0 ··· 2961 domelementtype: 2.3.0 2962 domhandler: 5.0.3 2963 2964 + eastasianwidth@0.2.0: {} 2965 2966 + electron-to-chromium@1.5.307: {} 2967 2968 emoji-regex@8.0.0: {} 2969 ··· 2974 iconv-lite: 0.6.3 2975 optional: true 2976 2977 + enhanced-resolve@5.20.0: 2978 + dependencies: 2979 + graceful-fs: 4.2.11 2980 + tapable: 2.3.0 2981 + 2982 entities@4.5.0: {} 2983 2984 env-paths@2.2.1: {} 2985 2986 err-code@2.0.3: {} 2987 2988 es5-ext@0.10.64: 2989 dependencies: ··· 3009 es5-ext: 0.10.64 3010 es6-iterator: 2.0.3 3011 es6-symbol: 3.1.4 3012 + 3013 + escalade@3.2.0: {} 3014 3015 escape-string-regexp@4.0.0: {} 3016 ··· 3159 fsevents@2.3.3: 3160 optional: true 3161 3162 gauge@4.0.4: 3163 dependencies: 3164 aproba: 2.1.0 ··· 3170 strip-ansi: 6.0.1 3171 wide-align: 1.1.5 3172 3173 + gensync@1.0.0-beta.2: {} 3174 3175 glob-parent@6.0.2: 3176 dependencies: ··· 3204 3205 globals@17.4.0: {} 3206 3207 graceful-fs@4.2.11: {} 3208 3209 handlebars@4.7.8: ··· 3215 optionalDependencies: 3216 uglify-js: 3.19.3 3217 3218 has-unicode@2.0.1: {} 3219 3220 + he@1.2.0: {} 3221 3222 http-cache-semantics@4.2.0: {} 3223 ··· 3268 3269 ip-address@10.1.0: {} 3270 3271 is-extglob@2.1.1: {} 3272 3273 is-fullwidth-code-point@3.0.0: {} ··· 3280 3281 is-promise@2.2.2: {} 3282 3283 isexe@2.0.0: {} 3284 3285 jackspeak@3.4.3: ··· 3290 3291 jiti@2.6.1: {} 3292 3293 + js-tokens@4.0.0: {} 3294 + 3295 + jsesc@3.1.0: {} 3296 3297 json-buffer@3.0.1: {} 3298 ··· 3300 3301 json-stable-stringify-without-jsonify@1.0.1: {} 3302 3303 + json5@2.2.3: {} 3304 3305 keyv@4.5.4: 3306 dependencies: 3307 json-buffer: 3.0.1 3308 + 3309 + kolorist@1.8.0: {} 3310 3311 levn@0.4.1: 3312 dependencies: ··· 3370 3371 lru-cache@10.4.3: {} 3372 3373 + lru-cache@5.1.1: 3374 + dependencies: 3375 + yallist: 3.1.1 3376 + 3377 lru-cache@7.18.3: {} 3378 3379 lru-queue@0.1.0: 3380 dependencies: 3381 es5-ext: 0.10.64 3382 + 3383 + magic-string@0.30.21: 3384 + dependencies: 3385 + '@jridgewell/sourcemap-codec': 1.5.5 3386 3387 make-fetch-happen@10.2.1: 3388 dependencies: ··· 3406 - bluebird 3407 - supports-color 3408 3409 mdn-data@2.0.28: {} 3410 3411 mdn-data@2.23.0: {} ··· 3516 - bluebird 3517 - supports-color 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 + 3526 nopt@6.0.0: 3527 dependencies: 3528 abbrev: 1.1.1 ··· 3538 dependencies: 3539 boolbase: 1.0.0 3540 3541 once@1.4.0: 3542 dependencies: 3543 wrappy: 1.0.2 ··· 3573 3574 path-key@3.1.1: {} 3575 3576 path-scurry@1.11.1: 3577 dependencies: 3578 lru-cache: 10.4.3 ··· 3582 3583 picocolors@1.1.1: {} 3584 3585 + picomatch@2.3.1: {} 3586 + 3587 picomatch@4.0.3: {} 3588 3589 postcss@8.5.8: ··· 3592 picocolors: 1.1.1 3593 source-map-js: 1.2.1 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 + 3606 prelude-ls@1.2.1: {} 3607 3608 prettier@3.8.1: {} ··· 3614 err-code: 2.0.3 3615 retry: 0.12.0 3616 3617 punycode@2.3.1: {} 3618 3619 readable-stream@3.6.2: ··· 3624 3625 readdirp@4.1.2: {} 3626 3627 retry@0.12.0: {} 3628 3629 rimraf@3.0.2: ··· 3663 '@parcel/watcher': 2.5.6 3664 3665 sax@1.5.0: {} 3666 + 3667 + semver@6.3.1: {} 3668 3669 semver@7.7.4: {} 3670 ··· 3711 3712 signal-exit@4.1.0: {} 3713 3714 + simple-code-frame@1.3.0: 3715 + dependencies: 3716 + kolorist: 1.8.0 3717 + 3718 slugify@1.6.6: {} 3719 3720 smart-buffer@4.2.0: {} ··· 3736 3737 source-map@0.6.1: {} 3738 3739 + source-map@0.7.6: {} 3740 + 3741 ssri@9.0.1: 3742 dependencies: 3743 minipass: 3.3.6 3744 3745 + stack-trace@1.0.0-pre2: {} 3746 + 3747 string-width@4.2.3: 3748 dependencies: 3749 emoji-regex: 8.0.0 ··· 3767 strip-ansi@7.2.0: 3768 dependencies: 3769 ansi-regex: 6.2.2 3770 3771 svg-pathdata@6.0.3: {} 3772 ··· 3798 3799 svgpath@2.6.0: {} 3800 3801 + tailwindcss@4.2.1: {} 3802 + 3803 + tapable@2.3.0: {} 3804 + 3805 tar@6.2.1: 3806 dependencies: 3807 chownr: 2.0.0 ··· 3820 dependencies: 3821 fdir: 6.5.0(picomatch@4.0.3) 3822 picomatch: 4.0.3 3823 3824 ts-api-utils@2.4.0(typescript@5.9.3): 3825 dependencies: ··· 3877 dependencies: 3878 imurmurhash: 0.1.4 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 + 3886 uri-js@4.4.1: 3887 dependencies: 3888 punycode: 2.3.1 ··· 3907 sharp: 0.34.5 3908 svgo: 4.0.1 3909 3910 + vite-prerender-plugin@0.5.12(vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3)): 3911 dependencies: 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) 3919 3920 vite@8.0.0-beta.16(jiti@2.6.1)(sass@1.97.3): 3921 dependencies: ··· 3930 jiti: 2.6.1 3931 sass: 1.97.3 3932 3933 which@2.0.2: 3934 dependencies: 3935 isexe: 2.0.0 ··· 3938 dependencies: 3939 string-width: 4.2.3 3940 3941 word-wrap@1.2.5: {} 3942 3943 wordwrap@1.0.0: {} ··· 3955 strip-ansi: 7.2.0 3956 3957 wrappy@1.0.2: {} 3958 + 3959 + yallist@3.1.1: {} 3960 3961 yallist@4.0.0: {} 3962
-1
scss/_base.scss
··· 1 @import "variables"; 2 3 body { 4 - background-color: $colorBrand; 5 overflow-x: hidden; 6 } 7
··· 1 @import "variables"; 2 3 body { 4 overflow-x: hidden; 5 } 6
-2
scss/_buttons.scss
··· 17 transition: 18 background 0.3s cubic-bezier(0.215, 0.61, 0.355, 1), 19 box-shadow 0.3s cubic-bezier(0.215, 0.61, 0.355, 1); 20 - 21 - @include alt-font; 22 } 23 24 @each $name, $color in $btnColors {
··· 17 transition: 18 background 0.3s cubic-bezier(0.215, 0.61, 0.355, 1), 19 box-shadow 0.3s cubic-bezier(0.215, 0.61, 0.355, 1); 20 } 21 22 @each $name, $color in $btnColors {
-4
scss/_grid.scss
··· 8 9 .container { 10 width: 100%; 11 - padding-right: 0; 12 - padding-left: 0; 13 - margin-right: auto; 14 - margin-left: auto; 15 16 @media (min-width: map_get($responsiveThresholds, tiny)) { 17 max-width: 540px;
··· 8 9 .container { 10 width: 100%; 11 12 @media (min-width: map_get($responsiveThresholds, tiny)) { 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 @import "variables"; 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 html { 36 scrollbar-color: $colorScrollbarThumb $colorScrollbarTrack; 37 - scrollbar-width: thin; 38 }
··· 1 @import "variables"; 2 3 html { 4 scrollbar-color: $colorScrollbarThumb $colorScrollbarTrack; 5 }
-56
scss/_typography.scss
··· 1 - @use "@fontsource/fira-sans"; 2 - @use "@fontsource/josefin-sans"; 3 - 4 @import "variables"; 5 6 body { ··· 8 font-size: 20px; 9 font-weight: 400; 10 line-height: 1.375; 11 - @include main-font; 12 - 13 @media (prefers-color-scheme: dark) { 14 color: $colorTextPrimaryDark; 15 } 16 } 17 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 p { 69 margin-top: 0; 70 margin-bottom: 1rem; ··· 73 blockquote { 74 margin-left: 0; 75 margin-right: 0; 76 - @extend h5; 77 } 78 79 a {
··· 1 @import "variables"; 2 3 body { ··· 5 font-size: 20px; 6 font-weight: 400; 7 line-height: 1.375; 8 @media (prefers-color-scheme: dark) { 9 color: $colorTextPrimaryDark; 10 } 11 } 12 13 p { 14 margin-top: 0; 15 margin-bottom: 1rem; ··· 18 blockquote { 19 margin-left: 0; 20 margin-right: 0; 21 } 22 23 a {
-9
scss/_variables.scss
··· 42 med: 992px, 43 big: 1300px, 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 - }
··· 42 med: 992px, 43 big: 1300px, 44 );
-1
scss/application.scss
··· 18 19 @import "variables"; 20 21 - @import "normalize"; 22 @import "typography"; 23 @import "grid"; 24 @import "base";
··· 18 19 @import "variables"; 20 21 @import "typography"; 22 @import "grid"; 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 import { defineConfig } from "vite"; 2 - import pugPlugin from "vite-plugin-pug"; 3 import { imagetools } from "vite-imagetools"; 4 import { ViteImageOptimizer } from "vite-plugin-image-optimizer"; 5 - 6 - const options = { pretty: true }; 7 - const locals = { name: "My Pug" }; 8 9 export default defineConfig({ 10 - plugins: [pugPlugin(options, locals), imagetools(), ViteImageOptimizer()], 11 });
··· 1 import { defineConfig } from "vite"; 2 import { imagetools } from "vite-imagetools"; 3 import { ViteImageOptimizer } from "vite-plugin-image-optimizer"; 4 + import tailwindcss from "@tailwindcss/vite"; 5 + import preact from "@preact/preset-vite"; 6 7 export default defineConfig({ 8 + plugins: [ 9 + preact({ 10 + prerender: { 11 + enabled: true, 12 + renderTarget: "#app", 13 + }, 14 + }), 15 + imagetools(), 16 + ViteImageOptimizer(), 17 + tailwindcss(), 18 + ], 19 });