├── .gitattributes ├── app ├── CNAME ├── styles │ ├── .DS_Store │ ├── main.css │ └── hoodie.css ├── favicons │ ├── favicon.ico │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon-96x96.png │ ├── mstile-70x70.png │ ├── favicon-160x160.png │ ├── favicon-192x192.png │ ├── mstile-144x144.png │ ├── mstile-150x150.png │ ├── mstile-310x150.png │ ├── mstile-310x310.png │ ├── apple-touch-icon.png │ ├── apple-touch-icon-57x57.png │ ├── apple-touch-icon-60x60.png │ ├── apple-touch-icon-72x72.png │ ├── apple-touch-icon-76x76.png │ ├── apple-touch-icon-114x114.png │ ├── apple-touch-icon-120x120.png │ ├── apple-touch-icon-144x144.png │ ├── apple-touch-icon-152x152.png │ ├── apple-touch-icon-180x180.png │ ├── apple-touch-icon-precomposed.png │ └── browserconfig.xml ├── images │ ├── logo_cut.png │ ├── hoodie_logo.png │ ├── logo_cut_blue.png │ ├── logo_cut_gray.png │ ├── logo_cut_green.png │ ├── logo_cut_lilac.png │ ├── logo_cut_yellow.png │ ├── logo_cut_negativ.png │ ├── font │ │ ├── FiraSans-Light.eot │ │ ├── FiraSans-Light.otf │ │ ├── FiraSans-Light.ttf │ │ ├── FiraSans-Light.woff │ │ ├── FiraSans-Medium.eot │ │ ├── FiraSans-Medium.otf │ │ ├── FiraSans-Medium.ttf │ │ ├── FiraSans-Thin.otf │ │ ├── FiraMono-Regular.eot │ │ ├── FiraMono-Regular.otf │ │ ├── FiraMono-Regular.ttf │ │ ├── FiraMono-Regular.woff │ │ ├── FiraSans-Medium.woff │ │ ├── FiraSans-Regular.eot │ │ ├── FiraSans-Regular.otf │ │ ├── FiraSans-Regular.ttf │ │ ├── FiraSans-Regular.woff │ │ └── FiraMono-Regular.svg │ ├── logo_cut_negativ_blue.png │ ├── logo_cut_negativ_gray.png │ ├── logo_cut_negativ_green.png │ ├── logo_cut_negativ_lilac.png │ ├── logo_cut_negativ_yellow.png │ └── logo.svg ├── scripts │ ├── controllers │ │ ├── main.js │ │ └── question.js │ ├── services │ │ ├── categorydata.js │ │ └── questiondata.js │ └── app.js ├── views │ ├── question.html │ └── index.html └── index.html ├── .bowerrc ├── .DS_Store ├── .gitignore ├── .github └── first-timers.yml ├── .travis.yml ├── test ├── spec │ ├── services │ │ ├── categorydata.js │ │ └── questiondata.js │ └── controllers │ │ ├── main.js │ │ └── question.js ├── .jshintrc └── karma.conf.js ├── .editorconfig ├── .jshintrc ├── bower.json ├── package.json ├── README.md └── Gruntfile.js /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /app/CNAME: -------------------------------------------------------------------------------- 1 | faq.hood.ie 2 | -------------------------------------------------------------------------------- /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components" 3 | } 4 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/.DS_Store -------------------------------------------------------------------------------- /app/styles/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/styles/.DS_Store -------------------------------------------------------------------------------- /app/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/favicon.ico -------------------------------------------------------------------------------- /app/images/logo_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut.png -------------------------------------------------------------------------------- /app/images/hoodie_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/hoodie_logo.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .tmp 4 | .sass-cache 5 | bower_components 6 | .DS_Store 7 | *.log 8 | -------------------------------------------------------------------------------- /app/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /app/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /app/favicons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/favicon-96x96.png -------------------------------------------------------------------------------- /app/favicons/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/mstile-70x70.png -------------------------------------------------------------------------------- /app/images/logo_cut_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_blue.png -------------------------------------------------------------------------------- /app/images/logo_cut_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_gray.png -------------------------------------------------------------------------------- /app/images/logo_cut_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_green.png -------------------------------------------------------------------------------- /app/images/logo_cut_lilac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_lilac.png -------------------------------------------------------------------------------- /app/images/logo_cut_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_yellow.png -------------------------------------------------------------------------------- /app/favicons/favicon-160x160.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/favicon-160x160.png -------------------------------------------------------------------------------- /app/favicons/favicon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/favicon-192x192.png -------------------------------------------------------------------------------- /app/favicons/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/mstile-144x144.png -------------------------------------------------------------------------------- /app/favicons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/mstile-150x150.png -------------------------------------------------------------------------------- /app/favicons/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/mstile-310x150.png -------------------------------------------------------------------------------- /app/favicons/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/mstile-310x310.png -------------------------------------------------------------------------------- /app/images/logo_cut_negativ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_negativ.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /app/images/font/FiraSans-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Light.eot -------------------------------------------------------------------------------- /app/images/font/FiraSans-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Light.otf -------------------------------------------------------------------------------- /app/images/font/FiraSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Light.ttf -------------------------------------------------------------------------------- /app/images/font/FiraSans-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Light.woff -------------------------------------------------------------------------------- /app/images/font/FiraSans-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Medium.eot -------------------------------------------------------------------------------- /app/images/font/FiraSans-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Medium.otf -------------------------------------------------------------------------------- /app/images/font/FiraSans-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Medium.ttf -------------------------------------------------------------------------------- /app/images/font/FiraSans-Thin.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Thin.otf -------------------------------------------------------------------------------- /app/images/font/FiraMono-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraMono-Regular.eot -------------------------------------------------------------------------------- /app/images/font/FiraMono-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraMono-Regular.otf -------------------------------------------------------------------------------- /app/images/font/FiraMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraMono-Regular.ttf -------------------------------------------------------------------------------- /app/images/font/FiraMono-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraMono-Regular.woff -------------------------------------------------------------------------------- /app/images/font/FiraSans-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Medium.woff -------------------------------------------------------------------------------- /app/images/font/FiraSans-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Regular.eot -------------------------------------------------------------------------------- /app/images/font/FiraSans-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Regular.otf -------------------------------------------------------------------------------- /app/images/font/FiraSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Regular.ttf -------------------------------------------------------------------------------- /app/images/font/FiraSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/font/FiraSans-Regular.woff -------------------------------------------------------------------------------- /app/images/logo_cut_negativ_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_negativ_blue.png -------------------------------------------------------------------------------- /app/images/logo_cut_negativ_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_negativ_gray.png -------------------------------------------------------------------------------- /app/images/logo_cut_negativ_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_negativ_green.png -------------------------------------------------------------------------------- /app/images/logo_cut_negativ_lilac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_negativ_lilac.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /app/images/logo_cut_negativ_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/images/logo_cut_negativ_yellow.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /app/favicons/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoodiehq/faq/HEAD/app/favicons/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /.github/first-timers.yml: -------------------------------------------------------------------------------- 1 | repository: camp 2 | labels: 3 | - first-timers-only 4 | - hacktoberfest 5 | - available 6 | template: .github/FIRST_TIMERS_ISSUE_TEMPLATE.md -------------------------------------------------------------------------------- /app/scripts/controllers/main.js: -------------------------------------------------------------------------------- 1 | angular.module('faqApp').controller('MainCtrl', function ($scope, categoryData) { 2 | 'use strict'; 3 | $scope.categories = []; 4 | 5 | categoryData().then(function(data) { 6 | $scope.categories = data; 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /app/scripts/services/categorydata.js: -------------------------------------------------------------------------------- 1 | angular.module('faqApp').service('categoryData', function (questionData) { 2 | 'use strict'; 3 | 4 | return function() { 5 | return questionData().then(function(questions) { 6 | return _.groupBy(questions, 'category'); 7 | }); 8 | }; 9 | }); 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | notifications: 5 | email: false 6 | after_success: 7 | - npm run deploy 8 | env: 9 | global: 10 | - secure: TwDaYnvCKwRqiqlRpKXTTsR7z+YxTLL3Ls16QHQVuwRkIHJk2MUce7Y6ZtMU/OizSciqZ8YWMl12UovpyxERPfmLpWYPb3V2ud/9zCIDfujgm6XExO8vrZW3kkhW97Qmtpf+OcFFkgARzr2A9Piw3Dzew/LUNMemg7JCxGvYfuw= 11 | cache: 12 | directories: 13 | - node_modules 14 | sudo: false 15 | -------------------------------------------------------------------------------- /test/spec/services/categorydata.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Service: categoryData', function () { 4 | 5 | // load the service's module 6 | beforeEach(module('faqApp')); 7 | 8 | // instantiate service 9 | var categoryData; 10 | beforeEach(inject(function (_categoryData_) { 11 | categoryData = _categoryData_; 12 | })); 13 | 14 | it('should do something', function () { 15 | expect(!!categoryData).toBe(true); 16 | }); 17 | 18 | }); 19 | -------------------------------------------------------------------------------- /test/spec/services/questiondata.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Service: questionData', function () { 4 | 5 | // load the service's module 6 | beforeEach(module('faqApp')); 7 | 8 | // instantiate service 9 | var questionData; 10 | beforeEach(inject(function (_questionData_) { 11 | questionData = _questionData_; 12 | })); 13 | 14 | it('should do something', function () { 15 | expect(!!questionData).toBe(true); 16 | }); 17 | 18 | }); 19 | -------------------------------------------------------------------------------- /app/favicons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | #ffc40d 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "browser": true, 4 | "esnext": true, 5 | "bitwise": true, 6 | "camelcase": true, 7 | "curly": true, 8 | "eqeqeq": true, 9 | "immed": true, 10 | "indent": 2, 11 | "latedef": true, 12 | "newcap": true, 13 | "noarg": true, 14 | "quotmark": "single", 15 | "regexp": true, 16 | "undef": true, 17 | "unused": true, 18 | "strict": true, 19 | "trailing": true, 20 | "smarttabs": true, 21 | "globals": { 22 | "angular": false, 23 | "_": false 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /test/spec/controllers/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: MainCtrl', function () { 4 | 5 | // load the controller's module 6 | beforeEach(module('faqApp')); 7 | 8 | var MainCtrl; 9 | var scope; 10 | 11 | // Initialize the controller and a mock scope 12 | beforeEach(inject(function ($controller, $rootScope) { 13 | scope = $rootScope.$new(); 14 | MainCtrl = $controller('MainCtrl', { 15 | $scope: scope 16 | }); 17 | })); 18 | 19 | // it('should attach a list of awesomeThings to the scope', function () { 20 | // expect(scope.awesomeThings.length).toBe(3); 21 | // }); 22 | }); 23 | -------------------------------------------------------------------------------- /test/spec/controllers/question.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: QuestionctrlCtrl', function () { 4 | 5 | // load the controller's module 6 | beforeEach(module('faqApp')); 7 | 8 | var QuestionctrlCtrl, 9 | scope; 10 | 11 | // Initialize the controller and a mock scope 12 | beforeEach(inject(function ($controller, $rootScope) { 13 | scope = $rootScope.$new(); 14 | QuestionctrlCtrl = $controller('QuestionctrlCtrl', { 15 | $scope: scope 16 | }); 17 | })); 18 | 19 | // it('should attach a list of awesomeThings to the scope', function () { 20 | // expect(scope.awesomeThings.length).toBe(3); 21 | // }); 22 | }); 23 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "faq", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "angular": "~1.4.3", 6 | "json3": "~3.3.1", 7 | "es5-shim": "~3.1.0", 8 | "angular-resource": "~1.4.3", 9 | "angular-sanitize": "~1.4.3", 10 | "angular-animate": "~1.4.3", 11 | "angular-touch": "~1.4.3", 12 | "normalize.css": "~3.0.1", 13 | "angular-ui-router": "~0.2.15", 14 | "lodash": "~3.10.0", 15 | "angular-loading-bar": "~0.8.0", 16 | "ngstorage": "~0.3.0", 17 | "angular-aria": "~1.4.3" 18 | }, 19 | "devDependencies": { 20 | "angular-mocks": "~1.4.3", 21 | "angular-scenario": "~1.4.3" 22 | }, 23 | "appPath": "app" 24 | } 25 | -------------------------------------------------------------------------------- /app/scripts/controllers/question.js: -------------------------------------------------------------------------------- 1 | angular.module('faqApp').controller('QuestionCtrl', function ($scope, $state, $sanitize, questionData) { 2 | 'use strict'; 3 | 4 | $scope.question = {}; 5 | 6 | $scope.isOutDated = function(question) { 7 | if (!question.updated) { 8 | return false; 9 | } 10 | if (Date.now() - question.updated > 30 * 24 * 60 * 60 * 1e3 * 3) { 11 | return true; 12 | } 13 | return false; 14 | }; 15 | 16 | questionData().then(function(questions) { 17 | var question = _.find(questions, function(question) { 18 | return question.id+'' === $state.params.id+''; 19 | }); 20 | 21 | question.answer = $sanitize(question.answer); 22 | 23 | $scope.question = question; 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /test/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "browser": true, 4 | "esnext": true, 5 | "bitwise": true, 6 | "camelcase": true, 7 | "curly": true, 8 | "eqeqeq": true, 9 | "immed": true, 10 | "indent": 2, 11 | "latedef": true, 12 | "newcap": true, 13 | "noarg": true, 14 | "quotmark": "single", 15 | "regexp": true, 16 | "undef": true, 17 | "unused": true, 18 | "strict": true, 19 | "trailing": true, 20 | "smarttabs": true, 21 | "globals": { 22 | "after": false, 23 | "afterEach": false, 24 | "angular": false, 25 | "before": false, 26 | "beforeEach": false, 27 | "browser": false, 28 | "describe": false, 29 | "expect": false, 30 | "inject": false, 31 | "it": false, 32 | "jasmine": false, 33 | "spyOn": false 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /app/views/question.html: -------------------------------------------------------------------------------- 1 |
2 |

