WIP. A little custom music server
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

remove waku app

-2857
-7
web/.gitignore
··· 1 - node_modules 2 - dist 3 - .env* 4 - *.tsbuildinfo 5 - .cache 6 - .DS_Store 7 - *.pem
-24
web/.oxlintrc.json
··· 1 - { 2 - "plugins": ["import"], 3 - "ignorePatterns": ["dist/", "node_modules/"], 4 - "rules": { 5 - "unicorn/prefer-set-has": "warn", 6 - "no-unused-expressions": "warn", 7 - "oxc/bad-bitwise-operator": "error", 8 - "typescript/no-explicit-any": "error", 9 - "typescript/no-namespace": "error", 10 - "typescript/no-require-imports": "error", 11 - "unicorn/no-nested-ternary": "error", 12 - "unicorn/prefer-modern-math-apis": "error", 13 - "import/no-absolute-path": "error", 14 - "no-fallthrough": "error", 15 - "radix": "error", 16 - "unicorn/no-unnecessary-slice-end": "warn", 17 - "unicorn/prefer-array-some": "error", 18 - "unicorn/prefer-math-min-max": "error", 19 - "unicorn/prefer-native-coercion-functions": "error", 20 - "unicorn/require-number-to-fixed-digits-argument": "error", 21 - "curly": "warn", 22 - "oxc/no-barrel-file": "error" 23 - } 24 - }
-10
web/.prettierrc.toml
··· 1 - tabWidth = 4 2 - useTabs = true 3 - printWidth = 120 4 - semi = true 5 - experimentalOperatorPosition = "start" 6 - quoteProps = "consistent" 7 - objectWrap = "preserve" 8 - bracketSameLine = false 9 - 10 - plugins=['@prettier/plugin-oxc']
-826
web/bun.lock
··· 1 - { 2 - "lockfileVersion": 1, 3 - "workspaces": { 4 - "": { 5 - "name": "web", 6 - "dependencies": { 7 - "@radix-ui/react-progress": "^1.1.7", 8 - "@radix-ui/react-slider": "^1.3.6", 9 - "@radix-ui/react-slot": "^1.2.3", 10 - "@unocss/reset": "^66.5.1", 11 - "class-variance-authority": "^0.7.1", 12 - "clsx": "^2.1.1", 13 - "effect": "^3.17.13", 14 - "jotai": "^2.14.0", 15 - "lucide-react": "^0.544.0", 16 - "react": "19.1.1", 17 - "react-dom": "19.1.1", 18 - "react-server-dom-webpack": "19.1.1", 19 - "tailwind-merge": "^3.3.1", 20 - "vite-tsconfig-paths": "^5.1.4", 21 - "waku": "0.26.1", 22 - }, 23 - "devDependencies": { 24 - "@prettier/plugin-oxc": "^0.0.4", 25 - "@tailwindcss/vite": "4.1.13", 26 - "@types/react": "19.1.12", 27 - "@types/react-dom": "19.1.9", 28 - "prettier": "^3.6.2", 29 - "tailwindcss": "4.1.13", 30 - "typescript": "5.9.2", 31 - "unocss": "^66.5.1", 32 - "unocss-preset-animations": "^1.2.1", 33 - "unocss-preset-shadcn": "^1.0.1", 34 - }, 35 - }, 36 - }, 37 - "packages": { 38 - "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], 39 - 40 - "@antfu/utils": ["@antfu/utils@9.2.0", "", {}, "sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw=="], 41 - 42 - "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], 43 - 44 - "@babel/compat-data": ["@babel/compat-data@7.28.4", "", {}, "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw=="], 45 - 46 - "@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], 47 - 48 - "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], 49 - 50 - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], 51 - 52 - "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], 53 - 54 - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], 55 - 56 - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], 57 - 58 - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], 59 - 60 - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], 61 - 62 - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], 63 - 64 - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], 65 - 66 - "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="], 67 - 68 - "@babel/parser": ["@babel/parser@7.27.7", "", { "dependencies": { "@babel/types": "^7.27.7" }, "bin": "./bin/babel-parser.js" }, "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q=="], 69 - 70 - "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], 71 - 72 - "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], 73 - 74 - "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], 75 - 76 - "@babel/traverse": ["@babel/traverse@7.27.7", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.5", "@babel/parser": "^7.27.7", "@babel/template": "^7.27.2", "@babel/types": "^7.27.7", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw=="], 77 - 78 - "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], 79 - 80 - "@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], 81 - 82 - "@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], 83 - 84 - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], 85 - 86 - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="], 87 - 88 - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="], 89 - 90 - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.9", "", { "os": "android", "cpu": "arm64" }, "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg=="], 91 - 92 - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.9", "", { "os": "android", "cpu": "x64" }, "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw=="], 93 - 94 - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg=="], 95 - 96 - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ=="], 97 - 98 - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q=="], 99 - 100 - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg=="], 101 - 102 - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.9", "", { "os": "linux", "cpu": "arm" }, "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw=="], 103 - 104 - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw=="], 105 - 106 - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.9", "", { "os": "linux", "cpu": "ia32" }, "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A=="], 107 - 108 - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ=="], 109 - 110 - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA=="], 111 - 112 - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w=="], 113 - 114 - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg=="], 115 - 116 - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA=="], 117 - 118 - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.9", "", { "os": "linux", "cpu": "x64" }, "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg=="], 119 - 120 - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q=="], 121 - 122 - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.9", "", { "os": "none", "cpu": "x64" }, "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g=="], 123 - 124 - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.9", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ=="], 125 - 126 - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.9", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA=="], 127 - 128 - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg=="], 129 - 130 - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.9", "", { "os": "sunos", "cpu": "x64" }, "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw=="], 131 - 132 - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ=="], 133 - 134 - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww=="], 135 - 136 - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.9", "", { "os": "win32", "cpu": "x64" }, "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ=="], 137 - 138 - "@hono/node-server": ["@hono/node-server@1.19.1", "", { "peerDependencies": { "hono": "^4" } }, "sha512-h44e5s+ByUriaRIbeS/C74O8v90m0A95luyYQGMF7KEn96KkYMXO7bZAwombzTpjQTU4e0TkU8U1WBIXlwuwtA=="], 139 - 140 - "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], 141 - 142 - "@iconify/utils": ["@iconify/utils@3.0.1", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@antfu/utils": "^9.2.0", "@iconify/types": "^2.0.0", "debug": "^4.4.1", "globals": "^15.15.0", "kolorist": "^1.8.0", "local-pkg": "^1.1.1", "mlly": "^1.7.4" } }, "sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw=="], 143 - 144 - "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], 145 - 146 - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], 147 - 148 - "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], 149 - 150 - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], 151 - 152 - "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], 153 - 154 - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], 155 - 156 - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], 157 - 158 - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], 159 - 160 - "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.74.0", "", { "os": "android", "cpu": "arm64" }, "sha512-lgq8TJq22eyfojfa2jBFy2m66ckAo7iNRYDdyn9reXYA3I6Wx7tgGWVx1JAp1lO+aUiqdqP/uPlDaETL9tqRcg=="], 161 - 162 - "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.74.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xbY/io/hkARggbpYEMFX6CwFzb7f4iS6WuBoBeZtdqRWfIEi7sm/uYWXfyVeB8uqOATvJ07WRFC2upI8PSI83g=="], 163 - 164 - "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.74.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-FIj2gAGtFaW0Zk+TnGyenMUoRu1ju+kJ/h71D77xc1owOItbFZFGa+4WSVck1H8rTtceeJlK+kux+vCjGFCl9Q=="], 165 - 166 - "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.74.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-W1I+g5TJg0TRRMHgEWNWsTIfe782V3QuaPgZxnfPNmDMywYdtlzllzclBgaDq6qzvZCCQc/UhvNb37KWTCTj8A=="], 167 - 168 - "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.74.0", "", { "os": "linux", "cpu": "arm" }, "sha512-gxqkyRGApeVI8dgvJ19SYe59XASW3uVxF1YUgkE7peW/XIg5QRAOVTFKyTjI9acYuK1MF6OJHqx30cmxmZLtiQ=="], 169 - 170 - "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.74.0", "", { "os": "linux", "cpu": "arm" }, "sha512-jpnAUP4Fa93VdPPDzxxBguJmldj/Gpz7wTXKFzpAueqBMfZsy9KNC+0qT2uZ9HGUDMzNuKw0Se3bPCpL/gfD2Q=="], 171 - 172 - "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.74.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-fcWyM7BNfCkHqIf3kll8fJctbR/PseL4RnS2isD9Y3FFBhp4efGAzhDaxIUK5GK7kIcFh1P+puIRig8WJ6IMVQ=="], 173 - 174 - "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.74.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-AMY30z/C77HgiRRJX7YtVUaelKq1ex0aaj28XoJu4SCezdS8i0IftUNTtGS1UzGjGZB8zQz5SFwVy4dRu4GLwg=="], 175 - 176 - "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.74.0", "", { "os": "linux", "cpu": "none" }, "sha512-/RZAP24TgZo4vV/01TBlzRqs0R7E6xvatww4LnmZEBBulQBU/SkypDywfriFqWuFoa61WFXPV7sLcTjJGjim/w=="], 177 - 178 - "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.74.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-620J1beNAlGSPBD+Msb3ptvrwxu04B8iULCH03zlf0JSLy/5sqlD6qBs0XUVkUJv1vbakUw1gfVnUQqv0UTuEg=="], 179 - 180 - "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.74.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WBFgQmGtFnPNzHyLKbC1wkYGaRIBxXGofO0+hz1xrrkPgbxbJS1Ukva1EB8sPaVBBQ52Bdc2GjLSp721NWRvww=="], 181 - 182 - "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.74.0", "", { "os": "linux", "cpu": "x64" }, "sha512-y4mapxi0RGqlp3t6Sm+knJlAEqdKDYrEue2LlXOka/F2i4sRN0XhEMPiSOB3ppHmvK4I2zY2XBYTsX1Fel0fAg=="], 183 - 184 - "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.74.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-yDS9bRDh5ymobiS2xBmjlrGdUuU61IZoJBaJC5fELdYT5LJNBXlbr3Yc6m2PWfRJwkH6Aq5fRvxAZ4wCbkGa8w=="], 185 - 186 - "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.74.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-XFWY52Rfb4N5wEbMCTSBMxRkDLGbAI9CBSL24BIDywwDJMl31gHEVlmHdCDRoXAmanCI6gwbXYTrWe0HvXJ7Aw=="], 187 - 188 - "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.74.0", "", { "os": "win32", "cpu": "x64" }, "sha512-1D3x6iU2apLyfTQHygbdaNbX3nZaHu4yaXpD7ilYpoLo7f0MX0tUuoDrqJyJrVGqvyXgc0uz4yXz9tH9ZZhvvg=="], 189 - 190 - "@oxc-project/types": ["@oxc-project/types@0.74.0", "", {}, "sha512-KOw/RZrVlHGhCXh1RufBFF7Nuo7HdY5w1lRJukM/igIl6x9qtz8QycDvZdzb4qnHO7znrPyo2sJrFJK2eKHgfQ=="], 191 - 192 - "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], 193 - 194 - "@prettier/plugin-oxc": ["@prettier/plugin-oxc@0.0.4", "", { "dependencies": { "oxc-parser": "0.74.0" } }, "sha512-UGXe+g/rSRbglL0FOJiar+a+nUrst7KaFmsg05wYbKiInGWP6eAj/f8A2Uobgo5KxEtb2X10zeflNH6RK2xeIQ=="], 195 - 196 - "@quansync/fs": ["@quansync/fs@0.1.5", "", { "dependencies": { "quansync": "^0.2.11" } }, "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA=="], 197 - 198 - "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], 199 - 200 - "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], 201 - 202 - "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], 203 - 204 - "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], 205 - 206 - "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], 207 - 208 - "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], 209 - 210 - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 211 - 212 - "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.7", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg=="], 213 - 214 - "@radix-ui/react-slider": ["@radix-ui/react-slider@1.3.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw=="], 215 - 216 - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 217 - 218 - "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], 219 - 220 - "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], 221 - 222 - "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], 223 - 224 - "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], 225 - 226 - "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], 227 - 228 - "@remix-run/node-fetch-server": ["@remix-run/node-fetch-server@0.8.1", "", {}, "sha512-J1dev372wtJqmqn9U/qbpbZxbJSQrogNN2+Qv1lKlpATpe/WQ9aCZfl/xSb9d2Rgh1IyLSvNxZAXPZxruO6Xig=="], 229 - 230 - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.34", "", {}, "sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA=="], 231 - 232 - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.50.1", "", { "os": "android", "cpu": "arm" }, "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag=="], 233 - 234 - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.50.1", "", { "os": "android", "cpu": "arm64" }, "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw=="], 235 - 236 - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.50.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw=="], 237 - 238 - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.50.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw=="], 239 - 240 - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.50.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA=="], 241 - 242 - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.50.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ=="], 243 - 244 - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg=="], 245 - 246 - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw=="], 247 - 248 - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw=="], 249 - 250 - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w=="], 251 - 252 - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q=="], 253 - 254 - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.50.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q=="], 255 - 256 - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ=="], 257 - 258 - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg=="], 259 - 260 - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.50.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg=="], 261 - 262 - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA=="], 263 - 264 - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg=="], 265 - 266 - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.50.1", "", { "os": "none", "cpu": "arm64" }, "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA=="], 267 - 268 - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.50.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ=="], 269 - 270 - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.50.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A=="], 271 - 272 - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.50.1", "", { "os": "win32", "cpu": "x64" }, "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA=="], 273 - 274 - "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], 275 - 276 - "@swc/core": ["@swc/core@1.13.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.24" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.13.5", "@swc/core-darwin-x64": "1.13.5", "@swc/core-linux-arm-gnueabihf": "1.13.5", "@swc/core-linux-arm64-gnu": "1.13.5", "@swc/core-linux-arm64-musl": "1.13.5", "@swc/core-linux-x64-gnu": "1.13.5", "@swc/core-linux-x64-musl": "1.13.5", "@swc/core-win32-arm64-msvc": "1.13.5", "@swc/core-win32-ia32-msvc": "1.13.5", "@swc/core-win32-x64-msvc": "1.13.5" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ=="], 277 - 278 - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.13.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ=="], 279 - 280 - "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.13.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng=="], 281 - 282 - "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.13.5", "", { "os": "linux", "cpu": "arm" }, "sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ=="], 283 - 284 - "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.13.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw=="], 285 - 286 - "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.13.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ=="], 287 - 288 - "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.13.5", "", { "os": "linux", "cpu": "x64" }, "sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA=="], 289 - 290 - "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.13.5", "", { "os": "linux", "cpu": "x64" }, "sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q=="], 291 - 292 - "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.13.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw=="], 293 - 294 - "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.13.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw=="], 295 - 296 - "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.13.5", "", { "os": "win32", "cpu": "x64" }, "sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q=="], 297 - 298 - "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], 299 - 300 - "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], 301 - 302 - "@tailwindcss/node": ["@tailwindcss/node@4.1.13", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.5.1", "lightningcss": "1.30.1", "magic-string": "^0.30.18", "source-map-js": "^1.2.1", "tailwindcss": "4.1.13" } }, "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw=="], 303 - 304 - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.13", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.13", "@tailwindcss/oxide-darwin-arm64": "4.1.13", "@tailwindcss/oxide-darwin-x64": "4.1.13", "@tailwindcss/oxide-freebsd-x64": "4.1.13", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", "@tailwindcss/oxide-linux-arm64-musl": "4.1.13", "@tailwindcss/oxide-linux-x64-gnu": "4.1.13", "@tailwindcss/oxide-linux-x64-musl": "4.1.13", "@tailwindcss/oxide-wasm32-wasi": "4.1.13", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", "@tailwindcss/oxide-win32-x64-msvc": "4.1.13" } }, "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA=="], 305 - 306 - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.13", "", { "os": "android", "cpu": "arm64" }, "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew=="], 307 - 308 - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ=="], 309 - 310 - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw=="], 311 - 312 - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.13", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ=="], 313 - 314 - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13", "", { "os": "linux", "cpu": "arm" }, "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw=="], 315 - 316 - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ=="], 317 - 318 - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg=="], 319 - 320 - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.13", "", { "os": "linux", "cpu": "x64" }, "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ=="], 321 - 322 - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.13", "", { "os": "linux", "cpu": "x64" }, "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ=="], 323 - 324 - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.13", "", { "dependencies": { "@emnapi/core": "^1.4.5", "@emnapi/runtime": "^1.4.5", "@emnapi/wasi-threads": "^1.0.4", "@napi-rs/wasm-runtime": "^0.2.12", "@tybys/wasm-util": "^0.10.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA=="], 325 - 326 - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg=="], 327 - 328 - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.13", "", { "os": "win32", "cpu": "x64" }, "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw=="], 329 - 330 - "@tailwindcss/vite": ["@tailwindcss/vite@4.1.13", "", { "dependencies": { "@tailwindcss/node": "4.1.13", "@tailwindcss/oxide": "4.1.13", "tailwindcss": "4.1.13" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ=="], 331 - 332 - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 333 - 334 - "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], 335 - 336 - "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], 337 - 338 - "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], 339 - 340 - "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], 341 - 342 - "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], 343 - 344 - "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], 345 - 346 - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], 347 - 348 - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], 349 - 350 - "@types/node": ["@types/node@24.3.3", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-GKBNHjoNw3Kra1Qg5UXttsY5kiWMEfoHq2TmXb+b1rcm6N7B3wTrFYIf/oSZ1xNQ+hVVijgLkiDZh7jRRsh+Gw=="], 351 - 352 - "@types/react": ["@types/react@19.1.12", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w=="], 353 - 354 - "@types/react-dom": ["@types/react-dom@19.1.9", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ=="], 355 - 356 - "@unocss/astro": ["@unocss/astro@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "@unocss/reset": "66.5.1", "@unocss/vite": "66.5.1" }, "peerDependencies": { "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" }, "optionalPeers": ["vite"] }, "sha512-f17+xfyBZ9prFx4jda3D9ngOigjO8btHsR3uG7WeDQPW6OBdhETfIGdXs8WD99J/3A3LJtk7J0u9p121S+RE8Q=="], 357 - 358 - "@unocss/cli": ["@unocss/cli@66.5.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "@unocss/config": "66.5.1", "@unocss/core": "66.5.1", "@unocss/preset-uno": "66.5.1", "cac": "^6.7.14", "chokidar": "^3.6.0", "colorette": "^2.0.20", "consola": "^3.4.2", "magic-string": "^0.30.18", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "tinyglobby": "^0.2.14", "unplugin-utils": "^0.3.0" }, "bin": { "unocss": "bin/unocss.mjs" } }, "sha512-b9fTS6b7lqTmeftDkZyjkJiC1LoCKzCB4vuX/VdqoHd0QWh02i6ppsfe6C69fMlzOrju01H7CL0Bpad0JzBr2A=="], 359 - 360 - "@unocss/config": ["@unocss/config@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "unconfig": "^7.3.3" } }, "sha512-eL9P+WDX42B6ZkNGGSkMgOyR99xeuJ2Gkj0uarhag5kaRwvwHLn/CJptZ7/oZLLIn0uTH8TQ6MG8ErhK0ymewA=="], 361 - 362 - "@unocss/core": ["@unocss/core@66.5.1", "", {}, "sha512-BUgN87sUIffco1d+1IuV4a1gKTI1YAFa7CTjxglLUAnopXPPJ+Q77G10zoBoFLzutiIOYLsesa3hzbQvDhosnA=="], 363 - 364 - "@unocss/extractor-arbitrary-variants": ["@unocss/extractor-arbitrary-variants@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1" } }, "sha512-SpI2uv6bWyPyY3Tv7CxsFnHBjSTlNRcPCnfvD8gSKbAt7R+RqV0nrdkv7wSW+Woc5TYl8PClLEFSBIvo0c1h9Q=="], 365 - 366 - "@unocss/inspector": ["@unocss/inspector@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "@unocss/rule-utils": "66.5.1", "colorette": "^2.0.20", "gzip-size": "^6.0.0", "sirv": "^3.0.1", "vue-flow-layout": "^0.2.0" } }, "sha512-EyHcEM9BPZACJhl9YoTlgc/5i4as9MQ4zwaThAXbXoO9l+IfxdNrJoy3ED8qqkKLO5jgzyhPvy1COBdaoSlxsg=="], 367 - 368 - "@unocss/postcss": ["@unocss/postcss@66.5.1", "", { "dependencies": { "@unocss/config": "66.5.1", "@unocss/core": "66.5.1", "@unocss/rule-utils": "66.5.1", "css-tree": "^3.1.0", "postcss": "^8.5.6", "tinyglobby": "^0.2.14" } }, "sha512-waJSgjJv14cbbaA3fj0kgDid+e851KfArqx1l5/c2km3g9tiPZhSiY3Z7YslwMyM9CKRC8+qN8AWYB9l4YJrFw=="], 369 - 370 - "@unocss/preset-attributify": ["@unocss/preset-attributify@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1" } }, "sha512-lRTwtg9y+f9c6OlRiiPrXrBco2r9SwVxNvzJ27Kc/DhJl3fphuMQuKWsZyiq1qsDVYZeGz4NQzE1FDKqFi4qqQ=="], 371 - 372 - "@unocss/preset-icons": ["@unocss/preset-icons@66.5.1", "", { "dependencies": { "@iconify/utils": "^3.0.1", "@unocss/core": "66.5.1", "ofetch": "^1.4.1" } }, "sha512-vxlnPSzTaQZmLKcmVPhCWC6rpgpHCUSD7aFsn7jW3iZ/jTIwc4kgQjnOJZdL443LF5mxBqF15+Cm9hZRnvrWNw=="], 373 - 374 - "@unocss/preset-mini": ["@unocss/preset-mini@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "@unocss/extractor-arbitrary-variants": "66.5.1", "@unocss/rule-utils": "66.5.1" } }, "sha512-kBEbA0kEXRtoHQ98o4b6f9sp1u5BanPzi+GMnWdmOWvbLAiLw1vcgXGPTX3sO+gzIMrwu0Famw6xiztWzAFjWQ=="], 375 - 376 - "@unocss/preset-tagify": ["@unocss/preset-tagify@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1" } }, "sha512-94dVIqfTT3Nfs+g9XnOC/oZuVsiSp8zR36wA/Uucvg3n1zIo2wg6qokghfh7ee8aYNdTqnV7extlnCMJp0TFJQ=="], 377 - 378 - "@unocss/preset-typography": ["@unocss/preset-typography@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "@unocss/rule-utils": "66.5.1" } }, "sha512-5gmv/BN3WbwlZJuoC5qyToK7ufbnmXEszj6+3Rgtto4ptpyizBtJybyZe025ypcmExne3MwMpGWMmQPE5MzKgw=="], 379 - 380 - "@unocss/preset-uno": ["@unocss/preset-uno@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "@unocss/preset-wind3": "66.5.1" } }, "sha512-nUjh1XMChHpVJng5zJhYXXZcXxVDfmh2dxdZS4DgKQ08F8HdvFXmZV+sJrrw6JdeUtpDytelLFJbA8ejmxHYhA=="], 381 - 382 - "@unocss/preset-web-fonts": ["@unocss/preset-web-fonts@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "ofetch": "^1.4.1" } }, "sha512-XKrkoN7ncqJxRHDMxAqTCroBcqSPgryDUZIlLhhQ4mHilSp29AdYO1RgG6Ok04w9HNmqzo3d8A8v6Z5yGrGF0w=="], 383 - 384 - "@unocss/preset-wind": ["@unocss/preset-wind@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "@unocss/preset-wind3": "66.5.1" } }, "sha512-YucMFPBa3Gwuxdtk+GlqWWcnCwMpzUJWkiB3BNyGk4wEJ0S/brkC+t1/DKpagOFLK9bc134mLxqLNDMWJwVbrg=="], 385 - 386 - "@unocss/preset-wind3": ["@unocss/preset-wind3@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "@unocss/preset-mini": "66.5.1", "@unocss/rule-utils": "66.5.1" } }, "sha512-L1yMmKpwUWYUnScQq5jMTGvfMy/GBqVj40VS5afyOlzWnBeSkc/y4AxeW/khzGwqE/QaFcLWXiXwQVJIyxN02Q=="], 387 - 388 - "@unocss/preset-wind4": ["@unocss/preset-wind4@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "@unocss/extractor-arbitrary-variants": "66.5.1", "@unocss/rule-utils": "66.5.1" } }, "sha512-i6UaZ/hRabu+bvEwUJcc3k/v/tF1sjKukvtQF027zaL3Q5k5QKKhDH989wVHU1k+i+W77+og2/K9+FzXN9+CzQ=="], 389 - 390 - "@unocss/reset": ["@unocss/reset@66.5.1", "", {}, "sha512-NXDjDUn3cjATkxr7bbPdVnKkUHzEq6wSC1IRpnO8ISAXCw6JGPjuk3WJVYxHhnAlszhDxdqxVBjWRZ+zzVmrZw=="], 391 - 392 - "@unocss/rule-utils": ["@unocss/rule-utils@66.5.1", "", { "dependencies": { "@unocss/core": "^66.5.1", "magic-string": "^0.30.18" } }, "sha512-GuBKHrDv3bdq5N1HfOr1tD864vI1EIiovBVJSfg7x9ERA4jJSnyMpGk/hbLuDIXF25EnVdZ1lFhEpJgur9+9sw=="], 393 - 394 - "@unocss/transformer-attributify-jsx": ["@unocss/transformer-attributify-jsx@66.5.1", "", { "dependencies": { "@babel/parser": "7.27.7", "@babel/traverse": "7.27.7", "@unocss/core": "66.5.1" } }, "sha512-uj3W0zSY6LyRFusqeIEj8VUy6WDbIhNMUajIHRulKdSqufFMxiymn6JLGriz7ArFRXBKBBmbN+kk6Fqi9gF6JA=="], 395 - 396 - "@unocss/transformer-compile-class": ["@unocss/transformer-compile-class@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1" } }, "sha512-dEfXxWLt3lbMW85CI2yi0S/fQHcSZ32s9FSfGS3KPxFTJ3EY7tYYesT1bdzVrSm+o7J8Os42E5AiFFPjhiTN6Q=="], 397 - 398 - "@unocss/transformer-directives": ["@unocss/transformer-directives@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1", "@unocss/rule-utils": "66.5.1", "css-tree": "^3.1.0" } }, "sha512-+SErDMglrTI3NTaY8GYh2fCalXNIQDahf7b2AaBCiOf+SPPXeicIy04/1nx8cJ/qpsJ4Z4+ZBybFlATVSkInyQ=="], 399 - 400 - "@unocss/transformer-variant-group": ["@unocss/transformer-variant-group@66.5.1", "", { "dependencies": { "@unocss/core": "66.5.1" } }, "sha512-ykUIXExfSCrmex0f8OvS4hYZ4M0EbinosW86xLKwc2GGcbWD6CwqyxxpVWgXSzcc2sIELuqF+K3oZnIlQt3Dug=="], 401 - 402 - "@unocss/vite": ["@unocss/vite@66.5.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "@unocss/config": "66.5.1", "@unocss/core": "66.5.1", "@unocss/inspector": "66.5.1", "chokidar": "^3.6.0", "magic-string": "^0.30.18", "pathe": "^2.0.3", "tinyglobby": "^0.2.14", "unplugin-utils": "^0.3.0" }, "peerDependencies": { "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" } }, "sha512-qcZMh+SZbKYfTjJC2CP6B9Zxg0jlfhJSDVmXdjQBlUzhQR9FllnwlBdae6SCVFBc634Sm+pBJIri5ShPLvwq+Q=="], 403 - 404 - "@vitejs/plugin-react": ["@vitejs/plugin-react@5.0.2", "", { "dependencies": { "@babel/core": "^7.28.3", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.34", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw=="], 405 - 406 - "@vitejs/plugin-rsc": ["@vitejs/plugin-rsc@0.4.29", "", { "dependencies": { "@remix-run/node-fetch-server": "^0.8.0", "es-module-lexer": "^1.7.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.18", "periscopic": "^4.0.2", "turbo-stream": "^3.1.0", "vitefu": "^1.1.1" }, "peerDependencies": { "react": "*", "react-dom": "*", "vite": "*" } }, "sha512-sNR86RuKfk0KQ8H3Ustmp1GC9ABmWyJo736WqCtaipH8mfnxDO2c9gvm+q24yoESerOlNI/zHkCGX8vGm00NCw=="], 407 - 408 - "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], 409 - 410 - "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], 411 - 412 - "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="], 413 - 414 - "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="], 415 - 416 - "@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="], 417 - 418 - "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="], 419 - 420 - "@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/wasm-gen": "1.14.1" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="], 421 - 422 - "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="], 423 - 424 - "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="], 425 - 426 - "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="], 427 - 428 - "@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/helper-wasm-section": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-opt": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1", "@webassemblyjs/wast-printer": "1.14.1" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="], 429 - 430 - "@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="], 431 - 432 - "@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="], 433 - 434 - "@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="], 435 - 436 - "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="], 437 - 438 - "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="], 439 - 440 - "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], 441 - 442 - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], 443 - 444 - "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], 445 - 446 - "acorn-loose": ["acorn-loose@8.5.2", "", { "dependencies": { "acorn": "^8.15.0" } }, "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A=="], 447 - 448 - "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], 449 - 450 - "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], 451 - 452 - "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], 453 - 454 - "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], 455 - 456 - "baseline-browser-mapping": ["baseline-browser-mapping@2.8.3", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-mcE+Wr2CAhHNWxXN/DdTI+n4gsPc5QpXpWnyCQWiQYIYZX+ZMJ8juXZgjRa/0/YPJo/NSsgW15/YgmI4nbysYw=="], 457 - 458 - "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], 459 - 460 - "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 461 - 462 - "browserslist": ["browserslist@4.26.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.2", "caniuse-lite": "^1.0.30001741", "electron-to-chromium": "^1.5.218", "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A=="], 463 - 464 - "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], 465 - 466 - "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], 467 - 468 - "caniuse-lite": ["caniuse-lite@1.0.30001741", "", {}, "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw=="], 469 - 470 - "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], 471 - 472 - "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], 473 - 474 - "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], 475 - 476 - "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], 477 - 478 - "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], 479 - 480 - "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], 481 - 482 - "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], 483 - 484 - "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], 485 - 486 - "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], 487 - 488 - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], 489 - 490 - "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], 491 - 492 - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], 493 - 494 - "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], 495 - 496 - "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], 497 - 498 - "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], 499 - 500 - "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], 501 - 502 - "dotenv": ["dotenv@17.2.2", "", {}, "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q=="], 503 - 504 - "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], 505 - 506 - "effect": ["effect@3.17.13", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-JMz5oBxs/6mu4FP9Csjub4jYMUwMLrp+IzUmSDVIzn2NoeoyOXMl7x1lghfr3dLKWffWrdnv/d8nFFdgrHXPqw=="], 507 - 508 - "electron-to-chromium": ["electron-to-chromium@1.5.218", "", {}, "sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg=="], 509 - 510 - "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], 511 - 512 - "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], 513 - 514 - "esbuild": ["esbuild@0.25.9", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="], 515 - 516 - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], 517 - 518 - "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], 519 - 520 - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], 521 - 522 - "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], 523 - 524 - "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], 525 - 526 - "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], 527 - 528 - "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], 529 - 530 - "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], 531 - 532 - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 533 - 534 - "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], 535 - 536 - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], 537 - 538 - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 539 - 540 - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 541 - 542 - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], 543 - 544 - "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 545 - 546 - "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], 547 - 548 - "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], 549 - 550 - "globrex": ["globrex@0.1.2", "", {}, "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="], 551 - 552 - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 553 - 554 - "gzip-size": ["gzip-size@6.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q=="], 555 - 556 - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], 557 - 558 - "hono": ["hono@4.9.6", "", {}, "sha512-doVjXhSFvYZ7y0dNokjwwSahcrAfdz+/BCLvAMa/vHLzjj8+CFyV5xteThGUsKdkaasgN+gF2mUxao+SGLpUeA=="], 559 - 560 - "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], 561 - 562 - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 563 - 564 - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 565 - 566 - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 567 - 568 - "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], 569 - 570 - "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], 571 - 572 - "jiti": ["jiti@2.5.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w=="], 573 - 574 - "jotai": ["jotai@2.14.0", "", { "peerDependencies": { "@babel/core": ">=7.0.0", "@babel/template": ">=7.0.0", "@types/react": ">=17.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@babel/core", "@babel/template", "@types/react", "react"] }, "sha512-JQkNkTnqjk1BlSUjHfXi+pGG/573bVN104gp6CymhrWDseZGDReTNniWrLhJ+zXbM6pH+82+UNJ2vwYQUkQMWQ=="], 575 - 576 - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], 577 - 578 - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], 579 - 580 - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], 581 - 582 - "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], 583 - 584 - "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], 585 - 586 - "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="], 587 - 588 - "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], 589 - 590 - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], 591 - 592 - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], 593 - 594 - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], 595 - 596 - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], 597 - 598 - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], 599 - 600 - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], 601 - 602 - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], 603 - 604 - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], 605 - 606 - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], 607 - 608 - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], 609 - 610 - "loader-runner": ["loader-runner@4.3.0", "", {}, "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="], 611 - 612 - "local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], 613 - 614 - "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 615 - 616 - "lucide-react": ["lucide-react@0.544.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-t5tS44bqd825zAW45UQxpG2CvcC4urOwn2TrwSH8u+MjeE+1NnWl6QqeQ/6NdjMqdOygyiT9p3Ev0p1NJykxjw=="], 617 - 618 - "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], 619 - 620 - "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="], 621 - 622 - "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], 623 - 624 - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], 625 - 626 - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], 627 - 628 - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], 629 - 630 - "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], 631 - 632 - "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], 633 - 634 - "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], 635 - 636 - "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], 637 - 638 - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 639 - 640 - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 641 - 642 - "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], 643 - 644 - "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], 645 - 646 - "node-releases": ["node-releases@2.0.21", "", {}, "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw=="], 647 - 648 - "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], 649 - 650 - "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], 651 - 652 - "oxc-parser": ["oxc-parser@0.74.0", "", { "dependencies": { "@oxc-project/types": "^0.74.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm64": "0.74.0", "@oxc-parser/binding-darwin-arm64": "0.74.0", "@oxc-parser/binding-darwin-x64": "0.74.0", "@oxc-parser/binding-freebsd-x64": "0.74.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.74.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.74.0", "@oxc-parser/binding-linux-arm64-gnu": "0.74.0", "@oxc-parser/binding-linux-arm64-musl": "0.74.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.74.0", "@oxc-parser/binding-linux-s390x-gnu": "0.74.0", "@oxc-parser/binding-linux-x64-gnu": "0.74.0", "@oxc-parser/binding-linux-x64-musl": "0.74.0", "@oxc-parser/binding-wasm32-wasi": "0.74.0", "@oxc-parser/binding-win32-arm64-msvc": "0.74.0", "@oxc-parser/binding-win32-x64-msvc": "0.74.0" } }, "sha512-2tDN/ttU8WE6oFh8EzKNam7KE7ZXSG5uXmvX85iNzxdJfMssDWcj3gpYzZi1E04XuE7m3v1dVWl/8BE886vPGw=="], 653 - 654 - "package-manager-detector": ["package-manager-detector@1.3.0", "", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="], 655 - 656 - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], 657 - 658 - "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], 659 - 660 - "periscopic": ["periscopic@4.0.2", "", { "dependencies": { "@types/estree": "*", "is-reference": "^3.0.2", "zimmerframe": "^1.0.0" } }, "sha512-sqpQDUy8vgB7ycLkendSKS6HnVz1Rneoc3Rc+ZBUCe2pbqlVuCC5vF52l0NJ1aiMg/r1qfYF9/myz8CZeI2rjA=="], 661 - 662 - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 663 - 664 - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], 665 - 666 - "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], 667 - 668 - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], 669 - 670 - "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], 671 - 672 - "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], 673 - 674 - "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], 675 - 676 - "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], 677 - 678 - "react": ["react@19.1.1", "", {}, "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ=="], 679 - 680 - "react-dom": ["react-dom@19.1.1", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.1" } }, "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw=="], 681 - 682 - "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], 683 - 684 - "react-server-dom-webpack": ["react-server-dom-webpack@19.1.1", "", { "dependencies": { "acorn-loose": "^8.3.0", "neo-async": "^2.6.1", "webpack-sources": "^3.2.0" }, "peerDependencies": { "react": "^19.1.1", "react-dom": "^19.1.1", "webpack": "^5.59.0" } }, "sha512-6MJwCAgQKcNxzRQebeyDspWzcncJMxe7JfmA8OFHWCMtp6L++HyJMgScM492iIeQZln3C834HyG4/UeMMZeRMw=="], 685 - 686 - "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], 687 - 688 - "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], 689 - 690 - "rollup": ["rollup@4.50.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.50.1", "@rollup/rollup-android-arm64": "4.50.1", "@rollup/rollup-darwin-arm64": "4.50.1", "@rollup/rollup-darwin-x64": "4.50.1", "@rollup/rollup-freebsd-arm64": "4.50.1", "@rollup/rollup-freebsd-x64": "4.50.1", "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", "@rollup/rollup-linux-arm-musleabihf": "4.50.1", "@rollup/rollup-linux-arm64-gnu": "4.50.1", "@rollup/rollup-linux-arm64-musl": "4.50.1", "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", "@rollup/rollup-linux-ppc64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-musl": "4.50.1", "@rollup/rollup-linux-s390x-gnu": "4.50.1", "@rollup/rollup-linux-x64-gnu": "4.50.1", "@rollup/rollup-linux-x64-musl": "4.50.1", "@rollup/rollup-openharmony-arm64": "4.50.1", "@rollup/rollup-win32-arm64-msvc": "4.50.1", "@rollup/rollup-win32-ia32-msvc": "4.50.1", "@rollup/rollup-win32-x64-msvc": "4.50.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA=="], 691 - 692 - "rsc-html-stream": ["rsc-html-stream@0.0.7", "", {}, "sha512-v9+fuY7usTgvXdNl8JmfXCvSsQbq2YMd60kOeeMIqCJFZ69fViuIxztHei7v5mlMMa2h3SqS+v44Gu9i9xANZA=="], 693 - 694 - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], 695 - 696 - "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], 697 - 698 - "schema-utils": ["schema-utils@4.3.2", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ=="], 699 - 700 - "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 701 - 702 - "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], 703 - 704 - "sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="], 705 - 706 - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], 707 - 708 - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], 709 - 710 - "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], 711 - 712 - "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], 713 - 714 - "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="], 715 - 716 - "tailwindcss": ["tailwindcss@4.1.13", "", {}, "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w=="], 717 - 718 - "tapable": ["tapable@2.2.3", "", {}, "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg=="], 719 - 720 - "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], 721 - 722 - "terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], 723 - 724 - "terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="], 725 - 726 - "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], 727 - 728 - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], 729 - 730 - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 731 - 732 - "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], 733 - 734 - "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], 735 - 736 - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 737 - 738 - "turbo-stream": ["turbo-stream@3.1.0", "", {}, "sha512-tVI25WEXl4fckNEmrq70xU1XumxUwEx/FZD5AgEcV8ri7Wvrg2o7GEq8U7htrNx3CajciGm+kDyhRf5JB6t7/A=="], 739 - 740 - "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], 741 - 742 - "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], 743 - 744 - "unconfig": ["unconfig@7.3.3", "", { "dependencies": { "@quansync/fs": "^0.1.5", "defu": "^6.1.4", "jiti": "^2.5.1", "quansync": "^0.2.11" } }, "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA=="], 745 - 746 - "undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="], 747 - 748 - "unocss": ["unocss@66.5.1", "", { "dependencies": { "@unocss/astro": "66.5.1", "@unocss/cli": "66.5.1", "@unocss/core": "66.5.1", "@unocss/postcss": "66.5.1", "@unocss/preset-attributify": "66.5.1", "@unocss/preset-icons": "66.5.1", "@unocss/preset-mini": "66.5.1", "@unocss/preset-tagify": "66.5.1", "@unocss/preset-typography": "66.5.1", "@unocss/preset-uno": "66.5.1", "@unocss/preset-web-fonts": "66.5.1", "@unocss/preset-wind": "66.5.1", "@unocss/preset-wind3": "66.5.1", "@unocss/preset-wind4": "66.5.1", "@unocss/transformer-attributify-jsx": "66.5.1", "@unocss/transformer-compile-class": "66.5.1", "@unocss/transformer-directives": "66.5.1", "@unocss/transformer-variant-group": "66.5.1", "@unocss/vite": "66.5.1" }, "peerDependencies": { "@unocss/webpack": "66.5.1", "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" }, "optionalPeers": ["@unocss/webpack", "vite"] }, "sha512-e+9nqOy9v6NwPz0DxFdApGPefW22pCfU0Z1ALuodEoSHen03WlfTuEhkDkcKEpdo78tbIi/BbAYK9qT8p1d9sg=="], 749 - 750 - "unocss-preset-animations": ["unocss-preset-animations@1.2.1", "", { "peerDependencies": { "@unocss/preset-wind3": ">=0.56.0 < 101", "unocss": ">=0.56.0 < 101" }, "optionalPeers": ["@unocss/preset-wind3"] }, "sha512-HFdYPSLZ8SaAgTLfTNoiV5+1xAdcttOtFSPsZyHbA0qSis7Sansf90pz7a2yhs9Yq6Nos9P4onDttfdO8dwKPA=="], 751 - 752 - "unocss-preset-shadcn": ["unocss-preset-shadcn@1.0.1", "", { "peerDependencies": { "unocss": ">=0.56.0 < 101", "unocss-preset-animations": "^1.1.1" } }, "sha512-/I39ZO2ntPyRHz+VA8pa+E/empR4sJU//zMjgI0ph5c5LttRs84gcm74pz/wO+sfqMjjN4SbSScD2n+TfE4FHw=="], 753 - 754 - "unplugin-utils": ["unplugin-utils@0.3.0", "", { "dependencies": { "pathe": "^2.0.3", "picomatch": "^4.0.3" } }, "sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg=="], 755 - 756 - "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], 757 - 758 - "vite": ["vite@7.1.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ=="], 759 - 760 - "vite-tsconfig-paths": ["vite-tsconfig-paths@5.1.4", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w=="], 761 - 762 - "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], 763 - 764 - "vue-flow-layout": ["vue-flow-layout@0.2.0", "", {}, "sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q=="], 765 - 766 - "waku": ["waku@0.26.1", "", { "dependencies": { "@hono/node-server": "1.19.1", "@swc/core": "1.13.5", "@vitejs/plugin-react": "5.0.2", "@vitejs/plugin-rsc": "0.4.29", "dotenv": "17.2.2", "hono": "4.9.6", "rsc-html-stream": "0.0.7", "vite": "7.1.5" }, "peerDependencies": { "react": "~19.1.1", "react-dom": "~19.1.1", "react-server-dom-webpack": "~19.1.1" }, "bin": { "waku": "cli.js" } }, "sha512-b8nH8PFlZfnL8Yu1vbHISLAgcyFXeDaJAllKdB3oAWk71INQcTN8x0JfdZGUa0x/b2Lcn7souvub2chkGGh9Lg=="], 767 - 768 - "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="], 769 - 770 - "webpack": ["webpack@5.101.3", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A=="], 771 - 772 - "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="], 773 - 774 - "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], 775 - 776 - "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], 777 - 778 - "@babel/core/@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], 779 - 780 - "@babel/core/@babel/traverse": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], 781 - 782 - "@babel/generator/@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], 783 - 784 - "@babel/helper-module-imports/@babel/traverse": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], 785 - 786 - "@babel/helper-module-transforms/@babel/traverse": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], 787 - 788 - "@babel/template/@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], 789 - 790 - "@babel/traverse/@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], 791 - 792 - "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], 793 - 794 - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], 795 - 796 - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], 797 - 798 - "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], 799 - 800 - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" }, "bundled": true }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], 801 - 802 - "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 803 - 804 - "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 805 - 806 - "@types/babel__core/@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], 807 - 808 - "@types/babel__template/@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], 809 - 810 - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 811 - 812 - "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], 813 - 814 - "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], 815 - 816 - "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], 817 - 818 - "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 819 - 820 - "@babel/helper-module-imports/@babel/traverse/@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], 821 - 822 - "@babel/helper-module-transforms/@babel/traverse/@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], 823 - 824 - "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], 825 - } 826 - }
-20
web/components.json
··· 1 - { 2 - "$schema": "https://ui.shadcn.com/schema.json", 3 - "style": "default", 4 - "tailwind": { 5 - "config": "tailwind.config.ts", 6 - "css": "src/styles.css", 7 - "baseColor": "slate", 8 - "cssVariables": true, 9 - "prefix": "" 10 - }, 11 - "rsc": true, 12 - "tsx": true, 13 - "aliases": { 14 - "components": "@/components", 15 - "utils": "@/lib/utils", 16 - "ui": "@/components/ui", 17 - "lib": "@/lib", 18 - "hooks": "@/hooks" 19 - } 20 - }
-45
web/package.json
··· 1 - { 2 - "name": "@boombox/web", 3 - "version": "0.0.0", 4 - "type": "module", 5 - "private": true, 6 - "scripts": { 7 - "dev": "waku dev", 8 - "build": "waku build", 9 - "start": "waku start", 10 - "format": "prettier . --write" 11 - }, 12 - "dependencies": { 13 - "@boombox/shared": "workspace:*", 14 - "@elysiajs/eden": "^1.4.1", 15 - "@radix-ui/react-dialog": "^1.1.15", 16 - "@radix-ui/react-progress": "^1.1.7", 17 - "@radix-ui/react-separator": "^1.1.7", 18 - "@radix-ui/react-slider": "^1.3.6", 19 - "@radix-ui/react-slot": "^1.2.3", 20 - "@radix-ui/react-tooltip": "^1.2.8", 21 - "class-variance-authority": "^0.7.1", 22 - "clsx": "^2.1.1", 23 - "date-fns": "^4.1.0", 24 - "effect": "^3.17.13", 25 - "jotai": "^2.14.0", 26 - "lucide-react": "^0.544.0", 27 - "react": "19.1.1", 28 - "react-dom": "19.1.1", 29 - "react-server-dom-webpack": "19.1.1", 30 - "tailwind-merge": "^3.3.1", 31 - "tw-animate-css": "^1.4.0", 32 - "vite-tsconfig-paths": "^5.1.4", 33 - "waku": "0.26.1", 34 - "zustand": "^5.0.8" 35 - }, 36 - "devDependencies": { 37 - "@prettier/plugin-oxc": "^0.0.4", 38 - "@tailwindcss/vite": "^4.1.14", 39 - "@types/react": "19.1.12", 40 - "@types/react-dom": "19.1.9", 41 - "prettier": "^3.6.2", 42 - "tailwindcss": "^4.1.14", 43 - "typescript": "5.9.2" 44 - } 45 - }
web/public/fonts/Geist[wght].woff2

