10 Commits

16 changed files with 179 additions and 130 deletions

View File

@ -34,7 +34,7 @@
"eslint-plugin-svelte": "^2.46.0",
"postcss-nesting": "^13.0.1",
"sass": "^1.81.0",
"svelte": "^5.2.7",
"svelte": "^5.16.0",
"tailwind-merge": "^2.5.5",
"tailwindcss": "^3.4.15",
"three": "^0.170.0",

162
pnpm-lock.yaml generated
View File

@ -55,10 +55,10 @@ dependencies:
version: 2.5.2
flowbite-svelte:
specifier: ^0.47.3
version: 0.47.3(svelte@5.2.7)
version: 0.47.3(svelte@5.16.0)
flowbite-svelte-icons:
specifier: ^2.0.2
version: 2.0.2(svelte@5.2.7)(tailwind-merge@2.5.5)(tailwindcss@3.4.15)
version: 2.0.2(svelte@5.16.0)(tailwind-merge@2.5.5)(tailwindcss@3.4.15)
qs:
specifier: ^6.13.1
version: 6.13.1
@ -67,10 +67,10 @@ dependencies:
version: 0.33.5
svelte-awesome:
specifier: ^3.3.5
version: 3.3.5(svelte@5.2.7)
version: 3.3.5(svelte@5.16.0)
svelte-codemirror-editor:
specifier: ^1.4.1
version: 1.4.1(codemirror@6.0.1)(svelte@5.2.7)
version: 1.4.1(codemirror@6.0.1)(svelte@5.16.0)
svelte-spa-router:
specifier: ^4.0.1
version: 4.0.1
@ -81,7 +81,7 @@ dependencies:
devDependencies:
'@astrojs/svelte':
specifier: ^6.0.2
version: 6.0.2(@types/node@22.9.3)(astro@4.16.14)(sass@1.81.0)(svelte@5.2.7)(typescript@5.7.2)
version: 6.0.2(@types/node@22.9.3)(astro@4.16.14)(sass@1.81.0)(svelte@5.16.0)(typescript@5.7.2)
'@astrojs/tailwind':
specifier: ^5.1.2
version: 5.1.2(astro@4.16.14)(tailwindcss@3.4.15)
@ -123,7 +123,7 @@ devDependencies:
version: 6.10.2(eslint@9.15.0)
eslint-plugin-svelte:
specifier: ^2.46.0
version: 2.46.0(eslint@9.15.0)(svelte@5.2.7)
version: 2.46.0(eslint@9.15.0)(svelte@5.16.0)
postcss-nesting:
specifier: ^13.0.1
version: 13.0.1(postcss@8.4.49)
@ -131,8 +131,8 @@ devDependencies:
specifier: ^1.81.0
version: 1.81.0
svelte:
specifier: ^5.2.7
version: 5.2.7
specifier: ^5.16.0
version: 5.16.0
tailwind-merge:
specifier: ^2.5.5
version: 2.5.5
@ -279,7 +279,7 @@ packages:
zod: 3.23.8
dev: false
/@astrojs/svelte@6.0.2(@types/node@22.9.3)(astro@4.16.14)(sass@1.81.0)(svelte@5.2.7)(typescript@5.7.2):
/@astrojs/svelte@6.0.2(@types/node@22.9.3)(astro@4.16.14)(sass@1.81.0)(svelte@5.16.0)(typescript@5.7.2):
resolution: {integrity: sha512-Jn60LLH+AbjtLIOQuL0SUI0fxMwpT89VraoGkEwF33ZgCT59H8fMQOj9eNf632P/SHRbKpD+Q+PJjODn5OcKoQ==}
engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0}
peerDependencies:
@ -287,10 +287,10 @@ packages:
svelte: ^5.1.16
typescript: ^5.3.3
dependencies:
'@sveltejs/vite-plugin-svelte': 4.0.1(svelte@5.2.7)(vite@5.4.11)
'@sveltejs/vite-plugin-svelte': 4.0.1(svelte@5.16.0)(vite@5.4.11)
astro: 4.16.14(@types/node@22.9.3)(sass@1.81.0)(typescript@5.7.2)
svelte: 5.2.7
svelte2tsx: 0.7.28(svelte@5.2.7)(typescript@5.7.2)
svelte: 5.16.0
svelte2tsx: 0.7.28(svelte@5.16.0)(typescript@5.7.2)
typescript: 5.7.2
vite: 5.4.11(@types/node@22.9.3)(sass@1.81.0)
transitivePeerDependencies:
@ -513,26 +513,21 @@ packages:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
/@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.4)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3):
resolution: {integrity: sha512-1dNIOmiM0z4BIBwxmxEfA1yoxh1MF/6KPBbh20a5vphGV0ictKlgQsbJs6D6SkR6iJpGbpwRsa6PFMNlg9T9pQ==}
peerDependencies:
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
/@codemirror/autocomplete@6.18.4:
resolution: {integrity: sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA==}
dependencies:
'@codemirror/language': 6.10.4
'@codemirror/state': 6.4.1
'@codemirror/view': 6.35.0
'@codemirror/language': 6.10.8
'@codemirror/state': 6.5.0
'@codemirror/view': 6.36.1
'@lezer/common': 1.2.3
dev: false
/@codemirror/commands@6.7.1:
resolution: {integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==}
dependencies:
'@codemirror/language': 6.10.4
'@codemirror/state': 6.4.1
'@codemirror/view': 6.35.0
'@codemirror/language': 6.10.8
'@codemirror/state': 6.5.0
'@codemirror/view': 6.36.1
'@lezer/common': 1.2.3
dev: false
@ -554,19 +549,30 @@ packages:
style-mod: 4.1.2
dev: false
/@codemirror/lint@6.8.3:
resolution: {integrity: sha512-GSGfKxCo867P7EX1k2LoCrjuQFeqVgPGRRsSl4J4c0KMkD+k1y6WYvTQkzv0iZ8JhLJDujEvlnMchv4CZQLh3Q==}
/@codemirror/language@6.10.8:
resolution: {integrity: sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==}
dependencies:
'@codemirror/state': 6.4.1
'@codemirror/view': 6.35.0
'@codemirror/state': 6.5.0
'@codemirror/view': 6.36.1
'@lezer/common': 1.2.3
'@lezer/highlight': 1.2.1
'@lezer/lr': 1.4.2
style-mod: 4.1.2
dev: false
/@codemirror/lint@6.8.4:
resolution: {integrity: sha512-u4q7PnZlJUojeRe8FJa/njJcMctISGgPQ4PnWsd9268R4ZTtU+tfFYmwkBvgcrK2+QQ8tYFVALVb5fVJykKc5A==}
dependencies:
'@codemirror/state': 6.5.0
'@codemirror/view': 6.36.1
crelt: 1.0.6
dev: false
/@codemirror/search@6.5.8:
resolution: {integrity: sha512-PoWtZvo7c1XFeZWmmyaOp2G0XVbOnm+fJzvghqGAktBW3cufwJUWvSCcNG0ppXiBEM05mZu6RhMtXPv2hpllig==}
dependencies:
'@codemirror/state': 6.4.1
'@codemirror/view': 6.35.0
'@codemirror/state': 6.5.0
'@codemirror/view': 6.36.1
crelt: 1.0.6
dev: false
@ -574,6 +580,12 @@ packages:
resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==}
dev: false
/@codemirror/state@6.5.0:
resolution: {integrity: sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==}
dependencies:
'@marijn/find-cluster-break': 1.0.2
dev: false
/@codemirror/view@6.35.0:
resolution: {integrity: sha512-I0tYy63q5XkaWsJ8QRv5h6ves7kvtrBWjBcnf/bzohFJQc5c14a1AQRdE8QpPF9eMp5Mq2FMm59TCj1gDfE7kw==}
dependencies:
@ -582,6 +594,14 @@ packages:
w3c-keyname: 2.2.8
dev: false
/@codemirror/view@6.36.1:
resolution: {integrity: sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ==}
dependencies:
'@codemirror/state': 6.5.0
style-mod: 4.1.2
w3c-keyname: 2.2.8
dev: false
/@csstools/selector-resolve-nested@3.0.0(postcss-selector-parser@7.0.0):
resolution: {integrity: sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==}
engines: {node: '>=18'}
@ -1364,6 +1384,10 @@ packages:
'@lezer/common': 1.2.3
dev: false
/@marijn/find-cluster-break@1.0.2:
resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
dev: false
/@mdx-js/mdx@3.1.0(acorn@8.14.0):
resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==}
dependencies:
@ -1796,7 +1820,7 @@ packages:
/@shikijs/vscode-textmate@9.3.0:
resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==}
/@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.1)(svelte@5.2.7)(vite@5.4.11):
/@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.1)(svelte@5.16.0)(vite@5.4.11):
resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22}
peerDependencies:
@ -1804,27 +1828,27 @@ packages:
svelte: ^5.0.0-next.96 || ^5.0.0
vite: ^5.0.0
dependencies:
'@sveltejs/vite-plugin-svelte': 4.0.1(svelte@5.2.7)(vite@5.4.11)
'@sveltejs/vite-plugin-svelte': 4.0.1(svelte@5.16.0)(vite@5.4.11)
debug: 4.3.7
svelte: 5.2.7
svelte: 5.16.0
vite: 5.4.11(@types/node@22.9.3)(sass@1.81.0)
transitivePeerDependencies:
- supports-color
dev: true
/@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.7)(vite@5.4.11):
/@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.16.0)(vite@5.4.11):
resolution: {integrity: sha512-prXoAE/GleD2C4pKgHa9vkdjpzdYwCSw/kmjw6adIyu0vk5YKCfqIztkLg10m+kOYnzZu3bb0NaPTxlWre2a9Q==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22}
peerDependencies:
svelte: ^5.0.0-next.96 || ^5.0.0
vite: ^5.0.0
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.1)(svelte@5.2.7)(vite@5.4.11)
'@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.1)(svelte@5.16.0)(vite@5.4.11)
debug: 4.3.7
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.13
svelte: 5.2.7
svelte: 5.16.0
vite: 5.4.11(@types/node@22.9.3)(sass@1.81.0)
vitefu: 1.0.3(vite@5.4.11)
transitivePeerDependencies:
@ -2762,18 +2786,16 @@ packages:
resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==}
dev: false
/codemirror@6.0.1(@lezer/common@1.2.3):
/codemirror@6.0.1:
resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
dependencies:
'@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.4)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3)
'@codemirror/autocomplete': 6.18.4
'@codemirror/commands': 6.7.1
'@codemirror/language': 6.10.4
'@codemirror/lint': 6.8.3
'@codemirror/language': 6.10.8
'@codemirror/lint': 6.8.4
'@codemirror/search': 6.5.8
'@codemirror/state': 6.4.1
'@codemirror/view': 6.35.0
transitivePeerDependencies:
- '@lezer/common'
'@codemirror/state': 6.5.0
'@codemirror/view': 6.36.1
dev: false
/collapse-white-space@2.1.0:
@ -3404,7 +3426,7 @@ packages:
string.prototype.includes: 2.0.1
dev: true
/eslint-plugin-svelte@2.46.0(eslint@9.15.0)(svelte@5.2.7):
/eslint-plugin-svelte@2.46.0(eslint@9.15.0)(svelte@5.16.0):
resolution: {integrity: sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==}
engines: {node: ^14.17.0 || >=16.0.0}
peerDependencies:
@ -3425,8 +3447,8 @@ packages:
postcss-safe-parser: 6.0.0(postcss@8.4.49)
postcss-selector-parser: 6.1.2
semver: 7.6.3
svelte: 5.2.7
svelte-eslint-parser: 0.43.0(svelte@5.2.7)
svelte: 5.16.0
svelte-eslint-parser: 0.43.0(svelte@5.16.0)
transitivePeerDependencies:
- ts-node
dev: true
@ -3505,8 +3527,8 @@ packages:
- supports-color
dev: true
/esm-env@1.1.4:
resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==}
/esm-env@1.2.1:
resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==}
/espree@10.3.0:
resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
@ -3538,11 +3560,10 @@ packages:
estraverse: 5.3.0
dev: true
/esrap@1.2.2:
resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==}
/esrap@1.3.2:
resolution: {integrity: sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==}
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
'@types/estree': 1.0.6
/esrecurse@4.3.0:
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
@ -3724,7 +3745,7 @@ packages:
- rollup
dev: false
/flowbite-svelte-icons@2.0.2(svelte@5.2.7)(tailwind-merge@2.5.5)(tailwindcss@3.4.15):
/flowbite-svelte-icons@2.0.2(svelte@5.16.0)(tailwind-merge@2.5.5)(tailwindcss@3.4.15):
resolution: {integrity: sha512-Vkmduy2867Rk8R7TziPirsWkixJnToFBEXRaN4ouJabOx62NQjiBbHFe+HTaMOQmdp4FNMI2Nhtk2I2CQ8r3RQ==}
engines: {node: '>=18.0.0', npm: '>=7.0.0'}
peerDependencies:
@ -3732,12 +3753,12 @@ packages:
tailwind-merge: ^2.3.0
tailwindcss: ^3.4.3
dependencies:
svelte: 5.2.7
svelte: 5.16.0
tailwind-merge: 2.5.5
tailwindcss: 3.4.15
dev: false
/flowbite-svelte@0.47.3(svelte@5.2.7):
/flowbite-svelte@0.47.3(svelte@5.16.0):
resolution: {integrity: sha512-1Wdbx+YV6S20dnnMERr/XFNjO+sb22QOrZtIK0Wa8SXxxuYPmbkT3b4mR4TYwUWvWheXsWvlcPLSlV8YGJgItw==}
engines: {node: '>=18.0.0', pnpm: '>=8.0.0'}
peerDependencies:
@ -3746,7 +3767,7 @@ packages:
'@floating-ui/dom': 1.6.12
apexcharts: 3.54.1
flowbite: 2.5.2
svelte: 5.2.7
svelte: 5.16.0
tailwind-merge: 2.5.5
transitivePeerDependencies:
- rollup
@ -6542,25 +6563,25 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
/svelte-awesome@3.3.5(svelte@5.2.7):
/svelte-awesome@3.3.5(svelte@5.16.0):
resolution: {integrity: sha512-RIi+OI6CEn+fTdYy7UOgImEUWvdQSwP9SiMC44UKyFO+8+gjj+NgTG67hI8j2rTHQVvCP820Uj+4UoZG8CCUfA==}
peerDependencies:
svelte: '>= 3.43.1 < 6'
dependencies:
svelte: 5.2.7
svelte: 5.16.0
dev: false
/svelte-codemirror-editor@1.4.1(codemirror@6.0.1)(svelte@5.2.7):
/svelte-codemirror-editor@1.4.1(codemirror@6.0.1)(svelte@5.16.0):
resolution: {integrity: sha512-Pv350iro0Y/AZTT/y2OLaonheQqAwl50Hdfipa2Jv1Z04TSP5kPUyxQnRjqxeRW7DXOX9s5Nd11tHdBl9iYSzw==}
peerDependencies:
codemirror: ^6.0.0
svelte: ^3.0.0 || ^4.0.0 || ^5.0.0
dependencies:
codemirror: 6.0.1(@lezer/common@1.2.3)
svelte: 5.2.7
codemirror: 6.0.1
svelte: 5.16.0
dev: false
/svelte-eslint-parser@0.43.0(svelte@5.2.7):
/svelte-eslint-parser@0.43.0(svelte@5.16.0):
resolution: {integrity: sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -6574,7 +6595,7 @@ packages:
espree: 9.6.1
postcss: 8.4.49
postcss-scss: 4.0.9(postcss@8.4.49)
svelte: 5.2.7
svelte: 5.16.0
dev: true
/svelte-spa-router@4.0.1:
@ -6583,7 +6604,7 @@ packages:
regexparam: 2.0.2
dev: false
/svelte2tsx@0.7.28(svelte@5.2.7)(typescript@5.7.2):
/svelte2tsx@0.7.28(svelte@5.16.0)(typescript@5.7.2):
resolution: {integrity: sha512-TJjA+kU8AnkyoprZPgQACMfTX8N0MA5NsIL//h9IuHOxmmaCLluqhcZU+fCkWipi5c/pooHLFOMpqjhq4v7JLQ==}
peerDependencies:
svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0
@ -6591,12 +6612,12 @@ packages:
dependencies:
dedent-js: 1.0.1
pascal-case: 3.1.2
svelte: 5.2.7
svelte: 5.16.0
typescript: 5.7.2
dev: true
/svelte@5.2.7:
resolution: {integrity: sha512-cEhPGuLHiH2+Z8B1FwQgiZJgA39uUmJR4516TKrM5zrp0/cuwJkfhUfcTxhAkznanAF5fXUKzvYR4o+Ksx3ZCQ==}
/svelte@5.16.0:
resolution: {integrity: sha512-Ygqsiac6UogVED2ruKclU+pOeMThxWtp9LG+li7BXeDKC2paVIsRTMkNmcON4Zejerd1s5sZHWx6ZtU85xklVg==}
engines: {node: '>=18'}
dependencies:
'@ampproject/remapping': 2.3.0
@ -6606,8 +6627,9 @@ packages:
acorn-typescript: 1.4.13(acorn@8.14.0)
aria-query: 5.3.2
axobject-query: 4.1.0
esm-env: 1.1.4
esrap: 1.2.2
clsx: 2.1.1
esm-env: 1.2.1
esrap: 1.3.2
is-reference: 3.0.3
locate-character: 3.0.0
magic-string: 0.30.13

View File

@ -42,7 +42,7 @@
}
</script>
<div>
<div class="p-3 bg-gray-200 dark:bg-neutral-800 rounded-2xl w-3/4 mx-auto">
<table>
<thead>
<tr class="font-bold border-b">
@ -71,9 +71,3 @@
</tbody>
</table>
</div>
<style lang="scss">
div {
@apply p-3 bg-gray-200 dark:bg-neutral-800 rounded-2xl w-3/4 mx-auto;
}
</style>

View File

@ -48,8 +48,8 @@
}).sort((a, b) => b.points - a.points);
</script>
<div>
<table>
<div class="p-3 bg-gray-200 dark:bg-neutral-800 rounded-2xl w-3/4 mx-auto">
<table class="w-full">
<thead>
<tr class="font-bold border-b">
{#each Array(rows) as i (i)}
@ -70,12 +70,3 @@
</tbody>
</table>
</div>
<style lang="scss">
table {
@apply w-full;
}
div {
@apply p-3 bg-gray-200 dark:bg-neutral-800 rounded-2xl w-3/4 mx-auto;
}
</style>

View File

@ -43,8 +43,6 @@
let member = $state(event.maxTeamMembers);
let schemType = $state(event.schemType);
let publicOnly = $state(event.publicSchemsOnly);
let addReferee: {name: string, id: number}[] = [];
let removeReferee: {name: string, id: number}[] = [];
let errorOpen = $state(false);
let error: any = $state(undefined);
@ -69,9 +67,7 @@
endDate.diff(dayjs(event.end)) !== 0 ||
member !== event.maxTeamMembers ||
schemType != event.schemType ||
publicOnly !== event.publicSchemsOnly ||
addReferee.length > 0 ||
removeReferee.length > 0);
publicOnly !== event.publicSchemsOnly);
async function del() {
@ -95,8 +91,8 @@
publicSchemsOnly: publicOnly,
schemType: schemType ?? "null",
start: startDate,
addReferee: addReferee.map((ref) => ref.id),
removeReferee: removeReferee.map((ref) => ref.id)
addReferee: [],
removeReferee: []
};
try {

View File

@ -19,7 +19,7 @@
<script lang="ts">
import {EditOutline, TrashBinOutline} from "flowbite-svelte-icons";
import {Button, Modal, Toolbar, ToolbarButton} from "flowbite-svelte";
import {Button, Checkbox, Modal, Toolbar, ToolbarButton} from "flowbite-svelte";
import type {EventFight, ExtendedEvent} from "@type/event.ts";
import FightEditModal from "./modals/FightEditModal.svelte";
import {createEventDispatcher} from "svelte";
@ -32,6 +32,8 @@
i: number;
selected?: boolean;
hideEdit?: boolean;
select: () => void;
update: () => void;
}
let {
@ -39,29 +41,34 @@
data = $bindable(),
i,
selected = false,
hideEdit = false
hideEdit = false,
select,
update,
}: Props = $props();
let deleteOpen = $state(false);
let editOpen = $state(false);
let dispatcher = createEventDispatcher();
function dispatchSelect() {
setTimeout(() => {
if (!deleteOpen && !editOpen) {
dispatcher("select");
select();
}
}, 1);
}
async function deleteFight() {
await $fightRepo.deleteFight(fight.id);
dispatcher("update");
update();
}
let isUneven = $derived(i % 2 === 0);
</script>
<div class="flex h-16 {i % 2 === 0 ? 'bg-gray-800' : ''} mx-4 mt-6 rounded border {selected ? 'border-orange-700' : 'border-gray-700'} p-2 hover:bg-gray-700 transition justify-between shadow-lg cursor-pointer"
<div class={{"flex h-16 mx-4 mt-6 rounded border p-2 hover:bg-gray-700 transition justify-between shadow-lg cursor-pointer": true,
"bg-gray-800": isUneven,
"border-orange-700": selected,
"border-gray-700": !selected}}
onclick={dispatchSelect} onkeypress={dispatchSelect} role="checkbox" aria-checked={selected} tabindex="0"
>
<div class="flex">

