├── .gitignore ├── README.md ├── deploy ├── public ├── assets │ ├── css │ │ ├── font-awesome.min.css │ │ ├── ie8.css │ │ ├── ie9.css │ │ ├── images │ │ │ ├── arrow_cap.png │ │ │ ├── footer.svg │ │ │ ├── header.svg │ │ │ ├── image-wrapper.svg │ │ │ ├── navPanel.svg │ │ │ └── overlay.png │ │ └── main.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── js │ │ ├── ie │ │ │ ├── PIE.htc │ │ │ ├── backgroundsize.min.htc │ │ │ ├── html5shiv.js │ │ │ └── respond.min.js │ │ ├── jquery.dropotron.min.js │ │ ├── jquery.min.js │ │ ├── main.js │ │ ├── skel.min.js │ │ └── util.js │ └── sass │ │ ├── ie8.scss │ │ ├── ie9.scss │ │ ├── libs │ │ ├── _functions.scss │ │ ├── _mixins.scss │ │ ├── _skel.scss │ │ └── _vars.scss │ │ └── main.scss ├── favicon.ico ├── favicon.png ├── images │ ├── build_server.png │ ├── deploy_social.png │ ├── fabric.png │ ├── fabric_nobg.png │ ├── logo.png │ ├── pic01.jpg │ ├── pic02.jpg │ ├── pic03.jpg │ ├── pic04.jpg │ ├── pic05.jpg │ ├── pic06.jpg │ ├── pic07.jpg │ ├── promo.jpg │ └── ssh.png └── index.html └── publish.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | ._* 4 | design 5 | assets/.sass-cache 6 | .venv 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Marketing website for Deploy! video series 2 | -------------------------------------------------------------------------------- /deploy: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | source .venv/bin/activate 4 | 5 | aws s3 sync ./public s3://deploy.serversforhackers.com/ --exclude=".DS_Store" --exclude="*.DS_Store" 6 | -------------------------------------------------------------------------------- /public/assets/css/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} -------------------------------------------------------------------------------- /public/assets/css/ie8.css: -------------------------------------------------------------------------------- 1 | /* 2 | Telephasic by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /* Basic */ 8 | 9 | form input[type="text"], 10 | form input[type="email"], 11 | form input[type="password"], 12 | form select, 13 | form textarea { 14 | position: relative; 15 | -ms-behavior: url("assets/js/ie/PIE.htc"); 16 | } 17 | 18 | input[type="button"], 19 | input[type="submit"], 20 | input[type="reset"], 21 | button, 22 | .button { 23 | position: relative; 24 | -ms-behavior: url("assets/js/ie/PIE.htc"); 25 | } 26 | 27 | /* Promo */ 28 | 29 | #promo { 30 | position: relative; 31 | -ms-behavior: url("assets/js/ie/PIE.htc"); 32 | } 33 | 34 | /* Section/Article */ 35 | 36 | section > .last-child, 37 | article > .last-child, 38 | section.last-child, 39 | article.last-child { 40 | margin-bottom: 0; 41 | } 42 | 43 | /* Wrappers */ 44 | 45 | #promo-wrapper { 46 | background: url("../../images/promo.jpg"); 47 | background-size: cover; 48 | -ms-behavior: url("assets/js/ie/backgroundsize.min.htc"); 49 | } 50 | 51 | /* Header */ 52 | 53 | #logo a { 54 | position: relative; 55 | -ms-behavior: url("assets/js/ie/PIE.htc"); 56 | } 57 | 58 | /* Nav */ 59 | 60 | #nav > ul > li > span, #nav > ul > li > a { 61 | position: relative; 62 | -ms-behavior: url("assets/js/ie/PIE.htc"); 63 | } 64 | 65 | .dropotron { 66 | position: relative; 67 | box-shadow: none !important; 68 | -ms-behavior: url("assets/js/ie/PIE.htc"); 69 | } 70 | 71 | .dropotron.level-0 { 72 | box-shadow: none !important; 73 | } 74 | 75 | .dropotron.level-0:before { 76 | display: none; 77 | } -------------------------------------------------------------------------------- /public/assets/css/ie9.css: -------------------------------------------------------------------------------- 1 | /* 2 | Telephasic by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /* Wrappers */ 8 | 9 | #header-wrapper { 10 | background-image: none; 11 | } -------------------------------------------------------------------------------- /public/assets/css/images/arrow_cap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/assets/css/images/arrow_cap.png -------------------------------------------------------------------------------- /public/assets/css/images/footer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/assets/css/images/header.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/assets/css/images/image-wrapper.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /public/assets/css/images/navPanel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/assets/css/images/overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/assets/css/images/overlay.png -------------------------------------------------------------------------------- /public/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /public/assets/js/ie/PIE.htc: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 96 | 97 | -------------------------------------------------------------------------------- /public/assets/js/ie/backgroundsize.min.htc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/js/ie/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); 8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d #mq-test-1 { width: 42px; }',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b1)for(n=0;n0&&i.add(d).on("mouseleave",function(){window[m](at),at=window.setTimeout(function(){i[o](f)},et.hideDelay)}),i[u]()[W]()[a](et.menuClass)[C](s,N).on("mouseenter",function(){window[m](at)}).on(x,function(){var n,u,p,v,E,S,x,_,D,P,B;if(i.is(T))return l;window[m](at),nt.each(function(){var t=e(this);e.contains(t.get(0),d.get(0))||t[o](f)}),n=d[X](),u=d[s](),p=d[y]()[s](),v=d[c](),E=i[c](),S=i[C](F)==et[A];if(S){et[V]?x=n:x=u,P=x.top+d.outerHeight()+et.globalOffsetY,_=et[M],i[h](r)[h](g)[h](k);switch(et[M]){case g:D=x[r]-E+v,D<0&&(D=x[r],_=r);break;case k:D=x[r]-Math.floor((E-v)/2),D<0?(D=x[r],_=r):D+E>st.width()&&(D=x[r]-E+v,_=g);break;case r:default:D=x[r],D+E>st.width()&&(D=x[r]-E+v,_=g)}i[a](_)}else{d[C](s)==H||d[C](s)==N?(P=et.offsetY,D=-1*u[r]):(P=u.top+et.offsetY,D=0);switch(et[M]){case g:D+=-1*d[y]()[c]()+et[O];break;case k:case r:default:D+=d[y]()[c]()+et[O]}}navigator.userAgent.match(/MSIE ([0-9]+)\./)&&RegExp.$1<8&&(D+=et.IEOffsetX,P+=et.IEOffsetY),i[C](r,D+U)[C]("top",P+U)[C](I,"0.01").show(),B=l,d[C](s)==H||d[C](s)==N?D=-1*u[r]:D=0,i[X]()[r]<0?(D+=d[y]()[c]()-et[O],B=b):i[X]()[r]+E>st.width()&&(D+=-1*d[y]()[c]()-et[O],B=b),B&&i[C](r,D+U),i[W]()[C](I,"1");switch(et.mode){case"zoom":ot=b,d[a](et[t]),i.animate({width:L,height:L},et[w],et.easing,function(){ot=l});break;case"slide":ot=b,d[a](et[t]),i.animate({height:L},et[w],et.easing,function(){ot=l});break;case"fade":ot=b,S&&!et.noOpenerFade?(et[w]=="slow"?B=80:et[w]==$?B=40:B=Math.floor(et[w]/2),d.fadeTo(B,.01,function(){d[a](et[t]),d.fadeTo(et[w],1),i.fadeIn(et[w],function(){ot=l})})):(d[a](et[t]),d.fadeTo(et[w],1),i.fadeIn(et[w],function(){ot=l}));break;case"instant":default:d[a](et[t]),i.show()}return l}).on(f,function(){return i.is(T)?(i[W](),d[h](et[t]),i[q]("."+et[t])[h](et[t]),i[q](j)[W](),l):l}).on(B,function(){return i.is(T)?i[o](f):i[o](x),l}),d[u]()[a](R)[C]("cursor","pointer").on(n,function(e){if(ot)return;e[p](),e[S](),i[o](B)}),et.expandMode==P&&d[P](function(){if(ot)return;ut=window.setTimeout(function(){i[o](x)},et.hoverDelay)},function(){window[m](ut)})}),nt[q]("a")[C]("display","block").on(n,function(t){if(ot)return;e(this).attr("href")[d]<1&&t[p]()}),tt[q]("li")[C]("white-space","nowrap").each(function(){var t=e(this),r=t[D]("a"),s=t[D](j),u=r.attr("href");r.on(n,function(e){u[d]==0||u=="#"?e[p]():e[S]()}),r[d]>0&&s[d]==0&&t.on(n,function(e){if(ot)return;tt[o](i),e[S]()})}),tt[D]("li").each(function(){var t,n,r,i,s=e(this),o=s[D](j);if(o[d]>0){et[V]&&(et.cloneOnDetach&&(t=o.clone(),t.attr("class","")[W]().appendTo(o[y]())),o[V]().appendTo(rt));for(n=et[A],r=1,i=o;i[d]>0;r++)i[C](F,n++),et[_]&&i[a](et[_]+(n-1-et[A])),i=i[q]("> li > ul")}}),st.on("scroll",function(){tt[o](i)}).on("keypress",function(e){!ot&&e.keyCode==27&&(e[p](),tt[o](i))}),it.on(n,function(){ot||tt[o](i)})}})(jQuery); -------------------------------------------------------------------------------- /public/assets/js/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | Telephasic by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | (function($) { 8 | 9 | skel.breakpoints({ 10 | normal: '(max-width: 1280px)', 11 | narrow: '(max-width: 1080px)', 12 | narrower: '(max-width: 820px)', 13 | mobile: '(max-width: 736px)', 14 | mobilep: '(max-width: 480px)' 15 | }); 16 | 17 | $(function() { 18 | 19 | var $window = $(window), 20 | $body = $('body'); 21 | 22 | // Disable animations/transitions until the page has loaded. 23 | $body.addClass('is-loading'); 24 | 25 | $window.on('load', function() { 26 | $body.removeClass('is-loading'); 27 | }); 28 | 29 | // Fix: Placeholder polyfill. 30 | $('form').placeholder(); 31 | 32 | // Prioritize "important" elements on narrower. 33 | skel.on('+narrower -narrower', function() { 34 | $.prioritize( 35 | '.important\\28 narrower\\29', 36 | skel.breakpoint('narrower').active 37 | ); 38 | }); 39 | 40 | // CSS polyfills (IE<9). 41 | if (skel.vars.IEVersion < 9) 42 | $(':last-child').addClass('last-child'); 43 | 44 | // Dropdowns. 45 | $('#nav > ul').dropotron({ 46 | mode: 'fade', 47 | speed: 300, 48 | alignment: 'center', 49 | noOpenerFade: true 50 | }); 51 | 52 | // Off-Canvas Navigation. 53 | 54 | /* 55 | // Navigation Button. 56 | $( 57 | '' 60 | ) 61 | .appendTo($body); 62 | 63 | // Navigation Panel. 64 | $( 65 | '' 71 | ) 72 | .appendTo($body) 73 | .panel({ 74 | delay: 500, 75 | hideOnClick: true, 76 | resetScroll: true, 77 | resetForms: true, 78 | side: 'top', 79 | target: $body, 80 | visibleClass: 'navPanel-visible' 81 | }); 82 | */ 83 | // Fix: Remove navPanel transitions on WP<10 (poor/buggy performance). 84 | if (skel.vars.os == 'wp' && skel.vars.osVersion < 10) 85 | $('#navButton, #navPanel, #page-wrapper') 86 | .css('transition', 'none'); 87 | 88 | }); 89 | 90 | })(jQuery); -------------------------------------------------------------------------------- /public/assets/js/skel.min.js: -------------------------------------------------------------------------------- 1 | /* skel.js v3.0.0-dev | (c) n33 | skel.io | MIT licensed */ 2 | var skel=function(){"use strict";var t={breakpointIds:null,events:{},isInit:!1,obj:{attachments:{},breakpoints:{},head:null,states:{}},sd:"/",state:null,stateHandlers:{},stateId:"",vars:{},DOMReady:null,indexOf:null,isArray:null,iterate:null,matchesMedia:null,extend:function(e,n){t.iterate(n,function(i){t.isArray(n[i])?(t.isArray(e[i])||(e[i]=[]),t.extend(e[i],n[i])):"object"==typeof n[i]?("object"!=typeof e[i]&&(e[i]={}),t.extend(e[i],n[i])):e[i]=n[i]})},newStyle:function(t){var e=document.createElement("style");return e.type="text/css",e.innerHTML=t,e},_canUse:null,canUse:function(e){t._canUse||(t._canUse=document.createElement("div"));var n=t._canUse.style,i=e.charAt(0).toUpperCase()+e.slice(1);return e in n||"Moz"+i in n||"Webkit"+i in n||"O"+i in n||"ms"+i in n},on:function(e,n){var i=e.split(/[\s]+/);return t.iterate(i,function(e){var a=i[e];if(t.isInit){if("init"==a)return void n();if("change"==a)n();else{var r=a.charAt(0);if("+"==r||"!"==r){var o=a.substring(1);if(o in t.obj.breakpoints)if("+"==r&&t.obj.breakpoints[o].active)n();else if("!"==r&&!t.obj.breakpoints[o].active)return void n()}}}t.events[a]||(t.events[a]=[]),t.events[a].push(n)}),t},trigger:function(e){return t.events[e]&&0!=t.events[e].length?(t.iterate(t.events[e],function(n){t.events[e][n]()}),t):void 0},breakpoint:function(e){return t.obj.breakpoints[e]},breakpoints:function(e){function n(t,e){this.name=this.id=t,this.media=e,this.active=!1,this.wasActive=!1}return n.prototype.matches=function(){return t.matchesMedia(this.media)},n.prototype.sync=function(){this.wasActive=this.active,this.active=this.matches()},t.iterate(e,function(i){t.obj.breakpoints[i]=new n(i,e[i])}),window.setTimeout(function(){t.poll()},0),t},addStateHandler:function(e,n){t.stateHandlers[e]=n},callStateHandler:function(e){var n=t.stateHandlers[e]();t.iterate(n,function(e){t.state.attachments.push(n[e])})},changeState:function(e){t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].sync()}),t.vars.lastStateId=t.stateId,t.stateId=e,t.breakpointIds=t.stateId===t.sd?[]:t.stateId.substring(1).split(t.sd),t.obj.states[t.stateId]?t.state=t.obj.states[t.stateId]:(t.obj.states[t.stateId]={attachments:[]},t.state=t.obj.states[t.stateId],t.iterate(t.stateHandlers,t.callStateHandler)),t.detachAll(t.state.attachments),t.attachAll(t.state.attachments),t.vars.stateId=t.stateId,t.vars.state=t.state,t.trigger("change"),t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].active?t.obj.breakpoints[e].wasActive||t.trigger("+"+e):t.obj.breakpoints[e].wasActive&&t.trigger("-"+e)})},generateStateConfig:function(e,n){var i={};return t.extend(i,e),t.iterate(t.breakpointIds,function(e){t.extend(i,n[t.breakpointIds[e]])}),i},getStateId:function(){var e="";return t.iterate(t.obj.breakpoints,function(n){var i=t.obj.breakpoints[n];i.matches()&&(e+=t.sd+i.id)}),e},poll:function(){var e="";e=t.getStateId(),""===e&&(e=t.sd),e!==t.stateId&&t.changeState(e)},_attach:null,attach:function(e){var n=t.obj.head,i=e.element;return i.parentNode&&i.parentNode.tagName?!1:(t._attach||(t._attach=n.firstChild),n.insertBefore(i,t._attach.nextSibling),e.permanent&&(t._attach=i),!0)},attachAll:function(e){var n=[];t.iterate(e,function(t){n[e[t].priority]||(n[e[t].priority]=[]),n[e[t].priority].push(e[t])}),n.reverse(),t.iterate(n,function(e){t.iterate(n[e],function(i){t.attach(n[e][i])})})},detach:function(t){var e=t.element;return t.permanent||!e.parentNode||e.parentNode&&!e.parentNode.tagName?!1:(e.parentNode.removeChild(e),!0)},detachAll:function(e){var n={};t.iterate(e,function(t){n[e[t].id]=!0}),t.iterate(t.obj.attachments,function(e){e in n||t.detach(t.obj.attachments[e])})},attachment:function(e){return e in t.obj.attachments?t.obj.attachments[e]:null},newAttachment:function(e,n,i,a){return t.obj.attachments[e]={id:e,element:n,priority:i,permanent:a}},init:function(){t.initMethods(),t.initVars(),t.initEvents(),t.obj.head=document.getElementsByTagName("head")[0],t.isInit=!0,t.trigger("init")},initEvents:function(){t.on("resize",function(){t.poll()}),t.on("orientationChange",function(){t.poll()}),t.DOMReady(function(){t.trigger("ready")}),window.onload&&t.on("load",window.onload),window.onload=function(){t.trigger("load")},window.onresize&&t.on("resize",window.onresize),window.onresize=function(){t.trigger("resize")},window.onorientationchange&&t.on("orientationChange",window.onorientationchange),window.onorientationchange=function(){t.trigger("orientationChange")}},initMethods:function(){document.addEventListener?!function(e,n){t.DOMReady=n()}("domready",function(){function t(t){for(r=1;t=n.shift();)t()}var e,n=[],i=document,a="DOMContentLoaded",r=/^loaded|^c/.test(i.readyState);return i.addEventListener(a,e=function(){i.removeEventListener(a,e),t()}),function(t){r?t():n.push(t)}}):!function(e,n){t.DOMReady=n()}("domready",function(t){function e(t){for(h=1;t=i.shift();)t()}var n,i=[],a=!1,r=document,o=r.documentElement,s=o.doScroll,c="DOMContentLoaded",d="addEventListener",u="onreadystatechange",l="readyState",f=s?/^loaded|^c/:/^loaded|c/,h=f.test(r[l]);return r[d]&&r[d](c,n=function(){r.removeEventListener(c,n,a),e()},a),s&&r.attachEvent(u,n=function(){/^c/.test(r[l])&&(r.detachEvent(u,n),e())}),t=s?function(e){self!=top?h?e():i.push(e):function(){try{o.doScroll("left")}catch(n){return setTimeout(function(){t(e)},50)}e()}()}:function(t){h?t():i.push(t)}}),t.indexOf=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){if("string"==typeof t)return t.indexOf(e);var n,i,a=e?e:0;if(!this)throw new TypeError;if(i=this.length,0===i||a>=i)return-1;for(0>a&&(a=i-Math.abs(a)),n=a;i>n;n++)if(this[n]===t)return n;return-1},t.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},t.iterate=Object.keys?function(t,e){if(!t)return[];var n,i=Object.keys(t);for(n=0;i[n]&&e(i[n],t[i[n]])!==!1;n++);}:function(t,e){if(!t)return[];var n;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])===!1)break},t.matchesMedia=window.matchMedia?function(t){return""==t?!0:window.matchMedia(t).matches}:window.styleMedia||window.media?function(t){if(""==t)return!0;var e=window.styleMedia||window.media;return e.matchMedium(t||"all")}:window.getComputedStyle?function(t){if(""==t)return!0;var e=document.createElement("style"),n=document.getElementsByTagName("script")[0],i=null;e.type="text/css",e.id="matchmediajs-test",n.parentNode.insertBefore(e,n),i="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle;var a="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=a:e.textContent=a,"1px"===i.width}:function(t){if(""==t)return!0;var e,n,i,a,r={"min-width":null,"max-width":null},o=!1;n=t.split(/\s+and\s+/);for(a in n)e=n[a],"("==e.charAt(0)&&(e=e.substring(1,e.length-1),i=e.split(/:\s+/),2==i.length&&(r[i[0].replace(/^\s+|\s+$/g,"")]=parseInt(i[1]),o=!0));if(!o)return!1;var s=document.documentElement.clientWidth,c=document.documentElement.clientHeight;return null!==r["min-width"]&&sr["max-width"]||null!==r["min-height"]&&cr["max-height"]?!1:!0},navigator.userAgent.match(/MSIE ([0-9]+)/)&&RegExp.$1<9&&(t.newStyle=function(t){var e=document.createElement("span");return e.innerHTML=' ",e})},initVars:function(){var e,n,i,a=navigator.userAgent;e="other",n=0,i=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(RegExp.$1),!1):void 0}),t.vars.browser=e,t.vars.browserVersion=n,e="other",n=0,i=[["ios",/([0-9_]+) like Mac OS X/,function(t){return t.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(t){return 0}],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(t){return t.replace("_",".").replace("_","")}],["wp",/Windows Phone ([0-9\.]+)/,null],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(i[2]?i[2](RegExp.$1):RegExp.$1),!1):void 0}),t.vars.os=e,t.vars.osVersion=n,t.vars.IEVersion="ie"==t.vars.browser?t.vars.browserVersion:99,t.vars.touch="wp"==t.vars.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),t.vars.mobile="wp"==t.vars.os||"android"==t.vars.os||"ios"==t.vars.os||"bb"==t.vars.os}};return t.init(),t}();!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?module.exports=e():t.skel=e()}(this,function(){return skel}); -------------------------------------------------------------------------------- /public/assets/js/util.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | /** 4 | * Generate an indented list of links from a nav. Meant for use with panel(). 5 | * @return {jQuery} jQuery object. 6 | */ 7 | $.fn.navList = function() { 8 | 9 | var $this = $(this); 10 | $a = $this.find('a'), 11 | b = []; 12 | 13 | $a.each(function() { 14 | 15 | var $this = $(this), 16 | indent = Math.max(0, $this.parents('li').length - 1), 17 | href = $this.attr('href'), 18 | target = $this.attr('target'); 19 | 20 | b.push( 21 | '' + 26 | '' + 27 | $this.text() + 28 | '' 29 | ); 30 | 31 | }); 32 | 33 | return b.join(''); 34 | 35 | }; 36 | 37 | /** 38 | * Panel-ify an element. 39 | * @param {object} userConfig User config. 40 | * @return {jQuery} jQuery object. 41 | */ 42 | $.fn.panel = function(userConfig) { 43 | 44 | // No elements? 45 | if (this.length == 0) 46 | return $this; 47 | 48 | // Multiple elements? 49 | if (this.length > 1) { 50 | 51 | for (var i=0; i < this.length; i++) 52 | $(this[i]).panel(userConfig); 53 | 54 | return $this; 55 | 56 | } 57 | 58 | // Vars. 59 | var $this = $(this), 60 | $body = $('body'), 61 | $window = $(window), 62 | id = $this.attr('id'), 63 | config; 64 | 65 | // Config. 66 | config = $.extend({ 67 | 68 | // Delay. 69 | delay: 0, 70 | 71 | // Hide panel on link click. 72 | hideOnClick: false, 73 | 74 | // Hide panel on escape keypress. 75 | hideOnEscape: false, 76 | 77 | // Hide panel on swipe. 78 | hideOnSwipe: false, 79 | 80 | // Reset scroll position on hide. 81 | resetScroll: false, 82 | 83 | // Reset forms on hide. 84 | resetForms: false, 85 | 86 | // Side of viewport the panel will appear. 87 | side: null, 88 | 89 | // Target element for "class". 90 | target: $this, 91 | 92 | // Class to toggle. 93 | visibleClass: 'visible' 94 | 95 | }, userConfig); 96 | 97 | // Expand "target" if it's not a jQuery object already. 98 | if (typeof config.target != 'jQuery') 99 | config.target = $(config.target); 100 | 101 | // Panel. 102 | 103 | // Methods. 104 | $this._hide = function(event) { 105 | 106 | // Already hidden? Bail. 107 | if (!config.target.hasClass(config.visibleClass)) 108 | return; 109 | 110 | // If an event was provided, cancel it. 111 | if (event) { 112 | 113 | event.preventDefault(); 114 | event.stopPropagation(); 115 | 116 | } 117 | 118 | // Hide. 119 | config.target.removeClass(config.visibleClass); 120 | 121 | // Post-hide stuff. 122 | window.setTimeout(function() { 123 | 124 | // Reset scroll position. 125 | if (config.resetScroll) 126 | $this.scrollTop(0); 127 | 128 | // Reset forms. 129 | if (config.resetForms) 130 | $this.find('form').each(function() { 131 | this.reset(); 132 | }); 133 | 134 | }, config.delay); 135 | 136 | }; 137 | 138 | // Vendor fixes. 139 | $this 140 | .css('-ms-overflow-style', '-ms-autohiding-scrollbar') 141 | .css('-webkit-overflow-scrolling', 'touch'); 142 | 143 | // Hide on click. 144 | if (config.hideOnClick) { 145 | 146 | $this.find('a') 147 | .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); 148 | 149 | $this 150 | .on('click', 'a', function(event) { 151 | 152 | var $a = $(this), 153 | href = $a.attr('href'), 154 | target = $a.attr('target'); 155 | 156 | if (!href || href == '#' || href == '' || href == '#' + id) 157 | return; 158 | 159 | // Cancel original event. 160 | event.preventDefault(); 161 | event.stopPropagation(); 162 | 163 | // Hide panel. 164 | $this._hide(); 165 | 166 | // Redirect to href. 167 | window.setTimeout(function() { 168 | 169 | if (target == '_blank') 170 | window.open(href); 171 | else 172 | window.location.href = href; 173 | 174 | }, config.delay + 10); 175 | 176 | }); 177 | 178 | } 179 | 180 | // Event: Touch stuff. 181 | $this.on('touchstart', function(event) { 182 | 183 | $this.touchPosX = event.originalEvent.touches[0].pageX; 184 | $this.touchPosY = event.originalEvent.touches[0].pageY; 185 | 186 | }) 187 | 188 | $this.on('touchmove', function(event) { 189 | 190 | if ($this.touchPosX === null 191 | || $this.touchPosY === null) 192 | return; 193 | 194 | var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX, 195 | diffY = $this.touchPosY - event.originalEvent.touches[0].pageY, 196 | th = $this.outerHeight(), 197 | ts = ($this.get(0).scrollHeight - $this.scrollTop()); 198 | 199 | // Hide on swipe? 200 | if (config.hideOnSwipe) { 201 | 202 | var result = false, 203 | boundary = 20, 204 | delta = 50; 205 | 206 | switch (config.side) { 207 | 208 | case 'left': 209 | result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta); 210 | break; 211 | 212 | case 'right': 213 | result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta)); 214 | break; 215 | 216 | case 'top': 217 | result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta); 218 | break; 219 | 220 | case 'bottom': 221 | result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta)); 222 | break; 223 | 224 | default: 225 | break; 226 | 227 | } 228 | 229 | if (result) { 230 | 231 | $this.touchPosX = null; 232 | $this.touchPosY = null; 233 | $this._hide(); 234 | 235 | return false; 236 | 237 | } 238 | 239 | } 240 | 241 | // Prevent vertical scrolling past the top or bottom. 242 | if (($this.scrollTop() < 0 && diffY < 0) 243 | || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) { 244 | 245 | event.preventDefault(); 246 | event.stopPropagation(); 247 | 248 | } 249 | 250 | }); 251 | 252 | // Event: Prevent certain events inside the panel from bubbling. 253 | $this.on('click touchend touchstart touchmove', function(event) { 254 | event.stopPropagation(); 255 | }); 256 | 257 | // Event: Hide panel if a child anchor tag pointing to its ID is clicked. 258 | $this.on('click', 'a[href="#' + id + '"]', function(event) { 259 | 260 | event.preventDefault(); 261 | event.stopPropagation(); 262 | 263 | config.target.removeClass(config.visibleClass); 264 | 265 | }); 266 | 267 | // Body. 268 | 269 | // Event: Hide panel on body click/tap. 270 | $body.on('click touchend', function(event) { 271 | $this._hide(event); 272 | }); 273 | 274 | // Event: Toggle. 275 | $body.on('click', 'a[href="#' + id + '"]', function(event) { 276 | 277 | event.preventDefault(); 278 | event.stopPropagation(); 279 | 280 | config.target.toggleClass(config.visibleClass); 281 | 282 | }); 283 | 284 | // Window. 285 | 286 | // Event: Hide on ESC. 287 | if (config.hideOnEscape) 288 | $window.on('keydown', function(event) { 289 | 290 | if (event.keyCode == 27) 291 | $this._hide(event); 292 | 293 | }); 294 | 295 | return $this; 296 | 297 | }; 298 | 299 | /** 300 | * Apply "placeholder" attribute polyfill to one or more forms. 301 | * @return {jQuery} jQuery object. 302 | */ 303 | $.fn.placeholder = function() { 304 | 305 | // Browser natively supports placeholders? Bail. 306 | if (typeof (document.createElement('input')).placeholder != 'undefined') 307 | return $(this); 308 | 309 | // No elements? 310 | if (this.length == 0) 311 | return $this; 312 | 313 | // Multiple elements? 314 | if (this.length > 1) { 315 | 316 | for (var i=0; i < this.length; i++) 317 | $(this[i]).placeholder(); 318 | 319 | return $this; 320 | 321 | } 322 | 323 | // Vars. 324 | var $this = $(this); 325 | 326 | // Text, TextArea. 327 | $this.find('input[type=text],textarea') 328 | .each(function() { 329 | 330 | var i = $(this); 331 | 332 | if (i.val() == '' 333 | || i.val() == i.attr('placeholder')) 334 | i 335 | .addClass('polyfill-placeholder') 336 | .val(i.attr('placeholder')); 337 | 338 | }) 339 | .on('blur', function() { 340 | 341 | var i = $(this); 342 | 343 | if (i.attr('name').match(/-polyfill-field$/)) 344 | return; 345 | 346 | if (i.val() == '') 347 | i 348 | .addClass('polyfill-placeholder') 349 | .val(i.attr('placeholder')); 350 | 351 | }) 352 | .on('focus', function() { 353 | 354 | var i = $(this); 355 | 356 | if (i.attr('name').match(/-polyfill-field$/)) 357 | return; 358 | 359 | if (i.val() == i.attr('placeholder')) 360 | i 361 | .removeClass('polyfill-placeholder') 362 | .val(''); 363 | 364 | }); 365 | 366 | // Password. 367 | $this.find('input[type=password]') 368 | .each(function() { 369 | 370 | var i = $(this); 371 | var x = $( 372 | $('
') 373 | .append(i.clone()) 374 | .remove() 375 | .html() 376 | .replace(/type="password"/i, 'type="text"') 377 | .replace(/type=password/i, 'type=text') 378 | ); 379 | 380 | if (i.attr('id') != '') 381 | x.attr('id', i.attr('id') + '-polyfill-field'); 382 | 383 | if (i.attr('name') != '') 384 | x.attr('name', i.attr('name') + '-polyfill-field'); 385 | 386 | x.addClass('polyfill-placeholder') 387 | .val(x.attr('placeholder')).insertAfter(i); 388 | 389 | if (i.val() == '') 390 | i.hide(); 391 | else 392 | x.hide(); 393 | 394 | i 395 | .on('blur', function(event) { 396 | 397 | event.preventDefault(); 398 | 399 | var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 400 | 401 | if (i.val() == '') { 402 | 403 | i.hide(); 404 | x.show(); 405 | 406 | } 407 | 408 | }); 409 | 410 | x 411 | .on('focus', function(event) { 412 | 413 | event.preventDefault(); 414 | 415 | var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']'); 416 | 417 | x.hide(); 418 | 419 | i 420 | .show() 421 | .focus(); 422 | 423 | }) 424 | .on('keypress', function(event) { 425 | 426 | event.preventDefault(); 427 | x.val(''); 428 | 429 | }); 430 | 431 | }); 432 | 433 | // Events. 434 | $this 435 | .on('submit', function() { 436 | 437 | $this.find('input[type=text],input[type=password],textarea') 438 | .each(function(event) { 439 | 440 | var i = $(this); 441 | 442 | if (i.attr('name').match(/-polyfill-field$/)) 443 | i.attr('name', ''); 444 | 445 | if (i.val() == i.attr('placeholder')) { 446 | 447 | i.removeClass('polyfill-placeholder'); 448 | i.val(''); 449 | 450 | } 451 | 452 | }); 453 | 454 | }) 455 | .on('reset', function(event) { 456 | 457 | event.preventDefault(); 458 | 459 | $this.find('select') 460 | .val($('option:first').val()); 461 | 462 | $this.find('input,textarea') 463 | .each(function() { 464 | 465 | var i = $(this), 466 | x; 467 | 468 | i.removeClass('polyfill-placeholder'); 469 | 470 | switch (this.type) { 471 | 472 | case 'submit': 473 | case 'reset': 474 | break; 475 | 476 | case 'password': 477 | i.val(i.attr('defaultValue')); 478 | 479 | x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 480 | 481 | if (i.val() == '') { 482 | i.hide(); 483 | x.show(); 484 | } 485 | else { 486 | i.show(); 487 | x.hide(); 488 | } 489 | 490 | break; 491 | 492 | case 'checkbox': 493 | case 'radio': 494 | i.attr('checked', i.attr('defaultValue')); 495 | break; 496 | 497 | case 'text': 498 | case 'textarea': 499 | i.val(i.attr('defaultValue')); 500 | 501 | if (i.val() == '') { 502 | i.addClass('polyfill-placeholder'); 503 | i.val(i.attr('placeholder')); 504 | } 505 | 506 | break; 507 | 508 | default: 509 | i.val(i.attr('defaultValue')); 510 | break; 511 | 512 | } 513 | }); 514 | 515 | }); 516 | 517 | return $this; 518 | 519 | }; 520 | 521 | /** 522 | * Moves elements to/from the first positions of their respective parents. 523 | * @param {jQuery} $elements Elements (or selector) to move. 524 | * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations. 525 | */ 526 | $.prioritize = function($elements, condition) { 527 | 528 | var key = '__prioritize'; 529 | 530 | // Expand $elements if it's not already a jQuery object. 531 | if (typeof $elements != 'jQuery') 532 | $elements = $($elements); 533 | 534 | // Step through elements. 535 | $elements.each(function() { 536 | 537 | var $e = $(this), $p, 538 | $parent = $e.parent(); 539 | 540 | // No parent? Bail. 541 | if ($parent.length == 0) 542 | return; 543 | 544 | // Not moved? Move it. 545 | if (!$e.data(key)) { 546 | 547 | // Condition is false? Bail. 548 | if (!condition) 549 | return; 550 | 551 | // Get placeholder (which will serve as our point of reference for when this element needs to move back). 552 | $p = $e.prev(); 553 | 554 | // Couldn't find anything? Means this element's already at the top, so bail. 555 | if ($p.length == 0) 556 | return; 557 | 558 | // Move element to top of parent. 559 | $e.prependTo($parent); 560 | 561 | // Mark element as moved. 562 | $e.data(key, $p); 563 | 564 | } 565 | 566 | // Moved already? 567 | else { 568 | 569 | // Condition is true? Bail. 570 | if (condition) 571 | return; 572 | 573 | $p = $e.data(key); 574 | 575 | // Move element back to its original location (using our placeholder). 576 | $e.insertAfter($p); 577 | 578 | // Unmark element as moved. 579 | $e.removeData(key); 580 | 581 | } 582 | 583 | }); 584 | 585 | }; 586 | 587 | })(jQuery); -------------------------------------------------------------------------------- /public/assets/sass/ie8.scss: -------------------------------------------------------------------------------- 1 | @import 'libs/vars'; 2 | @import 'libs/functions'; 3 | @import 'libs/mixins'; 4 | 5 | /* 6 | Telephasic by HTML5 UP 7 | html5up.net | @n33co 8 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 9 | */ 10 | 11 | /* Basic */ 12 | 13 | form { 14 | input[type="text"], 15 | input[type="email"], 16 | input[type="password"], 17 | select, 18 | textarea { 19 | position: relative; 20 | -ms-behavior: url('assets/js/ie/PIE.htc'); 21 | } 22 | } 23 | 24 | input[type="button"], 25 | input[type="submit"], 26 | input[type="reset"], 27 | button, 28 | .button { 29 | position: relative; 30 | -ms-behavior: url('assets/js/ie/PIE.htc'); 31 | } 32 | 33 | /* Promo */ 34 | 35 | #promo { 36 | position: relative; 37 | -ms-behavior: url('assets/js/ie/PIE.htc'); 38 | } 39 | 40 | /* Section/Article */ 41 | 42 | section > .last-child, 43 | article > .last-child, 44 | section.last-child, 45 | article.last-child { 46 | margin-bottom: 0; 47 | } 48 | 49 | /* Wrappers */ 50 | 51 | #promo-wrapper { 52 | background: url('../../images/promo.jpg'); 53 | background-size: cover; 54 | -ms-behavior: url('assets/js/ie/backgroundsize.min.htc'); 55 | } 56 | 57 | /* Header */ 58 | 59 | #logo { 60 | a { 61 | position: relative; 62 | -ms-behavior: url('assets/js/ie/PIE.htc'); 63 | } 64 | } 65 | 66 | /* Nav */ 67 | 68 | #nav { 69 | > ul { 70 | > li > { 71 | span, a { 72 | position: relative; 73 | -ms-behavior: url('assets/js/ie/PIE.htc'); 74 | } 75 | } 76 | } 77 | } 78 | 79 | .dropotron { 80 | position: relative; 81 | box-shadow: none !important; 82 | -ms-behavior: url('assets/js/ie/PIE.htc'); 83 | 84 | &.level-0 { 85 | box-shadow: none !important; 86 | 87 | &:before { 88 | display: none; 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /public/assets/sass/ie9.scss: -------------------------------------------------------------------------------- 1 | @import 'libs/vars'; 2 | @import 'libs/functions'; 3 | @import 'libs/mixins'; 4 | 5 | /* 6 | Telephasic by HTML5 UP 7 | html5up.net | @n33co 8 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 9 | */ 10 | 11 | /* Wrappers */ 12 | 13 | #header-wrapper { 14 | background-image: none; 15 | } -------------------------------------------------------------------------------- /public/assets/sass/libs/_functions.scss: -------------------------------------------------------------------------------- 1 | /// Gets a duration value. 2 | /// @param {string} $keys Key(s). 3 | /// @return {string} Value. 4 | @function _duration($keys...) { 5 | @return val($duration, $keys...); 6 | } 7 | 8 | /// Gets a font value. 9 | /// @param {string} $keys Key(s). 10 | /// @return {string} Value. 11 | @function _font($keys...) { 12 | @return val($font, $keys...); 13 | } 14 | 15 | /// Gets a misc value. 16 | /// @param {string} $keys Key(s). 17 | /// @return {string} Value. 18 | @function _misc($keys...) { 19 | @return val($misc, $keys...); 20 | } 21 | 22 | /// Gets a palette value. 23 | /// @param {string} $keys Key(s). 24 | /// @return {string} Value. 25 | @function _palette($keys...) { 26 | @return val($palette, $keys...); 27 | } 28 | 29 | /// Gets a size value. 30 | /// @param {string} $keys Key(s). 31 | /// @return {string} Value. 32 | @function _size($keys...) { 33 | @return val($size, $keys...); 34 | } -------------------------------------------------------------------------------- /public/assets/sass/libs/_mixins.scss: -------------------------------------------------------------------------------- 1 | /// Makes an element's :before pseudoelement a FontAwesome icon. 2 | /// @param {string} $content Optional content value to use. 3 | @mixin icon($content: false) { 4 | 5 | text-decoration: none; 6 | 7 | &:before { 8 | 9 | @if $content { 10 | content: $content; 11 | } 12 | 13 | -moz-osx-font-smoothing: grayscale; 14 | -webkit-font-smoothing: antialiased; 15 | font-family: FontAwesome; 16 | font-style: normal; 17 | font-weight: normal; 18 | text-transform: none !important; 19 | 20 | } 21 | 22 | } 23 | 24 | /// Applies padding to an element, taking the current element-margin value into account. 25 | /// @param {mixed} $tb Top/bottom padding. 26 | /// @param {mixed} $lr Left/right padding. 27 | /// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) 28 | /// @param {bool} $important If true, adds !important. 29 | @mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) { 30 | 31 | @if $important { 32 | $important: '!important'; 33 | } 34 | 35 | padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max(0.1em, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important}; 36 | 37 | } -------------------------------------------------------------------------------- /public/assets/sass/libs/_skel.scss: -------------------------------------------------------------------------------- 1 | // skel.scss v3.0.0-dev | (c) n33 | skel.io | MIT licensed */ 2 | 3 | // Vars. 4 | 5 | /// Breakpoints. 6 | /// @var {list} 7 | $breakpoints: () !global; 8 | 9 | /// Vendor prefixes. 10 | /// @var {list} 11 | $vendor-prefixes: ( 12 | '-moz-', 13 | '-webkit-', 14 | '-ms-', 15 | '' 16 | ); 17 | 18 | /// Properties that should be vendorized. 19 | /// @var {list} 20 | $vendor-properties: ( 21 | 'align-content', 22 | 'align-items', 23 | 'align-self', 24 | 'animation', 25 | 'animation-delay', 26 | 'animation-direction', 27 | 'animation-duration', 28 | 'animation-fill-mode', 29 | 'animation-iteration-count', 30 | 'animation-name', 31 | 'animation-play-state', 32 | 'animation-timing-function', 33 | 'appearance', 34 | 'backface-visibility', 35 | 'box-sizing', 36 | 'filter', 37 | 'flex', 38 | 'flex-basis', 39 | 'flex-direction', 40 | 'flex-flow', 41 | 'flex-grow', 42 | 'flex-shrink', 43 | 'flex-wrap', 44 | 'justify-content', 45 | 'order', 46 | 'perspective', 47 | 'pointer-events', 48 | 'transform', 49 | 'transform-origin', 50 | 'transform-style', 51 | 'transition', 52 | 'transition-delay', 53 | 'transition-duration', 54 | 'transition-property', 55 | 'transition-timing-function' 56 | ); 57 | 58 | /// Values that should be vendorized. 59 | /// @var {list} 60 | $vendor-values: ( 61 | 'filter', 62 | 'flex', 63 | 'linear-gradient', 64 | 'radial-gradient', 65 | 'transform' 66 | ); 67 | 68 | // Functions. 69 | 70 | /// Removes a specific item from a list. 71 | /// @author Hugo Giraudel 72 | /// @param {list} $list List. 73 | /// @param {integer} $index Index. 74 | /// @return {list} Updated list. 75 | @function remove-nth($list, $index) { 76 | 77 | $result: null; 78 | 79 | @if type-of($index) != number { 80 | @warn "$index: #{quote($index)} is not a number for `remove-nth`."; 81 | } 82 | @else if $index == 0 { 83 | @warn "List index 0 must be a non-zero integer for `remove-nth`."; 84 | } 85 | @else if abs($index) > length($list) { 86 | @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; 87 | } 88 | @else { 89 | 90 | $result: (); 91 | $index: if($index < 0, length($list) + $index + 1, $index); 92 | 93 | @for $i from 1 through length($list) { 94 | 95 | @if $i != $index { 96 | $result: append($result, nth($list, $i)); 97 | } 98 | 99 | } 100 | 101 | } 102 | 103 | @return $result; 104 | 105 | } 106 | 107 | /// Replaces a substring within another string. 108 | /// @author Hugo Giraudel 109 | /// @param {string} $string String. 110 | /// @param {string} $search Substring. 111 | /// @param {string} $replace Replacement. 112 | /// @return {string} Updated string. 113 | @function str-replace($string, $search, $replace: '') { 114 | 115 | $index: str-index($string, $search); 116 | 117 | @if $index { 118 | @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); 119 | } 120 | 121 | @return $string; 122 | 123 | } 124 | 125 | /// Replaces a substring within each string in a list. 126 | /// @param {list} $strings List of strings. 127 | /// @param {string} $search Substring. 128 | /// @param {string} $replace Replacement. 129 | /// @return {list} Updated list of strings. 130 | @function str-replace-all($strings, $search, $replace: '') { 131 | 132 | @each $string in $strings { 133 | $strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace)); 134 | } 135 | 136 | @return $strings; 137 | 138 | } 139 | 140 | /// Gets a value from a map. 141 | /// @author Hugo Giraudel 142 | /// @param {map} $map Map. 143 | /// @param {string} $keys Key(s). 144 | /// @return {string} Value. 145 | @function val($map, $keys...) { 146 | 147 | @if nth($keys, 1) == null { 148 | $keys: remove-nth($keys, 1); 149 | } 150 | 151 | @each $key in $keys { 152 | $map: map-get($map, $key); 153 | } 154 | 155 | @return $map; 156 | 157 | } 158 | 159 | // Mixins. 160 | 161 | /// Sets the global box model. 162 | /// @param {string} $model Model (default is content). 163 | @mixin boxModel($model: 'content') { 164 | 165 | $x: $model + '-box'; 166 | 167 | *, *:before, *:after { 168 | -moz-box-sizing: #{$x}; 169 | -webkit-box-sizing: #{$x}; 170 | box-sizing: #{$x}; 171 | } 172 | 173 | } 174 | 175 | /// Wraps @content in a @media block using a given breakpoint. 176 | /// @param {string} $breakpoint Breakpoint. 177 | /// @param {map} $queries Additional queries. 178 | @mixin breakpoint($breakpoint: null, $queries: null) { 179 | 180 | $query: 'screen'; 181 | 182 | // Breakpoint. 183 | @if $breakpoint and map-has-key($breakpoints, $breakpoint) { 184 | $query: $query + ' and ' + map-get($breakpoints, $breakpoint); 185 | } 186 | 187 | // Queries. 188 | @if $queries { 189 | @each $k, $v in $queries { 190 | $query: $query + ' and (' + $k + ':' + $v + ')'; 191 | } 192 | } 193 | 194 | @media #{$query} { 195 | @content; 196 | } 197 | 198 | } 199 | 200 | /// Wraps @content in a @media block targeting a specific orientation. 201 | /// @param {string} $orientation Orientation. 202 | @mixin orientation($orientation) { 203 | @media screen and (orientation: #{$orientation}) { 204 | @content; 205 | } 206 | } 207 | 208 | /// Utility mixin for containers. 209 | /// @param {mixed} $width Width. 210 | @mixin containers($width) { 211 | 212 | // Locked? 213 | $lock: false; 214 | 215 | @if length($width) == 2 { 216 | $width: nth($width, 1); 217 | $lock: true; 218 | } 219 | 220 | // Modifiers. 221 | .container.\31 25\25 { width: 100%; max-width: $width * 1.25; min-width: $width; } 222 | .container.\37 5\25 { width: $width * 0.75; } 223 | .container.\35 0\25 { width: $width * 0.5; } 224 | .container.\32 5\25 { width: $width * 0.25; } 225 | 226 | // Main class. 227 | .container { 228 | @if $lock { 229 | width: $width !important; 230 | } 231 | @else { 232 | width: $width; 233 | } 234 | } 235 | 236 | } 237 | 238 | /// Utility mixin for grid. 239 | /// @param {list} $gutters Column and row gutters (default is 40px). 240 | /// @param {string} $breakpointName Optional breakpoint name. 241 | @mixin grid($gutters: 40px, $breakpointName: null) { 242 | 243 | // Gutters. 244 | @include grid-gutters($gutters); 245 | @include grid-gutters($gutters, \32 00\25, 2); 246 | @include grid-gutters($gutters, \31 50\25, 1.5); 247 | @include grid-gutters($gutters, \35 0\25, 0.5); 248 | @include grid-gutters($gutters, \32 5\25, 0.25); 249 | 250 | // Cells. 251 | $x: ''; 252 | 253 | @if $breakpointName { 254 | $x: '\\28' + $breakpointName + '\\29'; 255 | } 256 | 257 | .\31 2u#{$x}, .\31 2u\24#{$x} { width: 100%; clear: none; margin-left: 0; } 258 | .\31 1u#{$x}, .\31 1u\24#{$x} { width: 91.6666666667%; clear: none; margin-left: 0; } 259 | .\31 0u#{$x}, .\31 0u\24#{$x} { width: 83.3333333333%; clear: none; margin-left: 0; } 260 | .\39 u#{$x}, .\39 u\24#{$x} { width: 75%; clear: none; margin-left: 0; } 261 | .\38 u#{$x}, .\38 u\24#{$x} { width: 66.6666666667%; clear: none; margin-left: 0; } 262 | .\37 u#{$x}, .\37 u\24#{$x} { width: 58.3333333333%; clear: none; margin-left: 0; } 263 | .\36 u#{$x}, .\36 u\24#{$x} { width: 50%; clear: none; margin-left: 0; } 264 | .\35 u#{$x}, .\35 u\24#{$x} { width: 41.6666666667%; clear: none; margin-left: 0; } 265 | .\34 u#{$x}, .\34 u\24#{$x} { width: 33.3333333333%; clear: none; margin-left: 0; } 266 | .\33 u#{$x}, .\33 u\24#{$x} { width: 25%; clear: none; margin-left: 0; } 267 | .\32 u#{$x}, .\32 u\24#{$x} { width: 16.6666666667%; clear: none; margin-left: 0; } 268 | .\31 u#{$x}, .\31 u\24#{$x} { width: 8.3333333333%; clear: none; margin-left: 0; } 269 | 270 | .\31 2u\24#{$x} + *, 271 | .\31 1u\24#{$x} + *, 272 | .\31 0u\24#{$x} + *, 273 | .\39 u\24#{$x} + *, 274 | .\38 u\24#{$x} + *, 275 | .\37 u\24#{$x} + *, 276 | .\36 u\24#{$x} + *, 277 | .\35 u\24#{$x} + *, 278 | .\34 u\24#{$x} + *, 279 | .\33 u\24#{$x} + *, 280 | .\32 u\24#{$x} + *, 281 | .\31 u\24#{$x} + * { 282 | clear: left; 283 | } 284 | 285 | .\-11u#{$x} { margin-left: 91.6666666667% } 286 | .\-10u#{$x} { margin-left: 83.3333333333% } 287 | .\-9u#{$x} { margin-left: 75% } 288 | .\-8u#{$x} { margin-left: 66.6666666667% } 289 | .\-7u#{$x} { margin-left: 58.3333333333% } 290 | .\-6u#{$x} { margin-left: 50% } 291 | .\-5u#{$x} { margin-left: 41.6666666667% } 292 | .\-4u#{$x} { margin-left: 33.3333333333% } 293 | .\-3u#{$x} { margin-left: 25% } 294 | .\-2u#{$x} { margin-left: 16.6666666667% } 295 | .\-1u#{$x} { margin-left: 8.3333333333% } 296 | 297 | } 298 | 299 | /// Utility mixin for grid. 300 | /// @param {list} $gutters Gutters. 301 | /// @param {string} $class Optional class name. 302 | /// @param {integer} $multiplier Multiplier (default is 1). 303 | @mixin grid-gutters($gutters, $class: null, $multiplier: 1) { 304 | 305 | // Expand gutters if it's not a list. 306 | @if length($gutters) == 1 { 307 | $gutters: ($gutters, 0); 308 | } 309 | 310 | // Get column and row gutter values. 311 | $c: nth($gutters, 1); 312 | $r: nth($gutters, 2); 313 | 314 | // Get class (if provided). 315 | $x: ''; 316 | 317 | @if $class { 318 | $x: '.' + $class; 319 | } 320 | 321 | // Default. 322 | .row#{$x} > * { padding: ($r * $multiplier) 0 0 ($c * $multiplier); } 323 | .row#{$x} { margin: ($r * $multiplier * -1) 0 -1px ($c * $multiplier * -1); } 324 | 325 | // Uniform. 326 | .row.uniform#{$x} > * { padding: ($c * $multiplier) 0 0 ($c * $multiplier); } 327 | .row.uniform#{$x} { margin: ($c * $multiplier * -1) 0 -1px ($c * $multiplier * -1); } 328 | 329 | } 330 | 331 | /// Wraps @content in vendorized keyframe blocks. 332 | /// @param {string} $name Name. 333 | @mixin keyframes($name) { 334 | 335 | @-moz-keyframes #{$name} { @content; } 336 | @-webkit-keyframes #{$name} { @content; } 337 | @-ms-keyframes #{$name} { @content; } 338 | @keyframes #{$name} { @content; } 339 | 340 | } 341 | 342 | /// 343 | /// Sets breakpoints. 344 | /// @param {map} $x Breakpoints. 345 | /// 346 | @mixin skel-breakpoints($x: ()) { 347 | $breakpoints: $x !global; 348 | } 349 | 350 | /// 351 | /// Initializes layout module. 352 | /// @param {map} config Config. 353 | /// 354 | @mixin skel-layout($config: ()) { 355 | 356 | // Config. 357 | $configPerBreakpoint: (); 358 | 359 | $z: map-get($config, 'breakpoints'); 360 | 361 | @if $z { 362 | $configPerBreakpoint: $z; 363 | } 364 | 365 | // Reset. 366 | $x: map-get($config, 'reset'); 367 | 368 | @if $x { 369 | 370 | /* Reset */ 371 | 372 | @include reset($x); 373 | 374 | } 375 | 376 | // Box model. 377 | $x: map-get($config, 'boxModel'); 378 | 379 | @if $x { 380 | 381 | /* Box Model */ 382 | 383 | @include boxModel($x); 384 | 385 | } 386 | 387 | // Containers. 388 | $containers: map-get($config, 'containers'); 389 | 390 | @if $containers { 391 | 392 | /* Containers */ 393 | 394 | .container { 395 | margin-left: auto; 396 | margin-right: auto; 397 | } 398 | 399 | // Use default is $containers is just "true". 400 | @if $containers == true { 401 | $containers: 960px; 402 | } 403 | 404 | // Apply base. 405 | @include containers($containers); 406 | 407 | // Apply per-breakpoint. 408 | @each $name in map-keys($breakpoints) { 409 | 410 | // Get/use breakpoint setting if it exists. 411 | $x: map-get($configPerBreakpoint, $name); 412 | 413 | // Per-breakpoint config exists? 414 | @if $x { 415 | $y: map-get($x, 'containers'); 416 | 417 | // Setting exists? Use it. 418 | @if $y { 419 | $containers: $y; 420 | } 421 | 422 | } 423 | 424 | // Create @media block. 425 | @media screen and #{map-get($breakpoints, $name)} { 426 | @include containers($containers); 427 | } 428 | 429 | } 430 | 431 | } 432 | 433 | // Grid. 434 | $grid: map-get($config, 'grid'); 435 | 436 | @if $grid { 437 | 438 | /* Grid */ 439 | 440 | // Use defaults if $grid is just "true". 441 | @if $grid == true { 442 | $grid: (); 443 | } 444 | 445 | // Sub-setting: Gutters. 446 | $grid-gutters: 40px; 447 | $x: map-get($grid, 'gutters'); 448 | 449 | @if $x { 450 | $grid-gutters: $x; 451 | } 452 | 453 | // Rows. 454 | .row { 455 | border-bottom: solid 1px transparent; 456 | -moz-box-sizing: border-box; 457 | -webkit-box-sizing: border-box; 458 | box-sizing: border-box; 459 | } 460 | 461 | .row > * { 462 | float: left; 463 | -moz-box-sizing: border-box; 464 | -webkit-box-sizing: border-box; 465 | box-sizing: border-box; 466 | } 467 | 468 | .row:after, .row:before { 469 | content: ''; 470 | display: block; 471 | clear: both; 472 | height: 0; 473 | } 474 | 475 | .row.uniform > * > :first-child { 476 | margin-top: 0; 477 | } 478 | 479 | .row.uniform > * > :last-child { 480 | margin-bottom: 0; 481 | } 482 | 483 | // Gutters (0%). 484 | @include grid-gutters($grid-gutters, \30 \25, 0); 485 | 486 | // Apply base. 487 | @include grid($grid-gutters); 488 | 489 | // Apply per-breakpoint. 490 | @each $name in map-keys($breakpoints) { 491 | 492 | // Get/use breakpoint setting if it exists. 493 | $x: map-get($configPerBreakpoint, $name); 494 | 495 | // Per-breakpoint config exists? 496 | @if $x { 497 | $y: map-get($x, 'grid'); 498 | 499 | // Setting exists? 500 | @if $y { 501 | 502 | // Sub-setting: Gutters. 503 | $x: map-get($y, 'gutters'); 504 | 505 | @if $x { 506 | $grid-gutters: $x; 507 | } 508 | 509 | } 510 | 511 | } 512 | 513 | // Create @media block. 514 | @media screen and #{map-get($breakpoints, $name)} { 515 | @include grid($grid-gutters, $name); 516 | } 517 | 518 | } 519 | 520 | } 521 | 522 | } 523 | 524 | /// Resets browser styles. 525 | /// @param {string} $mode Mode (default is 'normalize'). 526 | @mixin reset($mode: 'normalize') { 527 | 528 | @if $mode == 'normalize' { 529 | 530 | // normalize.css v3.0.2 | MIT License | git.io/normalize 531 | 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:700}dfn{font-style:italic}h1{font-size:2em;margin:.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:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} 532 | 533 | } 534 | @else if $mode == 'full' { 535 | 536 | // meyerweb.com/eric/tools/css/reset v2.0 | 20110126 | License: none (public domain) 537 | html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}table{border-collapse:collapse;border-spacing:0;}body{-webkit-text-size-adjust:none} 538 | 539 | } 540 | 541 | } 542 | 543 | /// Vendorizes a declaration's property and/or value(s). 544 | /// @param {string} $property Property. 545 | /// @param {mixed} $value String/list of value(s). 546 | @mixin vendor($property, $value) { 547 | 548 | // Determine if property should expand. 549 | $expandProperty: index($vendor-properties, $property); 550 | 551 | // Determine if value should expand (and if so, add '-prefix-' placeholder). 552 | $expandValue: false; 553 | 554 | @each $x in $value { 555 | @each $y in $vendor-values { 556 | @if $y == str-slice($x, 1, str-length($y)) { 557 | 558 | $value: set-nth($value, index($value, $x), '-prefix-' + $x); 559 | $expandValue: true; 560 | 561 | } 562 | } 563 | } 564 | 565 | // Expand property? 566 | @if $expandProperty { 567 | @each $vendor in $vendor-prefixes { 568 | #{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; 569 | } 570 | } 571 | 572 | // Expand just the value? 573 | @elseif $expandValue { 574 | @each $vendor in $vendor-prefixes { 575 | #{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; 576 | } 577 | } 578 | 579 | // Neither? Treat them as a normal declaration. 580 | @else { 581 | #{$property}: #{$value}; 582 | } 583 | 584 | } -------------------------------------------------------------------------------- /public/assets/sass/libs/_vars.scss: -------------------------------------------------------------------------------- 1 | // Misc. 2 | $misc: ( 3 | z-index-base: 10000 4 | ); 5 | 6 | // Duration. 7 | $duration: ( 8 | navPanel: 0.5s 9 | ); 10 | 11 | // Size. 12 | $size: ( 13 | navPanel: 50vh 14 | ); 15 | 16 | // Font. 17 | $font: ( 18 | ); 19 | 20 | // Palette. 21 | $palette: ( 22 | ); -------------------------------------------------------------------------------- /public/assets/sass/main.scss: -------------------------------------------------------------------------------- 1 | @import 'libs/vars'; 2 | @import 'libs/functions'; 3 | @import 'libs/mixins'; 4 | @charset "UTF-8"; 5 | @import url("font-awesome.min.css"); 6 | @import url("http://fonts.googleapis.com/css?family=Source+Sans+Pro:300,300italic,400,400italic,600"); 7 | 8 | /* 9 | Telephasic by HTML5 UP 10 | html5up.net | @n33co 11 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 12 | */ 13 | 14 | @import "libs/skel"; 15 | 16 | @include skel-breakpoints(( 17 | normal: '(max-width: 1280px)', 18 | narrow: '(max-width: 1080px)', 19 | narrower: '(max-width: 820px)', 20 | mobile: '(max-width: 736px)', 21 | mobilep: '(max-width: 480px)' 22 | )); 23 | 24 | @include skel-layout(( 25 | reset: 'full', 26 | boxModel: 'border', 27 | grid: ( gutters: (50px, 50px) ), 28 | conditionals: true, 29 | containers: 1200px, 30 | breakpoints: ( 31 | normal: ( 32 | containers: 960px, 33 | grid: ( gutters: (40px, 40px) ) 34 | ), 35 | narrow: ( 36 | containers: 100% 37 | ), 38 | narrower: ( 39 | containers: (100%, true), 40 | grid: ( gutters: (30px, 30px) ) 41 | ), 42 | mobile: ( 43 | ), 44 | mobilep: ( 45 | grid: ( gutters: (20px, 20px) ) 46 | ) 47 | ) 48 | )); 49 | 50 | /* Basic */ 51 | 52 | @-ms-viewport { 53 | width: device-width; 54 | } 55 | 56 | body { 57 | background: #f5f7fa; 58 | font-family: 'Source Sans Pro', sans-serif; 59 | font-weight: 300; 60 | color: #52575c; 61 | line-height: 1.75em; 62 | font-size: 14pt; 63 | 64 | &.is-loading * { 65 | @include vendor('transition', 'none !important'); 66 | @include vendor('animation', 'none !important'); 67 | } 68 | } 69 | 70 | input, textarea, select { 71 | font-family: 'Source Sans Pro', sans-serif; 72 | font-weight: 300; 73 | color: #52575c; 74 | line-height: 1.75em; 75 | font-size: 15pt; 76 | } 77 | 78 | h1, h2, h3, h4, h5, h6 { 79 | font-weight: 300; 80 | color: #52575c; 81 | } 82 | 83 | h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { 84 | color: inherit; 85 | text-decoration: none; 86 | } 87 | 88 | h2 { 89 | font-size: 2em; 90 | line-height: 1.25em; 91 | } 92 | 93 | h3 { 94 | font-size: 1.5em; 95 | line-height: 1.5em; 96 | } 97 | 98 | a { 99 | @include vendor('transition', ('color 0.25s ease-in-out', 'border-color 0.25s ease-in-out', 'background-color 0.25s ease-in-out')); 100 | color: inherit; 101 | text-decoration: none; 102 | border-bottom: dotted 1px #62676c; 103 | 104 | &:hover { 105 | color: #f35858; 106 | border-bottom-color: rgba(255, 255, 255, 0); 107 | } 108 | } 109 | 110 | strong, b { 111 | font-weight: 400; 112 | color: #42474c; 113 | } 114 | 115 | em, i { 116 | font-style: italic; 117 | } 118 | 119 | sub { 120 | position: relative; 121 | top: 0.5em; 122 | font-size: 0.8em; 123 | } 124 | 125 | sup { 126 | position: relative; 127 | top: -0.5em; 128 | font-size: 0.8em; 129 | } 130 | 131 | hr { 132 | border: 0; 133 | border-top: solid 1px #c2c7cc; 134 | } 135 | 136 | blockquote { 137 | border-left: solid 0.5em #c2c7cc; 138 | padding: 1em 0 1em 2em; 139 | font-style: italic; 140 | } 141 | 142 | p, ul, ol, dl, table { 143 | margin-bottom: 1.5em; 144 | } 145 | 146 | br.clear { 147 | clear: both; 148 | } 149 | 150 | .features { 151 | margin-bottom: 1.5em; 152 | } 153 | 154 | .feature { 155 | text-align: center; 156 | } 157 | 158 | /* Sections/Article */ 159 | 160 | section, article { 161 | margin-bottom: 3em; 162 | } 163 | 164 | section > :last-child, 165 | article > :last-child, 166 | section:last-child, 167 | article:last-child { 168 | margin-bottom: 0; 169 | } 170 | 171 | .row > { 172 | section, article { 173 | margin-bottom: 0; 174 | } 175 | } 176 | 177 | header { 178 | margin-bottom: 1.5em; 179 | 180 | > p { 181 | display: block; 182 | color: #f35858; 183 | padding: 0.75em 0 1em 0; 184 | font-size: 1.5em; 185 | line-height: 1.5em; 186 | } 187 | 188 | &.major { 189 | text-align: center; 190 | } 191 | } 192 | 193 | /* Image */ 194 | 195 | .image { 196 | @include vendor('transition', 'opacity 0.25s ease-in-out'); 197 | display: inline-block; 198 | outline: 0; 199 | border: 0; 200 | 201 | img { 202 | display: block; 203 | width: 100%; 204 | } 205 | 206 | &.fit { 207 | display: block; 208 | width: 100%; 209 | } 210 | 211 | &.featured { 212 | display: block; 213 | width: 100%; 214 | margin: 0 0 3em 0; 215 | } 216 | 217 | &.left { 218 | float: left; 219 | margin: 0 2em 2em 0; 220 | } 221 | 222 | &.centered { 223 | display: block; 224 | margin: 0 0 3em 0; 225 | 226 | img { 227 | margin: 0 auto; 228 | width: auto; 229 | } 230 | } 231 | } 232 | 233 | a { 234 | &.image { 235 | &:hover { 236 | opacity: 0.85; 237 | } 238 | } 239 | } 240 | 241 | /* List */ 242 | 243 | ul { 244 | &.default { 245 | list-style: disc; 246 | padding-left: 1em; 247 | 248 | li { 249 | padding-left: 0.5em; 250 | } 251 | } 252 | 253 | &.actions { 254 | padding-top: 1em; 255 | 256 | &.major { 257 | text-align: center; 258 | } 259 | 260 | li { 261 | display: inline-block; 262 | margin-left: 1em; 263 | 264 | &:first-child { 265 | margin-left: 0; 266 | } 267 | } 268 | } 269 | 270 | &.divided { 271 | li { 272 | border-top: solid 1px #d2d7dc; 273 | padding-top: 2em; 274 | margin-top: 2em; 275 | 276 | &:first-child { 277 | padding-top: 0; 278 | margin-top: 0; 279 | border-top: 0; 280 | } 281 | } 282 | } 283 | 284 | &.icons { 285 | li { 286 | &:before { 287 | display: inline-block; 288 | color: #fff; 289 | background: #61666b; 290 | width: 2em; 291 | height: 2em; 292 | border-radius: 0.35em; 293 | text-align: center; 294 | line-height: 2em; 295 | margin-right: 0.75em; 296 | } 297 | } 298 | } 299 | 300 | &.menu { 301 | li { 302 | display: inline-block; 303 | border-left: solid 1px #d2d7dc; 304 | padding-left: 1em; 305 | margin-left: 1em; 306 | 307 | &:first-child { 308 | border-left: 0; 309 | padding-left: 0; 310 | margin-left: 0; 311 | } 312 | } 313 | } 314 | } 315 | 316 | ol { 317 | &.default { 318 | list-style: decimal; 319 | padding-left: 1.25em; 320 | 321 | li { 322 | padding-left: 0.25em; 323 | } 324 | } 325 | } 326 | 327 | /* Form */ 328 | 329 | form { 330 | .actions { 331 | padding-top: 0; 332 | } 333 | 334 | label { 335 | display: block; 336 | font-weight: 300; 337 | color: #52575c; 338 | margin: 0 0 0.5em 0; 339 | } 340 | 341 | input[type="text"], 342 | input[type="email"], 343 | input[type="password"], 344 | select, 345 | textarea { 346 | @include vendor('transition', 'background-color 0.25s ease-in-out'); 347 | -webkit-appearance: none; 348 | display: block; 349 | background: #f9fbfe; 350 | border: solid 1px #d2d7dc; 351 | border-radius: 0.35em; 352 | width: 100%; 353 | line-height: 1.5em; 354 | padding: 0.75em; 355 | 356 | &:focus { 357 | background: #fff; 358 | } 359 | } 360 | 361 | textarea { 362 | min-height: 7em; 363 | } 364 | 365 | .formerize-placeholder { 366 | color: #555 !important; 367 | } 368 | 369 | ::-webkit-input-placeholder { 370 | color: #555 !important; 371 | } 372 | 373 | :-moz-placeholder { 374 | color: #555 !important; 375 | } 376 | 377 | ::-moz-placeholder { 378 | color: #555 !important; 379 | } 380 | 381 | :-ms-input-placeholder { 382 | color: #555 !important; 383 | } 384 | 385 | ::-moz-focus-inner { 386 | border: 0; 387 | } 388 | } 389 | 390 | /* Table */ 391 | 392 | table { 393 | width: 100%; 394 | 395 | &.default { 396 | width: 100%; 397 | 398 | tbody { 399 | tr { 400 | border-top: solid 1px #D2D7DC; 401 | 402 | &:nth-child(2n+1) { 403 | background: #f9fbfe; 404 | } 405 | } 406 | } 407 | 408 | td { 409 | padding: 0.5em 1em 0.5em 1em; 410 | } 411 | 412 | th { 413 | text-align: left; 414 | font-weight: 400; 415 | padding: 0.5em 1em 0.5em 1em; 416 | } 417 | 418 | tfoot { 419 | border-top: solid 1px #D2D7DC; 420 | } 421 | } 422 | } 423 | 424 | /* Button */ 425 | 426 | input[type="button"], 427 | input[type="submit"], 428 | input[type="reset"], 429 | button, 430 | .button { 431 | @include vendor('transition', ('color 0.25s ease-in-out', 'border-color 0.25s ease-in-out', 'background-color 0.25s ease-in-out')); 432 | display: inline-block; 433 | color: inherit; 434 | background: none; 435 | text-decoration: none; 436 | border: solid 1px #c2c7cc; 437 | border-radius: 0.35em; 438 | padding: 0.8em 2em 0.8em 2em; 439 | cursor: pointer; 440 | outline: 0; 441 | 442 | &:hover { 443 | color: #f35858; 444 | border-color: rgba(243, 88, 88, 0.5); 445 | } 446 | } 447 | 448 | /* Icons */ 449 | 450 | .icon { 451 | text-decoration: none; 452 | 453 | &:before { 454 | display: inline-block; 455 | font-family: FontAwesome; 456 | font-size: 1.25em; 457 | text-decoration: none; 458 | font-style: normal; 459 | font-weight: normal; 460 | line-height: 1; 461 | -webkit-font-smoothing: antialiased; 462 | -moz-osx-font-smoothing: grayscale; 463 | } 464 | 465 | > .label { 466 | display: none; 467 | } 468 | } 469 | 470 | /* Wrappers */ 471 | 472 | .wrapper { 473 | position: relative; 474 | background: #fff; 475 | overflow-x: hidden; 476 | padding: 6em 0 6em 0; 477 | } 478 | 479 | .image-wrapper { 480 | position: relative; 481 | 482 | .image { 483 | position: relative; 484 | z-index: 2; 485 | } 486 | 487 | &.first { 488 | &:before { 489 | content: ''; 490 | display: block; 491 | width: 2000%; 492 | height: 100%; 493 | position: absolute; 494 | left: -1000%; 495 | top: 0; 496 | z-index: 1; 497 | box-shadow: inset 0px 0px 0px 1px #e8e8e8; 498 | background: #f6f8fb url('images/image-wrapper.svg'); 499 | } 500 | } 501 | } 502 | 503 | #header-wrapper { 504 | position: relative; 505 | padding: 4em 0 2em 0; 506 | background-image: url('images/header.svg'); 507 | @include vendor('background-image', ('url("images/overlay.png")', 'url("images/header.svg")', 'linear-gradient(75deg, #FF7088 15%, #F2B69D 55%)')); 508 | background-color: #f08c89; 509 | background-size: 100% 620%; 510 | background-size: 128px 128px, 100% 620%, auto; 511 | background-repeat: repeat, no-repeat, no-repeat; 512 | } 513 | 514 | .homepage #header-wrapper { 515 | padding: 10em 0 6em 0; 516 | background-size: 128px 128px, 100% 100%, auto; 517 | } 518 | 519 | #promo-wrapper { 520 | position: relative; 521 | background-image: url('images/overlay.png'), url('../../images/promo.jpg'); 522 | background-size: 192px 192px, cover; 523 | background-position: top left, center center; 524 | color: #fff; 525 | text-align: center; 526 | padding: 6em 0 6em 0; 527 | } 528 | 529 | #footer-wrapper { 530 | -webkit-transform: translate3d(0, 0, 0); 531 | position: relative; 532 | border-top: solid 1px #c2c7cc; 533 | padding: 6em 0 6em 0; 534 | background-image: url('images/overlay.png'), url('images/footer.svg'); 535 | background-size: 128px 128px, 100% 100%; 536 | } 537 | 538 | /* Header */ 539 | 540 | #logo { 541 | position: absolute; 542 | z-index: 1; 543 | top: 0; 544 | left: 50%; 545 | width: 15em; 546 | margin-left: -7.5em; 547 | 548 | a { 549 | display: block; 550 | width: 100%; 551 | height: 4em; 552 | line-height: 4em; 553 | background: rgba(255, 255, 255, 0.15); 554 | border: solid 1px; 555 | border-color: #fff; 556 | border-color: rgba(255, 255, 255, 0.75); 557 | border-top: 0; 558 | border-radius: 0 0 0.35em 0.35em; 559 | color: #fff; 560 | display: inline-block; 561 | font-weight: 600; 562 | letter-spacing: 3px; 563 | text-align: center; 564 | text-transform: uppercase; 565 | } 566 | } 567 | 568 | #nav { 569 | text-align: center; 570 | position: absolute; 571 | top: 0; 572 | left: 0; 573 | width: 100%; 574 | height: 4em; 575 | line-height: 4em; 576 | 577 | > ul { 578 | margin: 0; 579 | 580 | > li { 581 | display: inline-block; 582 | margin-left: 1em; 583 | 584 | > ul { 585 | display: none; 586 | } 587 | 588 | > span, > a { 589 | color: #fff; 590 | text-decoration: none; 591 | outline: 0; 592 | border: 0; 593 | border: solid 1px rgba(255, 255, 255, 0); 594 | border-radius: 0.35em; 595 | padding: 0.3em 1em 0.3em 1em; 596 | -moz-transition: border-color 0.25s ease-in-out, background-color 0.25s ease-in-out; 597 | -webkit-transition: border-color 0.25s ease-in-out, background-color 0.25s ease-in-out; 598 | -o-transition: border-color 0.25s ease-in-out, background-color 0.25s ease-in-out; 599 | -ms-transition: border-color 0.25s ease-in-out, background-color 0.25s ease-in-out; 600 | transition: border-color 0.25s ease-in-out, background-color 0.25s ease-in-out; 601 | } 602 | 603 | &.active { 604 | > span, > a { 605 | border-color: rgba(255, 255, 255, 0.75); 606 | background-color: rgba(255, 255, 255, 0.15); 607 | color: #fff; 608 | } 609 | } 610 | 611 | &:first-child { 612 | margin-left: 0; 613 | } 614 | 615 | &.break { 616 | margin-left: 20em; 617 | } 618 | } 619 | } 620 | } 621 | 622 | .dropotron { 623 | text-align: left; 624 | line-height: 2em; 625 | border-radius: 0.35em; 626 | min-width: 12em; 627 | background: #fff; 628 | line-height: 1em; 629 | padding: 0.85em 0 0.85em 0; 630 | box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.25); 631 | margin-top: -0.8em; 632 | 633 | a, span { 634 | display: block; 635 | padding: 0.65em 1em 0.65em 1em; 636 | border-top: solid 1px #e8e8e8; 637 | border-bottom: 0; 638 | } 639 | 640 | li { 641 | &:first-child { 642 | > a, > span { 643 | border-top: 0; 644 | } 645 | } 646 | 647 | &.active { 648 | > a, > span { 649 | color: #f35858; 650 | } 651 | } 652 | } 653 | 654 | &.level-0 { 655 | font-size: 0.9em; 656 | margin-top: 0; 657 | 658 | &:before { 659 | content: ''; 660 | position: absolute; 661 | top: -1em; 662 | width: 1em; 663 | height: 1em; 664 | border-bottom: solid 0.5em #fff; 665 | border-left: solid 0.5em rgba(255, 255, 255, 0); 666 | border-right: solid 0.5em rgba(255, 255, 255, 0); 667 | } 668 | 669 | &.center { 670 | &:before { 671 | left: 50%; 672 | margin-left: -0.5em; 673 | } 674 | } 675 | 676 | &.left { 677 | &:before { 678 | left: 1em; 679 | } 680 | } 681 | 682 | &.right { 683 | &:before { 684 | right: 1em; 685 | } 686 | } 687 | } 688 | } 689 | 690 | /* Hero */ 691 | 692 | #hero { 693 | position: relative; 694 | color: #fff; 695 | text-align: center; 696 | z-index: 1; 697 | 698 | h2 { 699 | color: #fff; 700 | font-size: 3em; 701 | } 702 | 703 | strong { 704 | color: inherit; 705 | } 706 | 707 | header { 708 | > span { 709 | color: #fff; 710 | } 711 | } 712 | 713 | p { 714 | font-size: 1.5em; 715 | line-height: 1.5em; 716 | } 717 | 718 | .button { 719 | background: #fff; 720 | border-color: rgba(255, 255, 255, 0); 721 | color: #f08c89; 722 | font-size: 1.25em; 723 | 724 | &:hover { 725 | border-color: rgba(255, 255, 255, 0.75); 726 | background-color: rgba(255, 255, 255, 0.15); 727 | color: #fff; 728 | } 729 | } 730 | 731 | a { 732 | color: #fff; 733 | border-color: #fff; 734 | border-color: rgba(255, 255, 255, 0.5); 735 | 736 | &:hover { 737 | border-color: rgba(255, 255, 255, 0); 738 | } 739 | } 740 | } 741 | 742 | /* Promo */ 743 | 744 | #promo { 745 | background: rgba(255, 255, 255, 0.05); 746 | border: solid 1px rgba(255, 255, 255, 0.25); 747 | border-radius: 0.5em; 748 | padding: 1.75em 2.5em 1.75em 2.5em; 749 | display: inline-block; 750 | position: relative; 751 | z-index: 1; 752 | 753 | h2 { 754 | color: #fff; 755 | display: inline-block; 756 | margin-right: 1em; 757 | font-size: 1.75em; 758 | } 759 | 760 | .button { 761 | background: #fff; 762 | border-color: rgba(255, 255, 255, 0); 763 | color: #27636B; 764 | font-size: 1.25em; 765 | 766 | &:hover { 767 | border-color: rgba(255, 255, 255, 0.75); 768 | background-color: rgba(255, 255, 255, 0.15); 769 | color: #fff; 770 | } 771 | } 772 | } 773 | 774 | /* Main */ 775 | 776 | #main { 777 | padding-bottom: 4em; 778 | } 779 | 780 | /* Sidebar */ 781 | 782 | #sidebar { 783 | section { 784 | border-top: solid 1px #d2d7dc; 785 | margin-top: 3em; 786 | padding-top: 3em; 787 | 788 | &:first-child { 789 | border-top: 0; 790 | margin-top: 0; 791 | padding-top: 0; 792 | } 793 | } 794 | } 795 | 796 | /* Footer */ 797 | 798 | #footer { 799 | position: relative; 800 | z-index: 1; 801 | 802 | header { 803 | &.major { 804 | margin-bottom: 3em; 805 | } 806 | } 807 | } 808 | 809 | /* Copyright */ 810 | 811 | #copyright { 812 | position: relative; 813 | z-index: 1; 814 | text-align: center; 815 | border-top: solid 1px #d2d7dc; 816 | color: #a2a7ac; 817 | padding-top: 4em; 818 | margin-top: 6em; 819 | } 820 | 821 | /* Normal */ 822 | 823 | @include breakpoint(normal) { 824 | 825 | /* Basic */ 826 | 827 | body, input, textarea, select { 828 | line-height: 1.5em; 829 | font-size: 13pt; 830 | } 831 | 832 | span.extra { 833 | display: none; 834 | } 835 | 836 | /* Wrappers */ 837 | 838 | .wrapper { 839 | padding: 5em 0 5em 0; 840 | } 841 | 842 | #header-wrapper { 843 | padding: 2em 0 2em 0; 844 | } 845 | 846 | .homepage #header-wrapper { 847 | padding: 8em 0 4em 0; 848 | } 849 | 850 | #promo-wrapper { 851 | padding: 5em 0 5em 0; 852 | } 853 | 854 | #footer-wrapper { 855 | padding: 5em 0 5em 0; 856 | } 857 | 858 | } 859 | 860 | /* Narrow */ 861 | 862 | @include breakpoint(narrow) { 863 | 864 | /* Sections/Article */ 865 | 866 | header { 867 | br { 868 | display: none; 869 | } 870 | } 871 | 872 | /* Button */ 873 | 874 | input[type="button"], 875 | input[type="submit"], 876 | input[type="reset"], 877 | button, 878 | .button { 879 | padding-left: 1.25em; 880 | padding-right: 1.25em; 881 | } 882 | 883 | /* Wrappers */ 884 | 885 | .wrapper { 886 | padding: 4em 2em 4em 2em; 887 | } 888 | 889 | #header-wrapper { 890 | padding: 5em 0 1em 0; 891 | } 892 | 893 | .homepage #header-wrapper { 894 | padding: 5em 0 4em 0; 895 | } 896 | 897 | #promo-wrapper { 898 | padding: 2em; 899 | } 900 | 901 | #footer-wrapper { 902 | padding: 4em 2em 4em 2em; 903 | } 904 | 905 | /* Header */ 906 | 907 | #nav { 908 | position: relative; 909 | margin: 0.5em 0 0 0; 910 | line-height: 2.25em; 911 | height: 2.25em; 912 | 913 | > ul { 914 | > li { 915 | margin-left: 0; 916 | 917 | &.break { 918 | margin-left: 0; 919 | } 920 | } 921 | } 922 | } 923 | 924 | .dropotron.level-0 { 925 | margin-top: 1.1em; 926 | } 927 | 928 | /* Hero */ 929 | 930 | #hero { 931 | padding: 3.5em 4em 0 4em; 932 | 933 | h2 { 934 | font-size: 2.75em; 935 | } 936 | 937 | p { 938 | br { 939 | display: none; 940 | } 941 | } 942 | } 943 | 944 | /* Promo */ 945 | 946 | #promo { 947 | padding: 1.75em 2.5em 1.75em 2.5em; 948 | display: inline-block; 949 | 950 | .button { 951 | font-size: 1.25em; 952 | } 953 | 954 | h2 { 955 | display: block; 956 | margin: 0 0 1em 0; 957 | font-size: 1.5em; 958 | } 959 | } 960 | 961 | /* Copyright */ 962 | 963 | #copyright { 964 | padding-top: 2em; 965 | margin-top: 3em; 966 | } 967 | 968 | } 969 | 970 | /* Narrower */ 971 | 972 | @include breakpoint(narrower) { 973 | 974 | /* Basic */ 975 | 976 | body, input, textarea, select { 977 | line-height: 1.5em; 978 | font-size: 14pt; 979 | } 980 | 981 | span.extra { 982 | display: inline; 983 | } 984 | 985 | .features { 986 | margin-bottom: 0; 987 | } 988 | 989 | /* Sections/Article */ 990 | 991 | section, article { 992 | margin-bottom: 3em; 993 | } 994 | 995 | .row > { 996 | section, article { 997 | margin-bottom: 3em; 998 | } 999 | } 1000 | 1001 | section:last-child, 1002 | article:last-child { 1003 | margin-bottom: 0; 1004 | } 1005 | 1006 | .row { 1007 | > section:last-child, 1008 | > article:last-child { 1009 | margin-bottom: 0; 1010 | } 1011 | } 1012 | 1013 | /* List */ 1014 | 1015 | ul { 1016 | &.menu { 1017 | text-align: center; 1018 | 1019 | li { 1020 | display: block; 1021 | border: 0; 1022 | padding: 0; 1023 | margin: 0; 1024 | line-height: 2em; 1025 | 1026 | &:first-child { 1027 | border-top: 0; 1028 | } 1029 | } 1030 | } 1031 | 1032 | &.actions { 1033 | &.major { 1034 | padding-top: 2em; 1035 | } 1036 | } 1037 | } 1038 | 1039 | /* Header */ 1040 | 1041 | #nav { 1042 | font-size: 0.9em; 1043 | 1044 | > ul { 1045 | > li { 1046 | > span, > a { 1047 | padding: 0.25em 0.5em 0.25em 0.5em; 1048 | } 1049 | } 1050 | } 1051 | } 1052 | 1053 | /* Hero */ 1054 | 1055 | #hero { 1056 | h2 { 1057 | font-size: 2.5em; 1058 | } 1059 | } 1060 | 1061 | /* Main */ 1062 | 1063 | #main { 1064 | padding-bottom: 0; 1065 | } 1066 | 1067 | /* Content */ 1068 | 1069 | #content { 1070 | margin-bottom: 3em; 1071 | } 1072 | 1073 | /* Sidebar */ 1074 | 1075 | #sidebar { 1076 | margin-bottom: 3em; 1077 | 1078 | section { 1079 | border-top: 0; 1080 | margin-top: 0; 1081 | padding-top: 1em; 1082 | } 1083 | } 1084 | 1085 | /* Footer */ 1086 | 1087 | #footer { 1088 | header { 1089 | &.major { 1090 | margin-bottom: 1.5em; 1091 | } 1092 | } 1093 | } 1094 | 1095 | } 1096 | 1097 | /* Mobile */ 1098 | 1099 | #navPanel, #navButton { 1100 | display: none; 1101 | } 1102 | 1103 | @include breakpoint(mobile) { 1104 | 1105 | /* Basic */ 1106 | 1107 | html, body { 1108 | overflow-x: hidden; 1109 | } 1110 | 1111 | body, input, textarea, select { 1112 | font-size: 13pt; 1113 | letter-spacing: 0; 1114 | } 1115 | 1116 | h2 { 1117 | font-size: 1.5em; 1118 | line-height: 1.25em; 1119 | } 1120 | 1121 | /* Sections/Article */ 1122 | 1123 | header { 1124 | margin-bottom: 1em; 1125 | 1126 | > p { 1127 | font-size: 1em; 1128 | } 1129 | } 1130 | 1131 | /* List */ 1132 | 1133 | ul { 1134 | &.divided { 1135 | li { 1136 | padding-top: 0.75em; 1137 | margin-top: 0.75em; 1138 | } 1139 | } 1140 | } 1141 | 1142 | /* Wrappers */ 1143 | 1144 | .wrapper { 1145 | padding: 3em 20px 3em 20px; 1146 | } 1147 | 1148 | #header-wrapper { 1149 | padding: 3em 20px 20px 20px; 1150 | text-align: center; 1151 | } 1152 | 1153 | .homepage #header-wrapper { 1154 | padding: 3em 20px 3em 20px; 1155 | } 1156 | 1157 | #promo-wrapper { 1158 | padding: 20px; 1159 | } 1160 | 1161 | #footer-wrapper { 1162 | padding: 3em 20px 3em 20px; 1163 | } 1164 | 1165 | /* Header */ 1166 | 1167 | #logo { 1168 | position: relative; 1169 | 1170 | a { 1171 | border: solid 1px rgba(255, 255, 255, 0.75); 1172 | border-radius: 0.35em; 1173 | height: 3em; 1174 | line-height: 3em; 1175 | } 1176 | } 1177 | 1178 | /* Nav */ 1179 | 1180 | #nav { 1181 | display: none; 1182 | } 1183 | 1184 | /* Footer */ 1185 | 1186 | #footer { 1187 | ul.divided { 1188 | margin: 0; 1189 | 1190 | li:first-child { 1191 | border-top: solid 1px #d2d7dc; 1192 | padding-top: 0.75em; 1193 | margin-top: 0.75em; 1194 | } 1195 | 1196 | &:first-child { 1197 | li:first-child { 1198 | border-top: 0; 1199 | padding-top: 0; 1200 | margin-top: 0; 1201 | } 1202 | } 1203 | } 1204 | } 1205 | 1206 | /* Hero */ 1207 | 1208 | #hero { 1209 | padding: 2.5em 2em 0 2em; 1210 | 1211 | header { 1212 | margin: 0 0 1.25em 0; 1213 | 1214 | h2 { 1215 | font-size: 1.5em; 1216 | } 1217 | } 1218 | 1219 | p { 1220 | font-size: 1em; 1221 | } 1222 | } 1223 | 1224 | /* Off-Canvas Navigation */ 1225 | 1226 | #page-wrapper { 1227 | @include vendor('backface-visibility', 'hidden'); 1228 | @include vendor('transition', 'transform #{_duration(navPanel)} ease'); 1229 | padding-bottom: 1px; 1230 | } 1231 | 1232 | #navButton { 1233 | @include vendor('backface-visibility', 'hidden'); 1234 | @include vendor('transition', 'transform #{_duration(navPanel)} ease'); 1235 | display: block; 1236 | height: 44px; 1237 | left: 0; 1238 | position: fixed; 1239 | top: 0; 1240 | width: 100%; 1241 | z-index: _misc(z-index-base) + 1; 1242 | 1243 | .toggle { 1244 | position: absolute; 1245 | left: 0; 1246 | top: 0; 1247 | width: 100%; 1248 | height: 100%; 1249 | border: 0; 1250 | outline: 0; 1251 | 1252 | &:before { 1253 | font-family: FontAwesome; 1254 | text-decoration: none; 1255 | font-style: normal; 1256 | font-weight: normal; 1257 | -webkit-font-smoothing: antialiased; 1258 | -moz-osx-font-smoothing: grayscale; 1259 | content: '\f0c9'; 1260 | color: #fff; 1261 | font-size: 18px; 1262 | text-align: center; 1263 | display: block; 1264 | width: 80px; 1265 | height: 30px; 1266 | line-height: 30px; 1267 | position: absolute; 1268 | left: 50%; 1269 | margin-left: -40px; 1270 | background: rgba(128, 132, 136, 0.35); 1271 | border-top: 0; 1272 | border-radius: 0 0 0.35em 0.35em; 1273 | } 1274 | } 1275 | } 1276 | 1277 | #navPanel { 1278 | @include vendor('backface-visibility', 'hidden'); 1279 | @include vendor('transform', 'translateY(#{_size(navPanel) * -1})'); 1280 | @include vendor('transition', ('transform #{_duration(navPanel)} ease')); 1281 | @include vendor('background-image', ('url("images/overlay.png")', 'url("images/navPanel.svg")', 'linear-gradient(top, rgba(255, 255, 255, 0), rgba(0, 0, 0, 0.25))')); 1282 | display: block; 1283 | left: 0; 1284 | overflow-y: auto; 1285 | position: fixed; 1286 | top: 0; 1287 | width: 100%; 1288 | height: _size(navPanel); 1289 | z-index: _misc(z-index-base) + 2; 1290 | box-shadow: inset 0px -2px 5px 0px rgba(0, 0, 0, 0.25); 1291 | font-size: 1em; 1292 | background-color: #45474a; 1293 | background-size: 128px 128px, 100% 100%, 100% 100%; 1294 | 1295 | .link { 1296 | position: relative; 1297 | z-index: 1; 1298 | display: block; 1299 | text-decoration: none; 1300 | padding: 0.75em; 1301 | color: #ddd; 1302 | border: 0; 1303 | border-top: dotted 1px rgba(255, 255, 255, 0.1); 1304 | 1305 | &.depth-0 { 1306 | color: #fff; 1307 | font-weight: 400; 1308 | } 1309 | } 1310 | 1311 | .indent-1 { 1312 | display: inline-block; 1313 | width: 1em; 1314 | } 1315 | 1316 | .indent-2 { 1317 | display: inline-block; 1318 | width: 2em; 1319 | } 1320 | 1321 | .indent-3 { 1322 | display: inline-block; 1323 | width: 3em; 1324 | } 1325 | 1326 | .indent-4 { 1327 | display: inline-block; 1328 | width: 4em; 1329 | } 1330 | 1331 | .indent-5 { 1332 | display: inline-block; 1333 | width: 5em; 1334 | } 1335 | 1336 | .depth-0 { 1337 | color: #fff; 1338 | } 1339 | } 1340 | 1341 | body { 1342 | &.navPanel-visible { 1343 | #page-wrapper { 1344 | @include vendor('transform', 'translateY(#{_size(navPanel)})'); 1345 | } 1346 | 1347 | #navButton { 1348 | @include vendor('transform', 'translateY(#{_size(navPanel)})'); 1349 | } 1350 | 1351 | #navPanel { 1352 | @include vendor('transform', 'translateY(0)'); 1353 | } 1354 | } 1355 | } 1356 | 1357 | } 1358 | 1359 | /* Mobile (Portrait) */ 1360 | 1361 | @include breakpoint(mobilep) { 1362 | 1363 | /* Basic */ 1364 | 1365 | body, input, textarea, select { 1366 | font-size: 12pt; 1367 | letter-spacing: 0; 1368 | } 1369 | 1370 | .feature { 1371 | text-align: left; 1372 | } 1373 | 1374 | /* Sections/Article */ 1375 | 1376 | section, article { 1377 | margin-bottom: 2em; 1378 | } 1379 | 1380 | .row { 1381 | > section, 1382 | > article { 1383 | margin-bottom: 2em; 1384 | } 1385 | } 1386 | 1387 | header { 1388 | &.major { 1389 | text-align: left; 1390 | } 1391 | } 1392 | 1393 | /* Image */ 1394 | 1395 | .image { 1396 | display: block; 1397 | 1398 | &.full, 1399 | &.left { 1400 | float: none; 1401 | display: block; 1402 | width: 100%; 1403 | margin: 0 0 1.5em 0; 1404 | } 1405 | } 1406 | 1407 | .image-centered { 1408 | float: none; 1409 | display: block; 1410 | width: 100%; 1411 | margin: 0 0 1.5em 0; 1412 | } 1413 | 1414 | /* List */ 1415 | 1416 | ul.actions { 1417 | li { 1418 | display: block; 1419 | margin: 1em 0 0 0; 1420 | 1421 | &:first-child { 1422 | margin-top: 0; 1423 | } 1424 | } 1425 | 1426 | &.major { 1427 | text-align: left !important; 1428 | } 1429 | } 1430 | 1431 | /* Form */ 1432 | 1433 | form { 1434 | textarea { 1435 | min-height: 10em; 1436 | } 1437 | } 1438 | 1439 | /* Button */ 1440 | 1441 | input[type="button"], 1442 | input[type="submit"], 1443 | input[type="reset"], 1444 | button, 1445 | .button { 1446 | display: block; 1447 | width: 100%; 1448 | text-align: center; 1449 | } 1450 | 1451 | /* Header */ 1452 | 1453 | #logo { 1454 | position: relative; 1455 | left: 0; 1456 | top: 0; 1457 | margin: 0; 1458 | width: 100%; 1459 | } 1460 | 1461 | /* Hero */ 1462 | 1463 | #hero { 1464 | padding: 2.5em 0 0 0; 1465 | } 1466 | 1467 | /* Promo */ 1468 | 1469 | #promo { 1470 | padding: 20px; 1471 | } 1472 | 1473 | /* Content */ 1474 | 1475 | #content { 1476 | margin-bottom: 2em; 1477 | } 1478 | 1479 | /* Sidebar */ 1480 | 1481 | #sidebar { 1482 | margin-bottom: 2em; 1483 | } 1484 | 1485 | /* Footer */ 1486 | 1487 | #footer { 1488 | header { 1489 | &.major { 1490 | margin-bottom: 1em; 1491 | } 1492 | } 1493 | } 1494 | 1495 | } -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/favicon.ico -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/favicon.png -------------------------------------------------------------------------------- /public/images/build_server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/build_server.png -------------------------------------------------------------------------------- /public/images/deploy_social.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/deploy_social.png -------------------------------------------------------------------------------- /public/images/fabric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/fabric.png -------------------------------------------------------------------------------- /public/images/fabric_nobg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/fabric_nobg.png -------------------------------------------------------------------------------- /public/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/logo.png -------------------------------------------------------------------------------- /public/images/pic01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/pic01.jpg -------------------------------------------------------------------------------- /public/images/pic02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/pic02.jpg -------------------------------------------------------------------------------- /public/images/pic03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/pic03.jpg -------------------------------------------------------------------------------- /public/images/pic04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/pic04.jpg -------------------------------------------------------------------------------- /public/images/pic05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/pic05.jpg -------------------------------------------------------------------------------- /public/images/pic06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/pic06.jpg -------------------------------------------------------------------------------- /public/images/pic07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/pic07.jpg -------------------------------------------------------------------------------- /public/images/promo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/promo.jpg -------------------------------------------------------------------------------- /public/images/ssh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Servers-for-Hackers/deploy/2fcd2d2b29c30dfab09622f7b8e767c4b436564a/public/images/ssh.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Deploy! | Servers for Hackers 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
33 | 34 | 35 |
36 | 37 |
38 |
39 | 40 |

