summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordarkuss <darkussdelta@gmail.com>2026-08-13 05:13:32 +0200
committerdarkuss <darkussdelta@gmail.com>2026-08-13 05:13:32 +0200
commit5ac62cc1a4d9a5f50ea26d5bc1afb0fbf95da23c (patch)
treefd50520f319ec22798f8b3629899cd1bbef5af23
init
-rw-r--r--.gitignore1
-rw-r--r--assets/Nintendo-DS-BIOS.ttfbin0 -> 22556 bytes
-rw-r--r--assets/bandcamp.pngbin0 -> 205 bytes
-rw-r--r--assets/bg.svg24
-rw-r--r--assets/bg_bottom.svg25
-rw-r--r--assets/bg_top.svg24
-rw-r--r--assets/close.pngbin0 -> 232 bytes
-rw-r--r--assets/cozette_vector.woff2bin0 -> 124356 bytes
-rw-r--r--assets/fumo.pngbin0 -> 1286 bytes
-rw-r--r--assets/maximize.pngbin0 -> 177 bytes
-rw-r--r--assets/minimize.pngbin0 -> 169 bytes
-rw-r--r--assets/netpunk.pngbin0 -> 5020 bytes
-rw-r--r--assets/netpunk_descender.pngbin0 -> 246 bytes
-rw-r--r--assets/newgrounds.pngbin0 -> 236 bytes
-rw-r--r--assets/scientifica.ttfbin0 -> 120736 bytes
-rw-r--r--assets/soundcloud.pngbin0 -> 225 bytes
-rw-r--r--assets/youtube.pngbin0 -> 220 bytes
-rw-r--r--css/index.css352
-rw-r--r--css/reset.css48
-rw-r--r--index.html13
-rw-r--r--package.json18
-rw-r--r--pnpm-lock.yaml1206
-rw-r--r--src/app.tsx11
-rw-r--r--src/desktop/apps/buttons.tsx0
-rw-r--r--src/desktop/apps/edit.tsx13
-rw-r--r--src/desktop/apps/index.tsx5
-rw-r--r--src/desktop/apps/music.tsx43
-rw-r--r--src/desktop/index.tsx43
-rw-r--r--src/desktop/window.tsx81
-rw-r--r--src/main.tsx6
-rw-r--r--src/taskbar/index.tsx27
-rw-r--r--src/taskbar/start.tsx11
-rw-r--r--src/taskbar/time.tsx23
-rw-r--r--tsconfig.json24
-rw-r--r--vite.config.ts11
35 files changed, 2009 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+node_modules
diff --git a/assets/Nintendo-DS-BIOS.ttf b/assets/Nintendo-DS-BIOS.ttf
new file mode 100644
index 0000000..18e9603
--- /dev/null
+++ b/assets/Nintendo-DS-BIOS.ttf
Binary files differ
diff --git a/assets/bandcamp.png b/assets/bandcamp.png
new file mode 100644
index 0000000..791a193
--- /dev/null
+++ b/assets/bandcamp.png
Binary files differ
diff --git a/assets/bg.svg b/assets/bg.svg
new file mode 100644
index 0000000..958afdd
--- /dev/null
+++ b/assets/bg.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="32"
+ height="31.999998"
+ viewBox="0 0 8.4666664 8.4666661"
+ version="1.1"
+ id="svg1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs1" />
+ <g
+ id="layer1">
+ <rect
+ style="fill:#ff0047;fill-opacity:1;stroke-width:0.176666;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:16"
+ id="rect1"
+ width="2.1166666"
+ height="2.1166666"
+ x="3.175"
+ y="3.175" />
+ </g>
+</svg>
diff --git a/assets/bg_bottom.svg b/assets/bg_bottom.svg
new file mode 100644
index 0000000..520c331
--- /dev/null
+++ b/assets/bg_bottom.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="32"
+ height="64"
+ viewBox="0 0 8.4666664 16.933332"
+ version="1.1"
+ id="svg1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs1" />
+ <g
+ id="layer1"
+ transform="translate(-3.3566284e-8,8.4666664)">
+ <rect
+ style="fill:#ff0047;fill-opacity:1;stroke-width:0.176666;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:16"
+ id="rect1"
+ width="2.1166666"
+ height="2.1166666"
+ x="3.175"
+ y="3.175" />
+ </g>
+</svg>
diff --git a/assets/bg_top.svg b/assets/bg_top.svg
new file mode 100644
index 0000000..15a4209
--- /dev/null
+++ b/assets/bg_top.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="32"
+ height="64"
+ viewBox="0 0 8.4666664 16.933332"
+ version="1.1"
+ id="svg1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs1" />
+ <g
+ id="layer1">
+ <rect
+ style="fill:#ff0047;fill-opacity:1;stroke-width:0.176666;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:16"
+ id="rect1"
+ width="2.1166666"
+ height="2.1166666"
+ x="3.175"
+ y="3.175" />
+ </g>
+</svg>
diff --git a/assets/close.png b/assets/close.png
new file mode 100644
index 0000000..ff1b9ae
--- /dev/null
+++ b/assets/close.png
Binary files differ
diff --git a/assets/cozette_vector.woff2 b/assets/cozette_vector.woff2
new file mode 100644
index 0000000..e141ead
--- /dev/null
+++ b/assets/cozette_vector.woff2
Binary files differ
diff --git a/assets/fumo.png b/assets/fumo.png
new file mode 100644
index 0000000..a237445
--- /dev/null
+++ b/assets/fumo.png
Binary files differ
diff --git a/assets/maximize.png b/assets/maximize.png
new file mode 100644
index 0000000..180af2c
--- /dev/null
+++ b/assets/maximize.png
Binary files differ
diff --git a/assets/minimize.png b/assets/minimize.png
new file mode 100644
index 0000000..38248a3
--- /dev/null
+++ b/assets/minimize.png
Binary files differ
diff --git a/assets/netpunk.png b/assets/netpunk.png
new file mode 100644
index 0000000..08bc420
--- /dev/null
+++ b/assets/netpunk.png
Binary files differ
diff --git a/assets/netpunk_descender.png b/assets/netpunk_descender.png
new file mode 100644
index 0000000..9ba9c58
--- /dev/null
+++ b/assets/netpunk_descender.png
Binary files differ
diff --git a/assets/newgrounds.png b/assets/newgrounds.png
new file mode 100644
index 0000000..15bda42
--- /dev/null
+++ b/assets/newgrounds.png
Binary files differ
diff --git a/assets/scientifica.ttf b/assets/scientifica.ttf
new file mode 100644
index 0000000..1753d31
--- /dev/null
+++ b/assets/scientifica.ttf
Binary files differ
diff --git a/assets/soundcloud.png b/assets/soundcloud.png
new file mode 100644
index 0000000..f2fd5f6
--- /dev/null
+++ b/assets/soundcloud.png
Binary files differ
diff --git a/assets/youtube.png b/assets/youtube.png
new file mode 100644
index 0000000..cc27a3f
--- /dev/null
+++ b/assets/youtube.png
Binary files differ
diff --git a/css/index.css b/css/index.css
new file mode 100644
index 0000000..9f5b7a9
--- /dev/null
+++ b/css/index.css
@@ -0,0 +1,352 @@
+@font-face {
+ font-family: "Scientifica";
+ src: url("/assets/scientifica.ttf");
+}
+
+@font-face {
+ font-family: "Nintendo DS BIOS";
+ src: url("/assets/Nintendo-DS-BIOS.ttf");
+}
+
+@font-face {
+ font-family: "Cozette Vector";
+ src: url("/assets/cozette_vector.woff2");
+}
+
+:root {
+ --red: #ff0047;
+ --red-dark: #7d0425;
+ --red-bright: #ff77a8;
+ --yellow: #ffa300;
+ --white: #fff1e8;
+
+ --spacing: 4px;
+}
+
+html {
+ overflow: hidden;
+}
+
+body {
+ /* font-family: "Cozette Vector"; */
+ font-family: "Nintendo DS BIOS";
+ margin: 0;
+ height: 100vh;
+ font-size: 1.2rem;
+ /* background-color: var(--red-dark); */
+ background-image: linear-gradient(26.57deg, var(--red-dark) 0%, var(--red) 100%);
+}
+
+button {
+ color: inherit;
+ font: inherit;
+ cursor: pointer;
+ background-color: transparent;
+}
+
+#root {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ isolation: isolate;
+}
+
+@keyframes bounce {
+ from {
+ background-position: 0 0;
+ }
+
+ to {
+ background-position: var(--translate-amount) 0;
+ }
+}
+
+@keyframes scroll {
+ from {
+ transform: translateX(0);
+ }
+
+ to {
+ transform: translateX(var(--translate-amount));
+ }
+}
+
+#desktop {
+ border-bottom: 1px solid var(--white);
+ flex-grow: 1;
+ padding: 1em;
+ overflow: hidden;
+ position: relative;
+ z-index: 2;
+}
+
+#desktop::after {
+ position: absolute;
+ border-bottom: 1px solid var(--white);
+ z-index: 3;
+}
+
+#netpunk,
+#netpunk_descender {
+ pointer-events: none;
+ width: 45vw;
+ display: block;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+}
+
+#netpunk {
+ z-index: 3;
+}
+
+#netpunk_descender {
+ background-image: url("/assets/netpunk_descender.png");
+ height: calc(100% + 5px); /* yellow + white borders + some margin for safety */
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+}
+
+#bg {
+ /* cos(26.57deg) sin(26.57deg) */
+ width: calc(100vw * 0.89438856 + 100vh * 0.44729084);
+ height: calc(100vh * 0.89438856 + 100vw * 0.44729084);
+ position: fixed;
+ left: 50%;
+ top: 50%;
+ z-index: 1;
+ opacity: 0.075;
+ transform: translate(-50%, -50%) rotate(26.57deg);
+}
+
+#bg.bounce > div {
+ animation: scroll linear infinite, bounce infinite cubic-bezier(0.2, 0, 0, 1.0);
+ animation-duration: 4s, calc(60s / 130);
+}
+
+#bg > div {
+ width: calc(100% + 32px);
+ height: 100%;
+ background-image: url("/assets/bg_top.svg");
+ animation: scroll linear infinite;
+ animation-duration: 4s;
+ --translate-amount: 32px;
+}
+
+#bg.reverse > div {
+ background-image: url("/assets/bg_bottom.svg");
+ --translate-amount: -32px;
+}
+
+/* #desktop > div { */
+/* animation: bounce infinite cubic-bezier(0.2, 0, 0, 1.0); */
+/* animation-duration: calc(60s / 130); */
+/* background-color: black; */
+/* width: 4px; */
+/* height: 4px; */
+/* } */
+
+nav {
+ z-index: 2;
+ background-image: linear-gradient(to bottom, var(--red) 0%, var(--red) 50%, black 50%, black 100%);
+ display: flex;
+ color: var(--white);
+ gap: calc(var(--spacing) * 2);
+ text-shadow: black 1px 1px 0;
+ border-top: 2px solid var(--yellow);
+ position: relative;
+}
+
+nav img {
+ width: 1lh;
+ height: 1lh;
+ display: block;
+}
+
+nav button {
+ text-shadow: inherit;
+}
+
+nav > ul {
+ display: flex;
+ margin: 0;
+ padding: 0;
+ flex-grow: 1;
+ gap: var(--spacing);
+ align-items: center;
+ padding: 6px;
+}
+
+nav > ul > li {
+ margin: 0;
+ list-style: none;
+}
+
+
+nav > ul > li > button {
+ padding: var(--spacing) calc(var(--spacing) + 0.3em);
+ background-color: transparent;
+ border-radius: 0.6em;
+ border: 2px solid var(--red-dark);
+
+}
+
+nav > div {
+ position: relative;
+ display: flex;
+}
+
+#start > div {
+ height: 50%;
+ aspect-ratio: 1 / 1;
+ overflow: hidden;
+ position: relative;
+}
+
+#start > div > div {
+ position: absolute;
+ height: 200%;
+ width: 200%;
+ bottom: 0;
+ right: 0;
+ border-right: 2px solid var(--red-dark);
+ border-top: 2px solid var(--red-dark);
+ border-top-right-radius: 9999px;
+ box-sizing: border-box;
+ /* box-shadow: inset #fff6 -1px 1px 0px; */
+ box-shadow: inset var(--yellow) -1px 1px 0px;
+}
+
+#start > button {
+ display: flex;
+ background-color: transparent;
+ border: none;
+ padding: calc(var(--spacing) * 1.5);
+ font-size: 1.2em;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: var(--spacing);
+}
+
+#time {
+ padding: var(--spacing);
+ justify-content: center;
+ flex-direction: column;
+ align-items: center;
+ border-left: 2px solid var(--red-dark);
+}
+
+.window {
+ background-color: black;
+ border-radius: 4px;
+ border: 1px solid var(--red-bright);
+ border-top-color: var(--white);
+ box-shadow: black 0 -2px;
+ overflow: hidden;
+ position: absolute;
+ display: flex;
+ flex-direction: column;
+ z-index: 4;
+}
+
+.window .titlebar {
+ padding: 6px;
+ color: var(--white);
+ user-select: none;
+ cursor: grab;
+ display: flex;
+}
+
+.window .titlebar > .title {
+ flex: 1;
+}
+
+.window .titlebar > .buttons {
+ display: flex;
+ gap: var(--spacing);
+}
+
+.window .titlebar button {
+ height: 1em;
+ border-radius: 4px;
+ border: 1px solid var(--white);
+ padding: var(--spacing);
+ box-sizing: border-box;
+}
+
+.window .titlebar button:hover {
+ background-color: #fff1e830;
+}
+
+.window .titlebar button img {
+ height: calc(1em - 2 * (var(--spacing) + 1px));
+ display: block;
+}
+
+.window.dragging > .titlebar{
+ cursor: grabbing;
+}
+
+.window .content {
+ padding: 6px;
+ padding-top: 0;
+ height: 100%;
+}
+
+.window textarea {
+ background-color: var(--white);
+ margin: 0;
+ border: none;
+ border-radius: 0;
+ resize: none;
+ font: inherit;
+ caret-color: var(--yellow);
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+ white-space: pre-wrap;
+}
+
+.window textarea:focus-visible {
+ outline: none;
+ box-shadow: inset var(--red-bright) 0 0 0 1px;
+}
+
+.window .external_warning {
+ color: var(--white);
+ background-color: var(--red-dark);
+ padding: var(--spacing);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--spacing);
+ min-width: max-content;
+}
+
+.window .external_warning a {
+ color: var(--red);
+}
+
+.window .external_warning a:hover {
+ color: var(--red-bright);
+}
+
+.window .external_warning > button {
+ border: none;
+ background-color: var(--red);
+ border-radius: 0.6em;
+ padding: var(--spacing) calc(var(--spacing) + 0.3em);
+}
+
+.icon_grid {
+ display: grid;
+ grid-template-rows: repeat(10, 1fr);
+ /* grid-template-columns: repeat(, 1fr); */
+ /* grid-template-columns: repeat(10, 1fr); */
+ height: 100%;
+}
+
+.icon_grid > div {
+ aspect-ratio: 1 / 1;
+}
diff --git a/css/reset.css b/css/reset.css
new file mode 100644
index 0000000..e29c0f5
--- /dev/null
+++ b/css/reset.css
@@ -0,0 +1,48 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..0d89cdc
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="stylesheet" href="/css/reset.css">
+ <link rel="stylesheet" href="/css/index.css">
+ <script src="/src/main.tsx" type="module"></script>
+ </head>
+ <body>
+ <div id="root"></div>
+ <!-- <div></div> -->
+ <!-- <iframe style="border: 0; width: 350px; height: 786px;" src="https://bandcamp.com/EmbeddedPlayer/album=3374731395/size=large/bgcol=333333/linkcol=e32c14/transparent=true/" seamless><a href="https://sunnexo.bandcamp.com/album/netpunk">Netpunk by Sunnexo</a></iframe> -->
+ </body>
+</html>
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..249d8de
--- /dev/null
+++ b/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "netpunk",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "type": "module",
+ "author": "Delta <darkussdelta@gmail.com>",
+ "license": "GPL-3.0-or-later",
+ "packageManager": "pnpm@10.9.0",
+ "dependencies": {
+ "@base-ui/react": "^1.7.0",
+ "@preact/preset-vite": "^2.10.6",
+ "@tsconfig/recommended": "^1.0.13",
+ "preact": "^10.29.8",
+ "temporal-polyfill": "^1.0.3",
+ "vite": "^8.2.1"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..292fd83
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,1206 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@base-ui/react':
+ specifier: ^1.7.0
+ version: 1.7.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@preact/preset-vite':
+ specifier: ^2.10.6
+ version: 2.10.6(@babel/core@7.29.7)(preact@10.29.8)(vite@8.2.1)
+ '@tsconfig/recommended':
+ specifier: ^1.0.13
+ version: 1.0.13
+ preact:
+ specifier: ^10.29.8
+ version: 10.29.8
+ temporal-polyfill:
+ specifier: ^1.0.3
+ version: 1.0.3
+ vite:
+ specifier: ^8.2.1
+ version: 8.2.1
+
+packages:
+
+ '@babel/code-frame@7.29.7':
+ resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.29.7':
+ resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.29.7':
+ resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.29.8':
+ resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.29.7':
+ resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.29.7':
+ resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-globals@7.29.7':
+ resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.29.7':
+ resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.29.7':
+ resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.29.7':
+ resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.29.7':
+ resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.29.7':
+ resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.29.7':
+ resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.29.7':
+ resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.8':
+ resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-jsx@7.29.7':
+ resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-development@7.29.7':
+ resolution: {integrity: sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx@7.29.7':
+ resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.29.7':
+ resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.29.7':
+ resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.29.8':
+ resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.8':
+ resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@base-ui/react@1.7.0':
+ resolution: {integrity: sha512-j+8QjX44C32jrXD/qyEAGpFr70FRpGL2CY61mQd9nBPWN737CK0xxD1ceJ055rW4RtdvFDT1e7otzdlfxvsYug==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@date-fns/tz': ^1.2.0
+ '@types/react': ^17 || ^18 || ^19
+ date-fns: ^4.0.0
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@date-fns/tz':
+ optional: true
+ '@types/react':
+ optional: true
+ date-fns:
+ optional: true
+
+ '@base-ui/utils@0.3.2':
+ resolution: {integrity: sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ==}
+ peerDependencies:
+ '@types/react': ^17 || ^18 || ^19
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@floating-ui/core@1.8.0':
+ resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==}
+
+ '@floating-ui/dom@1.8.0':
+ resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==}
+
+ '@floating-ui/react-dom@2.1.9':
+ resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.12':
+ resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@oxc-project/types@0.143.0':
+ resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==}
+
+ '@preact/preset-vite@2.10.6':
+ resolution: {integrity: sha512-ZZ5RIT2ZVXg8UxRA8VZpoT8CdpDG7RFIqOT4bELqNBp85+HKvQBbgmh3gsoW1UOQXx26TLe+ZRNKI7q281Kckw==}
+ peerDependencies:
+ '@babel/core': 7.x
+ vite: 2.x || 3.x || 4.x || 5.x || 6.x || 7.x || 8.x
+
+ '@prefresh/babel-plugin@0.5.3':
+ resolution: {integrity: sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==}
+
+ '@prefresh/core@1.5.10':
+ resolution: {integrity: sha512-7yPTFbG56sutaFu8krp3B4a200KOFUvrtlllKWRuLjsYXo9UUucHOZRcer+gtgMkFTpv6ob8TGcTwA32bSwa1w==}
+ peerDependencies:
+ preact: ^10.0.0 || ^11.0.0-0
+
+ '@prefresh/utils@1.2.1':
+ resolution: {integrity: sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==}
+
+ '@prefresh/vite@2.4.12':
+ resolution: {integrity: sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==}
+ peerDependencies:
+ preact: ^10.4.0 || ^11.0.0-0
+ vite: '>=2.0.0'
+
+ '@rolldown/binding-android-arm64@1.2.3':
+ resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
+ '@rolldown/binding-darwin-arm64@1.2.3':
+ resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rolldown/binding-darwin-x64@1.2.3':
+ resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rolldown/binding-freebsd-x64@1.2.3':
+ resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.3':
+ resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-gnu@1.2.3':
+ resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-musl@1.2.3':
+ resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-ppc64-gnu@1.2.3':
+ resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rolldown/binding-linux-s390x-gnu@1.2.3':
+ resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-gnu@1.2.3':
+ resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-musl@1.2.3':
+ resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-openharmony-arm64@1.2.3':
+ resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rolldown/binding-win32-arm64-msvc@1.2.3':
+ resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.2.3':
+ resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@rolldown/pluginutils@1.0.1':
+ resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
+
+ '@rollup/pluginutils@4.2.1':
+ resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+ engines: {node: '>= 8.0.0'}
+
+ '@rollup/pluginutils@5.4.0':
+ resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@tsconfig/recommended@1.0.13':
+ resolution: {integrity: sha512-sySRuBfMKyKO/j2ZAhR8kSembhjuPEV4Ra3AHtmWLq51+iGaudr45crPSzNC5b7/Ctrh9dfUpBuTlYrH6rM58Q==}
+
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
+ babel-plugin-transform-hook-names@1.0.2:
+ resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==}
+ peerDependencies:
+ '@babel/core': ^7.12.10
+
+ baseline-browser-mapping@2.11.13:
+ resolution: {integrity: sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ browserslist@4.28.8:
+ resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ caniuse-lite@1.0.30001809:
+ resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ css-select@5.2.2:
+ resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
+
+ css-what@6.2.2:
+ resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+ engines: {node: '>= 6'}
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ electron-to-chromium@1.5.403:
+ resolution: {integrity: sha512-MQsYmdaLzvaCX5j+ZZBr5Fm6uCCnPQcRtlvmvRlWqrXy+BH2O4ffXIAScF+JQznQWB9brWp4lSD9Z4yNmaf2BA==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+ lightningcss-android-arm64@1.33.0:
+ resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.33.0:
+ resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.33.0:
+ resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.33.0:
+ resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.33.0:
+ resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.33.0:
+ resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.33.0:
+ resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.33.0:
+ resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.33.0:
+ resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.33.0:
+ resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.33.0:
+ resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.33.0:
+ resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
+ engines: {node: '>= 12.0.0'}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.18:
+ resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ node-html-parser@6.1.13:
+ resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==}
+
+ node-releases@2.0.53:
+ resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==}
+ engines: {node: '>=18'}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.5:
+ resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==}
+ engines: {node: '>=12'}
+
+ postcss@8.5.26:
+ resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ preact@10.29.8:
+ resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==}
+ peerDependencies:
+ preact-render-to-string: '>=5'
+ peerDependenciesMeta:
+ preact-render-to-string:
+ optional: true
+
+ react-dom@19.2.8:
+ resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==}
+ peerDependencies:
+ react: ^19.2.8
+
+ react@19.2.8:
+ resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==}
+ engines: {node: '>=0.10.0'}
+
+ reselect@5.2.0:
+ resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==}
+
+ rolldown@1.2.3:
+ resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
+ scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ simple-code-frame@1.3.0:
+ resolution: {integrity: sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
+ stack-trace@1.0.0:
+ resolution: {integrity: sha512-H6D7134xi6qONvh7ZHKgviXf+rd3vhGBSvebPZCaUkd8zvQ+7PtDw6CljPTe4cXWNf2IKZGNqw6VJXSb9IgBpA==}
+ engines: {node: '>=20.0.0'}
+
+ temporal-polyfill@1.0.3:
+ resolution: {integrity: sha512-U8vuzZBc+dfMIfl8wXWcedfI7AJCxJjjVBIRpJUvIz5+UAp555UJDHguKsfZqHWaHRSdVUThm7mqqIWhN/xPBQ==}
+
+ temporal-spec@1.0.1:
+ resolution: {integrity: sha512-wxVoanmDeavXie1vu2JaQ3WIc3JZnWAOYFBsJyATaVsXsycKYUflGsyBmrRSnoCpZJpwPyr38VpgSUlQ8CbFxg==}
+
+ temporal-utils@1.0.1:
+ resolution: {integrity: sha512-HAixuesxFQIUaQk3ptX2jhfO/FsOkgVkDDMawvp6n/fkB1q6BKfs3lURw9I+pK/2e2e/q/vrLrxmeqauBoyGMQ==}
+
+ tinyglobby@0.2.17:
+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
+ engines: {node: '>=12.0.0'}
+
+ update-browserslist-db@1.3.0:
+ resolution: {integrity: sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ vite-prerender-plugin@0.5.13:
+ resolution: {integrity: sha512-IKSpYkzDBsKAxa05naRbj7GvNVMSdww/Z/E89oO3xndz+gWnOBOKOAbEXv7qDhktY/j3vHgJmoV1pPzqU2tx9g==}
+ peerDependencies:
+ vite: 5.x || 6.x || 7.x || 8.x
+
+ vite@8.2.1:
+ resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.4.0
+ esbuild: ^0.27.0 || ^0.28.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ zimmerframe@1.1.4:
+ resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==}
+
+snapshots:
+
+ '@babel/code-frame@7.29.7':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.29.7
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.29.7': {}
+
+ '@babel/core@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-compilation-targets': 7.29.7
+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
+ '@babel/helpers': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.29.8':
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.29.7':
+ dependencies:
+ '@babel/types': 7.29.8
+
+ '@babel/helper-compilation-targets@7.29.7':
+ dependencies:
+ '@babel/compat-data': 7.29.7
+ '@babel/helper-validator-option': 7.29.7
+ browserslist: 4.28.8
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-globals@7.29.7': {}
+
+ '@babel/helper-module-imports@7.29.7':
+ dependencies:
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+ '@babel/traverse': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.29.7': {}
+
+ '@babel/helper-string-parser@7.29.7': {}
+
+ '@babel/helper-validator-identifier@7.29.7': {}
+
+ '@babel/helper-validator-option@7.29.7': {}
+
+ '@babel/helpers@7.29.7':
+ dependencies:
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
+
+ '@babel/parser@7.29.8':
+ dependencies:
+ '@babel/types': 7.29.8
+
+ '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+
+ '@babel/plugin-transform-react-jsx-development@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-annotate-as-pure': 7.29.7
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+ '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7)
+ '@babel/types': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/runtime@7.29.7': {}
+
+ '@babel/template@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+
+ '@babel/traverse@7.29.8':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-globals': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.29.8':
+ dependencies:
+ '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+
+ '@base-ui/react@1.7.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@base-ui/utils': 0.3.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@floating-ui/utils': 0.2.12
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ use-sync-external-store: 1.6.0(react@19.2.8)
+
+ '@base-ui/utils@0.3.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@floating-ui/utils': 0.2.12
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ reselect: 5.2.0
+ use-sync-external-store: 1.6.0(react@19.2.8)
+
+ '@floating-ui/core@1.8.0':
+ dependencies:
+ '@floating-ui/utils': 0.2.12
+
+ '@floating-ui/dom@1.8.0':
+ dependencies:
+ '@floating-ui/core': 1.8.0
+ '@floating-ui/utils': 0.2.12
+
+ '@floating-ui/react-dom@2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@floating-ui/dom': 1.8.0
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+
+ '@floating-ui/utils@0.2.12': {}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@oxc-project/types@0.143.0': {}
+
+ '@preact/preset-vite@2.10.6(@babel/core@7.29.7)(preact@10.29.8)(vite@8.2.1)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7)
+ '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7)
+ '@prefresh/vite': 2.4.12(preact@10.29.8)(vite@8.2.1)
+ '@rollup/pluginutils': 5.4.0
+ babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.7)
+ debug: 4.4.3
+ magic-string: 0.30.21
+ picocolors: 1.1.1
+ vite: 8.2.1
+ vite-prerender-plugin: 0.5.13(vite@8.2.1)
+ zimmerframe: 1.1.4
+ transitivePeerDependencies:
+ - preact
+ - rollup
+ - supports-color
+
+ '@prefresh/babel-plugin@0.5.3': {}
+
+ '@prefresh/core@1.5.10(preact@10.29.8)':
+ dependencies:
+ preact: 10.29.8
+
+ '@prefresh/utils@1.2.1': {}
+
+ '@prefresh/vite@2.4.12(preact@10.29.8)(vite@8.2.1)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@prefresh/babel-plugin': 0.5.3
+ '@prefresh/core': 1.5.10(preact@10.29.8)
+ '@prefresh/utils': 1.2.1
+ '@rollup/pluginutils': 4.2.1
+ preact: 10.29.8
+ vite: 8.2.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@rolldown/binding-android-arm64@1.2.3':
+ optional: true
+
+ '@rolldown/binding-darwin-arm64@1.2.3':
+ optional: true
+
+ '@rolldown/binding-darwin-x64@1.2.3':
+ optional: true
+
+ '@rolldown/binding-freebsd-x64@1.2.3':
+ optional: true
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.3':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-gnu@1.2.3':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-musl@1.2.3':
+ optional: true
+
+ '@rolldown/binding-linux-ppc64-gnu@1.2.3':
+ optional: true
+
+ '@rolldown/binding-linux-s390x-gnu@1.2.3':
+ optional: true
+
+ '@rolldown/binding-linux-x64-gnu@1.2.3':
+ optional: true
+
+ '@rolldown/binding-linux-x64-musl@1.2.3':
+ optional: true
+
+ '@rolldown/binding-openharmony-arm64@1.2.3':
+ optional: true
+
+ '@rolldown/binding-win32-arm64-msvc@1.2.3':
+ optional: true
+
+ '@rolldown/binding-win32-x64-msvc@1.2.3':
+ optional: true
+
+ '@rolldown/pluginutils@1.0.1': {}
+
+ '@rollup/pluginutils@4.2.1':
+ dependencies:
+ estree-walker: 2.0.2
+ picomatch: 2.3.2
+
+ '@rollup/pluginutils@5.4.0':
+ dependencies:
+ '@types/estree': 1.0.9
+ estree-walker: 2.0.2
+ picomatch: 4.0.5
+
+ '@tsconfig/recommended@1.0.13': {}
+
+ '@types/estree@1.0.9': {}
+
+ babel-plugin-transform-hook-names@1.0.2(@babel/core@7.29.7):
+ dependencies:
+ '@babel/core': 7.29.7
+
+ baseline-browser-mapping@2.11.13: {}
+
+ boolbase@1.0.0: {}
+
+ browserslist@4.28.8:
+ dependencies:
+ baseline-browser-mapping: 2.11.13
+ caniuse-lite: 1.0.30001809
+ electron-to-chromium: 1.5.403
+ node-releases: 2.0.53
+ update-browserslist-db: 1.3.0(browserslist@4.28.8)
+
+ caniuse-lite@1.0.30001809: {}
+
+ convert-source-map@2.0.0: {}
+
+ css-select@5.2.2:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.2.2
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-what@6.2.2: {}
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ detect-libc@2.1.2: {}
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ electron-to-chromium@1.5.403: {}
+
+ entities@4.5.0: {}
+
+ escalade@3.2.0: {}
+
+ estree-walker@2.0.2: {}
+
+ fdir@6.5.0(picomatch@4.0.5):
+ optionalDependencies:
+ picomatch: 4.0.5
+
+ fsevents@2.3.3:
+ optional: true
+
+ gensync@1.0.0-beta.2: {}
+
+ he@1.2.0: {}
+
+ js-tokens@4.0.0: {}
+
+ jsesc@3.1.0: {}
+
+ json5@2.2.3: {}
+
+ kolorist@1.8.0: {}
+
+ lightningcss-android-arm64@1.33.0:
+ optional: true
+
+ lightningcss-darwin-arm64@1.33.0:
+ optional: true
+
+ lightningcss-darwin-x64@1.33.0:
+ optional: true
+
+ lightningcss-freebsd-x64@1.33.0:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.33.0:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.33.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.33.0:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.33.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.33.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.33.0:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.33.0:
+ optional: true
+
+ lightningcss@1.33.0:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.33.0
+ lightningcss-darwin-arm64: 1.33.0
+ lightningcss-darwin-x64: 1.33.0
+ lightningcss-freebsd-x64: 1.33.0
+ lightningcss-linux-arm-gnueabihf: 1.33.0
+ lightningcss-linux-arm64-gnu: 1.33.0
+ lightningcss-linux-arm64-musl: 1.33.0
+ lightningcss-linux-x64-gnu: 1.33.0
+ lightningcss-linux-x64-musl: 1.33.0
+ lightningcss-win32-arm64-msvc: 1.33.0
+ lightningcss-win32-x64-msvc: 1.33.0
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ ms@2.1.3: {}
+
+ nanoid@3.3.18: {}
+
+ node-html-parser@6.1.13:
+ dependencies:
+ css-select: 5.2.2
+ he: 1.2.0
+
+ node-releases@2.0.53: {}
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.2: {}
+
+ picomatch@4.0.5: {}
+
+ postcss@8.5.26:
+ dependencies:
+ nanoid: 3.3.18
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ preact@10.29.8: {}
+
+ react-dom@19.2.8(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+ scheduler: 0.27.0
+
+ react@19.2.8: {}
+
+ reselect@5.2.0: {}
+
+ rolldown@1.2.3:
+ dependencies:
+ '@oxc-project/types': 0.143.0
+ '@rolldown/pluginutils': 1.0.1
+ optionalDependencies:
+ '@rolldown/binding-android-arm64': 1.2.3
+ '@rolldown/binding-darwin-arm64': 1.2.3
+ '@rolldown/binding-darwin-x64': 1.2.3
+ '@rolldown/binding-freebsd-x64': 1.2.3
+ '@rolldown/binding-linux-arm-gnueabihf': 1.2.3
+ '@rolldown/binding-linux-arm64-gnu': 1.2.3
+ '@rolldown/binding-linux-arm64-musl': 1.2.3
+ '@rolldown/binding-linux-ppc64-gnu': 1.2.3
+ '@rolldown/binding-linux-s390x-gnu': 1.2.3
+ '@rolldown/binding-linux-x64-gnu': 1.2.3
+ '@rolldown/binding-linux-x64-musl': 1.2.3
+ '@rolldown/binding-openharmony-arm64': 1.2.3
+ '@rolldown/binding-win32-arm64-msvc': 1.2.3
+ '@rolldown/binding-win32-x64-msvc': 1.2.3
+
+ scheduler@0.27.0: {}
+
+ semver@6.3.1: {}
+
+ simple-code-frame@1.3.0:
+ dependencies:
+ kolorist: 1.8.0
+
+ source-map-js@1.2.1: {}
+
+ source-map@0.7.6: {}
+
+ stack-trace@1.0.0: {}
+
+ temporal-polyfill@1.0.3:
+ dependencies:
+ temporal-spec: 1.0.1
+ temporal-utils: 1.0.1
+
+ temporal-spec@1.0.1: {}
+
+ temporal-utils@1.0.1: {}
+
+ tinyglobby@0.2.17:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.5)
+ picomatch: 4.0.5
+
+ update-browserslist-db@1.3.0(browserslist@4.28.8):
+ dependencies:
+ browserslist: 4.28.8
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ use-sync-external-store@1.6.0(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+
+ vite-prerender-plugin@0.5.13(vite@8.2.1):
+ dependencies:
+ kolorist: 1.8.0
+ magic-string: 0.30.21
+ node-html-parser: 6.1.13
+ simple-code-frame: 1.3.0
+ source-map: 0.7.6
+ stack-trace: 1.0.0
+ vite: 8.2.1
+
+ vite@8.2.1:
+ dependencies:
+ lightningcss: 1.33.0
+ picomatch: 4.0.5
+ postcss: 8.5.26
+ rolldown: 1.2.3
+ tinyglobby: 0.2.17
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ yallist@3.1.1: {}
+
+ zimmerframe@1.1.4: {}
diff --git a/src/app.tsx b/src/app.tsx
new file mode 100644
index 0000000..c602c8f
--- /dev/null
+++ b/src/app.tsx
@@ -0,0 +1,11 @@
+import { Taskbar } from "./taskbar";
+import { Desktop } from "./desktop";
+
+export function App() {
+ return <>
+ <div id="bg"><div></div></div>
+ <div id="bg" class="reverse"><div></div></div>
+ <Desktop />
+ <Taskbar />
+ </>
+}
diff --git a/src/desktop/apps/buttons.tsx b/src/desktop/apps/buttons.tsx
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/desktop/apps/buttons.tsx
diff --git a/src/desktop/apps/edit.tsx b/src/desktop/apps/edit.tsx
new file mode 100644
index 0000000..00aba45
--- /dev/null
+++ b/src/desktop/apps/edit.tsx
@@ -0,0 +1,13 @@
+import { ComponentChildren } from "preact"
+
+export function Edit(props: Edit.Props) {
+ return <textarea autocomplete="off" spellcheck={false}>
+ {props.children}
+ </textarea>
+}
+
+namespace Edit {
+ export type Props = {
+ children?: ComponentChildren
+ }
+}
diff --git a/src/desktop/apps/index.tsx b/src/desktop/apps/index.tsx
new file mode 100644
index 0000000..a2954b6
--- /dev/null
+++ b/src/desktop/apps/index.tsx
@@ -0,0 +1,5 @@
+import { FunctionalComponent } from "preact";
+import { Edit } from "./edit";
+import { Music } from "./music";
+
+export const APP_REGISTRY: Map<string, FunctionalComponent> = new Map();
diff --git a/src/desktop/apps/music.tsx b/src/desktop/apps/music.tsx
new file mode 100644
index 0000000..b5646bd
--- /dev/null
+++ b/src/desktop/apps/music.tsx
@@ -0,0 +1,43 @@
+// type Song = {
+// name: string,
+// url: string,
+// length: number,
+//
+// bc_exclusive: boolean
+// }
+//
+// const SONGS: = [
+// [],
+// [],
+// [],
+// [],
+// [],
+// [],
+// [],
+// [],
+// [],
+// [],
+// []
+// ]
+//
+// function Song() {
+//
+// }
+
+import { useState } from "preact/hooks"
+
+export function Music() {
+ const [userApproves, setUserApproves] = useState(false);
+
+ if (userApproves) {
+ return <iframe style="border: 0; width: 350px; height: 500px;" src="https://bandcamp.com/EmbeddedPlayer/album=3374731395/size=large/bgcol=000000/linkcol=ff0047/transparent=true/" seamless><a href="https://sunnexo.bandcamp.com/album/netpunk">Netpunk by Sunnexo</a></iframe>
+ } else {
+ return <div class="external_warning">
+ <div>Click here to load player from <a href="https://bandcamp.com">https://bandcamp.com</a></div>
+ <button onClick={() => setUserApproves(true)}>
+ Load player
+ </button>
+ </div>
+ }
+}
+
diff --git a/src/desktop/index.tsx b/src/desktop/index.tsx
new file mode 100644
index 0000000..021d3a0
--- /dev/null
+++ b/src/desktop/index.tsx
@@ -0,0 +1,43 @@
+import { useRef } from "preact/hooks"
+import { Edit } from "./apps/edit"
+import { Window } from "./window"
+import { Music } from "./apps/music";
+
+export function Desktop() {
+ const ref = useRef(null);
+ return <div id="desktop" ref={ref}>
+ <div class="icon_grid">
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ </div>
+ <Window title="README.txt" width="30vw" height={300} x={40} y={40} desktop={ref}>
+ <Edit>
+ Fine release by Sunnexo 2026&#10;
+ &#10;
+ Tracklist:&#10;
+ 1. Internet Exploder&#10;
+ 2. Netpunk (feat. Kasane Teto)&#10;
+ 3. Free Download&#10;
+ 4. I am not a Robot&#10;
+ 5. Content&#10;
+ 6. Keygen&#10;
+ 7. Base64&#10;
+ 8. Readme (feat. Kasane Teto)&#10;
+ 9. Symlink&#10;
+ 10. Memory&#10;
+
+ An album about borrowing software forever.&#10;
+
+ A clumsy robot forgets about their girlfriend's anniversary, scrambling to find something to do for the date, eventually concluding they should watch a movie. Of course the movie is in high demand, so the tickets have sold out. Ultimately they resort to piracy, and things spiral out of control... &#10;
+ </Edit>
+ </Window>
+ <Window title="Stream Netpunk" desktop={ref}>
+ <Music />
+ </Window>
+
+ <img id="netpunk" src="/assets/netpunk.png" />
+ </div>
+}
diff --git a/src/desktop/window.tsx b/src/desktop/window.tsx
new file mode 100644
index 0000000..b2deaec
--- /dev/null
+++ b/src/desktop/window.tsx
@@ -0,0 +1,81 @@
+import { ComponentChildren, Ref, RefObject } from "preact";
+import { useCallback, useRef, useState } from "preact/hooks";
+
+export function Window(props: Window.Props) {
+ const windowRef: Ref<HTMLDivElement> = useRef(null);
+ const dragTimeout: Ref<ReturnType<typeof setTimeout>> = useRef(null);
+
+ const [x, setX] = useState(props.x ?? 0);
+ const [y, setY] = useState(props.y ?? 0);
+
+ const initialOffsetX = useRef(0);
+ const initialOffsetY = useRef(0);
+
+ const updatePosition = useCallback((e: MouseEvent) => {
+ setX(e.clientX - initialOffsetX.current)
+ setY(e.clientY - initialOffsetY.current)
+ }, [])
+
+ const startDrag = useCallback((e: MouseEvent) => {
+ if (e.button === 0) {
+
+ const BORDER_WIDTH = 1;
+ console.log(e);
+ // Naturally, I have to add the border width here, because offset* uses padding-edge for the calculations
+ initialOffsetX.current = e.offsetX + BORDER_WIDTH
+ initialOffsetY.current = e.offsetY + BORDER_WIDTH
+ windowRef.current?.classList.add("dragging")
+
+ if (dragTimeout.current !== null) {
+ clearTimeout(dragTimeout.current);
+ dragTimeout.current = null;
+ } else {
+ props.desktop.current?.addEventListener("mousemove", updatePosition)
+ props.desktop.current?.addEventListener("mouseleave", stopDrag)
+ }
+ }
+ }, []);
+
+ const stopDrag = useCallback((e: MouseEvent) => {
+ if (e.button === 0) {
+ dragTimeout.current = setTimeout(() => {
+ dragTimeout.current = null;
+ windowRef.current?.classList.remove("dragging")
+ props.desktop.current?.removeEventListener("mousemove", updatePosition)
+ props.desktop.current?.removeEventListener("mouseleave", stopDrag)
+ }, 50) // intrdouce a small delay where the user can still drag the window without actually pressing down lmb to prevent accidental drops
+ }
+ }, []);
+
+ return <div class="window" ref={windowRef} style={{ width: props.width, height: props.height, left: x, top: y}}>
+ <div class="titlebar" onPointerDown={startDrag} onPointerUp={stopDrag}>
+ <div class="title">{props.title}</div>
+ <div class="buttons" onPointerDown={e => e.stopPropagation()}>
+ <button>
+ <img src="/assets/minimize.png" />
+ </button>
+ <button>
+ <img src="/assets/maximize.png" />
+ </button>
+ <button>
+ <img src="/assets/close.png" />
+ </button>
+ </div>
+ </div>
+ <div class="content">
+ {props.children}
+ </div>
+ </div>
+}
+
+namespace Window {
+ export type Props = {
+ title: string;
+ width?: string | number;
+ height?: string | number;
+ x?: string | number;
+ y?: string | number;
+ desktop: RefObject<HTMLDivElement>;
+ children: ComponentChildren
+ }
+}
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 0000000..43494a2
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,6 @@
+import { render } from "preact";
+import { App } from "./app";
+
+import 'temporal-polyfill/global'
+
+render(<App/>, document.getElementById("root")!);
diff --git a/src/taskbar/index.tsx b/src/taskbar/index.tsx
new file mode 100644
index 0000000..34377c2
--- /dev/null
+++ b/src/taskbar/index.tsx
@@ -0,0 +1,27 @@
+import { StartButton } from "./start"
+import { Time } from "./time"
+
+export function Taskbar() {
+ return <nav>
+ <StartButton />
+ <ul>
+ <li>
+ <button>
+ README.txt
+ </button>
+ </li>
+ <li>
+ <button>
+ KEYGEn
+ </button>
+ </li>
+ <li>
+ <button>
+ Chat
+ </button>
+ </li>
+ </ul>
+ <Time />
+ <div id="netpunk_descender"></div>
+ </nav>
+}
diff --git a/src/taskbar/start.tsx b/src/taskbar/start.tsx
new file mode 100644
index 0000000..ddf6d47
--- /dev/null
+++ b/src/taskbar/start.tsx
@@ -0,0 +1,11 @@
+export function StartButton() {
+ return <div id="start">
+ <button>
+ <img src="/assets/fumo.png" />
+ Start
+ </button>
+ <div>
+ <div></div>
+ </div>
+ </div>
+}
diff --git a/src/taskbar/time.tsx b/src/taskbar/time.tsx
new file mode 100644
index 0000000..053147b
--- /dev/null
+++ b/src/taskbar/time.tsx
@@ -0,0 +1,23 @@
+import { useEffect, useState } from "preact/hooks";
+
+const dateTimeFormat = new Intl.DateTimeFormat();
+const timezoneId = Temporal.Now.timeZoneId();
+
+export function Time() {
+ const [time, setTime] = useState(Temporal.Now.instant().toZonedDateTimeISO(timezoneId))
+
+ useEffect(() => {
+ const id = setInterval(() => {
+ setTime(time => time.add({ seconds: 1 }));
+ }, 1000)
+
+ return () => {
+ clearInterval(id);
+ }
+ }, [])
+
+ return <div id="time">
+ <div>{dateTimeFormat.format(time.toPlainTime())}</div>
+ <div>{dateTimeFormat.format(time.toPlainDate())}</div>
+ </div>
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..be6410d
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "extends": "@tsconfig/recommended/tsconfig.json",
+
+ "compilerOptions": {
+ "target": "es2020",
+ "module": "es2020",
+ "moduleResolution": "bundler",
+ "experimentalDecorators": true,
+ "useDefineForClassFields": false,
+ "noImplicitOverride": true,
+ "types": [],
+ "lib": ["es2020", "dom"],
+ "incremental": true,
+ "skipDefaultLibCheck": true,
+ "allowSyntheticDefaultImports": true,
+ "allowImportingTsExtensions": true,
+ "allowJs": true,
+ "jsx": "preserve",
+ "jsxImportSource": "preact",
+ "paths": {
+ "$/*": ["./src/*"]
+ }
+ }
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..884c99f
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,11 @@
+import { defineConfig } from 'vite'
+import preact from '@preact/preset-vite'
+
+export default defineConfig({
+ plugins: [preact()],
+ server: {
+ watch: {
+ followSymlinks: false,
+ }
+ }
+})