├── runtime.txt ├── requirements.txt ├── netlify.toml ├── Makefile ├── images └── favicon.png ├── .pre-commit-config.yaml ├── README.md ├── company_page.jinja2 ├── contact.html ├── .gitignore ├── index.jinja2 ├── donations.yaml ├── css ├── normalize.css └── skeleton.css └── logos.py /runtime.txt: -------------------------------------------------------------------------------- 1 | 3.6 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | jinja2 2 | ruamel.yaml 3 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "make" 3 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | ./build_websites.py donations.yaml 3 | -------------------------------------------------------------------------------- /images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/katrielalex/fec-filings-analysis/HEAD/images/favicon.png -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | fail_fast: false 2 | 3 | repos: 4 | - repo: git://github.com/pre-commit/pre-commit-hooks 5 | sha: v1.1.1 6 | hooks: 7 | - id: check-case-conflict 8 | - id: check-executables-have-shebangs 9 | - id: check-symlinks 10 | - id: end-of-file-fixer 11 | - id: mixed-line-ending 12 | - id: trailing-whitespace 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # donationsfrom.tech 2 | 3 | This branch hosts https://donationsfrom.tech via Netlify's continuous integration. 4 | 5 | To build, `make`, which reads `donations.yaml` and renders it through `template.jinja2`. This happens automatically when netlify deploys. 6 | 7 | ## Contributing 8 | 9 | If you find some donations you think should be on here, please do make a pull request! Otherwise, you can send them to me via the contact form or by filing an issue, but it might take me a while to get around to them. 10 | 11 | Instructions: 12 | 13 | If the company logo is not in font-awesome: 14 | 15 | - find an SVG logo and add it to [logos.py](https://github.com/katrielalex/fec-filings-analysis/blob/gh-pages/logos.py). You'll probably need to twiddle with the bounding box and colors to make it look ok when rendered 16 | - add the company to the mapping at [the bottom of logos.py](https://github.com/katrielalex/fec-filings-analysis/blob/0aa82e9aeadee2c66b5067139b33a048858555e1/logos.py#L87) 17 | 18 | Either way: 19 | - add the new donations to [donations.yaml](https://github.com/katrielalex/fec-filings-analysis/blob/gh-pages/donations.yaml) 20 | -------------------------------------------------------------------------------- /company_page.jinja2: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 17 | 18 | 19 | 21 | 22 | {{ company.lower() }} donations 23 | 24 | 25 | 26 | 28 | 29 | 30 | 32 | 33 | 34 | 36 | 37 | 38 | 39 | 41 | 42 | 43 | 44 | 45 | 46 | 48 |
49 |
50 |
51 |

52 |        53 | {{ logo }} 54 |

55 |

Did you know that {{ company.title() }} has a PAC which donates money to various US candidates? Including: 56 |

    57 | {% for donation in donations %}
  • {{ donation }}
  • {% endfor %} 58 |
59 |

60 | [ source ] 61 |

62 |

63 | Tell your friends! 64 |

65 |

66 |
67 |
68 |
69 | 70 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /contact.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 17 | 18 | 19 | 21 | 22 | contact donationsfrom.tech 23 | 24 | 25 | 26 | 28 | 29 | 30 | 32 | 33 | 34 | 36 | 37 | 38 | 39 | 41 | 42 | 43 | 44 | 45 | 46 | 48 |
49 |
50 |
51 |

suggestions?

52 |

53 |

54 |
55 |
56 | 57 | 58 |
59 |
60 | 61 | 62 | 63 |
64 |