Deploy PHP!

41 |
42 |

A video series on reliable,
fully-automated deployments
for your PHP apps!

43 |     Buy Now! ($129 $79)          See Course Overview 44 |
45 | 46 |
47 | 48 | 49 |
50 |
51 |
52 |

Finally create a solid PHP deployment strategy

53 |

54 | We'll start simple and progress our way to professional 55 |
fully-automated, zero-downtime deployments. 56 |

57 |
58 |
59 |
60 |
61 | 62 |
63 |

Server setup and security

64 |

We'll install some basics, setup new users, set firewalls, install some security software, and harden server access.

65 |
66 |
67 |
68 | 69 |
70 |

Simple to Professional

71 |

We'll start with simple file-copy operations over SSH and then incorporate Fabric to build a zero-downtime deployment strategy with rollbacks.

72 |
73 |
74 |
75 | 76 |
77 |

Deployment with Teams

78 |

We'll centralize deployments with a build server, creating a process to automate application builds, deploy code, send notifications and log deploy history.

79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 | 87 |
88 |
89 |

The Course Modules

90 |
91 |
92 |

All the Videos:

93 |
94 |
95 |
96 |
97 |

Groundwork

98 | 99 | 100 |
101 |
102 |

Building a Web Server
(Config & Security)

103 |
104 |
105 |
106 |
107 |
108 | 109 | 08:50 110 | #1 111 |

