diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..da93220 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/node_modules/ +/public/build/ + +.DS_Store diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a3149b3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1761 @@ +{ + "name": "svelte-app", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "svelte-app", + "version": "1.0.0", + "dependencies": { + "sirv-cli": "^1.0.11" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^14.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "rollup": "^2.39.0", + "rollup-plugin-livereload": "^2.0.0", + "rollup-plugin-svelte": "^6.1.1", + "rollup-plugin-terser": "^7.0.0", + "svelte": "^3.32.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.11", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz", + "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==" + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-14.0.0.tgz", + "integrity": "sha512-+PSmD9ePwTAeU106i9FRdc+Zb3XUWyW26mo5Atr2mk82hor8+nPwkztEjFo8/B1fJKfaQDg9aM2bzQkjhi7zOw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.0.8", + "commondir": "^1.0.1", + "estree-walker": "^1.0.1", + "glob": "^7.1.2", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^2.3.4" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz", + "integrity": "sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deep-freeze": "^0.0.1", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.14.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz", + "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/console-clear": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", + "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-freeze": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", + "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/livereload": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz", + "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==", + "dev": true, + "dependencies": { + "chokidar": "^3.3.0", + "livereload-js": "^3.1.0", + "opts": ">= 1.2.0", + "ws": "^6.2.1" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/livereload-js": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.1.tgz", + "integrity": "sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==", + "dev": true + }, + "node_modules/local-access": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", + "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mri": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", + "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.39.0.tgz", + "integrity": "sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/rollup-plugin-livereload": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz", + "integrity": "sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A==", + "dev": true, + "dependencies": { + "livereload": "^0.9.1" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/rollup-plugin-svelte": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-6.1.1.tgz", + "integrity": "sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow==", + "dev": true, + "dependencies": { + "require-relative": "^0.8.7", + "rollup-pluginutils": "^2.8.2", + "sourcemap-codec": "^1.4.8" + }, + "peerDependencies": { + "rollup": ">=1.19.2", + "svelte": "*" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/sade": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", + "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semiver": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", + "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/sirv": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.11.tgz", + "integrity": "sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg==", + "dependencies": { + "@polka/url": "^1.0.0-next.9", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv-cli": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-1.0.11.tgz", + "integrity": "sha512-L8NILoRSBd38VcfFcERYCaVCnWPBLo9G6u/a37UJ8Ysv4DfjizMbFBcM+SswNnndJienhR6qy8KFuAEaeL4g8Q==", + "dependencies": { + "console-clear": "^1.1.0", + "get-port": "^3.2.0", + "kleur": "^3.0.0", + "local-access": "^1.0.1", + "sade": "^1.6.0", + "semiver": "^1.0.0", + "sirv": "^1.0.11", + "tinydate": "^1.0.0" + }, + "bin": { + "sirv": "bin.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svelte": { + "version": "3.32.3", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.32.3.tgz", + "integrity": "sha512-5etu/wDwtewhnYO/631KKTjSmFrKohFLWNm1sWErVHXqGZ8eJLqrW0qivDSyYTcN8GbUqsR4LkIhftNFsjNehg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz", + "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tinydate": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", + "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@polka/url": { + "version": "1.0.0-next.11", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz", + "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==" + }, + "@rollup/plugin-commonjs": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-14.0.0.tgz", + "integrity": "sha512-+PSmD9ePwTAeU106i9FRdc+Zb3XUWyW26mo5Atr2mk82hor8+nPwkztEjFo8/B1fJKfaQDg9aM2bzQkjhi7zOw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.8", + "commondir": "^1.0.1", + "estree-walker": "^1.0.1", + "glob": "^7.1.2", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz", + "integrity": "sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deep-freeze": "^0.0.1", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.17.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/node": { + "version": "14.14.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz", + "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==", + "dev": true + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-clear": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", + "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==" + }, + "deep-freeze": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", + "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "livereload": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz", + "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==", + "dev": true, + "requires": { + "chokidar": "^3.3.0", + "livereload-js": "^3.1.0", + "opts": ">= 1.2.0", + "ws": "^6.2.1" + } + }, + "livereload-js": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.1.tgz", + "integrity": "sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==", + "dev": true + }, + "local-access": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", + "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==" + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mri": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", + "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "rollup": { + "version": "2.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.39.0.tgz", + "integrity": "sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw==", + "dev": true, + "requires": { + "fsevents": "~2.3.1" + } + }, + "rollup-plugin-livereload": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz", + "integrity": "sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A==", + "dev": true, + "requires": { + "livereload": "^0.9.1" + } + }, + "rollup-plugin-svelte": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-6.1.1.tgz", + "integrity": "sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow==", + "dev": true, + "requires": { + "require-relative": "^0.8.7", + "rollup-pluginutils": "^2.8.2", + "sourcemap-codec": "^1.4.8" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "sade": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", + "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "requires": { + "mri": "^1.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "semiver": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", + "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==" + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "sirv": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.11.tgz", + "integrity": "sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg==", + "requires": { + "@polka/url": "^1.0.0-next.9", + "mime": "^2.3.1", + "totalist": "^1.0.0" + } + }, + "sirv-cli": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-1.0.11.tgz", + "integrity": "sha512-L8NILoRSBd38VcfFcERYCaVCnWPBLo9G6u/a37UJ8Ysv4DfjizMbFBcM+SswNnndJienhR6qy8KFuAEaeL4g8Q==", + "requires": { + "console-clear": "^1.1.0", + "get-port": "^3.2.0", + "kleur": "^3.0.0", + "local-access": "^1.0.1", + "sade": "^1.6.0", + "semiver": "^1.0.0", + "sirv": "^1.0.11", + "tinydate": "^1.0.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svelte": { + "version": "3.32.3", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.32.3.tgz", + "integrity": "sha512-5etu/wDwtewhnYO/631KKTjSmFrKohFLWNm1sWErVHXqGZ8eJLqrW0qivDSyYTcN8GbUqsR4LkIhftNFsjNehg==", + "dev": true + }, + "terser": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz", + "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + } + }, + "tinydate": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", + "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ffb3984 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "svelte-app", + "version": "1.0.0", + "scripts": { + "build": "rollup -c", + "dev": "rollup -c -w", + "start": "sirv public" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^14.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "rollup": "^2.39.0", + "rollup-plugin-livereload": "^2.0.0", + "rollup-plugin-svelte": "^6.1.1", + "rollup-plugin-terser": "^7.0.0", + "svelte": "^3.32.3" + }, + "dependencies": { + "sirv-cli": "^1.0.11" + } +} diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..7e6f5eb Binary files /dev/null and b/public/favicon.png differ diff --git a/public/global.css b/public/global.css new file mode 100644 index 0000000..6055953 --- /dev/null +++ b/public/global.css @@ -0,0 +1,63 @@ +html, body { + position: relative; + width: 100%; + height: 100%; +} + +body { + color: #333; + margin: 0; + padding: 8px; + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; +} + +a { + color: rgb(0,100,200); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +a:visited { + color: rgb(0,80,160); +} + +label { + display: block; +} + +input, button, select, textarea { + font-family: inherit; + font-size: inherit; + -webkit-padding: 0.4em 0; + padding: 0.4em; + margin: 0 0 0.5em 0; + box-sizing: border-box; + border: 1px solid #ccc; + border-radius: 2px; +} + +input:disabled { + color: #ccc; +} + +button { + color: #333; + background-color: #f4f4f4; + outline: none; +} + +button:disabled { + color: #999; +} + +button:not(:disabled):active { + background-color: #ddd; +} + +button:focus { + border-color: #666; +} diff --git a/public/img/portfolio/thumb_dbg.jpg b/public/img/portfolio/thumb_dbg.jpg new file mode 100755 index 0000000..40b858f Binary files /dev/null and b/public/img/portfolio/thumb_dbg.jpg differ diff --git a/public/img/portfolio/thumb_dragomi.jpg b/public/img/portfolio/thumb_dragomi.jpg new file mode 100755 index 0000000..57d3447 Binary files /dev/null and b/public/img/portfolio/thumb_dragomi.jpg differ diff --git a/public/img/portfolio/thumb_interphase.jpg b/public/img/portfolio/thumb_interphase.jpg new file mode 100755 index 0000000..336103c Binary files /dev/null and b/public/img/portfolio/thumb_interphase.jpg differ diff --git a/public/img/portfolio/thumb_meow-wolf.jpg b/public/img/portfolio/thumb_meow-wolf.jpg new file mode 100755 index 0000000..49381b5 Binary files /dev/null and b/public/img/portfolio/thumb_meow-wolf.jpg differ diff --git a/public/img/portfolio/thumb_nike_beacon.jpg b/public/img/portfolio/thumb_nike_beacon.jpg new file mode 100755 index 0000000..ac81e41 Binary files /dev/null and b/public/img/portfolio/thumb_nike_beacon.jpg differ diff --git a/public/img/portfolio/thumb_nike_bigair.jpg b/public/img/portfolio/thumb_nike_bigair.jpg new file mode 100755 index 0000000..0958507 Binary files /dev/null and b/public/img/portfolio/thumb_nike_bigair.jpg differ diff --git a/public/img/portfolio/thumb_nike_treadmill.jpg b/public/img/portfolio/thumb_nike_treadmill.jpg new file mode 100755 index 0000000..22b52ef Binary files /dev/null and b/public/img/portfolio/thumb_nike_treadmill.jpg differ diff --git a/public/img/portfolio/thumb_omnia.jpg b/public/img/portfolio/thumb_omnia.jpg new file mode 100755 index 0000000..85d6ba1 Binary files /dev/null and b/public/img/portfolio/thumb_omnia.jpg differ diff --git a/public/img/portfolio/thumb_pixelmixer.jpg b/public/img/portfolio/thumb_pixelmixer.jpg new file mode 100755 index 0000000..139e02f Binary files /dev/null and b/public/img/portfolio/thumb_pixelmixer.jpg differ diff --git a/public/img/portfolio/thumb_raindance.jpg b/public/img/portfolio/thumb_raindance.jpg new file mode 100755 index 0000000..08f2393 Binary files /dev/null and b/public/img/portfolio/thumb_raindance.jpg differ diff --git a/public/img/portfolio/thumb_rapt.jpg b/public/img/portfolio/thumb_rapt.jpg new file mode 100755 index 0000000..c99d32e Binary files /dev/null and b/public/img/portfolio/thumb_rapt.jpg differ diff --git a/public/img/portfolio/thumb_tipper.jpg b/public/img/portfolio/thumb_tipper.jpg new file mode 100755 index 0000000..5c56440 Binary files /dev/null and b/public/img/portfolio/thumb_tipper.jpg differ diff --git a/public/img/portfolio/thumb_toyota.jpg b/public/img/portfolio/thumb_toyota.jpg new file mode 100755 index 0000000..d998a3a Binary files /dev/null and b/public/img/portfolio/thumb_toyota.jpg differ diff --git a/public/img/test-logo.png b/public/img/test-logo.png new file mode 100644 index 0000000..a8e3c49 Binary files /dev/null and b/public/img/test-logo.png differ diff --git a/public/img/test-logo_sm.png b/public/img/test-logo_sm.png new file mode 100644 index 0000000..752d7e1 Binary files /dev/null and b/public/img/test-logo_sm.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..d1511da --- /dev/null +++ b/public/index.html @@ -0,0 +1,18 @@ + + + + + + + Hepp Maccoy | Developer Showcase: WebGL Shader + + + + + + + + + + + diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..ecdc627 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,75 @@ +import svelte from 'rollup-plugin-svelte'; +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import livereload from 'rollup-plugin-livereload'; +import { terser } from 'rollup-plugin-terser'; + +const production = !process.env.ROLLUP_WATCH; + +function serve() { + let server; + + function toExit() { + if (server) server.kill(0); + } + + return { + writeBundle() { + if (server) return; + server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], { + stdio: ['ignore', 'inherit', 'inherit'], + shell: true + }); + + process.on('SIGTERM', toExit); + process.on('exit', toExit); + } + }; +} + +export default { + input: 'src/main.js', + output: { + sourcemap: true, + format: 'iife', + name: 'app', + file: 'public/build/bundle.js' + }, + plugins: [ + svelte({ + // enable run-time checks when not in production + dev: !production, + // we'll extract any component CSS out into + // a separate file - better for performance + css: css => { + css.write('bundle.css'); + } + }), + + // If you have external dependencies installed from + // npm, you'll most likely need these plugins. In + // some cases you'll need additional configuration - + // consult the documentation for details: + // https://github.com/rollup/plugins/tree/master/packages/commonjs + resolve({ + browser: true, + dedupe: ['svelte'] + }), + commonjs(), + + // In dev mode, call `npm run start` once + // the bundle has been generated + !production && serve(), + + // Watch the `public` directory and refresh the + // browser on changes when not in production + !production && livereload('public'), + + // If we're building for production (npm run build + // instead of npm run dev), minify + production && terser() + ], + watch: { + clearScreen: false + } +}; diff --git a/src/App.svelte b/src/App.svelte new file mode 100644 index 0000000..c05b865 --- /dev/null +++ b/src/App.svelte @@ -0,0 +1,141 @@ + + + + + + + + + + +
+ + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+ + +</div> + diff --git a/src/components/ButtonLink.svelte b/src/components/ButtonLink.svelte new file mode 100644 index 0000000..cdbe81a --- /dev/null +++ b/src/components/ButtonLink.svelte @@ -0,0 +1,23 @@ +<script> + import { fade, fly } from 'svelte/transition'; + export let shown, text, link; + +</script> + +<style> + a { + position: relative; + left: 50px; + top: 50px; + font-size: large; + padding: 1.4em; + color: rgb(84, 178, 255); + background-color: rgb(141, 0, 71); + } +</style> + +{#if shown} +<a href={link} in:fly="{{ duration: 300, delay: 1700 }}" out:fade="{{ duration: 300 }}"> + {text} +</a> +{/if} \ No newline at end of file diff --git a/src/components/Content.svelte b/src/components/Content.svelte new file mode 100644 index 0000000..9f851c7 --- /dev/null +++ b/src/components/Content.svelte @@ -0,0 +1,13 @@ +<!-- Empty layer that we can scroll through --> +<style> + div { + top: 13%; + width: 100%; + position: absolute; + max-width: 1600px; + height: 420%; + } +</style> + +<div > +</div> \ No newline at end of file diff --git a/src/components/ImageGrid.svelte b/src/components/ImageGrid.svelte new file mode 100644 index 0000000..01cc319 --- /dev/null +++ b/src/components/ImageGrid.svelte @@ -0,0 +1,37 @@ +<!-- Simple Image Grid animates in cascade style --> + +<script> + import { fade, fly } from 'svelte/transition'; + + export let shown; + export let imgData; + + export let imgDuration = 200; + export let imgDelay = 105; + export let imgOffset = -16; +</script> + +<style> + div { + position: relative; + opacity: .8; + max-width: 1100px; + } + img { + width: 150px; + height: 116px; + margin: 8px; + background-color: #ffffff; + } +</style> + +{#if shown} + <div in:fly="{{ duration: 200 }}"> + {#each imgData as o, i} + <img + in:fly="{{ y: imgOffset, duration: imgDuration, delay: imgDelay * (i+2) }}" + out:fade="{{ duration: 200, delay: (imgDelay * .5) * i }}" + src={o.src} alt={o.alt} title={o.alt}> + {/each} + </div> +{/if} \ No newline at end of file diff --git a/src/components/RotatingItemGrid.svelte b/src/components/RotatingItemGrid.svelte new file mode 100644 index 0000000..9841dfe --- /dev/null +++ b/src/components/RotatingItemGrid.svelte @@ -0,0 +1,154 @@ +<!-- Rotating List of Text Items --> + +<script> + + import { fade, fly } from 'svelte/transition'; + + export let shown; + export let list; + export let innerWidth; + + const defaultCount = 18; + const newSelected = () => Math.floor(Math.random() * defaultCount); + const delayTime = 90; + let newDelay = 200; + let selected = newSelected(); + let stage = 0; + let count = 0; + let reveal = 0; + let columns; + let prevWidth; + let tNew; + let width; + + let items = []; + let displayed = []; + for (let i = 0; i < defaultCount; i++) { + items.push({"name": list[i], "x": 0, "y": 0, "size": 23, "visible": false}); + displayed.push(true); + } + for (let i = defaultCount; i < list.length; i++) { + displayed.push(false); + } + + (function loop() { + requestAnimationFrame(loop); + + // Simple grid layout + + width = Math.min(innerWidth, 1200); + + let xStart = 100; + if(width < 900){ + columns = 2; + xStart = 0; + }else{ + columns = 3; + } + if(prevWidth != width){ + let xStack = (width - xStart) / columns; + let xS = xStart; + let yStart = 0; + let yS = yStart; + let cS = 0; + + for (let i = 0; i < defaultCount; i++) { + items[i].x = xS; + items[i].y = yS; + yS += 42; + + cS++; + if(cS >= defaultCount / columns){ + xS += xStack; + yS = yStart; + cS = 0; + } + } + } + prevWidth = width; + + if(shown){ + count++; + + if(reveal < items.length){ + + // Intro + if(count % 5 == 1){ + items[Math.floor(reveal)].visible = true; + reveal++; + } + }else{ + + // Things rotate randomly + if(stage == 0){ + + if(count >= newDelay){ + stage = 1; + count = 0; + items[selected].visible = false; + newDelay = Math.floor(Math.random() * delayTime) + 25; + } + + }else if(stage == 1){ + + if(count >= 26){ + stage = 2; + count = 0; + + tNew = Math.floor(Math.random() * list.length); + while(displayed[tNew]){ + tNew = Math.floor(Math.random() * list.length); + } + displayed[list.indexOf(items[selected].name)] = false; + items[selected].visible = true; + items[selected].name = list[tNew]; + displayed[tNew] = true; + } + + }else if(stage == 2){ + + if(count >= 22){ + stage = 0; + count = 0; + let newS = 0; + + while(newS == 0 || newS == selected){ + newS = newSelected(); + } + selected = newS; + } + } + } + }else{ + stage = 0; + count = 0; + reveal = Math.max(reveal - .5, 0); + items[Math.floor(reveal)].visible = false; + } + })(); +</script> + +<style> + div { + opacity: .8; + pointer-events: none; + } + + h2 { + position: absolute; + width: 230px; + background-color: #131516; + color: rgb(200, 195, 188); + padding: 0 .85em 0 .5em; + font-size: .15em; + } +</style> + +<div> + {#each items as o, i} + {#if o.visible} + <h2 in:fly="{{ x: -24, y: -1, duration: 230 }}" out:fade="{{ duration: 350 }}" + style="font-size: {o.size}px; transform: translate({o.x}px,{o.y}px);">{o.name}</h2> + {/if} + {/each} +</div> \ No newline at end of file diff --git a/src/components/ScatterformControl.svelte b/src/components/ScatterformControl.svelte new file mode 100644 index 0000000..5557e20 --- /dev/null +++ b/src/components/ScatterformControl.svelte @@ -0,0 +1,97 @@ +<!-- Harness for 'ScatterFormLite' --> + +<script> + import { spring } from 'svelte/motion'; + + import { getColorMod3, getColorMod4, + getCamZoom, getPiMod, getLayer2Amp, getLayer4Amp, + getMod1A, getMod1B, getMod1C, getMod1D, + getGlowStrength, getLightZ, + getGlowColor, getColor2, getColor3, getColor4 + } from "../utils/ScrollLogic.svelte"; + + import ScatterformLite from "./ScatterformLite.svelte"; + + export let yscrollPerc = 0; + export let scale = 1; + export let fallbackUrl; + export let camRotate = { x: 0, y: 0 }; + export let mouse = { x: 0, y: 0 }; + + const camFovDefault = -.41; + let camFov; + let count = 0; + + let xmod = spring(.5, { + stiffness: 0.01, + damping: 0.08 + }); + + let mod1D = 0; + + (function loop() { + requestAnimationFrame(loop); + count++; + + // Uniform control (in addition to ScrollLogic methods used below) + + + // Shader Mod1D + const limitMod1 = .15; + if(yscrollPerc < limitMod1 + .02){ + xmod.set( mouse.x.map(0, 1, 3, 5) * yscrollPerc.map(0, limitMod1, 3, 0) ); + }else{ + if(yscrollPerc > .6){ + xmod.set( mouse.x.map(0, 1, 5, 12) * yscrollPerc.map(.5, .8, 3, 0) ); + }else{ + xmod.set(0); + } + } + mod1D = ($xmod + (-16)); + + // Easter Egg at end twists FOV + if(yscrollPerc > .9){ + camFov = yscrollPerc.map(.9, 1, camFovDefault, .45); + }else{ + // Default + camFov = camFovDefault; + } + })(); + +</script> + +<style> + .container { + width: 100%; + height: 100%; + position: fixed; + left: 0; + top: 0; + } +</style> + +<div class="container" > + <ScatterformLite + {scale} + {mod1D} + {camRotate} + {camFov} + {fallbackUrl} + + piMod = {getPiMod(yscrollPerc)} + camZoom = {getCamZoom(yscrollPerc)} + color2 = {getColor2(yscrollPerc)} + color3 = {getColor3(yscrollPerc)} + color4 = {getColor4(yscrollPerc)} + lightZ = {getLightZ(yscrollPerc)} + colorGlow = {getGlowColor(yscrollPerc)} + glowStrength = {getGlowStrength(yscrollPerc)} + layer2Amp = {getLayer2Amp(yscrollPerc)} + layer4Amp = {getLayer4Amp(yscrollPerc)} + mod1A = {getMod1A(yscrollPerc)} + mod1B = {getMod1B(mouse.x, yscrollPerc)} + mod1C = {getMod1C(yscrollPerc)} + colorMod3 = {getColorMod3(yscrollPerc)} + colorMod4 = {getColorMod4(yscrollPerc)} + /> +</div> \ No newline at end of file diff --git a/src/components/ScatterformLite.svelte b/src/components/ScatterformLite.svelte new file mode 100644 index 0000000..11265a2 --- /dev/null +++ b/src/components/ScatterformLite.svelte @@ -0,0 +1,146 @@ +<!-- WebGL Harness for 'Lite' version of 'Scatterform' pixelshader by Hepp Maccoy --> + +<script> + import { onMount } from "svelte"; + + import { + createProgramFromSources, + bindQuadBuffer, + vertexShader, + } from "../utils/ShaderUtils.svelte"; + + import { fragShader } from "../scatterform/ScatterformLiteFrag.svelte"; + + export let scale = 1; + export let camZoom = 30; + export let camFov = -0.41; + export let piMod = 3.14; + export let colorMod3 = .5; + export let colorMod4 = .5; + export let layer2Amp = 1; + export let layer4Amp = 0; + export let mod1A = 0; + export let mod1B = 0; + export let mod1C = 0; + export let mod1D = 0; + export let time = 0; + export let camRotate = { x: 0, y: 0 }; + export let color2 = {r: 1, g: 0, b: 0}; + export let color3 = {r: 0, g: 1, b: 0}; + export let color4 = {r: 1, g: 0, b: 1}; + export let colorGlow = {r: .5, g: .5, b: 0}; + export let glowStrength = 0; + export let lightZ = 0; + + export let fallbackUrl = "https://get.webgl.org/"; // Default URL + + export let canvasWidth = 2600; // initial dimensions before resized + export let canvasHeight = 1500; + + let canvas; + let gl; + let program; + let resolution_Loc; + let time_Loc; + let camRotateX_Loc, camRotateY_Loc; + let camZoom_Loc, camFov_Loc; + let piMod_Loc; + let mod1A_Loc, mod1B_Loc, mod1C_Loc, mod1D_Loc; + let layer2_Loc, layer4_Loc; + let glowColor_Loc, glowStrength_Loc; + let color2_Loc, color3_Loc, color4_Loc; + let colorMod3_Loc, colorMod4_Loc; + let light1Z_Loc; + let frame; + + onMount(() => { + gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl"); + if (!gl) {window.location.replace(fallbackUrl); return; } + + program = createProgramFromSources(gl, [vertexShader, fragShader]); + gl.useProgram(program); + bindQuadBuffer(gl, gl.getAttribLocation(program, "a_position")); + + setupUniforms(); + + (function loop() { + frame = requestAnimationFrame(loop); + + gl.uniform2f(resolution_Loc, gl.canvas.width, gl.canvas.height); + updateUniforms(); + + gl.drawArrays(gl.TRIANGLES, 0, 6); + })(); + + return () => cancelAnimationFrame(frame); + }); + + function setupUniforms() { + resolution_Loc = gl.getUniformLocation(program, "resolution"); + time_Loc = gl.getUniformLocation(program, "time"); + camRotateX_Loc = gl.getUniformLocation(program, "u_cam_rotateX"); + camRotateY_Loc = gl.getUniformLocation(program, "u_cam_rotateY"); + camZoom_Loc = gl.getUniformLocation(program, "u_cam_zoom"); + camFov_Loc = gl.getUniformLocation(program, "u_cam_fov"); + piMod_Loc = gl.getUniformLocation(program, "u_pimod"); + mod1A_Loc = gl.getUniformLocation(program, "u_mod1A"); + mod1B_Loc = gl.getUniformLocation(program, "u_mod1B"); + mod1C_Loc = gl.getUniformLocation(program, "u_mod1C"); + mod1D_Loc = gl.getUniformLocation(program, "u_mod1D"); + layer2_Loc = gl.getUniformLocation(program, "u_layer2Amp"); + layer4_Loc = gl.getUniformLocation(program, "u_layer4Amp"); + glowColor_Loc = gl.getUniformLocation(program, "u_glowColor"); + glowStrength_Loc = gl.getUniformLocation(program, "u_glowStrength"); + color2_Loc = gl.getUniformLocation(program, "u_color2"); + color3_Loc = gl.getUniformLocation(program, "u_color3"); + color4_Loc = gl.getUniformLocation(program, "u_color4"); + colorMod3_Loc = gl.getUniformLocation(program, "u_colorMod3"); + colorMod4_Loc = gl.getUniformLocation(program, "u_colorMod4"); + light1Z_Loc = gl.getUniformLocation(program, "u_light1Z"); + } + + function updateUniforms() { + gl.uniform1f(time_Loc, time); + gl.uniform1f(camFov_Loc, camFov); + gl.uniform1f(camZoom_Loc, camZoom); + gl.uniform1f(camRotateX_Loc, camRotate.x); + gl.uniform1f(camRotateY_Loc, camRotate.y); + gl.uniform1f(piMod_Loc, piMod); + gl.uniform1f(colorMod3_Loc, colorMod3); + gl.uniform1f(colorMod4_Loc, colorMod4); + gl.uniform1f(layer2_Loc, layer2Amp); + gl.uniform1f(layer4_Loc, layer4Amp); + gl.uniform1f(mod1A_Loc, mod1A); + gl.uniform1f(mod1B_Loc, mod1B); + gl.uniform1f(mod1C_Loc, mod1C); + gl.uniform1f(mod1D_Loc, mod1D); + gl.uniform1f(light1Z_Loc, lightZ); + gl.uniform1f(glowStrength_Loc, glowStrength); + gl.uniform3f(glowColor_Loc, colorGlow.r, colorGlow.g, colorGlow.b); + gl.uniform3f(color2_Loc, color2.r, color2.g, color2.b); + gl.uniform3f(color3_Loc, color3.r, color3.g, color3.b); + gl.uniform3f(color4_Loc, color4.r, color4.g, color4.b); + } +</script> + +<style> + div { + width: 100%; + height: 100%; + } + canvas { + width: 100%; + height: 100%; + background-color: #333; + position: fixed; + } +</style> + +<div + bind:clientWidth={canvasWidth} + bind:clientHeight={canvasHeight}> + <canvas + bind:this={canvas} + width={canvasWidth * scale} + height={canvasHeight * scale} /> +</div> diff --git a/src/components/Section.svelte b/src/components/Section.svelte new file mode 100644 index 0000000..4ac39ad --- /dev/null +++ b/src/components/Section.svelte @@ -0,0 +1,51 @@ +<!-- Reusable logic for a section within the viewable scroll area --> + +<script> + export let yscrollPerc; + export let yperc; + + let showing = false; + let shownSec = 0; + let targetY; + + (function loop() { + requestAnimationFrame(loop); + + let dist = Math.abs(yscrollPerc - yperc); + + if(showing){ + if(dist > .05) hideSection(); + shownSec = 0; + }else{ + if(dist < .04){ + shownSec++; + if(shownSec > 20) showSection(); + } + } + + targetY = ((document.body.scrollHeight - document.body.clientHeight) * yperc) + (document.body.clientHeight * .5); + + }()); + + function showSection(){ + showing = true; + } + + function hideSection(){ + showing = false; + } +</script> + +<style> + div { + position: absolute; + pointer-events: none; + } + .showing { + background-color: burlywood; + } +</style> + +<div class:showing style="transform: translateY({targetY}px)"> + <slot /> +</div> \ No newline at end of file diff --git a/src/components/Shader.svelte b/src/components/Shader.svelte new file mode 100644 index 0000000..78981eb --- /dev/null +++ b/src/components/Shader.svelte @@ -0,0 +1,42 @@ +<!-- Basic Test Shader --> + +<script> + export let yscrollPerc = 0; + export let xscrollPerc = 0; + + import ShaderCanvas from "./ShaderCanvas.svelte"; + + let scale = 1; + + const fragShader = ` + precision highp float; + + uniform vec2 u_resolution; + uniform vec2 u_mouse; + uniform float u_time; + uniform float u_xscrollPerc; + uniform float u_yscrollPerc; + + void main() { + + float scale = ` + (scale * 100) + `.; + + float p1 = (u_yscrollPerc * ((scale * .01) * 400.)) - gl_FragCoord.y; + if(p1 > -1.5 && p1 < scale){ + gl_FragColor = vec4(0, 1, 1, 1); + }else if(p1 > scale && p1 < (scale*2.)){ + gl_FragColor = vec4(0, 0, 1, 1); + }else if(p1 > (scale*2.) && p1 < (scale*3.)){ + gl_FragColor = vec4(1, 0, 1, 1); + } + else{ + gl_FragColor = vec4(fract((gl_FragCoord.xy - u_mouse) / u_resolution), fract(u_time), 1); + + } + } + `; + +</script> + +<ShaderCanvas {xscrollPerc} {yscrollPerc} {fragShader} {scale} /> + diff --git a/src/components/ShaderCanvas.svelte b/src/components/ShaderCanvas.svelte new file mode 100644 index 0000000..94bf6d9 --- /dev/null +++ b/src/components/ShaderCanvas.svelte @@ -0,0 +1,123 @@ +<!-- Basic Test Canvas --> + +<svelte:window bind:innerWidth={innerWidth} bind:innerHeight={innerHeight}/> + +<script> + + import { onMount } from 'svelte'; + import { createProgramFromSources } from '../utils/ShaderUtils.svelte'; + + export let scale = 1; + export let xscrollPerc = 0; + export let yscrollPerc = 0; + + let m = { x: 0, y: 0 }; + let time = 0; + + let canvas; + let canvasWidth, canvasHeight; + let clientWidth, clientHeight; + let innerWidth, innerHeight; + + // Default fragment shader + export let fragShader = ` + precision highp float; + + uniform vec2 u_resolution; + uniform vec2 u_mouse; + uniform float u_time; + uniform float u_xscrollPerc; + uniform float u_yscrollPerc; + + void main() { + gl_FragColor = vec4(fract((gl_FragCoord.xy - u_mouse) / u_resolution), fract(u_time), 1); + } + `; + + function handleMousemove(event) { + + let s = (scale * 100); + + canvasWidth = s + "%"; + canvasHeight = s + "%"; + + m.x = (event.clientX / clientWidth) * s; + m.y = (event.clientY / clientHeight) * s; + } + + onMount(() => { + const gl = canvas.getContext('webgl'); + let frame; + + if (!gl) { + return; // Fallback options for no webgl support + } + + const vs = ` + attribute vec4 a_position; + void main() { gl_Position = a_position; } + `; + + const program = createProgramFromSources(gl, [vs, fragShader]); + const positionAttributeLocation = gl.getAttribLocation(program, "a_position"); + + const resolutionLocation = gl.getUniformLocation(program, "u_resolution"); + const mouseLocation = gl.getUniformLocation(program, "u_mouse"); + const timeLocation = gl.getUniformLocation(program, "u_time"); + const xscrollLocation = gl.getUniformLocation(program, "u_xscrollPerc"); + const yscrollLocation = gl.getUniformLocation(program, "u_yscrollPerc"); + + const positionBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]), gl.STATIC_DRAW); + + (function loop() { + frame = requestAnimationFrame(loop); + time += .01; + + gl.viewport(.95, 0, gl.canvas.width, gl.canvas.height); + gl.useProgram(program); + gl.enableVertexAttribArray(positionAttributeLocation); + gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); + gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0); + + gl.uniform2f(resolutionLocation, gl.canvas.width, gl.canvas.height); + gl.uniform2f(mouseLocation, m.x, -m.y); + gl.uniform1f(timeLocation, time); + gl.uniform1f(yscrollLocation, yscrollPerc); + gl.uniform1f(xscrollLocation, xscrollPerc); + + gl.drawArrays(gl.TRIANGLES, 0, 6); + }()); + + return () => { + cancelAnimationFrame(frame); + }; + }); +</script> + +<style> + div { + width: 100%; + height: 100%; + position: fixed; + left: 0; + top: 0; + } + canvas { + width: 100%; + height: 87%; + background-color: #333; + position: fixed; + left: 0; + top: 13%; + } +</style> + +<div on:mousemove={handleMousemove} bind:clientWidth={clientWidth} bind:clientHeight={clientHeight}> + <canvas + bind:this={canvas} + width={canvasWidth} + height={canvasHeight} + ></canvas> +</div> \ No newline at end of file diff --git a/src/components/Title.svelte b/src/components/Title.svelte new file mode 100644 index 0000000..141d325 --- /dev/null +++ b/src/components/Title.svelte @@ -0,0 +1,44 @@ +<!-- Simple hardcoded one-off component ATM --> + +<script> + +export let camRotate = { x: 0, y: 0 }; + +</script> + +<style> + div { + position: relative; + top: 50px; + left: 70px; + width: 80%; + max-width: 2400px; + pointer-events: none; + background-color: rgb(27, 27, 27); + opacity: .75; + padding: .75em; + padding-left: 1.5em; + } + + h1 { + font-size: 4em; + -webkit-text-fill-color:white; + margin: 0; + padding-left: 20px; + } + + h2 { + -webkit-text-fill-color:rgb(119,162,179); + } + + h3 { + padding-left: 25px; + -webkit-text-fill-color:lightgrey; + } +</style> + +<div style="transform: translateX({(((1-camRotate.x)+1) * 150) - 30}px);"> + <h2>Hi my name is:</h2> + <h1>Hepp Maccoy</h1> + <h3><i>I'm a Full-stack Developer that enjoys working on next-level projects</i></h3> +</div> \ No newline at end of file diff --git a/src/components/TitleListAnimate.svelte b/src/components/TitleListAnimate.svelte new file mode 100644 index 0000000..ed58687 --- /dev/null +++ b/src/components/TitleListAnimate.svelte @@ -0,0 +1,123 @@ +<!-- Basic component to display several messages animated into a single line --> + +<script> + + export let shown; + export let list; + + const ranSymbols = ["%","@","#","/"]; + + let count = -30; + let level = 0; + let tick = 0; + let outtro = 0; + + // Header Title + const newHeader = () => Math.floor(Math.random() * list.length); + let chars = 0; + let selected = newHeader(); + let text = ""; + let cursor = ""; + + (function loop() { + requestAnimationFrame(loop); + + // Quick and simple blinking cursor effect + if(tick % 66 == 0 || text.length < 2){ + cursor = " "; + }else if(tick % 66 == 22){ + cursor = " :"; + } + tick++; + + // Header title changes + count++; + if(count > 0){ + + if(level == 0){ + + // Animate in + if(shown && count % 2 == 1 && chars < list[selected].length){ + text += list[selected].charAt(chars); + chars++; + } + // Hide + if(!shown || (count > 200 && list.length > 1)){ + level = 1; + count = 0; + chars = 0; + } + + } else if(level == 1){ + + // Outro + if(text.length > 0){ + + // Quick and simple text scrable effect + + if(outtro > 8){ + // Remove lines + text = text.substring(0, text.length - 1); + } + + if(tick % 2 == 1){ + // Add random chars effect + let rSel = Math.floor(Math.random() * text.length); + if(rSel > 2){ + let textS = text.substring(0, rSel-1); + textS += ranSymbols[Math.floor(Math.random() * ranSymbols.length)]; + textS += text.substring(rSel, text.length); + text = textS; + } + } + + if(text.length < 1 || outtro > 60) { + // Exit outtro + text = ""; + } + + outtro++; + + // Select new + }else{ + + // Reset state + outtro = 0; + tick = 0; + level = 0; + count = -Math.floor(Math.random() * 30); + + let hNew = 0; + while(hNew == 0 || hNew == selected){ + hNew = newHeader(); + } + selected = hNew; + } + } + } + })(); +</script> + +<style> + h2 { + position: relative; + left: 20px; + padding: 0 1.15em 0 1.15em; + color:rgb(200, 195, 188); + background-color: rgb(53, 104, 126); + -webkit-transition: background-color 250ms linear; + -ms-transition: background-color 250ms linear; + transition: background-color 250ms linear; + pointer-events: none; + } + .selected { + background-color: #004daa; + -webkit-transition: background-color 700ms linear; + -ms-transition: background-color 700ms linear; + transition: background-color 700ms linear; + } +</style> + +<div> + <h2 class="{shown ? 'selected' : ''}">{"> " + text + cursor}</h2> +</div> \ No newline at end of file diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..1719c77 --- /dev/null +++ b/src/main.js @@ -0,0 +1,9 @@ +import App from './App.svelte'; + +const app = new App({ + target: document.body, + props: { + } +}); + +export default app; \ No newline at end of file diff --git a/src/scatterform/ScatterformLiteFrag.svelte b/src/scatterform/ScatterformLiteFrag.svelte new file mode 100644 index 0000000..abb5228 --- /dev/null +++ b/src/scatterform/ScatterformLiteFrag.svelte @@ -0,0 +1,184 @@ +<script context="module"> + + // Original Scatterform Shader by AudioPixel/Hepp Maccoy + // Raymarching Math Functions by IQ/Iquilezles + export const fragShader = + `#ifdef GL_ES + precision mediump float; + #endif + + uniform float time; + uniform vec2 resolution; + + //--- + + // Scatterform API (Lite version) + + uniform float u_cam_zoom; + uniform float u_cam_fov; + + uniform float u_cam_rotateX; + uniform float u_cam_rotateY; + + uniform float u_pimod; + + uniform float u_mod1A; + uniform float u_mod1B; + uniform float u_mod1C; + uniform float u_mod1D; + + uniform float u_layer2Amp; + uniform float u_layer4Amp; + + uniform vec3 u_glowColor; + uniform float u_glowStrength; + + uniform vec3 u_color2; + uniform vec3 u_color3; + uniform vec3 u_color4; + + uniform float u_colorMod3; + uniform float u_colorMod4; + + uniform float u_light1Z; + + //--- + + vec3 glow; + vec3 q; + vec3 col1; + vec3 col2; + vec3 col3; + vec3 col4; + #define PI 3.14159265358979323846 + + float sinc( float x, float k ) { + float a = PI * (float(k)*x-1.0); + return sin(a)/a; + } + float soc(vec3 p) { + vec3 n = normalize(sign(p+1e6)); + return min(min(dot(p.xy, n.xy), dot(p.yz, n.yz)), dot(p.xz, n.xz)); + } + mat2 r2d(float a) { + float sa=sin(a); + float ca=cos(a); + return mat2(ca,sa,-sa,ca); + } + vec2 amod(vec2 p, float m) { + float a=mod(atan(p.x,p.y), m)-m*.5; + return vec2(cos(a), sin(a))*length(p); + } + vec2 mo(inout vec2 p, vec2 d) { + vec2 q = p; + q.x = abs(q.x) - d.x; + q.y = abs(q.y) - d.y; + if (q.y > q.x) q = q.yx; + return q; + } + + float map(vec3 p) { + float d = 1.; + float a = abs(p.y); + + p.yz *= r2d(sign(a) * u_cam_rotateY); + p.xz *= r2d(sign(a) * u_cam_rotateX); + + // Mod1 + p.xz = mo(p.xz, vec2(u_mod1A, u_mod1B)); + p.zx = mo(p.xz, vec2(u_mod1C, u_mod1D)); + + // Repeat using PI + p.xz = amod(p.xz, (PI * u_pimod) / 3.0); + + // Repeat + float spreadZ = 9.1829; + p.z = mod(p.z, spreadZ)-(spreadZ *.5); + + float spreadX = 1.3426; + p.x = mod(p.x, spreadX)-(spreadX *.5); + p.y = mod(p.y + 3., 10.1057) - 5.; + + d = min(d, soc(max(abs(p) - 0.2283, 0.0028))); + + glow += u_glowColor * 0.0401 / (0.0067 + d*d); // color + + return length(p * -0.0211) * 1.0 - (d * -1.0); + } + + vec3 calcNormal(in vec3 p) { + vec2 e = vec2(0, -1.0) * 0.005; + return normalize( e.xyy * map(p + e.xyy) + e.yyx * map(p + e.yyx) + e.yxy * map(p + e.yxy) + e.xxx * map(p + e.xxx) ); + } + + void main() { + + int section = 1; + + // Position + vec2 st = (gl_FragCoord.xy / resolution.xy) * 2.01 - 1.; + st.x *= resolution.x / resolution.y; + + // Ray origin + vec3 ro = vec3(st, u_cam_zoom); + + // Ray distance + vec3 rd = normalize(vec3(st + vec2(0.), u_cam_fov)); + + // Map point + vec3 mp; + mp = ro; + + // Map distance + float md; + + // Ray march + for (int i=0; i<17; i++) { + md = map(mp); + + if (md < 0.04535) break; + mp += rd * md; + } + + // Define our 2 deck levels (0-1) + float b = length(ro - mp); + float deckA = 1.1755 - (b * 0.0379) * 0.9951; + float deckB = 1.1755 - (b * 0.03) * 0.7696; + vec3 l; + + // Use sin curve to modify base levels + deckA = sinc(deckA, 1.0); + deckB = sinc(deckB, 1.0); + + // Light1 + vec3 light = vec3(8., 0., u_light1Z); + vec3 p = ro + rd * (mp); + vec3 normal = calcNormal(p); + + if (md < 0.0972) { + float dif = clamp(dot(normal, normalize(light - p)), 0., 1.); + dif *= 5.0 / dot(light - p, light - p); + l = vec3(pow(dif, 0.3398)); + } else { + l = vec3(-0.2918); + } + + // AudioPixel color blending + vec3 c1 = vec3(deckA * -1.); + vec3 c2 = vec3(deckB * u_layer2Amp); + col1 = c1 + c2 - 2.0 * c1 * c2; + col2 = mix(vec3(0.), u_color2, l.x); + col3 = mix(vec3(0.), u_color3, (p.x * .06) * u_layer4Amp); + vec3 c = (col1 + col2) - col3; + + c = c * (3. - 2. * c); // contrast + c = mix(c, vec3(c.x + c.y + c.z) * .33, u_colorMod3 ); // desat + c *= 1. + u_colorMod4 * vec3(u_color4); // tint + + vec3 gt = c + (glow * u_glowStrength); + c *= gt; + + gl_FragColor = vec4(c, 1.); + }`; + +</script> \ No newline at end of file diff --git a/src/scatterform/ScatterformLitePresets.svelte b/src/scatterform/ScatterformLitePresets.svelte new file mode 100644 index 0000000..b6599ec --- /dev/null +++ b/src/scatterform/ScatterformLitePresets.svelte @@ -0,0 +1,74 @@ +<!-- Different Presets can be loaded into the Scatterform Shader --> +<!-- Note: Some of these properties are overwritten with code (ScrollLogic) --> + +<script context="module"> + export const dba12 = { + "cam_spinX": 0.9752000000000001, + "cam_rotateY": -0.1748, + "cam_fov": -0.41356000000000001, + "cam_zoom": 13.79283800000000002, + "yscroll": 3, + "yoffset": -0.2879, + "pimod": 0.56943, + "mod1A": -.6765, + "mod1B": -6.6418, + "mod1C": -1.0715953000000000002, + "mod1D": 12.8323, + "layer4Amp": 1, + "layer2Amp": .93, // 1 + "color4": 4063444, + "color3": 42239, + "color2": 16711680, + "glowColor": 11486620, + "glowStrength": 0.0068000000000000005, + "colorMod4": 0, + "colorMod3": 0.7783, + "light1Z": -2 + }; + + export const dba41 = { + "cam_spinX": 0.8866, + "cam_rotateY": -1.3284, + "cam_fov": -0.4, + "cam_zoom": 25.8, + "yscroll": 3, + "pimod": 2.1033, + "mod1A": -6.8095, + "mod1B": -15.9736, + "mod1C": -1.873, + "mod1D": -10.9771, + "layer4Amp": 1, + "layer2Amp": 0.9468000000000001, + "color4": 4063444, + "color3": 42239, + "color2": 16711680, + "glowColor": 11486620, + "glowStrength": 0.0068000000000000005, + "colorMod4": 1, + "colorMod3": 0.5616, + "light1Z": -70 + } + + export const dba41_section2 = { + "cam_spinX": 0.8866, + "cam_rotateY": -1.3284, + "cam_fov": -0.4, + "cam_zoom": 25.8, + "yscroll": 3, + "pimod": 2.71033, + "mod1A": -9.8095, + "mod1B": 7.2, + "mod1C": -2.4, + "mod1D": -10.9771, + "layer4Amp": 1, + "layer2Amp": 0.9468000000000001, + "color4": 4063444, + "color3": 42239, + "color2": 16711680, + "glowColor": 11486620, + "glowStrength": 0.0068000000000000005, + "colorMod4": 1, + "colorMod3": 0.5616, + "light1Z": -70 + } +</script> \ No newline at end of file diff --git a/src/utils/Data.svelte b/src/utils/Data.svelte new file mode 100644 index 0000000..ef5bc5a --- /dev/null +++ b/src/utils/Data.svelte @@ -0,0 +1,134 @@ +<!-- Quick static store, for a static style webpage --> + +<script context="module"> + + export const fallbackUrl = "https://heppmaccoy.com"; + + export const codeItems = [ + "Svelte", + "JS Programming", + "Agile Practices", + "Node.js", + "React Hooks", + "Server-side JS", + "Open Source", + "Immersive Tech", + "Three.js", + "Test Driven Dev", + "ES6+", + "Deno", + "ExpressJS", + "System Architecture", + "Docker", + "AWS", + "Heroku", + "Typescript", + "Clean Code", + "HTML5+CSS3", + "Addressable Tech", + "Material Design", + "Interactive Video", + "OpenGL/Vulkan", + "Blockchain ", + "Async/Threads", + "Game Development", + "Physics/Animation", + "WebGL/WebGPU", + "Less > More Code", + "Particle Systems", + "Generative GFX", + ]; + + export const thingsList = [ + "Some of my favorite things", + "I enjoy building things with", + "I like building projects with", + "Cool things I am proficient with", + "Rad things to use everywhere", + "If I had to pick some favorites", + "Let's fill the world with more of these", + "I know some things about"]; + + export const brandsList = [ + "These are some brands I've worked with", + "Some amazing brands I've had the pleasure to work with", + "Several of the brands I've built cool projects for", + "Sample of some of the brands I've worked with", + "I've had the chance to build cool projects for"]; + + export const portfolioList = [ + "Checkout my online portfoio of recent work", + "View more details on past projects", + "To see more of my work visit the portfolio"]; + + export const wwwList = [ + "Check out the GitHub codes for this project", + "Webpage is compiled and uses no 3rd party libraries", + "Open source software spurs innovation", + "I like sharing and talking about technology", + "Built from scratch using", + "Details about this webpage"]; + + export const wwwItems = [ + "Compiled w Svelte", + "Open Source", + "Reusable Code", + "No loaded Libs", + "No loaded APIs", + "Minimal Code", + "Custom Shaders", + "Optimized GLSL", + "Components", + "Raymarching", + "WebGL Canvas", + "Generative GFX", + "Reused Modules", + "OOP/MVC ideals", + "Spring Animation", + "Experimental", + "Handwritten", + "Data <-> Logic", + "Scalable", + "V Studio Code", + "No diff tree", + "Creative Math", + "No redundancy", + "No dependencies", + "Color Algorithms", + "Less Code > More", + "Compiled = Fast" + ]; + + export const imgDataLogos = [ + {src: "img/logos/logo_swoosh.jpg", alt: "Nike Logo"}, + {src: "img/logos/logo_toyota.jpg", alt: "Toyota Logo"}, + {src: "img/logos/logo_y.jpg", alt: "Yahoo! Logo"}, + {src: "img/logos/logo_flickr.jpg", alt: "Flickr Logo"}, + {src: "img/logos/logo_arrow.jpg", alt: "Arrow Logo"}, + {src: "img/logos/logo_cobra.jpg", alt: "Cobra Logo"}, + {src: "img/logos/logo_dbg.jpg", alt: "Denver Botanic Gardens Logo"}, + {src: "img/logos/logo_goldenvoice.jpg", alt: "Golden Voice Logo"}, + {src: "img/logos/logo_lyft.jpg", alt: "Lyft Logo"}, + {src: "img/logos/logo_meowwolf.jpg", alt: "Meow Wolf Logo"}, + {src: "img/logos/logo_universal.jpg", alt: "Universal Logo"}, + {src: "img/logos/logo_wb.jpg", alt: "WB Logo"} + ]; + + export const imgDataPortfolio = [ + {src: "img/portfolio/thumb_dbg.jpg", alt: "Lumenscape @ Denver Botanic Gardens"}, + {src: "img/portfolio/thumb_nike_bigair.jpg", alt: "Nike NYC Fan Wall Installation"}, + {src: "img/portfolio/thumb_nike_beacon.jpg", alt: "Nike NYC Beacon Installation"}, + {src: "img/portfolio/thumb_dragomi.jpg", alt: "Dragomi Art Car"}, + {src: "img/portfolio/thumb_interphase.jpg", alt: "Interphase @ Wave & Light Festival"}, + {src: "img/portfolio/thumb_meow-wolf.jpg", alt: "Meow Wolf Installation"}, + {src: "img/portfolio/thumb_nike_treadmill.jpg", alt: "Nike NYC Treadmill Installation"}, + {src: "img/portfolio/thumb_omnia.jpg", alt: "Omnia Galaxy Website"}, + {src: "img/portfolio/thumb_pixelmixer.jpg", alt: "PixelMixer API"}, + {src: "img/portfolio/thumb_rapt.jpg", alt: "Rapt Interactive Videos"}, + {src: "img/portfolio/thumb_tipper.jpg", alt: "Tipper Music Tour"}, + {src: "img/portfolio/thumb_toyota.jpg", alt: "Toyota Interactive Videos"} + ]; +</script> + + + diff --git a/src/utils/NumberMap.svelte b/src/utils/NumberMap.svelte new file mode 100644 index 0000000..7aa065d --- /dev/null +++ b/src/utils/NumberMap.svelte @@ -0,0 +1,6 @@ +<script context="module"> + Number.prototype.map = function (in_min, in_max, out_min, out_max) { + return (this - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } + +</script> \ No newline at end of file diff --git a/src/utils/ScrollLogic.svelte b/src/utils/ScrollLogic.svelte new file mode 100644 index 0000000..e9191df --- /dev/null +++ b/src/utils/ScrollLogic.svelte @@ -0,0 +1,75 @@ +<!-- Uniforms settings controlled by the Scrolling of the page --> +<!-- Scroll Logic seperated, makes it easier to update later if needed --> + +<script context="module"> + import { dba41 as data } from "../scatterform/ScatterformLitePresets.svelte"; + + export function getCoords(mouse) { + let coords = { x: 0, y: 0 }; + coords.x = mouse.x.map(0, 1, 1.8, 1.3); + coords.y = mouse.y.map(0, 1, 0.78, 0.6); + + return coords; + } + + export function getScrollY(yscroll) { + let v = yscroll; + if(yscroll > .94){ + v = yscroll.map(.94, 1, v, 1.2); + } + return (v * 4) + 2.3875292; + } + + export const getColorMod3 = yscroll => .7; + export const getColorMod4 = yscroll => .01147; + + export function getCamZoom(yscroll){ + return 23.4; + } + + export function getPiMod(yscroll){ + return data.pimod; + } + export function getLayer2Amp(yscroll){ + return data.layer2Amp; + } + export function getMod1A(yscroll){ + return data.mod1A * ((1-yscroll)); + } + export function getMod1B(x, yscroll){ + if(yscroll < .82) return data.mod1B; + return (data.mod1B * (3-x)) - 200; + } + export function getMod1C(yscroll){ + return data.mod1C; + } + export function getMod1D(yscroll){ + return data.mod1D * ((2-yscroll)); + } + + export function getCamFov(yscroll){ + return data.cam_fov; + } + export function getLayer4Amp(yscroll){ + return data.layer4Amp; + } + export function getLightZ(yscroll){ + return data.light1Z; + } + export function getGlowStrength(yscroll){ + return data.glowStrength * ((1-yscroll)); + } + + export function getGlowColor(yscroll){ + return {r: 0.549, g: 0.21568, b: yscroll}; + } + export function getColor2(yscroll){ + return {r: 0.8, g: 0, b: 0}; + } + export function getColor3(yscroll){ + return {r: 0, g: 0.513, b: 0.8}; + } + export function getColor4(yscroll){ + return {r: 0.196, g: yscroll, b: 0.67}; + } +</script> \ No newline at end of file diff --git a/src/utils/ShaderUtils.svelte b/src/utils/ShaderUtils.svelte new file mode 100644 index 0000000..6812a8d --- /dev/null +++ b/src/utils/ShaderUtils.svelte @@ -0,0 +1,131 @@ +<script context="module"> + +/* + WebGL utility methods from Gregg Tavares : + https://webglfundamentals.org/webgl/resources/webgl-utils.js + + 10/2020 - Imported to Svelte by Hepp Maccoy hepp@audiopixel.com +* +* Copyright 2012, Gregg Tavares. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following disclaimer +* in the documentation and/or other materials provided with the +* distribution. +* * Neither the name of Gregg Tavares. nor the names of his +* contributors may be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + const defaultShaderType = [ + 'VERTEX_SHADER', + 'FRAGMENT_SHADER', + ]; + + export const vertexShader = ` + attribute vec4 a_position; + void main() { gl_Position = a_position; } + `; + + export function createProgramFromSources( + gl, shaderSources, opt_attribs, opt_locations, opt_errorCallback) { + const shaders = []; + for (let ii = 0; ii < shaderSources.length; ++ii) { + shaders.push(loadShader( gl, shaderSources[ii], gl[defaultShaderType[ii]], opt_errorCallback)); + } + return createProgram(gl, shaders, opt_attribs, opt_locations, opt_errorCallback); + } + + function loadShader(gl, shaderSource, shaderType, opt_errorCallback) { + const errFn = opt_errorCallback || error; + // Create the shader object + const shader = gl.createShader(shaderType); + + // Load the shader source + gl.shaderSource(shader, shaderSource); + + // Compile the shader + gl.compileShader(shader); + + // Check the compile status + const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + if (!compiled) { + // Something went wrong during compilation; get the error + const lastError = gl.getShaderInfoLog(shader); + errFn('*** Error compiling shader \'' + shader + '\':' + lastError); + gl.deleteShader(shader); + return null; + } + + return shader; + } + + export function bindQuadBuffer(gl, positionAttributeLocation){ + const positionBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]), gl.STATIC_DRAW); + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + gl.enableVertexAttribArray(positionAttributeLocation); + gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); + gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0); + } + + function createProgram( + gl, shaders, opt_attribs, opt_locations, opt_errorCallback) { + const errFn = opt_errorCallback || error; + const program = gl.createProgram(); + shaders.forEach(function(shader) { + gl.attachShader(program, shader); + }); + if (opt_attribs) { + opt_attribs.forEach(function(attrib, ndx) { + gl.bindAttribLocation( + program, + opt_locations ? opt_locations[ndx] : ndx, + attrib); + }); + } + gl.linkProgram(program); + + // Check the link status + const linked = gl.getProgramParameter(program, gl.LINK_STATUS); + if (!linked) { + // something went wrong with the link + const lastError = gl.getProgramInfoLog(program); + errFn('Error in program linking:' + lastError); + + gl.deleteProgram(program); + return null; + } + return program; + } + + function error(msg) { + if (console) { + if (console.error) { + console.error(msg); + } else if (console.log) { + console.log(msg); + } + } + } +</script> \ No newline at end of file diff --git a/src/utils/Utils.svelte b/src/utils/Utils.svelte new file mode 100644 index 0000000..f726e08 --- /dev/null +++ b/src/utils/Utils.svelte @@ -0,0 +1,13 @@ + +<script context="module"> + export const easeTo = (from, to, damp) => ((from - to) * damp) + to; + export const checkNum = n => typeof n === 'number' ? n : null; + + // http://detectmobilebrowsers.com/ + export const mobileAndTabletCheck = function() { + let check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); + return check; + } +</script> + \ No newline at end of file