From 9e2c07ba38c5785676eb90e2c89c7b486cd6fab8 Mon Sep 17 00:00:00 2001 From: Martin Donnelly Date: Wed, 11 Dec 2019 00:07:07 +0000 Subject: [PATCH] init --- .babelrc | 5 + .eslintrc | 55 + .gitignore | 163 + .prettierignore | 2 + .prettierrc | 8 + .travis.yml | 12 + gulp/backbone.js | 33 + gulpfile.js | 5 + list.js | 407 ++ list.json | 12 + live/css/App.css | 428 ++ live/css/login.css | 57 + live/favicon.ico | Bin 0 -> 318 bytes live/gfx/recipes.png | Bin 0 -> 12019 bytes live/js/bundle.js | 3659 ++++++++++++++ live/js/bundle.js.map | 1 + live/login.html | 18 + live/recipes.html | 83 + live/tpl/header.html | 1 + live/tpl/recipe-details.html | 12 + live/tpl/recipe-list-item.html | 1 + menu.db | Bin 0 -> 69632 bytes package-lock.json | 6006 +++++++++++++++++++++++ package.json | 41 + preload.js | 311 ++ server.js | 79 + server/controllers/recipe.controller.js | 101 + server/controllers/t.html | 10 + server/controllers/view.controller.js | 48 + server/lib/connect.js | 6 + server/lib/dbmanager.js | 108 + server/lib/loginmanager.js | 14 + server/routes/recipe.routes.js | 6 + server/routes/view.routes.js | 12 + server/static/index.html | 83 + server/static/login.html | 78 + src/v1/js/app.js | 262 + src/v1/js/duff.js | 208 + src/v1/js/headerview.js | 31 + src/v1/js/lib/models.js | 18 + src/v1/js/lib/utils.js | 37 + test.json | 7 + 42 files changed, 12428 insertions(+) create mode 100644 .babelrc create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .travis.yml create mode 100644 gulp/backbone.js create mode 100644 gulpfile.js create mode 100644 list.js create mode 100644 list.json create mode 100644 live/css/App.css create mode 100644 live/css/login.css create mode 100644 live/favicon.ico create mode 100644 live/gfx/recipes.png create mode 100644 live/js/bundle.js create mode 100644 live/js/bundle.js.map create mode 100644 live/login.html create mode 100644 live/recipes.html create mode 100644 live/tpl/header.html create mode 100644 live/tpl/recipe-details.html create mode 100644 live/tpl/recipe-list-item.html create mode 100644 menu.db create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 preload.js create mode 100644 server.js create mode 100644 server/controllers/recipe.controller.js create mode 100644 server/controllers/t.html create mode 100644 server/controllers/view.controller.js create mode 100644 server/lib/connect.js create mode 100644 server/lib/dbmanager.js create mode 100644 server/lib/loginmanager.js create mode 100644 server/routes/recipe.routes.js create mode 100644 server/routes/view.routes.js create mode 100644 server/static/index.html create mode 100644 server/static/login.html create mode 100644 src/v1/js/app.js create mode 100644 src/v1/js/duff.js create mode 100644 src/v1/js/headerview.js create mode 100644 src/v1/js/lib/models.js create mode 100644 src/v1/js/lib/utils.js create mode 100644 test.json diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..02f08fb --- /dev/null +++ b/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "es2015" + ] +} \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..118531a --- /dev/null +++ b/.eslintrc @@ -0,0 +1,55 @@ +{ + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "ecmaFeatures": { + "jsx": false + } + }, + "env": { + "browser": false, + "node": true, + "es6": true + }, + "rules": { + "arrow-spacing": "error", + "block-scoped-var": "error", + "block-spacing": "error", + "brace-style": ["error", "stroustrup", {}], + "camelcase": "error", + "comma-dangle": ["error", "never"], + "comma-spacing": ["error", { "before": false, "after": true }], + "comma-style": [1, "last"], + "consistent-this": [1, "_this"], + "curly": [1, "multi"], + "eol-last": 1, + "eqeqeq": 1, + "func-names": 1, + "indent": ["error", 2, { "SwitchCase": 1 }], + "lines-around-comment": ["error", { "beforeBlockComment": true, "allowArrayStart": true }], + "max-len": [1, 180, 2, { "ignoreTemplateLiterals": true, "ignoreStrings": true, "ignoreUrls": true, "ignoreTrailingComments": true, "ignoreComments": true }], // 2 spaces per tab, max 80 chars per line + "new-cap": 1, + "newline-before-return": "error", + "no-array-constructor": 1, + "no-inner-declarations": [1, "both"], + "no-mixed-spaces-and-tabs": 1, + "no-multi-spaces": 2, + "no-new-object": 1, + "no-shadow-restricted-names": 1, + "object-curly-spacing": ["error", "always"], + "padded-blocks": ["error", { "blocks": "never", "switches": "always" }], + "prefer-const": "error", + "prefer-template": "error", + "one-var": 0, + "quote-props": ["error", "always"], + "quotes": [1, "single"], + "radix": 1, + "semi": [1, "always"], + "space-before-blocks": [1, "always"], + "space-infix-ops": 1, + "vars-on-top": 1, + "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1 }], + "spaced-comment": ["error", "always", { "markers": ["/"] }] + } + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..20b45a6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +.idea/ +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + + + +# artefacts/screenshots/*.png +artefacts/*.txt +artefacts/*.json +# artefacts/*.html +# artefacts/* + +/tests/*.zip + +/output/ +/dist/ +!/tests/data/ +/tests/sink/ +/debug/ +/update.sh +/setup/web/ +/backup/ + +/archive.tar.gz +/user/ +/zip +!/artefacts/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..51fba08 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +node_modules/* +public \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d909c93 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "singleQuote": true, + "trailingComma": "all", + "printWidth": 80, + "tabWidth": 2, + "useTabs": false +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..970f0fc --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +language: node_js + +sudo: false + +node_js: + - "8.11.1" + +install: + - npm install + +script: + - npm run test diff --git a/gulp/backbone.js b/gulp/backbone.js new file mode 100644 index 0000000..03360c1 --- /dev/null +++ b/gulp/backbone.js @@ -0,0 +1,33 @@ +'use strict'; + +const browserify = require('browserify'); +const gulp = require('gulp'); +const source = require('vinyl-source-stream'); +const buffer = require('vinyl-buffer'); +const uglify = require('gulp-uglify-es').default; +const sourcemaps = require('gulp-sourcemaps'); +const gutil = require('gulp-util'); +const rename = require('gulp-rename'); +const stripDebug = require('gulp-strip-debug'); + + +gulp.task('bundleApp', function () { + // set up the browserify instance on a task basis + const b = browserify({ + 'debug': true, + 'entries': './src/v1/js/app.js' + }); + + return b.bundle() + .pipe(source('app.js')) + .pipe(buffer()) + // .pipe(stripDebug()) + .pipe(rename('bundle.js')) + + .pipe(sourcemaps.init({ 'loadMaps': true })) + // Add transformation tasks to the pipeline here. + // .pipe(uglify()) + .on('error', gutil.log) + .pipe(sourcemaps.write('.')) + .pipe(gulp.dest('./live/js')); +}); diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..31d3996 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,5 @@ +const gulp = require('gulp'); + +const requireDir = require('require-dir'); + +requireDir('./gulp'); diff --git a/list.js b/list.js new file mode 100644 index 0000000..8fa2487 --- /dev/null +++ b/list.js @@ -0,0 +1,407 @@ + +const mailer = new UltraSES({ + 'aws': { + 'accessKeyId': 'AKIAJWJS75F7WNCGK64A', + 'secretAccessKey': '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', + 'region': 'eu-west-1' + }, 'defaults': { + 'from': 'Martin Donnelly ' + } +}); + +const menu = [ + + + { + 'name': 'butter chicken in silky sauce', + 'url': 'http://www.marksdailyapple.com/butter-chicken-in-a-silky-sauce/#axzz29jTSubMo', + 'hash': '5117109d69d399915c0959eabbc383f9' +}, { + 'name': 'steak', + 'url': 'https://www.farmison.com/community/recipe/how-to-cook-your-beef-fillet-steak', + 'hash': '35e244830bde1d967298fb9a585854f7' +}, { + 'name': 'hazelnut crusted chicken', + 'url': 'http://www.marksdailyapple.com/hazelnut-crusted-chicken-with-stealth-coconut/#axzz29jTSubMo', + 'hash': 'baaf075a2384ff84ef3d9ce4eebfafff' +}, { 'name': 'vegetable latkes', 'url': 'http://www.marksdailyapple.com/vegetable-latkes/#axzz29jTSubMo', 'hash': '11a043bfe06505f88b0bcfb59095ecab' }, +{ + 'name': 'beef stew', + 'url': 'http://www.marksdailyapple.com/beef-stew-and-chicken-soup-in-35-minutes-or-less/#axzz29jTSubMo', + 'hash': '45f5a2176ff5547585a5e562e0914776' +}, { + 'name': 'sausage patties', + 'url': 'https://www.tasteslovely.com/homemade-paleo-breakfast-sausage-patties/', + 'hash': 'c6152fba4df0de77cb139488eaeb4690' +}, { + 'name': 'primal tex mex torillas', + 'url': 'http://www.marksdailyapple.com/primal-tex-mex-tortillas-and-taco-seasoning/#axzz29jTSubMo', + 'hash': '08d2e6f8a56619b833e412473ef31e06' +}, { + 'name': 'primal texas chili', + 'url': 'http://www.marksdailyapple.com/primal-texas-chili/#axzz29jTSubMo', + 'hash': '319718f91f88fe96840cbdbf09bdb0b3' +}, { 'name': 'moroccan burgers', 'url': 'https://sarahfragoso.com/moroccan-burgers-and-beet-salad/', 'hash': '0a4e01068e349791d6e9f2a0c9a80d98' }, { + 'name': 'paleo spaghetti', + 'url': 'https://paleoleap.com/paleo-spaghetti/', + 'hash': '59394666f0320c909c057fc535b99387' +}, { + 'name': 'primal chicken tikka masala', + 'url': 'http://www.marksdailyapple.com/primal-chicken-tikka-masala/#axzz29jTSubMo', + 'hash': '1222c577eb67f601088f7649efd329a9' +}, { + 'name': 'butter stuffed chicken kiev', + 'url': 'http://www.marksdailyapple.com/butter-stuffed-chicken-kiev/#axzz29jTSubMo', + 'hash': '1b657d8d5e88af4dba220b875e496155' +}, { + 'name': 'tender lemon parsley brisket', + 'url': 'http://www.marksdailyapple.com/tender-lemon-parsley-brisket/#axzz29jTSubMo', + 'hash': '5256dd240e04a62c5b002e5dc4234618' +} +,{ + 'name': 'taco bowl crispy kale', + 'url': 'http://www.marksdailyapple.com/taco-bowl-with-crispy-kale-chips/#axzz29jTSubMo', + 'hash': 'fb3e4a7648a53e93490f6274f731e427' +}, { + 'name': 'lime and basil kebabs', + 'url': 'http://www.marksdailyapple.com/lime-and-basil-beef-kebabs/#axzz29jTSubMo', + 'hash': '47d38404c7b5f4b50df1f39b6c26845d' +}, { + 'name': 'sun dried tomato meatballs', + 'url': 'https://sarahfragoso.com/sun-dried-tomato-meatballs-with-creamy-pesto/', + 'hash': 'bb22a54c34eed937b17bb232aee5231c' +}, { + 'name': 'slow cooked coconut ginger pork', + 'url': 'http://www.marksdailyapple.com/slow-cooked-coconut-ginger-pork/#axzz29jTSubMo', + 'hash': '810acff788fae541bf6f037becc88926' +}, { + 'name': 'balsamic glazed drumsticks', + 'url': 'http://www.marksdailyapple.com/balsamic-glazed-drumsticks/#axzz29jTSubMo', + 'hash': 'b4ea4f7e46f8d435ac87e56f4069fb29' +}, { + 'name': 'herb chicken cooked under a brick', + 'url': 'http://www.marksdailyapple.com/herb-chicken-cooked-under-a-brick/#axzz29jTSubMo', + 'hash': '296cf41b69560cb8f898044471cef370' +}, { + 'name': 'pork stuffed jalapeno peppers', + 'url': 'http://www.marksdailyapple.com/pork-stuffed-jalapeno-peppers/#axzz29jTSubMo', + 'hash': 'd85f7f04d1efe18ca0342a95e6a94318' +}, { + 'name': 'spiced pork butternut squash', + 'url': 'http://www.marksdailyapple.com/spiced-pork-and-butternut-squash-with-sage/#axzz29jTSubMo', + 'hash': 'd681bdb030c64156e9155d29533f945b' +}, { + 'name': 'shakshuka', + 'url': 'http://www.marksdailyapple.com/shakshuka-eggs-poached-in-spicy-tomato-sauce/#axzz29jTSubMo', + 'hash': 'fdf0904c40e5c037b42ff657538a0670' +}, { + 'name': 'grilled lime chicken', + 'url': 'http://www.simplyrecipes.com/recipes/grilled_lime_chicken_with_black_bean_sauce/', + 'hash': '9c7cf2b0f15378cbebfd4cc9c6d72091' +}, { 'name': 'eggs benadict burger', 'url': 'https://paleoleap.com/eggs-benedict-burgers/', 'hash': '5d71a32d58190c67ac0597289db0b472' }, { + 'name': 'asian marinated steaks', + 'url': 'https://web.archive.org/web/20120330045230/http://www.paleotable.com/2011/01/asian-marinated-steaks.html', + 'hash': 'bd6a0fe62b93e93a988cdbc1ead53f8f' +}, { + 'name': 'tango burgers', + 'url': 'https://web.archive.org/web/20120127101048/http://www.paleotable.com/2011/01/tango-burgers.html', + 'hash': '61f794329b2144d17ef55d1806b635f9' +}, { + 'name': 'meatza', + 'url': 'https://web.archive.org/web/20120118062740/http://www.paleotable.com/2011/02/meatza.html', + 'hash': 'cf8306e8f197a1c66337141c87f0355c' +}, { + 'name': 'baked chicken with roasted tomatos', + 'url': 'https://web.archive.org/web/20120125102938/http://www.paleotable.com/2011/01/baked-chicken-with-roasted-tomatoes.html', + 'hash': '065784446d4c1296409589bc9e864ac5' +}, { + 'name': 'blackened chicken', + 'url': 'https://web.archive.org/web/20120420232533/http://www.paleotable.com/2011/02/blackened-chicken.html', + 'hash': '75bbaf2bac48017ed81a51a6675fe2ca' +}, { + 'name': 'breaded baked chicken', + 'url': 'https://www.tastesoflizzyt.com/paleo-baked-chicken/', + 'hash': '801def843d96d8bd8c2bb5cca201a0e9' +}, { + 'name': 'chicken and avocado tostadas', + 'url': 'https://web.archive.org/web/20120707073826/http://www.paleotable.com/2011/03/chicken-and-avocado-tostadas.html', + 'hash': '917337fb338a88ddd5d86191514d8b14' +}, { + 'name': 'sausages and pepperonata', + 'url': 'https://web.archive.org/web/20120707071653/http://www.paleotable.com/2011/01/sausages-and-pepperonata.html', + 'hash': '600d87a5710f69079e8ca1103dc3a03d' +}, { + 'name': 'Mediterranean Beef Stew with Green Olive Pesto', + 'url': 'http://www.health-bent.com/soups/paleo-mediterranean-beef-stew', + 'hash': 'acd935ee010ce4f06de7a3f593c140dc' +}, { + 'name': 'Beanless Chili', + 'url': 'https://web.archive.org/web/20121004005636/http://www.realfoodfreaks.com/2012/04/02/chili-beanless-cuz-i-dont-eat-em/', + 'hash': 'e4db2a9a21f7ac494ca8a8b988d2ea2b' +}, { + 'name': 'Grilled Steak with Roasted Jalapeño Chimichurri', + 'url': 'https://www.seriouseats.com/recipes/2012/05/ted-allens-grilled-steak-with-roasted-jalepeno.html', + 'hash': '52eb19e90993d5fbe2efa5451b291462' +}, { + 'name': 'Lime and Coconut Chicken', + 'url': 'http://chaosinthekitchen.com/2009/07/lime-and-coconut-chicken/', + 'hash': '7f7bda5e4f91b3efb63c2982c9780d21' +}, { + 'name': 'BEEF AND VEGETABLE CHILI', + 'url': 'http://www.paleoplan.com/2011/10-12/steak-and-vegetable-chili/', + 'hash': 'd9a16cfd6a533d820536ba231e68fe2b' +}, { + 'name': 'PORK LOIN WITH PEPPERS, MUSHROOMS AND ONIONS', + 'url': 'https://www.paleoplan.com/2010/02-23/pork-loin-with-peppers-mushrooms-n-onions/', + 'hash': '7c3b3f53e7acc60b651f65cd9743f9bd' +}, { + 'name': 'Melt In Your Mouth Slow Cooker Beef Brisket', + 'url': 'https://paleogrubs.com/beef-brisket-recipe', + 'hash': '92e81d0fc1d96b1669d0dcd98a0e355e' +}, { + 'name': 'Yummy Sweet Potato Gnocchi', + 'url': 'https://paleogrubs.com/sweet-potato-gnocchi-recipe', + 'hash': '9c1c921687e157a5670c6746bbceeee4' +}, { + 'name': 'Simple Beef and Broccoli Stir Fry', + 'url': 'https://paleogrubs.com/beef-and-broccoli-recipe', + 'hash': '13019ef536801ac1a7d702b1b856ce0b' +}, { + 'name': 'Crockpot Balsamic Roast Beef', + 'url': 'https://www.primallyinspired.com/crockpot-balsamic-roast-beef/', + 'hash': 'a725b6277a8c56cc9eca3e3f66128278' +}, { + 'name': 'Quick & Easy Crock Pot Chili', + 'url': 'https://www.healthstartsinthekitchen.com/2014/01/04/quick-crock-pot-chili/', + 'hash': '3d119153603010aaad3b921da7ddeed0' +}, { + 'name': 'Roasted, Herbed Beef Tenderloin Recipe', + 'url': 'https://www.chowhound.com/recipes/roasted-herbed-beef-tenderloin-30901', + 'hash': '1162e3121bfa2e3acbf9b112ca917318' +}, { + 'name': 'Chorizo Carbonara', + 'url': 'https://www.jamieoliver.com/recipes/pasta-recipes/chorizo-carbonara-with-catalan-market-salad/#1EmLf9RiqepY4Z95.97', + 'hash': '5a81acc6802404c16ccb595946638706' +}, { + 'name': 'swedish meatballs', + 'url': 'https://www.paleorunningmomma.com/paleo-swedish-meatballs-whole30/', + 'hash': '77724ec628b02f8ce7914a03c1266162' +}, { 'name': 'Hungarian Beef Goulash', 'url': 'https://paleoleap.com/hungarian-beef-goulash/', 'hash': '45c162ef0c0bab221120df4236bdcbf3' }, { + 'name': 'Beef Bourguignon', + 'url': 'http://paleoleap.com/beef-bourguignon/', + 'hash': '16fb7eb44aec586069f9e34251c5f49a' +}, { + 'name': 'Minted pesto chicken stir-fry', + 'url': 'http://paleoleap.com/quick-and-easy-paleo-stir-fries/', + 'hash': 'e3a28f3e02eab851a46c8e5455172791' +}, { + 'name': 'Coconut curry stir-fry', + 'url': 'http://paleoleap.com/quick-and-easy-paleo-stir-fries/', + 'hash': '4efbc7c204e2a003edf3027187f44d27' +}, { + 'name': 'Citrus beef salad stir-fry', + 'url': 'http://paleoleap.com/quick-and-easy-paleo-stir-fries/', + 'hash': '14ac93f7b0c699cc0ed4ca91891029b0' +}, + { 'name': 'a normal chicken stir fry', 'url': '', 'hash': 'bbbef5bd2c023ebd904cc87d4c82c047' }, { + 'name': 'hunters chicken ( chicken wrapped in bacon / pancetta )', + 'url': '', + 'hash': '68575933d8055d3d893ebcce9d4a5461' +}, { + 'name': 'Caribbean Pork Chops with Mango Salsa | Paleo Grubs', + 'url': 'https://paleogrubs.com/caribbean-pork-chops-recipe', + 'hash': '40d87c777140a4d09e4354ad1931efdb' +}, { + 'name': 'Paleo Pork Tenderloin with Fig and Balsamic Glaze', + 'url': 'http://paleogrubs.com/balsamic-pork-tenderloin-recipe', + 'hash': 'ff4a57645ef5da39e7f138fda943f720' +}, { + 'name': 'Chicken Cordon-Bacon', + 'url': 'https://fastpaleo.com/recipe/bacon-wrapped-chicken-cordon-bleu/', + 'hash': '8752697521079bc508bf42a3de61c03e' +}, { + 'name': 'Grilled Tandoori Chicken', + 'url': 'http://cookingweekends.blogspot.com/2012/05/grilled-tandoori-chicken.html', + 'hash': 'cf57581455fc17e6e9b657b0d2bbaa6f' +}, { + 'name': 'Stuffed Chicken Breast (paleo and grain free)', + 'url': 'http://www.cavegirlcuisine.com/recipes/stuffed-chicken-breast/', + 'hash': '709e1d41d3d0999a2c8443e0a170783f' +}, { + 'name': 'Lemon Chicken Breast Recipe', + 'url': 'https://www.everydaymaven.com/lemon-chicken-breast/', + 'hash': '370ca9c8e6a4bb5ff892f066a82c4071' +}, { + 'name': 'Grilled Lemon Garlic Rosemary Chicken Breasts', + 'url': 'https://www.phoenixhelix.com/2013/07/21/grilled-lemon-garlic-rosemary-chicken-breasts/', + 'hash': '463ee932b56b617bde9812f6032a6974' +}, { + 'name': 'Paleo Spicy Mustard Crockpot Chicken', + 'url': 'https://www.plaidandpaleo.com/2013/10/paleo-spicy-mustard-crockpot-chicken.html', + 'hash': 'a6c8493204d4a117f512f516e7ebbc38' +}, { + 'name': 'Creamy Paleo Chicken Skillet', + 'url': 'http://paleogrubs.com/skillet-chicken-recipe', + 'hash': '9b5602e594a5bba813b06835b3acef78' +}, { + 'name': 'Sweet and Savory Moroccan Chicken', + 'url': 'http://paleogrubs.com/moroccan-chicken-recipe', + 'hash': 'bff3e9ac8dc0b2e0c59ddbb0d3cce27a' +}, { + 'name': 'Simple and Addictive Chicken Kabobs', + 'url': 'http://paleogrubs.com/chicken-kabob-recipe', + 'hash': 'ad4f16c87dc76df8f53f0c57e517d574' +}, { + 'name': 'Indian Paleo Stew with Chicken', + 'url': 'http://paleogrubs.com/indian-paleo-stew-recipe', + 'hash': 'd9fad92471bf383f97b512d4b0a81fb2' +}, { + 'name': 'Slow-Cooker Swedish Kalops Stew', + 'url': 'https://web.archive.org/web/20130501032143/http://www.mylivingnutrition.com/2013/04/11/slow-cooker-swedish-kalops-stew/', + 'hash': '866b670b9da5974e56b7a7759b406897' +}, { + 'name': 'Beef, Bacon and Rum Stew', + 'url': 'http://domesticsoul.com/2011/12/beef-bacon-rum-stew-recipe.html', + 'hash': '7601dee9f0ab54604b1afca6978bda53' +}, { + 'name': 'Paleo Orange Cinnamon Beef Stew', + 'url': 'https://thehealthyfoodie.com/orange-cinnamon-beef-stew/', + 'hash': '9c2190641bb066f638bf87f3147a5347' +}, { 'name': 'pepper steak', 'url': 'http://paleoleap.com/pepper-steak/', 'hash': 'e61d26358e9854fb6e661df024cc4aac' }, { + 'name': 'GARLIC ROASTED COD', + 'url': 'http://paleoleap.com/garlic-roasted-cod/', + 'hash': '860ef03f3f862e46ee7a12468cee4a8f' +}, { + 'name': 'Easy Bacon-Wrapped Paleo Meatloaf Muffins', + 'url': 'https://paleogrubs.com/bacon-wrapped-meatloaf-muffins', + 'hash': '41eeb396e1a113b34383a3ab286ac38f' +}, { + 'name': 'Easy Ground Beef Stuffed Peppers', + 'url': 'https://paleogrubs.com/ground-beef-stuffed-peppers', + 'hash': '4349670e1f9c08d89491e83fea5f3041' +}, { + 'name': 'balsamic grilled chicken with greek style salad', + 'url': 'https://paleoleap.com/balsamic-grilled-chicken-greek-style-salad/', + 'hash': '9b9ee3d83b88ed2c8b4f4ff50ca0b879' +}, { + 'name': 'slow cooked hawaiian style kalua pork', + 'url': 'https://paleoleap.com/slow-cooked-hawaiian-style-kalua-pork/', + 'hash': 'b3411415c6ea78f4e4b73596b0b3aa0c' +}, { + 'name': 'Sweet Thai Chili Chicken With Roasted Peppers', + 'url': 'http://paleoleap.com/sweet-thai-chili-chicken-roasted-peppers/', + 'hash': '4f524ce44423b2abe6ee5e92b379e69b' +}, { + 'name': 'Steak Ratatouille', + 'url': 'http://www.jamieoliver.com/recipes/beef-recipes/grilled-steak-ratatouille-saffron-rice/', + 'hash': 'f21ac2e974c00ac45245aa68c83f477c' +}, { + 'name': 'Slow Cooked Balsamic Pork Roast', + 'url': 'https://paleoleap.com/slow-cooked-balsamic-pork-roast/', + 'hash': 'c2c3c4b5c60fe6549c59d4dd1c6d55bf' +}, { + 'name': 'Seared Cod with Fresh Herb Sauce', + 'url': 'http://paleoleap.com/seared-cod-fresh-herb-sauce/', + 'hash': '85e1f67407636b53958918142080635f' +}, { + 'name': 'Honey Ginger Apple Shredded Pork', + 'url': 'https://paleomg.com/honey-ginger-apple-shredded-pork/', + 'hash': 'bd0485bf2f1e0019298e08c38011641b' +}, { + 'name': 'Orange Pineapple Pulled Pork', + 'url': 'http://www.smokedngrilled.com/orange-pineapple-pulled-pork/', + 'hash': 'afb59b8879277bbeb2b5ec3b9b33ec52' +}, { 'name': 'Brazilian Curry Chicken', 'url': 'https://paleomg.com/brazilian-curry-chicken/', 'hash': 'd2c78d69054333cb52a9be6bbbf3a497' }, { + 'name': 'Teriyaki Meatballs', + 'url': 'https://paleogrubs.com/teriyaki-meatballs', + 'hash': '4285b9472917c5c03402b973721d506f' +}, { + 'name': 'Paleo Slow Cooker Bacon BBQ Chicken', + 'url': 'https://paleogrubs.com/chicken-breast-recipes', + 'hash': '3391a35433f97ed9c58918a41eb59fa7' +}, { + 'name': 'Honey-Lime Grilled Chicken Skewers', + 'url': 'https://paleogrubs.com/honey-lime-grilled-chicken-skewers', + 'hash': '8a84beaad4169b3c845f0d65b2f33c29' +}, { + 'name': 'Pork Chop With Applesauce And Roasted Tomatoes', + 'url': 'https://paleoleap.com/pork-chop-applesauce-roasted-tomatoes/', + 'hash': '88ec8f4a7e89cec6fe9687a38595b318' +}, { + 'name': 'Slow Cooked Jerk Pork Tenderloin', + 'url': 'https://paleoleap.com/slow-cooked-jerk-pork-tenderloin/', + 'hash': '74dccaea2c0a83343720aee35ca91dc2' +}, { 'name': 'Slow cooked beef cheeks with pork & vanilla', 'url': 'https://irenamacri.com/recipes/slow-cooked-beef-cheeks/', 'hash': 'a39657743c78e7a1e5438243444af9b5' }]; + +const soups = [ + { + 'name': 'chicken soup', + 'url': + 'http://www.marksdailyapple.com/beef-stew-and-chicken-soup-in-35-minutes-or-less/#axzz29jTSubMo', + 'hash': 'f5970ca52c37f67cd1fda14edad7fdce' + }, + { + 'name': 'Tom Kha Gai -- Thai Coconut Soup', + 'url': 'https://www.angsarap.net/2012/03/08/tom-kha-gai/', + 'hash': '670819e255ec45b344ec1cc30ad436fe' + }, + { + 'name': 'Roasted Tomato Soup with Fresh Basil', + 'url': 'https://civilizedcaveman.com/recipes/soups/roasted-tomato-soup/', + 'hash': 'a0f61259e62dfe6fdbf4feb42402f9cb' + }, + { + 'name': 'Tom Yum Gai - hot and sour soup', + 'url': 'http://angsarap.net/2013/08/07/tom-yum-gai/', + 'hash': 'f0edd41d24a04b2a4dcf72f685f2367b' + }, + { + 'name': 'Coconut Lime Chicken Soup', + 'url': 'https://paleoleap.com/coconut-lime-chicken-soup/', + 'hash': 'd2e316b3f58fe2191367d24d5e20deb9' + }, + { + 'name': 'Cream of Chicken Soup', + 'url': 'https://paleogrubs.com/crockpot-cream-of-chicken-soup', + 'hash': '46e33b03f670037de46d3425fdce4e78' + }, + { + 'name': 'Roasted Carrot Ginger Paleo Soup', + 'url': 'https://paleogrubs.com/soup-recipes', + 'hash': '26d8938367235d9c891ec1b87fd50cd8' + }, + { + 'name': 'Slow Cooker Taco Soup', + 'url': 'https://paleogrubs.com/slow-cooker-taco-soup', + 'hash': '926dcc730930547b3dabdc623613f8e9' + }, + { + 'name': 'Chicken Soup - MD', + 'url': + 'https://paleogrubs.com/wp-content/uploads/2019/03/Homemade-Chicken-No-Noodle-Soup-1.jpg', + 'hash': 'dc7eacaaf9b2d2fe6d16273d20f5d052' + }, + { + 'name': 'Ham Soup - MD', + 'url': + 'https://paleogrubs.com/wp-content/uploads/2019/03/Homemade-Chicken-No-Noodle-Soup-1.jpg', + 'hash': 'ec2bc0d8622baeab237b9057a828933c' + }, + { + 'name': 'Chicken & Chorizo - MD', + 'url': + 'https://paleogrubs.com/wp-content/uploads/2019/03/Homemade-Chicken-No-Noodle-Soup-1.jpg', + 'hash': 'ab727cbfbc73cea127c61cc742b38d25' + }, + { + 'name': 'Chickpea Soup - Jess', + 'url': + 'https://paleogrubs.com/wp-content/uploads/2019/03/Homemade-Chicken-No-Noodle-Soup-1.jpg', + 'hash': '85620ea6a3dc6692ee772adf2e4abb40' + }, + { + 'name': 'Crockpot Paleo Minestrone Soup', + 'url': 'https://www.ourpaleolife.com/crockpot-paleo-minestrone-soup/', + 'hash': 'b9d1e302487be049a6b1c573e007e751' + } +]; diff --git a/list.json b/list.json new file mode 100644 index 0000000..e7c1c12 --- /dev/null +++ b/list.json @@ -0,0 +1,12 @@ +[ + { + "name": "Asian pepper steak crock pot recipe", + "url": "https://www.marksdailyapple.com/asian-pepper-steak-crock-pot-recipe/#axzz29jTSubMo", + "hash": "bd96f4ac0089d553a93b8a37052568b6" + }, + { + "name": "Beef burgandy", + "url": "http://www.marksdailyapple.com/beef-burgundy-recipe/#axzz29jTSubMo", + "hash": "1da0aafeccfe6a5b4beb853fdbec7aca" + } +] diff --git a/live/css/App.css b/live/css/App.css new file mode 100644 index 0000000..50bcc5a --- /dev/null +++ b/live/css/App.css @@ -0,0 +1,428 @@ +@import url('https://fonts.googleapis.com/css?family=Roboto'); + +/* Global Styles */ +:root { + --primary-color: #64B5F6; + --dark-color: #333333; + --light-color: #f4f4f4; + --danger-color: #dc3545; + --success-color: #28a745; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: 'Roboto', sans-serif; + font-size: 1rem; + line-height: 1.6; + background-color: #fff; + color: #333; +} + +a { + color: var(--primary-color); + text-decoration: none; +} + +a:hover { + color: #666; +} + +ul { + list-style: none; +} + +img { + width: 100%; +} + +.dataRow { + cursor: pointer; +} + +/* Utilities */ +.container { + max-width: 1100px; + margin: auto; + overflow: hidden; + padding: 0 2rem; +} + +/* Text Styles*/ +.x-large { + font-size: 4rem; + line-height: 1.2; + margin-bottom: 1rem; +} + +.large { + font-size: 3rem; + line-height: 1.2; + margin-bottom: 1rem; +} + +.lead { + font-size: 1.5rem; + margin-bottom: 1rem; +} + +.text-center { + text-align: center; +} + +.text-primary { + color: var(--primary-color); +} + +.text-dark { + color: var(--dark-color); +} + +.text-success { + color: var(--success-color); +} + +.text-danger { + color: var(--danger-color); +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-left { + text-align: left; +} + +/* Center All */ +.all-center { + display: flex; + flex-direction: column; + width: 100%; + margin: auto; + justify-content: center; + align-items: center; + text-align: center; +} + +/* Cards */ +.card { + padding: 1rem; + border: #ccc 1px dotted; + margin: 0.7rem 0; +} + +/* List */ +.list { + margin: 0.5rem 0; +} + +.list li { + padding-bottom: 0.3rem; +} + +/* Padding */ +.p { + padding: 0.5rem; +} +.p-1 { + padding: 1rem; +} +.p-2 { + padding: 2rem; +} +.p-3 { + padding: 3rem; +} +.py { + padding: 0.5rem 0; +} +.py-1 { + padding: 1rem 0; +} +.py-2 { + padding: 2rem 0; +} +.py-3 { + padding: 3rem 0; +} + +/* Margin */ +.m { + margin: 0.5rem; +} +.m-1 { + margin: 1rem; +} +.m-2 { + margin: 2rem; +} +.m-3 { + margin: 3rem; +} +.my { + margin: 0.5rem 0; +} +.my-1 { + margin: 1rem 0; +} +.my-2 { + margin: 2rem 0; +} +.my-3 { + margin: 3rem 0; +} + +/* Grid */ +.grid-2 { + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-gap: 1rem; +} + +.grid-3 { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-gap: 1rem; +} + +.grid-4 { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-gap: 1rem; +} + +.btn { + display: inline-block; + background: var(--light-color); + color: #333; + padding: 0.4rem 1.3rem; + font-size: 1rem; + border: none; + cursor: pointer; + margin-right: 0.5rem; + transition: opacity 0.2s ease-in; + outline: none; +} + +.btn-link { + background: none; + padding: 0; + margin: 0; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-sm { + font-size: 0.8rem; + padding: 0.3rem 1rem; + margin-right: 0.2rem; +} + +.badge { + display: inline-block; + font-size: 0.8rem; + padding: 0.2rem 0.7rem; + text-align: center; + margin: 0.3rem; + background: var(--light-color); + color: #333; + border-radius: 5px; +} + +.alert { + padding: 0.7rem; + margin: 1rem 0; + opacity: 0.9; + background: var(--light-color); + color: #333; +} + +.btn-primary, +.bg-primary, +.badge-primary, +.alert-primary { + background: var(--primary-color); + color: #fff; +} + + +.btn-light, +.bg-light, +.badge-light, +.alert-light { + background: var(--light-color); + color: #333; +} + +.btn-dark, +.bg-dark, +.badge-dark, +.alert-dark { + background: var(--dark-color); + color: #fff; +} + +.btn-danger, +.bg-danger, +.badge-danger, +.alert-danger { + background: var(--danger-color); + color: #fff; +} + +.btn-success, +.bg-success, +.badge-success, +.alert-success { + background: var(--success-color); + color: #fff; +} + +.btn-white, +.bg-white, +.badge-white, +.alert-white { + background: #fff; + color: #333; + border: #ccc solid 1px; +} + +.btn:disabled { + cursor: not-allowed; + pointer-events: none; + opacity: 0.60; + -webkit-box-shadow: none; + box-shadow: none; +} + + +.btn:enabled:hover { + opacity: 0.8; +} + +.bg-light, +.badge-light { + border: #ccc solid 1px; +} + +.round-img { + border-radius: 50%; +} + +/* Forms */ +input { + margin: 1.2rem 0; +} + +.form-text { + display: block; + margin-top: 0.3rem; + color: #888; +} + +input[type='text'], +input[type='email'], +input[type='password'], +input[type='date'], +select, +textarea { + display: block; + width: 100%; + padding: 0.4rem; + font-size: 1.2rem; + border: 1px solid #ccc; +} + +input[type='submit'], +button { + font: inherit; +} + +table th, +table td { + padding: 1rem; + text-align: left; +} + +table th { + background: var(--light-color); +} + +/* Navbar */ +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.7rem 2rem; + z-index: 1; + width: 100%; + opacity: 0.9; + margin-bottom: 1rem; +} + +.navbar ul { + display: flex; +} + +.navbar a { + color: #fff; + padding: 0.45rem; + margin: 0 0.25rem; +} + +.navbar a:hover { + color: var(--light-color); +} + +.navbar .welcome span { + margin-right: 0.6rem; +} + +/* Mobile Styles */ +@media (max-width: 700px) { + .hide-sm { + display: none; + } + + .grid-2, + .grid-3, + .grid-4 { + grid-template-columns: 1fr; + } + + /* Text Styles */ + .x-large { + font-size: 3rem; + } + + .large { + font-size: 2rem; + } + + .lead { + font-size: 1rem; + } + + /* Navbar */ + .navbar { + display: block; + text-align: center; + } + + .navbar ul { + text-align: center; + justify-content: center; + } +} diff --git a/live/css/login.css b/live/css/login.css new file mode 100644 index 0000000..3b3a545 --- /dev/null +++ b/live/css/login.css @@ -0,0 +1,57 @@ +@import url(https://fonts.googleapis.com/css?family=Open+Sans); +.btn { display: inline-block; *display: inline; *zoom: 1; padding: 4px 10px 4px; margin-bottom: 0; font-size: 13px; line-height: 18px; color: #333333; text-align: center;text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); vertical-align: middle; background-color: #f5f5f5; background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); background-image: linear-gradient(top, #ffffff, #e6e6e6); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr=#ffffff, endColorstr=#e6e6e6, GradientType=0); border-color: #e6e6e6 #e6e6e6 #e6e6e6; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); border: 1px solid #e6e6e6; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); cursor: pointer; *margin-left: .3em; } +.btn:hover, .btn:active, .btn.active, .btn.disabled, .btn[disabled] { background-color: #e6e6e6; } +.btn-large { padding: 9px 14px; font-size: 15px; line-height: normal; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } +.btn:hover { color: #333333; text-decoration: none; background-color: #e6e6e6; background-position: 0 -15px; -webkit-transition: background-position 0.1s linear; -moz-transition: background-position 0.1s linear; -ms-transition: background-position 0.1s linear; -o-transition: background-position 0.1s linear; transition: background-position 0.1s linear; } +.btn-primary, .btn-primary:hover { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); color: #ffffff; } +.btn-primary.active { color: rgba(255, 255, 255, 0.75); } +.btn-primary { background-color: #4a77d4; background-image: -moz-linear-gradient(top, #6eb6de, #4a77d4); background-image: -ms-linear-gradient(top, #6eb6de, #4a77d4); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6eb6de), to(#4a77d4)); background-image: -webkit-linear-gradient(top, #6eb6de, #4a77d4); background-image: -o-linear-gradient(top, #6eb6de, #4a77d4); background-image: linear-gradient(top, #6eb6de, #4a77d4); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr=#6eb6de, endColorstr=#4a77d4, GradientType=0); border: 1px solid #3762bc; text-shadow: 1px 1px 1px rgba(0,0,0,0.4); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.5); } +.btn-primary:hover, .btn-primary:active, .btn-primary.active, .btn-primary.disabled, .btn-primary[disabled] { filter: none; background-color: #4a77d4; } +.btn-block { width: 100%; display:block; } + +* { -webkit-box-sizing:border-box; -moz-box-sizing:border-box; -ms-box-sizing:border-box; -o-box-sizing:border-box; box-sizing:border-box; } + +html { width: 100%; height:100%; overflow:hidden; } + +body { + width: 100%; + height:100%; + font-family: 'Open Sans', sans-serif; + background: #092756; + background: -moz-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%),-moz-linear-gradient(top, rgba(57,173,219,.25) 0%, rgba(42,60,87,.4) 100%), -moz-linear-gradient(-45deg, #670d10 0%, #092756 100%); + background: -webkit-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%), -webkit-linear-gradient(top, rgba(57,173,219,.25) 0%,rgba(42,60,87,.4) 100%), -webkit-linear-gradient(-45deg, #670d10 0%,#092756 100%); + background: -o-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%), -o-linear-gradient(top, rgba(57,173,219,.25) 0%,rgba(42,60,87,.4) 100%), -o-linear-gradient(-45deg, #670d10 0%,#092756 100%); + background: -ms-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%), -ms-linear-gradient(top, rgba(57,173,219,.25) 0%,rgba(42,60,87,.4) 100%), -ms-linear-gradient(-45deg, #670d10 0%,#092756 100%); + background: -webkit-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%), linear-gradient(to bottom, rgba(57,173,219,.25) 0%,rgba(42,60,87,.4) 100%), linear-gradient(135deg, #670d10 0%,#092756 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3E1D6D', endColorstr='#092756',GradientType=1 ); +} +.login { + position: absolute; + top: 50%; + left: 50%; + margin: -150px 0 0 -150px; + width:300px; + height:300px; +} +.login h1 { color: #fff; text-shadow: 0 0 10px rgba(0,0,0,0.3); letter-spacing:1px; text-align:center; } + +input { + width: 100%; + margin-bottom: 10px; + background: rgba(0,0,0,0.3); + border: none; + outline: none; + padding: 10px; + font-size: 13px; + color: #fff; + text-shadow: 1px 1px 1px rgba(0,0,0,0.3); + border: 1px solid rgba(0,0,0,0.3); + border-radius: 4px; + box-shadow: inset 0 -5px 45px rgba(100,100,100,0.2), 0 1px 1px rgba(255,255,255,0.2); + -webkit-transition: box-shadow .5s ease; + -moz-transition: box-shadow .5s ease; + -o-transition: box-shadow .5s ease; + -ms-transition: box-shadow .5s ease; + transition: box-shadow .5s ease; +} +input:focus { box-shadow: inset 0 -5px 45px rgba(100,100,100,0.4), 0 1px 1px rgba(255,255,255,0.2); } diff --git a/live/favicon.ico b/live/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f5ba23f3bc8ae9b6ed731bca49b08193797345a8 GIT binary patch literal 318 zcmZ`!p$Y;)5PgS&^|qJ}G#;iyJTwTF%Qo$2SPXuI!Em3TzhDrIdc_0dfX#NW`I=2I ztTTHYSbWQSZ)ay`h5(u0}+uuGXniD$oqR&?w1stpbV{S*Fu~#^qt4Q>tAP zMeXZR|9XMlkCZK9RH`BSPL{HTLMmIBQN6rTD$7XLYAo6JeVIsN zvPAZ6h$P$Cck{c`_xF$S+~?kNK4-b-o^$T=%s}rdJ1ajc0Dv8P?XnR7Ncb-jurR@& zRlgtG0GzJEUe+}6vz;G#7H9J?eqqUl(_3*Thcyc>$2=YG4Q0|q+~ryOCtRe998}44SF`p*ja*qtD$Gb1ia|cGYoyN>k)7Vf(jU zbZg@Z`K?g8#cy*WBGVHAj?KAZ&q^1|Ji4>4>J%}aZ0s;I_MRuFpvKYvUh!C*sWh8J zC}0I7yf3=VM0vP;NwsZ4GG3D4#H#a2F*q*EB2#>V{=OhZeC95pJhcAEyi3c0>MAY2 z_T}quT%779kC=S|(UX50P9f6$`N{{+iQV5z4V-~srM`Z%Jf^i?a4;yH&U zUbMJnu;)zKZrAdg@PChXr31(tls#?e+3Q8ZyGMzZ^`l=MDxMra#U-y zP}u+}#j`~!veU&su=rwU?yYxMpCJqY$#^TwBC@<@$oo~3Dc8GOTcuMs$uFh#KhNf( z@JJB4&x2iLW!}F>SQ_Ln=v}^M!4jNv>*l}w92f-HSmG?NQT?VC@!>TJN%oZH4BIk2 zmm&PLc}=W~Q8-4qMNrm-ZDomoghx z!Kt^#ANB}BqL=EiU5^^y;cC#?+XyCU4OTLV6D~9{MeqPBx@P0)CEC;f>e884EswL2 zNtdekwJt-PwtcGY-sw}9b&C0!JKgDb3Xbg-H`cFeIL4<>0)l0obLFL` zh6rr{$#v>u&kuM9Z`Rd)m_$CN28IktkC_+B<-9>K0=E5UQR=rUzjnQoL0C9#nUmY- zru`Ix1WYtRY@9`V(PYV4ur1?jdE}$TW;8z=)D%@%V&>;KHYo4PK@3_g!0%o7zjl%n zP!akoDQ=ZNAIx(No!LYCgxHN;j?1GA!MB zg-H7(r$TATBLU|^Ar0J;-JQyB^0sS8``oF61lc}sQRrvKb}g|-t@8f+ksS!kEY&?L zwVE36SqyY4-BInuJpTmU62?0bPLt;)kA#*)Ksryx;vSSuWrc3bapKbmv(mm<7UHfv z@I}hR9)8M=Z0lwMYzqRvEH7FIM;-H8yJElTs~s@t?c2zS1CRct#iel2JUzMl0bX`x zasIfatOZ)Q0`nN&hg)B$$E!Jl5VPZSe!23j1@!jFvpIZDMSXB2hIkUEPQI z_JNn?X5~1_ggX^l&4%n0MX*>mdjLqI1ay&mOp|F3giM8=FE*~SFQLT=hz;&P^c&oJ zJ&=s}aatYKAjN?v2zXuh^XuFx(IH*Jv+X-$?TQj}zc2t_EA^~f@61J!ihzw)i@xxk z(kKkt%hV3rcKaads*@O}reuGC5;t;rg_j-V0m;j>MB|5oqB2~H4MtQNcaaCmC&NMUO$2BaCzI(p|;HXvjci;pARxQCJxR=xbS)UI$=MT7x4$p8X}%QT>%J z8$yf^6L?iL%xkMEz|Dvk+mrFtsj~XO2r8_6*h`5$7&^r=uPK`5yd)qoH(Dd_y1_UW zN}HqJtk;`A4KOa7UX(jp$DnR;sYJBtUX(Df_t<<(2?-Zr1&y?8SdHQbnS%fb5mNr` z8~h55wmZf*y5eb?3xHLl3v%=$3w=zVu!=|LTcN(3D>Y|2K*lJK511Yy;M{+AT%qz8eMlc$)iRMe3P9vk zI(6{ISvqF+s668z0OTFa|E{2ku-~*x&qRV7W)WN%g#Enm9`wPAJC5Zjiu*}F%Hnyg z0hd1QHrmH)Z#SO4KOmsw@#9ZVwt^MDxX!LkcrX1+^^Eu!$8XcZ0*mSpc96d*7(4^Ag z3vV5sNPxip=}`+cVFZW)W8RC`)J5Q|=(>&OKX-5-mBCSZ!*kKNfi6c#)bWx@UL}Az z@YVV_TmBkT9%GUXbR(YG#Vr&-r}iv&rn{@(II}y{P`|6n;|nMLW>JC(1KyF7Rzh5~ z{3R&?@LY0z%e7ui27v32k4{Du6A(uv5r!l{%Z)ud(U~XOl8|YjTp}Y6o`Icq7HyMD zL;-D5&-nFJaMFHLxOiZY84|9zkjT!1KgLO`j9MrrIsy=b_c}Fvw4H?&!xl!Hq}tFF zYY#(aokx-n%f%xPb@c76ca|X_vqzs7*D#78LMF_$nZB%1Izj?0S?s0A%v{vs00zk3 z%f$>gj##BTY?J4ycE$0dy$JbC#CW!1@FVz=4 z;t-!^gM#qC6%BK@^RQx`Z01ZU&mRW>O;IMhNPriG+b|gMW^vF*!oA82z&~oc8-xdO zO@W@|RWJWyF8Ie`rBb z?PhoBBDsW}4MQFZ8P~As%H3UGO!d^lb}}c4iDE=P!*5NW zbB3TJ0oGKfX~kKbbU?-9((l3ZacW1{)xC5RVLER~HA!WC#4*(f=||ahbY<1bM2G{2 z;%yCV7h^a~D$$h3UWy7l^`Am%JXqh%o0O?wEgsti{h7W?+&!CKepy$e6W@I%;5U9{ zxIIoVOB%U(_D?Q6q78uCPiOLF1va&@?Ef0h2Dt`Ri{*X^ZBzAjZ2;KayA56lM#fE;ffH9eb!V25B^Wi zzA8E?`wM`UNEB#4%}VlMqva5Xq$BxJa1q7A@S zuyNvibc^UHwy7%uB`bMtx;aD~D$jgp6xqEo;i`RvZk`e^rc(tl@v1x!JkJUJ)k3hn z;qzUfZa-kxLKkb!a|=_%igAgPopFP4A0l|D%*|blP#!9Zi(-ch`pMot@^FH=RhOwe z-TfYzDhoK&Ba}Pjjp>g(?VndBY{2>IqA1ouK{}#~%AyX{h>A{m-2}S6<=VV&svU#` zqKQ%^GV~>REG|xSir}dA`Tsqimp_cnlQ-`rIxeSMIWhJ?@#Rr3Am_1eP`iCcrbf45dxamlzM5I#zm<665> z`4!w=$Lj}CKFsui=!W<~IRU(mPxTEtB`=w{b5{_*=iZ9XNSmVQ6N(!K__x?eSEW_{ z_nbH-`u#LWvXQ_Z{rHydjyHJP`@cdkdD~(*1blvAp%>|mP_|QLq0j;688>{8K{SUJD|!py@5@BGA)wRX9aNNzppkEV4>QrB!&c{MAO3m==oMTy zmO;>EbXGZ`%}8nFKlt~p;0t8ufPzie(*K?#IbA$Ql)$uw+6%~59FaVgxP1iQe%idN zlK(Hcc6Jx95k=5!>Fg%`mz=9gUNR%)de2`W&(0b{YkNoOnOvZ2LD^6-Vzv}hM|X>t|9J*cr|AM{D#$XmKdG)me;A5Z-+W( zarB3bm%31$ZqL4bucxntIPbS90Wr&>aOf1`hygFfm*GSG|C>v0-J9+!gHH1zdi8V@ z5?{idxrB(pU)?r8UOQQ!wAJaGb{!o3i>VpEk>Uua8Sbdld8P}wRsm$>Arqy5&t zUN_mt?HZ2TL^4YHOYx+%r%}Du`IG3DiRbrAzmxxLq~!!xoyiv4HVWqe`R1YenRJ1c z(L&kRz^jL8A1yzMik5Ciec)%+xmeegfpToo(Tm7X(9`4GP@35hD9XxA200R(Z82?b zya&_VJOM{}Nmd>(+Yxegwesn<+l~AqCLX6?Tf5zClCLf|&}a99=(&DwwthS4#RX8S z*|Ilp(6K|)+rCmNj0`OQgT%DH9vwbe>+pEBw^!Fa`0Dq=F*1ipHuEEu-gmf>eQbi(fNJojZ z@y)K;W$3TknyKckdq-UvhHvN45EYTa+7y>eO-qy+a*WNG{z$?U_z`1^0tZ?JO|1{+W>CQ@fQz`dimDdMT>lD`% zO8rB!4w71zNnxej9zhE8(p_3|M#PjC z?`r8fc7%_pjjBp>h<%%7i3ExO9$j^00equR9U4%caxRx{cM(g@U65*P_uQ7k-Li69 zN;9!2&u}E}S)IIkLi~bSDsI+KS4HdlrjcZj8%@2}Z6Apo~*Upo~mUx>-=3@_^ zCe@sfyEPRxN<5wvzwq5sD7m*nB`Bj@OJhct47kP^l?_xW3zIALD~y;tCo{eCZZ+pJ zB;1(SL^5L(>V9M&EF!P}UCMi_8wx0LbK0;a3b{+f;53@eosC4n0`1P0v1_?1fyl3Co{`oFr+$WC3v&Y`V zH5r=kjp(t04cezcoNe}`WL~HGaCXOoRdESCsVGa$Z=2)q%bh(>Pu&LN{r>VIJ>fgE z=0-r^N!QrRbRd}i6bRl8=&Bzuzet(<;U?63F6Sf&kV>l*m4e5CD|Sa*lVrYiDlJxo z<#G6tk{m+zCJJt|p@xCFZg$d*i2SEuaeJ|c$ne;jzl)JuQ4)bcc+K4;`HM;bPveWA z*xTrf>BVu}=4|XeWD}o(VQQStUb8W{h-r;o|0?zAP>jy@=4aa`p-yf#VU;K()eH>^ zuIeodp#?d-6i?nf2#zxhhp}T=-XtDQO*QJp{$%2H!RR~rEl0w`v+pw2nD;)WSa#|H zA12^xnf^T{7$P#}E|XjbpOg1!Cof*LI)Qo1wJNbddV(jnqQuQm8&n5EF#0z;c;!trv-1QsqGS2WsO`sH`_EwU_NChlzvN+ghFP6m&0&Z!wU``R zl5&gVYsDaI=Ufc$eTptV-K*EL6!FHjMdBAeCp#C!r{*Z5v{_e&y*g^{^5QSV7}%r0 zrY80tGc0gW<)*+{3V|=l&PBwAPjDRLko44}~~7BB$&K$kR|B#u|v7m>F$W(*DxX$!AIrL;)H75K@N_Y4@0DccK0Rc};Sb4ZD=9Oj>d4;TOycsdx zg1Y@z5TL;MTEHzEL3M%W)5AVC6}KLTBKO$w>+?JS)H===<3_t6Tj8Nil1 zF#T%4t=f`1BH_R+WPVBh5D15S*tc1Bhon7jfgt)F!7ot&!CZL#*wJEtyFx}Eh;-2m-v zAJH^6##Ul$yZe=_z-B=1q}wWpc_LDp0IRowSoBl5U`Y!gzu*RX&tE)D0AIpI&(dN)!x9fRPlqR=zJVW0C$=A^ z-oU_!a`Fy*4_e2WL^NUgmWs(EYNBD~K%M*=dye=SzRLT_a9{}j0{v%F@GmLW_km7j+fQXE5 z<1a=E8VzR-BQ47O5q^ePIERta@mFAc%ultr0=g{JDfLSDcEHGxPPKWWWgrLe9J~}o zkSK#B+m~8>SnczlOL5cadJmBMkn zHP~=h4ZJ&sv)q>Uf5D1R+v_5u!b_&N-#(yK)$nVky*ETsJkNvQqu-&d?}+Vr&1j(y zhKNI7xx~9dQLYXHhH8l08(p(=AT>m26!~A@eaIlSX$hAtQ=axd z6tWc5`LeVyxP~;4UcI(m$`7&L_U#tnT&P>>u{jOih4oy6x&Wyejy~mJ_ZmA?`MJvd zzHCE~T##cri2(TLKbc%BeHVfe;zuN-jvLa44tV@>dPJ)~_a1rZB zbbuXMW&PICGJ6(GX ziQQ0XRUIuYl>$u-Ojr#w*e1hs$QCbC7XFoWhXvATErFXCfoWb8?x}fny6^YRvHkFM zEAy_rOIddx=j}~jyi zKwMu9c)DN;V=-w4H};w@8%e#SlR}Reo8B<7>v&-Umndon7(9e}JYO>>Rkm+u+J-!| zN8cJ=n;qqjU#ftb;|#s&MH-;_H&@$Mf9=bIJH2OM4Np94B1XyzitH8b^KoCLUQbz_ z?{PB#=ZC);sqWzJUQh&Ae6wMrjY3Tsa{6Nmju%SzynzbPjkIe$KRP{Y4wV*8R6XYm ziSx*=q?GN;_T+-6b#4;bzo1eaTpt?8k$;p!x6Oav_MHTPeNmi^|Fw+)sGR5{B$V<&@#PxP}O|4d466SFS7aTz|$kvy>8WTBYnB|60Gb93Z{z~6Y5TxCTcZ5Fj?jP5Xr~`l$ zO*0>?r5R1IVl0s1Q47Y8;nwaUpH_YU==-gn*V)_EKjbqZI8yY77Ta~Uct;ozp?gKd zK(W59u8gcyA63^z^iSR=@P?lOz&q01)werC@-p0k0q7v3GfaRatwB@Rp>$}&X5)y{ zRw=!K=A%?w*s|2ocSIbXMTdU&L2!awk3QC}o4*5hsu|Qy%~*#Yh8pp&OoN8sR^nqN zt=o9a7(?w+$cABYDmJQ`kOM)x$_g?i9sigvJm`+o5eK68qo*X`{TtxiUwd)ih?aWz zJ+!qGcG^v=LVfq+1bb_L+d?+KZ5+0u`JsVi z@-);&b%pb7=%O&4O!7SNLj>-hDJ2`{Y}y(ReuU;o6>_6%fx3drY{&?f0PplI2vQRO z1kSlcCBSb3p3;MF+=Ie@pg9JDyBnTVAKi~d8jNsxr4Sb-prYUWaf%ZvolGbH5D8Qu zytIfcx^8lbH0-R!^ET;3T3Be$rd*?tLC}ex6|oYw>wY~f(7qP$+Vk$CgY4K5XT8J4 zpXam9>I#^PX`ZgrFb% zNe?|$74LidxdDt->R8%sKC>jaQDzbIX3|4KijkVDrpV( zl8w=RZshh>Y4G=&#? z^!6Q?6;62;)-G=l*%(vz(G=CF1rv4zkQ?dP+xm@Gviau{;=jn3R>|fti-R)@8rzP4 z{O=vKTWyqH>1t*;0M}GJjvCr<>9K8>4;1gWXL^dp z@bT^0H1Ii_Atz?_I5`03Dx{v;iCkVUi1|{l z0e~j48{OKhf6!_GqNde!44)yvn@Oi${q>?9cXuBA)7s;kHC%rkgUQ9O(tmt57+#6R z;n$+{3UZ8c5TGd1yl`i~d4P|Gi+uqZ>JHKBbQ$Mv;H4o9B9&p+s7r#N*@UD=l3HUKbHUNt-_G-Z5#Ce?N9mQv z{OAN=A$=UT_gcrJN>h}+B+#xao)FH@1xT;&Y%1ZlGNG@0G)#s3>m+87I;o*3P_VMM zs2r`DnY|aX6wZDeiZ%0RTboqQb;G?eAIj|;y?UQ)lYZkhS8S`dm za6$`#xhW;uYJW4Wqc98Jhu=Y}OU)b%&s_4b68n`QIqRn_58lixU9g=W*N1R!=pFcv zerf*mI4$mysVEP;QZbFe|3;7oanhk0jQAmha4|y+{x(cuaSo;H84%|Yo%3Tx?-+h? z19%-=xw9Czn_{f+MI6-pvso{V)+Y5Mfp7P~zFppQb}+m;Ke(Mj(1fD^cy?3k)mg)K z4S=%Z=4BmWwEcBJ$qqKZJmY7_3WN^@#HEFC8K{EIWZLk9SuMle0!~J}{sCI86E8Zo z3W&`5#a4bKoc*wkh11a#32c~Eat4D5Gd-KuwB8ZEZ?W;-Q@lYO_Q{W;g*+s#lrq$m zYia{5;YeS+wft2=Ul^sL^CjJMOu3 zxbb;xake;}tgU(a?l(Ad1sW(P=7(z~dIk-E^Y+&CIyE6(sH>J*uFW=zgq@~=n}@%i znwkGwf7boPg^es~=s#;@g86DvRAj-f0yY8GYKvpCBikWF&c7I4vCLM-pFM(7(__b? z$x5A1&f*0mBPIr~5EWT|!}Gv|1rpeojs3XLNY*cm-rFb2;9WrHz{7B2wRG-1|5Gp- zSW5b-G-f|Wr4h?ecYuNPuxz1hC0v$8~1U+ z#bavZ(M6oa2L=yBYVmAPlt*caQY%C+I8z-rR$lS1y5!}5Zqu!znRtX1jR?Yu5Kb~9u9!beF|IUOjT_(=NEeN~Zv z!0}aq!Nv|;=KA9L6L!GNEM#99tBYX(iBmMyN1cnh4ywDKnDBQ=*ryF%V1mGxG zev5P4#xs8-NZWypF551q%UWj4fm_ZDTwg09&yDPtUv=1oeHM6PmmhLqABhsL=1KBMiwP67X(FxyBCKO^+<6j@z6#_?3`Ar^JjRSx^yCjlx9C za&{~y{4X)l5~ME_4-I1;v6m=3a7+e@H&BIZvEC&_ei7WaN0AimZT+k%7)69AB6UP} zqm6ohx<5N;BTEy0$PoVT*tNHwTTjzo>XOz0RVnG$M&pIO^mRY>zdYs6*2qwU6%h$2 zxi+%QJXJoUW6`$aav}V3OpC&TjgVnR*D-*c9VNYu`*Fu%7#ricPdNgqHlGx_we`wL zOWuu5F%jyDqMiiI$xu3O{|jLP;!Onfo|WQYA00s^}L1#T;1D z>E4~&Yt#GlUVN_!ZW3{1GSOHj&gz#jG7EKVG5wL)qXFxcNZ+)PpTb5@Ly(}A^g2r2 zL#1WH2ziCsOWL?*Zuyz*uVNoFTAQ2PU*(GJwv#Lgf@u3@Skuren9}MQMi@eNITe)Y zGQ1I=5hX-O3&r4bL(I46rO@|3>H9PE9*4;{JQ9Rsw7XgeD>BVii6`SgY9l!(9+p(! zR7W%B_k&Zo;1^U>#)kVc!bR70j1B;?^?|)TG_1>7iMV+9VH$Ovbb!EV9a-*o54MmU z;^&;qBYnHerv(=WmDJlfAppKNr)Ltq&dQzTK!dSfL>@J z7nN@B_i2@e+OXq2oZ8qXefPd`xr@-^ijQYK(GUeq#Ws1ew%I$tFIz;oi3`|{%~Ff< zpWinggC+W!;%Z-37W`09*=Mu%CZF=CHm1xL4V!YAjbv%}``u$LDx=e1e)-u#VOuc~ z#Arh7P6v*NoBHlxNI$JQ?ObQ~c9tV?N$h)5S)6c|w8~tRCA`C=-$KG0vbO^QF*i&P zS7c~>*Oe__+rI?s>veh?K*}3(?PuGp7y9E*t7`3xpOtD{F*jwh(%~5~yjY#^r@Uw1 z^X&~<0$-(F;iGMon;>8We)F079e!!UxYw~E(Y-Ou(>Wj6wg!=}?hV5X%fGT`O&H>h zn~SY=;Sq+@Yiuh@e)ta4FW36u{aM-Avmi~&7F2WBLb_5}<;M(2eirsoPE9|&0Fkq5 z&K6%1XfMbmY4poHLCtT4EIBcTi`jO&!`_aSAgx@b`H}KZKi>gVU_NUq%--mCOm~zM z4b8lEF$U^??|4F63xqSjlR^X2+H_?+VUKBkY$IcGRCQu!6XGF-f5_XeHl6y^t;Cd8 zznB~IYp|H%?vaf5nD3vm{b7v(b8%ZY@0zQ{ksC5QU)wuO72qoP1;bz&a>e%an(!FB zRdG$TPf2d2IzCDlQBX|7*U#PU&u>%RkD&L|<|{OGTlQX$)GxyF9)3)$`>DifDug@t zkYM-GnDz1@=Ce7+&c*sv@_2RBHR;~H1N(cB)r~LrgmqeiNXhNA5AQjkWHk?|^xKY* z)If@tf&UP^!|=C=jenx)--R*YD=#$C-e7JCoa-!{6wFWb-5bprR&Z?&LQhrT%G74b zTcu(y*gGk$%;NCV8SXpAaznOP)iPzp7d@No7eA%SlUW--@27Tk3CDN~JSo!PF-g3# zGdsc*Fd*-U3WBZDCwq_Lo0w`=5@k2A`t8xG7DFfqNgUn~ z$j1vTKaO1cDaq>X#5m)9h&ZQYWB5vvF~o(oPEH7x39)8HW)MjdL!POaWWmZv?tV{7 z>&J>n#l2REYNMumiBVDm^+{2pv1-kH)Tukv$-Gir{jV0wag~6c*y112D^YuOhxTO0 b5u3Ogm*!0yS7n%J1Ax`iyPS8?{_+0-{QMFL literal 0 HcmV?d00001 diff --git a/live/js/bundle.js b/live/js/bundle.js new file mode 100644 index 0000000..43a7c00 --- /dev/null +++ b/live/js/bundle.js @@ -0,0 +1,3659 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i