feat: website, landing page, etc

This commit is contained in:
ThaUnknown 2023-11-27 01:42:54 +01:00
parent d453aca9a2
commit 1f742452a4
35 changed files with 1407 additions and 35 deletions

View file

@ -41,6 +41,7 @@ export default async function ({ media, episode }) {
}),
sleep(5000)
])
for (const { hash, complete, downloaded, incomplete } of updated || []) {
const found = mapped.find(mapped => mapped.hash === hash)
found.downloads = downloaded

View file

@ -21,11 +21,11 @@
"electron": "25.1.0",
"electron-builder": "^24.6.4",
"electron-log": "^5.0.1",
"electron-updater": "^6.1.4"
"electron-updater": "^6.1.4",
"webpack-merge": "^5.10.0"
},
"dependencies": {
"utp-native": "^2.5.3",
"webpack-merge": "^5.10.0"
"utp-native": "^2.5.3"
},
"standard": {
"ignore": [

View file

@ -228,9 +228,6 @@ importers:
utp-native:
specifier: ^2.5.3
version: 2.5.3
webpack-merge:
specifier: ^5.10.0
version: 5.10.0
devDependencies:
'@electron/notarize':
specifier: ^2.2.0
@ -253,6 +250,33 @@ importers:
electron-updater:
specifier: ^6.1.4
version: 6.1.4
webpack-merge:
specifier: ^5.10.0
version: 5.10.0
web:
devDependencies:
'@sveltejs/adapter-auto':
specifier: ^2.0.0
version: 2.0.0(@sveltejs/kit@1.27.4)
'@sveltejs/adapter-static':
specifier: ^2.0.3
version: 2.0.3(@sveltejs/kit@1.27.4)
'@sveltejs/kit':
specifier: ^1.27.4
version: 1.27.4(svelte@4.2.7)(vite@4.4.2)
svelte:
specifier: ^4.2.7
version: 4.2.7
svelte-check:
specifier: ^3.6.0
version: 3.6.0(postcss@8.4.31)(svelte@4.2.7)
typescript:
specifier: ^5.0.0
version: 5.3.2
vite:
specifier: ^4.4.2
version: 4.4.2
packages:
@ -271,7 +295,6 @@ packages:
dependencies:
'@jridgewell/gen-mapping': 0.3.3
'@jridgewell/trace-mapping': 0.3.20
dev: false
/@babel/code-frame@7.22.13:
resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==}
@ -497,6 +520,204 @@ packages:
- supports-color
dev: true
/@esbuild/android-arm64@0.18.20:
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-arm@0.18.20:
resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-x64@0.18.20:
resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-arm64@0.18.20:
resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-x64@0.18.20:
resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-arm64@0.18.20:
resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-x64@0.18.20:
resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm64@0.18.20:
resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm@0.18.20:
resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ia32@0.18.20:
resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-loong64@0.18.20:
resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-mips64el@0.18.20:
resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ppc64@0.18.20:
resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-riscv64@0.18.20:
resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-s390x@0.18.20:
resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-x64@0.18.20:
resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/netbsd-x64@0.18.20:
resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/openbsd-x64@0.18.20:
resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/sunos-x64@0.18.20:
resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-arm64@0.18.20:
resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-ia32@0.18.20:
resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-x64@0.18.20:
resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@eslint-community/eslint-utils@4.4.0(eslint@8.54.0):
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -534,6 +755,11 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: false
/@fastify/busboy@2.1.0:
resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==}
engines: {node: '>=14'}
dev: true
/@fontsource-variable/material-symbols-outlined@5.0.16:
resolution: {integrity: sha512-XqGrDFJ15dNHeD4tT4imnTqrPhNb5C49hXwlfGcvcfV64BxFX0S4mq41q/34kxlObnShqKIqHwvxd9SPtG3H/g==}
dev: false
@ -741,6 +967,10 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0
/@polka/url@1.0.0-next.23:
resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==}
dev: true
/@prettier/plugin-xml@2.2.0:
resolution: {integrity: sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==}
dependencies:
@ -767,6 +997,87 @@ packages:
engines: {node: '>=10'}
dev: true
/@sveltejs/adapter-auto@2.0.0(@sveltejs/kit@1.27.4):
resolution: {integrity: sha512-b+gkHFZgD771kgV3aO4avHFd7y1zhmMYy9i6xOK7m/rwmwaRO8gnF5zBc0Rgca80B2PMU1bKNxyBTHA14OzUAQ==}
peerDependencies:
'@sveltejs/kit': ^1.0.0
dependencies:
'@sveltejs/kit': 1.27.4(svelte@4.2.7)(vite@4.4.2)
import-meta-resolve: 2.2.2
dev: true
/@sveltejs/adapter-static@2.0.3(@sveltejs/kit@1.27.4):
resolution: {integrity: sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==}
peerDependencies:
'@sveltejs/kit': ^1.5.0
dependencies:
'@sveltejs/kit': 1.27.4(svelte@4.2.7)(vite@4.4.2)
dev: true
/@sveltejs/kit@1.27.4(svelte@4.2.7)(vite@4.4.2):
resolution: {integrity: sha512-Vxl8Jf0C1+/8i/slsxFOnwJntCBDLueO/O6GJ0390KUnyW3Zs+4ZiIinD+cEcYnJPQQ9CRzVSr9Bn6DbmTn4Dw==}
engines: {node: ^16.14 || >=18}
hasBin: true
requiresBuild: true
peerDependencies:
svelte: ^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0
vite: ^4.0.0
dependencies:
'@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.2.7)(vite@4.4.2)
'@types/cookie': 0.5.4
cookie: 0.5.0
devalue: 4.3.2
esm-env: 1.0.0
kleur: 4.1.5
magic-string: 0.30.5
mrmime: 1.0.1
sade: 1.8.1
set-cookie-parser: 2.6.0
sirv: 2.0.3
svelte: 4.2.7
tiny-glob: 0.2.9
undici: 5.26.5
vite: 4.4.2
transitivePeerDependencies:
- supports-color
dev: true
/@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@4.2.7)(vite@4.4.2):
resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==}
engines: {node: ^14.18.0 || >= 16}
peerDependencies:
'@sveltejs/vite-plugin-svelte': ^2.2.0
svelte: ^3.54.0 || ^4.0.0
vite: ^4.0.0
dependencies:
'@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.2.7)(vite@4.4.2)
debug: 4.3.4
svelte: 4.2.7
vite: 4.4.2
transitivePeerDependencies:
- supports-color
dev: true
/@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.2.7)(vite@4.4.2):
resolution: {integrity: sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==}
engines: {node: ^14.18.0 || >= 16}
peerDependencies:
svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0
vite: ^4.0.0
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@4.2.7)(vite@4.4.2)
debug: 4.3.4
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.5
svelte: 4.2.7
svelte-hmr: 0.15.3(svelte@4.2.7)
vite: 4.4.2
vitefu: 0.2.5(vite@4.4.2)
transitivePeerDependencies:
- supports-color
dev: true
/@szmarczak/http-timer@4.0.6:
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
engines: {node: '>=10'}
@ -909,6 +1220,10 @@ packages:
dependencies:
'@types/node': 20.9.5
/@types/cookie@0.5.4:
resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==}
dev: true
/@types/debug@4.1.12:
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
dependencies:
@ -1029,6 +1344,10 @@ packages:
dev: true
optional: true
/@types/pug@2.0.10:
resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==}
dev: true
/@types/qs@6.9.10:
resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==}
@ -1509,7 +1828,6 @@ packages:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
dependencies:
dequal: 2.0.3
dev: false
/array-buffer-byte-length@1.0.0:
resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
@ -1646,7 +1964,6 @@ packages:
resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
dependencies:
dequal: 2.0.3
dev: false
/b4a@1.6.4:
resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==}
@ -2120,7 +2437,6 @@ packages:
/callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
dev: false
/camel-case@4.1.2:
resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
@ -2314,7 +2630,6 @@ packages:
acorn: 8.11.2
estree-walker: 3.0.3
periscopic: 3.1.0
dev: false
/color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
@ -2825,7 +3140,6 @@ packages:
dependencies:
mdn-data: 2.0.30
source-map-js: 1.0.2
dev: false
/css-what@6.1.0:
resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
@ -2918,6 +3232,11 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: false
/deepmerge@4.3.1:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
dev: true
/default-gateway@6.0.3:
resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==}
engines: {node: '>= 10'}
@ -2979,7 +3298,6 @@ packages:
/dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
dev: false
/des.js@1.1.0:
resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==}
@ -2992,6 +3310,11 @@ packages:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
/detect-indent@6.1.0:
resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
engines: {node: '>=8'}
dev: true
/detect-libc@1.0.3:
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
engines: {node: '>=0.10'}
@ -3006,6 +3329,10 @@ packages:
/detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
/devalue@4.3.2:
resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==}
dev: true
/diff@4.0.2:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'}
@ -3403,6 +3730,40 @@ packages:
resolution: {integrity: sha512-uoA4aVplXI9oqUYJFBAVRwAqIN9/n9JgrTAUGX3qPbnSZVE5yY1+6/MsoN5f4xsaPO62WjPHOdtts6okMN6tNA==}
dev: false
/es6-promise@3.3.1:
resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
dev: true
/esbuild@0.18.20:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.18.20
'@esbuild/android-arm64': 0.18.20
'@esbuild/android-x64': 0.18.20
'@esbuild/darwin-arm64': 0.18.20
'@esbuild/darwin-x64': 0.18.20
'@esbuild/freebsd-arm64': 0.18.20
'@esbuild/freebsd-x64': 0.18.20
'@esbuild/linux-arm': 0.18.20
'@esbuild/linux-arm64': 0.18.20
'@esbuild/linux-ia32': 0.18.20
'@esbuild/linux-loong64': 0.18.20
'@esbuild/linux-mips64el': 0.18.20
'@esbuild/linux-ppc64': 0.18.20
'@esbuild/linux-riscv64': 0.18.20
'@esbuild/linux-s390x': 0.18.20
'@esbuild/linux-x64': 0.18.20
'@esbuild/netbsd-x64': 0.18.20
'@esbuild/openbsd-x64': 0.18.20
'@esbuild/sunos-x64': 0.18.20
'@esbuild/win32-arm64': 0.18.20
'@esbuild/win32-ia32': 0.18.20
'@esbuild/win32-x64': 0.18.20
dev: true
/escalade@3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
@ -3652,6 +4013,10 @@ packages:
- supports-color
dev: false
/esm-env@1.0.0:
resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==}
dev: true
/espree@9.6.1:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -3686,7 +4051,6 @@ packages:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
dependencies:
'@types/estree': 1.0.5
dev: false
/esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
@ -4225,6 +4589,10 @@ packages:
dependencies:
define-properties: 1.2.1
/globalyzer@0.1.0:
resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
dev: true
/globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'}
@ -4247,6 +4615,10 @@ packages:
slash: 4.0.0
dev: false
/globrex@0.1.2:
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
dev: true
/gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
dependencies:
@ -4590,7 +4962,6 @@ packages:
dependencies:
parent-module: 1.0.1
resolve-from: 4.0.0
dev: false
/import-local@3.1.0:
resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
@ -4600,6 +4971,10 @@ packages:
pkg-dir: 4.2.0
resolve-cwd: 3.0.0
/import-meta-resolve@2.2.2:
resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==}
dev: true
/imurmurhash@0.1.4:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
@ -4825,7 +5200,6 @@ packages:
resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
dependencies:
'@types/estree': 1.0.5
dev: false
/is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
@ -5121,7 +5495,6 @@ packages:
/locate-character@3.0.0:
resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
dev: false
/locate-path@2.0.0:
resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==}
@ -5201,12 +5574,18 @@ packages:
- supports-color
dev: false
/magic-string@0.27.0:
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
/magic-string@0.30.5:
resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
dev: false
/magnet-uri@7.0.5:
resolution: {integrity: sha512-Ke+dDiYHK1Rq/ZyGUAgk7NIkoypivxolTj/A0qr60ypP0FjeP+NTUNEhr965HsRan0zGxKEBK73+SsjRyJWkXg==}
@ -5258,7 +5637,6 @@ packages:
/mdn-data@2.0.30:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
dev: false
/media-typer@0.3.0:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
@ -5457,6 +5835,13 @@ packages:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
dev: true
/mkdirp@0.5.6:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
dependencies:
minimist: 1.2.8
dev: true
/mkdirp@1.0.4:
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
engines: {node: '>=10'}
@ -5467,6 +5852,16 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
dev: true
/mrmime@1.0.1:
resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
engines: {node: '>=10'}
dev: true
/ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
@ -5487,7 +5882,6 @@ packages:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
dev: false
/napi-build-utils@1.0.2:
resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
@ -5873,7 +6267,6 @@ packages:
engines: {node: '>=6'}
dependencies:
callsites: 3.1.0
dev: false
/parse-asn1@5.1.6:
resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==}
@ -6001,7 +6394,6 @@ packages:
'@types/estree': 1.0.5
estree-walker: 3.0.3
is-reference: 3.0.2
dev: false
/picocolors@1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
@ -6139,7 +6531,6 @@ packages:
nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.0.2
dev: false
/prebuild-install@7.1.1:
resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==}
@ -6491,7 +6882,6 @@ packages:
/resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
dev: false
/resolve-from@5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
@ -6528,6 +6918,13 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
/rimraf@2.7.1:
resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
hasBin: true
dependencies:
glob: 7.2.3
dev: true
/rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
hasBin: true
@ -6561,6 +6958,14 @@ packages:
dev: true
optional: true
/rollup@3.29.4:
resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
optionalDependencies:
fsevents: 2.3.3
dev: true
/run-parallel-limit@1.1.0:
resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==}
dependencies:
@ -6585,6 +6990,13 @@ packages:
tslib: 2.6.2
dev: false
/sade@1.8.1:
resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
engines: {node: '>=6'}
dependencies:
mri: 1.2.0
dev: true
/safe-array-concat@1.0.1:
resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
engines: {node: '>=0.4'}
@ -6610,6 +7022,15 @@ packages:
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
/sander@0.5.1:
resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
dependencies:
es6-promise: 3.3.1
graceful-fs: 4.2.11
mkdirp: 0.5.6
rimraf: 2.7.1
dev: true
/sanitize-filename@1.6.3:
resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==}
dependencies:
@ -6737,6 +7158,10 @@ packages:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
dev: true
/set-cookie-parser@2.6.0:
resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
dev: true
/set-function-length@1.1.1:
resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==}
engines: {node: '>= 0.4'}
@ -6889,6 +7314,15 @@ packages:
semver: 7.5.4
dev: true
/sirv@2.0.3:
resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==}
engines: {node: '>= 10'}
dependencies:
'@polka/url': 1.0.0-next.23
mrmime: 1.0.1
totalist: 3.0.1
dev: true
/sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
@ -6939,10 +7373,19 @@ packages:
smart-buffer: 4.2.0
dev: false
/sorcery@0.11.0:
resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==}
hasBin: true
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
buffer-crc32: 0.2.13
minimist: 1.2.8
sander: 0.5.1
dev: true
/source-map-js@1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'}
dev: false
/source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
@ -7065,19 +7508,11 @@ packages:
xtend: 4.0.2
dev: true
/streamx@2.15.1:
resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==}
dependencies:
fast-fifo: 1.3.2
queue-tick: 1.0.1
dev: true
/streamx@2.15.5:
resolution: {integrity: sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==}
dependencies:
fast-fifo: 1.3.2
queue-tick: 1.0.1
dev: false
/string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
@ -7198,6 +7633,33 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
/svelte-check@3.6.0(postcss@8.4.31)(svelte@4.2.7):
resolution: {integrity: sha512-8VfqhfuRJ1sKW+o8isH2kPi0RhjXH1nNsIbCFGyoUHG+ZxVxHYRKcb+S8eaL/1tyj3VGvWYx3Y5+oCUsJgnzcw==}
hasBin: true
peerDependencies:
svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
dependencies:
'@jridgewell/trace-mapping': 0.3.20
chokidar: 3.5.3
fast-glob: 3.3.2
import-fresh: 3.3.0
picocolors: 1.0.0
sade: 1.8.1
svelte: 4.2.7
svelte-preprocess: 5.1.1(postcss@8.4.31)(svelte@4.2.7)(typescript@5.3.2)
typescript: 5.3.2
transitivePeerDependencies:
- '@babel/core'
- coffeescript
- less
- postcss
- postcss-load-config
- pug
- sass
- stylus
- sugarss
dev: true
/svelte-dev-helper@1.1.9:
resolution: {integrity: sha512-oU+Xv7Dl4kRU2kdFjsoPLfJfnt5hUhsFUZtuzI3Ku/f2iAFZqBoEuXOqK3N9ngD4dxQOmN4OKWPHVi3NeAeAfQ==}
dev: false
@ -7227,6 +7689,15 @@ packages:
svelte: 4.2.7
dev: false
/svelte-hmr@0.15.3(svelte@4.2.7):
resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==}
engines: {node: ^12.20 || ^14.13.1 || >= 16}
peerDependencies:
svelte: ^3.19.0 || ^4.0.0
dependencies:
svelte: 4.2.7
dev: true
/svelte-keybinds@1.0.5:
resolution: {integrity: sha512-uLgpqP+anTE++sjjVvtQVHzzGa2kJCzOOomLcYGKRIDESkLaQ6tIRZ7u0ktqYzUP8VadZe46ShrJLfz/4kBF2w==}
dev: false
@ -7246,6 +7717,54 @@ packages:
resolution: {integrity: sha512-jzYqqBuXcSH5KzoPDlYQL6CQVbpY2LQB4/wBPG4T5R75wE8Dqu4auMU6NnJxHBRhgNCGlH+XBQvxy9G6yX/XQw==}
dev: false
/svelte-preprocess@5.1.1(postcss@8.4.31)(svelte@4.2.7)(typescript@5.3.2):
resolution: {integrity: sha512-p/Dp4hmrBW5mrCCq29lEMFpIJT2FZsRlouxEc5qpbOmXRbaFs7clLs8oKPwD3xCFyZfv1bIhvOzpQkhMEVQdMw==}
engines: {node: '>= 14.10.0'}
requiresBuild: true
peerDependencies:
'@babel/core': ^7.10.2
coffeescript: ^2.5.1
less: ^3.11.3 || ^4.0.0
postcss: ^7 || ^8
postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0
pug: ^3.0.0
sass: ^1.26.8
stylus: ^0.55.0
sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0
svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0'
peerDependenciesMeta:
'@babel/core':
optional: true
coffeescript:
optional: true
less:
optional: true
postcss:
optional: true
postcss-load-config:
optional: true
pug:
optional: true
sass:
optional: true
stylus:
optional: true
sugarss:
optional: true
typescript:
optional: true
dependencies:
'@types/pug': 2.0.10
detect-indent: 6.1.0
magic-string: 0.27.0
postcss: 8.4.31
sorcery: 0.11.0
strip-indent: 3.0.0
svelte: 4.2.7
typescript: 5.3.2
dev: true
/svelte-sonner@0.3.3(svelte@4.2.7):
resolution: {integrity: sha512-fUPHh5X88GctOjUBXflfXWplJxErDDm2erYh3EUjMWdfYiT9SGMpAv5NGDGbmKfZ+qUKOiTFrJ2P/iahYrTvhA==}
peerDependencies:
@ -7271,7 +7790,6 @@ packages:
locate-character: 3.0.0
magic-string: 0.30.5
periscopic: 3.1.0
dev: false
/tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
@ -7310,7 +7828,7 @@ packages:
dependencies:
b4a: 1.6.4
fast-fifo: 1.3.2
streamx: 2.15.1
streamx: 2.15.5
dev: true
/tar@6.2.0:
@ -7422,6 +7940,13 @@ packages:
setimmediate: 1.0.5
dev: true
/tiny-glob@0.2.9:
resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
dependencies:
globalyzer: 0.1.0
globrex: 0.1.2
dev: true
/tiny-typed-emitter@2.1.0:
resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==}
dev: true
@ -7469,6 +7994,11 @@ packages:
uint8-util: 2.2.4
dev: false
/totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
dev: true
/touch@3.1.0:
resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==}
hasBin: true
@ -7672,6 +8202,13 @@ packages:
/undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
/undici@5.26.5:
resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==}
engines: {node: '>=14.0'}
dependencies:
'@fastify/busboy': 2.1.0
dev: true
/unique-string@2.0.0:
resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
engines: {node: '>=8'}
@ -7820,6 +8357,52 @@ packages:
dev: true
optional: true
/vite@4.4.2:
resolution: {integrity: sha512-zUcsJN+UvdSyHhYa277UHhiJ3iq4hUBwHavOpsNUGsTgjBeoBlK8eDt+iT09pBq0h9/knhG/SPrZiM7cGmg7NA==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
'@types/node': '>= 14'
less: '*'
lightningcss: ^1.21.0
sass: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
dependencies:
esbuild: 0.18.20
postcss: 8.4.31
rollup: 3.29.4
optionalDependencies:
fsevents: 2.3.3
dev: true
/vitefu@0.2.5(vite@4.4.2):
resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
peerDependencies:
vite: ^3.0.0 || ^4.0.0 || ^5.0.0
peerDependenciesMeta:
vite:
optional: true
dependencies:
vite: 4.4.2
dev: true
/watchpack@2.4.0:
resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
engines: {node: '>=10.13.0'}

10
web/.gitignore vendored Normal file
View file

@ -0,0 +1,10 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
vite.config.js.timestamp-*
vite.config.ts.timestamp-*

29
web/jsconfig.json Normal file
View file

@ -0,0 +1,29 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"allowJs": true,
"baseUrl": "./",
"paths": {
"@/*": ["../common/*"],
"$lib":["./src/lib"],
"$lib/*":["./src/lib/*"]
},
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"target": "ESNext",
"moduleResolution": "node",
"module": "ESNext",
"types": ["./types.d.ts"],
"allowSyntheticDefaultImports": true
},
"exclude": ["node_modules/**", "**/node_modules", "dist", "build"]
// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias and https://kit.svelte.dev/docs/configuration#files
//
// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
// from the referenced tsconfig.json - TypeScript does not merge them in
}