View File

@ -82,7 +82,7 @@
} else {
groupFights.forEach(fight => selectedFights.add(fight));
}
selectedFights = selectedFights;
selectedFights = new Set(selectedFights);
}
let deleteOpen = $state(false);
@ -227,16 +227,17 @@
<h1 class="ml-4 text-2xl">{group.group ?? "Ungrouped"}</h1>
</div>
{#each group.fights.sort((a, b) => a.start - b.start) as fight, i (fight.id)}
<FightCard {fight} {i} {data} selected={selectedFights.has(fight)}
on:select={() => {
{@const isSelected = selectedFights.has(fight)}
<FightCard {fight} {i} {data} selected={isSelected}
select={() => {
if (selectedFights.has(fight)) {
selectedFights.delete(fight);
} else {
selectedFights.add(fight);
}
selectedFights = selectedFights;
}}
on:update={async () => fights = await $fightRepo.listFights(data.event.id)}
selectedFights = new Set(selectedFights);
}} update={async () => fights = await $fightRepo.listFights(data.event.id)}
/>
{/each}
{/each}

View File

@ -43,6 +43,14 @@
async function addReferee() {
if (selectedPlayer) {
referees = (await $eventRepo.updateEvent(data.event.id.toString(), {
deadline: null,
end: null,
maxTeamMembers: null,
name: null,
publicSchemsOnly: null,
removeReferee: null,
schemType: null,
start: null,
addReferee: [selectedPlayer]
})).referees;
}
@ -53,7 +61,15 @@
function removeReferee(id: string) {
return async () => {
referees = (await $eventRepo.updateEvent(data.event.id.toString(), {
removeReferee: [id]
deadline: null,
end: null,
maxTeamMembers: null,
name: null,
publicSchemsOnly: null,
addReferee: null,
schemType: null,
start: null,
removeReferee: [id],
})).referees;
}
}

View File

@ -35,12 +35,13 @@
open?: boolean;
}
let { fight = $bindable(), data, open = $bindable(false) }: Props = $props();
let { fight = $bindable(), data = $bindable(), open = $bindable(false) }: Props = $props();
let redTeam = $state(fight.redTeam.id.toString());
let blueTeam = $state(fight.blueTeam.id.toString());
let start = $state(dayjs(fight.start).utc(true).toISOString().slice(0, -1));
let spectatePort = $state(fight.spectatePort?.toString() ?? null);
$inspect(spectatePort, fight.spectatePort)
let gamemode = $state(fight.spielmodus);
let map = $state(fight.map);
let group = $state(fight.group);
@ -62,6 +63,8 @@
start: dayjs(start)
};
console.log(update)
$fightRepo.updateFight(fight.id, update)
.then(value => {
open = false;

View File

@ -31,15 +31,15 @@ export interface CreateEvent {
}
export interface UpdateEvent {
name?: string;
start?: Dayjs;
end?: Dayjs;
deadline?: Dayjs;
maxTeamMembers?: number;
schemType?: string | null;
publicSchemsOnly?: boolean;
addReferee?: string[];
removeReferee?: string[];
name: string | null;
start: Dayjs | null;
end: Dayjs | null;
deadline: Dayjs | null;
maxTeamMembers: number | null;
schemType: string | null;
publicSchemsOnly: boolean | null;
addReferee: string[] | null;
removeReferee: string[] | null;
}
export class EventRepo {

View File

@ -80,7 +80,7 @@ export class FightRepo {
blueTeam: fight.blueTeam,
redTeam: fight.redTeam,
start: fight.start?.valueOf(),
spectatePort: fight.spectatePort ?? 0,
spectatePort: fight.spectatePort,
group: fight.group,
}),
}).then(value => value.json())

