├── .bowerrc ├── .editorconfig ├── .gitignore ├── .io-config.json ├── README.md ├── bower.json ├── config.xml ├── gulpfile.js ├── hooks ├── README.md └── after_prepare │ └── 010_add_platform_class.js ├── ionic.project ├── package.json ├── resources ├── android │ ├── icon │ │ ├── drawable-hdpi-icon.png │ │ ├── drawable-ldpi-icon.png │ │ ├── drawable-mdpi-icon.png │ │ ├── drawable-xhdpi-icon.png │ │ ├── drawable-xxhdpi-icon.png │ │ └── drawable-xxxhdpi-icon.png │ └── splash │ │ ├── drawable-land-hdpi-screen.png │ │ ├── drawable-land-ldpi-screen.png │ │ ├── drawable-land-mdpi-screen.png │ │ ├── drawable-land-xhdpi-screen.png │ │ ├── drawable-land-xxhdpi-screen.png │ │ ├── drawable-land-xxxhdpi-screen.png │ │ ├── drawable-port-hdpi-screen.png │ │ ├── drawable-port-ldpi-screen.png │ │ ├── drawable-port-mdpi-screen.png │ │ ├── drawable-port-xhdpi-screen.png │ │ ├── drawable-port-xxhdpi-screen.png │ │ └── drawable-port-xxxhdpi-screen.png ├── icon.png ├── ios │ ├── icon │ │ ├── icon-40.png │ │ ├── icon-40@2x.png │ │ ├── icon-50.png │ │ ├── icon-50@2x.png │ │ ├── icon-60.png │ │ ├── icon-60@2x.png │ │ ├── icon-60@3x.png │ │ ├── icon-72.png │ │ ├── icon-72@2x.png │ │ ├── icon-76.png │ │ ├── icon-76@2x.png │ │ ├── icon-small.png │ │ ├── icon-small@2x.png │ │ ├── icon-small@3x.png │ │ ├── icon.png │ │ └── icon@2x.png │ └── splash │ │ ├── Default-568h@2x~iphone.png │ │ ├── Default-667h.png │ │ ├── Default-736h.png │ │ ├── Default-Landscape-736h.png │ │ ├── Default-Landscape@2x~ipad.png │ │ ├── Default-Landscape~ipad.png │ │ ├── Default-Portrait@2x~ipad.png │ │ ├── Default-Portrait~ipad.png │ │ ├── Default@2x~iphone.png │ │ └── Default~iphone.png └── splash.png ├── scss └── ionic.app.scss └── www ├── app ├── categories │ ├── bookmarks │ │ ├── bookmarks.js │ │ ├── bookmarks.tmpl.html │ │ ├── create-modal.tmpl.html │ │ ├── create │ │ │ ├── bookmark-create.js │ │ │ └── bookmark-create.tmpl.html │ │ ├── edit-modal.tmpl.html │ │ └── edit │ │ │ ├── bookmark-edit.js │ │ │ └── bookmark-edit.tmpl.html │ ├── categories.js │ └── categories.tmpl.html ├── common │ └── models │ │ ├── bookmarks-model.js │ │ └── categories-model.js └── eggly-app.js ├── assets ├── css │ ├── eggly.css │ └── normalize.css └── img │ └── eggly-logo.png ├── data ├── bookmarks.json └── categories.json └── index.html /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "www/lib" 3 | } 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 4 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | insert_final_newline = false 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | build 3 | node_modules 4 | platforms/ 5 | plugins/ 6 | www/lib 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /.io-config.json: -------------------------------------------------------------------------------- 1 | {"app_id":"6035ddd4","api_key":"7a80ae9256e959342bfdd08ded426f51710f64543dc9df48"} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # eggly-ionic 2 | A simple bookmark app built for mobile using Ionic. 3 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "HelloIonic", 3 | "private": "true", 4 | "devDependencies": { 5 | "ionic": "driftyco/ionic-bower#1.1.1" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | eggly-ionic 4 | 5 | An Ionic Framework and Cordova project. 6 | 7 | 8 | Your Name Here 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var gutil = require('gulp-util'); 3 | var bower = require('bower'); 4 | var concat = require('gulp-concat'); 5 | var sass = require('gulp-sass'); 6 | var minifyCss = require('gulp-minify-css'); 7 | var rename = require('gulp-rename'); 8 | var sh = require('shelljs'); 9 | 10 | var paths = { 11 | sass: ['./scss/**/*.scss'] 12 | }; 13 | 14 | gulp.task('default', ['sass']); 15 | 16 | gulp.task('sass', function(done) { 17 | gulp.src('./scss/ionic.app.scss') 18 | .pipe(sass()) 19 | .on('error', sass.logError) 20 | .pipe(gulp.dest('./www/css/')) 21 | .pipe(minifyCss({ 22 | keepSpecialComments: 0 23 | })) 24 | .pipe(rename({ extname: '.min.css' })) 25 | .pipe(gulp.dest('./www/css/')) 26 | .on('end', done); 27 | }); 28 | 29 | gulp.task('watch', function() { 30 | gulp.watch(paths.sass, ['sass']); 31 | }); 32 | 33 | gulp.task('install', ['git-check'], function() { 34 | return bower.commands.install() 35 | .on('log', function(data) { 36 | gutil.log('bower', gutil.colors.cyan(data.id), data.message); 37 | }); 38 | }); 39 | 40 | gulp.task('git-check', function(done) { 41 | if (!sh.which('git')) { 42 | console.log( 43 | ' ' + gutil.colors.red('Git is not installed.'), 44 | '\n Git, the version control system, is required to download Ionic.', 45 | '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.', 46 | '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.' 47 | ); 48 | process.exit(1); 49 | } 50 | done(); 51 | }); 52 | -------------------------------------------------------------------------------- /hooks/README.md: -------------------------------------------------------------------------------- 1 | 21 | # Cordova Hooks 22 | 23 | This directory may contain scripts used to customize cordova commands. This 24 | directory used to exist at `.cordova/hooks`, but has now been moved to the 25 | project root. Any scripts you add to these directories will be executed before 26 | and after the commands corresponding to the directory name. Useful for 27 | integrating your own build systems or integrating with version control systems. 28 | 29 | __Remember__: Make your scripts executable. 30 | 31 | ## Hook Directories 32 | The following subdirectories will be used for hooks: 33 | 34 | after_build/ 35 | after_compile/ 36 | after_docs/ 37 | after_emulate/ 38 | after_platform_add/ 39 | after_platform_rm/ 40 | after_platform_ls/ 41 | after_plugin_add/ 42 | after_plugin_ls/ 43 | after_plugin_rm/ 44 | after_plugin_search/ 45 | after_prepare/ 46 | after_run/ 47 | after_serve/ 48 | before_build/ 49 | before_compile/ 50 | before_docs/ 51 | before_emulate/ 52 | before_platform_add/ 53 | before_platform_rm/ 54 | before_platform_ls/ 55 | before_plugin_add/ 56 | before_plugin_ls/ 57 | before_plugin_rm/ 58 | before_plugin_search/ 59 | before_prepare/ 60 | before_run/ 61 | before_serve/ 62 | pre_package/ <-- Windows 8 and Windows Phone only. 63 | 64 | ## Script Interface 65 | 66 | All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables: 67 | 68 | * CORDOVA_VERSION - The version of the Cordova-CLI. 69 | * CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios). 70 | * CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer) 71 | * CORDOVA_HOOK - Path to the hook that is being executed. 72 | * CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate) 73 | 74 | If a script returns a non-zero exit code, then the parent cordova command will be aborted. 75 | 76 | 77 | ## Writing hooks 78 | 79 | We highly recommend writting your hooks using Node.js so that they are 80 | cross-platform. Some good examples are shown here: 81 | 82 | [http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/) 83 | 84 | -------------------------------------------------------------------------------- /hooks/after_prepare/010_add_platform_class.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // Add Platform Class 4 | // v1.0 5 | // Automatically adds the platform class to the body tag 6 | // after the `prepare` command. By placing the platform CSS classes 7 | // directly in the HTML built for the platform, it speeds up 8 | // rendering the correct layout/style for the specific platform 9 | // instead of waiting for the JS to figure out the correct classes. 10 | 11 | var fs = require('fs'); 12 | var path = require('path'); 13 | 14 | var rootdir = process.argv[2]; 15 | 16 | function addPlatformBodyTag(indexPath, platform) { 17 | // add the platform class to the body tag 18 | try { 19 | var platformClass = 'platform-' + platform; 20 | var cordovaClass = 'platform-cordova platform-webview'; 21 | 22 | var html = fs.readFileSync(indexPath, 'utf8'); 23 | 24 | var bodyTag = findBodyTag(html); 25 | if(!bodyTag) return; // no opening body tag, something's wrong 26 | 27 | if(bodyTag.indexOf(platformClass) > -1) return; // already added 28 | 29 | var newBodyTag = bodyTag; 30 | 31 | var classAttr = findClassAttr(bodyTag); 32 | if(classAttr) { 33 | // body tag has existing class attribute, add the classname 34 | var endingQuote = classAttr.substring(classAttr.length-1); 35 | var newClassAttr = classAttr.substring(0, classAttr.length-1); 36 | newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote; 37 | newBodyTag = bodyTag.replace(classAttr, newClassAttr); 38 | 39 | } else { 40 | // add class attribute to the body tag 41 | newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">'); 42 | } 43 | 44 | html = html.replace(bodyTag, newBodyTag); 45 | 46 | fs.writeFileSync(indexPath, html, 'utf8'); 47 | 48 | process.stdout.write('add to body class: ' + platformClass + '\n'); 49 | } catch(e) { 50 | process.stdout.write(e); 51 | } 52 | } 53 | 54 | function findBodyTag(html) { 55 | // get the body tag 56 | try{ 57 | return html.match(/])(.*?)>/gi)[0]; 58 | }catch(e){} 59 | } 60 | 61 | function findClassAttr(bodyTag) { 62 | // get the body tag's class attribute 63 | try{ 64 | return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0]; 65 | }catch(e){} 66 | } 67 | 68 | if (rootdir) { 69 | 70 | // go through each of the platform directories that have been prepared 71 | var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []); 72 | 73 | for(var x=0; x 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | {{bookmark.title}} 16 | 17 | 19 | 20 | 22 | 23 | 24 | 25 |
26 | 30 |
31 |
32 | 33 | -------------------------------------------------------------------------------- /www/app/categories/bookmarks/create-modal.tmpl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /www/app/categories/bookmarks/create/bookmark-create.js: -------------------------------------------------------------------------------- 1 | angular.module('categories.bookmarks.create', []) 2 | .directive('createModal', function editBookmark() { 3 | return { 4 | scope: {}, 5 | templateUrl: 'app/categories/bookmarks/create/bookmark-create.tmpl.html', 6 | controller: 'CreateBookMarkCtrl', 7 | controllerAs: 'createBookmarkCtrl', 8 | bindToController: { 9 | modal: '=', 10 | create: '&' 11 | } 12 | } 13 | }) 14 | .controller('CreateBookMarkCtrl', function(BookmarksModel, CategoriesModel) { 15 | var createBookmarkCtrl = this; 16 | 17 | function cancelCreating() { 18 | createBookmarkCtrl.modal.remove(); 19 | } 20 | 21 | function createBookmark() { 22 | BookmarksModel.createBookmark(createBookmarkCtrl.newBookmark); 23 | 24 | createBookmarkCtrl.create(); 25 | createBookmarkCtrl.modal.remove(); 26 | } 27 | 28 | function resetForm() { 29 | createBookmarkCtrl.newBookmark = { 30 | title: '', 31 | url: '', 32 | category: CategoriesModel.getCurrentCategory().name 33 | }; 34 | } 35 | 36 | createBookmarkCtrl.cancelCreating = cancelCreating; 37 | createBookmarkCtrl.createBookmark = createBookmark; 38 | 39 | resetForm(); 40 | }); 41 | -------------------------------------------------------------------------------- /www/app/categories/bookmarks/create/bookmark-create.tmpl.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 |
6 |
Create Bookmark
7 |
8 | 10 |
11 |
12 | 13 | 18 | 23 | 24 |
25 | -------------------------------------------------------------------------------- /www/app/categories/bookmarks/edit-modal.tmpl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /www/app/categories/bookmarks/edit/bookmark-edit.js: -------------------------------------------------------------------------------- 1 | angular.module('categories.bookmarks.edit', []) 2 | .directive('editModal', function editBookmark() { 3 | return { 4 | scope: {}, 5 | templateUrl: 'app/categories/bookmarks/edit/bookmark-edit.tmpl.html', 6 | controller: 'EditBookmarkCtrl', 7 | controllerAs: 'editBookmarkCtrl', 8 | bindToController: { 9 | modal: '=', 10 | id: '=', 11 | edit: '&' 12 | } 13 | } 14 | }) 15 | .controller('EditBookmarkCtrl', function (BookmarksModel) { 16 | var editBookmarkCtrl = this; 17 | 18 | function updateBookmark() { 19 | editBookmarkCtrl.bookmark = angular.copy(editBookmarkCtrl.editedBookmark); 20 | BookmarksModel.updateBookmark(editBookmarkCtrl.editedBookmark); 21 | 22 | editBookmarkCtrl.edit(); 23 | editBookmarkCtrl.modal.remove(); 24 | } 25 | 26 | function cancelEditing() { 27 | editBookmarkCtrl.modal.remove(); 28 | } 29 | 30 | BookmarksModel.getBookmarkById(editBookmarkCtrl.id) 31 | .then(function (bookmark) { 32 | if (bookmark) { 33 | editBookmarkCtrl.bookmark = bookmark; 34 | editBookmarkCtrl.editedBookmark = angular.copy(editBookmarkCtrl.bookmark); 35 | } else { 36 | editBookmarkCtrl.modal.remove(); 37 | } 38 | }); 39 | 40 | editBookmarkCtrl.cancelEditing = cancelEditing; 41 | editBookmarkCtrl.updateBookmark = updateBookmark; 42 | }) 43 | ; 44 | -------------------------------------------------------------------------------- /www/app/categories/bookmarks/edit/bookmark-edit.tmpl.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 |
6 |
Edit Bookmark
7 |
8 | 10 |
11 |
12 | 13 | 19 | 25 | 26 |
27 | -------------------------------------------------------------------------------- /www/app/categories/categories.js: -------------------------------------------------------------------------------- 1 | angular.module('categories', [ 2 | 'eggly.models.categories' 3 | ]) 4 | .config(function ($stateProvider) { 5 | $stateProvider 6 | .state('eggly.categories', { 7 | url: '/', 8 | views: { 9 | //target the ui-view named 'categories' in ROOT state (eggly) 10 | 'categories@': { 11 | controller: 'CategoriesListCtrl as categoriesListCtrl', 12 | templateUrl: 'app/categories/categories.tmpl.html' 13 | }, 14 | //target the ui-view named 'bookmarks' in ROOT state (eggly) 15 | //to show all bookmarks for all categories 16 | 'bookmarks@': { 17 | controller: 'BookmarksListCtrl as bookmarksListCtrl', 18 | templateUrl: 'app/categories/bookmarks/bookmarks.tmpl.html' 19 | } 20 | } 21 | }) 22 | ; 23 | }) 24 | .controller('CategoriesListCtrl', function CategoriesListCtrl(CategoriesModel) { 25 | var categoriesListCtrl = this; 26 | 27 | CategoriesModel.getCategories() 28 | .then(function (result) { 29 | categoriesListCtrl.categories = result; 30 | }); 31 | }) 32 | ; 33 | -------------------------------------------------------------------------------- /www/app/categories/categories.tmpl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 12 | 13 | {{category.name}} 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /www/app/common/models/bookmarks-model.js: -------------------------------------------------------------------------------- 1 | angular.module('eggly.models.bookmarks', []) 2 | .service('BookmarksModel', function ($http, $q) { 3 | var model = this, 4 | URLS = { 5 | FETCH: 'data/bookmarks.json' 6 | }, 7 | bookmarks; 8 | 9 | function extract(result) { 10 | return result.data; 11 | } 12 | 13 | function cacheBookmarks(result) { 14 | bookmarks = extract(result); 15 | return bookmarks; 16 | } 17 | 18 | function findBookmark(bookmarkId) { 19 | return _.find(bookmarks, function (bookmark) { 20 | return bookmark.id === parseInt(bookmarkId, 10); 21 | }) 22 | } 23 | 24 | model.getBookmarks = function () { 25 | return (bookmarks) ? $q.when(bookmarks) : $http.get(URLS.FETCH).then(cacheBookmarks); 26 | }; 27 | 28 | model.getBookmarkById = function (bookmarkId) { 29 | var deferred = $q.defer(); 30 | if (bookmarks) { 31 | deferred.resolve(findBookmark(bookmarkId)) 32 | } else { 33 | model.getBookmarks().then(function () { 34 | deferred.resolve(findBookmark(bookmarkId)) 35 | }) 36 | } 37 | return deferred.promise; 38 | }; 39 | 40 | model.createBookmark = function (bookmark) { 41 | bookmark.id = bookmarks.length; 42 | bookmarks.push(bookmark); 43 | }; 44 | 45 | model.updateBookmark = function (bookmark) { 46 | var index = _.findIndex(bookmarks, function (b) { 47 | return b.id == bookmark.id 48 | }); 49 | 50 | bookmarks[index] = bookmark; 51 | }; 52 | 53 | model.deleteBookmark = function (bookmark) { 54 | _.remove(bookmarks, function (b) { 55 | return b.id == bookmark.id; 56 | }); 57 | }; 58 | }) 59 | 60 | ; 61 | -------------------------------------------------------------------------------- /www/app/common/models/categories-model.js: -------------------------------------------------------------------------------- 1 | angular.module('eggly.models.categories', [ 2 | 3 | ]) 4 | .service('CategoriesModel', function ($http, $q) { 5 | var model = this, 6 | URLS = { 7 | FETCH: 'data/categories.json' 8 | }, 9 | categories, 10 | currentCategory; 11 | 12 | function extract(result) { 13 | return result.data; 14 | } 15 | 16 | function cacheCategories(result) { 17 | categories = extract(result); 18 | return categories; 19 | } 20 | 21 | model.getCategories = function() { 22 | return (categories) ? $q.when(categories) : $http.get(URLS.FETCH).then(cacheCategories); 23 | }; 24 | 25 | model.setCurrentCategory = function(category) { 26 | return model.getCategoryByName(category).then(function(category) { 27 | currentCategory = category; 28 | }) 29 | }; 30 | 31 | model.getCurrentCategory = function() { 32 | return currentCategory; 33 | }; 34 | 35 | model.getCurrentCategoryName = function() { 36 | return currentCategory ? currentCategory.name : ''; 37 | }; 38 | 39 | model.getCategoryByName = function(categoryName) { 40 | var deferred = $q.defer(); 41 | 42 | function findCategory(){ 43 | return _.find(categories, function(c){ 44 | return c.name == categoryName; 45 | }) 46 | } 47 | 48 | if(categories) { 49 | deferred.resolve(findCategory()); 50 | } else { 51 | model.getCategories() 52 | .then(function() { 53 | deferred.resolve(findCategory()); 54 | }); 55 | } 56 | 57 | return deferred.promise; 58 | }; 59 | 60 | 61 | }) 62 | ; 63 | -------------------------------------------------------------------------------- /www/app/eggly-app.js: -------------------------------------------------------------------------------- 1 | angular.module('Eggly', [ 2 | 'ionic', 3 | 'categories', 4 | 'categories.bookmarks' 5 | ]) 6 | .config(function($stateProvider, $urlRouterProvider) { 7 | $stateProvider 8 | //abstract state serves as a PLACEHOLDER or NAMESPACE for application states 9 | .state('eggly', { 10 | url: '', 11 | abstract: true 12 | }); 13 | 14 | $urlRouterProvider.otherwise('/'); 15 | }) 16 | .run(function($ionicPlatform) { 17 | $ionicPlatform.ready(function() { 18 | if (window.cordova && window.cordova.plugins.Keyboard) { 19 | // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 20 | // for form inputs) 21 | cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 22 | 23 | // Don't remove this line unless you know what you are doing. It stops the viewport 24 | // from snapping when text inputs are focused. Ionic handles this internally for 25 | // a mzuch nicer keyboard experience. 26 | cordova.plugins.Keyboard.disableScroll(true); 27 | } 28 | if (window.StatusBar) { 29 | StatusBar.styleDefault(); 30 | } 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /www/assets/css/eggly.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | background-color: #D5DBD8; 4 | width: 100%; 5 | height: 100%; 6 | color: #4F534E; 7 | } 8 | 9 | body:not(.menu-open) .disable-pointer-events { 10 | pointer-events: all; 11 | } 12 | 13 | a { 14 | color: #373A36; 15 | text-decoration: none; 16 | } 17 | 18 | .logo img { 19 | padding: 30px 20px 20px; 20 | } 21 | 22 | .menu .pane { 23 | background-color: #2B2828; 24 | border-right: 1px solid #7B807E; 25 | } 26 | 27 | .menu .item-complex .item-content { 28 | background-color: #2B2828; 29 | } 30 | 31 | .menu .item { 32 | color: #5bc0de; 33 | text-decoration: none; 34 | background: transparent; 35 | border-color: #375158; 36 | } 37 | 38 | .menu .item .active, .menu .item .item-content.activated { 39 | background-color: #D5DBD8; 40 | color: #2B2828; 41 | } 42 | -------------------------------------------------------------------------------- /www/assets/css/normalize.css: -------------------------------------------------------------------------------- 1 | /* normalize.css v2.1.0 | MIT License | git.io/normalize */ 2 | /* ========================================================================== 3 | HTML5 display definitions 4 | ========================================================================== */ 5 | /** 6 | * Correct `block` display not defined in IE 8/9. 7 | */ 8 | /* line 22, ../sass/normalize.scss */ 9 | article, 10 | aside, 11 | details, 12 | figcaption, 13 | figure, 14 | footer, 15 | header, 16 | hgroup, 17 | main, 18 | nav, 19 | section, 20 | summary { 21 | display: block; 22 | } 23 | 24 | /** 25 | * Correct `inline-block` display not defined in IE 8/9. 26 | */ 27 | /* line 32, ../sass/normalize.scss */ 28 | audio, 29 | canvas, 30 | video { 31 | display: inline-block; 32 | } 33 | 34 | /** 35 | * Prevent modern browsers from displaying `audio` without controls. 36 | * Remove excess height in iOS 5 devices. 37 | */ 38 | /* line 41, ../sass/normalize.scss */ 39 | audio:not([controls]) { 40 | display: none; 41 | height: 0; 42 | } 43 | 44 | /** 45 | * Address styling not present in IE 8/9. 46 | */ 47 | /* line 50, ../sass/normalize.scss */ 48 | [hidden] { 49 | display: none; 50 | } 51 | 52 | /* ========================================================================== 53 | Base 54 | ========================================================================== */ 55 | /** 56 | * 1. Set default font family to sans-serif. 57 | * 2. Prevent iOS text size adjust after orientation change, without disabling 58 | * user zoom. 59 | */ 60 | /* line 64, ../sass/normalize.scss */ 61 | html { 62 | font-family: sans-serif; 63 | /* 1 */ 64 | -webkit-text-size-adjust: 100%; 65 | /* 2 */ 66 | -ms-text-size-adjust: 100%; 67 | /* 2 */ 68 | } 69 | 70 | /** 71 | * Remove default margin. 72 | */ 73 | /* line 74, ../sass/normalize.scss */ 74 | body { 75 | margin: 0; 76 | } 77 | 78 | /* ========================================================================== 79 | Links 80 | ========================================================================== */ 81 | /** 82 | * Address `outline` inconsistency between Chrome and other browsers. 83 | */ 84 | /* line 86, ../sass/normalize.scss */ 85 | a:focus { 86 | outline: thin dotted; 87 | } 88 | 89 | /** 90 | * Improve readability when focused and also mouse hovered in all browsers. 91 | */ 92 | /* line 95, ../sass/normalize.scss */ 93 | a:active, 94 | a:hover { 95 | outline: 0; 96 | } 97 | 98 | /* ========================================================================== 99 | Typography 100 | ========================================================================== */ 101 | /** 102 | * Address variable `h1` font-size and margin within `section` and `article` 103 | * contexts in Firefox 4+, Safari 5, and Chrome. 104 | */ 105 | /* line 108, ../sass/normalize.scss */ 106 | h1 { 107 | font-size: 2em; 108 | margin: 0.67em 0; 109 | } 110 | 111 | /** 112 | * Address styling not present in IE 8/9, Safari 5, and Chrome. 113 | */ 114 | /* line 117, ../sass/normalize.scss */ 115 | abbr[title] { 116 | border-bottom: 1px dotted; 117 | } 118 | 119 | /** 120 | * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. 121 | */ 122 | /* line 126, ../sass/normalize.scss */ 123 | b, 124 | strong { 125 | font-weight: bold; 126 | } 127 | 128 | /** 129 | * Address styling not present in Safari 5 and Chrome. 130 | */ 131 | /* line 134, ../sass/normalize.scss */ 132 | dfn { 133 | font-style: italic; 134 | } 135 | 136 | /** 137 | * Address differences between Firefox and other browsers. 138 | */ 139 | /* line 142, ../sass/normalize.scss */ 140 | hr { 141 | -moz-box-sizing: content-box; 142 | box-sizing: content-box; 143 | height: 0; 144 | } 145 | 146 | /** 147 | * Address styling not present in IE 8/9. 148 | */ 149 | /* line 152, ../sass/normalize.scss */ 150 | mark { 151 | background: #ff0; 152 | color: #000; 153 | } 154 | 155 | /** 156 | * Correct font family set oddly in Safari 5 and Chrome. 157 | */ 158 | /* line 164, ../sass/normalize.scss */ 159 | code, 160 | kbd, 161 | pre, 162 | samp { 163 | font-family: monospace, serif; 164 | font-size: 1em; 165 | } 166 | 167 | /** 168 | * Improve readability of pre-formatted text in all browsers. 169 | */ 170 | /* line 173, ../sass/normalize.scss */ 171 | pre { 172 | white-space: pre-wrap; 173 | } 174 | 175 | /** 176 | * Set consistent quote types. 177 | */ 178 | /* line 181, ../sass/normalize.scss */ 179 | q { 180 | quotes: "\201C" "\201D" "\2018" "\2019"; 181 | } 182 | 183 | /** 184 | * Address inconsistent and variable font size in all browsers. 185 | */ 186 | /* line 189, ../sass/normalize.scss */ 187 | small { 188 | font-size: 80%; 189 | } 190 | 191 | /** 192 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 193 | */ 194 | /* line 198, ../sass/normalize.scss */ 195 | sub, 196 | sup { 197 | font-size: 75%; 198 | line-height: 0; 199 | position: relative; 200 | vertical-align: baseline; 201 | } 202 | 203 | /* line 205, ../sass/normalize.scss */ 204 | sup { 205 | top: -0.5em; 206 | } 207 | 208 | /* line 209, ../sass/normalize.scss */ 209 | sub { 210 | bottom: -0.25em; 211 | } 212 | 213 | /* ========================================================================== 214 | Embedded content 215 | ========================================================================== */ 216 | /** 217 | * Remove border when inside `a` element in IE 8/9. 218 | */ 219 | /* line 221, ../sass/normalize.scss */ 220 | img { 221 | border: 0; 222 | } 223 | 224 | /** 225 | * Correct overflow displayed oddly in IE 9. 226 | */ 227 | /* line 229, ../sass/normalize.scss */ 228 | svg:not(:root) { 229 | overflow: hidden; 230 | } 231 | 232 | /* ========================================================================== 233 | Figures 234 | ========================================================================== */ 235 | /** 236 | * Address margin not present in IE 8/9 and Safari 5. 237 | */ 238 | /* line 241, ../sass/normalize.scss */ 239 | figure { 240 | margin: 0; 241 | } 242 | 243 | /* ========================================================================== 244 | Forms 245 | ========================================================================== */ 246 | /** 247 | * Define consistent border, margin, and padding. 248 | */ 249 | /* line 253, ../sass/normalize.scss */ 250 | fieldset { 251 | border: 1px solid #c0c0c0; 252 | margin: 0 2px; 253 | padding: 0.35em 0.625em 0.75em; 254 | } 255 | 256 | /** 257 | * 1. Correct `color` not being inherited in IE 8/9. 258 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 259 | */ 260 | /* line 264, ../sass/normalize.scss */ 261 | legend { 262 | border: 0; 263 | /* 1 */ 264 | padding: 0; 265 | /* 2 */ 266 | } 267 | 268 | /** 269 | * 1. Correct font family not being inherited in all browsers. 270 | * 2. Correct font size not being inherited in all browsers. 271 | * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. 272 | */ 273 | /* line 278, ../sass/normalize.scss */ 274 | button, 275 | input, 276 | select, 277 | textarea { 278 | font-family: inherit; 279 | /* 1 */ 280 | font-size: 100%; 281 | /* 2 */ 282 | margin: 0; 283 | /* 3 */ 284 | } 285 | 286 | /** 287 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 288 | * the UA stylesheet. 289 | */ 290 | /* line 290, ../sass/normalize.scss */ 291 | button, 292 | input { 293 | line-height: normal; 294 | } 295 | 296 | /** 297 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 298 | * All other form control elements do not inherit `text-transform` values. 299 | * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. 300 | * Correct `select` style inheritance in Firefox 4+ and Opera. 301 | */ 302 | /* line 302, ../sass/normalize.scss */ 303 | button, 304 | select { 305 | text-transform: none; 306 | } 307 | 308 | /** 309 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 310 | * and `video` controls. 311 | * 2. Correct inability to style clickable `input` types in iOS. 312 | * 3. Improve usability and consistency of cursor style between image-type 313 | * `input` and others. 314 | */ 315 | /* line 317, ../sass/normalize.scss */ 316 | button, 317 | html input[type="button"], 318 | input[type="reset"], 319 | input[type="submit"] { 320 | -webkit-appearance: button; 321 | /* 2 */ 322 | cursor: pointer; 323 | /* 3 */ 324 | } 325 | 326 | /** 327 | * Re-set default cursor for disabled elements. 328 | */ 329 | /* line 327, ../sass/normalize.scss */ 330 | button[disabled], 331 | html input[disabled] { 332 | cursor: default; 333 | } 334 | 335 | /** 336 | * 1. Address box sizing set to `content-box` in IE 8/9. 337 | * 2. Remove excess padding in IE 8/9. 338 | */ 339 | /* line 337, ../sass/normalize.scss */ 340 | input[type="checkbox"], 341 | input[type="radio"] { 342 | box-sizing: border-box; 343 | /* 1 */ 344 | padding: 0; 345 | /* 2 */ 346 | } 347 | 348 | /** 349 | * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 350 | * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome 351 | * (include `-moz` to future-proof). 352 | */ 353 | /* line 348, ../sass/normalize.scss */ 354 | input[type="search"] { 355 | -webkit-appearance: textfield; 356 | /* 1 */ 357 | -moz-box-sizing: content-box; 358 | -webkit-box-sizing: content-box; 359 | /* 2 */ 360 | box-sizing: content-box; 361 | } 362 | 363 | /** 364 | * Remove inner padding and search cancel button in Safari 5 and Chrome 365 | * on OS X. 366 | */ 367 | /* line 361, ../sass/normalize.scss */ 368 | input[type="search"]::-webkit-search-cancel-button, 369 | input[type="search"]::-webkit-search-decoration { 370 | -webkit-appearance: none; 371 | } 372 | 373 | /** 374 | * Remove inner padding and border in Firefox 4+. 375 | */ 376 | /* line 370, ../sass/normalize.scss */ 377 | button::-moz-focus-inner, 378 | input::-moz-focus-inner { 379 | border: 0; 380 | padding: 0; 381 | } 382 | 383 | /** 384 | * 1. Remove default vertical scrollbar in IE 8/9. 385 | * 2. Improve readability and alignment in all browsers. 386 | */ 387 | /* line 380, ../sass/normalize.scss */ 388 | textarea { 389 | overflow: auto; 390 | /* 1 */ 391 | vertical-align: top; 392 | /* 2 */ 393 | } 394 | 395 | /* ========================================================================== 396 | Tables 397 | ========================================================================== */ 398 | /** 399 | * Remove most spacing between table cells. 400 | */ 401 | /* line 393, ../sass/normalize.scss */ 402 | table { 403 | border-collapse: collapse; 404 | border-spacing: 0; 405 | } 406 | -------------------------------------------------------------------------------- /www/assets/img/eggly-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpulton/eggly-ionic/3c1971c6d6a10d52b1e741feefcf0cd02cbb4285/www/assets/img/eggly-logo.png -------------------------------------------------------------------------------- /www/data/bookmarks.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id":0, "title": "AngularJS", "url": "http://angularjs.org", "category": "Development" }, 3 | {"id":1, "title": "Egghead.io", "url": "http://egghead.io", "category": "Development" }, 4 | {"id":2, "title": "A List Apart", "url": "http://alistapart.com/", "category": "Design" }, 5 | {"id":3, "title": "One Page Love", "url": "http://onepagelove.com/", "category": "Design" }, 6 | {"id":4, "title": "MobilityWOD", "url": "http://www.mobilitywod.com/", "category": "Exercise" }, 7 | {"id":5, "title": "Robb Wolf", "url": "http://robbwolf.com/", "category": "Exercise" }, 8 | {"id":6, "title": "Senor Gif", "url": "http://memebase.cheezburger.com/senorgif", "category": "Humor" }, 9 | {"id":7, "title": "Wimp", "url": "http://wimp.com", "category": "Humor" }, 10 | {"id":8, "title": "Dump", "url": "http://dump.com", "category": "Humor" } 11 | ] -------------------------------------------------------------------------------- /www/data/categories.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": 0, "name": "Development"}, 3 | {"id": 1, "name": "Design"}, 4 | {"id": 2, "name": "Exercise"}, 5 | {"id": 3, "name": "Humor"} 6 | ] -------------------------------------------------------------------------------- /www/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Eggly 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | >>>>>>> 09-conclusion 44 | 45 | --------------------------------------------------------------------------------