Connecting via SSH

112 |
113 |
114 |
115 |
116 | 117 | 05:45 118 | #2 119 |

User Setup

120 |
121 |
122 |
123 |
124 | 125 | 03:31 126 | #3 127 |

User Access/Security

128 |
129 |
130 |
131 |
132 | 133 | 13:25 134 | #4 135 |

Configuring Firewalls

136 |
137 |
138 |
139 |
140 |
141 |
142 | 143 | 05:01 144 | #5 145 |

Fail2Ban to Montior Access Attempts

146 |
147 |
148 |
149 |
150 | 151 | 11:21 152 | #6 153 |

Application Server Setup (PHP, etc)

154 |
155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

Basic Deployments
(Copying Files)

164 |
165 |
166 |
167 |
168 |
169 | 170 | 02:42 171 | #7 172 |

Our SSH Setup

173 |
174 |
175 |
176 |
177 | 178 | 03:14 179 | #8 180 |

Copying Files with SCP

181 |
182 |
183 |
184 |
185 | 186 | 05:30 187 | #9 188 |

Improving Our Process with Rsync

189 |
190 |
191 |
192 |
193 | 194 | 09:43 195 | #10 196 |

Deploying with Git Securely

197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 | 205 | 206 |
207 |
208 |

Scripting Deployments

