├── .nvmrc ├── demo ├── .yo-rc.json ├── .gitattributes ├── app │ ├── .buildignore │ ├── robots.txt │ ├── favicon.ico │ ├── images │ │ └── icons │ │ │ └── menu.svg │ ├── styles │ │ ├── main.css │ │ └── material.color.css │ ├── views │ │ ├── default.html │ │ ├── home.html │ │ └── _common.html │ ├── scripts │ │ ├── controllers │ │ │ ├── home.js │ │ │ └── _common.js │ │ └── app.js │ ├── index.html │ ├── 404.html │ └── .htaccess ├── .bowerrc ├── dist │ ├── robots.txt │ ├── favicon.ico │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── images │ │ └── icons │ │ │ └── menu.f1d75e5f.svg │ ├── styles │ │ ├── main.87c88416.css │ │ └── sidenav.487db4cd.css │ ├── views │ │ ├── default.html │ │ ├── home.html │ │ └── _common.html │ ├── index.html │ ├── 404.html │ ├── scripts │ │ ├── scripts.a6f0f97b.js │ │ └── sidenav.740c0473.js │ └── .htaccess ├── .gitignore ├── .travis.yml ├── .jshintrc ├── README.md ├── test │ ├── .jshintrc │ ├── spec │ │ └── controllers │ │ │ ├── _common.js │ │ │ └── home.js │ └── karma.conf.js ├── .editorconfig ├── bower.json ├── package.json └── Gruntfile.js ├── .gitignore ├── package.json ├── bower.json ├── angular-material-sidenav.css ├── README.md └── angular-material-sidenav.js /.nvmrc: -------------------------------------------------------------------------------- 1 | 0.12.7 2 | -------------------------------------------------------------------------------- /demo/.yo-rc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | sftp-config.json 2 | -------------------------------------------------------------------------------- /demo/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /demo/app/.buildignore: -------------------------------------------------------------------------------- 1 | *.coffee -------------------------------------------------------------------------------- /demo/.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components" 3 | } 4 | -------------------------------------------------------------------------------- /demo/app/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | Disallow: 5 | -------------------------------------------------------------------------------- /demo/dist/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | Disallow: 5 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | /node_modules 4 | /.tmp 5 | /.sass-cache 6 | /bower_components 7 | -------------------------------------------------------------------------------- /demo/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sovanna/angular-material-sidenav/HEAD/demo/app/favicon.ico -------------------------------------------------------------------------------- /demo/dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sovanna/angular-material-sidenav/HEAD/demo/dist/favicon.ico -------------------------------------------------------------------------------- /demo/dist/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sovanna/angular-material-sidenav/HEAD/demo/dist/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /demo/dist/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sovanna/angular-material-sidenav/HEAD/demo/dist/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /demo/dist/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sovanna/angular-material-sidenav/HEAD/demo/dist/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /demo/dist/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sovanna/angular-material-sidenav/HEAD/demo/dist/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /demo/dist/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sovanna/angular-material-sidenav/HEAD/demo/dist/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /demo/.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - 'iojs' 5 | - '0.12' 6 | - '0.10' 7 | before_script: 8 | - 'npm install -g bower grunt-cli' 9 | - 'bower install' 10 | -------------------------------------------------------------------------------- /demo/dist/images/icons/menu.f1d75e5f.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /demo/app/images/icons/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /demo/dist/styles/main.87c88416.css: -------------------------------------------------------------------------------- 1 | body,body>div{max-width:100%;max-height:100%;overflow:hidden}body>div{height:100%}.nav-header{-webkit-flex-shrink:0;flex-shrink:0;z-index:2}.nav-header h1,.nav-header h4{color:#fff;text-align:center}.nav-header a.logo{text-decoration:none} -------------------------------------------------------------------------------- /demo/dist/views/default.html: -------------------------------------------------------------------------------- 1 |

{{model.title}}

-------------------------------------------------------------------------------- /demo/dist/views/home.html: -------------------------------------------------------------------------------- 1 |

Angular Material Sidenav