22
web/package.json Normal file
View file

@ -0,0 +1,22 @@
{
"name": "web",
"version": "0.0.1",
"private": true,
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch"
},
"devDependencies": {
"@sveltejs/adapter-auto": "^2.0.0",
"@sveltejs/adapter-static": "^2.0.3",
"@sveltejs/kit": "^1.27.4",
"svelte": "^4.2.7",
"svelte-check": "^3.6.0",
"typescript": "^5.0.0",
"vite": "^4.4.2"
},
"type": "module"
}

12
web/src/app.d.ts vendored Normal file
View file

@ -0,0 +1,12 @@
// See https://kit.svelte.dev/docs/types#app
// for information about these interfaces
declare global {
namespace App {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface Platform {}
}
}
export {}

16
web/src/app.html Normal file
View file

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset='utf-8'>
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="theme-color" content="#17191C">
<link rel="icon" href="%sveltekit.assets%/logo.ico" />
<title>Miru | Torrenting Made Simple</title>
%sveltekit.head%
</head>
<body class="dark-mode with-custom-webkit-scrollbars with-custom-css-scrollbars" data-sveltekit-preload-data="hover">
%sveltekit.body%
</body>
</html>

View file

@ -0,0 +1,50 @@
<script>
import DiscordSVG from '$lib/svg/DiscordSVG.svelte'
import GithubSVG from '$lib/svg/GithubSVG.svelte'
</script>
<div class='container pb-20 font-weight-light font-size-16 text-muted position-sticky' style='top: 100%'>
<hr class='w-full my-20' />
<div class='row px-20 px-sm-0 mb-20'>
<div class='col-12 col-md-5 pt-20 mb-20 text-md-left'>
<a href='/'>
<img src='/logo.ico' alt='logo' class='w-50 h-50' />
</a>
<br />
© 2020 - {new Date().getFullYear()}, ThaUnknown
<br />
All rights reserved
</div>
<div class='col-6 col-sm-4 col-md-2 d-flex flex-column pt-20'>
<div class='font-weight-semi-bold mb-10 text-white'>Product</div>
<a href='https://github.com/sponsors/ThaUnknown/' target='_blank'>Donate</a>
<a href='/features'>Features</a>
<a href='/download'>Download</a>
<a href='/changelog'>Changelog</a>
</div>
<div class='col-6 col-sm-4 col-md-2 d-flex flex-column pt-20'>
<div class='font-weight-semi-bold mb-10 text-white'>Resources</div>
<a href='/faq'>FAQ</a>
<a href='/contact'>Contact</a>
<a href='/terms'>Terms of use</a>
<a href='/privacy'>Privacy policy</a>
</div>
<div class='col-12 col-sm-4 col-md-3 pt-20'>
<div class='font-weight-semi-bold mb-10 text-white'>Social</div>
<a href={atob('aHR0cHM6Ly9kaXNjb3JkLmdnL1o4N05oN2M0QWM=')} target='_blank'><DiscordSVG class='icon mr-10' /></a>
<a href='https://github.com/ThaUnknown/miru' target='_blank'><GithubSVG class='icon' /></a>
</div>
</div>
<div class='py-20 font-italic px-20 px-sm-0 pt-20'>
This site or it's servers do not store, hosts or distribute any copyrighted files or media.
</div>
</div>
<style>
a:hover {
color: #FFFFFFCC !important
}
:global(.icon) {
width: 2.2rem;
height: 2.2rem;
}
</style>