209 | 210 | 211 |
212 |
213 |

Advanced Deployment

214 |
215 |
216 |
217 |
218 |
219 | 220 | 08:34 221 | #11 222 |

Using Fabric to Script Deployments

223 |
224 |
225 |
226 |
227 | 228 | 06:48 229 | #12 230 |

Sudoers for Sudo Commands

231 |
232 |
233 |
234 |
235 | 236 | 09:16 237 | #13 238 |

Symlinks to Reduce Downtime

239 |
240 |
241 |
242 |
243 | 244 | 07:24 245 | #14 246 |

Scripting the Symlink Process

247 |
248 |
249 |
250 |
251 |
252 |
253 | 254 | 05:48 255 | #15 256 |

Handling Rollbacks

257 |
258 |
259 |
260 |
261 | 262 | 11:02 263 | #16 264 |

Handling Migrations

265 |
266 |
267 |
268 |
269 | 270 | 03:22 271 | #17 272 |

Other Services We Can Use

273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 | 281 | 282 |
283 |
284 |

Automating Deployments

285 | 286 | 287 |
288 |
289 |

Building a Deploy Service

290 |
291 |
292 |
293 |
294 |
295 | 296 | 03:19 297 | #18 298 |

Automating Fabric

299 |
300 |
301 |
302 |
303 | 304 | 10:23 305 | #19 306 |

