├── .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 |
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 |
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 |
4 |
5 |
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 |
--------------------------------------------------------------------------------