View file

@ -0,0 +1,37 @@
<div class='d-flex position-relative justify-content-center align-items-center hero flex-column'>
<div class='position-absolute ghost text-nowrap font-weight-semi-bold'>
MIRU MIRU MIRU MIRU MIRU MIRU MIRU MIRU MIRU MIRU MIRU MIRU MIRU
</div>
<div class='h-50' />
<div class='position-relative text-center text-white font-weight-bold hero-text'>
Stream torrents real-time,<br />without waiting for downloads
</div>
<div class='position-relative pt-20 h-50'>
<a href='/download' class='btn btn-danger btn-lg mr-20'>
Download
</a>
<a class='btn bg-dark-light btn-lg ml-20' href='#about'>Learn More</a>
</div>
</div>
<style>
.hero {
height: 60vh;
}
.hero-text {
font-size: 5rem
}
.btn-danger {
--dm-button-danger-bg-color: #cc4c4e
}
.ghost {
font-size: 34rem;
color: #101113;
font-family: 'Roboto';
text-shadow:
0.4px 0.4px 0 #3a3a3a,
-0.4px 0.4px 0 #3a3a3a,
-0.4px -0.4px 0 #3a3a3a,
0.4px -0.4px 0 #3a3a3a;
}
</style>

View file

@ -0,0 +1,47 @@
<nav class='navbar flex-column bg-transparent border-0 d-flex'>
<div class='container p-0'>
<a href='/' class='navbar-brand ml-20'>
<img src='/logo.ico' alt='Logo' />
</a>
<ul class='navbar-nav d-flex ml-auto'>
<li class='nav-item mr-10'>
<a href='/features' class='nav-link'>Features</a>
</li>
<li class='nav-item mr-10'>
<a href='/download' class='nav-link'>Download</a>
</li>
</ul>
<a href='https://github.com/sponsors/ThaUnknown/' class='navbar-link navbar-link-with-icon pointer overflow-hidden donate mr-20 h-full' target='_blank'>
<span class='material-symbols-outlined rounded filled font-size-20 h-full'>favorite</span>
</a>
<hr class='m-0 w-full position-absolute bottom-0 w-full' />
</div>
</nav>
<style>
:root {
--navbar-brand-image-height: 6rem;
--navbar-height: 7rem !important;
}
.navbar {
backdrop-filter: blur(8px);
}
@keyframes glow {
from {
text-shadow: 0 0 2rem #fa68b6;
}
to {
text-shadow: 0 0 1rem #fa68b6;
}
}
.donate .material-symbols-outlined {
width: 5.4rem;
animation: glow 1s ease-in-out infinite alternate;
font-variation-settings: 'FILL' 1;
color: #fa68b6;
text-shadow: 0 0 1rem #fa68b6;
display: inline-flex;
justify-content: center;
align-items: center;
}
</style>