View File

@ -0,0 +1,17 @@
---
title: Neujahrsevent 2025 Eventplan
key: Neujahrsevent-2025-eventplan
description: Der Kampfplan für das Neujahrsevent 2025.
created: 2025-01-01
tags:
- event
- microwargear
---
# Gruppenphase
<group-table data-event="64"> </group-table>
## Kampfplan
<fight-table data-event="64" data-group="Gruppe 1"> </fight-table>

View File

@ -11,8 +11,8 @@ image: ../../../images/SchneeballschlachtMWG.png
# Gruppenphase
<group-table data-event="65" />
<group-table data-event="65"> </group-table>
## Kampfplan
<fight-table data-event="65" data-group="Gruppe 1" />
<fight-table data-event="65" data-group="Gruppe 1"> </fight-table>

View File

@ -146,7 +146,8 @@
"winner": "Sieger",
"notPlayed": "Nicht gespielt",
"draw": "Unentschieden",
"points": "Punkte"
"points": "Punkte",
"team": "Team"
}
},
"blog": {

View File

@ -109,6 +109,7 @@ const ogImage = await getImage({
import GroupTable from "@components/GroupTable.svelte";
import {eventRepo} from "../../components/repo/event";
import type {ExtendedEvent} from "@type/event";
import {mount} from "svelte";
const eventMounts: Map<string, ((ev: ExtendedEvent) => void)[]> = new Map();
@ -119,7 +120,7 @@ const ogImage = await getImage({
}
const rows = Number.parseInt(this.dataset["rows"]!);
eventMounts.get(this.dataset["event"]!)!.push(ev => {
new FightTable({
mount(FightTable, {
target: this,
props: {
event: ev,
@ -138,7 +139,7 @@ const ogImage = await getImage({
}
const rows = Number.parseInt(this.dataset["rows"]!);
eventMounts.get(this.dataset["event"]!)!.push(ev => {
new GroupTable({
mount(GroupTable, {
target: this,
props: {
event: ev,

View File

@ -18,7 +18,7 @@
*/
table {
@apply w-full rounded-2xl shadow-lg overflow-clip;
@apply w-full overflow-clip;
:not(:has([data-no-head])) {
}