Creating a Build Server

307 |
308 |
309 |
310 |
311 | 312 | 06:58 313 | #20 314 |

Using a Web Listener to Trigger Deployments

315 |
316 |
317 |
318 |
319 | 320 | 09:17 321 | #21 322 |

Setting up GitHub Webhooks

323 |
324 |
325 |
326 |
327 |
328 |
329 | 330 | 07:39 331 | #22 332 |

Setup a Deployment Queue with SQS

333 |
334 |
335 |
336 |
337 | 338 | 07:45 339 | #23 340 |

Taking Jobs from the SQS Queue to Trigger Deployments

341 |
342 |
343 |
344 |
345 | 346 | 05:07 347 | #24 348 |

Adding Slack Notifications

349 |
350 |
351 |
352 |
353 | 354 | 08:19 355 | #25 356 |

Staying UP & Running (Process Monitoring)

357 |
358 |
359 |
360 |
361 |
362 | 363 | 364 |
365 |
366 |

Packaging Your Application

367 |
368 |
369 |
370 |
371 |
372 | 373 | 05:47 374 | #26 375 |

What is a Packaged Application?

376 |
377 |
378 |
379 |
380 | 381 | 09:50 382 | #27 383 |

Application Packaging Process

384 |
385 |
386 |
387 |
388 | 389 | 10:15 390 | #28 391 |