3 | 4 | ← Frequently Asked Questions 5 | 6 |

7 |
8 |

{{ question.title }}

9 |

10 |

11 | This question hasn't been updated in three months. 12 | If in doubt visit our chat or ping us 13 | on Twitter (@hoodiehq). 14 |

15 |

16 | Improve this answer → 17 |

18 |
19 | 20 |
21 | Loading... 22 |
23 |
24 | -------------------------------------------------------------------------------- /app/views/index.html: -------------------------------------------------------------------------------- 1 |
2 |

3 | 4 | Frequently Asked Questions 5 | 6 |

7 |
8 | 9 | 10 |
11 | 12 |
13 |
14 |

{{ category[0].category }}

15 | 22 |
23 |
24 | 25 |
26 | Loading... 27 |
28 |
29 | -------------------------------------------------------------------------------- /app/scripts/app.js: -------------------------------------------------------------------------------- 1 | angular.module('faqApp', [ 2 | 'ngAnimate', 3 | 'ngAria', 4 | 'ngResource', 5 | 'ngSanitize', 6 | 'ngTouch', 7 | 'ui.router', 8 | 'angular-loading-bar', 9 | 'ngStorage' 10 | ]).config(function($urlRouterProvider, $stateProvider, cfpLoadingBarProvider) { 11 | 'use strict'; 12 | 13 | cfpLoadingBarProvider.includeSpinner = false; 14 | 15 | $urlRouterProvider.otherwise('/'); 16 | 17 | $stateProvider 18 | .state('index', { 19 | url: '/', 20 | templateUrl: 'views/index.html', 21 | controller: 'MainCtrl' 22 | }) 23 | .state('question', { 24 | url: '/question/:id', 25 | templateUrl: 'views/question.html', 26 | controller: 'QuestionCtrl' 27 | }); 28 | }).run(function($q, $window) { 29 | 'use strict'; 30 | 31 | var defer = $q.defer(); 32 | var cache = $window.applicationCache; 33 | cache.addEventListener('updateready', defer.resolve); 34 | 35 | defer.promise.then(function() { 36 | $window.location.reload(); 37 | }); 38 | 39 | if (cache.status === cache.UPDATEREADY) { 40 | defer.resolve(); 41 | } 42 | }); 43 | -------------------------------------------------------------------------------- /test/karma.conf.js: -------------------------------------------------------------------------------- 1 | module.exports = function(config) { 2 | 'use strict'; 3 | 4 | config.set({ 5 | autoWatch: true, 6 | 7 | basePath: '../', 8 | 9 | frameworks: ['jasmine'], 10 | 11 | files: [ 12 | 'bower_components/angular/angular.js', 13 | 'bower_components/angular-mocks/angular-mocks.js', 14 | 'bower_components/angular-animate/angular-animate.js', 15 | 'bower_components/angular-aria/angular-aria.js', 16 | 'bower_components/angular-resource/angular-resource.js', 17 | 'bower_components/angular-sanitize/angular-sanitize.js', 18 | 'bower_components/angular-touch/angular-touch.js', 19 | 'bower_components/angular-ui-router/release/angular-ui-router.js', 20 | 'bower_components/lodash/dist/lodash.compat.js', 21 | 'bower_components/angular-loading-bar/src/loading-bar.js', 22 | 'bower_components/ngstorage/ngStorage.js', 23 | 'bower_components/marked/lib/marked.js', 24 | 'app/scripts/**/*.js', 25 | 'test/mock/**/*.js', 26 | 'test/spec/**/*.js' 27 | ], 28 | 29 | exclude: [], 30 | 31 | port: 8080, 32 | 33 | browsers: [ 34 | 'PhantomJS' 35 | ], 36 | 37 | plugins: [ 38 | 'karma-phantomjs-launcher', 39 | 'karma-jasmine' 40 | ], 41 | 42 | singleRun: false, 43 | 44 | colors: true, 45 | 46 | logLevel: config.LOG_INFO, 47 | 48 | }); 49 | }; 50 | -------------------------------------------------------------------------------- /app/scripts/services/questiondata.js: -------------------------------------------------------------------------------- 1 | angular.module('faqApp').service('questionData', function ($http, $q, $localStorage) { 2 | 'use strict'; 3 | 4 | var fresh = $http.get('https://api.github.com/repos/hoodiehq/faq/issues', { 5 | cache: true, 6 | headers: { 7 | 'Accept': 'application/vnd.github.v3.html+json' 8 | }, 9 | params: { 10 | state: 'all', 11 | labels: 'answered' 12 | } 13 | }); 14 | 15 | var promise = $localStorage.rawResponse ? $q.when($localStorage.rawResponse) : fresh; 16 | 17 | fresh.then(function(response) { 18 | $localStorage.rawResponse = response; 19 | }); 20 | 21 | return function() { 22 | return promise.then(function(response) { 23 | var questions = _.map(response.data, function(question) { 24 | /*jshint camelcase: false */ 25 | var result = { 26 | id: question.id, 27 | url: question.html_url, 28 | title: question.title, 29 | answer: question.body_html, 30 | updated: new Date(question.updated_at || question.created_at) 31 | }; 32 | 33 | var categoryPattern = /^cat\:/; 34 | _.each(question.labels, function(label) { 35 | 36 | if (categoryPattern.test(label.name)) { 37 | result.category = label.name.replace(categoryPattern, '').trim(); 38 | } 39 | }); 40 | 41 | return result; 42 | }); 43 | 44 | return _.sortBy(questions, function (question) { 45 | return question.category + question.title; 46 | }); 47 | }); 48 | }; 49 | }); 50 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "faq", 3 | "description": "Frequently asked questions about Hoodie", 4 | "version": "0.0.0", 5 | "author": "Stephan Bönnemann ", 6 | "bugs": { 7 | "url": "https://github.com/hoodiehq/faq/issues" 8 | }, 9 | "dependencies": {}, 10 | "devDependencies": { 11 | "bower": "^1.3.12", 12 | "grunt": "^0.4.1", 13 | "grunt-autoprefixer": "^2.2.0", 14 | "grunt-cli": "^0.1.13", 15 | "grunt-concurrent": "^1.0.0", 16 | "grunt-contrib-clean": "^0.6.0", 17 | "grunt-contrib-concat": "^0.5.0", 18 | "grunt-contrib-connect": "^0.9.0", 19 | "grunt-contrib-copy": "^0.7.0", 20 | "grunt-contrib-cssmin": "^0.11.0", 21 | "grunt-contrib-htmlmin": "^0.3.0", 22 | "grunt-contrib-imagemin": "^0.9.2", 23 | "grunt-contrib-jshint": "^0.11.0", 24 | "grunt-contrib-uglify": "^0.7.0", 25 | "grunt-contrib-watch": "^0.6.1", 26 | "grunt-filerev": "^2.1.2", 27 | "grunt-gh-pages": "^0.9.1", 28 | "grunt-google-cdn": "^0.4.0", 29 | "grunt-karma": "^0.10.1", 30 | "grunt-manifest": "^0.4.0", 31 | "grunt-newer": "^1.1.0", 32 | "grunt-ngmin": "^0.0.3", 33 | "grunt-svgmin": "^2.0.0", 34 | "grunt-usemin": "^3.0.0", 35 | "grunt-wiredep": "^2.0.0", 36 | "jasmine-core": "^2.2.0", 37 | "jshint-stylish": "^1.0.0", 38 | "karma": "^0.12.17", 39 | "karma-jasmine": "^0.3.5", 40 | "karma-phantomjs-launcher": "^0.1.4", 41 | "load-grunt-tasks": "^3.1.0", 42 | "time-grunt": "^1.0.0" 43 | }, 44 | "engines": { 45 | "node": ">=0.10.0" 46 | }, 47 | "homepage": "http://faq.hood.ie/", 48 | "keywords": [ 49 | "answers", 50 | "faq", 51 | "issues", 52 | "no-backend", 53 | "questions" 54 | ], 55 | "license": "MIT", 56 | "main": "Gruntfile.js", 57 | "repository": { 58 | "type": "git", 59 | "url": "https://github.com/hoodiehq/faq.git" 60 | }, 61 | "scripts": { 62 | "deploy": "grunt gh-pages", 63 | "install": "bower install", 64 | "start": "grunt serve", 65 | "test": "grunt" 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Frequently asked Hoodies 2 | [![Build Status](https://travis-ci.org/hoodiehq/faq.svg)](https://travis-ci.org/hoodiehq/faq) 3 | [![Dependency Status](https://david-dm.org/hoodiehq/faq.svg)](https://david-dm.org/hoodiehq/faq) 4 | [![devDependency Status](https://david-dm.org/hoodiehq/faq/dev-status.svg)](https://david-dm.org/hoodiehq/faq#info=devDependencies) 5 | 6 | ## FAQ Workflow - How to display questions and answers on faq.hood.ie 7 | 8 | First, a question must be asked! All questions are issues within the [issue tracker](https://github.com/hoodiehq/faq/issues) of this repository. A question will not show up on [faq.hood.ie](http://faq.hood.ie) until a hoodie contributor believes it has been answered correctly. When the question has been answered, a label of `answered` must be added to the GitHub issue for it to appear within the app. 9 | 10 | The FAQ app takes the issue's title and uses this as the question title on the app. The first post on the GitHub issue is assumed to be the answer. This can be problematic if the original post in the GitHub Issue is the question asked. In order to have the question and answer show up in the app, you should close the answered issue (make sure it does not have a label of `answered`) and create a new issue. 11 | 12 | This new issue's title should be the question, and the first post should be the answer. It should also have the `answered` label and a `cat:` (category) label so it shows up in helpful categories within the app. See an example [here](https://github.com/hoodiehq/faq/issues/30). This makes sure that our FAQ provides the best information possible and everyone can get the answers they need! 13 | 14 | If a better answer comes along, the previous issue within the now incorrect answer can be closed; and a new issue can be created. 15 | 16 | Comments and resources are encouraged on each question, dicussion is good and answers may change as time passes. Only the first post will be displayed on the question, but each question comes with a link to the issue to add/view more discussions. 17 | 18 | 19 | ## Development 20 | 21 | Install dependencies 22 | 23 | ```bash 24 | npm install 25 | ``` 26 | 27 | Start development server 28 | 29 | ```bash 30 | npm start 31 | ``` 32 | 33 | # License 34 | 35 | This app is MIT licensed. Feel free to reuse this for your own project. 36 | -------------------------------------------------------------------------------- /app/styles/main.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'FiraMono'; 3 | src: url('../images/font/FiraMono-Regular.eot'); 4 | src: url('../images/font/FiraMono-Regular.eot?#iefix') format('embedded-opentype'), 5 | url('../images/font/FiraMono-Regular.woff') format('woff'), 6 | url('../images/font/FiraMono-Regular.ttf') format('truetype'), 7 | url('../images/font/FiraMono-Regular.svg#FiraSansMono') format('svg'); 8 | font-weight: 300; 9 | font-style: normal; 10 | 11 | } 12 | 13 | .faq .content > h2{ 14 | text-align: center; 15 | } 16 | 17 | .faq a { 18 | text-decoration: none; 19 | background-image: none; 20 | } 21 | 22 | .faq b { 23 | position: absolute; 24 | left: -999em; 25 | } 26 | 27 | .faq input#search { 28 | border: solid #CCC; 29 | border-width: 0 0 1px 0; 30 | padding: 0.25em 0.5em 0.1em; 31 | font-size: 25px; 32 | font-weight: 300; 33 | color: #312783; 34 | width: 100%; 35 | margin-top: 5px; 36 | margin-bottom: 35px; 37 | line-height: 32px; 38 | text-align: center; 39 | font-family: "FiraSansLight",sans-serif; 40 | } 41 | 42 | .faq input#search:focus, 43 | .faq input#search:hover{; 44 | outline: none; 45 | } 46 | 47 | .faq .cb{ 48 | padding-bottom: 0; 49 | max-width: 80%; 50 | width: 41rem; 51 | } 52 | 53 | .faq h4{ 54 | margin-top: 30px; 55 | } 56 | 57 | .faq .content ul, 58 | .faq .content li { 59 | margin-bottom: 0; 60 | } 61 | 62 | .cb p, 63 | .question li { 64 | font-size: 1.1em; 65 | line-height: 1.6; 66 | } 67 | 68 | .faq .task-list { 69 | font-size: 1em; 70 | line-height: 1.4; 71 | } 72 | 73 | .faq .sitemap { 74 | text-align: center; 75 | } 76 | 77 | .faq .footer ul { 78 | display: block; 79 | width: 100%; 80 | } 81 | 82 | .faq .footer li { 83 | display: inline-block; 84 | color: #fff; 85 | } 86 | 87 | .faq .footer li a { 88 | color: #fff; 89 | } 90 | 91 | .faq code, 92 | .faq kbd, 93 | .faq pre, 94 | .faq samp { 95 | font-family: "FiraMono",sans-serif; 96 | font-size: 1em; 97 | padding-top: 0; 98 | margin-top: 10px !important; 99 | white-space: pre-wrap !important; 100 | background-color: #F8F8FB !important; 101 | padding: 0.2em 0.5em 0.2em; 102 | margin-bottom: 25px; 103 | } 104 | 105 | .faq .note { 106 | margin: 1em 0; 107 | } 108 | 109 | .faq .note .btn { 110 | padding: 0.4em 1em 0.2em; 111 | background-color: #312783; 112 | color: #FFF; 113 | border: 0; 114 | text-decoration: none; 115 | text-shadow: none; 116 | font-weight: 500; 117 | margin-top: 2em; 118 | } 119 | 120 | .fly.ng-enter { 121 | transition: 100ms ease-in all; 122 | opacity: 0; 123 | } 124 | 125 | .fly.ng-enter-stagger { 126 | transition-delay: 100ms; 127 | } 128 | 129 | .fly.ng-enter-active { 130 | opacity: 1; 131 | } 132 | 133 | .fly.ng-leave { 134 | transition: 100ms ease-out all 30ms; 135 | opacity: 1; 136 | } 137 | 138 | .fly.ng-leave-active { 139 | opacity: 0; 140 | } 141 | 142 | .faq .question ul { 143 | margin: 1em 0; 144 | } 145 | 146 | .faq .question a { 147 | text-decoration: underline; 148 | } 149 | 150 | .faq #loading-bar .bar { 151 | background: #FFF; 152 | } 153 | 154 | .faq #loading-bar .peg { 155 | box-shadow: #FFF 1px 0 6px 1px; 156 | } 157 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 18 | Hoodie - Frequently Asked Questions 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 53 |
54 | 75 |
76 | 99 |
100 |
101 | 102 | 109 | 110 | 111 | 112 | 122 | 123 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function (grunt) { 2 | 'use strict'; 3 | 4 | require('load-grunt-tasks')(grunt); 5 | require('time-grunt')(grunt); 6 | 7 | var appConfig = { 8 | app: 'app', 9 | dist: 'dist' 10 | }; 11 | 12 | grunt.initConfig({ 13 | 14 | yeoman: appConfig, 15 | 16 | watch: { 17 | bower: { 18 | files: ['bower.json'], 19 | tasks: ['wiredep'] 20 | }, 21 | js: { 22 | files: ['<%= yeoman.app %>/scripts/**/*.js'], 23 | tasks: ['newer:jshint:all'], 24 | options: { 25 | livereload: '<%= connect.options.livereload %>' 26 | } 27 | }, 28 | jsTest: { 29 | files: ['test/spec/**/*.js'], 30 | tasks: ['newer:jshint:test', 'karma'] 31 | }, 32 | styles: { 33 | files: ['<%= yeoman.app %>/styles/**/*.css'], 34 | tasks: ['newer:copy:styles', 'autoprefixer'] 35 | }, 36 | gruntfile: { 37 | files: ['Gruntfile.js'] 38 | }, 39 | livereload: { 40 | options: { 41 | livereload: '<%= connect.options.livereload %>' 42 | }, 43 | files: [ 44 | '<%= yeoman.app %>/**/*.html', 45 | '.tmp/styles/**/*.css', 46 | '<%= yeoman.app %>/images/**/*.{png,jpg,jpeg,gif,webp,svg}' 47 | ] 48 | } 49 | }, 50 | 51 | connect: { 52 | options: { 53 | port: 9000, 54 | hostname: '0.0.0.0', 55 | livereload: 35729 56 | }, 57 | livereload: { 58 | options: { 59 | open: true, 60 | middleware: function (connect) { 61 | return [ 62 | connect.static('.tmp'), 63 | connect().use( 64 | '/bower_components', 65 | connect.static('./bower_components') 66 | ), 67 | connect.static(appConfig.app) 68 | ]; 69 | } 70 | } 71 | }, 72 | test: { 73 | options: { 74 | port: 9001, 75 | middleware: function (connect) { 76 | return [ 77 | connect.static('.tmp'), 78 | connect.static('test'), 79 | connect().use( 80 | '/bower_components', 81 | connect.static('./bower_components') 82 | ), 83 | connect.static(appConfig.app) 84 | ]; 85 | } 86 | } 87 | }, 88 | dist: { 89 | options: { 90 | open: true, 91 | base: '<%= yeoman.dist %>' 92 | } 93 | } 94 | }, 95 | 96 | jshint: { 97 | options: { 98 | jshintrc: '.jshintrc', 99 | reporter: require('jshint-stylish') 100 | }, 101 | all: { 102 | src: [ 103 | 'Gruntfile.js', 104 | '<%= yeoman.app %>/scripts/**/*.js' 105 | ] 106 | }, 107 | test: { 108 | options: { 109 | jshintrc: 'test/.jshintrc' 110 | }, 111 | src: ['test/spec/**/*.js'] 112 | } 113 | }, 114 | 115 | clean: { 116 | dist: { 117 | files: [{ 118 | dot: true, 119 | src: [ 120 | '.tmp', 121 | '<%= yeoman.dist %>/**/*', 122 | '!<%= yeoman.dist %>/.git*' 123 | ] 124 | }] 125 | }, 126 | server: '.tmp' 127 | }, 128 | 129 | autoprefixer: { 130 | options: { 131 | browsers: ['last 1 version'] 132 | }, 133 | dist: { 134 | files: [{ 135 | expand: true, 136 | cwd: '.tmp/styles/', 137 | src: '**/*.css', 138 | dest: '.tmp/styles/' 139 | }] 140 | } 141 | }, 142 | 143 | wiredep: { 144 | options: { 145 | cwd: '' 146 | }, 147 | app: { 148 | src: ['<%= yeoman.app %>/index.html'], 149 | ignorePath: /\.\.\// 150 | } 151 | }, 152 | 153 | filerev: { 154 | dist: { 155 | src: [ 156 | '<%= yeoman.dist %>/scripts/**/*.js', 157 | '<%= yeoman.dist %>/styles/**/*.css', 158 | '<%= yeoman.dist %>/images/**/*.{png,jpg,jpeg,gif,webp,svg}', 159 | ] 160 | } 161 | }, 162 | 163 | useminPrepare: { 164 | html: '<%= yeoman.app %>/index.html', 165 | options: { 166 | dest: '<%= yeoman.dist %>', 167 | flow: { 168 | html: { 169 | steps: { 170 | js: ['concat', 'uglifyjs'], 171 | css: ['cssmin'] 172 | }, 173 | post: {} 174 | } 175 | } 176 | } 177 | }, 178 | 179 | usemin: { 180 | html: ['<%= yeoman.dist %>/**/*.html'], 181 | css: ['<%= yeoman.dist %>/styles/**/*.css'], 182 | options: { 183 | assetsDirs: ['<%= yeoman.dist %>','<%= yeoman.dist %>/images'] 184 | } 185 | }, 186 | 187 | imagemin: { 188 | dist: { 189 | files: [{ 190 | expand: true, 191 | cwd: '<%= yeoman.app %>/images', 192 | src: '**/*.{png,jpg,jpeg,gif}', 193 | dest: '<%= yeoman.dist %>/images' 194 | }] 195 | } 196 | }, 197 | 198 | svgmin: { 199 | dist: { 200 | files: [{ 201 | expand: true, 202 | cwd: '<%= yeoman.app %>/images', 203 | src: '**/*.svg', 204 | dest: '<%= yeoman.dist %>/images' 205 | }] 206 | } 207 | }, 208 | 209 | htmlmin: { 210 | dist: { 211 | options: { 212 | collapseWhitespace: true, 213 | conservativeCollapse: true, 214 | collapseBooleanAttributes: true, 215 | removeCommentsFromCDATA: true, 216 | removeOptionalTags: true 217 | }, 218 | files: [{ 219 | expand: true, 220 | cwd: '<%= yeoman.dist %>', 221 | src: ['*.html', 'views/**/*.html'], 222 | dest: '<%= yeoman.dist %>' 223 | }] 224 | } 225 | }, 226 | 227 | ngmin: { 228 | dist: { 229 | files: [{ 230 | expand: true, 231 | cwd: '.tmp/concat/scripts', 232 | src: '*.js', 233 | dest: '.tmp/concat/scripts' 234 | }] 235 | } 236 | }, 237 | 238 | cdnify: { 239 | dist: { 240 | html: ['<%= yeoman.dist %>/*.html'] 241 | } 242 | }, 243 | 244 | copy: { 245 | dist: { 246 | files: [{ 247 | expand: true, 248 | dot: true, 249 | cwd: '<%= yeoman.app %>', 250 | dest: '<%= yeoman.dist %>', 251 | src: [ 252 | 'CNAME', 253 | 'favicons/*', 254 | '*.{ico,png,txt}', 255 | '.htaccess', 256 | '*.html', 257 | 'views/**/*.html', 258 | 'images/**/*.{webp,svg}', 259 | 'styles/fonts/*', 260 | 'images/font/**/*' 261 | ] 262 | }, { 263 | expand: true, 264 | cwd: '.tmp/images', 265 | dest: '<%= yeoman.dist %>/images', 266 | src: ['generated/*'] 267 | }] 268 | }, 269 | styles: { 270 | expand: true, 271 | cwd: '<%= yeoman.app %>/styles', 272 | dest: '.tmp/styles/', 273 | src: '**/*.css' 274 | } 275 | }, 276 | 277 | concurrent: { 278 | server: [ 279 | 'copy:styles' 280 | ], 281 | test: [ 282 | 'copy:styles' 283 | ], 284 | dist: [ 285 | 'copy:styles', 286 | 'imagemin' 287 | // 'svgmin' 288 | ] 289 | }, 290 | 291 | karma: { 292 | unit: { 293 | configFile: 'test/karma.conf.js', 294 | singleRun: true 295 | } 296 | }, 297 | 298 | 'gh-pages': { 299 | options: { 300 | base: 'dist', 301 | repo: 'https://' + process.env.GH_TOKEN + '@github.com/hoodiehq/faq', 302 | user: { 303 | name: 'Hoodie Bot', 304 | email: 'stephan@thehoodiefirm.com' 305 | } 306 | }, 307 | src: '**/*' 308 | }, 309 | 310 | manifest: { 311 | generate: { 312 | options: { 313 | basePath: '<%= yeoman.dist %>', 314 | preferOnline: true, 315 | verbose: false, 316 | }, 317 | src: [ 318 | '**/{,*}.*', 319 | '!index.html', 320 | '!manifest.appcache' 321 | ], 322 | dest: '<%= yeoman.dist %>/manifest.appcache' 323 | } 324 | } 325 | }); 326 | 327 | 328 | grunt.registerTask('serve', 'Compile then start a connect web server', function (target) { 329 | if (target === 'dist') { 330 | return grunt.task.run(['build', 'connect:dist:keepalive']); 331 | } 332 | 333 | grunt.task.run([ 334 | 'clean:server', 335 | 'wiredep', 336 | 'concurrent:server', 337 | 'autoprefixer', 338 | 'connect:livereload', 339 | 'watch' 340 | ]); 341 | }); 342 | 343 | grunt.registerTask('test', [ 344 | 'clean:server', 345 | 'concurrent:test', 346 | 'autoprefixer', 347 | 'connect:test', 348 | 'karma' 349 | ]); 350 | 351 | grunt.registerTask('build', [ 352 | 'clean:dist', 353 | 'wiredep', 354 | 'useminPrepare', 355 | 'concurrent:dist', 356 | 'autoprefixer', 357 | 'concat', 358 | 'ngmin', 359 | 'copy:dist', 360 | 'cdnify', 361 | 'cssmin', 362 | 'uglify', 363 | 'filerev', 364 | 'usemin', 365 | 'htmlmin', 366 | 'manifest' 367 | ]); 368 | 369 | grunt.registerTask('default', [ 370 | 'newer:jshint', 371 | 'test', 372 | 'build' 373 | ]); 374 | }; 375 | -------------------------------------------------------------------------------- /app/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 11 | 13 | 15 | 17 | 19 | 21 | 24 | 25 | 26 | 32 | 37 | 39 | 44 | 46 | 50 | 52 | 53 | 57 | 63 | 64 | 65 | 71 | 75 | 77 | 82 | 84 | 88 | 90 | 91 | 95 | 101 | 102 | -------------------------------------------------------------------------------- /app/styles/hoodie.css: -------------------------------------------------------------------------------- 1 | html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after{content:'';content:none;}q:before,q:after{content:'';content:none;}table{border-collapse:collapse;border-spacing:0;}*{box-sizing:border-box;}img{max-width:100%;}section:before,.main-nav:before,.sub-nav:before,.cb:before,.friends:before,section:after,.main-nav:after,.sub-nav:after,.cb:after,.friends:after{content:" ";display:table;}section:after,.main-nav:after,.sub-nav:after,.cb:after,.friends:after{clear:both;}section,.main-nav,.sub-nav{width:100%;}header{z-index:1;}header section li,header section a{display:inline-block;}footer{padding-top:5.625rem;}@media (min-width: 30em){footer{margin-top:5.3125rem;}}.nav{height:4.0625rem;}.sub-nav{top:4.0625rem;padding:0.5rem 0 0.3125rem 0;}.sub-nav,.cb,.main-nav,.blog-list,.blog-post .comments{margin:0 auto;}.nav,.sub-nav{position:absolute;}.cb{width:100%;max-width:51.875rem;padding-bottom:2.625rem;}.cb.teaser{padding-bottom:3.5625rem;}.cb article{width:100%;max-width:37.5rem;margin:0 auto;}@media (min-width: 57.5em){.cb article{float:right;}}.cb aside{width:100%;margin:0 auto;max-width:37.5rem;}.cb aside br{display:none;}@media (min-width: 57.5em){.cb aside br{display:inline;}}@media (min-width: 57.5em){.cb aside{max-width:11.25rem;float:left;margin:0 3.125rem 0 0;}}.cb table{width:100%;}.cb tr:nth-child(even){background-color:#e1e1e1;}.cb td{padding:5px 8px;}.cb td:nth-child(1){width:60%;}.content{padding:10rem 1rem 0;}@media (min-width: 30em){.content{padding:12.5rem 1rem 0;}}@media (min-width: 57.5em){.content{padding:16.875rem 1rem 0;}}code{padding-top:1.5625rem;display:block;}.grid-9{width:100%;max-width:37.5rem;}.grid-9 figure figcaption{padding-bottom:1.875rem;}.grid-6{width:65%;max-width:28.125rem;}.grid-3{min-width:10.625rem;max-width:10.625rem;}.grid-3-container{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.l{float:left;}.r{float:right;}.blog-post article{float:none;}.hide{display:none;}.centered{text-align:center;display:block;}.switch-on-break{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.switch-on-break .contribute-aside-icon{-webkit-order:1;-ms-flex-order:1;order:1;}.switch-on-break article{-webkit-order:2;-ms-flex-order:2;order:2;}@media (min-width: 57.5em){.switch-on-break{display:block;}}.vat{display:block;margin-top:0.9375rem;font-size:0.8em;}body{color:#404040;background-color:#fff;}.orange .content{background-image:url('../img/logo_cut_orange.png');background-repeat:no-repeat;background-position:center 3.5rem;}.orange footer{background-image:url('../img/logo_cut_negativ_orange.png');background-repeat:no-repeat;background-position:center 0;}.orange h1,.orange h2,.orange h3,.orange h4,.orange a{color:#e94e1b;}.orange a{background-image:linear-gradient(to bottom, #e94e1b 75%, rgba(233, 78, 27, 0.8) 75%);}.orange .nav,.orange .footer{background-color:#e94e1b;}.orange .footer .sitemap-link{color:#fff;}.orange .sub-nav{background-color:#f9c4b3;}.blue .content{background-image:url('../images/logo_cut_blue.png');background-repeat:no-repeat;background-position:center 3.5rem;}.blue footer{background-image:url('../images/logo_cut_negativ_blue.png');background-repeat:no-repeat;background-position:center 0;}.blue h1,.blue h2,.blue h3,.blue h4,.blue a{color:#273183;}.blue a{background-image:linear-gradient(to bottom, #273183 75%, rgba(39, 49, 131, 0.8) 75%);}.blue .nav,.blue .footer{background-color:#273183;}.blue .footer .sitemap-link{color:#fff;}.blue .sub-nav{background-color:#bfbcd8;}.green .content{background-image:url('../img/logo_cut_green.png');background-repeat:no-repeat;background-position:center 3.5rem;}.green footer{background-image:url('../img/logo_cut_negativ_green.png');background-repeat:no-repeat;background-position:center 0;}.green h1,.green h2,.green h3,.green h4,.green a{color:#0b8e36;}.green a{background-image:linear-gradient(to bottom, #0b8e36 75%, rgba(11, 142, 54, 0.8) 75%);}.green .nav,.green .footer{background-color:#0b8e36;}.green .footer .sitemap-link{color:#fff;}.green .sub-nav{background-color:#a9d6b8;}.yellow .content{background-image:url('../img/logo_cut_yellow.png');background-repeat:no-repeat;background-position:center 3.5rem;}.yellow footer{background-image:url('../img/logo_cut_negativ_yellow.png');background-repeat:no-repeat;background-position:center 0;}.yellow h1,.yellow h2,.yellow h3,.yellow h4,.yellow a{color:#f9b233;}.yellow a{background-image:linear-gradient(to bottom, #f9b233 75%, rgba(249, 178, 51, 0.8) 75%);}.yellow .nav,.yellow .footer{background-color:#f9b233;}.yellow .footer .sitemap-link{color:#fff;}.yellow .sub-nav{background-color:#fce3b6;}.lilac .content{background-image:url('../img/logo_cut_lilac.png');background-repeat:no-repeat;background-position:center 3.5rem;}.lilac footer{background-image:url('../img/logo_cut_negativ_lilac.png');background-repeat:no-repeat;background-position:center 0;}.lilac h1,.lilac h2,.lilac h3,.lilac h4,.lilac a{color:#520644;}.lilac a{background-image:linear-gradient(to bottom, #520644 75%, rgba(82, 6, 68, 0.8) 75%);}.lilac .nav,.lilac .footer{background-color:#520644;}.lilac .footer .sitemap-link{color:#fff;}.lilac .sub-nav{background-color:#c1a7bc;}.gray .content{background-image:url('../img/logo_cut_gray.png');background-repeat:no-repeat;background-position:center 3.5rem;}.gray footer{background-image:url('../img/logo_cut_negativ_gray.png');background-repeat:no-repeat;background-position:center 0;}.gray h1,.gray h2,.gray h3,.gray h4,.gray a{color:#282828;}.gray a{background-image:linear-gradient(to bottom, #282828 75%, rgba(40, 40, 40, 0.8) 75%);}.gray .nav,.gray .footer{background-color:#282828;}.gray .footer .sitemap-link{color:#fff;}.gray .sub-nav{background-color:#b3b3b3;}aside{color:#999;}.box:nth-child(even){background-color:#fefefe;}.sub-nav a{color:#404040 !important;}.main-nav a,.meta-nav a{color:#fff !important;}.cb:odd{background-color:#b3b3b3;}.cb aside a{color:#999;}article figure figcaption{color:#999;}.api-nav li a{color:#273183;}@font-face{font-family:'FiraSans';src:url('../images/font/FiraSans-Light.otf') format('truetype');font-weight:300;font-style:normal;}@font-face{font-family:'FiraSans';src:url('../images/font/FiraSans-Regular.otf') format('truetype'); font-weight:400;font-style:normal;}@font-face{font-family:'FiraSans';src:url('../images/font/FiraSans-Medium.otf') format('truetype');font-weight:500;font-style:normal;}body{font-family:'FiraSans',sans-serif;font-weight:300;font-size:100%;line-height:1.618;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}h1,.h1{font-size:2.25em;font-weight:500;line-height:1.363;margin-bottom:1.25rem;}h1 a,.h1 a{background-position:0 1.15em;}@-moz-document url-prefix(){h1 a,.h1 a{background-position:0 0.93em;}}h2,.h2{font-size:1.4em;font-weight:500;line-height:1.363;margin-bottom:1.188rem;text-transform:uppercase;}h3,.h3{font-size:1.375em;line-height:1.361;font-weight:500;margin-bottom:0.734rem;}h4,.h4{font-size:1.1em;line-height:1.363;font-weight:500;text-transform:uppercase;margin-bottom:0.734rem;}h5,.h5{font-size:1.1em;line-height:1.363;font-weight:500;text-transform:uppercase;margin-bottom:0.734rem;}h5 a,.h5 a{background-position:0 1.15em;}h6,.h6{font-size:0.875em;font-weight:500;line-height:1.6;}.h-section{max-width:37.5rem;margin:0 auto 1.1875rem;}@media (min-width: 57.5em){.h-section{margin:0 auto 1.1875rem 14.375rem;}}p{font-size:1.1875em;line-height:1.618;margin-bottom:1.625rem;}.teaser p{font-size:1.7em;line-height:1.618;}.teaser a{background-position:0 2.0625rem;}.teaser aside a{background-position:0 1.4375rem;}@media (min-width: 57.5em){aside{text-align:right;}}aside a{background-image:linear-gradient(to bottom, #999999 75%, rgba(153, 153, 153, 0.8) 75%) !important;background-position:0 1.3125rem;}@-moz-document url-prefix(){.teaser a{background-position:0 1.5625rem;}.teaser aside a{background-position:0 1.1875rem;}aside a{background-position:0 1.0625rem;}}blockquote p{font-style:italic;}small{font-size:0.8em;line-height:1.3;display:inline-block;}em{font-style:italic;}strong{font-weight:500;}a{text-decoration:none;background-repeat:repeat-x;background-size:1px 1px;background-position:0 1.375rem;text-shadow:1px 0 0 #fff,-1px 0 0 #fff;}@-moz-document url-prefix(){a{background-position:0 1.125rem;}}.main .teaser-index-section a,.orange-box a{text-shadow:1px 0 0 #e94e1b,-1px 0 0 #e94e1b;}.feature a,.contribute a,.merch a{text-shadow:none;}.sub-nav,.main-nav{text-align:center;}.meta-nav{text-align:right;}.meta-nav,.main-nav{font-size:1.094em;}.sub-nav{font-size:0.938em;}.sub-nav .sub-nav-list-item{margin-right:0.5625rem;}.sub-nav-list-item.current a{text-decoration:underline;}.nav,.sub-nav{text-transform:uppercase;}.nav a,.meta-nav .meta-nav-list-item{margin-right:0.5625rem;}.nav a:last-child,.sub-nav .sub-nav-list-item:last-child,.meta-nav .meta-nav-list-item:last-child{margin-right:0;}ul,ol{font-size:1.1875em;}ul ul,ul ol,ol ol,ol ul{font-size:1em;margin-top:0.75rem;}.cb aside{font-size:1.1em;line-height:1.618;}.cb.teaser{font-size:0.8em;}@media (min-width: 30em){.cb.teaser{font-size:1em;}}.cb.teaser aside{font-size:1.2em;line-height:1.618;}.cb li{margin-bottom:0.75rem;}article figure figcaption{font-size:1.1em;line-height:1.45;}code{font-family:'Fira Mono';font-size:1.2em;line-height:1.8;}input,textarea{font-family:"FiraSansLight",sans-serif;}.api-nav{font-size:1.1em;line-height:1.8;}.no-border,.bio-link a,.grid-3-container a{background-image:none !important;border:0 !important;}.friends .grid-3 a{background-position:0 7.55em;}.text-transform-reverse{text-transform:initial;}.emoji{border:none;}.contribute-topic-headline{text-align:center;}.person-bio .h3,.person-bio .h6,.person-bio article p,.person-bio .bio-link{padding-left:0;}@media (min-width: 30em){.person-bio .h3,.person-bio .h6,.person-bio article p,.person-bio .bio-link{padding-left:10.9375rem;}}.person-bio .h6{display:block;}.person-bio p{margin-bottom:0.75rem;}@media (min-width: 30em){.person-bio p{margin-bottom:1.625rem;}}.person-bio .grid-3{margin-top:0.3125rem;max-width:9.375rem;position:relative;}.person-bio .grid-3 .sw{position:absolute;left:0;opacity:1;transition:opacity 0.25s;}.person-bio .grid-3 .sw:hover{opacity:0;}.person-bio .bio-link{padding-top:0;width:100%;max-width:37.5rem;margin:0 auto;}@media (min-width: 57.5em){.person-bio .bio-link{max-width:11.25rem;padding-left:0;padding-top:8.0625rem;}}.person-bio figure.grid-3.l{float:none;}@media (min-width: 30em){.person-bio figure.grid-3.l{float:left;}}.friends .grid-3{margin-bottom:1.25rem;text-align:center;}@media (min-width: 30em){.friends .grid-3{margin-bottom:2.5rem;}}@media (min-width: 57.5em){.friends .grid-3{margin-bottom:3.75rem;}}.friends .grid-3 figure{min-height:9.375rem;margin-bottom:1rem;}.friends .grid-3 figure.contribute-topic-image-wrap{min-height:5.625rem;}.friends .grid-3 figure .contribute-topic-image{width:5rem;opacity:0.4;}.friends .grid-svg{margin-bottom:1.25rem;color:rgba(0, 0, 0, 0.3);}.api-nav{position:absolute;top:21.6875rem;width:12.5rem;text-align:right;padding:2.8125rem 1.875rem 2.1875rem 1.875rem;margin-left:13.75rem;background-color:#fefefe;border-radius:0.75rem;}.api-nav ul{margin-bottom:2.1875rem;}code{white-space:normal !important;border:0 none !important;background-color:transparent !important;margin-top:1.5625rem !important;}ul,ol{margin-bottom:1.625rem;}article ol{list-style-type:decimal;}ul{padding-left:1.625rem;list-style:inherit;}ol{padding-left:1.875rem;}img{border-radius:3px;border:1px solid #f1f1f1;}aside img{border:0;}.jump-mark{background-image:none !important;padding-top:3.125rem;margin-top:-3.125rem;background-clip:content-box;}.jump-mark:hover{background-image:none;}.friends svg,.contribute-aside-icon svg{width:5rem;height:5rem;display:block;margin:0 auto;}.friends use,.contribute-aside-icon use{-webkit-transform:scale(2.5);-ms-transform:scale(2.5);transform:scale(2.5);}@media (min-width: 57.5em){.contribute-aside-icon{text-align:right;}}.contribute-aside-icon svg{margin:0;display:inline-block;}.blog h1{text-transform:uppercase;}.blog h2{margin-top:2.5rem;}.blog p{margin-bottom:1rem;}.blog .entry{margin-bottom:1.25rem;}.blog blockquote{position:relative;padding:1rem 1rem 0.6875rem;margin-bottom:1.25rem;border-left:3px solid #b3b3b3;}.blog blockquote:before{position:absolute;content:'\201C';top:-1rem;font-size:4.5em;color:#b3b3b3;}.blog blockquote p{text-indent:2em;margin-bottom:0;}.blog blockquote cite{font-style:normal;display:block;text-align:right;margin-top:0.625rem;text-indent:6em;}.blog .blog-post-end{margin-top:5rem;}.blog__hr{background-color:#282828;border:0;width:10rem;height:1px;margin:1.25rem auto;}.blog-meta{display:block;margin-bottom:1.25rem;}.blog-post article{margin-bottom:3.75rem;}.blog-post article>p:first-of-type{font-style:italic;font-weight:500;font-size:1.7em;padding-bottom:3.5625rem;}.blog-post article>p:first-of-type a{background-position:0 35px;}.blog-post a{display:inline;}@-moz-document url-prefix(){.blog-post article>p:first-of-type a{background-position:0 25px;}}.blog-post-link{background-image:none !important;}.blog-post-link-more{font-weight:500;text-transform:uppercase;background-position:0 1.1875rem;}@-moz-document url-prefix(){.blog-post-link-more{background-position:0 0.9375rem;}}.blog-greetings{font-weight:500;font-size:1.125em;font-style:italic;}.pagination{float:right;margin-top:1.875rem;}.blog-post-excerpt img:not(.emoji){width:100%;}.blog-post-excerpt .emoji{vertical-align:sub;}.footer{padding:0 1rem;}.footer .grid-3{width:100%;max-width:none;}@media (min-width: 34.375em){.footer .grid-3{width:33%;}}.sitemap{padding:2.1875rem 0 0.9375rem;}.sitemap-list{line-height:1.6;list-style:none;padding-left:0;text-align:center;}.sitemap-list:last-child{margin-right:0;}.sitemap-list .sitemap-item{margin-bottom:0;}.sitemap-list .sitemap-item.smaller{font-size:0.8em;-moz-osx-font-smoothing:initial;}.sitemap-list .sitemap-item:first-child{padding-top:0;}.sitemap-list .sitemap-item-bold{font-weight:500;padding-top:0.9375rem;opacity:0.9;}.sitemap-list .sitemap-link{text-decoration:none !important;}.footer-licensing{color:#fff;font-size:0.875rem;}.footer-licensing a{color:#fff;background-image:linear-gradient(to bottom, #ffffff 45%, rgba(255, 255, 255, 0.4) 60%);background-position:0 0.8125rem;}@-moz-document url-prefix(){.footer-licensing a{background-position:0 0.625rem;}}.eventsIntro{padding-bottom:0;}#eventsList ul{list-style:none;padding-left:0;}#eventsList .hidden{display:none;}#eventsList .futureEvents{padding-right:1rem;}#eventsList .futureEvents .events>li:first-child{background-color:#f9b233;color:#fff;padding:0.5em 0.75em;border-radius:4px;font-weight:400;}#eventsList .futureEvents .events>li:first-child h3{color:#fff;}#eventsList .futureEvents .events>li:first-child a{color:#404040;background-image:linear-gradient(to bottom, #404040 75%, rgba(64, 64, 64, 0.8) 75%);text-shadow:none;}#eventsList .futureEvents .events>li:first-child .links{margin:0.75em 0 0.25em;}#eventsList .futureEvents .events>li:first-child:before{content:"Next event";width:100%;text-align:center;display:block;text-transform:uppercase;font-weight:500;}#eventsList .pastEvents{padding-left:1rem;}#eventsList .futureEvents,#eventsList .pastEvents{width:50%;float:left;box-sizing:border-box;}#eventsList .futureEvents h1,#eventsList .futureEvents h2,#eventsList .pastEvents h1,#eventsList .pastEvents h2{padding-left:0;text-align:center;margin-bottom:1.5em;}#eventsList .futureEvents .events>li,#eventsList .pastEvents .events>li{margin-bottom:1em;border-bottom:1px solid #f9b233;padding-bottom:1em;}#eventsList .futureEvents .events>li:last-of-type,#eventsList .pastEvents .events>li:last-of-type{border-bottom:none;}#eventsList .futureEvents .events>li p,#eventsList .futureEvents .events>li ul li a,#eventsList .pastEvents .events>li p,#eventsList .pastEvents .events>li ul li a{font-size:1em;line-height:1.5;}#eventsList .futureEvents .events>li .description,#eventsList .pastEvents .events>li .description{margin-bottom:0.75em;overflow:hidden;}#eventsList .futureEvents .events>li .links,#eventsList .pastEvents .events>li .links{padding-left:0;}#eventsList .futureEvents .events>li .links li,#eventsList .pastEvents .events>li .links li{margin-bottom:0;font-size:1rem;}#eventsList #filters{width:32em;display:block;margin:2em auto 4em;font-weight:500;}#eventsList #filters .icheckbox_flat-yellow{margin-top:-1px;margin-right:0.5em;margin-left:1em;}#eventsList .subline{display:block;text-transform:uppercase;font-weight:500;margin-top:-0.75em;font-size:0.75rem;margin-bottom:0.5em;}#eventsList .twitterCTA{background-color:#f9b233;color:#fff;padding:1.5em 0.75em;border-radius:4px;text-align:center;font-weight:400;}#eventsList .twitterCTA a{font-weight:500;font-size:1.375em;display:block;color:#fff;text-shadow:none;}#eventsList .loader{width:7em;height:7em;background:#f9b233;border-radius:50%;text-align:center;margin:0 auto;color:#fff;font-weight:500;font-size:1.25rem;padding-top:2em;text-transform:uppercase;}@media screen and (max-width: 890px){#content{padding-left:2em;padding-right:2em;}#content .cb{width:100%;}#eventsList{margin:2em;}#eventsList .futureEvents,#eventsList .pastEvents{width:100%;float:none;padding:0;}#eventsList .pastEvents{margin-top:3em;}}@media screen and (max-width: 630px){#eventsList #filters{width:100%;}#eventsList #filters label{display:inline-block;width:45%;margin-bottom:0.25em;}}@media screen and (max-width: 500px){#content{padding-left:1em;padding-right:1em;}#eventsList{margin:0;}}@media screen and (max-width: 380px){#eventsList #filters{width:100%;}#eventsList #filters label{display:block;width:100%;margin-bottom:0.25em;}}@-moz-document url-prefix(){#eventsList .events a{background-position:0 0.9375rem;}}.teaser-index{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.teaser-index .grid-3{width:100% !important;max-width:100% !important;background-color:#fcfcfc;}@media (min-width: 50.3125em){.teaser-index .grid-3{width:32.833333333% !important;max-width:none !important;border-top-left-radius:0.75rem;border-top-right-radius:0.75rem;}}.teaser-index .grid-3:first-child{margin-top:0 !important;margin-right:0 !important;-webkit-order:2;-ms-flex-order:2;order:2;}@media (min-width: 50.3125em){.teaser-index .grid-3:first-child{-webkit-order:1;-ms-flex-order:1;order:1;margin-right:0.75% !important;}}.teaser-index .grid-3:last-child{margin-top:0 !important;-webkit-order:3;-ms-flex-order:3;order:3;}.teaser-index .grid-3 p{margin-bottom:0.9375rem;}.teaser-index .main{margin-right:0 !important;-webkit-order:1;-ms-flex-order:1;order:1;color:#fff;background-color:#e94e1b;border-top-left-radius:0.75rem;border-top-right-radius:0.75rem;}@media (min-width: 50.3125em){.teaser-index .main{-webkit-order:2;-ms-flex-order:2;order:2;margin-right:0.75% !important;}}@media (min-width: 50.3125em){.teaser-index .main{margin-top:-3.125rem !important;}}.teaser-index .main .teaser-index-section{font-weight:400;}.teaser-index-section{padding:0.9375rem 0.375rem;}.index .img-bg{background-size:cover;background-position:0 0;text-shadow:0 0 50px black;font-weight:400;}.index .img-bg p:last-of-type{margin-bottom:0;}.index .icon-calendar{width:2rem;height:2rem;}.index .orange-box{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.index .orange-box h3{margin-bottom:0 !important;}.index section p:last-of-type{margin-bottom:0;}svg path,svg rect{fill:currentColor;}@media (min-width: 50.3125em){.index .content{padding:16.875rem 1rem 0;}}.index .content .row{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem;}.index .content .row.first .main{margin-top:0;background-color:#e94e1b;color:#fff;}.index .content .row.first .main h3{font-size:2.25rem;text-align:center;margin-bottom:0.8125rem;color:#fff;}.index .content .row.first .main p{line-height:1.75rem;}.index .content .row.first .main a{color:#fff;background-image:linear-gradient(to bottom, #ffffff 75%, rgba(255, 255, 255, 0.8) 75%);}.index .content .row.white div{background-color:#fff;}.index .content .row div{min-height:2.5rem;background-color:#fcfcfc;padding:0.5625rem 0.5rem;}.index .content .row div section{padding:0.9375rem 0.375rem;}.index .content .row div section h3{margin-bottom:0.5625rem;text-transform:uppercase;}.index .content .row div.newsletter{padding:0 0.4375rem;}.index .content .row div input{border:0 none;color:#404040;font-size:1.6em;width:100%;height:2.5rem;}.index .content .row div input:focus{outline:none;}.index .content .row.last div{-webkit-border-bottom-right-radius:0.75rem;-webkit-border-bottom-left-radius:0.75rem;-moz-border-radius-bottomright:0.75rem;-moz-border-radius-bottomleft:0.75rem;border-bottom-right-radius:0.75rem;border-bottom-left-radius:0.75rem;}.index .content .row .img-bg h3,.index .content .row .img-bg p{color:#fff;}.index .content .row .img-bg h3{color:#e94e1b;}.index .content .row .img-bg a{font-weight:400;}.index .content .row .merch{background-image:url('../content_img/index/index_merch.jpg');}.index .content .row .feature{background-image:url('../content_img/index/index1.jpg');}.index .content .row .contribute{background-image:url('../content_img/index/contribute2.jpg');}.index .content .row .newsletter{border:1px solid #ebebeb;}.index .content .row .placeholder{background:#fff url('../content_img/index/placeholder.jpg') 60% 50% no-repeat;}.index .content .row .orange-box{background-color:#e94e1b !important;color:#fff;text-align:center;}.index .content .row .orange-box h3{color:#fff;}.index .content .row .orange-box a{color:#fff;display:block;}.index .content .row .orange-box img{margin:0.875rem 0 0.3125rem -0.9375rem;}.index .content .row .center{text-align:center;margin-left:-0.875rem;}.index .content .row .grid-3{max-width:none;width:100%;}@media (min-width: 43.5em){.index .content .row .grid-3{width:32.833333333%;margin-right:0.75%;}}.index .content .row .grid-3:nth-child(3n){margin-right:0;}.index .content .row .grid-6{max-width:none;margin-right:0;width:100%;}@media (min-width: 43.5em){.index .content .row .grid-6{width:66.416666666%;}}.index .content .row .grid-9{width:100%;max-width:none;margin-right:0;}.index .content .row .m-l{margin-right:0;margin-left:0;}@media (min-width: 43.5em){.index .content .row .m-l{margin-left:0.75%;}}.index .content #mc-embedded-subscribe{display:none;}.index .content #logo-animation{position:absolute;top:8.75rem;width:51.875rem;text-align:center;}.index .content #logo-animation.animate .letter{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}.index .content #logo-animation .letter{opacity:0;-webkit-transform:scale(0.1);-ms-transform:scale(0.1);transform:scale(0.1);-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center;transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);}.index .content #logo-animation .letter:nth-child(2){transition-delay:0.1s;}.index .content #logo-animation .letter:nth-child(3){transition-delay:0.2s;}.index .content #logo-animation .letter:nth-child(4){transition-delay:0.3s;}.index .content #logo-animation .letter:nth-child(5){transition-delay:0.4s;}.index .content #logo-animation .letter:nth-child(6){transition-delay:0.4s;}@-webkit-keyframes kaboom{0%{opacity:0;-webkit-transform:scale(0.1);transform:scale(0.1);}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1);}}@keyframes kaboom{0%{opacity:0;-webkit-transform:scale(0.1);transform:scale(0.1);}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1);}}header a,footer a{text-shadow:none !important;}@-moz-document url-prefix(){header a{background-position:0 23px;}}.nav{padding:1.0625rem 1.25rem;display:-webkit-flex;display:-ms-flexbox;display:flex;transition:height 0.2s;}.nav.is-active{position:fixed;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100vh;text-align:center;font-size:4vh;z-index:100;}.nav.is-active .main-nav{width:50%;margin-top:4vmin;margin-bottom:5vmin;}.nav.is-active .main-nav>a{margin-right:0;display:block;}@media (max-height: 26.667em){.nav.is-active .main-nav{width:80%;padding-right:1em;}.nav.is-active .main-nav a{display:inline-block;padding-left:1em;}}.nav.is-active .meta-nav{text-align:center;}.nav.is-active+.hid .sub-nav{top:auto;bottom:0;padding:0.5rem 0.625rem 0.3125rem 0.625rem;z-index:101;}.nav.is-active .active{background-position:0 6.1vh;}.nav .active{font-weight:500;}.logo{margin-right:0 !important;display:block;transition:all 0.2s;}.is-active .logo{padding-top:3vh;width:50%;margin:0 auto;margin-left:25%;}.logo img{border:0;}.main-nav{width:auto;padding-top:0.1875rem;display:none;}.is-active .main-nav{display:block;}@media (min-width: 64em){.main-nav{display:block;}}.meta-nav{padding:0;margin:0;display:none;}.is-active .meta-nav{display:inline-block;}@media (min-width: 64em){.meta-nav{display:inline-block;}}.meta-nav-list-item{padding-top:0.1875rem;}.sub-nav{display:none;}.is-active+.hid .sub-nav{display:block;}@media (min-width: 64em){.sub-nav{display:block;}}.sub-nav a{background-image:none;}.meta-nav a,.main-nav a,.sub-nav a{font-weight:300;}.menu-button{display:block;height:2.1875rem;width:2.1875rem;text-align:center;z-index:102;position:relative;margin-left:auto;transition:all 0.2s;top:-0.25rem;}.is-active .menu-button{display:block;top:-82.6vh;}@media (min-width: 64em){.menu-button{display:none;}}.menu-button-span,.menu-button-span:before,.menu-button-span:after{width:2.1875rem;background-color:#fff;height:0.3125rem;display:inline-block;border-radius:3px;}.menu-button-span:before,.menu-button-span:after{content:"";position:absolute;left:0;transition:all 0.2s;}.menu-button-span{top:-0.3125rem;position:relative;transition:all 0.2s;}.menu-button-span:before{top:1.25rem;}.menu-button-span:after{top:0.625rem;}.is-active .menu-button{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);top:1rem;position:absolute;right:1.25rem;}.is-active .menu-button-span:after{opacity:0;}.is-active .menu-button-span:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);top:0;}body.orange .animation.colorise .letter{stroke:#e94e1b;}body.blue .animation.colorise .letter{stroke:#273183;}body.green .animation.colorise .letter{stroke:#0b8e36;}body.yellow .animation.colorise .letter{stroke:#f9b233;}body.lilac .animation.colorise .letter{stroke:#520644;}body.gray .animation.colorise .letter{stroke:#282828;}.animated-logo{text-align:center;margin-top:6.375rem;position:absolute;background:#fff;width:100%;overflow:hidden;}.animated-logo .animation{transition:margin-top 0.5s,stroke 0.5s;margin:1.25em 0 1em;}.animated-logo .animation svg{width:90%;}.animated-logo .animation.slideUp{margin-top:-8.75em;}.animated-logo .animation.animate .letter{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}.animated-logo .animation .letter{opacity:0;-webkit-transform:scale(0.1);-ms-transform:scale(0.1);transform:scale(0.1);-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center;transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);}.animated-logo .animation .letter:nth-child(2){transition-delay:0.1s;}.animated-logo .animation .letter:nth-child(3){transition-delay:0.2s;}.animated-logo .animation .letter:nth-child(4){transition-delay:0.3s;}.animated-logo .animation .letter:nth-child(5){transition-delay:0.4s;}.animated-logo .animation .letter:nth-child(6){transition-delay:0.4s;}.content{transition:background-position 1s,margin-top 0.5s;}.content.during-intro{margin-top:3rem;background-position:center -6.25rem;}.is-active .logo img{width:180px !important;}.is-fixed{position:fixed !important;bottom:0;z-index:400;}.mobile header{height:65px;}.mobile header.during-intro{height:200px;}.mobile header.detached{height:65px;}.mobile header.detached.is-active{height:100%;}.mobile header.is-active{height:100%;}.mobile header a{background-image:none;}.mobile header .main-nav{opacity:0;transition:opacity 0.5s;}.mobile header .is-active .main-nav{opacity:1;}.mobile header .animated-logo{margin-top:4.375rem;}.mobile header .animated-logo .animation{margin:0.75em auto 0.25em;width:80%;}.mobile header .animated-logo .animation.slideUp{margin-top:-8.75em;}.no_scroll{overflow:hidden;height:100%;}header{position:absolute;top:0;width:100%;height:102px;right:0;z-index:1000;cursor:pointer;overflow:hidden;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0);transition:-webkit-transform 0.4s,height 0.3s,background 0.4s;transition:transform 0.4s,height 0.3s,background 0.4s;}header.during-intro{height:245px;}.invisible{-webkit-transform:translate(0, -64px);-ms-transform:translate(0, -64px);transform:translate(0, -64px);transition:-webkit-transform 0.2s;transition:transform 0.2s;opacity:0;}.detached{position:fixed;transition:-webkit-transform 0.3s,height 0.3s,background 0.4s,opacity 0.3s;transition:transform 0.3s,height 0.3s,background 0.4s,opacity 0.3s;}.expanded{width:100%;height:100%;position:fixed;cursor:default;}.expanded .menu-button-span:before{content:'x';font-size:1.4em;line-height:1.4em;padding-right:0.15em;}.menu-button-span:focus{outline:none;} 2 | #api_nav ul {list-style: none;} #api_nav li:nth-child(1) {font-weight:700;} #api_nav ul li a {text-decoration: none;} 3 | -------------------------------------------------------------------------------- /app/images/font/FiraMono-Regular.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | connect-fonts-firamono/firamono-regular.svg at master · shane-tomlinson/connect-fonts-firamono 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | Skip to content 69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 179 | 180 | 181 | 182 | 183 | 184 | 185 |
186 |
187 |
188 | 189 |
190 |
191 |
192 | 193 |
    194 | 195 |
  • 196 |
    197 | 198 |
    199 | 202 | 204 | 205 | 206 | Watch 207 | 208 | 209 | 210 |
    211 | 261 |
    262 |
    263 | 264 |
    265 |
  • 266 | 267 |
  • 268 | 269 |
    270 | 271 |
    272 | 278 | 281 |
    282 |
    283 | 289 | 292 |
    293 | 294 |
  • 295 | 296 | 297 |
  • 298 | 299 | 300 | Fork 301 | 302 | 303 |
  • 304 | 305 |
306 | 307 |

308 | 309 | /connect-fonts-firamono 312 | 313 | 314 | 315 | 316 | 317 |

318 |
319 |
320 | 321 |
322 |
323 |
324 | 325 | 375 | 376 |
377 | 378 | 379 |
382 |

HTTPS clone URL

383 |
384 | 386 | 387 | 388 | 389 |
390 |
391 | 392 | 393 |
396 |

SSH clone URL

397 |
398 | 400 | 401 | 402 | 403 |
404 |
405 | 406 | 407 |
410 |

Subversion checkout URL

411 |
412 | 414 | 415 | 416 | 417 |
418 |
419 | 420 | 421 | 422 |

You can clone with 423 | HTTPS, SSH, or Subversion. 424 | 425 | 426 | 427 |

428 | 429 | 430 | 431 | Clone in Desktop 432 | 433 | 434 | 435 | 440 | 441 | Download ZIP 442 | 443 |
444 |
445 | 446 |
447 | 448 | 449 | 450 | 451 | 452 | 453 |
454 | 455 |
456 | 461 | 462 | branch: 463 | master 464 | 465 | 466 | 529 |
530 | 531 |
532 | 537 | 538 | 539 | 540 |
541 | 542 | 545 |
546 | 547 | 548 |
549 |
550 | Shane Tomlinson 551 | 552 | 553 | 556 |
557 | 558 |
559 |

560 | 561 | 1 562 | contributor 563 | 564 |

565 | 566 |
567 | 576 |
577 | 578 |
579 |
580 |
581 |
582 | 142 lines (141 sloc) 583 | 584 | 19.585 kb 585 |
586 |
587 |
588 | 591 | 594 |
595 |
596 | Raw 597 | Blame 598 | History 599 |
600 | 601 | 606 | 607 | 608 | 609 | 613 | 614 | 618 | 619 | 620 |
621 |
622 | 623 | 624 |
625 | 626 |
627 |
632 | 633 |
Sorry, something went wrong. Reload?
634 |
Sorry, we cannot display this file.
635 |
Sorry, this file is invalid so it cannot be displayed.
636 | 637 |
638 |
639 | 640 |
641 | 642 |
643 |
644 | 645 | Jump to Line 646 | 652 | 653 |
654 | 655 |
656 | 657 |
658 |
659 | 660 | 661 |
662 | 663 |
664 | 687 |
688 | 689 | 690 |
691 |
692 |
693 | 694 |
695 |
696 |
697 |
698 |
699 | 708 |
709 | 710 | 711 | 712 |
713 | 714 | 715 | Something went wrong with that request. Please try again. 716 |
717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | --------------------------------------------------------------------------------