Compare commits

...
8 Commits
Author SHA1 Message Date
artemis 9edc1a8f58 Auction show loading 2026-09-18 19:55:23 +03:00
artemis 45499efa52 Auction show dialog 2026-09-18 18:07:46 +03:00
artemis a208ac40f8 User data loading 2026-09-18 14:19:26 +03:00
artemis 1619d39c14 Minor changes for API format and token loading 2026-09-16 22:53:45 +03:00
artemis fbf667762d Merge branch 'preparing-css' 2026-09-09 17:29:33 +03:00
artemis ff81b5b9bb Auctions index card 2026-09-09 17:29:12 +03:00
artemis 1879ec67f1 Added Bootstrap's top nav 2026-09-08 15:35:44 +03:00
artemis 3b6b0bbf9a Added Bootstrap and Sass 2026-09-08 13:00:03 +03:00
16 changed files with 671 additions and 106 deletions
+14 -1
View File
@@ -5,5 +5,18 @@ import vue from '@astrojs/vue';
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
integrations: [vue()] integrations: [vue()],
vite: {
css: {
preprocessorOptions: {
scss: {
quietDeps: true,
silenceDeprecations: [
// For Bootstrap
'import',
],
}
}
}
}
}); });
+3
View File
@@ -11,8 +11,11 @@
"dependencies": { "dependencies": {
"@astrojs/vue": "^7.0.2", "@astrojs/vue": "^7.0.2",
"@nanostores/vue": "^1.0.1", "@nanostores/vue": "^1.0.1",
"@popperjs/core": "^2.11.8",
"astro": "^7.2.10", "astro": "^7.2.10",
"bootstrap": "^5.3.8",
"nanostores": "^1.1.0", "nanostores": "^1.1.0",
"sass-embedded": "^1.104.0",
"vue": "^3.5.42" "vue": "^3.5.42"
}, },
"devDependencies": { "devDependencies": {
+478 -34
View File
@@ -10,16 +10,25 @@ importers:
dependencies: dependencies:
'@astrojs/vue': '@astrojs/vue':
specifier: ^7.0.2 specifier: ^7.0.2
version: 7.0.2(@types/node@25.0.3)(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3))(esbuild@0.28.2)(vue@3.5.42(typescript@5.9.3)) version: 7.0.2(@types/node@25.0.3)(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3)(sass-embedded@1.104.0)(sass@1.104.0))(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)(vue@3.5.42(typescript@5.9.3))
'@nanostores/vue': '@nanostores/vue':
specifier: ^1.0.1 specifier: ^1.0.1
version: 1.0.1(@nanostores/logger@1.0.0(nanostores@1.1.0))(nanostores@1.1.0)(vue@3.5.42(typescript@5.9.3)) version: 1.0.1(@nanostores/logger@1.0.0(nanostores@1.1.0))(nanostores@1.1.0)(vue@3.5.42(typescript@5.9.3))
'@popperjs/core':
specifier: ^2.11.8
version: 2.11.8
astro: astro:
specifier: ^7.2.10 specifier: ^7.2.10
version: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3) version: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3)(sass-embedded@1.104.0)(sass@1.104.0)
bootstrap:
specifier: ^5.3.8
version: 5.3.8(@popperjs/core@2.11.8)
nanostores: nanostores:
specifier: ^1.1.0 specifier: ^1.1.0
version: 1.1.0 version: 1.1.0
sass-embedded:
specifier: ^1.104.0
version: 1.104.0
vue: vue:
specifier: ^3.5.42 specifier: ^3.5.42
version: 3.5.42(typescript@5.9.3) version: 3.5.42(typescript@5.9.3)
@@ -408,6 +417,9 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@bufbuild/protobuf@2.14.1':
resolution: {integrity: sha512-agRJn3+EJDUe8AvxTx/LnHA/GErvLE62pSaSk7+MwFOtOv8eWBu/qCq2qoZjBjVZ3C2aiFJCveuSs17KMkYGOw==}
'@capsizecss/unpack@4.0.1': '@capsizecss/unpack@4.0.1':
resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
@@ -783,9 +795,88 @@ packages:
'@oxc-project/types@0.148.0': '@oxc-project/types@0.148.0':
resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==}
'@parcel/watcher-android-arm64@2.6.0':
resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [android]
'@parcel/watcher-darwin-arm64@2.6.0':
resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [darwin]
'@parcel/watcher-darwin-x64@2.6.0':
resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [darwin]
'@parcel/watcher-freebsd-x64@2.6.0':
resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [freebsd]
'@parcel/watcher-linux-arm-glibc@2.6.0':
resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==}
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
'@parcel/watcher-linux-arm-musl@2.6.0':
resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==}
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
'@parcel/watcher-linux-arm64-glibc@2.6.0':
resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
'@parcel/watcher-linux-arm64-musl@2.6.0':
resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
'@parcel/watcher-linux-x64-glibc@2.6.0':
resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
'@parcel/watcher-linux-x64-musl@2.6.0':
resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
'@parcel/watcher-win32-arm64@2.6.0':
resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [win32]
'@parcel/watcher-win32-x64@2.6.0':
resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [win32]
'@parcel/watcher@2.6.0':
resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==}
engines: {node: '>= 10.0.0'}
'@polka/url@1.0.0-next.29': '@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
'@popperjs/core@2.11.8':
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
'@rolldown/binding-android-arm-eabi@1.2.7': '@rolldown/binding-android-arm-eabi@1.2.7':
resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==} resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
@@ -1083,6 +1174,11 @@ packages:
boolbase@1.0.0: boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
bootstrap@5.3.8:
resolution: {integrity: sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==}
peerDependencies:
'@popperjs/core': ^2.11.8
browserslist@4.28.1: browserslist@4.28.1:
resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -1116,6 +1212,9 @@ packages:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'} engines: {node: '>=6'}
colorjs.io@0.7.1:
resolution: {integrity: sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==}
comma-separated-tokens@2.0.3: comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
@@ -1315,6 +1414,10 @@ packages:
h3@1.15.11: h3@1.15.11:
resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==}
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
hast-util-to-html@9.0.5: hast-util-to-html@9.0.5:
resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
@@ -1333,6 +1436,9 @@ packages:
http-cache-semantics@4.2.0: http-cache-semantics@4.2.0:
resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
immutable@5.1.9:
resolution: {integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==}
iron-webcrypto@1.2.1: iron-webcrypto@1.2.1:
resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
@@ -1346,6 +1452,14 @@ packages:
engines: {node: '>=20'} engines: {node: '>=20'}
hasBin: true hasBin: true
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
is-in-ssh@1.0.0: is-in-ssh@1.0.0:
resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==}
engines: {node: '>=20'} engines: {node: '>=20'}
@@ -1519,6 +1633,9 @@ packages:
nlcst-to-string@4.0.0: nlcst-to-string@4.0.0:
resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==}
node-addon-api@7.1.1:
resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
node-fetch-native@1.6.7: node-fetch-native@1.6.7:
resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
@@ -1644,6 +1761,123 @@ packages:
resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
engines: {node: '>=18'} engines: {node: '>=18'}
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
sass-embedded-all-unknown@1.104.0:
resolution: {integrity: sha512-+S5We++QAg0/wXeVstn4kaZQNZiHi/1FHFsuVRu6Qns/9+YH6aIExg5e8dE+ceNpnYIZUpoK3mdBJoxJhirReQ==}
cpu: ['!arm', '!arm64', '!riscv64', '!x64']
sass-embedded-android-arm64@1.104.0:
resolution: {integrity: sha512-Trknl/A+KTTGRsPWrKaVIF/uq468iTqZzXWMEK/e707bqnbodYvWBBkA7uOM1wtnJQIrepeYSp/CIQJnFr95EQ==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [android]
sass-embedded-android-arm@1.104.0:
resolution: {integrity: sha512-yojf6KAo4EKbXVzzy4FkYJAez+qzj6NV2inEzsQQxvNfKxfX9INtC6u8UNwSjXL40M9vzAH03lygutq9zmhTCg==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [android]
sass-embedded-android-riscv64@1.104.0:
resolution: {integrity: sha512-UPR1U/qsTzIikl/DAmZn/11oPrz4DrnrbWANB7WGwz3AtYvLZeixEiVj8Yo2jNy6749zPD09Pyo352io8Y2Mxw==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [android]
sass-embedded-android-x64@1.104.0:
resolution: {integrity: sha512-NebAKvwfj4a7EbOf9LAzgo4f/uO1xFJbIoebzW8bmqdjeIMSAwJvFToIizxjDuOsIJ9M6AaADxwvDxgm8JTq+w==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [android]
sass-embedded-darwin-arm64@1.104.0:
resolution: {integrity: sha512-DYxsoOtA90/LabvQiFs/UVo6jrPbIlIvelSC0B9fxlB051ZBpEFnWamjLV2Xncp48E63voWTYGKpLlsHsi7clg==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [darwin]
sass-embedded-darwin-x64@1.104.0:
resolution: {integrity: sha512-zozGKOnR3mnlBqKhzfGH8ZqjPphaDzE5Zjx+H/IOb/ruR/KApTvYkRdi9Eq7OQvSJwL/EHYiyT2jgHaqQulOWw==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [darwin]
sass-embedded-linux-arm64@1.104.0:
resolution: {integrity: sha512-2TWOQodxIbwcp9fS01FCUbO2c8bnsdOgUCLB7aZDAhm6ZAkEL8GNIAyKxSMkVIjxndMqNHsG2UtCR2++03DQ+Q==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
sass-embedded-linux-arm@1.104.0:
resolution: {integrity: sha512-RX4t5jBlYtGrZwpuc1mtD3lzGuat+jyPidyN5hD5DURV7q39y4IampzopVJ9fvNZqsiGElYWnKyRJA49Q4xk7w==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
sass-embedded-linux-musl-arm64@1.104.0:
resolution: {integrity: sha512-NPcl0Cw9QXdGzYgjtLZD9MU3Mmr+N31R+Wa+hbbmlNwg1yghbF/bWrpE96oixrQivtCsY1yh9cONl6d+9NrS6Q==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
sass-embedded-linux-musl-arm@1.104.0:
resolution: {integrity: sha512-KjXKRY/1TDCNbRg/Htq4puzf5etQ9eFXG83O/328Km/1x2FuQMCmD+pSFTqQrj2LskZ8if+NYZJb3CQ1wzF0Pw==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
sass-embedded-linux-musl-riscv64@1.104.0:
resolution: {integrity: sha512-/1JR6G1AfGs/paJk5nemuJmg7pOUgwXlz/WW2NhSDRHBgZnb6Zy6yMpkSHoienAOJSBGUmKceT03dQ/4b409CA==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
sass-embedded-linux-musl-x64@1.104.0:
resolution: {integrity: sha512-5wVjkPR74JdsoH9+NSKV7UCPAdMTxNoayZdu7B9PnmNkOJMRE5O8Jb2oJ3JXgSH/kcGXJ6Vl6dL8/EPLBAKkcg==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
sass-embedded-linux-riscv64@1.104.0:
resolution: {integrity: sha512-Bq9xrONn23cyv5bdSuLm0RG1dcKl+lFQRc1k1UlncI2B2gqb6/OdakEa4Gv2HAmo+O6iOtK39lG9XT1ivTIoww==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
sass-embedded-linux-x64@1.104.0:
resolution: {integrity: sha512-xznKQzFnNVNq+GiXPmBXIHLL2rlIoekDxE8HXNKgxXX6bn4fByuHApCmj5Uz+MpVOB154EYCbErztyoEcmnb9Q==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
sass-embedded-unknown-all@1.104.0:
resolution: {integrity: sha512-0+zhxrAt9PIsdWEVTe5Wgo+gtYdlyv0ASuuAEXT4e9w2yNArUqZ9Gez4Jn8EmtbF7x9uuZxPWbdnq9z65gCH7g==}
os: ['!android', '!darwin', '!linux', '!win32']
sass-embedded-win32-arm64@1.104.0:
resolution: {integrity: sha512-b8dKmgdgmTx0rSBLNPqLQiq4r/SDau0/3we7MG/8ULMneMSl2OoVttN2ilKSz993lqQu8FJSjx5fEjLSeXVaiA==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [win32]
sass-embedded-win32-x64@1.104.0:
resolution: {integrity: sha512-tVL4NZKUo0+fIO2sT9V1DnBOo9wUbkRoic/NbVBThQdCjl07dn7PKW+ISSnY0EwQhCxdulMDek/JZT7c46vTCA==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [win32]
sass-embedded@1.104.0:
resolution: {integrity: sha512-AW1ZaKM/o4t137+FNe9zkMFWAZlw+EbWuHopVbP0yc0vpvlYj8NqxgKKSsSqODZVgGON2FzKeFMJJHR+tXNzqA==}
engines: {node: '>=20.19.0'}
hasBin: true
sass@1.104.0:
resolution: {integrity: sha512-btHMApW2bgolvClhRW8AlQJzgI9lUB3pPSofBQQT+E46GWvf9o0TVQ13SYv5riWZVFyPN+JNz3TKW9XhBlc10w==}
engines: {node: '>=20.19.0'}
hasBin: true
satteri@0.10.5: satteri@0.10.5:
resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==}
@@ -1694,11 +1928,23 @@ packages:
stringify-entities@4.0.4: stringify-entities@4.0.4:
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
supports-color@8.1.1:
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
engines: {node: '>=10'}
svgo@4.1.0: svgo@4.1.0:
resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==}
engines: {node: '>=16'} engines: {node: '>=16'}
hasBin: true hasBin: true
sync-child-process@1.0.2:
resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==}
engines: {node: '>=16.0.0'}
sync-message-port@1.2.0:
resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==}
engines: {node: '>=16.0.0'}
tiny-inflate@1.0.3: tiny-inflate@1.0.3:
resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
@@ -1845,6 +2091,9 @@ packages:
peerDependencies: peerDependencies:
browserslist: '>= 4.21.0' browserslist: '>= 4.21.0'
varint@6.0.0:
resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
vfile-message@4.0.3: vfile-message@4.0.3:
resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
@@ -2050,14 +2299,14 @@ snapshots:
is-docker: 4.0.0 is-docker: 4.0.0
package-manager-detector: 1.6.0 package-manager-detector: 1.6.0
'@astrojs/vue@7.0.2(@types/node@25.0.3)(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3))(esbuild@0.28.2)(vue@3.5.42(typescript@5.9.3))': '@astrojs/vue@7.0.2(@types/node@25.0.3)(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3)(sass-embedded@1.104.0)(sass@1.104.0))(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)(vue@3.5.42(typescript@5.9.3))':
dependencies: dependencies:
'@vitejs/plugin-vue': 6.0.8(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2))(vue@3.5.42(typescript@5.9.3)) '@vitejs/plugin-vue': 6.0.8(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))(vue@3.5.42(typescript@5.9.3))
'@vitejs/plugin-vue-jsx': 5.1.6(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2))(vue@3.5.42(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))(vue@3.5.42(typescript@5.9.3))
'@vue/compiler-sfc': 3.5.42 '@vue/compiler-sfc': 3.5.42
astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3) astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3)(sass-embedded@1.104.0)(sass@1.104.0)
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
vite-plugin-vue-devtools: 8.2.1(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2))(vue@3.5.42(typescript@5.9.3)) vite-plugin-vue-devtools: 8.2.1(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))(vue@3.5.42(typescript@5.9.3))
vue: 3.5.42(typescript@5.9.3) vue: 3.5.42(typescript@5.9.3)
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
@@ -2464,6 +2713,8 @@ snapshots:
'@bruits/satteri-win32-x64-msvc@0.10.5': '@bruits/satteri-win32-x64-msvc@0.10.5':
optional: true optional: true
'@bufbuild/protobuf@2.14.1': {}
'@capsizecss/unpack@4.0.1': '@capsizecss/unpack@4.0.1':
dependencies: dependencies:
fontkitten: 1.0.3 fontkitten: 1.0.3
@@ -2734,8 +2985,67 @@ snapshots:
'@oxc-project/types@0.148.0': {} '@oxc-project/types@0.148.0': {}
'@parcel/watcher-android-arm64@2.6.0':
optional: true
'@parcel/watcher-darwin-arm64@2.6.0':
optional: true
'@parcel/watcher-darwin-x64@2.6.0':
optional: true
'@parcel/watcher-freebsd-x64@2.6.0':
optional: true
'@parcel/watcher-linux-arm-glibc@2.6.0':
optional: true
'@parcel/watcher-linux-arm-musl@2.6.0':
optional: true
'@parcel/watcher-linux-arm64-glibc@2.6.0':
optional: true
'@parcel/watcher-linux-arm64-musl@2.6.0':
optional: true
'@parcel/watcher-linux-x64-glibc@2.6.0':
optional: true
'@parcel/watcher-linux-x64-musl@2.6.0':
optional: true
'@parcel/watcher-win32-arm64@2.6.0':
optional: true
'@parcel/watcher-win32-x64@2.6.0':
optional: true
'@parcel/watcher@2.6.0':
dependencies:
detect-libc: 2.1.2
is-glob: 4.0.3
node-addon-api: 7.1.1
picomatch: 4.0.7
optionalDependencies:
'@parcel/watcher-android-arm64': 2.6.0
'@parcel/watcher-darwin-arm64': 2.6.0
'@parcel/watcher-darwin-x64': 2.6.0
'@parcel/watcher-freebsd-x64': 2.6.0
'@parcel/watcher-linux-arm-glibc': 2.6.0
'@parcel/watcher-linux-arm-musl': 2.6.0
'@parcel/watcher-linux-arm64-glibc': 2.6.0
'@parcel/watcher-linux-arm64-musl': 2.6.0
'@parcel/watcher-linux-x64-glibc': 2.6.0
'@parcel/watcher-linux-x64-musl': 2.6.0
'@parcel/watcher-win32-arm64': 2.6.0
'@parcel/watcher-win32-x64': 2.6.0
optional: true
'@polka/url@1.0.0-next.29': {} '@polka/url@1.0.0-next.29': {}
'@popperjs/core@2.11.8': {}
'@rolldown/binding-android-arm-eabi@1.2.7': '@rolldown/binding-android-arm-eabi@1.2.7':
optional: true optional: true
@@ -2859,22 +3169,22 @@ snapshots:
'@ungap/structured-clone@1.3.0': {} '@ungap/structured-clone@1.3.0': {}
'@vitejs/plugin-vue-jsx@5.1.6(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2))(vue@3.5.42(typescript@5.9.3))': '@vitejs/plugin-vue-jsx@5.1.6(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))(vue@3.5.42(typescript@5.9.3))':
dependencies: dependencies:
'@babel/core': 7.29.7 '@babel/core': 7.29.7
'@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7)
'@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)
'@rolldown/pluginutils': 1.0.1 '@rolldown/pluginutils': 1.0.1
'@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7) '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7)
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
vue: 3.5.42(typescript@5.9.3) vue: 3.5.42(typescript@5.9.3)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@vitejs/plugin-vue@6.0.8(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2))(vue@3.5.42(typescript@5.9.3))': '@vitejs/plugin-vue@6.0.8(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))(vue@3.5.42(typescript@5.9.3))':
dependencies: dependencies:
'@rolldown/pluginutils': 1.0.1 '@rolldown/pluginutils': 1.0.1
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
vue: 3.5.42(typescript@5.9.3) vue: 3.5.42(typescript@5.9.3)
'@vue/babel-helper-vue-transform-on@1.5.0': {} '@vue/babel-helper-vue-transform-on@1.5.0': {}
@@ -3034,7 +3344,7 @@ snapshots:
aria-query@5.3.2: {} aria-query@5.3.2: {}
astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3): astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@25.0.3)(sass-embedded@1.104.0)(sass@1.104.0):
dependencies: dependencies:
'@astrojs/compiler-rs': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3) '@astrojs/compiler-rs': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)
'@astrojs/internal-helpers': 0.11.0 '@astrojs/internal-helpers': 0.11.0
@@ -3084,8 +3394,8 @@ snapshots:
ultrahtml: 1.6.0 ultrahtml: 1.6.0
unifont: 0.7.5 unifont: 0.7.5
unstorage: 1.17.5 unstorage: 1.17.5
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
vitefu: 1.1.3(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)) vitefu: 1.1.3(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))
xxhash-wasm: 1.1.0 xxhash-wasm: 1.1.0
yargs-parser: 22.0.0 yargs-parser: 22.0.0
zod: 4.5.4 zod: 4.5.4
@@ -3137,6 +3447,10 @@ snapshots:
boolbase@1.0.0: {} boolbase@1.0.0: {}
bootstrap@5.3.8(@popperjs/core@2.11.8):
dependencies:
'@popperjs/core': 2.11.8
browserslist@4.28.1: browserslist@4.28.1:
dependencies: dependencies:
baseline-browser-mapping: 2.9.11 baseline-browser-mapping: 2.9.11
@@ -3165,6 +3479,8 @@ snapshots:
clsx@2.1.1: {} clsx@2.1.1: {}
colorjs.io@0.7.1: {}
comma-separated-tokens@2.0.3: {} comma-separated-tokens@2.0.3: {}
commander@11.1.0: {} commander@11.1.0: {}
@@ -3354,6 +3670,8 @@ snapshots:
ufo: 1.6.4 ufo: 1.6.4
uncrypto: 0.1.3 uncrypto: 0.1.3
has-flag@4.0.0: {}
hast-util-to-html@9.0.5: hast-util-to-html@9.0.5:
dependencies: dependencies:
'@types/hast': 3.0.5 '@types/hast': 3.0.5
@@ -3380,12 +3698,22 @@ snapshots:
http-cache-semantics@4.2.0: {} http-cache-semantics@4.2.0: {}
immutable@5.1.9: {}
iron-webcrypto@1.2.1: {} iron-webcrypto@1.2.1: {}
is-docker@3.0.0: {} is-docker@3.0.0: {}
is-docker@4.0.0: {} is-docker@4.0.0: {}
is-extglob@2.1.1:
optional: true
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
optional: true
is-in-ssh@1.0.0: {} is-in-ssh@1.0.0: {}
is-inside-container@1.0.0: is-inside-container@1.0.0:
@@ -3528,6 +3856,9 @@ snapshots:
dependencies: dependencies:
'@types/nlcst': 2.0.3 '@types/nlcst': 2.0.3
node-addon-api@7.1.1:
optional: true
node-fetch-native@1.6.7: {} node-fetch-native@1.6.7: {}
node-mock-http@1.0.4: {} node-mock-http@1.0.4: {}
@@ -3653,6 +3984,106 @@ snapshots:
run-applescript@7.1.0: {} run-applescript@7.1.0: {}
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
sass-embedded-all-unknown@1.104.0:
dependencies:
sass: 1.104.0
optional: true
sass-embedded-android-arm64@1.104.0:
optional: true
sass-embedded-android-arm@1.104.0:
optional: true
sass-embedded-android-riscv64@1.104.0:
optional: true
sass-embedded-android-x64@1.104.0:
optional: true
sass-embedded-darwin-arm64@1.104.0:
optional: true
sass-embedded-darwin-x64@1.104.0:
optional: true
sass-embedded-linux-arm64@1.104.0:
optional: true
sass-embedded-linux-arm@1.104.0:
optional: true
sass-embedded-linux-musl-arm64@1.104.0:
optional: true
sass-embedded-linux-musl-arm@1.104.0:
optional: true
sass-embedded-linux-musl-riscv64@1.104.0:
optional: true
sass-embedded-linux-musl-x64@1.104.0:
optional: true
sass-embedded-linux-riscv64@1.104.0:
optional: true
sass-embedded-linux-x64@1.104.0:
optional: true
sass-embedded-unknown-all@1.104.0:
dependencies:
sass: 1.104.0
optional: true
sass-embedded-win32-arm64@1.104.0:
optional: true
sass-embedded-win32-x64@1.104.0:
optional: true
sass-embedded@1.104.0:
dependencies:
'@bufbuild/protobuf': 2.14.1
colorjs.io: 0.7.1
immutable: 5.1.9
rxjs: 7.8.2
supports-color: 8.1.1
sync-child-process: 1.0.2
varint: 6.0.0
optionalDependencies:
sass-embedded-all-unknown: 1.104.0
sass-embedded-android-arm: 1.104.0
sass-embedded-android-arm64: 1.104.0
sass-embedded-android-riscv64: 1.104.0
sass-embedded-android-x64: 1.104.0
sass-embedded-darwin-arm64: 1.104.0
sass-embedded-darwin-x64: 1.104.0
sass-embedded-linux-arm: 1.104.0
sass-embedded-linux-arm64: 1.104.0
sass-embedded-linux-musl-arm: 1.104.0
sass-embedded-linux-musl-arm64: 1.104.0
sass-embedded-linux-musl-riscv64: 1.104.0
sass-embedded-linux-musl-x64: 1.104.0
sass-embedded-linux-riscv64: 1.104.0
sass-embedded-linux-x64: 1.104.0
sass-embedded-unknown-all: 1.104.0
sass-embedded-win32-arm64: 1.104.0
sass-embedded-win32-x64: 1.104.0
sass@1.104.0:
dependencies:
chokidar: 5.0.0
immutable: 5.1.9
source-map-js: 1.2.1
optionalDependencies:
'@parcel/watcher': 2.6.0
optional: true
satteri@0.10.5: satteri@0.10.5:
dependencies: dependencies:
'@types/estree-jsx': 1.0.5 '@types/estree-jsx': 1.0.5
@@ -3740,6 +4171,10 @@ snapshots:
character-entities-html4: 2.1.0 character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0 character-entities-legacy: 3.0.0
supports-color@8.1.1:
dependencies:
has-flag: 4.0.0
svgo@4.1.0: svgo@4.1.0:
dependencies: dependencies:
commander: 11.1.0 commander: 11.1.0
@@ -3750,6 +4185,12 @@ snapshots:
picocolors: 1.1.1 picocolors: 1.1.1
sax: 1.6.1 sax: 1.6.1
sync-child-process@1.0.2:
dependencies:
sync-message-port: 1.2.0
sync-message-port@1.2.0: {}
tiny-inflate@1.0.3: {} tiny-inflate@1.0.3: {}
tinyclip@0.1.15: {} tinyclip@0.1.15: {}
@@ -3772,8 +4213,7 @@ snapshots:
trough@2.2.0: {} trough@2.2.0: {}
tslib@2.8.1: tslib@2.8.1: {}
optional: true
typescript@5.9.3: typescript@5.9.3:
optional: true optional: true
@@ -3850,6 +4290,8 @@ snapshots:
escalade: 3.2.0 escalade: 3.2.0
picocolors: 1.1.1 picocolors: 1.1.1
varint@6.0.0: {}
vfile-message@4.0.3: vfile-message@4.0.3:
dependencies: dependencies:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
@@ -3860,17 +4302,17 @@ snapshots:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
vfile-message: 4.0.3 vfile-message: 4.0.3
vite-dev-rpc@2.0.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)): vite-dev-rpc@2.0.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)):
dependencies: dependencies:
birpc: 4.2.0 birpc: 4.2.0
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
vite-hot-client: 2.2.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)) vite-hot-client: 2.2.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))
vite-hot-client@2.2.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)): vite-hot-client@2.2.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)):
dependencies: dependencies:
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
vite-plugin-inspect@11.4.1(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)): vite-plugin-inspect@11.4.1(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)):
dependencies: dependencies:
ansis: 4.3.1 ansis: 4.3.1
error-stack-parser-es: 1.0.5 error-stack-parser-es: 1.0.5
@@ -3880,24 +4322,24 @@ snapshots:
perfect-debounce: 2.1.0 perfect-debounce: 2.1.0
sirv: 3.0.2 sirv: 3.0.2
unplugin-utils: 0.3.2 unplugin-utils: 0.3.2
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
vite-dev-rpc: 2.0.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)) vite-dev-rpc: 2.0.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))
vite-plugin-vue-devtools@8.2.1(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2))(vue@3.5.42(typescript@5.9.3)): vite-plugin-vue-devtools@8.2.1(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))(vue@3.5.42(typescript@5.9.3)):
dependencies: dependencies:
'@vue/devtools-core': 8.2.1(vue@3.5.42(typescript@5.9.3)) '@vue/devtools-core': 8.2.1(vue@3.5.42(typescript@5.9.3))
'@vue/devtools-kit': 8.2.1 '@vue/devtools-kit': 8.2.1
'@vue/devtools-shared': 8.2.1 '@vue/devtools-shared': 8.2.1
sirv: 3.0.2 sirv: 3.0.2
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
vite-plugin-inspect: 11.4.1(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)) vite-plugin-inspect: 11.4.1(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))
vite-plugin-vue-inspector: 6.0.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)) vite-plugin-vue-inspector: 6.0.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0))
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
- supports-color - supports-color
- vue - vue
vite-plugin-vue-inspector@6.0.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)): vite-plugin-vue-inspector@6.0.0(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)):
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5)
@@ -3908,11 +4350,11 @@ snapshots:
'@vue/compiler-dom': 3.5.26 '@vue/compiler-dom': 3.5.26
kolorist: 1.8.0 kolorist: 1.8.0
magic-string: 0.30.21 magic-string: 0.30.21
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2): vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0):
dependencies: dependencies:
lightningcss: 1.33.0 lightningcss: 1.33.0
picomatch: 4.0.7 picomatch: 4.0.7
@@ -3923,10 +4365,12 @@ snapshots:
'@types/node': 25.0.3 '@types/node': 25.0.3
esbuild: 0.28.2 esbuild: 0.28.2
fsevents: 2.3.3 fsevents: 2.3.3
sass: 1.104.0
sass-embedded: 1.104.0
vitefu@1.1.3(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)): vitefu@1.1.3(vite@8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)):
optionalDependencies: optionalDependencies:
vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2) vite: 8.2.2(@types/node@25.0.3)(esbuild@0.28.2)(sass-embedded@1.104.0)(sass@1.104.0)
vue@3.5.42(typescript@5.9.3): vue@3.5.42(typescript@5.9.3):
dependencies: dependencies:
+9 -28
View File
@@ -3,34 +3,15 @@ import Link from './top_nav/Link.astro'
import UserAction from './top_nav/UserAction.vue' import UserAction from './top_nav/UserAction.vue'
--- ---
<nav> <nav class="navbar navbar-expand bg-primary-subtle">
<a class="brand" href="/">NV</a> <div class="container-fluid">
<ul class="center"> <a class="brand p-2" href="/">NV</a>
<li><Link href="/auctions">Auctions</Link></li>
<ul class="navbar-nav me-auto">
<li class="nav-item"><Link href="/auctions">Auctions</Link></li>
</ul> </ul>
<ul class="right"> <ul class="navbar-nav">
<li><UserAction client:only /></li> <UserAction client:load />
</ul> </ul>
</div>
</nav> </nav>
<style>
nav {
display: flex;
flex-flow: row nowrap;
width: 100%;
> ul {
list-style: none;
display: flex;
flex-flow: row nowrap;
}
> .center {
margin-inline: auto;
}
> .right {
margin-left: auto;
}
}
</style>
+39 -9
View File
@@ -1,7 +1,9 @@
<script setup> <script setup>
import {ref, computed, onMounted} from "vue"; import {ref, computed, onMounted, defineProps} from "vue";
import {request} from "../lib/gateway.js"; import {request} from "../lib/gateway.js";
import {loadToken} from "../scripts/load_token.js"; import {loadToken} from "../scripts/load_token.js";
import {setAuctionId} from "./current_auction_store.js";
const pending = Symbol('pending') const pending = Symbol('pending')
@@ -9,6 +11,8 @@ const qref = ref(pending)
const isPending = computed(() => qref.value === pending) const isPending = computed(() => qref.value === pending)
const data = computed(() => qref.value.data) const data = computed(() => qref.value.data)
const {path} = defineProps(['path'])
async function loadAuctions() { // TODO: add params async function loadAuctions() { // TODO: add params
let token = loadToken() let token = loadToken()
if(!token.token) return; if(!token.token) return;
@@ -25,19 +29,45 @@ onMounted(async () => {
await loadAuctions() await loadAuctions()
}) })
function formatPrice(price) {
const fmt = new Intl.NumberFormat("en-US", {style: "currency", currency: "USD"}) // TODO: maybe load currency from backend or env
return fmt.format(price)
}
const auctionPath = (id) => path + `?id=${id}`
function navigateToAuction(auction) {
let {id} = auction
let path = auctionPath(id)
history.pushState(id, null, path)
setAuctionId(id)
}
</script> </script>
<template> <template>
<div class="placeholder" v-if="isPending"></div> <template v-if="isPending">
<ul v-else-if="!isPending && data != null && data.length > 0"> <div class="spinner-border me-1" role="status"></div>
<li v-for="auction in data" :key="auction.id"> <span>Loading…</span>
<span>{{ auction.name }}</span> </template>
<span v-if="auction.current_bid">{{ auction.current_bid }}</span> <div v-else-if="!isPending && data != null && data.length > 0" class="auctions-section" role="list">
</li> <div v-for="auction in data" :key="auction.id" class="card" role="listitem">
</ul> <div class="card-body">
<h2 class="h5">
<a :href="auctionPath(auction.id)" @click.prevent="navigateToAuction(auction)">{{ auction.name }}</a>
</h2>
<p class="text-end">{{ formatPrice(auction.currentBid || auction.startingPrice) }}</p>
</div>
</div>
</div>
<p v-else>No auctions available</p> <p v-else>No auctions available</p>
</template> </template>
<style scoped> <style scoped>
.auctions-section {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(20em, 1fr));
gap: 1em;
}
</style> </style>
+60
View File
@@ -0,0 +1,60 @@
<script setup>
import {ref, watch, useTemplateRef, onMounted, defineProps} from "vue";
import {useStore} from "@nanostores/vue";
import {request} from "../lib/gateway.js";
import {loadToken} from "../scripts/load_token.js";
import {$currentAuctionId, resetAuction} from "./current_auction_store.js";
const Loading = Symbol("loading")
const currentAuctionId = useStore($currentAuctionId)
const currentAuction = ref(Loading)
const dialogRef = useTemplateRef('dialog')
const {path} = defineProps(['path'])
const showDialog = () => dialogRef.value.showModal()
async function loadAuction() {
currentAuction.value = Loading
if(currentAuctionId.value == null) return
const res = await request(`/auctions/${currentAuctionId.value}`, {cors: true, token: loadToken().token})
currentAuction.value = await res.json()
showDialog()
}
onMounted(() => {
if(currentAuctionId.value !== null) loadAuction()
})
watch(currentAuctionId,
(val, prevVal) => {
if (val !== null && prevVal == null) loadAuction()
if (val == null) dialogRef.value.close()
},
{flush: 'post'})
</script>
<template>
<dialog ref="dialog" @close="resetAuction(path)">
<div class="card" v-if="currentAuctionId !== null && currentAuction !== Loading">
<div class="card-body">
<h2 class="h5">{{currentAuction.name}}</h2>
<div class="buttons">
<button type="button" class="btn btn-primary">Bid</button>
<button type="button" class="btn btn-outline-secondary" @click="$el.close()">Cancel</button>
</div>
</div>
</div>
</dialog>
</template>
<style scoped>
dialog {
/* TODO: maybe make it global */
min-width: min(90vw, 20rem);
padding: 0;
}
</style>
@@ -0,0 +1,12 @@
import { atom } from "nanostores";
export const $currentAuctionId = atom(null);
export function setAuctionId(data) {
$currentAuctionId.set(data)
}
export function resetAuction(path) {
history.pushState(null, null, path)
$currentAuctionId.set(null)
}
@@ -0,0 +1,6 @@
import {setAuctionId} from "../current_auction_store.js";
window.addEventListener('popstate', (event) => {
let {state} = event
setAuctionId(state)
})
+1
View File
@@ -0,0 +1 @@
import * as bootstrap from 'bootstrap'
+2 -1
View File
@@ -2,9 +2,10 @@ const LOCAL_STORAGE_KEY="token"
export const Anonymous = Symbol("anonymous") export const Anonymous = Symbol("anonymous")
class Token { class Token {
constructor({token, expiresAt}) { constructor({token, expiresAt, userId}) {
this.token = token this.token = token
this.expiresAt = new Date(expiresAt) this.expiresAt = new Date(expiresAt)
this.userId = userId
} }
} }
+1 -1
View File
@@ -3,6 +3,6 @@ const {href} = Astro.props
const isActive = Astro.url.pathname.startsWith(href) const isActive = Astro.url.pathname.startsWith(href)
--- ---
<a class:list={[{active: isActive}]} href={href}> <a class:list={["nav-link", {active: isActive}]} href={href}>
<slot></slot> <slot></slot>
</a> </a>
+24 -9
View File
@@ -1,26 +1,41 @@
<script setup> <script setup>
import {ref, onMounted} from "vue"; import {ref, onMounted} from "vue";
import {loadToken, Anonymous} from "../scripts/load_token.js"; import {loadToken, Anonymous} from "../scripts/load_token.js";
import {request} from "../lib/gateway.js";
const Loading = Symbol("loading") const Loading = Symbol("loading")
const token = ref(Loading) const token = ref(Loading)
const userData = ref(Loading)
onMounted(() => { onMounted(async () => {
token.value = loadToken() let tokenData = loadToken()
token.value = tokenData
if(tokenData !== Anonymous) {
let response = await request("/user_data", {cors: true, token: tokenData.token})
userData.value = await response.json()
} else {
userData.value = null
}
}) })
</script> </script>
<template> <template>
<div v-if="token === Loading" class="placeholder"></div> <!-- TODO: replace with an actual placeholder --> <li :class="['nav-item', {'dropdown': (token !== Loading && token !== Anonymous)}]">
<a href="/login" v-else-if="token === Anonymous">Login</a> <div v-if="token === Loading || userData === Loading" class="placeholder"></div>
<span v-else>{{ token.username || "Username" }}</span> <a v-else-if="token === Anonymous" class="nav-link" href="/login">Login</a>
<template v-else>
<a href="#" class="btn btn-secondary dropdown-toggle" role="button"
data-bs-toggle="dropdown">{{ userData.username || "Username" }}</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a href="#" class="dropdown-item">Logout</a></li>
</ul>
</template>
</li>
</template> </template>
<style scoped> <style scoped>
.placeholder { .placeholder {
display: inline-block; display: inline-block;
width: 2em; width: 2em;
height: 1em; }
background: gray;
}
</style> </style>
+5 -2
View File
@@ -1,5 +1,6 @@
--- ---
import '../styles/app.css' import '../styles/app.scss'
import TopNav from '../components/TopNav.astro' import TopNav from '../components/TopNav.astro'
const {title} = Astro.props const {title} = Astro.props
@@ -13,14 +14,16 @@ const {title} = Astro.props
<link rel="icon" type="image/svg+xml" href="/favicon.svg"/> <link rel="icon" type="image/svg+xml" href="/favicon.svg"/>
<meta name="generator" content={Astro.generator}/> <meta name="generator" content={Astro.generator}/>
<title>Neon Vertigo</title> <title>Neon Vertigo</title>
<script src="../components/scripts/load_token.js"></script> <script src="../components/scripts/load_bootstrap.js"></script>
</head> </head>
<body> <body>
<header> <header>
<TopNav /> <TopNav />
</header> </header>
<main class="container">
<h1>{title}</h1> <h1>{title}</h1>
<slot/> <slot/>
</main>
{import.meta.env.DEV && {import.meta.env.DEV &&
<script> <script>
+4 -1
View File
@@ -2,10 +2,13 @@
import Layout from '../layouts/Layout.astro'; import Layout from '../layouts/Layout.astro';
import Auctions from '../components/auctions/Index.vue' import Auctions from '../components/auctions/Index.vue'
import AuctionShowDialog from '../components/auctions/ShowDialog.vue'
--- ---
<Layout title="Auctions"> <Layout title="Auctions">
<Auctions client:load /> <Auctions path={ Astro.url.pathname } client:load />
<AuctionShowDialog path={ Astro.url.pathname } client:load />
<script src="../components/lib/check_user.js"></script> <script src="../components/lib/check_user.js"></script>
<script src="../components/auctions/scripts/current_auction_store_history.js"></script>
</Layout> </Layout>
-14
View File
@@ -1,14 +0,0 @@
@layer reset, base, components;
@layer reset {
html, body {
margin: 0;
min-height: 100%;
}
}
@layer base {
body {
font-family: Optima, Candara, 'Noto Sans', source-sans-pro, sans-serif;
}
}
+7
View File
@@ -0,0 +1,7 @@
@import "bootstrap/scss/bootstrap";
/* Minor adjustments */
.card-body > p:last-child {
margin-bottom: 0;
}