Deploying a Packaged Application

392 |
393 |
394 |
395 |
396 | 397 | 03:24 398 | #29 399 |

Wrap Up

400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |

The process: Zero to Automated

413 |
414 |
415 |

Here's what you'll learn:

416 |
417 |
418 |
419 |
420 |
421 |

Essentials

422 |

A Server to Deploy To

423 |
    424 |
  • Server Installation
  • 425 |
  • Network Security
  • 426 |
  • SSH & User Security
  • 427 |
  • A PHP Application Server
  • 428 |
429 |

SSH & Copying Files

430 |
    431 |
  • SSH Configuration
  • 432 |
  • Copying with SCP
  • 433 |
  • Syncing with Rsync
  • 434 |
  • User Permissions for Deployment
  • 435 |
  • Git/GitHub for Deployment
  • 436 |
437 |
438 |
439 |

Scripting Deployments

440 |

The Deploy Process

441 |
    442 |
  • Fabric - SSH Task Runner
  • 443 |
  • Sudoers/Sudo Usage
  • 444 |
  • Zero-Downtime with Symlinks
  • 445 |
  • Rollbacks
  • 446 |
  • Migrations
  • 447 |
  • Similar Services
  • 448 |
449 |
450 |
451 |

Automating Deployments

452 |

Centralizing & Refining