This is a binary file and will not be displayed.

web/public/images/favicon.png

This is a binary file and will not be displayed.

-2
web/public/robots.txt
··· 1 - User-agent: * 2 - Disallow: /RSC/
-3
web/src/atoms.ts
··· 1 - import { atom } from "jotai"; 2 - 3 - // Player atoms moved to Zustand store (src/stores/player.ts)
-27
web/src/components/album-card.tsx
··· 1 - import { Link } from "waku"; 2 - 3 - type Props = { 4 - album: Readonly<{ 5 - id: string; 6 - title: string; 7 - artists: ReadonlyArray<{ 8 - id: string; 9 - name: string; 10 - }>; 11 - }>; 12 - }; 13 - 14 - const mockCover = "https://writteninmusic.com/wp-content/uploads/2025/09/TOP-Breach.jpg"; 15 - export function AlbumCard(props: Props) { 16 - const { id, title, artists } = props.album; 17 - 18 - return ( 19 - <Link to={`/album/${id}`} className="space-y-px p-3 transition duration-100 hover:bg-black/10 h-fit rounded-lg"> 20 - <div className="aspect-square rounded-md overflow-hidden"> 21 - <img width={900} height={900} src={mockCover} className="object-cover w-full h-full" /> 22 - </div> 23 - <p className="text-md font-medium">{title}</p> 24 - <p className="text-sm opacity-70">{artists.at(0)?.name}</p> 25 - </Link> 26 - ); 27 - }
-69
web/src/components/app-sidebar.tsx
··· 1 - import { 2 - Sidebar, 3 - SidebarContent, 4 - SidebarFooter, 5 - SidebarGroup, 6 - SidebarGroupContent, 7 - SidebarGroupLabel, 8 - SidebarHeader, 9 - SidebarMenu, 10 - SidebarMenuButton, 11 - SidebarMenuItem, 12 - } from "@/components/ui/sidebar"; 13 - 14 - import { Calendar, Home, Inbox, Search, Settings } from "lucide-react"; 15 - 16 - const items = [ 17 - { 18 - title: "Home", 19 - url: "#", 20 - icon: Home, 21 - }, 22 - { 23 - title: "Inbox", 24 - url: "#", 25 - icon: Inbox, 26 - }, 27 - { 28 - title: "Calendar", 29 - url: "#", 30 - icon: Calendar, 31 - }, 32 - { 33 - title: "Search", 34 - url: "#", 35 - icon: Search, 36 - }, 37 - { 38 - title: "Settings", 39 - url: "#", 40 - icon: Settings, 41 - }, 42 - ]; 43 - export function AppSidebar() { 44 - return ( 45 - <Sidebar className="min-w-[200px] h-auto" collapsible="none"> 46 - <SidebarHeader /> 47 - <SidebarContent> 48 - <SidebarGroup> 49 - <SidebarGroupLabel>Application</SidebarGroupLabel> 50 - <SidebarGroupContent> 51 - <SidebarMenu> 52 - {items.map((item) => ( 53 - <SidebarMenuItem key={item.title}> 54 - <SidebarMenuButton asChild> 55 - <a href={item.url}> 56 - <item.icon /> 57 - <span>{item.title}</span> 58 - </a> 59 - </SidebarMenuButton> 60 - </SidebarMenuItem> 61 - ))} 62 - </SidebarMenu> 63 - </SidebarGroupContent> 64 - </SidebarGroup> 65 - </SidebarContent> 66 - <SidebarFooter /> 67 - </Sidebar> 68 - ); 69 - }
-64
web/src/components/audio-player.tsx
··· 1 - "use client"; 2 - 3 - import { useEffect, useRef } from "react"; 4 - import { usePlayerStore } from "@/stores/player"; 5 - import { Controls } from "./player/controls"; 6 - 7 - function usePlayer() { 8 - const audioRef = useRef<HTMLAudioElement | null>(null); 9 - 10 - const currentTrack = usePlayerStore((state) => state.currentTrack); 11 - const isPlaying = usePlayerStore((state) => state.isPlaying); 12 - const volume = usePlayerStore((state) => state.volume); 13 - const play = usePlayerStore((state) => state.play); 14 - const pause = usePlayerStore((state) => state.pause); 15 - 16 - const link = currentTrack ? `http://localhost:3003/file/${currentTrack}` : ""; 17 - const player = audioRef.current; 18 - 19 - useEffect(() => { 20 - if (!player) { 21 - return; 22 - } 23 - 24 - player.volume = volume; 25 - 26 - if (isPlaying) { 27 - player.play(); 28 - } else { 29 - player.pause(); 30 - } 31 - }, [audioRef, currentTrack, isPlaying]); 32 - 33 - useEffect(() => { 34 - if (!player) { 35 - return; 36 - } 37 - player.volume = volume; 38 - }, [audioRef, volume]); 39 - 40 - const onPause = () => { 41 - pause(); 42 - }; 43 - const onPlay = () => { 44 - play(); 45 - }; 46 - 47 - return { 48 - ref: audioRef, 49 - src: link, 50 - onPause, 51 - onPlay, 52 - }; 53 - } 54 - 55 - export function AudioPlayer() { 56 - const { ref, src, onPause, onPlay } = usePlayer(); 57 - 58 - return ( 59 - <> 60 - <Controls /> 61 - <audio ref={ref} src={src} onPause={onPause} onPlay={onPlay}></audio> 62 - </> 63 - ); 64 - }
-18
web/src/components/counter.tsx
··· 1 - "use client"; 2 - 3 - import { useState } from "react"; 4 - 5 - export const Counter = () => { 6 - const [count, setCount] = useState(0); 7 - 8 - const handleIncrement = () => setCount((c) => c + 1); 9 - 10 - return ( 11 - <section className="border-blue-400 -mx-4 mt-4 rounded-sm border border-dashed p-4"> 12 - <div>Count: {count}</div> 13 - <button onClick={handleIncrement} className="rounded-xs bg-black px-2 py-0.5 text-sm text-white"> 14 - Increment 15 - </button> 16 - </section> 17 - ); 18 - };
-13
web/src/components/footer.tsx
··· 1 - export const Footer = () => { 2 - return ( 3 - <footer className="p-6 lg:fixed lg:bottom-0 lg:left-0"> 4 - <div> 5 - visit{" "} 6 - <a href="https://waku.gg/" target="_blank" rel="noreferrer" className="mt-4 inline-block underline"> 7 - waku.gg 8 - </a>{" "} 9 - to learn more 10 - </div> 11 - </footer> 12 - ); 13 - };
-11
web/src/components/header.tsx
··· 1 - import { Link } from "waku"; 2 - 3 - export const Header = () => { 4 - return ( 5 - <header className="flex items-center gap-4 p-6 lg:fixed lg:left-0 lg:top-0"> 6 - <h2 className="text-lg font-bold tracking-tight"> 7 - <Link to="/">Waku starter</Link> 8 - </h2> 9 - </header> 10 - ); 11 - };
-65
web/src/components/player/controls.tsx
··· 1 - import { Pause, Play } from "lucide-react"; 2 - import { Slider } from "@/components/ui/slider"; 3 - import { Button } from "@/components/ui/button"; 4 - import { formatDate } from "date-fns"; 5 - import { usePlayerStore, getVolumePercent } from "@/stores/player"; 6 - 7 - export function Controls() { 8 - const currentTrack = usePlayerStore((state) => state.currentTrack); 9 - const isPlaying = usePlayerStore((state) => state.isPlaying); 10 - const volume = usePlayerStore((state) => state.volume); 11 - const togglePlayPause = usePlayerStore((state) => state.togglePlayPause); 12 - const setVolumePercent = usePlayerStore((state) => state.setVolumePercent); 13 - 14 - const volumePercent = getVolumePercent(volume); 15 - 16 - // Hardcoded duration values (unchanged from original) 17 - const maxDurationMs = (12 * 60 + 47) * 1000; 18 - const curDurationMs = (0 * 60 + 0) * 1000; 19 - 20 - if (!currentTrack) { 21 - return null; 22 - } 23 - 24 - return ( 25 - <div className="fixed h-fit py-6 bg-white border border-black bottom-0 left-0 right-0 w-full grid place-items-center gap-4 z-10"> 26 - <div className="grid place-items-center grid-rows-1 grid-cols-[1fr_auto_1fr] gap-x-10 w-full"> 27 - <div></div> 28 - <div> 29 - <Button 30 - onClick={togglePlayPause} 31 - size="icon" 32 - variant="outline" 33 - className="aspect-square border-2 border-primary text-primary hover:text-primary p-3" 34 - > 35 - {isPlaying ? <Pause /> : <Play />} 36 - </Button> 37 - </div> 38 - 39 - {/* right */} 40 - <div className="w-full flex flex-row items-center gap-5"> 41 - <Slider 42 - defaultValue={[volumePercent]} 43 - min={0} 44 - max={100} 45 - step={0.01} 46 - className="max-w-[200px]" 47 - onValueChange={([value]) => value && setVolumePercent(value)} 48 - /> 49 - {/* 50 - *<pre>{JSON.stringify({ volumePercent, volumeReal }, null, 2)}</pre> 51 - */} 52 - </div> 53 - </div> 54 - <div className="w-full max-w-sm flex flex-row items-center gap-4 text-xs text-black/70"> 55 - <div>{formatTime(curDurationMs)}</div> 56 - <Slider /> 57 - <div>{formatTime(maxDurationMs)}</div> 58 - </div> 59 - </div> 60 - ); 61 - } 62 - 63 - function formatTime(ms: number): string { 64 - return formatDate(new Date(ms), "m:ss"); 65 - }
-11
web/src/components/providers.tsx
··· 1 - "use client"; 2 - 3 - import { Provider as JotaiProvider } from "jotai"; 4 - import { ReactNode } from "react"; 5 - 6 - type Props = { 7 - children: ReactNode; 8 - }; 9 - export function Providers({ children }: Props) { 10 - return <JotaiProvider>{children}</JotaiProvider>; 11 - }
-61
web/src/components/song-row.tsx
··· 1 - "use client"; 2 - 3 - import { AudioLines, Pause, Play } from "lucide-react"; 4 - import { usePlayerStore } from "@/stores/player"; 5 - 6 - type Props = Readonly<{ 7 - title: string; 8 - fileId: string; 9 - trackNumber: number; 10 - artists: Array<{ id: string; name: string }>; 11 - isPaused?: boolean; 12 - }>; 13 - 14 - export function SongRow(props: Props) { 15 - const currentTrack = usePlayerStore((state) => state.currentTrack); 16 - const isPlaying = usePlayerStore((state) => state.isPlaying); 17 - const setTrack = usePlayerStore((state) => state.setTrack); 18 - 19 - const isCurrent = currentTrack === props.fileId; 20 - const isPaused = isCurrent && !isPlaying; 21 - 22 - const handleClick = () => { 23 - setTrack(props.fileId); 24 - }; 25 - 26 - return ( 27 - <li className="w-full"> 28 - <button 29 - onClick={handleClick} 30 - data-is-current={isCurrent} 31 - className="track-row-grid p-4 gap-x-4 gap-y-1 group transition-all duration-200 cursor-pointer hover:bg-muted data-[is-current=true]:bg-primary-foreground w-full text-left" 32 - > 33 - <div 34 - data-is-current={isCurrent} 35 - className="data-[id-current=true]:text-primary grid place-items-center h-full w-6 text-center" 36 - style={{ gridArea: "number" }} 37 - > 38 - <div className="w-4 h-4 group-hover:hidden grid place-items-center"> 39 - {isPaused ? ( 40 - <Pause className="w-4 h-4 text-primary" /> 41 - ) : isCurrent ? ( 42 - <AudioLines className="w-4 h-4 text-primary animate-pulse" /> 43 - ) : ( 44 - <> 45 - <span>{props.trackNumber}</span> 46 - </> 47 - )} 48 - </div> 49 - <Play className="w-4 h-4 text-primary hidden group-hover:block" /> 50 - </div> 51 - <span data-id-current={isCurrent} className="font-semibold data-[id-current=true]:text-primary"> 52 - {props.title} 53 - </span> 54 - <span className="text-sm">{props.artists.map((a) => a.name).join(", ")}</span> 55 - <span style={{ gridArea: "duration" }} className="text-right"> 56 - 0:00 57 - </span> 58 - </button> 59 - </li> 60 - ); 61 - }
-47
web/src/components/ui/button.tsx
··· 1 - import * as React from "react"; 2 - import { Slot } from "@radix-ui/react-slot"; 3 - import { cva, type VariantProps } from "class-variance-authority"; 4 - 5 - import { cn } from "@/lib/utils"; 6 - 7 - const buttonVariants = cva( 8 - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", 9 - { 10 - variants: { 11 - variant: { 12 - default: "bg-primary text-primary-foreground hover:bg-primary/90", 13 - destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", 14 - outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground", 15 - secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", 16 - ghost: "hover:bg-accent hover:text-accent-foreground", 17 - link: "text-primary underline-offset-4 hover:underline", 18 - }, 19 - size: { 20 - default: "h-10 px-4 py-2", 21 - sm: "h-9 rounded-md px-3", 22 - lg: "h-11 rounded-md px-8", 23 - icon: "h-10 w-10", 24 - }, 25 - }, 26 - defaultVariants: { 27 - variant: "default", 28 - size: "default", 29 - }, 30 - }, 31 - ); 32 - 33 - export interface ButtonProps 34 - extends React.ButtonHTMLAttributes<HTMLButtonElement>, 35 - VariantProps<typeof buttonVariants> { 36 - asChild?: boolean; 37 - } 38 - 39 - const Button = React.forwardRef<HTMLButtonElement, ButtonProps>( 40 - ({ className, variant, size, asChild = false, ...props }, ref) => { 41 - const Comp = asChild ? Slot : "button"; 42 - return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />; 43 - }, 44 - ); 45 - Button.displayName = "Button"; 46 - 47 - export { Button, buttonVariants };
-22
web/src/components/ui/input.tsx
··· 1 - import * as React from "react"; 2 - 3 - import { cn } from "@/lib/utils"; 4 - 5 - const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>( 6 - ({ className, type, ...props }, ref) => { 7 - return ( 8 - <input 9 - type={type} 10 - className={cn( 11 - "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", 12 - className, 13 - )} 14 - ref={ref} 15 - {...props} 16 - /> 17 - ); 18 - }, 19 - ); 20 - Input.displayName = "Input"; 21 - 22 - export { Input };
-25
web/src/components/ui/progress.tsx
··· 1 - "use client"; 2 - 3 - import * as React from "react"; 4 - import * as ProgressPrimitive from "@radix-ui/react-progress"; 5 - 6 - import { cn } from "@/lib/utils"; 7 - 8 - const Progress = React.forwardRef< 9 - React.ElementRef<typeof ProgressPrimitive.Root>, 10 - React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> 11 - >(({ className, value, ...props }, ref) => ( 12 - <ProgressPrimitive.Root 13 - ref={ref} 14 - className={cn("relative h-4 w-full overflow-hidden rounded-full bg-secondary", className)} 15 - {...props} 16 - > 17 - <ProgressPrimitive.Indicator 18 - className="h-full w-full flex-1 bg-primary transition-all" 19 - style={{ transform: `translateX(-${100 - (value || 0)}%)` }} 20 - /> 21 - </ProgressPrimitive.Root> 22 - )); 23 - Progress.displayName = ProgressPrimitive.Root.displayName; 24 - 25 - export { Progress };
-28
web/src/components/ui/separator.tsx
··· 1 - "use client"; 2 - 3 - import * as React from "react"; 4 - import * as SeparatorPrimitive from "@radix-ui/react-separator"; 5 - 6 - import { cn } from "@/lib/utils"; 7 - 8 - function Separator({ 9 - className, 10 - orientation = "horizontal", 11 - decorative = true, 12 - ...props 13 - }: React.ComponentProps<typeof SeparatorPrimitive.Root>) { 14 - return ( 15 - <SeparatorPrimitive.Root 16 - data-slot="separator" 17 - decorative={decorative} 18 - orientation={orientation} 19 - className={cn( 20 - "bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px", 21 - className, 22 - )} 23 - {...props} 24 - /> 25 - ); 26 - } 27 - 28 - export { Separator };
-103
web/src/components/ui/sheet.tsx
··· 1 - "use client"; 2 - 3 - import * as React from "react"; 4 - import * as SheetPrimitive from "@radix-ui/react-dialog"; 5 - import { XIcon } from "lucide-react"; 6 - 7 - import { cn } from "@/lib/utils"; 8 - 9 - function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) { 10 - return <SheetPrimitive.Root data-slot="sheet" {...props} />; 11 - } 12 - 13 - function SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) { 14 - return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />; 15 - } 16 - 17 - function SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) { 18 - return <SheetPrimitive.Close data-slot="sheet-close" {...props} />; 19 - } 20 - 21 - function SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) { 22 - return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />; 23 - } 24 - 25 - function SheetOverlay({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Overlay>) { 26 - return ( 27 - <SheetPrimitive.Overlay 28 - data-slot="sheet-overlay" 29 - className={cn( 30 - "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", 31 - className, 32 - )} 33 - {...props} 34 - /> 35 - ); 36 - } 37 - 38 - function SheetContent({ 39 - className, 40 - children, 41 - side = "right", 42 - ...props 43 - }: React.ComponentProps<typeof SheetPrimitive.Content> & { 44 - side?: "top" | "right" | "bottom" | "left"; 45 - }) { 46 - return ( 47 - <SheetPortal> 48 - <SheetOverlay /> 49 - <SheetPrimitive.Content 50 - data-slot="sheet-content" 51 - className={cn( 52 - "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500", 53 - side === "right" 54 - && "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm", 55 - side === "left" 56 - && "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm", 57 - side === "top" 58 - && "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b", 59 - side === "bottom" 60 - && "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t", 61 - className, 62 - )} 63 - {...props} 64 - > 65 - {children} 66 - <SheetPrimitive.Close className="ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none"> 67 - <XIcon className="size-4" /> 68 - <span className="sr-only">Close</span> 69 - </SheetPrimitive.Close> 70 - </SheetPrimitive.Content> 71 - </SheetPortal> 72 - ); 73 - } 74 - 75 - function SheetHeader({ className, ...props }: React.ComponentProps<"div">) { 76 - return <div data-slot="sheet-header" className={cn("flex flex-col gap-1.5 p-4", className)} {...props} />; 77 - } 78 - 79 - function SheetFooter({ className, ...props }: React.ComponentProps<"div">) { 80 - return <div data-slot="sheet-footer" className={cn("mt-auto flex flex-col gap-2 p-4", className)} {...props} />; 81 - } 82 - 83 - function SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) { 84 - return ( 85 - <SheetPrimitive.Title 86 - data-slot="sheet-title" 87 - className={cn("text-foreground font-semibold", className)} 88 - {...props} 89 - /> 90 - ); 91 - } 92 - 93 - function SheetDescription({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Description>) { 94 - return ( 95 - <SheetPrimitive.Description 96 - data-slot="sheet-description" 97 - className={cn("text-muted-foreground text-sm", className)} 98 - {...props} 99 - /> 100 - ); 101 - } 102 - 103 - export { Sheet, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription };
-646
web/src/components/ui/sidebar.tsx
··· 1 - "use client"; 2 - 3 - import * as React from "react"; 4 - import { Slot } from "@radix-ui/react-slot"; 5 - import { VariantProps, cva } from "class-variance-authority"; 6 - import { PanelLeft } from "lucide-react"; 7 - 8 - import { useIsMobile } from "@/hooks/use-mobile"; 9 - import { cn } from "@/lib/utils"; 10 - import { Button } from "@/components/ui/button"; 11 - import { Input } from "@/components/ui/input"; 12 - import { Separator } from "@/components/ui/separator"; 13 - import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "@/components/ui/sheet"; 14 - import { Skeleton } from "@/components/ui/skeleton"; 15 - import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; 16 - 17 - const SIDEBAR_COOKIE_NAME = "sidebar_state"; 18 - const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; 19 - const SIDEBAR_WIDTH = "16rem"; 20 - const SIDEBAR_WIDTH_MOBILE = "18rem"; 21 - const SIDEBAR_WIDTH_ICON = "3rem"; 22 - const SIDEBAR_KEYBOARD_SHORTCUT = "b"; 23 - 24 - type SidebarContextProps = { 25 - state: "expanded" | "collapsed"; 26 - open: boolean; 27 - setOpen: (open: boolean) => void; 28 - openMobile: boolean; 29 - setOpenMobile: (open: boolean) => void; 30 - isMobile: boolean; 31 - toggleSidebar: () => void; 32 - }; 33 - 34 - const SidebarContext = React.createContext<SidebarContextProps | null>(null); 35 - 36 - function useSidebar() { 37 - const context = React.useContext(SidebarContext); 38 - if (!context) { 39 - throw new Error("useSidebar must be used within a SidebarProvider."); 40 - } 41 - 42 - return context; 43 - } 44 - 45 - const SidebarProvider = React.forwardRef< 46 - HTMLDivElement, 47 - React.ComponentProps<"div"> & { 48 - defaultOpen?: boolean; 49 - open?: boolean; 50 - onOpenChange?: (open: boolean) => void; 51 - } 52 - >(({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }, ref) => { 53 - const isMobile = useIsMobile(); 54 - const [openMobile, setOpenMobile] = React.useState(false); 55 - 56 - // This is the internal state of the sidebar. 57 - // We use openProp and setOpenProp for control from outside the component. 58 - const [_open, _setOpen] = React.useState(defaultOpen); 59 - const open = openProp ?? _open; 60 - const setOpen = React.useCallback( 61 - (value: boolean | ((value: boolean) => boolean)) => { 62 - const openState = typeof value === "function" ? value(open) : value; 63 - if (setOpenProp) { 64 - setOpenProp(openState); 65 - } else { 66 - _setOpen(openState); 67 - } 68 - 69 - // This sets the cookie to keep the sidebar state. 70 - document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`; 71 - }, 72 - [setOpenProp, open], 73 - ); 74 - 75 - // Helper to toggle the sidebar. 76 - const toggleSidebar = React.useCallback(() => { 77 - return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open); 78 - }, [isMobile, setOpen, setOpenMobile]); 79 - 80 - // Adds a keyboard shortcut to toggle the sidebar. 81 - React.useEffect(() => { 82 - const handleKeyDown = (event: KeyboardEvent) => { 83 - if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) { 84 - event.preventDefault(); 85 - toggleSidebar(); 86 - } 87 - }; 88 - 89 - window.addEventListener("keydown", handleKeyDown); 90 - return () => window.removeEventListener("keydown", handleKeyDown); 91 - }, [toggleSidebar]); 92 - 93 - // We add a state so that we can do data-state="expanded" or "collapsed". 94 - // This makes it easier to style the sidebar with Tailwind classes. 95 - const state = open ? "expanded" : "collapsed"; 96 - 97 - const contextValue = React.useMemo<SidebarContextProps>( 98 - () => ({ 99 - state, 100 - open, 101 - setOpen, 102 - isMobile, 103 - openMobile, 104 - setOpenMobile, 105 - toggleSidebar, 106 - }), 107 - [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar], 108 - ); 109 - 110 - return ( 111 - <SidebarContext.Provider value={contextValue}> 112 - <TooltipProvider delayDuration={0}> 113 - <div 114 - style={ 115 - { 116 - "--sidebar-width": SIDEBAR_WIDTH, 117 - "--sidebar-width-icon": SIDEBAR_WIDTH_ICON, 118 - ...style, 119 - } as React.CSSProperties 120 - } 121 - className={cn( 122 - "group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar", 123 - className, 124 - )} 125 - ref={ref} 126 - {...props} 127 - > 128 - {children} 129 - </div> 130 - </TooltipProvider> 131 - </SidebarContext.Provider> 132 - ); 133 - }); 134 - SidebarProvider.displayName = "SidebarProvider"; 135 - 136 - const Sidebar = React.forwardRef< 137 - HTMLDivElement, 138 - React.ComponentProps<"div"> & { 139 - side?: "left" | "right"; 140 - variant?: "sidebar" | "floating" | "inset"; 141 - collapsible?: "offcanvas" | "icon" | "none"; 142 - } 143 - >(({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }, ref) => { 144 - const { isMobile, state, openMobile, setOpenMobile } = useSidebar(); 145 - 146 - if (collapsible === "none") { 147 - return ( 148 - <div 149 - className={cn("flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground", className)} 150 - ref={ref} 151 - {...props} 152 - > 153 - {children} 154 - </div> 155 - ); 156 - } 157 - 158 - if (isMobile) { 159 - return ( 160 - <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}> 161 - <SheetContent 162 - data-sidebar="sidebar" 163 - data-mobile="true" 164 - className="w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden" 165 - style={ 166 - { 167 - "--sidebar-width": SIDEBAR_WIDTH_MOBILE, 168 - } as React.CSSProperties 169 - } 170 - side={side} 171 - > 172 - <SheetHeader className="sr-only"> 173 - <SheetTitle>Sidebar</SheetTitle> 174 - <SheetDescription>Displays the mobile sidebar.</SheetDescription> 175 - </SheetHeader> 176 - <div className="flex h-full w-full flex-col">{children}</div> 177 - </SheetContent> 178 - </Sheet> 179 - ); 180 - } 181 - 182 - return ( 183 - <div 184 - ref={ref} 185 - className="group peer hidden text-sidebar-foreground md:block" 186 - data-state={state} 187 - data-collapsible={state === "collapsed" ? collapsible : ""} 188 - data-variant={variant} 189 - data-side={side} 190 - > 191 - {/* This is what handles the sidebar gap on desktop */} 192 - <div 193 - className={cn( 194 - "relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear", 195 - "group-data-[collapsible=offcanvas]:w-0", 196 - "group-data-[side=right]:rotate-180", 197 - variant === "floating" || variant === "inset" 198 - ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" 199 - : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)", 200 - )} 201 - /> 202 - <div 203 - className={cn( 204 - "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex", 205 - side === "left" 206 - ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" 207 - : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", 208 - // Adjust the padding for floating and inset variants. 209 - variant === "floating" || variant === "inset" 210 - ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" 211 - : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l", 212 - className, 213 - )} 214 - {...props} 215 - > 216 - <div 217 - data-sidebar="sidebar" 218 - className="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow" 219 - > 220 - {children} 221 - </div> 222 - </div> 223 - </div> 224 - ); 225 - }); 226 - Sidebar.displayName = "Sidebar"; 227 - 228 - const SidebarTrigger = React.forwardRef<React.ElementRef<typeof Button>, React.ComponentProps<typeof Button>>( 229 - ({ className, onClick, ...props }, ref) => { 230 - const { toggleSidebar } = useSidebar(); 231 - 232 - return ( 233 - <Button 234 - ref={ref} 235 - data-sidebar="trigger" 236 - variant="ghost" 237 - size="icon" 238 - className={cn("h-7 w-7", className)} 239 - onClick={(event) => { 240 - onClick?.(event); 241 - toggleSidebar(); 242 - }} 243 - {...props} 244 - > 245 - <PanelLeft /> 246 - <span className="sr-only">Toggle Sidebar</span> 247 - </Button> 248 - ); 249 - }, 250 - ); 251 - SidebarTrigger.displayName = "SidebarTrigger"; 252 - 253 - const SidebarRail = React.forwardRef<HTMLButtonElement, React.ComponentProps<"button">>( 254 - ({ className, ...props }, ref) => { 255 - const { toggleSidebar } = useSidebar(); 256 - 257 - return ( 258 - <button 259 - ref={ref} 260 - data-sidebar="rail" 261 - aria-label="Toggle Sidebar" 262 - tabIndex={-1} 263 - onClick={toggleSidebar} 264 - title="Toggle Sidebar" 265 - className={cn( 266 - "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex", 267 - "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", 268 - "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", 269 - "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar", 270 - "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", 271 - "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", 272 - className, 273 - )} 274 - {...props} 275 - /> 276 - ); 277 - }, 278 - ); 279 - SidebarRail.displayName = "SidebarRail"; 280 - 281 - const SidebarInset = React.forwardRef<HTMLDivElement, React.ComponentProps<"main">>(({ className, ...props }, ref) => { 282 - return ( 283 - <main 284 - ref={ref} 285 - className={cn( 286 - "relative flex w-full flex-1 flex-col bg-background", 287 - "md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow", 288 - className, 289 - )} 290 - {...props} 291 - /> 292 - ); 293 - }); 294 - SidebarInset.displayName = "SidebarInset"; 295 - 296 - const SidebarInput = React.forwardRef<React.ElementRef<typeof Input>, React.ComponentProps<typeof Input>>( 297 - ({ className, ...props }, ref) => { 298 - return ( 299 - <Input 300 - ref={ref} 301 - data-sidebar="input" 302 - className={cn( 303 - "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring", 304 - className, 305 - )} 306 - {...props} 307 - /> 308 - ); 309 - }, 310 - ); 311 - SidebarInput.displayName = "SidebarInput"; 312 - 313 - const SidebarHeader = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({ className, ...props }, ref) => { 314 - return <div ref={ref} data-sidebar="header" className={cn("flex flex-col gap-2 p-2", className)} {...props} />; 315 - }); 316 - SidebarHeader.displayName = "SidebarHeader"; 317 - 318 - const SidebarFooter = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({ className, ...props }, ref) => { 319 - return <div ref={ref} data-sidebar="footer" className={cn("flex flex-col gap-2 p-2", className)} {...props} />; 320 - }); 321 - SidebarFooter.displayName = "SidebarFooter"; 322 - 323 - const SidebarSeparator = React.forwardRef<React.ElementRef<typeof Separator>, React.ComponentProps<typeof Separator>>( 324 - ({ className, ...props }, ref) => { 325 - return ( 326 - <Separator 327 - ref={ref} 328 - data-sidebar="separator" 329 - className={cn("mx-2 w-auto bg-sidebar-border", className)} 330 - {...props} 331 - /> 332 - ); 333 - }, 334 - ); 335 - SidebarSeparator.displayName = "SidebarSeparator"; 336 - 337 - const SidebarContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({ className, ...props }, ref) => { 338 - return ( 339 - <div 340 - ref={ref} 341 - data-sidebar="content" 342 - className={cn( 343 - "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", 344 - className, 345 - )} 346 - {...props} 347 - /> 348 - ); 349 - }); 350 - SidebarContent.displayName = "SidebarContent"; 351 - 352 - const SidebarGroup = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({ className, ...props }, ref) => { 353 - return ( 354 - <div 355 - ref={ref} 356 - data-sidebar="group" 357 - className={cn("relative flex w-full min-w-0 flex-col p-2", className)} 358 - {...props} 359 - /> 360 - ); 361 - }); 362 - SidebarGroup.displayName = "SidebarGroup"; 363 - 364 - const SidebarGroupLabel = React.forwardRef<HTMLDivElement, React.ComponentProps<"div"> & { asChild?: boolean }>( 365 - ({ className, asChild = false, ...props }, ref) => { 366 - const Comp = asChild ? Slot : "div"; 367 - 368 - return ( 369 - <Comp 370 - ref={ref} 371 - data-sidebar="group-label" 372 - className={cn( 373 - "flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", 374 - "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0", 375 - className, 376 - )} 377 - {...props} 378 - /> 379 - ); 380 - }, 381 - ); 382 - SidebarGroupLabel.displayName = "SidebarGroupLabel"; 383 - 384 - const SidebarGroupAction = React.forwardRef<HTMLButtonElement, React.ComponentProps<"button"> & { asChild?: boolean }>( 385 - ({ className, asChild = false, ...props }, ref) => { 386 - const Comp = asChild ? Slot : "button"; 387 - 388 - return ( 389 - <Comp 390 - ref={ref} 391 - data-sidebar="group-action" 392 - className={cn( 393 - "absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", 394 - // Increases the hit area of the button on mobile. 395 - "after:absolute after:-inset-2 after:md:hidden", 396 - "group-data-[collapsible=icon]:hidden", 397 - className, 398 - )} 399 - {...props} 400 - /> 401 - ); 402 - }, 403 - ); 404 - SidebarGroupAction.displayName = "SidebarGroupAction"; 405 - 406 - const SidebarGroupContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>( 407 - ({ className, ...props }, ref) => ( 408 - <div ref={ref} data-sidebar="group-content" className={cn("w-full text-sm", className)} {...props} /> 409 - ), 410 - ); 411 - SidebarGroupContent.displayName = "SidebarGroupContent"; 412 - 413 - const SidebarMenu = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>(({ className, ...props }, ref) => ( 414 - <ul ref={ref} data-sidebar="menu" className={cn("flex w-full min-w-0 flex-col gap-1", className)} {...props} /> 415 - )); 416 - SidebarMenu.displayName = "SidebarMenu"; 417 - 418 - const SidebarMenuItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>(({ className, ...props }, ref) => ( 419 - <li ref={ref} data-sidebar="menu-item" className={cn("group/menu-item relative", className)} {...props} /> 420 - )); 421 - SidebarMenuItem.displayName = "SidebarMenuItem"; 422 - 423 - const sidebarMenuButtonVariants = cva( 424 - "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0", 425 - { 426 - variants: { 427 - variant: { 428 - default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", 429 - outline: 430 - "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]", 431 - }, 432 - size: { 433 - default: "h-8 text-sm", 434 - sm: "h-7 text-xs", 435 - lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!", 436 - }, 437 - }, 438 - defaultVariants: { 439 - variant: "default", 440 - size: "default", 441 - }, 442 - }, 443 - ); 444 - 445 - const SidebarMenuButton = React.forwardRef< 446 - HTMLButtonElement, 447 - React.ComponentProps<"button"> & { 448 - asChild?: boolean; 449 - isActive?: boolean; 450 - tooltip?: string | React.ComponentProps<typeof TooltipContent>; 451 - } & VariantProps<typeof sidebarMenuButtonVariants> 452 - >(({ asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, ...props }, ref) => { 453 - const Comp = asChild ? Slot : "button"; 454 - const { isMobile, state } = useSidebar(); 455 - 456 - const button = ( 457 - <Comp 458 - ref={ref} 459 - data-sidebar="menu-button" 460 - data-size={size} 461 - data-active={isActive} 462 - className={cn(sidebarMenuButtonVariants({ variant, size }), className)} 463 - {...props} 464 - /> 465 - ); 466 - 467 - if (!tooltip) { 468 - return button; 469 - } 470 - 471 - if (typeof tooltip === "string") { 472 - tooltip = { 473 - children: tooltip, 474 - }; 475 - } 476 - 477 - return ( 478 - <Tooltip> 479 - <TooltipTrigger asChild>{button}</TooltipTrigger> 480 - <TooltipContent side="right" align="center" hidden={state !== "collapsed" || isMobile} {...tooltip} /> 481 - </Tooltip> 482 - ); 483 - }); 484 - SidebarMenuButton.displayName = "SidebarMenuButton"; 485 - 486 - const SidebarMenuAction = React.forwardRef< 487 - HTMLButtonElement, 488 - React.ComponentProps<"button"> & { 489 - asChild?: boolean; 490 - showOnHover?: boolean; 491 - } 492 - >(({ className, asChild = false, showOnHover = false, ...props }, ref) => { 493 - const Comp = asChild ? Slot : "button"; 494 - 495 - return ( 496 - <Comp 497 - ref={ref} 498 - data-sidebar="menu-action" 499 - className={cn( 500 - "absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0", 501 - // Increases the hit area of the button on mobile. 502 - "after:absolute after:-inset-2 after:md:hidden", 503 - "peer-data-[size=sm]/menu-button:top-1", 504 - "peer-data-[size=default]/menu-button:top-1.5", 505 - "peer-data-[size=lg]/menu-button:top-2.5", 506 - "group-data-[collapsible=icon]:hidden", 507 - showOnHover 508 - && "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0", 509 - className, 510 - )} 511 - {...props} 512 - /> 513 - ); 514 - }); 515 - SidebarMenuAction.displayName = "SidebarMenuAction"; 516 - 517 - const SidebarMenuBadge = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>( 518 - ({ className, ...props }, ref) => ( 519 - <div 520 - ref={ref} 521 - data-sidebar="menu-badge" 522 - className={cn( 523 - "pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground", 524 - "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground", 525 - "peer-data-[size=sm]/menu-button:top-1", 526 - "peer-data-[size=default]/menu-button:top-1.5", 527 - "peer-data-[size=lg]/menu-button:top-2.5", 528 - "group-data-[collapsible=icon]:hidden", 529 - className, 530 - )} 531 - {...props} 532 - /> 533 - ), 534 - ); 535 - SidebarMenuBadge.displayName = "SidebarMenuBadge"; 536 - 537 - const SidebarMenuSkeleton = React.forwardRef< 538 - HTMLDivElement, 539 - React.ComponentProps<"div"> & { 540 - showIcon?: boolean; 541 - } 542 - >(({ className, showIcon = false, ...props }, ref) => { 543 - // Random width between 50 to 90%. 544 - const width = React.useMemo(() => { 545 - return `${Math.floor(Math.random() * 40) + 50}%`; 546 - }, []); 547 - 548 - return ( 549 - <div 550 - ref={ref} 551 - data-sidebar="menu-skeleton" 552 - className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)} 553 - {...props} 554 - > 555 - {showIcon && <Skeleton className="size-4 rounded-md" data-sidebar="menu-skeleton-icon" />} 556 - <Skeleton 557 - className="h-4 max-w-(--skeleton-width) flex-1" 558 - data-sidebar="menu-skeleton-text" 559 - style={ 560 - { 561 - "--skeleton-width": width, 562 - } as React.CSSProperties 563 - } 564 - /> 565 - </div> 566 - ); 567 - }); 568 - SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton"; 569 - 570 - const SidebarMenuSub = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>( 571 - ({ className, ...props }, ref) => ( 572 - <ul 573 - ref={ref} 574 - data-sidebar="menu-sub" 575 - className={cn( 576 - "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5", 577 - "group-data-[collapsible=icon]:hidden", 578 - className, 579 - )} 580 - {...props} 581 - /> 582 - ), 583 - ); 584 - SidebarMenuSub.displayName = "SidebarMenuSub"; 585 - 586 - const SidebarMenuSubItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>(({ ...props }, ref) => ( 587 - <li ref={ref} {...props} /> 588 - )); 589 - SidebarMenuSubItem.displayName = "SidebarMenuSubItem"; 590 - 591 - const SidebarMenuSubButton = React.forwardRef< 592 - HTMLAnchorElement, 593 - React.ComponentProps<"a"> & { 594 - asChild?: boolean; 595 - size?: "sm" | "md"; 596 - isActive?: boolean; 597 - } 598 - >(({ asChild = false, size = "md", isActive, className, ...props }, ref) => { 599 - const Comp = asChild ? Slot : "a"; 600 - 601 - return ( 602 - <Comp 603 - ref={ref} 604 - data-sidebar="menu-sub-button" 605 - data-size={size} 606 - data-active={isActive} 607 - className={cn( 608 - "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground", 609 - "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground", 610 - size === "sm" && "text-xs", 611 - size === "md" && "text-sm", 612 - "group-data-[collapsible=icon]:hidden", 613 - className, 614 - )} 615 - {...props} 616 - /> 617 - ); 618 - }); 619 - SidebarMenuSubButton.displayName = "SidebarMenuSubButton"; 620 - 621 - export { 622 - Sidebar, 623 - SidebarContent, 624 - SidebarFooter, 625 - SidebarGroup, 626 - SidebarGroupAction, 627 - SidebarGroupContent, 628 - SidebarGroupLabel, 629 - SidebarHeader, 630 - SidebarInput, 631 - SidebarInset, 632 - SidebarMenu, 633 - SidebarMenuAction, 634 - SidebarMenuBadge, 635 - SidebarMenuButton, 636 - SidebarMenuItem, 637 - SidebarMenuSkeleton, 638 - SidebarMenuSub, 639 - SidebarMenuSubButton, 640 - SidebarMenuSubItem, 641 - SidebarProvider, 642 - SidebarRail, 643 - SidebarSeparator, 644 - SidebarTrigger, 645 - useSidebar, 646 - };
-7
web/src/components/ui/skeleton.tsx
··· 1 - import { cn } from "@/lib/utils"; 2 - 3 - function Skeleton({ className, ...props }: React.ComponentProps<"div">) { 4 - return <div data-slot="skeleton" className={cn("bg-accent animate-pulse rounded-md", className)} {...props} />; 5 - } 6 - 7 - export { Skeleton };
-25
web/src/components/ui/slider.tsx
··· 1 - "use client"; 2 - 3 - import * as React from "react"; 4 - import * as SliderPrimitive from "@radix-ui/react-slider"; 5 - 6 - import { cn } from "@/lib/utils"; 7 - 8 - const Slider = React.forwardRef< 9 - React.ElementRef<typeof SliderPrimitive.Root>, 10 - React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> 11 - >(({ className, ...props }, ref) => ( 12 - <SliderPrimitive.Root 13 - ref={ref} 14 - className={cn("relative flex w-full touch-none select-none items-center", className)} 15 - {...props} 16 - > 17 - <SliderPrimitive.Track className="relative h-2 w-full grow overflow-hidden rounded-full bg-secondary"> 18 - <SliderPrimitive.Range className="absolute h-full bg-primary" /> 19 - </SliderPrimitive.Track> 20 - <SliderPrimitive.Thumb className="block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" /> 21 - </SliderPrimitive.Root> 22 - )); 23 - Slider.displayName = SliderPrimitive.Root.displayName; 24 - 25 - export { Slider };
-48
web/src/components/ui/tooltip.tsx
··· 1 - "use client"; 2 - 3 - import * as React from "react"; 4 - import * as TooltipPrimitive from "@radix-ui/react-tooltip"; 5 - 6 - import { cn } from "@/lib/utils"; 7 - 8 - function TooltipProvider({ delayDuration = 0, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>) { 9 - return <TooltipPrimitive.Provider data-slot="tooltip-provider" delayDuration={delayDuration} {...props} />; 10 - } 11 - 12 - function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) { 13 - return ( 14 - <TooltipProvider> 15 - <TooltipPrimitive.Root data-slot="tooltip" {...props} /> 16 - </TooltipProvider> 17 - ); 18 - } 19 - 20 - function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) { 21 - return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />; 22 - } 23 - 24 - function TooltipContent({ 25 - className, 26 - sideOffset = 0, 27 - children, 28 - ...props 29 - }: React.ComponentProps<typeof TooltipPrimitive.Content>) { 30 - return ( 31 - <TooltipPrimitive.Portal> 32 - <TooltipPrimitive.Content 33 - data-slot="tooltip-content" 34 - sideOffset={sideOffset} 35 - className={cn( 36 - "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance", 37 - className, 38 - )} 39 - {...props} 40 - > 41 - {children} 42 - <TooltipPrimitive.Arrow className="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]" /> 43 - </TooltipPrimitive.Content> 44 - </TooltipPrimitive.Portal> 45 - ); 46 - } 47 - 48 - export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
-19
web/src/hooks/use-mobile.ts
··· 1 - import * as React from "react"; 2 - 3 - const MOBILE_BREAKPOINT = 768; 4 - 5 - export function useIsMobile() { 6 - const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined); 7 - 8 - React.useEffect(() => { 9 - const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); 10 - const onChange = () => { 11 - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); 12 - }; 13 - mql.addEventListener("change", onChange); 14 - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); 15 - return () => mql.removeEventListener("change", onChange); 16 - }, []); 17 - 18 - return !!isMobile; 19 - }
-4
web/src/lib/api.ts
··· 1 - import { treaty } from "@elysiajs/eden"; 2 - import type { ApiType } from "../../../backend/src/api"; 3 - 4 - export const client = treaty<ApiType>("localhost:3003");
-11
web/src/lib/errors.ts
··· 1 - import { Data } from "effect"; 2 - 3 - export class FetchFailedError extends Data.TaggedError("FetchFailedError")<{ 4 - message: string; 5 - cause?: unknown; 6 - }> {} 7 - 8 - export class JsonParseError extends Data.TaggedError("JsonParseError")<{ 9 - message: string; 10 - cause?: unknown; 11 - }> {}
-6
web/src/lib/utils.ts
··· 1 - import { clsx, type ClassValue } from "clsx"; 2 - import { twMerge } from "tailwind-merge"; 3 - 4 - export function cn(...inputs: ClassValue[]) { 5 - return twMerge(clsx(inputs)); 6 - }
-28
web/src/pages.gen.ts
··· 1 - // deno-fmt-ignore-file 2 - // biome-ignore format: generated types do not need formatting 3 - // prettier-ignore 4 - import type { PathsForPages, GetConfigResponse } from 'waku/router'; 5 - 6 - // prettier-ignore 7 - import type { getConfig as File_About_getConfig } from './pages/about'; 8 - // prettier-ignore 9 - import type { getConfig as File_AlbumId_getConfig } from './pages/album/[id]'; 10 - // prettier-ignore 11 - import type { getConfig as File_Index_getConfig } from './pages/index'; 12 - 13 - // prettier-ignore 14 - type Page = 15 - | ({ path: '/about' } & GetConfigResponse<typeof File_About_getConfig>) 16 - | ({ path: '/album/[id]' } & GetConfigResponse<typeof File_AlbumId_getConfig>) 17 - | { path: '/album'; render: 'dynamic' } 18 - | ({ path: '/' } & GetConfigResponse<typeof File_Index_getConfig>); 19 - 20 - // prettier-ignore 21 - declare module 'waku/router' { 22 - interface RouteConfig { 23 - paths: PathsForPages<Page>; 24 - } 25 - interface CreatePagesConfig { 26 - pages: Page; 27 - } 28 - }
-44
web/src/pages/_layout.tsx
··· 1 - import "../styles.css"; 2 - 3 - import type { ReactNode } from "react"; 4 - import { AudioPlayer } from "@/components/audio-player"; 5 - import { Providers } from "@/components/providers"; 6 - import { SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"; 7 - import { AppSidebar } from "@/components/app-sidebar"; 8 - 9 - type RootLayoutProps = { children: ReactNode }; 10 - 11 - export default async function RootLayout({ children }: RootLayoutProps) { 12 - const data = await getData(); 13 - 14 - return ( 15 - <> 16 - <meta name="description" content={data.description} /> 17 - <link rel="icon" type="image/png" href={data.icon} /> 18 - <div className="font-['Geist'] pb-36 w-full overflow-x-hidden min-h-screen flex flex-col antialiased h-auto"> 19 - <Providers> 20 - <SidebarProvider> 21 - <AppSidebar /> 22 - <main className="w-full">{children}</main> 23 - <AudioPlayer /> 24 - </SidebarProvider> 25 - </Providers> 26 - </div> 27 - </> 28 - ); 29 - } 30 - 31 - const getData = async () => { 32 - const data = { 33 - description: "An internet website!", 34 - icon: "/images/favicon.png", 35 - }; 36 - 37 - return data; 38 - }; 39 - 40 - export const getConfig = async () => { 41 - return { 42 - render: "static", 43 - } as const; 44 - };
-32
web/src/pages/about.tsx
··· 1 - import { Link } from "waku"; 2 - 3 - export default async function AboutPage() { 4 - const data = await getData(); 5 - 6 - return ( 7 - <div> 8 - <title>{data.title}</title> 9 - <h1 className="text-4xl font-bold tracking-tight">{data.headline}</h1> 10 - <p>{data.body}</p> 11 - <Link to="/" className="mt-4 inline-block underline"> 12 - Return home 13 - </Link> 14 - </div> 15 - ); 16 - } 17 - 18 - const getData = async () => { 19 - const data = { 20 - title: "About", 21 - headline: "About Waku", 22 - body: "The minimal React framework", 23 - }; 24 - 25 - return data; 26 - }; 27 - 28 - export const getConfig = async () => { 29 - return { 30 - render: "static", 31 - } as const; 32 - };
-148
web/src/pages/album/[id].tsx
··· 1 - import { SongRow } from "@/components/song-row"; 2 - import { client } from "@/lib/api"; 3 - import { FetchFailedError, JsonParseError } from "@/lib/errors"; 4 - import { Console, Effect, pipe, Schema } from "effect"; 5 - import { Fragment } from "react/jsx-runtime"; 6 - import { Link } from "waku"; 7 - import { PageProps } from "waku/router"; 8 - 9 - async function getMock() { 10 - return { 11 - title: "SISTER", 12 - cover: "https://writteninmusic.com/wp-content/uploads/2025/09/TOP-Breach.jpg", 13 - artists: [ 14 - { 15 - id: "1234", 16 - name: "Frost Children", 17 - }, 18 - ], 19 - songs: [ 20 - { 21 - id: "01994481-481d-7000-9da7-883e615593a4", 22 - title: "Position Famous", 23 - trackNumber: 1, 24 - artists: [ 25 - { 26 - id: "1234", 27 - name: "Frost Children", 28 - }, 29 - ], 30 - }, 31 - { 32 - id: "01994481-481d-700c-b1cb-a5d0acf3f2f1", 33 - title: "Falling", 34 - trackNumber: 2, 35 - artists: [ 36 - { 37 - id: "1234", 38 - name: "Frost Children", 39 - }, 40 - ], 41 - }, 42 - { 43 - id: "01994481-481d-7002-b219-fe95ffb1bcfe", 44 - title: "ELECTRIC", 45 - trackNumber: 3, 46 - artists: [ 47 - { 48 - id: "1234", 49 - name: "Frost Children", 50 - }, 51 - ], 52 - }, 53 - { 54 - id: "01994481-481d-7009-92c9-4a4ba6298844", 55 - title: "WHAT IS FOREVER FOR", 56 - trackNumber: 4, 57 - artists: [ 58 - { 59 - id: "1234", 60 - name: "Frost Children", 61 - }, 62 - ], 63 - }, 64 - ], 65 - }; 66 - } 67 - 68 - const fetchAlbum = (id: string) => 69 - pipe( 70 - Effect.tryPromise({ 71 - try: () => client.album({ id }).get(), 72 - catch: (err) => 73 - new FetchFailedError({ 74 - cause: err, 75 - message: "Failed to fetch album", 76 - }), 77 - }), 78 - Effect.map((x) => x.data), 79 - Effect.flatMap(Effect.fromNullable), 80 - ); 81 - 82 - export default async function AlbumPage({ id }: PageProps<"/album/[id]">) { 83 - return await Effect.runPromise( 84 - Effect.gen(function* () { 85 - const data = yield* Effect.tryPromise(() => getMock()); 86 - 87 - const album = yield* fetchAlbum(id); 88 - 89 - return ( 90 - <div className="grid grid-cols-1 lg:grid-cols-[1fr_4fr] max-w-6xl w-full gap-x-8 px-8 py-12 mx-auto"> 91 - {/* Left section*/} 92 - <div className="relative"> 93 - <div className="flex flex-col gap-5 sticky top-12"> 94 - <img 95 - src={data.cover} 96 - width={900} 97 - height={900} 98 - className="max-w-[400px] max-h-[400px] aspect-square min-w-[400px] min-h-[400px] rounded-2xl transform rotate-1 hover:rotate-0 transition-transform duration-500 object-cover" 99 - /> 100 - 101 - <div className="space-y-3"> 102 - <h1 className="text-4xl lg:text-5xl font-bold text-balance leading-tight"> 103 - {album.title} 104 - </h1> 105 - <h2 className="text-xl font-medium text-primary"> 106 - {album.artists.map((artist, idx) => ( 107 - <Fragment key={artist.id}> 108 - {/* @ts-ignore */} 109 - <Link to={`#`}> 110 - {idx !== 0 ? ", " : ""} 111 - {artist.name} 112 - </Link> 113 - </Fragment> 114 - ))} 115 - </h2> 116 - </div> 117 - </div> 118 - </div> 119 - 120 - {/* Right section*/} 121 - <div className="space-y-5"> 122 - <div> 123 - <h2 className="text-2xl font-semibold">Tracks</h2> 124 - </div> 125 - 126 - <ul className="bg-white shadow-md rounded-2xl w-full divide-y divide-border overflow-hidden"> 127 - {album.songs.map((song, idx) => ( 128 - <SongRow 129 - key={song.id} 130 - fileId={song.fileId} 131 - title={song.title} 132 - trackNumber={idx + 1} 133 - artists={song.artists.map((x) => ({ name: x.name, id: x.id }))} 134 - /> 135 - ))} 136 - </ul> 137 - </div> 138 - </div> 139 - ); 140 - }).pipe(Effect.catchAll(() => Effect.succeed("Not found"))), 141 - ); 142 - } 143 - 144 - export async function getConfig() { 145 - return { 146 - render: "dynamic", // TODO: Change to static with staticPaths:[''], 147 - } as const; 148 - }
-35
web/src/pages/album/index.tsx
··· 1 - import { AlbumCard } from "@/components/album-card"; 2 - import { client } from "@/lib/api"; 3 - import { FetchFailedError } from "@/lib/errors"; 4 - import { Effect, pipe } from "effect"; 5 - 6 - const getAlbums = () => 7 - pipe( 8 - Effect.tryPromise({ 9 - try: () => client.albums.get(), 10 - catch: (err) => 11 - new FetchFailedError({ 12 - cause: err, 13 - message: "Failed to fetch album", 14 - }), 15 - }), 16 - Effect.map((x) => x.data), 17 - Effect.flatMap(Effect.fromNullable), 18 - ); 19 - 20 - const AlbumPage = () => 21 - Effect.gen(function* () { 22 - const albums = yield* getAlbums(); 23 - 24 - return ( 25 - <div className="container"> 26 - <div className="grid lg:grid-cols-6 grid-cols-1"> 27 - {albums.map((album) => ( 28 - <AlbumCard album={album} key={album.id} /> 29 - ))} 30 - </div> 31 - </div> 32 - ); 33 - }); 34 - 35 - export default () => Effect.runPromise(AlbumPage());
-35
web/src/pages/index.tsx
··· 1 - import { Link } from "waku"; 2 - 3 - import { Counter } from "../components/counter"; 4 - 5 - export default async function HomePage() { 6 - const data = await getData(); 7 - 8 - return ( 9 - <div> 10 - <title>{data.title}</title> 11 - <h1 className="text-4xl font-bold tracking-tight">{data.headline}</h1> 12 - <p>{data.body}</p> 13 - <Counter /> 14 - <Link to="/about" className="mt-4 inline-block underline"> 15 - About page 16 - </Link> 17 - </div> 18 - ); 19 - } 20 - 21 - const getData = async () => { 22 - const data = { 23 - title: "Waku", 24 - headline: "Waku", 25 - body: "Hello world!", 26 - }; 27 - 28 - return data; 29 - }; 30 - 31 - export const getConfig = async () => { 32 - return { 33 - render: "static", 34 - } as const; 35 - };
-81
web/src/stores/player.ts
··· 1 - import { create } from "zustand"; 2 - import { scale } from "@/utils"; 3 - 4 - const MAX_VOLUME = 0.15; 5 - 6 - // ## Volume Helpers 7 - 8 - function perceptualVolume(x: number) { 9 - //return (Math.exp(x) - 1) / (Math.E - 1); 10 - return (Math.exp(x) - 1) * 0.5819767; // 1/(e-1) 11 - } 12 - 13 - function amplitudeVolume(x: number) { 14 - //return Math.log(x * (Math.E - 1) + 1); 15 - return Math.log(x * 1.71828 + 1); // e-1 16 - } 17 - 18 - function clamp(x: number, min: number, max: number) { 19 - if (x > max) { 20 - return max; 21 - } 22 - if (x < min) { 23 - return min; 24 - } 25 - return x; 26 - } 27 - 28 - function volumeForward(valuePercent: number, maxVolume = MAX_VOLUME) { 29 - const clamped = clamp(valuePercent, 0, 100); 30 - const normalized = scale(clamped, 100, 1); 31 - const perceptual = perceptualVolume(normalized); 32 - const scaled = scale(perceptual, 1, maxVolume); 33 - const clamped2 = clamp(scaled, 0, maxVolume); 34 - return clamped2; 35 - } 36 - 37 - function volumeBackwards(value: number, maxVolume = MAX_VOLUME) { 38 - const clamped = clamp(value, 0, maxVolume); 39 - const scaled = scale(clamped, maxVolume, 1); 40 - const actual = amplitudeVolume(scaled); 41 - const denormalized = scale(actual, 1, 100); 42 - const clamped2 = clamp(denormalized, 0, 100); 43 - return clamped2; 44 - } 45 - 46 - // ## Store 47 - 48 - interface PlayerState { 49 - // State 50 - isPlaying: boolean; 51 - currentTrack: string | null; 52 - volume: number; // 0-1 range 53 - 54 - // Actions 55 - play: () => void; 56 - pause: () => void; 57 - togglePlayPause: () => void; 58 - setTrack: (fileId: string) => void; 59 - setVolume: (volume: number) => void; 60 - setVolumePercent: (percent: number) => void; 61 - } 62 - 63 - export const usePlayerStore = create<PlayerState>((set) => ({ 64 - // Initial state 65 - isPlaying: false, 66 - currentTrack: null, 67 - volume: 0.02, 68 - 69 - // Actions 70 - play: () => set({ isPlaying: true }), 71 - pause: () => set({ isPlaying: false }), 72 - togglePlayPause: () => set((state) => ({ isPlaying: !state.isPlaying })), 73 - setTrack: (fileId: string) => set({ currentTrack: fileId, isPlaying: true }), 74 - setVolume: (volume: number) => set({ volume }), 75 - setVolumePercent: (percent: number) => set({ volume: volumeForward(percent) }), 76 - })); 77 - 78 - // Helper to get volume as percentage (0-100) 79 - export function getVolumePercent(volume: number): number { 80 - return volumeBackwards(volume); 81 - }
-137
web/src/styles.css
··· 1 - @import "tailwindcss"; 2 - @import "tw-animate-css"; 3 - 4 - @custom-variant dark (&:is(.dark *)); 5 - 6 - :root { 7 - --radius: 0.65rem; 8 - --background: oklch(1 0 0); 9 - --foreground: oklch(0.141 0.005 285.823); 10 - --card: oklch(1 0 0); 11 - --card-foreground: oklch(0.141 0.005 285.823); 12 - --popover: oklch(1 0 0); 13 - --popover-foreground: oklch(0.141 0.005 285.823); 14 - --primary: oklch(0.705 0.213 47.604); 15 - --primary-foreground: oklch(0.98 0.016 73.684); 16 - --secondary: oklch(0.967 0.001 286.375); 17 - --secondary-foreground: oklch(0.21 0.006 285.885); 18 - --muted: oklch(0.967 0.001 286.375); 19 - --muted-foreground: oklch(0.552 0.016 285.938); 20 - --accent: oklch(0.967 0.001 286.375); 21 - --accent-foreground: oklch(0.21 0.006 285.885); 22 - --destructive: oklch(0.577 0.245 27.325); 23 - --border: oklch(0.92 0.004 286.32); 24 - --input: oklch(0.92 0.004 286.32); 25 - --ring: oklch(0.705 0.213 47.604); 26 - --chart-1: oklch(0.646 0.222 41.116); 27 - --chart-2: oklch(0.6 0.118 184.704); 28 - --chart-3: oklch(0.398 0.07 227.392); 29 - --chart-4: oklch(0.828 0.189 84.429); 30 - --chart-5: oklch(0.769 0.188 70.08); 31 - --sidebar: oklch(0.985 0 0); 32 - --sidebar-foreground: oklch(0.141 0.005 285.823); 33 - --sidebar-primary: oklch(0.705 0.213 47.604); 34 - --sidebar-primary-foreground: oklch(0.98 0.016 73.684); 35 - --sidebar-accent: oklch(0.967 0.001 286.375); 36 - --sidebar-accent-foreground: oklch(0.21 0.006 285.885); 37 - --sidebar-border: oklch(0.92 0.004 286.32); 38 - --sidebar-ring: oklch(0.705 0.213 47.604); 39 - } 40 - 41 - .dark { 42 - --background: oklch(0.141 0.005 285.823); 43 - --foreground: oklch(0.985 0 0); 44 - --card: oklch(0.21 0.006 285.885); 45 - --card-foreground: oklch(0.985 0 0); 46 - --popover: oklch(0.21 0.006 285.885); 47 - --popover-foreground: oklch(0.985 0 0); 48 - --primary: oklch(0.646 0.222 41.116); 49 - --primary-foreground: oklch(0.98 0.016 73.684); 50 - --secondary: oklch(0.274 0.006 286.033); 51 - --secondary-foreground: oklch(0.985 0 0); 52 - --muted: oklch(0.274 0.006 286.033); 53 - --muted-foreground: oklch(0.705 0.015 286.067); 54 - --accent: oklch(0.274 0.006 286.033); 55 - --accent-foreground: oklch(0.985 0 0); 56 - --destructive: oklch(0.704 0.191 22.216); 57 - --border: oklch(1 0 0 / 10%); 58 - --input: oklch(1 0 0 / 15%); 59 - --ring: oklch(0.646 0.222 41.116); 60 - --chart-1: oklch(0.488 0.243 264.376); 61 - --chart-2: oklch(0.696 0.17 162.48); 62 - --chart-3: oklch(0.769 0.188 70.08); 63 - --chart-4: oklch(0.627 0.265 303.9); 64 - --chart-5: oklch(0.645 0.246 16.439); 65 - --sidebar: oklch(0.21 0.006 285.885); 66 - --sidebar-foreground: oklch(0.985 0 0); 67 - --sidebar-primary: oklch(0.646 0.222 41.116); 68 - --sidebar-primary-foreground: oklch(0.98 0.016 73.684); 69 - --sidebar-accent: oklch(0.274 0.006 286.033); 70 - --sidebar-accent-foreground: oklch(0.985 0 0); 71 - --sidebar-border: oklch(1 0 0 / 10%); 72 - --sidebar-ring: oklch(0.646 0.222 41.116); 73 - } 74 - 75 - @theme inline { 76 - --color-background: var(--background); 77 - --color-foreground: var(--foreground); 78 - --color-card: var(--card); 79 - --color-card-foreground: var(--card-foreground); 80 - --color-popover: var(--popover); 81 - --color-popover-foreground: var(--popover-foreground); 82 - --color-primary: var(--primary); 83 - --color-primary-foreground: var(--primary-foreground); 84 - --color-primary-background: var(--primary-foreground); 85 - --color-secondary: var(--secondary); 86 - --color-secondary-foreground: var(--secondary-foreground); 87 - --color-muted: var(--muted); 88 - --color-muted-foreground: var(--muted-foreground); 89 - --color-accent: var(--accent); 90 - --color-accent-foreground: var(--accent-foreground); 91 - --color-destructive: var(--destructive); 92 - --color-destructive-foreground: var(--destructive-foreground); 93 - --color-border: var(--border); 94 - --color-input: var(--input); 95 - --color-ring: var(--ring); 96 - --color-chart-1: var(--chart-1); 97 - --color-chart-2: var(--chart-2); 98 - --color-chart-3: var(--chart-3); 99 - --color-chart-4: var(--chart-4); 100 - --color-chart-5: var(--chart-5); 101 - --radius-sm: calc(var(--radius) - 4px); 102 - --radius-md: calc(var(--radius) - 2px); 103 - --radius-lg: var(--radius); 104 - --radius-xl: calc(var(--radius) + 4px); 105 - --color-sidebar: var(--sidebar); 106 - --color-sidebar-foreground: var(--sidebar-foreground); 107 - --color-sidebar-primary: var(--sidebar-primary); 108 - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); 109 - --color-sidebar-accent: var(--sidebar-accent); 110 - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); 111 - --color-sidebar-border: var(--sidebar-border); 112 - --color-sidebar-ring: var(--sidebar-ring); 113 - } 114 - 115 - @layer base { 116 - * { 117 - @apply border-border outline-ring/50; 118 - } 119 - body { 120 - @apply bg-background text-foreground; 121 - } 122 - } 123 - @font-face { 124 - font-family: "Geist"; 125 - src: url("/fonts/Geist[wght].woff2") format("woff2"); 126 - } 127 - 128 - .track-row-grid { 129 - grid-template-areas: 130 - "number title duration" 131 - "number artists duration"; 132 - 133 - display: grid; 134 - grid-template-columns: auto 1fr auto; 135 - grid-template-rows: repeat(minmax(0 auto), 2); 136 - align-items: center; 137 - }
-14
web/src/utils.ts
··· 1 - import { Schema } from "effect"; 2 - 3 - export const NormalizedFloat = Schema.Number.pipe( 4 - Schema.between(0, 1, { 5 - identifier: "NormalizedFloat", 6 - description: "floating point number between 0 and 1", 7 - }), 8 - ); 9 - 10 - export type NormalizedFloatType = typeof NormalizedFloat.Type; 11 - 12 - export function scale(x: number, fromMax: number, toMax: number) { 13 - return (x / fromMax) * toMax; 14 - }
-5
web/tailwind.config.ts
··· 1 - import type { Config } from "tailwindcss"; 2 - 3 - export default { 4 - content: ["./src/**/*.{ts,tsx}"], 5 - } satisfies Config;
-22
web/tsconfig.json
··· 1 - { 2 - "exclude": ["node_modules/"], 3 - "compilerOptions": { 4 - "strict": true, 5 - "target": "esnext", 6 - "noEmit": true, 7 - "isolatedModules": true, 8 - "moduleDetection": "force", 9 - "downlevelIteration": true, 10 - "esModuleInterop": true, 11 - "module": "esnext", 12 - "moduleResolution": "bundler", 13 - "skipLibCheck": true, 14 - "noUncheckedIndexedAccess": true, 15 - "exactOptionalPropertyTypes": true, 16 - "jsx": "react-jsx", 17 - "baseUrl": ".", 18 - "paths": { 19 - "@/*": ["./src/*"] 20 - } 21 - } 22 - }
-9
web/waku.config.ts
··· 1 - import tailwindcss from "@tailwindcss/vite"; 2 - import { defineConfig } from "waku/config"; 3 - import tsconfigPaths from "vite-tsconfig-paths"; 4 - 5 - export default defineConfig({ 6 - vite: { 7 - plugins: [tailwindcss(), tsconfigPaths()], 8 - }, 9 - });