12
web/src/lib/css.css Normal file
View file

@ -0,0 +1,12 @@
.dark-mode {
background-color: #101113 !important;
}
hr {
background: linear-gradient(270deg, rgba(0, 0, 0, 0.00) 14%, #38393c 50%, rgba(0, 0, 0, 0.00) 86%) !important;
height: 1px !important;
}
.h-vh-half {
height: 50vh;
}

View file

@ -0,0 +1,3 @@
<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid meet' {...$$restProps}>
<path d='M17.523 20.46c-.551 0-1-.465-1-1.036 0-.57.449-1.034 1-1.034.551 0 1 .464 1 1.034 0 .571-.449 1.035-1 1.035zm-11.046 0c-.551 0-1-.465-1-1.036 0-.57.449-1.034 1-1.034.551 0 1 .464 1 1.034 0 .571-.449 1.035-1 1.035zm11.404-6.233l1.998-3.582a.44.44 0 00-.152-.588.408.408 0 00-.568.158l-2.022 3.627A11.973 11.973 0 0012 12.704c-1.853 0-3.59.407-5.137 1.138l-2.022-3.627a.408.408 0 00-.568-.158.439.439 0 00-.152.588l1.998 3.582C2.689 16.158.343 19.753 0 24h24c-.343-4.247-2.69-7.842-6.119-9.773z' fill='currentColor' />
</svg>

After

Width:  |  Height:  |  Size: 684 B

View file

@ -0,0 +1,3 @@
<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid meet' {...$$restProps}>
<path fill-rule='evenodd' clip-rule='evenodd' d='M22 20H2a2 2 0 01-2-2V3a2 2 0 012-2h20a2 2 0 012 2v15a2 2 0 01-2 2zM3 18h2v-5a1 1 0 00-2 0v5zm3 0h12v-6H6v6zm13 0h2v-5a1 1 0 00-2 0v5zM15.281 5.98l1.135-1.703a.5.5 0 10-.832-.554l-1.186 1.779a5.975 5.975 0 00-4.796 0L8.416 3.723a.5.5 0 10-.832.554L8.719 5.98A5.992 5.992 0 006 11h12a5.992 5.992 0 00-2.719-5.02zM10 9a1 1 0 110-2 1 1 0 010 2zm4 0a1 1 0 110-2 1 1 0 010 2zM6 21h12a1 1 0 110 2H6a1 1 0 110-2z' fill='currentColor' />
</svg>

After

Width:  |  Height:  |  Size: 637 B

View file

@ -0,0 +1,3 @@
<svg width='24' height='24' viewBox='0 -28.5 256 256' fill='none' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid meet' {...$$restProps}>
<path fill='currentColor' d='M216.856 16.597A208.502 208.502 0 00164.042 0c-2.275 4.113-4.933 9.645-6.766 14.046-19.692-2.961-39.203-2.961-58.533 0-1.832-4.4-4.55-9.933-6.846-14.046a207.809 207.809 0 00-52.855 16.638C5.618 67.147-3.443 116.4 1.087 164.956c22.169 16.555 43.653 26.612 64.775 33.193A161.094 161.094 0 0079.735 175.3a136.413 136.413 0 01-21.846-10.632 108.636 108.636 0 005.356-4.237c42.122 19.702 87.89 19.702 129.51 0a131.66 131.66 0 005.355 4.237 136.07 136.07 0 01-21.886 10.653c4.006 8.02 8.638 15.67 13.873 22.848 21.142-6.58 42.646-16.637 64.815-33.213 5.316-56.288-9.08-105.09-38.056-148.36zM85.474 135.095c-12.645 0-23.015-11.805-23.015-26.18s10.149-26.2 23.015-26.2c12.867 0 23.236 11.804 23.015 26.2.02 14.375-10.148 26.18-23.015 26.18zm85.051 0c-12.645 0-23.014-11.805-23.014-26.18s10.148-26.2 23.014-26.2c12.867 0 23.236 11.804 23.015 26.2 0 14.375-10.148 26.18-23.015 26.18z' />
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,3 @@
<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid meet' {...$$restProps}>
<path fill='currentColor' d='M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z' />
</svg>

After

Width:  |  Height:  |  Size: 905 B

View file

@ -0,0 +1,3 @@
<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid meet' {...$$restProps}>
<path d='M20.931 19.068a3.72 3.72 0 0 1-.57-.43c-.09-.09 0-.5 0-.72.104-.4.031-.826-.2-1.17a.91.91 0 0 0-.16-.12v-.64a9.838 9.838 0 0 0-2.7-6.618A4.42 4.42 0 0 1 16.003 7v-.23c0-1.38 0-4.26-1.5-5.769a3.39 3.39 0 0 0-2.5-1c-2.099 0-3.499 1-3.499 6a7.999 7.999 0 0 1-1.19 3.679c-.27.52-.54 1.06-.78 1.63a24.316 24.316 0 0 0-1.53 4.789 1.59 1.59 0 0 0-.779 1.2l-.08.33a2.78 2.78 0 0 1-.54.14c-.6.12-1.6.32-1.6 1.23.003.245.03.49.08.73a3.21 3.21 0 0 1-.08 1.649.49.49 0 0 0 0 .13c0 1.19 1.87 1.35 3 1.49h.44c.273.081.537.188.79.32a5.82 5.82 0 0 0 2.27.68 1.17 1.17 0 0 0 .86-.39h.05a5.94 5.94 0 0 1 2.589-.61h3.06c.051.203.15.392.29.55.299.31.719.474 1.15.45a3.2 3.2 0 0 0 2.499-1.32l.32-.33c.355-.27.76-.47 1.19-.59.72-.26 1.46-.53 1.46-1.26s-.57-1.11-1.04-1.43zM13.003 3.001c.58 0 1 .62 1 1.48s-.33 1.34-.81 1.45a.82.82 0 0 0 .29-.68c0-.41-.22-.75-.48-.75s-.48.33-.48.75a.82.82 0 0 0 .29.68c-.48-.12-.81-.7-.81-1.45s.42-1.48 1-1.48zm.44 3.88A5.82 5.82 0 0 1 11.003 8a3.74 3.74 0 0 1-1.5-1 3.07 3.07 0 0 1 2-1 3.91 3.91 0 0 1 1.94.88zM10.003 3c.58 0 1 .62 1 1.48s-.33 1.33-.81 1.45a.82.82 0 0 0 .29-.68c0-.41-.22-.75-.48-.75s-.48.33-.48.75a.82.82 0 0 0 .29.68c-.48-.12-.81-.69-.81-1.45s.42-1.48 1-1.48zm-1.23 19.707c-.06.19-.15.29-.27.29a5.14 5.14 0 0 1-1.87-.6 4.44 4.44 0 0 0-1-.4h-.56c-1.489-.12-1.949-.3-2.049-.44a4.14 4.14 0 0 0 .05-2 3.36 3.36 0 0 1-.07-.56 2.24 2.24 0 0 1 .83-.26 2 2 0 0 0 1-.39 1.66 1.66 0 0 0 .37-.82c.13-.53.18-.53.25-.53.3.35.538.75.7 1.18a5.6 5.6 0 0 0 1.54 2.24 2.27 2.27 0 0 1 1.08 2.29zm6.37-3c-1.47 1.48-4.41 1.38-5.71 1.18a3.64 3.64 0 0 0-1.15-1.29 5 5 0 0 1-1.21-1.85 4 4 0 0 0-1-1.57 23.876 23.876 0 0 1 1.43-4.479c.21-.53.48-1 .74-1.55.365-.672.68-1.37.94-2.089a3.86 3.86 0 0 0 1.82.94c1-.253 1.953-.657 2.83-1.2a18.647 18.647 0 0 1 2.17 8.949 6.06 6.06 0 0 0-.86 2.95v.01zm5.058 1.12a4.19 4.19 0 0 0-1.55.83l-.34.35a2.27 2.27 0 0 1-1.809 1 .55.55 0 0 1-.41-.12c-.15-.17-.11-.56-.1-.72l.01-.17c0-.3.28-3.13.37-3.58.04.06.083.117.13.17.26.275.622.428 1 .42h.35a2 2 0 0 0 1.47-.45c.01.298.127.582.33.8.223.211.468.399.73.56.38.25.62.42.64.53a2.89 2.89 0 0 1-.82.37v.01z' fill='currentColor' />
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,3 @@
<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid meet' {...$$restProps}>
<path d='M12 24C5.373 24 0 18.627 0 12S5.373 0 12 0s12 5.373 12 12-5.373 12-12 12zm-6.485-8.51c0 2.079 1.602 3.591 3.6 3.591 1.989 0 3.636-1.539 3.636-3.618 0-2.061-1.611-3.609-3.609-3.609a3.607 3.607 0 0 0-3.627 3.636zm1.161-.027c0-1.431 1.071-2.583 2.457-2.583 1.377 0 2.457 1.152 2.457 2.583 0 1.431-1.08 2.592-2.457 2.592-1.386 0-2.457-1.161-2.457-2.592zm8.932 3.618c1.558 0 2.44-1.035 2.44-2.061 0-1.044-.666-1.791-1.926-2.043l-.892-.171c-.566-.117-.89-.54-.89-.936 0-.54.53-1.026 1.215-1.026.747 0 1.224.558 1.35 1.062l1.025-.324c-.143-.765-.8-1.728-2.393-1.728-1.27 0-2.332.954-2.332 2.115 0 .918.63 1.683 1.791 1.917l.864.18c.595.126 1.044.45 1.044 1.026 0 .594-.576.99-1.277.99-.847 0-1.405-.531-1.558-1.35L13 17.02c.098.999.962 2.061 2.61 2.061zM7.464 7.9V10h.826V7.914c0-.567.308-.945.826-.945.574 0 .798.392.798.924V10h.833V7.69c0-.847-.413-1.512-1.358-1.512-.574 0-.938.21-1.302.616-.21-.378-.581-.616-1.155-.616-.294 0-.756.112-1.113.588v-.504h-.812V10h.833V7.921c0-.567.308-.952.819-.952.574 0 .805.406.805.931zm7.308 2.1V7.62c0-.252-.035-.469-.126-.672-.245-.539-.77-.763-1.4-.763-.273 0-.539.049-.756.147-.518.224-.805.7-.84 1.015l.756.168c.063-.357.364-.616.819-.616.49 0 .735.273.735.567 0 .182-.098.315-.35.315h-.462c-.651 0-1.554.273-1.554 1.141v.042c0 .644.532 1.099 1.26 1.099.35 0 .826-.119 1.099-.574V10h.819zm-.819-1.512c0 .56-.364.91-.931.91-.35 0-.595-.203-.595-.511 0-.35.406-.518.721-.518h.805v.119zm3.591 1.575c1.015 0 1.596-.651 1.764-1.225l-.763-.245c-.112.287-.343.714-.987.714-.637 0-1.106-.497-1.106-1.197 0-.707.49-1.169 1.099-1.169.623 0 .896.406.98.7l.756-.252c-.161-.63-.805-1.204-1.729-1.204-1.113 0-1.96.875-1.96 1.939 0 1.099.847 1.939 1.946 1.939z' fill='currentColor' fill-rule='evenodd' />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,4 @@
<svg width='24' height='24' viewBox='-10 0 50 50' fill='none' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid meet' {...$$restProps}>
<path fill-rule='evenodd' clip-rule='evenodd' d='M28.1744 24.6928C28.1744 15.9508 21.0877 8.86409 12.3457 8.86409V0C25.9832 0 37.0385 11.0553 37.0385 24.6928C37.0385 38.3303 25.9832 49.3856 12.3457 49.3856V40.5215C21.0877 40.5215 28.1744 33.4348 28.1744 24.6928Z' fill='currentColor' />
<circle cx='12.3464' cy='24.7191' r='12.3464' fill='currentColor' />
</svg>

After

Width:  |  Height:  |  Size: 518 B

View file

@ -0,0 +1,3 @@
<svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid meet' {...$$restProps}>
<path d='M22 1v9.842L11 11V2.533L22 1zM2 3.946L9 3v7.903L2 11V3.946zm9 17.52V13l11 .158V23l-11-1.533zm-9-1.412V13l7 .098V21l-7-.946z' fill='currentColor' fill-rule='evenodd' />
</svg>

After

Width:  |  Height:  |  Size: 335 B

25
web/src/routes/+layout.js Normal file
View file

@ -0,0 +1,25 @@
import 'quartermoon/css/quartermoon-variables.css'
import '@fontsource-variable/material-symbols-outlined/full.css'
import '@fontsource-variable/nunito'
import '@fontsource/roboto'
import '@/css.css'
import '$lib/css.css'
export const prerender = true
export const csr = true
export const trailingSlash = 'always'
/** @type {import('./$types').LayoutLoad} */
export function load ({ fetch }) {
return {
releases: (async () => {
try {
const res = await fetch('https://api.github.com/repos/ThaUnknown/miru/releases')
const json = await res.json()
return json.map(({ body, tag_name: version, published_at: date, assets }) => ({ body, version, date, assets }))
} catch (e) {
return []
}
})()
}
}

View file

@ -0,0 +1,18 @@
<script>
import Footer from '$lib/components/Footer.svelte'
import Navbar from '$lib/components/Navbar.svelte'
</script>
<div class='page-wrapper with-transitions position-relative' data-sidebar-type='overlayed-all'>
<Navbar />
<div class='overflow-x-hidden content-wrapper h-full overflow-y-scroll position-relative'>
<slot />
<Footer />
</div>
</div>
<style>
.h-full {
min-height: 100vh;
}
</style>

View file

@ -0,0 +1,17 @@
<script>
import Hero from '$lib/components/Hero.svelte'
</script>
<Hero />
<div class='d-flex justify-content-center align-items-center'>
<div class='position-relative'>
<img src='app.png' alt='app' class='mw-full px-20' />
<div class='overlay-gradient position-absolute top-0 left-0 w-full h-full' />
</div>
</div>
<style>
.overlay-gradient {
background: linear-gradient(0deg, #0F1113 15.27%, rgba(15, 17, 19, 0.92) 41.28%, rgba(15, 17, 19, 0.25) 74.32%);
}
</style>

View file

@ -0,0 +1,81 @@
<script>
/** @type {import('./$types').PageData} */
export let data
</script>
<div class='container'>
<div class='h-vh-half row px-20 px-sm-0'>
<div class='col-sm-3 d-none d-sm-flex' />
<div class='col-sm-6 d-flex justify-content-center flex-column'>
<h1 class='font-weight-bold text-white title'>Changelog</h1>
<div class='font-size-18 text-muted'>New updates and improvements to Miru.</div>
</div>
</div>
{#await data.releases}
{#each Array(5) as _}
<hr class='my-20' />
<div class='row py-20 px-20 px-sm-0'>
<div class='col-sm-3 my-20 order-last order-sm-first '>
<div class='skeloader rounded w-100 h-10 bg-very-dark'>
<div class='skeleloader-swipe' />
</div>
</div>
<div class='col-sm-9'>
<div class='skeloader rounded w-150 h-25 bg-very-dark mb-10'>
<div class='skeleloader-swipe' />
</div>
<div class='skeloader rounded w-250 h-10 bg-very-dark mt-20'>
<div class='skeleloader-swipe' />
</div>
<div class='skeloader rounded w-200 h-10 bg-very-dark mt-15'>
<div class='skeleloader-swipe' />
</div>
</div>
</div>
{/each}
{:then changelog}
{#each changelog as { version, date, body }}
<hr class='my-20' />
<div class='row py-20 px-20 px-sm-0 position-relative'>
<div class='col-sm-3 order-last order-sm-first text-white'>
<div class='position-sticky pt-20'>
{new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })}
</div>
</div>
<div class='col-sm-9 pre-wrap text-muted'>
<h2 class='mt-0 font-weight-bold text-white'>{version}</h2>{body.replaceAll('- ', '')}</div>
</div>
{/each}
{:catch}
{#each Array(5) as _}
<hr class='my-20' />
<div class='row py-20 px-20 px-sm-0'>
<div class='col-sm-3 my-20 order-last order-sm-first '>
<div class='skeloader rounded w-100 h-10 bg-very-dark'>
<div class='skeleloader-swipe' />
</div>
</div>
<div class='col-sm-9'>
<div class='skeloader rounded w-150 h-25 bg-very-dark mb-10'>
<div class='skeleloader-swipe' />
</div>
<div class='skeloader rounded w-250 h-10 bg-very-dark mt-20'>
<div class='skeleloader-swipe' />
</div>
<div class='skeloader rounded w-200 h-10 bg-very-dark mt-15'>
<div class='skeleloader-swipe' />
</div>
</div>
</div>
{/each}
{/await}
</div>
<style>
.title {
font-size: 5rem
}
.position-sticky {
top: var(--navbar-height)
}
</style>

View file

@ -0,0 +1,16 @@
<div class='container font-size-18 pb-20'>
<h1 class='text-white font-weight-bold'>Contact</h1>
<p>If you're running into any issues with Miru, or have an idea for an enhancement, please file an <a href='https://github.com/ThaUnknown/miru/issues' target='_blank'>issue on github</a>.</p>
<p>Alternatively, if you have general questions not listed in the <a href='/faq'>FAQ</a>, visit our <a href={atob('aHR0cHM6Ly9kaXNjb3JkLmdnL1o4N05oN2M0QWM=')} target='_blank'>community Discord</a>.</p>
<p>For business inquiries use this email address: <a href={'mailto:' + atob('Y2FzaXN0YWtlbkBnbWFpbC5jb20=')}>{atob('Y2FzaXN0YWtlbkBnbWFpbC5jb20=')}</a>, however do not expect a reply.</p>
</div>
<style>
.container {
padding-top: 10rem;
}
a {
--dm-link-text-color: #1890ff !important;
--dm-link-text-color-hover: #45a3fb !important;
}
</style>

View file

@ -0,0 +1,138 @@
<script>
import WindowsSVG from '$lib/svg/WindowsSVG.svelte'
import MacOSSVG from '$lib/svg/MacOSSVG.svelte'
import LinuxSVG from '$lib/svg/LinuxSVG.svelte'
import AndroidSVG from '$lib/svg/AndroidSVG.svelte'
import AndroidTVSVG from '$lib/svg/AndroidTVSVG.svelte'
import SteamOSSVG from '$lib/svg/SteamOSSVG.svelte'
function getOS () {
const platform = navigator.userAgentData?.platform || navigator.platform
const macosPlatforms = ['macOS', 'Macintosh', 'MacIntel', 'MacPPC', 'Mac68K']
const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE']
const iosPlatforms = ['iPhone', 'iPad', 'iPod']
if (macosPlatforms.includes(platform)) return 'Mac OS'
if (iosPlatforms.includes(platform)) return 'iOS'
if (windowsPlatforms.includes(platform)) return 'Windows'
if (/Android/.test(navigator.userAgent)) return 'Android'
if (/Linux/.test(platform)) return 'Linux'
}
async function downloadForOS (os = userOS || 'Windows', linuxFormat = '.AppImage') {
if (os === 'iOS') return
if (os === 'Android') return open('https://play.google.com/')
const releases = await data.releases
const { assets } = releases[0]
if (os === 'Windows') return (location.href = assets.find(({ name }) => name.endsWith('.exe')).browser_download_url)
if (os === 'Mac OS') return (location.href = assets.find(({ name }) => name.endsWith('.dmg')).browser_download_url)
if (os === 'Linux') return (location.href = assets.find(({ name }) => name.endsWith(linuxFormat)).browser_download_url)
}
const userOS = getOS()
// setTimeout(() => downloadForOS(), 2000)
/** @type {import('./$types').PageData} */
export let data
</script>
<div class='container'>
<div class='h-vh-half d-flex justify-content-center align-items-center flex-column px-20 px-sm-0 pt-20'>
<h1 class='font-weight-bold text-white title mt-20 pt-20 text-center'>Almost there!</h1>
<div class='font-size-18 text-muted text-center'>
Now run the installer that just downloaded.<br /><br />
Your download should begin automatically. Didnt work?
</div>
<button class='btn btn-lg btn-link mb-20' on:click={() => downloadForOS()}>
Try downloading again.
</button>
</div>
<hr class='my-20' />
<div class='px-20 px-sm-0 row'>
<div class='col-12 col-lg-6 d-flex flex-column align-items-center d-lg-block pr-lg-20 pt-20'>
<h3 class='font-weight-bold text-white text-center text-lg-left pb-15'>Get Miru for other devices</h3>
<button class='card pointer col-2 m-0 mb-20 mw-full pb-20 w-500 d-block' on:click={() => downloadForOS('Windows')}>
<WindowsSVG />
<div class='font-size-18 font-weight-semi-bold mt-5'>Windows</div>
<div class='text-muted'>exe</div>
</button>
<button class='card pointer col-2 m-0 mb-20 mw-full pb-20 w-500 d-block' on:click={() => downloadForOS('Mac OS')}>
<MacOSSVG />
<div class='font-size-18 font-weight-semi-bold mt-5'>Mac OS</div>
<div class='text-muted'>Universal dmg</div>
</button>
<div class='d-flex w-500 mw-full gap-2'>
<button class='card pointer col-2 m-0 mb-20 mw-full pb-20 w-250 flex-grow-1' on:click={() => downloadForOS('Linux', '.AppImage')}>
<LinuxSVG />
<div class='font-size-18 font-weight-semi-bold mt-5'>Linux</div>
<div class='text-muted'>AppImage</div>
</button>
<button class='card pointer col-2 m-0 mb-20 mw-full pb-20 w-250 flex-grow-1' on:click={() => downloadForOS('Linux', '.deb')}>
<LinuxSVG />
<div class='font-size-18 font-weight-semi-bold mt-5'>Linux</div>
<div class='text-muted'>deb</div>
</button>
</div>
<div class='d-flex w-500 mw-full gap-2'>
<button class='card pointer col-2 m-0 mb-20 mw-full pb-20 w-250 flex-grow-1' on:click={() => downloadForOS('Android')}>
<AndroidSVG />
<div class='font-size-18 font-weight-semi-bold mt-5'>Android</div>
<div class='text-muted'>apk</div>
</button>
<button class='card pointer col-2 m-0 mb-20 mw-full pb-20 w-250 flex-grow-1' on:click={() => downloadForOS('Android')}>
<AndroidTVSVG />
<div class='font-size-18 font-weight-semi-bold mt-5'>Android TV</div>
<div class='text-muted'>apk</div>
</button>
</div>
<button class='card pointer col-2 m-0 mb-20 mw-full pb-20 w-500 d-block' on:click={() => downloadForOS('Linux', '.AppImage')}>
<SteamOSSVG />
<div class='font-size-18 font-weight-semi-bold mt-5'>Steam OS</div>
<div class='text-muted'>AppImage</div>
</button>
</div>
<div class='col-12 col-lg-6 d-flex flex-column align-items-center d-lg-block pl-lg-20 pt-20'>
<hr class='w-full my-20 d-lg-none' />
<h3 class='font-weight-bold text-white text-center text-lg-left pb-15'>Additional resources</h3>
<div class='d-flex flex-column'>
<div class='pb-5 font-size-18 font-weight-bold'>
Current version:
{#await data.releases then releases}
{releases[0].version}
{/await}
</div>
<a href='/changelog' class='hyperlink-underline pb-20 font-size-16 font-weight-bold'>
View changelog
</a>
<div class='pb-5 font-size-18 font-weight-bold'>
Older versions of Miru
</div>
<a href='https://github.com/ThaUnknown/miru/releases' class='hyperlink-underline pb-20 font-size-16 font-weight-bold'>
View older versions of Miru on GitHub
</a>
</div>
</div>
</div>
</div>
<style>
.title {
font-size: 5rem
}
.gap-2 {
gap: 2rem;
}
.card {
transition: transform .3s ease
}
.card:hover {
transform: translateY(-5px);
}
a {
--dm-link-text-color: #1890ff !important;
--dm-link-text-color-hover: #45a3fb !important;
}
</style>

View file

@ -0,0 +1,60 @@
<div class='container font-size-18 pb-20'>
<h1 class='text-white font-weight-bold'>Frequently Asked Questions</h1>
<h3 class='text-white font-weight-bold'>Won't this kill swarm health?</h3>
<p>Depends. On average no. The app is always seeding 1 torrent as long as it's open. Additionally the upload speed is forced to be x1.5 that of the download speed. Those 2 things combined will already make this app seed more than the average leecher which removes the torrent the moment it's downloaded.</p>
<h3 class='text-white font-weight-bold'>Can I close the miniplayer?</h3>
<p>No. See above. The miniplayer provides feedback that something is happening in the background. Closing it would make the user feel like the app is lagging [because it's maxing out your internet in the background by torrenting] when nothing is happening.</p>
<h3 class='text-white font-weight-bold'>Can I reduce the upload speed?</h3>
<p>No. See above. This app is also meant to seed the torrents the user downloads, if you want freeleech go to some private tracker.</p>
<h3 class='text-white font-weight-bold'>Is this safe?</h3>
<p>I recommend you read the <a href='https://thewiki.moe/getting-started/torrenting/' target='_blank'>guide about basics of piracy</a>.</p>
<h3 class='text-white font-weight-bold'>Will this replace streaming sites?</h3>
<p>Not really. The underlying source of video are still torrents, which aren't always seeded, so anime that's a few years old might not play back smoothly.</p>
<h3 class='text-white font-weight-bold'>Can I log in with MAL?</h3>
<p>No. You can however migrate MAL to AL, <a href='https://anilist.co/forum/thread/3393' target='_blank'>see this guide</a>.</p>
<h3 class='text-white font-weight-bold'>Why is anime X not playing?</h3>
<p>One of four reasons:</p>
<ul>
<li>the anime isn't seeded</li>
<li>your download speed isn't fast enough</li>
<li>your ISP blocks Torrenting, see <a href='https://thewiki.moe/en/tutorials/unblock' target='_blank'>this tutorial</a> for a potential fix, or simply use a VPN</li>
<li>the app couldn't find a matching torrent for the anime</li>
</ul>
<h3 class='text-white font-weight-bold'>I selected an episode to play, but Miru plays something else!</h3>
<p>Finding desired episodes can sometimes be difficult, if Miru auto-selects an episode incorrectly you can either disable auto-play torrents in settings to select torrents yourself during episode choosing, or manually find and paste in a .torrent file URL or a magnet URL into Miru to play a desired episode manually.</p>
<h3 class='text-white font-weight-bold'>Can I play my own torrents?</h3>
<p>Yes. For the home menu you can specify a different RSS feed to check when the app looks for new releases. Additionally you can just paste/drag-drop a torrent file/magnet link anywhere when using the app, and it will try it's best to auto-detect what anime is playing.</p>
<h3 class='text-white font-weight-bold'>Can I change what tracker torrents are found from?</h3>
<p>Not really. No other tracker has the kind of API/search functionality which is required, which Miru uses to the fullest extent to make sure it finds the torrents it's looking for without false-positives.</p>
<h3 class='text-white font-weight-bold'>How is this different from sequential qBit?</h3>
<p>Unlike qBit's sequential, this will prioritise downloading torrent pieces directly needed for playback, which with the user seeking isn't always just sequential.</p>
<h3 class='text-white font-weight-bold'>Why Electron?</h3>
<p>Electron has node.js integration, which can use TCP/UDP, that is the only reason. Browsers can't access TCP/UDP which means they can't access the global BT swarm.</p>
<p>&gt; Can't you make this just use WebRTC?</p>
<p>Yes. A BitTorrent implementation which uses WebRTC exists, but it's not yet adopted by any clients, and libtorrent [the library which qBit and others use] is still working/just added support for WebRTC, which means there's no swarm. This will hopefully change in the future.</p>
<h3 class='text-white font-weight-bold'>Miru crashed too many times.</h3>
<p>This is likely because Miru updated from a very old version to a very new one. Uninstall Miru, go to <kbd>%appdata%/miru</kbd> remove all files and re-install it. If this issue persists visit the Discord for help.</p>
</div>
<style>
.container {
padding-top: 10rem;
}
a {
--dm-link-text-color: #1890ff !important;
--dm-link-text-color-hover: #45a3fb !important;
}
</style>

View file

@ -0,0 +1,52 @@
<!-- eslint-disable svelte/indent -->
<div class='container pre-wrap font-size-18 pb-20'>
<h1 class='text-white font-weight-bold'>Privacy Policy</h1>
Last updated: November 27th, 2023.
This document outlines the data practices associated with the use of the Miru application, referred to as "the application."
<h3 class='text-white font-weight-bold'>Local Storage of Basic Metadata</h3>The application stores basic metadata locally, and data essential for the BitTorrent protocol to function. This includes:
<ul class='text-wrap'>
<li>Torrent file information (e.g., file names, sizes, structure)</li>
<li>Magnet links or torrent URLs</li>
<li>Information related to the download/upload status of torrent files</li>
<li>User settings and preferences</li>
</ul>
<h3 class='text-white font-weight-bold'>Third-Party Service - AniList</h3>The application interfaces with AniList (accessible at <a class='hyperlink-underline' href='https://anilist.co/terms'>https://anilist.co/terms</a>), a third-party service. Please refer to AniList's privacy policy to understand the protocols governing data management by this service.
<h3 class='text-white font-weight-bold'>Non-Usage and Non-Sharing of User Data</h3>The application does not utilize or share user data. Personal information is not tracked, stored, or processed in any manner.
<h3 class='text-white font-weight-bold'>Absence of User Action Tracking</h3>The application does not employ mechanisms for tracking or analyzing user actions. User activities within the application are not monitored.
<h3 class='text-white font-weight-bold'>Exclusively Necessary Data for BitTorrent Protocol</h3>The application exposes only data required by the BitTorrent protocol to function. This includes:
<ul class='text-wrap'>
<li>IP addresses of connected peers</li>
<li>Piece information for data integrity verification</li>
<li>Torrent-related metadata for establishing connections</li>
</ul>
<h3 class='text-white font-weight-bold'>Data Exposed to Other Parties</h3>It is important to note that certain data exposed by the application, as outlined in the above section, can be potentially tracked by other parties participating in the BitTorrent network.
This exposure is inherent to the functionality of the BitTorrent protocol and is beyond the control of the application.
<h3 class='text-white font-weight-bold'>Security Measures</h3>The application implements robust security measures to protect the confidentiality and integrity of the locally stored metadata. Unauthorized access is diligently prevented.
<h3 class='text-white font-weight-bold'>Updates to Privacy Policy</h3>This Privacy Policy may be updated periodically to reflect changes in operational practices.
Users are encouraged to review the policy for any modifications. Continued use of the application implies acceptance of the updated policy.
<h3 class='text-white font-weight-bold'>Contact Information</h3>For inquiries regarding this Privacy Policy or concerns related to data management, please contact us at [<a class='hyperlink-underline' href={'mailto:' + atob('Y2FzaXN0YWtlbkBnbWFpbC5jb20=')}>{atob('Y2FzaXN0YWtlbkBnbWFpbC5jb20=')}</a>].
</div>
<style>
.container {
padding-top: 10rem;
}
a {
--dm-link-text-color: #1890ff !important;
--dm-link-text-color-hover: #45a3fb !important;
}
</style>

View file

@ -0,0 +1,31 @@
<!-- eslint-disable svelte/indent -->
<div class='container pre-wrap font-size-18 pb-20'>
<h1 class='text-white font-weight-bold'>Terms of Use</h1>
Last updated: November 27th, 2023.
Permission is hereby granted, free of charge, to any person obtaining a copy of the software, hereinafter referred to as "the software," to use the software, but not to sell or redistribute the software under the same name, subject to the following conditions:
<h3 class='text-white font-weight-bold'>Software "As Is"</h3>The software is provided "as is," without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. The authors and copyright holders make no representations or warranties regarding the functionality, fitness for a particular purpose, or non-infringement of the software.
<h3 class='text-white font-weight-bold'>Limitation of Liability</h3>In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.
<h3 class='text-white font-weight-bold'>Use at Your Own Risk</h3>The user acknowledges that the software is a torrent client designed to facilitate the downloading and uploading of torrent files. The authors and copyright holders are not responsible for any consequences or events arising directly or indirectly from the use of the software, including but not limited to data loss, system damage, legal ramifications, or any other unforeseen incidents.
<h3 class='text-white font-weight-bold'>No Resale</h3>The user is not allowed to sell the software, in whole or in part, to any third party.
<h3 class='text-white font-weight-bold'>No Redistribution Under the Same Name</h3>The user is not allowed to redistribute the software under the same name. Any redistribution of the software must be done under a different name or identifier.
<h3 class='text-white font-weight-bold'>Updates to Terms</h3>These terms of use may be updated at any time without notice. It is the user's responsibility to review these terms for any modifications. Continued use of the software after any such changes shall constitute your consent to such changes.
<h3 class='text-white font-weight-bold'>Contact Information</h3>For inquiries regarding these Terms of Use or concerns related to data management, please contact us at [<a class='hyperlink-underline' href={'mailto:' + atob('Y2FzaXN0YWtlbkBnbWFpbC5jb20=')}>{atob('Y2FzaXN0YWtlbkBnbWFpbC5jb20=')}</a>].
</div>
<style>
.container {
padding-top: 10rem;
}
a {
--dm-link-text-color: #1890ff !important;
--dm-link-text-color-hover: #45a3fb !important;
}
</style>

BIN
web/static/app.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 KiB

BIN
web/static/logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

35
web/static/sitemap.xml Normal file
View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://miru.watch/</loc>
<lastmod>2023-11-27</lastmod>
</url>
<url>
<loc>https://miru.watch/download/</loc>
<lastmod>2023-11-27</lastmod>
</url>
<url>
<loc>https://miru.watch/features/</loc>
<lastmod>2023-11-27</lastmod>
</url>
<url>
<loc>https://miru.watch/changelog/</loc>
<lastmod>2023-11-27</lastmod>
</url>
<url>
<loc>https://miru.watch/contact/</loc>
<lastmod>2023-11-27</lastmod>
</url>
<url>
<loc>https://miru.watch/faq/</loc>
<lastmod>2023-11-27</lastmod>
</url>
<url>
<loc>https://miru.watch/privacy/</loc>
<lastmod>2023-11-27</lastmod>
</url>
<url>
<loc>https://miru.watch/terms/</loc>
<lastmod>2023-11-27</lastmod>
</url>
</urlset>

13
web/svelte.config.js Normal file
View file

@ -0,0 +1,13 @@
import adapter from '@sveltejs/adapter-static'
/** @type {import('@sveltejs/kit').Config} */
const config = {
kit: {
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
// If your environment is not supported or you settled on a specific environment, switch out the adapter.
// See https://kit.svelte.dev/docs/adapters for more information about adapters.
adapter: adapter()
}
}
export default config

29
web/tsconfig.json Normal file
View file

@ -0,0 +1,29 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"allowJs": true,
"baseUrl": "./",
"paths": {
"@/*": ["../common/*"],
"$lib":["./src/lib"],
"$lib/*":["./src/lib/*"]
},
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"target": "ESNext",
"moduleResolution": "node",
"module": "ESNext",
"types": ["./types.d.ts"],
"allowSyntheticDefaultImports": true
},
"exclude": ["node_modules/**", "**/node_modules", "dist", "build"]
// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias and https://kit.svelte.dev/docs/configuration#files
//
// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
// from the referenced tsconfig.json - TypeScript does not merge them in
}

13
web/vite.config.js Normal file
View file

@ -0,0 +1,13 @@
import { sveltekit } from '@sveltejs/kit/vite'
import { fileURLToPath, URL } from 'url'
import { defineConfig } from 'vite'
import { resolve } from 'path'
export default defineConfig({
plugins: [sveltekit()],
resolve: {
alias: [
{ find: '@', replacement: resolve(fileURLToPath(new URL('./', import.meta.url)), '..', 'common') }
]
}
})