453 |
    454 |
  • Centralizing Deployments
  • 455 |
  • Automating calls to Fabric
  • 456 |
  • Listening for Manual & GitHub Webhooks
  • 457 |
  • Separating Concerns with Queues
  • 458 |
  • Notifying of Deployment Status
  • 459 |
  • Building App Assets & Dependencies First
  • 460 |
  • Monitoring Node/Python Listeners
  • 461 |
462 |

Building the Application

463 |
    464 |
  • Setting up the App for Building
  • 465 |
  • Building App Assets & Dependencies First
  • 466 |
  • Building on the Build Server
  • 467 |
  • Deploying a Built Site
  • 468 |
469 |
470 |
471 |
472 |
473 |
474 |

Purchase Deploy PHP!

475 |

Purchase this video series and get:

476 |

Video Series:

477 |

Get 30 videos 🎉 all about building a secure, full automated deployment process for your PHP applications.

478 |

Ansible Roles:

479 |

Get a set of Ansible roles 💪🏻 to get you started creating a load balanced environment and a deploy-server to get you up and deploying quickly! A video and full writeup on its usage is also included.

480 |         Purchase Deploy PHP now! ($129 $79)         481 |
482 |
483 |
484 |
485 |
486 |
487 |

Info & Extra Videos!

488 |

