├── .editorconfig
├── .eslintrc
├── .gitignore
├── .jscsrc
├── .travis.yml
├── LICENSE
├── README.md
├── gulpfile.babel.js
├── html
└── options.html
├── img
└── edit.png
├── manifest.json
├── package.json
├── readme-images
├── auto-fill-config.png
├── chrome-extensions-page.png
├── enable-developer-mode.png
├── git-splainin-access-options.png
├── git-splainin-extensions-listing.png
├── icon-on-url-field.png
├── icon-options.png
├── load-template-url.png
├── load-unpacked-extension.png
├── options-page.png
├── select-application-directory.png
├── set-options.png
├── use-git-splainin.png
└── verify-application-directory.png
├── src
├── actions
│ ├── config.js
│ ├── edit-template.js
│ └── sync-template.js
├── alt.js
├── background.js
├── components
│ ├── config-tab.js
│ ├── layout.js
│ └── template-tab.js
├── fill-pull-body.js
├── lib
│ ├── client.js
│ ├── get-content.js
│ └── get-error-message.js
├── options.js
├── primed
│ ├── README.md
│ ├── button.js
│ ├── checkbox.js
│ ├── menu-item.js
│ └── menu.js
└── stores
│ ├── config.js
│ └── template.js
├── style
└── options.css
├── vendor
├── octicons
│ ├── LICENSE.txt
│ ├── octicons.css
│ ├── octicons.eot
│ ├── octicons.svg
│ ├── octicons.ttf
│ ├── octicons.woff
│ ├── pr128.png
│ ├── pr19.png
│ ├── pr38.png
│ └── pr48.png
└── primer
│ ├── license.md
│ └── primer.css
└── webpack.config.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "ecmaFeatures": {
3 | "jsx": true
4 | },
5 | "rules": {
6 | "semi": [2, "always"],
7 | "quotes": [2, "single"],
8 | "strict": [2, "global"],
9 | "no-underscore-dangle": 0
10 | },
11 | "env": {
12 | "es6": true,
13 | "browser": true,
14 | "node": true
15 | },
16 | "globals": {
17 | "chrome": true
18 | },
19 | "plugins": [
20 | "react"
21 | ]
22 | }
23 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Directory for instrumented libs generated by jscoverage/JSCover
11 | lib-cov
12 |
13 | # Coverage directory used by tools like istanbul
14 | coverage
15 |
16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17 | .grunt
18 |
19 | # Compiled binary addons (http://nodejs.org/api/addons.html)
20 | build/Release
21 |
22 | # Dependency directory
23 | # Commenting this out is preferred by some people, see
24 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
25 | node_modules
26 |
27 | # Users Environment Variables
28 | .lock-wscript
29 |
30 | # Garbage files
31 | .DS_Store
32 |
33 | # Built files
34 | /background.js
35 | /options.js
36 | /fill-pull-body.js
37 | /dist
38 |
--------------------------------------------------------------------------------
/.jscsrc:
--------------------------------------------------------------------------------
1 | {
2 | "preset": "node-style-guide",
3 | "esnext": true,
4 | "esprima": "esprima-fb",
5 | "disallowSpaceAfterKeywords": [
6 | "if",
7 | "for",
8 | "while"
9 | ],
10 | "disallowSpacesInFunction": {
11 | "beforeOpeningCurlyBrace": true,
12 | "beforeOpeningRoundBrace": true
13 | },
14 | "maximumLineLength": null,
15 | "requireSpaceAfterKeywords": [
16 | "else",
17 | "try",
18 | "catch",
19 | "do",
20 | "switch"
21 | ],
22 | "requireSpaceBeforeBlockStatements": null,
23 | "requireSpaceBeforeKeywords": [
24 | "else",
25 | "catch"
26 | ],
27 | "requireSpacesInFunction": null,
28 | "requireTrailingComma": null
29 | }
30 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: false
2 | language: node_js
3 | node_js:
4 | - 'iojs'
5 | - '0.12'
6 | - '0.10'
7 | # whenever a tag is pushed, build and push to github releases
8 | before_deploy: npm run release
9 | deploy:
10 | provider: releases
11 | api_key: $GH_TOKEN
12 | file: "dist/git-splainin.zip"
13 | skip_cleanup: true
14 | on:
15 | tags: true
16 | node: '0.10'
17 | all_branches: true
18 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Iced Development
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # git-splainin
2 | GitHub PR Template Chrome Extension
3 |
4 | It's time to crush the boilerplate text of Github PR templates. This chrome plugin makes it super easy to get your PRs off to a good start. All you'll need is your PR template text or a link to the PR template your team uses, and then... you need to install this extension. And like that you will become Lord of Github PR Maesters.
5 |
6 | Let's Begin.
7 |
8 | ###Download Options:
9 | 1. The **easy-peasy option** is to get the latest published version from the Chrome webstore, [go here](https://chrome.google.com/webstore/detail/git-splainin/adbhpaolgdpdjmejdnpakfncfkdneeea). After installing you will come back here to learn how to [use it right](#use-it-right).
10 | 1. The **quite easy option** is to get the latest release from the project Github repo, [go here](https://github.com/iceddev/git-splainin/releases/latest) for that. You also can get access to prior versions [here](https://github.com/iceddev/git-splainin/releases). Again, after installing you will come back to [install it good](#install-it-good) and [use it right](#use-it-right).
11 | 1. Choose the **advanced developer option** to develop and [build from source](#build-from-source). The following instructions assume you have git, node.js and npm. If you don't have these, you have to [get the tools](#get-tools-if-you-need-them) and do a little set-up:
12 |
13 |
14 | ###Get tools if you need them
15 | * [I need git](http://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
16 | * [I need node.js and npm](https://nodejs.org/download/)
17 |
18 |
19 | ###Build from Source
20 | 1. **Get the Source:** Go to your terminal, navigate to the directory where you want to keep the files. From within this directory enter:
21 |
22 | `git clone git://github.com/iceddev/git-splainin.git`
23 |
24 | 1. **Get into the Project:** Go into the directory and get packages with:
25 |
26 | `cd git-splainin && npm install`
27 |
28 | 1. **Build the Application:** Compile all the source and packages into an application you can install from Chrome. In terminal enter:
29 |
30 | `npm run build`
31 |
32 | OR
33 |
34 | _`npm run serve` -- if you are developing and want a dev server to update automatically with file changes._
35 |
36 | 1. Feel awesome, the hard part is done. Now to install in Chrome.
37 |
38 |
39 | ###Install it good:
40 | 1. Verify the application is now unpacked in a known directory.
41 |
42 | 
43 |
44 | 1. In Chrome, go to the menu --> More Tools --> Extensions
45 |
46 | 
47 |
48 | 1. Enable 'Developer Mode'
49 |
50 | 
51 |
52 | 1. Select "Load Unpacked Extension" and select the folder
53 |
54 | 
55 |
56 | 1. Select application directory
57 |
58 | 
59 |
60 | 1. Enjoy! You should have confirmation in two places.
61 |
62 | * When you look in the extension listing
63 |
64 | 
65 |
66 | * When you go to a Github 'New Pull Request' page. You should see an icon in the url bar.
67 |
68 | 
69 |
70 | Your life is about to get incrementally easier. There are a couple options you need to set and you will be well on your way.
71 |
72 |
73 | ###Use it right:
74 | 1. **Get to the Options page:**
75 |
76 | * From the extensions listing view
77 |
78 | 
79 |
80 | -- Or --
81 |
82 | * by right-clicking on the icon in the url bar
83 |
84 | 
85 |
86 | 1. **The Options Page:** Simple, no-frills configuration. You can either manually enter the template text or point to a source.
87 |
88 | 
89 |
90 | 1. **To Point to the Template:** We need to point to the application to the PR template you want to use. You will need to point to HTML, Markdown, or plain text. Github allows you to pull the raw content from the a url, click load and then save, as in the example.
91 |
92 | 
93 |
94 | 1. **Use it:** When you go a Github New PR Form, you can simply click on the icon and it will inject your template into the form. Voila! Edit the field as needed and 'Create Pull Request'.
95 |
96 | 
97 |
98 | ###Extra Option:
99 | 1. **Auto-Fill:** You can easily auto-fill anytime you find yourself on a New PR Form. To do that, go to the options page as outlined in [use it right](#use-it-right). Then click on the 'configuration' tab as shown.
100 |
101 | 
102 |
103 |
104 |
--------------------------------------------------------------------------------
/gulpfile.babel.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const del = require('del');
4 | const gulp = require('gulp');
5 | const zip = require('gulp-zip');
6 | const jscs = require('gulp-jscs');
7 | const gutil = require('gulp-util');
8 | const webpack = require('webpack');
9 | const eslint = require('gulp-eslint');
10 |
11 | const webpackConfig = require('./webpack.config');
12 |
13 | const files = {
14 | release: [
15 | 'manifest.json',
16 | 'options.js',
17 | 'fill-pull-body.js',
18 | 'background.js',
19 | 'html/**',
20 | 'img/**',
21 | 'style/**',
22 | 'vendor/**'
23 | ]
24 | };
25 |
26 | function bundle(callback){
27 | webpack(webpackConfig, function(err){
28 | gutil.log('Webpack bundle complete!');
29 | callback(err);
30 | });
31 | }
32 |
33 | function lint(){
34 | return gulp.src('src/**/*.js')
35 | .pipe(eslint())
36 | .pipe(eslint.format())
37 | .pipe(jscs())
38 | .pipe(eslint.failAfterError());
39 | }
40 |
41 | function postinstall(callback){
42 | del('node_modules/**/*.pem', callback);
43 | }
44 |
45 | function release(){
46 | return gulp.src(files.release, { base: __dirname })
47 | .pipe(zip('git-splainin.zip'))
48 | .pipe(gulp.dest('dist'));
49 | }
50 |
51 | gulp.task(lint);
52 | gulp.task(postinstall);
53 | gulp.task('release', gulp.series(bundle, release));
54 | gulp.task('default', gulp.parallel(bundle));
55 |
56 |
--------------------------------------------------------------------------------
/html/options.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Options
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/img/edit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/img/edit.png
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "manifest_version": 2,
3 |
4 | "name": "Git-Splainin",
5 | "description": "You've got some git-splainin' to do",
6 | "version": "1.0.0",
7 | "background": {
8 | "scripts": ["background.js"]
9 | },
10 | "icons": {
11 | "48": "vendor/octicons/pr48.png",
12 | "128": "vendor/octicons/pr128.png"
13 | },
14 | "page_action": {
15 | "default_icon": {
16 | "19": "vendor/octicons/pr19.png",
17 | "38": "vendor/octicons/pr38.png"
18 | },
19 | "default_title": "git-splainin: Git PR template"
20 | },
21 | "options_ui": {
22 | "page": "html/options.html",
23 | "chrome_style": false,
24 | "open_in_tab": true
25 | },
26 | "permissions": [
27 | "http://*/",
28 | "https://*/",
29 | "tabs",
30 | "storage"
31 | ],
32 | "content_scripts": [
33 | {
34 | "matches": ["https://github.com/*"],
35 | "js": ["fill-pull-body.js"],
36 | "run_at": "document_end"
37 | }
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "git-splainin",
3 | "version": "1.0.0",
4 | "description": "GitHub PR Template Chrome Extension",
5 | "author": "Blaine Bublitz (http://iceddev.com)",
6 | "contributors": [],
7 | "repository": "iceddev/git-splainin",
8 | "license": "MIT",
9 | "engines": {
10 | "node": ">= 0.10"
11 | },
12 | "main": "index.js",
13 | "files": [
14 | "LICENSE",
15 | "index.js"
16 | ],
17 | "scripts": {
18 | "test": "gulp lint",
19 | "build": "gulp",
20 | "postinstall": "gulp postinstall",
21 | "release": "gulp release",
22 | "serve": "webpack-dev-server",
23 | "watch": "gulp --watch"
24 | },
25 | "dependencies": {
26 | "alt": "^0.16.6",
27 | "chromeback": "^0.1.0",
28 | "classnames": "^2.1.1",
29 | "react": "^0.13.3",
30 | "lodash": "^3.8.0",
31 | "rest": "^1.3.1",
32 | "sovereign": "^0.1.1"
33 | },
34 | "devDependencies": {
35 | "babel": "^5.5.4",
36 | "babel-core": "^5.3.3",
37 | "babel-loader": "^5.0.0",
38 | "del": "^1.2.0",
39 | "eslint": "^0.21.2",
40 | "eslint-plugin-react": "^2.3.0",
41 | "esprima-fb": "^15001.1.0-dev-harmony-fb",
42 | "gulp": "git://github.com/gulpjs/gulp#4.0",
43 | "gulp-eslint": "^0.12.0",
44 | "gulp-jscs": "^1.6.0",
45 | "gulp-util": "^3.0.4",
46 | "gulp-zip": "^3.0.2",
47 | "webpack": "^1.9.5",
48 | "webpack-dev-server": "^1.8.2",
49 | "when": "^3.7.3"
50 | },
51 | "keywords": [
52 | "chrome extension",
53 | "github",
54 | "pull request",
55 | "template"
56 | ]
57 | }
58 |
--------------------------------------------------------------------------------
/readme-images/auto-fill-config.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/auto-fill-config.png
--------------------------------------------------------------------------------
/readme-images/chrome-extensions-page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/chrome-extensions-page.png
--------------------------------------------------------------------------------
/readme-images/enable-developer-mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/enable-developer-mode.png
--------------------------------------------------------------------------------
/readme-images/git-splainin-access-options.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/git-splainin-access-options.png
--------------------------------------------------------------------------------
/readme-images/git-splainin-extensions-listing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/git-splainin-extensions-listing.png
--------------------------------------------------------------------------------
/readme-images/icon-on-url-field.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/icon-on-url-field.png
--------------------------------------------------------------------------------
/readme-images/icon-options.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/icon-options.png
--------------------------------------------------------------------------------
/readme-images/load-template-url.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/load-template-url.png
--------------------------------------------------------------------------------
/readme-images/load-unpacked-extension.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/load-unpacked-extension.png
--------------------------------------------------------------------------------
/readme-images/options-page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/options-page.png
--------------------------------------------------------------------------------
/readme-images/select-application-directory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/select-application-directory.png
--------------------------------------------------------------------------------
/readme-images/set-options.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/set-options.png
--------------------------------------------------------------------------------
/readme-images/use-git-splainin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/use-git-splainin.png
--------------------------------------------------------------------------------
/readme-images/verify-application-directory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/readme-images/verify-application-directory.png
--------------------------------------------------------------------------------
/src/actions/config.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const alt = require('../alt');
4 |
5 | class ConfigActions {
6 | setConfig(settings){
7 | this.dispatch(settings);
8 | }
9 | }
10 |
11 | module.exports = alt.createActions(ConfigActions);
12 |
--------------------------------------------------------------------------------
/src/actions/edit-template.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const alt = require('../alt');
4 |
5 | class EditTemplateActions {
6 | cancelChanges(){
7 | this.dispatch();
8 | }
9 |
10 | setDeltaTemplate(newTemplate){
11 | this.dispatch(newTemplate);
12 | }
13 |
14 | setDeltaUrl(newUrl){
15 | this.dispatch(newUrl);
16 | }
17 | }
18 |
19 | module.exports = alt.createActions(EditTemplateActions);
20 |
--------------------------------------------------------------------------------
/src/actions/sync-template.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const alt = require('../alt');
4 |
5 | class SyncTemplateActions {
6 | fetchNewTemplate(settings){
7 | this.dispatch(settings);
8 | }
9 |
10 | submitTemplate(){
11 | this.dispatch();
12 | }
13 | }
14 |
15 | module.exports = alt.createActions(SyncTemplateActions);
16 |
--------------------------------------------------------------------------------
/src/alt.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const Alt = require('alt');
4 | const alt = new Alt();
5 |
6 | module.exports = alt;
7 |
--------------------------------------------------------------------------------
/src/background.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const getContent = require('./lib/get-content');
4 |
5 | chrome.storage.sync.get(['templateUrl', 'prTemplate', 'autoFill'], function({templateUrl, prTemplate, autoFill}){
6 | if(!prTemplate){
7 | if(!templateUrl){
8 | chrome.storage.sync.set({
9 | templateUrl: 'http://cdn.rawgit.com/iceddev/getting-started/master/pr-template.md'
10 | }, getContent);
11 | } else {
12 | getContent();
13 | }
14 | }
15 | if(autoFill === undefined){
16 | chrome.storage.sync.set({ autoFill: false });
17 | }
18 | });
19 |
20 | chrome.pageAction.onClicked.addListener(function(){
21 | chrome.tabs.query({ active: true, currentWindow: true }, function(tabs){
22 | chrome.tabs.sendMessage(tabs[0].id, { fillPR: true });
23 | });
24 | });
25 |
26 | chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){
27 | const regexUrl = /https:\/\/github\.com\/.*\/.*\/compare\/..*/;
28 | if(regexUrl.test(tab.url)){
29 | chrome.pageAction.show(tabId);
30 | chrome.storage.sync.get('autoFill', function(res){
31 | if(res.autoFill){
32 | chrome.tabs.sendMessage(tabId, { autoFill: true });
33 | }
34 | });
35 | } else {
36 | chrome.pageAction.hide(tabId);
37 | }
38 | });
39 |
--------------------------------------------------------------------------------
/src/components/config-tab.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const React = require('react');
4 | const { createContainer } = require('sovereign');
5 |
6 | const Checkbox = require('../primed/checkbox');
7 | const configStore = require('../stores/config');
8 | const { setConfig } = require('../actions/config');
9 |
10 | class ConfigTab extends React.Component {
11 | constructor(...args){
12 | super(...args);
13 | }
14 | config(event){
15 | setConfig(event.target.checked);
16 | }
17 | renderError(){
18 | const { errorMessage } = this.props;
19 |
20 | if(errorMessage){
21 | return (
22 |
23 | {errorMessage}
24 |
25 | );
26 | }
27 | }
28 | render(){
29 | const { autoFill } = this.props;
30 |
31 | const note = (
32 | This will cause every Pull Request to be populated automatically.
33 | );
34 |
35 | return (
36 |
37 | {this.renderError()}
38 |
39 |
40 | Auto-fill:
41 |
42 |
43 |
44 | Enable auto-fill
45 |
46 |
47 |
48 |
49 | );
50 | }
51 | }
52 |
53 | module.exports = createContainer(ConfigTab, {
54 | getStores(){
55 | return {
56 | config: configStore
57 | };
58 | },
59 |
60 | getPropsFromStores(){
61 | return configStore.getState();
62 | }
63 | });
64 |
--------------------------------------------------------------------------------
/src/components/layout.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const React = require('react');
4 |
5 | const ConfigTab = require('./config-tab');
6 | const TemplateTab = require('./template-tab');
7 |
8 | const Menu = require('../primed/menu');
9 | const MenuItem = require('../primed/menu-item');
10 |
11 | class Layout extends React.Component {
12 | constructor(...args){
13 | super(...args);
14 |
15 | this.state = {
16 | tab: 0
17 | };
18 | }
19 |
20 | updateTab(idx, evt){
21 | evt.preventDefault();
22 |
23 | this.setState({
24 | tab: idx
25 | });
26 | }
27 |
28 | render(){
29 | const { tab } = this.state;
30 |
31 | let TabComponent;
32 | if(tab === 0){
33 | TabComponent = TemplateTab;
34 | }
35 |
36 | if(tab === 1){
37 | TabComponent = ConfigTab;
38 | }
39 |
40 | return (
41 |
42 | Git-Splainin Options
43 |
44 |
45 |
46 | this.updateTab(0, evt)}>
47 |
48 | Template
49 |
50 | this.updateTab(1, evt)}>
51 |
52 | Configuration
53 |
54 |
55 |
56 |
57 |
58 |
59 | );
60 | }
61 | }
62 |
63 | module.exports = Layout;
64 |
--------------------------------------------------------------------------------
/src/components/template-tab.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const React = require('react');
4 | const { createContainer } = require('sovereign');
5 |
6 | const Button = require('../primed/button');
7 | const templateStore = require('../stores/template');
8 | const { fetchNewTemplate, submitTemplate } = require('../actions/sync-template');
9 | const { cancelChanges, setDeltaUrl, setDeltaTemplate } = require('../actions/edit-template');
10 |
11 | class TemplateTab extends React.Component {
12 | constructor(...args){
13 | super(...args);
14 | }
15 | renderError(){
16 | const { errorMessage } = this.props;
17 |
18 | if(errorMessage){
19 | return (
20 |
21 | {errorMessage}
22 |
23 | );
24 | }
25 | }
26 | templateChange(event){
27 | setDeltaTemplate(event.target.value);
28 | }
29 | urlChange(event){
30 | setDeltaUrl(event.target.value);
31 | }
32 | render(){
33 | const { deltaUrl, deltaTemplate, disableSubmit, disableCancel } = this.props;
34 |
35 | return (
36 |
37 | {this.renderError()}
38 |
39 |
40 | Template:
41 |
42 |
43 |
45 |
46 |
47 |
48 | Template URL:
49 |
50 |
51 |
52 |
53 |
54 |
55 | Load
56 |
57 |
58 |
59 |
60 |
61 |
62 | Save Changes
63 | Cancel
64 |
65 |
66 | );
67 | }
68 | }
69 |
70 | module.exports = createContainer(TemplateTab, {
71 | getStores(){
72 | return {
73 | template: templateStore
74 | };
75 | },
76 |
77 | getPropsFromStores(){
78 | return templateStore.getState();
79 | }
80 | });
81 |
--------------------------------------------------------------------------------
/src/fill-pull-body.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | chrome.runtime.onMessage.addListener(function(request){
4 | const prBodyElement = document.getElementById('pull_request_body');
5 | if(prBodyElement){
6 | chrome.storage.sync.get('prTemplate', function({ prTemplate }){
7 | if(request.fillPR){
8 | if(!prBodyElement.value.includes(prTemplate)){
9 | if(prBodyElement.value){
10 | prBodyElement.value += '\n';
11 | }
12 | prBodyElement.value = prBodyElement.value + prTemplate;
13 | } else {
14 | prBodyElement.value = prBodyElement.value.replace(prTemplate, '');
15 | }
16 | }
17 | if(request.autoFill){
18 | if(!prBodyElement.value){
19 | prBodyElement.value = prTemplate;
20 | }
21 | }
22 | if(request.replaceTemplate){
23 | prBodyElement.value = prBodyElement.value.replace(request.replaceTemplate, prTemplate);
24 | }
25 | });
26 | }
27 | });
28 |
--------------------------------------------------------------------------------
/src/lib/client.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var rest = require('rest');
4 | var errorCode = require('rest/interceptor/errorCode');
5 |
6 | var client = rest
7 | .wrap(errorCode);
8 |
9 | module.exports = client;
10 |
--------------------------------------------------------------------------------
/src/lib/get-content.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const client = require('./client');
4 |
5 | function getContent(){
6 | chrome.storage.sync.get('templateUrl', function(res){
7 | return client(res.templateUrl)
8 | .then(function(response){
9 | chrome.storage.sync.set({ prTemplate: response.entity });
10 | });
11 | });
12 | }
13 |
14 | module.exports = getContent;
15 |
--------------------------------------------------------------------------------
/src/lib/get-error-message.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | function getErrorMessage(err){
4 | if(err.status && err.status.text){
5 | return err.status.text;
6 | }
7 |
8 | if(err.error){
9 | return err.error;
10 | }
11 |
12 | if(err.target && err.target.error){
13 | return err.target.error;
14 | }
15 |
16 | if(err.message){
17 | return err.message;
18 | }
19 |
20 | if(err.name){
21 | return err.name;
22 | }
23 |
24 | if(err.code){
25 | return 'Chrome error code ' + err.code;
26 | }
27 |
28 | return err.toString();
29 | }
30 |
31 | module.exports = getErrorMessage;
32 |
--------------------------------------------------------------------------------
/src/options.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const React = require('react');
4 |
5 | const Layout = require('./components/layout');
6 |
7 | React.render( , document.getElementById('list'));
8 |
--------------------------------------------------------------------------------
/src/primed/README.md:
--------------------------------------------------------------------------------
1 | # Primed
2 |
3 | Testbed for React component library based on Prime CSS toolkit.
4 |
--------------------------------------------------------------------------------
/src/primed/button.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const React = require('react');
4 | const classnames = require('classnames');
5 |
6 | class Button extends React.Component {
7 |
8 | render(){
9 | const {
10 | className,
11 | href,
12 | small,
13 | primary,
14 | danger,
15 | outline,
16 | disabled,
17 | block,
18 | children
19 | } = this.props;
20 |
21 | const classes = classnames(className, {
22 | btn: true,
23 | 'btn-sm': small,
24 | 'btn-primary': primary,
25 | 'btn-danger': danger,
26 | 'btn-outline': outline,
27 | disabled: (href && disabled),
28 | 'btn-block': block
29 | });
30 |
31 | if(href){
32 | return (
33 | {children}
34 | );
35 | } else {
36 | return (
37 | {children}
38 | );
39 | }
40 | }
41 | }
42 |
43 | module.exports = Button;
44 |
--------------------------------------------------------------------------------
/src/primed/checkbox.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const _ = require('lodash');
4 | const React = require('react');
5 |
6 | class Checkbox extends React.Component {
7 |
8 | renderNote(){
9 | const { note } = this.props;
10 |
11 | if(note){
12 | return (
13 |
14 | {note}
15 |
16 | );
17 | }
18 | }
19 |
20 | render(){
21 | const { children } = this.props;
22 |
23 | const extraProps = _.omit(this.props, ['note', 'children']);
24 |
25 | return (
26 |
27 |
28 |
29 | {children}
30 |
31 | {this.renderNote()}
32 |
33 | );
34 | }
35 | }
36 |
37 | module.exports = Checkbox;
38 |
--------------------------------------------------------------------------------
/src/primed/menu-item.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const React = require('react');
4 | const classnames = require('classnames');
5 |
6 | class MenuItem extends React.Component {
7 |
8 | render(){
9 | const {
10 | className,
11 | href,
12 | selected,
13 | children
14 | } = this.props;
15 |
16 | const classes = classnames(className, {
17 | 'menu-item': true,
18 | selected: selected
19 | });
20 |
21 | return (
22 | {children}
23 | );
24 | }
25 | }
26 |
27 | module.exports = MenuItem;
28 |
--------------------------------------------------------------------------------
/src/primed/menu.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const React = require('react');
4 | const classnames = require('classnames');
5 |
6 | const MenuItem = require('./menu-item');
7 |
8 | class Menu extends React.Component {
9 |
10 | render(){
11 | const {
12 | className,
13 | selected,
14 | children
15 | } = this.props;
16 |
17 | const classes = classnames(className, {
18 | menu: true
19 | });
20 |
21 | const menuItems = React.Children.map(children, function(child, idx){
22 | if(selected == null){
23 | return child;
24 | }
25 |
26 | if(child.type !== MenuItem){
27 | return child;
28 | }
29 |
30 | return React.cloneElement(child, {
31 | selected: (idx === selected)
32 | });
33 | });
34 |
35 | return (
36 |
37 | {menuItems}
38 |
39 | );
40 | }
41 | }
42 |
43 | module.exports = Menu;
44 |
--------------------------------------------------------------------------------
/src/stores/config.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const _ = require('lodash');
4 | const chromeApi = require('chromeback')(chrome);
5 |
6 | const alt = require('../alt');
7 | const getErrorMessage = require('../lib/get-error-message');
8 | const { setConfig } = require('../actions/config');
9 |
10 | class ConfigStore {
11 | constructor(){
12 | this.state = {
13 | autoFill: null,
14 | errorMessage: null
15 | };
16 |
17 | this.bindListeners({
18 | handleSetConfig: setConfig
19 | });
20 |
21 | chromeApi.storage.sync.get('autoFill', (err, res)=>{
22 | if(err){
23 | this.setState({ errorMessage: getErrorMessage(err) });
24 | } else {
25 | this.setState({ autoFill: res.autoFill });
26 | }
27 | });
28 | }
29 |
30 | handleSetConfig(settings){
31 | chromeApi.storage.sync.set({ autoFill: settings }, (err)=>{
32 | if(err){
33 | this.setState({ errorMessage: getErrorMessage(err) });
34 | } else {
35 | this.setState({ autoFill: settings });
36 | if(settings){
37 | chrome.tabs.query({ url: 'https://github.com/*/*' }, function(tabs){
38 | _.forEach(tabs, function(tab){
39 | chrome.tabs.sendMessage(tab.id, { fillPR: true });
40 | });
41 | });
42 | }
43 | }
44 | });
45 | }
46 | }
47 |
48 | ConfigStore.config = {
49 | stateKey: 'state'
50 | };
51 |
52 | module.exports = alt.createStore(ConfigStore);
53 |
--------------------------------------------------------------------------------
/src/stores/template.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const _ = require('lodash');
4 | const chromeApi = require('chromeback')(chrome);
5 |
6 | const alt = require('../alt');
7 | const client = require('../lib/client');
8 | const getErrorMessage = require('../lib/get-error-message');
9 | const { fetchNewTemplate, submitTemplate } = require('../actions/sync-template');
10 | const { cancelChanges, setDeltaTemplate, setDeltaUrl } = require('../actions/edit-template');
11 |
12 | class TemplateStore {
13 | constructor(){
14 | this.state = {
15 | prTemplate: null,
16 | templateUrl: null,
17 | errorMessage: null,
18 | deltaUrl: null,
19 | deltaTemplate: null,
20 | disableCancel: true,
21 | disableSubmit: true
22 | };
23 |
24 | this.bindListeners({
25 | handleCancelChanges: cancelChanges,
26 | handleFetchNewTemplate: fetchNewTemplate,
27 | handleSetDeltaTemplate: setDeltaTemplate,
28 | handleSetDeltaUrl: setDeltaUrl,
29 | handleSubmitTemplate: submitTemplate
30 | });
31 |
32 | chromeApi.storage.sync.get(['templateUrl', 'prTemplate'], (err, res)=>{
33 | if(err){
34 | this.setState({ errorMessage: getErrorMessage(err) });
35 | } else {
36 | this.setState({
37 | prTemplate: res.prTemplate,
38 | templateUrl: res.templateUrl,
39 | deltaUrl: res.templateUrl,
40 | deltaTemplate: res.prTemplate
41 | });
42 | }
43 | });
44 | }
45 |
46 | handleCancelChanges(){
47 | this.setState({
48 | deltaUrl: this.state.templateUrl,
49 | deltaTemplate: this.state.prTemplate,
50 | disableCancel: true,
51 | disableSubmit: true,
52 | errorMessage: ''
53 | });
54 | }
55 |
56 | handleFetchNewTemplate(){
57 | const { deltaUrl, prTemplate, templateUrl } = this.state;
58 | client(deltaUrl)
59 | .then(({ entity })=>{
60 | this.setState({
61 | deltaTemplate: entity,
62 | errorMessage: ''
63 | });
64 | if(entity === prTemplate){
65 | this.setState({ disableSubmit: true });
66 | if(deltaUrl === templateUrl){
67 | this.setState({ disableCancel: true });
68 | }
69 | } else {
70 | this.setState({
71 | disableSubmit: false,
72 | disableCancel: false
73 | });
74 | }
75 | })
76 | .otherwise((err)=>{
77 | this.setState({
78 | errorMessage: getErrorMessage(err),
79 | disableSubmit: true
80 | });
81 | });
82 | }
83 |
84 | handleSetDeltaTemplate(newTemplate){
85 | this.setState({
86 | deltaTemplate: newTemplate,
87 | disableSubmit: false,
88 | disableCancel: false
89 | });
90 | }
91 |
92 | handleSetDeltaUrl(newUrl){
93 | this.setState({ deltaUrl: newUrl });
94 | if(newUrl !== this.state.templateUrl){
95 | this.setState({ disableCancel: false });
96 | }
97 | }
98 |
99 | handleSubmitTemplate(){
100 | const { deltaUrl, deltaTemplate, prTemplate } = this.state;
101 | chromeApi.storage.sync.set({
102 | prTemplate: deltaTemplate,
103 | templateUrl: deltaUrl
104 | }, (err)=>{
105 | if(err){
106 | this.setState({ errorMessage: getErrorMessage(err) });
107 | } else {
108 | chromeApi.tabs.query({ url: 'https://github.com/*/*' }, function(tabs){
109 | // If the message doesn't go to the tabs we silently error
110 | _.forEach(tabs, function(tab){
111 | chromeApi.tabs.sendMessage(tab.id, { replaceTemplate: prTemplate });
112 | });
113 | });
114 | this.setState({
115 | templateUrl: deltaUrl,
116 | prTemplate: deltaTemplate,
117 | disableCancel: true,
118 | disableSubmit: true,
119 | errorMessage: ''
120 | });
121 | }
122 | });
123 | }
124 | }
125 |
126 | TemplateStore.config = {
127 | stateKey: 'state'
128 | };
129 |
130 | module.exports = alt.createStore(TemplateStore);
131 |
--------------------------------------------------------------------------------
/style/options.css:
--------------------------------------------------------------------------------
1 | .url_submit_action,
2 | .url_edit_action {
3 | margin-left: 5px;
4 | }
5 |
--------------------------------------------------------------------------------
/vendor/octicons/LICENSE.txt:
--------------------------------------------------------------------------------
1 | (c) 2012-2015 GitHub
2 |
3 | When using the GitHub logos, be sure to follow the GitHub logo guidelines (https://github.com/logos)
4 |
5 | Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL)
6 | Applies to all font files
7 |
8 | Code License: MIT (http://choosealicense.com/licenses/mit/)
9 | Applies to all other files
10 |
--------------------------------------------------------------------------------
/vendor/octicons/octicons.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'octicons';
3 | src: url('octicons.eot?#iefix') format('embedded-opentype'),
4 | url('octicons.woff') format('woff'),
5 | url('octicons.ttf') format('truetype'),
6 | url('octicons.svg#octicons') format('svg');
7 | font-weight: normal;
8 | font-style: normal;
9 | }
10 |
11 | /*
12 |
13 | .octicon is optimized for 16px.
14 | .mega-octicon is optimized for 32px but can be used larger.
15 |
16 | */
17 | .octicon, .mega-octicon {
18 | font: normal normal normal 16px/1 octicons;
19 | display: inline-block;
20 | text-decoration: none;
21 | text-rendering: auto;
22 | -webkit-font-smoothing: antialiased;
23 | -moz-osx-font-smoothing: grayscale;
24 | -webkit-user-select: none;
25 | -moz-user-select: none;
26 | -ms-user-select: none;
27 | user-select: none;
28 | }
29 | .mega-octicon { font-size: 32px; }
30 |
31 | .octicon-alert:before { content: '\f02d'} /* */
32 | .octicon-alignment-align:before { content: '\f08a'} /* */
33 | .octicon-alignment-aligned-to:before { content: '\f08e'} /* */
34 | .octicon-alignment-unalign:before { content: '\f08b'} /* */
35 | .octicon-arrow-down:before { content: '\f03f'} /* */
36 | .octicon-arrow-left:before { content: '\f040'} /* */
37 | .octicon-arrow-right:before { content: '\f03e'} /* */
38 | .octicon-arrow-small-down:before { content: '\f0a0'} /* */
39 | .octicon-arrow-small-left:before { content: '\f0a1'} /* */
40 | .octicon-arrow-small-right:before { content: '\f071'} /* */
41 | .octicon-arrow-small-up:before { content: '\f09f'} /* */
42 | .octicon-arrow-up:before { content: '\f03d'} /* */
43 | .octicon-beer:before { content: '\f069'} /* */
44 | .octicon-book:before { content: '\f007'} /* */
45 | .octicon-bookmark:before { content: '\f07b'} /* */
46 | .octicon-briefcase:before { content: '\f0d3'} /* */
47 | .octicon-broadcast:before { content: '\f048'} /* */
48 | .octicon-browser:before { content: '\f0c5'} /* */
49 | .octicon-bug:before { content: '\f091'} /* */
50 | .octicon-calendar:before { content: '\f068'} /* */
51 | .octicon-check:before { content: '\f03a'} /* */
52 | .octicon-checklist:before { content: '\f076'} /* */
53 | .octicon-chevron-down:before { content: '\f0a3'} /* */
54 | .octicon-chevron-left:before { content: '\f0a4'} /* */
55 | .octicon-chevron-right:before { content: '\f078'} /* */
56 | .octicon-chevron-up:before { content: '\f0a2'} /* */
57 | .octicon-circle-slash:before { content: '\f084'} /* */
58 | .octicon-circuit-board:before { content: '\f0d6'} /* */
59 | .octicon-clippy:before { content: '\f035'} /* */
60 | .octicon-clock:before { content: '\f046'} /* */
61 | .octicon-cloud-download:before { content: '\f00b'} /* */
62 | .octicon-cloud-upload:before { content: '\f00c'} /* */
63 | .octicon-code:before { content: '\f05f'} /* */
64 | .octicon-color-mode:before { content: '\f065'} /* */
65 | .octicon-comment-add:before,
66 | .octicon-comment:before { content: '\f02b'} /* */
67 | .octicon-comment-discussion:before { content: '\f04f'} /* */
68 | .octicon-credit-card:before { content: '\f045'} /* */
69 | .octicon-dash:before { content: '\f0ca'} /* */
70 | .octicon-dashboard:before { content: '\f07d'} /* */
71 | .octicon-database:before { content: '\f096'} /* */
72 | .octicon-device-camera:before { content: '\f056'} /* */
73 | .octicon-device-camera-video:before { content: '\f057'} /* */
74 | .octicon-device-desktop:before { content: '\f27c'} /* */
75 | .octicon-device-mobile:before { content: '\f038'} /* */
76 | .octicon-diff:before { content: '\f04d'} /* */
77 | .octicon-diff-added:before { content: '\f06b'} /* */
78 | .octicon-diff-ignored:before { content: '\f099'} /* */
79 | .octicon-diff-modified:before { content: '\f06d'} /* */
80 | .octicon-diff-removed:before { content: '\f06c'} /* */
81 | .octicon-diff-renamed:before { content: '\f06e'} /* */
82 | .octicon-ellipsis:before { content: '\f09a'} /* */
83 | .octicon-eye-unwatch:before,
84 | .octicon-eye-watch:before,
85 | .octicon-eye:before { content: '\f04e'} /* */
86 | .octicon-file-binary:before { content: '\f094'} /* */
87 | .octicon-file-code:before { content: '\f010'} /* */
88 | .octicon-file-directory:before { content: '\f016'} /* */
89 | .octicon-file-media:before { content: '\f012'} /* */
90 | .octicon-file-pdf:before { content: '\f014'} /* */
91 | .octicon-file-submodule:before { content: '\f017'} /* */
92 | .octicon-file-symlink-directory:before { content: '\f0b1'} /* */
93 | .octicon-file-symlink-file:before { content: '\f0b0'} /* */
94 | .octicon-file-text:before { content: '\f011'} /* */
95 | .octicon-file-zip:before { content: '\f013'} /* */
96 | .octicon-flame:before { content: '\f0d2'} /* */
97 | .octicon-fold:before { content: '\f0cc'} /* */
98 | .octicon-gear:before { content: '\f02f'} /* */
99 | .octicon-gift:before { content: '\f042'} /* */
100 | .octicon-gist:before { content: '\f00e'} /* */
101 | .octicon-gist-secret:before { content: '\f08c'} /* */
102 | .octicon-git-branch-create:before,
103 | .octicon-git-branch-delete:before,
104 | .octicon-git-branch:before { content: '\f020'} /* */
105 | .octicon-git-commit:before { content: '\f01f'} /* */
106 | .octicon-git-compare:before { content: '\f0ac'} /* */
107 | .octicon-git-merge:before { content: '\f023'} /* */
108 | .octicon-git-pull-request-abandoned:before,
109 | .octicon-git-pull-request:before { content: '\f009'} /* */
110 | .octicon-globe:before { content: '\f0b6'} /* */
111 | .octicon-graph:before { content: '\f043'} /* */
112 | .octicon-heart:before { content: '\2665'} /* ♥ */
113 | .octicon-history:before { content: '\f07e'} /* */
114 | .octicon-home:before { content: '\f08d'} /* */
115 | .octicon-horizontal-rule:before { content: '\f070'} /* */
116 | .octicon-hourglass:before { content: '\f09e'} /* */
117 | .octicon-hubot:before { content: '\f09d'} /* */
118 | .octicon-inbox:before { content: '\f0cf'} /* */
119 | .octicon-info:before { content: '\f059'} /* */
120 | .octicon-issue-closed:before { content: '\f028'} /* */
121 | .octicon-issue-opened:before { content: '\f026'} /* */
122 | .octicon-issue-reopened:before { content: '\f027'} /* */
123 | .octicon-jersey:before { content: '\f019'} /* */
124 | .octicon-jump-down:before { content: '\f072'} /* */
125 | .octicon-jump-left:before { content: '\f0a5'} /* */
126 | .octicon-jump-right:before { content: '\f0a6'} /* */
127 | .octicon-jump-up:before { content: '\f073'} /* */
128 | .octicon-key:before { content: '\f049'} /* */
129 | .octicon-keyboard:before { content: '\f00d'} /* */
130 | .octicon-law:before { content: '\f0d8'} /* */
131 | .octicon-light-bulb:before { content: '\f000'} /* */
132 | .octicon-link:before { content: '\f05c'} /* */
133 | .octicon-link-external:before { content: '\f07f'} /* */
134 | .octicon-list-ordered:before { content: '\f062'} /* */
135 | .octicon-list-unordered:before { content: '\f061'} /* */
136 | .octicon-location:before { content: '\f060'} /* */
137 | .octicon-gist-private:before,
138 | .octicon-mirror-private:before,
139 | .octicon-git-fork-private:before,
140 | .octicon-lock:before { content: '\f06a'} /* */
141 | .octicon-logo-github:before { content: '\f092'} /* */
142 | .octicon-mail:before { content: '\f03b'} /* */
143 | .octicon-mail-read:before { content: '\f03c'} /* */
144 | .octicon-mail-reply:before { content: '\f051'} /* */
145 | .octicon-mark-github:before { content: '\f00a'} /* */
146 | .octicon-markdown:before { content: '\f0c9'} /* */
147 | .octicon-megaphone:before { content: '\f077'} /* */
148 | .octicon-mention:before { content: '\f0be'} /* */
149 | .octicon-microscope:before { content: '\f089'} /* */
150 | .octicon-milestone:before { content: '\f075'} /* */
151 | .octicon-mirror-public:before,
152 | .octicon-mirror:before { content: '\f024'} /* */
153 | .octicon-mortar-board:before { content: '\f0d7'} /* */
154 | .octicon-move-down:before { content: '\f0a8'} /* */
155 | .octicon-move-left:before { content: '\f074'} /* */
156 | .octicon-move-right:before { content: '\f0a9'} /* */
157 | .octicon-move-up:before { content: '\f0a7'} /* */
158 | .octicon-mute:before { content: '\f080'} /* */
159 | .octicon-no-newline:before { content: '\f09c'} /* */
160 | .octicon-octoface:before { content: '\f008'} /* */
161 | .octicon-organization:before { content: '\f037'} /* */
162 | .octicon-package:before { content: '\f0c4'} /* */
163 | .octicon-paintcan:before { content: '\f0d1'} /* */
164 | .octicon-pencil:before { content: '\f058'} /* */
165 | .octicon-person-add:before,
166 | .octicon-person-follow:before,
167 | .octicon-person:before { content: '\f018'} /* */
168 | .octicon-pin:before { content: '\f041'} /* */
169 | .octicon-playback-fast-forward:before { content: '\f0bd'} /* */
170 | .octicon-playback-pause:before { content: '\f0bb'} /* */
171 | .octicon-playback-play:before { content: '\f0bf'} /* */
172 | .octicon-playback-rewind:before { content: '\f0bc'} /* */
173 | .octicon-plug:before { content: '\f0d4'} /* */
174 | .octicon-repo-create:before,
175 | .octicon-gist-new:before,
176 | .octicon-file-directory-create:before,
177 | .octicon-file-add:before,
178 | .octicon-plus:before { content: '\f05d'} /* */
179 | .octicon-podium:before { content: '\f0af'} /* */
180 | .octicon-primitive-dot:before { content: '\f052'} /* */
181 | .octicon-primitive-square:before { content: '\f053'} /* */
182 | .octicon-pulse:before { content: '\f085'} /* */
183 | .octicon-puzzle:before { content: '\f0c0'} /* */
184 | .octicon-question:before { content: '\f02c'} /* */
185 | .octicon-quote:before { content: '\f063'} /* */
186 | .octicon-radio-tower:before { content: '\f030'} /* */
187 | .octicon-repo-delete:before,
188 | .octicon-repo:before { content: '\f001'} /* */
189 | .octicon-repo-clone:before { content: '\f04c'} /* */
190 | .octicon-repo-force-push:before { content: '\f04a'} /* */
191 | .octicon-gist-fork:before,
192 | .octicon-repo-forked:before { content: '\f002'} /* */
193 | .octicon-repo-pull:before { content: '\f006'} /* */
194 | .octicon-repo-push:before { content: '\f005'} /* */
195 | .octicon-rocket:before { content: '\f033'} /* */
196 | .octicon-rss:before { content: '\f034'} /* */
197 | .octicon-ruby:before { content: '\f047'} /* */
198 | .octicon-screen-full:before { content: '\f066'} /* */
199 | .octicon-screen-normal:before { content: '\f067'} /* */
200 | .octicon-search-save:before,
201 | .octicon-search:before { content: '\f02e'} /* */
202 | .octicon-server:before { content: '\f097'} /* */
203 | .octicon-settings:before { content: '\f07c'} /* */
204 | .octicon-log-in:before,
205 | .octicon-sign-in:before { content: '\f036'} /* */
206 | .octicon-log-out:before,
207 | .octicon-sign-out:before { content: '\f032'} /* */
208 | .octicon-split:before { content: '\f0c6'} /* */
209 | .octicon-squirrel:before { content: '\f0b2'} /* */
210 | .octicon-star-add:before,
211 | .octicon-star-delete:before,
212 | .octicon-star:before { content: '\f02a'} /* */
213 | .octicon-steps:before { content: '\f0c7'} /* */
214 | .octicon-stop:before { content: '\f08f'} /* */
215 | .octicon-repo-sync:before,
216 | .octicon-sync:before { content: '\f087'} /* */
217 | .octicon-tag-remove:before,
218 | .octicon-tag-add:before,
219 | .octicon-tag:before { content: '\f015'} /* */
220 | .octicon-telescope:before { content: '\f088'} /* */
221 | .octicon-terminal:before { content: '\f0c8'} /* */
222 | .octicon-three-bars:before { content: '\f05e'} /* */
223 | .octicon-thumbsdown:before { content: '\f0db'} /* */
224 | .octicon-thumbsup:before { content: '\f0da'} /* */
225 | .octicon-tools:before { content: '\f031'} /* */
226 | .octicon-trashcan:before { content: '\f0d0'} /* */
227 | .octicon-triangle-down:before { content: '\f05b'} /* */
228 | .octicon-triangle-left:before { content: '\f044'} /* */
229 | .octicon-triangle-right:before { content: '\f05a'} /* */
230 | .octicon-triangle-up:before { content: '\f0aa'} /* */
231 | .octicon-unfold:before { content: '\f039'} /* */
232 | .octicon-unmute:before { content: '\f0ba'} /* */
233 | .octicon-versions:before { content: '\f064'} /* */
234 | .octicon-remove-close:before,
235 | .octicon-x:before { content: '\f081'} /* */
236 | .octicon-zap:before { content: '\26A1'} /* ⚡ */
237 |
--------------------------------------------------------------------------------
/vendor/octicons/octicons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/vendor/octicons/octicons.eot
--------------------------------------------------------------------------------
/vendor/octicons/octicons.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | (c) 2012-2015 GitHub
6 |
7 | When using the GitHub logos, be sure to follow the GitHub logo guidelines (https://github.com/logos)
8 |
9 | Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL)
10 | Applies to all font files
11 |
12 | Code License: MIT (http://choosealicense.com/licenses/mit/)
13 | Applies to all other files
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 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
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 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
--------------------------------------------------------------------------------
/vendor/octicons/octicons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/vendor/octicons/octicons.ttf
--------------------------------------------------------------------------------
/vendor/octicons/octicons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/vendor/octicons/octicons.woff
--------------------------------------------------------------------------------
/vendor/octicons/pr128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/vendor/octicons/pr128.png
--------------------------------------------------------------------------------
/vendor/octicons/pr19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/vendor/octicons/pr19.png
--------------------------------------------------------------------------------
/vendor/octicons/pr38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/vendor/octicons/pr38.png
--------------------------------------------------------------------------------
/vendor/octicons/pr48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iceddev/git-splainin/b4d6cbe4704500e5d4e37a0bac7efa884c10c933/vendor/octicons/pr48.png
--------------------------------------------------------------------------------
/vendor/primer/license.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 GitHub, Inc.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/vendor/primer/primer.css:
--------------------------------------------------------------------------------
1 | /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:border-box}input,select,textarea,button{font:13px/1.4 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,"Segoe UI Emoji","Segoe UI Symbol"}body{font:13px/1.4 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";color:#333;background-color:#fff}a{color:#4183c4;text-decoration:none}a:hover,a:active{text-decoration:underline}hr,.rule{height:0;margin:15px 0;overflow:hidden;background:transparent;border:0;border-bottom:1px solid #ddd}hr:before,.rule:before{display:table;content:""}hr:after,.rule:after{display:table;clear:both;content:""}h1,h2,h3,h4,h5,h6{margin-top:15px;margin-bottom:15px;line-height:1.1}h1{font-size:30px}h2{font-size:21px}h3{font-size:16px}h4{font-size:14px}h5{font-size:12px}h6{font-size:11px}small{font-size:90%}blockquote{margin:0}.lead{margin-bottom:30px;font-size:20px;font-weight:300;color:#555}.text-muted{color:#999}.text-danger{color:#bd2c00}.text-emphasized{font-weight:bold;color:#333}ul,ol{padding:0;margin-top:0;margin-bottom:0}ol ol,ul ol{list-style-type:lower-roman}ul ul ol,ul ol ol,ol ul ol,ol ol ol{list-style-type:lower-alpha}dd{margin-left:0}tt,code{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px}pre{margin-top:0;margin-bottom:0;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}.container{width:980px;margin-right:auto;margin-left:auto}.container:before{display:table;content:""}.container:after{display:table;clear:both;content:""}.columns{margin-right:-10px;margin-left:-10px}.columns:before{display:table;content:""}.columns:after{display:table;clear:both;content:""}.column{float:left;padding-right:10px;padding-left:10px}.one-third{width:33.333333%}.two-thirds{width:66.666667%}.one-fourth{width:25%}.one-half{width:50%}.three-fourths{width:75%}.one-fifth{width:20%}.four-fifths{width:80%}.single-column{padding-right:10px;padding-left:10px}.table-column{display:table-cell;width:1%;padding-right:10px;padding-left:10px;vertical-align:top}fieldset{padding:0;margin:0;border:0}label{font-size:13px;font-weight:bold}.form-control,input[type="text"],input[type="password"],input[type="email"],input[type="number"],input[type="tel"],input[type="url"],textarea{min-height:34px;padding:7px 8px;font-size:13px;color:#333;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right center;border:1px solid #ccc;border-radius:3px;outline:none;box-shadow:inset 0 1px 2px rgba(0,0,0,0.075)}.form-control.focus,.form-control:focus,input[type="text"].focus,input[type="text"]:focus,input[type="password"].focus,input[type="password"]:focus,input[type="email"].focus,input[type="email"]:focus,input[type="number"].focus,input[type="number"]:focus,input[type="tel"].focus,input[type="tel"]:focus,input[type="url"].focus,input[type="url"]:focus,textarea.focus,textarea:focus{border-color:#51a7e8;box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(81,167,232,0.5)}input.input-contrast,.input-contrast{background-color:#fafafa}input.input-contrast:focus,.input-contrast:focus{background-color:#fff}::-webkit-input-placeholder,:-moz-placeholder{color:#aaa}::-webkit-validation-bubble-message{font-size:12px;color:#fff;background:#9c2400;border:0;border-radius:3px;-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.1)}input::-webkit-validation-bubble-icon{display:none}::-webkit-validation-bubble-arrow{background-color:#9c2400;border:solid 1px #9c2400;-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.1)}input.input-mini{min-height:26px;padding-top:4px;padding-bottom:4px;font-size:12px}input.input-large{padding:6px 10px;font-size:16px}.input-block{display:block;width:100%}.input-monospace{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace}dl.form{margin:15px 0}dl.form input[type="text"],dl.form input[type="password"],dl.form input[type="email"],dl.form input[type="url"],dl.form textarea{background-color:#fafafa}dl.form input[type="text"]:focus,dl.form input[type="password"]:focus,dl.form input[type="email"]:focus,dl.form input[type="url"]:focus,dl.form textarea:focus{background-color:#fff}dl.form>dt{margin:0 0 6px}dl.form>dt label{position:relative}dl.form.flattened>dt{float:left;margin:0;line-height:32px}dl.form.flattened>dd{line-height:32px}dl.form>dd input[type="text"],dl.form>dd input[type="password"],dl.form>dd input[type="email"],dl.form>dd input[type="url"]{width:440px;max-width:100%;margin-right:5px;background-position-x:98%}dl.form>dd input.shorter{width:130px}dl.form>dd input.short{width:250px}dl.form>dd input.long{width:100%}dl.form>dd textarea{width:100%;height:200px;min-height:200px}dl.form>dd textarea.short{height:50px;min-height:50px}dl.form>dd h4{margin:4px 0 0}dl.form>dd h4.is-error{color:#bd2c00}dl.form>dd h4.is-success{color:#6cc644}dl.form>dd h4+p.note{margin-top:0}dl.form.required>dt>label:after{padding-left:5px;color:#9f1006;content:"*"}.note{min-height:17px;margin:4px 0 2px;font-size:12px;color:#777}.note .spinner{margin-right:3px;vertical-align:middle}.form-checkbox{padding-left:20px;margin:15px 0;vertical-align:middle}.form-checkbox label em.highlight{position:relative;left:-4px;padding:2px 4px;font-style:normal;background:#fffbdc;border-radius:3px}.form-checkbox input[type=checkbox],.form-checkbox input[type=radio]{float:left;margin:2px 0 0 -20px;vertical-align:middle}.form-checkbox .note{display:block;margin:0;font-size:12px;font-weight:normal;color:#666}dl.form .success,dl.form .error,dl.form .indicator{display:none;font-size:12px;font-weight:bold}dl.form.loading{opacity:0.5}dl.form.loading .indicator{display:inline}dl.form.loading .spinner{display:inline-block;vertical-align:middle}dl.form.successful .success{display:inline;color:#390}dl.form.errored>dt label{color:#900}dl.form.errored .error{display:inline;color:#900}dl.form.errored dd.error,dl.form.errored dd.warning{display:inline-block;padding:5px;font-size:11px;color:#494620;background:#f7ea57;border:1px solid #c0b536;border-top-color:#fff;border-bottom-right-radius:3px;border-bottom-left-radius:3px}dl.form.warn .warning{display:inline;color:#900}dl.form.warn dd.warning{display:inline-block;padding:5px;font-size:11px;color:#494620;background:#f7ea57;border:1px solid #c0b536;border-top-color:#fff;border-bottom-right-radius:3px;border-bottom-left-radius:3px}dl.form .form-note{display:inline-block;padding:5px;margin-top:-1px;font-size:11px;color:#494620;background:#f7ea57;border:1px solid #c0b536;border-top-color:#fff;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.hfields{margin:15px 0}.hfields:before{display:table;content:""}.hfields:after{display:table;clear:both;content:""}.hfields dl.form{float:left;margin:0 30px 0 0}.hfields dl.form>dt label{display:inline-block;margin:5px 0 0;color:#666}.hfields dl.form>dt label img{position:relative;top:-2px}.hfields .btn{float:left;margin:28px 25px 0 -20px}.hfields select{margin-top:5px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.input-group{display:table}.input-group input{position:relative;width:100%}.input-group input:focus{z-index:2}.input-group input[type="text"]+.btn{margin-left:0}.input-group.inline{display:inline-table}.input-group input,.input-group-button{display:table-cell}.input-group-button{width:1%;vertical-align:middle}.input-group input:first-child,.input-group-button:first-child .btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-button:first-child .btn{margin-right:-1px}.input-group input:last-child,.input-group-button:last-child .btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-button:last-child .btn{margin-left:-1px}.form-actions:before{display:table;content:""}.form-actions:after{display:table;clear:both;content:""}.form-actions .btn{float:right}.form-actions .btn+.btn{margin-right:5px}.form-warning{padding:8px 10px;margin:10px 0;font-size:14px;color:#333;background:#ffffe2;border:1px solid #e7e4c2;border-radius:4px}.form-warning p{margin:0;line-height:1.5}.form-warning strong{color:#000}.form-warning a{font-weight:bold}.status-indicator{font:normal normal 16px/1 "octicons";display:inline-block;text-decoration:none;-webkit-font-smoothing:antialiased;margin-left:5px}.status-indicator-success:before{color:#6cc644;content:"\f03a"}.status-indicator-failed:before{color:#bd2c00;content:"\f02d"}.clearfix:before{display:table;content:""}.clearfix:after{display:table;clear:both;content:""}.right{float:right}.left{float:left}.centered{display:block;float:none;margin-left:auto;margin-right:auto}.text-right{text-align:right}.text-left{text-align:left}.danger{color:#c00}.mute{color:#000}.text-diff-added{color:#55a532}.text-diff-deleted{color:#bd2c00}.text-open,.text-success{color:#6cc644}.text-closed{color:#bd2c00}.text-reverted{color:#bd2c00}.text-merged{color:#6e5494}.text-renamed{color:#fffa5d}.text-pending{color:#cea61b}.text-error,.text-failure{color:#bd2c00}.muted-link{color:#777}.muted-link:hover{color:#4183c4;text-decoration:none}.hidden{display:none}.warning{padding:0.5em;margin-bottom:0.8em;font-weight:bold;background-color:#fffccc}.error_box{padding:1em;font-weight:bold;background-color:#ffebe8;border:1px solid #dd3c10}.flash-messages{margin-top:15px;margin-bottom:15px}.flash,.flash-global{position:relative;font-size:14px;line-height:1.6;color:#246;background-color:#e2eef9;border:solid 1px #bac6d3}.flash.flash-warn,.flash-global.flash-warn{color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}.flash.flash-error,.flash-global.flash-error{color:#911;background-color:#fcdede;border-color:#d2b2b2}.flash .flash-close,.flash-global .flash-close{float:right;padding:17px;margin-top:-15px;margin-right:-15px;margin-left:20px;color:inherit;text-decoration:none;cursor:pointer;opacity:0.6}.flash .flash-close:hover,.flash-global .flash-close:hover{opacity:1}.flash p:last-child,.flash-global p:last-child{margin-bottom:0}.flash .flash-action,.flash-global .flash-action{float:right;margin-top:-4px;margin-left:20px}.flash a,.flash-global a{font-weight:bold}.flash{padding:15px;border-radius:3px}.flash+.flash{margin-top:5px}.flash-with-icon{padding-left:40px}.flash-with-icon>.octicon{float:left;margin-top:3px;margin-left:-25px}.flash-global{padding:10px;margin-top:-1px;border-width:1px 0}.flash-global h2,.flash-global p{margin-top:0;margin-bottom:0;font-size:14px;line-height:1.4}.flash-global .flash-action{margin-top:5px}.flash-title{margin-top:0;margin-bottom:5px}.avatar{display:inline-block;overflow:hidden;line-height:1;vertical-align:middle;border-radius:3px}.avatar-small{border-radius:2px}.avatar-link{float:left;line-height:1}.avatar-group-item{display:inline-block;margin-bottom:3px}.avatar-parent-child{position:relative}.avatar-child{position:absolute;right:-15%;bottom:-9%;border-radius:2px;box-shadow:-2px -2px 0 rgba(255,255,255,0.8)}.blankslate{position:relative;padding:30px;text-align:center;background-color:#fafafa;border:1px solid #e5e5e5;border-radius:3px;box-shadow:inset 0 0 10px rgba(0,0,0,0.05)}.blankslate.clean-background{background:none;border:0;box-shadow:none}.blankslate.capped{border-radius:0 0 3px 3px}.blankslate.spacious{padding:100px 60px 120px}.blankslate.has-fixed-width{width:485px;margin:0 auto}.blankslate.large-format h3{margin:0.75em 0;font-size:20px}.blankslate.large-format p{font-size:16px}.blankslate.large-format p.has-fixed-width{width:540px;margin:0 auto;text-align:left}.blankslate.large-format .mega-octicon{width:40px;height:40px;font-size:40px;color:#aaa}.blankslate.large-format .octicon-inbox{font-size:48px;line-height:40px}.blankslate code{padding:2px 5px 3px;font-size:14px;background:#fff;border:1px solid #eee;border-radius:3px}.blankslate>.mega-octicon{color:#aaa}.blankslate .mega-octicon+.mega-octicon{margin-left:10px}.tabnav+.blankslate{margin-top:20px}.blankslate .context-loader.large-format-loader{padding-top:50px}.counter{display:inline-block;padding:2px 5px;font-size:11px;font-weight:bold;line-height:1;color:#777;background-color:#eee;border-radius:20px}.btn{position:relative;display:inline-block;padding:6px 12px;font-size:13px;font-weight:bold;line-height:20px;color:#333;white-space:nowrap;vertical-align:middle;cursor:pointer;background-color:#eee;background-image:linear-gradient(#fcfcfc, #eee);border:1px solid #d5d5d5;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-appearance:none}.btn i{font-style:normal;font-weight:500;opacity:0.6}.btn .octicon{vertical-align:text-top}.btn .counter{text-shadow:none;background-color:#e5e5e5}.btn:focus{text-decoration:none;border-color:#51a7e8;outline:none;box-shadow:0 0 5px rgba(81,167,232,0.5)}.btn:focus:hover,.btn.selected:focus{border-color:#51a7e8}.btn:hover,.btn:active,.btn.zeroclipboard-is-hover,.btn.zeroclipboard-is-active{text-decoration:none;background-color:#ddd;background-image:linear-gradient(#eee, #ddd);border-color:#ccc}.btn:active,.btn.selected,.btn.zeroclipboard-is-active{background-color:#dcdcdc;background-image:none;border-color:#b5b5b5;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15)}.btn.selected:hover{background-color:#cfcfcf}.btn:disabled,.btn:disabled:hover,.btn.disabled,.btn.disabled:hover{color:rgba(102,102,102,0.5);cursor:default;background-color:rgba(229,229,229,0.5);background-image:none;border-color:rgba(197,197,197,0.5);box-shadow:none}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.15);background-color:#60b044;background-image:linear-gradient(#8add6d, #60b044);border-color:#5ca941}.btn-primary .counter{color:#60b044;background-color:#fff}.btn-primary:hover{color:#fff;background-color:#569e3d;background-image:linear-gradient(#79d858, #569e3d);border-color:#4a993e}.btn-primary:active,.btn-primary.selected{text-shadow:0 1px 0 rgba(0,0,0,0.15);background-color:#569e3d;background-image:none;border-color:#418737}.btn-primary.selected:hover{background-color:#4c8b36}.btn-primary:disabled,.btn-primary:disabled:hover,.btn-primary.disabled,.btn-primary.disabled:hover{color:#fefefe;background-color:#add39f;background-image:linear-gradient(#c3ecb4, #add39f);border-color:#b9dcac #b9dcac #a7c89b}.btn-danger{color:#900}.btn-danger:hover{color:#fff;background-color:#b33630;background-image:linear-gradient(#dc5f59, #b33630);border-color:#cd504a}.btn-danger:active,.btn-danger.selected{color:#fff;background-color:#b33630;background-image:none;border-color:#9f312c}.btn-danger.selected:hover{background-color:#9f302b}.btn-danger:disabled,.btn-danger:disabled:hover,.btn-danger.disabled,.btn-danger.disabled:hover{color:#cb7f7f;background-color:#efefef;background-image:linear-gradient(#fefefe, #efefef);border-color:#e1e1e1}.btn-danger:hover .counter,.btn-danger:active .counter,.btn-danger.selected .counter{color:#b33630;background-color:#fff}.btn-outline{color:#4183c4;background-color:#fff;background-image:none;border:1px solid #e5e5e5}.btn-outline .counter{background-color:#eee}.btn-outline:hover,.btn-outline:active,.btn-outline.selected,.btn-outline.zeroclipboard-is-hover,.btn-outline.zeroclipboard-is-active{color:#fff;background-color:#4183c4;background-image:none;border-color:#4183c4}.btn-outline:hover .counter,.btn-outline:active .counter,.btn-outline.selected .counter,.btn-outline.zeroclipboard-is-hover .counter,.btn-outline.zeroclipboard-is-active .counter{color:#4183c4;background-color:#fff}.btn-outline.selected:hover{background-color:#3876b4}.btn-outline:disabled,.btn-outline:disabled:hover,.btn-outline.disabled,.btn-outline.disabled:hover{color:#777;background-color:#fff;background-image:none;border-color:#e5e5e5}.btn-with-count{float:left;border-top-right-radius:0;border-bottom-right-radius:0}.btn-sm{padding:2px 10px}.hidden-text-expander{display:block}.hidden-text-expander.inline{position:relative;top:-1px;display:inline-block;margin-left:5px;line-height:0}.hidden-text-expander a{display:inline-block;height:12px;padding:0 5px;font-size:12px;font-weight:bold;line-height:6px;color:#555;text-decoration:none;vertical-align:middle;background:#ddd;border-radius:1px}.hidden-text-expander a:hover{text-decoration:none;background-color:#ccc}.hidden-text-expander a:active{color:#fff;background-color:#4183c4}.social-count{float:left;padding:2px 7px;font-size:11px;font-weight:bold;line-height:20px;color:#333;vertical-align:middle;background-color:#fff;border:1px solid #ddd;border-left:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.social-count:hover,.social-count:active{text-decoration:none}.social-count:hover{color:#4183c4;cursor:pointer}.btn-block{display:block;width:100%;text-align:center}.btn-group{display:inline-block;vertical-align:middle}.btn-group:before{display:table;content:""}.btn-group:after{display:table;clear:both;content:""}.btn-group .btn{position:relative;float:left}.btn-group .btn:not(:first-child):not(:last-child){border-radius:0}.btn-group .btn:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group .btn:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .btn:hover,.btn-group .btn:active,.btn-group .btn.selected{z-index:2}.btn-group .btn:focus{z-index:3}.btn-group .btn+.btn{margin-left:-1px}.btn-group .btn+.button_to,.btn-group .button_to+.btn,.btn-group .button_to+.button_to{margin-left:-1px}.btn-group .button_to{float:left}.btn-group .button_to .btn{border-radius:0}.btn-group .button_to:first-child .btn{border-top-left-radius:3px;border-bottom-left-radius:3px}.btn-group .button_to:last-child .btn{border-top-right-radius:3px;border-bottom-right-radius:3px}.btn-group+.btn-group,.btn-group+.btn{margin-left:5px}.btn-link{display:inline-block;padding:0;font-size:inherit;color:#4183c4;white-space:nowrap;cursor:pointer;background-color:transparent;border:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-appearance:none}.btn-link:hover,.btn-link:focus{text-decoration:underline}.btn-link:focus{outline:none}.menu{margin-bottom:15px;list-style:none;background-color:#fff;border:1px solid #d8d8d8;border-radius:3px}.menu-item{position:relative;display:block;padding:8px 10px;text-shadow:0 1px 0 #fff;border-bottom:1px solid #eee}.menu-item:first-child{border-top:0;border-top-right-radius:2px;border-top-left-radius:2px}.menu-item:first-child:before{border-top-left-radius:2px}.menu-item:last-child{border-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.menu-item:last-child:before{border-bottom-left-radius:2px}.menu-item:hover{text-decoration:none;background-color:#f9f9f9}.menu-item.selected{font-weight:bold;color:#222;cursor:default;background-color:#fff}.menu-item.selected:before{position:absolute;top:0;left:0;bottom:0;width:2px;content:"";background-color:#d26911}.menu-item .octicon{margin-right:5px;width:16px;color:#333;text-align:center}.menu-item .counter{float:right;margin-left:5px}.menu-item .menu-warning{float:right;color:#d26911}.menu-item .avatar{float:left;margin-right:5px}.menu-item.alert .counter{color:#bd2c00}.menu-heading{display:block;padding:8px 10px;margin-top:0;margin-bottom:0;font-size:13px;font-weight:bold;line-height:20px;color:#555;background-color:#f7f7f7;border-bottom:1px solid #eee}.menu-heading:hover{text-decoration:none}.menu-heading:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.menu-heading:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px;border-bottom:0}.tabnav{margin-top:0;margin-bottom:15px;border-bottom:1px solid #ddd}.tabnav .counter{margin-left:5px}.tabnav-tabs{margin-bottom:-1px}.tabnav-tab{display:inline-block;padding:8px 12px;font-size:14px;line-height:20px;color:#666;text-decoration:none;border:1px solid transparent;border-bottom:0}.tabnav-tab.selected{color:#333;background-color:#fff;border-color:#ddd;border-radius:3px 3px 0 0}.tabnav-tab:hover{text-decoration:none}.tabnav-extra{display:inline-block;padding-top:10px;margin-left:10px;font-size:12px;color:#666}.tabnav-extra>.octicon{margin-right:2px}a.tabnav-extra:hover{color:#4183c4;text-decoration:none}.tabnav-btn{margin-left:10px}.filter-list{list-style-type:none}.filter-list.small .filter-item{padding:4px 10px;margin:0 0 2px;font-size:12px}.filter-list.pjax-active .filter-item{color:#777;background-color:transparent}.filter-list.pjax-active .filter-item.pjax-active{color:#fff;background-color:#4183c4}.filter-item{position:relative;display:block;padding:8px 10px;margin-bottom:5px;overflow:hidden;font-size:14px;color:#777;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;border-radius:3px}.filter-item:hover{text-decoration:none;background-color:#eee}.filter-item.selected{color:#fff;background-color:#4183c4}.filter-item.selected .octicon-remove-close{float:right;opacity:0.8}.filter-item .count{float:right;font-weight:bold}.filter-item .bar{position:absolute;top:2px;right:0;bottom:2px;z-index:-1;display:inline-block;background-color:#f1f1f1}.state{display:inline-block;padding:4px 8px;font-weight:bold;line-height:20px;color:#fff;text-align:center;border-radius:3px;background-color:#999}.state-open,.state-proposed,.state-reopened{background-color:#6cc644}.state-merged{background-color:#6e5494}.state-closed{background-color:#bd2c00}.state-renamed{background-color:#fffa5d}.tooltipped{position:relative}.tooltipped:after{position:absolute;z-index:1000000;display:none;padding:5px 8px;font:normal normal 11px/1.5 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:rgba(0,0,0,0.8);border-radius:3px;-webkit-font-smoothing:subpixel-antialiased}.tooltipped:before{position:absolute;z-index:1000001;display:none;width:0;height:0;color:rgba(0,0,0,0.8);pointer-events:none;content:"";border:5px solid transparent}.tooltipped:hover:before,.tooltipped:hover:after,.tooltipped:active:before,.tooltipped:active:after,.tooltipped:focus:before,.tooltipped:focus:after{display:inline-block;text-decoration:none}.tooltipped-multiline:hover:after,.tooltipped-multiline:active:after,.tooltipped-multiline:focus:after{display:table-cell}.tooltipped-s:after,.tooltipped-se:after,.tooltipped-sw:after{top:100%;right:50%;margin-top:5px}.tooltipped-s:before,.tooltipped-se:before,.tooltipped-sw:before{top:auto;right:50%;bottom:-5px;margin-right:-5px;border-bottom-color:rgba(0,0,0,0.8)}.tooltipped-se:after{right:auto;left:50%;margin-left:-15px}.tooltipped-sw:after{margin-right:-15px}.tooltipped-n:after,.tooltipped-ne:after,.tooltipped-nw:after{right:50%;bottom:100%;margin-bottom:5px}.tooltipped-n:before,.tooltipped-ne:before,.tooltipped-nw:before{top:-5px;right:50%;bottom:auto;margin-right:-5px;border-top-color:rgba(0,0,0,0.8)}.tooltipped-ne:after{right:auto;left:50%;margin-left:-15px}.tooltipped-nw:after{margin-right:-15px}.tooltipped-s:after,.tooltipped-n:after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%)}.tooltipped-w:after{right:100%;bottom:50%;margin-right:5px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%)}.tooltipped-w:before{top:50%;bottom:50%;left:-5px;margin-top:-5px;border-left-color:rgba(0,0,0,0.8)}.tooltipped-e:after{bottom:50%;left:100%;margin-left:5px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%)}.tooltipped-e:before{top:50%;right:-5px;bottom:50%;margin-top:-5px;border-right-color:rgba(0,0,0,0.8)}.tooltipped-multiline:after{width:-moz-max-content;width:-webkit-max-content;max-width:250px;word-break:break-word;word-wrap:normal;white-space:pre-line;border-collapse:separate}.tooltipped-multiline.tooltipped-s:after,.tooltipped-multiline.tooltipped-n:after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltipped-multiline.tooltipped-w:after,.tooltipped-multiline.tooltipped-e:after{right:100%}@media screen and (min-width: 0\0){.tooltipped-multiline:after{width:250px}}.tooltipped-sticky:before,.tooltipped-sticky:after{display:inline-block}.tooltipped-sticky.tooltipped-multiline:after{display:table-cell}.fullscreen-overlay-enabled.dark-theme .tooltipped:after{color:#000;background:rgba(255,255,255,0.8)}.fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-s:before,.fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-se:before,.fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-sw:before{border-bottom-color:rgba(255,255,255,0.8)}.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-n:before,.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-ne:before,.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-nw:before{border-top-color:rgba(255,255,255,0.8)}.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-e:before{border-right-color:rgba(255,255,255,0.8)}.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-w:before{border-left-color:rgba(255,255,255,0.8)}.flex-table{display:table}.flex-table-item{display:table-cell;width:1%;white-space:nowrap;vertical-align:middle}.flex-table-item-primary{width:99%}.css-truncate.css-truncate-target,.css-truncate .css-truncate-target{display:inline-block;max-width:125px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:top}.css-truncate.expandable.zeroclipboard-is-hover .css-truncate-target,.css-truncate.expandable.zeroclipboard-is-hover.css-truncate-target,.css-truncate.expandable:hover .css-truncate-target,.css-truncate.expandable:hover.css-truncate-target{max-width:10000px !important}
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var shouldWatch = (process.argv.indexOf('--watch') !== -1);
4 |
5 | module.exports = {
6 | entry: {
7 | background: './src/background.js',
8 | options: './src/options.js',
9 | 'fill-pull-body': './src/fill-pull-body.js'
10 | },
11 | output: {
12 | filename: '[name].js',
13 | path: __dirname
14 | },
15 | module: {
16 | loaders: [
17 | {
18 | test: /\.js$/,
19 | exclude: [
20 | /node_modules/
21 | ],
22 | loaders: [
23 | 'babel-loader'
24 | ]
25 | }
26 | ]
27 | },
28 | bail: true,
29 | watch: shouldWatch
30 | };
31 |
--------------------------------------------------------------------------------