From 98c9cff4b50e5d9da227a31a33111c366024fba1 Mon Sep 17 00:00:00 2001 From: danbulant Date: Sat, 19 Sep 2020 18:33:29 +0200 Subject: [PATCH] Settings and video backgrounds, bug fixes --- package-lock.json | 179 +++- package.json | 4 +- public/build/bundle.css | 5 +- public/build/bundle.css.map | 12 +- public/build/bundle.js | 1826 +++++++++++++++++++++++++-------- public/build/bundle.js.map | 2 +- public/images/logo.png | Bin 0 -> 127939 bytes public/images/settings.svg | 20 + public/lib/osu-parser.js | 515 ++++++++++ src/App.svelte | 47 +- src/Menu.svelte | 207 +++- src/Visualizer.svelte | 91 +- src/components/options.svelte | 89 ++ src/index.js | 78 +- 14 files changed, 2545 insertions(+), 530 deletions(-) create mode 100644 public/images/logo.png create mode 100644 public/images/settings.svg create mode 100644 public/lib/osu-parser.js create mode 100644 src/components/options.svelte diff --git a/package-lock.json b/package-lock.json index bec42ae..21b50d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "osu", - "version": "1.0.0", + "version": "0.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -804,7 +804,6 @@ "version": "6.12.5", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -930,6 +929,11 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, + "atomically": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.3.2.tgz", + "integrity": "sha512-MAiqx5ir1nOoMeG2vLXJnj4oFROJYB1hMqa2aAo6GQVIkPdkIcrq9W9SR0OaRtvEowO7Y2bsXqKFuDMTO4iOAQ==" + }, "author-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", @@ -1509,6 +1513,23 @@ } } }, + "conf": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/conf/-/conf-7.1.2.tgz", + "integrity": "sha512-r8/HEoWPFn4CztjhMJaWNAe5n+gPUCSaJ0oufbqDLFKsA1V8JjAG7G+p0pgoDFAws9Bpk2VtVLLXqOBA7WxLeg==", + "requires": { + "ajv": "^6.12.2", + "atomically": "^1.3.1", + "debounce-fn": "^4.0.0", + "dot-prop": "^5.2.0", + "env-paths": "^2.2.0", + "json-schema-typed": "^7.0.3", + "make-dir": "^3.1.0", + "onetime": "^5.1.0", + "pkg-up": "^3.1.0", + "semver": "^7.3.2" + } + }, "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", @@ -1605,6 +1626,21 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz", "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==" }, + "debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "requires": { + "mimic-fn": "^3.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==" + } + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1695,6 +1731,30 @@ "dev": true, "optional": true }, + "discord-rpc": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/discord-rpc/-/discord-rpc-3.1.4.tgz", + "integrity": "sha512-QaBu+gHica2SzgRAmTpuJ4J8DX9+fDwAqhvaie3hcbkU9WPqewEPh21pWdd/7vTI/JNuapU7PFm2ZKg3BTkbGg==", + "requires": { + "node-fetch": "^2.6.1", + "ws": "^7.3.1" + }, + "dependencies": { + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" + } + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -2038,6 +2098,22 @@ "debug": "^2.2.0" } }, + "electron-store": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-6.0.0.tgz", + "integrity": "sha512-ujb0a/6gxMxb9vOQ2BjOehK9VCyq5OKvttekd9v/tohA9oBHnAdV+Vxu4eoRh+/F9ShPFhcvDZkMdqO5i+TXUw==", + "requires": { + "conf": "^7.1.1", + "type-fest": "^0.16.0" + }, + "dependencies": { + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" + } + } + }, "electron-winstaller": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-4.0.1.tgz", @@ -2159,8 +2235,7 @@ "env-paths": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" }, "error-ex": { "version": "1.3.2", @@ -2335,14 +2410,12 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fd-slicer": { "version": "1.1.0", @@ -3041,6 +3114,11 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -3164,8 +3242,12 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" }, "json-stringify-safe": { "version": "5.0.1", @@ -3341,6 +3423,21 @@ "sourcemap-codec": "^1.4.4" } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -3505,8 +3602,7 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "1.0.1", @@ -3596,8 +3692,7 @@ "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "node-gyp": { "version": "7.1.0", @@ -3749,7 +3844,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } @@ -4040,6 +4134,54 @@ } } }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } + } + }, "plist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", @@ -4124,8 +4266,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.5.2", @@ -4445,8 +4586,7 @@ "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, "semver-compare": { "version": "1.0.0", @@ -5042,7 +5182,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, "requires": { "punycode": "^2.1.0" } diff --git a/package.json b/package.json index a39c9d1..9601755 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "osu", "productName": "osu", - "version": "0.1.0", + "version": "0.2.0", "description": "Osu! visualizer", "main": "src/index.js", "scripts": { @@ -48,9 +48,11 @@ }, "dependencies": { "concurrently": "^5.3.0", + "discord-rpc": "^3.1.4", "electron-is-dev": "^1.2.0", "electron-reload": "^1.5.0", "electron-squirrel-startup": "^1.0.0", + "electron-store": "^6.0.0", "osu-db-parser": "^1.0.35", "osu-parser": "^0.3.3", "sirv-cli": "^1.0.0", diff --git a/public/build/bundle.css b/public/build/bundle.css index 3587ebe..a897e30 100644 --- a/public/build/bundle.css +++ b/public/build/bundle.css @@ -1,5 +1,6 @@ main.svelte-5atqf{position:relative;width:100vw;height:100vh}.background.svelte-5atqf{position:fixed;z-index:0;left:0;right:0;width:100vw;height:100vh}.menu.svelte-5atqf{position:absolute;z-index:1;left:0;right:0;width:100vw;height:100vh} -.info.svelte-1j9fr45.svelte-1j9fr45{opacity:1;position:relative;top:0;left:0;width:100vw;height:80px;transition:opacity 0.6s;z-index:1}.volume.svelte-1j9fr45.svelte-1j9fr45{opacity:1;position:fixed;z-index:2;right:0;bottom:0;border-radius:50%;color:black;font-size:30px}.hidden.svelte-1j9fr45.svelte-1j9fr45{opacity:0;transition:opacity 1s}.info.svelte-1j9fr45 .song.svelte-1j9fr45{color:white;position:absolute;padding:5px 5px 5px 25px;top:0;right:0;text-align:right;background:black;background:linear-gradient(90deg, transparent 0%, rgba(0,0,0,0.5) 15%, rgba(0,0,0,0.5) 100%)}.info.svelte-1j9fr45 .song h2.svelte-1j9fr45{margin:0}.info.svelte-1j9fr45 .controls.svelte-1j9fr45{height:50px;display:flex}.info.svelte-1j9fr45 .controls div.svelte-1j9fr45{height:100%}.info.svelte-1j9fr45 .controls img.svelte-1j9fr45{height:100%;filter:invert(100%)} -.main.svelte-yh70k3.svelte-yh70k3{width:100%;height:100%;background-size:cover;background-repeat:no-repeat}@keyframes svelte-yh70k3-bpm{from{width:500px;height:500px;top:calc(50vh - 250px);left:calc(50vw - 250px)}to{width:525px;height:525px;top:calc(50vh - 262.5px);left:calc(50vw - 262.5px)}}@keyframes svelte-yh70k3-bpmShadow{0%{width:500px;height:500px;top:calc(50vh - 250px);left:calc(50vw - 250px)}70%{width:510px;height:510px;top:calc(50vh - 255px);left:calc(50vw - 255px)}100%{width:500px;height:500px;top:calc(50vh - 250px);left:calc(50vw - 250px)}}.main.svelte-yh70k3 img.svelte-yh70k3{position:fixed;width:500px;height:500px;top:calc(50vh - 250px);left:calc(50vw - 250px)}.main.svelte-yh70k3 .logo.svelte-yh70k3{animation-name:svelte-yh70k3-bpm;animation-iteration-count:infinite;animation-direction:alternate}.main.svelte-yh70k3 .shadow.svelte-yh70k3{opacity:0.2;animation-name:svelte-yh70k3-bpmShadow;animation-iteration-count:infinite;animation-delay:50ms} +.info.svelte-1qt5obi.svelte-1qt5obi{opacity:1;position:relative;top:0;left:0;width:100vw;height:80px;transition:opacity 0.6s;z-index:2}.volume.svelte-1qt5obi.svelte-1qt5obi{opacity:1;position:fixed;z-index:5;right:0;bottom:0;border-radius:50%;font-size:30px;color:white;background-color:black;width:100px;height:100px}.volume.svelte-1qt5obi .slider.svelte-1qt5obi{position:relative;top:0;left:0;width:100%;height:100%}.percent.svelte-1qt5obi.svelte-1qt5obi{position:absolute;top:25px;left:0;width:100%;height:100%;text-align:center}.progress-ring.svelte-1qt5obi.svelte-1qt5obi{position:absolute;top:0;left:0;width:100%;height:100%}.progress-ring.svelte-1qt5obi circle.svelte-1qt5obi{transition:stroke-dashoffset 0.32s;transform:rotate(-90deg);transform-origin:50% 50%;position:absolute;top:1px;left:1px;width:100%;height:100%}.hidden.svelte-1qt5obi.svelte-1qt5obi{opacity:0;transition:opacity 1s}.info.svelte-1qt5obi .song.svelte-1qt5obi{color:white;position:absolute;padding:5px 5px 5px 25px;top:0;right:0;text-align:right;background:black;background:linear-gradient(90deg, transparent 0%, rgba(0,0,0,0.5) 15%, rgba(0,0,0,0.5) 100%)}.info.svelte-1qt5obi .song h2.svelte-1qt5obi{margin:0}.info.svelte-1qt5obi .controls.svelte-1qt5obi{height:50px;display:flex}.info.svelte-1qt5obi .controls div.svelte-1qt5obi{height:100%}.info.svelte-1qt5obi .controls img.svelte-1qt5obi{height:100%;filter:invert(100%)}.info.svelte-1qt5obi .controls .settings img.svelte-1qt5obi{height:65%;padding-top:25%} +.main.svelte-18bmol8.svelte-18bmol8{width:100%;height:100%;background-size:cover;background-repeat:no-repeat}@keyframes svelte-18bmol8-bpm{from{width:500px;height:500px;top:calc(50vh - 250px);left:calc(50vw - 250px)}to{width:525px;height:525px;top:calc(50vh - 262.5px);left:calc(50vw - 262.5px)}}@keyframes svelte-18bmol8-bpmShadow{0%{width:500px;height:500px;top:calc(50vh - 250px);left:calc(50vw - 250px)}70%{width:510px;height:510px;top:calc(50vh - 255px);left:calc(50vw - 255px)}100%{width:500px;height:500px;top:calc(50vh - 250px);left:calc(50vw - 250px)}}video.svelte-18bmol8.svelte-18bmol8{position:fixed;z-index:0;top:0;left:0;width:100vw;height:100vh}.main.svelte-18bmol8 img.svelte-18bmol8{position:fixed;width:500px;height:500px;top:calc(50vh - 250px);left:calc(50vw - 250px);z-index:1}.main.svelte-18bmol8 .logo.svelte-18bmol8{animation-name:svelte-18bmol8-bpm;animation-direction:alternate}.main.svelte-18bmol8 .shadow.svelte-18bmol8{opacity:0.2;animation-name:svelte-18bmol8-bpmShadow;animation-delay:50ms}.main.svelte-18bmol8 .repeat.svelte-18bmol8{animation-iteration-count:infinite} +.bg.svelte-1895ym0{position:fixed;display:none;width:100vw;height:100vh;top:0;left:0;z-index:3}.bg.visible.svelte-1895ym0{display:block}nav.svelte-1895ym0{position:fixed;height:100vh;width:400px;top:0;left:-400px;opacity:0;background:rgba(0,0,0,0.4);color:white;z-index:4;transition:opacity 0.3s, left 0.3s}nav.visible.svelte-1895ym0{left:0;opacity:1} /*# sourceMappingURL=bundle.css.map */ \ No newline at end of file diff --git a/public/build/bundle.css.map b/public/build/bundle.css.map index 0acd2de..bbca840 100644 --- a/public/build/bundle.css.map +++ b/public/build/bundle.css.map @@ -4,13 +4,15 @@ "sources": [ "App.svelte", "Menu.svelte", - "Visualizer.svelte" + "Visualizer.svelte", + "options.svelte" ], "sourcesContent": [ - "\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n", - "\r\n\r\n last = Date.now()} on:wheel={e => updateVolume(e)} />\r\n\r\n
\r\n
2000}>\r\n {#if song}\r\n
\r\n

{song.artist} - {song.song}

\r\n
\r\n
\r\n \"{playing\r\n
\r\n
\r\n \"Skip\r\n
\r\n
\r\n
\r\n {/if}\r\n
\r\n {#if now - lastVolumeUpdate < 4000 && song && song.audio}\r\n
2000}>\r\n
\r\n
\r\n {Math.round(song.audio.volume * 100)}%\r\n
\r\n
\r\n
\r\n {/if}\r\n
\r\n\r\n", - "\r\n\r\n\r\n\r\n\r\n \"logo\"\r\n \"\"\r\n\r\n\r\n" + "\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n", + "\r\n\r\n last = Date.now()} on:wheel={e => updateVolume(e)} />\r\n\r\n
\r\n {#if now - last < config.autohide.info + 1000}\r\n
config.autohide.info}>\r\n {#if song}\r\n
\r\n

{song.artist} - {song.song}

\r\n
\r\n
\r\n \"{song.playing\r\n
\r\n
\r\n \"Skip\r\n
\r\n
settingsOpen = !settingsOpen}>\r\n \"Settings\"\r\n
\r\n
\r\n
\r\n {/if}\r\n
\r\n {/if}\r\n {#if now - lastVolumeUpdate < config.autohide.volume + 1000 && song && song.audio}\r\n
config.autohide.volume}>\r\n
\r\n
\r\n {Math.round(song.audio.volume * 100)}%\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {/if}\r\n \r\n
\r\n\r\n", + "\r\n\r\n\r\n\r\n\r\n {#if songData && songData.beatmap && songData.beatmap.video && config.videoBackground}\r\n \r\n \r\n {/if}\r\n \"logo\"\r\n \"\"\r\n\r\n\r\n", + "\r\n\r\n
\r\n
visible = false}>
\r\n \r\n
\r\n \r\n" ], "names": [], - "mappings": "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" + "mappings": "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" } \ No newline at end of file diff --git a/public/build/bundle.js b/public/build/bundle.js index 96648c2..f86fd5a 100644 --- a/public/build/bundle.js +++ b/public/build/bundle.js @@ -40,6 +40,9 @@ var app = (function () { function element(name) { return document.createElement(name); } + function svg_element(name) { + return document.createElementNS('http://www.w3.org/2000/svg', name); + } function text(data) { return document.createTextNode(data); } @@ -56,12 +59,31 @@ var app = (function () { else if (node.getAttribute(attribute) !== value) node.setAttribute(attribute, value); } + function to_number(value) { + return value === '' ? null : +value; + } function children(element) { return Array.from(element.childNodes); } + function set_input_value(input, value) { + input.value = value == null ? '' : value; + } function set_style(node, key, value, important) { node.style.setProperty(key, value, important ? 'important' : ''); } + function select_option(select, value) { + for (let i = 0; i < select.options.length; i += 1) { + const option = select.options[i]; + if (option.__value === value) { + option.selected = true; + return; + } + } + } + function select_value(select) { + const selected_option = select.querySelector(':checked') || select.options[0]; + return selected_option && selected_option.__value; + } function toggle_class(element, name, toggle) { element.classList[toggle ? 'add' : 'remove'](name); } @@ -80,19 +102,8 @@ var app = (function () { throw new Error(`Function called outside component initialization`); return current_component; } - function createEventDispatcher() { - const component = get_current_component(); - return (type, detail) => { - const callbacks = component.$$.callbacks[type]; - if (callbacks) { - // TODO are there situations where events could be dispatched - // in a server (non-DOM) environment? - const event = custom_event(type, detail); - callbacks.slice().forEach(fn => { - fn.call(component, event); - }); - } - }; + function onMount(fn) { + get_current_component().$$.on_mount.push(fn); } const dirty_components = []; @@ -387,258 +398,356 @@ var app = (function () { $inject_state() { } } - /* src\Menu.svelte generated by Svelte v3.25.1 */ + /* src\components\options.svelte generated by Svelte v3.25.1 */ const { console: console_1 } = globals; - const file = "src\\Menu.svelte"; - - // (99:8) {#if song} - function create_if_block_1(ctx) { - let div3; - let h2; - let t0_value = /*song*/ ctx[0].artist + ""; - let t0; - let t1; - let t2_value = /*song*/ ctx[0].song + ""; - let t2; - let t3; - let div2; - let div0; - let img0; - let img0_src_value; - let img0_alt_value; - let img0_title_value; - let t4; - let div1; - let img1; - let img1_src_value; - let mounted; - let dispose; - - const block = { - c: function create() { - div3 = element("div"); - h2 = element("h2"); - t0 = text(t0_value); - t1 = text(" - "); - t2 = text(t2_value); - t3 = space(); - div2 = element("div"); - div0 = element("div"); - img0 = element("img"); - t4 = space(); - div1 = element("div"); - img1 = element("img"); - attr_dev(h2, "class", "svelte-1j9fr45"); - add_location(h2, file, 100, 16, 3079); - if (img0.src !== (img0_src_value = "images/music_" + (/*playing*/ ctx[4] ? "pause" : "play") + ".svg")) attr_dev(img0, "src", img0_src_value); - attr_dev(img0, "alt", img0_alt_value = "" + ((/*playing*/ ctx[4] ? "Pause" : "Play") + " music")); - attr_dev(img0, "title", img0_title_value = "" + ((/*playing*/ ctx[4] ? "Pause" : "Play") + " music")); - attr_dev(img0, "class", "svelte-1j9fr45"); - add_location(img0, file, 103, 24, 3243); - attr_dev(div0, "class", "play svelte-1j9fr45"); - add_location(div0, file, 102, 20, 3177); - if (img1.src !== (img1_src_value = "images/music_forward.svg")) attr_dev(img1, "src", img1_src_value); - attr_dev(img1, "alt", "Skip the song"); - attr_dev(img1, "title", "Skip the song"); - attr_dev(img1, "class", "svelte-1j9fr45"); - add_location(img1, file, 106, 24, 3501); - attr_dev(div1, "class", "forward svelte-1j9fr45"); - add_location(div1, file, 105, 20, 3434); - attr_dev(div2, "class", "controls svelte-1j9fr45"); - add_location(div2, file, 101, 16, 3133); - attr_dev(div3, "class", "song svelte-1j9fr45"); - add_location(div3, file, 99, 12, 3043); - }, - m: function mount(target, anchor) { - insert_dev(target, div3, anchor); - append_dev(div3, h2); - append_dev(h2, t0); - append_dev(h2, t1); - append_dev(h2, t2); - append_dev(div3, t3); - append_dev(div3, div2); - append_dev(div2, div0); - append_dev(div0, img0); - append_dev(div2, t4); - append_dev(div2, div1); - append_dev(div1, img1); - - if (!mounted) { - dispose = [ - listen_dev(div0, "click", /*togglePlay*/ ctx[6], false, false, false), - listen_dev(div1, "click", /*playNext*/ ctx[5], false, false, false) - ]; - - mounted = true; - } - }, - p: function update(ctx, dirty) { - if (dirty & /*song*/ 1 && t0_value !== (t0_value = /*song*/ ctx[0].artist + "")) set_data_dev(t0, t0_value); - if (dirty & /*song*/ 1 && t2_value !== (t2_value = /*song*/ ctx[0].song + "")) set_data_dev(t2, t2_value); - - if (dirty & /*playing*/ 16 && img0.src !== (img0_src_value = "images/music_" + (/*playing*/ ctx[4] ? "pause" : "play") + ".svg")) { - attr_dev(img0, "src", img0_src_value); - } - - if (dirty & /*playing*/ 16 && img0_alt_value !== (img0_alt_value = "" + ((/*playing*/ ctx[4] ? "Pause" : "Play") + " music"))) { - attr_dev(img0, "alt", img0_alt_value); - } - - if (dirty & /*playing*/ 16 && img0_title_value !== (img0_title_value = "" + ((/*playing*/ ctx[4] ? "Pause" : "Play") + " music"))) { - attr_dev(img0, "title", img0_title_value); - } - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div3); - mounted = false; - run_all(dispose); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_1.name, - type: "if", - source: "(99:8) {#if song}", - ctx - }); - - return block; - } - - // (113:4) {#if now - lastVolumeUpdate < 4000 && song && song.audio} - function create_if_block(ctx) { - let div2; - let div1; - let div0; - let t0_value = Math.round(/*song*/ ctx[0].audio.volume * 100) + ""; - let t0; - let t1; - - const block = { - c: function create() { - div2 = element("div"); - div1 = element("div"); - div0 = element("div"); - t0 = text(t0_value); - t1 = text("%"); - attr_dev(div0, "class", "percent"); - add_location(div0, file, 115, 16, 3868); - attr_dev(div1, "class", "slider"); - add_location(div1, file, 114, 12, 3830); - attr_dev(div2, "class", "volume svelte-1j9fr45"); - toggle_class(div2, "hidden", /*now*/ ctx[3] - /*lastVolumeUpdate*/ ctx[2] > 2000); - add_location(div2, file, 113, 8, 3751); - }, - m: function mount(target, anchor) { - insert_dev(target, div2, anchor); - append_dev(div2, div1); - append_dev(div1, div0); - append_dev(div0, t0); - append_dev(div0, t1); - }, - p: function update(ctx, dirty) { - if (dirty & /*song*/ 1 && t0_value !== (t0_value = Math.round(/*song*/ ctx[0].audio.volume * 100) + "")) set_data_dev(t0, t0_value); - - if (dirty & /*now, lastVolumeUpdate*/ 12) { - toggle_class(div2, "hidden", /*now*/ ctx[3] - /*lastVolumeUpdate*/ ctx[2] > 2000); - } - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div2); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block.name, - type: "if", - source: "(113:4) {#if now - lastVolumeUpdate < 4000 && song && song.audio}", - ctx - }); - - return block; - } + const file = "src\\components\\options.svelte"; function create_fragment(ctx) { - let div1; + let div12; let div0; - let t; + let t0; + let nav; + let h2; + let t2; + let div3; + let h30; + let t4; + let div1; + let span0; + let t6; + let input0; + let t7; + let div2; + let span1; + let t9; + let input1; + let t10; + let div6; + let h31; + let t12; + let div4; + let span2; + let t14; + let input2; + let t15; + let div5; + let span3; + let t17; + let input3; + let t18; + let div8; + let h32; + let t20; + let select; + let option0; + let option0_value_value; + let option1; + let option1_value_value; + let t23; + let div7; + let span4; + let t25; + let input4; + let t26; + let div11; + let h33; + let t28; + let div9; + let span5; + let t30; + let input5; + let t31; + let div10; + let span6; + let t33; + let input6; let mounted; let dispose; - let if_block0 = /*song*/ ctx[0] && create_if_block_1(ctx); - let if_block1 = /*now*/ ctx[3] - /*lastVolumeUpdate*/ ctx[2] < 4000 && /*song*/ ctx[0] && /*song*/ ctx[0].audio && create_if_block(ctx); const block = { c: function create() { - div1 = element("div"); + div12 = element("div"); div0 = element("div"); - if (if_block0) if_block0.c(); - t = space(); - if (if_block1) if_block1.c(); - attr_dev(div0, "class", "info svelte-1j9fr45"); - toggle_class(div0, "hidden", /*now*/ ctx[3] - /*last*/ ctx[1] > 2000); - add_location(div0, file, 97, 4, 2958); - attr_dev(div1, "class", "menu"); - add_location(div1, file, 96, 0, 2934); + t0 = space(); + nav = element("nav"); + h2 = element("h2"); + h2.textContent = "Options"; + t2 = space(); + div3 = element("div"); + h30 = element("h3"); + h30.textContent = "Parallax"; + t4 = space(); + div1 = element("div"); + span0 = element("span"); + span0.textContent = "Enable parallax"; + t6 = space(); + input0 = element("input"); + t7 = space(); + div2 = element("div"); + span1 = element("span"); + span1.textContent = "Parallax treshold"; + t9 = space(); + input1 = element("input"); + t10 = space(); + div6 = element("div"); + h31 = element("h3"); + h31.textContent = "Integrations"; + t12 = space(); + div4 = element("div"); + span2 = element("span"); + span2.textContent = "Discord Rich Presence"; + t14 = space(); + input2 = element("input"); + t15 = space(); + div5 = element("div"); + span3 = element("span"); + span3.textContent = "MediaSession (system-wide controls)"; + t17 = space(); + input3 = element("input"); + t18 = space(); + div8 = element("div"); + h32 = element("h3"); + h32.textContent = "Backgrounds"; + t20 = space(); + select = element("select"); + option0 = element("option"); + option0.textContent = "Osu!wallpapers"; + option1 = element("option"); + option1.textContent = "Beatmap wallpapers"; + t23 = space(); + div7 = element("div"); + span4 = element("span"); + span4.textContent = "Video backgrounds"; + t25 = space(); + input4 = element("input"); + t26 = space(); + div11 = element("div"); + h33 = element("h3"); + h33.textContent = "UI"; + t28 = space(); + div9 = element("div"); + span5 = element("span"); + span5.textContent = "Song info hide timeout"; + t30 = space(); + input5 = element("input"); + t31 = space(); + div10 = element("div"); + span6 = element("span"); + span6.textContent = "Volume hide timeout"; + t33 = space(); + input6 = element("input"); + attr_dev(div0, "class", "bg svelte-1895ym0"); + toggle_class(div0, "visible", /*visible*/ ctx[1]); + add_location(div0, file, 8, 4, 140); + add_location(h2, file, 10, 8, 264); + add_location(h30, file, 13, 12, 325); + add_location(span0, file, 15, 16, 391); + attr_dev(input0, "type", "checkbox"); + add_location(input0, file, 16, 16, 437); + attr_dev(div1, "class", "row"); + add_location(div1, file, 14, 12, 356); + add_location(span1, file, 19, 16, 608); + attr_dev(input1, "type", "range"); + attr_dev(input1, "min", "1"); + attr_dev(input1, "max", "30"); + add_location(input1, file, 20, 16, 656); + attr_dev(div2, "class", "row"); + toggle_class(div2, "enabled", /*config*/ ctx[0].parallax.enabled); + add_location(div2, file, 18, 12, 533); + attr_dev(div3, "class", "group"); + add_location(div3, file, 12, 8, 292); + add_location(h31, file, 24, 12, 810); + add_location(span2, file, 26, 16, 880); + attr_dev(input2, "type", "checkbox"); + add_location(input2, file, 27, 16, 932); + attr_dev(div4, "class", "row"); + add_location(div4, file, 25, 12, 845); + add_location(span3, file, 30, 16, 1050); + attr_dev(input3, "type", "checkbox"); + add_location(input3, file, 31, 16, 1116); + attr_dev(div5, "class", "row"); + add_location(div5, file, 29, 12, 1015); + attr_dev(div6, "class", "group"); + add_location(div6, file, 23, 8, 777); + add_location(h32, file, 35, 12, 1253); + option0.__value = option0_value_value = 0; + option0.value = option0.__value; + add_location(option0, file, 37, 16, 1345); + option1.__value = option1_value_value = 1; + option1.value = option1.__value; + add_location(option1, file, 38, 16, 1404); + if (/*config*/ ctx[0].backgrounds === void 0) add_render_callback(() => /*select_change_handler*/ ctx[7].call(select)); + add_location(select, file, 36, 12, 1287); + add_location(span4, file, 41, 16, 1521); + attr_dev(input4, "type", "checkbox"); + add_location(input4, file, 42, 16, 1569); + attr_dev(div7, "class", "row"); + add_location(div7, file, 40, 12, 1486); + attr_dev(div8, "class", "group"); + add_location(div8, file, 34, 8, 1220); + add_location(h33, file, 46, 12, 1709); + add_location(span5, file, 48, 16, 1769); + attr_dev(input5, "type", "range"); + attr_dev(input5, "min", "1000"); + attr_dev(input5, "max", "15000"); + attr_dev(input5, "step", "500"); + add_location(input5, file, 49, 16, 1822); + attr_dev(div9, "class", "row"); + add_location(div9, file, 47, 12, 1734); + add_location(span6, file, 52, 16, 1979); + attr_dev(input6, "type", "range"); + attr_dev(input6, "min", "1000"); + attr_dev(input6, "max", "15000"); + attr_dev(input6, "step", "500"); + add_location(input6, file, 53, 16, 2029); + attr_dev(div10, "class", "row"); + add_location(div10, file, 51, 12, 1944); + attr_dev(div11, "class", "group"); + add_location(div11, file, 45, 8, 1676); + attr_dev(nav, "class", "svelte-1895ym0"); + toggle_class(nav, "visible", /*visible*/ ctx[1]); + add_location(nav, file, 9, 4, 225); + attr_dev(div12, "class", "options"); + add_location(div12, file, 7, 0, 113); }, l: function claim(nodes) { throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); }, m: function mount(target, anchor) { - insert_dev(target, div1, anchor); - append_dev(div1, div0); - if (if_block0) if_block0.m(div0, null); - append_dev(div1, t); - if (if_block1) if_block1.m(div1, null); + insert_dev(target, div12, anchor); + append_dev(div12, div0); + append_dev(div12, t0); + append_dev(div12, nav); + append_dev(nav, h2); + append_dev(nav, t2); + append_dev(nav, div3); + append_dev(div3, h30); + append_dev(div3, t4); + append_dev(div3, div1); + append_dev(div1, span0); + append_dev(div1, t6); + append_dev(div1, input0); + input0.checked = /*config*/ ctx[0].parallax.enabled; + append_dev(div3, t7); + append_dev(div3, div2); + append_dev(div2, span1); + append_dev(div2, t9); + append_dev(div2, input1); + set_input_value(input1, /*config*/ ctx[0].parallax.treshold); + append_dev(nav, t10); + append_dev(nav, div6); + append_dev(div6, h31); + append_dev(div6, t12); + append_dev(div6, div4); + append_dev(div4, span2); + append_dev(div4, t14); + append_dev(div4, input2); + input2.checked = /*config*/ ctx[0].rpc; + append_dev(div6, t15); + append_dev(div6, div5); + append_dev(div5, span3); + append_dev(div5, t17); + append_dev(div5, input3); + input3.checked = /*config*/ ctx[0].mediaSession; + append_dev(nav, t18); + append_dev(nav, div8); + append_dev(div8, h32); + append_dev(div8, t20); + append_dev(div8, select); + append_dev(select, option0); + append_dev(select, option1); + select_option(select, /*config*/ ctx[0].backgrounds); + append_dev(div8, t23); + append_dev(div8, div7); + append_dev(div7, span4); + append_dev(div7, t25); + append_dev(div7, input4); + input4.checked = /*config*/ ctx[0].videoBackground; + append_dev(nav, t26); + append_dev(nav, div11); + append_dev(div11, h33); + append_dev(div11, t28); + append_dev(div11, div9); + append_dev(div9, span5); + append_dev(div9, t30); + append_dev(div9, input5); + set_input_value(input5, /*config*/ ctx[0].autohide.info); + append_dev(div11, t31); + append_dev(div11, div10); + append_dev(div10, span6); + append_dev(div10, t33); + append_dev(div10, input6); + set_input_value(input6, /*config*/ ctx[0].autohide.volume); if (!mounted) { dispose = [ - listen_dev(window, "mousemove", /*mousemove_handler*/ ctx[9], false, false, false), - listen_dev(window, "wheel", /*wheel_handler*/ ctx[10], false, false, false) + listen_dev(div0, "click", /*click_handler*/ ctx[2], false, false, false), + listen_dev(input0, "change", /*input0_change_handler*/ ctx[3]), + listen_dev(input1, "change", /*input1_change_input_handler*/ ctx[4]), + listen_dev(input1, "input", /*input1_change_input_handler*/ ctx[4]), + listen_dev(input2, "change", /*input2_change_handler*/ ctx[5]), + listen_dev(input3, "change", /*input3_change_handler*/ ctx[6]), + listen_dev(select, "change", /*select_change_handler*/ ctx[7]), + listen_dev(input4, "change", /*input4_change_handler*/ ctx[8]), + listen_dev(input5, "change", /*input5_change_input_handler*/ ctx[9]), + listen_dev(input5, "input", /*input5_change_input_handler*/ ctx[9]), + listen_dev(input6, "change", /*input6_change_input_handler*/ ctx[10]), + listen_dev(input6, "input", /*input6_change_input_handler*/ ctx[10]) ]; mounted = true; } }, p: function update(ctx, [dirty]) { - if (/*song*/ ctx[0]) { - if (if_block0) { - if_block0.p(ctx, dirty); - } else { - if_block0 = create_if_block_1(ctx); - if_block0.c(); - if_block0.m(div0, null); - } - } else if (if_block0) { - if_block0.d(1); - if_block0 = null; + if (dirty & /*visible*/ 2) { + toggle_class(div0, "visible", /*visible*/ ctx[1]); } - if (dirty & /*now, last*/ 10) { - toggle_class(div0, "hidden", /*now*/ ctx[3] - /*last*/ ctx[1] > 2000); + if (dirty & /*config*/ 1) { + input0.checked = /*config*/ ctx[0].parallax.enabled; } - if (/*now*/ ctx[3] - /*lastVolumeUpdate*/ ctx[2] < 4000 && /*song*/ ctx[0] && /*song*/ ctx[0].audio) { - if (if_block1) { - if_block1.p(ctx, dirty); - } else { - if_block1 = create_if_block(ctx); - if_block1.c(); - if_block1.m(div1, null); - } - } else if (if_block1) { - if_block1.d(1); - if_block1 = null; + if (dirty & /*config*/ 1) { + set_input_value(input1, /*config*/ ctx[0].parallax.treshold); + } + + if (dirty & /*config*/ 1) { + toggle_class(div2, "enabled", /*config*/ ctx[0].parallax.enabled); + } + + if (dirty & /*config*/ 1) { + input2.checked = /*config*/ ctx[0].rpc; + } + + if (dirty & /*config*/ 1) { + input3.checked = /*config*/ ctx[0].mediaSession; + } + + if (dirty & /*config*/ 1) { + select_option(select, /*config*/ ctx[0].backgrounds); + } + + if (dirty & /*config*/ 1) { + input4.checked = /*config*/ ctx[0].videoBackground; + } + + if (dirty & /*config*/ 1) { + set_input_value(input5, /*config*/ ctx[0].autohide.info); + } + + if (dirty & /*config*/ 1) { + set_input_value(input6, /*config*/ ctx[0].autohide.volume); + } + + if (dirty & /*visible*/ 2) { + toggle_class(nav, "visible", /*visible*/ ctx[1]); } }, i: noop, o: noop, d: function destroy(detaching) { - if (detaching) detach_dev(div1); - if (if_block0) if_block0.d(); - if (if_block1) if_block1.d(); + if (detaching) detach_dev(div12); mounted = false; run_all(dispose); } @@ -656,27 +765,579 @@ var app = (function () { } function instance($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Options", slots, []); + var { config } = $$props; + var { visible } = $$props; + const writable_props = ["config", "visible"]; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1.warn(` was created with unknown prop '${key}'`); + }); + + const click_handler = () => $$invalidate(1, visible = false); + + function input0_change_handler() { + config.parallax.enabled = this.checked; + $$invalidate(0, config); + } + + function input1_change_input_handler() { + config.parallax.treshold = to_number(this.value); + $$invalidate(0, config); + } + + function input2_change_handler() { + config.rpc = this.checked; + $$invalidate(0, config); + } + + function input3_change_handler() { + config.mediaSession = this.checked; + $$invalidate(0, config); + } + + function select_change_handler() { + config.backgrounds = select_value(this); + $$invalidate(0, config); + } + + function input4_change_handler() { + config.videoBackground = this.checked; + $$invalidate(0, config); + } + + function input5_change_input_handler() { + config.autohide.info = to_number(this.value); + $$invalidate(0, config); + } + + function input6_change_input_handler() { + config.autohide.volume = to_number(this.value); + $$invalidate(0, config); + } + + $$self.$$set = $$props => { + if ("config" in $$props) $$invalidate(0, config = $$props.config); + if ("visible" in $$props) $$invalidate(1, visible = $$props.visible); + }; + + $$self.$capture_state = () => ({ config, visible }); + + $$self.$inject_state = $$props => { + if ("config" in $$props) $$invalidate(0, config = $$props.config); + if ("visible" in $$props) $$invalidate(1, visible = $$props.visible); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*config*/ 1) { + console.log("Config", config); + } + }; + + return [ + config, + visible, + click_handler, + input0_change_handler, + input1_change_input_handler, + input2_change_handler, + input3_change_handler, + select_change_handler, + input4_change_handler, + input5_change_input_handler, + input6_change_input_handler + ]; + } + + class Options extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance, create_fragment, safe_not_equal, { config: 0, visible: 1 }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Options", + options, + id: create_fragment.name + }); + + const { ctx } = this.$$; + const props = options.props || {}; + + if (/*config*/ ctx[0] === undefined && !("config" in props)) { + console_1.warn(" was created without expected prop 'config'"); + } + + if (/*visible*/ ctx[1] === undefined && !("visible" in props)) { + console_1.warn(" was created without expected prop 'visible'"); + } + } + + get config() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set config(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + + get visible() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set visible(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + } + + /* src\Menu.svelte generated by Svelte v3.25.1 */ + + const { console: console_1$1, window: window_1 } = globals; + const file$1 = "src\\Menu.svelte"; + + // (146:4) {#if now - last < config.autohide.info + 1000} + function create_if_block_1(ctx) { + let div; + let if_block = /*song*/ ctx[0] && create_if_block_2(ctx); + + const block = { + c: function create() { + div = element("div"); + if (if_block) if_block.c(); + attr_dev(div, "class", "info svelte-1qt5obi"); + toggle_class(div, "hidden", /*now*/ ctx[5] - /*last*/ ctx[2] > /*config*/ ctx[1].autohide.info); + add_location(div, file$1, 146, 8, 4944); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + if (if_block) if_block.m(div, null); + }, + p: function update(ctx, dirty) { + if (/*song*/ ctx[0]) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block_2(ctx); + if_block.c(); + if_block.m(div, null); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + + if (dirty & /*now, last, config*/ 38) { + toggle_class(div, "hidden", /*now*/ ctx[5] - /*last*/ ctx[2] > /*config*/ ctx[1].autohide.info); + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + if (if_block) if_block.d(); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_1.name, + type: "if", + source: "(146:4) {#if now - last < config.autohide.info + 1000}", + ctx + }); + + return block; + } + + // (148:12) {#if song} + function create_if_block_2(ctx) { + let div4; + let h2; + let t0_value = /*song*/ ctx[0].artist + ""; + let t0; + let t1; + let t2_value = /*song*/ ctx[0].song + ""; + let t2; + let t3; + let div3; + let div0; + let img0; + let img0_src_value; + let img0_alt_value; + let img0_title_value; + let t4; + let div1; + let img1; + let img1_src_value; + let t5; + let div2; + let img2; + let img2_src_value; + let mounted; + let dispose; + + const block = { + c: function create() { + div4 = element("div"); + h2 = element("h2"); + t0 = text(t0_value); + t1 = text(" - "); + t2 = text(t2_value); + t3 = space(); + div3 = element("div"); + div0 = element("div"); + img0 = element("img"); + t4 = space(); + div1 = element("div"); + img1 = element("img"); + t5 = space(); + div2 = element("div"); + img2 = element("img"); + attr_dev(h2, "class", "svelte-1qt5obi"); + add_location(h2, file$1, 149, 20, 5093); + if (img0.src !== (img0_src_value = "images/music_" + (/*song*/ ctx[0].playing ? "pause" : "play") + ".svg")) attr_dev(img0, "src", img0_src_value); + attr_dev(img0, "alt", img0_alt_value = "" + ((/*song*/ ctx[0].playing ? "Pause" : "Play") + " music")); + attr_dev(img0, "title", img0_title_value = "" + ((/*song*/ ctx[0].playing ? "Pause" : "Play") + " music")); + attr_dev(img0, "class", "svelte-1qt5obi"); + add_location(img0, file$1, 152, 28, 5269); + attr_dev(div0, "class", "play svelte-1qt5obi"); + add_location(div0, file$1, 151, 24, 5199); + if (img1.src !== (img1_src_value = "images/music_forward.svg")) attr_dev(img1, "src", img1_src_value); + attr_dev(img1, "alt", "Skip the song"); + attr_dev(img1, "title", "Skip the song"); + attr_dev(img1, "class", "svelte-1qt5obi"); + add_location(img1, file$1, 155, 28, 5554); + attr_dev(div1, "class", "forward svelte-1qt5obi"); + add_location(div1, file$1, 154, 24, 5483); + if (img2.src !== (img2_src_value = "images/settings.svg")) attr_dev(img2, "src", img2_src_value); + attr_dev(img2, "alt", "Settings"); + attr_dev(img2, "title", "Open settings"); + attr_dev(img2, "class", "svelte-1qt5obi"); + add_location(img2, file$1, 158, 28, 5788); + attr_dev(div2, "class", "settings svelte-1qt5obi"); + add_location(div2, file$1, 157, 24, 5690); + attr_dev(div3, "class", "controls svelte-1qt5obi"); + add_location(div3, file$1, 150, 20, 5151); + attr_dev(div4, "class", "song svelte-1qt5obi"); + add_location(div4, file$1, 148, 16, 5053); + }, + m: function mount(target, anchor) { + insert_dev(target, div4, anchor); + append_dev(div4, h2); + append_dev(h2, t0); + append_dev(h2, t1); + append_dev(h2, t2); + append_dev(div4, t3); + append_dev(div4, div3); + append_dev(div3, div0); + append_dev(div0, img0); + append_dev(div3, t4); + append_dev(div3, div1); + append_dev(div1, img1); + append_dev(div3, t5); + append_dev(div3, div2); + append_dev(div2, img2); + + if (!mounted) { + dispose = [ + listen_dev(div0, "click", /*togglePlay*/ ctx[7], false, false, false), + listen_dev(div1, "click", /*playNext*/ ctx[6], false, false, false), + listen_dev(div2, "click", /*click_handler*/ ctx[12], false, false, false) + ]; + + mounted = true; + } + }, + p: function update(ctx, dirty) { + if (dirty & /*song*/ 1 && t0_value !== (t0_value = /*song*/ ctx[0].artist + "")) set_data_dev(t0, t0_value); + if (dirty & /*song*/ 1 && t2_value !== (t2_value = /*song*/ ctx[0].song + "")) set_data_dev(t2, t2_value); + + if (dirty & /*song*/ 1 && img0.src !== (img0_src_value = "images/music_" + (/*song*/ ctx[0].playing ? "pause" : "play") + ".svg")) { + attr_dev(img0, "src", img0_src_value); + } + + if (dirty & /*song*/ 1 && img0_alt_value !== (img0_alt_value = "" + ((/*song*/ ctx[0].playing ? "Pause" : "Play") + " music"))) { + attr_dev(img0, "alt", img0_alt_value); + } + + if (dirty & /*song*/ 1 && img0_title_value !== (img0_title_value = "" + ((/*song*/ ctx[0].playing ? "Pause" : "Play") + " music"))) { + attr_dev(img0, "title", img0_title_value); + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div4); + mounted = false; + run_all(dispose); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_2.name, + type: "if", + source: "(148:12) {#if song}", + ctx + }); + + return block; + } + + // (166:4) {#if now - lastVolumeUpdate < config.autohide.volume + 1000 && song && song.audio} + function create_if_block(ctx) { + let div2; + let div1; + let div0; + let t0_value = Math.round(/*song*/ ctx[0].audio.volume * 100) + ""; + let t0; + let t1; + let t2; + let svg; + let circle; + let circle_stroke_dasharray_value; + let circle_stroke_dashoffset_value; + let circle_r_value; + let circle_cx_value; + let circle_cy_value; + + const block = { + c: function create() { + div2 = element("div"); + div1 = element("div"); + div0 = element("div"); + t0 = text(t0_value); + t1 = text("%"); + t2 = space(); + svg = svg_element("svg"); + circle = svg_element("circle"); + attr_dev(div0, "class", "percent svelte-1qt5obi"); + add_location(div0, file$1, 168, 16, 6219); + attr_dev(circle, "stroke-width", volumeStroke); + attr_dev(circle, "fill", "transparent"); + attr_dev(circle, "stroke", "blue"); + attr_dev(circle, "stroke-dasharray", circle_stroke_dasharray_value = volumeRadius * 2 * Math.PI + " " + volumeRadius * 2 * Math.PI); + attr_dev(circle, "stroke-dashoffset", circle_stroke_dashoffset_value = volumeRadius * 2 * Math.PI - /*song*/ ctx[0].audio.volume * volumeRadius * 2 * Math.PI); + attr_dev(circle, "r", circle_r_value = volumeRadius - 1); + attr_dev(circle, "cx", circle_cx_value = volumeRadius - 1); + attr_dev(circle, "cy", circle_cy_value = volumeRadius + 1); + attr_dev(circle, "class", "svelte-1qt5obi"); + add_location(circle, file$1, 172, 20, 6432); + attr_dev(svg, "class", "progress-ring svelte-1qt5obi"); + attr_dev(svg, "width", volumeWidth); + attr_dev(svg, "height", volumeWidth); + add_location(svg, file$1, 171, 16, 6342); + attr_dev(div1, "class", "slider svelte-1qt5obi"); + add_location(div1, file$1, 167, 12, 6181); + attr_dev(div2, "class", "volume svelte-1qt5obi"); + toggle_class(div2, "hidden", /*now*/ ctx[5] - /*lastVolumeUpdate*/ ctx[3] > /*config*/ ctx[1].autohide.volume); + add_location(div2, file$1, 166, 8, 6084); + }, + m: function mount(target, anchor) { + insert_dev(target, div2, anchor); + append_dev(div2, div1); + append_dev(div1, div0); + append_dev(div0, t0); + append_dev(div0, t1); + append_dev(div1, t2); + append_dev(div1, svg); + append_dev(svg, circle); + }, + p: function update(ctx, dirty) { + if (dirty & /*song*/ 1 && t0_value !== (t0_value = Math.round(/*song*/ ctx[0].audio.volume * 100) + "")) set_data_dev(t0, t0_value); + + if (dirty & /*song*/ 1 && circle_stroke_dashoffset_value !== (circle_stroke_dashoffset_value = volumeRadius * 2 * Math.PI - /*song*/ ctx[0].audio.volume * volumeRadius * 2 * Math.PI)) { + attr_dev(circle, "stroke-dashoffset", circle_stroke_dashoffset_value); + } + + if (dirty & /*now, lastVolumeUpdate, config*/ 42) { + toggle_class(div2, "hidden", /*now*/ ctx[5] - /*lastVolumeUpdate*/ ctx[3] > /*config*/ ctx[1].autohide.volume); + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div2); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block.name, + type: "if", + source: "(166:4) {#if now - lastVolumeUpdate < config.autohide.volume + 1000 && song && song.audio}", + ctx + }); + + return block; + } + + function create_fragment$1(ctx) { + let div; + let t0; + let t1; + let options; + let updating_config; + let updating_visible; + let current; + let mounted; + let dispose; + let if_block0 = /*now*/ ctx[5] - /*last*/ ctx[2] < /*config*/ ctx[1].autohide.info + 1000 && create_if_block_1(ctx); + let if_block1 = /*now*/ ctx[5] - /*lastVolumeUpdate*/ ctx[3] < /*config*/ ctx[1].autohide.volume + 1000 && /*song*/ ctx[0] && /*song*/ ctx[0].audio && create_if_block(ctx); + + function options_config_binding(value) { + /*options_config_binding*/ ctx[13].call(null, value); + } + + function options_visible_binding(value) { + /*options_visible_binding*/ ctx[14].call(null, value); + } + + let options_props = {}; + + if (/*config*/ ctx[1] !== void 0) { + options_props.config = /*config*/ ctx[1]; + } + + if (/*settingsOpen*/ ctx[4] !== void 0) { + options_props.visible = /*settingsOpen*/ ctx[4]; + } + + options = new Options({ props: options_props, $$inline: true }); + binding_callbacks.push(() => bind(options, "config", options_config_binding)); + binding_callbacks.push(() => bind(options, "visible", options_visible_binding)); + + const block = { + c: function create() { + div = element("div"); + if (if_block0) if_block0.c(); + t0 = space(); + if (if_block1) if_block1.c(); + t1 = space(); + create_component(options.$$.fragment); + attr_dev(div, "class", "menu"); + add_location(div, file$1, 144, 0, 4864); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + if (if_block0) if_block0.m(div, null); + append_dev(div, t0); + if (if_block1) if_block1.m(div, null); + append_dev(div, t1); + mount_component(options, div, null); + current = true; + + if (!mounted) { + dispose = [ + listen_dev(window_1, "mousemove", /*mousemove_handler*/ ctx[10], false, false, false), + listen_dev(window_1, "wheel", /*wheel_handler*/ ctx[11], false, false, false) + ]; + + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if (/*now*/ ctx[5] - /*last*/ ctx[2] < /*config*/ ctx[1].autohide.info + 1000) { + if (if_block0) { + if_block0.p(ctx, dirty); + } else { + if_block0 = create_if_block_1(ctx); + if_block0.c(); + if_block0.m(div, t0); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } + + if (/*now*/ ctx[5] - /*lastVolumeUpdate*/ ctx[3] < /*config*/ ctx[1].autohide.volume + 1000 && /*song*/ ctx[0] && /*song*/ ctx[0].audio) { + if (if_block1) { + if_block1.p(ctx, dirty); + } else { + if_block1 = create_if_block(ctx); + if_block1.c(); + if_block1.m(div, t1); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + + const options_changes = {}; + + if (!updating_config && dirty & /*config*/ 2) { + updating_config = true; + options_changes.config = /*config*/ ctx[1]; + add_flush_callback(() => updating_config = false); + } + + if (!updating_visible && dirty & /*settingsOpen*/ 16) { + updating_visible = true; + options_changes.visible = /*settingsOpen*/ ctx[4]; + add_flush_callback(() => updating_visible = false); + } + + options.$set(options_changes); + }, + i: function intro(local) { + if (current) return; + transition_in(options.$$.fragment, local); + current = true; + }, + o: function outro(local) { + transition_out(options.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + if (if_block0) if_block0.d(); + if (if_block1) if_block1.d(); + destroy_component(options); + mounted = false; + run_all(dispose); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$1.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const volumeWidth = 100; + const volumeStroke = 4; + const volumeRadius = 50; + + function instance$1($$self, $$props, $$invalidate) { let { $$slots: slots = {}, $$scope } = $$props; validate_slots("Menu", slots, []); + const fs = require("fs"); + const osuParser = require("./lib/osu-parser.js"); var { osuData } = $$props; var { song } = $$props; + var { config } = $$props; var last = Date.now(); var lastVolumeUpdate = Date.now() - 5000; - var dialogActive = false; + var settingsOpen = false; var now = Date.now(); setInterval( () => { - $$invalidate(3, now = Date.now()); + $$invalidate(5, now = Date.now()); }, - 500 + 800 ); - var playing = true; - function resetPool() { if (!osuData.songs) return false; - $$invalidate(8, osuData.songPool = osuData.songs.filter(v => true), osuData); + $$invalidate(9, osuData.songPool = osuData.songs.filter(v => true), osuData); let a = osuData.songPool; for (let i = a.length - 1; i > 0; i--) { @@ -686,6 +1347,12 @@ var app = (function () { [a[i], a[j]] = [a[j], a[i]]; } + osuData.songPool.forEach(v => { + delete v.audio; + delete v.video; + v.playing = true; + }); + $$invalidate(0, song = osuData.songPool.shift()); } @@ -702,66 +1369,88 @@ var app = (function () { } function togglePlay() { - $$invalidate(4, playing = !playing); + $$invalidate(0, song.playing = !song.playing, song); + if (!song.audio) return; - if (playing) { + if (song.playing) { song.audio.play(); } else { song.audio.pause(); } } + var volume = 1; + function updateVolume(e) { if (!song || !song.audio || !e.altKey) return; - $$invalidate(2, lastVolumeUpdate = Date.now()); - var volume = song.audio.volume; - volume += e.deltaY * -0.0005; - $$invalidate(0, song.audio.volume = Math.min(1, Math.max(volume, 0)), song); + $$invalidate(3, lastVolumeUpdate = Date.now()); + $$invalidate(15, volume += e.deltaY * -0.0005); + $$invalidate(15, volume = Math.min(1, Math.max(volume, 0))); } setTimeout( () => { - $$invalidate(0, song); + playNext(); }, 200 ); - const writable_props = ["osuData", "song"]; + const writable_props = ["osuData", "song", "config"]; Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1.warn(` was created with unknown prop '${key}'`); + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$1.warn(` was created with unknown prop '${key}'`); }); - const mousemove_handler = () => $$invalidate(1, last = Date.now()); + const mousemove_handler = () => $$invalidate(2, last = Date.now()); const wheel_handler = e => updateVolume(e); + const click_handler = () => $$invalidate(4, settingsOpen = !settingsOpen); + + function options_config_binding(value) { + config = value; + $$invalidate(1, config); + } + + function options_visible_binding(value) { + settingsOpen = value; + $$invalidate(4, settingsOpen); + } $$self.$$set = $$props => { - if ("osuData" in $$props) $$invalidate(8, osuData = $$props.osuData); + if ("osuData" in $$props) $$invalidate(9, osuData = $$props.osuData); if ("song" in $$props) $$invalidate(0, song = $$props.song); + if ("config" in $$props) $$invalidate(1, config = $$props.config); }; $$self.$capture_state = () => ({ + Options, + fs, + osuParser, osuData, song, + config, last, lastVolumeUpdate, - dialogActive, + settingsOpen, now, - playing, resetPool, playNext, togglePlay, - updateVolume + volume, + updateVolume, + volumeWidth, + volumeStroke, + volumeRadius }); $$self.$inject_state = $$props => { - if ("osuData" in $$props) $$invalidate(8, osuData = $$props.osuData); + if ("osuData" in $$props) $$invalidate(9, osuData = $$props.osuData); if ("song" in $$props) $$invalidate(0, song = $$props.song); - if ("last" in $$props) $$invalidate(1, last = $$props.last); - if ("lastVolumeUpdate" in $$props) $$invalidate(2, lastVolumeUpdate = $$props.lastVolumeUpdate); - if ("dialogActive" in $$props) dialogActive = $$props.dialogActive; - if ("now" in $$props) $$invalidate(3, now = $$props.now); - if ("playing" in $$props) $$invalidate(4, playing = $$props.playing); + if ("config" in $$props) $$invalidate(1, config = $$props.config); + if ("last" in $$props) $$invalidate(2, last = $$props.last); + if ("lastVolumeUpdate" in $$props) $$invalidate(3, lastVolumeUpdate = $$props.lastVolumeUpdate); + if ("settingsOpen" in $$props) $$invalidate(4, settingsOpen = $$props.settingsOpen); + if ("now" in $$props) $$invalidate(5, now = $$props.now); + if ("volume" in $$props) $$invalidate(15, volume = $$props.volume); }; if ($$props && "$$inject" in $$props) { @@ -769,112 +1458,155 @@ var app = (function () { } $$self.$$.update = () => { - if ($$self.$$.dirty & /*osuData*/ 256) { + if ($$self.$$.dirty & /*osuData*/ 512) { resetPool(osuData.songs); } - if ($$self.$$.dirty & /*song*/ 1) { + if ($$self.$$.dirty & /*song, config*/ 3) { { - if (song && song.folder && !song.audio) { - $$invalidate(0, song.audio = new Audio(process.env.USERPROFILE + "/AppData/Local/osu!/Songs/" + song.folder + "/" + song.audioFile), song); - song.audio.play(); + (() => { + if (song && song.folder && !song.audio) { + // var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); + // song.context = audioCtx; + // song.analyser = audioCtx.createAnalyser(); + $$invalidate(0, song.audio = new Audio(process.env.USERPROFILE + "/AppData/Local/osu!/Songs/" + song.folder + "/" + song.audioFile), song); - $$invalidate( - 0, - song.audio.onended = () => { - playNext(); - }, - song - ); + // song.source = audioCtx.createMediaElementSource(song.audio); + // song.source.connect(song.analyser); + // song.analyser.connect(audioCtx.destination); + song.audio.play(); - $$invalidate( - 0, - song.audio.onpause = () => { - $$invalidate(4, playing = false); - }, - song - ); + $$invalidate( + 0, + song.audio.onended = () => { + playNext(); + }, + song + ); - $$invalidate( - 0, - song.audio.onplay = () => { - $$invalidate(4, playing = true); - }, - song - ); + $$invalidate( + 0, + song.audio.onpause = () => { + $$invalidate(0, song.playing = false, song); + if (song.video) song.video.pause(); + }, + song + ); - if ("mediaSession" in navigator) { - navigator.mediaSession.metadata = new MediaMetadata({ - title: song.song, - artist: song.artist, - album: "Osu! visualizer", - artwork: [ - { - src: process.env.USERPROFILE + "/AppData/Local/osu!/Data/bt/" + song.id + ".jpg", - type: "image/jpeg" - } - ] + $$invalidate( + 0, + song.audio.onplay = () => { + $$invalidate(0, song.playing = true, song); + if (song.video) song.video.play(); + }, + song + ); + + if ("mediaSession" in navigator && config.mediaSession) { + navigator.mediaSession.metadata = new MediaMetadata({ + title: song.song, + artist: song.artist, + album: "Osu! visualizer", + artwork: [], // { src: process.env.USERPROFILE + "/AppData/Local/osu!/Data/bt/" + song.id + ".jpg", type: 'image/jpeg' }, + + }); + + navigator.mediaSession.setActionHandler("play", function () { + $$invalidate(0, song.playing = true, song); + song.audio.play(); }); - navigator.mediaSession.setActionHandler("play", function () { - $$invalidate(4, playing = true); - song.audio.play(); - }); + navigator.mediaSession.setActionHandler("pause", function () { + $$invalidate(0, song.playing = false, song); + song.audio.pause(); + }); - navigator.mediaSession.setActionHandler("pause", function () { - $$invalidate(4, playing = false); - song.audio.pause(); - }); - - navigator.mediaSession.setActionHandler("nexttrack", function () { - playNext(); - }); + navigator.mediaSession.setActionHandler("nexttrack", function () { + playNext(); + }); + } } - } + })(); } } + if ($$self.$$.dirty & /*song, volume*/ 32769) { + if (song.audio) $$invalidate(0, song.audio.volume = volume, song); + } + if ($$self.$$.dirty & /*song*/ 1) { console.log(song); } + + if ($$self.$$.dirty & /*song, config*/ 3) { + if (song && song.audio && config.rpc) { + if (song.playing) { + window.songActivity = { + state: "Listening to osu! beatmaps", + details: `${song.artist} - ${song.song}`, + startTimestamp: Date.now(), + endTimestamp: Date.now() + song.audio.duration * 1000, + instance: false, + largeImageKey: "logo", + largeImageText: "Osu!visualizer" + }; + } else { + window.songActivity = { + state: "Paused", + details: `${song.artist} - ${song.song}`, + instance: false, + largeImageKey: "logo", + largeImageText: "Osu!visualizer" + }; + } + } + } }; return [ song, + config, last, lastVolumeUpdate, + settingsOpen, now, - playing, playNext, togglePlay, updateVolume, osuData, mousemove_handler, - wheel_handler + wheel_handler, + click_handler, + options_config_binding, + options_visible_binding ]; } class Menu extends SvelteComponentDev { constructor(options) { super(options); - init(this, options, instance, create_fragment, safe_not_equal, { osuData: 8, song: 0 }); + init(this, options, instance$1, create_fragment$1, safe_not_equal, { osuData: 9, song: 0, config: 1 }); dispatch_dev("SvelteRegisterComponent", { component: this, tagName: "Menu", options, - id: create_fragment.name + id: create_fragment$1.name }); const { ctx } = this.$$; const props = options.props || {}; - if (/*osuData*/ ctx[8] === undefined && !("osuData" in props)) { - console_1.warn(" was created without expected prop 'osuData'"); + if (/*osuData*/ ctx[9] === undefined && !("osuData" in props)) { + console_1$1.warn(" was created without expected prop 'osuData'"); } if (/*song*/ ctx[0] === undefined && !("song" in props)) { - console_1.warn(" was created without expected prop 'song'"); + console_1$1.warn(" was created without expected prop 'song'"); + } + + if (/*config*/ ctx[1] === undefined && !("config" in props)) { + console_1$1.warn(" was created without expected prop 'config'"); } } @@ -893,94 +1625,205 @@ var app = (function () { set song(value) { throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } + + get config() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set config(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } } /* src\Visualizer.svelte generated by Svelte v3.25.1 */ - const { console: console_1$1, window: window_1 } = globals; - const file$1 = "src\\Visualizer.svelte"; + const { console: console_1$2, window: window_1$1 } = globals; + const file$2 = "src\\Visualizer.svelte"; - function create_fragment$1(ctx) { + // (155:4) {#if songData && songData.beatmap && songData.beatmap.video && config.videoBackground} + function create_if_block$1(ctx) { + let video; + let source; + let source_src_value; + + const block = { + c: function create() { + video = element("video"); + source = element("source"); + if (source.src !== (source_src_value = "file:///" + process.env.USERPROFILE.replace(/\\/g, "/") + "/AppData/Local/osu!/Songs/" + /*songData*/ ctx[0].folder + "/" + /*songData*/ ctx[0].beatmap.video)) attr_dev(source, "src", source_src_value); + add_location(source, file$2, 162, 12, 6027); + + set_style(video, "width", /*isWidthSmaller*/ ctx[5] + ? "auto" + : `calc(100% + ${/*parallaxTreshold*/ ctx[4] * 1.5}px)`); + + set_style(video, "height", !/*isWidthSmaller*/ ctx[5] + ? "auto" + : `calc(100% + ${/*parallaxTreshold*/ ctx[4] * 1.5}px)`); + + set_style(video, "top", /*mouse*/ ctx[3].y + "px"); + set_style(video, "left", /*mouse*/ ctx[3].x + "px"); + attr_dev(video, "class", "svelte-18bmol8"); + add_location(video, file$2, 156, 8, 5710); + }, + m: function mount(target, anchor) { + insert_dev(target, video, anchor); + append_dev(video, source); + /*video_binding*/ ctx[11](video); + }, + p: function update(ctx, dirty) { + if (dirty & /*songData*/ 1 && source.src !== (source_src_value = "file:///" + process.env.USERPROFILE.replace(/\\/g, "/") + "/AppData/Local/osu!/Songs/" + /*songData*/ ctx[0].folder + "/" + /*songData*/ ctx[0].beatmap.video)) { + attr_dev(source, "src", source_src_value); + } + + if (dirty & /*isWidthSmaller, parallaxTreshold*/ 48) { + set_style(video, "width", /*isWidthSmaller*/ ctx[5] + ? "auto" + : `calc(100% + ${/*parallaxTreshold*/ ctx[4] * 1.5}px)`); + } + + if (dirty & /*isWidthSmaller, parallaxTreshold*/ 48) { + set_style(video, "height", !/*isWidthSmaller*/ ctx[5] + ? "auto" + : `calc(100% + ${/*parallaxTreshold*/ ctx[4] * 1.5}px)`); + } + + if (dirty & /*mouse*/ 8) { + set_style(video, "top", /*mouse*/ ctx[3].y + "px"); + } + + if (dirty & /*mouse*/ 8) { + set_style(video, "left", /*mouse*/ ctx[3].x + "px"); + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(video); + /*video_binding*/ ctx[11](null); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$1.name, + type: "if", + source: "(155:4) {#if songData && songData.beatmap && songData.beatmap.video && config.videoBackground}", + ctx + }); + + return block; + } + + function create_fragment$2(ctx) { let div; + let t0; let img0; let img0_src_value; - let t; + let t1; let img1; let img1_src_value; let mounted; let dispose; + let if_block = /*songData*/ ctx[0] && /*songData*/ ctx[0].beatmap && /*songData*/ ctx[0].beatmap.video && /*config*/ ctx[1].videoBackground && create_if_block$1(ctx); const block = { c: function create() { div = element("div"); + if (if_block) if_block.c(); + t0 = space(); img0 = element("img"); - t = space(); + t1 = space(); img1 = element("img"); if (img0.src !== (img0_src_value = "images/logo.svg")) attr_dev(img0, "src", img0_src_value); attr_dev(img0, "alt", "logo"); - attr_dev(img0, "class", "logo svelte-yh70k3"); - set_style(img0, "animation-duration", /*animDuration*/ ctx[3] + "ms"); - add_location(img0, file$1, 108, 4, 3650); + attr_dev(img0, "class", "logo svelte-18bmol8"); + set_style(img0, "animation-duration", /*animDuration*/ ctx[6] + "ms"); + toggle_class(img0, "repeat", /*songData*/ ctx[0].playing); + add_location(img0, file$2, 165, 4, 6198); if (img1.src !== (img1_src_value = "images/logo.svg")) attr_dev(img1, "src", img1_src_value); attr_dev(img1, "alt", ""); - attr_dev(img1, "class", "shadow svelte-yh70k3"); - set_style(img1, "animation-duration", /*animDuration*/ ctx[3] * 2 + "ms"); - add_location(img1, file$1, 109, 4, 3753); - attr_dev(div, "class", "main svelte-yh70k3"); - set_style(div, "background-image", "url('" + process.env.USERPROFILE.replace(/\\/g, "/") + "/AppData/Local/osu!/Data/bg/" + /*wallpaper*/ ctx[0] + "')"); + attr_dev(img1, "class", "shadow svelte-18bmol8"); + set_style(img1, "animation-duration", /*animDuration*/ ctx[6] * 2 + "ms"); + toggle_class(img1, "repeat", /*songData*/ ctx[0].playing); + add_location(img1, file$2, 166, 4, 6333); + attr_dev(div, "class", "main svelte-18bmol8"); + set_style(div, "background-image", "url('" + /*wallpaper*/ ctx[2] + "')"); - set_style(div, "background-size", !/*isWidthSmaller*/ ctx[2] - ? `calc(100% + ${parallaxTreshold * 1.5}px) auto` - : `auto calc(100% + ${parallaxTreshold * 1.5}px)`); + set_style(div, "background-size", !/*isWidthSmaller*/ ctx[5] + ? `calc(100% + ${/*parallaxTreshold*/ ctx[4] * 1.5}px) auto` + : `auto calc(100% + ${/*parallaxTreshold*/ ctx[4] * 1.5}px)`); - set_style(div, "background-position", /*mouse*/ ctx[1].x + "px " + /*mouse*/ ctx[1].y + "px"); - add_location(div, file$1, 100, 0, 3279); + set_style(div, "background-position", /*mouse*/ ctx[3].x + "px " + /*mouse*/ ctx[3].y + "px"); + add_location(div, file$2, 146, 0, 5261); }, l: function claim(nodes) { throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); }, m: function mount(target, anchor) { insert_dev(target, div, anchor); + if (if_block) if_block.m(div, null); + append_dev(div, t0); append_dev(div, img0); - append_dev(div, t); + append_dev(div, t1); append_dev(div, img1); if (!mounted) { dispose = [ - listen_dev(window_1, "mousemove", /*updateMouse*/ ctx[4], false, false, false), - listen_dev(window_1, "resize", /*resize*/ ctx[5], false, false, false) + listen_dev(window_1$1, "mousemove", /*updateMouse*/ ctx[8], false, false, false), + listen_dev(window_1$1, "resize", /*resize*/ ctx[9], false, false, false) ]; mounted = true; } }, p: function update(ctx, [dirty]) { - if (dirty & /*animDuration*/ 8) { - set_style(img0, "animation-duration", /*animDuration*/ ctx[3] + "ms"); + if (/*songData*/ ctx[0] && /*songData*/ ctx[0].beatmap && /*songData*/ ctx[0].beatmap.video && /*config*/ ctx[1].videoBackground) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block$1(ctx); + if_block.c(); + if_block.m(div, t0); + } + } else if (if_block) { + if_block.d(1); + if_block = null; } - if (dirty & /*animDuration*/ 8) { - set_style(img1, "animation-duration", /*animDuration*/ ctx[3] * 2 + "ms"); + if (dirty & /*animDuration*/ 64) { + set_style(img0, "animation-duration", /*animDuration*/ ctx[6] + "ms"); } - if (dirty & /*wallpaper*/ 1) { - set_style(div, "background-image", "url('" + process.env.USERPROFILE.replace(/\\/g, "/") + "/AppData/Local/osu!/Data/bg/" + /*wallpaper*/ ctx[0] + "')"); + if (dirty & /*songData*/ 1) { + toggle_class(img0, "repeat", /*songData*/ ctx[0].playing); } - if (dirty & /*isWidthSmaller*/ 4) { - set_style(div, "background-size", !/*isWidthSmaller*/ ctx[2] - ? `calc(100% + ${parallaxTreshold * 1.5}px) auto` - : `auto calc(100% + ${parallaxTreshold * 1.5}px)`); + if (dirty & /*animDuration*/ 64) { + set_style(img1, "animation-duration", /*animDuration*/ ctx[6] * 2 + "ms"); } - if (dirty & /*mouse*/ 2) { - set_style(div, "background-position", /*mouse*/ ctx[1].x + "px " + /*mouse*/ ctx[1].y + "px"); + if (dirty & /*songData*/ 1) { + toggle_class(img1, "repeat", /*songData*/ ctx[0].playing); + } + + if (dirty & /*wallpaper*/ 4) { + set_style(div, "background-image", "url('" + /*wallpaper*/ ctx[2] + "')"); + } + + if (dirty & /*isWidthSmaller, parallaxTreshold*/ 48) { + set_style(div, "background-size", !/*isWidthSmaller*/ ctx[5] + ? `calc(100% + ${/*parallaxTreshold*/ ctx[4] * 1.5}px) auto` + : `auto calc(100% + ${/*parallaxTreshold*/ ctx[4] * 1.5}px)`); + } + + if (dirty & /*mouse*/ 8) { + set_style(div, "background-position", /*mouse*/ ctx[3].x + "px " + /*mouse*/ ctx[3].y + "px"); } }, i: noop, o: noop, d: function destroy(detaching) { if (detaching) detach_dev(div); + if (if_block) if_block.d(); mounted = false; run_all(dispose); } @@ -988,7 +1831,7 @@ var app = (function () { dispatch_dev("SvelteRegisterBlock", { block, - id: create_fragment$1.name, + id: create_fragment$2.name, type: "component", source: "", ctx @@ -997,16 +1840,15 @@ var app = (function () { return block; } - const parallaxTreshold = 10; - - function instance$1($$self, $$props, $$invalidate) { + function instance$2($$self, $$props, $$invalidate) { let { $$slots: slots = {}, $$scope } = $$props; validate_slots("Visualizer", slots, []); const fs = require("fs"); const OsuDBParser = require("osu-db-parser"); - const osuParser = require("osu-parser"); + const osuParser = require("./lib/osu-parser.js"); var { osuData } = $$props; var { songData } = $$props; + var { config } = $$props; var wallpapers = []; try { @@ -1028,7 +1870,8 @@ var app = (function () { song: v.song_title, song_u: v.song_title_unicode, id: v.beatmapset_id, - dataFile: `${v.artist_name} - ${v.song_title} (${v.creator_name}) [${v.difficulty}].osu` + dataFile: `${v.artist_name} - ${v.song_title} (${v.creator_name}) [${v.difficulty}].osu`.replace(/\/|\*|"|:|\?/g, ""), + playing: true })).filter((v, i, a) => a.findIndex(x => x.id === v.id) === i); } catch(e) { console.error("Osu DB weren't found. You must have osu installed and started at least once.", e); @@ -1038,20 +1881,42 @@ var app = (function () { var wallpaper; function shuffleWallpapers() { - $$invalidate(0, wallpaper = wallpapers[Math.floor(Math.random() * wallpapers.length)]); + switch (config.backgrounds) { + case 0: + $$invalidate(2, wallpaper = `${process.env.USERPROFILE.replace(/\\/g, "/")}/AppData/Local/osu!/Data/bg/${wallpapers[Math.floor(Math.random() * wallpapers.length)]}`); + break; + case 1: + if (songData.beatmap) { + $$invalidate(2, wallpaper = `${process.env.USERPROFILE.replace(/\\/g, "/")}/AppData/Local/osu!/Songs/${songData.folder}/${songData.beatmap.bgFilename}`); + } else { + $$invalidate(2, wallpaper = `${process.env.USERPROFILE.replace(/\\/g, "/")}/AppData/Local/osu!/Data/bg/${wallpapers[Math.floor(Math.random() * wallpapers.length)]}`); + } + break; + default: + $$invalidate(2, wallpaper = `${process.env.USERPROFILE.replace(/\\/g, "/")}/AppData/Local/osu!/Data/bg/${wallpapers[Math.floor(Math.random() * wallpapers.length)]}`); + } } + shuffleWallpapers(); var lastSong = null; + var lastBackgroundOption = null; function fetchBeatmap() { let file = fs.readFileSync(process.env.USERPROFILE + "/AppData/Local/osu!/Songs/" + songData.folder + "/" + songData.dataFile); - $$invalidate(7, songData.beatmap = osuParser.parseContent(file), songData); + $$invalidate(0, songData.beatmap = osuParser.parseContent(file), songData); + + if (config.backgrounds === 1) { + $$invalidate(2, wallpaper = `${process.env.USERPROFILE.replace(/\\/g, "/")}/AppData/Local/osu!/Songs/${songData.folder}/${songData.beatmap.bgFilename}`); + } } var mouse = { x: 0.5, y: 0.5 }; + var parallaxTreshold; function updateMouse(e) { - $$invalidate(1, mouse = { + if (!config.parallax.enabled) return; + + $$invalidate(3, mouse = { x: -(e.clientX / window.innerWidth) * parallaxTreshold - parallaxTreshold / 2, y: -(e.clientY / window.innerHeight) * parallaxTreshold - parallaxTreshold / 2 }); @@ -1060,7 +1925,7 @@ var app = (function () { var isWidthSmaller = false; function resize() { - $$invalidate(2, isWidthSmaller = window.innerWidth * 9 < window.innerHeight * 16); + $$invalidate(5, isWidthSmaller = window.innerWidth * 9 < window.innerHeight * 16); } resize(); @@ -1071,7 +1936,7 @@ var app = (function () { () => { if (!songData) return; if (!songData.beatmap && songData.dataFile) fetchBeatmap(); - if (!songData.beatmap) return; + if (!songData.beatmap || !songData.audio) return; var tp = null; for (var t of songData.beatmap.timingPoints) { @@ -1080,39 +1945,50 @@ var app = (function () { } if (!tp) { - $$invalidate(3, animDuration = 0); + $$invalidate(6, animDuration = 0); kiaiTime = false; return; } - if (tp.beatLength / 2 !== animDuration) $$invalidate(3, animDuration = tp.beatLength / 2); + if (tp.beatLength / 2 !== animDuration) $$invalidate(6, animDuration = tp.beatLength / 2); kiaiTime = tp.kiaiTimeActive; }, 50 ); - const writable_props = ["osuData", "songData"]; + var backgroundVideo; + const writable_props = ["osuData", "songData", "config"]; Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$1.warn(` was created with unknown prop '${key}'`); + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$2.warn(` was created with unknown prop '${key}'`); }); + function video_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + backgroundVideo = $$value; + $$invalidate(7, backgroundVideo); + }); + } + $$self.$$set = $$props => { - if ("osuData" in $$props) $$invalidate(6, osuData = $$props.osuData); - if ("songData" in $$props) $$invalidate(7, songData = $$props.songData); + if ("osuData" in $$props) $$invalidate(10, osuData = $$props.osuData); + if ("songData" in $$props) $$invalidate(0, songData = $$props.songData); + if ("config" in $$props) $$invalidate(1, config = $$props.config); }; $$self.$capture_state = () => ({ - createEventDispatcher, + onMount, fs, OsuDBParser, osuParser, osuData, songData, + config, wallpapers, wallpaper, shuffleWallpapers, lastSong, + lastBackgroundOption, fetchBeatmap, mouse, parallaxTreshold, @@ -1120,19 +1996,24 @@ var app = (function () { isWidthSmaller, resize, animDuration, - kiaiTime + kiaiTime, + backgroundVideo }); $$self.$inject_state = $$props => { - if ("osuData" in $$props) $$invalidate(6, osuData = $$props.osuData); - if ("songData" in $$props) $$invalidate(7, songData = $$props.songData); + if ("osuData" in $$props) $$invalidate(10, osuData = $$props.osuData); + if ("songData" in $$props) $$invalidate(0, songData = $$props.songData); + if ("config" in $$props) $$invalidate(1, config = $$props.config); if ("wallpapers" in $$props) wallpapers = $$props.wallpapers; - if ("wallpaper" in $$props) $$invalidate(0, wallpaper = $$props.wallpaper); - if ("lastSong" in $$props) $$invalidate(9, lastSong = $$props.lastSong); - if ("mouse" in $$props) $$invalidate(1, mouse = $$props.mouse); - if ("isWidthSmaller" in $$props) $$invalidate(2, isWidthSmaller = $$props.isWidthSmaller); - if ("animDuration" in $$props) $$invalidate(3, animDuration = $$props.animDuration); + if ("wallpaper" in $$props) $$invalidate(2, wallpaper = $$props.wallpaper); + if ("lastSong" in $$props) $$invalidate(13, lastSong = $$props.lastSong); + if ("lastBackgroundOption" in $$props) $$invalidate(14, lastBackgroundOption = $$props.lastBackgroundOption); + if ("mouse" in $$props) $$invalidate(3, mouse = $$props.mouse); + if ("parallaxTreshold" in $$props) $$invalidate(4, parallaxTreshold = $$props.parallaxTreshold); + if ("isWidthSmaller" in $$props) $$invalidate(5, isWidthSmaller = $$props.isWidthSmaller); + if ("animDuration" in $$props) $$invalidate(6, animDuration = $$props.animDuration); if ("kiaiTime" in $$props) kiaiTime = $$props.kiaiTime; + if ("backgroundVideo" in $$props) $$invalidate(7, backgroundVideo = $$props.backgroundVideo); }; if ($$props && "$$inject" in $$props) { @@ -1140,53 +2021,96 @@ var app = (function () { } $$self.$$.update = () => { - if ($$self.$$.dirty & /*songData, lastSong*/ 640) { + if ($$self.$$.dirty & /*backgroundVideo, songData*/ 129) { + { + if (backgroundVideo) { + $$invalidate(0, songData.video = backgroundVideo, songData); + + if (songData && songData.audio && songData.video) { + $$invalidate(0, songData.video.currentTime = songData.audio.currentTime, songData); + } + } + } + } + + if ($$self.$$.dirty & /*songData, lastSong, config, lastBackgroundOption*/ 24579) { { if (songData !== lastSong) { - $$invalidate(9, lastSong = songData); + $$invalidate(13, lastSong = songData); + shuffleWallpapers(); + } + + if (config.backgrounds !== lastBackgroundOption) { + $$invalidate(14, lastBackgroundOption = config.backgrounds); shuffleWallpapers(); } } } - if ($$self.$$.dirty & /*songData*/ 128) { + if ($$self.$$.dirty & /*songData*/ 1) { if (songData && songData.dataFile && !songData.beatmap) fetchBeatmap(); } + + if ($$self.$$.dirty & /*config*/ 2) { + $$invalidate(4, parallaxTreshold = config.parallax.treshold); + } + + if ($$self.$$.dirty & /*songData, config*/ 3) { + { + if (!songData || !songData.beatmap || !songData.beatmap.video || !config.videoBackground) window.backgroundVideo = null; + } + } + + if ($$self.$$.dirty & /*wallpaper*/ 4) { + console.log("Wallpaper", wallpaper); + } + + if ($$self.$$.dirty & /*songData*/ 1) { + console.log("Beatmap", songData.beatmap); + } }; return [ + songData, + config, wallpaper, mouse, + parallaxTreshold, isWidthSmaller, animDuration, + backgroundVideo, updateMouse, resize, osuData, - songData + video_binding ]; } class Visualizer extends SvelteComponentDev { constructor(options) { super(options); - init(this, options, instance$1, create_fragment$1, safe_not_equal, { osuData: 6, songData: 7 }); + init(this, options, instance$2, create_fragment$2, safe_not_equal, { osuData: 10, songData: 0, config: 1 }); dispatch_dev("SvelteRegisterComponent", { component: this, tagName: "Visualizer", options, - id: create_fragment$1.name + id: create_fragment$2.name }); const { ctx } = this.$$; const props = options.props || {}; - if (/*osuData*/ ctx[6] === undefined && !("osuData" in props)) { - console_1$1.warn(" was created without expected prop 'osuData'"); + if (/*osuData*/ ctx[10] === undefined && !("osuData" in props)) { + console_1$2.warn(" was created without expected prop 'osuData'"); } - if (/*songData*/ ctx[7] === undefined && !("songData" in props)) { - console_1$1.warn(" was created without expected prop 'songData'"); + if (/*songData*/ ctx[0] === undefined && !("songData" in props)) { + console_1$2.warn(" was created without expected prop 'songData'"); + } + + if (/*config*/ ctx[1] === undefined && !("config" in props)) { + console_1$2.warn(" was created without expected prop 'config'"); } } @@ -1205,12 +2129,20 @@ var app = (function () { set songData(value) { throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); } + + get config() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set config(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } } /* src\App.svelte generated by Svelte v3.25.1 */ - const file$2 = "src\\App.svelte"; + const file$3 = "src\\App.svelte"; - function create_fragment$2(ctx) { + function create_fragment$3(ctx) { let main; let div0; let visualizer; @@ -1221,24 +2153,25 @@ var app = (function () { let menu; let updating_song; let updating_osuData_1; + let updating_config; let current; function visualizer_songData_binding(value) { - /*visualizer_songData_binding*/ ctx[2].call(null, value); + /*visualizer_songData_binding*/ ctx[3].call(null, value); } function visualizer_osuData_binding(value) { - /*visualizer_osuData_binding*/ ctx[3].call(null, value); + /*visualizer_osuData_binding*/ ctx[4].call(null, value); } - let visualizer_props = {}; + let visualizer_props = { config: /*config*/ ctx[1] }; if (/*songData*/ ctx[0] !== void 0) { visualizer_props.songData = /*songData*/ ctx[0]; } - if (/*osuData*/ ctx[1] !== void 0) { - visualizer_props.osuData = /*osuData*/ ctx[1]; + if (/*osuData*/ ctx[2] !== void 0) { + visualizer_props.osuData = /*osuData*/ ctx[2]; } visualizer = new Visualizer({ props: visualizer_props, $$inline: true }); @@ -1246,11 +2179,15 @@ var app = (function () { binding_callbacks.push(() => bind(visualizer, "osuData", visualizer_osuData_binding)); function menu_song_binding(value) { - /*menu_song_binding*/ ctx[4].call(null, value); + /*menu_song_binding*/ ctx[5].call(null, value); } function menu_osuData_binding(value) { - /*menu_osuData_binding*/ ctx[5].call(null, value); + /*menu_osuData_binding*/ ctx[6].call(null, value); + } + + function menu_config_binding(value) { + /*menu_config_binding*/ ctx[7].call(null, value); } let menu_props = {}; @@ -1259,13 +2196,18 @@ var app = (function () { menu_props.song = /*songData*/ ctx[0]; } - if (/*osuData*/ ctx[1] !== void 0) { - menu_props.osuData = /*osuData*/ ctx[1]; + if (/*osuData*/ ctx[2] !== void 0) { + menu_props.osuData = /*osuData*/ ctx[2]; + } + + if (/*config*/ ctx[1] !== void 0) { + menu_props.config = /*config*/ ctx[1]; } menu = new Menu({ props: menu_props, $$inline: true }); binding_callbacks.push(() => bind(menu, "song", menu_song_binding)); binding_callbacks.push(() => bind(menu, "osuData", menu_osuData_binding)); + binding_callbacks.push(() => bind(menu, "config", menu_config_binding)); const block = { c: function create() { @@ -1276,11 +2218,11 @@ var app = (function () { div1 = element("div"); create_component(menu.$$.fragment); attr_dev(div0, "class", "background svelte-5atqf"); - add_location(div0, file$2, 10, 4, 176); + add_location(div0, file$3, 51, 4, 1440); attr_dev(div1, "class", "menu svelte-5atqf"); - add_location(div1, file$2, 13, 4, 268); + add_location(div1, file$3, 54, 4, 1542); attr_dev(main, "class", "svelte-5atqf"); - add_location(main, file$2, 9, 0, 164); + add_location(main, file$3, 50, 0, 1428); }, l: function claim(nodes) { throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); @@ -1296,6 +2238,7 @@ var app = (function () { }, p: function update(ctx, [dirty]) { const visualizer_changes = {}; + if (dirty & /*config*/ 2) visualizer_changes.config = /*config*/ ctx[1]; if (!updating_songData && dirty & /*songData*/ 1) { updating_songData = true; @@ -1303,9 +2246,9 @@ var app = (function () { add_flush_callback(() => updating_songData = false); } - if (!updating_osuData && dirty & /*osuData*/ 2) { + if (!updating_osuData && dirty & /*osuData*/ 4) { updating_osuData = true; - visualizer_changes.osuData = /*osuData*/ ctx[1]; + visualizer_changes.osuData = /*osuData*/ ctx[2]; add_flush_callback(() => updating_osuData = false); } @@ -1318,12 +2261,18 @@ var app = (function () { add_flush_callback(() => updating_song = false); } - if (!updating_osuData_1 && dirty & /*osuData*/ 2) { + if (!updating_osuData_1 && dirty & /*osuData*/ 4) { updating_osuData_1 = true; - menu_changes.osuData = /*osuData*/ ctx[1]; + menu_changes.osuData = /*osuData*/ ctx[2]; add_flush_callback(() => updating_osuData_1 = false); } + if (!updating_config && dirty & /*config*/ 2) { + updating_config = true; + menu_changes.config = /*config*/ ctx[1]; + add_flush_callback(() => updating_config = false); + } + menu.$set(menu_changes); }, i: function intro(local) { @@ -1346,7 +2295,7 @@ var app = (function () { dispatch_dev("SvelteRegisterBlock", { block, - id: create_fragment$2.name, + id: create_fragment$3.name, type: "component", source: "", ctx @@ -1355,11 +2304,46 @@ var app = (function () { return block; } - function instance$2($$self, $$props, $$invalidate) { + function instance$3($$self, $$props, $$invalidate) { let { $$slots: slots = {}, $$scope } = $$props; validate_slots("App", slots, []); + const Store = require("electron-store"); + const store = new Store(); var songData = {}; + var config = store.get("config"); var osuData = {}; + + (() => { + const configTemplate = { + parallax: { enabled: true, treshold: 10 }, + rpc: true, + backgrounds: 0, + mediaSession: true, + videoBackground: true, + autohide: { info: 2000, volume: 2000 } + }; + + function checkSettings(value, template) { + if (value === undefined) return template; + if (typeof value !== "object") return value; + var out = {}; + + for (var key in template) { + if (value[key] === undefined || typeof value[key] === "undefined") { + out[key] = template[key]; + continue; + } + + if (typeof value[key] === "object") out[key] = checkSettings(value[key], template[key]); + if (typeof value[key] !== "object") out[key] = value[key]; + } + + return out; + } + + $$invalidate(1, config = checkSettings(config, configTemplate)); + })(); + const writable_props = []; Object.keys($$props).forEach(key => { @@ -1373,7 +2357,7 @@ var app = (function () { function visualizer_osuData_binding(value) { osuData = value; - $$invalidate(1, osuData); + $$invalidate(2, osuData); } function menu_song_binding(value) { @@ -1383,40 +2367,62 @@ var app = (function () { function menu_osuData_binding(value) { osuData = value; - $$invalidate(1, osuData); + $$invalidate(2, osuData); } - $$self.$capture_state = () => ({ Menu, Visualizer, songData, osuData }); + function menu_config_binding(value) { + config = value; + $$invalidate(1, config); + } + + $$self.$capture_state = () => ({ + Menu, + Visualizer, + Store, + store, + songData, + config, + osuData + }); $$self.$inject_state = $$props => { if ("songData" in $$props) $$invalidate(0, songData = $$props.songData); - if ("osuData" in $$props) $$invalidate(1, osuData = $$props.osuData); + if ("config" in $$props) $$invalidate(1, config = $$props.config); + if ("osuData" in $$props) $$invalidate(2, osuData = $$props.osuData); }; if ($$props && "$$inject" in $$props) { $$self.$inject_state($$props.$$inject); } + $$self.$$.update = () => { + if ($$self.$$.dirty & /*config*/ 2) { + store.set("config", config); + } + }; + return [ songData, + config, osuData, visualizer_songData_binding, visualizer_osuData_binding, menu_song_binding, - menu_osuData_binding + menu_osuData_binding, + menu_config_binding ]; } class App extends SvelteComponentDev { constructor(options) { super(options); - init(this, options, instance$2, create_fragment$2, safe_not_equal, {}); + init(this, options, instance$3, create_fragment$3, safe_not_equal, {}); dispatch_dev("SvelteRegisterComponent", { component: this, tagName: "App", options, - id: create_fragment$2.name + id: create_fragment$3.name }); } } diff --git a/public/build/bundle.js.map b/public/build/bundle.js.map index 51cb071..5236ad3 100644 --- a/public/build/bundle.js.map +++ b/public/build/bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"bundle.js","sources":["../../node_modules/svelte/internal/index.mjs","../../src/Menu.svelte","../../src/Visualizer.svelte","../../src/App.svelte","../../src/svelte.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\nfunction is_promise(value) {\n return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value = ret) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction detach(node) {\n node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction claim_element(nodes, name, attributes, svg) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeName === name) {\n let j = 0;\n const remove = [];\n while (j < node.attributes.length) {\n const attribute = node.attributes[j++];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n for (let k = 0; k < remove.length; k++) {\n node.removeAttribute(remove[k]);\n }\n return nodes.splice(i, 1)[0];\n }\n }\n return svg ? svg_element(name) : element(name);\n}\nfunction claim_text(nodes, data) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 3) {\n node.data = '' + data;\n return nodes.splice(i, 1)[0];\n }\n }\n return text(data);\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.wholeText !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n const z_index = (parseInt(computed_style.zIndex) || 0) - 1;\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', `display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ` +\n `overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: ${z_index};`);\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = `data:text/html,`;\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, false, false, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n constructor(anchor = null) {\n this.a = anchor;\n this.e = this.n = null;\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n this.e = element(target.nodeName);\n this.t = target;\n this.h(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = node.ownerDocument;\n active_docs.add(doc);\n const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = doc.head.appendChild(element('style')).sheet);\n const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n if (!current_rules[name]) {\n current_rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ``}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n active_docs.forEach(doc => {\n const stylesheet = doc.__svelte_stylesheet;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n doc.__svelte_rules = {};\n });\n active_docs.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error(`Function called outside component initialization`);\n return current_component;\n}\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail);\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n }\n };\n}\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n callbacks.slice().forEach(fn => fn(event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n if (flushing)\n return;\n flushing = true;\n do {\n // first, call beforeUpdate functions\n // and update components\n for (let i = 0; i < dirty_components.length; i += 1) {\n const component = dirty_components[i];\n set_current_component(component);\n update(component.$$);\n }\n set_current_component(null);\n dirty_components.length = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n flushing = false;\n seen_callbacks.clear();\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n let config = fn(node, params);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n delete_rule(node);\n if (is_function(config)) {\n config = config();\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n let config = fn(node, params);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n let config = fn(node, params);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = program.b - t;\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n info.blocks[i] = null;\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error(`Cannot have duplicate keys in a keyed each`);\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n const attributes = Object.assign({}, ...args);\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += \" \" + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += \" \" + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${String(value).replace(/\"/g, '"').replace(/'/g, ''')}\"`;\n }\n });\n return str;\n}\nconst escaped = {\n '\"': '"',\n \"'\": ''',\n '&': '&',\n '<': '<',\n '>': '>'\n};\nfunction escape(html) {\n return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(parent_component ? parent_component.$$.context : []),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, options = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, options);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : ``;\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor) {\n const { fragment, on_mount, on_destroy, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = on_mount.map(run).filter(is_function);\n if (on_destroy) {\n on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const prop_values = options.props || {};\n const $$ = component.$$ = {\n fragment: null,\n ctx: null,\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n before_update: [],\n after_update: [],\n context: new Map(parent_component ? parent_component.$$.context : []),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false\n };\n let ready = false;\n $$.ctx = instance\n ? instance(component, prop_values, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor);\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.25.1' }, detail)));\n}\nfunction append_dev(target, node) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node });\n append(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev(\"SvelteDOMRemove\", { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? [\"capture\"] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev(\"SvelteDOMAddEventListener\", { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev(\"SvelteDOMRemoveEventListener\", { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev(\"SvelteDOMRemoveAttribute\", { node, attribute });\n else\n dispatch_dev(\"SvelteDOMSetAttribute\", { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev(\"SvelteDOMSetProperty\", { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev(\"SvelteDOMSetDataset\", { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev(\"SvelteDOMSetData\", { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(`'target' is a required option`);\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn(`Component was already destroyed`); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error(`Infinite loop detected`);\n }\n };\n}\n\nexport { HtmlTag, SvelteComponent, SvelteComponentDev, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, assign, attr, attr_dev, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_space, claim_text, clear_loops, component_subscribe, compute_rest_props, compute_slots, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, escape, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getContext, get_binding_group_value, get_current_component, get_slot_changes, get_slot_context, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, has_prop, identity, init, insert, insert_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, update_keyed_each, update_slot, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","\r\n\r\n last = Date.now()} on:wheel={e => updateVolume(e)} />\r\n\r\n
\r\n
2000}>\r\n {#if song}\r\n
\r\n

{song.artist} - {song.song}

\r\n
\r\n
\r\n \"{playing\r\n
\r\n
\r\n \"Skip\r\n
\r\n
\r\n
\r\n {/if}\r\n
\r\n {#if now - lastVolumeUpdate < 4000 && song && song.audio}\r\n
2000}>\r\n
\r\n
\r\n {Math.round(song.audio.volume * 100)}%\r\n
\r\n
\r\n
\r\n {/if}\r\n
\r\n\r\n","\r\n\r\n\r\n\r\n\r\n \"logo\"\r\n \"\"\r\n\r\n\r\n","\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n","import App from './App.svelte';\r\n\r\nconst app = new App({\r\n\ttarget: document.body\r\n});\r\n\r\nexport default app;"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"bundle.js","sources":["../../node_modules/svelte/internal/index.mjs","../../src/components/options.svelte","../../src/Menu.svelte","../../src/Visualizer.svelte","../../src/App.svelte","../../src/svelte.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\nfunction is_promise(value) {\n return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value = ret) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction detach(node) {\n node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction claim_element(nodes, name, attributes, svg) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeName === name) {\n let j = 0;\n const remove = [];\n while (j < node.attributes.length) {\n const attribute = node.attributes[j++];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n for (let k = 0; k < remove.length; k++) {\n node.removeAttribute(remove[k]);\n }\n return nodes.splice(i, 1)[0];\n }\n }\n return svg ? svg_element(name) : element(name);\n}\nfunction claim_text(nodes, data) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 3) {\n node.data = '' + data;\n return nodes.splice(i, 1)[0];\n }\n }\n return text(data);\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.wholeText !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n const z_index = (parseInt(computed_style.zIndex) || 0) - 1;\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', `display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ` +\n `overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: ${z_index};`);\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = `data:text/html,`;\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, false, false, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n constructor(anchor = null) {\n this.a = anchor;\n this.e = this.n = null;\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n this.e = element(target.nodeName);\n this.t = target;\n this.h(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = node.ownerDocument;\n active_docs.add(doc);\n const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = doc.head.appendChild(element('style')).sheet);\n const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n if (!current_rules[name]) {\n current_rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ``}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n active_docs.forEach(doc => {\n const stylesheet = doc.__svelte_stylesheet;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n doc.__svelte_rules = {};\n });\n active_docs.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error(`Function called outside component initialization`);\n return current_component;\n}\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail);\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n }\n };\n}\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n callbacks.slice().forEach(fn => fn(event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n if (flushing)\n return;\n flushing = true;\n do {\n // first, call beforeUpdate functions\n // and update components\n for (let i = 0; i < dirty_components.length; i += 1) {\n const component = dirty_components[i];\n set_current_component(component);\n update(component.$$);\n }\n set_current_component(null);\n dirty_components.length = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n flushing = false;\n seen_callbacks.clear();\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n let config = fn(node, params);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n delete_rule(node);\n if (is_function(config)) {\n config = config();\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n let config = fn(node, params);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n let config = fn(node, params);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = program.b - t;\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n info.blocks[i] = null;\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error(`Cannot have duplicate keys in a keyed each`);\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n const attributes = Object.assign({}, ...args);\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += \" \" + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += \" \" + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${String(value).replace(/\"/g, '"').replace(/'/g, ''')}\"`;\n }\n });\n return str;\n}\nconst escaped = {\n '\"': '"',\n \"'\": ''',\n '&': '&',\n '<': '<',\n '>': '>'\n};\nfunction escape(html) {\n return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(parent_component ? parent_component.$$.context : []),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, options = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, options);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : ``;\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor) {\n const { fragment, on_mount, on_destroy, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = on_mount.map(run).filter(is_function);\n if (on_destroy) {\n on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const prop_values = options.props || {};\n const $$ = component.$$ = {\n fragment: null,\n ctx: null,\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n before_update: [],\n after_update: [],\n context: new Map(parent_component ? parent_component.$$.context : []),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false\n };\n let ready = false;\n $$.ctx = instance\n ? instance(component, prop_values, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor);\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.25.1' }, detail)));\n}\nfunction append_dev(target, node) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node });\n append(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev(\"SvelteDOMRemove\", { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? [\"capture\"] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev(\"SvelteDOMAddEventListener\", { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev(\"SvelteDOMRemoveEventListener\", { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev(\"SvelteDOMRemoveAttribute\", { node, attribute });\n else\n dispatch_dev(\"SvelteDOMSetAttribute\", { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev(\"SvelteDOMSetProperty\", { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev(\"SvelteDOMSetDataset\", { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev(\"SvelteDOMSetData\", { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(`'target' is a required option`);\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn(`Component was already destroyed`); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error(`Infinite loop detected`);\n }\n };\n}\n\nexport { HtmlTag, SvelteComponent, SvelteComponentDev, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, assign, attr, attr_dev, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_space, claim_text, clear_loops, component_subscribe, compute_rest_props, compute_slots, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, escape, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getContext, get_binding_group_value, get_current_component, get_slot_changes, get_slot_context, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, has_prop, identity, init, insert, insert_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, update_keyed_each, update_slot, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","\r\n\r\n
\r\n
visible = false}>
\r\n \r\n
\r\n \r\n","\r\n\r\n last = Date.now()} on:wheel={e => updateVolume(e)} />\r\n\r\n
\r\n {#if now - last < config.autohide.info + 1000}\r\n
config.autohide.info}>\r\n {#if song}\r\n
\r\n

{song.artist} - {song.song}

\r\n
\r\n
\r\n \"{song.playing\r\n
\r\n
\r\n \"Skip\r\n
\r\n
settingsOpen = !settingsOpen}>\r\n \"Settings\"\r\n
\r\n
\r\n
\r\n {/if}\r\n
\r\n {/if}\r\n {#if now - lastVolumeUpdate < config.autohide.volume + 1000 && song && song.audio}\r\n
config.autohide.volume}>\r\n
\r\n
\r\n {Math.round(song.audio.volume * 100)}%\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {/if}\r\n \r\n
\r\n\r\n","\r\n\r\n\r\n\r\n\r\n {#if songData && songData.beatmap && songData.beatmap.video && config.videoBackground}\r\n \r\n \r\n {/if}\r\n \"logo\"\r\n \"\"\r\n\r\n\r\n","\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n","import App from './App.svelte';\r\n\r\nconst app = new App({\r\n\ttarget: document.body\r\n});\r\n\r\nexport default app;"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/public/images/logo.png b/public/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..82a792899fe2be735bd140253c0971dd02687e54 GIT binary patch literal 127939 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 V(m&mQ8mi*dp=5Jb%eV6&DFM~&~A3M1w%zYiXN) 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 literal 0 HcmV?d00001 diff --git a/public/images/settings.svg b/public/images/settings.svg new file mode 100644 index 0000000..43f063e --- /dev/null +++ b/public/images/settings.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/public/lib/osu-parser.js b/public/lib/osu-parser.js new file mode 100644 index 0000000..00185f1 --- /dev/null +++ b/public/lib/osu-parser.js @@ -0,0 +1,515 @@ +var fs = require('fs'); +var slidercalc = require('osu-parser/lib/slidercalc.js'); + +function beatmapParser() { + var beatmap = { + nbCircles: 0, + nbSliders: 0, + nbSpinners: 0, + timingPoints: [], + breakTimes: [], + hitObjects: [] + }; + + var osuSection; + var bpmMin; + var bpmMax; + var members; + + var timingLines = []; + var objectLines = []; + var eventsLines = []; + var sectionReg = /^\[([a-zA-Z0-9]+)\]$/; + var keyValReg = /^([a-zA-Z0-9]+)[ ]*:[ ]*(.+)$/; + var curveTypes = { + C: "catmull", + B: "bezier", + L: "linear", + P: "pass-through" + }; + + /** + * Get the timing point affecting a specific offset + * @param {Integer} offset + * @return {Object} timingPoint + */ + var getTimingPoint = function (offset) { + for (var i = beatmap.timingPoints.length - 1; i >= 0; i--) { + if (beatmap.timingPoints[i].offset <= offset) { return beatmap.timingPoints[i]; } + } + return beatmap.timingPoints[0]; + }; + + /** + * Parse additions member + * @param {String} str additions member (sample:add:customSampleIndex:Volume:hitsound) + * @return {Object} additions a list of additions + */ + var parseAdditions = function (str) { + if (!str) return {}; + + var additions = {}; + var adds = str.split(':'); + + if (adds[0] && adds[0] !== '0') { + var sample; + switch (adds[0]) { + case '1': + sample = 'normal'; + break; + case '2': + sample = 'soft'; + break; + case '3': + sample = 'drum'; + break; + } + additions.sample = sample; + } + + if (adds[1] && adds[1] !== '0') { + var addSample; + switch (adds[1]) { + case '1': + addSample = 'normal'; + break; + case '2': + addSample = 'soft'; + break; + case '3': + addSample = 'drum'; + break; + } + additions.additionalSample = addSample; + } + + if (adds[2] && adds[2] !== '0') { additions.customSampleIndex = parseInt(adds[2]); } + if (adds[3] && adds[3] !== '0') { additions.hitsoundVolume = parseInt(adds[3]); } + if (adds[4]) { additions.hitsound = adds[4]; } + + return additions; + }; + + /** + * Parse a timing line + * @param {String} line + */ + var parseTimingPoint = function (line) { + members = line.split(','); + + var timingPoint = { + offset: parseInt(members[0]), + beatLength: parseFloat(members[1]), + velocity: 1, + timingSignature: parseInt(members[2]), + sampleSetId: parseInt(members[3]), + customSampleIndex: parseInt(members[4]), + sampleVolume: parseInt(members[5]), + timingChange: (members[6] == 1), + kiaiTimeActive: (members[7] == 1) + }; + + if (!isNaN(timingPoint.beatLength) && timingPoint.beatLength !== 0) { + if (timingPoint.beatLength > 0) { + // If positive, beatLength is the length of a beat in milliseconds + var bpm = Math.round(60000 / timingPoint.beatLength); + beatmap.bpmMin = beatmap.bpmMin ? Math.min(beatmap.bpmMin, bpm) : bpm; + beatmap.bpmMax = beatmap.bpmMax ? Math.max(beatmap.bpmMax, bpm) : bpm; + timingPoint.bpm = bpm; + } else { + // If negative, beatLength is a velocity factor + timingPoint.velocity = Math.abs(100 / timingPoint.beatLength); + } + } + + beatmap.timingPoints.push(timingPoint); + }; + + /** + * Parse an object line + * @param {String} line + */ + var parseHitObject = function (line) { + members = line.split(','); + + var soundType = members[4]; + var objectType = members[3]; + + var hitObject = { + startTime: parseInt(members[2]), + newCombo: ((objectType & 4) == 4), + soundTypes: [], + position: [ + parseInt(members[0]), + parseInt(members[1]) + ] + }; + + /** + * sound type is a bitwise flag enum + * 0 : normal + * 2 : whistle + * 4 : finish + * 8 : clap + */ + if ((soundType & 2) == 2) { hitObject.soundTypes.push('whistle'); } + if ((soundType & 4) == 4) { hitObject.soundTypes.push('finish'); } + if ((soundType & 8) == 8) { hitObject.soundTypes.push('clap'); } + if (hitObject.soundTypes.length === 0) { hitObject.soundTypes.push('normal'); } + + /** + * object type is a bitwise flag enum + * 1: circle + * 2: slider + * 8: spinner + */ + if ((objectType & 1) == 1) { + // Circle + beatmap.nbCircles++; + hitObject.objectName = 'circle'; + hitObject.additions = parseAdditions(members[5]); + } else if ((objectType & 8) == 8) { + // Spinner + beatmap.nbSpinners++; + hitObject.objectName = 'spinner'; + hitObject.endTime = parseInt(members[5]); + hitObject.additions = parseAdditions(members[6]); + } else if ((objectType & 2) == 2) { + // Slider + beatmap.nbSliders++; + hitObject.objectName = 'slider'; + hitObject.repeatCount = parseInt(members[6]); + hitObject.pixelLength = parseInt(members[7]); + hitObject.additions = parseAdditions(members[10]); + hitObject.edges = []; + hitObject.points = [ + [hitObject.position[0], hitObject.position[1]] + ]; + + /** + * Calculate slider duration + */ + var timing = getTimingPoint(hitObject.startTime); + + if (timing) { + var pxPerBeat = beatmap.SliderMultiplier * 100 * timing.velocity; + var beatsNumber = (hitObject.pixelLength * hitObject.repeatCount) / pxPerBeat; + hitObject.duration = Math.ceil(beatsNumber * timing.beatLength); + hitObject.endTime = hitObject.startTime + hitObject.duration; + } + /** + * Parse slider points + */ + var points = (members[5] || '').split('|'); + if (points.length) { + hitObject.curveType = curveTypes[points[0]] || 'unknown'; + + for (var i = 1, l = points.length; i < l; i++) { + var coordinates = points[i].split(':'); + hitObject.points.push([ + parseInt(coordinates[0]), + parseInt(coordinates[1]) + ]); + } + } + + var edgeSounds = []; + var edgeAdditions = []; + if (members[8]) { edgeSounds = members[8].split('|'); } + if (members[9]) { edgeAdditions = members[9].split('|'); } + + /** + * Get soundTypes and additions for each slider edge + */ + for (var j = 0, lgt = hitObject.repeatCount + 1; j < lgt; j++) { + var edge = { + soundTypes: [], + additions: parseAdditions(edgeAdditions[j]) + }; + + if (edgeSounds[j]) { + var sound = edgeSounds[j]; + if ((sound & 2) == 2) { edge.soundTypes.push('whistle'); } + if ((sound & 4) == 4) { edge.soundTypes.push('finish'); } + if ((sound & 8) == 8) { edge.soundTypes.push('clap'); } + if (edge.soundTypes.length === 0) { edge.soundTypes.push('normal'); } + } else { + edge.soundTypes.push('normal'); + } + + hitObject.edges.push(edge); + } + + // get coordinates of the slider endpoint + var endPoint = slidercalc.getEndPoint(hitObject.curveType, hitObject.pixelLength, hitObject.points); + if (endPoint && endPoint[0] && endPoint[1]) { + hitObject.endPosition = [ + Math.round(endPoint[0]), + Math.round(endPoint[1]) + ]; + } else { + // If endPosition could not be calculated, approximate it by setting it to the last point + hitObject.endPosition = hitObject.points[hitObject.points.length - 1]; + } + } else { + // Unknown + hitObject.objectName = 'unknown'; + } + + beatmap.hitObjects.push(hitObject); + }; + + /** + * Parse an event line + * @param {String} line + */ + var parseEvent = function (line) { + /** + * Background line : 0,0,"bg.jpg" + * TODO: confirm that the second member is always zero + * + * Breaktimes lines : 2,1000,2000 + * second integer is start offset + * third integer is end offset + */ + members = line.split(','); + + if (members[0] == '0' && members[1] == '0' && members[2]) { + var bgName = members[2].trim(); + + if (bgName.charAt(0) == '"' && bgName.charAt(bgName.length - 1) == '"') { + beatmap.bgFilename = bgName.substring(1, bgName.length - 1); + } else { + beatmap.bgFilename = bgName; + } + } else if (members[0] == 'Video' && members[2]) { + var bgName = members[2].trim(); + + if (bgName.charAt(0) == '"' && bgName.charAt(bgName.length - 1) == '"') { + beatmap.video = bgName.substring(1, bgName.length - 1); + } else { + beatmap.video = bgName; + } + } else if (members[0] == '2' && /^[0-9]+$/.test(members[1]) && /^[0-9]+$/.test(members[2])) { + beatmap.breakTimes.push({ + startTime: parseInt(members[1]), + endTime: parseInt(members[2]) + }); + } + }; + + /** + * Compute the total time and the draining time of the beatmap + */ + var computeDuration = function () { + var firstObject = beatmap.hitObjects[0]; + var lastObject = beatmap.hitObjects[beatmap.hitObjects.length - 1]; + + var totalBreakTime = 0; + + beatmap.breakTimes.forEach(function (breakTime) { + totalBreakTime += (breakTime.endTime - breakTime.startTime); + }); + + if (firstObject && lastObject) { + beatmap.totalTime = Math.floor(lastObject.startTime / 1000); + beatmap.drainingTime = Math.floor((lastObject.startTime - firstObject.startTime - totalBreakTime) / 1000); + } else { + beatmap.totalTime = 0; + beatmap.drainingTime = 0; + } + }; + + /** + * Browse objects and compute max combo + */ + var computeMaxCombo = function () { + if (beatmap.timingPoints.length === 0) { return; } + + var maxCombo = 0; + var sliderMultiplier = parseFloat(beatmap.SliderMultiplier); + var sliderTickRate = parseInt(beatmap.SliderTickRate, 10); + + var timingPoints = beatmap.timingPoints; + var currentTiming = timingPoints[0]; + var nextOffset = timingPoints[1] ? timingPoints[1].offset : Infinity; + var i = 1; + + beatmap.hitObjects.forEach(function (hitObject) { + if (hitObject.startTime >= nextOffset) { + currentTiming = timingPoints[i++]; + nextOffset = timingPoints[i] ? timingPoints[i].offset : Infinity; + } + + var osupxPerBeat = sliderMultiplier * 100 * currentTiming.velocity; + var tickLength = osupxPerBeat / sliderTickRate; + + switch (hitObject.objectName) { + case 'spinner': + case 'circle': + maxCombo++; + break; + case 'slider': + var tickPerSide = Math.ceil((Math.floor(hitObject.pixelLength / tickLength * 100) / 100) - 1); + maxCombo += (hitObject.edges.length - 1) * (tickPerSide + 1) + 1; // 1 combo for each tick and endpoint + } + }); + + beatmap.maxCombo = maxCombo; + }; + + /** + * Read a single line, parse when key/value, store when further parsing needed + * @param {String|Buffer} line + */ + var readLine = function (line) { + line = line.toString().trim(); + if (!line) { return; } + + var match = sectionReg.exec(line); + if (match) { + osuSection = match[1].toLowerCase(); + return; + } + if(line.startsWith("//")) return; + + switch (osuSection) { + case 'timingpoints': + timingLines.push(line); + break; + case 'hitobjects': + objectLines.push(line); + break; + case 'events': + eventsLines.push(line); + break; + default: + if (!osuSection) { + match = /^osu file format (v[0-9]+)$/.exec(line); + if (match) { + beatmap.fileFormat = match[1]; + return; + } + } + + /** + * Apart from events, timingpoints and hitobjects sections, lines are "key: value" + */ + match = keyValReg.exec(line); + if (match) { beatmap[match[1]] = match[2]; } + } + }; + + /** + * Compute everything that require the file to be completely parsed and return the beatmap + * @return {Object} beatmap + */ + var buildBeatmap = function () { + if (beatmap.Tags) { + beatmap.tagsArray = beatmap.Tags.split(' '); + } + + eventsLines.forEach(parseEvent); + beatmap.breakTimes.sort(function (a, b) { return (a.startTime > b.startTime ? 1 : -1); }); + + timingLines.forEach(parseTimingPoint); + beatmap.timingPoints.sort(function (a, b) { return (a.offset > b.offset ? 1 : -1); }); + + var timingPoints = beatmap.timingPoints; + + for (var i = 1, l = timingPoints.length; i < l; i++) { + if (!timingPoints[i].hasOwnProperty('bpm')) { + timingPoints[i].beatLength = timingPoints[i - 1].beatLength; + timingPoints[i].bpm = timingPoints[i - 1].bpm; + } + } + + objectLines.forEach(parseHitObject); + beatmap.hitObjects.sort(function (a, b) { return (a.startTime > b.startTime ? 1 : -1); }); + + computeMaxCombo(); + computeDuration(); + + return beatmap; + }; + + return { + readLine: readLine, + buildBeatmap: buildBeatmap + }; +} + + + +/** + * Parse a .osu file + * @param {String} file path to the file + * @param {Function} callback(err, beatmap) + */ +exports.parseFile = function (file, callback) { + if (!fs.existsSync(file)) { + callback(new Error('File does not exist')); + return; + } + + var parser = beatmapParser(); + var stream = fs.createReadStream(file); + var buffer = ''; + + + stream.on('data', function (chunk) { + buffer += chunk; + var lines = buffer.split(/\r?\n/); + buffer = lines.pop() || ''; + lines.forEach(parser.readLine); + }); + + stream.on('error', function (err) { + callback(err); + }); + + stream.on('end', function () { + buffer.split(/\r?\n/).forEach(parser.readLine); + callback(null, parser.buildBeatmap()); + }); +}; + +/** + * Parse a stream containing .osu content + * @param {Stream} stream + * @param {Function} callback(err, beatmap) + */ +exports.parseStream = function (stream, callback) { + var parser = beatmapParser(); + var buffer = ''; + + stream.on('data', function (chunk) { + buffer += chunk.toString(); + var lines = buffer.split(/\r?\n/); + buffer = lines.pop() || ''; + lines.forEach(parser.readLine); + }); + + stream.on('error', function (err) { + callback(err); + }); + + stream.on('end', function () { + buffer.split(/\r?\n/).forEach(parser.readLine); + callback(null, parser.buildBeatmap()); + }); +}; + +/** + * Parse the content of a .osu + * @param {String|Buffer} content + * @return {Object} beatmap + */ +exports.parseContent = function (content) { + var parser = beatmapParser(); + content.toString().split(/[\n\r]+/).forEach(function (line) { + parser.readLine(line); + }); + + return parser.buildBeatmap(); +}; \ No newline at end of file diff --git a/src/App.svelte b/src/App.svelte index a93dc29..c595481 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -1,18 +1,59 @@
- +
diff --git a/src/Menu.svelte b/src/Menu.svelte index a2b1d31..367900e 100644 --- a/src/Menu.svelte +++ b/src/Menu.svelte @@ -1,17 +1,20 @@ last = Date.now()} on:wheel={e => updateVolume(e)} />