diff --git a/.gitignore b/.gitignore index a5a96aa..40d9db7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .env var +src/public/media/ + #ide /.nova diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d558314 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,23 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "name": "nodemon", + "program": "dev", + "request": "launch", + "restart": true, + "runtimeExecutable": "nodemon", + "skipFiles": [ + "/**" + ], + "type": "node", + "env": {"NODE_ENV": "development"}, + "preLaunchTask": "npm: scss" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0db3279 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..51203ad --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,19 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "scss", + "problemMatcher": [], + "label": "npm: scss watch", + "detail": "sass --watch src/scss/application.scss public/css/application.css src/scss/eventsheet.scss:public/css/eventsheet.css" + }, + { + "type": "npm", + "script": "scss", + "problemMatcher": [], + "label": "npm: scss", + "detail": "sass src/scss/application.scss:public/css/application.css src/scss/eventsheet.scss:public/css/eventsheet.css" + } + ] +} \ No newline at end of file diff --git a/bin/www b/bin/www index e65ee8f..36e14e1 100755 --- a/bin/www +++ b/bin/www @@ -4,11 +4,14 @@ * Module dependencies. */ -var app = require("../src/app"); +var {app} = require("../src/app"); var http = require("http"); var https = require("https"); var fs = require("fs"); var debug = require("debug")("https"); +const path = require("path"); + + /** * Get port from environment and store in Express. @@ -25,6 +28,21 @@ const https_options = { cert: fs.readFileSync("certs/cert.pem"), }; +if (process.env.NODE_ENV === "development") { + // console.log(`starting livereload, watching ${path.join(__dirname, "../src/views")}`) + var livereload = require("livereload"); + var connectLiveReload = require("connect-livereload"); + + const liveReloadServer = livereload.createServer({https: https_options, extraExts: ['pug']}); + liveReloadServer.watch(path.join(__dirname, "../src/views")); + liveReloadServer.server.once("connection", () => { + setTimeout(() => { + liveReloadServer.refresh("/"); + }, 100); + }); + +} + var server = https.createServer(https_options, app); /** diff --git a/package-lock.json b/package-lock.json index d6c28d3..431b71c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,15 +9,21 @@ "version": "0.0.0", "dependencies": { "@teamsnap/teamsnap-ui": "^3.12.3", + "better-sqlite3": "^9.4.1", + "better-sqlite3-session-store": "^0.1.0", "bootstrap": "^5.3.1", "bootstrap-icons": "^1.10.5", "connect-ensure-login": "^0.1.1", "cookie-parser": "~1.4.4", - "csurf": "^1.11.0", + "cors": "^2.8.5", + "cors-anywhere": "^0.4.4", + "csrf-csrf": "^3.0.3", "debug": "~2.6.9", "dotenv": "^8.6.0", "express": "^4.18.2", "express-session": "^1.17.2", + "handlebars-dateformat": "^1.1.3", + "hbs": "^4.2.0", "http-errors": "~1.6.3", "mkdirp": "^1.0.4", "morgan": "~1.9.1", @@ -28,9 +34,17 @@ "pluralize": "^8.0.0", "pug": "^3.0.2", "sortablejs": "^1.15.0", - "teamsnap.js": "^1.62.1", + "teamsnap.js": "github:anthonyscorrea/teamsnap-javascript-sdk#add-eventLineup-eventLineupEntry", + "underscore": "^1.13.6", "xhr2": "^0.2.1" }, + "devDependencies": { + "connect-livereload": "^0.6.1", + "install": "^0.13.0", + "livereload": "^0.9.3", + "nodemon": "^3.0.3", + "pug2hbs": "^1.0.5" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/anthonyscorrea" @@ -50,80 +64,18 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "peer": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/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==", - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/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==", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/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==", - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/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==", - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", @@ -196,12 +148,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "peer": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -251,22 +203,22 @@ "peer": true }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "peer": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -340,17 +292,17 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } @@ -379,12 +331,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -392,68 +344,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/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==", - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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==", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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==", - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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==", - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/node": { "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.22.10.tgz", @@ -477,9 +367,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -537,34 +427,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "peer": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "peer": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", - "debug": "^4.1.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -595,18 +485,35 @@ "peer": true }, "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -655,6 +562,22 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -682,6 +605,12 @@ "react": "^17.0.1" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -705,6 +634,43 @@ "node": ">=0.4.0" } }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", @@ -774,6 +740,11 @@ "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -796,6 +767,31 @@ "node": ">= 10.0.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/base64url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", @@ -815,6 +811,69 @@ "node": ">= 0.8" } }, + "node_modules/better-sqlite3": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-9.4.1.tgz", + "integrity": "sha512-QpqiQeMI4WkE+dQ68zTMX5OzlPGc7lXIDP1iKUt4Omt9PdaVgzKYxHIJRIzt1E+RUBQoFmkip/IbvzyrxehAIg==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + } + }, + "node_modules/better-sqlite3-session-store": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/better-sqlite3-session-store/-/better-sqlite3-session-store-0.1.0.tgz", + "integrity": "sha512-O4EO5jOGTEa/c1DbZpP3C7VTDLSWe5lrOu1S/j86ipdGZxrSb8bSUVuRgWCgl/SCgEGmyeEqvlMY9HtyOSMOWA==", + "dependencies": { + "date-fns": "2.16.1" + } + }, + "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/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -890,14 +949,6 @@ "node": ">= 0.8" } }, - "node_modules/body-parser/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/bootstrap": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.1.tgz", @@ -931,6 +982,28 @@ } ] }, + "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/browserslist": { "version": "4.21.10", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", @@ -963,6 +1036,29 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1019,6 +1115,47 @@ ], "peer": true }, + "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==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/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==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/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==", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "peer": true + }, "node_modules/character-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", @@ -1027,6 +1164,35 @@ "is-regex": "^1.0.3" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -1094,6 +1260,29 @@ "node": ">= 0.4.0" } }, + "node_modules/collection-json/node_modules/underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha512-ZqGrAgaqqZM7LGRzNjLnw5elevWb5M8LEoDMadxIW3OWbcv72wMMgKdwOKpd5Fqxe8choLD8HN3iSj3TUh/giQ==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1118,6 +1307,12 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", @@ -1132,6 +1327,16 @@ "typedarray": "^0.0.6" } }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "node_modules/connect-ensure-login": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/connect-ensure-login/-/connect-ensure-login-0.1.1.tgz", @@ -1140,6 +1345,15 @@ "node": ">= 0.4.0" } }, + "node_modules/connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/constantinople": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", @@ -1233,73 +1447,103 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/csrf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz", - "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==", + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { - "rndm": "1.2.0", - "tsscmp": "1.0.6", - "uid-safe": "2.1.5" + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cors-anywhere": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cors-anywhere/-/cors-anywhere-0.4.4.tgz", + "integrity": "sha512-8OBFwnzMgR4mNrAeAyOLB2EruS2z7u02of2bOu7i9kKYlZG+niS7CTHLPgEXKWW2NAOJWRry9RRCaL9lJRjNqg==", + "dependencies": { + "http-proxy": "1.11.1", + "proxy-from-env": "0.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csrf-csrf": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/csrf-csrf/-/csrf-csrf-3.0.3.tgz", + "integrity": "sha512-NxRERyDiWGH/MLw5KNl46FwVX36vwK0ppLJizNPa7K72FE+3T+WbOotjKkR5V4Q9lPZei+RtcCQna1rMLCjDFQ==", + "dependencies": { + "http-errors": "^2.0.0" + } + }, + "node_modules/csrf-csrf/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/csrf-csrf/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.8" } }, - "node_modules/csurf": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.11.0.tgz", - "integrity": "sha512-UCtehyEExKTxgiu8UHdGvHj4tnpE/Qctue03Giq5gPgMQ9cg/ciod5blZQ5a4uCEenNQjxyGuzygLdKUmee/bQ==", - "deprecated": "Please use another csrf package", - "dependencies": { - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "csrf": "3.1.0", - "http-errors": "~1.7.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/csurf/node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/csurf/node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/csurf/node_modules/inherits": { + "node_modules/csrf-csrf/node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/csurf/node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "node_modules/csrf-csrf/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/csurf/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/csrf-csrf/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" + } + }, + "node_modules/date-fns": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz", + "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, "node_modules/debug": { @@ -1310,6 +1554,28 @@ "ms": "2.0.0" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/define-properties": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", @@ -1350,6 +1616,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, "node_modules/doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -1363,6 +1637,63 @@ "node": ">=10" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dev": true, + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1374,6 +1705,12 @@ "integrity": "sha512-36K9b/6skMVwAIEsC7GiQ8I8N3soCALVSHqWHzNDtGemAcI9Xu8hP02cywWM0A794rTHm0b0zHPeLJHtgFVamQ==", "peer": true }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -1382,6 +1719,14 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/es-abstract": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", @@ -1499,6 +1844,19 @@ "node": ">= 0.6" } }, + "node_modules/eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha512-DOFqA1MF46fmZl2xtzXR3MPCRsXqgoFqdXcrCVYM3JNnfUeHTm/fh/v/iU7gBFpwkuBmoJPAm5GuhdDfSEJMJA==" + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -1672,12 +2030,21 @@ "node": ">= 0.8" } }, - "node_modules/express/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "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": ">=0.6" + "node": ">=8" } }, "node_modules/finalhandler": { @@ -1768,6 +2135,27 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw==" + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "1.0.0-rc3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", @@ -1781,11 +2169,6 @@ "node": ">= 0.10" } }, - "node_modules/form-data/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1802,6 +2185,25 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "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", @@ -1870,6 +2272,69 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1904,6 +2369,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars-dateformat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/handlebars-dateformat/-/handlebars-dateformat-1.1.3.tgz", + "integrity": "sha512-D7SjYx66+t2J0IMgq7QbjE2G9hTudICQx8Eg16FHAEm5qu5FRS8T+p1IpmA7WVuz7l6RruJHwWHJpizklzfrcA==", + "dependencies": { + "moment": "^2.29.4" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1923,6 +2422,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -1970,6 +2477,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hbs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.2.0.tgz", + "integrity": "sha512-dQwHnrfWlTk5PvG9+a45GYpg0VpX47ryKF8dULVd6DtwOE6TEcYQXQ5QM6nyOx/h7v3bvEQbdn19EDAcfUAgZg==", + "dependencies": { + "handlebars": "4.7.7", + "walk": "2.3.15" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -1995,6 +2515,18 @@ "node": ">= 0.6" } }, + "node_modules/http-proxy": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.11.1.tgz", + "integrity": "sha512-qz7jZarkVG3G6GMq+4VRJPSN4NkIjL4VMTNhKGd8jc25BumeJjWWvnY3A7OkCGa8W1TTxbaK3dcE0ijFalITVA==", + "dependencies": { + "eventemitter3": "1.x.x", + "requires-port": "0.x.x" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2006,11 +2538,50 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, "node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -2056,6 +2627,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -2116,6 +2699,36 @@ "object-assign": "^4.1.1" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -2127,6 +2740,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", @@ -2241,6 +2863,12 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -2249,6 +2877,100 @@ "node": ">=0.10.0" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jade-lexer": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/jade-lexer/-/jade-lexer-0.0.8.tgz", + "integrity": "sha512-XTq35PUyF/2Nm4cXubbau2nMAvigwowI+UtOp8IoNmSUr+dnMrBWhGmYk5bl9x/WKRAr8PqouVwfMSvKjENheg==", + "deprecated": "jade-lexer will be unpublished soon, please use pug-lexer", + "dev": true, + "dependencies": { + "character-parser": "^1.2.1" + } + }, + "node_modules/jade-lexer/node_modules/character-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.2.tgz", + "integrity": "sha512-LnSfFgPsK7vhyh9zx5zZj6ygRow7Yr4pd2gpa6W7m5PwzgcClAlP0gIueETtKsGFQ3Onm9fBntaRMSG5sDAI9A==", + "dev": true + }, + "node_modules/jade-parser": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/jade-parser/-/jade-parser-0.0.8.tgz", + "integrity": "sha512-kH4vdLfl0fOjIXvoFxeVulWFv99IuM7Lt+OkJ3Yu17h08hD1kFfa4OalfdDUqrrDEiIlOKNm4O6DHcxWrmll1w==", + "deprecated": "jade-parser will be unpublished soon, please use pug-parser", + "dev": true, + "dependencies": { + "token-stream": "0.0.1" + } + }, + "node_modules/jade-parser/node_modules/token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg==", + "dev": true + }, + "node_modules/js-beautify": { + "version": "1.14.11", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", + "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", + "dev": true, + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^10.3.3", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/js-beautify/node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -2301,6 +3023,30 @@ "node": ">=0.10.0" } }, + "node_modules/livereload": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", + "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.0", + "livereload-js": "^3.3.1", + "opts": ">= 1.2.0", + "ws": "^7.4.3" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/livereload-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", + "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", + "dev": true + }, "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -2330,6 +3076,17 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -2381,6 +3138,29 @@ "node": ">= 0.6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -2389,6 +3169,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -2400,6 +3189,19 @@ "node": ">=10" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, "node_modules/morgan": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", @@ -2448,6 +3250,11 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2456,6 +3263,22 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/node-abi": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", + "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", @@ -2479,6 +3302,81 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "peer": true }, + "node_modules/nodemon": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.3.tgz", + "integrity": "sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "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/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -2562,6 +3460,20 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "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/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -2695,11 +3607,45 @@ "node": ">=4" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -2716,6 +3662,18 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "peer": true }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -2759,6 +3717,31 @@ "node": ">=4" } }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2772,6 +3755,12 @@ "asap": "~2.0.3" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -2784,6 +3773,17 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-0.0.1.tgz", + "integrity": "sha512-B9Hnta3CATuMS0q6kt5hEezOPM+V3dgaRewkFtFoaRQYTVNsHqUvFXmndH06z3QO1ZdDnRELv5vfY6zAj/gG7A==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, "node_modules/pug": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", @@ -2896,6 +3896,52 @@ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, + "node_modules/pug2hbs": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pug2hbs/-/pug2hbs-1.0.5.tgz", + "integrity": "sha512-KdlwpC61xhdI9mYUphw2Wt0iudwyNJSFyDOU0v+/N5VipnN60M6c/BhpWB6P5nJRzI9vhIUbh7dtF7/EoR5WEA==", + "dev": true, + "dependencies": { + "commander": "2.9.0", + "jade-lexer": "0.0.8", + "jade-parser": "0.0.8", + "js-beautify": "^1.5.10", + "void-elements": "^2.0.1" + }, + "bin": { + "pug2hbs": "bin/jade-to-handlebars.js" + } + }, + "node_modules/pug2hbs/node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dev": true, + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/pug2hbs/node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -2981,12 +4027,18 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, "node_modules/react": { @@ -3021,6 +4073,18 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", @@ -3102,6 +4166,11 @@ "node": "*" } }, + "node_modules/requires-port": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-0.0.1.tgz", + "integrity": "sha512-AzPDCliPoWDSvEVYRQmpzuPhGGEnPrQz9YiOEvn+UdB9ixBpw+4IOZWtwctmpzySLZTy7ynpn47V14H4yaowtA==" + }, "node_modules/resolve": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", @@ -3118,11 +4187,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rndm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", - "integrity": "sha512-fJhQQI5tLrQvYIYFpOnFinzv9dwmR7hRnUz1XqP3OJ1jIweTNOd6aTO4jwQSgcBSFUB+/KHJxuGneime+FdzOw==" - }, "node_modules/safe-array-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", @@ -3163,6 +4227,20 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -3243,14 +4321,6 @@ "node": ">= 0.8" } }, - "node_modules/send/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -3281,6 +4351,27 @@ "node": ">=8" } }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -3294,6 +4385,73 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sortablejs": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", @@ -3340,6 +4498,65 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", @@ -3382,6 +4599,62 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -3393,10 +4666,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/teamsnap.js": { "version": "1.62.1", - "resolved": "https://registry.npmjs.org/teamsnap.js/-/teamsnap.js-1.62.1.tgz", - "integrity": "sha512-CivGwesQSxklXSQjZbKNnfvqFW/hDOgC/F+DipUkM8tiks6DNuM5FsmzLcl2HgmJMrpuuhGrwkKdPZbmSus5Cg==", + "resolved": "git+ssh://git@github.com/anthonyscorrea/teamsnap-javascript-sdk.git#67168be49492fe5a0331bbbeb33408a42c40ab9a", "dependencies": { "form-data": "1.0.0-rc3", "xmlhttprequest": "1.8.0" @@ -3414,10 +4725,22 @@ "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/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -3427,12 +4750,27 @@ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, "engines": { - "node": ">=0.6.x" + "node": "*" } }, "node_modules/type-is": { @@ -3513,6 +4851,18 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -3543,10 +4893,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, "node_modules/underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha512-ZqGrAgaqqZM7LGRzNjLnw5elevWb5M8LEoDMadxIW3OWbcv72wMMgKdwOKpd5Fqxe8choLD8HN3iSj3TUh/giQ==" + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/unpipe": { "version": "1.0.0", @@ -3626,6 +4982,29 @@ "node": ">=0.10.0" } }, + "node_modules/walk": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", + "dependencies": { + "foreachasync": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", @@ -3673,6 +5052,128 @@ "node": ">= 10.0.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xhr2": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", @@ -3696,6 +5197,11 @@ "engines": { "node": ">=0.4" } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/package.json b/package.json index 4a428d3..d682810 100644 --- a/package.json +++ b/package.json @@ -23,19 +23,28 @@ "url": "https://github.com/sponsors/anthonyscorrea" }, "scripts": { - "start": "node ./bin/www" + "start": "node ./bin/www", + "dev": "nodemon . & npm run scss", + "scss": "sass src/scss/application.scss:src/public/css/application.css src/scss/eventsheet.scss:src/public/css/eventsheet.css", + "scss watch": "sass --watch src/scss/application.scss:src/public/css/application.css src/scss/eventsheet.scss:src/public/css/eventsheet.css" }, "dependencies": { "@teamsnap/teamsnap-ui": "^3.12.3", + "better-sqlite3": "^9.4.1", + "better-sqlite3-session-store": "^0.1.0", "bootstrap": "^5.3.1", "bootstrap-icons": "^1.10.5", "connect-ensure-login": "^0.1.1", "cookie-parser": "~1.4.4", - "csurf": "^1.11.0", + "cors": "^2.8.5", + "cors-anywhere": "^0.4.4", + "csrf-csrf": "^3.0.3", "debug": "~2.6.9", "dotenv": "^8.6.0", "express": "^4.18.2", "express-session": "^1.17.2", + "handlebars-dateformat": "^1.1.3", + "hbs": "^4.2.0", "http-errors": "~1.6.3", "mkdirp": "^1.0.4", "morgan": "~1.9.1", @@ -46,7 +55,15 @@ "pluralize": "^8.0.0", "pug": "^3.0.2", "sortablejs": "^1.15.0", - "teamsnap.js": "^1.62.1", + "teamsnap.js": "github:anthonyscorrea/teamsnap-javascript-sdk#add-eventLineup-eventLineupEntry", + "underscore": "^1.13.6", "xhr2": "^0.2.1" + }, + "devDependencies": { + "connect-livereload": "^0.6.1", + "install": "^0.13.0", + "livereload": "^0.9.3", + "nodemon": "^3.0.3", + "pug2hbs": "^1.0.5" } } diff --git a/src/app.js b/src/app.js index e969967..67a47bf 100644 --- a/src/app.js +++ b/src/app.js @@ -1,32 +1,64 @@ require("dotenv").config(); -var createError = require("http-errors"); -var express = require("express"); -var path = require("path"); -var cookieParser = require("cookie-parser"); -var session = require("express-session"); -var csrf = require("csurf"); -var passport = require("passport"); -var logger = require("morgan"); -var bodyParser = require("body-parser"); +const createError = require("http-errors"); +const express = require("express"); +const path = require("path"); +const cookieParser = require("cookie-parser"); +const session = require("express-session"); +const SqliteStore = require("better-sqlite3-session-store")(session) +var sqlite = require("better-sqlite3"); +const { generateToken } = require('./middlewares/csrf'); +const passport = require("passport"); +const logger = require("morgan"); +const bodyParser = require("body-parser"); global.XMLHttpRequest = require("xhr2"); -var teamsnap = require("teamsnap.js"); -var indexRouter = require("./routes/index"); -var authRouter = require("./routes/auth"); +// const teamsnap = require("./public/js/teamsnap"); +const teamsnap = require("teamsnap.js/lib/teamsnap") +// import {teamsnap} from "teamsnap.js" +const indexRouter = require("./routes/index").router; +const authRouter = require("./routes/auth").router; +var hbs = require('hbs'); +const { embeddedSvgFromPath } = require("./lib/utils"); +const cors = require('cors'); +const corsOptions = { + origin: false +} + +// teamsnap.init(process.env["TEAMSNAP_CLIENT_ID"]) +// console.log(teamsnap) +// teamsnap.teamsnap.init var app = express(); // view engine setup app.set("views", path.join(__dirname, "views")); -app.set("view engine", "pug"); +hbs.registerPartials(require("./routes/index").partials) +hbs.registerPartials(require("./controllers/event").partials) +hbs.registerPartials(require("./controllers/eventlineup").partials) +hbs.registerHelper('dateFormat', require('handlebars-dateformat')); +hbs.registerHelper('section', (name, options) => { + if(!this._sections) this._sections = {}; + this._sections[name] = options.fn(this); + return null; +}) +hbs.registerHelper("embeddedSvgFromPath", require('./lib/utils').embeddedSvgFromPath) +hbs.registerHelper(require("./controllers/event").helpers) +hbs.registerHelper(require("./controllers/eventlineup").helpers) +hbs.registerHelper(require("./helpers/eventsheet")) + +app.set("view engine", "hbs"); app.locals.pluralize = require("pluralize"); -app.use(bodyParser.urlencoded({ extended: true })); +if (process.env.NODE_ENV === "development") { + var connectLiveReload = require("connect-livereload"); + app.use(connectLiveReload()); +} + app.use(bodyParser.json()); +app.use(bodyParser.urlencoded()); app.use(logger("dev")); -app.use(express.json()); -app.use(express.urlencoded({ extended: false })); +app.use(cors(corsOptions)) app.use(cookieParser()); app.use(express.static(path.join(__dirname, "public"))); app.use( @@ -39,25 +71,50 @@ app.use( path.join(__dirname, "../node_modules/@teamsnap/teamsnap-ui/dist/css") ) ); +app.use( + "/teamsnap-ui/assets", + express.static( + path.join(__dirname, "../node_modules/@teamsnap/teamsnap-ui/src/assets") + ) +); app.use( "/font", express.static(path.join(__dirname, "../node_modules/bootstrap-icons/font")) ); +app.use( + "/bootstrap-icons", + express.static(path.join(__dirname, "../node_modules/bootstrap-icons/icons")) +); app.use( "/js", express.static(path.join(__dirname, "../node_modules/sortablejs")) ); +app.use( + "/js", + express.static(path.join(__dirname, "../node_modules/teamsnap.js/lib/")) +); +const db = new sqlite("./var/db/sessions.db"); app.use( session({ + store: new SqliteStore({ + client: db, + expired: { + clear: true, + intervalMs: 900000 //ms = 15min + } + }), teamsnap_token: "", current_team: "", - secret: "keyboard cat", + secret: process.env['SECRET'], resave: false, // don't save session if unmodified saveUninitialized: false, // don't create session until something stored }) ); -app.use(csrf()); -app.use(passport.authenticate("session")); +app.use(function (req, res, next) { + res.locals.csrfToken = generateToken; + next(); +}); +app.use(passport.authenticate("session", { failureRedirect: '/login', failureMessage: true })); app.use(function (req, res, next) { var msgs = req.session.messages || []; res.locals.messages = msgs; @@ -65,14 +122,17 @@ app.use(function (req, res, next) { req.session.messages = []; next(); }); -app.use(function (req, res, next) { - res.locals.csrfToken = req.csrfToken(); - next(); -}); app.use("/", authRouter); app.use("/", indexRouter); +app.use(require("./routes/team").router) +app.use(require("./routes/opponent").router) +app.use(require("./routes/event").router) +app.use(require("./routes/eventlineup").router) +app.use(require("./routes/eventsheet").router) +// app.use("/", indexRouter.team_router); + // catch 404 and forward to error handler app.use(function (req, res, next) { next(createError(404)); @@ -85,8 +145,7 @@ app.use(function (err, req, res, next) { res.locals.error = req.app.get("env") === "development" ? err : {}; console.log("error:", err); // render the error page - res.status(err.status || 500); - res.render("error", { message: err.message }); + res.status(err.status || 500).render("error", { title:"Error", layout: req.layout, message: err.message }); }); -module.exports = app; +module.exports = {app}; \ No newline at end of file diff --git a/src/controllers/event.js b/src/controllers/event.js new file mode 100644 index 0000000..4668ee1 --- /dev/null +++ b/src/controllers/event.js @@ -0,0 +1,54 @@ +tsUtils = require("../lib/utils"); +const path = require('path') + + +exports.helpers = { + availability_percentage: (availabilitySummary, status) => { + attribute = { + going: "playerGoingCount", + notgoing: "playerNotGoingCount", + maybe: "playerMaybeCount", + unknown: "playerUnknownCount" + }[status.toLowerCase()] + return (availabilitySummary[attribute]/availabilitySummary.team.playerMemberCount)*100.0 + } +} + +exports.partials = path.join(__dirname, "../views/event/partials") + +exports.getEvents = async (req, res, next) => { + const {user, team, layout} = req + const bulkLoadTypes = ["event", "availabilitySummary"] + req.promises.push( + teamsnap.bulkLoad(team.id, bulkLoadTypes , () => {tsUtils.teamsnapCallback;req.items = tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team.id, req)}) + .then(items=>tsUtils.groupTeamsnapItems(items)) + .then(items=>{ + items.events.forEach((event) => { + event.link('availabilitySummary', items.availabilitySummaries.find(a=>a.eventId==event.id)) + } + ) + req.events = items.events; + } + ) + ) + await Promise.all(req.promises) + const context = { + title: "Events", + user, team, layout, + events: req.events, + }; + res.render("event/list", context); +}; + +exports.getEvent = async (req, res, next) => { + await Promise.all(req.promises) + const {user, team, event, layout} = req + lineups = await req.event.loadItem('eventLineups') + event.link('availabilitySummary', req.availabilitySummary) + context = { + title: "Event", + user, team, event, layout, + availabilitySummary: req.availabilitySummary, + }; + res.render("event/show", context); +}; diff --git a/src/controllers/eventlineup.js b/src/controllers/eventlineup.js new file mode 100644 index 0000000..4e747dc --- /dev/null +++ b/src/controllers/eventlineup.js @@ -0,0 +1,181 @@ +const path = require('path') +const fs = require('fs') +const {embeddedSvgFromPath, parsePositionLabel} = require("../lib/utils") +const tsUtils = require('../lib/utils') +const { loadEventLineupEntries } = require('teamsnap.js') + +exports.partials = path.join(__dirname, "../views/eventlineup/partials") + +const statusCodeIcons = { + 1: embeddedSvgFromPath("/teamsnap-ui/assets/icons/check.svg"), + 0: embeddedSvgFromPath("/teamsnap-ui/assets/icons/dismiss.svg"), + 2: embeddedSvgFromPath("/bootstrap-icons/question-lg.svg"), + null: embeddedSvgFromPath("/bootstrap-icons/question.svg"), + undefined: embeddedSvgFromPath("/bootstrap-icons/question-lg.svg") +} + +exports.helpers = { + plus1: (i) => Number(i)+1, + positions: () => ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"], + defense_positions: () => ["C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "P"], + avail_status_code_icon: (status_code) => { + const icon_classes = { + 1: "u-colorPositive", + 0: "u-colorNegative", + 2: "u-colorPrimary", + null: "u-colorGrey", + undefined: "u-colorGrey" + } + + const button_classes = { + 1: "Button--yes", + 0: "Button--no", + 2: "Button--maybe", + null: "", + undefined: "" + } + + return `` + }, + positionLabelWithoutFlags: (label) => { + return label.replace(/(.*?)\s\[(.*?)\]/, "$1"); + }, + comparePositionWithFlags: (labelWithoutFlags, eventLineupEntry, options) => { + labelWithFlags = eventLineupEntry?.label + const {positionLabelWithoutFlags} = parsePositionLabel(labelWithFlags); + return positionLabelWithoutFlags == labelWithoutFlags; + }, + isStarting: (member) => { + return (member.benchcoach?.eventLineupEntry != null); + }, + isInStartingLineup: (member) => { + if (member.benchcoach.eventLineupEntry == null) return false; + const {positionFlags} = parsePositionLabel(member.benchcoach.eventLineupEntry?.label); + return (positionFlags != "PO") + }, + isInPositionOnly: (member) => { + if (!member.benchcoach || member.benchcoach.eventLineupEntry == null) return false; + const {positionFlags} = parsePositionLabel(member.benchcoach.eventLineupEntry?.label); + return (member.benchcoach.eventLineupEntry != null && positionFlags == "PO") + }, + isInBench: (member) => { + if (member.benchcoach.eventLineupEntry != null || member.isNonPlayer) return false; + return (member.benchcoach.availability?.statusCode != 0 && member.benchcoach.availability?.statusCode != null) + }, + isInOut: (member) => { + if (member.benchcoach.eventLineupEntry != null || member.isNonPlayer) return false; + return (member.benchcoach.availability?.statusCode == 0 || member.benchcoach.availability?.statusCode == null) + }, + availabilityStatusShort: (availability) => { + const {YES, MAYBE, NO, NONE} = teamsnap.AVAILABILITIES + const statusShortLookup = {} + statusShortLookup[YES] = "YES" + statusShortLookup[MAYBE] = "MAY" + statusShortLookup[NO] = "NO" + statusShortLookup[NONE] = "UNK" + statusShortLookup[undefined] = "UNK" + return (statusShortLookup[availability?.statusCode]) + } +} + +exports.getEventLineup = async (req, res)=>{ + // res.send(req.event_lineup) + await Promise.all(req.promises) + const {user, team, members, event, layout, event_lineup, event_lineup_entries, availabilities, availabilitySummary, csrfToken} = req + attachBenchcoachPropertiesToMember(members, event_lineup_entries, availabilities) + members.sort(tsUtils.teamsnapMembersSortLineupAvailabilityLastName) + res.render("eventlineup/edit", {user, team, members, event, layout, event_lineup, event_lineup_entries, availabilitySummary, csrfToken}) +} + +attachBenchcoachPropertiesToMember = (members, event_lineup_entries, availabilities) => { + members.forEach((member)=> { + // I *think* this can be done with linking https://github.com/teamsnap/teamsnap-javascript-sdk/wiki/Persistence#linking + // here's an example: + // member.link('eventLineupEntry', event_lineup_entries.find(i=>i.id=members[1].id)) + member.benchcoach = {} + // I don't really like this, but the member_id changes once a season is archived. + // as far as I can tell, member_name should consistently be formulated from first and last name + // perhaps could have some edge cases if first or last names change, but this *should be* exceedingly rare. + const member_name = `${member.firstName} ${member.lastName}` + const event_lineup_entry = event_lineup_entries.find(e=> e.memberId == member.id || e.memberName == member_name) + const availability = availabilities.find(e=>e.memberId == member.id) + member.benchcoach.availability = availability + if (event_lineup_entry != null) { + // member.link('eventLineupEntry', event_lineup_entry) + member.benchcoach.eventLineupEntry = event_lineup_entry + const {positionLabelWithoutFlag} = parsePositionLabel(event_lineup_entry.label); + member.benchcoach.eventLineupEntry.positionLabelWithoutFlag = positionLabelWithoutFlag + } + else { + member.benchcoach.eventLineupEntry = null + } + } + ) +} +exports.attachBenchcoachPropertiesToMember = attachBenchcoachPropertiesToMember + +exports.getEventLineupEmail = async (req, res)=>{ + const {body} = req + if (body.memberId == null) {res.status(400).end();return} + await Promise.all(req.promises) + const {user, team, members, event, layout, event_lineup, event_lineup_entries, availabilities, availabilitySummary} = req + const eventLineupEntries = req.event_lineup.eventLineupEntries + const {newEventLineupEntries} = processPostedEventLineupEntries(body, eventLineupEntries, event_lineup) + attachBenchcoachPropertiesToMember(members, newEventLineupEntries, availabilities) + members.sort(tsUtils.teamsnapMembersSortLineupAvailabilityLastName) + // eventLineup = await teamsnap.loadEventLineups(req.params.event_id) + res.status(200).render("eventlineup/email", {user, team, members, event, event_lineup, event_lineup_entries: newEventLineupEntries, availabilities, availabilitySummary}) +} + +exports.getEventLineupEntries = async (req, res)=>{ + const {event_lineup, event_lineup_entries} = req + res.setHeader('Content-Type', 'application/json').send(JSON.stringify(req.event_lineup_entries)) +} + +exports.getEventLineupEntriesData = async (req, res)=>{ + const {event_lineup, event_lineup_entries} = req + res.setHeader('Content-Type', 'application/json').send(JSON.stringify(req.event_lineup_entries)) +} + +exports.postEventLineup = async (req,res) => { + const {body} = req + if (body.memberId == null) {res.status(400).end();return} + await Promise.all(req.promises); + const eventLineupEntries = req.event_lineup.eventLineupEntries + const {newEventLineupEntries} = processPostedEventLineupEntries(body, eventLineupEntries, req.event_lineup) + newEventLineupEntries.forEach(e=>{ + teamsnap.saveEventLineupEntry(e) + }) + eventLineup = await teamsnap.loadEventLineups(req.params.event_id) + res.status(201).end() +} + +const processPostedEventLineupEntries = (body, eventLineupEntries, eventLineup) => { + const newEventLineupEntries = [] + + body.memberId.forEach((memberId, i)=>{ + const lineupEntryId = body.eventLineupEntryId[i] + const lineupEntryLabel = body.label[i] + const lineupEntrySequence = body.sequence[i] + if (lineupEntryId != '') { + // Update lineup entry + const eventLineupEntry = eventLineupEntries.find((e)=>e.id==Number(lineupEntryId)) + eventLineupEntry.sequence = lineupEntrySequence + eventLineupEntry.label = lineupEntryLabel + newEventLineupEntries.push(eventLineupEntry) + } + else if (lineupEntryLabel != '') { + // Create lineup entry + const eventLineupEntry = teamsnap.createEventLineupEntry() + eventLineupEntry.eventLineupId = eventLineup.id + eventLineupEntry.memberId = memberId + eventLineupEntry.sequence = lineupEntrySequence + eventLineupEntry.label = lineupEntryLabel + newEventLineupEntries.push(eventLineupEntry) + } + else { + // Skip lineup entry + } + }) + return {newEventLineupEntries, eventLineupEntries} +} \ No newline at end of file diff --git a/src/controllers/events.js b/src/controllers/events.js deleted file mode 100644 index 6d28a24..0000000 --- a/src/controllers/events.js +++ /dev/null @@ -1,169 +0,0 @@ -utils = require("../lib/utils"); - -exports.getEvents = (req, res, next) => { - team_id = req.params.team_id; - utils.initTeamsnap(req, res, () => { - teamsnap.bulkLoad(team_id, ["team", "event", "availabilitySummary"]).then(() => { - items = teamsnap.getAllItems(); - context = { - title: "Events", - team: items.find((i) => i.type == "team" && i.id == team_id), - availabilitySummaries: items.filter((i) => i.type == "availabilitySummary"), - events: items.filter((i) => i.type == "event"), - }; - res.render("events", context); - }); - }); -}; - -exports.getEvent = (req, res, next) => { - team_id = req.params.team_id; - event_id = req.params.event_id; - utils.initTeamsnap(req, res, () => { - teamsnap.bulkLoad(team_id, ["team", "event", "availabilitySummary"]).then(() => { - items = teamsnap.getAllItems(); - context = { - title: "Event", - team: items.find((i) => i.type == "team" && i.id == team_id), - availabilitySummary: items.find((i) => i.type == "availabilitySummary" && i.id == event_id), - event: items.find((i) => i.type == "event" && i.id == event_id), - }; - res.render("event", context); - }); - }); -}; - -exports.getLineup = (req, res, next) => { - team_id = req.params.team_id; - event_id = req.params.event_id; - utils.initTeamsnap(req, res, () => { - teamsnap - .bulkLoad(team_id, [ - "team", - "member", - // "member_photos", - "event", - "opponent", - "availability_summary", - ]) - .then((items) => { - events = items.filter((i) => i.type == "event").sort((a, b) => a.startDate - b.startDate); - event = events.find((i) => i.id == event_id); - events_past = events.slice( - events.findIndex((e) => e == event) - 4, - events.findIndex((e) => e == event) - ); - events_future = events.slice(events.findIndex((e) => e == event) + 1, events.findIndex((e) => e == event) + 5); - events = events_past.concat(event).concat(events_future); - }) - .then((items) => { - return teamsnap.loadAvailabilities({ - eventId: events.map((e) => e.id), - }); - }) - .then(() => { - return teamsnap.collections["eventLineups"] - .queryItems("search", { - eventId: events.map((e) => e.id), - }) - .then((event_lineups) => { - return Promise.all(event_lineups.map((elu) => elu.loadItem("eventLineupEntries"))); - }); - }) - .then(() => { - items = teamsnap.getAllItems(); - events = items.filter((i) => i.type == "event"); - current_event_index = events.findIndex((e) => e.id == event_id); - - context = { - title: "Lineup", - team: items.find((e) => e.type == "team" && e.id == team_id), - team_id: req.params.team_id, - event_id: req.params.event_id, - current_event_index: current_event_index, - events: items.filter((a) => a.type == "event"), - availabilitySummaries: items.filter((i) => i.type == "availabilitySummary"), - availabilitySummary: items.filter((i) => i.type == "availabilitySummary" && i.eventId == event_id), - event: items.find((e) => e.type == "event" && e.id == event_id), - events_past: events_past, - events_future: events_future, - members: items.filter((a) => a.type == "member"), - availabilities: items.filter((i) => i.type == "availability").sort(utils.teamsnapAvailabilitiesSort), - all_lineup_entries: items.filter((i) => i.type == "eventLineupEntry"), - event_lineup_entries: items - .filter((i) => i.type == "eventLineupEntry" && i.eventId == event_id) - .sort((a, b) => a.sequence - b.sequence), - }; - - res.render("event-lineup", context); - }); - }); -}; - -exports.getLineupCard = (req, res, next) => { - team_id = req.params.team_id; - event_id = req.params.event_id; - utils.initTeamsnap(req, res, () => { - teamsnap - .bulkLoad(team_id, [ - "team", - "member", - // "member_photos", - "event", - "opponent", - "availability_summary", - ]) - .then((items) => { - events = items.filter((i) => i.type == "event").sort((a, b) => a.startDate - b.startDate); - event = events.find((i) => i.id == event_id); - events_past = events.slice( - events.findIndex((e) => e == event) - 4, - events.findIndex((e) => e == event) - ); - events_future = events.slice(events.findIndex((e) => e == event) + 1, events.findIndex((e) => e == event) + 5); - events = events_past.concat(event).concat(events_future); - }) - .then((items) => { - return teamsnap.loadAvailabilities({ - eventId: events.map((e) => e.id), - }); - }) - .then(() => { - return teamsnap.collections["eventLineups"] - .queryItems("search", { - eventId: events.map((e) => e.id), - }) - .then((event_lineups) => { - return Promise.all(event_lineups.map((elu) => elu.loadItem("eventLineupEntries"))); - }); - }) - .then(() => { - items = teamsnap.getAllItems(); - events = items.filter((i) => i.type == "event"); - current_event_index = events.findIndex((e) => e.id == event_id); - - context = { - title: "Gamecard", - team_id: req.params.team_id, - event_id: req.params.event_id, - current_event_index: current_event_index, - events: items.filter((a) => a.type == "event"), - availabilitySummaries: items.filter((i) => i.type == "availabilitySummary"), - event: items.find((e) => e.type == "event" && e.id == event_id), - events_past: events_past, - events_future: events_future, - members: items.filter((a) => a.type == "member"), - availabilities: items.filter((i) => i.type == "availability").sort(utils.teamsnapAvailabilitiesSort), - all_lineup_entries: items.filter((i) => i.type == "eventLineupEntry"), - event_lineup_entries_offense: items - .filter((i) => i.type == "eventLineupEntry" && i.eventId == event_id && !i.label.includes("[PO]")) - .sort((a, b) => a.sequence - b.sequence), - event_lineup_entries: items - .filter((i) => i.type == "eventLineupEntry" && i.eventId == event_id) - .sort((a, b) => a.sequence - b.sequence), - }; - - res.render("event-lineupcard", context); - }); - }); -}; diff --git a/src/controllers/eventsheet.js b/src/controllers/eventsheet.js new file mode 100644 index 0000000..6acfdb6 --- /dev/null +++ b/src/controllers/eventsheet.js @@ -0,0 +1,73 @@ +const tsUtils = require('../lib/utils') + +exports.getEventSheet = async (req,res) =>{ + await Promise.all(req.promises) + const {user, team, team_preferences, members, event, event_lineup, event_lineup_entries, availabilities, availabilitySummary, timeline, recent_events, upcoming_events} = req + res.render('eventsheet/sheet', {user, team, team_preferences, members, event, event_lineup, event_lineup_entries, availabilities, availabilitySummary, timeline, recent_events, upcoming_events}) +} + +exports.getLineupCard = (req, res, next) => { + team_id = req.params.team_id; + event_id = req.params.event_id; + teamsnap + .bulkLoad(team_id, [ + "team", + "member", + // "member_photos", + "event", + "opponent", + "availabilitySummary", + ]) + .then((items) => { + events = items.filter((i) => i.type == "event").sort((a, b) => a.startDate - b.startDate); + event = events.find((i) => i.id == event_id); + events_past = events.slice( + events.findIndex((e) => e == event) - 4, + events.findIndex((e) => e == event) + ); + events_future = events.slice(events.findIndex((e) => e == event) + 1, events.findIndex((e) => e == event) + 5); + events = events_past.concat(event).concat(events_future); + }) + .then((items) => { + return teamsnap.loadAvailabilities({ + eventId: events.map((e) => e.id), + }).catch(error => console.log("error in event.js")); + }) + .then(() => { + return teamsnap.collections["eventLineups"] + .queryItems("search", { + eventId: events.map((e) => e.id), + }) + .then((event_lineups) => { + return Promise.all(event_lineups.map((elu) => elu.loadItem("eventLineupEntries"))); + }); + }) + .then(() => { + items = teamsnap.getAllItems(); + events = items.filter((i) => i.type == "event"); + current_event_index = events.findIndex((e) => e.id == event_id); + + context = { + title: "Gamecard", + team_id: req.params.team_id, + event_id: req.params.event_id, + current_event_index: current_event_index, + events: items.filter((a) => a.type == "event"), + availabilitySummaries: items.filter((i) => i.type == "availabilitySummary"), + event: items.find((e) => e.type == "event" && e.id == event_id), + events_past: events_past, + events_future: events_future, + members: items.filter((a) => a.type == "member"), + availabilities: items.filter((i) => i.type == "availability").sort(tsUtils.teamsnapMembersSortLineupAvailabilityLastName), + all_lineup_entries: items.filter((i) => i.type == "eventLineupEntry"), + event_lineup_entries_offense: items + .filter((i) => i.type == "eventLineupEntry" && i.eventId == event_id && !i.label.includes("[PO]")) + .sort((a, b) => a.sequence - b.sequence), + event_lineup_entries: items + .filter((i) => i.type == "eventLineupEntry" && i.eventId == event_id) + .sort((a, b) => a.sequence - b.sequence), + }; + + res.render("event-lineupcard", context); + }); +}; \ No newline at end of file diff --git a/src/controllers/member.js b/src/controllers/member.js new file mode 100644 index 0000000..85c795e --- /dev/null +++ b/src/controllers/member.js @@ -0,0 +1,9 @@ +exports.getMembers = (req, res, next) => { + const {members, team} = req + context = { + title: `Roster`, + team_id: team.id, + team, members, + }; + res.render("members", context); +}; diff --git a/src/controllers/members.js b/src/controllers/members.js deleted file mode 100644 index e30e9f8..0000000 --- a/src/controllers/members.js +++ /dev/null @@ -1,18 +0,0 @@ -utils = require("../lib/utils"); - -exports.getMembers = (req, res, next) => { - team_id = req.params.team_id; - utils.initTeamsnap(req, res, () => { - teamsnap.bulkLoad(team_id, ["team", "member"]).then(() => { - items = teamsnap.getAllItems(); - context = { - title: `Roster`, - team_id: team_id, - team: items.find((i) => i.type == "team" && i.id == team_id), - members: items.filter((i) => i.type == "member" && i.teamId == team_id), - }; - res.set("Content-Type", "text/html"); - res.render("members", context); - }); - }); -}; diff --git a/src/controllers/opponent.js b/src/controllers/opponent.js new file mode 100644 index 0000000..2e72a47 --- /dev/null +++ b/src/controllers/opponent.js @@ -0,0 +1,109 @@ + + +exports.getOpponents = async (req, res, next) => { + const {user, team, layout, csrfToken} = req + opponents = await teamsnap.loadOpponents(team.id, ["event", "availabilitySummary"], (err, opponents)=>{ + if (err) console.log('err in controllers/opponent.js') + + else return opponents; + }) + context = { + title: "Opponents", + user, team, layout, csrfToken, + opponents: opponents, + }; + res.render("opponent/list", context); +}; + +exports.uploadOpponentLogoForm = (req, res, next) => { + opponent_id = req.params.opponent_id; + team_id = req.params.team_id; + res.set("Content-Type", "text/html"); + res.render("upload-logo", { + title: "Upload Logo", + csrf_token: req.csrfToken(), + team_id: team_id, + opponent_id: opponent_id, + }); +}; + +exports.uploadOpponentLogo = (req, res, next) => { + opponent_id = req.body.opponent_id; + team_id = req.body.team_id; + member_id = req.user.id; + file = new File(req.file.buffer, `team-logo-${opponent_id}.png`, { + type: "image/png", + }); + authTeamsnap(req.user); + teamsnap + .loadCollections() + .then(() => { + return teamsnap.createTeamMedium({ + file: file, + mediaFormat: "file", + memberId: member_id, + teamId: team_id, + teamMediaGroupId: "4927028", + description: `team-logo-${opponent_id}.png`, + }); + }) + .then((item) => { + return teamsnap.uploadTeamMedium(item); + }) + .then((item) => { + res.send("Data Received: " + JSON.stringify(item)); + }) + .fail((err) => console.log(err)); +}; + +exports.getOpponent = async (req, res) => { + await Promise.all(req.promises) + const {team, team_media_group, opponent, layout, opponent_logo, user, csrfToken} = req + context = { + team, team_media_group, opponent, layout, opponent_logo, user, csrfToken + // opponent_logo: items.find( + // (i) => i.type == "teamMedium" && i.description == `opponent-logo-${opponent_id}.png` + // ), + }; + res.set("Content-Type", "text/html"); + res.render("opponent/show", context); +}; + +exports.postOpponentLogo = async (req, res, next) => { + res.status('501').send('Not Implemented') + // await Promise.all(req.promises) + // const {team, opponent, user, body} = req + // const filename = `team-logo-${opponent.id}.png` + // file = new File(req.file.buffer, filename, { + // type: "image/png", + // }); + + // const team_medium = await teamsnap.createTeamMedium( + // { + // file: file, + // memberId: user.id, + // teamId: team.id, + // teamMediaGroupId: body.teamMediaGroupId, + // description: filename, + // } + // ) + // await teamsnap.saveTeamMedium(team_medium) + // // await teamsnap.uploadTeamMedium(team_medium) + + // const headers={'Authorization': `Bearer ${user.accessToken}`} + // // const url = teamsnap.collections.teamMedia.commands.uploadTeamMedium.href + // const url = teamsnap.collections.teamMedia.queries.search.href + // const response = await fetch(url+`?team_id=${team.id}`, { + // headers, + // method: 'get', + // // body:{team_id:team.id} + // // body: { + // // file: file, + // // member_id: user.id, + // // team_id: team.id, + // // team_media_group_id: body.teamMediaGroupId, + // // description: filename, + // // } + // }) + // // await teamsnap +} \ No newline at end of file diff --git a/src/controllers/opponents.js b/src/controllers/opponents.js deleted file mode 100644 index 46abac3..0000000 --- a/src/controllers/opponents.js +++ /dev/null @@ -1,80 +0,0 @@ -exports.getOpponents = (req, res, next) => { - team_id = req.params.team_id; - utils.initTeamsnap(req, res, () => { - teamsnap.bulkLoad(team_id, ["team", "opponent"]).then((items) => { - res.set("Content-Type", "text/html"); - res.render("opponents", { - title: "Opponents", - team: items.find((i) => i.type == "team" && i.id == team_id), - opponents: items.filter((i) => i.type == "opponent"), - team_id: team_id, - }); - }); - }); -}; - -exports.uploadOpponentLogoForm = (req, res, next) => { - opponent_id = req.params.opponent_id; - team_id = req.params.team_id; - res.set("Content-Type", "text/html"); - res.render("upload-logo", { - title: "Upload Logo", - csrf_token: req.csrfToken(), - team_id: team_id, - opponent_id: opponent_id, - }); -}; - -exports.uploadOpponentLogo = (req, res, next) => { - opponent_id = req.body.opponent_id; - team_id = req.body.team_id; - member_id = req.user.id; - file = new File(req.file.buffer, `team-logo-${opponent_id}.png`, { - type: "image/png", - }); - authTeamsnap(req.user); - teamsnap - .loadCollections() - .then(() => { - return teamsnap.createTeamMedium({ - file: file, - mediaFormat: "file", - memberId: member_id, - teamId: team_id, - teamMediaGroupId: "4927028", - description: `team-logo-${opponent_id}.png`, - }); - }) - .then((item) => { - return teamsnap.uploadTeamMedium(item); - }) - .then((item) => { - res.send("Data Received: " + JSON.stringify(item)); - }) - .fail((err) => console.log(err)); -}; - -exports.getOpponent = (req, res, next) => { - team_id = req.params.team_id; - opponent_id = req.params.opponent_id; - utils.initTeamsnap(req, res, () => { - teamsnap - .bulkLoad(team_id, ["team", "opponent"]) - .then(() => { - teamsnap.loadTeamMedia(team_id); - }) - .then(() => { - items = teamsnap.getAllItems(); - context = { - team: items.find((i) => i.type == "team" && i.id == team_id), - opponent: items.find((i) => i.type == "opponent" && i.id == opponent_id), - opponent_logo: items.find( - (i) => i.type == "teamMedium" && i.description == `opponent-logo-${opponent_id}.png` - ), - team_id: team_id, - }; - res.set("Content-Type", "text/html"); - res.render("opponent", context); - }); - }); -}; diff --git a/src/controllers/team.js b/src/controllers/team.js new file mode 100644 index 0000000..9a265d7 --- /dev/null +++ b/src/controllers/team.js @@ -0,0 +1,21 @@ +utils = require("../lib/utils"); + +exports.getTeams = async (req, res, next) => { + const {layout, user} = req + teams = await teamsnap.loadTeams((err, teams) => { + if (err) console.log("error in team.js", err); + }) + context = { layout, title: "Teams", teams: teams.filter(t=>!t.isRetired), user }; + res.render("team/list", context); +}; + +exports.getTeamHome = async (req, res, next) => { + await Promise.all(req.promises) + const {user, team, team_preferences, upcoming_events, recent_events, layout} = req + context = { + title: "Home", + layout, team, user, team_preferences, upcoming_events, recent_events + }; + + res.render("team/home", context); +}; diff --git a/src/controllers/teams.js b/src/controllers/teams.js deleted file mode 100644 index c6833bc..0000000 --- a/src/controllers/teams.js +++ /dev/null @@ -1,20 +0,0 @@ -utils = require("../lib/utils"); - -exports.getTeams = (req, res, next) => { - utils.initTeamsnap(req, res, () => { - teamsnap.loadTeams().then((teams) => { - context = { title: "Teams", teams: teams }; - res.render("teams", context); - }); - }); -}; - -exports.getTeamHome = (req, res, next) => { - team_id = req.params.team_id; - utils.initTeamsnap(req, res, () => { - teamsnap.loadTeam(team_id).then((team) => { - context = { title: "Home", team: team }; - res.render("team", context); - }); - }); -}; diff --git a/src/helpers/eventsheet.js b/src/helpers/eventsheet.js new file mode 100644 index 0000000..e2cf0c9 --- /dev/null +++ b/src/helpers/eventsheet.js @@ -0,0 +1,134 @@ +const { parsePositionLabel, teamsnapMembersSortLineupAvailabilityLastName, teamsnapMembersSortAvailabilityLastName } = require('../lib/utils') +const {attachBenchcoachPropertiesToMember} = require('../controllers/eventlineup') + +exports.offenseLineup = (number_of_slots, options) => { + var results = "" + const {event_lineup_entries, members} = options.data.root + + for (let i = 0; i < number_of_slots; i++){ + const event_lineup_entry = event_lineup_entries ? event_lineup_entries[i] : null + if (event_lineup_entry && !parsePositionLabel(event_lineup_entry.label).positionFlags.includes('PO')){ + results += options.fn({ + sequence: event_lineup_entry.sequence, + member: members.find(member=> event_lineup_entry.memberId == member.id || event_lineup_entry.memberName == `${member.firstName} ${member.lastName}`), + label: event_lineup_entry.label + }) + } + else { + results += options.fn({ + sequence: i, + member: {}, + label: "" + }) + } + } + return results + } + +exports.defenseLineup = (options) => { + var results = "" + const {event_lineup_entries, members} = options.data.root + const positions = ["C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "P"] + positions.forEach(position=>{ + const event_lineup_entry = event_lineup_entries ? event_lineup_entries.find(e=>parsePositionLabel(e.label).positionLabelWithoutFlags == position) : null + if (event_lineup_entry) { + results += options.fn({position, eventLineupEntry:event_lineup_entry, member:members.find(member=> event_lineup_entry.memberId == member.id || event_lineup_entry.memberName == `${member.firstName} ${member.lastName}`)}) + } + else { + results += options.fn({position, member:{}}) + } + }) + return results + } + + +exports.rosterHistoryHeader = (options) => { + var results = "" + events = ["+1", "+2", "+3", "+4","-1","-2","-3","-4"] + + events.forEach(event => { + const class_name = event.includes("+") ? "plus": "minus" + const past_or_future = event.includes("+") ? "future": "past" + const index = Number(event.replace("+","").replace("-","")) + results += options.fn({class:`today-${class_name}-${index} ${past_or_future}`, event}) + }) + return results; +} + +exports.rosterHistory = (options) => { + var results = "" + const {event, event_lineup_entries, members, availabilities} = options.data.root + const players = members.filter(m=>!m.isNonPlayer) + attachBenchcoachPropertiesToMember(players, event_lineup_entries ? event_lineup_entries.filter(i=>i.eventId==event.id) : [], availabilities.filter(i=>i.eventId==event.id)) + players.sort(teamsnapMembersSortAvailabilityLastName) + + players.forEach(member=>{ + const {firstName, lastName, jerseyNumber, benchcoach, position, id} = member + results += options.fn({ + id, firstName, lastName, jerseyNumber, position, benchcoach + }) + } + ) + return results; +} + +const positionGroups = { + "P":"P", + "IF":"IF", + "1B":"IF", + "2B":"IF", + "3B":"IF", + "SS":"IF", + "OF":"OF", + "LF":"OF", + "CF":"OF", + "RF":"OF", + "C":"C" +} + +exports.positionCapabilityFor = (member, position, options) => { + const member_positions = member.position.split(",").map(s=>s.trim()) + const member_position_groups = new Set(member.position.split(",").map(s=>positionGroups[s.trim()])) + + if (member_position_groups.has(position)){ + return "\u2713" + } + else { + return "" + } +} + +exports.firstLetter = (s, options) => { + return s[0]; +} + +exports.repeat = (n, options) => { + var results = ""; + [...Array(n).keys()].forEach(i => { + results += options.fn({index: i}) + }); + return results; +} + +exports.loopEvents = (events, options) => { + var results = ""; + events.forEach(event => { + results += options.fn(event) + } + ) + return results; +} + +exports.timepointForMember = (member, timeline, event, options) => { + var results = "" + const availability = timeline.availabilities.find(a=>a.memberId==member.id && a.eventId==event.id) + const eventLineupEntry = timeline.event_lineup_entries.find(a=>(a.memberId==member.id || a.memberName == `${member.firstName} ${member.lastName}`) && a.eventId==event.id) + var value = "" + if (eventLineupEntry){ + value = parsePositionLabel(eventLineupEntry.label).positionLabelWithoutFlags + } + else { + value = availability.status[0] + } + return options.fn({availability: availability, eventLineupEntry: eventLineupEntry, value}) +} \ No newline at end of file diff --git a/src/lib/utils.js b/src/lib/utils.js index b9ed824..ee59ed1 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -1,27 +1,54 @@ -exports.teamsnapAvailabilitiesSort = (a, b) => { +const path = require('path') +const fs = require('fs') + +exports.teamsnapMembersSortLineupAvailabilityLastName = (a, b) => { status_code_sort = [ teamsnap.AVAILABILITIES.YES, teamsnap.AVAILABILITIES.MAYBE, teamsnap.AVAILABILITIES.NO, teamsnap.AVAILABILITIES.NONE, ]; - a_sort = status_code_sort.indexOf(a.statusCode); - b_sort = status_code_sort.indexOf(b.statusCode); - if (a_sort > b_sort) { - return 1; + + if (a.benchcoach.eventLineupEntry != null && b.benchcoach.eventLineupEntry != null){ + return a.benchcoach.eventLineupEntry.sequence - b.benchcoach.eventLineupEntry.sequence } - if (a_sort < b_sort) { - return -1; + else if (a.benchcoach.eventLineupEntry != null && b.benchcoach.eventLineupEntry == null){ + return -1 } - if (a_sort == b_sort) { - if (a.member.lastName < b.member.lastName) { + else if (a.benchcoach.eventLineupEntry == null && b.benchcoach.eventLineupEntry != null) { + return 1 + } + else { + return teamsnapMembersSortAvailabilityLastName(a,b) + } +}; + +teamsnapMembersSortAvailabilityLastName = (a, b) => { + status_code_sort = [ + teamsnap.AVAILABILITIES.YES, + teamsnap.AVAILABILITIES.MAYBE, + teamsnap.AVAILABILITIES.NO, + teamsnap.AVAILABILITIES.NONE, + ]; + + a_sort = status_code_sort.indexOf(a.benchcoach.availability?.statusCode); + b_sort = status_code_sort.indexOf(b.benchcoach.availability?.statusCode); + if (a_sort > b_sort) { + return 1; + } + if (a_sort < b_sort) { return -1; } - if (a.member.lastName > b.member.lastName) { + if (a_sort == b_sort) { + if (a.lastName < b.lastName) { + return -1; + } + if (a.lastName > b.lastName) { return 1; } } -}; + } +exports.teamsnapMembersSortAvailabilityLastName = teamsnapMembersSortAvailabilityLastName exports.initTeamsnap = (req, res, next) => { if (!teamsnap.isAuthed()) { @@ -33,3 +60,97 @@ exports.initTeamsnap = (req, res, next) => { next(req, res, next); }); }; + +exports.teamsnapLog = (method, types, id, req, message="") => { + console.log( + '\x1b[33mTeamSnap:\x1b[0m', + `${method} for \x1b[33m\[${types}\]\x1b[0m on ${id}`, + `on url ${req.url}`, + `"${message}"` + ) + +} + +exports.teamsnapCallback = (err,items) => { + if (err) { + console.log(err.message); + } + + return items; + } + +exports.teamsnapFailure = (err) => { + if (err) { + console.log(err.message); + } + } + +const getPluralType = (type) =>{ + // There are some instances where a type is not + // in the list of teamsnap.types, so a plural + // is not generated in the lookup. this is a + // kludge around that. (specifically availabilitySummary) + plural = teamsnap.getPluralType(type) || (function() { + switch (type.slice(-1)) { + case 'y': + return type.slice(0, -1) + 'ies'; + case 's': + return type + 'es'; + default: + return type + 's'; + } + })(); + return plural +} + +exports.groupTeamsnapItems = (items, types = [], params = {}) => { + const result = {}; + items.forEach(item => { + const type = item.type + const type_plural = getPluralType(type) + if ((types.length > 0 && types.includes(type)) || (types.length == 0)) { + if (!result[type_plural]) result[type_plural] = [] + result[type_plural].push(item) + } + }) + return result; + } + +exports.embeddedSvgFromPath = (svg_path, additional_classes = "") => { + const iconStaticPaths = { + "/teamsnap-ui/assets":path.join(__dirname, "/../../node_modules/@teamsnap/teamsnap-ui/src/assets"), + "/bootstrap-icons":path.join(__dirname, "/../../node_modules/bootstrap-icons/icons"), + "/media":path.join(__dirname, "/../public/media") + } + + for (const [key, value] of Object.entries(iconStaticPaths)) { + if (svg_path.startsWith(key)) { + svg_path = svg_path.replace(key, value) + } + } + + const svg = fs.readFileSync(`${svg_path}`, 'utf8'); + + svgRegExWithClass = new RegExp(//) + svgRegExWithoutClass = new RegExp(//) + + if (svgRegExWithClass.test(svg)) { + return svg.replace(svgRegExWithClass, ``) + } + else if (svgRegExWithoutClass.test(svg)) { + return svg.replace(svgRegExWithoutClass, ``) + } + else return svg + } + +exports.parsePositionLabel = (label) => { + if (label == null) { + return { + positionLabelWithoutFlags: null, + positionFlags: null + } + } + const positionLabelWithoutFlags= label.replace(/(.*?)\s\[(.*?)\]/, "$1") + const positionFlags = label.replace(/(.*?)\s\[(.*?)\]/, "$2") + return {positionLabelWithoutFlags, positionFlags} + } \ No newline at end of file diff --git a/src/middlewares/bulkload.js b/src/middlewares/bulkload.js new file mode 100644 index 0000000..4f73f14 --- /dev/null +++ b/src/middlewares/bulkload.js @@ -0,0 +1,49 @@ +exports.loadRecentAndUpcomingEvents = async (req, res, next) => { + const {team_id, event_id} = req.params + var subject_date = "" + if (event_id) { + const event = await teamsnap.loadEvents({id: event_id}).pop() + subject_date = event.startDate.toISOString().slice(0,10) + } + else { + subject_date = new Date().toISOString().slice(0,10) + } + req.promises.push( + teamsnap.bulkLoad({ + teamId: team_id, + types: ["event", "availabilitySummary"], + scopeTo: "event", + event__startedAfter: subject_date, + event__pageSize: 4 + }) + .then(items => tsUtils.groupTeamsnapItems(items)) + .then((items)=>{ + req.upcoming_events=items.events || []; + const availabilitySummaries=items.availabilitySummaries; + req.upcoming_events.forEach((event) => { + event.link('availabilitySummary', availabilitySummaries.find(a=>a.eventId==event.id)) + }) + } + ).fail(utils.teamsnapFailure) + ) + req.promises.push( + teamsnap.bulkLoad({ + teamId: team_id, + types: ["event", "availabilitySummary"], + scopeTo: "event", + event__startedBefore: subject_date, + event__pageSize: 4, + event__sortStartDate: "desc" + }) + .then(items => tsUtils.groupTeamsnapItems(items)) + .then((items)=>{ + req.recent_events=items.events || []; + const availabilitySummaries=items.availabilitySummaries; + req.recent_events.forEach((event) => { + event.link('availabilitySummary', availabilitySummaries.find(a=>a.eventId==event.id)) + }) + } + ).fail(utils.teamsnapFailure) + ) + next(); +} \ No newline at end of file diff --git a/src/middlewares/csrf.js b/src/middlewares/csrf.js new file mode 100644 index 0000000..b069428 --- /dev/null +++ b/src/middlewares/csrf.js @@ -0,0 +1,18 @@ +const { doubleCsrf } = require('csrf-csrf'); + +const csrf = doubleCsrf({ + getSecret: () => process.env.CSRF_SECRET, + getTokenFromRequest: req => { + return req.body.csrfToken + }, + cookieName: process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'development' ? '__benchcoach.x-csrf-token' : '_csrf', + cookieOptions: { + secure: process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'development' // Enable for HTTPS in production + } +}); + + +module.exports = { + doubleCsrfProtection: csrf.doubleCsrfProtection, + generateToken: csrf.generateToken +}; \ No newline at end of file diff --git a/src/public/css/application.css b/src/public/css/application.css new file mode 100644 index 0000000..0ab6b1e --- /dev/null +++ b/src/public/css/application.css @@ -0,0 +1,7141 @@ +@charset "UTF-8"; +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS (and SCSS, if configured) file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + *= require_tree . + *= require_self + */ +@font-face { + font-family: "MuseoSansRounded100Regular"; + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-100-webfont.eot"); + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-100-webfont.woff") format("woff"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-100-webfont.ttf") format("truetype"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-100-webfont.svg") format("svg"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "MuseoSansRounded300Regular"; + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-300-webfont.eot"); + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-300-webfont.woff") format("woff"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-300-webfont.ttf") format("truetype"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-300-webfont.svg") format("svg"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "MuseoSansRounded500Regular"; + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-500-webfont.eot"); + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-500-webfont.woff") format("woff"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-500-webfont.ttf") format("truetype"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-500-webfont.svg") format("svg"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "MuseoSansRounded700Regular"; + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-700-webfont.eot"); + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-700-webfont.woff") format("woff"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-700-webfont.ttf") format("truetype"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-700-webfont.svg") format("svg"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "MuseoSansRounded900Regular"; + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-900-webfont.eot"); + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-900-webfont.woff") format("woff"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-900-webfont.ttf") format("truetype"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-900-webfont.svg") format("svg"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: "MuseoSansRounded1000Regular"; + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-1000-webfont.eot"); + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-1000-webfont.woff") format("woff"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-1000-webfont.ttf") format("truetype"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/museo/MuseoSansRounded-1000-webfont.svg") format("svg"); + font-weight: normal; + font-style: normal; +} +/* cyrillic-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: local("Open Sans"), local("OpenSans"), url(https://fonts.gstatic.com/s/opensans/v13/K88pR3goAWT7BTt32Z01mxJtnKITppOI_IvcXXDNrsc.woff2) format("woff2"); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} +/* cyrillic */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: local("Open Sans"), local("OpenSans"), url(https://fonts.gstatic.com/s/opensans/v13/RjgO7rYTmqiVp7vzi-Q5URJtnKITppOI_IvcXXDNrsc.woff2) format("woff2"); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: local("Open Sans"), local("OpenSans"), url(https://fonts.gstatic.com/s/opensans/v13/LWCjsQkB6EMdfHrEVqA1KRJtnKITppOI_IvcXXDNrsc.woff2) format("woff2"); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: local("Open Sans"), local("OpenSans"), url(https://fonts.gstatic.com/s/opensans/v13/xozscpT2726on7jbcb_pAhJtnKITppOI_IvcXXDNrsc.woff2) format("woff2"); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: local("Open Sans"), local("OpenSans"), url(https://fonts.gstatic.com/s/opensans/v13/59ZRklaO5bWGqF5A9baEERJtnKITppOI_IvcXXDNrsc.woff2) format("woff2"); + unicode-range: U+0102-0103, U+1EA0-1EF1, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: local("Open Sans"), local("OpenSans"), url(https://fonts.gstatic.com/s/opensans/v13/u-WUoqrET9fUeobQW7jkRRJtnKITppOI_IvcXXDNrsc.woff2) format("woff2"); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: local("Open Sans"), local("OpenSans"), url(https://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3VtXRa8TVwTICgirnJhmVJw.woff2) format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} +/* latin-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 600; + src: local("Open Sans Semibold"), local("OpenSans-Semibold"), url(https://fonts.gstatic.com/s/opensans/v13/MTP_ySUJH_bn48VBG8sNSj0LW-43aMEzIO6XUTLjad8.woff2) format("woff2"); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 600; + src: local("Open Sans Semibold"), local("OpenSans-Semibold"), url(https://fonts.gstatic.com/s/opensans/v13/MTP_ySUJH_bn48VBG8sNSugdm0LZdjqr5-oayXSOefg.woff2) format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} +/* cyrillic-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: local("Open Sans Bold"), local("OpenSans-Bold"), url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzK-j2U0lmluP9RWlSytm3ho.woff2) format("woff2"); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} +/* cyrillic */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: local("Open Sans Bold"), local("OpenSans-Bold"), url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzJX5f-9o1vgP2EXwfjgl7AY.woff2) format("woff2"); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: local("Open Sans Bold"), local("OpenSans-Bold"), url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBWV49_lSm1NYrwo-zkhivY.woff2) format("woff2"); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: local("Open Sans Bold"), local("OpenSans-Bold"), url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzKaRobkAwv3vxw3jMhVENGA.woff2) format("woff2"); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: local("Open Sans Bold"), local("OpenSans-Bold"), url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzP8zf_FOSsgRmwsS7Aa9k2w.woff2) format("woff2"); + unicode-range: U+0102-0103, U+1EA0-1EF1, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: local("Open Sans Bold"), local("OpenSans-Bold"), url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzD0LW-43aMEzIO6XUTLjad8.woff2) format("woff2"); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: local("Open Sans Bold"), local("OpenSans-Bold"), url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzOgdm0LZdjqr5-oayXSOefg.woff2) format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} +@font-face { + font-family: "SSPika"; + src: url("https://teamsnap-ui.teamsnap.com/assets/fonts/ss-pika/ss-pika.eot"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/ss-pika/ss-pika.woff") format("woff"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/ss-pika/ss-pika.ttf") format("truetype"), url("https://teamsnap-ui.teamsnap.com/assets/fonts/ss-pika/ss-pika.svg") format("svg"); + font-weight: normal; + font-style: normal; +} +[class*=ss-]:before { + font-family: "SSPika"; + font-style: normal; + font-weight: normal; + text-decoration: none; + text-rendering: optimizeLegibility; + line-height: inherit; + -webkit-font-feature-settings: "liga"; + -moz-font-feature-settings: "liga=1"; + -moz-font-feature-settings: "liga"; + -ms-font-feature-settings: "liga" 1; + -o-font-feature-settings: "liga"; + font-feature-settings: "liga"; + -webkit-font-smoothing: antialiased; + vertical-align: middle; + font-size: 90%; + padding-right: 3px; +} +[class*=ss-]:after { + padding-left: 3px; +} +[class*=ss-] img { + display: none; +} + +[class*=ss-textfile]:before { + content: "\ec19"; +} + +[class*=ss-up]:before { + content: "⬆"; +} + +[class*=ss-check]:before { + content: "✓"; +} + +[class*=ss-right]:after, +[class*=ss-right-after]:after { + content: "➡"; +} + +[class*=ss-left]:before { + content: "⬅"; +} + +[class*=ss-navigateup]:before { + content: "\f500"; +} + +[class*=ss-navigateright]:after, +[class*=ss-navigateright-after]:after { + content: "▻"; +} + +[class*=ss-navigatedown]:before { + content: "\f501"; +} + +[class*=ss-navigateleft]:before { + content: "◅"; +} + +[class*=ss-dropdown]:before, +[class*=ss-dropdown-after]:after { + content: "▾"; +} + +[class*=ss-directright]:before, +[class*=ss-directright-after]:after { + content: "▹"; +} + +[class*=ss-directleft]:before { + content: "◃"; +} + +[class*=ss-leftright]:before, +[class*=ss-leftright-after]:after { + content: "⬌"; +} + +[class*=ss-search]:before { + content: "🔎"; +} + +[class*=ss-searchbook]:before { + content: "\e967"; +} + +[class*=ss-binoculars]:before { + content: "\e010"; +} + +[class*=ss-attach]:before { + content: "📎"; +} + +[class*=ss-move]:before { + content: "\e070"; +} + +[class*=ss-erase]:before { + content: "✐"; +} + +[class*=ss-write]:before, +[class*=ss-draw]:before { + content: "✏"; +} + +[class*=ss-lock]:before { + content: "🔒"; +} + +[class*=ss-unlock]:before { + content: "🔓"; +} + +[class*=ss-ban]:before { + content: "🚫"; +} + +[class*=ss-new]:before { + content: "🆕"; +} + +[class*=ss-tag]:before { + content: "\e100"; +} + +[class*=ss-flag]:before { + content: "⚑"; +} + +[class*=ss-star]:before { + content: "⋆"; +} + +[class*=ss-medal]:before { + content: "\e1c1"; +} + +[class*=ss-ribbon]:before { + content: "🎀"; +} + +[class*=ss-layers]:before { + content: "\e202"; +} + +[class*=ss-checkclipboard]:before { + content: "\e2b3"; +} + +[class*=ss-linechartclipboard]:before { + content: "\e2b5"; +} + +[class*=ss-cursor]:before { + content: "\e001"; +} + +[class*=ss-headset] { + content: "\e302"; +} + +[class*=ss-megaphone]:before { + content: "📢"; +} + +[class*=ss-rss]:before { + content: "\e310"; +} + +[class*=ss-replay]:before { + content: "↩"; +} + +[class*=ss-refresh]:before { + content: "↻"; +} + +[class*=ss-send]:before { + content: "\e350"; +} + +[class*=ss-mail]:before { + content: "✉"; +} + +[class*=ss-inbox]:before { + content: "📥"; +} + +[class*=ss-outbox]:before { + content: "📤"; +} + +[class*=ss-chat]:before { + content: "💬"; +} + +[class*=ss-user]:before { + content: "👤"; +} + +[class*=ss-users]:before { + content: "👥"; +} + +[class*=ss-femaleuser]:before { + content: "👧"; +} + +[class*=ss-usergroup]:before { + content: "\e400"; +} + +[class*=ss-adduser]:before { + content: "\e401"; +} + +[class*=ss-delete]:before { + content: "␡"; +} + +[class*=ss-deleteuser]:before { + content: "\e404"; +} + +[class*=ss-cart]:before { + content: "\e500"; +} + +[class*=ss-creditcard]:before { + content: "💳"; +} + +[class*=ss-dispensecash]:before { + content: "\e542"; +} + +[class*=ss-coins]:before { + content: "\e543"; +} + +[class*=ss-bankcheck]:before { + content: "\e544"; +} + +[class*=ss-piggybank]:before { + content: "\e545"; +} + +[class*=ss-moneybag]:before { + content: "💰"; +} + +[class*=ss-tip]:before { + content: "\e546"; +} + +[class*=ss-percent]:before { + content: "%"; +} + +[class*=ss-bank]:before { + content: "🏦"; +} + +[class*=ss-scales]:before { + content: "⚖"; +} + +[class*=ss-upwardsbarchart]:before { + content: "\e572"; +} + +[class*=ss-analytics]:before { + content: "\e575"; +} + +[class*=ss-upwardslinechart]:before { + content: "📈"; +} + +[class*=ss-stock]:before { + content: "\e579"; +} + +[class*=ss-form]:before { + content: "\e582"; +} + +[class*=ss-home]:before { + content: "⌂"; +} + +[class*=ss-earth]:before { + content: "🌎"; +} + +[class*=ss-location]:before { + content: "\e6d0"; +} + +[class*=ss-database]:before { + content: "\e7a0"; +} + +[class*=ss-camera]:before { + content: "📷"; +} + +[class*=ss-picture]:before { + content: "🌄"; +} + +[class*=ss-video]:before { + content: "📹"; +} + +[class*=ss-playvideo]:before { + content: "\e8a1"; +} + +[class*=ss-play]:before { + content: "▶"; +} + +[class*=ss-pause]:before { + content: "\e8a0"; +} + +[class*=ss-page]:before { + content: "\e903"; +} + +[class*=ss-notice]:before { + content: "\e973"; +} + +[class*=ss-rows]:before { + content: "\e9a1"; +} + +[class*=ss-columns]:before { + content: "\e9a2"; +} + +[class*=ss-thumbnails]:before { + content: "\e9a3"; +} + +[class*=ss-desktop]:before { + content: "💻"; +} + +[class*=ss-smartphone]:before { + content: "\ea02"; +} + +[class*=ss-upload]:before { + content: "\eb41"; +} + +[class*=ss-uploadcloud]:before { + content: "\eb40"; +} + +[class*=ss-merge]:before { + content: "\eb81"; +} + +[class*=ss-sync]:before { + content: "\eb82"; +} + +[class*=ss-file]:before { + content: "📄"; +} + +[class*=ss-download]:before { + content: "\eb01"; +} + +[class*=ss-downloadcloud]:before { + content: "\eb00"; +} + +[class*=ss-downloadbox]:before { + content: "\eb02"; +} + +[class*=ss-downloadfolder]:before { + content: "\ec76"; +} + +[class*=ss-importfile]:before { + content: "\ec08"; +} + +[class*=ss-exportfile]:before { + content: "\ec09"; +} + +[class*=ss-doc]:before { + content: "\ec32"; +} + +[class*=ss-folder]:before { + content: "📁"; +} + +[class*=ss-openfolder]:before { + content: "📂"; +} + +[class*=ss-lockfolder]:before { + content: "\ec81"; +} + +[class*=ss-picturefolder]:before { + content: "\ec87"; +} + +[class*=ss-moviefolder]:before { + content: "\ec88"; +} + +[class*=ss-print]:before { + content: "⎙"; +} + +[class*=ss-list]:before { + content: "\ed50"; +} + +[class*=ss-action]:before { + content: "\ee00"; +} + +[class*=ss-help]:before { + content: "❓"; +} + +[class*=ss-info]:before { + content: "ℹ"; +} + +[class*=ss-alert]:before { + content: "⚠"; +} + +[class*=ss-caution]:before { + content: "⛔"; +} + +[class*=ss-plus]:before { + content: "+"; +} + +[class*=ss-settings]:before { + content: "⚙"; +} + +[class*=ss-dashboard]:before { + content: "\f000"; +} + +[class*=ss-notifications]:before { + content: "🔔"; +} + +[class*=ss-notificationsdisabled]:before { + content: "🔕"; +} + +[class*=ss-clock]:before { + content: "⏲"; +} + +[class*=ss-calendar]:before { + content: "📅"; +} + +[class*=ss-addcalendar]:before { + content: "\f070"; +} + +[class*=ss-checkcalendar]:before { + content: "\f072"; +} + +[class*=ss-deletecalendar]:before { + content: "\f073"; +} + +[class*=ss-weathervane]:before { + content: "\f200"; +} + +[class*=ss-thermometer]:before { + content: "\f201"; +} + +[class*=ss-weather]:before { + content: "\f210"; +} + +[class*=ss-cloud]:before { + content: "☁"; +} + +[class*=ss-droplet]:before { + content: "💧"; +} + +[class*=ss-sun]:before { + content: "☀"; +} + +[class*=ss-partlycloudy]:before { + content: "⛅"; +} + +[class*=ss-rain]:before { + content: "☔"; +} + +[class*=ss-thunderstorm]:before { + content: "⛈"; +} + +[class*=ss-umbrella]:before { + content: "☂"; +} + +[class*=ss-rainbow]:before { + content: "🌈"; +} + +[class*=ss-fog]:before { + content: "\f211"; +} + +[class*=ss-wind]:before { + content: "\f212"; +} + +[class*=ss-tornado]:before { + content: "\f213"; +} + +[class*=ss-snowflake]:before { + content: "❄"; +} + +[class*=ss-share]:before { + content: "\f601"; +} + +[class*=ss-businessuser]:before { + content: "\e407"; +} + +[class*=ss-right]:after, +[class*=ss-right-after]:after, +[class*=ss-navigateright]:after, +[class*=ss-dropdown-after]:after, +[class*=ss-leftright-after]:after, +[class*=ss-directright-after]:after, +[class*=ss-navigateright-after]:after { + font-family: "SSPika"; + font-style: normal; + font-weight: normal; + text-decoration: none; + text-rendering: optimizeLegibility; + line-height: inherit; + -webkit-font-feature-settings: "liga"; + -moz-font-feature-settings: "liga=1"; + -moz-font-feature-settings: "liga"; + -ms-font-feature-settings: "liga" 1; + -o-font-feature-settings: "liga"; + font-feature-settings: "liga"; + -webkit-font-smoothing: antialiased; + vertical-align: middle; + font-size: 90%; +} +[class*=ss-right]:before, +[class*=ss-right-after]:before, +[class*=ss-navigateright]:before, +[class*=ss-dropdown-after]:before, +[class*=ss-leftright-after]:before, +[class*=ss-directright-after]:before, +[class*=ss-navigateright-after]:before { + display: none !important; +} + +html { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +*, *::before, *::after { + box-sizing: inherit; +} + +html, body, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, span, i, dl, dd, ol, ul, form, fieldset, legend, figure, table, th, td, caption, hr { + margin: 0; + padding: 0; +} + +img { + max-width: 100%; + height: auto; + border: none; +} + +::-webkit-input-placeholder { + color: #a7a7a7; +} + +:-moz-placeholder { /* Firefox 18- */ + color: #a7a7a7; +} + +::-moz-placeholder { /* Firefox 19+ */ + color: #a7a7a7; +} + +:-ms-input-placeholder { + color: #a7a7a7; +} + +body { + color: #383838; + font-family: "Open Sans", Helvetica, sans-serif; + font-size: 13px; + font-weight: normal; + font-style: normal; + font-variant: normal; + text-transform: none; + line-height: 1.5; + letter-spacing: -0.005em; +} + +b, +strong { + font-weight: 600; +} + +small { + color: #7a7a7a; + font-size: 12px; + line-height: 1.1851851852; + letter-spacing: -0.0044444444em; +} + +a { + color: #317ab7; + cursor: pointer; + text-decoration: none; + background: transparent; +} +a:hover { + color: #276292; +} +a:active, a:hover { + outline: 0; +} + +h1, h2, h3 { + font-family: "MuseoSansRounded700Regular", "Open Sans", Arial, sans-serif; + color: #1A6BAF; +} + +h4, h5, h6 { + font-family: "Open Sans", Helvetica, sans-serif; +} + +h1 { + font-size: 26px; + line-height: 1.5; + letter-spacing: -0.0101364326em; +} + +h2 { + font-size: 23px; + line-height: 1.5; + letter-spacing: -0.0090101624em; +} + +h3 { + font-size: 16px; + font-weight: 600; + line-height: 1.5; + letter-spacing: -0.006328125em; +} + +h4 { + font-size: 13px; + font-weight: 600; + line-height: 1.1851851852; + letter-spacing: -0.005em; +} + +h5 { + font-size: 12px; + font-weight: 600; + line-height: 1.1851851852; + letter-spacing: -0.0044444444em; +} + +h6 { + font-size: 12px; + font-weight: 400; + line-height: 1.1851851852; + letter-spacing: -0.0039506173em; +} + +.Avatar img { + border-radius: 50%; + width: 100%; + height: 100%; +} +.Avatar--xs { + width: 20px; + height: 20px; +} +.Avatar--sm { + width: 40px; + height: 40px; +} +.Avatar--md { + width: 80px; + height: 80px; +} +.Avatar--lg { + width: 120px; + height: 120px; +} +.Avatar--xl { + width: 160px; + height: 160px; +} +.Avatar--xxl { + width: 200px; + height: 200px; +} + +.Button { + background-color: #ffffff; + border: #d6d6d6 solid 1px; + border-bottom-width: 2px; + border-radius: 4px; + color: #383838; + cursor: pointer; + display: inline-block; + font-family: "Open Sans", Helvetica, sans-serif; + font-size: 13px; + font-weight: 600; + height: 32px; + line-height: 29px; + margin: 0; + padding: 0 16px; + text-decoration: none; + transition: all 250ms ease-in-out; + vertical-align: middle; + white-space: nowrap; +} +.Button:hover, .Button:active, .Button:focus { + background-color: #e6e6e6; + border-color: #c1c1c1; + color: #383838; + outline: none; +} +.Button.is-active { + background-color: #e6e6e6; + border-bottom-width: 1px; + border-top-width: 2px; + color: #383838; +} +.Button.is-disabled, .Button.is-disabled:hover, .Button.is-disabled:active, .Button:disabled, .Button:disabled:hover, .Button:disabled:active { + background-color: #ffffff; + border-color: #d6d6d6; + cursor: not-allowed; + color: #383838; + opacity: 0.4; +} + +.Button--primary { + background-color: #7fc243; + border-color: #669b36; + color: #ffffff; +} +.Button--primary:hover, .Button--primary:active, .Button--primary:focus { + background-color: #72af3c; + border-color: #5c8c31; + color: #ffffff; +} +.Button--primary.is-active { + background-color: #72af3c; + color: #ffffff; +} +.Button--primary.is-disabled, .Button--primary.is-disabled:hover, .Button--primary.is-disabled:active, .Button--primary:disabled, .Button--primary:disabled:hover, .Button--primary:disabled:active { + background-color: #7fc243; + border-color: #669b36; + color: #ffffff; +} + +.Button--blue { + background-color: #1A6BAF; + border-color: #15568c; + color: #ffffff; +} +.Button--blue:hover, .Button--blue:active, .Button--blue:focus { + background-color: #17609e; + border-color: #134d7e; + color: #ffffff; +} +.Button--blue.is-active { + background-color: #17609e; + color: #ffffff; +} +.Button--blue.is-disabled, .Button--blue.is-disabled:hover, .Button--blue.is-disabled:active, .Button--blue:disabled, .Button--blue:disabled:hover, .Button--blue:disabled:active { + background-color: #1A6BAF; + border-color: #15568c; + color: #ffffff; +} + +.Button--orange { + background-color: #FF8F00; + border-color: #cc7200; + color: #ffffff; +} +.Button--orange:hover, .Button--orange:active, .Button--orange:focus { + background-color: #e68100; + border-color: #b86700; + color: #ffffff; +} +.Button--orange.is-active { + background-color: #e68100; + color: #ffffff; +} +.Button--orange.is-disabled, .Button--orange.is-disabled:hover, .Button--orange.is-disabled:active, .Button--orange:disabled, .Button--orange:disabled:hover, .Button--orange:disabled:active { + background-color: #FF8F00; + border-color: #cc7200; + color: #ffffff; +} + +.Button--negative { + background-color: #ffffff; + border-color: #d6d6d6; + color: #e26362; +} +.Button--negative:hover, .Button--negative:active, .Button--negative:focus { + background-color: #e26362; + border-color: #b54f4e; + color: #ffffff; +} +.Button--negative.is-active { + background-color: #e26362; + border-color: #b54f4e; + color: #ffffff; +} +.Button--negative.is-disabled, .Button--negative.is-disabled:hover, .Button--negative.is-disabled:active, .Button--negative:disabled, .Button--negative:disabled:hover, .Button--negative:disabled:active { + background-color: #ffffff; + border-color: #d6d6d6; + color: #e26362; +} + +.Button--small { + font-size: 12px; + height: 24px; + line-height: 21px; + padding: 0 8px; +} + +.Button--smallSquare { + width: 24px; + height: 24px; + line-height: 21px; + padding: 0; + border-bottom-width: 1px; +} + +.Button--large { + font-size: 16px; + height: 40px; + line-height: 37px; + padding: 0 24px; +} + +.Button--huge { + font-size: 16px; + height: 80px; + line-height: 77px; + padding: 0 64px; +} + +.Button--yesDefault.is-active, +.Button--yesDefault:hover, +.Button--yes { + background-color: #7fc243; + color: #ffffff; + border-color: #72af3c; +} + +.Button--yes:hover, .Button--yes:active, .Button--yes:focus, .Button--yes.is-active { + background-color: #72af3c; + color: #ffffff; + border-color: #669b36; +} + +.Button--maybeDefault.is-active, +.Button--maybeDefault:hover, +.Button--maybe { + background-color: #13426E; + color: #ffffff; + border-color: #113b63; +} + +.Button--maybe:hover, .Button--maybe:active, .Button--maybe:focus, .Button--maybe.is-active { + background-color: #113b63; + color: #ffffff; + border-color: #0f3558; +} + +.Button--noDefault.is-active, +.Button--noDefault:hover, +.Button--no { + background-color: #e26362; + color: #ffffff; + border-color: #cb5958; +} + +.Button--no:hover, .Button--no:active, .Button--no:focus, .Button--no.is-active { + background-color: #cb5958; + color: #ffffff; + border-color: #b54f4e; +} + +.ButtonGroup { + display: flex; + display: -ms-flexbox; +} + +.ButtonGroup > .Button + .Button { + margin-left: -1px; +} + +.ButtonGroup > .Button { + border-radius: 0; +} + +.ButtonGroup > .Button:first-child { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} + +.ButtonGroup > .Button:last-child { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.Checkbox { + position: relative; + padding-bottom: 16px; +} +.Checkbox .Checkbox-input { + height: 16px; + width: 16px; +} +.Checkbox .Checkbox-label { + padding-left: 24px; + min-height: 16px; + line-height: 16px; +} +.Checkbox .Checkbox-label:before { + height: 16px; + width: 16px; +} +.Checkbox.Checkbox--pill .Checkbox-label { + padding-left: 32px; +} +.Checkbox.Checkbox--pill .Checkbox-label:before { + top: 50%; + margin-top: -8px; +} +.Checkbox.Checkbox--radio .Checkbox-label:before { + box-shadow: inset 0 0 0 16px #fff; +} +.Checkbox.Checkbox--radio .Checkbox-input:checked:not(:disabled) + .Checkbox-label:before { + box-shadow: inset 0 0 0 3px #fff; +} +.Checkbox .Checkbox-input:checked + .Checkbox-label:before { + background-color: #7fc243; +} +.Checkbox .Checkbox-input:not(:disabled) + .Checkbox-label:hover:before, .Checkbox .Checkbox-input:not(:disabled) + .Checkbox-label:focus:before, .Checkbox .Checkbox-input:not(:disabled):hover + .Checkbox-label:before, .Checkbox .Checkbox-input:not(:disabled):focus + .Checkbox-label:before { + border-color: #7fc243; +} +.Checkbox .Checkbox-input:disabled:checked + .Checkbox-label:before { + background-color: #7fc243; +} +.Checkbox.Checkbox--radio .Checkbox-input:checked:not(:disabled) + .Checkbox-label:before { + border-color: #7fc243; +} +.Checkbox.Checkbox--pill .Checkbox-label:hover, .Checkbox.Checkbox--pill .Checkbox-label:focus { + border-color: #7fc243; +} +.Checkbox.Checkbox--pill .Checkbox-input:checked + .Checkbox-label { + border-color: #7fc243; + background-color: #f9fcf6; +} +.Checkbox.Checkbox--pill input[type=checkbox] + .Checkbox-label { + border-radius: 8px; +} + +.Checkbox-input { + opacity: 0; + cursor: pointer; + z-index: 5; + position: absolute; + left: 0; + top: 0; + bottom: 0; + margin: 0; +} + +.Checkbox-label { + position: relative; + display: block; + cursor: pointer; +} +.Checkbox-label:before { + content: ""; + display: block; + cursor: pointer; + background-color: #ffffff; + border: 1px solid #d6d6d6; + border-radius: 2px; + margin: 0; + position: absolute; + left: 0; + top: 0; + bottom: 0; + transition: all ease 0.2s; + background-size: 75%; + background-repeat: no-repeat; + background-position: center center; +} + +.Checkbox-input:checked + .Checkbox-label:before { + background-image: url("data:image/svg+xml; utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 960 960'%3E%3Cpath fill='white' d='M915 178.9c8 6.7 12.3 15.5 13 26.5s-2.3 21.2-9 30.5c-252.7 360.7-389.3 555.3-410 584-21.3 28.7-48.8 43.2-82.5 43.5S365 849.2 343 819.9l-278-391c-6.7-9.3-9.7-19.7-9-31s5-20.3 13-27c34-29.3 72-55.7 114-79 8.7-4.7 18.3-5.3 29-2s19.3 9.7 26 19l188 264 321-456c6.7-9.3 15.2-15.5 25.5-18.5s20.2-2.2 29.5 2.5c44 24 81.7 50 113 78z'%3E%3C/path%3E%3C/svg%3E"); + border: none; +} + +.Checkbox-input:disabled, .Checkbox-input:disabled:before, +.Checkbox-input:disabled + .Checkbox-label, +.Checkbox-input:disabled + .Checkbox-label:before { + cursor: not-allowed; +} +.Checkbox-input:disabled:before, +.Checkbox-input:disabled + .Checkbox-label:before { + background-image: url("data:image/svg+xml; utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 960 960'%3E%3Cpath fill='white' d='M829,500.82V843.87A58.74,58.74,0,0,1,813.63,884a69.15,69.15,0,0,1-37.18,22.31A1302.73,1302.73,0,0,1,480,940q-154.67,0-299.43-33.71A63.46,63.46,0,0,1,131,843.87V503.8a76.16,76.16,0,0,1,17.85-49.57q17.85-21.81,43.63-21.81h33.71V273.77q0-114,69.9-183.92T480,20q114,0,183.92,69.9t69.9,183.92V432.41h30.74q25.78,0,45.11,20.82T829,500.82ZM384.82,432.41H575.18V273.77q0-95.18-95.18-95.18t-95.18,95.18Z'%3E%3C/path%3E%3C/svg%3E"); + background-color: #d6d6d6; + border: none; +} + +.Checkbox--radio .Checkbox-label:before { + border-radius: 50%; + background-image: none; +} +.Checkbox--radio .Checkbox-input:checked:not(:disabled) + .Checkbox-label:before { + border-style: solid; + border-width: 1px; + background-image: none; +} +.Checkbox--radio .Checkbox-input:disabled + .Checkbox-label:before { + box-shadow: none; +} + +.Checkbox--inline { + display: inline-block; + padding-bottom: 0; +} +.Checkbox--inline + .Checkbox--inline { + margin-left: 4px; + padding-left: 8px; + border-left: 1px solid #d6d6d6; +} +.Checkbox--inline + .Checkbox--inline .Checkbox-input { + left: 8px; +} + +.Checkbox--pill .Checkbox-label { + border: solid 1px #d6d6d6; + border-radius: 32px; + padding: 8px; + transition: all ease 0.2s; +} +.Checkbox--pill .Checkbox-label:before { + left: 8px; +} + +.Checkbox--large .Checkbox-input { + height: 22px; + width: 22px; +} +.Checkbox--large .Checkbox-label { + padding-left: 30px; + min-height: 22px; + line-height: 22px; +} +.Checkbox--large .Checkbox-label:before { + height: 22px; + width: 22px; +} +.Checkbox--large.Checkbox--pill .Checkbox-label { + padding-left: 38px; +} +.Checkbox--large.Checkbox--pill .Checkbox-label:before { + top: 50%; + margin-top: -11px; +} +.Checkbox--large.Checkbox--radio .Checkbox-label:before { + box-shadow: inset 0 0 0 22px #fff; +} +.Checkbox--large.Checkbox--radio .Checkbox-input:checked:not(:disabled) + .Checkbox-label:before { + box-shadow: inset 0 0 0 4px #fff; +} + +.Checkbox--colorPrimary .Checkbox-input:checked + .Checkbox-label:before { + background-color: #1A6BAF; +} +.Checkbox--colorPrimary .Checkbox-input:not(:disabled) + .Checkbox-label:hover:before, .Checkbox--colorPrimary .Checkbox-input:not(:disabled) + .Checkbox-label:focus:before, .Checkbox--colorPrimary .Checkbox-input:not(:disabled):hover + .Checkbox-label:before, .Checkbox--colorPrimary .Checkbox-input:not(:disabled):focus + .Checkbox-label:before { + border-color: #1A6BAF; +} +.Checkbox--colorPrimary .Checkbox-input:disabled:checked + .Checkbox-label:before { + background-color: #1A6BAF; +} +.Checkbox--colorPrimary.Checkbox--radio .Checkbox-input:checked:not(:disabled) + .Checkbox-label:before { + border-color: #1A6BAF; +} +.Checkbox--colorPrimary.Checkbox--pill .Checkbox-label:hover, .Checkbox--colorPrimary.Checkbox--pill .Checkbox-label:focus { + border-color: #1A6BAF; +} +.Checkbox--colorPrimary.Checkbox--pill .Checkbox-input:checked + .Checkbox-label { + border-color: #1A6BAF; + background-color: #f4f8fb; +} +.Checkbox--colorPrimary.Checkbox--pill input[type=checkbox] + .Checkbox-label { + border-radius: 8px; +} + +.DayPicker-Day:not(.DayPicker-Day--outside):hover { + background-color: rgba(122, 122, 122, 0.2); +} +.DayPicker-Day:not(.DayPicker-Day--outside).DayPicker-Day--event { + border-color: #76a6cf; +} +.DayPicker-Day:not(.DayPicker-Day--outside).DayPicker-Day--game { + background: #1A6BAF; + color: #ffffff; +} + +legend.game:before { + background-color: #1A6BAF; +} + +legend.event:before { + border-color: #76a6cf; +} + +.Divider { + border: none; + border-top: 1px solid #d6d6d6; + background: transparent; + color: transparent; + margin: 8px 0; +} + +.Divider--indented { + border-bottom: 1px solid #ffffff; +} + +.Divider--thick { + border-top-width: 4px; +} + +.Divider--space { + border: none; + margin: 0; + padding: 16px; +} + +.Feedback { + position: relative; + width: 100%; + border: 1px solid #1A6BAF; + border-radius: 4px; + margin: 8px 0; + padding: 8px; + background: #ffffff; + padding-left: 48px; + overflow: hidden; +} + +.Feedback-icon { + width: 40px; + background: #1A6BAF; + position: absolute; + top: 0; + left: 0; + height: 100%; + padding: 8px; + color: #ffffff; +} + +.Feedback-title { + font-weight: 700; + display: block; +} + +.Feedback-dismiss { + box-sizing: content-box; + font-size: 16px; + width: 16px; + height: 100%; + padding: 0 8px; + position: absolute; + top: 0; + right: 0; + color: #d6d6d6; + cursor: pointer; +} +.Feedback-dismiss:hover { + color: #7a7a7a; +} + +.Feedback-icon .Icon, +.Feedback-dismiss .Icon { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; +} + +.Feedback--positive { + border-color: #7fc243; +} +.Feedback--positive .Feedback-icon { + background: #7fc243; +} + +.Feedback--negative { + border-color: #e26362; +} +.Feedback--negative .Feedback-icon { + background: #e26362; +} +.Feedback--negative .Feedback-dismiss { + color: #b54f4e; +} + +.Feedback--highlight { + border-color: #FF8F00; +} +.Feedback--highlight .Feedback-icon { + background: #FF8F00; +} +.Feedback--highlight .Feedback-dismiss { + color: #ff8f00; +} + +.Feedback--disabled { + border-color: #e6e6e6; +} +.Feedback--disabled .Feedback-icon { + background: #e6e6e6; + color: #1A6BAF; +} + +.Feedback--dismissible { + padding-right: 32px; +} + +.Feedback--popup { + position: fixed; + top: -100%; + width: calc(100% - 32px); + max-width: 400px; + right: 16px; + box-shadow: 0 0 8px rgba(56, 56, 56, 0.35); + transition: top 250ms; + z-index: 9999; +} +.Feedback--popup.js-active { + top: 16px; + transition: top 250ms; +} + +.FieldGroup { + margin-bottom: 16px; + position: relative; +} + +.FieldGroup-label { + display: block; + padding-bottom: 4px; + font-size: 13px; + font-weight: 600; +} + +.FieldGroup-message { + color: #7a7a7a; + font-size: 13px; + padding-top: 4px; + margin-bottom: 0; +} + +.FieldGroup-message--error { + color: #e26362; +} + +.FieldGroup-validation { + display: none; + color: #7fc243; + position: absolute; + top: 0; + left: 0; +} + +.FieldGroup.is-notValid .Input, .FieldGroup.is-notValid .Checkbox-label:before, .FieldGroup.is-notValid .SelectBox-options, .FieldGroup.is-notValid textarea, .FieldGroup.is-notValid .Checkbox--pill .Checkbox-label { + border-color: #e26362; +} + +.FieldGroup.is-valid .FieldGroup-validation { + display: block; +} +.FieldGroup.is-valid .FieldGroup-label { + padding-left: 16px; +} + +.Grid { + box-sizing: border-box; + display: flex; + flex-flow: row wrap; + margin: 0; + padding: 0; + width: 100%; +} + +.Grid--alignCenter { + justify-content: center; +} + +.Grid--alignMiddle { + align-items: center; +} + +.Grid--fit > .Grid-cell { + flex: 1 1 0%; +} + +.Grid--equalHeight > .Grid-cell { + display: flex; +} + +.Grid--withGutter { + margin: 0 -8px; + width: calc(100% + 16px); +} + +.Grid--withGutter > .Grid-cell { + padding: 0 8px; +} + +.Grid-cell { + box-sizing: inherit; + flex-basis: 100%; + min-width: 0; +} + +.Grid-cell--center { + margin: 0 auto; +} + +.Icon { + position: relative; + margin: 0; + display: inline-block; + width: 1em; + height: 1em; + font-size: 1em; + vertical-align: middle; + top: -1px; + fill: currentColor; +} + +.Icon--loader { + animation: rotator 1.4s linear infinite; + fill: none; + stroke: currentColor; +} +.Icon--loader circle { + stroke-dasharray: 130; + stroke-dashoffset: 0; + transform-origin: center; + animation: dash 1.4s ease-in-out infinite; +} + +@keyframes rotator { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(270deg); + } +} +@keyframes dash { + 0% { + stroke-dashoffset: 130; + } + 50% { + stroke-dashoffset: 32.5; + transform: rotate(135deg); + } + 100% { + stroke-dashoffset: 130; + transform: rotate(450deg); + } +} +.Input { + cursor: text; + color: #383838; + display: block; + width: 100%; + height: 32px; + line-height: 30px; + padding: 0 8px; + box-sizing: border-box; + box-shadow: none; + background-color: #ffffff; + border: 1px solid #d6d6d6; + border-radius: 4px; + font-family: inherit; + font-size: 13px; + transition: all ease 0.2s; +} +.Input:disabled { + background: #fbfbfb; + color: #d6d6d6; + cursor: not-allowed; +} +.Input:focus { + outline: none; + border-color: #1A6BAF; +} +.Input::-ms-clear { + display: none; +} + +input:-webkit-autofill, +input:-webkit-autofill:hover, +input:-webkit-autofill:focus { + -webkit-box-shadow: 0 0 0px 1000px #ffffff inset; + -webkit-text-fill-color: #383838; +} + +.Input--large { + font-size: 16px; + height: 40px; + line-height: 40px; +} + +.Input--showHide { + padding-right: 56px; +} + +.Input-showHideButton { + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); + width: 56px; + height: 100%; + background-color: transparent; + border: none; + color: #7a7a7a; + border-radius: 0 4px 4px 0; + font-size: 13px; + font-weight: normal; + font-family: inherit; + line-height: 1; + padding: 8px; + transition: all ease 200ms; + cursor: pointer; +} + +.Input-showHideButton:hover { + background-color: transparent; + color: #383838; +} + +.Input-showHideButton:focus { + outline: none; + border: solid 1px #1A6BAF; + background-color: transparent; + color: #383838; +} + +.InputGroup { + position: relative; +} + +.InputGroup-icon { + position: absolute; + top: 0; + bottom: 0; + margin: auto; + width: 32px; + height: 24px; + line-height: 24px; + text-align: center; + z-index: 5; +} + +.InputGroup--iconButton .InputGroup-icon { + border: none; + background-color: inherit; +} + +.InputGroup--leftIcon .Input { + padding-left: 40px; +} +.InputGroup--leftIcon .InputGroup-icon { + left: 0; + border-right: 1px solid #e6e6e6; +} + +.InputGroup--rightIcon .Input { + padding-right: 40px; +} +.InputGroup--rightIcon .InputGroup-icon { + right: 0; + border-left: 1px solid #e6e6e6; +} + +.JelloAnimation { + display: inline-block; + position: relative; + height: 40px; + width: 40px; +} + +.JelloAnimation-box { + width: 32px; + height: 32px; + background: #FF8F00; + animation: jelloBoxAnimation 500ms linear infinite; + position: absolute; + top: 0; + left: 0; + border-radius: 2px; +} + +.JelloAnimation-shadow { + width: 32px; + height: 4px; + background: #e6e6e6; + position: absolute; + bottom: -4px; + left: 0; + border-radius: 50%; + animation: jelloShadowAnimation 500ms linear infinite; +} + +@keyframes jelloBoxAnimation { + 17% { + border-bottom-right-radius: 2px; + } + 25% { + transform: translateY(8px) rotate(22.5deg); + } + 50% { + border-bottom-right-radius: 32px; + transform: translateY(16px) scale(1, 0.9) rotate(45deg); + } + 75% { + transform: translateY(8px) rotate(67.5deg); + } + 100% { + transform: translateY(0) rotate(90deg); + } +} +@keyframes jelloShadowAnimation { + 50% { + transform: scale(1.2, 1); + } +} +.PulseAnimation-dot { + display: inline-block; + width: 8px; + height: 8px; + background-color: #7a7a7a; + border-radius: 100%; + animation: PulseAnimation 1.5s infinite ease-in-out both; +} + +.PulseAnimation-dot:nth-child(1) { + animation-delay: -500ms; +} + +.PulseAnimation-dot:nth-child(2) { + animation-delay: -250ms; +} + +@keyframes PulseAnimation { + 0%, 80%, 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} +.SpinAnimation { + display: inline-block; + width: 24px; + height: 24px; + border-radius: 50%; + vertical-align: middle; + margin: 4px; + border-top: solid 2px #383838; + border-right: solid 2px transparent; + box-shadow: 0 0 0 1px #7a7a7a; + animation: SpinAnimation 1s linear infinite; +} + +@keyframes SpinAnimation { + 0% { + transform: rotate(0deg); + } + 50% { + transform: rotate(180deg); + } + 100% { + transform: rotate(360deg); + } +} +.Loader { + display: block; + text-align: center; + padding: 8px 0; +} + +.Loader-indicator { + position: relative; + height: 32px; + margin-bottom: 8px; + display: flex; + justify-content: center; +} + +.Loader-indicatorText { + font-size: 16px; + font-weight: 700; + line-height: 32px; + color: #383838; + padding-left: 4px; +} + +.Loader-message { + display: block; + padding: 16px 0; + font-size: 16px; + color: #7a7a7a; +} + +.Loader--jello .Loader-indicator { + height: 48px; +} +.Loader--jello .Loader-indicatorText { + line-height: 40px; + color: #7a7a7a; + font-weight: 400; +} +.Loader--jello .Loader-message { + font-size: 23px; + font-weight: 600; +} + +.Loader--fixedCenter { + position: fixed; + left: 0; + top: 50%; + transform: translateY(-50%); + width: 100%; +} + +.Modal { + display: none; + position: fixed; + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; + background-color: rgba(34, 34, 34, 0.5); + z-index: 1000; + justify-content: center; + align-items: center; +} +.Modal.is-open, .Modal.is-active { + display: flex; +} +.Modal.is-closing { + animation: overlayOut 300ms cubic-bezier(0.2, 0.8, 0.4, 1) forwards; +} + +.Modal-content { + max-height: 100vh; + overflow-y: auto; + width: 100%; + max-width: 600px; + background-color: #ffffff; + border-radius: 8px; + animation: modalIn 300ms cubic-bezier(0.2, 0.8, 0.4, 1) forwards; + box-shadow: 0 0 8px rgba(56, 56, 56, 0.35); + border: 8px solid #f7f7f7; + padding: 24px; +} + +.Modal-header { + text-align: center; + padding-bottom: 24px; +} + +.Modal-iconDismiss { + box-sizing: content-box; + color: #d6d6d6; + position: absolute; + padding: 8px; + height: 16px; + width: 16px; + top: 0; + right: 0; + cursor: pointer; +} +.Modal-iconDismiss:hover { + color: #ababab; +} + +.Modal-title { + padding: 0; + margin: 0; + font-size: 23px; + color: #1A6BAF; + font-family: "MuseoSansRounded700Regular", "Open Sans", Arial, sans-serif; +} + +.Modal-footer { + margin-top: 32px; + text-align: center; +} + +.Modal-bgDismiss { + height: 100%; + width: 100%; + position: absolute; +} + +@keyframes modalIn { + 0% { + transform: scale(0.7); + } + 100% { + transform: scale(1); + } +} +@keyframes overlayOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +.PaginateItem { + background: #ffffff; +} + +.PaginateItemIsActive { + background: #e6e6e6; + border-top-width: 2px; + border-bottom-width: 1px; + pointer-events: none; +} + +.PaginateItemIsDisabled { + pointer-events: none; + color: #7a7a7a; + background: #f7f7f7; +} + +.Panel { + padding: 0; + background: #ffffff; + color: #383838; + margin-bottom: 16px; + border: 1px solid #d6d6d6; + border-radius: 8px; + box-sizing: border-box; +} + +.Panel-body { + padding: 0; +} + +.Panel-body:first-child .Panel-row:first-child .Panel-cell:first-child { + border-top-left-radius: 8px; +} + +.Panel-body:first-child .Panel-row:first-child .Panel-cell:last-child { + border-top-right-radius: 8px; +} + +.Panel-body:last-child .Panel-row:last-child .Panel-cell:first-child { + border-bottom-left-radius: 8px; +} + +.Panel-body:last-child .Panel-row:last-child .Panel-cell:last-child { + border-bottom-right-radius: 8px; +} + +.Panel-header, +.Panel-footer, +.Panel-row { + max-width: none; +} + +.Panel-header, +.Panel-footer, +.Panel-row, +.Panel-cell { + padding: 16px; +} + +.Panel-header { + border-bottom: 1px solid #d6d6d6; + display: flex; + align-items: center; +} + +.Panel-header--withImage { + border-bottom: none; + display: block; + padding: 0; +} +.Panel-header--withImage .Panel-title { + padding: 16px; + padding-bottom: 0; +} + +.Panel-headerImage { + border-top-right-radius: 7px; + border-top-left-radius: 7px; + border-bottom: 1px solid #d6d6d6; + overflow: hidden; + max-height: 200px; +} +.Panel-headerImage img { + vertical-align: top; + width: 100%; +} + +.Panel-title { + color: #383838; + font-family: "Open Sans", Helvetica, sans-serif; + font-size: 13px; + font-weight: 700; + flex: 1 1 0%; + padding: 0; + margin: 0; +} + +.Panel-row:not(:last-child) { + border-bottom: 1px solid #e6e6e6; +} + +.Panel-row--withCells { + display: flex; + padding: 0; +} + +.Panel-row--header { + background-color: #fbfbfb; + border-bottom: solid 1px #e6e6e6; + font-weight: 600; +} + +.Panel-cell { + flex: 1 1 0%; + word-break: break-word; +} + +.Panel-cell--header { + background-color: #fbfbfb; + border-right: solid 1px #e6e6e6; + font-weight: 600; +} + +.Panel-footer { + border-top: 1px solid #d6d6d6; + text-align: right; +} + +.Panel--striped .Panel-row:nth-child(even) { + background-color: #fbfbfb; +} + +@media (max-width: 479px) { + .Panel--xxsMax-stacked .Panel-row { + flex-wrap: wrap; + border-bottom: 0; + } + .Panel--xxsMax-stacked .Panel-cell { + flex-basis: auto; + width: 100%; + } + .Panel--xxsMax-stacked .Panel-cell--header { + border-right: 0; + padding-bottom: 0; + background-color: inherit; + } + .Panel--xxsMax-stacked .Panel-cell--header + .Panel-cell { + padding-top: 8px; + } + .Panel--xxsMax-stacked .Panel-body:first-child .Panel-row:first-child .Panel-cell:last-child, + .Panel--xxsMax-stacked .Panel-body:last-child .Panel-row:last-child .Panel-cell:first-child { + border-radius: 0; + } + .Panel--xxsMax-stacked .Panel-body:first-child .Panel-row:first-child .Panel-cell:first-child { + border-top-right-radius: 8px; + } + .Panel--xxsMax-stacked .Panel-body:last-child .Panel-row:last-child .Panel-cell:last-child { + border-bottom-left-radius: 8px; + } +} +@media (max-width: 767px) { + .Panel--xsMax-stacked .Panel-row { + flex-wrap: wrap; + border-bottom: 0; + } + .Panel--xsMax-stacked .Panel-cell { + flex-basis: auto; + width: 100%; + } + .Panel--xsMax-stacked .Panel-cell--header { + border-right: 0; + padding-bottom: 0; + background-color: inherit; + } + .Panel--xsMax-stacked .Panel-cell--header + .Panel-cell { + padding-top: 8px; + } + .Panel--xsMax-stacked .Panel-body:first-child .Panel-row:first-child .Panel-cell:last-child, + .Panel--xsMax-stacked .Panel-body:last-child .Panel-row:last-child .Panel-cell:first-child { + border-radius: 0; + } + .Panel--xsMax-stacked .Panel-body:first-child .Panel-row:first-child .Panel-cell:first-child { + border-top-right-radius: 8px; + } + .Panel--xsMax-stacked .Panel-body:last-child .Panel-row:last-child .Panel-cell:last-child { + border-bottom-left-radius: 8px; + } +} +@media (max-width: 991px) { + .Panel--smMax-stacked .Panel-row { + flex-wrap: wrap; + border-bottom: 0; + } + .Panel--smMax-stacked .Panel-cell { + flex-basis: auto; + width: 100%; + } + .Panel--smMax-stacked .Panel-cell--header { + border-right: 0; + padding-bottom: 0; + background-color: inherit; + } + .Panel--smMax-stacked .Panel-cell--header + .Panel-cell { + padding-top: 8px; + } + .Panel--smMax-stacked .Panel-body:first-child .Panel-row:first-child .Panel-cell:last-child, + .Panel--smMax-stacked .Panel-body:last-child .Panel-row:last-child .Panel-cell:first-child { + border-radius: 0; + } + .Panel--smMax-stacked .Panel-body:first-child .Panel-row:first-child .Panel-cell:first-child { + border-top-right-radius: 8px; + } + .Panel--smMax-stacked .Panel-body:last-child .Panel-row:last-child .Panel-cell:last-child { + border-bottom-left-radius: 8px; + } +} +@media (max-width: 1199px) { + .Panel--mdMax-stacked .Panel-row { + flex-wrap: wrap; + border-bottom: 0; + } + .Panel--mdMax-stacked .Panel-cell { + flex-basis: auto; + width: 100%; + } + .Panel--mdMax-stacked .Panel-cell--header { + border-right: 0; + padding-bottom: 0; + background-color: inherit; + } + .Panel--mdMax-stacked .Panel-cell--header + .Panel-cell { + padding-top: 8px; + } + .Panel--mdMax-stacked .Panel-body:first-child .Panel-row:first-child .Panel-cell:last-child, + .Panel--mdMax-stacked .Panel-body:last-child .Panel-row:last-child .Panel-cell:first-child { + border-radius: 0; + } + .Panel--mdMax-stacked .Panel-body:first-child .Panel-row:first-child .Panel-cell:first-child { + border-top-right-radius: 8px; + } + .Panel--mdMax-stacked .Panel-body:last-child .Panel-row:last-child .Panel-cell:last-child { + border-bottom-left-radius: 8px; + } +} +.Panel .Panel-row--parent { + border-bottom: none; +} + +.Panel-expandableControlIcon { + padding-right: 4px; +} +.Panel-expandableControlIcon .Icon { + font-size: 10px; +} + +.Panel-expandableControl.is-expanded { + color: #FF8F00; + padding-right: 4px; +} +.Panel-expandableControl.is-expanded .Icon { + transform: rotate(90deg); +} + +.Panel-childRows { + background: #fbfbfb; + height: 0; + overflow: hidden; +} +.Panel-childRows .Panel-row { + border: none; +} +.Panel-childRows .Panel-cell { + font-size: 12px; + color: #7a7a7a; + padding-top: 8px; + padding-bottom: 8px; +} +.Panel-childRows .Panel-row:first-child .Panel-cell { + padding-top: 16px; +} +.Panel-childRows .Panel-row:last-child .Panel-cell { + padding-bottom: 16px; +} +.Panel-childRows.is-expanded { + height: auto; + border-top: 1px solid #e6e6e6; +} + +.Panel-expandableRow:not(:last-child) .Panel-childRows { + border-top: 1px solid #e6e6e6; +} +.Panel-expandableRow:not(:last-child) .Panel-childRows.is-expanded { + border-bottom: 1px solid #FF8F00; +} + +.Popup { + position: relative; + display: inline-block; +} + +.Popup-container { + position: absolute; + bottom: calc(100% + 10px); + left: 50%; + transform: translateX(-50%); + z-index: 100; + width: 250px; + display: none; +} + +.Popup-container.is-open { + display: block; +} + +.Popup-container::before, +.Popup-container::after { + content: ""; + position: absolute; + left: 50%; + transform: translateX(-50%) rotate(45deg); + width: 12px; + height: 12px; + background-color: #ffffff; + border-radius: 3px 0 3px 0; + animation: popInArrow 75ms cubic-bezier(0.2, 0.8, 0.4, 1) forwards; +} + +.Popup-container::before { + top: calc( 100% - 6px ); + border: solid #d6d6d6 1px; + box-shadow: 0 0 2px rgba(56, 56, 56, 0.15); +} + +.Popup-container::after { + top: calc( 100% - 7px ); +} + +.Popup-content { + background-color: #ffffff; + color: #383838; + border: solid #d6d6d6 1px; + border-radius: 4px; + box-shadow: 0 0 2px rgba(56, 56, 56, 0.15); + animation: popIn 75ms cubic-bezier(0.2, 0.8, 0.4, 1) forwards; +} + +.Popup-container--overlay { + bottom: 50%; + transform: translateX(-50%) translateY(50%); +} +.Popup-container--overlay::before, .Popup-container--overlay::after { + display: none; +} + +.Popup-container--down { + bottom: auto; + top: calc(100% + 10px); +} +.Popup-container--down::before { + top: -6px; +} +.Popup-container--down::after { + top: -5px; +} + +.Popup-container--left { + left: 0; + transform: none; +} +.Popup-container--left::before, .Popup-container--left::after { + left: 24px; + transform: translateX(0) rotate(45deg); +} + +.Popup-container--leftHang { + left: -24px; + transform: none; +} +.Popup-container--leftHang::before, .Popup-container--leftHang::after { + left: 32px; + transform: translateX(0) rotate(45deg); +} + +.Popup-container--right { + left: auto; + right: 0; + transform: none; +} +.Popup-container--right::before, .Popup-container--right::after { + left: auto; + right: 24px; + transform: translateX(0) rotate(45deg); +} + +.Popup-container--rightHang { + left: auto; + right: -24px; + transform: none; +} +.Popup-container--rightHang::before, .Popup-container--rightHang::after { + left: auto; + right: 32px; + transform: translateX(0) rotate(45deg); +} + +.Popup--hover .Popup-content:before { + content: ""; + position: absolute; + display: block; +} + +.Popup-content:before { + height: 16px; + width: 100%; + left: 0; + top: 100%; +} +.Popup-container--down .Popup-content:before { + top: auto; + bottom: 100%; +} + +.Popup--hover:hover .Popup-container, +.Popup--hover:focus .Popup-container, +.Popup--hover:focus-within .Popup-container { + display: block; +} + +@keyframes popIn { + 0% { + opacity: 0; + transform: scale3d(0.7, 0.7, 0.7); + } + 100% { + opacity: 1; + transform: scale3d(1, 1, 1); + } +} +@keyframes popInArrow { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +.ProgressBar { + height: 8px; + background: #f7f7f7; + box-shadow: inset 0 0 2px rgba(56, 56, 56, 0.15); + overflow: hidden; +} + +.ProgressBar-status { + background: #7fc243; + height: 100%; + width: auto; +} + +.ProgressBar, +.ProgressBar-status { + border-radius: 4px; +} + +.ProgressBar--xsmall { + height: 2px; +} +.ProgressBar--xsmall, .ProgressBar--xsmall .ProgressBar-status { + border-radius: 1px; +} + +.ProgressBar--small { + height: 4px; +} +.ProgressBar--small, .ProgressBar--small .ProgressBar-status { + border-radius: 2px; +} + +.ProgressBar--large { + height: 16px; +} +.ProgressBar--large, .ProgressBar--large .ProgressBar-status { + border-radius: 8px; +} + +.ProgressBar--xlarge { + height: 24px; +} +.ProgressBar--xlarge, .ProgressBar--xlarge .ProgressBar-status { + border-radius: 12px; +} + +.ProgressBar--vertical { + height: 100%; + width: 32px; + position: relative; +} +.ProgressBar--vertical .ProgressBar-status { + height: auto; + width: 100%; + position: absolute; + bottom: 0; + left: 0; +} +.ProgressBar--vertical, .ProgressBar--vertical .ProgressBar-status { + border-radius: 20px; +} + +.ProgressBar--vertical.ProgressBar--xsmall { + width: 16px; +} +.ProgressBar--vertical.ProgressBar--xsmall, .ProgressBar--vertical.ProgressBar--xsmall .ProgressBar-status { + border-radius: 8px; +} +.ProgressBar--vertical.ProgressBar--small { + width: 24px; +} +.ProgressBar--vertical.ProgressBar--small, .ProgressBar--vertical.ProgressBar--small .ProgressBar-status { + border-radius: 12px; +} +.ProgressBar--vertical.ProgressBar--large { + width: 48px; +} +.ProgressBar--vertical.ProgressBar--large, .ProgressBar--vertical.ProgressBar--large .ProgressBar-status { + border-radius: 24px; +} +.ProgressBar--vertical.ProgressBar--xlarge { + width: 64px; +} +.ProgressBar--vertical.ProgressBar--xlarge, .ProgressBar--vertical.ProgressBar--xlarge .ProgressBar-status { + border-radius: 32px; +} + +.ProgressBar--precise .ProgressBar-status { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.ProgressBar--precise.ProgressBar--vertical .ProgressBar-status { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.RadialProgress { + position: relative; + display: block; + background: #f7f7f7; + border-radius: 50%; + height: 80px; + width: 80px; +} +.RadialProgress:before, .RadialProgress:after { + content: ""; + border-radius: 50%; + display: block; + z-index: 5; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; +} +.RadialProgress:before { + width: 100%; + height: 100%; + box-shadow: 1px 1px 1px rgba(56, 56, 56, 0.15) inset; +} +.RadialProgress:after { + width: 60%; + height: 60%; + box-shadow: 0 0 2px rgba(56, 56, 56, 0.15); + background: #ffffff; +} + +.RadialProgress-circle { + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 100%; + clip: rect(0, 80px, 80px, 40px); +} + +.RadialProgress .RadialProgress-circle.whole { + clip: rect(auto, auto, auto, auto); +} + +.RadialProgress-status { + position: absolute; + top: 0; + left: 0; + border-radius: 50%; + background: transparent; + clip: rect(0, 40px, 80px, 0); + border-width: 40px; + border-style: solid; + border-color: #7fc243; +} + +.RadialProgress--xsmall { + height: 32px; + width: 32px; +} +.RadialProgress--xsmall .RadialProgress-circle { + clip: rect(0, 32px, 32px, 16px); +} +.RadialProgress--xsmall .RadialProgress-status { + clip: rect(0, 16px, 32px, 0); + border-width: 16px; +} + +.RadialProgress--small { + height: 48px; + width: 48px; +} +.RadialProgress--small .RadialProgress-circle { + clip: rect(0, 48px, 48px, 24px); +} +.RadialProgress--small .RadialProgress-status { + clip: rect(0, 24px, 48px, 0); + border-width: 24px; +} + +.RadialProgress--large { + height: 112px; + width: 112px; +} +.RadialProgress--large .RadialProgress-circle { + clip: rect(0, 112px, 112px, 56px); +} +.RadialProgress--large .RadialProgress-status { + clip: rect(0, 56px, 112px, 0); + border-width: 56px; +} + +.RadialProgress--xlarge { + height: 160px; + width: 160px; +} +.RadialProgress--xlarge .RadialProgress-circle { + clip: rect(0, 160px, 160px, 80px); +} +.RadialProgress--xlarge .RadialProgress-status { + clip: rect(0, 80px, 160px, 0); + border-width: 80px; +} + +.ProgressBar--neutral .ProgressBar-status { + background: #7a7a7a; +} + +.ProgressBar--negative .ProgressBar-status { + background: #e26362; +} + +.ProgressBar--highlight .ProgressBar-status { + background: #FF8F00; +} + +.RadialProgress--neutral .RadialProgress-status { + border-color: #7a7a7a; +} + +.RadialProgress--negative .RadialProgress-status { + border-color: #e26362; +} + +.RadialProgress--highlight .RadialProgress-status { + border-color: #FF8F00; +} + +.SelectBox { + position: relative; + display: inline-block; + width: 100%; +} +.SelectBox:after { + font-family: "SSPika"; + font-style: normal; + font-weight: normal; + text-decoration: none; + text-rendering: optimizeLegibility; + line-height: inherit; + -webkit-font-feature-settings: "liga"; + -moz-font-feature-settings: "liga=1"; + -moz-font-feature-settings: "liga"; + -ms-font-feature-settings: "liga" 1; + -o-font-feature-settings: "liga"; + font-feature-settings: "liga"; + -webkit-font-smoothing: antialiased; + vertical-align: middle; + font-size: 87.5%; + content: "▾"; + position: absolute; + top: 0; + bottom: 0; + right: 0; + margin: auto; + width: 32px; + color: #afafaf; + font-size: 10px; + height: 24px; + line-height: 28px; + text-align: center; + border-left: 1px solid #e6e6e6; + pointer-events: none; +} + +.SelectBox-options { + height: 32px; + width: 100%; + line-height: 32px; + padding-right: 40px; + padding-left: 8px; + color: #383838; + background-color: #ffffff; + font-family: "Open Sans", Helvetica, sans-serif; + border-radius: 4px; + border: 1px solid #d6d6d6; + cursor: pointer; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.SelectBox-options::-ms-expand { + display: none; +} +.SelectBox-options:focus { + border-color: #1A6BAF; + outline: none; +} +.SelectBox-options:disabled, .SelectBox-options.is-disabled { + color: #e6e6e6; + cursor: not-allowed; +} + +.SelectBox-text { + display: none; +} + +.SelectBox--large .SelectBox-options { + font-size: 16px; + height: 40px; + line-height: 40px; +} + +.StepNav { + padding-bottom: 24px; +} + +.StepNav-steps { + padding-left: 64px; +} + +.StepNav-step:before { + width: calc(100% - 64px); + height: 4px; + top: 28px; + right: 64px; +} +.StepNav-step.is-active .StepNav-stepIcon, .StepNav-step.is-enabled a:hover .StepNav-stepIcon { + box-shadow: 0 0 2px #15568c inset; +} +.StepNav-step.is-enabled a:hover .StepNav-stepIcon { + box-shadow: 0 0 2px #15568c inset; +} + +.StepNav-stepLink { + padding: 0 4px; +} + +.StepNav-stepTitle { + width: 150px; + left: calc( 0px - 43px); + padding-top: 4px; +} + +.StepNav-stepIcon { + font-size: 22.4px; + border-width: 4px; + height: 56px; + width: 56px; + border-radius: 28px; + padding: 14px; +} + +.StepNav-steps { + position: relative; + padding-bottom: 4px; + display: flex; +} + +.StepNav-step { + position: relative; + list-style: none; + display: block; + padding: 0; + flex: auto; +} +.StepNav-step:before { + content: ""; + display: block; + position: absolute; + background: #d6d6d6; +} +.StepNav-step:first-child { + position: absolute; + left: 0; + top: 0; +} +.StepNav-step:first-child .StepNav-stepLink { + float: left; +} +.StepNav-step:first-child:before { + display: none; +} +.StepNav-step.is-enabled .StepNav-stepIcon, +.StepNav-step.is-enabled .StepNav-stepTitle { + color: #1A6BAF; + transition: color 0.35s ease-in-out; +} +.StepNav-step.is-enabled .StepNav-stepIcon { + border-color: #1A6BAF; + transition: border-color 0.35s ease-in-out; +} +.StepNav-step.is-enabled:before { + background-color: #1A6BAF; + transition: background-color 0.35s ease-in-out; +} +.StepNav-step.is-active .StepNav-stepIcon, .StepNav-step.is-enabled .StepNav-stepLink:hover .StepNav-stepIcon { + color: #ffffff; + border-color: #d6d6d6; + background-color: #1A6BAF; +} +.StepNav-step.is-enabled .StepNav-stepLink:hover .StepNav-stepIcon { + color: #ffffff; + border-color: #d6d6d6; + background-color: #1A6BAF; +} + +.StepNav-stepLink { + float: right; + position: relative; + z-index: 10; + color: #d6d6d6; +} + +.StepNav-stepTitle { + display: block; + text-align: center; + margin: 0 auto; + color: #d6d6d6; + font-family: "Open Sans", Helvetica, sans-serif; + font-size: 13px; + position: absolute; + top: 100%; +} + +.StepNav-stepIcon { + background: #fff; + box-sizing: content-box; + line-height: 1; + display: inline-block; + box-sizing: border-box; + vertical-align: middle; + text-align: center; + font-weight: bold; + border-style: solid; + border-color: #d6d6d6; +} + +.StepNav--small .StepNav-steps { + padding-left: 44px; +} +.StepNav--small .StepNav-step:before { + width: calc(100% - 44px); + height: 2px; + top: 20px; + right: 44px; +} +.StepNav--small .StepNav-step.is-active .StepNav-stepIcon, .StepNav--small .StepNav-step.is-enabled a:hover .StepNav-stepIcon { + box-shadow: 0 0 1px #15568c inset; +} +.StepNav--small .StepNav-step.is-enabled a:hover .StepNav-stepIcon { + box-shadow: 0 0 1px #15568c inset; +} +.StepNav--small .StepNav-stepLink { + padding: 0 2px; +} +.StepNav--small .StepNav-stepTitle { + width: 150px; + left: calc( 0px - 53px); + padding-top: 2px; +} +.StepNav--small .StepNav-stepIcon { + font-size: 16px; + border-width: 2px; + height: 40px; + width: 40px; + border-radius: 20px; + padding: 10px; +} +.StepNav--small .StepNav-stepTitle { + display: none; +} + +.StepNav--xsmall .StepNav-steps { + padding-left: 26px; +} +.StepNav--xsmall .StepNav-step:before { + width: calc(100% - 26px); + height: 1px; + top: 12px; + right: 26px; +} +.StepNav--xsmall .StepNav-step.is-active .StepNav-stepIcon, .StepNav--xsmall .StepNav-step.is-enabled a:hover .StepNav-stepIcon { + box-shadow: 0 0 0.5px #15568c inset; +} +.StepNav--xsmall .StepNav-step.is-enabled a:hover .StepNav-stepIcon { + box-shadow: 0 0 0.5px #15568c inset; +} +.StepNav--xsmall .StepNav-stepLink { + padding: 0 1px; +} +.StepNav--xsmall .StepNav-stepTitle { + width: 150px; + left: calc( 0px - 62px); + padding-top: 1px; +} +.StepNav--xsmall .StepNav-stepIcon { + font-size: 9.6px; + border-width: 1px; + height: 24px; + width: 24px; + border-radius: 12px; + padding: 6px; +} +.StepNav--xsmall .StepNav-stepTitle { + display: none; +} + +.StepNav--titled:after { + content: ""; + display: block; + clear: both; +} +.StepNav--titled .StepNav-title, +.StepNav--titled .StepNav-steps { + float: left; +} +.StepNav--titled .StepNav-title { + width: 55%; +} +.StepNav--titled .StepNav-steps { + width: 45%; +} +.StepNav--titled .StepNav-step:first-child:before { + display: block; +} + +.StepNav-title { + overflow: hidden; +} + +.StepNav-titleText { + position: relative; + margin: 0; + padding-right: 8px; + display: inline-block; + line-height: 56px; +} +.StepNav-titleText:before { + content: ""; + position: absolute; + top: 28px; + left: 100%; + height: 4px; + width: 1000%; + background: #1A6BAF; +} + +.SummaryList-heading { + color: #383838; + font-size: 13px; + display: flex; + justify-content: space-between; + margin-bottom: 4px; +} + +.SummaryList-section { + border-top: 2px solid #d6d6d6; + padding: 8px 0; + list-style-type: none; +} + +.SummaryList-item { + display: flex; + width: 100%; + height: 30px; + align-items: center; +} +.SummaryList-item--footer { + margin: 8px 0; + padding-top: 8px; + border-top: 1px solid #d6d6d6; + font-weight: 700; +} +.SummaryList-item span:last-child { + display: flex; + flex-grow: 1; +} +.SummaryList-item span:last-child:before { + content: " "; + flex-grow: 1; + margin: 0 4px 4px; + border-bottom: 1px dotted #d6d6d6; + width: 10%; +} + +.SummaryList--no-heading .SummaryList-section { + border-top: 1px solid #d6d6d6; + border-bottom: 1px solid #d6d6d6; +} + +.SummaryList-footer h3 { + padding-top: 8px; + border-top: 1px solid #d6d6d6; + display: flex; + justify-content: flex-end; + color: #7a7a7a; + font-family: "Open Sans", Helvetica, sans-serif; + font-weight: 700; +} +.SummaryList-footer h3 span { + color: #13426E; + margin-left: 8px; +} + +.Tabs-header { + border-bottom: 4px solid #d6d6d6; + padding: 0; + margin-bottom: 16px; +} + +.Tabs-headerItem { + list-style: none; + display: inline-block; + position: relative; + cursor: pointer; + color: #7a7a7a; + font-family: "Open Sans", Helvetica, sans-serif; + font-weight: 600; +} +.Tabs-headerItem, .Tabs-headerItem:last-child { + padding: 4px 24px; +} +.Tabs-headerItem:after { + content: ""; + display: block; + width: 100%; + height: 4px; + position: absolute; + left: 0; + bottom: -4px; + background: transparent; +} +.Tabs-headerItem.is-active, .Tabs-headerItem:hover { + color: #1A6BAF; +} +.Tabs-headerItem.is-active:after { + background: #1A6BAF; +} + +.Tabs-contentItem { + display: none; +} + +.Tabs-contentItem.is-active { + display: block; +} + +.Toggle { + position: relative; + display: inline-block; +} + +.Toggle-input { + cursor: pointer; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + opacity: 0; + z-index: 5; +} + +.Toggle-label { + padding: 2px; + text-align: right; + position: relative; + display: inline-block; + color: #ffffff; + font-size: 12px; + box-sizing: content-box; + height: 16px; + width: 40px; + line-height: 16px; + border-radius: 16px; + background-color: #e26362; + box-shadow: 0 0 2px #b54f4e inset; +} +.Toggle-label:hover { + color: #ffffff; +} +.Toggle-label:before { + content: "off"; + padding-right: 4px; + display: inline-block; +} +.Toggle-label:after { + content: ""; + display: block; + height: 16px; + width: 16px; + border-radius: 16px; + background: #ffffff; + position: absolute; + top: 2px; + left: 2px; + right: auto; +} + +.Toggle-input:checked + .Toggle-label { + background-color: #7fc243; + box-shadow: 0 0 2px #669b36 inset; + text-align: left; +} +.Toggle-input:checked + .Toggle-label:before { + content: "on"; + padding-left: 4px; + display: inline-block; +} +.Toggle-input:checked + .Toggle-label:after { + left: auto; + right: 2px; +} + +.Tooltip { + position: relative; + cursor: pointer; +} +.Tooltip:after { + content: attr(data-tooltip); + display: none; + position: absolute; + top: 100%; + left: 0; + z-index: 9999; + margin-top: 2px; + width: 200px; + padding: 16px; + border-radius: 8px; + border-top-left-radius: 0; + border: 1px solid #e6e6e6; + background: #fbfbfb; + box-shadow: 0 0 2px rgba(56, 56, 56, 0.15); + font-style: normal; + font-size: 13px; + font-weight: 400; + white-space: normal; + text-align: left; + color: #383838; +} +.Tooltip:hover:after, .Tooltip:focus:after { + display: block; +} + +.Tooltip--text, +.Tooltip--icon { + color: #317ab7; +} + +.Tooltip--text { + text-decoration: underline; +} + +.u-border { + border: 1px solid #e6e6e6; +} + +.u-borderNone { + border: 0; +} + +.u-borderRight { + border-right: 1px solid #e6e6e6; +} + +.u-borderRightNone { + border-right: 0; +} + +.u-borderLeft { + border-left: 1px solid #e6e6e6; +} + +.u-borderLeftNone { + border-left: 0; +} + +.u-borderBottom { + border-bottom: 1px solid #e6e6e6; +} + +.u-borderBottomNone { + border-bottom: 0; +} + +.u-borderTop { + border-top: 1px solid #e6e6e6; +} + +.u-borderTopNone { + border-top: 0; +} + +@media (min-width: 480px) { + .u-xs-border { + border: 1px solid #e6e6e6; + } + .u-xs-borderNone { + border: 0; + } + .u-xs-borderRight { + border-right: 1px solid #e6e6e6; + } + .u-xs-borderRightNone { + border-right: 0; + } + .u-xs-borderLeft { + border-left: 1px solid #e6e6e6; + } + .u-xs-borderLeftNone { + border-left: 0; + } + .u-xs-borderBottom { + border-bottom: 1px solid #e6e6e6; + } + .u-xs-borderBottomNone { + border-bottom: 0; + } + .u-xs-borderTop { + border-top: 1px solid #e6e6e6; + } + .u-xs-borderTopNone { + border-top: 0; + } +} +@media (min-width: 768px) { + .u-sm-border { + border: 1px solid #e6e6e6; + } + .u-sm-borderNone { + border: 0; + } + .u-sm-borderRight { + border-right: 1px solid #e6e6e6; + } + .u-sm-borderRightNone { + border-right: 0; + } + .u-sm-borderLeft { + border-left: 1px solid #e6e6e6; + } + .u-sm-borderLeftNone { + border-left: 0; + } + .u-sm-borderBottom { + border-bottom: 1px solid #e6e6e6; + } + .u-sm-borderBottomNone { + border-bottom: 0; + } + .u-sm-borderTop { + border-top: 1px solid #e6e6e6; + } + .u-sm-borderTopNone { + border-top: 0; + } +} +@media (min-width: 992px) { + .u-md-border { + border: 1px solid #e6e6e6; + } + .u-md-borderNone { + border: 0; + } + .u-md-borderRight { + border-right: 1px solid #e6e6e6; + } + .u-md-borderRightNone { + border-right: 0; + } + .u-md-borderLeft { + border-left: 1px solid #e6e6e6; + } + .u-md-borderLeftNone { + border-left: 0; + } + .u-md-borderBottom { + border-bottom: 1px solid #e6e6e6; + } + .u-md-borderBottomNone { + border-bottom: 0; + } + .u-md-borderTop { + border-top: 1px solid #e6e6e6; + } + .u-md-borderTopNone { + border-top: 0; + } +} +@media (min-width: 1200px) { + .u-lg-border { + border: 1px solid #e6e6e6; + } + .u-lg-borderNone { + border: 0; + } + .u-lg-borderRight { + border-right: 1px solid #e6e6e6; + } + .u-lg-borderRightNone { + border-right: 0; + } + .u-lg-borderLeft { + border-left: 1px solid #e6e6e6; + } + .u-lg-borderLeftNone { + border-left: 0; + } + .u-lg-borderBottom { + border-bottom: 1px solid #e6e6e6; + } + .u-lg-borderBottomNone { + border-bottom: 0; + } + .u-lg-borderTop { + border-top: 1px solid #e6e6e6; + } + .u-lg-borderTopNone { + border-top: 0; + } +} +.u-borderRadiusNone { + border-radius: 0 !important; +} + +.u-borderRadiusSm { + border-radius: 2px !important; +} + +.u-borderRadiusMd { + border-radius: 4px !important; +} + +.u-borderRadiusLg { + border-radius: 8px !important; +} + +@media (min-width: 480px) { + .u-xs-borderRadiusNone { + border-radius: 0 !important; + } + .u-xs-borderRadiusSm { + border-radius: 2px !important; + } + .u-xs-borderRadiusMd { + border-radius: 4px !important; + } + .u-xs-borderRadiusLg { + border-radius: 8px !important; + } +} +@media (min-width: 768px) { + .u-sm-borderRadiusNone { + border-radius: 0 !important; + } + .u-sm-borderRadiusSm { + border-radius: 2px !important; + } + .u-sm-borderRadiusMd { + border-radius: 4px !important; + } + .u-sm-borderRadiusLg { + border-radius: 8px !important; + } +} +@media (min-width: 992px) { + .u-md-borderRadiusNone { + border-radius: 0 !important; + } + .u-md-borderRadiusSm { + border-radius: 2px !important; + } + .u-md-borderRadiusMd { + border-radius: 4px !important; + } + .u-md-borderRadiusLg { + border-radius: 8px !important; + } +} +@media (min-width: 1200px) { + .u-lg-borderRadiusNone { + border-radius: 0 !important; + } + .u-lg-borderRadiusSm { + border-radius: 2px !important; + } + .u-lg-borderRadiusMd { + border-radius: 4px !important; + } + .u-lg-borderRadiusLg { + border-radius: 8px !important; + } +} +.u-borderColorDefault { + border-color: #d6d6d6 !important; +} + +.u-borderColorLight { + border-color: #e6e6e6 !important; +} + +.u-borderColorPrimary { + border-color: #1A6BAF !important; +} + +.u-borderColorHighlight { + border-color: #FF8F00 !important; +} + +.u-borderColorPositive { + border-color: #7fc243 !important; +} + +.u-borderColorNegative { + border-color: #e26362 !important; +} + +.u-colorPositive { + color: #7fc243 !important; +} + +.u-colorNegative { + color: #e26362 !important; +} + +.u-colorPrimary { + color: #1A6BAF !important; +} + +.u-colorSecondary { + color: #7fc243 !important; +} + +.u-colorInfo { + color: #383838 !important; +} + +.u-colorGrey { + color: #7a7a7a !important; +} + +.u-colorHighlight { + color: #FF8F00 !important; +} + +.u-colorForeground { + color: #ffffff !important; +} + +.u-linkNegative { + color: #e26362 !important; +} +.u-linkNegative:hover, .u-linkNegative:active { + color: #cb5958 !important; +} + +.u-linkCascade * { + color: #317ab7 !important; +} +.u-linkCascade *:hover, .u-linkCascade *:active { + color: #276292 !important; +} + +.u-bgPositive { + background-color: #7fc243 !important; +} + +.u-bgNegative { + background-color: #e26362 !important; +} + +.u-bgPrimary { + background-color: #1A6BAF !important; +} + +.u-bgSecondary { + background-color: #7fc243 !important; +} + +.u-bgHighlight { + background-color: #FF8F00 !important; +} + +.u-bgLinkLight { + background-color: #d6e4f1 !important; +} + +.u-bgForeground { + background-color: #ffffff !important; +} + +.u-bgMiddleground { + background-color: #fbfbfb !important; +} + +.u-bgBackground { + background-color: #f7f7f7 !important; +} + +@media (min-width: 480px) { + .u-xs-bgForeground { + background-color: #ffffff !important; + } +} +.u-flex { + display: flex !important; +} + +.u-block { + display: block !important; +} + +.u-hidden { + display: none !important; +} + +.u-hiddenVisually { + border: 0 !important; + clip: rect(1px, 1px, 1px, 1px) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; +} + +.u-inline { + display: inline !important; +} + +.u-inlineBlock { + display: inline-block !important; + max-width: 100%; +} + +.u-overflowHidden { + overflow: hidden !important; +} + +@media (min-width: 480px) { + .u-xs-flex { + display: flex !important; + } + .u-xs-block { + display: block !important; + } + .u-xs-hidden { + display: none !important; + } + .u-xs-hiddenVisually { + border: 0 !important; + clip: rect(1px, 1px, 1px, 1px) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + } + .u-xs-inline { + display: inline !important; + } + .u-xs-inlineBlock { + display: inline-block !important; + max-width: 100%; + } + .u-xs-overflowHidden { + overflow: hidden !important; + } +} +@media (min-width: 768px) { + .u-sm-flex { + display: flex !important; + } + .u-sm-block { + display: block !important; + } + .u-sm-hidden { + display: none !important; + } + .u-sm-hiddenVisually { + border: 0 !important; + clip: rect(1px, 1px, 1px, 1px) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + } + .u-sm-inline { + display: inline !important; + } + .u-sm-inlineBlock { + display: inline-block !important; + max-width: 100%; + } + .u-sm-overflowHidden { + overflow: hidden !important; + } +} +@media (min-width: 992px) { + .u-md-flex { + display: flex !important; + } + .u-md-block { + display: block !important; + } + .u-md-hidden { + display: none !important; + } + .u-md-hiddenVisually { + border: 0 !important; + clip: rect(1px, 1px, 1px, 1px) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + } + .u-md-inline { + display: inline !important; + } + .u-md-inlineBlock { + display: inline-block !important; + max-width: 100%; + } + .u-md-overflowHidden { + overflow: hidden !important; + } +} +@media (min-width: 1200px) { + .u-lg-flex { + display: flex !important; + } + .u-lg-block { + display: block !important; + } + .u-lg-hidden { + display: none !important; + } + .u-lg-hiddenVisually { + border: 0 !important; + clip: rect(1px, 1px, 1px, 1px) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + } + .u-lg-inline { + display: inline !important; + } + .u-lg-inlineBlock { + display: inline-block !important; + max-width: 100%; + } + .u-lg-overflowHidden { + overflow: hidden !important; + } +} +.u-flexInline { + display: inline-flex !important; +} + +.u-flexRow { + flex-direction: row !important; +} + +.u-flexRowReverse { + flex-direction: row-reverse !important; +} + +.u-flexCol { + flex-direction: column !important; +} + +.u-flexColReverse { + flex-direction: column-reverse !important; +} + +.u-flexWrap { + flex-wrap: wrap !important; +} + +.u-flexNoWrap { + flex-wrap: nowrap !important; +} + +.u-flexWrapReverse { + flex-wrap: wrap-reverse !important; +} + +.u-flexJustifyStart { + justify-content: flex-start !important; +} + +.u-flexJustifyEnd { + justify-content: flex-end !important; +} + +.u-flexJustifyCenter { + justify-content: center !important; +} + +.u-flexJustifyBetween { + justify-content: space-between !important; +} + +.u-flexJustifyAround { + justify-content: space-around !important; +} + +.u-flexAlignItemsStart { + align-items: flex-start !important; +} + +.u-flexAlignItemsEnd { + align-items: flex-end !important; +} + +.u-flexAlignItemsCenter { + align-items: center !important; +} + +.u-flexAlignItemsStretch { + align-items: stretch !important; +} + +.u-flexAlignItemsBaseline { + align-items: baseline !important; +} + +.u-flexAlignContentStart { + align-content: flex-start !important; +} + +.u-flexAlignContentEnd { + align-content: flex-end !important; +} + +.u-flexAlignContentCenter { + align-content: center !important; +} + +.u-flexAlignContentStretch { + align-content: stretch !important; +} + +.u-flexAlignContentBetween { + align-content: space-between !important; +} + +.u-flexAlignContentAround { + align-content: space-around !important; +} + +.u-flexAlignSelfStart { + align-self: flex-start !important; +} + +.u-flexAlignSelfEnd { + align-self: flex-end !important; +} + +.u-flexAlignSelfCenter { + align-self: center !important; +} + +.u-flexAlignSelfStretch { + align-self: stretch !important; +} + +.u-flexAlignSelfBaseline { + align-self: baseline !important; +} + +.u-flexAlignSelfAuto { + align-self: auto !important; +} + +.u-flexOrderFirst { + order: -1 !important; +} + +.u-flexOrderLast { + order: 1 !important; +} + +.u-flexOrderNone { + order: 0 !important; +} + +.u-flexGrow1 { + flex: 1 1 0% !important; +} + +.u-flexGrow0 { + flex: 0 1 0% !important; +} + +.u-flexShrink0 { + flex-shrink: 0 !important; +} + +.u-flexShrink1 { + flex-shrink: 1 !important; +} + +.u-flexExpand { + margin: auto !important; +} + +.u-flexExpandLeft { + margin-left: auto !important; +} + +.u-flexExpandRight { + margin-right: auto !important; +} + +.u-flexExpandSides { + margin-left: auto !important; + margin-right: auto !important; +} + +.u-flexExpandTop { + margin-top: auto !important; +} + +.u-flexExpandBottom { + margin-bottom: auto !important; +} + +.u-flexBasisAuto { + flex-basis: auto !important; +} + +.u-flexBasis0 { + flex-basis: 0 !important; +} + +.u-flexInitial { + flex: 0 1 auto !important; + flex-basis: auto !important; +} + +.u-flexAuto { + flex: 1 1 auto !important; + flex-basis: auto !important; +} + +.u-flexNone { + flex: 0 0 auto !important; + flex-basis: auto !important; +} + +.u-maxWidthXs { + max-width: 480px !important; +} + +.u-maxWidthSm { + max-width: 768px !important; +} + +.u-maxWidthMd { + max-width: 992px !important; +} + +.u-maxWidthLg { + max-width: 1200px !important; +} + +.u-maxWidthXl { + max-width: 1300px !important; +} + +.u-posRelative { + position: relative !important; +} + +.u-posAbsolute { + position: absolute !important; +} + +.u-size1of2 { + flex-basis: auto !important; + width: 50% !important; +} + +.u-size1of3 { + flex-basis: auto !important; + width: 33.3333333333% !important; +} + +.u-size2of3 { + flex-basis: auto !important; + width: 66.6666666667% !important; +} + +.u-size1of4 { + flex-basis: auto !important; + width: 25% !important; +} + +.u-size2of4 { + flex-basis: auto !important; + width: 50% !important; +} + +.u-size3of4 { + flex-basis: auto !important; + width: 75% !important; +} + +.u-size1of6 { + flex-basis: auto !important; + width: 16.6666666667% !important; +} + +.u-size2of6 { + flex-basis: auto !important; + width: 33.3333333333% !important; +} + +.u-size3of6 { + flex-basis: auto !important; + width: 50% !important; +} + +.u-size4of6 { + flex-basis: auto !important; + width: 66.6666666667% !important; +} + +.u-size5of6 { + flex-basis: auto !important; + width: 83.3333333333% !important; +} + +.u-size1of8 { + flex-basis: auto !important; + width: 12.5% !important; +} + +.u-size2of8 { + flex-basis: auto !important; + width: 25% !important; +} + +.u-size3of8 { + flex-basis: auto !important; + width: 37.5% !important; +} + +.u-size4of8 { + flex-basis: auto !important; + width: 50% !important; +} + +.u-size5of8 { + flex-basis: auto !important; + width: 62.5% !important; +} + +.u-size6of8 { + flex-basis: auto !important; + width: 75% !important; +} + +.u-size7of8 { + flex-basis: auto !important; + width: 87.5% !important; +} + +.u-size1of12 { + flex-basis: auto !important; + width: 8.3333333333% !important; +} + +.u-size2of12 { + flex-basis: auto !important; + width: 16.6666666667% !important; +} + +.u-size3of12 { + flex-basis: auto !important; + width: 25% !important; +} + +.u-size4of12 { + flex-basis: auto !important; + width: 33.3333333333% !important; +} + +.u-size5of12 { + flex-basis: auto !important; + width: 41.6666666667% !important; +} + +.u-size6of12 { + flex-basis: auto !important; + width: 50% !important; +} + +.u-size7of12 { + flex-basis: auto !important; + width: 58.3333333333% !important; +} + +.u-size8of12 { + flex-basis: auto !important; + width: 66.6666666667% !important; +} + +.u-size9of12 { + flex-basis: auto !important; + width: 75% !important; +} + +.u-size10of12 { + flex-basis: auto !important; + width: 83.3333333333% !important; +} + +.u-size11of12 { + flex-basis: auto !important; + width: 91.6666666667% !important; +} + +.u-size1of24 { + flex-basis: auto !important; + width: 4.1666666667% !important; +} + +.u-size2of24 { + flex-basis: auto !important; + width: 8.3333333333% !important; +} + +.u-size3of24 { + flex-basis: auto !important; + width: 12.5% !important; +} + +.u-size4of24 { + flex-basis: auto !important; + width: 16.6666666667% !important; +} + +.u-size5of24 { + flex-basis: auto !important; + width: 20.8333333333% !important; +} + +.u-size6of24 { + flex-basis: auto !important; + width: 25% !important; +} + +.u-size7of24 { + flex-basis: auto !important; + width: 29.1666666667% !important; +} + +.u-size8of24 { + flex-basis: auto !important; + width: 33.3333333333% !important; +} + +.u-size9of24 { + flex-basis: auto !important; + width: 37.5% !important; +} + +.u-size10of24 { + flex-basis: auto !important; + width: 41.6666666667% !important; +} + +.u-size11of24 { + flex-basis: auto !important; + width: 45.8333333333% !important; +} + +.u-size12of24 { + flex-basis: auto !important; + width: 50% !important; +} + +.u-size13of24 { + flex-basis: auto !important; + width: 54.1666666667% !important; +} + +.u-size14of24 { + flex-basis: auto !important; + width: 58.3333333333% !important; +} + +.u-size15of24 { + flex-basis: auto !important; + width: 62.5% !important; +} + +.u-size16of24 { + flex-basis: auto !important; + width: 66.6666666667% !important; +} + +.u-size17of24 { + flex-basis: auto !important; + width: 70.8333333333% !important; +} + +.u-size18of24 { + flex-basis: auto !important; + width: 75% !important; +} + +.u-size19of24 { + flex-basis: auto !important; + width: 79.1666666667% !important; +} + +.u-size20of24 { + flex-basis: auto !important; + width: 83.3333333333% !important; +} + +.u-size21of24 { + flex-basis: auto !important; + width: 87.5% !important; +} + +.u-size22of24 { + flex-basis: auto !important; + width: 91.6666666667% !important; +} + +.u-size23of24 { + flex-basis: auto !important; + width: 95.8333333333% !important; +} + +.u-sizeFit { + flex-basis: auto !important; + width: auto !important; +} + +.u-sizeFill { + flex: 1 1 0% !important; + flex-basis: 0% !important; +} + +.u-sizeFull, .u-size1of1 { + flex-basis: auto !important; + width: 100% !important; +} + +@media (min-width: 480px) { + .u-xs-size1of2 { + flex-basis: auto !important; + width: 50% !important; + } + .u-xs-size1of3 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-xs-size2of3 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-xs-size1of4 { + flex-basis: auto !important; + width: 25% !important; + } + .u-xs-size2of4 { + flex-basis: auto !important; + width: 50% !important; + } + .u-xs-size3of4 { + flex-basis: auto !important; + width: 75% !important; + } + .u-xs-size1of6 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-xs-size2of6 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-xs-size3of6 { + flex-basis: auto !important; + width: 50% !important; + } + .u-xs-size4of6 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-xs-size5of6 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-xs-size1of8 { + flex-basis: auto !important; + width: 12.5% !important; + } + .u-xs-size2of8 { + flex-basis: auto !important; + width: 25% !important; + } + .u-xs-size3of8 { + flex-basis: auto !important; + width: 37.5% !important; + } + .u-xs-size4of8 { + flex-basis: auto !important; + width: 50% !important; + } + .u-xs-size5of8 { + flex-basis: auto !important; + width: 62.5% !important; + } + .u-xs-size6of8 { + flex-basis: auto !important; + width: 75% !important; + } + .u-xs-size7of8 { + flex-basis: auto !important; + width: 87.5% !important; + } + .u-xs-size1of12 { + flex-basis: auto !important; + width: 8.3333333333% !important; + } + .u-xs-size2of12 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-xs-size3of12 { + flex-basis: auto !important; + width: 25% !important; + } + .u-xs-size4of12 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-xs-size5of12 { + flex-basis: auto !important; + width: 41.6666666667% !important; + } + .u-xs-size6of12 { + flex-basis: auto !important; + width: 50% !important; + } + .u-xs-size7of12 { + flex-basis: auto !important; + width: 58.3333333333% !important; + } + .u-xs-size8of12 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-xs-size9of12 { + flex-basis: auto !important; + width: 75% !important; + } + .u-xs-size10of12 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-xs-size11of12 { + flex-basis: auto !important; + width: 91.6666666667% !important; + } + .u-xs-size1of24 { + flex-basis: auto !important; + width: 4.1666666667% !important; + } + .u-xs-size2of24 { + flex-basis: auto !important; + width: 8.3333333333% !important; + } + .u-xs-size3of24 { + flex-basis: auto !important; + width: 12.5% !important; + } + .u-xs-size4of24 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-xs-size5of24 { + flex-basis: auto !important; + width: 20.8333333333% !important; + } + .u-xs-size6of24 { + flex-basis: auto !important; + width: 25% !important; + } + .u-xs-size7of24 { + flex-basis: auto !important; + width: 29.1666666667% !important; + } + .u-xs-size8of24 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-xs-size9of24 { + flex-basis: auto !important; + width: 37.5% !important; + } + .u-xs-size10of24 { + flex-basis: auto !important; + width: 41.6666666667% !important; + } + .u-xs-size11of24 { + flex-basis: auto !important; + width: 45.8333333333% !important; + } + .u-xs-size12of24 { + flex-basis: auto !important; + width: 50% !important; + } + .u-xs-size13of24 { + flex-basis: auto !important; + width: 54.1666666667% !important; + } + .u-xs-size14of24 { + flex-basis: auto !important; + width: 58.3333333333% !important; + } + .u-xs-size15of24 { + flex-basis: auto !important; + width: 62.5% !important; + } + .u-xs-size16of24 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-xs-size17of24 { + flex-basis: auto !important; + width: 70.8333333333% !important; + } + .u-xs-size18of24 { + flex-basis: auto !important; + width: 75% !important; + } + .u-xs-size19of24 { + flex-basis: auto !important; + width: 79.1666666667% !important; + } + .u-xs-size20of24 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-xs-size21of24 { + flex-basis: auto !important; + width: 87.5% !important; + } + .u-xs-size22of24 { + flex-basis: auto !important; + width: 91.6666666667% !important; + } + .u-xs-size23of24 { + flex-basis: auto !important; + width: 95.8333333333% !important; + } + .u-xs-sizeFit { + flex-basis: auto !important; + width: auto !important; + } + .u-xs-sizeFill { + flex: 1 1 0% !important; + flex-basis: 0% !important; + } + .u-xs-sizeFull, .u-xs-size1of1 { + flex-basis: auto !important; + width: 100% !important; + } +} +@media (min-width: 768px) { + .u-sm-size1of2 { + flex-basis: auto !important; + width: 50% !important; + } + .u-sm-size1of3 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-sm-size2of3 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-sm-size1of4 { + flex-basis: auto !important; + width: 25% !important; + } + .u-sm-size2of4 { + flex-basis: auto !important; + width: 50% !important; + } + .u-sm-size3of4 { + flex-basis: auto !important; + width: 75% !important; + } + .u-sm-size1of6 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-sm-size2of6 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-sm-size3of6 { + flex-basis: auto !important; + width: 50% !important; + } + .u-sm-size4of6 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-sm-size5of6 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-sm-size1of8 { + flex-basis: auto !important; + width: 12.5% !important; + } + .u-sm-size2of8 { + flex-basis: auto !important; + width: 25% !important; + } + .u-sm-size3of8 { + flex-basis: auto !important; + width: 37.5% !important; + } + .u-sm-size4of8 { + flex-basis: auto !important; + width: 50% !important; + } + .u-sm-size5of8 { + flex-basis: auto !important; + width: 62.5% !important; + } + .u-sm-size6of8 { + flex-basis: auto !important; + width: 75% !important; + } + .u-sm-size7of8 { + flex-basis: auto !important; + width: 87.5% !important; + } + .u-sm-size1of12 { + flex-basis: auto !important; + width: 8.3333333333% !important; + } + .u-sm-size2of12 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-sm-size3of12 { + flex-basis: auto !important; + width: 25% !important; + } + .u-sm-size4of12 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-sm-size5of12 { + flex-basis: auto !important; + width: 41.6666666667% !important; + } + .u-sm-size6of12 { + flex-basis: auto !important; + width: 50% !important; + } + .u-sm-size7of12 { + flex-basis: auto !important; + width: 58.3333333333% !important; + } + .u-sm-size8of12 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-sm-size9of12 { + flex-basis: auto !important; + width: 75% !important; + } + .u-sm-size10of12 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-sm-size11of12 { + flex-basis: auto !important; + width: 91.6666666667% !important; + } + .u-sm-size1of24 { + flex-basis: auto !important; + width: 4.1666666667% !important; + } + .u-sm-size2of24 { + flex-basis: auto !important; + width: 8.3333333333% !important; + } + .u-sm-size3of24 { + flex-basis: auto !important; + width: 12.5% !important; + } + .u-sm-size4of24 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-sm-size5of24 { + flex-basis: auto !important; + width: 20.8333333333% !important; + } + .u-sm-size6of24 { + flex-basis: auto !important; + width: 25% !important; + } + .u-sm-size7of24 { + flex-basis: auto !important; + width: 29.1666666667% !important; + } + .u-sm-size8of24 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-sm-size9of24 { + flex-basis: auto !important; + width: 37.5% !important; + } + .u-sm-size10of24 { + flex-basis: auto !important; + width: 41.6666666667% !important; + } + .u-sm-size11of24 { + flex-basis: auto !important; + width: 45.8333333333% !important; + } + .u-sm-size12of24 { + flex-basis: auto !important; + width: 50% !important; + } + .u-sm-size13of24 { + flex-basis: auto !important; + width: 54.1666666667% !important; + } + .u-sm-size14of24 { + flex-basis: auto !important; + width: 58.3333333333% !important; + } + .u-sm-size15of24 { + flex-basis: auto !important; + width: 62.5% !important; + } + .u-sm-size16of24 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-sm-size17of24 { + flex-basis: auto !important; + width: 70.8333333333% !important; + } + .u-sm-size18of24 { + flex-basis: auto !important; + width: 75% !important; + } + .u-sm-size19of24 { + flex-basis: auto !important; + width: 79.1666666667% !important; + } + .u-sm-size20of24 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-sm-size21of24 { + flex-basis: auto !important; + width: 87.5% !important; + } + .u-sm-size22of24 { + flex-basis: auto !important; + width: 91.6666666667% !important; + } + .u-sm-size23of24 { + flex-basis: auto !important; + width: 95.8333333333% !important; + } + .u-sm-sizeFit { + flex-basis: auto !important; + width: auto !important; + } + .u-sm-sizeFill { + flex: 1 1 0% !important; + flex-basis: 0% !important; + } + .u-sm-sizeFull, .u-sm-size1of1 { + flex-basis: auto !important; + width: 100% !important; + } +} +@media (min-width: 992px) { + .u-md-size1of2 { + flex-basis: auto !important; + width: 50% !important; + } + .u-md-size1of3 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-md-size2of3 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-md-size1of4 { + flex-basis: auto !important; + width: 25% !important; + } + .u-md-size2of4 { + flex-basis: auto !important; + width: 50% !important; + } + .u-md-size3of4 { + flex-basis: auto !important; + width: 75% !important; + } + .u-md-size1of6 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-md-size2of6 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-md-size3of6 { + flex-basis: auto !important; + width: 50% !important; + } + .u-md-size4of6 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-md-size5of6 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-md-size1of8 { + flex-basis: auto !important; + width: 12.5% !important; + } + .u-md-size2of8 { + flex-basis: auto !important; + width: 25% !important; + } + .u-md-size3of8 { + flex-basis: auto !important; + width: 37.5% !important; + } + .u-md-size4of8 { + flex-basis: auto !important; + width: 50% !important; + } + .u-md-size5of8 { + flex-basis: auto !important; + width: 62.5% !important; + } + .u-md-size6of8 { + flex-basis: auto !important; + width: 75% !important; + } + .u-md-size7of8 { + flex-basis: auto !important; + width: 87.5% !important; + } + .u-md-size1of12 { + flex-basis: auto !important; + width: 8.3333333333% !important; + } + .u-md-size2of12 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-md-size3of12 { + flex-basis: auto !important; + width: 25% !important; + } + .u-md-size4of12 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-md-size5of12 { + flex-basis: auto !important; + width: 41.6666666667% !important; + } + .u-md-size6of12 { + flex-basis: auto !important; + width: 50% !important; + } + .u-md-size7of12 { + flex-basis: auto !important; + width: 58.3333333333% !important; + } + .u-md-size8of12 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-md-size9of12 { + flex-basis: auto !important; + width: 75% !important; + } + .u-md-size10of12 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-md-size11of12 { + flex-basis: auto !important; + width: 91.6666666667% !important; + } + .u-md-size1of24 { + flex-basis: auto !important; + width: 4.1666666667% !important; + } + .u-md-size2of24 { + flex-basis: auto !important; + width: 8.3333333333% !important; + } + .u-md-size3of24 { + flex-basis: auto !important; + width: 12.5% !important; + } + .u-md-size4of24 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-md-size5of24 { + flex-basis: auto !important; + width: 20.8333333333% !important; + } + .u-md-size6of24 { + flex-basis: auto !important; + width: 25% !important; + } + .u-md-size7of24 { + flex-basis: auto !important; + width: 29.1666666667% !important; + } + .u-md-size8of24 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-md-size9of24 { + flex-basis: auto !important; + width: 37.5% !important; + } + .u-md-size10of24 { + flex-basis: auto !important; + width: 41.6666666667% !important; + } + .u-md-size11of24 { + flex-basis: auto !important; + width: 45.8333333333% !important; + } + .u-md-size12of24 { + flex-basis: auto !important; + width: 50% !important; + } + .u-md-size13of24 { + flex-basis: auto !important; + width: 54.1666666667% !important; + } + .u-md-size14of24 { + flex-basis: auto !important; + width: 58.3333333333% !important; + } + .u-md-size15of24 { + flex-basis: auto !important; + width: 62.5% !important; + } + .u-md-size16of24 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-md-size17of24 { + flex-basis: auto !important; + width: 70.8333333333% !important; + } + .u-md-size18of24 { + flex-basis: auto !important; + width: 75% !important; + } + .u-md-size19of24 { + flex-basis: auto !important; + width: 79.1666666667% !important; + } + .u-md-size20of24 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-md-size21of24 { + flex-basis: auto !important; + width: 87.5% !important; + } + .u-md-size22of24 { + flex-basis: auto !important; + width: 91.6666666667% !important; + } + .u-md-size23of24 { + flex-basis: auto !important; + width: 95.8333333333% !important; + } + .u-md-sizeFit { + flex-basis: auto !important; + width: auto !important; + } + .u-md-sizeFill { + flex: 1 1 0% !important; + flex-basis: 0% !important; + } + .u-md-sizeFull, .u-md-size1of1 { + flex-basis: auto !important; + width: 100% !important; + } +} +@media (min-width: 1200px) { + .u-lg-size1of2 { + flex-basis: auto !important; + width: 50% !important; + } + .u-lg-size1of3 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-lg-size2of3 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-lg-size1of4 { + flex-basis: auto !important; + width: 25% !important; + } + .u-lg-size2of4 { + flex-basis: auto !important; + width: 50% !important; + } + .u-lg-size3of4 { + flex-basis: auto !important; + width: 75% !important; + } + .u-lg-size1of6 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-lg-size2of6 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-lg-size3of6 { + flex-basis: auto !important; + width: 50% !important; + } + .u-lg-size4of6 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-lg-size5of6 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-lg-size1of8 { + flex-basis: auto !important; + width: 12.5% !important; + } + .u-lg-size2of8 { + flex-basis: auto !important; + width: 25% !important; + } + .u-lg-size3of8 { + flex-basis: auto !important; + width: 37.5% !important; + } + .u-lg-size4of8 { + flex-basis: auto !important; + width: 50% !important; + } + .u-lg-size5of8 { + flex-basis: auto !important; + width: 62.5% !important; + } + .u-lg-size6of8 { + flex-basis: auto !important; + width: 75% !important; + } + .u-lg-size7of8 { + flex-basis: auto !important; + width: 87.5% !important; + } + .u-lg-size1of12 { + flex-basis: auto !important; + width: 8.3333333333% !important; + } + .u-lg-size2of12 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-lg-size3of12 { + flex-basis: auto !important; + width: 25% !important; + } + .u-lg-size4of12 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-lg-size5of12 { + flex-basis: auto !important; + width: 41.6666666667% !important; + } + .u-lg-size6of12 { + flex-basis: auto !important; + width: 50% !important; + } + .u-lg-size7of12 { + flex-basis: auto !important; + width: 58.3333333333% !important; + } + .u-lg-size8of12 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-lg-size9of12 { + flex-basis: auto !important; + width: 75% !important; + } + .u-lg-size10of12 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-lg-size11of12 { + flex-basis: auto !important; + width: 91.6666666667% !important; + } + .u-lg-size1of24 { + flex-basis: auto !important; + width: 4.1666666667% !important; + } + .u-lg-size2of24 { + flex-basis: auto !important; + width: 8.3333333333% !important; + } + .u-lg-size3of24 { + flex-basis: auto !important; + width: 12.5% !important; + } + .u-lg-size4of24 { + flex-basis: auto !important; + width: 16.6666666667% !important; + } + .u-lg-size5of24 { + flex-basis: auto !important; + width: 20.8333333333% !important; + } + .u-lg-size6of24 { + flex-basis: auto !important; + width: 25% !important; + } + .u-lg-size7of24 { + flex-basis: auto !important; + width: 29.1666666667% !important; + } + .u-lg-size8of24 { + flex-basis: auto !important; + width: 33.3333333333% !important; + } + .u-lg-size9of24 { + flex-basis: auto !important; + width: 37.5% !important; + } + .u-lg-size10of24 { + flex-basis: auto !important; + width: 41.6666666667% !important; + } + .u-lg-size11of24 { + flex-basis: auto !important; + width: 45.8333333333% !important; + } + .u-lg-size12of24 { + flex-basis: auto !important; + width: 50% !important; + } + .u-lg-size13of24 { + flex-basis: auto !important; + width: 54.1666666667% !important; + } + .u-lg-size14of24 { + flex-basis: auto !important; + width: 58.3333333333% !important; + } + .u-lg-size15of24 { + flex-basis: auto !important; + width: 62.5% !important; + } + .u-lg-size16of24 { + flex-basis: auto !important; + width: 66.6666666667% !important; + } + .u-lg-size17of24 { + flex-basis: auto !important; + width: 70.8333333333% !important; + } + .u-lg-size18of24 { + flex-basis: auto !important; + width: 75% !important; + } + .u-lg-size19of24 { + flex-basis: auto !important; + width: 79.1666666667% !important; + } + .u-lg-size20of24 { + flex-basis: auto !important; + width: 83.3333333333% !important; + } + .u-lg-size21of24 { + flex-basis: auto !important; + width: 87.5% !important; + } + .u-lg-size22of24 { + flex-basis: auto !important; + width: 91.6666666667% !important; + } + .u-lg-size23of24 { + flex-basis: auto !important; + width: 95.8333333333% !important; + } + .u-lg-sizeFit { + flex-basis: auto !important; + width: auto !important; + } + .u-lg-sizeFill { + flex: 1 1 0% !important; + flex-basis: 0% !important; + } + .u-lg-sizeFull, .u-lg-size1of1 { + flex-basis: auto !important; + width: 100% !important; + } +} +.u-spaceNone, +.u-spaceTopNone, +.u-spaceEndsNone { + margin-top: 0 !important; +} + +.u-spaceNone, +.u-spaceBottomNone, +.u-spaceEndsNone { + margin-bottom: 0 !important; +} + +.u-spaceNone, +.u-spaceRightNone, +.u-spaceSidesNone { + margin-right: 0 !important; +} + +.u-spaceNone, +.u-spaceLeftNone, +.u-spaceSidesNone { + margin-left: 0 !important; +} + +.u-padNone, +.u-padTopNone, +.u-padEndsNone { + padding-top: 0 !important; +} + +.u-padNone, +.u-padBottomNone, +.u-padEndsNone { + padding-bottom: 0 !important; +} + +.u-padNone, +.u-padRightNone, +.u-padSidesNone { + padding-right: 0 !important; +} + +.u-padNone, +.u-padLeftNone, +.u-padSidesNone { + padding-left: 0 !important; +} + +.u-spaceXs, +.u-spaceTopXs, +.u-spaceEndsXs { + margin-top: 4px !important; +} + +.u-spaceXs, +.u-spaceBottomXs, +.u-spaceEndsXs { + margin-bottom: 4px !important; +} + +.u-spaceXs, +.u-spaceRightXs, +.u-spaceSidesXs { + margin-right: 4px !important; +} + +.u-spaceXs, +.u-spaceLeftXs, +.u-spaceSidesXs { + margin-left: 4px !important; +} + +.u-padXs, +.u-padTopXs, +.u-padEndsXs { + padding-top: 4px !important; +} + +.u-padXs, +.u-padBottomXs, +.u-padEndsXs { + padding-bottom: 4px !important; +} + +.u-padXs, +.u-padRightXs, +.u-padSidesXs { + padding-right: 4px !important; +} + +.u-padXs, +.u-padLeftXs, +.u-padSidesXs { + padding-left: 4px !important; +} + +.u-spaceSm, +.u-spaceTopSm, +.u-spaceEndsSm { + margin-top: 8px !important; +} + +.u-spaceSm, +.u-spaceBottomSm, +.u-spaceEndsSm { + margin-bottom: 8px !important; +} + +.u-spaceSm, +.u-spaceRightSm, +.u-spaceSidesSm { + margin-right: 8px !important; +} + +.u-spaceSm, +.u-spaceLeftSm, +.u-spaceSidesSm { + margin-left: 8px !important; +} + +.u-padSm, +.u-padTopSm, +.u-padEndsSm { + padding-top: 8px !important; +} + +.u-padSm, +.u-padBottomSm, +.u-padEndsSm { + padding-bottom: 8px !important; +} + +.u-padSm, +.u-padRightSm, +.u-padSidesSm { + padding-right: 8px !important; +} + +.u-padSm, +.u-padLeftSm, +.u-padSidesSm { + padding-left: 8px !important; +} + +.u-spaceMd, +.u-spaceTopMd, +.u-spaceEndsMd { + margin-top: 16px !important; +} + +.u-spaceMd, +.u-spaceBottomMd, +.u-spaceEndsMd { + margin-bottom: 16px !important; +} + +.u-spaceMd, +.u-spaceRightMd, +.u-spaceSidesMd { + margin-right: 16px !important; +} + +.u-spaceMd, +.u-spaceLeftMd, +.u-spaceSidesMd { + margin-left: 16px !important; +} + +.u-padMd, +.u-padTopMd, +.u-padEndsMd { + padding-top: 16px !important; +} + +.u-padMd, +.u-padBottomMd, +.u-padEndsMd { + padding-bottom: 16px !important; +} + +.u-padMd, +.u-padRightMd, +.u-padSidesMd { + padding-right: 16px !important; +} + +.u-padMd, +.u-padLeftMd, +.u-padSidesMd { + padding-left: 16px !important; +} + +.u-spaceLg, +.u-spaceTopLg, +.u-spaceEndsLg { + margin-top: 24px !important; +} + +.u-spaceLg, +.u-spaceBottomLg, +.u-spaceEndsLg { + margin-bottom: 24px !important; +} + +.u-spaceLg, +.u-spaceRightLg, +.u-spaceSidesLg { + margin-right: 24px !important; +} + +.u-spaceLg, +.u-spaceLeftLg, +.u-spaceSidesLg { + margin-left: 24px !important; +} + +.u-padLg, +.u-padTopLg, +.u-padEndsLg { + padding-top: 24px !important; +} + +.u-padLg, +.u-padBottomLg, +.u-padEndsLg { + padding-bottom: 24px !important; +} + +.u-padLg, +.u-padRightLg, +.u-padSidesLg { + padding-right: 24px !important; +} + +.u-padLg, +.u-padLeftLg, +.u-padSidesLg { + padding-left: 24px !important; +} + +.u-spaceXl, +.u-spaceTopXl, +.u-spaceEndsXl { + margin-top: 32px !important; +} + +.u-spaceXl, +.u-spaceBottomXl, +.u-spaceEndsXl { + margin-bottom: 32px !important; +} + +.u-spaceXl, +.u-spaceRightXl, +.u-spaceSidesXl { + margin-right: 32px !important; +} + +.u-spaceXl, +.u-spaceLeftXl, +.u-spaceSidesXl { + margin-left: 32px !important; +} + +.u-padXl, +.u-padTopXl, +.u-padEndsXl { + padding-top: 32px !important; +} + +.u-padXl, +.u-padBottomXl, +.u-padEndsXl { + padding-bottom: 32px !important; +} + +.u-padXl, +.u-padRightXl, +.u-padSidesXl { + padding-right: 32px !important; +} + +.u-padXl, +.u-padLeftXl, +.u-padSidesXl { + padding-left: 32px !important; +} + +.u-spaceXxl, +.u-spaceTopXxl, +.u-spaceEndsXxl { + margin-top: 40px !important; +} + +.u-spaceXxl, +.u-spaceBottomXxl, +.u-spaceEndsXxl { + margin-bottom: 40px !important; +} + +.u-spaceXxl, +.u-spaceRightXxl, +.u-spaceSidesXxl { + margin-right: 40px !important; +} + +.u-spaceXxl, +.u-spaceLeftXxl, +.u-spaceSidesXxl { + margin-left: 40px !important; +} + +.u-padXxl, +.u-padTopXxl, +.u-padEndsXxl { + padding-top: 40px !important; +} + +.u-padXxl, +.u-padBottomXxl, +.u-padEndsXxl { + padding-bottom: 40px !important; +} + +.u-padXxl, +.u-padRightXxl, +.u-padSidesXxl { + padding-right: 40px !important; +} + +.u-padXxl, +.u-padLeftXxl, +.u-padSidesXxl { + padding-left: 40px !important; +} + +.u-spaceSidesAuto { + margin-right: auto !important; + margin-left: auto !important; +} + +.u-spaceAuto { + margin: auto; +} + +@media (min-width: 480px) { + .u-xs-spaceNone, + .u-xs-spaceTopNone, + .u-xs-spaceEndsNone { + margin-top: 0 !important; + } + .u-xs-spaceNone, + .u-xs-spaceBottomNone, + .u-xs-spaceEndsNone { + margin-bottom: 0 !important; + } + .u-xs-spaceNone, + .u-xs-spaceRightNone, + .u-xs-spaceSidesNone { + margin-right: 0 !important; + } + .u-xs-spaceNone, + .u-xs-spaceLeftNone, + .u-xs-spaceSidesNone { + margin-left: 0 !important; + } + .u-xs-padNone, + .u-xs-padTopNone, + .u-xs-padEndsNone { + padding-top: 0 !important; + } + .u-xs-padNone, + .u-xs-padBottomNone, + .u-xs-padEndsNone { + padding-bottom: 0 !important; + } + .u-xs-padNone, + .u-xs-padRightNone, + .u-xs-padSidesNone { + padding-right: 0 !important; + } + .u-xs-padNone, + .u-xs-padLeftNone, + .u-xs-padSidesNone { + padding-left: 0 !important; + } + .u-xs-spaceXs, + .u-xs-spaceTopXs, + .u-xs-spaceEndsXs { + margin-top: 4px !important; + } + .u-xs-spaceXs, + .u-xs-spaceBottomXs, + .u-xs-spaceEndsXs { + margin-bottom: 4px !important; + } + .u-xs-spaceXs, + .u-xs-spaceRightXs, + .u-xs-spaceSidesXs { + margin-right: 4px !important; + } + .u-xs-spaceXs, + .u-xs-spaceLeftXs, + .u-xs-spaceSidesXs { + margin-left: 4px !important; + } + .u-xs-padXs, + .u-xs-padTopXs, + .u-xs-padEndsXs { + padding-top: 4px !important; + } + .u-xs-padXs, + .u-xs-padBottomXs, + .u-xs-padEndsXs { + padding-bottom: 4px !important; + } + .u-xs-padXs, + .u-xs-padRightXs, + .u-xs-padSidesXs { + padding-right: 4px !important; + } + .u-xs-padXs, + .u-xs-padLeftXs, + .u-xs-padSidesXs { + padding-left: 4px !important; + } + .u-xs-spaceSm, + .u-xs-spaceTopSm, + .u-xs-spaceEndsSm { + margin-top: 8px !important; + } + .u-xs-spaceSm, + .u-xs-spaceBottomSm, + .u-xs-spaceEndsSm { + margin-bottom: 8px !important; + } + .u-xs-spaceSm, + .u-xs-spaceRightSm, + .u-xs-spaceSidesSm { + margin-right: 8px !important; + } + .u-xs-spaceSm, + .u-xs-spaceLeftSm, + .u-xs-spaceSidesSm { + margin-left: 8px !important; + } + .u-xs-padSm, + .u-xs-padTopSm, + .u-xs-padEndsSm { + padding-top: 8px !important; + } + .u-xs-padSm, + .u-xs-padBottomSm, + .u-xs-padEndsSm { + padding-bottom: 8px !important; + } + .u-xs-padSm, + .u-xs-padRightSm, + .u-xs-padSidesSm { + padding-right: 8px !important; + } + .u-xs-padSm, + .u-xs-padLeftSm, + .u-xs-padSidesSm { + padding-left: 8px !important; + } + .u-xs-spaceMd, + .u-xs-spaceTopMd, + .u-xs-spaceEndsMd { + margin-top: 16px !important; + } + .u-xs-spaceMd, + .u-xs-spaceBottomMd, + .u-xs-spaceEndsMd { + margin-bottom: 16px !important; + } + .u-xs-spaceMd, + .u-xs-spaceRightMd, + .u-xs-spaceSidesMd { + margin-right: 16px !important; + } + .u-xs-spaceMd, + .u-xs-spaceLeftMd, + .u-xs-spaceSidesMd { + margin-left: 16px !important; + } + .u-xs-padMd, + .u-xs-padTopMd, + .u-xs-padEndsMd { + padding-top: 16px !important; + } + .u-xs-padMd, + .u-xs-padBottomMd, + .u-xs-padEndsMd { + padding-bottom: 16px !important; + } + .u-xs-padMd, + .u-xs-padRightMd, + .u-xs-padSidesMd { + padding-right: 16px !important; + } + .u-xs-padMd, + .u-xs-padLeftMd, + .u-xs-padSidesMd { + padding-left: 16px !important; + } + .u-xs-spaceLg, + .u-xs-spaceTopLg, + .u-xs-spaceEndsLg { + margin-top: 24px !important; + } + .u-xs-spaceLg, + .u-xs-spaceBottomLg, + .u-xs-spaceEndsLg { + margin-bottom: 24px !important; + } + .u-xs-spaceLg, + .u-xs-spaceRightLg, + .u-xs-spaceSidesLg { + margin-right: 24px !important; + } + .u-xs-spaceLg, + .u-xs-spaceLeftLg, + .u-xs-spaceSidesLg { + margin-left: 24px !important; + } + .u-xs-padLg, + .u-xs-padTopLg, + .u-xs-padEndsLg { + padding-top: 24px !important; + } + .u-xs-padLg, + .u-xs-padBottomLg, + .u-xs-padEndsLg { + padding-bottom: 24px !important; + } + .u-xs-padLg, + .u-xs-padRightLg, + .u-xs-padSidesLg { + padding-right: 24px !important; + } + .u-xs-padLg, + .u-xs-padLeftLg, + .u-xs-padSidesLg { + padding-left: 24px !important; + } + .u-xs-spaceXl, + .u-xs-spaceTopXl, + .u-xs-spaceEndsXl { + margin-top: 32px !important; + } + .u-xs-spaceXl, + .u-xs-spaceBottomXl, + .u-xs-spaceEndsXl { + margin-bottom: 32px !important; + } + .u-xs-spaceXl, + .u-xs-spaceRightXl, + .u-xs-spaceSidesXl { + margin-right: 32px !important; + } + .u-xs-spaceXl, + .u-xs-spaceLeftXl, + .u-xs-spaceSidesXl { + margin-left: 32px !important; + } + .u-xs-padXl, + .u-xs-padTopXl, + .u-xs-padEndsXl { + padding-top: 32px !important; + } + .u-xs-padXl, + .u-xs-padBottomXl, + .u-xs-padEndsXl { + padding-bottom: 32px !important; + } + .u-xs-padXl, + .u-xs-padRightXl, + .u-xs-padSidesXl { + padding-right: 32px !important; + } + .u-xs-padXl, + .u-xs-padLeftXl, + .u-xs-padSidesXl { + padding-left: 32px !important; + } + .u-xs-spaceXxl, + .u-xs-spaceTopXxl, + .u-xs-spaceEndsXxl { + margin-top: 40px !important; + } + .u-xs-spaceXxl, + .u-xs-spaceBottomXxl, + .u-xs-spaceEndsXxl { + margin-bottom: 40px !important; + } + .u-xs-spaceXxl, + .u-xs-spaceRightXxl, + .u-xs-spaceSidesXxl { + margin-right: 40px !important; + } + .u-xs-spaceXxl, + .u-xs-spaceLeftXxl, + .u-xs-spaceSidesXxl { + margin-left: 40px !important; + } + .u-xs-padXxl, + .u-xs-padTopXxl, + .u-xs-padEndsXxl { + padding-top: 40px !important; + } + .u-xs-padXxl, + .u-xs-padBottomXxl, + .u-xs-padEndsXxl { + padding-bottom: 40px !important; + } + .u-xs-padXxl, + .u-xs-padRightXxl, + .u-xs-padSidesXxl { + padding-right: 40px !important; + } + .u-xs-padXxl, + .u-xs-padLeftXxl, + .u-xs-padSidesXxl { + padding-left: 40px !important; + } + .u-xs-spaceSidesAuto { + margin-right: auto !important; + margin-left: auto !important; + } +} +@media (min-width: 768px) { + .u-sm-spaceNone, + .u-sm-spaceTopNone, + .u-sm-spaceEndsNone { + margin-top: 0 !important; + } + .u-sm-spaceNone, + .u-sm-spaceBottomNone, + .u-sm-spaceEndsNone { + margin-bottom: 0 !important; + } + .u-sm-spaceNone, + .u-sm-spaceRightNone, + .u-sm-spaceSidesNone { + margin-right: 0 !important; + } + .u-sm-spaceNone, + .u-sm-spaceLeftNone, + .u-sm-spaceSidesNone { + margin-left: 0 !important; + } + .u-sm-padNone, + .u-sm-padTopNone, + .u-sm-padEndsNone { + padding-top: 0 !important; + } + .u-sm-padNone, + .u-sm-padBottomNone, + .u-sm-padEndsNone { + padding-bottom: 0 !important; + } + .u-sm-padNone, + .u-sm-padRightNone, + .u-sm-padSidesNone { + padding-right: 0 !important; + } + .u-sm-padNone, + .u-sm-padLeftNone, + .u-sm-padSidesNone { + padding-left: 0 !important; + } + .u-sm-spaceXs, + .u-sm-spaceTopXs, + .u-sm-spaceEndsXs { + margin-top: 4px !important; + } + .u-sm-spaceXs, + .u-sm-spaceBottomXs, + .u-sm-spaceEndsXs { + margin-bottom: 4px !important; + } + .u-sm-spaceXs, + .u-sm-spaceRightXs, + .u-sm-spaceSidesXs { + margin-right: 4px !important; + } + .u-sm-spaceXs, + .u-sm-spaceLeftXs, + .u-sm-spaceSidesXs { + margin-left: 4px !important; + } + .u-sm-padXs, + .u-sm-padTopXs, + .u-sm-padEndsXs { + padding-top: 4px !important; + } + .u-sm-padXs, + .u-sm-padBottomXs, + .u-sm-padEndsXs { + padding-bottom: 4px !important; + } + .u-sm-padXs, + .u-sm-padRightXs, + .u-sm-padSidesXs { + padding-right: 4px !important; + } + .u-sm-padXs, + .u-sm-padLeftXs, + .u-sm-padSidesXs { + padding-left: 4px !important; + } + .u-sm-spaceSm, + .u-sm-spaceTopSm, + .u-sm-spaceEndsSm { + margin-top: 8px !important; + } + .u-sm-spaceSm, + .u-sm-spaceBottomSm, + .u-sm-spaceEndsSm { + margin-bottom: 8px !important; + } + .u-sm-spaceSm, + .u-sm-spaceRightSm, + .u-sm-spaceSidesSm { + margin-right: 8px !important; + } + .u-sm-spaceSm, + .u-sm-spaceLeftSm, + .u-sm-spaceSidesSm { + margin-left: 8px !important; + } + .u-sm-padSm, + .u-sm-padTopSm, + .u-sm-padEndsSm { + padding-top: 8px !important; + } + .u-sm-padSm, + .u-sm-padBottomSm, + .u-sm-padEndsSm { + padding-bottom: 8px !important; + } + .u-sm-padSm, + .u-sm-padRightSm, + .u-sm-padSidesSm { + padding-right: 8px !important; + } + .u-sm-padSm, + .u-sm-padLeftSm, + .u-sm-padSidesSm { + padding-left: 8px !important; + } + .u-sm-spaceMd, + .u-sm-spaceTopMd, + .u-sm-spaceEndsMd { + margin-top: 16px !important; + } + .u-sm-spaceMd, + .u-sm-spaceBottomMd, + .u-sm-spaceEndsMd { + margin-bottom: 16px !important; + } + .u-sm-spaceMd, + .u-sm-spaceRightMd, + .u-sm-spaceSidesMd { + margin-right: 16px !important; + } + .u-sm-spaceMd, + .u-sm-spaceLeftMd, + .u-sm-spaceSidesMd { + margin-left: 16px !important; + } + .u-sm-padMd, + .u-sm-padTopMd, + .u-sm-padEndsMd { + padding-top: 16px !important; + } + .u-sm-padMd, + .u-sm-padBottomMd, + .u-sm-padEndsMd { + padding-bottom: 16px !important; + } + .u-sm-padMd, + .u-sm-padRightMd, + .u-sm-padSidesMd { + padding-right: 16px !important; + } + .u-sm-padMd, + .u-sm-padLeftMd, + .u-sm-padSidesMd { + padding-left: 16px !important; + } + .u-sm-spaceLg, + .u-sm-spaceTopLg, + .u-sm-spaceEndsLg { + margin-top: 24px !important; + } + .u-sm-spaceLg, + .u-sm-spaceBottomLg, + .u-sm-spaceEndsLg { + margin-bottom: 24px !important; + } + .u-sm-spaceLg, + .u-sm-spaceRightLg, + .u-sm-spaceSidesLg { + margin-right: 24px !important; + } + .u-sm-spaceLg, + .u-sm-spaceLeftLg, + .u-sm-spaceSidesLg { + margin-left: 24px !important; + } + .u-sm-padLg, + .u-sm-padTopLg, + .u-sm-padEndsLg { + padding-top: 24px !important; + } + .u-sm-padLg, + .u-sm-padBottomLg, + .u-sm-padEndsLg { + padding-bottom: 24px !important; + } + .u-sm-padLg, + .u-sm-padRightLg, + .u-sm-padSidesLg { + padding-right: 24px !important; + } + .u-sm-padLg, + .u-sm-padLeftLg, + .u-sm-padSidesLg { + padding-left: 24px !important; + } + .u-sm-spaceXl, + .u-sm-spaceTopXl, + .u-sm-spaceEndsXl { + margin-top: 32px !important; + } + .u-sm-spaceXl, + .u-sm-spaceBottomXl, + .u-sm-spaceEndsXl { + margin-bottom: 32px !important; + } + .u-sm-spaceXl, + .u-sm-spaceRightXl, + .u-sm-spaceSidesXl { + margin-right: 32px !important; + } + .u-sm-spaceXl, + .u-sm-spaceLeftXl, + .u-sm-spaceSidesXl { + margin-left: 32px !important; + } + .u-sm-padXl, + .u-sm-padTopXl, + .u-sm-padEndsXl { + padding-top: 32px !important; + } + .u-sm-padXl, + .u-sm-padBottomXl, + .u-sm-padEndsXl { + padding-bottom: 32px !important; + } + .u-sm-padXl, + .u-sm-padRightXl, + .u-sm-padSidesXl { + padding-right: 32px !important; + } + .u-sm-padXl, + .u-sm-padLeftXl, + .u-sm-padSidesXl { + padding-left: 32px !important; + } + .u-sm-spaceXxl, + .u-sm-spaceTopXxl, + .u-sm-spaceEndsXxl { + margin-top: 40px !important; + } + .u-sm-spaceXxl, + .u-sm-spaceBottomXxl, + .u-sm-spaceEndsXxl { + margin-bottom: 40px !important; + } + .u-sm-spaceXxl, + .u-sm-spaceRightXxl, + .u-sm-spaceSidesXxl { + margin-right: 40px !important; + } + .u-sm-spaceXxl, + .u-sm-spaceLeftXxl, + .u-sm-spaceSidesXxl { + margin-left: 40px !important; + } + .u-sm-padXxl, + .u-sm-padTopXxl, + .u-sm-padEndsXxl { + padding-top: 40px !important; + } + .u-sm-padXxl, + .u-sm-padBottomXxl, + .u-sm-padEndsXxl { + padding-bottom: 40px !important; + } + .u-sm-padXxl, + .u-sm-padRightXxl, + .u-sm-padSidesXxl { + padding-right: 40px !important; + } + .u-sm-padXxl, + .u-sm-padLeftXxl, + .u-sm-padSidesXxl { + padding-left: 40px !important; + } + .u-sm-spaceSidesAuto { + margin-right: auto !important; + margin-left: auto !important; + } +} +@media (min-width: 992px) { + .u-md-spaceNone, + .u-md-spaceTopNone, + .u-md-spaceEndsNone { + margin-top: 0 !important; + } + .u-md-spaceNone, + .u-md-spaceBottomNone, + .u-md-spaceEndsNone { + margin-bottom: 0 !important; + } + .u-md-spaceNone, + .u-md-spaceRightNone, + .u-md-spaceSidesNone { + margin-right: 0 !important; + } + .u-md-spaceNone, + .u-md-spaceLeftNone, + .u-md-spaceSidesNone { + margin-left: 0 !important; + } + .u-md-padNone, + .u-md-padTopNone, + .u-md-padEndsNone { + padding-top: 0 !important; + } + .u-md-padNone, + .u-md-padBottomNone, + .u-md-padEndsNone { + padding-bottom: 0 !important; + } + .u-md-padNone, + .u-md-padRightNone, + .u-md-padSidesNone { + padding-right: 0 !important; + } + .u-md-padNone, + .u-md-padLeftNone, + .u-md-padSidesNone { + padding-left: 0 !important; + } + .u-md-spaceXs, + .u-md-spaceTopXs, + .u-md-spaceEndsXs { + margin-top: 4px !important; + } + .u-md-spaceXs, + .u-md-spaceBottomXs, + .u-md-spaceEndsXs { + margin-bottom: 4px !important; + } + .u-md-spaceXs, + .u-md-spaceRightXs, + .u-md-spaceSidesXs { + margin-right: 4px !important; + } + .u-md-spaceXs, + .u-md-spaceLeftXs, + .u-md-spaceSidesXs { + margin-left: 4px !important; + } + .u-md-padXs, + .u-md-padTopXs, + .u-md-padEndsXs { + padding-top: 4px !important; + } + .u-md-padXs, + .u-md-padBottomXs, + .u-md-padEndsXs { + padding-bottom: 4px !important; + } + .u-md-padXs, + .u-md-padRightXs, + .u-md-padSidesXs { + padding-right: 4px !important; + } + .u-md-padXs, + .u-md-padLeftXs, + .u-md-padSidesXs { + padding-left: 4px !important; + } + .u-md-spaceSm, + .u-md-spaceTopSm, + .u-md-spaceEndsSm { + margin-top: 8px !important; + } + .u-md-spaceSm, + .u-md-spaceBottomSm, + .u-md-spaceEndsSm { + margin-bottom: 8px !important; + } + .u-md-spaceSm, + .u-md-spaceRightSm, + .u-md-spaceSidesSm { + margin-right: 8px !important; + } + .u-md-spaceSm, + .u-md-spaceLeftSm, + .u-md-spaceSidesSm { + margin-left: 8px !important; + } + .u-md-padSm, + .u-md-padTopSm, + .u-md-padEndsSm { + padding-top: 8px !important; + } + .u-md-padSm, + .u-md-padBottomSm, + .u-md-padEndsSm { + padding-bottom: 8px !important; + } + .u-md-padSm, + .u-md-padRightSm, + .u-md-padSidesSm { + padding-right: 8px !important; + } + .u-md-padSm, + .u-md-padLeftSm, + .u-md-padSidesSm { + padding-left: 8px !important; + } + .u-md-spaceMd, + .u-md-spaceTopMd, + .u-md-spaceEndsMd { + margin-top: 16px !important; + } + .u-md-spaceMd, + .u-md-spaceBottomMd, + .u-md-spaceEndsMd { + margin-bottom: 16px !important; + } + .u-md-spaceMd, + .u-md-spaceRightMd, + .u-md-spaceSidesMd { + margin-right: 16px !important; + } + .u-md-spaceMd, + .u-md-spaceLeftMd, + .u-md-spaceSidesMd { + margin-left: 16px !important; + } + .u-md-padMd, + .u-md-padTopMd, + .u-md-padEndsMd { + padding-top: 16px !important; + } + .u-md-padMd, + .u-md-padBottomMd, + .u-md-padEndsMd { + padding-bottom: 16px !important; + } + .u-md-padMd, + .u-md-padRightMd, + .u-md-padSidesMd { + padding-right: 16px !important; + } + .u-md-padMd, + .u-md-padLeftMd, + .u-md-padSidesMd { + padding-left: 16px !important; + } + .u-md-spaceLg, + .u-md-spaceTopLg, + .u-md-spaceEndsLg { + margin-top: 24px !important; + } + .u-md-spaceLg, + .u-md-spaceBottomLg, + .u-md-spaceEndsLg { + margin-bottom: 24px !important; + } + .u-md-spaceLg, + .u-md-spaceRightLg, + .u-md-spaceSidesLg { + margin-right: 24px !important; + } + .u-md-spaceLg, + .u-md-spaceLeftLg, + .u-md-spaceSidesLg { + margin-left: 24px !important; + } + .u-md-padLg, + .u-md-padTopLg, + .u-md-padEndsLg { + padding-top: 24px !important; + } + .u-md-padLg, + .u-md-padBottomLg, + .u-md-padEndsLg { + padding-bottom: 24px !important; + } + .u-md-padLg, + .u-md-padRightLg, + .u-md-padSidesLg { + padding-right: 24px !important; + } + .u-md-padLg, + .u-md-padLeftLg, + .u-md-padSidesLg { + padding-left: 24px !important; + } + .u-md-spaceXl, + .u-md-spaceTopXl, + .u-md-spaceEndsXl { + margin-top: 32px !important; + } + .u-md-spaceXl, + .u-md-spaceBottomXl, + .u-md-spaceEndsXl { + margin-bottom: 32px !important; + } + .u-md-spaceXl, + .u-md-spaceRightXl, + .u-md-spaceSidesXl { + margin-right: 32px !important; + } + .u-md-spaceXl, + .u-md-spaceLeftXl, + .u-md-spaceSidesXl { + margin-left: 32px !important; + } + .u-md-padXl, + .u-md-padTopXl, + .u-md-padEndsXl { + padding-top: 32px !important; + } + .u-md-padXl, + .u-md-padBottomXl, + .u-md-padEndsXl { + padding-bottom: 32px !important; + } + .u-md-padXl, + .u-md-padRightXl, + .u-md-padSidesXl { + padding-right: 32px !important; + } + .u-md-padXl, + .u-md-padLeftXl, + .u-md-padSidesXl { + padding-left: 32px !important; + } + .u-md-spaceXxl, + .u-md-spaceTopXxl, + .u-md-spaceEndsXxl { + margin-top: 40px !important; + } + .u-md-spaceXxl, + .u-md-spaceBottomXxl, + .u-md-spaceEndsXxl { + margin-bottom: 40px !important; + } + .u-md-spaceXxl, + .u-md-spaceRightXxl, + .u-md-spaceSidesXxl { + margin-right: 40px !important; + } + .u-md-spaceXxl, + .u-md-spaceLeftXxl, + .u-md-spaceSidesXxl { + margin-left: 40px !important; + } + .u-md-padXxl, + .u-md-padTopXxl, + .u-md-padEndsXxl { + padding-top: 40px !important; + } + .u-md-padXxl, + .u-md-padBottomXxl, + .u-md-padEndsXxl { + padding-bottom: 40px !important; + } + .u-md-padXxl, + .u-md-padRightXxl, + .u-md-padSidesXxl { + padding-right: 40px !important; + } + .u-md-padXxl, + .u-md-padLeftXxl, + .u-md-padSidesXxl { + padding-left: 40px !important; + } + .u-md-spaceSidesAuto { + margin-right: auto !important; + margin-left: auto !important; + } +} +@media (min-width: 1200px) { + .u-lg-spaceNone, + .u-lg-spaceTopNone, + .u-lg-spaceEndsNone { + margin-top: 0 !important; + } + .u-lg-spaceNone, + .u-lg-spaceBottomNone, + .u-lg-spaceEndsNone { + margin-bottom: 0 !important; + } + .u-lg-spaceNone, + .u-lg-spaceRightNone, + .u-lg-spaceSidesNone { + margin-right: 0 !important; + } + .u-lg-spaceNone, + .u-lg-spaceLeftNone, + .u-lg-spaceSidesNone { + margin-left: 0 !important; + } + .u-lg-padNone, + .u-lg-padTopNone, + .u-lg-padEndsNone { + padding-top: 0 !important; + } + .u-lg-padNone, + .u-lg-padBottomNone, + .u-lg-padEndsNone { + padding-bottom: 0 !important; + } + .u-lg-padNone, + .u-lg-padRightNone, + .u-lg-padSidesNone { + padding-right: 0 !important; + } + .u-lg-padNone, + .u-lg-padLeftNone, + .u-lg-padSidesNone { + padding-left: 0 !important; + } + .u-lg-spaceXs, + .u-lg-spaceTopXs, + .u-lg-spaceEndsXs { + margin-top: 4px !important; + } + .u-lg-spaceXs, + .u-lg-spaceBottomXs, + .u-lg-spaceEndsXs { + margin-bottom: 4px !important; + } + .u-lg-spaceXs, + .u-lg-spaceRightXs, + .u-lg-spaceSidesXs { + margin-right: 4px !important; + } + .u-lg-spaceXs, + .u-lg-spaceLeftXs, + .u-lg-spaceSidesXs { + margin-left: 4px !important; + } + .u-lg-padXs, + .u-lg-padTopXs, + .u-lg-padEndsXs { + padding-top: 4px !important; + } + .u-lg-padXs, + .u-lg-padBottomXs, + .u-lg-padEndsXs { + padding-bottom: 4px !important; + } + .u-lg-padXs, + .u-lg-padRightXs, + .u-lg-padSidesXs { + padding-right: 4px !important; + } + .u-lg-padXs, + .u-lg-padLeftXs, + .u-lg-padSidesXs { + padding-left: 4px !important; + } + .u-lg-spaceSm, + .u-lg-spaceTopSm, + .u-lg-spaceEndsSm { + margin-top: 8px !important; + } + .u-lg-spaceSm, + .u-lg-spaceBottomSm, + .u-lg-spaceEndsSm { + margin-bottom: 8px !important; + } + .u-lg-spaceSm, + .u-lg-spaceRightSm, + .u-lg-spaceSidesSm { + margin-right: 8px !important; + } + .u-lg-spaceSm, + .u-lg-spaceLeftSm, + .u-lg-spaceSidesSm { + margin-left: 8px !important; + } + .u-lg-padSm, + .u-lg-padTopSm, + .u-lg-padEndsSm { + padding-top: 8px !important; + } + .u-lg-padSm, + .u-lg-padBottomSm, + .u-lg-padEndsSm { + padding-bottom: 8px !important; + } + .u-lg-padSm, + .u-lg-padRightSm, + .u-lg-padSidesSm { + padding-right: 8px !important; + } + .u-lg-padSm, + .u-lg-padLeftSm, + .u-lg-padSidesSm { + padding-left: 8px !important; + } + .u-lg-spaceMd, + .u-lg-spaceTopMd, + .u-lg-spaceEndsMd { + margin-top: 16px !important; + } + .u-lg-spaceMd, + .u-lg-spaceBottomMd, + .u-lg-spaceEndsMd { + margin-bottom: 16px !important; + } + .u-lg-spaceMd, + .u-lg-spaceRightMd, + .u-lg-spaceSidesMd { + margin-right: 16px !important; + } + .u-lg-spaceMd, + .u-lg-spaceLeftMd, + .u-lg-spaceSidesMd { + margin-left: 16px !important; + } + .u-lg-padMd, + .u-lg-padTopMd, + .u-lg-padEndsMd { + padding-top: 16px !important; + } + .u-lg-padMd, + .u-lg-padBottomMd, + .u-lg-padEndsMd { + padding-bottom: 16px !important; + } + .u-lg-padMd, + .u-lg-padRightMd, + .u-lg-padSidesMd { + padding-right: 16px !important; + } + .u-lg-padMd, + .u-lg-padLeftMd, + .u-lg-padSidesMd { + padding-left: 16px !important; + } + .u-lg-spaceLg, + .u-lg-spaceTopLg, + .u-lg-spaceEndsLg { + margin-top: 24px !important; + } + .u-lg-spaceLg, + .u-lg-spaceBottomLg, + .u-lg-spaceEndsLg { + margin-bottom: 24px !important; + } + .u-lg-spaceLg, + .u-lg-spaceRightLg, + .u-lg-spaceSidesLg { + margin-right: 24px !important; + } + .u-lg-spaceLg, + .u-lg-spaceLeftLg, + .u-lg-spaceSidesLg { + margin-left: 24px !important; + } + .u-lg-padLg, + .u-lg-padTopLg, + .u-lg-padEndsLg { + padding-top: 24px !important; + } + .u-lg-padLg, + .u-lg-padBottomLg, + .u-lg-padEndsLg { + padding-bottom: 24px !important; + } + .u-lg-padLg, + .u-lg-padRightLg, + .u-lg-padSidesLg { + padding-right: 24px !important; + } + .u-lg-padLg, + .u-lg-padLeftLg, + .u-lg-padSidesLg { + padding-left: 24px !important; + } + .u-lg-spaceXl, + .u-lg-spaceTopXl, + .u-lg-spaceEndsXl { + margin-top: 32px !important; + } + .u-lg-spaceXl, + .u-lg-spaceBottomXl, + .u-lg-spaceEndsXl { + margin-bottom: 32px !important; + } + .u-lg-spaceXl, + .u-lg-spaceRightXl, + .u-lg-spaceSidesXl { + margin-right: 32px !important; + } + .u-lg-spaceXl, + .u-lg-spaceLeftXl, + .u-lg-spaceSidesXl { + margin-left: 32px !important; + } + .u-lg-padXl, + .u-lg-padTopXl, + .u-lg-padEndsXl { + padding-top: 32px !important; + } + .u-lg-padXl, + .u-lg-padBottomXl, + .u-lg-padEndsXl { + padding-bottom: 32px !important; + } + .u-lg-padXl, + .u-lg-padRightXl, + .u-lg-padSidesXl { + padding-right: 32px !important; + } + .u-lg-padXl, + .u-lg-padLeftXl, + .u-lg-padSidesXl { + padding-left: 32px !important; + } + .u-lg-spaceXxl, + .u-lg-spaceTopXxl, + .u-lg-spaceEndsXxl { + margin-top: 40px !important; + } + .u-lg-spaceXxl, + .u-lg-spaceBottomXxl, + .u-lg-spaceEndsXxl { + margin-bottom: 40px !important; + } + .u-lg-spaceXxl, + .u-lg-spaceRightXxl, + .u-lg-spaceSidesXxl { + margin-right: 40px !important; + } + .u-lg-spaceXxl, + .u-lg-spaceLeftXxl, + .u-lg-spaceSidesXxl { + margin-left: 40px !important; + } + .u-lg-padXxl, + .u-lg-padTopXxl, + .u-lg-padEndsXxl { + padding-top: 40px !important; + } + .u-lg-padXxl, + .u-lg-padBottomXxl, + .u-lg-padEndsXxl { + padding-bottom: 40px !important; + } + .u-lg-padXxl, + .u-lg-padRightXxl, + .u-lg-padSidesXxl { + padding-right: 40px !important; + } + .u-lg-padXxl, + .u-lg-padLeftXxl, + .u-lg-padSidesXxl { + padding-left: 40px !important; + } + .u-lg-spaceSidesAuto { + margin-right: auto !important; + margin-left: auto !important; + } +} +.u-spaceNegativeRightSm { + margin-right: -8px !important; +} + +/** + * Horizontal text alignment + */ +.u-textCenter { + text-align: center !important; +} + +.u-textLeft { + text-align: left !important; +} + +.u-textRight { + text-align: right !important; +} + +/** + * Prevent whitespace wrapping + */ +.u-textNoWrap { + white-space: nowrap !important; +} + +/** + * Text ellipsis + */ +.u-textEllipsis { + text-overflow: ellipsis !important; + overflow: hidden !important; +} + +/** + * Font size utilities + */ +.u-fontSizeXs { + font-size: 10px !important; +} + +.u-fontSizeSm { + font-size: 12px !important; +} + +.u-fontSizeMd { + font-size: 13px !important; +} + +.u-fontSizeLg { + font-size: 16px !important; +} + +.u-fontSizeXl { + font-size: 23px !important; +} + +.u-fontSizeXxl { + font-size: 26px !important; +} + +/** + * Font weight utilities + */ +.u-textNormal { + font-weight: 400 !important; +} + +.u-textSemiBold { + font-weight: 600 !important; +} + +.u-textBold { + font-weight: 700 !important; +} + +/** + * Text Decoration utilities + */ +.u-textUnderline { + text-decoration: underline !important; +} + +.u-textLineThrough { + text-decoration: line-through !important; +} + +.u-textDecorationNone { + text-decoration: none !important; +} + +@media (min-width: 480px) { + .u-xs-fontSizeXs { + font-size: 10px !important; + } + .u-xs-fontSizeSm { + font-size: 12px !important; + } + .u-xs-fontSizeMd { + font-size: 13px !important; + } + .u-xs-fontSizeLg { + font-size: 16px !important; + } + .u-xs-fontSizeXl { + font-size: 23px !important; + } + .u-xs-fontSizeXxl { + font-size: 26px !important; + } + .u-xs-textCenter { + text-align: center !important; + } + .u-xs-textLeft { + text-align: left !important; + } + .u-xs-textRight { + text-align: right !important; + } + .u-xs-textUnderline { + text-decoration: underline !important; + } + .u-xs-textLineThrough { + text-decoration: line-through !important; + } + .u-xs-textDecorationNone { + text-decoration: none !important; + } + .u-xs-textNoWrap { + white-space: nowrap !important; + } + .u-xs-textEllipsis { + text-overflow: ellipsis !important; + overflow: hidden !important; + } + .u-xs-textNormal { + font-weight: 400 !important; + } + .u-xs-textSemiBold { + font-weight: 600 !important; + } + .u-xs-textBold { + font-weight: 700 !important; + } +} +@media (min-width: 768px) { + .u-sm-fontSizeXs { + font-size: 10px !important; + } + .u-sm-fontSizeSm { + font-size: 12px !important; + } + .u-sm-fontSizeMd { + font-size: 13px !important; + } + .u-sm-fontSizeLg { + font-size: 16px !important; + } + .u-sm-fontSizeXl { + font-size: 23px !important; + } + .u-sm-fontSizeXxl { + font-size: 26px !important; + } + .u-sm-textCenter { + text-align: center !important; + } + .u-sm-textLeft { + text-align: left !important; + } + .u-sm-textRight { + text-align: right !important; + } + .u-sm-textUnderline { + text-decoration: underline !important; + } + .u-sm-textLineThrough { + text-decoration: line-through !important; + } + .u-sm-textDecorationNone { + text-decoration: none !important; + } + .u-sm-textNoWrap { + white-space: nowrap !important; + } + .u-sm-textEllipsis { + text-overflow: ellipsis !important; + overflow: hidden !important; + } + .u-sm-textNormal { + font-weight: 400 !important; + } + .u-sm-textSemiBold { + font-weight: 600 !important; + } + .u-sm-textBold { + font-weight: 700 !important; + } +} +@media (min-width: 992px) { + .u-md-fontSizeXs { + font-size: 10px !important; + } + .u-md-fontSizeSm { + font-size: 12px !important; + } + .u-md-fontSizeMd { + font-size: 13px !important; + } + .u-md-fontSizeLg { + font-size: 16px !important; + } + .u-md-fontSizeXl { + font-size: 23px !important; + } + .u-md-fontSizeXxl { + font-size: 26px !important; + } + .u-md-textCenter { + text-align: center !important; + } + .u-md-textLeft { + text-align: left !important; + } + .u-md-textRight { + text-align: right !important; + } + .u-md-textUnderline { + text-decoration: underline !important; + } + .u-md-textLineThrough { + text-decoration: line-through !important; + } + .u-md-textDecorationNone { + text-decoration: none !important; + } + .u-md-textNoWrap { + white-space: nowrap !important; + } + .u-md-textEllipsis { + text-overflow: ellipsis !important; + overflow: hidden !important; + } + .u-md-textNormal { + font-weight: 400 !important; + } + .u-md-textSemiBold { + font-weight: 600 !important; + } + .u-md-textBold { + font-weight: 700 !important; + } +} +@media (min-width: 1200px) { + .u-lg-fontSizeXs { + font-size: 10px !important; + } + .u-lg-fontSizeSm { + font-size: 12px !important; + } + .u-lg-fontSizeMd { + font-size: 13px !important; + } + .u-lg-fontSizeLg { + font-size: 16px !important; + } + .u-lg-fontSizeXl { + font-size: 23px !important; + } + .u-lg-fontSizeXxl { + font-size: 26px !important; + } + .u-lg-textCenter { + text-align: center !important; + } + .u-lg-textLeft { + text-align: left !important; + } + .u-lg-textRight { + text-align: right !important; + } + .u-lg-textUnderline { + text-decoration: underline !important; + } + .u-lg-textLineThrough { + text-decoration: line-through !important; + } + .u-lg-textDecorationNone { + text-decoration: none !important; + } + .u-lg-textNoWrap { + white-space: nowrap !important; + } + .u-lg-textEllipsis { + text-overflow: ellipsis !important; + overflow: hidden !important; + } + .u-lg-textNormal { + font-weight: 400 !important; + } + .u-lg-textSemiBold { + font-weight: 600 !important; + } + .u-lg-textBold { + font-weight: 700 !important; + } +} +.progress { + --progress-height: 1rem; + --progress-bg: #e9ecef; + --progress-border-radius: 2px; + --progress-box-shadow: 1px 1px 1px rgba(56, 56, 56, 0.15) inset; + --progress-bar-color: #ffffff; + --progress-bar-bg: #7fc243; + --progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--progress-height); + overflow: hidden; + background-color: var(--progress-bg); +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--progress-bar-bg); +} + +.progress-bar-striped { + background-size: var(--progress-height) var(--progress-height); +} + +:root { + --bc-text-muted:#6c757d; + --bc-avail-color-yes: $cu-positive; + --bc-avail-color-no: $cu-negative; + --bc-avail-color-maybe:#113b63; +} + +.availability-bar.going { + background-color: #7fc243; +} +.availability-bar.not-going { + background-color: #e26362; +} +.availability-bar.maybe { + background-color: #1A6BAF; +} +.availability-bar.unknown { + background-color: #d6d6d6; +} + +header.Header { + background: #323669; + padding: 8px 0; + box-shadow: 0 4px 0 rgba(0, 0, 25, 0.1); + border-bottom: 1px solid #d6d6d6; + color: white; +} + +body { + background-color: rgb(246, 246, 246); +} + +/* .u-padSm.u-border.u-borderRadiusLg.u-spaceEndsSm.u-maxWidthXs */ +.event-card { + font-family: "Open Sans", Helvetica, sans-serif; + border: 1px solid #e6e6e6; + border-radius: 8px; + max-width: 480px; + margin-top: 8px; + margin-bottom: 8px; + background: white; +} +.event-card .title { + margin-bottom: 4px; +} +.event-card .event-card-body { + padding: 8px 8px 8px 8px; +} + +.event-card-body > .availability-bar { + margin: 4px; +} +.event-card-body > .availability-bar.fullwidth { + margin-top: 4px; + margin-bottom: -8px; + margin-left: -8px; + margin-right: -8px; +} +.event-card-body .availability-bar.fullwidth .progress { + margin-left: -8px; + margin-right: -8px; + border-radius: 0; +} + +.event-card .date, .event-card .location { + color: #7a7a7a; + font-size: 0.9em; +} +.event-card .Button span { + margin-left: 4px; +} +.event-card .event-card-footer { + padding: 8px; + border-radius: 0px 0px 8px 8px; + background-color: rgb(251, 251, 251); + border-top: solid 1px rgb(214, 214, 214); +} + +.event-card-footer div { + text-align: center; +} + +.Header-bannerLogo, .Header-bannerTitle { + margin: 0; + padding: 0; + margin-left: 0.5em; +} + +.Header-bannerLogo img { + height: 36px; + width: auto; +} + +.Header-bannerTitle { + font-family: "Helvetica", sans-serif; + text-transform: uppercase; + font-weight: bold; + text-align: left; + color: white; + font-size: 28px; +} + +.benchcoach-nav { + background-color: #323669; + margin-bottom: 2em; + padding: 0.5em; + color: white; +} + +a.Panel-row { + color: inherit; +} + +.benchcoach-nav h3 { + font-family: "Helvetica", sans-serif; + font-weight: bolder; + color: white; + text-transform: uppercase; +} + +.lineup-slot .Panel-cell { + display: inline-flex; + align-items: center; +} + +div[id^=event-lineup] { + max-width: 576px; + counter-reset: lineup-sequence-counter 0; +} + +.lineup-slot { + counter-increment: lineup-sequence-counter 1; +} +.lineup-slot .Panel-cell.Panel-cell--header { + background: rgba(255, 255, 255, 0); +} +.lineup-slot [class*=availability-status-code]::before { + padding-right: 6px; + font-family: "bootstrap-icons"; +} + +.lineup-slot .availability-status-code-1 .icon { + color: #7fc243; +} + +.lineup-slot .availability-status-code-2 .icon { + color: #1A6BAF; +} + +.lineup-slot .availability-status-code-0 .icon { + color: #e26362; +} + +.lineup-slot .availability-status-code-nil .icon, .lineup-slot .availability-status-code- .icon { + color: #d6d6d6; +} + +li .availability-status-code- { + content: "\f50b"; + color: var(--bs-secondary); +} + +.lineup-slot { + line-height: 100%; + vertical-align: middle; +} +.lineup-slot span { + margin: auto; +} +.lineup-slot .lastname { + text-transform: uppercase; + font-weight: bold; +} +.lineup-slot .jerseynumber { + text-transform: uppercase; + font-weight: light; + color: var(--bc-text-muted); + font-size: 0.8em; + margin-left: 4px; +} +.lineup-slot button { + margin-right: 0.5ch; +} +.lineup-slot .sequence { + width: 2.4ch; + text-align: right; + margin-right: 0.3ch; +} +.lineup-slot .sequence::before { + content: counter(lineup-sequence-counter); +} +.lineup-slot .drag-handle { + width: 2ch; +} +.lineup-slot .position-select-box { + width: 10ch; +} +.lineup-slot .Panel-cell:has(.sequence), .lineup-slot .Panel-cell:has(.drag-handle), .lineup-slot .Panel-cell:has(.position-select-box) { + flex: 0 0 0% !important; + padding: 0; +} + +div[id^=event-lineup] .Panel.position-only .Panel-cell:has(.sequence), div[id^=event-lineup] .Panel.bench .Panel-cell:has(.sequence), div[id^=event-lineup] .Panel.out .Panel-cell:has(.sequence) { + display: none; +} +.Tooltip:after { + padding: 2px !important; + font-size: inherit !important; +} + +@media (max-width: 480px) { + .Panel--full { + border-radius: 0; + margin-right: -16px; + margin-left: -16px; + } +} +.lineup-email { + font-family: "Helvetica", sans-serif; +} +.lineup-email .title-cell { + font-weight: bold; + background-color: #323669; + color: #fff; + padding: 2px 5px; + text-transform: uppercase; +} +.lineup-email .title-cell.out { + background-color: rgb(244, 199, 195); + color: black; +} +.lineup-email .sequence-cell { + font-weight: bold; + padding: 1px 5px; + text-align: left; +} +.lineup-email .name-cell { + width: 200px; + text-align: left; +} +.lineup-email .position-label-cell { + font-weight: bold; + text-align: right; +} + +.Panel .Panel { + border: none; + margin: 0; +} + +/*# sourceMappingURL=application.css.map */ diff --git a/src/public/css/application.css.map b/src/public/css/application.css.map new file mode 100644 index 0000000..73f0819 --- /dev/null +++ b/src/public/css/application.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../scss/application.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/fonts/museo.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/fonts/open-sans.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/fonts/ss-pika.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/base/reset.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/base/typography.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/config/config.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Avatar.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Button.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/ButtonGroup.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Checkbox.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Daypicker.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Divider.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Feedback.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/FieldGroup.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Grid.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Icon.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Input.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/InputGroup.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Loader.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Modal.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/PaginationButton.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Panel.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Popup.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Progress.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/SelectBox.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/config/mixins.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/StepNav.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/SummaryList.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Tabs.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Toggle.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/components/Tooltip.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/utils/border.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/utils/color.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/utils/display.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/utils/flex.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/utils/max-width.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/utils/position.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/utils/size.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/utils/space.scss","../../../node_modules/@teamsnap/teamsnap-ui/src/css/utils/text.scss","../../scss/components/_progress.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACMA;EACE;EACA;EACA;EAGA;EACA;;AAGF;EACE;EACA;EACA;EAGA;EACA;;AAGF;EACE;EACA;EACA;EAGA;EACA;;AAGF;EACE;EACA;EACA;EAGA;EACA;;AAGF;EACE;EACA;EACA;EAGA;EACA;;AAGF;EACE;EACA;EACA;EAGA;EACA;;AC/DF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;;AC/GF;EACE;EACA;EAIA;EACA;;AAsBA;EAlBA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAME;;AAEF;EACE;;AAEF;EACE;;;AAIJ;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;AAAA;EAEE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;AAAA;EAEE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;AAAA;EAEE;;;AAEF;AAAA;EAEE;;;AAEF;EACE;;;AAGF;AAAA;EAEE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;AAAA;EAEE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EArcA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AA0bA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;;ACjeJ;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACG;;;ACnBH;EACE,OCyCwB;EDxCxB,aC4FuB;ED3FvB,WC0G8B;EDzG9B;EACA;EACA;EACA;EACA,aCuH4B;EDtH5B,gBC8GyB;;;AD3G3B;AAAA;EAEE,aCwFwB;;;ADrF1B;EACE,OCyBwB;EDxBxB,WCyF6B;EDxF7B,aC0G2B;EDzG3B,gBCiGwB;;;AD9F1B;EACE,OCgCsB;ED/BtB;EACA;EACA;;AACA;EACE,OCwDiB;;ADtDnB;EAEE;;;AAMJ;EACE,aCkDyB;EDjDzB,OC7ByC;;;ADgC3C;EACE,aCgDuB;;;AD7CzB;EACE,WC+D8B;ED9D9B,aC4E4B;ED3E5B,gBCsEyB;;;ADnE3B;EACE,WCwD8B;EDvD9B,aCsE4B;EDrE5B,gBC+DyB;;;AD5D3B;EACE,WCiD8B;EDhD9B,aCuCwB;EDtCxB,aC+D4B;ED9D5B,gBCuDyB;;;ADpD3B;EACE,WCwC8B;EDvC9B,aCgCwB;ED/BxB,aCuD2B;EDtD3B,gBC+CyB;;;AD5C3B;EACE,WCgC6B;ED/B7B,aCyBwB;EDxBxB,aCgD2B;ED/C3B,gBCuCwB;;;ADpC1B;EACE,WCyB6B;EDxB7B,aCiBwB;EDhBxB,aCyC2B;EDxC3B,gBC+BwB;;;ACxHxB;EACE;EACA;EACA;;AAIA;EACE,OAnBE;EAoBF,QApBE;;AAkBJ;EACE,OAnBE;EAoBF,QApBE;;AAkBJ;EACE,OAnBE;EAoBF,QApBE;;AAkBJ;EACE,OAnBE;EAoBF,QApBE;;AAkBJ;EACE,OAnBE;EAoBF,QApBE;;AAkBJ;EACE,OAnBE;EAoBF,QApBE;;;ACuBR;EACE,kBFYyC;EEXzC;EACA,qBFqKqB;EEpKrB,eFgKqB;EE/JrB,OF4BwB;EE3BxB;EACA;EACA,aF6EuB;EE5EvB,WF2F8B;EE1F9B,aFmFwB;EElFxB,QAfc;EAgBd,aAfmB;EAgBnB;EACA,SAhBe;EAiBf;EACA;EACA;EACA;;AAEA;EAGE,kBAtCc;EAuCd,cApCwB;EAqCxB,OFQsB;EEPtB;;AAGF;EACE,kBA7Cc;EA8Cd;EACA,kBFwImB;EEvInB;;AAKA;EAGE,kBF5BqC;EE6BrC,cFbqB;EEcrB;EACA,OFXoB;EEYpB,SArDoB;;;AAoE1B;EACE,kBFrDyC;EEsDzC,cAL6B;EAM7B,OFlDyC;;AEoDzC;EAGE,kBAduB;EAevB,cAXiC;EAYjC,OFzDuC;;AE4DzC;EACE,kBApBuB;EAqBvB,OF9DuC;;AEmEvC;EAGE,kBF3EqC;EE4ErC,cA3ByB;EA4BzB,OFxEqC;;;AEuF3C;EACE,kBFjGyC;EEkGzC,cAL0B;EAM1B,OF1FyC;;AE4FzC;EAGE,kBAdoB;EAepB,cAX8B;EAY9B,OFjGuC;;AEoGzC;EACE,kBApBoB;EAqBpB,OFtGuC;;AE2GvC;EAGE,kBFvHqC;EEwHrC,cA3BsB;EA4BtB,OFhHqC;;;AE+H3C;EACE,kBFvIyC;EEwIzC,cAL4B;EAM5B,OFlIyC;;AEoIzC;EAGE,kBAdsB;EAetB,cAXgC;EAYhC,OFzIuC;;AE4IzC;EACE,kBApBsB;EAqBtB,OF9IuC;;AEmJvC;EAGE,kBF7JqC;EE8JrC,cA3BwB;EA4BxB,OFxJqC;;;AEuK3C;EACE,kBFxKyC;EEyKzC,cFzJyB;EE0JzB,OF9KyC;;AEgLzC;EAGE,kBFnLuC;EEoLvC,cFjJkB;EEkJlB,OFjLuC;;AEoLzC;EACE,kBFzLuC;EE0LvC,cFvJkB;EEwJlB,OFvLuC;;AE4LvC;EAGE,kBF/LqC;EEgMrC,cFhLqB;EEiLrB,OFrMqC;;;AEmN3C;EACE,WF1H6B;EE2H7B,QAPqB;EAQrB,aAP0B;EAQ1B,SAPsB;;;AAaxB;EACE,OAhBqB;EAiBrB,QAjBqB;EAkBrB,aAjB0B;EAkB1B;EACA;;;AAWF;EACE,WFjJ8B;EEkJ9B,QANqB;EAOrB,aAN0B;EAO1B,SANsB;;;AAmBxB;EACE,WFlK8B;EEmK9B,QANoB;EAOpB,aANyB;EAOzB,SANqB;;;AAiBvB;AAAA;AAAA;EAGE,kBFjRyC;EEkRzC,OF7QyC;EE8QzC;;;AAIA;EACE;EACA,OFpRuC;EEqRvC;;;AAIJ;AAAA;AAAA;EAGE,kBFpSyC;EEqSzC,OF7RyC;EE8RzC;;;AAIA;EACE;EACA,OFpSuC;EEqSvC;;;AAIJ;AAAA;AAAA;EAGE,kBFhTyC;EEiTzC,OF7SyC;EE8SzC;;;AAIA;EACE;EACA,OFpTuC;EEqTvC;;;ACjVJ;EACE;EACA;;;AAOF;EACE,aAhBkB;;;AAmBpB;EACE;;;AAMF;EACE,wBH8JqB;EG7JrB,2BH6JqB;;;AG1JvB;EACE,yBHyJqB;EGxJrB,4BHwJqB;;;AIpEvB;EAIE;EACA,gBJ0Bc;;AIzHd;EACE,QJwHY;EIvHZ,OJuHY;;AIpHd;EACE;EACA,YJkHY;EIjHZ,aJiHY;;AI/GZ;EACE,QJ8GU;EI7GV,OJ6GU;;AIxGZ;EACE;;AAEA;EACE;EACA;;AAOJ;EACE;;AAIF;EACE;;AAQJ;EACE,kBJ1CuC;;AI+CvC;EAIE,cJnDqC;;AIyDvC;EACE,kBJ1DqC;;AIgEvC;EACE,cJjEqC;;AIwErC;EACE,cJzEmC;;AI4EvC;EACE,cJ7EqC;EI8ErC;;AAEF;EACE,eJqCW;;;AItBjB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,kBJ/GuC;EIgHvC;EACA,eJqCmB;EIpCnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EAEA;;;AAMA;AAAA;AAAA;EACE;;AAGF;AAAA;EACE;EAEA,kBJ/HuB;EIgIvB;;;AAQF;EACE;EACA;;AAGF;EACE;EACA,cJLmB;EIMnB;;AAGF;EACE;;;AAOJ;EACE;EACA;;AAEA;EACE,aJhEY;EIiEZ,cJhEa;EIiEb;;AACA;EACE,MJnEW;;;AI2Ef;EACE;EACA,eJ1Ea;EI2Eb,SJ9Ea;EI+Eb;;AAEA;EACE,MJlFW;;;AIxHf;EACE,QARmB;EASnB,OATmB;;AAYrB;EACE;EACA,YAdmB;EAenB,aAfmB;;AAiBnB;EACE,QAlBiB;EAmBjB,OAnBiB;;AAwBnB;EACE;;AAEA;EACE;EACA;;AAOJ;EACE;;AAIF;EACE;;;AAQJ;EACE,kBJ9CuC;;AImDvC;EAIE,cJvDqC;;AI6DvC;EACE,kBJ9DqC;;AIoEvC;EACE,cJrEqC;;AI4ErC;EACE,cJ7EmC;;AIgFvC;EACE,cJjFqC;EIkFrC;;AAEF;EACE,eJqCW;;;AK/If;EACE;;AAEF;EACE;;AAEF;EACE,YLcuC;EKbvC,OLsBuC;;;AKlB3C;EACE,kBLQyC;;;AKL3C;EACE;;;ACZF;EACE;EACA;EACA;EACA;EACA;;;AAKF;EACE;;;AAKF;EACE,kBNwHc;;;AMnHhB;EACE;EACA;EACA,SNkHc;;;AOzIhB;EACE;EACA;EACA;EACA,eP0KqB;EOzKrB;EACA,SPkIe;EOjIf,YPgByC;EOfzC;EACA;;;AAGF;EACE,OP+He;EO9Hf;EACA;EACA;EACA;EACA;EACA,SPqHe;EOpHf,OPGyC;;;AOA3C;EACE,aPgFwB;EO/ExB;;;AAGF;EACE;EACA,WPkF8B;EOjF9B,OPiF8B;EOhF9B;EACA;EACA;EACA;EACA;EACA,OPEyB;EODzB;;AACA;EACE,OPIsB;;;AOExB;AAAA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAMJ;EACE,cPzCyC;;AO0CzC;EACE,YP3CuC;;;AO+C3C;EACE,cP/CyC;;AOgDzC;EACE,YPjDuC;;AOmDzC;EACE,OPjBkB;;;AOqBtB;EACE,cP5DyC;;AO6DzC;EACE,YP9DuC;;AOgEzC;EACE,OPZkB;;;AOgBtB;EACE;;AACA;EACE;EACA,OP3EuC;;;AOiF3C;EACE,eP2Ce;;;AOxCjB;EACE;EACA;EACA;EACA;EACA,OPiCc;EOhCd,YPoFkB;EOnFlB;EACA;;AACA;EACE,KP4BY;EO3BZ;;;AC5GJ;EACE,eRsIc;EQrId;;;AAGF;EACE;EACA,gBR8Hc;EQ7Hd,WRoG8B;EQnG9B,aR4FwB;;;AQzF1B;EACE,OR6BwB;EQ5BxB,WR8F8B;EQ7F9B,aRsHc;EQrHd;;;AAGF;EACE,ORHyC;;;AQM3C;EACE;EACA,ORTyC;EQUzC;EACA;EACA;;;AAMA;EACE,cRlBuC;;;AQuBzC;EACE;;AAGF;EACE,cR0FY;;;AS1IhB;EACE;EACA;EACA;EACA;EACA;EACA;;;AAMF;EACE;;;AAMF;EACE;;;AAaF;EACE;;;AAMF;EACE;;;AAMF;EACE;EACA;;;AAGF;EACE;;;AAgBF;EACE;EACA;EACA;;;AAUF;EACE;;;ACxFF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAQF;EACE;EACA;EACA;;AAEA;EACE,kBATkB;EAUlB;EACA;EACA;;;AAIJ;EACE;IACE;;EAEF;IACE;;;AAIJ;EACC;IACE,mBA3BmB;;EA6BrB;IACE;IACA;;EAEF;IACE,mBAlCmB;IAmCnB;;;ACpCH;EACE;EACA,OXkCwB;EWjCxB;EACA;EACA,QX+He;EW9Hf,aAXuB;EAYvB;EACA;EACA;EACA,kBXMyC;EWLzC;EACA,eX2JqB;EW1JrB;EACA,WXyF8B;EWxF9B;;AAEA;EACE,YXQuB;EWPvB,OXJuC;EWKvC;;AAGF;EACE;EACA,cXlBuC;;AWqBzC;EACE;;;AAKJ;AAAA;AAAA;EAGE;EACA,yBXFwB;;;AWK1B;EACE,WX+D8B;EW9D9B,QX0Fe;EWzFf,aXyFe;;;AWpFjB;EACE,eAHqB;;;AASvB;EACE;EACA;EACA;EACA;EACA,OAdqB;EAerB;EACA;EACA;EACA,OX5BwB;EW6BxB;EACA,WXoC8B;EWnC9B;EACA;EACA;EACA,SX0De;EWzDf;EACA;;;AAGF;EACE;EACA,OX1CwB;;;AW6C1B;EACE;EACA;EACA;EACA,OXjDwB;;;AYvC1B;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIA;EACE;EACA;;;AAOF;EACE;;AAGF;EACE;EACA;;;AAKF;EACE;;AAGF;EACE;EACA;;;ACpCJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA,YbLyC;EaMzC;EACA;EACA;EACA;EACA,ebmJqB;;;AahJvB;EACE;EACA,QbwGc;EavGd,YbQyB;EaPzB;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE,4BbmImB;;EajIrB;IACE;;EAEF;IACE,4Bb2Fa;Ia1Fb;;EAEF;IACE;;EAEF;IACE;;;AAIJ;EACE;IACE;;;AAQJ;EACE;EACA,ObiEe;EahEf,QbgEe;Ea/Df,kBb7BwB;Ea8BxB;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;IACE;;EAEF;IACE;;;AAMJ;EACE;EACA,ObuCe;EatCf,QbsCe;EarCf;EACA;EACA,QbgCc;Ea/Bd;EACA;EACA;EACA;;;AAGF;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;;AAMJ;EACE;EACA;EACA;;;AAGF;EACE;EACA,QbOe;EaNf,ebGe;EaFf;EACA;;;AAGF;EACE,Wb3B8B;Ea4B9B,abpCwB;EaqCxB,abFe;EaGf,ObnGwB;EaoGxB,cbRc;;;AaWhB;EACE;EACA;EACA,WbrC8B;EasC9B,Ob1GwB;;;AaiHxB;EACE;;AAGF;EACE;EACA,ObvHsB;EawHtB,ab9DsB;;AaiExB;EACE,WbvD4B;EawD5B,ablEsB;;;AauE1B;EACE;EACA;EACA;EACA;EACA;;;AC9KF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;;AAGF;EACE;;;AAYJ;EACE;EACA;EACA;EACA;EACA,kBdjByC;EckBzC,edsIsB;EcrItB;EACA,YdkJkB;EcjJlB,QAjDkB;EAuDhB,SdwFa;;;AclFjB;EAOI;EACA,gBd0Ea;;;AcpEjB;EACE;EACA,OdjCyB;EckCzB;EACA,Sd8De;Ec7Df,Qd8Dc;Ec7Dd,Od6Dc;Ec5Dd;EACA;EACA;;AAEA;EACE;;;AAKJ;EACE;EACA;EASE,Wde4B;Ecd5B,OdrFuC;EcsFvC,adRuB;;;AcuB3B;EAQI,YdgBa;Ecfb;;;AAMJ;EACE;EACA;EACA;;;AAGF;EACE;IACE;;EAEF;IACE;;;AAIJ;EACE;IACE;;EAEF;IACE;;;ACtKJ;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;ACsBF;EACE;EACA,YhBCyC;EgBAzC,OhBoBwB;EgBnBxB,ehBiHc;EgBhHd;EACA,ehBqJsB;EgBpJtB;;;AASF;EACE;;;AAMF;EACE,wBhBmIsB;;;AgBhIxB;EACE,yBhB+HsB;;;AgB5HxB;EACE,2BhB2HsB;;;AgBxHxB;EACE,4BhBuHsB;;;AgBjHxB;AAAA;AAAA;EAGE;;;AAMF;AAAA;AAAA;AAAA;EAIE,ShB8Dc;;;AgBrDhB;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EACE,ShByCY;EgBxCZ;;;AAOJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAYJ;EACE,OhBnFwB;EgBoFxB,ahBhCuB;EgBiCvB,WhBlB8B;EgBmB9B,ahBzBwB;EgB0BxB;EACA;EACA;;;AAOF;EACE;;;AASF;EACE;EACA;;;AAGF;EACE,kBhB5HyB;EgB6HzB;EACA,ahBtDwB;;;AgB+D1B;EACE;EACA;;;AAQF;EACE,kBhBlJyB;EgBmJzB;EACA,ahB5EwB;;;AgBmF1B;EACE;EACA;;;AAaF;EACE,kBhB3KyB;;;AgBiMvB;EAGI;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE,ahB5GO;;EgB+GT;AAAA;IAEE;;EAGF;IACE,yBhB9Ec;;EgBiFhB;IACE,2BhBlFc;;;AgBiDpB;EAGI;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE,ahB5GO;;EgB+GT;AAAA;IAEE;;EAGF;IACE,yBhB9Ec;;EgBiFhB;IACE,2BhBlFc;;;AgBiDpB;EAGI;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE,ahB5GO;;EgB+GT;AAAA;IAEE;;EAGF;IACE,yBhB9Ec;;EgBiFhB;IACE,2BhBlFc;;;AgBiDpB;EAGI;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE,ahB5GO;;EgB+GT;AAAA;IAEE;;EAGF;IACE,yBhB9Ec;;EgBiFhB;IACE,2BhBlFc;;;AgBgGtB;EACE;;;AAMJ;EACE;;AACA;EACE,WhB7K2B;;;AgBkL7B;EACE,OhB/QuC;EgBgRvC;;AACA;EACE;;;AAKN;EACE,YhBzQyB;EgB0QzB;EACA;;AACA;EACE;;AAEF;EACE,WhBlM2B;EgBmM3B,OhBpQsB;EgBqQtB,ahBzKa;EgB0Kb,gBhB1Ka;;AgB6Kb;EACE,ahB7KU;;AgBiLZ;EACE,gBhBlLU;;AgBqLd;EACE;EACA;;;AAKF;EACE;;AACA;EACE;;;ACzUN;EACE;EACA;;;AAoBF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAQF;AAAA;EAEE;EACA;EACA;EACA;EACA,OAxDiB;EAyDlB,QAzDkB;EA0DjB,kBjBzByC;EiB0BzC;EACA;;;AAKF;EACE;EACA;EACA,YjBiIkB;;;AiB3HpB;EACE;;;AAMF;EACE,kBjBjDyC;EiBkDzC,OjB9BwB;EiB+BxB;EACA,ejBmGqB;EiBlGrB,YjB+GkB;EiB9GlB;;;AAQF;EACE;EACA;;AAEA;EAEE;;;AASJ;EACE;EACA;;AACA;EACE;;AAEF;EACE;;;AAQJ;EACE;EACA;;AAEA;EAEE,MjBiBa;EiBhBb;;;AAQJ;EACE;EACA;;AAEA;EAEE;EACA;;;AASJ;EACE;EACA;EACA;;AAEA;EAEE;EACA,OjBhBa;EiBiBb;;;AAQJ;EACE;EACA;EACA;;AAEA;EAEE;EACA;EACA;;;AAYF;EACE;EACA;EACA;;;AAKJ;EACE,QjBxDc;EiByDd;EACA;EACA;;AAEA;EACE;EACA;;;AASF;AAAA;AAAA;EACE;;;AAOJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAIJ;EACE;IACE;;EAEF;IACE;;;AChOJ;EACE,QlB8He;EkB7Hf,YlBwByB;EkBvBzB;EACA;;;AAGF;EACE,YlBCyC;EkBAzC;EACA;;;AAGF;AAAA;EAEE;;;AAKF;EACE,QlBwGc;;AkBvGd;EACE;;;AAIJ;EACE,QlBkGc;;AkBjGd;EACE;;;AAIJ;EACE,QlB6Fc;;AkB5Fd;EACE;;;AAIJ;EACE,QlBuFe;;AkBtFf;EACE;;;AAMJ;EACE;EACA,OlB8Ee;EkB7Ef;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;;;AASF;EACE,OlBsDY;;AkBrDZ;EACE;;AAIJ;EACE,OlBgDa;;AkB/Cb;EACE;;AAIJ;EACE;;AACA;EACE;;AAIJ;EACE;;AACA;EACE;;;AAUJ;EACE;EACA;;AAIA;EACE;EACA;;;AAQN;EACE;EACA;EACA,YlBpGyB;EkBqGzB;EACA;EACA;;AAEA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YlBkCsB;;AkB/BxB;EACE;EACA;EACA,YlBwBgB;EkBvBhB,YlB7IuC;;;AkBkJ3C;EACE;EACA;EACA;EACA;EACA;EACA;;;AAKA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EAEE;EACA;EACA,clBjLuC;;;AkBuL3C;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AAKJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AAKJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AAKJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AAUD;EACE,YlB/NqB;;;AkBsOvB;EACE,YlBhQsC;;;AkBuQzC;EACE,YlB3QuC;;;AkBkRzC;EACE,clBvPsB;;;AkB8PxB;EACE,clBxRuC;;;AkB+RzC;EACE,clBnSuC;;;AmBb3C;EACE;EACA;EACA;;AAEA;ECuCA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EDnDE;EACA;EACA;EACA;EACA;EACA;EACA,OAjBwB;EAkBxB;EACA,WnB0F2B;EmBzF3B;EACA;EACA;EACA;EACA;;;AAIJ;EACE,QnB+Ge;EmB9Gf;EACA,anB6Ge;EmB5Gf;EACA,cnBwGe;EmBvGf,OnBUwB;EmBTxB,kBnBXyC;EmBYzC,anB4DuB;EmB3DvB,enB0IqB;EmBzIrB;EACA;EACA;EACA;EACA;;AAGA;EACE;;AAIF;EACE,cnBpCuC;EmBqCvC;;AAGF;EAEE,OnBhBuB;EmBiBvB;;;AAKJ;EACE;;;AAGF;EACE,WnB6C8B;EmB5C9B,QnBwEe;EmBvEf,anBuEe;;;AqBxEjB;EACE,gBrBqEe;;;AqBtHf;EACE,cAHY;;;AAOZ;EACE;EACA,QAvBY;EAwBZ;EACA,OAXU;;AAeV;EACE;;AAIF;EACE;;;AAKN;EACE;;;AAGF;EACE,OA5CiB;EA6CjB;EACA,aA/Cc;;;AAkDhB;EACE;EAEE,cArDY;EAuDd,QAxDW;EAyDX,OAzDW;EA0DX;EACA;;;AAYJ;EACE;EACA,gBrB2Dc;EqB1Dd;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,YrBpDuB;;AqBuDzB;EACE;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAKF;AAAA;EAEE,OrB/FqC;EqBgGrC;;AAEF;EACE,crBnGqC;EqBoGrC;;AAEF;EACE,kBrBvGqC;EqBwGrC;;AAMF;EACE,OrBtGqC;EqBuGrC,crBvFqB;EqBwFrB,kBrBjHqC;;AqBqHvC;EACE,OrB7GqC;EqB8GrC,crB9FqB;EqB+FrB,kBrBxHqC;;;AqB6H3C;EACE;EACA;EACA;EACA,OrBxGyB;;;AqB2G3B;EACE;EACA;EACA;EACA,OrB/GyB;EqBgHzB,arBxDuB;EqByDvB,WrB1C8B;EqB2C9B;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGE;EACA,crBlIuB;;;AqBnBzB;EACE,cAHY;;AAOZ;EACE;EACA,QAnBmB;EAoBnB;EACA,OAXU;;AAeV;EACE;;AAIF;EACE;;AAKN;EACE;;AAGF;EACE,OA5CiB;EA6CjB;EACA,aA3CqB;;AA8CvB;EACE;EAEE,cAjDmB;EAmDrB,QApDkB;EAqDlB,OArDkB;EAsDlB;EACA;;AAqHF;EACE;;;AAhKF;EACE,cAHY;;AAOZ;EACE;EACA,QAhBoB;EAiBpB;EACA,OAXU;;AAeV;EACE;;AAIF;EACE;;AAKN;EACE;;AAGF;EACE,OA5CiB;EA6CjB;EACA,aAxCsB;;AA2CxB;EACE;EAEE,cA9CoB;EAgDtB,QAjDmB;EAkDnB,OAlDmB;EAmDnB;EACA;;AAiIF;EACE;;;ADlKF;EACE;EACA;EACA;;AC0KF;AAAA;EAEE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA,erB5Fe;EqB6Ff;EACA,aAnOa;;AAoOb;EACE;EACA;EACA;EACA;EACA,QAxOc;EAyOd;EACA,YrBhOuC;;;AsB9B3C;EACE,OtB0DwB;EsBzDxB,WtB4H8B;EsB3H9B;EACA;EACA,etBkJc;;;AsB/IhB;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;AACA;EACE;EACA,atBmIa;EsBlIb;EACA,atBiGsB;;AsB/FxB;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;;;AAKN;EACE;EACA;;;AAIA;EACE,atB2Ga;EsB1Gb;EACA;EACA;EACA,OtBWsB;EsBVtB,atB6DqB;EsB5DrB,atBqEsB;;AsBpEtB;EACE,OtBtBqC;EsBuBrC,atBkGW;;;AuBxIjB;EACE;EACA;EACA,evBsIc;;;AuBnIhB;EAEE;EACA;EACA;EACA;EACA,OvBgCwB;EuB/BxB,avBkFuB;EuBjFvB,avByFwB;;AuBvFxB;EACE;;AAGF;EACE;EACA;EACA;EACA,QvB2JmB;EuB1JnB;EACA;EACA;EACA;;AAGF;EAEE,OvBnBuC;;AuBsBzC;EACE,YvBvBuC;;;AuB8B3C;EACE;;;AAGF;EACE;;;ACzCF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA,OxBNyC;EwBOzC,WxB+E6B;EwB9E7B;EACA,QA9Bc;EA+Bd,OA9Ba;EA+Bb,aAhCc;EAiCd,eAjCc;EAkCd,kBxBjByC;EwBkBzC;;AAEA;EACE,OxBjBuC;;AwBoBzC;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA,QAlDY;EAmDZ,OAnDY;EAoDZ,eApDY;EAqDZ,YxBhCuC;EwBiCvC;EACA;EACA;EACA;;;AAMF;EACE,kBxBhDuC;EwBiDvC;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AC/EN;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YzB6HY;EyB5HZ;EACA,SzB8HY;EyB7HZ,ezB4Ha;EyB3Hb;EACA;EACA,YzBgBuB;EyBfvB,YzB2KgB;EyB1KhB;EACA,WzB4F4B;EyB3F5B,azBmFsB;EyBlFtB;EACA;EACA,OzBqBsB;;AyBnBxB;EAEE;;;AAMJ;AAAA;EAEE,OzBwBsB;;;AyBrBxB;EACE;;;AC3CF;EACE,QAHa;;;AAMf;EACE;;;AAIA;EACE,cAZW;;;AAcb;EACE;;;AAJF;EACE,aAZW;;;AAcb;EACE;;;AAJF;EACE,eAZW;;;AAcb;EACE;;;AAJF;EACE,YAZW;;;AAcb;EACE;;;AAQA;EAEE;IACE,QA1BO;;EA6BT;IACE;;EAKA;IACE,cApCK;;EAuCP;IACE;;EALF;IACE,aApCK;;EAuCP;IACE;;EALF;IACE,eApCK;;EAuCP;IACE;;EALF;IACE,YApCK;;EAuCP;IACE;;;AAjBN;EAEE;IACE,QA1BO;;EA6BT;IACE;;EAKA;IACE,cApCK;;EAuCP;IACE;;EALF;IACE,aApCK;;EAuCP;IACE;;EALF;IACE,eApCK;;EAuCP;IACE;;EALF;IACE,YApCK;;EAuCP;IACE;;;AAjBN;EAEE;IACE,QA1BO;;EA6BT;IACE;;EAKA;IACE,cApCK;;EAuCP;IACE;;EALF;IACE,aApCK;;EAuCP;IACE;;EALF;IACE,eApCK;;EAuCP;IACE;;EALF;IACE,YApCK;;EAuCP;IACE;;;AAjBN;EAEE;IACE,QA1BO;;EA6BT;IACE;;EAKA;IACE,cApCK;;EAuCP;IACE;;EALF;IACE,aApCK;;EAuCP;IACE;;EALF;IACE,eApCK;;EAuCP;IACE;;EALF;IACE,YApCK;;EAuCP;IACE;;;AAkBR;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAMA;EAEI;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;;AAHN;EAEI;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;;AAHN;EAEI;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;;AAHN;EAEI;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;;AAmBR;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;ACjGJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAMF;EACE;;AACA;EACE;;;AAKJ;EACE;;AACA;EACE;;;AAMJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;IACE;;;AC1FJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAOF;EACE;EACA;;;AAGF;EACE;;;AAKE;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;;AAjCJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;;AAjCJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;;AAjCJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;;ACpER;EACE;;;AAMF;EACE;;;AAGF;EACE;;;AAMF;EACE;;;AAGF;EACE;;;AAMF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAMF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAQF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AASF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAMF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAaF;EACE;;;AAGF;EACE;;;AAOF;EACE;;;AAGF;EACE;;;AAOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAMF;EACE;;;AAGF;EACE;;;AAeF;EACE;EACA;;;AAOF;EACE;EACA;;;AAQF;EACE;EACA;;;AC1QE;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAGJ;EACE;;;ACfJ;EACE;;;AAGF;EACE;;;ACUE;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAQN;EACE;EACA;;;AASF;EACE;EACA;;;AAIF;EACE;EACA;;;AAME;EAGM;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAKN;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAtBJ;EAGM;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAKN;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAtBJ;EAGM;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAKN;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAtBJ;EAGM;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAKN;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;ACvCN;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAtCF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAtCF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAtCF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAtCF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAtCF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAtCF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAEF;AAAA;AAAA;EAGE;;;AAIJ;EACE;EACA;;;AAGF;EACE;;;AAOE;EAEI;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAIJ;IACE;IACA;;;AA9CJ;EAEI;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAIJ;IACE;IACA;;;AA9CJ;EAEI;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAIJ;IACE;IACA;;;AA9CJ;EAEI;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAtCF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAEF;AAAA;AAAA;IAGE;;EAIJ;IACE;IACA;;;AAUR;EACE;;;AC/IF;AAAA;AAAA;AAIA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;;;AAIF;AAAA;AAAA;AAcC;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAIH;AAAA;AAAA;AAIA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKE;EAGG;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EAIH;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;AAlDJ;EAGG;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EAIH;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;AAlDJ;EAGG;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EAIH;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;AAlDJ;EAGG;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EADF;IACE;;EAIH;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;ACpHR;EAEE;EAEA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EAEA;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EAEE;;;AzCnBF;EACE;EACA;EACA;EACA;;;AAIA;EACE,kBMduC;;ANiBzC;EACE,kBMjBuC;;ANoBzC;EACE,kBM1BuC;;AN6BzC;EACE,kBMtBuC;;;AN0B3C;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;;AAKF;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;;;AAKF;EACE;EACA;;AAKF;EACE;;AAGF;EACE;EACA;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;AAGE;EACE;;AAKJ;EACE;EACA;;;AAIJ;EACE,OM1KyC;;;AN6K3C;EACE,OMlLyC;;;ANqL3C;EACE,OMjLyC;;;ANqLzC;EACE,OMnLuC;;;ANuL3C;EACE;EACA;;;AAGF;EACE;EACA;;AACA;EACE;;AAEF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EAKE;;AAIJ;EACE;;AAEF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;;AAGF;EACE;;AAIA;EACE;EACA;;;AAOJ;EACE;;AAYJ;EACE;EACA;;;AAGF;EACA;IACI;IACA;IACA;;;AAGJ;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAKJ;EAGE;EAGA","file":"application.css"} \ No newline at end of file diff --git a/src/public/css/eventsheet.css b/src/public/css/eventsheet.css new file mode 100644 index 0000000..d0a1378 --- /dev/null +++ b/src/public/css/eventsheet.css @@ -0,0 +1,762 @@ +@charset "UTF-8"; +@import url("https://fonts.googleapis.com/css2?family=Pacifico"); +@import url("https://fonts.googleapis.com/css2?family=Oswald"); +@import url("https://fonts.googleapis.com/css2?family=Graduate"); +@import url("https://fonts.googleapis.com/css2?family=Inconsolata:wdth,wght@50..200,200..900&display=swap"); +@import url("/font/helvetica-now/stylesheet.css"); +@font-face { + font-family: "Futura Now"; + src: url("/font/futura-now/futura-now.ttf") format("truetype"); + font-weight: 125 900; + font-stretch: 50% 150%; +} +@page { + margin: 0; +} +/** For Print **/ +@media print { + body .sheet { + size: B5; + padding: 0.2in; + } +} +/** For screen preview **/ +@media screen { + body .sheet { + padding: 0.2in; + } + body { + background: #e0e0e0; + } + .sheet { + background: white; + box-shadow: 0 0.5mm 2mm rgba(0, 0, 0, 0.3); + } +} +.sheet { + overflow: hidden; + position: relative; + box-sizing: border-box; + page-break-after: always; +} + +/** Paper sizes **/ +body.B5 .sheet { + width: 176mm; + height: 250mm; +} + +body.index-card .sheet { + width: 3.5in; + height: 5in; +} + +:root { + --color-success: #b7e1cd; + --color-danger: #f4c7c3; + --color-neutral: #acc9fe; + --color-warning: rgb(249, 228, 180); + --color-grey-100: #f8f9fa; + --color-grey-200: #e9ecef; + --color-grey-300: #dee2e6; + --color-grey-400: #ced4da; + --color-grey-500: #adb5bd; + --color-grey-600: #6c757d; + --color-grey-700: #495057; + --color-grey-800: #343a40; + --color-grey-900: #212529; + --row-height: 14px; + --monospace-font: "Inconsolata", monospace; +} + +body { + font-family: "Helvetica Now", "Helvetica", sans-serif; + position: relative; + font-size: 11px; +} + +table { + position: inherit; + font-size: inherit; + border-collapse: collapse; + empty-cells: show; + white-space: nowrap; + text-overflow: ellipsis; + overflow-x: hidden; + overflow-y: hidden; + width: 100%; + border: 0.5px solid black; + display: inline-table; +} +table tr { + border-bottom-width: 0.5px; + border-color: grey; + border-bottom-style: solid; +} +table tr:nth-child(odd) { + background-color: rgba(242, 242, 242, 0.85); +} +table tr:nth-child(even) { + background-color: rgba(255, 255, 255, 0.85); +} +table tr th { + font-stretch: extra-condensed; + width: 1em; + text-align: center; + text-transform: uppercase; +} +table tr td.player-name { + text-transform: uppercase; + font-stretch: 75%; +} +table tr td.position, table tr td.jersey-number { + font-family: var(--monospace-font); + width: 2ch; + text-align: right; + overflow: hidden; +} +table tr th, table tr td { + border-left: 0.5px solid grey; + border-right: 0.5px solid grey; + overflow: hidden; + padding: 0 2px 0 2px; +} +table tr th:empty::after, table tr td:empty::after { + content: " "; +} + +.float-right { + float: right; +} + +.float-left { + float: left; +} + +.B5 > .eventsheet { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + column-gap: 0.2in; + row-gap: 0.2in; + background-size: 100%; +} + +.eventsheet > section { + box-sizing: content-box; + overflow: hidden; + /* outline: 0.5px dashed lightgrey; */ + display: flex; + flex-direction: column; + align-items: stretch; +} + +.eventsheet > section > div { + display: flex; + flex: 1; + align-items: stretch; + height: auto; +} + +.lineup-card th { + width: inherit; +} + +#lineup-card-dugout div.grid-container, +#lineup-card-dugout-blank div.grid-container { + display: grid; + grid-template-columns: 60% auto; + grid-template-rows: fit-content(16px) auto; + grid-template-areas: "header header" "sarting-lineup-table substitution-table"; +} + +#lineup-card-exchange div.grid-container, +#lineup-card-exchange-blank div.grid-container { + display: grid; + grid-template-columns: auto; + grid-template-rows: fit-content(16px) auto; + grid-template-areas: "header" "sarting-lineup-table"; +} + +#lineup-card-exchange .substitution, +#lineup-card-exchange .homeaway, +#lineup-card-exchange-blank .substitution, +#lineup-card-exchange-blank .homeaway { + display: none; +} + +.lineup-card div.grid-container > header { + grid-area: "header"; + font-size: 14px; + font-weight: bold; +} + +.lineup-card div.grid-container > header:empty::after { + content: " "; +} + +div.grid-container > .starting-lineup-table { + grid-area: "starting-lineup-table"; +} + +div.grid-container > .substitution-table { + grid-area: "substitution-table"; +} + +section.lineup-card { + counter-reset: lineup-sequence-counter 0; +} +section.lineup-card thead th { + color: var(--color-grey-600); + font-size: 0.7em; +} +section.lineup-card th.sequence { + counter-increment: lineup-sequence-counter 1; + color: var(--color-grey-600); + font-size: inherit; + width: 2ch; +} +section.lineup-card th.sequence.counter::before { + content: counter(lineup-sequence-counter); +} + +.lineup-card table { + font-size: 22px; +} + +.lineup-card td { + /* height: 34px; */ +} + +.lineup-card td.substitution { + width: 8ch; +} + +.lineup-card td.substitution::after { + content: ""; +} + +#lineup-card-exchange tr, +#lineup-card-exchange-blank tr, +#lineup-card-dugout .starting-lineup-table tr, +#lineup-card-dugout-blank .starting-lineup-table tr, +#lineup-card-dugout .substitution-table tr:nth-child(odd) { + border-top: 1px solid black; +} + +#lineup-card-exchange tr, +#lineup-card-exchange-blank tr, +#lineup-card-dugout .starting-lineup-table tr, +#lineup-card-dugout-blank .starting-lineup-table tr, +#lineup-card-dugout .substitution-table tr:nth-child(even) { + border-bottom: 1px solid black; +} + +td.substitution { + border-left: 1px solid black; +} + +#lineup-card-exchange td.player-name { + font-stretch: 100%; +} + +#lineup-card-dugout td.player-name { + width: 10ch; +} + +.lineup-card .position, +.lineup-card .jersey-number { + width: 2ch; +} + +#lineup-card-dugout .position, +#lineup-card-dugout .jersey-number { + font-stretch: 75%; + padding-left: 2.5px; + padding-right: 2.5px; +} + +.lineup-card header { + font-size: inherit; + text-transform: uppercase; + font-stretch: 85%; +} + +#todays-game > div { + display: grid; + grid-template-columns: 110px auto; + grid-template-rows: auto auto; + grid-template-areas: "offense defense" "footer footer"; +} +#todays-game table.notes th { + border-left: none; + border-right: none; + line-height: 1em; +} +#todays-game table.notes td:empty::after { + content: ""; +} + +#defense-pane { + position: relative; + grid-area: defense; + padding: 4px 4px 0px 4px; /* top right bottom left */ + display: flex; + border-right: 0.5px solid grey; + border-bottom: 0.5px solid grey; +} +#defense-pane .field-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(6, 1fr); + grid-column-gap: 4px; + width: 100%; + z-index: 2; +} +#defense-pane img { + position: absolute; + z-index: -1; +} +#defense-pane .slot-set { + display: flex; + align-items: center; +} +#defense-pane .slot-set.pos-cf tr:first-child th.position:empty::after { + content: "cf"; +} +#defense-pane .slot-set.pos-lf tr:first-child th.position:empty::after { + content: "lf"; +} +#defense-pane .slot-set.pos-rf tr:first-child th.position:empty::after { + content: "rf"; +} +#defense-pane .slot-set.pos-ss tr:first-child th.position:empty::after { + content: "ss"; +} +#defense-pane .slot-set.pos-2b tr:first-child th.position:empty::after { + content: "2b"; +} +#defense-pane .slot-set.pos-3b tr:first-child th.position:empty::after { + content: "3b"; +} +#defense-pane .slot-set.pos-1b tr:first-child th.position:empty::after { + content: "1b"; +} +#defense-pane .slot-set.pos-c tr:first-child th.position:empty::after { + content: "c"; +} +#defense-pane .slot-set.pos-p tr:first-child th.position:empty::after { + content: "p"; +} +#defense-pane .slot-set.pos-cf { + justify-content: center; + grid-area: 1/1/2/5; +} +#defense-pane .slot-set.pos-lf { + justify-content: flex-start; + grid-area: 2/1/3/3; +} +#defense-pane .slot-set.pos-rf { + justify-content: flex-end; + grid-area: 2/3/3/5; +} +#defense-pane .slot-set.pos-ss { + justify-content: flex-end; + grid-area: 3/1/4/3; +} +#defense-pane .slot-set.pos-2b { + justify-content: flex-start; + grid-area: 3/3/4/5; +} +#defense-pane .slot-set.pos-3b { + justify-content: flex-start; + grid-area: 4/1/5/3; +} +#defense-pane .slot-set.pos-1b { + justify-content: flex-end; + grid-area: 4/3/5/5; +} +#defense-pane .slot-set.pos-c { + justify-content: center; + grid-area: 5/1/6/5; +} +#defense-pane .slot-set.pos-p { + align-items: end; + margin-bottom: 4px; + grid-area: 6/1/7/5; +} +#defense-pane .slot-set.pos-p table { + width: 100%; +} +#defense-pane .slot-set.pos-p tr.substitute .position:empty::after { + content: "RP"; +} + +#offense-pane { + counter-reset: lineup-sequence-counter 0; + position: relative; + /* box-sizing: border-box; */ + height: 100%; + grid-area: offense; + border-bottom: 0.5px solid black; + /* outline: 0.5px solid black; */ +} +#offense-pane table { + height: 100%; + border: none; +} +#offense-pane th.sequence { + counter-increment: lineup-sequence-counter 1; +} +#offense-pane th.sequence.counter::before { + content: counter(lineup-sequence-counter); +} + +.slot-set table { + width: 77px; +} + +.slot-set.pos-slot-p table { + width: 100%; +} + +.index-card .defense-slot-set { + width: 65px; +} + +.index-card .defense-slot-set .player-name { + font-stretch: 70%; +} + +.container .row { + width: 100%; + display: flex; + align-items: center; +} + +header { + background-color: #cadcf9; + font-family: "Oswald"; + /* font-size: 8.8px; */ + /* outline: 1px solid black; */ + /* height: var(--row-height); */ + width: auto; + grid-area: header; + text-align: center; + padding-left: 10px; + padding-right: 10px; + border: 0.5px solid black; + z-index: 1; +} + +.footer { + /* height:var(--row-height); */ + position: relative; + box-sizing: border-box; + grid-area: footer; + /* border: 1px solid black; */ + height: 100%; + border-right: 0.5px solid grey; + border-left: 0.5px solid grey; +} +.footer table { + height: 100%; + outline: none; + border-style: none; +} +.footer table tr { + background-color: white; + outline: none; + border-bottom: 0.5px solid var(--color-grey-500); +} +.footer table tr :last-child { + background-color: white; + outline: none; + border-bottom-style: none; +} +.footer table th { + text-align: left; + color: var(--color-grey-600); +} +.footer table td { + height: var(--row-height); + border: none; +} +.footer table tdempty::after { + content: ""; +} + +.cell-checkbox { + font-size: 0.75em; +} + +.in-starting-lineup { + font-weight: bold; +} + +.gametitle { + font-weight: bold; + text-transform: uppercase; + font-stretch: semi-condensed; +} + +.homeaway { + text-transform: uppercase; + font-stretch: normal; + font-weight: bolder; + float: right; + text-transform: uppercase; +} + +.cell-smalltext { + font-stretch: condensed; + font-size: 10px; +} + +.statscell { + font-family: "m+1m"; + text-align: center; + font-stretch: extra-condensed; + font-size: 9px; + width: 60px; +} + +.condensedNameCell { + width: 70px; + text-transform: uppercase; + font-stretch: condensed; +} + +.cell-square { + height: var(--row-height); + width: 14px; + text-align: center; +} + +.cell-square.narrow { + width: 10px; +} + +.cell-mono { + font-family: "m+1m"; +} + +.cell-condensed { + font-stretch: condensed; +} + +.available-status-code-1 { + color: rgb(0, 85, 0); + background-color: #b7e1cd; +} + +.available-status-code-0 { + color: rgb(170, 0, 0); + background-color: #f4c7c3; +} + +.past.available-status-code-0, +.past.available-status-code-null { + color: var(--color-grey-600); + background-color: inherit; +} + +.past.available-status-code-1 { + color: inherit; + background-color: var(--color-warning); +} + +.past.available-status-code-1.started { + color: inherit; + background-color: inherit; +} + +.available-status-code-2 { + color: blue; + background-color: #acc9fe; +} + +#roster-and-history .player-name { + font-stretch: 95%; +} + +.starting { + font-weight: bold; +} + +#roster-and-history > div > table { + /* font-size: 10.5px; */ + padding: 0; + line-height: 1em; + /* outline: 0.5px black; */ +} +#roster-and-history td, #roster-and-history th { + border-left: none; + border-right: none; + padding: 0.2em 0.1em 0.2em 0.1em; /* top right bottom left */ +} +#roster-and-history td.availability-on-day, #roster-and-history th.availability-on-day { + font-family: var(--monospace-font); + font-stretch: 60%; + text-align: center; + max-width: 0.8em; + min-width: 0.8em; +} +#roster-and-history td.availability-on-day.future, #roster-and-history td.availability-on-day.past, #roster-and-history th.availability-on-day.future, #roster-and-history th.availability-on-day.past { + font-family: var(--monospace-font); + font-stretch: condensed; + font-weight: normal; + font-size: 0.8em; + padding: 0.1em; + text-transform: uppercase; +} +#roster-and-history td.position-capability, #roster-and-history th.position-capability { + font-size: 8px; + font-stretch: 50%; + width: 5px; + text-align: center; + padding: 0; +} +#roster-and-history td.player-stats, #roster-and-history th.player-stats { + display: none; + font-family: var(--monospace-font); + font-size: 1em; + font-stretch: 60%; + font-weight: 300; +} +#roster-and-history td.player-stats .delimiter, +#roster-and-history td.player-stats .decimal-point, #roster-and-history th.player-stats .delimiter, +#roster-and-history th.player-stats .decimal-point { + font-family: Helvetica Now; + font-stretch: expanded; + color: var(--color-grey-500); +} +#roster-and-history td.player-stats .decimal-point, #roster-and-history th.player-stats .decimal-point { + color: rgba(0, 0, 0, 0); +} +#roster-and-history td.player-stats .delimiter, #roster-and-history th.player-stats .delimiter { + color: var(--color-grey-500); +} +#roster-and-history td.player-name { + color: black; + text-align: left; + font-stretch: 95%; +} +#roster-and-history td.jersey-number { + color: black; + border-left: 0.5px solid lightgrey; +} +#roster-and-history colgroup { + border-left-width: 1px; + border-left-style: solid; + border-left-color: black; + border-right-width: 1px; + border-right-style: solid; + border-right-color: black; +} +#roster-and-history col.player-stats { + border: inherit; +} +#roster-and-history th { + background-color: #cadcf9; + color: black; + border: none; +} +#roster-and-history th.availability-on-day div { + transform: rotate(270deg); +} +#roster-and-history thead > tr, #roster-and-history tfoot > tr { + border-bottom: solid black 1px; +} +#roster-and-history tbody { + border-bottom: solid black 1px; +} +#roster-and-history tr.border-top { + border-top: 1px solid black; +} + +td.position-capability:not(:empty) { + color: var(--color-grey-700); + background-color: var(--color-grey-200); +} + +td.is-present-checkbox { + font-size: 0.5em; + text-align: center; + color: white; + /* text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, + 1px 1px 0 #000; */ +} + +td.is-present-checkbox.available-status-code-0 > span { + display: none; +} + +td.is-present-checkbox.available-status-code-None > span { + display: none; +} + +.game-number .label { + font-size: xx-small; +} + +.game-number .label, .game-number .value { + display: none; +} + +#front-cover { + border: solid 1px black; +} +#front-cover Header { + font-family: "Helvetica Now"; + font-weight: 600; + line-height: 1.5em; + background-color: #323669; + color: white; + display: inline-flex; + border: none; + padding-left: 5px; + padding-right: 5px; +} +#front-cover .game-number, #front-cover .homeaway { + display: grid; + font-size: xx-large; + align-content: center; + width: 1.4em; + font-weight: 800; +} +#front-cover .title { + display: grid; + font-size: small; + flex-grow: 1; + align-content: center; +} +#front-cover .head-to-head { + padding: 5px; + display: flex; + flex-direction: column; +} +#front-cover .opponent, #front-cover .team { + text-align: center; + font-weight: 800; + font-size: x-large; + align-items: center; + font-family: "Pacifico"; + display: inline-flex; + width: 100%; + flex-grow: 1; +} +#front-cover .opponent img, #front-cover .team img { + height: 115px; +} +#front-cover .opponent div:has(.name), #front-cover .team div:has(.name) { + flex-grow: 1; +} +#front-cover .opponent name { + text-align: left; +} +#front-cover .team name { + text-align: right; +} + +/*# sourceMappingURL=eventsheet.css.map */ diff --git a/src/public/css/eventsheet.css.map b/src/public/css/eventsheet.css.map new file mode 100644 index 0000000..bead129 --- /dev/null +++ b/src/public/css/eventsheet.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../scss/eventsheet.scss"],"names":[],"mappings":";AAAQ;AACA;AACA;AACA;AACA;AAER;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;AACA;EACE;IACE;IACA;;;AAIJ;AACA;EACE;IACE;;EAEF;IACE;;EAEF;IACE;IACA;;;AAIJ;EACE;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAKA;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAKJ;EACE;EACA;EACA;EACA;;AAEA;EACE;;;AAQR;EACE;;;AAGF;EACE;;;AAOF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;AACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA,qBACE;;;AAIJ;AAAA;EAEE;EACA;EACA;EACA,qBACE;;;AAIJ;AAAA;AAAA;AAAA;EAIE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;AAEA;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEA;EACE;;;AAQN;EACE;;;AAGF;AACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAKA;EACE;EACA;EACA;EACA,qBACE;;AAMA;EACE;EACA;EACA;;AAEF;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAMI;EACE,SALM;;AAIR;EACE,SALM;;AAIR;EACE,SALM;;AAIR;EACE,SALM;;AAIR;EACE,SALM;;AAIR;EACE,SALM;;AAIR;EACE,SALM;;AAIR;EACE,SALM;;AAIR;EACE,SALM;;AAUZ;EACE;EAEA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EAIE;EACA;EACA;;AALA;EACE;;AAKF;EACI;;;AASV;EACE;EACA;AACA;EACA;EACA;EACA;AACA;;AAEA;EACE;EACA;;AAGF;EACE;;AACA;EACE;;;AAON;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;AACA;AACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACE;EACA;EACA;EACA;AACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAIJ;EACE;EACA;;AAGF;EACE;EACA;;AACA;EACE;;;AAMR;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAEF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AASA;AACE;EACA;EACA;AACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EAEE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACI;EACA;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAEE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAMN;EACE;EACA;EACA;;AAEF;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAQJ;EACE;;AAGF;EACE;;AAGF;EACE;;;AAOJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;AACA;AAAA;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACI;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE","file":"eventsheet.css"} \ No newline at end of file diff --git a/src/public/css/gamecard.css b/src/public/css/gamecard.css deleted file mode 100644 index cb11ee9..0000000 --- a/src/public/css/gamecard.css +++ /dev/null @@ -1,661 +0,0 @@ -@import url("../css/paper.css"); -@import url("../fonts/vera/bitstreamvera.css"); -@import url("../fonts/verdana/verdanapro.css"); -@import url("../fonts/m+1m/m+1m.css"); -@import url("../fonts/helvetica-now/stylesheet.css"); -@import url("../fonts/futura-now/stylesheet.css"); -@import url("../fonts/inconsolata/stylesheet.css"); - -:root { - --color-success: #b7e1cd; - --color-danger: #f4c7c3; - --color-neutral: #acc9fe; - --color-warning: rgb(249, 228, 180); - --color-grey-100: #f8f9fa; - --color-grey-200: #e9ecef; - --color-grey-300: #dee2e6; - --color-grey-400: #ced4da; - --color-grey-500: #adb5bd; - --color-grey-600: #6c757d; - --color-grey-700: #495057; - --color-grey-800: #343a40; - --color-grey-900: #212529; - --row-height: 14px; - --monospace-font: "Inconsolata"; -} - -body { - font-family: "Helvetica Now"; - position: relative; - font-size: 11px; -} - -table { - position: inherit; - font-size: inherit; - border-collapse: collapse; - empty-cells: show; - white-space: nowrap; - text-overflow: ellipsis; - overflow-x: hidden; - overflow-y: hidden; - width: 100%; - border: 0.5px solid black; - display: inline-table; -} - -.bar-right { - float: right; -} - -.bar-left { - float: left; -} - -th, -td { - /* vertical-align: middle; */ - /* line-height: 1.3em; */ - overflow: hidden; - padding: 0 2px 0 2px; /* top right bottom left */ -} - -tr { - border-bottom-width: 0.5px; - border-color: grey; - border-bottom-style: solid; -} - -tr:last-child { - border-bottom-color: black; -} - -tr:first-child { - border-top-color: black; -} - -tr:nth-child(odd) { - background-color: rgb(242, 242, 242, 0.85); -} - -tr:nth-child(even) { - background-color: rgb(256, 256, 256, 0.85); -} - -td:not(:first-child) { - border-left: 0.5px solid grey; -} - -th { - font-stretch: extra-condensed; - width: 1em; - text-align: center; - text-transform: uppercase; -} - -td:empty::after, -th:empty::after { - content: "\00a0"; -} - -td.player-name { - text-transform: uppercase; - font-stretch: 80%; - /* font-family: var(--monospace-font); */ -} - -td.position, -td.jersey-number { - font-family: var(--monospace-font); - width: 2ch; - text-align: right; - overflow: hidden; -} - -.index-card .gamecard { - position: relative; -} - -.B5 > .gamecard { - /* height: auto; */ - display: grid; - grid-template-columns: 1fr 1fr; - grid-template-rows: 1fr 1fr; - /* padding: 0.15in; */ - /* grid-gap: 0.25in 0.15in; */ - - /* background-image: url("../2023-G08-0523.png"); */ - background-size: 100%; -} - -.gamecard > section { - /* margin: 0.07in; */ - box-sizing: content-box; - /* border: 4px solid var(--color-grey-200); */ - /* border-radius: 4px; */ - overflow: hidden; - outline: 0.5px dashed lightgrey; - /* border-right: 1px dotted black; */ - display: flex; - align-items: stretch; -} - -.gamecard > section > div { - margin: 0.15in; - outline: 0.5px solid black; - display: flex; - flex: 1; /* consumes all free space (taking full height) */ - align-items: stretch; - height: auto; -} - -#lineup-card-dugout div.grid-container, -#lineup-card-dugout-empty div.grid-container { - display: grid; - grid-template-columns: 60% auto; - grid-template-rows: fit-content(16px) auto; - grid-template-areas: - "header header" - "sarting-lineup-table substitution-table"; -} - -#lineup-card-exchange div.grid-container, -#lineup-card-exchange-empty div.grid-container { - display: grid; - grid-template-columns: auto; - grid-template-rows: fit-content(16px) auto; - grid-template-areas: - "header" - "sarting-lineup-table"; -} - -.lineup-card div.grid-container > .section-header { - grid-area: "header"; - font-size: 14px; - font-weight: bold; -} - -.lineup-card div.grid-container > .section-header:empty::after { - content: "\00a0"; -} - -div.grid-container > .starting-lineup-table { - grid-area: "starting-lineup-table"; -} - -div.grid-container > .substitution-table { - grid-area: "substitution-table"; -} - -.lineup-card thead th { - color: var(--color-grey-600); - font-size: 0.7em; -} - -.lineup-card th.sequence { - color: var(--color-grey-600); - font-size: inherit; -} - -.lineup-card table { - font-size: 22px; -} - -.lineup-card td { - height: 33.5px; -} - -#lineup-card-exchange tr, -#lineup-card-exchange-empty tr, -#lineup-card-dugout .starting-lineup-table tr, -#lineup-card-dugout .substitution-table tr:nth-child(odd) { - border-top: 1px solid black; -} - -#lineup-card-exchange tr, -#lineup-card-exchange-empty tr, -#lineup-card-dugout .starting-lineup-table tr, -#lineup-card-dugout .substitution-table tr:nth-child(even) { - border-bottom: 1px solid black; -} - -#lineup-card-exchange td.player-name { - font-stretch: 100%; -} - -#lineup-card-dugout td.player-name { - width: 10ch; -} - -#lineup-card-dugout td.substitution, -#lineup-card-dugout-empty td.substitution { - font-size: 11px; - height: 15px; -} - -.lineup-card .position, -.lineup-card .jersey-number { - width: 2ch; -} - -#lineup-card-dugout .position, -#lineup-card-dugout .jersey-number { - font-stretch: 75%; - padding-left: 2.5px; - padding-right: 2.5px; -} - -.lineup-card .section-header { - padding-left: 1px; - padding-right: 1px; - font-size: inherit; - text-transform: uppercase; - font-stretch: 85%; -} - -#todays-game > div { - display: grid; - /* gap: 0.5px; */ - grid-template-columns: 110px auto; - grid-template-rows: calc(var(--row-height) * 1) auto auto; - grid-template-areas: - "header header" - "offense defense" - "footer footer"; -} - -#defense-pane { - position: relative; - /* box-sizing: border-box; */ - padding: 4px 4px 0px 4px; /* top right bottom left */ - display: flex; - grid-area: defense; - border-left: 0.5px solid black; - border-bottom: 0.5px solid black; -} - -#offense-pane { - position: relative; - /* box-sizing: border-box; */ - height: 100%; - grid-area: offense; - border-bottom: 0.5px solid black; - /* outline: 0.5px solid black; */ -} - -#offense-pane table { - height: 100%; - border: none; -} - -#defense-pane .container { - width: 100%; - display: grid; - grid-template-rows: auto; -} - -#defense-pane .pitching-container { - margin: auto 0 0 0; /* top right bottom left */ -} - -#defense-pane .field-container { - display: grid; - grid-template-rows: auto; - /* margin: top; */ - width: 100%; - /* background: url("../baseball-diamond.svg"); */ - background-size: 100%; - background-position: center 10px; - background-repeat: no-repeat; - gap: 6px; - z-index: 2; -} - -#defense-pane img { - position: absolute; - z-index: -1; -} - -.defense-slot-set { - width: 77px; -} - -.index-card .defense-slot-set { - width: 65px; -} - -.index-card .defense-slot-set .player-name { - font-stretch: 70%; -} - -.pitching-container .defense-slot-set { - width: 100%; -} - -.container .row { - width: 100%; - display: flex; - align-items: center; -} - -.section-header { - background-color: #cadcf9; - font-size: 8.8px; - /* outline: 1px solid black; */ - /* height: var(--row-height); */ - width: auto; - grid-area: header; - text-align: center; - padding-left: 10px; - padding-right: 10px; - border-bottom: 0.5px solid black; - z-index: 1; -} - -.footer { - /* height:var(--row-height); */ - position: relative; - box-sizing: border-box; - grid-area: footer; - /* border: 1px solid black; */ - height: 100%; -} - -.footer table { - height: 100%; - outline: none; - border-style: none; -} - -.footer tr { - background-color: white; - outline: none; - border-bottom: 0.5px solid var(--color-grey-500); -} - -.footer tr :last-child { - background-color: white; - outline: none; - border-bottom-style: none; -} -.footer th { - text-align: left; - color: var(--color-grey-600); -} -.footer td { - height: var(--row-height); - - border: none; -} - -.footer td:empty::after { - content: ""; -} - -.cell-checkbox { - font-size: 0.75em; -} - -.in-starting-lineup { - font-weight: bold; -} - -.gametitle { - font-weight: bold; - text-transform: uppercase; - font-stretch: semi-condensed; -} - -.homeaway { - text-transform: uppercase; - font-stretch: normal; - font-weight: bolder; - float: right; - text-transform: uppercase; -} - -.cell-smalltext { - font-stretch: condensed; - font-size: 10px; -} - -.statscell { - font-family: "m+1m"; - text-align: center; - font-stretch: extra-condensed; - font-size: 9px; - width: 60px; -} - - { - text-transform: uppercase; -} - -.condensedNameCell { - width: 70px; - text-transform: uppercase; - font-stretch: condensed; -} - -.cell-square { - height: var(--row-height); - width: 14px; - text-align: center; -} - -.cell-square.narrow { - width: 10px; -} -.cell-mono { - font-family: "m+1m"; -} - -.cell-condensed { - font-stretch: condensed; -} - -.available-status-code-1 { - color: rgb(0, 85, 0); - background-color: #b7e1cd; -} - -.available-status-code-0 { - color: rgb(170, 0, 0); - background-color: #f4c7c3; -} - -.past.available-status-code-0, -.past.available-status-code-null { - color: var(--color-grey-600); - background-color: inherit; -} - -.past.available-status-code-1 { - color: inherit; - background-color: var(--color-warning); -} - -.past.available-status-code-1.started { - color: inherit; - background-color: inherit; -} - -.available-status-code-2 { - color: blue; - background-color: #acc9fe; -} - -#roster-and-history .player-name, -#roster-and-history .jersey-number { - color: black; -} - -#roster-and-history .player-name { - font-stretch: normal; -} - -.starting { - font-weight: bold; -} - -#roster-and-history > div > table { - /* font-size: 10.5px; */ - padding: 0; - line-height: 1em; - /* outline: 0.5px black; */ -} - -#roster-and-history td, -#roster-and-history th { - border-left: none; - border-right: none; - padding: 0.2em 0.1em 0.2em 0.1em; /* top right bottom left */ -} - -#roster-and-history td.player-name { - text-align: left; -} - -#roster-and-history th { - background-color: #cadcf9; - color: black; - border: none; -} - -#roster-and-history thead > tr, -#roster-and-history tfoot > tr { - border-bottom: solid black 1px; -} - -#roster-and-history tbody { - border-bottom: solid black 1px; -} - -#roster-and-history td[id^="avail"][id$="today-plus-1"], -#roster-and-history .pitcher, -#roster-and-history .player-stats, -#roster-and-history td[id^="avail"][id$="today-minus-1"] { - border-left-width: 1px; - border-left-style: solid; - border-left-color: black; -} - -#roster-and-history td.jersey-number { - border-left: 0.5px solid lightgrey; -} - -#roster-and-history td.today-minus-4 { - border-right: 1px solid black; -} - -#roster-and-history tr.border-top { - border-top: 1px solid black; -} - -#roster-and-history #today-availability { - font-stretch: normal; - text-transform: uppercase; - font-size: 0.8em; -} - -.player-stats { - font-family: var(--monospace-font); - font-size: 1em; - font-stretch: 60%; - font-weight: 300; -} - -#roster-and-history td.position-capability, -th.position-capability { - font-size: 8px; - font-stretch: 50%; - width: 5px; - text-align: center; - padding: 0; -} - -#roster-and-history th.position-capability { - font-size: inherit; -} - -td.position-capability:not(:empty) { - color: var(--color-grey-700); - background-color: var(--color-grey-200); -} - -td.is-present-checkbox { - font-size: 0.5em; - text-align: center; - color: white; - /* text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, - 1px 1px 0 #000; */ -} - -td.is-present-checkbox.available-status-code-0 > span { - display: none; -} - -td.is-present-checkbox.available-status-code-None > span { - display: none; -} - -td.availability { - font-family: var(--monospace-font); - font-stretch: condensed; - text-align: center; - max-width: 0.8em; - min-width: 0.8em; -} - -.availability.future, -.availability.past { - font-family: var(--monospace-font); - font-stretch: condensed; - font-weight: normal; - font-size: 0.8em; - padding: 0.1em; - text-transform: uppercase; -} - -#roster-test .player-name { - font-weight: bold; - text-transform: uppercase; - grid-area: player-name; -} - -#roster-test .jersey-number { - font-weight: bolder; - font-stretch: extra-condensed; - grid-area: jersey-number; -} - -#roster-test .player-stats { - grid-area: player-stats; -} - -#roster-test .diamond { - grid-area: diamond; - overflow: hidden; - display: inline-block; - height: 10px; - /* height:10px; */ -} - -.rotate { - transform: rotate(270deg); -} - -.delimiter, -.decimal-point { - font-family: Helvetica Now; - font-stretch: expanded; - color: var(--color-grey-500); -} - -th .decimal-point { - color: rgb(0, 0, 0, 0); -} - -th .delimiter { - color: var(--color-grey-500); -} diff --git a/src/public/css/project.css b/src/public/css/project.css index 877c8f6..0375252 100644 --- a/src/public/css/project.css +++ b/src/public/css/project.css @@ -1,6 +1,31 @@ /* These styles are generated from project.scss. */ @import url("https://fonts.googleapis.com/css2?family=Open+Sans&display=swap"); @import url("../fonts/helvetica-now/stylesheet.css"); +header.Header { + background: #323669; + padding: 8px 0; + box-shadow: 0 4px 0 rgba(0, 0, 25, 0.1); + border-bottom: 1px solid #d6d6d6; + color: white; +} +.Header-bannerLogo, .Header-bannerTitle { + margin: 0; + padding: 0; +} + +.Header-bannerLogo img { + height: 36px; + width: auto; +} + +.Header-bannerTitle { + font-family: "Helvetica", sans-serif; + text-transform: uppercase; + font-weight: bold; + text-align: left; + color: white; + font-size: 28px; +} .alert-debug { color: black; background-color: white; diff --git a/src/public/fonts/futura-now/stylesheet.css b/src/public/font/futura-now/stylesheet.css similarity index 100% rename from src/public/fonts/futura-now/stylesheet.css rename to src/public/font/futura-now/stylesheet.css diff --git a/src/public/fonts/helvetica-now/stylesheet.css b/src/public/font/helvetica-now/stylesheet.css similarity index 100% rename from src/public/fonts/helvetica-now/stylesheet.css rename to src/public/font/helvetica-now/stylesheet.css diff --git a/src/public/fonts/inconsolata/stylesheet.css b/src/public/font/inconsolata/stylesheet.css similarity index 100% rename from src/public/fonts/inconsolata/stylesheet.css rename to src/public/font/inconsolata/stylesheet.css diff --git a/src/public/fonts/m+1m/m+1m.css b/src/public/font/m+1m/m+1m.css similarity index 100% rename from src/public/fonts/m+1m/m+1m.css rename to src/public/font/m+1m/m+1m.css diff --git a/src/public/fonts/vera/bitstreamvera.css b/src/public/font/vera/bitstreamvera.css similarity index 100% rename from src/public/fonts/vera/bitstreamvera.css rename to src/public/font/vera/bitstreamvera.css diff --git a/src/public/fonts/verdana/verdanapro.css b/src/public/font/verdana/verdanapro.css similarity index 100% rename from src/public/fonts/verdana/verdanapro.css rename to src/public/font/verdana/verdanapro.css diff --git a/src/public/js/eventlineup.js b/src/public/js/eventlineup.js new file mode 100644 index 0000000..d13aa7a --- /dev/null +++ b/src/public/js/eventlineup.js @@ -0,0 +1,490 @@ +/* Project specific Javascript goes here. */ +function onPositionSelectChange(elem) { + elem.querySelectorAll("option").forEach((option) => { + if (option.innerText.trim() == elem.value) { + option.setAttribute("selected", "selected"); + } else { + option.removeAttribute("selected"); + } + }); + colorPositions(); + refreshLineupOrder(); +} + +function togglePopup(el) { + el.querySelector(".Popup-container").classList.toggle("is-open"); +} + +function colorPositions() { + for (bcLineup of document.querySelectorAll("[id^=event-lineup]")) { + selected_lineup_positions = Array.from( + bcLineup.querySelectorAll(".position-select-box option:checked") + ).map((el) => el.value); + + for (position_status of bcLineup.querySelectorAll(".position-status")) { + for (class_name of ["u-colorNegative", "u-colorHighlight", "u-colorPositive"]) { + position_status.classList.remove(class_name); + } + + occurrences = selected_lineup_positions.filter((s) => s == position_status.innerText).length; + + if (occurrences == 1) { + position_status.classList.add("u-colorPositive"); + } else if (occurrences > 1) { + position_status.classList.add("u-colorHighlight"); + } else { + position_status.classList.add("u-colorNegative"); + } + } + } +} + +function refreshLineupOrder() { + Array.from(document.querySelectorAll("[id^=event-lineup]")).forEach((bcLineup) => { + Array.from( + bcLineup.querySelectorAll( + ".starting .lineup-slot, \ + .position-only .lineup-slot, \ + .bench .lineup-slot" + ) + ).forEach((slot, i) => { + slot.querySelector("input[name*=sequence]").value = i; + selected_position = slot.querySelector(".position-select-box option:checked"); + if (selected_position && selected_position.text != "--") { + slot.querySelector("input[name*=label]").value = selected_position.text; + } else { + slot.querySelector("input[name*=label]").value = null; + } + }); + }); +} + +for (bcLineup of document.querySelectorAll("[id^=event-lineup]")) { + options = { + animation: 150, + handle: ".Panel-cell:has(.drag-handle), .Panel-cell:has(.sequence)", + ghostClass: "ghost", + group: { + name: bcLineup.id, + put: [bcLineup.id], + pull: [bcLineup.id], + }, + onAdd: function (/**Event*/ evt) { + console.log("added to lineup"); + // Add to Lineup + var itemEl = evt.item; // dragged HTMLElement + + refreshLineupOrder(); + }, + onUpdate: function (/**Event*/ evt) { + console.log("update to lineup"); + // var itemEl = evt.item; // dragged HTMLElement + // refresh_lineup_order(itemEl); + refreshLineupOrder(); + }, + }; + new Sortable.create(bcLineup.querySelector("[id^=lineup-starting] .slot-set"), options); + new Sortable.create(bcLineup.querySelector("[id^=lineup-positiononly] .slot-set"), options); + options["sort"] = false; + new Sortable.create(bcLineup.querySelector("[id^=lineup-bench] .slot-set"), options); + new Sortable.create(bcLineup.querySelector("[id^=lineup-out] .slot-set"), {...options, group:{...options.group, put:[]}}); +} + +for (lineup_slot of document.querySelectorAll("[id^=lineup-out] .lineup-slot")) { + console.log(lineup_slot) + const cells = lineup_slot.querySelectorAll('.Panel-cell:has(.sequence), .Panel-cell:has(.drag-handle), .Panel-cell:has(.position-select-box) ') + Array.from(cells).forEach(cell=>{ + cell.classList.add('u-hidden') + }) +} + +function copyEmailTable(itemEl, subject, recipients) { + // Create container for the HTML + // [1] + let bcLineup = itemEl.closest(".benchcoach-lineup"); + var container = document.createElement("div"); + var tbl = document.createElement("table"); + + let thead = tbl.createTHead(); + let thead_row = thead.insertRow(); + let thead_row_cell = thead_row.insertCell(); + thead_row_cell.appendChild(document.createElement("h3").appendChild(document.createTextNode("STARTING LINEUP"))); + thead_row_cell.colSpan = 3; + thead_row_cell.classList.add("title-cell"); + var tbody = tbl.createTBody(); + for (row of bcLineup.querySelector(".table-benchcoach-startinglineup").rows) { + let tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + cell.appendChild(document.createTextNode(parseInt(row.dataset.order) + 1)); + cell = tr.insertCell(); + cell.appendChild(document.createTextNode(row.dataset.playerName)); + cell.classList.add("name-cell"); + tr.insertCell().appendChild(document.createTextNode(row.dataset.position)); + } + + if (bcLineup.querySelector(".table-benchcoach-startingpositionalonly").rows.length > 0) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.colSpan = 3; + cell.appendChild(document.createTextNode("STARTING (POS. ONLY)")); + cell.classList.add("title-cell"); + + for (row of bcLineup.querySelector(".table-benchcoach-startingpositionalonly").rows) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + cell.appendChild(document.createTextNode("")); + cell = tr.insertCell(); + cell.appendChild(document.createTextNode(row.dataset.playerName)); + cell.classList.add("name-cell"); + tr.insertCell().appendChild(document.createTextNode(row.dataset.position)); + } + } + + if (bcLineup.querySelector(".table-benchcoach-bench").rows.length > 0) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.colSpan = 3; + cell.appendChild(document.createTextNode("SUBS")); + cell.classList.add("title-cell"); + + for (row of bcLineup.querySelector(".table-benchcoach-bench").rows) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + availability_status = { + None: "UNK", + 0: "NO", + 2: "MAY", + 1: "YES", + }[row.dataset.availabilityStatuscode]; + cell.appendChild(document.createTextNode(availability_status)); + cell = tr.insertCell(); + cell.appendChild(document.createTextNode(row.dataset.playerName)); + cell.classList.add("name-cell"); + tr.insertCell().appendChild(document.createTextNode("")); + } + } + + if (bcLineup.querySelector(".table-benchcoach-out").rows.length > 0) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.colSpan = 3; + cell.appendChild(document.createTextNode("OUT")); + cell.classList.add("title-cell"); + + for (row of bcLineup.querySelector(".table-benchcoach-out").rows) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + availability_status = { + None: "UNK", + 0: "NO", + 1: "MAY", + 2: "YES", + }[row.dataset.availabilityStatuscode]; + cell.appendChild(document.createTextNode(availability_status)); + tr.insertCell().appendChild(document.createTextNode(row.dataset.playerName)); + tr.insertCell().appendChild(document.createTextNode("")); + } + } + + container.appendChild(tbl); + for (cell of container.getElementsByClassName("title-cell")) { + cell.setAttribute("style", "font-weight:bold;background-color:#323669;color:#fff;padding:2px 5px;"); + } + + for (cell of container.getElementsByClassName("sequence-cell")) { + cell.setAttribute("style", "font-weight:bold;padding:2px 5px;"); + } + + for (cell of container.getElementsByClassName("name-cell")) { + cell.setAttribute("style", "width:200px;"); + } + + // Detect all style sheets of the page + var activeSheets = Array.prototype.slice.call(document.styleSheets).filter(function (sheet) { + return !sheet.disabled; + }); + + // Mount the container to the DOM to make `contentWindow` available + // [3] + document.body.appendChild(container); + + // Copy to clipboard + // [4] + window.getSelection().removeAllRanges(); + + var range = document.createRange(); + range.selectNode(container); + window.getSelection().addRange(range); + + // [5.1] + document.execCommand("copy"); + + // [5.2] + for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true; + + // [5.3] + // document.execCommand('copy') + + // [5.4] + for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = false; + + // Remove the container + // [6] + document.body.removeChild(container); + subject_encoded = encodeURIComponent(subject); + window.open("readdle-spark://compose?recipient=manager@chihounds.com&subject=" + subject + "&bcc=" + recipients); +} + +function emailModal(el, url) { + form = el.closest("form"); + data = new FormData(form); + + email_modal = document.querySelector("#modal"); + + fetch(url, { + method: "POST", + body: data, + headers: { + 'CSRF-Token': data.get('_csrf') + } + }) + .then((response) => { + if (response.ok) { + return response.text(); + } else { + return Promise.reject(response.text()); + } + }) + .then((html) => { + email_modal.classList.add("is-open"); + email_modal.querySelector(".Modal-body").innerHTML = html; + }); +} + +async function onSubmit(form, event) { + event.preventDefault(); + console.log(event) + teamsnap_icon = document.querySelector("#teamsnap-icon"); + waiting_icon = document.querySelector("#waiting-icon"); + success_icon = document.querySelector("#success-icon"); + failure_icon = document.querySelector("#failure-icon"); + data = new FormData(form); + console.log(form) + url = form.attributes.action.textContent; + teamsnap_icon.classList.add("u-hidden") + waiting_icon.classList.remove("u-hidden"); + await fetch(url, { + method: "POST", + body: data, + headers: { + 'CSRF-Token': data.get('_csrf') + } + }) + .then((response) => { + waiting_icon.classList.add("u-hidden"); + if (response.ok) { + return response.text(); + } else { + return Promise.reject(response.text()); + } + }) + .then((text) => { + event.submitter.blur() + waiting_icon.classList.add("u-hidden"); + success_icon.classList.remove("u-hidden"); + // success_icon.querySelector("span.message").innerHTML = text; + }) + .catch((error) => { + event.submitter.blur() + waiting_icon.classList.add("u-hidden"); + failure_icon.classList.remove("u-hidden"); + console.log(error); + // success_icon.querySelector("span.message").innerHTML = error; + }); + setTimeout(() => { + [waiting_icon, success_icon, failure_icon].forEach(e=>e.classList.add('u-hidden')) + teamsnap_icon.classList.remove('u-hidden') + }, 3000) +} + +function copyEmailTable(itemEl, subject, recipients) { + // Create container for the HTML + // [1] + let bcLineup = itemEl.closest(".event-lineup"); + var container = document.createElement("div"); + var tbl = document.createElement("table"); + + let thead = tbl.createTHead(); + let thead_row = thead.insertRow(); + let thead_row_cell = thead_row.insertCell(); + thead_row_cell.appendChild(document.createElement("h3").appendChild(document.createTextNode("STARTING LINEUP"))); + thead_row_cell.colSpan = 3; + thead_row_cell.classList.add("title-cell"); + var tbody = tbl.createTBody(); + + lineup_slots_starting = bcLineup.querySelectorAll(".starting .slot-set .lineup-slot"); + + for (node of lineup_slots_starting) { + console.log("node", node); + let tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + sequence = node.querySelector("input[name*='sequence']").value; + console.log(sequence); + cell.appendChild(document.createTextNode(parseInt(sequence) + 1)); + name = node.querySelector("div:has(.lastname)"); + cell = tr.insertCell(); + cell.appendChild(document.createTextNode(name.textContent)); + cell.classList.add("name-cell"); + position_label = node.querySelector("input[name*='label']").value; + tr.insertCell().appendChild(document.createTextNode(position_label)); + } + + lineup_slots_position_only = bcLineup.querySelector(".position-only .slot-set .lineup-slot"); + console.log("lineup slots position", lineup_slots_position_only); + if (lineup_slots_position_only.length > 0) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.colSpan = 3; + cell.appendChild(document.createTextNode("STARTING (POS. ONLY)")); + cell.classList.add("title-cell"); + + for (node of lineup_slots_position_only) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + cell.appendChild(document.createTextNode("")); + cell = tr.insertCell(); + name = node.querySelector("div:has(.lastname)"); + cell.appendChild(document.createTextNode(name.textCotent)); + cell.classList.add("name-cell"); + position_label = node.querySelector("input[name*='label']").value; + tr.insertCell().appendChild(document.createTextNode(position_label)); + } + } + + lineup_slots_bench = bcLineup.querySelector(".bench .slot-set .lineup-slot"); + if (lineup_slots_bench > 0) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.colSpan = 3; + cell.appendChild(document.createTextNode("SUBS")); + cell.classList.add("title-cell"); + + for (node of lineup_slots_bench) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + + div_avail_code = node.querySelector("div[class*='availability-status-code']"); + if (div_with_avail_code.classList.includes("availability-status-code-1")) { + cell.appendChild(document.createTextNode("YES")); + } else if (div_with_avail_code.classList.includes("availability-status-code-2")) { + cell.appendChild(document.createTextNode("MAY")); + } else if (div_with_avail_code.classList.includes("availability-status-code-0")) { + cell.appendChild(document.createTextNode("NO")); + } else { + cell.appendChild(document.createTextNode("UNK")); + } + cell = tr.insertCell(); + name = node.querySelector("div:has(.lastname)"); + cell.appendChild(document.createTextNode(name.textCotent)); + cell.classList.add("name-cell"); + tr.insertCell().appendChild(document.createTextNode("")); + } + } + + lineup_slots_out = bcLineup.querySelector(".out .slot-set .lineup-slot"); + if (lineup_slots_out > 0) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.colSpan = 3; + cell.appendChild(document.createTextNode("OUT")); + cell.classList.add("title-cell"); + + for (node of lineup_slots_out) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + div_avail_code = node.querySelector("div[class*='availability-status-code']"); + if (div_with_avail_code.classList.includes("availability-status-code-1")) { + cell.appendChild(document.createTextNode("YES")); + } else if (div_with_avail_code.classList.includes("availability-status-code-2")) { + cell.appendChild(document.createTextNode("MAY")); + } else if (div_with_avail_code.classList.includes("availability-status-code-0")) { + cell.appendChild(document.createTextNode("NO")); + } else { + cell.appendChild(document.createTextNode("UNK")); + } + cell = tr.insertCell(); + name = node.querySelector("div:has(.lastname)"); + cell.appendChild(document.createTextNode(name.textCotent)); + cell.classList.add("name-cell"); + tr.insertCell().appendChild(document.createTextNode("")); + } + } + + container.appendChild(tbl); + for (cell of container.getElementsByClassName("title-cell")) { + cell.setAttribute("style", "font-weight:bold;background-color:#323669;color:#fff;padding:2px 5px;"); + } + + for (cell of container.getElementsByClassName("sequence-cell")) { + cell.setAttribute("style", "font-weight:bold;padding:2px 5px;"); + } + + for (cell of container.getElementsByClassName("name-cell")) { + cell.setAttribute("style", "width:200px;"); + } + + // Detect all style sheets of the page + var activeSheets = Array.prototype.slice.call(document.styleSheets).filter(function (sheet) { + return !sheet.disabled; + }); + + // Mount the container to the DOM to make `contentWindow` available + // [3] + document.body.appendChild(container); + + // Copy to clipboard + // [4] + window.getSelection().removeAllRanges(); + + var range = document.createRange(); + range.selectNode(container); + window.getSelection().addRange(range); + + // [5.1] + document.execCommand("copy"); + + // [5.2] + for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true; + + // [5.3] + // document.execCommand('copy') + + // [5.4] + for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = false; + + // Remove the container + // [6] + document.body.removeChild(container); + subject_encoded = encodeURIComponent(subject); + window.open("readdle-spark://compose?recipient=manager@chihounds.com&subject=" + subject + "&bcc=" + recipients); +} + +function toggleChildSlots (element) { + console.log(element); + console.log(element.closest(".slot-set")) + for (lineup_slot of document.querySelectorAll("[id^=lineup-out] .lineup-slot")) { + console.log(lineup_slot) + const cells = lineup_slot.querySelectorAll('.Panel-cell:has(.sequence), .Panel-cell:has(.drag-handle), .Panel-cell:has(.position-select-box) ') + Array.from(cells).forEach(cell=>{ + cell.classList.toggle('u-hidden') + }) + } +} diff --git a/src/public/js/opponent.js b/src/public/js/opponent.js new file mode 100644 index 0000000..4b59cab --- /dev/null +++ b/src/public/js/opponent.js @@ -0,0 +1,31 @@ +// THIS DOESN'T WORK, CORS ERRORS!! +// const form = document.querySelector("form[name=upload-opponent-logo]") + +// form.querySelector("button").addEventListener('click', function() { +// form.requestSubmit(); +// }) + +// form.addEventListener('submit', async function(e) { +// e.preventDefault() +// console.log(e.target) +// data = new FormData(e.target) +// // file = new File(data.file.buffer, data.filename, { +// // type: "image/png", +// // }); +// teamsnap.TeamSnap("http://localhost:8080/https://apiv3.teamsnap.com") +// if (teamsnap.hasSession()) { +// const token = sessionStorage.getItem('teamsnap.authToken') +// teamsnap.auth(token); +// teamsnap.loadCollections(async function(err) { +// if (err) { +// console.log(err) +// alert('Error loading TeamSnap SDK'); +// return; +// } +// const team_medium = await teamsnap.createTeamMedium(data) +// await teamsnap.uploadTeamMedium(team_medium) +// console.log('Uploaded') +// }); +// } + +// }) \ No newline at end of file diff --git a/src/routes/auth.js b/src/routes/auth.js index 364e5ba..a5b46cd 100644 --- a/src/routes/auth.js +++ b/src/routes/auth.js @@ -1,11 +1,11 @@ var express = require("express"); var passport = require("passport"); var TeamsnapStrategy = require("passport-teamsnap"); - +// const {teamsnap} = require("../app"); // Configure the TeamSnap strategy for use by Passport. // // OAuth 2.0-based strategies require a `verify` function which receives the -// credential (`accessToken`) for accessing the Facebook API on the user's +// credential (`accessToken`) for accessing the TeamSnap API on the user's // behalf, along with the user's profile. The function must invoke `cb` // with a user object, which will be set at `req.user` in route handlers after // authentication. @@ -19,23 +19,21 @@ passport.use( passReqToCallback: true, scope: ["read", "write"], }, - function (req, accessToken, refreshToken, profile, done) { + async function (req, accessToken, refreshToken, profile, done) { json = JSON.parse(profile._raw); - new_profile = { access_token: accessToken }; - new_profile["id"] = json.collection.items[0].data.filter( - (e) => e.name == "id" - )[0].value; - new_profile["email"] = json.collection.items[0].data.filter( - (e) => e.name == "email" - )[0].value; - new_profile["first_name"] = json.collection.items[0].data.filter( - (e) => e.name == "first_name" - )[0].value; - + field_from_collection = (field_name) => { + return json.collection.items[0].data.filter( + (e) => e.name == field_name + )[0].value; + } + const new_profile = { access_token: accessToken }; + new_profile["id"] = field_from_collection("id") + new_profile["email"] = field_from_collection("email") + new_profile["first_name"] = field_from_collection("first_name") + new_profile["last_name"] = field_from_collection("last_name") + req.session.teamsnap_access_token = accessToken; - teamsnap.init(process.env["TEAMSNAP_CLIENT_ID"]); - teamsnap.auth(accessToken); - // teamsnap.enablePersistence(); + await initTeamsnap(process.env["TEAMSNAP_CLIENT_ID"], accessToken) return done(null, new_profile); } ) @@ -52,18 +50,24 @@ passport.use( // and deserialized. passport.serializeUser(function (user, cb) { process.nextTick(function () { - console.log("L#51 serializing user id", user.id); + console.log("L#56 serializing user id", user.id); cb(null, { id: user.id, username: user.email, - name: user.firstName, + email: user.email, + first_name: user.first_name, + last_name: user.last_name, accessToken: user.access_token, }); }); }); passport.deserializeUser(function (user, cb) { - process.nextTick(function () { + process.nextTick(async function () { + console.log("L#68 deserializing user id", user.id); + if (!teamsnap.isAuthed()){ + await initTeamsnap(process.env["TEAMSNAP_CLIENT_ID"], user.accessToken) + } return cb(null, user); }); }); @@ -83,7 +87,7 @@ router.get("/login", function (req, res, next) { returnTo = req.session.returnTo; // req.session.regenerate(); // this is not working right as of now... req.session.returnTo = returnTo; - res.render("login"); + res.render("login", {layout:"layouts/main"}); }); /* GET /login/federated/teamsnap @@ -120,4 +124,28 @@ router.get( }) ); -module.exports = router; +const initTeamsnap = async (clientID, accessToken) => { + teamsnap.init(clientID); + teamsnap.auth(accessToken); + await teamsnap.loadCollections(); + await teamsnap.enablePersistence(); +} + +const ensureLoggedIn = (req, res, next) => { + if (!req.isAuthenticated()){ + req.session.returnTo = req.originalUrl + res.redirect("/login"); + // return next(); + } + else{ + req.user = req.session.passport.user + next(); + } +} + +router.get('/auth/teamsnap/session_storage', ensureLoggedIn, (req,res)=>{ + res.status(200).json({"teamsnap.authToken":req.user.accessToken}) +} +) + +module.exports = {router, ensureLoggedIn}; diff --git a/src/routes/event.js b/src/routes/event.js new file mode 100644 index 0000000..60f8b01 --- /dev/null +++ b/src/routes/event.js @@ -0,0 +1,30 @@ +const express = require("express"); +const eventsController = require("../controllers/event"); +const router = express.Router(); +const tsUtils = require("../lib/utils") + +// Middleware +const loadEvent = (req,res,next) => { + const {team_id, event_id} = req.params; + const bulkLoadTypes = ["event", "availabilitySummary"] + tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req); + req.promises.push(teamsnap.bulkLoad({teamId: team_id, types: bulkLoadTypes, scopeTo:'event', event__id:event_id}, null, tsUtils.teamsnapCallback) + .then(bulkLoadItems=>{ + const items = tsUtils.groupTeamsnapItems(bulkLoadItems, bulkLoadTypes); + tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req); + req.availabilitySummary = items.availabilitySummaries.find(e=>e.eventId==event_id); + req.event = items.events.find(e=>e.id==event_id); + } + )) + next(); +} + +router.use("/:team_id([0-9]+)/event/:event_id([0-9]+)", loadEvent) + +// Routes +router.get("/:team_id([0-9]+)/schedule", eventsController.getEvents); +router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)", eventsController.getEvent); +// router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup", eventsController.getLineup); +// router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup_card", eventsController.getLineupCard); + +module.exports = {router, loadEvent} \ No newline at end of file diff --git a/src/routes/eventlineup.js b/src/routes/eventlineup.js new file mode 100644 index 0000000..0a614a8 --- /dev/null +++ b/src/routes/eventlineup.js @@ -0,0 +1,51 @@ +const express = require("express"); +const eventsLineupController = require("../controllers/eventlineup"); +const router = express.Router(); +const tsUtils = require('../lib/utils') +const multer = require("multer"); +const upload = multer() +const { doubleCsrfProtection } = require('../middlewares/csrf'); + + +// Middleware +const loadEventLineup = (req,res,next) => { + const {team_id, event_id} = req.params + if (!req.event_lineup){ + bulkLoadTypes = ['eventLineup', 'eventLineupEntry'] + req.promises.push(teamsnap.bulkLoad({teamId: team_id, types: bulkLoadTypes, scopeTo:'event', event__id:event_id}, null, tsUtils.teamsnapCallback) + .then(items => tsUtils.groupTeamsnapItems(items, bulkLoadTypes)) + .then(items => { + tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req); + req.event_lineup = items.eventLineups.pop(); + req.event_lineup_entries = items.eventLineupEntries?.sort((a,b)=>a.sequence-b.sequence); + }) + ) + tsUtils.teamsnapLog('loadAvailabilites', types=['availabilities'], team_id, req); + req.promises.push(teamsnap.loadAvailabilities({eventId: event_id}).then(availabilities => req.availabilities = availabilities)) + } + else { + // const {event_lineup} = req + } + const {event_lineup} = req + // req.availabilitySummary = items.find((i) => i.type == "availabilitySummary" && i.id == event.id), + // req.event = items.find((i) => i.type == "event" && i.id == event_id) + next(); +} + +router.use("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup", loadEventLineup) + +// Routes +router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup", async (req,res) => { + await Promise.all(req.promises); + const {event_lineup} = req + res.redirect(`lineup/${event_lineup.id}`); +} +) + +router.post("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup/:event_lineup_id([0-9]+)/email", upload.none(), doubleCsrfProtection, eventsLineupController.getEventLineupEmail ) +router.get ("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup/:event_lineup_id([0-9]+)", upload.none(), doubleCsrfProtection, eventsLineupController.getEventLineup); +router.post("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup/:event_lineup_id([0-9]+)", upload.none(), doubleCsrfProtection, eventsLineupController.postEventLineup); +// router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup_card", eventsController.getLineupCard); +router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup/:event_lineup_id([0-9]+)/entries", eventsLineupController.getEventLineupEntries) + +module.exports = {router, loadEventLineup} \ No newline at end of file diff --git a/src/routes/eventsheet.js b/src/routes/eventsheet.js new file mode 100644 index 0000000..64bcdf9 --- /dev/null +++ b/src/routes/eventsheet.js @@ -0,0 +1,68 @@ +const express = require("express"); +const eventsSheetController = require("../controllers/eventsheet"); +const {loadEventLineup} = require("./eventlineup"); +const {loadEvent} = require("./event"); +const {loadRecentAndUpcomingEvents} = require("../middlewares/bulkload") +const router = express.Router(); +const tsUtils = require('../lib/utils') +const multer = require("multer"); +const upload = multer() + + +// Middleware +const loadEvents = async (req,res,next) => { + const {team_id, event_id} = req.params + req.timeline = {} + await Promise.all(req.promises) + const {recent_events, upcoming_events} = req + const eventIds = [...recent_events.map(e=>e.id), event_id, ...upcoming_events.map(e=>e.id)] + // if (!req.event_lineup){ + bulkLoadTypes = ['event','eventLineup', 'eventLineupEntry'] + req.promises.push(teamsnap.bulkLoad({teamId: team_id, types: bulkLoadTypes, scopeTo:'event', event__id:eventIds}, null, tsUtils.teamsnapCallback) + .then(items => tsUtils.groupTeamsnapItems(items, bulkLoadTypes)) + .then(items => { + tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req); + req.timeline.events = items.events; + req.timeline.event_lineups = items.eventLineups; + req.timeline.event_lineup_entries = items.eventLineupEntries; + }) + ) + tsUtils.teamsnapLog('loadAvailabilites', types=['availabilities'], team_id, req); + + req.promises.push( + teamsnap.loadAvailabilities({eventId: eventIds}).then(availabilities => { + req.timeline.availabilities = availabilities + } + ) + ) + // } + // else { + // // const {event_lineup} = req + // } + const {event_lineup} = req + next(); +} + +const linksForEventSheet = async (req, res, next) => { + await Promise.all(req.promises) + const events = [...req.recent_events, req.event, ...req.upcoming_events] + events.forEach((event) => { + console.log() + }) + next(); +} + +router.use("/:team_id([0-9]+)/event/:event_id([0-9]+)/sheet", loadEventLineup) +router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup/:event_lineup_id([0-9]+)/sheet", loadEventLineup, loadRecentAndUpcomingEvents, loadEvents, eventsSheetController.getEventSheet) + +// Routes +router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/sheet", async (req,res) => { + await Promise.all(req.promises); + const {event_lineup} = req + res.redirect(`lineup/${event_lineup.id}/sheet`); +} +) + +router.post("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup/:event_lineup_id([0-9]+)/sheet", upload.none(), eventsSheetController.getEventSheet ) + +module.exports = {router} \ No newline at end of file diff --git a/src/routes/index.js b/src/routes/index.js index 3596dab..287c683 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,28 +1,30 @@ -var express = require("express"); -var ensureLogIn = require("connect-ensure-login").ensureLoggedIn; -var papaparse = require("papaparse"); - -var ensureLoggedIn = ensureLogIn(); +const express = require("express"); +const {ensureLoggedIn} = require("./auth") var router = express.Router(); var multer = require("multer"); const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); -const teamsController = require("../controllers/teams"); -const eventsController = require("../controllers/events"); -const membersController = require("../controllers/members"); -const opponentsController = require("../controllers/opponents"); +const path = require("path") -router.get("/", ensureLoggedIn, teamsController.getTeams); -router.get("/:team_id/home", ensureLoggedIn, teamsController.getTeamHome); -router.get("/:team_id/events", ensureLoggedIn, eventsController.getEvents); -router.get("/:team_id/event/:event_id", ensureLoggedIn, eventsController.getEvent); -router.get("/:team_id/event/:event_id/lineup", ensureLoggedIn, eventsController.getLineup); -router.get("/:team_id/event/:event_id/lineup_card", ensureLoggedIn, eventsController.getLineupCard); -router.get("/:team_id/members", ensureLoggedIn, membersController.getMembers); -router.get("/:team_id/opponents", ensureLoggedIn, opponentsController.getOpponents); -router.get("/:team_id/opponent/:opponent_id", ensureLoggedIn, opponentsController.getOpponent); -// router.get("/:team_id/opponent/:opponent_id/logo", ensureLoggedIn, opponentsController.getOpponentLogo); +partials = path.join(__dirname, "../views/partials") -module.exports = router; +const membersController = require("../controllers/member"); + +router.use("/", ensureLoggedIn, (req,res,next) => {req.layout="layouts/main";req.promises=[];next();}) + +router.get("/", (req,res,next) => { + if (!req.session.current_team){ + res.redirect(`/user/${req.session.passport.user.id}/teams`) + next(); + } + else { + res.redirect(`/${req.session.current_team}/home`) + next(); + } +}); + +router.get("/:team_id([0-9]+)/members", membersController.getMembers); + +module.exports = {router, partials}; diff --git a/src/routes/opponent.js b/src/routes/opponent.js new file mode 100644 index 0000000..ff469ef --- /dev/null +++ b/src/routes/opponent.js @@ -0,0 +1,38 @@ +const express = require("express"); +const opponentsController = require("../controllers/opponent"); +const {loadTeam} = require("./team") +var router = express.Router(); +const multer = require("multer"); +const upload = multer() +const { doubleCsrfProtection } = require('../middlewares/csrf'); + +// Middleware +const loadOpponent = (req,res,next) => { + const {opponent_id} = req.params; + const {team} = req + req.promises.push( + teamsnap.loadOpponents(team.id, (err, opponents)=>{ + if (err) console.log("error in route/opponent.js", err); + }).then(opponents => {req.opponent=opponents.find(o=>o.id==opponent_id);}) + ) + + req.promises.push( + teamsnap.loadTeamMedia(team.id, (err, team_media)=>{ + if (err) console.log("error in route/opponent.js", err); + }) + .then(team_media => { + req.opponent_logo = team_media.find(tm=>tm.description==`opponent-logo-${opponent_id}.png`) + } + ) + ) + + next(); +} + +router.use("/:team_id([0-9]+)/opponent/:opponent_id([0-9]+)", loadOpponent) +router.get("/:team_id([0-9]+)/opponents", opponentsController.getOpponents); +router.get("/:team_id([0-9]+)/opponent/:opponent_id([0-9]+)", doubleCsrfProtection, opponentsController.getOpponent); +router.post("/:team_id([0-9]+)/opponent/:opponent_id([0-9]+)/upload_logo", upload.single('file'), doubleCsrfProtection, opponentsController.postOpponentLogo); +// router.get("/:team_id([0-9]+)/opponent/:opponent_id/logo", ensureLoggedIn, opponentsController.getOpponentLogo); + +module.exports = {router} \ No newline at end of file diff --git a/src/routes/team.js b/src/routes/team.js new file mode 100644 index 0000000..07f53ed --- /dev/null +++ b/src/routes/team.js @@ -0,0 +1,45 @@ +const express = require("express"); +const teamsController = require("../controllers/team"); +const {loadRecentAndUpcomingEvents} = require("../middlewares/bulkload") +const { load } = require("dotenv"); +const router = express.Router(); +const tsUtils = require('../lib/utils') + +// Middleware +const loadTeam = async (req,res,next) => { + const {team_id} = req.params; + req.team = await teamsnap.loadTeam(team_id) + tsUtils.teamsnapLog('loadTeam', types=["team"], team_id, req); + const bulkLoadTypes = ['teamMediaGroup', 'teamPreferences', 'member']; + const items = tsUtils.groupTeamsnapItems(teamsnap.getAllItems(), bulkLoadTypes) + if (req.session.current_team_id == null || req.session.current_team_id != team_id || bulkLoadTypes.filter(t=> !items[t] || items[t].length==0).length > 0){ + req.promises.push(teamsnap.bulkLoad( + team_id, + bulkLoadTypes, + tsUtils.teamsnapCallback + ).then(bulkLoadItems=>{ + const items = tsUtils.groupTeamsnapItems(bulkLoadItems, bulkLoadTypes) + tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req); + req.members = items.members; + req.team_media_group = items.teamMediaGroups?.pop(); + req.team_preferences = items.teamsPreferences.pop(); + req.session.current_team_id = req.team.id + } + ) + ) + } + else { + req.members = items.member; + req.team_media_group = items.teamMediaGroup.pop(); + req.team_preferences = items.teamPreferences.pop(); + } + next(); +} + +router.use("/:team_id([0-9]+)", loadTeam) + +// Routes +router.get('/user/:user_id/teams', teamsController.getTeams) +router.get("/:team_id([0-9]+)/home", loadRecentAndUpcomingEvents, teamsController.getTeamHome); + +module.exports = {router, loadTeam} \ No newline at end of file diff --git a/src/scss/application.scss b/src/scss/application.scss new file mode 100644 index 0000000..ad89bd7 --- /dev/null +++ b/src/scss/application.scss @@ -0,0 +1,348 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS (and SCSS, if configured) file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + *= require_tree . + *= require_self + */ + + @import "../../node_modules/@teamsnap/teamsnap-ui/src/css/teamsnap-ui.scss"; + + +$color-success: #b7e1cd; +$color-danger: #f4c7c3; +$color-neutral: #acc9fe; +$color-warning: rgb(249, 228, 180); +$color-grey-100: #f8f9fa; +$color-grey-200: #e9ecef; +$color-grey-300: #dee2e6; +$color-grey-400: #ced4da; +$color-grey-500: #adb5bd; +$color-grey-600: #6c757d; +$color-grey-700: #495057; +$color-grey-800: #343a40; +$color-grey-900: #212529; +$row-height: 14px; +$monospace-font: "Inconsolata", monospace; + + + // Components + @import "components/progress"; + +:root { + --bc-text-muted:#6c757d; + --bc-avail-color-yes: $cu-positive; + --bc-avail-color-no: $cu-negative; + --bc-avail-color-maybe:#113b63; +} + +.availability-bar { + &.going { + background-color: $ts-green; + } + + &.not-going { + background-color: $ts-red; + } + + &.maybe { + background-color: $ts-blue; + } + + &.unknown { + background-color: $ts-grey; + } +} + +header.Header { + background: #323669; + padding: 8px 0; + box-shadow: 0 4px 0 rgba(0, 0, 25, 0.1); + border-bottom: 1px solid #d6d6d6; + color: white; +} + +body { + background-color: rgb(246, 246, 246); +} + +/* .u-padSm.u-border.u-borderRadiusLg.u-spaceEndsSm.u-maxWidthXs */ + +.event-card { + font-family: "Open Sans", Helvetica, sans-serif; + border: 1px solid #e6e6e6; + border-radius: 8px; + max-width: 480px; + margin-top: 8px; + margin-bottom: 8px; + background: white; + + .title { + margin-bottom: 4px; + } + + .event-card-body { + padding: 8px 8px 8px 8px; + } +} + +.event-card-body { + > .availability-bar { + margin: 4px; + + &.fullwidth { + margin-top: 4px; + margin-bottom: -8px; + margin-left: -8px; + margin-right: -8px; + } + } + + .availability-bar.fullwidth .progress { + margin-left: -8px; + margin-right: -8px; + border-radius: 0; + } +} + +.event-card { + .date, .location { + color: #7a7a7a; + font-size: 0.9em; + } + + .opponent {} + + .Button span { + margin-left: 4px; + } + + .event-card-footer { + padding: 8px; + border-radius: 0px 0px 8px 8px; + background-color: rgb(251, 251, 251); + border-top: solid 1px rgb(214, 214, 214); + } +} + +.event-card-footer div { + text-align: center; +} + +.Header-bannerLogo, .Header-bannerTitle { + margin: 0; + padding: 0; + margin-left: 0.5em; +} + +.Header-bannerLogo img { + height: 36px; + width: auto; +} + +.Header-bannerTitle { + font-family: "Helvetica", sans-serif; + text-transform: uppercase; + font-weight: bold; + text-align: left; + color: white; + font-size: 28px; +} + +.benchcoach-nav { + background-color: #323669; + margin-bottom: 2em; + padding: 0.5em; + color: white; +} + +a.Panel-row { + color: inherit; +} + +.benchcoach-nav h3 { + font-family: "Helvetica", sans-serif; + font-weight: bolder; + color: white; + text-transform: uppercase; +} + +.lineup-slot .Panel-cell { + display: inline-flex; + align-items: center; +} + +div[id^="event-lineup"] { + max-width: 576px; + counter-reset: lineup-sequence-counter 0; +} + +.lineup-slot { + counter-increment: lineup-sequence-counter 1; + + .Panel-cell { + &.Panel-cell--header { + background: rgba(256, 256, 256, 0); + } + + } + + [class*="availability-status-code"]::before { + padding-right: 6px; + font-family: "bootstrap-icons"; + } +} + +.lineup-slot .availability-status-code-1 .icon { + color: $ts-green; +} + +.lineup-slot .availability-status-code-2 .icon { + color: $ts-blue; +} + +.lineup-slot .availability-status-code-0 .icon { + color: $ts-red; +} + +.lineup-slot { + .availability-status-code-nil .icon, .availability-status-code- .icon { + color: $ts-grey; + } +} + +li .availability-status-code- { + content: "\F50B"; + color: var(--bs-secondary); +} + +.lineup-slot { + line-height: 100%; + vertical-align: middle; + span { + margin:auto; + } + .lastname { + text-transform: uppercase; + font-weight: bold; + } + + .jerseynumber { + text-transform: uppercase; + font-weight: light; + color: var(--bc-text-muted); + font-size: 0.8em; + + // &::before { + // content: "-"; + // margin-right: 4px; + margin-left: 4px; + // } + } + + button { + margin-right: 0.5ch; + } + .sequence { + width: 2.4ch; + text-align: right; + margin-right: 0.3ch; + + &::before { + content: counter(lineup-sequence-counter); + } + } + + .drag-handle { + width: 2ch; + } + + .position-select-box { + width: 10ch; + } + + .Panel-cell { + &:has(.sequence), &:has(.drag-handle), &:has(.position-select-box) { + flex: 0 0 0% !important; + padding: 0; + } + } + +} + +div[id^="event-lineup"] .Panel { + &.position-only .Panel-cell:has(.sequence), &.bench .Panel-cell:has(.sequence), &.out .Panel-cell:has(.sequence){ + display: none; + } + + &.out { + .Panel-cell { + &:has(.sequence), .drag-handle, .SelectBox { + // display: none; + } + } + } +} + +.Tooltip:after { + padding: 2px !important; + font-size: inherit !important; +} + +@media (max-width: 480px){ +.Panel--full { + border-radius: 0; + margin-right: -16px; + margin-left: -16px; +}} + +.lineup-email { + font-family: "Helvetica", sans-serif; + + .title-cell { + font-weight:bold; + background-color:#323669; + color:#fff; + padding:2px 5px; + text-transform: uppercase; + + &.out { + background-color: rgb(244, 199, 195); + color: black; + } + } + + .sequence-cell { + font-weight:bold; + padding: 1px 5px; + text-align: left + } + + .name-cell { + width:200px; + text-align: left; + } + + .position-label-cell { + font-weight: bold; + text-align: right; + } +} + + +.Panel .Panel{ + // padding: 0; + // border-radius: 0; + border: none; + // border-top: 1px solid #d6d6d6; + // border-bottom: 1px solid #d6d6d6; + margin: 0; +} diff --git a/src/scss/components/_border-radius.scss b/src/scss/components/_border-radius.scss new file mode 100644 index 0000000..616decb --- /dev/null +++ b/src/scss/components/_border-radius.scss @@ -0,0 +1,78 @@ +// stylelint-disable property-disallowed-list +// Single side border-radius + +// Helper function to replace negative values with 0 +@function valid-radius($radius) { + $return: (); + @each $value in $radius { + @if type-of($value) == number { + $return: append($return, max($value, 0)); + } @else { + $return: append($return, $value); + } + } + @return $return; +} + +// scss-docs-start border-radius-mixins +@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) { + @if $enable-rounded { + border-radius: valid-radius($radius); + } + @else if $fallback-border-radius != false { + border-radius: $fallback-border-radius; + } +} + +@mixin border-top-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-left-radius: valid-radius($radius); + border-top-right-radius: valid-radius($radius); + } +} + +@mixin border-end-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-right-radius: valid-radius($radius); + border-bottom-right-radius: valid-radius($radius); + } +} + +@mixin border-bottom-radius($radius: $border-radius) { + @if $enable-rounded { + border-bottom-right-radius: valid-radius($radius); + border-bottom-left-radius: valid-radius($radius); + } +} + +@mixin border-start-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-left-radius: valid-radius($radius); + border-bottom-left-radius: valid-radius($radius); + } +} + +@mixin border-top-start-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-left-radius: valid-radius($radius); + } +} + +@mixin border-top-end-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-right-radius: valid-radius($radius); + } +} + +@mixin border-bottom-end-radius($radius: $border-radius) { + @if $enable-rounded { + border-bottom-right-radius: valid-radius($radius); + } +} + +@mixin border-bottom-start-radius($radius: $border-radius) { + @if $enable-rounded { + border-bottom-left-radius: valid-radius($radius); + } +} +// scss-docs-end border-radius-mixins diff --git a/src/scss/components/_box-shadow.scss b/src/scss/components/_box-shadow.scss new file mode 100644 index 0000000..4172541 --- /dev/null +++ b/src/scss/components/_box-shadow.scss @@ -0,0 +1,18 @@ +@mixin box-shadow($shadow...) { + @if $enable-shadows { + $result: (); + + @each $value in $shadow { + @if $value != null { + $result: append($result, $value, "comma"); + } + @if $value == none and length($shadow) > 1 { + @warn "The keyword 'none' must be used as a single argument."; + } + } + + @if (length($result) > 0) { + box-shadow: $result; + } + } +} diff --git a/src/scss/components/_progress.scss b/src/scss/components/_progress.scss new file mode 100644 index 0000000..d965c52 --- /dev/null +++ b/src/scss/components/_progress.scss @@ -0,0 +1,72 @@ + + +$progress-height: 1rem; +$progress-font-size: $tu-base-fontSize * .75; +$progress-bg: $color-grey-200; +$progress-border-radius: $border-radius-small; +$progress-box-shadow: $inset-box-shadow-small; +$progress-bar-color: $ts-white; +$progress-bar-bg: $ts-green; +$progress-bar-animation-timing: 1s linear infinite; +$progress-bar-transition: width .6s ease; +$prefix: ""; + +// Disable animation if transitions are disabled + +// scss-docs-start progress-keyframes +// @if $enable-transitions { +// @keyframes progress-bar-stripes { +// 0% { background-position-x: $progress-height; } +// } +// } +// scss-docs-end progress-keyframes + +.progress { + // scss-docs-start progress-css-vars + --#{$prefix}progress-height: #{$progress-height}; + // @include rfs($progress-font-size, --#{$prefix}progress-font-size); + --#{$prefix}progress-bg: #{$progress-bg}; + --#{$prefix}progress-border-radius: #{$progress-border-radius}; + --#{$prefix}progress-box-shadow: #{$progress-box-shadow}; + --#{$prefix}progress-bar-color: #{$progress-bar-color}; + --#{$prefix}progress-bar-bg: #{$progress-bar-bg}; + --#{$prefix}progress-bar-transition: #{$progress-bar-transition}; + // scss-docs-end progress-css-vars + + display: flex; + height: var(--#{$prefix}progress-height); + overflow: hidden; // force rounded corners by cropping it + // @include font-size(var(--#{$prefix}progress-font-size)); + background-color: var(--#{$prefix}progress-bg); + // @include border-radius(var(--#{$prefix}progress-border-radius)); + // @include box-shadow(var(--#{$prefix}progress-box-shadow)); +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--#{$prefix}progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--#{$prefix}progress-bar-bg); + // @include transition(var(--#{$prefix}progress-bar-transition)); +} + +.progress-bar-striped { + // @include gradient-striped(); + background-size: var(--#{$prefix}progress-height) var(--#{$prefix}progress-height); +} + +// @if $enable-transitions { +// .progress-bar-animated { +// animation: $progress-bar-animation-timing progress-bar-stripes; + +// @if $enable-reduced-motion { +// @media (prefers-reduced-motion: reduce) { +// animation: none; +// } +// } +// } +// } diff --git a/src/scss/eventsheet.scss b/src/scss/eventsheet.scss new file mode 100644 index 0000000..b5d5cc0 --- /dev/null +++ b/src/scss/eventsheet.scss @@ -0,0 +1,851 @@ +@import url('https://fonts.googleapis.com/css2?family=Pacifico'); +@import url('https://fonts.googleapis.com/css2?family=Oswald'); +@import url('https://fonts.googleapis.com/css2?family=Graduate'); +@import url('https://fonts.googleapis.com/css2?family=Inconsolata:wdth,wght@50..200,200..900&display=swap'); +@import url('/font/helvetica-now/stylesheet.css'); + +@font-face { + font-family: "Futura Now"; + src: url("/font/futura-now/futura-now.ttf") format("truetype"); + font-weight: 125 900; + font-stretch: 50% 150%; +} + +@page { + margin: 0; +} + +/** For Print **/ +@media print { + body .sheet { + size: B5; + padding: 0.2in; + } +} + +/** For screen preview **/ +@media screen { + body .sheet { + padding: 0.2in; + } + body { + background: #e0e0e0; + } + .sheet { + background: white; + box-shadow: 0 0.5mm 2mm rgba(0, 0, 0, 0.3); + } +} + +.sheet { + overflow: hidden; + position: relative; + box-sizing: border-box; + page-break-after: always; +} + +/** Paper sizes **/ +body.B5 .sheet { + width: 176mm; + height: 250mm; +} + +body.index-card .sheet { + width: 3.5in; + height: 5in; +} + +:root { + --color-success: #b7e1cd; + --color-danger: #f4c7c3; + --color-neutral: #acc9fe; + --color-warning: rgb(249, 228, 180); + --color-grey-100: #f8f9fa; + --color-grey-200: #e9ecef; + --color-grey-300: #dee2e6; + --color-grey-400: #ced4da; + --color-grey-500: #adb5bd; + --color-grey-600: #6c757d; + --color-grey-700: #495057; + --color-grey-800: #343a40; + --color-grey-900: #212529; + --row-height: 14px; + --monospace-font: "Inconsolata", monospace; +} + +body { + font-family: "Helvetica Now", "Helvetica", sans-serif; + position: relative; + font-size: 11px; +} + +table { + position: inherit; + font-size: inherit; + border-collapse: collapse; + empty-cells: show; + white-space: nowrap; + text-overflow: ellipsis; + overflow-x: hidden; + overflow-y: hidden; + width: 100%; + border: 0.5px solid black; + display: inline-table; + + tr { + border-bottom-width: 0.5px; + border-color: grey; + border-bottom-style: solid; + + &:nth-child(odd) { + background-color: rgb(242, 242, 242, 0.85); + } + + &:nth-child(even) { + background-color: rgb(256, 256, 256, 0.85); + } + + th { + font-stretch: extra-condensed; + width: 1em; + text-align: center; + text-transform: uppercase; + } + + + td { + &.player-name { + text-transform: uppercase; + font-stretch: 75%; + } + &.position, &.jersey-number { + font-family: var(--monospace-font); + width: 2ch; + text-align: right; + overflow: hidden; + } + + } + + th, td { + border-left: 0.5px solid grey; + border-right: 0.5px solid grey; + overflow: hidden; + padding: 0 2px 0 2px; + + &:empty::after { + content: "\00a0"; + } + } + + } + +} + +.float-right { + float: right; +} + +.float-left { + float: left; +} + + + + + +.B5 > .eventsheet { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + column-gap: 0.2in; + row-gap: 0.2in; + background-size: 100%; +} + +.eventsheet > section { + box-sizing: content-box; + overflow: hidden; + /* outline: 0.5px dashed lightgrey; */ + display: flex; + flex-direction: column; + align-items: stretch; +} + +.eventsheet > section > div { + display: flex; + flex: 1; + align-items: stretch; + height: auto; +} + +.lineup-card th { + width: inherit; +} + +#lineup-card-dugout div.grid-container, +#lineup-card-dugout-blank div.grid-container { + display: grid; + grid-template-columns: 60% auto; + grid-template-rows: fit-content(16px) auto; + grid-template-areas: + "header header" + "sarting-lineup-table substitution-table"; +} + +#lineup-card-exchange div.grid-container, +#lineup-card-exchange-blank div.grid-container { + display: grid; + grid-template-columns: auto; + grid-template-rows: fit-content(16px) auto; + grid-template-areas: + "header" + "sarting-lineup-table"; +} + +#lineup-card-exchange .substitution, +#lineup-card-exchange .homeaway, +#lineup-card-exchange-blank .substitution, +#lineup-card-exchange-blank .homeaway { + display: none; +} + +.lineup-card div.grid-container > header { + grid-area: "header"; + font-size: 14px; + font-weight: bold; +} + +.lineup-card div.grid-container > header:empty::after { + content: "\00a0"; +} + +div.grid-container > .starting-lineup-table { + grid-area: "starting-lineup-table"; +} + +div.grid-container > .substitution-table { + grid-area: "substitution-table"; +} + + + +section.lineup-card { + counter-reset: lineup-sequence-counter 0; + + thead th { + color: var(--color-grey-600); + font-size: 0.7em; + } + th.sequence { + counter-increment: lineup-sequence-counter 1; + color: var(--color-grey-600); + font-size: inherit; + width: 2ch; + + &.counter::before { + content: counter(lineup-sequence-counter); + } + + } + +} + + +.lineup-card table { + font-size: 22px; +} + +.lineup-card td { + /* height: 34px; */ +} + +.lineup-card td.substitution { + width: 8ch; +} + +.lineup-card td.substitution::after { + content: ""; +} + +#lineup-card-exchange tr, +#lineup-card-exchange-blank tr, +#lineup-card-dugout .starting-lineup-table tr, +#lineup-card-dugout-blank .starting-lineup-table tr, +#lineup-card-dugout .substitution-table tr:nth-child(odd) { + border-top: 1px solid black; +} + +#lineup-card-exchange tr, +#lineup-card-exchange-blank tr, +#lineup-card-dugout .starting-lineup-table tr, +#lineup-card-dugout-blank .starting-lineup-table tr, +#lineup-card-dugout .substitution-table tr:nth-child(even) { + border-bottom: 1px solid black; +} + +td.substitution { + border-left: 1px solid black; +} + +#lineup-card-exchange td.player-name { + font-stretch: 100%; +} + +#lineup-card-dugout td.player-name { + width: 10ch; +} + +.lineup-card .position, +.lineup-card .jersey-number { + width: 2ch; +} + +#lineup-card-dugout .position, +#lineup-card-dugout .jersey-number { + font-stretch: 75%; + padding-left: 2.5px; + padding-right: 2.5px; +} + +.lineup-card header { + font-size: inherit; + text-transform: uppercase; + font-stretch: 85%; +} + + +#todays-game { + > div { + display: grid; + grid-template-columns: 110px auto; + grid-template-rows: auto auto; + grid-template-areas: + "offense defense" + "footer footer"; + } + + table { + &.notes { + th { + border-left: none; + border-right: none; + line-height: 1em; + } + td:empty::after { + content: ""; + } + } + } +} + +#defense-pane { + position: relative; + grid-area: defense; + padding: 4px 4px 0px 4px; /* top right bottom left */ + display: flex; + border-right: 0.5px solid grey; + border-bottom: 0.5px solid grey; + + .field-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(6, 1fr); + grid-column-gap: 4px; + width: 100%; + z-index: 2; + } + + img { + position: absolute; + z-index: -1; + } + + .slot-set { + display: flex; + align-items: center; + + $positions: "cf", "lf", "rf", "ss", "2b", "3b", "1b", "c", "p"; + + @each $position in $positions { + &.pos-#{$position} tr:first-child { + th.position:empty::after { + content: $position; + } + } + } + + &.pos-cf { + justify-content: center; + // align-items: start; + grid-area: 1 / 1 / 2 / 5; + } + + &.pos-lf { + justify-content: flex-start; + grid-area: 2 / 1 / 3 / 3; + } + + &.pos-rf { + justify-content: flex-end; + grid-area: 2 / 3 / 3 / 5; + } + + &.pos-ss { + justify-content: flex-end; + grid-area: 3 / 1 / 4 / 3; + } + + &.pos-2b { + justify-content: flex-start; + grid-area: 3 / 3 / 4 / 5; + } + + &.pos-3b { + justify-content: flex-start; + grid-area: 4 / 1 / 5 / 3; + } + + &.pos-1b { + justify-content: flex-end; + grid-area: 4 / 3 / 5 / 5; + } + + &.pos-c { + justify-content: center; + grid-area: 5 / 1 / 6 / 5; + } + + &.pos-p { + table { + width: 100%; + } + align-items: end; + margin-bottom: 4px; + grid-area: 6 / 1 / 7 / 5; + tr.substitute .position:empty::after{ + content: "RP"; + } + + } + + } + +} + +#offense-pane { + counter-reset: lineup-sequence-counter 0; + position: relative; + /* box-sizing: border-box; */ + height: 100%; + grid-area: offense; + border-bottom: 0.5px solid black; + /* outline: 0.5px solid black; */ + + table { + height: 100%; + border: none; + } + + th.sequence{ + counter-increment: lineup-sequence-counter 1; + &.counter::before { + content: counter(lineup-sequence-counter); + } + } + +} + + +.slot-set table { + width: 77px; +} + +.slot-set.pos-slot-p table { + width: 100%; +} + +.index-card .defense-slot-set { + width: 65px; +} + +.index-card .defense-slot-set .player-name { + font-stretch: 70%; +} + +.container .row { + width: 100%; + display: flex; + align-items: center; +} + +header { + background-color: #cadcf9; + font-family: "Oswald"; + /* font-size: 8.8px; */ + /* outline: 1px solid black; */ + /* height: var(--row-height); */ + width: auto; + grid-area: header; + text-align: center; + padding-left: 10px; + padding-right: 10px; + border: 0.5px solid black; + z-index: 1; +} + +.footer { + /* height:var(--row-height); */ + position: relative; + box-sizing: border-box; + grid-area: footer; + /* border: 1px solid black; */ + height: 100%; + border-right: 0.5px solid grey; + border-left: 0.5px solid grey; + + table { + height: 100%; + outline: none; + border-style: none; + + tr { + background-color: white; + outline: none; + border-bottom: 0.5px solid var(--color-grey-500); + + :last-child { + background-color: white; + outline: none; + border-bottom-style: none; + } + } + + th { + text-align: left; + color: var(--color-grey-600); + } + + td { + height: var(--row-height); + border: none; + &empty::after { + content: ""; + } + } + } +} + +.cell-checkbox { + font-size: 0.75em; +} + +.in-starting-lineup { + font-weight: bold; +} + +.gametitle { + font-weight: bold; + text-transform: uppercase; + font-stretch: semi-condensed; +} + +.homeaway { + text-transform: uppercase; + font-stretch: normal; + font-weight: bolder; + float: right; + text-transform: uppercase; +} + +.cell-smalltext { + font-stretch: condensed; + font-size: 10px; +} + +.statscell { + font-family: "m+1m"; + text-align: center; + font-stretch: extra-condensed; + font-size: 9px; + width: 60px; +} + +.condensedNameCell { + width: 70px; + text-transform: uppercase; + font-stretch: condensed; +} + +.cell-square { + height: var(--row-height); + width: 14px; + text-align: center; +} + +.cell-square.narrow { + width: 10px; +} +.cell-mono { + font-family: "m+1m"; +} + +.cell-condensed { + font-stretch: condensed; +} + +.available-status-code-1 { + color: rgb(0, 85, 0); + background-color: #b7e1cd; +} + +.available-status-code-0 { + color: rgb(170, 0, 0); + background-color: #f4c7c3; +} + +.past.available-status-code-0, +.past.available-status-code-null { + color: var(--color-grey-600); + background-color: inherit; +} + +.past.available-status-code-1 { + color: inherit; + background-color: var(--color-warning); +} + +.past.available-status-code-1.started { + color: inherit; + background-color: inherit; +} + +.available-status-code-2 { + color: blue; + background-color: #acc9fe; +} + +#roster-and-history .player-name { + font-stretch: 95%; +} + +.starting { + font-weight: bold; +} + +#roster-and-history { + // #today-availability { + // font-stretch: normal; + // text-transform: uppercase; + // font-size: 0.8em; + // } + > div > table { + /* font-size: 10.5px; */ + padding: 0; + line-height: 1em; + /* outline: 0.5px black; */ + } + + td, th { + border-left: none; + border-right: none; + padding: 0.2em 0.1em 0.2em 0.1em; /* top right bottom left */ + + &.availability-on-day { + font-family: var(--monospace-font); + font-stretch: 60%; + text-align: center; + max-width: 0.8em; + min-width: 0.8em; + } + + &.availability-on-day.future, + &.availability-on-day.past { + font-family: var(--monospace-font); + font-stretch: condensed; + font-weight: normal; + font-size: 0.8em; + padding: 0.1em; + text-transform: uppercase; + } + + &.position-capability { + font-size: 8px; + font-stretch: 50%; + width: 5px; + text-align: center; + padding: 0; + } + &.player-stats { + display:none; + font-family: var(--monospace-font); + font-size: 1em; + font-stretch: 60%; + font-weight: 300; + + .delimiter, + .decimal-point { + font-family: Helvetica Now; + font-stretch: expanded; + color: var(--color-grey-500); + } + + .decimal-point { + color: rgb(0, 0, 0, 0); + } + + .delimiter { + color: var(--color-grey-500); + } + } + } + + td{ + &.player-name { + color: black; + text-align: left; + font-stretch: 95%; + } + &.jersey-number { + color: black; + border-left: 0.5px solid lightgrey; + } + } + + colgroup { + border-left-width: 1px; + border-left-style: solid; + border-left-color: black; + border-right-width: 1px; + border-right-style: solid; + border-right-color: black; + } + + col.player-stats { + // visibility:collapse; + border: inherit; + } + + th { + background-color: #cadcf9; + color: black; + border: none; + + &.availability-on-day div { + transform: rotate(270deg); + } + + // .position-capability { + // font-size: inherit; + // } + } + + thead > tr, tfoot > tr { + border-bottom: solid black 1px; + } + + tbody { + border-bottom: solid black 1px; + } + + tr.border-top { + border-top: 1px solid black; + } + + + +} + +td.position-capability:not(:empty) { + color: var(--color-grey-700); + background-color: var(--color-grey-200); +} + +td.is-present-checkbox { + font-size: 0.5em; + text-align: center; + color: white; + /* text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, + 1px 1px 0 #000; */ +} + +td.is-present-checkbox.available-status-code-0 > span { + display: none; +} + +td.is-present-checkbox.available-status-code-None > span { + display: none; +} + +.game-number .label { + font-size: xx-small +} + +.game-number .label, .game-number .value{ + display:none; +} + +#front-cover { + border: solid 1px black; + + Header { + font-family: "Helvetica Now"; + font-weight: 600; + line-height: 1.5em; + background-color: #323669; + color: white; + display: inline-flex; + border: none; + padding-left: 5px; + padding-right: 5px; + } + + .game-number, .homeaway{ + display: grid; + font-size: xx-large; + align-content: center; + width: 1.4em; + font-weight: 800; + } + + .title { + display: grid; + font-size: small; + flex-grow: 1; + align-content: center; + } + + .head-to-head { + padding:5px; + display: flex; + flex-direction: column; + } + + .opponent, .team { + text-align: center; + font-weight: 800; + font-size: x-large; + align-items: center; + font-family: 'Pacifico'; + display: inline-flex; + width: 100%; + flex-grow:1 + } + + .opponent img, .team img{ + height: 115px; + } + + .opponent div:has(.name), .team div:has(.name){ + flex-grow: 1; + } + + .opponent name{ + text-align: left; + } + + .team name{ + text-align: right; + } +} + diff --git a/src/views/error.hbs b/src/views/error.hbs new file mode 100644 index 0000000..29e29df --- /dev/null +++ b/src/views/error.hbs @@ -0,0 +1,2 @@ +

Oops ...

+{{message}} \ No newline at end of file diff --git a/src/views/error.pug b/src/views/error.pug deleted file mode 100644 index 329d5b9..0000000 --- a/src/views/error.pug +++ /dev/null @@ -1,8 +0,0 @@ -html - head - body - h1 error - h2 - error.status - pre - message #{message} diff --git a/src/views/event-lineup-card.pug b/src/views/event-lineup-card.pug deleted file mode 100644 index 9f98da7..0000000 --- a/src/views/event-lineup-card.pug +++ /dev/null @@ -1,409 +0,0 @@ -html - head - meta(charset='utf-8') - title #{event.formattedTitle} - link(rel='stylesheet' href='/css/gamecard.css') - - body(class="B5") - input(name="team_id", type="hidden" value=`${team_id}`) - input(name="event_id", type="hidden" value=`${event_id}`) - #page-1.sheet.gamecard - section#todays-game - .grid-container - .section-header - #todays-game-header.bar-left.event-title - | #{event.formattedTitle} - | #{event.startDate.toLocaleDateString("en-us",{weekday: "short", day: "numeric",month: "short"})} - | #{event.startDate.toLocaleTimeString("en-us",{hour: "numeric", minute: "2-digit"})} - .bar-right.homeaway #{event.gameType} - .bar-span.gametitle - #offense-pane.left - table#starting-lineup-offense - tbody - each _, i in Array(11) - - if (typeof(event_lineup_entries_offense[i]) !== 'undefined'){ - tr - th(rowspan='2') #{i+1} - td(id=`offense-slot-${i}-name` class="player-name") #{event_lineup_entries_offense[i].member.lastName} - td(id=`offense-slot-${i}-jersey-number` class="jersey-number") #{event_lineup_entries_offense[i].member.jerseyNumber} - td(id=`offense-slot-${i}-position` class="position") #{event_lineup_entries_offense[i].label} - tr.substitute - td - td - td - - } else { - tr - th(rowspan='2') - td(id=`offense-slot-${i}-name` class="player-name") - td(id=`offense-slot-${i}-jersey-number` class="jersey-number") - td(id=`offense-slot-${i}-position` class="position") - tr.substitute - td - td - td - - } - - #defense-pane.right - .container - .field-container - image(src='/media/baseball-diamond.svg') - .row(style='justify-content: center') - .defense-slot-set - table - tr - th.position CF - td#defense-slot-CF-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("CF")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .row(style='justify-content: space-between') - .defense-slot-set - table - tr - th.position LF - td#defense-slot-LF-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("LF")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .defense-slot-set - table - tr - th.position RF - td#defense-slot-RF-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("RF")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .row(style='justify-content: space-around') - .defense-slot-set - table - tr - th.position SS - td#defense-slot-SS-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("SS")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .defense-slot-set - table - tr - th.position 2B - td#defense-slot-2B-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("2B")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .row(style='justify-content: space-between') - .defense-slot-set - table - tr - th.position 3B - td#defense-slot-3B-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("3B")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .defense-slot-set - table - tr - th.position 1B - td#defense-slot-1B-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("1B")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .row(style='justify-content: center') - .defense-slot-set - table - tr - th.position C - td#defense-slot-C-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("C") && !lue.label.startsWith("CF") ) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .pitching-container - .defense-slot-set - table - tr - th.position P - td#defense-slot-P-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("P")) || {"member":{}}).member.lastName} - td.jersey-number - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("P")) || {"member":{}}).member.jerseyNumber} - td.position - tr - th.position RP - td#defense-slot-RP1-name.player-name - td - td - tr - th.position RP - td#defense-slot-RP2-name.player-name - td - td - .footer - table - tr - th Notes - td - tr - td - tr - td - section#roster-and-history - div - table - thead - tr - th#today-availability(colspan='3') Available ( - | #{availabilitySummaries.find((e)=>e.id==event_id).playerGoingCount}| - | #{availabilitySummaries.find((e)=>e.id==event_id).playerMaybeCount} - | ) - th.player-stats - span.decimal-point . - | AVG - span.delimiter / - span.decimal-point . - | OBP - span.delimiter / - span.decimal-point . - | SLG - span.delimiter : - | PA - th.position-capability.pitcher P - th.position-capability.catcher C - th.position-capability.infield I - th.position-capability.outfield O - each event_future, i in events_future - th(id=`avail-header-today-plus-${i+1}` class="availability future") - .rotate #{event_future.startDate.toLocaleDateString("en-us", {weekday: "short"})} - each event_past, i in events_past - th(id=`avail-header-today-minus-${i+1}` class="availability past") - .rotate #{event_past.startDate.toLocaleDateString("en-us", {weekday: "short"})} - tbody - each row, index in availabilities.filter((e)=>e.event.id==event_id && !e.member.isNonPlayer) - tr(id=`roster-history-slot-${index+1}` class=``) - td(class=`is-present-checkbox available-status-code-${row.statusCode}`) - span ■ - td( - class=` - jersey-number - border-left - available-status-code-${row.statusCode} - ${event_lineup_entries.find((lue)=>lue.member.id==row.member.id) !== undefined ? "starting" : ""} - `) - | #{row.member.jerseyNumber} - td( - class=` - player-name - available-status-code-${row.statusCode} - ${event_lineup_entries.find((lue)=>lue.member.id==row.member.id) !== undefined ? "starting" : ""} - `) - | #{row.member.lastName} - td.player-stats.border-left.border-right - span.decimal-point . - span.avg 000 - span.delimiter / - span.decimal-point . - span.obp 000 - span.delimiter / - span.decimal-point . - span.slg 000 - span.delimiter : - span.pa 00 - td.position-capability.pitcher #{row.member.position.includes("P") ? "\u2713" : ""} - td.position-capability.catcher #{row.member.position.includes("C") ? "\u2713" : ""} - td.position-capability.infield #{row.member.position.includes("IF") ? "\u2713" : ""} - td.position-capability.outfield #{row.member.position.includes("OF") ? "\u2713" : ""} - - var future_availability - - var future_lineupEntry - each future_event, i in events_future - - future_availability = availabilities.find((el)=>el.eventId ==future_event.id && el.memberId==row.member.id) - - future_lineupEntry = all_lineup_entries.find((el)=>el.eventId ==future_event.id && el.member.id==row.member.id) - - console.log(future_availability) - td(id=`avail-${row.member}-today-plus-${i+1}` class=` - row - future - availability - available-status-code-${future_availability.statusCode} - `) - if future_lineupEntry - |#{future_lineupEntry.label.slice(0,2)} - else - |#{future_availability.status[0]} - - var past_availability - - var past_lineupEntry - each past_event, i in events_past - - past_availability = availabilities.find((el)=>el.eventId==past_event.id && el.memberId==row.memberId) - - past_lineupEntry = all_lineup_entries.find((el)=>el.event.id==past_event.id && el.member.id==row.member.id) - td(id=`avail-${row.member}-today-minus-${i+1}` class=` - row - past - availability - available-status-code-${past_availability.statusCode} - ${past_lineupEntry ? "started" : ""} - `) - if past_lineupEntry - |#{past_lineupEntry.label.slice(0,2)} - else - |#{past_availability.status[0]} - tfoot - tr - th(colspan='3') - th - th(colspan='4') - each event_future, i in events_future - th(class=`availability future`) - .rotate #{availabilitySummaries.find((el)=>el.eventId == event_future.id).playerGoingCount} - th.today-minus-1 - .rotate - th.today-minus-2 - .rotate - th.today-minus-3 - .rotate - th.today-minus-4 - .rotate - section#lineup-card-dugout.lineup-card - .grid-container - .section-header - .bar-left.event-title - | #{event.formattedTitle} - .bar-right.homeaway #{event.gameType} - .starting-lineup-table - table - thead - tr - th(colspan='4') Starting - tbody - each i in [0,1,2,3,4,5,6,7,8,9,10] - - if (typeof(event_lineup_entries_offense[i]) !== 'undefined'){ - tr - th.sequence.label #{event_lineup_entries_offense[i].sequence +1} - td.player-name #{event_lineup_entries_offense[i].member.lastName} - td.jersey-number #{event_lineup_entries_offense[i].member.jerseyNumber} - td.position #{event_lineup_entries_offense[i].label} - - } else { - tr - th.sequence.label - td.player-name - td.jersey-number - td.position - tr - td - td - td - td - - } - - .substitution-table - table(style='width: 100%') - thead - tr - th Substitution - tbody - each i in [0,1,2,3,4,5,6,7,8,9,10,11] - tr - td.substitution - tr - td.substitution - section#lineup-card-exchange.lineup-card - .grid-container - .section-header.event-title #{event.formattedTitleForMultiTeam} - .starting-lineup-table - table.starting-lineup-table - thead - tr - th - th.player-name Name - th.jersey-number Num - th.position Pos - tbody - each _,i in Array(10) - - if (typeof(event_lineup_entries_offense[i]) !== 'undefined'){ - tr - th.sequence.label #{event_lineup_entries_offense[i].sequence+1} - td.player-name #{event_lineup_entries_offense[i].member.lastName} - td.jersey-number #{event_lineup_entries_offense[i].member.jerseyNumber} - td.position #{event_lineup_entries_offense[i].label} - - } else { - tr - th.sequence.label - td.player-name - td.jersey-number - td.position - tr - td - td - td - td - - } - #page-2.sheet.gamecard - section#back-cover - section#front-cover - div.grid-container - .section-header - .bar-right.homeaway #{event.gameType} - .event-title - | #{event.startDate.toLocaleDateString("en-us",{weekday: "long", day: "numeric",month: "short"})}, - | #{event.startDate.toLocaleTimeString("en-us",{hour: "numeric", minute: "2-digit"})} - br - | #{event.locationName} - div.team - |#{event.team.name} - div.opponent - |#{event.opponent.name} - section#lineup-card-dugout-empty.lineup-card - .grid-container - .section-header - .starting-lineup-table - table - thead - tr - th(colspan='4') Starting - tbody - each _ in Array(12) - tr - th.sequence.label - td.player-name - td.jersey-number - td.position - .substitution-table - table(style='width: 100%') - thead - tr - th Substitution - tbody - each _ in Array(11) - tr - td.substitution - tr - td.substitution - section#lineup-card-exchange-empty.lineup-card - .grid-container - .section-header - .starting-lineup-table - table.starting-lineup-table - thead - tr - th - th.player-name Name - th.jersey-number Num - th.position Pos - tbody - each _ in Array(12) - tr - th.sequence.label - td.player-name - td.jersey-number - td.position diff --git a/src/views/event-lineup.pug b/src/views/event-lineup.pug deleted file mode 100644 index 173c7f7..0000000 --- a/src/views/event-lineup.pug +++ /dev/null @@ -1,64 +0,0 @@ -extends base.pug -include mixin-lineup-slot.pug -include mixin-availability-progress-bar.pug - -block append styles - link(rel='stylesheet' href='/css/lineup.css') - -block pre-scripts - script(type='text/javascript', src='/js/Sortable.js') - -block content - div(id=`event-lineup-${event.id}`).event-lineup - .Panel - .panel-header - .Panel-title #{event.formattedTitle} - .Panel-body - .Panel-row - p.text-muted.mb-2 #{event.startDate} - p #{event.locationName} - +availability-progress-bar(availabilitySummary, team) - - .Panel - .Panel-body - .Panel-row.Panel-title.u-padXs - i.bi.bi-clipboard-check.me-1 - span Starting Lineup - .Panel-row.Grid.Grid--fit.fw-bold.text-center.u-padXs - each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"] - .Grid-cell.position-status #{pos} - .slot-set - each lineup_entry, i in event_lineup_entries - if !lineup_entry.label.includes("PO") - +lineup-slot(lineup_entry, i) - .Panel - .Panel-body - .Panel-row.Panel-title.u-padXs - i.bi.bi-clipboard-minus.me-1 - span Starting Lineup (Position Only) - .slot-set - each lineup_entry, i in event_lineup_entries - if lineup_entry.label.includes("[PO]") - +lineup-slot(lineup_entry, i) - .Panel - .Panel-body - .Panel-row.Panel-title.u-padXs - i.bi.bi-clipboard.me-1 - span Bench - .slot-set - each availability, i in availabilities.filter((a)=>a.eventId==event_id && !context.event_lineup_entries.map((lue)=>lue.memberId).includes(a.memberId) && !a.member.isNonPlayer && a.statusCode!=0 && a.statusCode!==null) - +lineup-slot(availability, i) - - .Panel - .Panel-body - .Panel-row.Panel-title.u-padXs - i.bi.bi-clipboard-x.me-1 - span Out - .slot-set - each availability, i in availabilities.filter((a)=>a.eventId==event_id && !context.event_lineup_entries.map((lue)=>lue.memberId).includes(a.memberId) && !a.member.isNonPlayer && (a.statusCode==0 || a.statusCode===null)) - +lineup-slot(availability, i) -block scripts - script - include lineup.js - script. - colorPositions(); diff --git a/src/views/event-lineupcard.pug b/src/views/event-lineupcard.pug deleted file mode 100644 index 9f98da7..0000000 --- a/src/views/event-lineupcard.pug +++ /dev/null @@ -1,409 +0,0 @@ -html - head - meta(charset='utf-8') - title #{event.formattedTitle} - link(rel='stylesheet' href='/css/gamecard.css') - - body(class="B5") - input(name="team_id", type="hidden" value=`${team_id}`) - input(name="event_id", type="hidden" value=`${event_id}`) - #page-1.sheet.gamecard - section#todays-game - .grid-container - .section-header - #todays-game-header.bar-left.event-title - | #{event.formattedTitle} - | #{event.startDate.toLocaleDateString("en-us",{weekday: "short", day: "numeric",month: "short"})} - | #{event.startDate.toLocaleTimeString("en-us",{hour: "numeric", minute: "2-digit"})} - .bar-right.homeaway #{event.gameType} - .bar-span.gametitle - #offense-pane.left - table#starting-lineup-offense - tbody - each _, i in Array(11) - - if (typeof(event_lineup_entries_offense[i]) !== 'undefined'){ - tr - th(rowspan='2') #{i+1} - td(id=`offense-slot-${i}-name` class="player-name") #{event_lineup_entries_offense[i].member.lastName} - td(id=`offense-slot-${i}-jersey-number` class="jersey-number") #{event_lineup_entries_offense[i].member.jerseyNumber} - td(id=`offense-slot-${i}-position` class="position") #{event_lineup_entries_offense[i].label} - tr.substitute - td - td - td - - } else { - tr - th(rowspan='2') - td(id=`offense-slot-${i}-name` class="player-name") - td(id=`offense-slot-${i}-jersey-number` class="jersey-number") - td(id=`offense-slot-${i}-position` class="position") - tr.substitute - td - td - td - - } - - #defense-pane.right - .container - .field-container - image(src='/media/baseball-diamond.svg') - .row(style='justify-content: center') - .defense-slot-set - table - tr - th.position CF - td#defense-slot-CF-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("CF")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .row(style='justify-content: space-between') - .defense-slot-set - table - tr - th.position LF - td#defense-slot-LF-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("LF")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .defense-slot-set - table - tr - th.position RF - td#defense-slot-RF-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("RF")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .row(style='justify-content: space-around') - .defense-slot-set - table - tr - th.position SS - td#defense-slot-SS-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("SS")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .defense-slot-set - table - tr - th.position 2B - td#defense-slot-2B-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("2B")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .row(style='justify-content: space-between') - .defense-slot-set - table - tr - th.position 3B - td#defense-slot-3B-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("3B")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .defense-slot-set - table - tr - th.position 1B - td#defense-slot-1B-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("1B")) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .row(style='justify-content: center') - .defense-slot-set - table - tr - th.position C - td#defense-slot-C-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("C") && !lue.label.startsWith("CF") ) || {"member":{}}).member.lastName} - tr - td(colspan='2') - tr - td(colspan='2') - .pitching-container - .defense-slot-set - table - tr - th.position P - td#defense-slot-P-name.player-name - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("P")) || {"member":{}}).member.lastName} - td.jersey-number - | #{(event_lineup_entries.find((lue)=>lue.label.startsWith("P")) || {"member":{}}).member.jerseyNumber} - td.position - tr - th.position RP - td#defense-slot-RP1-name.player-name - td - td - tr - th.position RP - td#defense-slot-RP2-name.player-name - td - td - .footer - table - tr - th Notes - td - tr - td - tr - td - section#roster-and-history - div - table - thead - tr - th#today-availability(colspan='3') Available ( - | #{availabilitySummaries.find((e)=>e.id==event_id).playerGoingCount}| - | #{availabilitySummaries.find((e)=>e.id==event_id).playerMaybeCount} - | ) - th.player-stats - span.decimal-point . - | AVG - span.delimiter / - span.decimal-point . - | OBP - span.delimiter / - span.decimal-point . - | SLG - span.delimiter : - | PA - th.position-capability.pitcher P - th.position-capability.catcher C - th.position-capability.infield I - th.position-capability.outfield O - each event_future, i in events_future - th(id=`avail-header-today-plus-${i+1}` class="availability future") - .rotate #{event_future.startDate.toLocaleDateString("en-us", {weekday: "short"})} - each event_past, i in events_past - th(id=`avail-header-today-minus-${i+1}` class="availability past") - .rotate #{event_past.startDate.toLocaleDateString("en-us", {weekday: "short"})} - tbody - each row, index in availabilities.filter((e)=>e.event.id==event_id && !e.member.isNonPlayer) - tr(id=`roster-history-slot-${index+1}` class=``) - td(class=`is-present-checkbox available-status-code-${row.statusCode}`) - span ■ - td( - class=` - jersey-number - border-left - available-status-code-${row.statusCode} - ${event_lineup_entries.find((lue)=>lue.member.id==row.member.id) !== undefined ? "starting" : ""} - `) - | #{row.member.jerseyNumber} - td( - class=` - player-name - available-status-code-${row.statusCode} - ${event_lineup_entries.find((lue)=>lue.member.id==row.member.id) !== undefined ? "starting" : ""} - `) - | #{row.member.lastName} - td.player-stats.border-left.border-right - span.decimal-point . - span.avg 000 - span.delimiter / - span.decimal-point . - span.obp 000 - span.delimiter / - span.decimal-point . - span.slg 000 - span.delimiter : - span.pa 00 - td.position-capability.pitcher #{row.member.position.includes("P") ? "\u2713" : ""} - td.position-capability.catcher #{row.member.position.includes("C") ? "\u2713" : ""} - td.position-capability.infield #{row.member.position.includes("IF") ? "\u2713" : ""} - td.position-capability.outfield #{row.member.position.includes("OF") ? "\u2713" : ""} - - var future_availability - - var future_lineupEntry - each future_event, i in events_future - - future_availability = availabilities.find((el)=>el.eventId ==future_event.id && el.memberId==row.member.id) - - future_lineupEntry = all_lineup_entries.find((el)=>el.eventId ==future_event.id && el.member.id==row.member.id) - - console.log(future_availability) - td(id=`avail-${row.member}-today-plus-${i+1}` class=` - row - future - availability - available-status-code-${future_availability.statusCode} - `) - if future_lineupEntry - |#{future_lineupEntry.label.slice(0,2)} - else - |#{future_availability.status[0]} - - var past_availability - - var past_lineupEntry - each past_event, i in events_past - - past_availability = availabilities.find((el)=>el.eventId==past_event.id && el.memberId==row.memberId) - - past_lineupEntry = all_lineup_entries.find((el)=>el.event.id==past_event.id && el.member.id==row.member.id) - td(id=`avail-${row.member}-today-minus-${i+1}` class=` - row - past - availability - available-status-code-${past_availability.statusCode} - ${past_lineupEntry ? "started" : ""} - `) - if past_lineupEntry - |#{past_lineupEntry.label.slice(0,2)} - else - |#{past_availability.status[0]} - tfoot - tr - th(colspan='3') - th - th(colspan='4') - each event_future, i in events_future - th(class=`availability future`) - .rotate #{availabilitySummaries.find((el)=>el.eventId == event_future.id).playerGoingCount} - th.today-minus-1 - .rotate - th.today-minus-2 - .rotate - th.today-minus-3 - .rotate - th.today-minus-4 - .rotate - section#lineup-card-dugout.lineup-card - .grid-container - .section-header - .bar-left.event-title - | #{event.formattedTitle} - .bar-right.homeaway #{event.gameType} - .starting-lineup-table - table - thead - tr - th(colspan='4') Starting - tbody - each i in [0,1,2,3,4,5,6,7,8,9,10] - - if (typeof(event_lineup_entries_offense[i]) !== 'undefined'){ - tr - th.sequence.label #{event_lineup_entries_offense[i].sequence +1} - td.player-name #{event_lineup_entries_offense[i].member.lastName} - td.jersey-number #{event_lineup_entries_offense[i].member.jerseyNumber} - td.position #{event_lineup_entries_offense[i].label} - - } else { - tr - th.sequence.label - td.player-name - td.jersey-number - td.position - tr - td - td - td - td - - } - - .substitution-table - table(style='width: 100%') - thead - tr - th Substitution - tbody - each i in [0,1,2,3,4,5,6,7,8,9,10,11] - tr - td.substitution - tr - td.substitution - section#lineup-card-exchange.lineup-card - .grid-container - .section-header.event-title #{event.formattedTitleForMultiTeam} - .starting-lineup-table - table.starting-lineup-table - thead - tr - th - th.player-name Name - th.jersey-number Num - th.position Pos - tbody - each _,i in Array(10) - - if (typeof(event_lineup_entries_offense[i]) !== 'undefined'){ - tr - th.sequence.label #{event_lineup_entries_offense[i].sequence+1} - td.player-name #{event_lineup_entries_offense[i].member.lastName} - td.jersey-number #{event_lineup_entries_offense[i].member.jerseyNumber} - td.position #{event_lineup_entries_offense[i].label} - - } else { - tr - th.sequence.label - td.player-name - td.jersey-number - td.position - tr - td - td - td - td - - } - #page-2.sheet.gamecard - section#back-cover - section#front-cover - div.grid-container - .section-header - .bar-right.homeaway #{event.gameType} - .event-title - | #{event.startDate.toLocaleDateString("en-us",{weekday: "long", day: "numeric",month: "short"})}, - | #{event.startDate.toLocaleTimeString("en-us",{hour: "numeric", minute: "2-digit"})} - br - | #{event.locationName} - div.team - |#{event.team.name} - div.opponent - |#{event.opponent.name} - section#lineup-card-dugout-empty.lineup-card - .grid-container - .section-header - .starting-lineup-table - table - thead - tr - th(colspan='4') Starting - tbody - each _ in Array(12) - tr - th.sequence.label - td.player-name - td.jersey-number - td.position - .substitution-table - table(style='width: 100%') - thead - tr - th Substitution - tbody - each _ in Array(11) - tr - td.substitution - tr - td.substitution - section#lineup-card-exchange-empty.lineup-card - .grid-container - .section-header - .starting-lineup-table - table.starting-lineup-table - thead - tr - th - th.player-name Name - th.jersey-number Num - th.position Pos - tbody - each _ in Array(12) - tr - th.sequence.label - td.player-name - td.jersey-number - td.position diff --git a/src/views/event.pug b/src/views/event.pug deleted file mode 100644 index e2bc168..0000000 --- a/src/views/event.pug +++ /dev/null @@ -1,27 +0,0 @@ -extends base.pug -include mixin-availability-progress-bar.pug - -block content - .Panel - .Panel-header - h3.Panel-title #{event.formattedTitle} - .Panel-body - .Panel-row - h6.card-text.text-muted.mb-2 - |#{event.startDate} - br - |#{event.locationName} - .Panel-row - h4 Availability - +availability-progress-bar(availabilitySummary, team) - .Panel-row - div.d-flex - a(class="Button m-auto" href=`/${team_id}/event/${event.id}/lineup`) - i(class="bi bi-clipboard") - span.mx-1 Lineup - a(class="Button m-auto" href=`/${team_id}/event/${event.id}/lineup_card`) - i(class="bi bi-book") - span.mx-1 Game Card - a(class="Button m-auto" href=`https://go.teamsnap.com/${team_id}/schedule/view_game/${event.id}`) - i(class="bi bi-asterisk") - span.mx-1 TeamSnap \ No newline at end of file diff --git a/src/views/event/list.hbs b/src/views/event/list.hbs new file mode 100644 index 0000000..a8ac124 --- /dev/null +++ b/src/views/event/list.hbs @@ -0,0 +1,120 @@ +

+ Schedule +

+
+
+
+
+

+ Title +

+
+
+

+ Date +

+
+
+

+ Time +

+
+
+

+ When/Where +

+
+
+

+ Location +

+
+
+

+ ... +

+
+
+ {{#each events as |event|}} +
+ +
+ {{dateFormat event.startDate "ddd MMM D"}} +
+
+ {{dateFormat event.startDate "h:mm A"}} +
+
+ {{dateFormat this.startDate "ddd MMM D, h:mm A"}} {{ + event.locationName + }} +
+
+ {{event.locationName}} +
+ +
+ {{/each}} + {{!-- + + a.Button href=url_for(event_path :team_id=>team.id, :event_id=>event.id) + =embedded_svg "teamsnap-ui/assets/icons/schedule svg", class:"Icon" + | Details + .Grid-cell.u-sizeFit.u-spaceXs + a.Button href=url_for(event_lineup_path :team_id => team.id, :event_id => event.id) + =embedded_svg "bootstrap-icons/clipboard svg", class:"Icon" + | Lineup + .Grid-cell.u-sizeFit.u-spaceXs + a.Button href=url_for(event_lineup_card_path :team_id => team.id, :event_id => event.id) + =embedded_svg "bootstrap-icons/book svg", class:"Icon" + | Card + .Grid-cell.u-sizeFit.u-spaceXs + a.Button href="https://go teamsnap com/#{team id}/schedule/view_game/#{event id}" + =embedded_svg "bootstrap-icons/asterisk svg", class:"Icon" + | TeamSnap }} --}} +
+
\ No newline at end of file diff --git a/src/views/event/partials/availability_bar.hbs b/src/views/event/partials/availability_bar.hbs new file mode 100644 index 0000000..e859085 --- /dev/null +++ b/src/views/event/partials/availability_bar.hbs @@ -0,0 +1,16 @@ +
+ {{#if availabilitySummary}} +
+ {{availabilitySummary.playerGoingCount}} +
+
+ {{availabilitySummary.playerMaybeCount}} +
+
+ {{availabilitySummary.playerNotGoingCount}} +
+
+ {{availabilitySummary.playerUnknownCount}} +
+ {{/if}} +
diff --git a/src/views/event/partials/event_panel.hbs b/src/views/event/partials/event_panel.hbs new file mode 100644 index 0000000..c2fbc13 --- /dev/null +++ b/src/views/event/partials/event_panel.hbs @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/src/views/event/show.hbs b/src/views/event/show.hbs new file mode 100644 index 0000000..bd043f1 --- /dev/null +++ b/src/views/event/show.hbs @@ -0,0 +1 @@ +{{> event_panel event=event}} \ No newline at end of file diff --git a/src/views/eventlineup/edit.hbs b/src/views/eventlineup/edit.hbs new file mode 100644 index 0000000..b1a72d2 --- /dev/null +++ b/src/views/eventlineup/edit.hbs @@ -0,0 +1,120 @@ +{{>emailmodal}} +
+
+ + {{!-- --}} + +
+
+

{{event.formattedTitle}}

+
+ + +
+
+
+
+
{{dateFormat event.startDate "ddd, MMM D h:mm A" }}
+
{{event.locationName}}
+
+
+ +
+
+
+
+
+
+ {{{embeddedSvgFromPath "/bootstrap-icons/clipboard-check.svg"}}} + Starting Lineup +
+
+ {{#each (positions)}} +
{{this}}
+ {{/each}} +
+
+ {{#each members}} + {{#if (isInStartingLineup this)}} + {{> slot member=this}} + {{/if}} + {{/each}} +
+
+
+
+
+ {{{embeddedSvgFromPath "/bootstrap-icons/clipboard-check.svg"}}} + Position Only +
+
+ {{#each members}} + {{#if (isInPositionOnly this)}} + {{> slot member=this}} + {{/if}} + {{/each}} +
+
+
+
+ {{{embeddedSvgFromPath "/bootstrap-icons/clipboard-minus.svg"}}} + Bench +
+
+ {{#each members}} + {{#if (isInBench this)}} + {{> slot member=this event=../event}} + {{/if}} + {{/each}} +
+
+
+
+ {{{embeddedSvgFromPath "/bootstrap-icons/clipboard-x.svg"}}}Out +
+ + +
+
+
+ {{#each members}} + {{#if (isInOut this)}} + {{> slot member=this}} + {{/if}} + {{/each}} +
+
+
+
+ + + + diff --git a/src/views/eventlineup/email.hbs b/src/views/eventlineup/email.hbs new file mode 100644 index 0000000..9d245b5 --- /dev/null +++ b/src/views/eventlineup/email.hbs @@ -0,0 +1,90 @@ +
+ + + + + + + + {{#each members}} + {{#if (isInStartingLineup this)}} + + + + + + {{/if}} + {{/each}} + + + + {{#each members}} + {{#if (isInPositionOnly this)}} + + + + + + {{/if}} + {{/each}} + + + + {{#each members}} + {{#if (isInBench this)}} + + + + + + {{/if}} + {{/each}} + + + + {{#each members}} + {{#if (isInOut this)}} + + + + + + {{/if}} + {{/each}} + {{!-- + + + + + + +
+ STARTING LINEUP +
+ {{plus1 this.benchcoach.eventLineupEntry.sequence}} + {{this.lastName}}, {{this.firstName}} – #{{this.jerseyNumber}}{{this.benchcoach.eventLineupEntry.label}}
Starting (Pos. Only)
{{this.lastName}}, {{this.firstName}} – #{{this.jerseyNumber}}{{this.benchcoach.eventLineupEntry.label}}
Subs
+ {{availabilityStatusShort this.benchcoach.availability}} + {{this.lastName}}, {{this.firstName}} – #{{this.jerseyNumber}}{{this.benchcoach.eventLineupEntry.label}}
Out
+ {{availabilityStatusShort this.benchcoach.availability}} + {{this.lastName}}, {{this.firstName}} – #{{this.jerseyNumber}}{{this.benchcoach.eventLineupEntry.label}}
.title-cell colSpan=3 Subs + - for entry in event_lineup_entries.select{|e| e[:label].blank? and !(e[:availability_status_code] == "0" or e[:availability_status_code]== "")} +
.sequence-cell + - if entry[:availability_status_code] == "1" + | YES + - if entry[:availability_status_code] == "2" + | MAY + .name-cell + | #{entry[:member][:last_name]}, #{entry[:member][:first_name]} - ##{entry[:member][:jersey_number]} + +
.title-cell.out colSpan=3 Out + - for entry in event_lineup_entries.select{|e| e[:label].blank? and (e[:availability_status_code] == "0" or e[:availability_status_code]== "")} +
.sequence-cell + - if entry[:availability_status_code] == "0" + | NO + - if entry[:availability_status_code] == "" + | UNK + .name-cell + | #{entry[:member][:last_name]}, #{entry[:member][:first_name]} - ##{entry[:member][:jersey_number]} + --}} +
+
\ No newline at end of file diff --git a/src/views/eventlineup/partials/emailmodal.hbs b/src/views/eventlineup/partials/emailmodal.hbs new file mode 100644 index 0000000..87db97a --- /dev/null +++ b/src/views/eventlineup/partials/emailmodal.hbs @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/src/views/eventlineup/partials/slot.hbs b/src/views/eventlineup/partials/slot.hbs new file mode 100644 index 0000000..23bdcc7 --- /dev/null +++ b/src/views/eventlineup/partials/slot.hbs @@ -0,0 +1,57 @@ +
+ + + + + + + + + + +
+
+
+
+
+
+
+ {{#if member.benchcoach.availability}}{{{avail_status_code_icon member.benchcoach.availability.statusCode}}}{{/if}} + + {{member.lastName}} + + + , {{member.firstName}} + + + #{{member.jerseyNumber}} + +
+
+
+
+
+ +
+
+
+
+ {{{embeddedSvgFromPath "/bootstrap-icons/grip-vertical.svg"}}} +
+
+
+
\ No newline at end of file diff --git a/src/views/eventlineup/show.hbs b/src/views/eventlineup/show.hbs new file mode 100644 index 0000000..e69de29 diff --git a/src/views/events.pug b/src/views/events.pug deleted file mode 100644 index 4e28c43..0000000 --- a/src/views/events.pug +++ /dev/null @@ -1,21 +0,0 @@ -extends base.pug -include mixin-availability-progress-bar.pug - -block content - .Panel - .Panel-header - .Panel-title Schedule - .Panel-body - each event in events - - var availabilitySummary = availabilitySummaries.find((a)=>a.eventId==event.id) - a(class="event list-group-item" href=`/${team_id}/event/${event.id}`).Panel-row--withCells - .Panel-cell - h4 #{event.formattedTitle} - +availability-progress-bar(availabilitySummary, team) - .Panel-cell - |#{event.startDate.toLocaleDateString("en-us",{weekday: "short", day: "numeric",month: "short"})} - .Panel-cell - |#{event.startDate.toLocaleTimeString("en-us",{hour: "numeric", minute: "2-digit"})} - .Panel-cell - |#{event.locationName} - diff --git a/src/views/eventsheet/sheet.hbs b/src/views/eventsheet/sheet.hbs new file mode 100644 index 0000000..889b6be --- /dev/null +++ b/src/views/eventsheet/sheet.hbs @@ -0,0 +1,352 @@ + + + +
+
+
+
+ {{event.formattedTitle}} – {{dateFormat event.startDate "ddd, MMM D h:mm A" }} +
+
+ {{event.game_type}} +
+
+
+
+ + +
+ {{!-- <% offensive_lineup_entries = by_member.select{|m,d| d[:event_lineup_entry] and d[:event_lineup_entry].label.exclude?("[PO]")}.sort_by{|m,d| d[:event_lineup_entry].sequence}.each_with_index do |(member, d), i| if i < 11%> --}} + {{#offenseLineup 11}} +
+ + + + + + + + + + + {{/offenseLineup}} + + +
{{this.member.lastName}}{{this.member.jerseyNumber}}{{positionLabelWithoutFlags this.label}}
+
+
+
+ + {{#defenseLineup}} + {{!-- <% for pos in ["CF", "LF", "RF", "SS", "2B", "3B", "1B", "C"] do (member, d) = by_member.find{|m,d| d[:event_lineup_entry] and d[:event_lineup_entry].label == pos}%> --}} +
+ + + + + + + + + + + + + + +
{{this.member.lastName}}
+
+ {{/defenseLineup}} +
+
+ +
+
+
+
+ + + {{!-- --}} + + + + + + + + + + + + {{!-- <% for timepoint, i in timeline.select{|tp| tp[:comparison_to_selected]>0}.sort{|tp| -tp[:comparison_to_selected]}.each_with_index do%> --}} + + {{#loopEvents upcoming_events}} + + {{/loopEvents}} + {{#loopEvents recent_events}} + + {{/loopEvents}} + + + + {{!-- <% by_member.select{|m,d| !m.is_non_player}.each_with_index do |(member, d), i|%> --}} + {{#rosterHistory}} + + + + + + + + + + {{#loopEvents ../upcoming_events}} + {{#timepointForMember ../this ../../timeline this}} + + {{/timepointForMember}} + {{/loopEvents}} + {{#loopEvents ../recent_events}} + {{#timepointForMember ../this ../../timeline this}} + + {{/timepointForMember}} + {{/loopEvents}} + + {{/rosterHistory}} + +
+ Available ({{availabilitySummary.playerGoingCount}}|{{availabilitySummary.playerMaybeCount}}) + + .AVG + / + .OBP + / + .SLG + :PA + PCIO
{{dateFormat this.startDate "ddd" }}
{{dateFormat this.startDate "ddd" }}
+ + + {{this.jerseyNumber}} + + {{this.lastName}} + + . + 000 + / + . + 000 + / + . + 000 + : + 00 + {{positionCapabilityFor this "P"}}{{positionCapabilityFor this "C"}}{{positionCapabilityFor this "IF"}}{{positionCapabilityFor this "OF"}} + {{this.value}} + + {{this.value}} +
+
+
+
+
+
{{event.formattedTitle}}
+
{{event.gameType}}
+
+
+ + + + + + + + + {{#offenseLineup 11}} + + + + + + + + {{/offenseLineup}} + {{#defenseLineup}} + + {{#if (isInPositionOnly this.member)}}{{#if (comparePositionWithFlags "P" this.eventLineupEntry)}} + + + + + + {{/if}}{{/if}} + + {{/defenseLineup}} + +
StartingSubstitution
{{this.member.lastName}}{{this.member.jerseyNumber}}{{this.label}}
PO{{this.member.lastName}}{{this.member.jerseyNumber}}{{positionLabelWithoutFlags this.eventLineupEntry.label}}
+
+
+
+
+
{{event.formattedTitle}}
+
{{event.gameType}}
+
+
+ + + + + + + + + {{#offenseLineup 11}} + + + + + + + + {{/offenseLineup}} + {{#defenseLineup}} + + {{#if (isInPositionOnly this.member)}}{{#if (comparePositionWithFlags "P" this.eventLineupEntry)}} + + + + + + {{/if}}{{/if}} + + {{/defenseLineup}} + +
StartingSubstitution
{{this.member.lastName}}{{this.member.jerseyNumber}}{{this.label}}
PO{{this.member.lastName}}{{this.member.jerseyNumber}}{{positionLabelWithoutFlags this.eventLineupEntry.label}}
+
+
+
+
+
+
+
+
+
+ {{firstLetter event.gameType}} +
+
+ {{dateFormat event.startDate "ddd, MMM D h:mm A" }} + {{event.locationName}} +
+
+ Game # + XX +
+
+
+
+
+
+ +
+ {{team.name}} +
+
+ {{# if event.opponentName}} +
+
+ vs +
+
+
+
+ {{event.opponentName}} +
+ {{!-- <%= ::Temple::Utils.escape_html((image_tag opponent_logos[event.opponent.id].medium_url)) %> --}} +
+ {{/if}} +
+
+
+
+ + + + + + + + + {{!-- <% for i in (0...12) do%> --}} + {{#repeat 12}} + + + + + + + + {{/repeat}} + {{!-- <% end %> --}} + +
+ Starting + + Substitution +
+ + + + +
+
+
+
+
+ + + + + + + + + {{#repeat 12}} + + + + + + + + {{/repeat}} + +
+ Starting + + Substitution +
+ + + + +
+
+
+ +
+ diff --git a/src/views/home.pug b/src/views/home.pug deleted file mode 100644 index 5cca666..0000000 --- a/src/views/home.pug +++ /dev/null @@ -1,24 +0,0 @@ -extends base.pug - -block content - .row - .text-center.my-2 - .row - h1 - img.mx-auto(src="media/benchcoach.svg" style="width: 2.5em;") - .row - h1 - strong - | Welcome to - span.text-nowrap BenchCoach - .text-center.lead.fst-italic.fw-light - | An assistant coach for TeamSnap - .row - .col.text-center - if req.user - ul.list-group - each team in teams - a(class='team list-group-item' href=`/${team.id}/home`) #{team.name} [#{team.seasonName}] - else - a.btn.btn-outline-primary(href="login") - | Login \ No newline at end of file diff --git a/src/views/layouts/main.hbs b/src/views/layouts/main.hbs new file mode 100644 index 0000000..c8511d5 --- /dev/null +++ b/src/views/layouts/main.hbs @@ -0,0 +1,34 @@ + + + + + + + + {{#if style}}{{/if}} + {{#if title}}{{title}}{{else}}BenchCoach{{/if}} + + + + +
+ {{> navbar }} + {{{_sections.header}}} +
+
+
+ {{{ body }}} +
+
+ + diff --git a/src/views/base.pug b/src/views/layouts/main.pug similarity index 80% rename from src/views/base.pug rename to src/views/layouts/main.pug index caae5ba..0d64ce0 100644 --- a/src/views/base.pug +++ b/src/views/layouts/main.pug @@ -14,10 +14,7 @@ head body.bg-light block navbar - .benchcoach-nav.u-flex.u-flexJustifyBetween.u-flexAlignItemsCenter - .u-flex.u-flexAlignItemsCenter - img(src='/media/benchcoach.svg' alt='TeamSnap Logo' width='30' height='30') - h3.u-padLeft.u-colorWhite.u-noMarginBottom BenchCoach + include navbar.pug .u-spaceSm.u-md-spaceLg block content diff --git a/src/views/lineup.js b/src/views/lineup.js deleted file mode 100644 index e063646..0000000 --- a/src/views/lineup.js +++ /dev/null @@ -1,356 +0,0 @@ -/* Project specific Javascript goes here. */ -function onPositionSelectChange(elem) { - elem.querySelectorAll("option").forEach((option) => { - if (option.innerText == elem.value) { - option.setAttribute("selected", "selected"); - } else { - option.removeAttribute("selected"); - } - }); - colorPositions(); -} - -function colorPositions() { - console.log("Coloring Positions"); - for (bcLineup of document.getElementsByClassName("event-lineup")) { - selected_lineup_positions = Array.from( - bcLineup.querySelectorAll( - ".Panel-row .SelectBox.position-selection option[selected='selected']" - ) - ).map((el) => el.value); - console.log(selected_lineup_positions); - for (position_status of bcLineup.querySelectorAll(".position-status")) { - for (class_name of ["text-danger", "text-warning", "text-success"]) { - if (position_status.classList.contains(class_name)) { - position_status.classList.remove(class_name); - } - } - - occurrences = selected_lineup_positions.filter( - (s) => s == position_status.innerText - ).length; - - if (occurrences == 1) { - position_status.classList.add("text-success"); - } else if (occurrences > 1) { - position_status.classList.add("text-warning"); - } else { - position_status.classList.add("text-danger"); - } - } - } -} - -function refresh_lineup_order(itemEl) { - let bcLineup = itemEl.closest(".benchcoach-lineup"); - var player_rows = []; - for (tbody of bcLineup.querySelectorAll( - "[class*='tbody-benchcoach-starting']" - )) { - for (row of tbody.rows) { - player_rows.push(row); - } - } - - for (let i = 0; i < player_rows.length; i++) { - var player_order = player_rows[i].querySelector('[id^="sequence"]'); - var form_element_order = player_rows[i].querySelector('[id$="sequence"]'); - player_order.innerText = parseInt(player_rows[i].dataset.order); - player_rows[i].dataset.order = i; - form_element_order.value = i; - player_order.innerHTML = i + 1; - } - var player_rows = bcLineup.getElementsByClassName("tbody-benchcoach-bench")[0] - .rows; - for (let i = 0; i < player_rows.length; i++) { - var player_order = player_rows[i].querySelector('[id^="sequence"]'); - var form_element_order = player_rows[i].querySelector('[id$="sequence"]'); - player_rows[i].dataset.order = null; - form_element_order.value = null; - player_order.innerHTML = null; - } -} - -function sendToClipboard(itemEl) { - let bcLineup = itemEl.closest(".benchcoach-lineup"); - player_rows = bcLineup.querySelectorAll("[data-position=P]"); - lineup_export = []; - if (player_rows.length > 0) { - lineup_export.push(player_rows[0].dataset.playerName); - lineup_export.push("", ""); - } else { - lineup_export.push("", "", ""); - } - - lineup_export.push(""); - for (position of ["C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "DH"]) { - var player_rows = bcLineup.querySelectorAll( - `[data-position=${CSS.escape(position)}]` - ); - if (player_rows.length > 0) { - lineup_export.push(player_rows[0].dataset.playerName); - } else { - lineup_export.push(""); - } - } - for (position of ["EH"]) { - var player_rows = bcLineup.querySelectorAll( - `[data-position=${CSS.escape(position)}]` - ); - for (var i = 0; i < 2; i++) { - if (i < player_rows.length) { - lineup_export.push(player_rows[i].dataset.playerName); - } else { - lineup_export.push(""); - } - } - } - - for (position of ["DR"]) { - let player_rows = bcLineup.querySelectorAll( - `[data-position=${CSS.escape(position)}]` - ); - if (player_rows.length > 0) { - lineup_export.push(player_rows[0].dataset.playerName); - } else { - lineup_export.push(""); - } - } - - lineup_export.push(""); - lineup_export.push("", ""); - lineup_export.push(""); - - for (var i = 0; i < 11; i++) { - let player_rows = bcLineup - .querySelector(".table-benchcoach-startinglineup") - .querySelectorAll(`[data-order=${CSS.escape(i)}]`); - if (player_rows.length > 0) { - lineup_export.push(player_rows[0].dataset.playerName); - } else { - lineup_export.push(""); - } - } - - console.dir(lineup_export); - var textArea = document.createElement("textarea"); - textArea.value = lineup_export.join("\n"); - - // Avoid scrolling to bottom - textArea.style.top = "0"; - textArea.style.left = "0"; - textArea.style.position = "fixed"; - - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - - try { - var successful = document.execCommand("copy"); - var msg = successful ? "successful" : "unsuccessful"; - console.log("Copying text command was " + msg); - } catch (err) { - console.error("Oops, unable to copy", err); - } - - document.body.removeChild(textArea); -} - -for (bcLineup of document.querySelectorAll(".Panel:has(.lineup-slot)")) { - var startinglineup = new Sortable.create( - bcLineup.querySelector(".slot-set"), - { - animation: 150, - handle: ".drag-handle", - ghostClass: "ghost", - group: { - name: bcLineup.id, - put: [bcLineup.id], - pull: [bcLineup.id], - }, - onAdd: function (/**Event*/ evt) { - // Add to Lineup - var itemEl = evt.item; // dragged HTMLElement - var player_order = itemEl.querySelector('[id^="sequence-member"]'); - var player_available = itemEl.querySelector( - '[class^="member-availability-status"]' - ); - refresh_lineup_order(itemEl); - if (player_order.classList.contains("d-none")) { - player_order.classList.remove("d-none"); - } - // player_available.classList.add('d-none') - }, - onUpdate: function (/**Event*/ evt) { - console.log("update to lineup"); - var itemEl = evt.item; // dragged HTMLElement - refresh_lineup_order(itemEl); - }, - } - ); -} - -function copyEmailTable(itemEl, subject, recipients) { - // Create container for the HTML - // [1] - let bcLineup = itemEl.closest(".benchcoach-lineup"); - var container = document.createElement("div"); - var tbl = document.createElement("table"); - - let thead = tbl.createTHead(); - let thead_row = thead.insertRow(); - let thead_row_cell = thead_row.insertCell(); - thead_row_cell.appendChild( - document - .createElement("h3") - .appendChild(document.createTextNode("STARTING LINEUP")) - ); - thead_row_cell.colSpan = 3; - thead_row_cell.classList.add("title-cell"); - var tbody = tbl.createTBody(); - for (row of bcLineup.querySelector(".table-benchcoach-startinglineup").rows) { - let tr = tbody.insertRow(); - cell = tr.insertCell(); - cell.classList.add("sequence-cell"); - cell.appendChild(document.createTextNode(parseInt(row.dataset.order) + 1)); - cell = tr.insertCell(); - cell.appendChild(document.createTextNode(row.dataset.playerName)); - cell.classList.add("name-cell"); - tr.insertCell().appendChild(document.createTextNode(row.dataset.position)); - } - - if ( - bcLineup.querySelector(".table-benchcoach-startingpositionalonly").rows - .length > 0 - ) { - var tr = tbody.insertRow(); - cell = tr.insertCell(); - cell.colSpan = 3; - cell.appendChild(document.createTextNode("STARTING (POS. ONLY)")); - cell.classList.add("title-cell"); - - for (row of bcLineup.querySelector( - ".table-benchcoach-startingpositionalonly" - ).rows) { - var tr = tbody.insertRow(); - cell = tr.insertCell(); - cell.classList.add("sequence-cell"); - cell.appendChild(document.createTextNode("")); - cell = tr.insertCell(); - cell.appendChild(document.createTextNode(row.dataset.playerName)); - cell.classList.add("name-cell"); - tr.insertCell().appendChild( - document.createTextNode(row.dataset.position) - ); - } - } - - if (bcLineup.querySelector(".table-benchcoach-bench").rows.length > 0) { - var tr = tbody.insertRow(); - cell = tr.insertCell(); - cell.colSpan = 3; - cell.appendChild(document.createTextNode("SUBS")); - cell.classList.add("title-cell"); - - for (row of bcLineup.querySelector(".table-benchcoach-bench").rows) { - var tr = tbody.insertRow(); - cell = tr.insertCell(); - cell.classList.add("sequence-cell"); - availability_status = { - None: "UNK", - 0: "NO", - 2: "MAY", - 1: "YES", - }[row.dataset.availabilityStatuscode]; - cell.appendChild(document.createTextNode(availability_status)); - cell = tr.insertCell(); - cell.appendChild(document.createTextNode(row.dataset.playerName)); - cell.classList.add("name-cell"); - tr.insertCell().appendChild(document.createTextNode("")); - } - } - - if (bcLineup.querySelector(".table-benchcoach-out").rows.length > 0) { - var tr = tbody.insertRow(); - cell = tr.insertCell(); - cell.colSpan = 3; - cell.appendChild(document.createTextNode("OUT")); - cell.classList.add("title-cell"); - - for (row of bcLineup.querySelector(".table-benchcoach-out").rows) { - var tr = tbody.insertRow(); - cell = tr.insertCell(); - cell.classList.add("sequence-cell"); - availability_status = { - None: "UNK", - 0: "NO", - 1: "MAY", - 2: "YES", - }[row.dataset.availabilityStatuscode]; - cell.appendChild(document.createTextNode(availability_status)); - tr.insertCell().appendChild( - document.createTextNode(row.dataset.playerName) - ); - tr.insertCell().appendChild(document.createTextNode("")); - } - } - - container.appendChild(tbl); - for (cell of container.getElementsByClassName("title-cell")) { - cell.setAttribute( - "style", - "font-weight:bold;background-color:#323669;color:#fff;padding:2px 5px;" - ); - } - - for (cell of container.getElementsByClassName("sequence-cell")) { - cell.setAttribute("style", "font-weight:bold;padding:2px 5px;"); - } - - for (cell of container.getElementsByClassName("name-cell")) { - cell.setAttribute("style", "width:200px;"); - } - - // Detect all style sheets of the page - var activeSheets = Array.prototype.slice - .call(document.styleSheets) - .filter(function (sheet) { - return !sheet.disabled; - }); - - // Mount the container to the DOM to make `contentWindow` available - // [3] - document.body.appendChild(container); - - // Copy to clipboard - // [4] - window.getSelection().removeAllRanges(); - - var range = document.createRange(); - range.selectNode(container); - window.getSelection().addRange(range); - - // [5.1] - document.execCommand("copy"); - - // [5.2] - for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true; - - // [5.3] - // document.execCommand('copy') - - // [5.4] - for (var i = 0; i < activeSheets.length; i++) - activeSheets[i].disabled = false; - - // Remove the container - // [6] - document.body.removeChild(container); - subject_encoded = encodeURIComponent(subject); - window.open( - "readdle-spark://compose?recipient=manager@chihounds.com&subject=" + - subject + - "&bcc=" + - recipients - ); -} diff --git a/src/views/login.hbs b/src/views/login.hbs new file mode 100644 index 0000000..8fb93cb --- /dev/null +++ b/src/views/login.hbs @@ -0,0 +1,27 @@ +
+ +
+

+ +

+

+ + Welcome to + BenchCoach + +

+
+ An assistant coach for TeamSnap +
+
+
\ No newline at end of file diff --git a/src/views/login.pug b/src/views/login.pug deleted file mode 100644 index 54f8f14..0000000 --- a/src/views/login.pug +++ /dev/null @@ -1,19 +0,0 @@ -extends base.pug - -block content - .Grid.Grid--fit.Grid--withGutter.u-max1200.u-flexExpandSides.u-xs-size5of6.u-sm-size2of3.u-md-sizeFull.u-padBottomMd.u-xs-padEndsLg.u-sm-padEndsXl - .Grid-cell.u-size5of12 - .Panel.u-padLg.u-spaceSidesAuto - h1.u-spaceSidesAuto.u-spaceBottomLg Sign in - a(class="Button Button--large Button--orange" href="/login/federated/teamsnap").u-spaceSidesAuto - img(src="/media/teamsnap_star.svg").icon.u-spaceRightSm - span TeamSnap - .Grid-cell.u-size7of12.u-textCenter - h1 - img(src="media/benchcoach.svg" style="width: 2.5em;") - h1 - strong - | Welcome to - span.text-nowrap BenchCoach - .lead.fst-italic.fw-light - | An assistant coach for TeamSnap \ No newline at end of file diff --git a/src/views/members.pug b/src/views/members.pug deleted file mode 100644 index adb42a7..0000000 --- a/src/views/members.pug +++ /dev/null @@ -1,14 +0,0 @@ -extends base.pug - -block content - .Panel - .Panel-header - .Panel-title Roster - .Panel-body - each member in members - a(class="" href=`/${team_id}/member/${member.id}`).Panel-row--withCells - .Panel-cell - |#{member.firstName} - .Panel-cell - |#{member.lastName} - diff --git a/src/views/mixin-availability-progress-bar.pug b/src/views/mixin-availability-progress-bar.pug deleted file mode 100644 index 841f01b..0000000 --- a/src/views/mixin-availability-progress-bar.pug +++ /dev/null @@ -1,15 +0,0 @@ -mixin availability-progress-bar(availabilitySummary, team) - .progress - div(class="progress-bar bg-success fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerGoingCount/team.playerMemberCount)*100).toString() + "%"}`) - |#{availabilitySummary.playerGoingCount} - div(class="progress-bar bg-info fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerMaybeCount/team.playerMemberCount)*100).toString() + "%"}`) - |#{availabilitySummary.playerMaybeCount} - div(class="progress-bar bg-danger fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerNotGoingCount/team.playerMemberCount)*100).toString() + "%"}`) - |#{availabilitySummary.playerNotGoingCount} - div(class="progress-bar text-secondary fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerUnknownCount/team.playerMemberCount)*100).toString() + "%"}; - background-color: var(--bs-gray-200)`) - |#{availabilitySummary.playerUnknownCount} \ No newline at end of file diff --git a/src/views/mixin-lineup-slot.pug b/src/views/mixin-lineup-slot.pug deleted file mode 100644 index 1f08309..0000000 --- a/src/views/mixin-lineup-slot.pug +++ /dev/null @@ -1,22 +0,0 @@ -mixin lineup-slot(item, index) - - - if (item.type == "eventLineupEntry") { - var availability_status_code = item.availabilityStatusCode - } else if (item.type == "availability") { - var availability_status_code = item.statusCode - } - .Panel-row.Panel-row--withCells.lineup-slot - .Panel-cell.Panel-cell--header.u-padXs.u-size1of12 - .u-flexAlignSelfCenter - |#{index+1} - div(class=`Panel-cell availability-status-code-${availability_status_code}`).u-padXs.u-size8of12 - span.lastname #{item.member.lastName} - span.jerseynumber ##{item.member.jerseyNumber} - .Panel-cell.u-padXs.u-size2of12 - .SelectBox.position-selection - select(onchange="onPositionSelectChange(this)").position-select-box.SelectBox-options - each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"] - option(selected=item.label==pos) #{pos} - .Panel-cell.u-padXs.u-flexAlignSelfCenter.u-size1of12 - .drag-handle - i.bi.bi-grip-vertical.text-secondary.drag-handle \ No newline at end of file diff --git a/src/views/opponent.pug b/src/views/opponent.pug deleted file mode 100644 index 2adddc7..0000000 --- a/src/views/opponent.pug +++ /dev/null @@ -1,39 +0,0 @@ -extends base -block content - .Panel - .Panel-header - .Panel-title #{opponent.name} - .Panel-body - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header ID - .panel-cell #{opponent.id} - Button(onclick=`navigator.clipboard.writeText("${opponent.id}");`).Button - i.bi.bi-clipboard.Icon - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header Contact Name - .panel-cell #{opponent.contactsName} - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header Contact Phone - .panel-cell #{opponent.contactsPhone} - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header Contact Email - .panel-cell #{opponent.contactsEmail} - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header Logo - .panel-cell - if opponent_logo - img(src=`${opponent_logo.mediumUrl}` width="64" height="64") - a.Button(target="_blank" rel="noopener noreferrer" href=`https://go.teamsnap.com/${team_id}/files/view/${opponent_logo.id}`).Button - i.bi.bi-asterisk.Icon - else - if team_media_group - a.Button(target="_blank" rel="noopener noreferrer" href=`https://go.teamsnap.com/${team_id}/files/list/${team_media_group.id}`) Upload - else - a.Button(target="_blank" rel="noopener noreferrer" href=`https://go.teamsnap.com/${team_id}/files/`) Upload - Button(onclick=`navigator.clipboard.writeText("opponent-logo-${opponent.id}.png");`).Button - i.bi.bi-clipboard.Icon - span Copy Filename - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header Notes - .panel-cell #{opponent.Notes} - diff --git a/src/views/opponent/list.hbs b/src/views/opponent/list.hbs new file mode 100644 index 0000000..13e7235 --- /dev/null +++ b/src/views/opponent/list.hbs @@ -0,0 +1,14 @@ +

+ {{title}} +

+
+
+ {{#each opponents}} + + {{/each}} +
+
\ No newline at end of file diff --git a/src/views/opponent/show.hbs b/src/views/opponent/show.hbs new file mode 100644 index 0000000..f16f99c --- /dev/null +++ b/src/views/opponent/show.hbs @@ -0,0 +1,79 @@ +
+
+
+ {{opponent.name}} +
+
+
+
+
+ ID +
+
+ {{opponent.id}} +
+
+
+
+ Contact Name +
+
+ {{opponent.contactsName}} +
+
+
+
+ Contact Phone +
+
+ {{opponent.contactsPhone}} +
+
+
+
+ Contact Email +
+
+ {{opponent.contactsEmail}} +
+
+
+
+ Logo +
+
+ {{#if opponent_logo}} + + {{else}} + +
+ + + Copy Filename and Go to Teamsnap + +
+ {{/if}} +
+
+
+
+ + \ No newline at end of file diff --git a/src/views/opponents.pug b/src/views/opponents.pug deleted file mode 100644 index 800d72a..0000000 --- a/src/views/opponents.pug +++ /dev/null @@ -1,10 +0,0 @@ -extends base - -block content - .Panel - .Panel-header - .Panel-title Opponents - .Panel-body - each opponent in opponents - .Panel-row - a(class='opponent' href=`/${team.id}/opponent/${opponent.id}`) #{opponent.name} diff --git a/src/views/partials/navbar.hbs b/src/views/partials/navbar.hbs new file mode 100644 index 0000000..dbe17e7 --- /dev/null +++ b/src/views/partials/navbar.hbs @@ -0,0 +1,30 @@ +
+
+
+ + + +
+ {{#if user}} + + + {{/if}} +
+ +
+
+
\ No newline at end of file diff --git a/src/views/partials/navbar.pug b/src/views/partials/navbar.pug new file mode 100644 index 0000000..4277161 --- /dev/null +++ b/src/views/partials/navbar.pug @@ -0,0 +1,25 @@ +header.Header + .Header-container.Grid.u-flexAlignItemsCenter + .Grid-cell.u-sizeFill + .Header-banner.Grid.u-flexAlignItemsCenter + a.Grid-cell.u-sizeFit.u-flexInline.u-flexAlignItemsCenter.u-textDecorationNone href=url_for(root_path) + div.Header-bannerLogo + img(class='logo' src='/media/benchcoach.svg' alt='BenchCoach Logo') + span + - if defined?(team) + h1.Header-bannerTitle #{team.name} + - else + h1.Header-bannerTitle BenchCoach + .Grid-cell.u-flexInline.u-flexJustifyEnd.u-sizeFill.u-padSidesSm + - if @user + .Popup + .Button.Button--small.Popup-toggle onclick="this.closest('.Popup').querySelector('.Popup-container').classList.toggle('is-open')" + | Account + .Popup-container.Popup-container--down.Popup-container--right.u-sizeFit + .Popup-content.u-padXs.u-sizeFit.u-fontSizeSm + h6.title.u-textNoWrap.u-fontSizeSm.u-textSemiBold="#{@user['first_name']} #{@user['last_name']}" + .u-textNoWrap.u-fontSizeSm="#{@user['email']}" + hr.Divider.u-spaceEndsNone + a href=url_for(logout_path) Logout + + .Grid-cell.u-sizeFit diff --git a/src/views/team.pug b/src/views/team.pug deleted file mode 100644 index 8bd58d9..0000000 --- a/src/views/team.pug +++ /dev/null @@ -1,24 +0,0 @@ -extends base.pug - -block content - .Panel - .Panel-body - .Panel-row - h2.Panel-title #{team.name} - p #{team.seasonName} - .Panel - .Panel-body - .Panel-row - a(href=`/${team.id}/events`).u-fontSizeXl- - - - - | Events - .Panel-row - a(href=`/${team.id}/members`) - - | Roster - .Panel-row - a(href=`/${team.id}/opponents`) - - | Opponents \ No newline at end of file diff --git a/src/views/team/home.hbs b/src/views/team/home.hbs new file mode 100644 index 0000000..55dd47a --- /dev/null +++ b/src/views/team/home.hbs @@ -0,0 +1,52 @@ +
+
+ +
+
+

{{team.name}}

+

{{team.season_name}}

+ {{team.leagueName}} +
+
+ + + + +
+
+

Upcoming Events

+
+
+ {{#each upcoming_events}} + {{>event_panel event=this}} + {{/each}} +
+
+ +
+
+

Recent Events

+
+
+ {{#each recent_events}} + {{>event_panel event=this}} + {{/each}} +
+
\ No newline at end of file diff --git a/src/views/team/list.hbs b/src/views/team/list.hbs new file mode 100644 index 0000000..28183d2 --- /dev/null +++ b/src/views/team/list.hbs @@ -0,0 +1,49 @@ +
+
+

+ My Teams +

+
+
+ {{#each teams}} + {{#unless this.isArchivedSeason}} + +
+ + {{this.name}} + +
+
+ {{this.seasonName}} +
+
+ {{/unless}} + {{/each}} +
+

+ Archived Seasons +

+
+ {{#each teams}} + {{#if this.isArchivedSeason}} + +
+ + {{this.name}} + +
+
+ {{this.seasonName}} +
+
+ {{/if}} + {{/each}} +
+
+ \ No newline at end of file diff --git a/src/views/teams.pug b/src/views/teams.pug deleted file mode 100644 index 1e145b4..0000000 --- a/src/views/teams.pug +++ /dev/null @@ -1,20 +0,0 @@ -extends base.pug - -block content - .row - .text-center.my-2 - .row - h1 - img.mx-auto(src="media/benchcoach.svg" style="width: 2.5em;") - .row - h1 - strong - | Welcome to - span.text-nowrap BenchCoach - .text-center.lead.fst-italic.fw-light - | An assistant coach for TeamSnap - .row - .col.text-center - ul.list-group - each team in teams - a(class='team list-group-item' href=`/${team.id}/home`) #{team.name} [#{team.seasonName}] diff --git a/src/views/upload-logo.pug b/src/views/upload-logo.pug deleted file mode 100644 index 9ceb8d9..0000000 --- a/src/views/upload-logo.pug +++ /dev/null @@ -1,84 +0,0 @@ -html -head - meta(charset='utf-8') - meta(name='viewport' content='width=device-width, initial-scale=1') - title BenchCoach - Teams - link(rel='stylesheet' href='/css/bootstrap.min.css') - link(rel='stylesheet' href='/font/bootstrap-icons.min.css') - link(rel='stylesheet' href='/css/teamsnap-ui.css') - script(type='text/javascript', src='/js/teamsnap.js') - -body - .container - .Panel - .Panel-header - .Panel-title Upload - .Panel-body - .Panel-row - .input-group - label(for='file') Select file - input(id='file' type="file") - input(id="csrf_token", type="hidden" name="csrf_token" value=`${csrf_token}`) - input(id='team_id', type="hidden", value=`${team_id}`) - input(id='opponent_id', type="hidden", value=`${opponent_id}`) - input(id='token', type="hidden", value=`${token}`) - input(id='clientId', type="hidden", value=`${clientId}`) - button(type='submit' onClick="submitForm()") Upload - -script. - function submitForm(e) { - console.log(document.getElementById("opponent_id").value) - const file = document.getElementById("file"); - const csrf_token = document.getElementById("csrf_token").value; - const team_id = document.getElementById("team_id").value; - const opponent_id = document.getElementById("opponent_id").value; - const formData = new FormData(); - formData.append("file", file.files[0]); - formData.append("team_id", team_id); - formData.append("opponent_id", opponent_id); - for (var key of formData.entries()) { - console.log(key[0] + ', ' + key[1]); - } - fetch(`/${team_id}/opponent/${opponent_id}/upload-logo`, { - method: 'POST', - body: formData, - headers: { - "X-CSRF-Token": csrf_token, - - } - }) - .then((res) => console.log(res)) - .catch((err) => ("Error occured", err)); - } - - function uploadImageForm(e) { - const file = document.getElementById("file"); - const csrf_token = document.getElementById("csrf_token").value; - const team_id = document.getElementById("team_id").value; - const opponent_id = document.getElementById("opponent_id").value; - const token = document.getElementById("token").value; - const clientId = document.getElementById("clientId").value; - const formData = new FormData(); - teamsnap.init(clientId); - teamsnap.auth(token) - console.log(teamsnap.isAuthed()) - teamsnap - .loadCollections() - .then(() => { - return teamsnap.createTeamMedium({ - file: file.files[0], - mediaFormat: "file", - memberId: member_id, - teamId: team_id, - teamMediaGroupId: "4927028", - description: `team-logo-${opponent_id}.png`, - }); - }) - .then((item) => { - return teamsnap.uploadTeamMedium(item); - }) - .then((item) => { - res.send("Data Received: " + JSON.stringify(item)); - }) - .fail((err) => console.log(err)); - } \ No newline at end of file