commit 9e2c07ba38c5785676eb90e2c89c7b486cd6fab8 Author: Martin Donnelly Date: Wed Dec 11 00:07:07 2019 +0000 init 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 0000000..f5ba23f Binary files /dev/null and b/live/favicon.ico differ diff --git a/live/gfx/recipes.png b/live/gfx/recipes.png new file mode 100644 index 0000000..ab9c17d Binary files /dev/null and b/live/gfx/recipes.png differ 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