Sign up to get a small email course where you'll see:

489 |
    490 |
  • • A preview of a fully-automated server setup and deployment
  • 491 |
  • • A video on web apps, permissions, & decisions made in this course
  • 492 |
493 | 494 | 495 |
496 |
497 |
498 |
499 | 500 | 501 |
502 |
503 |

Who am I?

504 | @fideloper 505 |

I'm Chris Fidao. I wrote the Servers for Hackers eBook, and publish related videos at the Servers for Hackers video site.

506 |

I also curate the Servers for Hackers newsletter, which is read by over 12,000 programmers who want to learn about servers.

507 |

I'm an experienced programmer with a foot firmly in the world of DevOps.

508 |

509 |
510 |
511 | 512 |
513 |
514 |
515 |
516 |

FAQ

517 | 518 |

Who is this for?

519 |

This video course is for those who don't yet have a solid deployment process for their PHP applications. If you have questions about SSH keys, automating tasks, listening for GitHub web hooks, how to determine when to deploy, and server setup, this is for you!

520 | 521 |

Why PHP?

522 |

The deployment process for most languages is basically the same when following similar strategies. However, there are enough "gotchas" per language to make generalizing overly challenging. The quality and usefulness of this course would suffer tremendously.

523 |

Still, you'll likely find this course useful even for your NodeJS, Python or Ruby applications. However you'd have to go elsewhere to find specifics & gotchas about each language's package managers & environment setup.

524 | 525 |

Returns?

526 |

In return for your feedback on why the course wasn't for you, I'll be honoring full refunds! Think of it as a money-back guarantee!

527 |
528 |
529 |
530 |
531 | 532 | 533 | 543 |
544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 564 | 565 | 566 | 570 | 571 | 572 | 573 | 574 | -------------------------------------------------------------------------------- /publish.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | rsync -vzcrSLh --exclude=".idea" --exclude="deploy.sh" --exclude="design" --exclude=".git*" \ 3 | ./ sfhdeploy:/var/www/deploy.serversforhackers.com/public 4 | --------------------------------------------------------------------------------