65 |
66 |
67 |
68 | 69 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site/* 2 | *.html 3 | 4 | # Created by https://www.gitignore.io/api/python,emacs,vim 5 | 6 | ### Emacs ### 7 | # -*- mode: gitignore; -*- 8 | *~ 9 | \#*\# 10 | /.emacs.desktop 11 | /.emacs.desktop.lock 12 | *.elc 13 | auto-save-list 14 | tramp 15 | .\#* 16 | 17 | # Org-mode 18 | .org-id-locations 19 | *_archive 20 | 21 | # flymake-mode 22 | *_flymake.* 23 | 24 | # eshell files 25 | /eshell/history 26 | /eshell/lastdir 27 | 28 | # elpa packages 29 | /elpa/ 30 | 31 | # reftex files 32 | *.rel 33 | 34 | # AUCTeX auto folder 35 | /auto/ 36 | 37 | # cask packages 38 | .cask/ 39 | dist/ 40 | 41 | # Flycheck 42 | flycheck_*.el 43 | 44 | # server auth directory 45 | /server/ 46 | 47 | # projectiles files 48 | .projectile 49 | projectile-bookmarks.eld 50 | 51 | # directory configuration 52 | .dir-locals.el 53 | 54 | # saveplace 55 | places 56 | 57 | # url cache 58 | url/cache/ 59 | 60 | # cedet 61 | ede-projects.el 62 | 63 | # smex 64 | smex-items 65 | 66 | # company-statistics 67 | company-statistics-cache.el 68 | 69 | # anaconda-mode 70 | anaconda-mode/ 71 | 72 | ### Python ### 73 | # Byte-compiled / optimized / DLL files 74 | __pycache__/ 75 | *.py[cod] 76 | *$py.class 77 | 78 | # C extensions 79 | *.so 80 | 81 | # Distribution / packaging 82 | .Python 83 | build/ 84 | develop-eggs/ 85 | downloads/ 86 | eggs/ 87 | .eggs/ 88 | lib/ 89 | lib64/ 90 | parts/ 91 | sdist/ 92 | var/ 93 | wheels/ 94 | *.egg-info/ 95 | .installed.cfg 96 | *.egg 97 | 98 | # PyInstaller 99 | # Usually these files are written by a python script from a template 100 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 101 | *.manifest 102 | *.spec 103 | 104 | # Installer logs 105 | pip-log.txt 106 | pip-delete-this-directory.txt 107 | 108 | # Unit test / coverage reports 109 | htmlcov/ 110 | .tox/ 111 | .coverage 112 | .coverage.* 113 | .cache 114 | .pytest_cache/ 115 | nosetests.xml 116 | coverage.xml 117 | *.cover 118 | .hypothesis/ 119 | 120 | # Translations 121 | *.mo 122 | *.pot 123 | 124 | # Flask stuff: 125 | instance/ 126 | .webassets-cache 127 | 128 | # Scrapy stuff: 129 | .scrapy 130 | 131 | # Sphinx documentation 132 | docs/_build/ 133 | 134 | # PyBuilder 135 | target/ 136 | 137 | # Jupyter Notebook 138 | .ipynb_checkpoints 139 | 140 | # pyenv 141 | .python-version 142 | 143 | # celery beat schedule file 144 | celerybeat-schedule.* 145 | 146 | # SageMath parsed files 147 | *.sage.py 148 | 149 | # Environments 150 | .env 151 | .venv 152 | env/ 153 | venv/ 154 | ENV/ 155 | env.bak/ 156 | venv.bak/ 157 | 158 | # Spyder project settings 159 | .spyderproject 160 | .spyproject 161 | 162 | # Rope project settings 163 | .ropeproject 164 | 165 | # mkdocs documentation 166 | /site 167 | 168 | # mypy 169 | .mypy_cache/ 170 | 171 | ### Vim ### 172 | # swap 173 | .sw[a-p] 174 | .*.sw[a-p] 175 | # session 176 | Session.vim 177 | # temporary 178 | .netrwhist 179 | # auto-generated tag files 180 | tags 181 | 182 | 183 | # End of https://www.gitignore.io/api/python,emacs,vim 184 | -------------------------------------------------------------------------------- /index.jinja2: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 17 | 18 | 19 | 21 | 22 | tech company donations 23 | 24 | 25 | 26 | 28 | 29 | 30 | 32 | 33 | 34 | 36 | 37 | 38 | 39 | 41 | 42 | 43 | 44 | 45 | 46 | 48 |
49 |
50 |
51 |

52 | {% for company, logo in logos.items() %} 53 | {{ logo }}  54 | {% if loop.index0 > 0 and not loop.index0 % 5 %}
{% endif %} 55 | {% endfor %} 56 | 57 |

58 |

59 | In the United States, PACs are allowed to 60 | donate up to $5000 to political candidates each year. Many big tech companies have their 61 | own PAC and donate the maximum allowed. These donations are visible in the public 62 | record, so I looked up some of them. Pick your company above and check it out!

63 |

64 | Didn't realise the company you worked for was doing this? Don't think that your company 65 | should have a PAC? Make your voice heard! 66 |

67 | 68 |

FAQ

69 |

70 |  Everyone else is doing it, why shouldn't we? 71 |
72 | Actually, is doing just 73 | fine without a PAC. 74 |

75 |

76 |  But $MY_COMPANY donates to $SOMEONE as well! 77 |
78 | Two wrongs don't make a right. If they didn't have a PAC at all this wouldn't be a problem. 79 |

80 |

81 |  Why are all the donations so... small? 82 |
83 | Legal 84 | limits on how much PACs can donate. 85 |

86 |

87 |  Can I dig in more? 88 |
Absolutely! Check out the FEC pages (linked from each 89 | company), 90 | or PoliticalModeling.com. 91 |

92 |

93 |  How can I help? 94 |
95 | Pull 96 | requests gratefully accepted, particularly to add more companies! Or 97 | just ping me. 98 |

99 |
100 |
101 |
102 | 103 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /donations.yaml: -------------------------------------------------------------------------------- 1 | facebook: 2 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00502906&min_date=01%2F01%2F2017&max_date=04%2F07%2F2018 3 | donations: 4 | - $5000 to Devin Nunes, the chair of the House Committee on Ethics who is busy dismantling House oversight of the Russia scandal. Yes, that Nunes. 5 | - $5000 to Kevin McCarthy, who doesn't think climate change is real, and managed to get a 0% rating from Planned Parenthood and 100% from the NRA. 6 | - $2500 to Bob Corker, who said that he would support repealing the ACA even if it didn't come with a replacement. 7 | - $2500 to Cory Gardner, who has received a 16% rating from the HRC for supporting LGBTQ-friendly legislation in the 114th congress. 8 | 9 | twitter: 10 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00548065&min_date=01%2F01%2F2017&max_date=04%2F08%2F2018 11 | donations: 12 | - $5000 to Mitch McConnell (yes, that one), who blocked Garland's nomination to the supreme court and then used the nuclear option to nominate Gorsuch. Oh, and he signed the Paris letter too. 13 | - $1000 to Bob Goodlatte, who sponsored SOPA and led the secret GOP effort to dismantle the Office of Congressional Ethics. 14 | 15 | amazon: 16 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00360354&min_date=01%2F01%2F2017&max_date=04%2F07%2F2018 17 | donations: 18 | - $5000 to Paul Ryan. Yes, that Paul Ryan, the one who makes his staffers read Atlas Shrugged. 19 | - $5000 to Kevin McCarthy, who doesn't think climate change is real, and managed to get a 0% rating from Planned Parenthood and 100% from the NRA. 20 | - $2500 to Jason Chaffetz of the House Oversight Committee, who opposes net neutrality and thinks that vaccines cause autism. Oh, and that climate change is a "farce". 21 | 22 | microsoft: 23 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00227546&min_date=01%2F01%2F2017&max_date=04%2F07%2F2018 24 | donations: 25 | - $15000 to Steve Scalise, who has one of "the most anti-LGBT reputations of any lawmaker" and who said he was "like David Duke without the baggage". 26 | - $10000 to Paul Ryan. Yes, that Paul Ryan, the one who makes his staffers read Atlas Shrugged. 27 | - $5000 to Luther Strange, who was one of 22 Senators to sign a letter encouraging the US to withdraw from the Paris agreement and who has an A+ rating from the NRA. 28 | - $5000 to Kevin Cramer, who thinks that school shootings are caused by legalising abortions. 29 | 30 | google: 31 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00428623&min_date=01%2F01%2F2017&max_date=04%2F07%2F2018 32 | donations: 33 | - $6000 to Ted Cruz. Yes, that Ted Cruz, the climate change denier who wants to cut Planned Parenthood funding because "we don't have a rubber shortage in America". 34 | - $9000 to John Barrasso, who received $585,000 from the oil and gas industry and then signed a letter supporting the US withdrawal from the Paris agreement. 35 | - $1000 to Mitch McConnell (yes, that one), who blocked Garland's nomination to the supreme court and then used the nuclear option to nominate Gorsuch. Oh, and he signed the Paris letter too. 36 | - $10000 to Blake Farenthold ("mr ducky pyjamas"), who settled his sexual harassment lawsuit with tax dollars and claimed on CNN that the Democratic Party email hack was an "inside job". 37 | - $1500 to Marco Rubio who not only has an A rating from the NRA, but has also received a 0% rating from the HRC for supporting LGBTQ-friendly legislation in the 114th congress. 38 | 39 | paypal: 40 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00370312&contributor_name=C00581686&min_date=01%2F01%2F2017&max_date=04%2F07%2F2018 41 | donations: 42 | - $5000 to Paul Ryan. Yes, that Paul Ryan, the one who makes his staffers read Atlas Shrugged. 43 | - $2500 to Mike Crapo, who signed a letter supporting the US withdrawal from the Paris agreement. By the way, he also had signs made with "Crāpo" on them, to make sure that everyone pronounces his name right. Wouldn't want you to make that mistake. 44 | - $2000 to Mitch McConnell (yes, that one), who blocked Garland's nomination to the supreme court and then used the nuclear option to nominate Gorsuch. Oh, and he signed the Paris letter too. 45 | 46 | cisco: 47 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00362707&contributor_name=C00617183&min_date=01%2F01%2F2017&max_date=04%2F07%2F2018 48 | donations: 49 | - $7000 to Steve Scalise, who has one of "the most anti-LGBT reputations of any lawmaker" and who said he was "like David Duke without the baggage". 50 | - $10000 to Kevin McCarthy, who doesn't think climate change is real, and managed to get a 0% rating from Planned Parenthood and 100% from the NRA. 51 | - $5000 to Kevin Brady, who voted against making sexual orientation a protected class and introduced a bill to prevent minors from getting prescription contraceptives. 52 | 53 | ebay: 54 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00342394&min_date=01%2F01%2F2017&max_date=04%2F09%2F2018 55 | donations: 56 | - $2500 to Steve Scalise, who has one of "the most anti-LGBT reputations of any lawmaker" and who said he was "like David Duke without the baggage". 57 | - $10000 to Kevin McCarthy, who doesn't think climate change is real, and managed to get a 0% rating from Planned Parenthood and 100% from the NRA. 58 | - $9200 to Orrin Hatch, who was one of 22 Senators to sign a letter encouraging the US to withdraw from the Paris agreement, has an A+ rating from the NRA, and was key in supporting the drastic reduction of Bears Ears National Monument in Utah. 59 | 60 | dell: 61 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00369751&min_date=01%2F01%2F2017&max_date=04%2F07%2F2018 62 | donations: 63 | - $50000 to Paul Ryan. Yes, that Paul Ryan, the one who makes his staffers read Atlas Shrugged. 64 | - $1000 to Bob Goodlatte, who sponsored SOPA and led the secret GOP effort to dismantle the Office of Congressional Ethics. 65 | - $1000 to Devin Nunes, the chair of the House Committee on Ethics who is busy dismantling House oversight of the Russia scandal. 66 | 67 | oracle: 68 | url: https://www.fec.gov/data/receipts/?two_year_transaction_period=2018&data_type=processed&contributor_name=C00323048&min_date=01%2F01%2F2017&max_date=04%2F07%2F2018 69 | donations: 70 | - $2000 to Mitch McConnell (yes, that one), who blocked Garland's nomination to the supreme court and then used the nuclear option to nominate Gorsuch. Oh, and he signed the Paris letter too. 71 | - $2500 to Steve Scalise, who has one of "the most anti-LGBT reputations of any lawmaker" and who said he was "like David Duke without the baggage". 72 | - $1000 to Devin Nunes, the chair of the House Committee on Ethics who is busy dismantling House oversight of the Russia scandal. 73 | - $50000 to Paul Ryan. Yes, that Paul Ryan, the one who makes his staffers read Atlas Shrugged. 74 | -------------------------------------------------------------------------------- /css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | hgroup, 41 | main, 42 | menu, 43 | nav, 44 | section, 45 | summary { 46 | display: block; 47 | } 48 | 49 | /** 50 | * 1. Correct `inline-block` display not defined in IE 8/9. 51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 52 | */ 53 | 54 | audio, 55 | canvas, 56 | progress, 57 | video { 58 | display: inline-block; /* 1 */ 59 | vertical-align: baseline; /* 2 */ 60 | } 61 | 62 | /** 63 | * Prevent modern browsers from displaying `audio` without controls. 64 | * Remove excess height in iOS 5 devices. 65 | */ 66 | 67 | audio:not([controls]) { 68 | display: none; 69 | height: 0; 70 | } 71 | 72 | /** 73 | * Address `[hidden]` styling not present in IE 8/9/10. 74 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. 75 | */ 76 | 77 | [hidden], 78 | template { 79 | display: none; 80 | } 81 | 82 | /* Links 83 | ========================================================================== */ 84 | 85 | /** 86 | * Remove the gray background color from active links in IE 10. 87 | */ 88 | 89 | a { 90 | background-color: transparent; 91 | } 92 | 93 | /** 94 | * Improve readability when focused and also mouse hovered in all browsers. 95 | */ 96 | 97 | a:active, 98 | a:hover { 99 | outline: 0; 100 | } 101 | 102 | /* Text-level semantics 103 | ========================================================================== */ 104 | 105 | /** 106 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 107 | */ 108 | 109 | abbr[title] { 110 | border-bottom: 1px dotted; 111 | } 112 | 113 | /** 114 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 115 | */ 116 | 117 | b, 118 | strong { 119 | font-weight: bold; 120 | } 121 | 122 | /** 123 | * Address styling not present in Safari and Chrome. 124 | */ 125 | 126 | dfn { 127 | font-style: italic; 128 | } 129 | 130 | /** 131 | * Address variable `h1` font-size and margin within `section` and `article` 132 | * contexts in Firefox 4+, Safari, and Chrome. 133 | */ 134 | 135 | h1 { 136 | font-size: 2em; 137 | margin: 0.67em 0; 138 | } 139 | 140 | /** 141 | * Address styling not present in IE 8/9. 142 | */ 143 | 144 | mark { 145 | background: #ff0; 146 | color: #000; 147 | } 148 | 149 | /** 150 | * Address inconsistent and variable font size in all browsers. 151 | */ 152 | 153 | small { 154 | font-size: 80%; 155 | } 156 | 157 | /** 158 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 159 | */ 160 | 161 | sub, 162 | sup { 163 | font-size: 75%; 164 | line-height: 0; 165 | position: relative; 166 | vertical-align: baseline; 167 | } 168 | 169 | sup { 170 | top: -0.5em; 171 | } 172 | 173 | sub { 174 | bottom: -0.25em; 175 | } 176 | 177 | /* Embedded content 178 | ========================================================================== */ 179 | 180 | /** 181 | * Remove border when inside `a` element in IE 8/9/10. 182 | */ 183 | 184 | img { 185 | border: 0; 186 | } 187 | 188 | /** 189 | * Correct overflow not hidden in IE 9/10/11. 190 | */ 191 | 192 | svg:not(:root) { 193 | overflow: hidden; 194 | } 195 | 196 | /* Grouping content 197 | ========================================================================== */ 198 | 199 | /** 200 | * Address margin not present in IE 8/9 and Safari. 201 | */ 202 | 203 | figure { 204 | margin: 1em 40px; 205 | } 206 | 207 | /** 208 | * Address differences between Firefox and other browsers. 209 | */ 210 | 211 | hr { 212 | -moz-box-sizing: content-box; 213 | box-sizing: content-box; 214 | height: 0; 215 | } 216 | 217 | /** 218 | * Contain overflow in all browsers. 219 | */ 220 | 221 | pre { 222 | overflow: auto; 223 | } 224 | 225 | /** 226 | * Address odd `em`-unit font size rendering in all browsers. 227 | */ 228 | 229 | code, 230 | kbd, 231 | pre, 232 | samp { 233 | font-family: monospace, monospace; 234 | font-size: 1em; 235 | } 236 | 237 | /* Forms 238 | ========================================================================== */ 239 | 240 | /** 241 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 242 | * styling of `select`, unless a `border` property is set. 243 | */ 244 | 245 | /** 246 | * 1. Correct color not being inherited. 247 | * Known issue: affects color of disabled elements. 248 | * 2. Correct font properties not being inherited. 249 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 250 | */ 251 | 252 | button, 253 | input, 254 | optgroup, 255 | select, 256 | textarea { 257 | color: inherit; /* 1 */ 258 | font: inherit; /* 2 */ 259 | margin: 0; /* 3 */ 260 | } 261 | 262 | /** 263 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 264 | */ 265 | 266 | button { 267 | overflow: visible; 268 | } 269 | 270 | /** 271 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 272 | * All other form control elements do not inherit `text-transform` values. 273 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 274 | * Correct `select` style inheritance in Firefox. 275 | */ 276 | 277 | button, 278 | select { 279 | text-transform: none; 280 | } 281 | 282 | /** 283 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 284 | * and `video` controls. 285 | * 2. Correct inability to style clickable `input` types in iOS. 286 | * 3. Improve usability and consistency of cursor style between image-type 287 | * `input` and others. 288 | */ 289 | 290 | button, 291 | html input[type="button"], /* 1 */ 292 | input[type="reset"], 293 | input[type="submit"] { 294 | -webkit-appearance: button; /* 2 */ 295 | cursor: pointer; /* 3 */ 296 | } 297 | 298 | /** 299 | * Re-set default cursor for disabled elements. 300 | */ 301 | 302 | button[disabled], 303 | html input[disabled] { 304 | cursor: default; 305 | } 306 | 307 | /** 308 | * Remove inner padding and border in Firefox 4+. 309 | */ 310 | 311 | button::-moz-focus-inner, 312 | input::-moz-focus-inner { 313 | border: 0; 314 | padding: 0; 315 | } 316 | 317 | /** 318 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 319 | * the UA stylesheet. 320 | */ 321 | 322 | input { 323 | line-height: normal; 324 | } 325 | 326 | /** 327 | * It's recommended that you don't attempt to style these elements. 328 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 329 | * 330 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 331 | * 2. Remove excess padding in IE 8/9/10. 332 | */ 333 | 334 | input[type="checkbox"], 335 | input[type="radio"] { 336 | box-sizing: border-box; /* 1 */ 337 | padding: 0; /* 2 */ 338 | } 339 | 340 | /** 341 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 342 | * `font-size` values of the `input`, it causes the cursor style of the 343 | * decrement button to change from `default` to `text`. 344 | */ 345 | 346 | input[type="number"]::-webkit-inner-spin-button, 347 | input[type="number"]::-webkit-outer-spin-button { 348 | height: auto; 349 | } 350 | 351 | /** 352 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 353 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 354 | * (include `-moz` to future-proof). 355 | */ 356 | 357 | input[type="search"] { 358 | -webkit-appearance: textfield; /* 1 */ 359 | -moz-box-sizing: content-box; 360 | -webkit-box-sizing: content-box; /* 2 */ 361 | box-sizing: content-box; 362 | } 363 | 364 | /** 365 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 366 | * Safari (but not Chrome) clips the cancel button when the search input has 367 | * padding (and `textfield` appearance). 368 | */ 369 | 370 | input[type="search"]::-webkit-search-cancel-button, 371 | input[type="search"]::-webkit-search-decoration { 372 | -webkit-appearance: none; 373 | } 374 | 375 | /** 376 | * Define consistent border, margin, and padding. 377 | */ 378 | 379 | fieldset { 380 | border: 1px solid #c0c0c0; 381 | margin: 0 2px; 382 | padding: 0.35em 0.625em 0.75em; 383 | } 384 | 385 | /** 386 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 387 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 388 | */ 389 | 390 | legend { 391 | border: 0; /* 1 */ 392 | padding: 0; /* 2 */ 393 | } 394 | 395 | /** 396 | * Remove default vertical scrollbar in IE 8/9/10/11. 397 | */ 398 | 399 | textarea { 400 | overflow: auto; 401 | } 402 | 403 | /** 404 | * Don't inherit the `font-weight` (applied by a rule above). 405 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 406 | */ 407 | 408 | optgroup { 409 | font-weight: bold; 410 | } 411 | 412 | /* Tables 413 | ========================================================================== */ 414 | 415 | /** 416 | * Remove most spacing between table cells. 417 | */ 418 | 419 | table { 420 | border-collapse: collapse; 421 | border-spacing: 0; 422 | } 423 | 424 | td, 425 | th { 426 | padding: 0; 427 | } 428 | -------------------------------------------------------------------------------- /css/skeleton.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V2.0.4 3 | * Copyright 2014, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 12/29/2014 8 | */ 9 | 10 | 11 | /* Table of contents 12 | –––––––––––––––––––––––––––––––––––––––––––––––––– 13 | - Grid 14 | - Base Styles 15 | - Typography 16 | - Links 17 | - Buttons 18 | - Forms 19 | - Lists 20 | - Code 21 | - Tables 22 | - Spacing 23 | - Utilities 24 | - Clearing 25 | - Media Queries 26 | */ 27 | 28 | 29 | /* Grid 30 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 31 | .container { 32 | position: relative; 33 | width: 100%; 34 | max-width: 960px; 35 | margin: 0 auto; 36 | padding: 0 20px; 37 | box-sizing: border-box; } 38 | .column, 39 | .columns { 40 | width: 100%; 41 | float: left; 42 | box-sizing: border-box; } 43 | 44 | /* For devices larger than 400px */ 45 | @media (min-width: 400px) { 46 | .container { 47 | width: 85%; 48 | padding: 0; } 49 | } 50 | 51 | /* For devices larger than 550px */ 52 | @media (min-width: 550px) { 53 | .container { 54 | width: 80%; } 55 | .column, 56 | .columns { 57 | margin-left: 4%; } 58 | .column:first-child, 59 | .columns:first-child { 60 | margin-left: 0; } 61 | 62 | .one.column, 63 | .one.columns { width: 4.66666666667%; } 64 | .two.columns { width: 13.3333333333%; } 65 | .three.columns { width: 22%; } 66 | .four.columns { width: 30.6666666667%; } 67 | .five.columns { width: 39.3333333333%; } 68 | .six.columns { width: 48%; } 69 | .seven.columns { width: 56.6666666667%; } 70 | .eight.columns { width: 65.3333333333%; } 71 | .nine.columns { width: 74.0%; } 72 | .ten.columns { width: 82.6666666667%; } 73 | .eleven.columns { width: 91.3333333333%; } 74 | .twelve.columns { width: 100%; margin-left: 0; } 75 | 76 | .one-third.column { width: 30.6666666667%; } 77 | .two-thirds.column { width: 65.3333333333%; } 78 | 79 | .one-half.column { width: 48%; } 80 | 81 | /* Offsets */ 82 | .offset-by-one.column, 83 | .offset-by-one.columns { margin-left: 8.66666666667%; } 84 | .offset-by-two.column, 85 | .offset-by-two.columns { margin-left: 17.3333333333%; } 86 | .offset-by-three.column, 87 | .offset-by-three.columns { margin-left: 26%; } 88 | .offset-by-four.column, 89 | .offset-by-four.columns { margin-left: 34.6666666667%; } 90 | .offset-by-five.column, 91 | .offset-by-five.columns { margin-left: 43.3333333333%; } 92 | .offset-by-six.column, 93 | .offset-by-six.columns { margin-left: 52%; } 94 | .offset-by-seven.column, 95 | .offset-by-seven.columns { margin-left: 60.6666666667%; } 96 | .offset-by-eight.column, 97 | .offset-by-eight.columns { margin-left: 69.3333333333%; } 98 | .offset-by-nine.column, 99 | .offset-by-nine.columns { margin-left: 78.0%; } 100 | .offset-by-ten.column, 101 | .offset-by-ten.columns { margin-left: 86.6666666667%; } 102 | .offset-by-eleven.column, 103 | .offset-by-eleven.columns { margin-left: 95.3333333333%; } 104 | 105 | .offset-by-one-third.column, 106 | .offset-by-one-third.columns { margin-left: 34.6666666667%; } 107 | .offset-by-two-thirds.column, 108 | .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } 109 | 110 | .offset-by-one-half.column, 111 | .offset-by-one-half.columns { margin-left: 52%; } 112 | 113 | } 114 | 115 | 116 | /* Base Styles 117 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 118 | /* NOTE 119 | html is set to 62.5% so that all the REM measurements throughout Skeleton 120 | are based on 10px sizing. So basically 1.5rem = 15px :) */ 121 | html { 122 | font-size: 62.5%; } 123 | body { 124 | font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ 125 | line-height: 1.6; 126 | font-weight: 400; 127 | font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; 128 | color: #222; } 129 | 130 | 131 | /* Typography 132 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 133 | h1, h2, h3, h4, h5, h6 { 134 | margin-top: 0; 135 | margin-bottom: 2rem; 136 | font-weight: 300; } 137 | h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} 138 | h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } 139 | h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } 140 | h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } 141 | h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } 142 | h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } 143 | 144 | /* Larger than phablet */ 145 | @media (min-width: 550px) { 146 | h1 { font-size: 5.0rem; } 147 | h2 { font-size: 4.2rem; } 148 | h3 { font-size: 3.6rem; } 149 | h4 { font-size: 3.0rem; } 150 | h5 { font-size: 2.4rem; } 151 | h6 { font-size: 1.5rem; } 152 | } 153 | 154 | p { 155 | margin-top: 0; } 156 | 157 | 158 | /* Links 159 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 160 | a { 161 | color: #1EAEDB; } 162 | a:hover { 163 | color: #0FA0CE; } 164 | 165 | 166 | /* Buttons 167 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 168 | .button, 169 | button, 170 | input[type="submit"], 171 | input[type="reset"], 172 | input[type="button"] { 173 | display: inline-block; 174 | height: 38px; 175 | padding: 0 30px; 176 | color: #555; 177 | text-align: center; 178 | font-size: 11px; 179 | font-weight: 600; 180 | line-height: 38px; 181 | letter-spacing: .1rem; 182 | text-transform: uppercase; 183 | text-decoration: none; 184 | white-space: nowrap; 185 | background-color: transparent; 186 | border-radius: 4px; 187 | border: 1px solid #bbb; 188 | cursor: pointer; 189 | box-sizing: border-box; } 190 | .button:hover, 191 | button:hover, 192 | input[type="submit"]:hover, 193 | input[type="reset"]:hover, 194 | input[type="button"]:hover, 195 | .button:focus, 196 | button:focus, 197 | input[type="submit"]:focus, 198 | input[type="reset"]:focus, 199 | input[type="button"]:focus { 200 | color: #333; 201 | border-color: #888; 202 | outline: 0; } 203 | .button.button-primary, 204 | button.button-primary, 205 | input[type="submit"].button-primary, 206 | input[type="reset"].button-primary, 207 | input[type="button"].button-primary { 208 | color: #FFF; 209 | background-color: #33C3F0; 210 | border-color: #33C3F0; } 211 | .button.button-primary:hover, 212 | button.button-primary:hover, 213 | input[type="submit"].button-primary:hover, 214 | input[type="reset"].button-primary:hover, 215 | input[type="button"].button-primary:hover, 216 | .button.button-primary:focus, 217 | button.button-primary:focus, 218 | input[type="submit"].button-primary:focus, 219 | input[type="reset"].button-primary:focus, 220 | input[type="button"].button-primary:focus { 221 | color: #FFF; 222 | background-color: #1EAEDB; 223 | border-color: #1EAEDB; } 224 | 225 | 226 | /* Forms 227 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 228 | input[type="email"], 229 | input[type="number"], 230 | input[type="search"], 231 | input[type="text"], 232 | input[type="tel"], 233 | input[type="url"], 234 | input[type="password"], 235 | textarea, 236 | select { 237 | height: 38px; 238 | padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ 239 | background-color: #fff; 240 | border: 1px solid #D1D1D1; 241 | border-radius: 4px; 242 | box-shadow: none; 243 | box-sizing: border-box; } 244 | /* Removes awkward default styles on some inputs for iOS */ 245 | input[type="email"], 246 | input[type="number"], 247 | input[type="search"], 248 | input[type="text"], 249 | input[type="tel"], 250 | input[type="url"], 251 | input[type="password"], 252 | textarea { 253 | -webkit-appearance: none; 254 | -moz-appearance: none; 255 | appearance: none; } 256 | textarea { 257 | min-height: 65px; 258 | padding-top: 6px; 259 | padding-bottom: 6px; } 260 | input[type="email"]:focus, 261 | input[type="number"]:focus, 262 | input[type="search"]:focus, 263 | input[type="text"]:focus, 264 | input[type="tel"]:focus, 265 | input[type="url"]:focus, 266 | input[type="password"]:focus, 267 | textarea:focus, 268 | select:focus { 269 | border: 1px solid #33C3F0; 270 | outline: 0; } 271 | label, 272 | legend { 273 | display: block; 274 | margin-bottom: .5rem; 275 | font-weight: 600; } 276 | fieldset { 277 | padding: 0; 278 | border-width: 0; } 279 | input[type="checkbox"], 280 | input[type="radio"] { 281 | display: inline; } 282 | label > .label-body { 283 | display: inline-block; 284 | margin-left: .5rem; 285 | font-weight: normal; } 286 | 287 | 288 | /* Lists 289 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 290 | ul { 291 | list-style: circle inside; } 292 | ol { 293 | list-style: decimal inside; } 294 | ol, ul { 295 | padding-left: 0; 296 | margin-top: 0; } 297 | ul ul, 298 | ul ol, 299 | ol ol, 300 | ol ul { 301 | margin: 1.5rem 0 1.5rem 3rem; 302 | font-size: 90%; } 303 | li { 304 | margin-bottom: 1rem; } 305 | 306 | 307 | /* Code 308 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 309 | code { 310 | padding: .2rem .5rem; 311 | margin: 0 .2rem; 312 | font-size: 90%; 313 | white-space: nowrap; 314 | background: #F1F1F1; 315 | border: 1px solid #E1E1E1; 316 | border-radius: 4px; } 317 | pre > code { 318 | display: block; 319 | padding: 1rem 1.5rem; 320 | white-space: pre; } 321 | 322 | 323 | /* Tables 324 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 325 | th, 326 | td { 327 | padding: 12px 15px; 328 | text-align: left; 329 | border-bottom: 1px solid #E1E1E1; } 330 | th:first-child, 331 | td:first-child { 332 | padding-left: 0; } 333 | th:last-child, 334 | td:last-child { 335 | padding-right: 0; } 336 | 337 | 338 | /* Spacing 339 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 340 | button, 341 | .button { 342 | margin-bottom: 1rem; } 343 | input, 344 | textarea, 345 | select, 346 | fieldset { 347 | margin-bottom: 1.5rem; } 348 | pre, 349 | blockquote, 350 | dl, 351 | figure, 352 | table, 353 | p, 354 | ul, 355 | ol, 356 | form { 357 | margin-bottom: 2.5rem; } 358 | 359 | 360 | /* Utilities 361 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 362 | .u-full-width { 363 | width: 100%; 364 | box-sizing: border-box; } 365 | .u-max-full-width { 366 | max-width: 100%; 367 | box-sizing: border-box; } 368 | .u-pull-right { 369 | float: right; } 370 | .u-pull-left { 371 | float: left; } 372 | 373 | 374 | /* Misc 375 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 376 | hr { 377 | margin-top: 3rem; 378 | margin-bottom: 3.5rem; 379 | border-width: 0; 380 | border-top: 1px solid #E1E1E1; } 381 | 382 | 383 | /* Clearing 384 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 385 | 386 | /* Self Clearing Goodness */ 387 | .container:after, 388 | .row:after, 389 | .u-cf { 390 | content: ""; 391 | display: table; 392 | clear: both; } 393 | 394 | 395 | /* Media Queries 396 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 397 | /* 398 | Note: The best way to structure the use of media queries is to create the queries 399 | near the relevant code. For example, if you wanted to change the styles for buttons 400 | on small devices, paste the mobile query code up in the buttons section and style it 401 | there. 402 | */ 403 | 404 | 405 | /* Larger than mobile */ 406 | @media (min-width: 400px) {} 407 | 408 | /* Larger than phablet (also point when grid becomes active) */ 409 | @media (min-width: 550px) {} 410 | 411 | /* Larger than tablet */ 412 | @media (min-width: 750px) {} 413 | 414 | /* Larger than desktop */ 415 | @media (min-width: 1000px) {} 416 | 417 | /* Larger than Desktop HD */ 418 | @media (min-width: 1200px) {} 419 | -------------------------------------------------------------------------------- /logos.py: -------------------------------------------------------------------------------- 1 | CISCO_SVG = """ 40 | """ 41 | 42 | DELL_SVG = """ 54 | """ 55 | 56 | EBAY_SVG = """ """ 84 | 85 | ORACLE_SVG = """ """ 86 | 87 | custom_logos = dict(cisco=CISCO_SVG, ebay=EBAY_SVG, dell=DELL_SVG, oracle=ORACLE_SVG) 88 | --------------------------------------------------------------------------------