-------------------------------------------------------------------------------- /demo/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "bitwise": true, 3 | "browser": true, 4 | "curly": true, 5 | "eqeqeq": true, 6 | "esnext": true, 7 | "latedef": true, 8 | "noarg": true, 9 | "node": true, 10 | "strict": true, 11 | "undef": true, 12 | "unused": true, 13 | "globals": { 14 | "angular": false 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /demo/README.md: -------------------------------------------------------------------------------- 1 | # demo 2 | 3 | This project is generated with [yo angular generator](https://github.com/yeoman/generator-angular) 4 | version 0.12.0. 5 | 6 | ## Build & development 7 | 8 | Run `grunt` for building and `grunt serve` for preview. 9 | 10 | ## Testing 11 | 12 | Running `grunt test` will run the unit tests with karma. 13 | -------------------------------------------------------------------------------- /demo/test/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "bitwise": true, 3 | "browser": true, 4 | "curly": true, 5 | "eqeqeq": true, 6 | "esnext": true, 7 | "jasmine": true, 8 | "latedef": true, 9 | "noarg": true, 10 | "node": true, 11 | "strict": true, 12 | "undef": true, 13 | "unused": true, 14 | "globals": { 15 | "angular": false, 16 | "inject": false 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /demo/app/styles/main.css: -------------------------------------------------------------------------------- 1 | body, 2 | body > div { 3 | max-width: 100%; 4 | max-height: 100%; 5 | overflow: hidden; 6 | } 7 | 8 | body > div { 9 | height: 100%; 10 | } 11 | 12 | .nav-header { 13 | flex-shrink: 0; 14 | z-index: 2; 15 | } 16 | 17 | .nav-header h1, 18 | .nav-header h4 { 19 | color: white; 20 | text-align: center; 21 | } 22 | 23 | .nav-header a.logo { 24 | text-decoration: none; 25 | } -------------------------------------------------------------------------------- /demo/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # Change these settings to your own preference 11 | indent_style = space 12 | indent_size = 2 13 | 14 | # We recommend you to keep these unchanged 15 | end_of_line = lf 16 | charset = utf-8 17 | trim_trailing_whitespace = true 18 | insert_final_newline = true 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false 22 | -------------------------------------------------------------------------------- /demo/app/views/default.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 7 | 10 | 11 | 12 | 13 |

{{model.title}}

14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /demo/app/scripts/controllers/home.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * @ngdoc function 5 | * @name demoApp.controller:IndexCtrl 6 | * @description 7 | * # IndexCtrl 8 | * Controller of the demoApp 9 | */ 10 | angular.module('demoApp') 11 | 12 | .controller('HomeCtrl', [ 13 | '$scope', 14 | '$timeout', 15 | '$state', 16 | 'ssSideNav', 17 | function ( 18 | $scope, 19 | $timeout, 20 | $state, 21 | ssSideNav) { 22 | 23 | 24 | } 25 | ]); -------------------------------------------------------------------------------- /demo/app/views/home.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 7 | 10 | 11 | 12 | 13 |

Angular Material Sidenav

14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /demo/dist/views/_common.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /demo/test/spec/controllers/_common.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: CommonCtrl', function () { 4 | 5 | var controller, scope; 6 | 7 | // load the controller's module 8 | beforeEach(module('demoApp')); 9 | 10 | // Initialize the controller and a mock scope 11 | beforeEach(inject(function ($controller, $rootScope) { 12 | scope = $rootScope.$new(); 13 | controller = $controller('CommonCtrl', { 14 | $scope: scope 15 | }); 16 | })); 17 | 18 | it('Assign a menu to the controller', function () { 19 | expect(scope.menu).toBeDefined(); 20 | }); 21 | 22 | }); 23 | -------------------------------------------------------------------------------- /demo/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "angular": "^1.3.0", 6 | "angular-animate": "^1.3.0", 7 | "angular-aria": "^1.3.0", 8 | "angular-cookies": "^1.3.0", 9 | "angular-messages": "^1.3.0", 10 | "angular-resource": "^1.3.0", 11 | "angular-route": "^1.3.0", 12 | "angular-sanitize": "^1.3.0", 13 | "angular-touch": "^1.3.0", 14 | "angular-material": "^1.0.0", 15 | "angular-ui-router": "~0.2.15", 16 | "font-awesome": "~4.5.0" 17 | }, 18 | "devDependencies": { 19 | "angular-mocks": "^1.3.0" 20 | }, 21 | "appPath": "app", 22 | "moduleName": "demoApp" 23 | } 24 | -------------------------------------------------------------------------------- /demo/app/views/_common.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 |
-------------------------------------------------------------------------------- /demo/test/spec/controllers/home.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: HomeCtrl', function () { 4 | 5 | // load the controller's module 6 | beforeEach(module('demoApp')); 7 | 8 | var HomeCtrl, scope; 9 | 10 | // Initialize the controller and a mock scope 11 | beforeEach(inject(function ($controller, $rootScope) { 12 | scope = $rootScope.$new(); 13 | HomeCtrl = $controller('HomeCtrl', { 14 | // place here mocked dependencies 15 | $scope: scope 16 | }); 17 | })); 18 | 19 | // it('should attach a list of awesomeThings to the scope', function () { 20 | // expect(HomeCtrl.awesomeThings.length).toBe(3); 21 | // }); 22 | }); 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-material-sidenav", 3 | "version": "0.0.14", 4 | "homepage": "https://github.com/sovanna/angular-material-sidenav", 5 | "authors": [ 6 | "Sovanna Hing " 7 | ], 8 | "description": "Component that build the same sidenav from official angular material website", 9 | "main": "./angular-material-sidenav.js", 10 | "style": "./angular-material-sidenav.css", 11 | "keywords": [ 12 | "angular", 13 | "material", 14 | "angular-material", 15 | "sidenav", 16 | "angular-material-sidenav" 17 | ], 18 | "dependencies": { 19 | "angular": "^1.3.0", 20 | "angular-animate": "^1.3.0", 21 | "angular-aria": "^1.3.0", 22 | "angular-cookies": "^1.3.0", 23 | "angular-messages": "^1.3.0", 24 | "angular-resource": "^1.3.0", 25 | "angular-route": "^1.3.0", 26 | "angular-sanitize": "^1.3.0", 27 | "angular-touch": "^1.3.0", 28 | "angular-material": "^1.0.0", 29 | "angular-ui-router": "~0.2.15" 30 | }, 31 | "private": false, 32 | "license": "MIT" 33 | } 34 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-material-sidenav", 3 | "version": "0.0.14", 4 | "homepage": "https://github.com/sovanna/angular-material-sidenav", 5 | "authors": [ 6 | "Sovanna Hing " 7 | ], 8 | "description": "Component that build the same sidenav from official angular material website", 9 | "main": [ 10 | "./angular-material-sidenav.js", 11 | "./angular-material-sidenav.css" 12 | ], 13 | "keywords": [ 14 | "angular", 15 | "material", 16 | "angular-material", 17 | "sidenav", 18 | "angular-material-sidenav" 19 | ], 20 | "dependencies": { 21 | "angular": "^1.3.0", 22 | "angular-animate": "^1.3.0", 23 | "angular-aria": "^1.3.0", 24 | "angular-cookies": "^1.3.0", 25 | "angular-messages": "^1.3.0", 26 | "angular-resource": "^1.3.0", 27 | "angular-route": "^1.3.0", 28 | "angular-sanitize": "^1.3.0", 29 | "angular-touch": "^1.3.0", 30 | "angular-material": "^1.0.0", 31 | "angular-ui-router": "~0.2.15" 32 | }, 33 | "private": false, 34 | "license": "MIT" 35 | } 36 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo", 3 | "private": true, 4 | "devDependencies": { 5 | "grunt": "^0.4.5", 6 | "grunt-angular-templates": "^0.5.7", 7 | "grunt-autoprefixer": "^2.0.0", 8 | "grunt-cli": "^1.2.0", 9 | "grunt-concurrent": "^1.0.0", 10 | "grunt-contrib-clean": "^0.6.0", 11 | "grunt-contrib-concat": "^0.5.0", 12 | "grunt-contrib-connect": "^0.9.0", 13 | "grunt-contrib-copy": "^0.7.0", 14 | "grunt-contrib-cssmin": "^0.12.0", 15 | "grunt-contrib-htmlmin": "^0.4.0", 16 | "grunt-contrib-imagemin": "^0.9.2", 17 | "grunt-contrib-jshint": "^0.11.0", 18 | "grunt-contrib-uglify": "^0.7.0", 19 | "grunt-contrib-watch": "^0.6.1", 20 | "grunt-filerev": "^2.1.2", 21 | "grunt-google-cdn": "^0.4.3", 22 | "grunt-karma": "*", 23 | "grunt-newer": "^1.1.0", 24 | "grunt-ng-annotate": "^0.9.2", 25 | "grunt-svgmin": "^2.0.0", 26 | "grunt-usemin": "^3.0.0", 27 | "grunt-wiredep": "^2.0.0", 28 | "jit-grunt": "^0.9.1", 29 | "jshint-stylish": "^1.0.0", 30 | "karma-jasmine": "*", 31 | "karma-phantomjs-launcher": "*", 32 | "time-grunt": "^1.0.0" 33 | }, 34 | "engines": { 35 | "node": ">=0.10.0" 36 | }, 37 | "scripts": { 38 | "test": "grunt test" 39 | }, 40 | "dependencies": { 41 | "grunt-angular-templates": "^0.5.7", 42 | "grunt-cdnify": "^0.1.1" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /demo/dist/index.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /demo/dist/styles/sidenav.487db4cd.css: -------------------------------------------------------------------------------- 1 | .menu,.menu li,.menu md-select{margin:0}.menu .md-button,.menu-heading{text-align:left;width:100%;display:block}.menu,.menu ul{list-style:none;padding:0}.menu>li{border-bottom:1px solid}.menu>li:nth-child(1){border-top:none}.md-whiteframe-glow-z1{box-shadow:0 0 1px 1px rgba(0,0,0,.14),0 0 2px 2px rgba(0,0,0,.098),0 0 5px 1px rgba(0,0,0,.084)}.menu .md-button{box-shadow:none!important;border-radius:0;cursor:pointer;align-items:inherit;line-height:40px;margin:0;max-height:40px;overflow:hidden;padding:0 16px;text-decoration:none;white-space:normal}.menu md-select{width:100%}.menu md-select md-select-label{justify-content:flex-end;padding-top:10px}.menu md-select md-select-label span{margin-right:auto;padding-left:13px}.menu md-select .md-select-icon{margin-right:28px}.menu button.md-button::-moz-focus-inner{padding:0}.menu-heading{line-height:32px;margin:0;padding:8px 16px 0}.menu-toggle-list{overflow:hidden;position:relative;z-index:1}.menu .menu-toggle-list a.md-button{display:block;padding:0 16px 0 32px;text-transform:none;text-rendering:optimizeLegibility;font-weight:500}.md-button-toggle .md-toggle-icon{display:block;margin-left:auto;speak:none;vertical-align:middle;transform:rotate(180deg);-webkit-transform:rotate(180deg);transition:transform .3s ease-in-out;-webkit-transition:-webkit-transform .3s ease-in-out}.md-button-toggle .md-toggle-icon.toggled{transform:rotate(0);-webkit-transform:rotate(0)} -------------------------------------------------------------------------------- /angular-material-sidenav.css: -------------------------------------------------------------------------------- 1 | .menu { 2 | margin: 0; 3 | } 4 | 5 | .menu, 6 | .menu ul { 7 | list-style: none; 8 | padding: 0; 9 | } 10 | 11 | .menu li { 12 | margin: 0; 13 | } 14 | 15 | .menu > li { 16 | border-bottom: 1px solid; 17 | } 18 | 19 | .menu > li:nth-child(1) { 20 | border-top: none; 21 | } 22 | 23 | .md-whiteframe-glow-z1 { 24 | box-shadow: 0px 0px 1px 1px rgba(0, 0, 0, 0.14), 0px 0px 2px 2px rgba(0, 0, 0, 0.098), 0px 0px 5px 1px rgba(0, 0, 0, 0.084); 25 | } 26 | 27 | .menu .md-button { 28 | box-shadow: none !important; 29 | border-radius: 0; 30 | /*color: white;*/ 31 | cursor: pointer; 32 | display: block; 33 | align-items: inherit; 34 | line-height: 40px; 35 | margin: 0; 36 | max-height: 40px; 37 | overflow: hidden; 38 | padding: 0px 16px; 39 | text-align: left; 40 | text-decoration: none; 41 | white-space: normal; 42 | width: 100%; 43 | } 44 | 45 | .menu md-select { 46 | /** 47 | * Override md-select margins. 48 | * With margins the menu will look incorrect and causes mobile list 49 | * to not be scrollable. 50 | */ 51 | margin: 0; 52 | width: 100%; 53 | } 54 | 55 | .menu md-select md-select-label { 56 | justify-content: flex-end; 57 | padding-top: 10px; 58 | } 59 | 60 | .menu md-select md-select-label span { 61 | margin-right: auto; 62 | padding-left: 13px; 63 | } 64 | 65 | .menu md-select .md-select-icon { 66 | margin-right: 28px; 67 | } 68 | 69 | .menu button.md-button::-moz-focus-inner { 70 | padding: 0; 71 | } 72 | 73 | .menu-heading { 74 | display: block; 75 | line-height: 32px; 76 | margin: 0; 77 | padding: 8px 16px 0; 78 | text-align: left; 79 | width: 100%; 80 | } 81 | 82 | .menu-toggle-list { 83 | overflow: hidden; 84 | position: relative; 85 | z-index: 1; 86 | } 87 | 88 | .menu .menu-toggle-list a.md-button { 89 | display: block; 90 | padding: 0 16px 0 32px; 91 | text-transform: none; 92 | text-rendering: optimizeLegibility; 93 | font-weight: 500; 94 | } 95 | 96 | .md-button-toggle .md-toggle-icon { 97 | display: block; 98 | margin-left: auto; 99 | speak: none; 100 | vertical-align: middle; 101 | transform: rotate(180deg); 102 | -webkit-transform: rotate(180deg); 103 | transition: transform 0.3s ease-in-out; 104 | -webkit-transition: -webkit-transform 0.3s ease-in-out; 105 | } 106 | 107 | .md-button-toggle .md-toggle-icon.toggled { 108 | transform: rotate(0deg); 109 | -webkit-transform: rotate(0deg); 110 | } 111 | 112 | .md-toggle-icon md-icon{ 113 | height: 40px; 114 | } 115 | -------------------------------------------------------------------------------- /demo/app/scripts/controllers/_common.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * @ngdoc function 5 | * @name demoApp.controller:CommonCtrl 6 | * @description 7 | * # CommonCtrl 8 | * Controller of the demoApp 9 | */ 10 | angular.module('demoApp') 11 | .controller('CommonCtrl', [ 12 | '$scope', 13 | '$mdSidenav', 14 | '$timeout', 15 | '$rootScope', 16 | '$state', 17 | 'ssSideNav', 18 | 'ssSideNavSharedService', 19 | function ( 20 | $scope, 21 | $mdSidenav, 22 | $timeout, 23 | $rootScope, 24 | $state, 25 | ssSideNav, 26 | ssSideNavSharedService) { 27 | 28 | var _perform_change_for_demo = function () { 29 | ssSideNav.setVisible('link_3', true); 30 | 31 | ssSideNav.setVisibleFor([{ 32 | id: 'toogle_1_link_2', 33 | value: true 34 | }, { 35 | id: 'toogle_1_link_1', 36 | value: false 37 | }]); 38 | 39 | $timeout(function () { 40 | ssSideNav.setVisible('toogle_2', false); 41 | }, 1000 * 3); 42 | 43 | $timeout(function () { 44 | ssSideNav.sections = [{ 45 | id: 'toogle_3', 46 | name: 'Section Heading 3', 47 | type: 'heading', 48 | children: [{ 49 | name: 'Toogle 3', 50 | type: 'toggle', 51 | pages: [{ 52 | id: 'toogle_3_link_1', 53 | name: 'item 1', 54 | state: 'common.toggle3.item1' 55 | }, { 56 | id: 'toogle_3_link_2', 57 | name: 'item 2', 58 | state: 'common.toggle3.item2' 59 | }] 60 | }] 61 | }]; 62 | }, 1000 * 6); 63 | 64 | $timeout(function () { 65 | ssSideNav.forceSelectionWithId('toogle_3_link_1'); 66 | }, 1000 * 10); 67 | }; 68 | 69 | $scope.onClickMenu = function () { 70 | $mdSidenav('left').toggle(); 71 | }; 72 | 73 | $scope.menu = ssSideNav; 74 | 75 | // Listen event SS_SIDENAV_CLICK_ITEM to close menu 76 | $rootScope.$on('SS_SIDENAV_CLICK_ITEM', function() { 77 | console.log('do whatever you want after click on item'); 78 | }); 79 | 80 | // _perform_change_for_demo(); 81 | } 82 | ]); -------------------------------------------------------------------------------- /demo/test/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration 2 | // http://karma-runner.github.io/0.12/config/configuration-file.html 3 | // Generated on 2015-08-02 using 4 | // generator-karma 1.0.0 5 | 6 | module.exports = function(config) { 7 | 'use strict'; 8 | 9 | config.set({ 10 | // enable / disable watching file and executing tests whenever any file changes 11 | autoWatch: true, 12 | 13 | // base path, that will be used to resolve files and exclude 14 | basePath: '../', 15 | 16 | // testing framework to use (jasmine/mocha/qunit/...) 17 | // as well as any additional frameworks (requirejs/chai/sinon/...) 18 | frameworks: [ 19 | "jasmine" 20 | ], 21 | 22 | // list of files / patterns to load in the browser 23 | files: [ 24 | // bower:js 25 | 'bower_components/angular/angular.js', 26 | 'bower_components/angular-animate/angular-animate.js', 27 | 'bower_components/angular-aria/angular-aria.js', 28 | 'bower_components/angular-cookies/angular-cookies.js', 29 | 'bower_components/angular-messages/angular-messages.js', 30 | 'bower_components/angular-resource/angular-resource.js', 31 | 'bower_components/angular-route/angular-route.js', 32 | 'bower_components/angular-sanitize/angular-sanitize.js', 33 | 'bower_components/angular-touch/angular-touch.js', 34 | 'bower_components/angular-material/angular-material.js', 35 | 'bower_components/angular-ui-router/release/angular-ui-router.js', 36 | 'bower_components/angular-mocks/angular-mocks.js', 37 | // endbower 38 | "../angular-material-sidenav.js", 39 | "app/scripts/**/*.js", 40 | "test/mock/**/*.js", 41 | "test/spec/**/*.js" 42 | ], 43 | 44 | // list of files / patterns to exclude 45 | exclude: [ 46 | ], 47 | 48 | // web server port 49 | port: 8080, 50 | 51 | // Start these browsers, currently available: 52 | // - Chrome 53 | // - ChromeCanary 54 | // - Firefox 55 | // - Opera 56 | // - Safari (only Mac) 57 | // - PhantomJS 58 | // - IE (only Windows) 59 | browsers: [ 60 | "PhantomJS" 61 | ], 62 | 63 | // Which plugins to enable 64 | plugins: [ 65 | "karma-phantomjs-launcher", 66 | "karma-jasmine" 67 | ], 68 | 69 | // Continuous Integration mode 70 | // if true, it capture browsers, run tests and exit 71 | singleRun: false, 72 | 73 | colors: true, 74 | 75 | // level of logging 76 | // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG 77 | logLevel: config.LOG_INFO, 78 | 79 | // Uncomment the following lines if you are using grunt's server to run the tests 80 | // proxies: { 81 | // '/': 'http://localhost:9000/' 82 | // }, 83 | // URL root prevent conflicts with the site root 84 | // urlRoot: '_karma_' 85 | }); 86 | }; 87 | -------------------------------------------------------------------------------- /demo/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 29 | 30 |
31 | 32 | 33 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # angular-material-sidenav [NO MORE MAINTAINED] 2 | 3 | **Warning: this project is not maintained anymore. I've moved to React and stopped following Angular for the moment. However, I still watch the project for pull request** 4 | 5 | Simple component that reproduce the Angular Material Style SideNav Menu from their own website [material.angularjs.org](https://material.angularjs.org/). 6 | Available [Demo](http://sovanna.github.io/angular-material-sidenav/demo/dist) 7 | 8 | ##### 1. Installation 9 | 10 | bower install angular-material-sidenav --save 11 | 12 | ##### 2. Configuration 13 | 14 | add `sasrio.angular-material-sidenav` to your main module's list of dependencies 15 | 16 | angular.module('myApp', ['sasrio.angular-material-sidenav']) 17 | 18 | use the `ssSideNavSectionsProvider` as a **provider** to config your menu items 19 | 20 | ssSideNavSectionsProvider.initWithSections([{ 21 | id: 'toogle_1', 22 | name: 'Section Heading 1', 23 | type: 'heading', 24 | children: [{ 25 | name: 'Toogle 1', 26 | type: 'toggle', 27 | pages: [{ 28 | id: 'toggle_item_1', 29 | name: 'item 1', 30 | state: 'common.toggle.item1' 31 | }, { 32 | id: 'toggle_item_2', 33 | name: 'item 2', 34 | state: 'common.toggle.item2' 35 | }] 36 | }] 37 | }, { 38 | id: 'link_1', 39 | name: 'Simple link to Index state', 40 | state: 'common.index', 41 | type: 'link', 42 | hidden: true // show menu ('true' for hide menu) 43 | }]); 44 | 45 | **by default, if hidden property is not set, item will be displayed. So to hide one, just pass property to true.** 46 | 47 | Also, provide to module the `$mdThemingProvider` in order to get same colors 48 | 49 | ssSideNavSectionsProvider.initWithTheme($mdThemingProvider); 50 | 51 | You can check the [demo source code of app.js](https://github.com/sovanna/angular-material-sidenav/blob/master/demo/app/scripts/app.js) to see more on how you can add items 52 | 53 | ##### 3. Usage 54 | 55 | In order to display your sidenav menu, use the factory `ssSideNav` to get **all sections** and send them into the directive , example : 56 | 57 | **note: update the components to the lastest as some of the implementations have changed (e.g method changeSectionVisible no more exist)**) 58 | 59 | // in your controller, add the factory ssSideNav 60 | angular.module('app.controller', [ 61 | '$timeout', 62 | 'ssSideNav', 63 | function ($timeout, ssSideNav) { 64 | $scope.menu = ssSideNav; 65 | 66 | // Show or Hide menu 67 | ssSideNav.setVisible('link_1'); 68 | ssSideNav.setVisibleFor([{ 69 | id: 'toggle_item_1', 70 | value: true 71 | }, { 72 | id: 'link_1', 73 | value: false 74 | }]); 75 | 76 | $timeout(function () { 77 | ssSideNav.setVisible('toogle_2', false); 78 | }); 79 | 80 | $timeout(function () { 81 | // force selection on child dropdown menu item and select its state too. 82 | ssSideNav.forceSelectionWithId('toogle_1_link_2'); 83 | }, 1000 * 3); 84 | } 85 | ]); 86 | 87 | and of course, in your html view: 88 | 89 | 90 | 91 | ##### 4. Customization 92 | 93 | Colors are handle using a **directive** from the gist [dh94 mdStyleColor](https://gist.github.com/dh94/517187e03fdde3c18103) 94 | 95 | All sidenav is builded using the **primary** color configured with `$mdThemingProvider. 96 | 97 | If you look the source code, you can easily add new template item, new kind of items and so on... 98 | -------------------------------------------------------------------------------- /demo/dist/404.html: -------------------------------------------------------------------------------- 1 | Page Not Found :(

Not found :(

Sorry, but the page you were trying to view does not exist.

It looks like this was the result of either:

  • a mistyped address
  • an out-of-date link
-------------------------------------------------------------------------------- /demo/app/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Page Not Found :( 6 | 136 | 137 | 138 |
139 |

Not found :(

140 |

Sorry, but the page you were trying to view does not exist.

141 |

It looks like this was the result of either:

142 |
    143 |
  • a mistyped address
  • 144 |
  • an out-of-date link
  • 145 |
146 | 149 | 150 |
151 | 152 | 153 | -------------------------------------------------------------------------------- /demo/dist/scripts/scripts.a6f0f97b.js: -------------------------------------------------------------------------------- 1 | "use strict";angular.module("demoApp",["ngAnimate","ngAria","ngCookies","ngMessages","ngResource","ngRoute","ngSanitize","ngTouch","ngMaterial","ui.router","sasrio.angular-material-sidenav"]).config(["$mdThemingProvider","$locationProvider","$urlRouterProvider","$stateProvider","ssSideNavSectionsProvider",function(a,b,c,d,e){a.theme("default").primaryPalette("blue",{"default":"700"}),c.otherwise(function(){return"/"}),d.state({name:"common","abstract":!0,templateUrl:"views/_common.html",controller:"CommonCtrl"}),d.state({name:"common.home",url:"/",templateUrl:"views/home.html",controller:"HomeCtrl"}),d.state({name:"common.toggle1",url:"/toogle1","abstract":!0,template:""}),d.state({name:"common.toggle1.item1",url:"/item1",templateUrl:"views/default.html",controller:["$scope",function(a){a.model={title:"Hello Toogle 1 Item 1"}}]}),d.state({name:"common.toggle1.item2",url:"/item2",templateUrl:"views/default.html",controller:["$scope",function(a){a.model={title:"Hello Toogle 1 Item 2"}}]}),d.state({name:"common.toggle1.item3",url:"/item3",templateUrl:"views/default.html",controller:["$scope",function(a){a.model={title:"Hello Toogle 1 Item 3"}}]}),d.state({name:"common.link1",url:"/link1",templateUrl:"views/default.html",controller:["$scope",function(a){a.model={title:"Hello Link 1"}}]}),d.state({name:"common.link2",url:"/link2",templateUrl:"views/default.html",controller:["$scope",function(a){a.model={title:"Hello Link 2"}}]}),d.state({name:"common.link2.edit",url:"/edit",templateUrl:"views/default.html",controller:["$scope",function(a){a.model={title:"Hello Link 2"}}]}),d.state({name:"common.link3",url:"/link3",templateUrl:"views/default.html",controller:["$scope",function(a){a.model={title:"Hello Link 3"}}]}),d.state({name:"common.toggle2",url:"/toogle2","abstract":!0,template:""}),d.state({name:"common.toggle2.item1",url:"/item1",templateUrl:"views/default.html",controller:["$scope",function(a){a.model={title:"Hello Toogle 2 Item 1"}}]}),e.initWithTheme(a),e.initWithSections([{id:"toogle_1",name:"Section Heading 1",type:"heading",children:[{name:"Toogle 1",type:"toggle",pages:[{id:"toogle_1_link_1",name:"item 1",state:"common.toggle1.item1"},{id:"toogle_1_link_2",name:"item 2",state:"common.toggle1.item2",hidden:!0},{id:"toogle_1_link_3",name:"item 3",state:"common.toggle1.item3"}]}]},{id:"link_1",name:"Link 1 ",state:"common.link1",type:"link",icon:"fa fa-check"},{id:"link_2",name:"Link 2",state:"common.link2",type:"link"},{id:"link_3",name:"Link 3",state:"common.link3",type:"link",hidden:!0},{id:"toogle_2",name:"Section Heading 2",type:"heading",children:[{name:"Toogle 2",type:"toggle",pages:[{id:"toogle_2_link_1",name:"item 1",state:"common.toggle2.item1"}]}]}])}]),angular.module("demoApp").controller("CommonCtrl",["$scope","$mdSidenav","ssSideNav","ssSideNavSharedService","$rootScope",function(a,b,c,d,e){a.onClickMenu=function(){b("left").toggle()},a.menu=c,e.$on("SS_SIDENAV_CLICK_ITEM",function(){console.log("do whatever you want after click on item")})}]),angular.module("demoApp").controller("HomeCtrl",["$scope","$timeout","ssSideNav",function(a,b,c){c.setVisible("link_3",!0),c.setVisibleFor([{id:"toogle_1_link_2",value:!0},{id:"toogle_1_link_1",value:!1}]),b(function(){c.setVisible("toogle_2",!1)},3e3)}]),angular.module("demoApp").run(["$templateCache",function(a){a.put("views/_common.html",'
'),a.put("views/default.html",'

{{model.title}}

'),a.put("views/home.html",'

Angular Material Sidenav

')}]); -------------------------------------------------------------------------------- /demo/dist/scripts/sidenav.740c0473.js: -------------------------------------------------------------------------------- 1 | !function(a,b,c){"use strict";b.module("sasrio.angular-material-sidenav",[]).provider("ssSideNavSections",function(){var a,b,c=[];this.initWithSections=function(a){c=a?a:[]},this.initWithTheme=function(c){a=c.theme(),b=c._PALETTES},this.$get=[function(){var d=function(){this.sections=c,this.theme=a,this.palettes=b};return new d}]}).factory("ssSideNavSharedService",["$rootScope",function(a){var b={};return b.broadcast=function(b,c){a.$broadcast(b,c)},b.emit=function(b,c){a.$emit(b,c)},b}]).factory("ssSideNav",["$rootScope","$location","$state","$stateParams","ssSideNavSections",function(a,b,c,d,e){var f,g=e.sections,h=function(a,b,c){var d=c?c.toState:null;if(!d)return console.warn("ss-sidenav: `toState` key not found");if(d.name===b.state){if(!f)return void console.warn("ss-sidenav: strange `self` is undef");f.selectSection(a),f.selectPage(a,b.state)}},i=function(a,b,c){var d={toState:b,toParams:c};g.forEach(function(a){a.children?a.children.forEach(function(a){a.pages&&a.pages.forEach(function(b){h(a,b,d)})}):a.pages?a.pages.forEach(function(b){h(a,b,d)}):"link"===a.type&&h(a,a,d)})};return f={sections:g,selectSection:function(a){f.openedSection=a},toggleSelectSection:function(a){f.openedSection=f.openedSection===a?null:a},isSectionSelected:function(a){return f.openedSection===a},selectPage:function(a,b){f.currentSection=a,f.currentPage=b},isPageSelected:function(a){return f.currentPage===a},setVisible:function(a,b){return Array.prototype.every?void f.sections.every(function(c){return c.id===a?(c.hidden=!b,!1):(c.children&&c.children.every(function(c){return c.id===a?(c.hidden=!b,!1):(c.pages&&c.pages.every(function(c){return c.id===a?(c.hidden=!b,!1):!0}),!0)}),!0)}):console.error("every funct not implemented")},setVisibleFor:function(a){return Array.prototype.every?void a.forEach(function(a){f.setVisible(a.id,a.value)}):console.error("every funct not implemented")}},a.$on("$stateChangeStart",i),i(null,c.current,d),f}]).controller("menuToggleCtrl",["$scope","ssSideNav",function(a,b){a.isOpen=function(a){return b.isSectionSelected(a)},a.toggle=function(a){b.toggleSelectSection(a)},this.isOpen=a.isOpen}]).controller("menuLinkCtrl",["$scope","$state","$mdSidenav","ssSideNav","ssSideNavSharedService",function(a,b,c,d,e){a.isSelected=function(a){return d.isPageSelected(a)},a.focusSection=function(a){c("left").close(),e.broadcast("SS_SIDENAV_CLICK_ITEM",a)},a.$state=b}]).directive("menuLink",[function(){return{scope:{section:"="},templateUrl:"views/ss/menu-link.tmpl.html",controller:"menuLinkCtrl"}}]).directive("menuToggle",["$timeout","$animateCss",function(a,b){var c=function(c,d,e,f){var g=d.find("ul"),h=function(){var a;return g.addClass("no-transition"),g.css("height",""),a=g.prop("clientHeight"),g.css("height",0),g.removeClass("no-transition"),a};return g?void c.$watch(function(){return f.isOpen(c.section)},function(c){a(function(){b(g,{from:{height:c?0:h()+"px"},to:{height:c?h()+"px":0},duration:.3}).start()},0,!1)}):console.warn("ss-sidenav: `menuToggle` cannot find ul element")};return{scope:{section:"="},templateUrl:"views/ss/menu-toggle.tmpl.html",controller:"menuToggleCtrl",link:c}}]).directive("ssSidenav",[function(){return{restrict:"E",replace:!0,scope:{menu:"="},templateUrl:"views/ss/menu-sidenav.tmpl.html"}}]).directive("ssStyleColor",["ssSideNavSections",function(a){return{restrict:"A",scope:{ssStyleColor:"="},link:function(b,c){var d=function(){for(var d in b.ssStyleColor)if(b.ssStyleColor.hasOwnProperty(d)){var e,f,g,h,i,j=a.theme.colors,k=(b.ssStyleColor[d]||"").split(".");k.length<2&&k.unshift("primary"),e=k[1]||"hue-1",f=k[0]||"primary",g=j[f]?j[f].name:f,h=j[f]?j[f].hues[e]||e:e,i=a.palettes[g][h]?a.palettes[g][h].value:a.palettes[g][500].value,c.css(d,"rgb("+i.join(",")+")"),c.parent().attr("md-component-id")&&c.parent().css(d,"rgb("+i.join(",")+")")}};return a.theme&&a.palettes?(b.$watch("ssStyleColor",function(a,b){a&&b&&a!==b&&d()}),void d()):console.warn("ss-sidenav: you probably want to ssSideNavSectionsProvider.initWithTheme($mdThemingProvider)")}}}]).run(["$templateCache",function(a){a.put("views/ss/menu-link.tmpl.html",'\n   {{section.name}}\n \n current page\n \n\n'),a.put("views/ss/menu-toggle.tmpl.html",'\n
\n {{section.name}}\n \n \n
\n \n Toggle {{isOpen(section)? \'expanded\' : \'collapsed\'}}\n \n
\n\n\n'),a.put("views/ss/menu-sidenav.tmpl.html",'')}])}(window,window.angular); -------------------------------------------------------------------------------- /demo/app/scripts/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * @ngdoc overview 5 | * @name demoApp 6 | * @description 7 | * # demoApp 8 | * 9 | * Main module of the application. 10 | */ 11 | angular 12 | .module('demoApp', [ 13 | 'ngAnimate', 14 | 'ngAria', 15 | 'ngCookies', 16 | 'ngMessages', 17 | 'ngResource', 18 | 'ngRoute', 19 | 'ngSanitize', 20 | 'ngTouch', 21 | 'ngMaterial', 22 | 'ui.router', 23 | 'sasrio.angular-material-sidenav' 24 | ]) 25 | .config([ 26 | '$mdThemingProvider', 27 | '$locationProvider', 28 | '$urlRouterProvider', 29 | '$stateProvider', 30 | 'ssSideNavSectionsProvider', 31 | function ( 32 | $mdThemingProvider, 33 | $locationProvider, 34 | $urlRouterProvider, 35 | $stateProvider, 36 | ssSideNavSectionsProvider) { 37 | 38 | $mdThemingProvider 39 | .theme('default') 40 | .primaryPalette('blue', { 41 | 'default': '700' 42 | }); 43 | 44 | $urlRouterProvider.otherwise(function () { 45 | return '/'; 46 | }); 47 | 48 | $stateProvider.state({ 49 | name: 'common', 50 | abstract: true, 51 | templateUrl: 'views/_common.html', 52 | controller: 'CommonCtrl' 53 | }); 54 | 55 | $stateProvider.state({ 56 | name: 'common.home', 57 | url: '/', 58 | templateUrl: 'views/home.html', 59 | controller: 'HomeCtrl' 60 | }); 61 | 62 | $stateProvider.state({ 63 | name: 'common.toggle1', 64 | url: '/toogle1', 65 | abstract: true, 66 | template: '' 67 | }); 68 | 69 | $stateProvider.state({ 70 | name: 'common.toggle1.item1', 71 | url: '/item1', 72 | templateUrl: 'views/default.html', 73 | controller: function ($scope) { 74 | $scope.model = { 75 | title: 'Hello Toogle 1 Item 1' 76 | }; 77 | } 78 | }); 79 | 80 | $stateProvider.state({ 81 | name: 'common.toggle1.item2', 82 | url: '/item2', 83 | templateUrl: 'views/default.html', 84 | controller: function ($scope) { 85 | $scope.model = { 86 | title: 'Hello Toogle 1 Item 2' 87 | }; 88 | } 89 | }); 90 | 91 | $stateProvider.state({ 92 | name: 'common.toggle1.item3', 93 | url: '/item3', 94 | templateUrl: 'views/default.html', 95 | controller: function ($scope) { 96 | $scope.model = { 97 | title: 'Hello Toogle 1 Item 3' 98 | }; 99 | } 100 | }); 101 | 102 | $stateProvider.state({ 103 | name: 'common.link1', 104 | url: '/link1', 105 | templateUrl: 'views/default.html', 106 | controller: function ($scope) { 107 | $scope.model = { 108 | title: 'Hello Link 1' 109 | }; 110 | } 111 | }); 112 | 113 | $stateProvider.state({ 114 | name: 'common.link2', 115 | url: '/link2', 116 | templateUrl: 'views/default.html', 117 | controller: function ($scope) { 118 | $scope.model = { 119 | title: 'Hello Link 2' 120 | }; 121 | } 122 | }); 123 | 124 | $stateProvider.state({ 125 | name: 'common.link2.edit', 126 | url: '/edit', 127 | templateUrl: 'views/default.html', 128 | controller: function ($scope) { 129 | $scope.model = { 130 | title: 'Hello Link 2' 131 | }; 132 | } 133 | }); 134 | 135 | $stateProvider.state({ 136 | name: 'common.link3', 137 | url: '/link3', 138 | templateUrl: 'views/default.html', 139 | controller: function ($scope) { 140 | $scope.model = { 141 | title: 'Hello Link 3' 142 | }; 143 | } 144 | }); 145 | 146 | $stateProvider.state({ 147 | name: 'common.toggle2', 148 | url: '/toogle2', 149 | abstract: true, 150 | template: '' 151 | }); 152 | 153 | $stateProvider.state({ 154 | name: 'common.toggle2.item1', 155 | url: '/item1', 156 | templateUrl: 'views/default.html', 157 | controller: function ($scope) { 158 | $scope.model = { 159 | title: 'Hello Toogle 2 Item 1' 160 | }; 161 | } 162 | }); 163 | 164 | $stateProvider.state({ 165 | name: 'common.toggle3', 166 | url: '/toogle3', 167 | abstract: true, 168 | template: '' 169 | }); 170 | 171 | $stateProvider.state({ 172 | name: 'common.toggle3.item1', 173 | url: '/item1', 174 | templateUrl: 'views/default.html', 175 | controller: function ($scope) { 176 | $scope.model = { 177 | title: 'Hello Toogle 3 Item 1' 178 | }; 179 | } 180 | }); 181 | 182 | $stateProvider.state({ 183 | name: 'common.toggle3.item2', 184 | url: '/item2', 185 | templateUrl: 'views/default.html', 186 | controller: function ($scope) { 187 | $scope.model = { 188 | title: 'Hello Toogle 3 Item 2' 189 | }; 190 | } 191 | }); 192 | 193 | ssSideNavSectionsProvider.initWithTheme($mdThemingProvider); 194 | ssSideNavSectionsProvider.initWithSections([{ 195 | id: 'toogle_1', 196 | name: 'Section Heading 1', 197 | type: 'heading', 198 | children: [{ 199 | name: 'Toogle 1', 200 | type: 'toggle', 201 | pages: [{ 202 | id: 'toogle_1_link_1', 203 | name: 'item 1', 204 | state: 'common.toggle1.item1' 205 | }, { 206 | id: 'toogle_1_link_2', 207 | name: 'item 2', 208 | state: 'common.toggle1.item2', 209 | hidden: true 210 | }, { 211 | id: 'toogle_1_link_3', 212 | name: 'item 3', 213 | state: 'common.toggle1.item3' 214 | }] 215 | }] 216 | }, { 217 | id: 'link_1', 218 | name: 'Link 1 ', 219 | state: 'common.link1', 220 | type: 'link', 221 | icon: 'fa fa-check' 222 | }, { 223 | id: 'link_2', 224 | name: 'Link 2', 225 | state: 'common.link2', 226 | type: 'link' 227 | }, { 228 | id: 'link_3', 229 | name: 'Link 3', 230 | state: 'common.link3', 231 | type: 'link', 232 | hidden: true 233 | }, { 234 | id: 'toogle_2', 235 | name: 'Section Heading 2', 236 | type: 'heading', 237 | children: [{ 238 | name: 'Toogle 2', 239 | type: 'toggle', 240 | pages: [{ 241 | id: 'toogle_2_link_1', 242 | name: 'item 1', 243 | state: 'common.toggle2.item1' 244 | }] 245 | }] 246 | }]); 247 | } 248 | ]); -------------------------------------------------------------------------------- /demo/Gruntfile.js: -------------------------------------------------------------------------------- 1 | // Generated on 2015-08-02 using generator-angular 0.12.0 2 | 'use strict'; 3 | 4 | // # Globbing 5 | // for performance reasons we're only matching one level down: 6 | // 'test/spec/{,*/}*.js' 7 | // use this if you want to recursively match all subfolders: 8 | // 'test/spec/**/*.js' 9 | 10 | module.exports = function (grunt) { 11 | 12 | // Time how long tasks take. Can help when optimizing build times 13 | require('time-grunt')(grunt); 14 | 15 | // Automatically load required Grunt tasks 16 | require('jit-grunt')(grunt, { 17 | useminPrepare: 'grunt-usemin', 18 | ngtemplates: 'grunt-angular-templates', 19 | cdnify: 'grunt-google-cdn' 20 | }); 21 | 22 | // Configurable paths for the application 23 | var appConfig = { 24 | app: require('./bower.json').appPath || 'app', 25 | dist: 'dist' 26 | }; 27 | 28 | // Define the configuration for all the tasks 29 | grunt.initConfig({ 30 | 31 | // Project settings 32 | yeoman: appConfig, 33 | 34 | // Watches files for changes and runs tasks based on the changed files 35 | watch: { 36 | bower: { 37 | files: ['bower.json'], 38 | tasks: ['wiredep'] 39 | }, 40 | racine: { 41 | files: ['../*.js'], 42 | options: { 43 | livereload: '<%= connect.options.livereload %>' 44 | } 45 | }, 46 | js: { 47 | files: ['<%= yeoman.app %>/scripts/{,*/}*.js'], 48 | tasks: ['newer:jshint:all'], 49 | options: { 50 | livereload: '<%= connect.options.livereload %>' 51 | } 52 | }, 53 | jsTest: { 54 | files: ['test/spec/{,*/}*.js'], 55 | tasks: ['newer:jshint:test', 'karma'] 56 | }, 57 | styles: { 58 | files: ['<%= yeoman.app %>/styles/{,*/}*.css'], 59 | tasks: ['newer:copy:styles', 'autoprefixer'] 60 | }, 61 | gruntfile: { 62 | files: ['Gruntfile.js'] 63 | }, 64 | livereload: { 65 | options: { 66 | livereload: '<%= connect.options.livereload %>' 67 | }, 68 | files: [ 69 | '<%= yeoman.app %>/{,*/}*.html', 70 | '.tmp/styles/{,*/}*.css', 71 | '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}' 72 | ] 73 | } 74 | }, 75 | 76 | // The actual grunt server settings 77 | connect: { 78 | options: { 79 | port: 9000, 80 | // Change this to '0.0.0.0' to access the server from outside. 81 | hostname: 'localhost', 82 | livereload: 35729 83 | }, 84 | livereload: { 85 | options: { 86 | open: true, 87 | middleware: function (connect) { 88 | return [ 89 | connect.static('.tmp'), 90 | connect().use( 91 | '/bower_components', 92 | connect.static('./bower_components') 93 | ), 94 | connect().use( 95 | '/racine', 96 | connect.static('./..') 97 | ), 98 | connect().use( 99 | '/app/styles', 100 | connect.static('./app/styles') 101 | ), 102 | connect.static(appConfig.app) 103 | ]; 104 | } 105 | } 106 | }, 107 | test: { 108 | options: { 109 | port: 9001, 110 | middleware: function (connect) { 111 | return [ 112 | connect.static('.tmp'), 113 | connect.static('test'), 114 | connect().use( 115 | '/bower_components', 116 | connect.static('./bower_components') 117 | ), 118 | connect().use( 119 | '/racine', 120 | connect.static('./..') 121 | ), 122 | connect.static(appConfig.app) 123 | ]; 124 | } 125 | } 126 | }, 127 | dist: { 128 | options: { 129 | open: true, 130 | base: '<%= yeoman.dist %>' 131 | } 132 | } 133 | }, 134 | 135 | // Make sure code styles are up to par and there are no obvious mistakes 136 | jshint: { 137 | options: { 138 | jshintrc: '.jshintrc', 139 | reporter: require('jshint-stylish') 140 | }, 141 | all: { 142 | src: [ 143 | 'Gruntfile.js', 144 | '<%= yeoman.app %>/scripts/{,*/}*.js' 145 | ] 146 | } 147 | }, 148 | 149 | // Empties folders to start fresh 150 | clean: { 151 | dist: { 152 | files: [{ 153 | dot: true, 154 | src: [ 155 | '.tmp', 156 | '<%= yeoman.dist %>/{,*/}*', 157 | '!<%= yeoman.dist %>/.git{,*/}*' 158 | ] 159 | }] 160 | }, 161 | server: '.tmp' 162 | }, 163 | 164 | // Add vendor prefixed styles 165 | autoprefixer: { 166 | options: { 167 | browsers: ['last 1 version'] 168 | }, 169 | server: { 170 | options: { 171 | map: true, 172 | }, 173 | files: [{ 174 | expand: true, 175 | cwd: '.tmp/styles/', 176 | src: '{,*/}*.css', 177 | dest: '.tmp/styles/' 178 | }] 179 | }, 180 | dist: { 181 | files: [{ 182 | expand: true, 183 | cwd: '.tmp/styles/', 184 | src: '{,*/}*.css', 185 | dest: '.tmp/styles/' 186 | }] 187 | } 188 | }, 189 | 190 | // Automatically inject Bower components into the app 191 | wiredep: { 192 | app: { 193 | src: ['<%= yeoman.app %>/index.html'], 194 | ignorePath: /\.\.\// 195 | }, 196 | test: { 197 | devDependencies: true, 198 | src: '<%= karma.unit.configFile %>', 199 | ignorePath: /\.\.\//, 200 | fileTypes:{ 201 | js: { 202 | block: /(([\s\t]*)\/{2}\s*?bower:\s*?(\S*))(\n|\r|.)*?(\/{2}\s*endbower)/gi, 203 | detect: { 204 | js: /'(.*\.js)'/gi 205 | }, 206 | replace: { 207 | js: '\'{{filePath}}\',' 208 | } 209 | } 210 | } 211 | } 212 | }, 213 | 214 | // Renames files for browser caching purposes 215 | filerev: { 216 | dist: { 217 | src: [ 218 | '<%= yeoman.dist %>/scripts/{,*/}*.js', 219 | '<%= yeoman.dist %>/styles/{,*/}*.css', 220 | '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', 221 | '<%= yeoman.dist %>/styles/fonts/*' 222 | ] 223 | } 224 | }, 225 | 226 | // Reads HTML for usemin blocks to enable smart builds that automatically 227 | // concat, minify and revision files. Creates configurations in memory so 228 | // additional tasks can operate on them 229 | useminPrepare: { 230 | html: '<%= yeoman.app %>/index.html', 231 | options: { 232 | dest: '<%= yeoman.dist %>', 233 | flow: { 234 | html: { 235 | steps: { 236 | js: ['concat', 'uglifyjs'], 237 | css: ['cssmin'] 238 | }, 239 | post: {} 240 | } 241 | } 242 | } 243 | }, 244 | 245 | // Performs rewrites based on filerev and the useminPrepare configuration 246 | usemin: { 247 | html: ['<%= yeoman.dist %>/{,*/}*.html'], 248 | css: ['<%= yeoman.dist %>/styles/{,*/}*.css'], 249 | js: ['<%= yeoman.dist %>/scripts/{,*/}*.js'], 250 | options: { 251 | assetsDirs: [ 252 | '<%= yeoman.dist %>', 253 | '<%= yeoman.dist %>/images', 254 | '<%= yeoman.dist %>/styles' 255 | ], 256 | patterns: { 257 | js: [[/(images\/[^''""]*\.(png|jpg|jpeg|gif|webp|svg))/g, 'Replacing references to images']] 258 | } 259 | } 260 | }, 261 | 262 | // The following *-min tasks will produce minified files in the dist folder 263 | // By default, your `index.html`'s will take care of 264 | // minification. These next options are pre-configured if you do not wish 265 | // to use the Usemin blocks. 266 | cssmin: { 267 | dist: { 268 | files: [ 269 | { 270 | dest: '<%= yeoman.dist %>/styles/sidenav.css', 271 | src: [ '.tmp/styles/sidenav.css' ] 272 | } 273 | ] 274 | } 275 | }, 276 | uglify: { 277 | dist: { 278 | files: [ 279 | { 280 | dest: '<%= yeoman.dist %>/scripts/sidenav.js', 281 | src: [ '.tmp/concat/scripts/sidenav.js' ] 282 | } 283 | ] 284 | } 285 | }, 286 | concat: { 287 | dist: { 288 | files: [ 289 | { 290 | dest: '.tmp/concat/scripts/sidenav.js', 291 | src: [ 292 | '../*.js' 293 | ] 294 | }, 295 | { 296 | dest: '.tmp/styles/sidenav.css', 297 | src: [ 298 | '../*.css' 299 | ] 300 | } 301 | ] 302 | } 303 | }, 304 | 305 | imagemin: { 306 | dist: { 307 | files: [{ 308 | expand: true, 309 | cwd: '<%= yeoman.app %>/images', 310 | src: '{,*/}*.{png,jpg,jpeg,gif}', 311 | dest: '<%= yeoman.dist %>/images' 312 | }] 313 | } 314 | }, 315 | 316 | svgmin: { 317 | dist: { 318 | files: [{ 319 | expand: true, 320 | cwd: '<%= yeoman.app %>/images', 321 | src: '{,*/}*.svg', 322 | dest: '<%= yeoman.dist %>/images' 323 | }] 324 | } 325 | }, 326 | 327 | htmlmin: { 328 | dist: { 329 | options: { 330 | collapseWhitespace: true, 331 | conservativeCollapse: true, 332 | collapseBooleanAttributes: true, 333 | removeCommentsFromCDATA: true 334 | }, 335 | files: [{ 336 | expand: true, 337 | cwd: '<%= yeoman.dist %>', 338 | src: ['*.html', 'views/{,*/}*.html'], 339 | dest: '<%= yeoman.dist %>' 340 | }] 341 | } 342 | }, 343 | 344 | ngtemplates: { 345 | dist: { 346 | options: { 347 | module: 'demoApp', 348 | htmlmin: '<%= htmlmin.dist.options %>', 349 | usemin: 'scripts/scripts.js' 350 | }, 351 | cwd: '<%= yeoman.app %>', 352 | src: 'views/{,*/}*.html', 353 | dest: '.tmp/templateCache.js' 354 | } 355 | }, 356 | 357 | // ng-annotate tries to make the code safe for minification automatically 358 | // by using the Angular long form for dependency injection. 359 | ngAnnotate: { 360 | dist: { 361 | files: [{ 362 | expand: true, 363 | cwd: '.tmp/concat/scripts', 364 | src: '*.js', 365 | dest: '.tmp/concat/scripts' 366 | }] 367 | } 368 | }, 369 | 370 | // Replace Google CDN references 371 | cdnify: { 372 | dist: { 373 | html: ['<%= yeoman.dist %>/*.html'] 374 | } 375 | }, 376 | 377 | // Copies remaining files to places other tasks can use 378 | copy: { 379 | dist: { 380 | files: [{ 381 | expand: true, 382 | dot: true, 383 | cwd: '<%= yeoman.app %>', 384 | dest: '<%= yeoman.dist %>', 385 | src: [ 386 | '*.{ico,png,txt}', 387 | '.htaccess', 388 | '*.html', 389 | 'images/{,*/}*.{webp}', 390 | 'views/{,*/}*.html', 391 | 'styles/fonts/{,*/}*.*', 392 | 'fonts/*' 393 | ] 394 | }, { 395 | expand: true, 396 | cwd: '.tmp/images', 397 | dest: '<%= yeoman.dist %>/images', 398 | src: ['generated/*'] 399 | }, { 400 | expand: true, 401 | cwd: 'app/images', 402 | src: '*', 403 | dest: '<%= yeoman.dist %>/images' 404 | }, { 405 | expand: true, 406 | dot: true, 407 | cwd: 'bower_components/font-awesome', 408 | src: ['fonts/*.*'], 409 | dest: '<%= yeoman.dist %>' 410 | }] 411 | }, 412 | styles: { 413 | expand: true, 414 | cwd: '<%= yeoman.app %>/styles', 415 | dest: '.tmp/styles/', 416 | src: '{,*/}*.css' 417 | } 418 | }, 419 | 420 | // Run some tasks in parallel to speed up the build process 421 | concurrent: { 422 | server: [ 423 | 'copy:styles' 424 | ], 425 | test: [ 426 | 'copy:styles' 427 | ], 428 | dist: [ 429 | 'copy:styles', 430 | 'imagemin', 431 | 'svgmin' 432 | ] 433 | }, 434 | 435 | // Test settings 436 | karma: { 437 | unit: { 438 | configFile: 'test/karma.conf.js', 439 | singleRun: true 440 | } 441 | } 442 | }); 443 | 444 | 445 | grunt.registerTask('serve', 'Compile then start a connect web server', function (target) { 446 | if (target === 'dist') { 447 | return grunt.task.run(['build', 'connect:dist:keepalive']); 448 | } 449 | 450 | grunt.task.run([ 451 | 'clean:server', 452 | 'wiredep', 453 | 'concurrent:server', 454 | 'autoprefixer:server', 455 | 'connect:livereload', 456 | 'watch' 457 | ]); 458 | }); 459 | 460 | grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) { 461 | grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.'); 462 | grunt.task.run(['serve:' + target]); 463 | }); 464 | 465 | grunt.registerTask('test', [ 466 | 'clean:server', 467 | 'wiredep', 468 | 'concurrent:test', 469 | 'autoprefixer', 470 | 'connect:test', 471 | 'karma' 472 | ]); 473 | 474 | grunt.registerTask('build', [ 475 | 'clean:dist', 476 | 'wiredep', 477 | 'useminPrepare', 478 | 'concurrent:dist', 479 | 'autoprefixer', 480 | 'ngtemplates', 481 | 'concat', 482 | 'concat:dist', 483 | 'ngAnnotate', 484 | 'copy:dist', 485 | 'cdnify', 486 | 'cssmin', 487 | 'cssmin:dist', 488 | 'uglify', 489 | 'filerev', 490 | 'usemin', 491 | 'htmlmin' 492 | ]); 493 | 494 | grunt.registerTask('default', [ 495 | 'newer:jshint', 496 | 'build' 497 | ]); 498 | }; 499 | -------------------------------------------------------------------------------- /angular-material-sidenav.js: -------------------------------------------------------------------------------- 1 | /*global console*/ 2 | 3 | /** 4 | * 5 | * Angular Material Sidenav 6 | * https://github.com/sovanna/angular-material-sidenav 7 | * Licence MIT 8 | * (c) 2015 Sovanna Hing 9 | * 10 | */ 11 | (function(window, angular, undefined) { 12 | 'use strict'; 13 | 14 | angular.module('sasrio.angular-material-sidenav', []) 15 | 16 | .provider('ssSideNavSections', function SSSideNavSectionsProvider() { 17 | var _sections = [], 18 | _theme, 19 | _palettes; 20 | 21 | this.initWithSections = function(value) { 22 | _sections = value ? value : []; 23 | }; 24 | 25 | this.initWithTheme = function (value) { 26 | _theme = value.theme(); 27 | _palettes = value._PALETTES; 28 | }; 29 | 30 | this.$get = [function ssSideNavSectionsFactory() { 31 | var SSSideNavSections = function() { 32 | this.sections = _sections; 33 | this.theme = _theme; 34 | this.palettes = _palettes; 35 | }; 36 | 37 | return new SSSideNavSections(); 38 | }]; 39 | }) 40 | 41 | .factory('ssSideNavSharedService', [ 42 | '$rootScope', 43 | function($rootScope) { 44 | var _sharedService = {}; 45 | 46 | _sharedService.broadcast = function(eventName, eventData) { 47 | $rootScope.$broadcast(eventName, eventData); 48 | }; 49 | 50 | _sharedService.emit = function(eventName, eventData) { 51 | $rootScope.$emit(eventName, eventData); 52 | }; 53 | 54 | return _sharedService; 55 | } 56 | ]) 57 | 58 | .factory('ssSideNav', [ 59 | '$rootScope', 60 | '$location', 61 | '$state', 62 | '$stateParams', 63 | 'ssSideNavSections', 64 | 'ssSideNavSharedService', 65 | function( 66 | $rootScope, 67 | $location, 68 | $state, 69 | $stateParams, 70 | ssSideNavSections, 71 | ssSideNavSharedService) { 72 | 73 | var self, 74 | sections = ssSideNavSections.sections; 75 | 76 | var matchPage = function(section, page, newState) { 77 | var toState = newState ? newState.toState : null; 78 | 79 | if (!toState) { 80 | return console.warn('ss-sidenav: `toState` key not found'); 81 | } 82 | 83 | if (toState.name !== page.state) { 84 | return; 85 | } 86 | 87 | if (!self) { 88 | console.warn('ss-sidenav: strange `self` is undef'); 89 | return; 90 | } 91 | 92 | self.selectSection(section); 93 | self.selectPage(section, page); 94 | }; 95 | 96 | var onStateChangeStart = function(event, toState, toParams) { 97 | var newState = { 98 | toState: toState, 99 | toParams: toParams 100 | }; 101 | 102 | sections.forEach(function(section) { 103 | if (section.children) { 104 | section.children.forEach(function(child) { 105 | if (child.pages) { 106 | child.pages.forEach(function(page) { 107 | matchPage(child, page, newState); 108 | }); 109 | } else if (child.type === 'link') { 110 | matchPage(child, child, newState); 111 | } 112 | }); 113 | } else if (section.pages) { 114 | section.pages.forEach(function(page) { 115 | matchPage(section, page, newState); 116 | }); 117 | } else if (section.type === 'link') { 118 | matchPage(section, section, newState); 119 | } 120 | }); 121 | }; 122 | 123 | self = { 124 | sections: sections, 125 | forceSelectionWithId: function (id) { 126 | ssSideNavSharedService.broadcast('SS_SIDENAV_FORCE_SELECTED_ITEM', id); 127 | }, 128 | selectSection: function(section) { 129 | self.openedSection = section; 130 | }, 131 | toggleSelectSection: function(section) { 132 | self.openedSection = (self.openedSection === section) ? null : section; 133 | }, 134 | isSectionSelected: function(section) { 135 | return self.openedSection === section; 136 | }, 137 | selectPage: function(section, page) { 138 | self.currentSection = section; 139 | self.currentPage = page; 140 | }, 141 | isPageSelected: function(page) { 142 | return self.currentPage ? self.currentPage.state === page : false; 143 | }, 144 | setVisible: function (id, value) { 145 | if (!Array.prototype.every) { 146 | // TODO prototyp for every, 147 | // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every; 148 | return console.error('every funct not implemented'); 149 | } 150 | 151 | self.sections.every(function (section) { 152 | if (section.id === id) { 153 | section.hidden = !value; 154 | return false; 155 | } 156 | 157 | if (section.children) { 158 | section.children.every(function (child) { 159 | if (child.id === id) { 160 | child.hidden = !value; 161 | return false; 162 | }; 163 | 164 | if (child.pages) { 165 | child.pages.every(function (page) { 166 | if (page.id === id) { 167 | page.hidden = !value; 168 | return false; 169 | } 170 | 171 | return true; 172 | }); 173 | } 174 | 175 | return true; 176 | }); 177 | } 178 | 179 | return true; 180 | }); 181 | }, 182 | setVisibleFor: function (ids) { 183 | if (!Array.prototype.every) { 184 | // TODO prototyp for every, 185 | // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every; 186 | return console.error('every funct not implemented'); 187 | } 188 | 189 | ids.forEach(function (id) { 190 | self.setVisible(id.id, id.value); 191 | }); 192 | } 193 | }; 194 | 195 | $rootScope.$on('$stateChangeStart', onStateChangeStart); 196 | 197 | onStateChangeStart(null, $state.current, $stateParams); 198 | 199 | return self; 200 | } 201 | ]) 202 | 203 | .controller('menuToggleCtrl', [ 204 | '$scope', 205 | '$state', 206 | 'ssSideNav', 207 | function( 208 | $scope, 209 | $state, 210 | ssSideNav) { 211 | 212 | $scope.isOpen = function(section) { 213 | return ssSideNav.isSectionSelected(section); 214 | }; 215 | 216 | $scope.toggle = function(section) { 217 | ssSideNav.toggleSelectSection(section); 218 | }; 219 | 220 | this.isOpen = $scope.isOpen; 221 | 222 | $scope.$on('SS_SIDENAV_FORCE_SELECTED_ITEM', function (event, args) { 223 | if ($scope.section && $scope.section.pages) { 224 | for (var i = $scope.section.pages.length - 1; i >= 0; i--) { 225 | var _e = $scope.section.pages[i]; 226 | 227 | if (args === _e.id) { 228 | $scope.toggle($scope.section); 229 | $state.go(_e.state); 230 | } 231 | }; 232 | } 233 | }); 234 | } 235 | ]) 236 | 237 | .controller('menuLinkCtrl', [ 238 | '$scope', 239 | '$state', 240 | '$mdSidenav', 241 | 'ssSideNav', 242 | 'ssSideNavSharedService', 243 | function( 244 | $scope, 245 | $state, 246 | $mdSidenav, 247 | ssSideNav, 248 | ssSideNavSharedService) { 249 | 250 | $scope.isSelected = function(page) { 251 | return ssSideNav.isPageSelected(page); 252 | }; 253 | 254 | $scope.focusSection = function(item) { 255 | $mdSidenav('left').close(); 256 | ssSideNavSharedService.broadcast('SS_SIDENAV_CLICK_ITEM', item); 257 | }; 258 | 259 | $scope.$state = $state; 260 | } 261 | ]) 262 | 263 | .directive('menuLink', [ 264 | function() { 265 | return { 266 | scope: { 267 | section: '=' 268 | }, 269 | templateUrl: 'views/ss/menu-link.tmpl.html', 270 | controller: 'menuLinkCtrl' 271 | }; 272 | } 273 | ]) 274 | 275 | .directive('menuToggle', [ 276 | '$timeout', 277 | '$animateCss', 278 | '$mdSidenav', 279 | '$mdMedia', 280 | function( 281 | $timeout, 282 | $animateCss, 283 | $mdSidenav, 284 | $mdMedia) { 285 | 286 | var link = function($scope, $element, $attr, $ctrl) { 287 | var _el_ul = $element.find('ul'); 288 | 289 | var getTargetHeight = function() { 290 | var _targetHeight; 291 | 292 | _el_ul.addClass('no-transition'); 293 | _el_ul.css('height', ''); 294 | 295 | _targetHeight = _el_ul.prop('clientHeight'); 296 | 297 | _el_ul.css('height', 0); 298 | _el_ul.removeClass('no-transition'); 299 | 300 | return _targetHeight; 301 | }; 302 | 303 | if (!_el_ul) { 304 | return console.warn('ss-sidenav: `menuToggle` cannot find ul element'); 305 | } 306 | 307 | $scope.$watch(function() { 308 | return $ctrl.isOpen($scope.section); 309 | }, function(open) { 310 | $timeout(function() { 311 | if (!$mdMedia('gt-sm') && !$mdSidenav('left').isOpen() && open) { 312 | return; 313 | } 314 | 315 | $animateCss(_el_ul, { 316 | from: { 317 | height: open ? 0 : (getTargetHeight() + 'px') 318 | }, 319 | to: { 320 | height: open ? (getTargetHeight() + 'px') : 0 321 | }, 322 | duration: 0.3 323 | }).start(); 324 | }, 0, false); 325 | }); 326 | }; 327 | 328 | return { 329 | scope: { 330 | section: '=' 331 | }, 332 | templateUrl: 'views/ss/menu-toggle.tmpl.html', 333 | controller: 'menuToggleCtrl', 334 | link: link 335 | }; 336 | } 337 | ]) 338 | 339 | .directive('ssSidenav', [ 340 | function () { 341 | return { 342 | restrict: 'E', 343 | replace: true, 344 | scope: { 345 | menu: '=' 346 | }, 347 | templateUrl: 'views/ss/menu-sidenav.tmpl.html' 348 | }; 349 | } 350 | ]) 351 | 352 | .directive('ssStyleColor', [ 353 | 'ssSideNavSections', 354 | function (ssSideNavSections) { 355 | return { 356 | restrict: 'A', 357 | scope: { 358 | ssStyleColor: '=' 359 | }, 360 | link: function ($scope, $el) { 361 | 362 | var _apply_color = function () { 363 | for (var p in $scope.ssStyleColor) { 364 | if ($scope.ssStyleColor.hasOwnProperty(p)) { 365 | var themeColors = ssSideNavSections.theme.colors, 366 | split = ($scope.ssStyleColor[p] || '').split('.'), 367 | hueR, 368 | colorR, 369 | colorA, 370 | hueA, 371 | colorValue; 372 | 373 | if (split.length < 2) { 374 | split.unshift('primary'); 375 | } 376 | 377 | hueR = split[1] || 'hue-1'; // 'hue-1' 378 | colorR = split[0] || 'primary'; // 'warn' 379 | 380 | // Absolute color: 'orange' 381 | colorA = themeColors[colorR] ? themeColors[colorR].name : colorR; 382 | 383 | // Absolute Hue: '500' 384 | hueA = themeColors[colorR] ? (themeColors[colorR].hues[hueR] || hueR) : hueR; 385 | 386 | colorValue = ssSideNavSections.palettes[colorA][hueA] ? ssSideNavSections.palettes[colorA][hueA].value : ssSideNavSections.palettes[colorA]['500'].value; 387 | 388 | $el.css(p, 'rgb(' + colorValue.join(',') + ')'); 389 | 390 | // Add color to md-sidenav 391 | if($el.parent().attr('md-component-id')) $el.parent().css(p, 'rgb(' + colorValue.join(',') + ')'); 392 | } 393 | } 394 | }; 395 | 396 | if (!ssSideNavSections.theme || !ssSideNavSections.palettes) { 397 | return console.warn('ss-sidenav: you probably want to ssSideNavSectionsProvider.initWithTheme($mdThemingProvider)'); 398 | } 399 | 400 | $scope.$watch('ssStyleColor', function (oldVal, newVal) { 401 | if ((oldVal && newVal) && oldVal !== newVal) { 402 | _apply_color(); 403 | } 404 | }); 405 | 406 | _apply_color(); 407 | } 408 | }; 409 | } 410 | ]) 411 | 412 | .run(['$templateCache', function($templateCache) { 413 | $templateCache.put('views/ss/menu-link.tmpl.html', 414 | '\n' + 419 | '   {{section.name}}\n' + 420 | ' \n' + 422 | ' current page\n' + 423 | ' \n' + 424 | '\n' 425 | ); 426 | 427 | $templateCache.put('views/ss/menu-toggle.tmpl.html', 428 | '\n' + 432 | '
\n' + 433 | '   {{section.name}}\n' + 434 | ' \n' + 435 | ' \n' + 439 | '
\n' + 440 | ' \n' + 441 | ' Toggle {{isOpen(section)? \'expanded\' : \'collapsed\'}}\n' + 442 | ' \n' + 443 | '
\n' + 444 | '\n' + 445 | '\n' 450 | ); 451 | 452 | $templateCache.put('views/ss/menu-sidenav.tmpl.html', 453 | '' 468 | ); 469 | }]); 470 | })(window, window.angular); 471 | -------------------------------------------------------------------------------- /demo/app/.htaccess: -------------------------------------------------------------------------------- 1 | # Apache Configuration File 2 | 3 | # (!) Using `.htaccess` files slows down Apache, therefore, if you have access 4 | # to the main server config file (usually called `httpd.conf`), you should add 5 | # this logic there: http://httpd.apache.org/docs/current/howto/htaccess.html. 6 | 7 | # ############################################################################## 8 | # # CROSS-ORIGIN RESOURCE SHARING (CORS) # 9 | # ############################################################################## 10 | 11 | # ------------------------------------------------------------------------------ 12 | # | Cross-domain AJAX requests | 13 | # ------------------------------------------------------------------------------ 14 | 15 | # Enable cross-origin AJAX requests. 16 | # http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity 17 | # http://enable-cors.org/ 18 | 19 | # 20 | # Header set Access-Control-Allow-Origin "*" 21 | # 22 | 23 | # ------------------------------------------------------------------------------ 24 | # | CORS-enabled images | 25 | # ------------------------------------------------------------------------------ 26 | 27 | # Send the CORS header for images when browsers request it. 28 | # https://developer.mozilla.org/en/CORS_Enabled_Image 29 | # http://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html 30 | # http://hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/ 31 | 32 | 33 | 34 | 35 | SetEnvIf Origin ":" IS_CORS 36 | Header set Access-Control-Allow-Origin "*" env=IS_CORS 37 | 38 | 39 | 40 | 41 | # ------------------------------------------------------------------------------ 42 | # | Web fonts access | 43 | # ------------------------------------------------------------------------------ 44 | 45 | # Allow access from all domains for web fonts 46 | 47 | 48 | 49 | Header set Access-Control-Allow-Origin "*" 50 | 51 | 52 | 53 | 54 | # ############################################################################## 55 | # # ERRORS # 56 | # ############################################################################## 57 | 58 | # ------------------------------------------------------------------------------ 59 | # | 404 error prevention for non-existing redirected folders | 60 | # ------------------------------------------------------------------------------ 61 | 62 | # Prevent Apache from returning a 404 error for a rewrite if a directory 63 | # with the same name does not exist. 64 | # http://httpd.apache.org/docs/current/content-negotiation.html#multiviews 65 | # http://www.webmasterworld.com/apache/3808792.htm 66 | 67 | Options -MultiViews 68 | 69 | # ------------------------------------------------------------------------------ 70 | # | Custom error messages / pages | 71 | # ------------------------------------------------------------------------------ 72 | 73 | # You can customize what Apache returns to the client in case of an error (see 74 | # http://httpd.apache.org/docs/current/mod/core.html#errordocument), e.g.: 75 | 76 | ErrorDocument 404 /404.html 77 | 78 | 79 | # ############################################################################## 80 | # # INTERNET EXPLORER # 81 | # ############################################################################## 82 | 83 | # ------------------------------------------------------------------------------ 84 | # | Better website experience | 85 | # ------------------------------------------------------------------------------ 86 | 87 | # Force IE to render pages in the highest available mode in the various 88 | # cases when it may not: http://hsivonen.iki.fi/doctype/ie-mode.pdf. 89 | 90 | 91 | Header set X-UA-Compatible "IE=edge" 92 | # `mod_headers` can't match based on the content-type, however, we only 93 | # want to send this header for HTML pages and not for the other resources 94 | 95 | Header unset X-UA-Compatible 96 | 97 | 98 | 99 | # ------------------------------------------------------------------------------ 100 | # | Cookie setting from iframes | 101 | # ------------------------------------------------------------------------------ 102 | 103 | # Allow cookies to be set from iframes in IE. 104 | 105 | # 106 | # Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" 107 | # 108 | 109 | # ------------------------------------------------------------------------------ 110 | # | Screen flicker | 111 | # ------------------------------------------------------------------------------ 112 | 113 | # Stop screen flicker in IE on CSS rollovers (this only works in 114 | # combination with the `ExpiresByType` directives for images from below). 115 | 116 | # BrowserMatch "MSIE" brokenvary=1 117 | # BrowserMatch "Mozilla/4.[0-9]{2}" brokenvary=1 118 | # BrowserMatch "Opera" !brokenvary 119 | # SetEnvIf brokenvary 1 force-no-vary 120 | 121 | 122 | # ############################################################################## 123 | # # MIME TYPES AND ENCODING # 124 | # ############################################################################## 125 | 126 | # ------------------------------------------------------------------------------ 127 | # | Proper MIME types for all files | 128 | # ------------------------------------------------------------------------------ 129 | 130 | 131 | 132 | # Audio 133 | AddType audio/mp4 m4a f4a f4b 134 | AddType audio/ogg oga ogg 135 | 136 | # JavaScript 137 | # Normalize to standard type (it's sniffed in IE anyways): 138 | # http://tools.ietf.org/html/rfc4329#section-7.2 139 | AddType application/javascript js jsonp 140 | AddType application/json json 141 | 142 | # Video 143 | AddType video/mp4 mp4 m4v f4v f4p 144 | AddType video/ogg ogv 145 | AddType video/webm webm 146 | AddType video/x-flv flv 147 | 148 | # Web fonts 149 | AddType application/font-woff woff 150 | AddType application/vnd.ms-fontobject eot 151 | 152 | # Browsers usually ignore the font MIME types and sniff the content, 153 | # however, Chrome shows a warning if other MIME types are used for the 154 | # following fonts. 155 | AddType application/x-font-ttf ttc ttf 156 | AddType font/opentype otf 157 | 158 | # Make SVGZ fonts work on iPad: 159 | # https://twitter.com/FontSquirrel/status/14855840545 160 | AddType image/svg+xml svg svgz 161 | AddEncoding gzip svgz 162 | 163 | # Other 164 | AddType application/octet-stream safariextz 165 | AddType application/x-chrome-extension crx 166 | AddType application/x-opera-extension oex 167 | AddType application/x-shockwave-flash swf 168 | AddType application/x-web-app-manifest+json webapp 169 | AddType application/x-xpinstall xpi 170 | AddType application/xml atom rdf rss xml 171 | AddType image/webp webp 172 | AddType image/x-icon ico 173 | AddType text/cache-manifest appcache manifest 174 | AddType text/vtt vtt 175 | AddType text/x-component htc 176 | AddType text/x-vcard vcf 177 | 178 | 179 | 180 | # ------------------------------------------------------------------------------ 181 | # | UTF-8 encoding | 182 | # ------------------------------------------------------------------------------ 183 | 184 | # Use UTF-8 encoding for anything served as `text/html` or `text/plain`. 185 | AddDefaultCharset utf-8 186 | 187 | # Force UTF-8 for certain file formats. 188 | 189 | AddCharset utf-8 .atom .css .js .json .rss .vtt .webapp .xml 190 | 191 | 192 | 193 | # ############################################################################## 194 | # # URL REWRITES # 195 | # ############################################################################## 196 | 197 | # ------------------------------------------------------------------------------ 198 | # | Rewrite engine | 199 | # ------------------------------------------------------------------------------ 200 | 201 | # Turning on the rewrite engine and enabling the `FollowSymLinks` option is 202 | # necessary for the following directives to work. 203 | 204 | # If your web host doesn't allow the `FollowSymlinks` option, you may need to 205 | # comment it out and use `Options +SymLinksIfOwnerMatch` but, be aware of the 206 | # performance impact: http://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks 207 | 208 | # Also, some cloud hosting services require `RewriteBase` to be set: 209 | # http://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-mod-rewrite-not-working-on-my-site 210 | 211 | 212 | Options +FollowSymlinks 213 | # Options +SymLinksIfOwnerMatch 214 | RewriteEngine On 215 | # RewriteBase / 216 | 217 | 218 | # ------------------------------------------------------------------------------ 219 | # | Suppressing / Forcing the "www." at the beginning of URLs | 220 | # ------------------------------------------------------------------------------ 221 | 222 | # The same content should never be available under two different URLs especially 223 | # not with and without "www." at the beginning. This can cause SEO problems 224 | # (duplicate content), therefore, you should choose one of the alternatives and 225 | # redirect the other one. 226 | 227 | # By default option 1 (no "www.") is activated: 228 | # http://no-www.org/faq.php?q=class_b 229 | 230 | # If you'd prefer to use option 2, just comment out all the lines from option 1 231 | # and uncomment the ones from option 2. 232 | 233 | # IMPORTANT: NEVER USE BOTH RULES AT THE SAME TIME! 234 | 235 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 236 | 237 | # Option 1: rewrite www.example.com → example.com 238 | 239 | 240 | RewriteCond %{HTTPS} !=on 241 | RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 242 | RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L] 243 | 244 | 245 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 246 | 247 | # Option 2: rewrite example.com → www.example.com 248 | 249 | # Be aware that the following might not be a good idea if you use "real" 250 | # subdomains for certain parts of your website. 251 | 252 | # 253 | # RewriteCond %{HTTPS} !=on 254 | # RewriteCond %{HTTP_HOST} !^www\..+$ [NC] 255 | # RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 256 | # 257 | 258 | 259 | # ############################################################################## 260 | # # SECURITY # 261 | # ############################################################################## 262 | 263 | # ------------------------------------------------------------------------------ 264 | # | Content Security Policy (CSP) | 265 | # ------------------------------------------------------------------------------ 266 | 267 | # You can mitigate the risk of cross-site scripting and other content-injection 268 | # attacks by setting a Content Security Policy which whitelists trusted sources 269 | # of content for your site. 270 | 271 | # The example header below allows ONLY scripts that are loaded from the current 272 | # site's origin (no inline scripts, no CDN, etc). This almost certainly won't 273 | # work as-is for your site! 274 | 275 | # To get all the details you'll need to craft a reasonable policy for your site, 276 | # read: http://html5rocks.com/en/tutorials/security/content-security-policy (or 277 | # see the specification: http://w3.org/TR/CSP). 278 | 279 | # 280 | # Header set Content-Security-Policy "script-src 'self'; object-src 'self'" 281 | # 282 | # Header unset Content-Security-Policy 283 | # 284 | # 285 | 286 | # ------------------------------------------------------------------------------ 287 | # | File access | 288 | # ------------------------------------------------------------------------------ 289 | 290 | # Block access to directories without a default document. 291 | # Usually you should leave this uncommented because you shouldn't allow anyone 292 | # to surf through every directory on your server (which may includes rather 293 | # private places like the CMS's directories). 294 | 295 | 296 | Options -Indexes 297 | 298 | 299 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 300 | 301 | # Block access to hidden files and directories. 302 | # This includes directories used by version control systems such as Git and SVN. 303 | 304 | 305 | RewriteCond %{SCRIPT_FILENAME} -d [OR] 306 | RewriteCond %{SCRIPT_FILENAME} -f 307 | RewriteRule "(^|/)\." - [F] 308 | 309 | 310 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 311 | 312 | # Block access to backup and source files. 313 | # These files may be left by some text editors and can pose a great security 314 | # danger when anyone has access to them. 315 | 316 | 317 | Order allow,deny 318 | Deny from all 319 | Satisfy All 320 | 321 | 322 | # ------------------------------------------------------------------------------ 323 | # | Secure Sockets Layer (SSL) | 324 | # ------------------------------------------------------------------------------ 325 | 326 | # Rewrite secure requests properly to prevent SSL certificate warnings, e.g.: 327 | # prevent `https://www.example.com` when your certificate only allows 328 | # `https://secure.example.com`. 329 | 330 | # 331 | # RewriteCond %{SERVER_PORT} !^443 332 | # RewriteRule ^ https://example-domain-please-change-me.com%{REQUEST_URI} [R=301,L] 333 | # 334 | 335 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 336 | 337 | # Force client-side SSL redirection. 338 | 339 | # If a user types "example.com" in his browser, the above rule will redirect him 340 | # to the secure version of the site. That still leaves a window of opportunity 341 | # (the initial HTTP connection) for an attacker to downgrade or redirect the 342 | # request. The following header ensures that browser will ONLY connect to your 343 | # server via HTTPS, regardless of what the users type in the address bar. 344 | # http://www.html5rocks.com/en/tutorials/security/transport-layer-security/ 345 | 346 | # 347 | # Header set Strict-Transport-Security max-age=16070400; 348 | # 349 | 350 | # ------------------------------------------------------------------------------ 351 | # | Server software information | 352 | # ------------------------------------------------------------------------------ 353 | 354 | # Avoid displaying the exact Apache version number, the description of the 355 | # generic OS-type and the information about Apache's compiled-in modules. 356 | 357 | # ADD THIS DIRECTIVE IN THE `httpd.conf` AS IT WILL NOT WORK IN THE `.htaccess`! 358 | 359 | # ServerTokens Prod 360 | 361 | 362 | # ############################################################################## 363 | # # WEB PERFORMANCE # 364 | # ############################################################################## 365 | 366 | # ------------------------------------------------------------------------------ 367 | # | Compression | 368 | # ------------------------------------------------------------------------------ 369 | 370 | 371 | 372 | # Force compression for mangled headers. 373 | # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping 374 | 375 | 376 | SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding 377 | RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding 378 | 379 | 380 | 381 | # Compress all output labeled with one of the following MIME-types 382 | # (for Apache versions below 2.3.7, you don't need to enable `mod_filter` 383 | # and can remove the `` and `` lines 384 | # as `AddOutputFilterByType` is still in the core directives). 385 | 386 | AddOutputFilterByType DEFLATE application/atom+xml \ 387 | application/javascript \ 388 | application/json \ 389 | application/rss+xml \ 390 | application/vnd.ms-fontobject \ 391 | application/x-font-ttf \ 392 | application/x-web-app-manifest+json \ 393 | application/xhtml+xml \ 394 | application/xml \ 395 | font/opentype \ 396 | image/svg+xml \ 397 | image/x-icon \ 398 | text/css \ 399 | text/html \ 400 | text/plain \ 401 | text/x-component \ 402 | text/xml 403 | 404 | 405 | 406 | 407 | # ------------------------------------------------------------------------------ 408 | # | Content transformations | 409 | # ------------------------------------------------------------------------------ 410 | 411 | # Prevent some of the mobile network providers from modifying the content of 412 | # your site: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.5. 413 | 414 | # 415 | # Header set Cache-Control "no-transform" 416 | # 417 | 418 | # ------------------------------------------------------------------------------ 419 | # | ETag removal | 420 | # ------------------------------------------------------------------------------ 421 | 422 | # Since we're sending far-future expires headers (see below), ETags can 423 | # be removed: http://developer.yahoo.com/performance/rules.html#etags. 424 | 425 | # `FileETag None` is not enough for every server. 426 | 427 | Header unset ETag 428 | 429 | 430 | FileETag None 431 | 432 | # ------------------------------------------------------------------------------ 433 | # | Expires headers (for better cache control) | 434 | # ------------------------------------------------------------------------------ 435 | 436 | # The following expires headers are set pretty far in the future. If you don't 437 | # control versioning with filename-based cache busting, consider lowering the 438 | # cache time for resources like CSS and JS to something like 1 week. 439 | 440 | 441 | 442 | ExpiresActive on 443 | ExpiresDefault "access plus 1 month" 444 | 445 | # CSS 446 | ExpiresByType text/css "access plus 1 year" 447 | 448 | # Data interchange 449 | ExpiresByType application/json "access plus 0 seconds" 450 | ExpiresByType application/xml "access plus 0 seconds" 451 | ExpiresByType text/xml "access plus 0 seconds" 452 | 453 | # Favicon (cannot be renamed!) 454 | ExpiresByType image/x-icon "access plus 1 week" 455 | 456 | # HTML components (HTCs) 457 | ExpiresByType text/x-component "access plus 1 month" 458 | 459 | # HTML 460 | ExpiresByType text/html "access plus 0 seconds" 461 | 462 | # JavaScript 463 | ExpiresByType application/javascript "access plus 1 year" 464 | 465 | # Manifest files 466 | ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" 467 | ExpiresByType text/cache-manifest "access plus 0 seconds" 468 | 469 | # Media 470 | ExpiresByType audio/ogg "access plus 1 month" 471 | ExpiresByType image/gif "access plus 1 month" 472 | ExpiresByType image/jpeg "access plus 1 month" 473 | ExpiresByType image/png "access plus 1 month" 474 | ExpiresByType video/mp4 "access plus 1 month" 475 | ExpiresByType video/ogg "access plus 1 month" 476 | ExpiresByType video/webm "access plus 1 month" 477 | 478 | # Web feeds 479 | ExpiresByType application/atom+xml "access plus 1 hour" 480 | ExpiresByType application/rss+xml "access plus 1 hour" 481 | 482 | # Web fonts 483 | ExpiresByType application/font-woff "access plus 1 month" 484 | ExpiresByType application/vnd.ms-fontobject "access plus 1 month" 485 | ExpiresByType application/x-font-ttf "access plus 1 month" 486 | ExpiresByType font/opentype "access plus 1 month" 487 | ExpiresByType image/svg+xml "access plus 1 month" 488 | 489 | 490 | 491 | # ------------------------------------------------------------------------------ 492 | # | Filename-based cache busting | 493 | # ------------------------------------------------------------------------------ 494 | 495 | # If you're not using a build process to manage your filename version revving, 496 | # you might want to consider enabling the following directives to route all 497 | # requests such as `/css/style.12345.css` to `/css/style.css`. 498 | 499 | # To understand why this is important and a better idea than `*.css?v231`, read: 500 | # http://stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring 501 | 502 | # 503 | # RewriteCond %{REQUEST_FILENAME} !-f 504 | # RewriteCond %{REQUEST_FILENAME} !-d 505 | # RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L] 506 | # 507 | 508 | # ------------------------------------------------------------------------------ 509 | # | File concatenation | 510 | # ------------------------------------------------------------------------------ 511 | 512 | # Allow concatenation from within specific CSS and JS files, e.g.: 513 | # Inside of `script.combined.js` you could have 514 | # 515 | # 516 | # and they would be included into this single file. 517 | 518 | # 519 | # 520 | # Options +Includes 521 | # AddOutputFilterByType INCLUDES application/javascript application/json 522 | # SetOutputFilter INCLUDES 523 | # 524 | # 525 | # Options +Includes 526 | # AddOutputFilterByType INCLUDES text/css 527 | # SetOutputFilter INCLUDES 528 | # 529 | # 530 | 531 | # ------------------------------------------------------------------------------ 532 | # | Persistent connections | 533 | # ------------------------------------------------------------------------------ 534 | 535 | # Allow multiple requests to be sent over the same TCP connection: 536 | # http://httpd.apache.org/docs/current/en/mod/core.html#keepalive. 537 | 538 | # Enable if you serve a lot of static content but, be aware of the 539 | # possible disadvantages! 540 | 541 | # 542 | # Header set Connection Keep-Alive 543 | # 544 | -------------------------------------------------------------------------------- /demo/dist/.htaccess: -------------------------------------------------------------------------------- 1 | # Apache Configuration File 2 | 3 | # (!) Using `.htaccess` files slows down Apache, therefore, if you have access 4 | # to the main server config file (usually called `httpd.conf`), you should add 5 | # this logic there: http://httpd.apache.org/docs/current/howto/htaccess.html. 6 | 7 | # ############################################################################## 8 | # # CROSS-ORIGIN RESOURCE SHARING (CORS) # 9 | # ############################################################################## 10 | 11 | # ------------------------------------------------------------------------------ 12 | # | Cross-domain AJAX requests | 13 | # ------------------------------------------------------------------------------ 14 | 15 | # Enable cross-origin AJAX requests. 16 | # http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity 17 | # http://enable-cors.org/ 18 | 19 | # 20 | # Header set Access-Control-Allow-Origin "*" 21 | # 22 | 23 | # ------------------------------------------------------------------------------ 24 | # | CORS-enabled images | 25 | # ------------------------------------------------------------------------------ 26 | 27 | # Send the CORS header for images when browsers request it. 28 | # https://developer.mozilla.org/en/CORS_Enabled_Image 29 | # http://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html 30 | # http://hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/ 31 | 32 | 33 | 34 | 35 | SetEnvIf Origin ":" IS_CORS 36 | Header set Access-Control-Allow-Origin "*" env=IS_CORS 37 | 38 | 39 | 40 | 41 | # ------------------------------------------------------------------------------ 42 | # | Web fonts access | 43 | # ------------------------------------------------------------------------------ 44 | 45 | # Allow access from all domains for web fonts 46 | 47 | 48 | 49 | Header set Access-Control-Allow-Origin "*" 50 | 51 | 52 | 53 | 54 | # ############################################################################## 55 | # # ERRORS # 56 | # ############################################################################## 57 | 58 | # ------------------------------------------------------------------------------ 59 | # | 404 error prevention for non-existing redirected folders | 60 | # ------------------------------------------------------------------------------ 61 | 62 | # Prevent Apache from returning a 404 error for a rewrite if a directory 63 | # with the same name does not exist. 64 | # http://httpd.apache.org/docs/current/content-negotiation.html#multiviews 65 | # http://www.webmasterworld.com/apache/3808792.htm 66 | 67 | Options -MultiViews 68 | 69 | # ------------------------------------------------------------------------------ 70 | # | Custom error messages / pages | 71 | # ------------------------------------------------------------------------------ 72 | 73 | # You can customize what Apache returns to the client in case of an error (see 74 | # http://httpd.apache.org/docs/current/mod/core.html#errordocument), e.g.: 75 | 76 | ErrorDocument 404 /404.html 77 | 78 | 79 | # ############################################################################## 80 | # # INTERNET EXPLORER # 81 | # ############################################################################## 82 | 83 | # ------------------------------------------------------------------------------ 84 | # | Better website experience | 85 | # ------------------------------------------------------------------------------ 86 | 87 | # Force IE to render pages in the highest available mode in the various 88 | # cases when it may not: http://hsivonen.iki.fi/doctype/ie-mode.pdf. 89 | 90 | 91 | Header set X-UA-Compatible "IE=edge" 92 | # `mod_headers` can't match based on the content-type, however, we only 93 | # want to send this header for HTML pages and not for the other resources 94 | 95 | Header unset X-UA-Compatible 96 | 97 | 98 | 99 | # ------------------------------------------------------------------------------ 100 | # | Cookie setting from iframes | 101 | # ------------------------------------------------------------------------------ 102 | 103 | # Allow cookies to be set from iframes in IE. 104 | 105 | # 106 | # Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" 107 | # 108 | 109 | # ------------------------------------------------------------------------------ 110 | # | Screen flicker | 111 | # ------------------------------------------------------------------------------ 112 | 113 | # Stop screen flicker in IE on CSS rollovers (this only works in 114 | # combination with the `ExpiresByType` directives for images from below). 115 | 116 | # BrowserMatch "MSIE" brokenvary=1 117 | # BrowserMatch "Mozilla/4.[0-9]{2}" brokenvary=1 118 | # BrowserMatch "Opera" !brokenvary 119 | # SetEnvIf brokenvary 1 force-no-vary 120 | 121 | 122 | # ############################################################################## 123 | # # MIME TYPES AND ENCODING # 124 | # ############################################################################## 125 | 126 | # ------------------------------------------------------------------------------ 127 | # | Proper MIME types for all files | 128 | # ------------------------------------------------------------------------------ 129 | 130 | 131 | 132 | # Audio 133 | AddType audio/mp4 m4a f4a f4b 134 | AddType audio/ogg oga ogg 135 | 136 | # JavaScript 137 | # Normalize to standard type (it's sniffed in IE anyways): 138 | # http://tools.ietf.org/html/rfc4329#section-7.2 139 | AddType application/javascript js jsonp 140 | AddType application/json json 141 | 142 | # Video 143 | AddType video/mp4 mp4 m4v f4v f4p 144 | AddType video/ogg ogv 145 | AddType video/webm webm 146 | AddType video/x-flv flv 147 | 148 | # Web fonts 149 | AddType application/font-woff woff 150 | AddType application/vnd.ms-fontobject eot 151 | 152 | # Browsers usually ignore the font MIME types and sniff the content, 153 | # however, Chrome shows a warning if other MIME types are used for the 154 | # following fonts. 155 | AddType application/x-font-ttf ttc ttf 156 | AddType font/opentype otf 157 | 158 | # Make SVGZ fonts work on iPad: 159 | # https://twitter.com/FontSquirrel/status/14855840545 160 | AddType image/svg+xml svg svgz 161 | AddEncoding gzip svgz 162 | 163 | # Other 164 | AddType application/octet-stream safariextz 165 | AddType application/x-chrome-extension crx 166 | AddType application/x-opera-extension oex 167 | AddType application/x-shockwave-flash swf 168 | AddType application/x-web-app-manifest+json webapp 169 | AddType application/x-xpinstall xpi 170 | AddType application/xml atom rdf rss xml 171 | AddType image/webp webp 172 | AddType image/x-icon ico 173 | AddType text/cache-manifest appcache manifest 174 | AddType text/vtt vtt 175 | AddType text/x-component htc 176 | AddType text/x-vcard vcf 177 | 178 | 179 | 180 | # ------------------------------------------------------------------------------ 181 | # | UTF-8 encoding | 182 | # ------------------------------------------------------------------------------ 183 | 184 | # Use UTF-8 encoding for anything served as `text/html` or `text/plain`. 185 | AddDefaultCharset utf-8 186 | 187 | # Force UTF-8 for certain file formats. 188 | 189 | AddCharset utf-8 .atom .css .js .json .rss .vtt .webapp .xml 190 | 191 | 192 | 193 | # ############################################################################## 194 | # # URL REWRITES # 195 | # ############################################################################## 196 | 197 | # ------------------------------------------------------------------------------ 198 | # | Rewrite engine | 199 | # ------------------------------------------------------------------------------ 200 | 201 | # Turning on the rewrite engine and enabling the `FollowSymLinks` option is 202 | # necessary for the following directives to work. 203 | 204 | # If your web host doesn't allow the `FollowSymlinks` option, you may need to 205 | # comment it out and use `Options +SymLinksIfOwnerMatch` but, be aware of the 206 | # performance impact: http://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks 207 | 208 | # Also, some cloud hosting services require `RewriteBase` to be set: 209 | # http://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-mod-rewrite-not-working-on-my-site 210 | 211 | 212 | Options +FollowSymlinks 213 | # Options +SymLinksIfOwnerMatch 214 | RewriteEngine On 215 | # RewriteBase / 216 | 217 | 218 | # ------------------------------------------------------------------------------ 219 | # | Suppressing / Forcing the "www." at the beginning of URLs | 220 | # ------------------------------------------------------------------------------ 221 | 222 | # The same content should never be available under two different URLs especially 223 | # not with and without "www." at the beginning. This can cause SEO problems 224 | # (duplicate content), therefore, you should choose one of the alternatives and 225 | # redirect the other one. 226 | 227 | # By default option 1 (no "www.") is activated: 228 | # http://no-www.org/faq.php?q=class_b 229 | 230 | # If you'd prefer to use option 2, just comment out all the lines from option 1 231 | # and uncomment the ones from option 2. 232 | 233 | # IMPORTANT: NEVER USE BOTH RULES AT THE SAME TIME! 234 | 235 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 236 | 237 | # Option 1: rewrite www.example.com → example.com 238 | 239 | 240 | RewriteCond %{HTTPS} !=on 241 | RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 242 | RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L] 243 | 244 | 245 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 246 | 247 | # Option 2: rewrite example.com → www.example.com 248 | 249 | # Be aware that the following might not be a good idea if you use "real" 250 | # subdomains for certain parts of your website. 251 | 252 | # 253 | # RewriteCond %{HTTPS} !=on 254 | # RewriteCond %{HTTP_HOST} !^www\..+$ [NC] 255 | # RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 256 | # 257 | 258 | 259 | # ############################################################################## 260 | # # SECURITY # 261 | # ############################################################################## 262 | 263 | # ------------------------------------------------------------------------------ 264 | # | Content Security Policy (CSP) | 265 | # ------------------------------------------------------------------------------ 266 | 267 | # You can mitigate the risk of cross-site scripting and other content-injection 268 | # attacks by setting a Content Security Policy which whitelists trusted sources 269 | # of content for your site. 270 | 271 | # The example header below allows ONLY scripts that are loaded from the current 272 | # site's origin (no inline scripts, no CDN, etc). This almost certainly won't 273 | # work as-is for your site! 274 | 275 | # To get all the details you'll need to craft a reasonable policy for your site, 276 | # read: http://html5rocks.com/en/tutorials/security/content-security-policy (or 277 | # see the specification: http://w3.org/TR/CSP). 278 | 279 | # 280 | # Header set Content-Security-Policy "script-src 'self'; object-src 'self'" 281 | # 282 | # Header unset Content-Security-Policy 283 | # 284 | # 285 | 286 | # ------------------------------------------------------------------------------ 287 | # | File access | 288 | # ------------------------------------------------------------------------------ 289 | 290 | # Block access to directories without a default document. 291 | # Usually you should leave this uncommented because you shouldn't allow anyone 292 | # to surf through every directory on your server (which may includes rather 293 | # private places like the CMS's directories). 294 | 295 | 296 | Options -Indexes 297 | 298 | 299 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 300 | 301 | # Block access to hidden files and directories. 302 | # This includes directories used by version control systems such as Git and SVN. 303 | 304 | 305 | RewriteCond %{SCRIPT_FILENAME} -d [OR] 306 | RewriteCond %{SCRIPT_FILENAME} -f 307 | RewriteRule "(^|/)\." - [F] 308 | 309 | 310 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 311 | 312 | # Block access to backup and source files. 313 | # These files may be left by some text editors and can pose a great security 314 | # danger when anyone has access to them. 315 | 316 | 317 | Order allow,deny 318 | Deny from all 319 | Satisfy All 320 | 321 | 322 | # ------------------------------------------------------------------------------ 323 | # | Secure Sockets Layer (SSL) | 324 | # ------------------------------------------------------------------------------ 325 | 326 | # Rewrite secure requests properly to prevent SSL certificate warnings, e.g.: 327 | # prevent `https://www.example.com` when your certificate only allows 328 | # `https://secure.example.com`. 329 | 330 | # 331 | # RewriteCond %{SERVER_PORT} !^443 332 | # RewriteRule ^ https://example-domain-please-change-me.com%{REQUEST_URI} [R=301,L] 333 | # 334 | 335 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 336 | 337 | # Force client-side SSL redirection. 338 | 339 | # If a user types "example.com" in his browser, the above rule will redirect him 340 | # to the secure version of the site. That still leaves a window of opportunity 341 | # (the initial HTTP connection) for an attacker to downgrade or redirect the 342 | # request. The following header ensures that browser will ONLY connect to your 343 | # server via HTTPS, regardless of what the users type in the address bar. 344 | # http://www.html5rocks.com/en/tutorials/security/transport-layer-security/ 345 | 346 | # 347 | # Header set Strict-Transport-Security max-age=16070400; 348 | # 349 | 350 | # ------------------------------------------------------------------------------ 351 | # | Server software information | 352 | # ------------------------------------------------------------------------------ 353 | 354 | # Avoid displaying the exact Apache version number, the description of the 355 | # generic OS-type and the information about Apache's compiled-in modules. 356 | 357 | # ADD THIS DIRECTIVE IN THE `httpd.conf` AS IT WILL NOT WORK IN THE `.htaccess`! 358 | 359 | # ServerTokens Prod 360 | 361 | 362 | # ############################################################################## 363 | # # WEB PERFORMANCE # 364 | # ############################################################################## 365 | 366 | # ------------------------------------------------------------------------------ 367 | # | Compression | 368 | # ------------------------------------------------------------------------------ 369 | 370 | 371 | 372 | # Force compression for mangled headers. 373 | # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping 374 | 375 | 376 | SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding 377 | RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding 378 | 379 | 380 | 381 | # Compress all output labeled with one of the following MIME-types 382 | # (for Apache versions below 2.3.7, you don't need to enable `mod_filter` 383 | # and can remove the `` and `` lines 384 | # as `AddOutputFilterByType` is still in the core directives). 385 | 386 | AddOutputFilterByType DEFLATE application/atom+xml \ 387 | application/javascript \ 388 | application/json \ 389 | application/rss+xml \ 390 | application/vnd.ms-fontobject \ 391 | application/x-font-ttf \ 392 | application/x-web-app-manifest+json \ 393 | application/xhtml+xml \ 394 | application/xml \ 395 | font/opentype \ 396 | image/svg+xml \ 397 | image/x-icon \ 398 | text/css \ 399 | text/html \ 400 | text/plain \ 401 | text/x-component \ 402 | text/xml 403 | 404 | 405 | 406 | 407 | # ------------------------------------------------------------------------------ 408 | # | Content transformations | 409 | # ------------------------------------------------------------------------------ 410 | 411 | # Prevent some of the mobile network providers from modifying the content of 412 | # your site: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.5. 413 | 414 | # 415 | # Header set Cache-Control "no-transform" 416 | # 417 | 418 | # ------------------------------------------------------------------------------ 419 | # | ETag removal | 420 | # ------------------------------------------------------------------------------ 421 | 422 | # Since we're sending far-future expires headers (see below), ETags can 423 | # be removed: http://developer.yahoo.com/performance/rules.html#etags. 424 | 425 | # `FileETag None` is not enough for every server. 426 | 427 | Header unset ETag 428 | 429 | 430 | FileETag None 431 | 432 | # ------------------------------------------------------------------------------ 433 | # | Expires headers (for better cache control) | 434 | # ------------------------------------------------------------------------------ 435 | 436 | # The following expires headers are set pretty far in the future. If you don't 437 | # control versioning with filename-based cache busting, consider lowering the 438 | # cache time for resources like CSS and JS to something like 1 week. 439 | 440 | 441 | 442 | ExpiresActive on 443 | ExpiresDefault "access plus 1 month" 444 | 445 | # CSS 446 | ExpiresByType text/css "access plus 1 year" 447 | 448 | # Data interchange 449 | ExpiresByType application/json "access plus 0 seconds" 450 | ExpiresByType application/xml "access plus 0 seconds" 451 | ExpiresByType text/xml "access plus 0 seconds" 452 | 453 | # Favicon (cannot be renamed!) 454 | ExpiresByType image/x-icon "access plus 1 week" 455 | 456 | # HTML components (HTCs) 457 | ExpiresByType text/x-component "access plus 1 month" 458 | 459 | # HTML 460 | ExpiresByType text/html "access plus 0 seconds" 461 | 462 | # JavaScript 463 | ExpiresByType application/javascript "access plus 1 year" 464 | 465 | # Manifest files 466 | ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" 467 | ExpiresByType text/cache-manifest "access plus 0 seconds" 468 | 469 | # Media 470 | ExpiresByType audio/ogg "access plus 1 month" 471 | ExpiresByType image/gif "access plus 1 month" 472 | ExpiresByType image/jpeg "access plus 1 month" 473 | ExpiresByType image/png "access plus 1 month" 474 | ExpiresByType video/mp4 "access plus 1 month" 475 | ExpiresByType video/ogg "access plus 1 month" 476 | ExpiresByType video/webm "access plus 1 month" 477 | 478 | # Web feeds 479 | ExpiresByType application/atom+xml "access plus 1 hour" 480 | ExpiresByType application/rss+xml "access plus 1 hour" 481 | 482 | # Web fonts 483 | ExpiresByType application/font-woff "access plus 1 month" 484 | ExpiresByType application/vnd.ms-fontobject "access plus 1 month" 485 | ExpiresByType application/x-font-ttf "access plus 1 month" 486 | ExpiresByType font/opentype "access plus 1 month" 487 | ExpiresByType image/svg+xml "access plus 1 month" 488 | 489 | 490 | 491 | # ------------------------------------------------------------------------------ 492 | # | Filename-based cache busting | 493 | # ------------------------------------------------------------------------------ 494 | 495 | # If you're not using a build process to manage your filename version revving, 496 | # you might want to consider enabling the following directives to route all 497 | # requests such as `/css/style.12345.css` to `/css/style.css`. 498 | 499 | # To understand why this is important and a better idea than `*.css?v231`, read: 500 | # http://stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring 501 | 502 | # 503 | # RewriteCond %{REQUEST_FILENAME} !-f 504 | # RewriteCond %{REQUEST_FILENAME} !-d 505 | # RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L] 506 | # 507 | 508 | # ------------------------------------------------------------------------------ 509 | # | File concatenation | 510 | # ------------------------------------------------------------------------------ 511 | 512 | # Allow concatenation from within specific CSS and JS files, e.g.: 513 | # Inside of `script.combined.js` you could have 514 | # 515 | # 516 | # and they would be included into this single file. 517 | 518 | # 519 | # 520 | # Options +Includes 521 | # AddOutputFilterByType INCLUDES application/javascript application/json 522 | # SetOutputFilter INCLUDES 523 | # 524 | # 525 | # Options +Includes 526 | # AddOutputFilterByType INCLUDES text/css 527 | # SetOutputFilter INCLUDES 528 | # 529 | # 530 | 531 | # ------------------------------------------------------------------------------ 532 | # | Persistent connections | 533 | # ------------------------------------------------------------------------------ 534 | 535 | # Allow multiple requests to be sent over the same TCP connection: 536 | # http://httpd.apache.org/docs/current/en/mod/core.html#keepalive. 537 | 538 | # Enable if you serve a lot of static content but, be aware of the 539 | # possible disadvantages! 540 | 541 | # 542 | # Header set Connection Keep-Alive 543 | # 544 | -------------------------------------------------------------------------------- /demo/app/styles/material.color.css: -------------------------------------------------------------------------------- 1 | .red.lighten-5 { 2 | background-color: #FFEBEE !important; } 3 | 4 | .red-text.text-lighten-5 { 5 | color: #FFEBEE !important; } 6 | 7 | .red.lighten-4 { 8 | background-color: #FFCDD2 !important; } 9 | 10 | .red-text.text-lighten-4 { 11 | color: #FFCDD2 !important; } 12 | 13 | .red.lighten-3 { 14 | background-color: #EF9A9A !important; } 15 | 16 | .red-text.text-lighten-3 { 17 | color: #EF9A9A !important; } 18 | 19 | .red.lighten-2 { 20 | background-color: #E57373 !important; } 21 | 22 | .red-text.text-lighten-2 { 23 | color: #E57373 !important; } 24 | 25 | .red.lighten-1 { 26 | background-color: #EF5350 !important; } 27 | 28 | .red-text.text-lighten-1 { 29 | color: #EF5350 !important; } 30 | 31 | .red { 32 | background-color: #F44336 !important; } 33 | 34 | .red-text { 35 | color: #F44336 !important; } 36 | 37 | .red.darken-1 { 38 | background-color: #E53935 !important; } 39 | 40 | .red-text.text-darken-1 { 41 | color: #E53935 !important; } 42 | 43 | .red.darken-2 { 44 | background-color: #D32F2F !important; } 45 | 46 | .red-text.text-darken-2 { 47 | color: #D32F2F !important; } 48 | 49 | .red.darken-3 { 50 | background-color: #C62828 !important; } 51 | 52 | .red-text.text-darken-3 { 53 | color: #C62828 !important; } 54 | 55 | .red.darken-4 { 56 | background-color: #B71C1C !important; } 57 | 58 | .red-text.text-darken-4 { 59 | color: #B71C1C !important; } 60 | 61 | .red.accent-1 { 62 | background-color: #FF8A80 !important; } 63 | 64 | .red-text.text-accent-1 { 65 | color: #FF8A80 !important; } 66 | 67 | .red.accent-2 { 68 | background-color: #FF5252 !important; } 69 | 70 | .red-text.text-accent-2 { 71 | color: #FF5252 !important; } 72 | 73 | .red.accent-3 { 74 | background-color: #FF1744 !important; } 75 | 76 | .red-text.text-accent-3 { 77 | color: #FF1744 !important; } 78 | 79 | .red.accent-4 { 80 | background-color: #D50000 !important; } 81 | 82 | .red-text.text-accent-4 { 83 | color: #D50000 !important; } 84 | 85 | .pink.lighten-5 { 86 | background-color: #fce4ec !important; } 87 | 88 | .pink-text.text-lighten-5 { 89 | color: #fce4ec !important; } 90 | 91 | .pink.lighten-4 { 92 | background-color: #f8bbd0 !important; } 93 | 94 | .pink-text.text-lighten-4 { 95 | color: #f8bbd0 !important; } 96 | 97 | .pink.lighten-3 { 98 | background-color: #f48fb1 !important; } 99 | 100 | .pink-text.text-lighten-3 { 101 | color: #f48fb1 !important; } 102 | 103 | .pink.lighten-2 { 104 | background-color: #f06292 !important; } 105 | 106 | .pink-text.text-lighten-2 { 107 | color: #f06292 !important; } 108 | 109 | .pink.lighten-1 { 110 | background-color: #ec407a !important; } 111 | 112 | .pink-text.text-lighten-1 { 113 | color: #ec407a !important; } 114 | 115 | .pink { 116 | background-color: #e91e63 !important; } 117 | 118 | .pink-text { 119 | color: #e91e63 !important; } 120 | 121 | .pink.darken-1 { 122 | background-color: #d81b60 !important; } 123 | 124 | .pink-text.text-darken-1 { 125 | color: #d81b60 !important; } 126 | 127 | .pink.darken-2 { 128 | background-color: #c2185b !important; } 129 | 130 | .pink-text.text-darken-2 { 131 | color: #c2185b !important; } 132 | 133 | .pink.darken-3 { 134 | background-color: #ad1457 !important; } 135 | 136 | .pink-text.text-darken-3 { 137 | color: #ad1457 !important; } 138 | 139 | .pink.darken-4 { 140 | background-color: #880e4f !important; } 141 | 142 | .pink-text.text-darken-4 { 143 | color: #880e4f !important; } 144 | 145 | .pink.accent-1 { 146 | background-color: #ff80ab !important; } 147 | 148 | .pink-text.text-accent-1 { 149 | color: #ff80ab !important; } 150 | 151 | .pink.accent-2 { 152 | background-color: #ff4081 !important; } 153 | 154 | .pink-text.text-accent-2 { 155 | color: #ff4081 !important; } 156 | 157 | .pink.accent-3 { 158 | background-color: #f50057 !important; } 159 | 160 | .pink-text.text-accent-3 { 161 | color: #f50057 !important; } 162 | 163 | .pink.accent-4 { 164 | background-color: #c51162 !important; } 165 | 166 | .pink-text.text-accent-4 { 167 | color: #c51162 !important; } 168 | 169 | .purple.lighten-5 { 170 | background-color: #f3e5f5 !important; } 171 | 172 | .purple-text.text-lighten-5 { 173 | color: #f3e5f5 !important; } 174 | 175 | .purple.lighten-4 { 176 | background-color: #e1bee7 !important; } 177 | 178 | .purple-text.text-lighten-4 { 179 | color: #e1bee7 !important; } 180 | 181 | .purple.lighten-3 { 182 | background-color: #ce93d8 !important; } 183 | 184 | .purple-text.text-lighten-3 { 185 | color: #ce93d8 !important; } 186 | 187 | .purple.lighten-2 { 188 | background-color: #ba68c8 !important; } 189 | 190 | .purple-text.text-lighten-2 { 191 | color: #ba68c8 !important; } 192 | 193 | .purple.lighten-1 { 194 | background-color: #ab47bc !important; } 195 | 196 | .purple-text.text-lighten-1 { 197 | color: #ab47bc !important; } 198 | 199 | .purple { 200 | background-color: #9c27b0 !important; } 201 | 202 | .purple-text { 203 | color: #9c27b0 !important; } 204 | 205 | .purple.darken-1 { 206 | background-color: #8e24aa !important; } 207 | 208 | .purple-text.text-darken-1 { 209 | color: #8e24aa !important; } 210 | 211 | .purple.darken-2 { 212 | background-color: #7b1fa2 !important; } 213 | 214 | .purple-text.text-darken-2 { 215 | color: #7b1fa2 !important; } 216 | 217 | .purple.darken-3 { 218 | background-color: #6a1b9a !important; } 219 | 220 | .purple-text.text-darken-3 { 221 | color: #6a1b9a !important; } 222 | 223 | .purple.darken-4 { 224 | background-color: #4a148c !important; } 225 | 226 | .purple-text.text-darken-4 { 227 | color: #4a148c !important; } 228 | 229 | .purple.accent-1 { 230 | background-color: #ea80fc !important; } 231 | 232 | .purple-text.text-accent-1 { 233 | color: #ea80fc !important; } 234 | 235 | .purple.accent-2 { 236 | background-color: #e040fb !important; } 237 | 238 | .purple-text.text-accent-2 { 239 | color: #e040fb !important; } 240 | 241 | .purple.accent-3 { 242 | background-color: #d500f9 !important; } 243 | 244 | .purple-text.text-accent-3 { 245 | color: #d500f9 !important; } 246 | 247 | .purple.accent-4 { 248 | background-color: #aa00ff !important; } 249 | 250 | .purple-text.text-accent-4 { 251 | color: #aa00ff !important; } 252 | 253 | .deep-purple.lighten-5 { 254 | background-color: #ede7f6 !important; } 255 | 256 | .deep-purple-text.text-lighten-5 { 257 | color: #ede7f6 !important; } 258 | 259 | .deep-purple.lighten-4 { 260 | background-color: #d1c4e9 !important; } 261 | 262 | .deep-purple-text.text-lighten-4 { 263 | color: #d1c4e9 !important; } 264 | 265 | .deep-purple.lighten-3 { 266 | background-color: #b39ddb !important; } 267 | 268 | .deep-purple-text.text-lighten-3 { 269 | color: #b39ddb !important; } 270 | 271 | .deep-purple.lighten-2 { 272 | background-color: #9575cd !important; } 273 | 274 | .deep-purple-text.text-lighten-2 { 275 | color: #9575cd !important; } 276 | 277 | .deep-purple.lighten-1 { 278 | background-color: #7e57c2 !important; } 279 | 280 | .deep-purple-text.text-lighten-1 { 281 | color: #7e57c2 !important; } 282 | 283 | .deep-purple { 284 | background-color: #673ab7 !important; } 285 | 286 | .deep-purple-text { 287 | color: #673ab7 !important; } 288 | 289 | .deep-purple.darken-1 { 290 | background-color: #5e35b1 !important; } 291 | 292 | .deep-purple-text.text-darken-1 { 293 | color: #5e35b1 !important; } 294 | 295 | .deep-purple.darken-2 { 296 | background-color: #512da8 !important; } 297 | 298 | .deep-purple-text.text-darken-2 { 299 | color: #512da8 !important; } 300 | 301 | .deep-purple.darken-3 { 302 | background-color: #4527a0 !important; } 303 | 304 | .deep-purple-text.text-darken-3 { 305 | color: #4527a0 !important; } 306 | 307 | .deep-purple.darken-4 { 308 | background-color: #311b92 !important; } 309 | 310 | .deep-purple-text.text-darken-4 { 311 | color: #311b92 !important; } 312 | 313 | .deep-purple.accent-1 { 314 | background-color: #b388ff !important; } 315 | 316 | .deep-purple-text.text-accent-1 { 317 | color: #b388ff !important; } 318 | 319 | .deep-purple.accent-2 { 320 | background-color: #7c4dff !important; } 321 | 322 | .deep-purple-text.text-accent-2 { 323 | color: #7c4dff !important; } 324 | 325 | .deep-purple.accent-3 { 326 | background-color: #651fff !important; } 327 | 328 | .deep-purple-text.text-accent-3 { 329 | color: #651fff !important; } 330 | 331 | .deep-purple.accent-4 { 332 | background-color: #6200ea !important; } 333 | 334 | .deep-purple-text.text-accent-4 { 335 | color: #6200ea !important; } 336 | 337 | .indigo.lighten-5 { 338 | background-color: #e8eaf6 !important; } 339 | 340 | .indigo-text.text-lighten-5 { 341 | color: #e8eaf6 !important; } 342 | 343 | .indigo.lighten-4 { 344 | background-color: #c5cae9 !important; } 345 | 346 | .indigo-text.text-lighten-4 { 347 | color: #c5cae9 !important; } 348 | 349 | .indigo.lighten-3 { 350 | background-color: #9fa8da !important; } 351 | 352 | .indigo-text.text-lighten-3 { 353 | color: #9fa8da !important; } 354 | 355 | .indigo.lighten-2 { 356 | background-color: #7986cb !important; } 357 | 358 | .indigo-text.text-lighten-2 { 359 | color: #7986cb !important; } 360 | 361 | .indigo.lighten-1 { 362 | background-color: #5c6bc0 !important; } 363 | 364 | .indigo-text.text-lighten-1 { 365 | color: #5c6bc0 !important; } 366 | 367 | .indigo { 368 | background-color: #3f51b5 !important; } 369 | 370 | .indigo-text { 371 | color: #3f51b5 !important; } 372 | 373 | .indigo.darken-1 { 374 | background-color: #3949ab !important; } 375 | 376 | .indigo-text.text-darken-1 { 377 | color: #3949ab !important; } 378 | 379 | .indigo.darken-2 { 380 | background-color: #303f9f !important; } 381 | 382 | .indigo-text.text-darken-2 { 383 | color: #303f9f !important; } 384 | 385 | .indigo.darken-3 { 386 | background-color: #283593 !important; } 387 | 388 | .indigo-text.text-darken-3 { 389 | color: #283593 !important; } 390 | 391 | .indigo.darken-4 { 392 | background-color: #1a237e !important; } 393 | 394 | .indigo-text.text-darken-4 { 395 | color: #1a237e !important; } 396 | 397 | .indigo.accent-1 { 398 | background-color: #8c9eff !important; } 399 | 400 | .indigo-text.text-accent-1 { 401 | color: #8c9eff !important; } 402 | 403 | .indigo.accent-2 { 404 | background-color: #536dfe !important; } 405 | 406 | .indigo-text.text-accent-2 { 407 | color: #536dfe !important; } 408 | 409 | .indigo.accent-3 { 410 | background-color: #3d5afe !important; } 411 | 412 | .indigo-text.text-accent-3 { 413 | color: #3d5afe !important; } 414 | 415 | .indigo.accent-4 { 416 | background-color: #304ffe !important; } 417 | 418 | .indigo-text.text-accent-4 { 419 | color: #304ffe !important; } 420 | 421 | .blue.lighten-5 { 422 | background-color: #E3F2FD !important; } 423 | 424 | .blue-text.text-lighten-5 { 425 | color: #E3F2FD !important; } 426 | 427 | .blue.lighten-4 { 428 | background-color: #BBDEFB !important; } 429 | 430 | .blue-text.text-lighten-4 { 431 | color: #BBDEFB !important; } 432 | 433 | .blue.lighten-3 { 434 | background-color: #90CAF9 !important; } 435 | 436 | .blue-text.text-lighten-3 { 437 | color: #90CAF9 !important; } 438 | 439 | .blue.lighten-2 { 440 | background-color: #64B5F6 !important; } 441 | 442 | .blue-text.text-lighten-2 { 443 | color: #64B5F6 !important; } 444 | 445 | .blue.lighten-1 { 446 | background-color: #42A5F5 !important; } 447 | 448 | .blue-text.text-lighten-1 { 449 | color: #42A5F5 !important; } 450 | 451 | .blue { 452 | background-color: #2196F3 !important; } 453 | 454 | .blue-text { 455 | color: #2196F3 !important; } 456 | 457 | .blue.darken-1 { 458 | background-color: #1E88E5 !important; } 459 | 460 | .blue-text.text-darken-1 { 461 | color: #1E88E5 !important; } 462 | 463 | .blue.darken-2 { 464 | background-color: #1976D2 !important; } 465 | 466 | .blue-text.text-darken-2 { 467 | color: #1976D2 !important; } 468 | 469 | .blue.darken-3 { 470 | background-color: #1565C0 !important; } 471 | 472 | .blue-text.text-darken-3 { 473 | color: #1565C0 !important; } 474 | 475 | .blue.darken-4 { 476 | background-color: #0D47A1 !important; } 477 | 478 | .blue-text.text-darken-4 { 479 | color: #0D47A1 !important; } 480 | 481 | .blue.accent-1 { 482 | background-color: #82B1FF !important; } 483 | 484 | .blue-text.text-accent-1 { 485 | color: #82B1FF !important; } 486 | 487 | .blue.accent-2 { 488 | background-color: #448AFF !important; } 489 | 490 | .blue-text.text-accent-2 { 491 | color: #448AFF !important; } 492 | 493 | .blue.accent-3 { 494 | background-color: #2979FF !important; } 495 | 496 | .blue-text.text-accent-3 { 497 | color: #2979FF !important; } 498 | 499 | .blue.accent-4 { 500 | background-color: #2962FF !important; } 501 | 502 | .blue-text.text-accent-4 { 503 | color: #2962FF !important; } 504 | 505 | .light-blue.lighten-5 { 506 | background-color: #e1f5fe !important; } 507 | 508 | .light-blue-text.text-lighten-5 { 509 | color: #e1f5fe !important; } 510 | 511 | .light-blue.lighten-4 { 512 | background-color: #b3e5fc !important; } 513 | 514 | .light-blue-text.text-lighten-4 { 515 | color: #b3e5fc !important; } 516 | 517 | .light-blue.lighten-3 { 518 | background-color: #81d4fa !important; } 519 | 520 | .light-blue-text.text-lighten-3 { 521 | color: #81d4fa !important; } 522 | 523 | .light-blue.lighten-2 { 524 | background-color: #4fc3f7 !important; } 525 | 526 | .light-blue-text.text-lighten-2 { 527 | color: #4fc3f7 !important; } 528 | 529 | .light-blue.lighten-1 { 530 | background-color: #29b6f6 !important; } 531 | 532 | .light-blue-text.text-lighten-1 { 533 | color: #29b6f6 !important; } 534 | 535 | .light-blue { 536 | background-color: #03a9f4 !important; } 537 | 538 | .light-blue-text { 539 | color: #03a9f4 !important; } 540 | 541 | .light-blue.darken-1 { 542 | background-color: #039be5 !important; } 543 | 544 | .light-blue-text.text-darken-1 { 545 | color: #039be5 !important; } 546 | 547 | .light-blue.darken-2 { 548 | background-color: #0288d1 !important; } 549 | 550 | .light-blue-text.text-darken-2 { 551 | color: #0288d1 !important; } 552 | 553 | .light-blue.darken-3 { 554 | background-color: #0277bd !important; } 555 | 556 | .light-blue-text.text-darken-3 { 557 | color: #0277bd !important; } 558 | 559 | .light-blue.darken-4 { 560 | background-color: #01579b !important; } 561 | 562 | .light-blue-text.text-darken-4 { 563 | color: #01579b !important; } 564 | 565 | .light-blue.accent-1 { 566 | background-color: #80d8ff !important; } 567 | 568 | .light-blue-text.text-accent-1 { 569 | color: #80d8ff !important; } 570 | 571 | .light-blue.accent-2 { 572 | background-color: #40c4ff !important; } 573 | 574 | .light-blue-text.text-accent-2 { 575 | color: #40c4ff !important; } 576 | 577 | .light-blue.accent-3 { 578 | background-color: #00b0ff !important; } 579 | 580 | .light-blue-text.text-accent-3 { 581 | color: #00b0ff !important; } 582 | 583 | .light-blue.accent-4 { 584 | background-color: #0091ea !important; } 585 | 586 | .light-blue-text.text-accent-4 { 587 | color: #0091ea !important; } 588 | 589 | .cyan.lighten-5 { 590 | background-color: #e0f7fa !important; } 591 | 592 | .cyan-text.text-lighten-5 { 593 | color: #e0f7fa !important; } 594 | 595 | .cyan.lighten-4 { 596 | background-color: #b2ebf2 !important; } 597 | 598 | .cyan-text.text-lighten-4 { 599 | color: #b2ebf2 !important; } 600 | 601 | .cyan.lighten-3 { 602 | background-color: #80deea !important; } 603 | 604 | .cyan-text.text-lighten-3 { 605 | color: #80deea !important; } 606 | 607 | .cyan.lighten-2 { 608 | background-color: #4dd0e1 !important; } 609 | 610 | .cyan-text.text-lighten-2 { 611 | color: #4dd0e1 !important; } 612 | 613 | .cyan.lighten-1 { 614 | background-color: #26c6da !important; } 615 | 616 | .cyan-text.text-lighten-1 { 617 | color: #26c6da !important; } 618 | 619 | .cyan { 620 | background-color: #00bcd4 !important; } 621 | 622 | .cyan-text { 623 | color: #00bcd4 !important; } 624 | 625 | .cyan.darken-1 { 626 | background-color: #00acc1 !important; } 627 | 628 | .cyan-text.text-darken-1 { 629 | color: #00acc1 !important; } 630 | 631 | .cyan.darken-2 { 632 | background-color: #0097a7 !important; } 633 | 634 | .cyan-text.text-darken-2 { 635 | color: #0097a7 !important; } 636 | 637 | .cyan.darken-3 { 638 | background-color: #00838f !important; } 639 | 640 | .cyan-text.text-darken-3 { 641 | color: #00838f !important; } 642 | 643 | .cyan.darken-4 { 644 | background-color: #006064 !important; } 645 | 646 | .cyan-text.text-darken-4 { 647 | color: #006064 !important; } 648 | 649 | .cyan.accent-1 { 650 | background-color: #84ffff !important; } 651 | 652 | .cyan-text.text-accent-1 { 653 | color: #84ffff !important; } 654 | 655 | .cyan.accent-2 { 656 | background-color: #18ffff !important; } 657 | 658 | .cyan-text.text-accent-2 { 659 | color: #18ffff !important; } 660 | 661 | .cyan.accent-3 { 662 | background-color: #00e5ff !important; } 663 | 664 | .cyan-text.text-accent-3 { 665 | color: #00e5ff !important; } 666 | 667 | .cyan.accent-4 { 668 | background-color: #00b8d4 !important; } 669 | 670 | .cyan-text.text-accent-4 { 671 | color: #00b8d4 !important; } 672 | 673 | .teal.lighten-5 { 674 | background-color: #e0f2f1 !important; } 675 | 676 | .teal-text.text-lighten-5 { 677 | color: #e0f2f1 !important; } 678 | 679 | .teal.lighten-4 { 680 | background-color: #b2dfdb !important; } 681 | 682 | .teal-text.text-lighten-4 { 683 | color: #b2dfdb !important; } 684 | 685 | .teal.lighten-3 { 686 | background-color: #80cbc4 !important; } 687 | 688 | .teal-text.text-lighten-3 { 689 | color: #80cbc4 !important; } 690 | 691 | .teal.lighten-2 { 692 | background-color: #4db6ac !important; } 693 | 694 | .teal-text.text-lighten-2 { 695 | color: #4db6ac !important; } 696 | 697 | .teal.lighten-1 { 698 | background-color: #26a69a !important; } 699 | 700 | .teal-text.text-lighten-1 { 701 | color: #26a69a !important; } 702 | 703 | .teal { 704 | background-color: #009688 !important; } 705 | 706 | .teal-text { 707 | color: #009688 !important; } 708 | 709 | .teal.darken-1 { 710 | background-color: #00897b !important; } 711 | 712 | .teal-text.text-darken-1 { 713 | color: #00897b !important; } 714 | 715 | .teal.darken-2 { 716 | background-color: #00796b !important; } 717 | 718 | .teal-text.text-darken-2 { 719 | color: #00796b !important; } 720 | 721 | .teal.darken-3 { 722 | background-color: #00695c !important; } 723 | 724 | .teal-text.text-darken-3 { 725 | color: #00695c !important; } 726 | 727 | .teal.darken-4 { 728 | background-color: #004d40 !important; } 729 | 730 | .teal-text.text-darken-4 { 731 | color: #004d40 !important; } 732 | 733 | .teal.accent-1 { 734 | background-color: #a7ffeb !important; } 735 | 736 | .teal-text.text-accent-1 { 737 | color: #a7ffeb !important; } 738 | 739 | .teal.accent-2 { 740 | background-color: #64ffda !important; } 741 | 742 | .teal-text.text-accent-2 { 743 | color: #64ffda !important; } 744 | 745 | .teal.accent-3 { 746 | background-color: #1de9b6 !important; } 747 | 748 | .teal-text.text-accent-3 { 749 | color: #1de9b6 !important; } 750 | 751 | .teal.accent-4 { 752 | background-color: #00bfa5 !important; } 753 | 754 | .teal-text.text-accent-4 { 755 | color: #00bfa5 !important; } 756 | 757 | .green.lighten-5 { 758 | background-color: #E8F5E9 !important; } 759 | 760 | .green-text.text-lighten-5 { 761 | color: #E8F5E9 !important; } 762 | 763 | .green.lighten-4 { 764 | background-color: #C8E6C9 !important; } 765 | 766 | .green-text.text-lighten-4 { 767 | color: #C8E6C9 !important; } 768 | 769 | .green.lighten-3 { 770 | background-color: #A5D6A7 !important; } 771 | 772 | .green-text.text-lighten-3 { 773 | color: #A5D6A7 !important; } 774 | 775 | .green.lighten-2 { 776 | background-color: #81C784 !important; } 777 | 778 | .green-text.text-lighten-2 { 779 | color: #81C784 !important; } 780 | 781 | .green.lighten-1 { 782 | background-color: #66BB6A !important; } 783 | 784 | .green-text.text-lighten-1 { 785 | color: #66BB6A !important; } 786 | 787 | .green { 788 | background-color: #4CAF50 !important; } 789 | 790 | .green-text { 791 | color: #4CAF50 !important; } 792 | 793 | .green.darken-1 { 794 | background-color: #43A047 !important; } 795 | 796 | .green-text.text-darken-1 { 797 | color: #43A047 !important; } 798 | 799 | .green.darken-2 { 800 | background-color: #388E3C !important; } 801 | 802 | .green-text.text-darken-2 { 803 | color: #388E3C !important; } 804 | 805 | .green.darken-3 { 806 | background-color: #2E7D32 !important; } 807 | 808 | .green-text.text-darken-3 { 809 | color: #2E7D32 !important; } 810 | 811 | .green.darken-4 { 812 | background-color: #1B5E20 !important; } 813 | 814 | .green-text.text-darken-4 { 815 | color: #1B5E20 !important; } 816 | 817 | .green.accent-1 { 818 | background-color: #B9F6CA !important; } 819 | 820 | .green-text.text-accent-1 { 821 | color: #B9F6CA !important; } 822 | 823 | .green.accent-2 { 824 | background-color: #69F0AE !important; } 825 | 826 | .green-text.text-accent-2 { 827 | color: #69F0AE !important; } 828 | 829 | .green.accent-3 { 830 | background-color: #00E676 !important; } 831 | 832 | .green-text.text-accent-3 { 833 | color: #00E676 !important; } 834 | 835 | .green.accent-4 { 836 | background-color: #00C853 !important; } 837 | 838 | .green-text.text-accent-4 { 839 | color: #00C853 !important; } 840 | 841 | .light-green.lighten-5 { 842 | background-color: #f1f8e9 !important; } 843 | 844 | .light-green-text.text-lighten-5 { 845 | color: #f1f8e9 !important; } 846 | 847 | .light-green.lighten-4 { 848 | background-color: #dcedc8 !important; } 849 | 850 | .light-green-text.text-lighten-4 { 851 | color: #dcedc8 !important; } 852 | 853 | .light-green.lighten-3 { 854 | background-color: #c5e1a5 !important; } 855 | 856 | .light-green-text.text-lighten-3 { 857 | color: #c5e1a5 !important; } 858 | 859 | .light-green.lighten-2 { 860 | background-color: #aed581 !important; } 861 | 862 | .light-green-text.text-lighten-2 { 863 | color: #aed581 !important; } 864 | 865 | .light-green.lighten-1 { 866 | background-color: #9ccc65 !important; } 867 | 868 | .light-green-text.text-lighten-1 { 869 | color: #9ccc65 !important; } 870 | 871 | .light-green { 872 | background-color: #8bc34a !important; } 873 | 874 | .light-green-text { 875 | color: #8bc34a !important; } 876 | 877 | .light-green.darken-1 { 878 | background-color: #7cb342 !important; } 879 | 880 | .light-green-text.text-darken-1 { 881 | color: #7cb342 !important; } 882 | 883 | .light-green.darken-2 { 884 | background-color: #689f38 !important; } 885 | 886 | .light-green-text.text-darken-2 { 887 | color: #689f38 !important; } 888 | 889 | .light-green.darken-3 { 890 | background-color: #558b2f !important; } 891 | 892 | .light-green-text.text-darken-3 { 893 | color: #558b2f !important; } 894 | 895 | .light-green.darken-4 { 896 | background-color: #33691e !important; } 897 | 898 | .light-green-text.text-darken-4 { 899 | color: #33691e !important; } 900 | 901 | .light-green.accent-1 { 902 | background-color: #ccff90 !important; } 903 | 904 | .light-green-text.text-accent-1 { 905 | color: #ccff90 !important; } 906 | 907 | .light-green.accent-2 { 908 | background-color: #b2ff59 !important; } 909 | 910 | .light-green-text.text-accent-2 { 911 | color: #b2ff59 !important; } 912 | 913 | .light-green.accent-3 { 914 | background-color: #76ff03 !important; } 915 | 916 | .light-green-text.text-accent-3 { 917 | color: #76ff03 !important; } 918 | 919 | .light-green.accent-4 { 920 | background-color: #64dd17 !important; } 921 | 922 | .light-green-text.text-accent-4 { 923 | color: #64dd17 !important; } 924 | 925 | .lime.lighten-5 { 926 | background-color: #f9fbe7 !important; } 927 | 928 | .lime-text.text-lighten-5 { 929 | color: #f9fbe7 !important; } 930 | 931 | .lime.lighten-4 { 932 | background-color: #f0f4c3 !important; } 933 | 934 | .lime-text.text-lighten-4 { 935 | color: #f0f4c3 !important; } 936 | 937 | .lime.lighten-3 { 938 | background-color: #e6ee9c !important; } 939 | 940 | .lime-text.text-lighten-3 { 941 | color: #e6ee9c !important; } 942 | 943 | .lime.lighten-2 { 944 | background-color: #dce775 !important; } 945 | 946 | .lime-text.text-lighten-2 { 947 | color: #dce775 !important; } 948 | 949 | .lime.lighten-1 { 950 | background-color: #d4e157 !important; } 951 | 952 | .lime-text.text-lighten-1 { 953 | color: #d4e157 !important; } 954 | 955 | .lime { 956 | background-color: #cddc39 !important; } 957 | 958 | .lime-text { 959 | color: #cddc39 !important; } 960 | 961 | .lime.darken-1 { 962 | background-color: #c0ca33 !important; } 963 | 964 | .lime-text.text-darken-1 { 965 | color: #c0ca33 !important; } 966 | 967 | .lime.darken-2 { 968 | background-color: #afb42b !important; } 969 | 970 | .lime-text.text-darken-2 { 971 | color: #afb42b !important; } 972 | 973 | .lime.darken-3 { 974 | background-color: #9e9d24 !important; } 975 | 976 | .lime-text.text-darken-3 { 977 | color: #9e9d24 !important; } 978 | 979 | .lime.darken-4 { 980 | background-color: #827717 !important; } 981 | 982 | .lime-text.text-darken-4 { 983 | color: #827717 !important; } 984 | 985 | .lime.accent-1 { 986 | background-color: #f4ff81 !important; } 987 | 988 | .lime-text.text-accent-1 { 989 | color: #f4ff81 !important; } 990 | 991 | .lime.accent-2 { 992 | background-color: #eeff41 !important; } 993 | 994 | .lime-text.text-accent-2 { 995 | color: #eeff41 !important; } 996 | 997 | .lime.accent-3 { 998 | background-color: #c6ff00 !important; } 999 | 1000 | .lime-text.text-accent-3 { 1001 | color: #c6ff00 !important; } 1002 | 1003 | .lime.accent-4 { 1004 | background-color: #aeea00 !important; } 1005 | 1006 | .lime-text.text-accent-4 { 1007 | color: #aeea00 !important; } 1008 | 1009 | .yellow.lighten-5 { 1010 | background-color: #fffde7 !important; } 1011 | 1012 | .yellow-text.text-lighten-5 { 1013 | color: #fffde7 !important; } 1014 | 1015 | .yellow.lighten-4 { 1016 | background-color: #fff9c4 !important; } 1017 | 1018 | .yellow-text.text-lighten-4 { 1019 | color: #fff9c4 !important; } 1020 | 1021 | .yellow.lighten-3 { 1022 | background-color: #fff59d !important; } 1023 | 1024 | .yellow-text.text-lighten-3 { 1025 | color: #fff59d !important; } 1026 | 1027 | .yellow.lighten-2 { 1028 | background-color: #fff176 !important; } 1029 | 1030 | .yellow-text.text-lighten-2 { 1031 | color: #fff176 !important; } 1032 | 1033 | .yellow.lighten-1 { 1034 | background-color: #ffee58 !important; } 1035 | 1036 | .yellow-text.text-lighten-1 { 1037 | color: #ffee58 !important; } 1038 | 1039 | .yellow { 1040 | background-color: #ffeb3b !important; } 1041 | 1042 | .yellow-text { 1043 | color: #ffeb3b !important; } 1044 | 1045 | .yellow.darken-1 { 1046 | background-color: #fdd835 !important; } 1047 | 1048 | .yellow-text.text-darken-1 { 1049 | color: #fdd835 !important; } 1050 | 1051 | .yellow.darken-2 { 1052 | background-color: #fbc02d !important; } 1053 | 1054 | .yellow-text.text-darken-2 { 1055 | color: #fbc02d !important; } 1056 | 1057 | .yellow.darken-3 { 1058 | background-color: #f9a825 !important; } 1059 | 1060 | .yellow-text.text-darken-3 { 1061 | color: #f9a825 !important; } 1062 | 1063 | .yellow.darken-4 { 1064 | background-color: #f57f17 !important; } 1065 | 1066 | .yellow-text.text-darken-4 { 1067 | color: #f57f17 !important; } 1068 | 1069 | .yellow.accent-1 { 1070 | background-color: #ffff8d !important; } 1071 | 1072 | .yellow-text.text-accent-1 { 1073 | color: #ffff8d !important; } 1074 | 1075 | .yellow.accent-2 { 1076 | background-color: #ffff00 !important; } 1077 | 1078 | .yellow-text.text-accent-2 { 1079 | color: #ffff00 !important; } 1080 | 1081 | .yellow.accent-3 { 1082 | background-color: #ffea00 !important; } 1083 | 1084 | .yellow-text.text-accent-3 { 1085 | color: #ffea00 !important; } 1086 | 1087 | .yellow.accent-4 { 1088 | background-color: #ffd600 !important; } 1089 | 1090 | .yellow-text.text-accent-4 { 1091 | color: #ffd600 !important; } 1092 | 1093 | .amber.lighten-5 { 1094 | background-color: #fff8e1 !important; } 1095 | 1096 | .amber-text.text-lighten-5 { 1097 | color: #fff8e1 !important; } 1098 | 1099 | .amber.lighten-4 { 1100 | background-color: #ffecb3 !important; } 1101 | 1102 | .amber-text.text-lighten-4 { 1103 | color: #ffecb3 !important; } 1104 | 1105 | .amber.lighten-3 { 1106 | background-color: #ffe082 !important; } 1107 | 1108 | .amber-text.text-lighten-3 { 1109 | color: #ffe082 !important; } 1110 | 1111 | .amber.lighten-2 { 1112 | background-color: #ffd54f !important; } 1113 | 1114 | .amber-text.text-lighten-2 { 1115 | color: #ffd54f !important; } 1116 | 1117 | .amber.lighten-1 { 1118 | background-color: #ffca28 !important; } 1119 | 1120 | .amber-text.text-lighten-1 { 1121 | color: #ffca28 !important; } 1122 | 1123 | .amber { 1124 | background-color: #ffc107 !important; } 1125 | 1126 | .amber-text { 1127 | color: #ffc107 !important; } 1128 | 1129 | .amber.darken-1 { 1130 | background-color: #ffb300 !important; } 1131 | 1132 | .amber-text.text-darken-1 { 1133 | color: #ffb300 !important; } 1134 | 1135 | .amber.darken-2 { 1136 | background-color: #ffa000 !important; } 1137 | 1138 | .amber-text.text-darken-2 { 1139 | color: #ffa000 !important; } 1140 | 1141 | .amber.darken-3 { 1142 | background-color: #ff8f00 !important; } 1143 | 1144 | .amber-text.text-darken-3 { 1145 | color: #ff8f00 !important; } 1146 | 1147 | .amber.darken-4 { 1148 | background-color: #ff6f00 !important; } 1149 | 1150 | .amber-text.text-darken-4 { 1151 | color: #ff6f00 !important; } 1152 | 1153 | .amber.accent-1 { 1154 | background-color: #ffe57f !important; } 1155 | 1156 | .amber-text.text-accent-1 { 1157 | color: #ffe57f !important; } 1158 | 1159 | .amber.accent-2 { 1160 | background-color: #ffd740 !important; } 1161 | 1162 | .amber-text.text-accent-2 { 1163 | color: #ffd740 !important; } 1164 | 1165 | .amber.accent-3 { 1166 | background-color: #ffc400 !important; } 1167 | 1168 | .amber-text.text-accent-3 { 1169 | color: #ffc400 !important; } 1170 | 1171 | .amber.accent-4 { 1172 | background-color: #ffab00 !important; } 1173 | 1174 | .amber-text.text-accent-4 { 1175 | color: #ffab00 !important; } 1176 | 1177 | .orange.lighten-5 { 1178 | background-color: #fff3e0 !important; } 1179 | 1180 | .orange-text.text-lighten-5 { 1181 | color: #fff3e0 !important; } 1182 | 1183 | .orange.lighten-4 { 1184 | background-color: #ffe0b2 !important; } 1185 | 1186 | .orange-text.text-lighten-4 { 1187 | color: #ffe0b2 !important; } 1188 | 1189 | .orange.lighten-3 { 1190 | background-color: #ffcc80 !important; } 1191 | 1192 | .orange-text.text-lighten-3 { 1193 | color: #ffcc80 !important; } 1194 | 1195 | .orange.lighten-2 { 1196 | background-color: #ffb74d !important; } 1197 | 1198 | .orange-text.text-lighten-2 { 1199 | color: #ffb74d !important; } 1200 | 1201 | .orange.lighten-1 { 1202 | background-color: #ffa726 !important; } 1203 | 1204 | .orange-text.text-lighten-1 { 1205 | color: #ffa726 !important; } 1206 | 1207 | .orange { 1208 | background-color: #ff9800 !important; } 1209 | 1210 | .orange-text { 1211 | color: #ff9800 !important; } 1212 | 1213 | .orange.darken-1 { 1214 | background-color: #fb8c00 !important; } 1215 | 1216 | .orange-text.text-darken-1 { 1217 | color: #fb8c00 !important; } 1218 | 1219 | .orange.darken-2 { 1220 | background-color: #f57c00 !important; } 1221 | 1222 | .orange-text.text-darken-2 { 1223 | color: #f57c00 !important; } 1224 | 1225 | .orange.darken-3 { 1226 | background-color: #ef6c00 !important; } 1227 | 1228 | .orange-text.text-darken-3 { 1229 | color: #ef6c00 !important; } 1230 | 1231 | .orange.darken-4 { 1232 | background-color: #e65100 !important; } 1233 | 1234 | .orange-text.text-darken-4 { 1235 | color: #e65100 !important; } 1236 | 1237 | .orange.accent-1 { 1238 | background-color: #ffd180 !important; } 1239 | 1240 | .orange-text.text-accent-1 { 1241 | color: #ffd180 !important; } 1242 | 1243 | .orange.accent-2 { 1244 | background-color: #ffab40 !important; } 1245 | 1246 | .orange-text.text-accent-2 { 1247 | color: #ffab40 !important; } 1248 | 1249 | .orange.accent-3 { 1250 | background-color: #ff9100 !important; } 1251 | 1252 | .orange-text.text-accent-3 { 1253 | color: #ff9100 !important; } 1254 | 1255 | .orange.accent-4 { 1256 | background-color: #ff6d00 !important; } 1257 | 1258 | .orange-text.text-accent-4 { 1259 | color: #ff6d00 !important; } 1260 | 1261 | .deep-orange.lighten-5 { 1262 | background-color: #fbe9e7 !important; } 1263 | 1264 | .deep-orange-text.text-lighten-5 { 1265 | color: #fbe9e7 !important; } 1266 | 1267 | .deep-orange.lighten-4 { 1268 | background-color: #ffccbc !important; } 1269 | 1270 | .deep-orange-text.text-lighten-4 { 1271 | color: #ffccbc !important; } 1272 | 1273 | .deep-orange.lighten-3 { 1274 | background-color: #ffab91 !important; } 1275 | 1276 | .deep-orange-text.text-lighten-3 { 1277 | color: #ffab91 !important; } 1278 | 1279 | .deep-orange.lighten-2 { 1280 | background-color: #ff8a65 !important; } 1281 | 1282 | .deep-orange-text.text-lighten-2 { 1283 | color: #ff8a65 !important; } 1284 | 1285 | .deep-orange.lighten-1 { 1286 | background-color: #ff7043 !important; } 1287 | 1288 | .deep-orange-text.text-lighten-1 { 1289 | color: #ff7043 !important; } 1290 | 1291 | .deep-orange { 1292 | background-color: #ff5722 !important; } 1293 | 1294 | .deep-orange-text { 1295 | color: #ff5722 !important; } 1296 | 1297 | .deep-orange.darken-1 { 1298 | background-color: #f4511e !important; } 1299 | 1300 | .deep-orange-text.text-darken-1 { 1301 | color: #f4511e !important; } 1302 | 1303 | .deep-orange.darken-2 { 1304 | background-color: #e64a19 !important; } 1305 | 1306 | .deep-orange-text.text-darken-2 { 1307 | color: #e64a19 !important; } 1308 | 1309 | .deep-orange.darken-3 { 1310 | background-color: #d84315 !important; } 1311 | 1312 | .deep-orange-text.text-darken-3 { 1313 | color: #d84315 !important; } 1314 | 1315 | .deep-orange.darken-4 { 1316 | background-color: #bf360c !important; } 1317 | 1318 | .deep-orange-text.text-darken-4 { 1319 | color: #bf360c !important; } 1320 | 1321 | .deep-orange.accent-1 { 1322 | background-color: #ff9e80 !important; } 1323 | 1324 | .deep-orange-text.text-accent-1 { 1325 | color: #ff9e80 !important; } 1326 | 1327 | .deep-orange.accent-2 { 1328 | background-color: #ff6e40 !important; } 1329 | 1330 | .deep-orange-text.text-accent-2 { 1331 | color: #ff6e40 !important; } 1332 | 1333 | .deep-orange.accent-3 { 1334 | background-color: #ff3d00 !important; } 1335 | 1336 | .deep-orange-text.text-accent-3 { 1337 | color: #ff3d00 !important; } 1338 | 1339 | .deep-orange.accent-4 { 1340 | background-color: #dd2c00 !important; } 1341 | 1342 | .deep-orange-text.text-accent-4 { 1343 | color: #dd2c00 !important; } 1344 | 1345 | .brown.lighten-5 { 1346 | background-color: #efebe9 !important; } 1347 | 1348 | .brown-text.text-lighten-5 { 1349 | color: #efebe9 !important; } 1350 | 1351 | .brown.lighten-4 { 1352 | background-color: #d7ccc8 !important; } 1353 | 1354 | .brown-text.text-lighten-4 { 1355 | color: #d7ccc8 !important; } 1356 | 1357 | .brown.lighten-3 { 1358 | background-color: #bcaaa4 !important; } 1359 | 1360 | .brown-text.text-lighten-3 { 1361 | color: #bcaaa4 !important; } 1362 | 1363 | .brown.lighten-2 { 1364 | background-color: #a1887f !important; } 1365 | 1366 | .brown-text.text-lighten-2 { 1367 | color: #a1887f !important; } 1368 | 1369 | .brown.lighten-1 { 1370 | background-color: #8d6e63 !important; } 1371 | 1372 | .brown-text.text-lighten-1 { 1373 | color: #8d6e63 !important; } 1374 | 1375 | .brown { 1376 | background-color: #795548 !important; } 1377 | 1378 | .brown-text { 1379 | color: #795548 !important; } 1380 | 1381 | .brown.darken-1 { 1382 | background-color: #6d4c41 !important; } 1383 | 1384 | .brown-text.text-darken-1 { 1385 | color: #6d4c41 !important; } 1386 | 1387 | .brown.darken-2 { 1388 | background-color: #5d4037 !important; } 1389 | 1390 | .brown-text.text-darken-2 { 1391 | color: #5d4037 !important; } 1392 | 1393 | .brown.darken-3 { 1394 | background-color: #4e342e !important; } 1395 | 1396 | .brown-text.text-darken-3 { 1397 | color: #4e342e !important; } 1398 | 1399 | .brown.darken-4 { 1400 | background-color: #3e2723 !important; } 1401 | 1402 | .brown-text.text-darken-4 { 1403 | color: #3e2723 !important; } 1404 | 1405 | .blue-grey.lighten-5 { 1406 | background-color: #eceff1 !important; } 1407 | 1408 | .blue-grey-text.text-lighten-5 { 1409 | color: #eceff1 !important; } 1410 | 1411 | .blue-grey.lighten-4 { 1412 | background-color: #cfd8dc !important; } 1413 | 1414 | .blue-grey-text.text-lighten-4 { 1415 | color: #cfd8dc !important; } 1416 | 1417 | .blue-grey.lighten-3 { 1418 | background-color: #b0bec5 !important; } 1419 | 1420 | .blue-grey-text.text-lighten-3 { 1421 | color: #b0bec5 !important; } 1422 | 1423 | .blue-grey.lighten-2 { 1424 | background-color: #90a4ae !important; } 1425 | 1426 | .blue-grey-text.text-lighten-2 { 1427 | color: #90a4ae !important; } 1428 | 1429 | .blue-grey.lighten-1 { 1430 | background-color: #78909c !important; } 1431 | 1432 | .blue-grey-text.text-lighten-1 { 1433 | color: #78909c !important; } 1434 | 1435 | .blue-grey { 1436 | background-color: #607d8b !important; } 1437 | 1438 | .blue-grey-text { 1439 | color: #607d8b !important; } 1440 | 1441 | .blue-grey.darken-1 { 1442 | background-color: #546e7a !important; } 1443 | 1444 | .blue-grey-text.text-darken-1 { 1445 | color: #546e7a !important; } 1446 | 1447 | .blue-grey.darken-2 { 1448 | background-color: #455a64 !important; } 1449 | 1450 | .blue-grey-text.text-darken-2 { 1451 | color: #455a64 !important; } 1452 | 1453 | .blue-grey.darken-3 { 1454 | background-color: #37474f !important; } 1455 | 1456 | .blue-grey-text.text-darken-3 { 1457 | color: #37474f !important; } 1458 | 1459 | .blue-grey.darken-4 { 1460 | background-color: #263238 !important; } 1461 | 1462 | .blue-grey-text.text-darken-4 { 1463 | color: #263238 !important; } 1464 | 1465 | .grey.lighten-5 { 1466 | background-color: #fafafa !important; } 1467 | 1468 | .grey-text.text-lighten-5 { 1469 | color: #fafafa !important; } 1470 | 1471 | .grey.lighten-4 { 1472 | background-color: #f5f5f5 !important; } 1473 | 1474 | .grey-text.text-lighten-4 { 1475 | color: #f5f5f5 !important; } 1476 | 1477 | .grey.lighten-3 { 1478 | background-color: #eeeeee !important; } 1479 | 1480 | .grey-text.text-lighten-3 { 1481 | color: #eeeeee !important; } 1482 | 1483 | .grey.lighten-2 { 1484 | background-color: #e0e0e0 !important; } 1485 | 1486 | .grey-text.text-lighten-2 { 1487 | color: #e0e0e0 !important; } 1488 | 1489 | .grey.lighten-1 { 1490 | background-color: #bdbdbd !important; } 1491 | 1492 | .grey-text.text-lighten-1 { 1493 | color: #bdbdbd !important; } 1494 | 1495 | .grey { 1496 | background-color: #9e9e9e !important; } 1497 | 1498 | .grey-text { 1499 | color: #9e9e9e !important; } 1500 | 1501 | .grey.darken-1 { 1502 | background-color: #757575 !important; } 1503 | 1504 | .grey-text.text-darken-1 { 1505 | color: #757575 !important; } 1506 | 1507 | .grey.darken-2 { 1508 | background-color: #616161 !important; } 1509 | 1510 | .grey-text.text-darken-2 { 1511 | color: #616161 !important; } 1512 | 1513 | .grey.darken-3 { 1514 | background-color: #424242 !important; } 1515 | 1516 | .grey-text.text-darken-3 { 1517 | color: #424242 !important; } 1518 | 1519 | .grey.darken-4 { 1520 | background-color: #212121 !important; } 1521 | 1522 | .grey-text.text-darken-4 { 1523 | color: #212121 !important; } 1524 | 1525 | .shades.black { 1526 | background-color: #000000 !important; } 1527 | 1528 | .shades-text.text-black { 1529 | color: #000000 !important; } 1530 | 1531 | .shades.white { 1532 | background-color: #FFFFFF !important; } 1533 | 1534 | .shades-text.text-white { 1535 | color: #FFFFFF !important; } 1536 | 1537 | .shades.transparent { 1538 | background-color: transparent !important; } 1539 | 1540 | .shades-text.text-transparent { 1541 | color: transparent !important; } 1542 | 1543 | .black { 1544 | background-color: #000000 !important; } 1545 | 1546 | .black-text { 1547 | color: #000000 !important; } 1548 | 1549 | .white { 1550 | background-color: #FFFFFF !important; } 1551 | 1552 | .white-text { 1553 | color: #FFFFFF !important; } 1554 | 1555 | .transparent { 1556 | background-color: transparent !important; } 1557 | 1558 | .transparent-text { 1559 | color: transparent !important; } --------------------------------------------------------------------------------