From c1c08ee5b437c064910ceecd3a655791d254d545 Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 27 Mar 2018 00:41:22 +0100 Subject: [PATCH] Starting v2 properly --- .eslintrc.json | 55 ++++++++++ .gitignore | 173 +++++++++++++++++++++--------- gulp/backbone.js | 46 ++++++++ gulp/build.js | 85 +++++++++++++-- gulpfile.js | 78 +------------- keeper-serverV2.js | 2 +- package.json | 35 ++++-- src/v2/css/app.scss | 237 +++++++++++++++++++++++++++++++++++++++++ src/v2/css/custom.scss | 25 +++++ src/v2/css/md.scss | 53 +++++++++ src/v2/gfx/fm.png | Bin 0 -> 10136 bytes src/v2/index.html | 98 +++++++++++++++++ src/v2/js/app.js | 12 +++ 13 files changed, 752 insertions(+), 147 deletions(-) create mode 100644 .eslintrc.json create mode 100644 gulp/backbone.js create mode 100644 src/v2/css/app.scss create mode 100644 src/v2/css/custom.scss create mode 100644 src/v2/css/md.scss create mode 100644 src/v2/gfx/fm.png create mode 100644 src/v2/index.html create mode 100644 src/v2/js/app.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..537ab8c --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,55 @@ +{ + "parserOptions": { + "ecmaVersion": 2017, + "sourceType": "module", + "ecmaFeatures": { + "jsx": false + } + }, + "env": { + "browser": true, + "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, 120, 2], // 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 index a57e42e..a02038c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,62 +1,17 @@ # Created by .ignore support plugin (hsz.mobi) -### JetBrains template -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio - -*.iml - -/dist -## Directory-based project format: -.idea/ -# if you remove the above rule, at least ignore the following: - -# User-specific stuff: -# .idea/workspace.xml -# .idea/tasks.xml -# .idea/dictionaries - -# Sensitive or high-churn files: -# .idea/dataSources.ids -# .idea/dataSources.xml -# .idea/sqlDataSources.xml -# .idea/dynamic.xml -# .idea/uiDesigner.xml - -# Gradle: -# .idea/gradle.xml -# .idea/libraries - -# Mongo Explorer plugin: -# .idea/mongoSettings.xml - -## File-based project format: -*.ipr -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties ### 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 @@ -64,17 +19,129 @@ 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 (http://nodejs.org/api/addons.html) +# Compiled binary addons (https://nodejs.org/api/addons.html) build/Release -# Dependency directory -# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git -node_modules +# Dependency directories +node_modules/ +jspm_packages/ -/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 + +# Elastic Beanstalk Files +.elasticbeanstalk/* +!.elasticbeanstalk/*.cfg.yml +!.elasticbeanstalk/*.global.yml +/src/bundle.js +/src/bundle.js.map +/live/ diff --git a/gulp/backbone.js b/gulp/backbone.js new file mode 100644 index 0000000..941c3ab --- /dev/null +++ b/gulp/backbone.js @@ -0,0 +1,46 @@ +'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'); +var bump = require('gulp-bump'); + +const version = 'v2'; + +gulp.task('bundleBackbone', function () { + // set up the browserify instance on a task basis + const b = browserify({ + 'debug': true, + 'entries': `./src/${version}/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')); +}); + +gulp.task('bump', function() { + gulp.src('src/service-worker.js') + .pipe(bump({ 'key': 'version' })) + .pipe(gulp.dest('src')); +}); + +gulp.task('buildBackbone', ['bump', 'bundleBackbone'], function() { + gulp.watch(`src/${version}/js/**/*.js`, ['bump', 'bundleBackbone']); +}); + diff --git a/gulp/build.js b/gulp/build.js index 8f7a7b3..26a3400 100644 --- a/gulp/build.js +++ b/gulp/build.js @@ -1,13 +1,80 @@ -'use strict'; +const gulp = require('gulp'), -var gulp = require('gulp'); + autoprefixer = require('gulp-autoprefixer'), + cssnano = require('gulp-cssnano'), + uglify = require('gulp-uglify'), + rename = require('gulp-rename'), + concat = require('gulp-concat'), + cache = require('gulp-cache'), + htmlmin = require('gulp-htmlmin'), + inject = require('gulp-inject'), + del = require('del'), + htmlreplace = require('gulp-html-replace'); -function handleError(err) { - console.error(err.toString()); - this.emit('end'); -} +const scss = require('gulp-scss'); +const sass = require('gulp-sass'); +const googleWebFonts = require('gulp-google-webfonts'); -gulp.task('clean', function () { - return gulp.src(['.tmp', 'dist'], { read: false }).pipe($.rimraf()); -}); \ No newline at end of file +const fontOptions = { }; + +const version = 'v2'; +const src = `src/${version}`; + +gulp.task('styles', function() { + return gulp.src(['node_modules/backbone.modal/backbone.modal.css', 'node_modules/backbone.modal/backbone.modal.theme.css']) + .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4')) + + /* .pipe(gulp.dest('dist/css'))*/ + /* .pipe(rename({suffix: '.min'}))*/ + .pipe(concat('style.min.css')) + .pipe(cssnano()) + .pipe(gulp.dest('live/css')); +}); + +gulp.task('copy', function() { + gulp.src([`${src}/img/**/*`]).pipe(gulp.dest('live/img')); + gulp.src([`${src}/gfx/**/*`]).pipe(gulp.dest('live/gfx')); + gulp.src([`${src}/browserconfig.xml`, `${src}/site.webmanifest`, `${src}/service-worker.js`, `${src}/bridger.js`]).pipe(gulp.dest('live')); + gulp.src([`${src}/index.html`]).pipe(gulp.dest('live')); +}); + +gulp.task('clean', function() { + return del(['live']); +}); + +gulp.task('customMUI', function() { + return gulp.src([`${src}/css/custom.scss`]) + .pipe(sass({ 'outputStyle': 'compressed' }).on('error', sass.logError)) + // .pipe(cssnano()) + .pipe(rename('mui.custom.css')) + // .pipe(gulp.dest(`${dest}/css`)); + .pipe(gulp.dest('live/css')); +}); + +gulp.task('vendor', function() { + return gulp.src([ + 'node_modules/muicss/dist/js/mui.min.js' + ]) + .pipe(concat('vendor.js')) + + /* .pipe(uglify({ 'mangle': false }))*/ + .pipe(gulp.dest('live/js')); +}); + +gulp.task('fonts', function() { + return gulp.src('src/fonts.list') + .pipe(googleWebFonts(fontOptions)) + .pipe(gulp.dest('live/fonts')) + ; +}); + +gulp.task('gotham', function() { + gulp.src(['fonts/gotham.css']).pipe(gulp.dest('live/fonts')); + gulp.src(['fonts/GothamSSm-Black.otf', 'fonts/GothamSSm-Bold.otf', 'fonts/GothamSSm-Book.otf', 'fonts/GothamSSm-Light.otf', 'fonts/GothamSSm-Medium.otf']).pipe(gulp.dest('live/fonts')); +}); + +gulp.task('fujicons', function() { + gulp.src(['fonts/fujicons.css']).pipe(gulp.dest('live/fonts')); + gulp.src(['fonts/fujicons.ttf']).pipe(gulp.dest('live/fonts')); +}); diff --git a/gulpfile.js b/gulpfile.js index bca730a..71232d1 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,77 +1,7 @@ -"use strict"; -var gulp = require('gulp'), +const gulp = require('gulp'); - autoprefixer = require('gulp-autoprefixer'), - cssnano = require('gulp-cssnano'), - jshint = require('gulp-jshint'), - uglify = require('gulp-uglify'), +const requireDir = require('require-dir'); - rename = require('gulp-rename'), - concat = require('gulp-concat'), - notify = require('gulp-notify'), - cache = require('gulp-cache'), - livereload = require('gulp-livereload'), - htmlmin = require('gulp-htmlmin'), - inject = require('gulp-inject'), - del = require('del'), - htmlreplace = require('gulp-html-replace'); +requireDir('./gulp'); - -var filePath = { - build_dir: './dist' -}; - -gulp.task('scripts', function() { - return gulp.src('app/js/**/*.js') - .pipe(jshint('.jshintrc')) - .pipe(jshint.reporter('default')) - .pipe(concat('main.js')) - /*.pipe(gulp.dest('dist/js'))*/ - /*.pipe(rename({suffix: '.min'}))*/ - .pipe(concat('app.js')) - /*.pipe(uglify({mangle: false}))*/ - .pipe(gulp.dest('dist/js')); -}); - -gulp.task('styles', function() { - return gulp.src(['app/css/app.css','app/css/md.css','app/css/read.css','app/css/gist.css']) - .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4')) - /*.pipe(gulp.dest('dist/css'))*/ - /*.pipe(rename({suffix: '.min'}))*/ - .pipe(cssnano()) - .pipe(concat('app.css')) - .pipe(gulp.dest('dist/css')); -}); - -gulp.task('partials', function() { - - gulp.src(['app/partials/**/*']).pipe(gulp.dest('dist/partials')); - gulp.src(['app/libs/ejs_production.js']).pipe(gulp.dest('dist/libs')); - gulp.src(['app/libs/microevent.js']).pipe(gulp.dest('dist/libs')); - gulp.src(['app/fav/**/*']).pipe(gulp.dest('dist/fav')); - gulp.src(['app/gfx/**/*']).pipe(gulp.dest('dist/gfx')); -}); - - - -gulp.task('index', function () { - var sources = gulp.src(['js/apps.js', 'css/app.css'], {read: false}); - - return gulp.src(['app/index.html']) - .pipe(htmlreplace({ - 'css': 'css/app.css', - 'js': 'js/app.js', - 'vendor': 'libs/ejs_production.js' - })) - .pipe(htmlmin({removeComments: true, collapseWhitespace: true, keepClosingSlash: true})) - .pipe(gulp.dest('dist/')); -}); - -gulp.task('clean', function() { - return del(['dist']); -}); - - -gulp.task('default', ['clean'], function() { - gulp.start('styles', 'scripts','partials','index'); -}); +gulp.task('default', ['bundleBackbone', 'styles', 'copy', 'customMUI', 'vendor', 'fonts', 'gotham', 'fujicons']); diff --git a/keeper-serverV2.js b/keeper-serverV2.js index f761b2a..1cf22a8 100644 --- a/keeper-serverV2.js +++ b/keeper-serverV2.js @@ -22,7 +22,7 @@ app.use(bodyParser.urlencoded({extended: true})); app.use(cookieParser()); //app.use(express.static(path.join(__dirname, 'dist'))); -app.use(express.static(path.join(__dirname, 'app'))); +app.use(express.static(path.join(__dirname, 'live'))); app.use('/', keeper); diff --git a/package.json b/package.json index 113db85..a18bae8 100644 --- a/package.json +++ b/package.json @@ -10,41 +10,56 @@ "author": "", "license": "ISC", "dependencies": { + "backbone": "^1.3.3", "body-parser": "^1.15.0", "cheerio": "^0.20.0", "cloudant": "^1.6.2", "cookie-parser": "^1.4.1", "ejs": "^2.4.1", "express": "^4.13.4", + "jquery": "^3.3.1", "morgan": "^1.7.0", + "muicss": "^0.9.38", "nano": "^6.2.0", - "require-dir": "^0.3.0", + "require-dir": "^0.3.2", "serve-favicon": "^2.3.0", "string": "^3.3.1", + "underscore": "^1.8.3", "url": "^0.11.0" }, "devDependencies": { "babel-eslint": "^7.2.3", - "del": "^2.2.0", + "browserify": "^16.1.1", + "del": "^2.2.2", "eslint": "^4.1.1", "gulp": "^3.9.1", - "gulp-autoprefixer": "^3.1.0", - "gulp-cache": "^0.4.2", - "gulp-concat": "^2.6.0", - "gulp-cssnano": "^2.1.1", - "gulp-html-replace": "^1.5.5", + "gulp-autoprefixer": "^3.1.1", + "gulp-bump": "^3.1.0", + "gulp-cache": "^0.4.6", + "gulp-concat": "^2.6.1", + "gulp-cssnano": "^2.1.2", + "gulp-google-webfonts": "^1.0.0", + "gulp-html-replace": "^1.6.2", "gulp-htmlmin": "^1.3.0", - "gulp-inject": "^4.0.0", + "gulp-inject": "^4.3.1", "gulp-jshint": "^2.0.0", "gulp-livereload": "^3.8.1", "gulp-notify": "^2.2.0", "gulp-rename": "^1.2.2", - "gulp-uglify": "^1.5.3", + "gulp-sass": "^3.2.1", + "gulp-scss": "^1.4.0", + "gulp-sourcemaps": "^2.6.4", + "gulp-strip-debug": "^3.0.0", + "gulp-uglify": "^1.5.4", + "gulp-uglify-es": "^1.0.1", + "gulp-util": "^3.0.8", "html-to-markdown": "^1.0.0", "jshint": "^2.9.1", "jsonfile": "^2.2.3", "log4js": "^0.6.31", - "simplecrawler": "^0.6.2" + "simplecrawler": "^0.6.2", + "vinyl-buffer": "^1.0.1", + "vinyl-source-stream": "^2.0.0" }, "jspm": { "dependencies": {}, diff --git a/src/v2/css/app.scss b/src/v2/css/app.scss new file mode 100644 index 0000000..e98159b --- /dev/null +++ b/src/v2/css/app.scss @@ -0,0 +1,237 @@ +html, +body { + height: 100%; + background-color: #eee; +} + +html, +body, +input, +textarea, +buttons { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.004); +} + + +/** + * Layout CSS + */ +#header { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 2; + transition: left 0.2s; +} + +#sidedrawer { + position: fixed; + top: 0; + bottom: 0; + width: 200px; + left: -200px; + overflow: auto; + z-index: 2; + background-color: #fff; + transition: transform 0.2s; +} + +#content-wrapper { + min-height: 100%; + overflow-x: hidden; + margin-left: 0px; + transition: margin-left 0.2s; + + /* sticky bottom */ + margin-bottom: -160px; + padding-bottom: 160px; +} + +#footer { + height: 160px; + margin-left: 0px; + transition: margin-left 0.2s; +} + +@media (min-width: 600px) { + #header { + left: 200px; + } + + #sidedrawer { + transform: translate(200px); + } + + #content-wrapper { + margin-left: 200px; + } + + #footer { + margin-left: 200px; + } + + body.hide-sidedrawer #header { + left: 0; + } + + body.hide-sidedrawer #sidedrawer { + transform: translate(0px); + } + + body.hide-sidedrawer #content-wrapper { + margin-left: 0; + } + + body.hide-sidedrawer #footer { + margin-left: 0; + } +} + + +/** + * Toggle Side drawer + */ +#sidedrawer.active { + transform: translate(200px); +} + + +/** + * Header CSS + */ +.sidedrawer-toggle { + color: #fff; + cursor: pointer; + font-size: 20px; + line-height: 20px; + margin-right: 10px; +} + +.sidedrawer-toggle:hover { + color: #fff; + text-decoration: none; +} + + +/** + * Footer CSS + */ +#footer { + background-color: #0288D1; + color: #fff; +} + +#footer a { + color: #fff; + text-decoration: underline; +} + +/** +* Side drawer CSS +*/ +#sidedrawer-brand { + /* padding-left: 20px; */ +} + +#sidedrawer ul { + list-style: none; +} + +#sidedrawer > ul { + padding-left: 0px; +} + +#sidedrawer > ul > li:first-child { + padding-top: 15px; +} + +#sidedrawer strong { + display: block; + padding: 15px 22px; + cursor: pointer; +} + +#sidedrawer .entry:hover { + background-color: #E0E0E0; +} + +#sidedrawer strong + ul > li { + padding: 6px 0px; +} +#sidedrawer .entry { + padding: 7px; + + cursor:pointer; +} + +/*#sidedrawer .entry:after { + font-family:Linearicons-Free;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale; +float:right; + content:"\e87a" +}*/ + + + +#footer, .mui-appbar { + background-color: #62849C; +} + + +a.tag{ + float:left; + margin-right:8px; + padding:2px 7px 3px 19px; + font:700 .7em "lucida grande", helvetica, arial, sans-serif; + color:#3d5295; + text-decoration:none; + text-shadow:0 1px 0 rgba(255,255,255,.5); + border-radius:0 .4em .4em 0; + background: + -moz-linear-gradient( + -45deg, + transparent 50%, + #d0daf7 50% + ), + -moz-linear-gradient( + 45deg, + transparent 50%, + #d0daf7 50% + ), + -moz-linear-gradient( + #d0daf7, + #d0daf7 + ); + background: + -webkit-gradient( + linear, + 0 0, 100% 100%, + color-stop(.5,transparent), + color-stop(.5,#d0daf7) + ), + -webkit-gradient( + linear, + 0 100%, 100% 0, + color-stop(.5,transparent), + color-stop(.5,#d0daf7) + ), + -webkit-gradient( + linear, + 0 0, 100% 0, + from(#d0daf7), + to(#d0daf7) + ); + background-repeat:no-repeat; + background-position:0 0, 0 100%, 10px 0; + background-size:10px 53%, 10px 50%, 100% 100%; + -moz-padding-start:14px; + -webkit-mask-image:-webkit-gradient( + radial, + 11 50%, 2.9, 11 50%, 3, + from(transparent), + to(rgba(0,0,0,1)) + )} +a.tag:hover { + opacity:.8} \ No newline at end of file diff --git a/src/v2/css/custom.scss b/src/v2/css/custom.scss new file mode 100644 index 0000000..c968681 --- /dev/null +++ b/src/v2/css/custom.scss @@ -0,0 +1,25 @@ +// import MUI colors +@import "./node_modules/muicss/lib/sass/mui/colors"; + +// customize MUI variables +$mui-primary-color: mui-color('blue-grey', '500'); +$mui-primary-color-dark: mui-color('blue-grey', '700'); +$mui-primary-color-light: mui-color('blue-grey', '100'); + +$mui-accent-color: mui-color('deep-purple', '900'); +$mui-accent-color-dark: mui-color('indigo', 'A100'); +$mui-accent-color-light: mui-color('indigo', 'A400'); + +$mui-base-font-family: 'Roboto', "Helvetica Neue", Helvetica, Arial, Verdana, "Trebuchet MS"; +$mui-base-font-weight: 400; + +$mui-appbar-font-color: mui-color('black') !default; + +$mui-link-font-color: mui-color('yellow', '900') !default; + +// import MUI SASS +@import "./node_modules/muicss/lib/sass/mui"; +//// + +@import "./src/v2/css/app.scss"; +@import "./src/v2/css/md.scss"; diff --git a/src/v2/css/md.scss b/src/v2/css/md.scss new file mode 100644 index 0000000..823b88d --- /dev/null +++ b/src/v2/css/md.scss @@ -0,0 +1,53 @@ +body { + font-family: 'Roboto Slab', "Helvetica Neue", Helvetica, Arial; +} +ul { + margin: 0; + padding: 0; +} + +li { + display: inline; + margin: 0; + padding: 0 4px 0 0; +} + +.dates { + padding: 2px; + border: solid 1px #80007e; + background-color: #ffffff; +} + +#btc, #fx { + font-size: 75%; +} + +.up, .ontime { + color: darkgreen; +} + +.down, .delayed { + color: darkred; +} + +.nochange { + color: #000000; +} +.password { + border: 1px solid #cccccc; + background-color: #efefef; + font-family: monospace; + white-space: pre; +} + +.mui--text-danger { + color: #F44336; +} + +.fnBlock { +font-size:20px; +} + +.fnRefresh { + +} \ No newline at end of file diff --git a/src/v2/gfx/fm.png b/src/v2/gfx/fm.png new file mode 100644 index 0000000000000000000000000000000000000000..f77b34dd663653892223b42b6a36047d5ab97a4a GIT binary patch literal 10136 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 + + + + + + Jubilee + + + + + + + + + + + + + + + + + + +
+
Keeper
+
+
+ + + + + + +
+ +
+
+ +
+
+
+ + +
+
+ +
+
+ + +
+ +
+
+
+
+
+ Made with  by Martin +
+
+ + + + + + + + + + + + + diff --git a/src/v2/js/app.js b/src/v2/js/app.js new file mode 100644 index 0000000..24d270a --- /dev/null +++ b/src/v2/js/app.js @@ -0,0 +1,12 @@ +/** + * + * User: Martin Donnelly + * Date: 2018-03-26 + * Time: 20:49 + * + */ + +require('muicss'); +const $ = require('jquery'); +const _ = require('underscore'); +const Backbone = require('backbone');